1
0
Fork 0
forked from fte/fteqw

particle parse fix (count=255 should be explosion), fix qtest mdl loading, fix decompile, map MOVETYPE_ANGLENOCLIP to MOVETYPE_NOCLIP, map some qtest builtins/globals

git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3740 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
TimeServ 2011-02-27 15:01:56 +00:00
parent 552e396b98
commit 23bc19fc14
5 changed files with 84 additions and 44 deletions

View file

@ -1759,7 +1759,7 @@ void CLDP_ParsePointParticles(qboolean compact)
void CLNQ_ParseParticleEffect (void) void CLNQ_ParseParticleEffect (void)
{ {
vec3_t org, dir; vec3_t org, dir;
int i, count, msgcount, color; int i, msgcount, color;
for (i=0 ; i<3 ; i++) for (i=0 ; i<3 ; i++)
org[i] = MSG_ReadCoord (); org[i] = MSG_ReadCoord ();
@ -1769,11 +1769,13 @@ void CLNQ_ParseParticleEffect (void)
color = MSG_ReadByte (); color = MSG_ReadByte ();
if (msgcount == 255) if (msgcount == 255)
count = 1024; {
// treat as spriteless explosion (qtest/some mods require this)
if (P_RunParticleEffectType(org, NULL, 1, pt_explosion))
P_RunParticleEffect(org, NULL, 107, 1024); // should be 97-111
}
else else
count = msgcount; P_RunParticleEffect (org, dir, color, msgcount);
P_RunParticleEffect (org, dir, color, count);
} }
void CL_ParseParticleEffect2 (void) void CL_ParseParticleEffect2 (void)
{ {

View file

@ -1883,8 +1883,8 @@ static void *QTest_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremap
qtestaliasframe_t *frameinfo; qtestaliasframe_t *frameinfo;
int i, j; int i, j;
vec3_t *normals; vec3_t *normals, *svec, *tvec;
vec3_t *verts; vecV_t *verts;
frame = (galiasgroup_t*)((char *)galias + galias->groupofs); frame = (galiasgroup_t*)((char *)galias + galias->groupofs);
@ -1895,18 +1895,23 @@ static void *QTest_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremap
case ALIAS_SINGLE: case ALIAS_SINGLE:
frameinfo = (qtestaliasframe_t*)((char *)(pframetype+1)); frameinfo = (qtestaliasframe_t*)((char *)(pframetype+1));
pinframe = (dtrivertx_t*)((char*)frameinfo+sizeof(qtestaliasframe_t)); pinframe = (dtrivertx_t*)((char*)frameinfo+sizeof(qtestaliasframe_t));
pose = (galiaspose_t *)Hunk_Alloc(sizeof(galiaspose_t) + sizeof(vec3_t)*2*galias->numverts); pose = (galiaspose_t *)Hunk_Alloc(sizeof(galiaspose_t) + (sizeof(vecV_t)+sizeof(vec3_t)*3)*galias->numverts);
frame->poseofs = (char *)pose - (char *)frame; frame->poseofs = (char *)pose - (char *)frame;
frame->numposes = 1; frame->numposes = 1;
galias->groups++; galias->groups++;
frame->name[0] = '\0'; frame->name[0] = '\0';
verts = (vec3_t *)(pose+1); verts = (vecV_t *)(pose+1);
normals = &verts[galias->numverts]; normals = &verts[galias->numverts];
pose->ofsverts = (char *)verts - (char *)pose; pose->ofsverts = (char *)verts - (char *)pose;
#ifndef SERVERONLY #ifndef SERVERONLY
normals = (vec3_t*)&verts[galias->numverts];
svec = &normals[galias->numverts];
tvec = &svec[galias->numverts];
pose->ofsnormals = (char *)normals - (char *)pose; pose->ofsnormals = (char *)normals - (char *)pose;
pose->ofssvector = (char *)svec - (char *)pose;
pose->ofstvector = (char *)tvec - (char *)pose;
#endif #endif
for (j = 0; j < pq1inmodel->numverts; j++) for (j = 0; j < pq1inmodel->numverts; j++)
@ -1920,7 +1925,9 @@ static void *QTest_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremap
if (seamremaps[j] != j) if (seamremaps[j] != j)
{ {
VectorCopy(verts[j], verts[seamremaps[j]]); VectorCopy(verts[j], verts[seamremaps[j]]);
#ifndef SERVERONLY
VectorCopy(normals[j], normals[seamremaps[j]]); VectorCopy(normals[j], normals[seamremaps[j]]);
#endif
} }
} }

View file

