From 4a43a0a0d3f92f90bfcbed68146a8a18dbb0818d Mon Sep 17 00:00:00 2001 From: dresk Date: Mon, 13 Aug 2007 18:04:50 +0000 Subject: [PATCH] Added CSQC globals dmg_take, dmg_save and dmg_origin. These globals correspond to the SSQC-sent messages that provide the data from the QC layer. dmg_origin is the origin of the damage taken, derived from the dmg_inflictor entity in the QC. All values are reset after every rendered frame (to mimic the server behavior). These globals are optional, and do not interfere with the CRC of the CSQC definitions. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7524 d7cf8633-e32d-0410-b094-e92efae38249 --- csprogs.c | 30 ++++++++++++++++++++++++++++-- progsvm.h | 4 ++++ prvm_edict.c | 3 +++ view.c | 5 +++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/csprogs.c b/csprogs.c index bb51c500..116381fc 100644 --- a/csprogs.c +++ b/csprogs.c @@ -44,7 +44,28 @@ void CL_VM_Error (const char *format, ...) //[515]: hope it will be never execut // Host_AbortCurrentFrame(); //[515]: hmmm... if server says it needs csqc then client MUST disconnect Host_Error(va("CL_VM_Error: %s", errorstring)); } - +void CL_VM_UpdateDmgGlobals (int dmg_take, int dmg_save, vec3_t dmg_origin) +{ + prvm_eval_t *val; + if(cl.csqc_loaded) + { + CSQC_BEGIN + val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.dmg_take); + if(val) + val->_float = dmg_take; + val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.dmg_save); + if(val) + val->_float = dmg_save; + val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.dmg_origin); + if(val) + { + val->vector[0] = dmg_origin[0]; + val->vector[1] = dmg_origin[1]; + val->vector[2] = dmg_origin[2]; + } + CSQC_END + } +} //[515]: set globals before calling R_UpdateView, WEIRD CRAP static void CSQC_SetGlobals (void) { @@ -232,6 +253,10 @@ qboolean CL_VM_InputEvent (qboolean pressed, int key) qboolean CL_VM_UpdateView (void) { + vec3_t emptyvector; + emptyvector[0] = 0; + emptyvector[1] = 0; + emptyvector[2] = 0; // vec3_t oldangles; if(!cl.csqc_loaded) return false; @@ -245,6 +270,8 @@ qboolean CL_VM_UpdateView (void) r_refdef.numlights = 0; PRVM_ExecuteProgram(prog->funcoffsets.CSQC_UpdateView, "QC function CSQC_UpdateView is missing"); //VectorCopy(oldangles, cl.viewangles); + // Dresk : Reset Dmg Globals Here + CL_VM_UpdateDmgGlobals(0, 0, emptyvector); CSQC_END return true; } @@ -446,7 +473,6 @@ void CL_VM_UpdateCoopDeathmatchGlobals (int gametype) CSQC_END } } - float CL_VM_Event (float event) //[515]: needed ? I'd say "YES", but don't know for what :D { float r = 0; diff --git a/progsvm.h b/progsvm.h index 727fa402..9d50da70 100644 --- a/progsvm.h +++ b/progsvm.h @@ -239,6 +239,10 @@ typedef struct prvm_prog_globaloffsets_s int intermission; // csqc int coop; // csqc int deathmatch; // csqc + int dmg_take; // csqc + int dmg_save; // csqc + int dmg_origin; // csqc + } prvm_prog_globaloffsets_t; diff --git a/prvm_edict.c b/prvm_edict.c index 50bd175a..102a40c7 100644 --- a/prvm_edict.c +++ b/prvm_edict.c @@ -1443,6 +1443,9 @@ void PRVM_FindOffsets(void) prog->globaloffsets.intermission = PRVM_ED_FindGlobalOffset("intermission"); prog->globaloffsets.coop = PRVM_ED_FindGlobalOffset("coop"); prog->globaloffsets.deathmatch = PRVM_ED_FindGlobalOffset("deathmatch"); + prog->globaloffsets.dmg_take = PRVM_ED_FindGlobalOffset("dmg_take"); + prog->globaloffsets.dmg_save = PRVM_ED_FindGlobalOffset("dmg_save"); + prog->globaloffsets.dmg_origin = PRVM_ED_FindGlobalOffset("dmg_origin"); // menu qc only uses some functions, nothing else prog->funcoffsets.m_display = PRVM_ED_FindFunctionOffset("m_display"); diff --git a/view.c b/view.c index 6ee1a201..dc75debe 100644 --- a/view.c +++ b/view.c @@ -22,6 +22,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" #include "cl_collision.h" +void CL_VM_UpdateDmgGlobals (int dmg_take, int dmg_save, vec3_t dmg_origin); + /* The view is allowed to move slightly from it's true position for bobbing, @@ -226,6 +228,9 @@ void V_ParseDamage (void) blood = MSG_ReadByte (); MSG_ReadVector(from, cls.protocol); + // Send the Dmg Globals to CSQC + CL_VM_UpdateDmgGlobals(blood, armor, from); + count = blood*0.5 + armor*0.5; if (count < 10) count = 10; -- 2.39.2