From 71de4dd795b4049a7b77a20186820a86a776319d Mon Sep 17 00:00:00 2001 From: havoc Date: Mon, 19 Feb 2007 01:15:58 +0000 Subject: [PATCH] fixed support of progs.dat files with important global and field names removed, such as omicron bot reporting that OP_STATE is not supported because it removed the field names git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6860 d7cf8633-e32d-0410-b094-e92efae38249 --- csprogs.c | 10 +++++++--- menu.c | 3 +++ progsvm.h | 2 ++ prvm_edict.c | 4 ---- sv_main.c | 29 +++++++++++++++++++++++++++++ 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/csprogs.c b/csprogs.c index 28fc9731..343f8a1f 100644 --- a/csprogs.c +++ b/csprogs.c @@ -645,9 +645,7 @@ void CL_VM_Init (void) PRVM_LoadProgs(csqc_progname.string, cl_numrequiredfunc, cl_required_func, 0, NULL, 0, NULL); - if(prog->loaded) - Con_Printf("CSQC ^5loaded (crc=%i, size=%i)\n", csprogsdatacrc, (int)csprogsdatasize); - else + if (!prog->loaded) { CL_VM_Error("CSQC ^2failed to load\n"); if(!sv.active) @@ -655,6 +653,12 @@ void CL_VM_Init (void) return; } + Con_Printf("CSQC ^5loaded (crc=%i, size=%i)\n", csprogsdatacrc, (int)csprogsdatasize); + + // check if OP_STATE animation is possible in this dat file + if (prog->fieldoffsets.nextthink >= 0 && prog->fieldoffsets.frame >= 0 && prog->fieldoffsets.think >= 0 && prog->globaloffsets.self >= 0) + prog->flag |= PRVM_OP_STATE; + //[515]: optional fields & funcs if(prog->funcoffsets.CSQC_Parse_Print) { diff --git a/menu.c b/menu.c index 405a72b8..e28b04c6 100644 --- a/menu.c +++ b/menu.c @@ -4960,6 +4960,9 @@ void MP_Init (void) PRVM_LoadProgs(M_PROG_FILENAME, m_numrequiredfunc, m_required_func, 0, NULL, 0, NULL); + // note: OP_STATE is not supported by menu qc, we don't even try to detect + // it here + #ifdef NG_MENU m_displayed = false; #endif diff --git a/progsvm.h b/progsvm.h index 17cf7369..cb467595 100644 --- a/progsvm.h +++ b/progsvm.h @@ -461,6 +461,8 @@ mfunction_t *PRVM_ED_FindFunction(const char *name); int PRVM_ED_FindFieldOffset(const char *name); int PRVM_ED_FindGlobalOffset(const char *name); func_t PRVM_ED_FindFunctionOffset(const char *name); +#define PRVM_ED_FindFieldOffset_FromStruct(st, field) prog->fieldoffsets . field = ((int *)(&((st *)NULL)-> field ) - ((int *)NULL)) +#define PRVM_ED_FindGlobalOffset_FromStruct(st, field) prog->globaloffsets . field = ((int *)(&((st *)NULL)-> field ) - ((int *)NULL)) void PRVM_MEM_IncreaseEdicts(void); diff --git a/prvm_edict.c b/prvm_edict.c index 700dd8e5..f9db9de2 100644 --- a/prvm_edict.c +++ b/prvm_edict.c @@ -1684,10 +1684,6 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required PRVM_FindOffsets(); - // check if OP_STATE animation is possible in this dat file - if (prog->fieldoffsets.nextthink >= 0 && prog->fieldoffsets.frame >= 0 && prog->fieldoffsets.think >= 0 && prog->globaloffsets.self >= 0) - prog->flag |= PRVM_OP_STATE; - PRVM_GCALL(init_cmd)(); // init mempools diff --git a/sv_main.c b/sv_main.c index d330329f..0f3eb574 100644 --- a/sv_main.c +++ b/sv_main.c @@ -2448,6 +2448,35 @@ void SV_VM_Setup(void) // TODO: add a requiredfuncs list (ask LH if this is necessary at all) PRVM_LoadProgs( sv_progs.string, 0, NULL, REQFIELDS, reqfields, 0, NULL ); + // some mods compiled with scrambling compilers lack certain critical + // global names and field names such as "self" and "time" and "nextthink" + // so we have to set these offsets manually, matching the entvars_t + PRVM_ED_FindFieldOffset_FromStruct(entvars_t, angles); + PRVM_ED_FindFieldOffset_FromStruct(entvars_t, chain); + PRVM_ED_FindFieldOffset_FromStruct(entvars_t, classname); + PRVM_ED_FindFieldOffset_FromStruct(entvars_t, frame); + PRVM_ED_FindFieldOffset_FromStruct(entvars_t, groundentity); + PRVM_ED_FindFieldOffset_FromStruct(entvars_t, ideal_yaw); + PRVM_ED_FindFieldOffset_FromStruct(entvars_t, nextthink); + PRVM_ED_FindFieldOffset_FromStruct(entvars_t, think); + PRVM_ED_FindFieldOffset_FromStruct(entvars_t, yaw_speed); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, self); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, time); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, v_forward); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, v_right); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, v_up); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, trace_allsolid); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, trace_startsolid); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, trace_fraction); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, trace_inwater); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, trace_inopen); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, trace_endpos); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, trace_plane_normal); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, trace_plane_dist); + PRVM_ED_FindGlobalOffset_FromStruct(globalvars_t, trace_ent); + // OP_STATE is always supported on server (due to entvars_t) + prog->flag |= PRVM_OP_STATE; + VM_AutoSentStats_Clear();//[515]: csqc EntityFrameCSQC_ClearVersions();//[515]: csqc -- 2.39.2