@ -908,7 +908,7 @@ pbool Decompile(progfuncs_t *progfuncs, char *fname)
if (v->string && *(pr_strings+v->_int)) if (v->string && *(pr_strings+v->_int))
writes(f, "string %s = \"%s\";\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name, pr_strings+v->_int); writes(f, "string %s = \"%s\";\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name, pr_strings+v->_int);
else else
writes(f, "string %s;\r\n", pr_globaldefs16[i].s_name); writes(f, "string %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
break; break;
case ev_float: case ev_float:
if (v->_float) if (v->_float)

View file

@ -519,6 +519,8 @@ void PR_LoadGlabalStruct(void)
{ {
static float writeonly; static float writeonly;
static float dimension_send_default; static float dimension_send_default;
static float zero_default;
static vec3_t vecwriteonly;
int i; int i;
int *v; int *v;
nqglobalvars_t *pr_globals = pr_nqglobal_struct; nqglobalvars_t *pr_globals = pr_nqglobal_struct;
@ -540,23 +542,23 @@ void PR_LoadGlabalStruct(void)
globalfloat (false, deathmatch); globalfloat (false, deathmatch);
globalfloat (false, coop); globalfloat (false, coop);
globalfloat (false, teamplay); globalfloat (false, teamplay);
globalfloat (true, serverflags); globalfloat (false, serverflags);
globalfloat (true, total_secrets); globalfloat (false, total_secrets);
globalfloat (true, total_monsters); globalfloat (false, total_monsters);
globalfloat (true, found_secrets); globalfloat (false, found_secrets);
globalfloat (true, killed_monsters); globalfloat (false, killed_monsters);
globalvec (true, v_forward); globalvec (true, v_forward);
globalvec (true, v_up); globalvec (true, v_up);
globalvec (true, v_right); globalvec (true, v_right);
globalfloat (true, trace_allsolid); globalfloat (false, trace_allsolid);
globalfloat (true, trace_startsolid); globalfloat (false, trace_startsolid);
globalfloat (true, trace_fraction); globalfloat (false, trace_fraction);
globalvec (true, trace_endpos); globalvec (false, trace_endpos);
globalvec (true, trace_plane_normal); globalvec (false, trace_plane_normal);
globalfloat (true, trace_plane_dist); globalfloat (false, trace_plane_dist);
globalint (true, trace_ent); globalint (true, trace_ent);
globalfloat (true, trace_inopen); globalfloat (false, trace_inopen);
globalfloat (true, trace_inwater); globalfloat (false, trace_inwater);
globalfloat (false, trace_endcontents); globalfloat (false, trace_endcontents);
globalfloat (false, trace_surfaceflags); globalfloat (false, trace_surfaceflags);
globalfloat (false, cycle_wrapped); globalfloat (false, cycle_wrapped);
@ -587,24 +589,49 @@ void PR_LoadGlabalStruct(void)
for (i = 0; i < NUM_SPAWN_PARMS; i++) for (i = 0; i < NUM_SPAWN_PARMS; i++)
spawnparamglobals[i] = (float *)PR_FindGlobal(svprogfuncs, va("parm%i", i+1), 0); spawnparamglobals[i] = (float *)PR_FindGlobal(svprogfuncs, va("parm%i", i+1), 0);
if (!((nqglobalvars_t*)pr_globals)->dimension_send) #define ensurefloat(name,var) if (!((nqglobalvars_t*)pr_globals)->name) ((nqglobalvars_t*)pr_globals)->name = &var;
{ //make sure dimension send is always a valid pointer.
((nqglobalvars_t*)pr_globals)->dimension_send = &dimension_send_default; // make sure these entries are always valid pointers
ensurefloat(dimension_send, dimension_send_default);
ensurefloat(trace_endcontents, writeonly);
ensurefloat(trace_surfaceflags, writeonly);
// qtest renames and missing variables
if (!((nqglobalvars_t*)pr_globals)->V_trace_plane_normal)
{
((nqglobalvars_t*)pr_globals)->V_trace_plane_normal = (vec3_t *)PR_FindGlobal(svprogfuncs, "trace_normal", 0);
if (!((nqglobalvars_t*)pr_globals)->V_trace_plane_normal)
SV_Error("Could not find export trace_plane_normal in progs\n");
} }
if (!((nqglobalvars_t*)pr_globals)->trace_endcontents) if (!((nqglobalvars_t*)pr_globals)->V_trace_endpos)
{ //make sure dimension send is always a valid pointer. {
((nqglobalvars_t*)pr_globals)->trace_endcontents = &writeonly; ((nqglobalvars_t*)pr_globals)->V_trace_endpos = (vec3_t *)PR_FindGlobal(svprogfuncs, "trace_impact", 0);
if (!((nqglobalvars_t*)pr_globals)->V_trace_endpos)
SV_Error("Could not find export trace_endpos in progs\n");
} }
if (!((nqglobalvars_t*)pr_globals)->trace_surfaceflags) if (!((nqglobalvars_t*)pr_globals)->trace_fraction)
{ //make sure dimension send is always a valid pointer. {
((nqglobalvars_t*)pr_globals)->trace_surfaceflags = &writeonly; ((nqglobalvars_t*)pr_globals)->trace_fraction = (vec3_t *)PR_FindGlobal(svprogfuncs, "trace_frac", 0);
if (!((nqglobalvars_t*)pr_globals)->trace_fraction)
SV_Error("Could not find export trace_fraction in progs\n");
} }
ensurefloat(serverflags, zero_default);
ensurefloat(total_secrets, zero_default);
ensurefloat(total_monsters, zero_default);
ensurefloat(found_secrets, zero_default);
ensurefloat(killed_monsters, zero_default);
ensurefloat(trace_allsolid, writeonly);
ensurefloat(trace_startsolid, writeonly);
ensurefloat(trace_plane_dist, writeonly);
ensurefloat(trace_inopen, writeonly);
ensurefloat(trace_inwater, writeonly);
pr_global_struct->dimension_send = 255; pr_global_struct->dimension_send = 255;
pr_global_struct->serverflags = 0;
pr_global_struct->total_secrets = 0;
pr_global_struct->total_monsters = 0;
pr_global_struct->found_secrets = 0;
pr_global_struct->killed_monsters = 0;
pr_teamfield = 0; pr_teamfield = 0;
@ -8707,7 +8734,7 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"setorigin", PF_setorigin, 2, 2, 2}, // void(entity e, vector o) setorigin = #2; {"setorigin", PF_setorigin, 2, 2, 2}, // void(entity e, vector o) setorigin = #2;
{"setmodel", PF_setmodel, 3, 3, 3}, // void(entity e, string m) setmodel = #3; {"setmodel", PF_setmodel, 3, 3, 3}, // void(entity e, string m) setmodel = #3;
{"setsize", PF_setsize, 4, 4, 4}, // void(entity e, vector min, vector max) setsize = #4; {"setsize", PF_setsize, 4, 4, 4}, // void(entity e, vector min, vector max) setsize = #4;
// {"qtest_setabssize",NULL, 5}, {"qtest_setabssize",PF_setsize, 5}, // void(entity e, vector min, vector max) setabssize = #5;
{"lightstylestatic",PF_lightstylestatic,0, 0, 5, 5}, {"lightstylestatic",PF_lightstylestatic,0, 0, 5, 5},
{"break", PF_break, 6, 6, 6}, // void() break = #6; {"break", PF_break, 6, 6, 6}, // void() break = #6;
{"random", PF_random, 7, 7, 7}, // float() random = #7; {"random", PF_random, 7, 7, 7}, // float() random = #7;
@ -8739,16 +8766,16 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"eprint", PF_eprint, 31, 31, 31}, //31 // void(entity e) debug print an entire entity {"eprint", PF_eprint, 31, 31, 31}, //31 // void(entity e) debug print an entire entity
{"walkmove", PF_walkmove, 32, 32, 32}, //32 // float(float yaw, float dist) walkmove {"walkmove", PF_walkmove, 32, 32, 32}, //32 // float(float yaw, float dist) walkmove
{"tracearea", PF_traceboxh2, 0, 0, 33}, //33 // {"tracearea", PF_traceboxh2, 0, 0, 33}, //33 //
// {"qtest_flymove", NULL, 33}, //vector // {"qtest_flymove", NULL, 33}, // float(vector dir) flymove = #33;
{"droptofloor", PF_droptofloor, 34, 34, 34}, //34 {"droptofloor", PF_droptofloor, 34, 34, 34}, //34
{"lightstyle", PF_lightstyle, 35, 35, 35}, //35 {"lightstyle", PF_lightstyle, 35, 35, 35}, //35
{"rint", PF_rint, 36, 36, 36}, //36 {"rint", PF_rint, 36, 36, 36}, //36
{"floor", PF_floor, 37, 37, 37}, //37 {"floor", PF_floor, 37, 37, 37}, //37
{"ceil", PF_ceil, 38, 38, 38}, //38 {"ceil", PF_ceil, 38, 38, 38}, //38
// {"qtest_canreach", NULL, 39}, {"qtest_canreach", PF_Ignore, 39}, // float(vector v) canreach = #39; // QTest builtin called in effectless statement
{"checkbottom", PF_checkbottom, 40, 40, 40}, //40 {"checkbottom", PF_checkbottom, 40, 40, 40}, //40
{"pointcontents", PF_pointcontents, 41, 41, 41}, //41 {"pointcontents", PF_pointcontents, 41, 41, 41}, //41
// {"qtest_stopsound", NULL, 42}, // {"qtest_stopsound", NULL, 42}, // defined QTest builtin that is never called
{"fabs", PF_fabs, 43, 43, 43}, //43 {"fabs", PF_fabs, 43, 43, 43}, //43
{"aim", PF_aim, 44, 44, 44}, //44 {"aim", PF_aim, 44, 44, 44}, //44
{"cvar", PF_cvar, 45, 45, 45}, //45 {"cvar", PF_cvar, 45, 45, 45}, //45
@ -8756,7 +8783,7 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"nextent", PF_nextent, 47, 47, 47}, //47 {"nextent", PF_nextent, 47, 47, 47}, //47
{"particle", PF_particle, 48, 0, 48, 48}, //48 nq readded. This isn't present in QW protocol (fte added it back). {"particle", PF_particle, 48, 0, 48, 48}, //48 nq readded. This isn't present in QW protocol (fte added it back).
{"changeyaw", PF_changeyaw, 49, 49, 49}, //49 {"changeyaw", PF_changeyaw, 49, 49, 49}, //49
// {"qtest_precacheitem", NULL, 50}, //1 1 // {"qtest_precacheitem", NULL, 50}, // defined QTest builtin that is never called
{"vhlen", PF_vhlen, 0, 0, 50}, //49 {"vhlen", PF_vhlen, 0, 0, 50}, //49
{"vectoangles", PF_vectoangles, 51, 51, 51}, //51 {"vectoangles", PF_vectoangles, 51, 51, 51}, //51

