From b3b4b8af6d7baa23c9a9e1e5cdd03eec755eb231 Mon Sep 17 00:00:00 2001 From: Spoike Date: Mon, 10 Oct 2005 22:29:05 +0000 Subject: [PATCH] Fix for bad field offsets with timeserv's artill mod. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1463 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/qclib/pr_edict.c | 25 +++++++++++++++++++++++-- engine/qclib/pr_multi.c | 4 ++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/engine/qclib/pr_edict.c b/engine/qclib/pr_edict.c index d2e82752b..82f1f5d6e 100644 --- a/engine/qclib/pr_edict.c +++ b/engine/qclib/pr_edict.c @@ -2658,11 +2658,22 @@ retry: QC_RegisterFieldVar(progfuncs, type, fld16[i].s_name+pr_strings, 4*(fld16[i].ofs+progfuncs->fieldadjust), -1); else if (type == ev_vector) //emit vector vars early, so thier fields cannot be alocated before the vector itself. (useful against scramblers) { - QC_RegisterFieldVar(progfuncs, type, fld16[i].s_name+pr_strings, -1, -1); + QC_RegisterFieldVar(progfuncs, type, fld16[i].s_name+pr_strings, -1, fld16[i].ofs); } } fld16[i].s_name += stringadjust; } + if (reorg && !(progfuncs->fieldadjust && !pr_typecurrent)) + for (i=0 ; inumfielddefs ; i++) + { + if (pr_types) + type = pr_types[fld16[i].type & ~(DEF_SHARED|DEF_SAVEGLOBAL)].type; + else + type = fld16[i].type & ~(DEF_SHARED|DEF_SAVEGLOBAL); + if (type != ev_vector) + QC_RegisterFieldVar(progfuncs, type, fld16[i].s_name+pr_strings, -1, fld16[i].ofs); + } + break; case 32: for (i=0 ; inumglobaldefs ; i++) @@ -2692,10 +2703,20 @@ retry: if (progfuncs->fieldadjust && !pr_typecurrent) //we need to make sure all fields appear in thier original place. QC_RegisterFieldVar(progfuncs, type, fld16[i].s_name+pr_strings, 4*(fld16[i].ofs+progfuncs->fieldadjust), -1); else if (type == ev_vector) - QC_RegisterFieldVar(progfuncs, type, pr_fielddefs32[i].s_name+pr_strings, -1, -1); + QC_RegisterFieldVar(progfuncs, type, pr_fielddefs32[i].s_name+pr_strings, -1, pr_fielddefs32[i].ofs); } pr_fielddefs32[i].s_name += stringadjust; } + if (reorg && !(progfuncs->fieldadjust && !pr_typecurrent)) + for (i=0 ; inumfielddefs ; i++) + { + if (pr_types) + type = pr_types[pr_fielddefs32[i].type & ~(DEF_SHARED|DEF_SAVEGLOBAL)].type; + else + type = pr_fielddefs32[i].type & ~(DEF_SHARED|DEF_SAVEGLOBAL); + if (type != ev_vector) + QC_RegisterFieldVar(progfuncs, type, pr_fielddefs32[i].s_name+pr_strings, -1, pr_fielddefs32[i].ofs); + } break; default: Sys_Error("Bad int size"); diff --git a/engine/qclib/pr_multi.c b/engine/qclib/pr_multi.c index a8fd64783..b7a652444 100644 --- a/engine/qclib/pr_multi.c +++ b/engine/qclib/pr_multi.c @@ -235,6 +235,7 @@ int QC_RegisterFieldVar(progfuncs_t *progfuncs, unsigned int type, char *name, i if (field[i].progsofs == -1) field[i].progsofs = progsofs; +// printf("Dupfield %s %i -> %i\n", name, field[i].progsofs,field[i].ofs); return field[i].ofs-progfuncs->fieldadjust; //got a match } } @@ -304,6 +305,7 @@ int QC_RegisterFieldVar(progfuncs_t *progfuncs, unsigned int type, char *name, i { if (field[i].progsofs == (unsigned)progsofs) { +// printf("found union field %s %i -> %i\n", field[i].name, field[i].progsofs, field[i].ofs); field[fnum].ofs = ofs = field[i].ofs; break; } @@ -319,6 +321,8 @@ int QC_RegisterFieldVar(progfuncs_t *progfuncs, unsigned int type, char *name, i field[fnum].type = type; field[fnum].progsofs = progsofs; + +// printf("Field %s %i -> %i\n", name, field[fnum].progsofs,field[fnum].ofs); //we've finished setting the structure return ofs - progfuncs->fieldadjust;