X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=prvm_edict.c;h=8b269d55370127737203a63d591d19cd74bdffdc;hb=4a0c55c2f53d3b18ae28eddb822a0c670636c0f9;hp=823e6b7b90347ad4d1688fcccdcf7076a1ce5193;hpb=d5144ba9727099e0d6a79afb2efe390c60667bb5;p=xonotic%2Fdarkplaces.git diff --git a/prvm_edict.c b/prvm_edict.c index 823e6b7b..8b269d55 100644 --- a/prvm_edict.c +++ b/prvm_edict.c @@ -574,7 +574,7 @@ For debugging */ // LordHavoc: optimized this to print out much more quickly (tempstring) // LordHavoc: changed to print out every 4096 characters (incase there are a lot of fields to print) -void PRVM_ED_Print(prvm_edict_t *ed) +void PRVM_ED_Print(prvm_edict_t *ed, const char *wildcard_fieldname) { size_t l; ddef_t *d; @@ -599,6 +599,12 @@ void PRVM_ED_Print(prvm_edict_t *ed) if (name[strlen(name)-2] == '_') continue; // skip _x, _y, _z vars + // Check Field Name Wildcard + if(wildcard_fieldname) + if( !matchpattern(name, wildcard_fieldname, 1) ) + // Didn't match; skip + continue; + v = (int *)((char *)ed->fields.vp + d->ofs*4); // if the value is still all 0, skip the field @@ -689,9 +695,9 @@ void PRVM_ED_Write (qfile_t *f, prvm_edict_t *ed) FS_Print(f, "}\n"); } -void PRVM_ED_PrintNum (int ent) +void PRVM_ED_PrintNum (int ent, const char *wildcard_fieldname) { - PRVM_ED_Print(PRVM_EDICT_NUM(ent)); + PRVM_ED_Print(PRVM_EDICT_NUM(ent), wildcard_fieldname); } /* @@ -704,10 +710,11 @@ For debugging, prints all the entities in the current server void PRVM_ED_PrintEdicts_f (void) { int i; + const char *wildcard_fieldname; - if(Cmd_Argc() != 2) + if(Cmd_Argc() < 2 || Cmd_Argc() > 3) { - Con_Print("prvm_edicts \n"); + Con_Print("prvm_edicts \n"); return; } @@ -715,9 +722,14 @@ void PRVM_ED_PrintEdicts_f (void) if(!PRVM_SetProgFromString(Cmd_Argv(1))) return; + if( Cmd_Argc() == 3) + wildcard_fieldname = Cmd_Argv(2); + else + wildcard_fieldname = NULL; + Con_Printf("%s: %i entities\n", PRVM_NAME, prog->num_edicts); for (i=0 ; inum_edicts ; i++) - PRVM_ED_PrintNum (i); + PRVM_ED_PrintNum (i, wildcard_fieldname); PRVM_End; } @@ -732,10 +744,11 @@ For debugging, prints a single edict void PRVM_ED_PrintEdict_f (void) { int i; + const char *wildcard_fieldname; - if(Cmd_Argc() != 3) + if(Cmd_Argc() < 3 || Cmd_Argc() > 4) { - Con_Print("prvm_edict \n"); + Con_Print("prvm_edict \n"); return; } @@ -750,7 +763,13 @@ void PRVM_ED_PrintEdict_f (void) PRVM_End; return; } - PRVM_ED_PrintNum (i); + if( Cmd_Argc() == 4) + // Optional Wildcard Provided + wildcard_fieldname = Cmd_Argv(3); + else + // Use All + wildcard_fieldname = NULL; + PRVM_ED_PrintNum (i, wildcard_fieldname); PRVM_End; } @@ -853,7 +872,7 @@ void PRVM_ED_ParseGlobals (const char *data) while (1) { // parse key - if (!COM_ParseTokenConsole(&data)) + if (!COM_ParseToken_Simple(&data, false)) PRVM_ERROR ("PRVM_ED_ParseGlobals: EOF without closing brace"); if (com_token[0] == '}') break; @@ -861,7 +880,7 @@ void PRVM_ED_ParseGlobals (const char *data) strlcpy (keyname, com_token, sizeof(keyname)); // parse value - if (!COM_ParseTokenConsole(&data)) + if (!COM_ParseToken_Simple(&data, false)) PRVM_ERROR ("PRVM_ED_ParseGlobals: EOF without closing brace"); if (com_token[0] == '}') @@ -953,8 +972,7 @@ qboolean PRVM_ED_ParseEpair(prvm_edict_t *ent, ddef_t *key, const char *s) Con_Printf("PRVM_ED_ParseEpair: ev_entity reference too large (edict %u >= MAX_EDICTS %u) on %s\n", (unsigned int)i, (unsigned int)MAX_EDICTS, PRVM_NAME); while (i >= prog->max_edicts) PRVM_MEM_IncreaseEdicts(); - //SV_IncreaseEdicts(); - // if SV_IncreaseEdicts was called the base pointer needs to be updated + // if IncreaseEdicts was called the base pointer needs to be updated if (ent) val = (prvm_eval_t *)((int *)ent->fields.vp + key->ofs); val->edict = PRVM_EDICT_TO_PROG(PRVM_EDICT_NUM((int)i)); @@ -1111,7 +1129,7 @@ const char *PRVM_ED_ParseEdict (const char *data, prvm_edict_t *ent) while (1) { // parse key - if (!COM_ParseTokenConsole(&data)) + if (!COM_ParseToken_Simple(&data, false)) PRVM_ERROR ("PRVM_ED_ParseEdict: EOF without closing brace"); if (developer_entityparsing.integer) Con_Printf("Key: \"%s\"", com_token); @@ -1143,7 +1161,7 @@ const char *PRVM_ED_ParseEdict (const char *data, prvm_edict_t *ent) } // parse value - if (!COM_ParseTokenConsole(&data)) + if (!COM_ParseToken_Simple(&data, false)) PRVM_ERROR ("PRVM_ED_ParseEdict: EOF without closing brace"); if (developer_entityparsing.integer) Con_Printf(" \"%s\"\n", com_token); @@ -1218,7 +1236,7 @@ void PRVM_ED_LoadFromFile (const char *data) while (1) { // parse the opening brace - if (!COM_ParseTokenConsole(&data)) + if (!COM_ParseToken_Simple(&data, false)) break; if (com_token[0] != '{') PRVM_ERROR ("PRVM_ED_LoadFromFile: %s: found %s when expecting {", PRVM_NAME, com_token); @@ -1256,7 +1274,7 @@ void PRVM_ED_LoadFromFile (const char *data) if (!handle) { Con_Print("No classname for:\n"); - PRVM_ED_Print(ent); + PRVM_ED_Print(ent, NULL); PRVM_ED_Free (ent); continue; } @@ -1266,18 +1284,30 @@ void PRVM_ED_LoadFromFile (const char *data) if (!func) { - if (developer.integer) // don't confuse non-developers with errors + // check for OnEntityNoSpawnFunction + if (prog->funcoffsets.SV_OnEntityNoSpawnFunction) { - Con_Print("No spawn function for:\n"); - PRVM_ED_Print(ent); + // self = ent + PRVM_GLOBALFIELDVALUE(prog->globaloffsets.self)->edict = PRVM_EDICT_TO_PROG(ent); + PRVM_ExecuteProgram (prog->funcoffsets.SV_OnEntityNoSpawnFunction, "QC function SV_OnEntityNoSpawnFunction is missing"); + } + else + { + if (developer.integer) // don't confuse non-developers with errors + { + Con_Print("No spawn function for:\n"); + PRVM_ED_Print(ent, NULL); + } + PRVM_ED_Free (ent); + continue; } - PRVM_ED_Free (ent); - continue; } - - // self = ent - PRVM_GLOBALFIELDVALUE(prog->globaloffsets.self)->edict = PRVM_EDICT_TO_PROG(ent); - PRVM_ExecuteProgram (func - prog->functions, ""); + else + { + // self = ent + PRVM_GLOBALFIELDVALUE(prog->globaloffsets.self)->edict = PRVM_EDICT_TO_PROG(ent); + PRVM_ExecuteProgram (func - prog->functions, ""); + } } spawned++; @@ -1360,6 +1390,8 @@ void PRVM_FindOffsets(void) prog->fieldoffsets.items2 = PRVM_ED_FindFieldOffset("items2"); prog->fieldoffsets.lerpfrac = PRVM_ED_FindFieldOffset("lerpfrac"); prog->fieldoffsets.light_lev = PRVM_ED_FindFieldOffset("light_lev"); + prog->fieldoffsets.message = PRVM_ED_FindFieldOffset("message"); + prog->fieldoffsets.modelflags = PRVM_ED_FindFieldOffset("modelflags"); prog->fieldoffsets.movement = PRVM_ED_FindFieldOffset("movement"); prog->fieldoffsets.netaddress = PRVM_ED_FindFieldOffset("netaddress"); prog->fieldoffsets.nextthink = PRVM_ED_FindFieldOffset("nextthink"); @@ -1399,6 +1431,7 @@ void PRVM_FindOffsets(void) prog->funcoffsets.SV_ChangeTeam = PRVM_ED_FindFunctionOffset("SV_ChangeTeam"); prog->funcoffsets.SV_ParseClientCommand = PRVM_ED_FindFunctionOffset("SV_ParseClientCommand"); prog->funcoffsets.SV_PlayerPhysics = PRVM_ED_FindFunctionOffset("SV_PlayerPhysics"); + prog->funcoffsets.SV_OnEntityNoSpawnFunction = PRVM_ED_FindFunctionOffset("SV_OnEntityNoSpawnFunction"); prog->funcoffsets.GameCommand = PRVM_ED_FindFunctionOffset("GameCommand"); prog->globaloffsets.SV_InitCmd = PRVM_ED_FindGlobalOffset("SV_InitCmd"); prog->globaloffsets.self = PRVM_ED_FindGlobalOffset("self"); @@ -1406,6 +1439,7 @@ void PRVM_FindOffsets(void) prog->globaloffsets.v_forward = PRVM_ED_FindGlobalOffset("v_forward"); prog->globaloffsets.v_right = PRVM_ED_FindGlobalOffset("v_right"); prog->globaloffsets.v_up = PRVM_ED_FindGlobalOffset("v_up"); + prog->globaloffsets.view_angles = PRVM_ED_FindGlobalOffset("view_angles"); prog->globaloffsets.trace_allsolid = PRVM_ED_FindGlobalOffset("trace_allsolid"); prog->globaloffsets.trace_startsolid = PRVM_ED_FindGlobalOffset("trace_startsolid"); prog->globaloffsets.trace_fraction = PRVM_ED_FindGlobalOffset("trace_fraction"); @@ -1419,6 +1453,12 @@ void PRVM_FindOffsets(void) prog->globaloffsets.trace_dphitq3surfaceflags = PRVM_ED_FindGlobalOffset("trace_dphitq3surfaceflags"); prog->globaloffsets.trace_dphittexturename = PRVM_ED_FindGlobalOffset("trace_dphittexturename"); prog->globaloffsets.trace_dpstartcontents = PRVM_ED_FindGlobalOffset("trace_dpstartcontents"); + 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"); @@ -1887,15 +1927,18 @@ void PRVM_Fields_f (void) void PRVM_Globals_f (void) { int i; + const char *wildcard; + int numculled; + numculled = 0; // TODO /*if (!sv.active) { Con_Print("no progs loaded\n"); return; }*/ - if(Cmd_Argc () != 2) + if(Cmd_Argc () < 2 || Cmd_Argc() > 3) { - Con_Print("prvm_globals \n"); + Con_Print("prvm_globals \n"); return; } @@ -1903,11 +1946,24 @@ void PRVM_Globals_f (void) if(!PRVM_SetProgFromString (Cmd_Argv (1))) return; + if( Cmd_Argc() == 3) + wildcard = Cmd_Argv(2); + else + wildcard = NULL; + Con_Printf("%s :", PRVM_NAME); for (i = 0;i < prog->progs->numglobaldefs;i++) + { + if(wildcard) + if( !matchpattern( PRVM_GetString(prog->globaldefs[i].s_name), wildcard, 1) ) + { + numculled++; + continue; + } Con_Printf("%s\n", PRVM_GetString(prog->globaldefs[i].s_name)); - Con_Printf("%i global variables, totalling %i bytes\n", prog->progs->numglobals, prog->progs->numglobals * 4); + } + Con_Printf("%i global variables, %i culled, totalling %i bytes\n", prog->progs->numglobals, numculled, prog->progs->numglobals * 4); PRVM_End; }