View file

@ -94,7 +94,8 @@ static void SV_CheckAllEnts (void)
if (check->v->movetype == MOVETYPE_PUSH if (check->v->movetype == MOVETYPE_PUSH
|| check->v->movetype == MOVETYPE_NONE || check->v->movetype == MOVETYPE_NONE
|| check->v->movetype == MOVETYPE_FOLLOW || check->v->movetype == MOVETYPE_FOLLOW
|| check->v->movetype == MOVETYPE_NOCLIP) || check->v->movetype == MOVETYPE_NOCLIP
|| check->v->movetype == MOVETYPE_ANGLENOCLIP)
continue; continue;
if (World_TestEntityPosition (&sv.world, (wedict_t*)check)) if (World_TestEntityPosition (&sv.world, (wedict_t*)check))
@ -571,7 +572,8 @@ static qboolean SV_PushAngles (edict_t *pusher, vec3_t move, vec3_t amove)
if (check->v->movetype == MOVETYPE_PUSH if (check->v->movetype == MOVETYPE_PUSH
|| check->v->movetype == MOVETYPE_NONE || check->v->movetype == MOVETYPE_NONE
|| check->v->movetype == MOVETYPE_NOCLIP) || check->v->movetype == MOVETYPE_NOCLIP
|| check->v->movetype == MOVETYPE_ANGLENOCLIP)
continue; continue;
#if 1 #if 1
@ -746,7 +748,8 @@ static qboolean SV_Push (edict_t *pusher, vec3_t move, vec3_t amove)
if (check->v->movetype == MOVETYPE_PUSH if (check->v->movetype == MOVETYPE_PUSH
|| check->v->movetype == MOVETYPE_NONE || check->v->movetype == MOVETYPE_NONE
|| check->v->movetype == MOVETYPE_FOLLOW || check->v->movetype == MOVETYPE_FOLLOW
|| check->v->movetype == MOVETYPE_NOCLIP) || check->v->movetype == MOVETYPE_NOCLIP
|| check->v->movetype == MOVETYPE_ANGLENOCLIP)
continue; continue;
// if the entity is standing on the pusher, it will definately be moved // if the entity is standing on the pusher, it will definately be moved
@ -1861,6 +1864,7 @@ void SV_RunEntity (edict_t *ent)
return; return;
break; break;
case MOVETYPE_NOCLIP: case MOVETYPE_NOCLIP:
case MOVETYPE_ANGLENOCLIP:
SV_Physics_Noclip (ent); SV_Physics_Noclip (ent);
break; break;
case MOVETYPE_STEP: case MOVETYPE_STEP: