📄 pr_edict.c
字号:
break;
if (com_token[0] != '{')
Sys_Error ("ED_LoadFromFile: found %s when expecting {",com_token);
if (!ent)
ent = EDICT_NUM(0);
else
ent = ED_Alloc ();
data = ED_ParseEdict (data, ent);
// remove things from different skill levels or deathmatch
if (deathmatch->value)
{
if (((int)ent->v.spawnflags & SPAWNFLAG_NOT_DEATHMATCH))
{
ED_Free (ent);
inhibit++;
continue;
}
}
else if ((current_skill == 0 && ((int)ent->v.spawnflags & SPAWNFLAG_NOT_EASY))
|| (current_skill == 1 && ((int)ent->v.spawnflags & SPAWNFLAG_NOT_MEDIUM))
|| (current_skill >= 2 && ((int)ent->v.spawnflags & SPAWNFLAG_NOT_HARD)) )
{
ED_Free (ent);
inhibit++;
continue;
}
//
// immediately call spawn function
//
if (!ent->v.classname)
{
Con_Printf ("No classname for:\n");
ED_Print (ent);
ED_Free (ent);
continue;
}
// look for the spawn function
func = ED_FindFunction ( pr_strings + ent->v.classname );
if (!func)
{
Con_Printf ("No spawn function for:\n");
ED_Print (ent);
ED_Free (ent);
continue;
}
pr_global_struct->self = EDICT_TO_PROG(ent);
PR_ExecuteProgram (func - pr_functions);
}
Con_DPrintf ("%i entities inhibited\n", inhibit);
}
qboolean keep_compatibility; // 1999-10-28 Compatibilty check by Maddes
/*
===============
PR_LoadProgs
===============
*/
void PR_LoadProgs (void)
{
int i;
dfunction_t *f; // 2000-01-02 EndFrame function by Maddes/FrikaC
loadedfile_t *fileinfo; // 2001-09-12 Returning information about loaded file by Maddes
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm start
int j;
int funcno;
char *funcname;
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm end
etype_t type; // 2001-10-20 TIMESCALE extension by Tomaz/Maddes
// flush the non-C variable lookup cache
for (i=0 ; i<GEFV_CACHESIZE ; i++)
gefvCache[i].field[0] = 0;
CRC_Init (&pr_crc);
// 2001-09-12 Returning information about loaded file by Maddes start
/*
progs = (dprograms_t *)COM_LoadHunkFile ("progs.dat");
if (!progs)
*/
fileinfo = COM_LoadHunkFile ("progs.dat");
if (!fileinfo)
// 2001-09-12 Returning information about loaded file by Maddes end
Sys_Error ("PR_LoadProgs: couldn't load progs.dat");
progs = (dprograms_t *)fileinfo->data; // 2001-09-12 Returning information about loaded file by Maddes
Con_DPrintf ("Programs occupy %iK.\n", com_filesize/1024);
for (i=0 ; i<com_filesize ; i++)
CRC_ProcessByte (&pr_crc, ((byte *)progs)[i]);
// byte swap the header
for (i=0 ; i<sizeof(*progs)/4 ; i++)
((int *)progs)[i] = LittleLong ( ((int *)progs)[i] );
if (progs->version != PROG_VERSION)
Sys_Error ("progs.dat has wrong version number (%i should be %i)", progs->version, PROG_VERSION);
// 1999-10-28 Compatibilty check by Maddes start
// if (progs->crc != PROGHEADER_CRC)
if (progs->crc == PROGHEADER101_CRC)
{
keep_compatibility = true;
Con_DPrintf ("Old progs.dat found, compatibility turned on.\n");
}
else if (progs->crc == PROGHEADER_CRC)
// || (progs->crc == PROGHEADER107_CRC)
{
keep_compatibility = false;
Con_DPrintf ("Enhanced progs.dat found, CRC is %i.\n", progs->crc);
}
else
// 1999-10-28 Compatibilty check by Maddes end
Sys_Error ("progs.dat system vars have been modified, progdefs.h is out of date");
pr_functions = (dfunction_t *)((byte *)progs + progs->ofs_functions);
pr_strings = (char *)progs + progs->ofs_strings;
pr_globaldefs = (ddef_t *)((byte *)progs + progs->ofs_globaldefs);
pr_fielddefs = (ddef_t *)((byte *)progs + progs->ofs_fielddefs);
pr_statements = (dstatement_t *)((byte *)progs + progs->ofs_statements);
pr_global_struct = (globalvars_t *)((byte *)progs + progs->ofs_globals);
pr_globals = (float *)pr_global_struct;
pr_edict_size = progs->entityfields * 4 + sizeof (edict_t) - sizeof(entvars_t);
// byte swap the lumps
for (i=0 ; i<progs->numstatements ; i++)
{
pr_statements[i].op = LittleShort(pr_statements[i].op);
pr_statements[i].a = LittleShort(pr_statements[i].a);
pr_statements[i].b = LittleShort(pr_statements[i].b);
pr_statements[i].c = LittleShort(pr_statements[i].c);
}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm start
// initialize function numbers for PROGS.DAT
pr_numbuiltins = 0;
pr_builtins = NULL;
if (pr_builtin_remap->value)
{
// remove all previous assigned function numbers
for ( j=1 ; j < pr_ebfs_numbuiltins; j++)
{
pr_ebfs_builtins[j].funcno = 0;
}
}
else
{
// use default function numbers
for ( j=1 ; j < pr_ebfs_numbuiltins; j++)
{
pr_ebfs_builtins[j].funcno = pr_ebfs_builtins[j].default_funcno;
// determine highest builtin number (when NOT remapped)
if (pr_ebfs_builtins[j].funcno > pr_numbuiltins)
{
pr_numbuiltins = pr_ebfs_builtins[j].funcno;
}
}
}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm end
for (i=0 ; i<progs->numfunctions; i++)
{
pr_functions[i].first_statement = LittleLong (pr_functions[i].first_statement);
pr_functions[i].parm_start = LittleLong (pr_functions[i].parm_start);
pr_functions[i].s_name = LittleLong (pr_functions[i].s_name);
pr_functions[i].s_file = LittleLong (pr_functions[i].s_file);
pr_functions[i].numparms = LittleLong (pr_functions[i].numparms);
pr_functions[i].locals = LittleLong (pr_functions[i].locals);
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm start
if (pr_builtin_remap->value)
{
if (pr_functions[i].first_statement < 0) // builtin function
{
funcno = -pr_functions[i].first_statement;
funcname = pr_strings + pr_functions[i].s_name;
// search function name
for ( j=1 ; j < pr_ebfs_numbuiltins ; j++)
{
if (!(Q_strcasecmp(funcname, pr_ebfs_builtins[j].funcname)))
{
break; // found
}
}
if (j < pr_ebfs_numbuiltins) // found
{
pr_ebfs_builtins[j].funcno = funcno;
}
else
{
Con_DPrintf("Can not assign builtin number #%i to %s - function unknown\n", funcno, funcname);
}
}
}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm end
}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm start
if (pr_builtin_remap->value)
{
// check for unassigned functions and try to assign their default function number
for ( i=1 ; i < pr_ebfs_numbuiltins; i++)
{
if ((!pr_ebfs_builtins[i].funcno) && (pr_ebfs_builtins[i].default_funcno)) // unassigned and has a default number
{
// check if default number is already assigned to another function
for ( j=1 ; j < pr_ebfs_numbuiltins; j++)
{
if (pr_ebfs_builtins[j].funcno == pr_ebfs_builtins[i].default_funcno)
{
break; // number already assigned to another builtin function
}
}
if (j < pr_ebfs_numbuiltins) // already assigned
{
Con_DPrintf("Can not assign default builtin number #%i to %s - number is already assigned to %s\n", pr_ebfs_builtins[i].default_funcno, pr_ebfs_builtins[i].funcname, pr_ebfs_builtins[j].funcname);
}
else
{
pr_ebfs_builtins[i].funcno = pr_ebfs_builtins[i].default_funcno;
}
}
// determine highest builtin number (when remapped)
if (pr_ebfs_builtins[i].funcno > pr_numbuiltins)
{
pr_numbuiltins = pr_ebfs_builtins[i].funcno;
}
}
}
pr_numbuiltins++;
// allocate and initialize builtin list for execution time
pr_builtins = Hunk_AllocName (pr_numbuiltins*sizeof(builtin_t), "builtins");
for ( i=0 ; i < pr_numbuiltins ; i++)
{
pr_builtins[i] = pr_ebfs_builtins[0].function;
}
// create builtin list for execution time and set cvars accordingly
Cvar_Set(pr_builtin_find, "0");
Cvar_Set(pr_checkextension, "0"); // 2001-10-20 Extension System by LordHavoc/Maddes (DP compatibility)
for ( j=1 ; j < pr_ebfs_numbuiltins ; j++)
{
if (pr_ebfs_builtins[j].funcno) // only put assigned functions into builtin list
{
pr_builtins[pr_ebfs_builtins[j].funcno] = pr_ebfs_builtins[j].function;
}
if (pr_ebfs_builtins[j].default_funcno == PR_DEFAULT_FUNCNO_BUILTIN_FIND)
{
Cvar_SetValue(pr_builtin_find, pr_ebfs_builtins[j].funcno);
}
// 2001-10-20 Extension System by LordHavoc/Maddes (DP compatibility) start
if (pr_ebfs_builtins[j].default_funcno == PR_DEFAULT_FUNCNO_EXTENSION_FIND)
{
Cvar_SetValue(pr_checkextension, pr_ebfs_builtins[j].funcno);
}
// 2001-10-20 Extension System by LordHavoc/Maddes (DP compatibility) end
}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes/Firestorm end
for (i=0 ; i<progs->numglobaldefs ; i++)
{
pr_globaldefs[i].type = LittleShort (pr_globaldefs[i].type);
pr_globaldefs[i].ofs = LittleShort (pr_globaldefs[i].ofs);
pr_globaldefs[i].s_name = LittleLong (pr_globaldefs[i].s_name);
}
for (i=0 ; i<progs->numfielddefs ; i++)
{
pr_fielddefs[i].type = LittleShort (pr_fielddefs[i].type);
if (pr_fielddefs[i].type & DEF_SAVEGLOBAL)
Sys_Error ("PR_LoadProgs: pr_fielddefs[i].type & DEF_SAVEGLOBAL");
pr_fielddefs[i].ofs = LittleShort (pr_fielddefs[i].ofs);
pr_fielddefs[i].s_name = LittleLong (pr_fielddefs[i].s_name);
}
for (i=0 ; i<progs->numglobals ; i++)
((int *)pr_globals)[i] = LittleLong (((int *)pr_globals)[i]);
// 2000-04-30 NVS HANDSHAKE SRV<->CL/QC<->CL by Maddes start
// check if the QuakeC code wants to know the NVS versions of the server and clients
pr_field_nvs_svc = ED_FindField("nvs_svc");
if (pr_field_nvs_svc)
{
type = pr_field_nvs_svc->type;
type &= ~DEF_SAVEGLOBAL;
if (type != ev_float)
{
pr_field_nvs_svc = NULL;
}
}
// 2000-04-30 NVS HANDSHAKE SRV<->CL/QC<->CL by Maddes ent
// 2001-11-15 Better GetEdictFieldValue performance by LordHavoc/Maddes start
// search for the definition only once
pr_field_ammo_shells1 = ED_FindField("ammo_shells1");
pr_field_ammo_nails1 = ED_FindField("ammo_nails1");
pr_field_ammo_lava_nails = ED_FindField("ammo_lava_nails");
pr_field_ammo_rockets1 = ED_FindField("ammo_rockets1");
pr_field_ammo_multi_rockets = ED_FindField("ammo_multi_rockets");
pr_field_ammo_cells1 = ED_FindField("ammo_cells1");
pr_field_ammo_plasma = ED_FindField("ammo_plasma");
pr_field_idealpitch = ED_FindField("idealpitch");
pr_field_pitch_speed = ED_FindField("pitch_speed");
pr_field_items2 = ED_FindField("items2");
pr_field_gravity = ED_FindField("gravity");
// 2001-11-15 Better GetEdictFieldValue performance by LordHavoc/Maddes end
// 2000-01-02 EndFrame function by Maddes/FrikaC start
pr_func_endframe = 0;
if ((f = ED_FindFunction ("EndFrame")) != NULL)
{
pr_func_endframe = (func_t)(f - pr_functions);
}
// 2000-01-02 EndFrame function by Maddes/FrikaC end
// 2001-10-20 TIMESCALE extension by Tomaz/Maddes start
pr_global_cpu_frametime = ED_FindGlobal ("cpu_frametime");
if (pr_global_cpu_frametime)
{
type = pr_global_cpu_frametime->type;
type &= ~DEF_SAVEGLOBAL;
if (type != ev_float)
{
pr_global_cpu_frametime = NULL;
}
}
pr_global_org_frametime = ED_FindGlobal ("org_frametime");
if (pr_global_org_frametime)
{
type = pr_global_org_frametime->type;
type &= ~DEF_SAVEGLOBAL;
if (type != ev_float)
{
pr_global_org_frametime = NULL;
}
}
// 2001-10-20 TIMESCALE extension by Tomaz/Maddes end
}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes start
/*
=============
PR_BuiltInList_f
For debugging, prints all builtin functions with assigned and default number
=============
*/
void PR_BuiltInList_f (void)
{
int i;
char *partial;
int len;
int count;
if (Cmd_Argc() > 1)
{
partial = Cmd_Argv (1);
len = strlen(partial);
}
else
{
partial = NULL;
len = 0;
}
count=0;
for (i=1; i < pr_ebfs_numbuiltins; i++)
{
if (partial && Q_strncasecmp (partial, pr_ebfs_builtins[i].funcname, len))
{
continue;
}
count++;
Con_Printf ("%i(%i): %s\n", pr_ebfs_builtins[i].funcno, pr_ebfs_builtins[i].default_funcno, pr_ebfs_builtins[i].funcname);
}
Con_Printf ("------------\n");
if (partial)
{
Con_Printf ("%i beginning with \"%s\" out of ", count, partial);
}
Con_Printf ("%i builtin functions\n", i);
}
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes end
// 2001-09-18 New cvar system by Maddes (Init) start
/*
===============
PR_Init_Cvars
===============
*/
void PR_Init_Cvars (void)
{
nomonsters = Cvar_Get ("nomonsters", "0", CVAR_ORIGINAL);
gamecfg = Cvar_Get ("gamecfg", "0", CVAR_ORIGINAL);
scratch1 = Cvar_Get ("scratch1", "0", CVAR_ORIGINAL);
scratch2 = Cvar_Get ("scratch2", "0", CVAR_ORIGINAL);
scratch3 = Cvar_Get ("scratch3", "0", CVAR_ORIGINAL);
scratch4 = Cvar_Get ("scratch4", "0", CVAR_ORIGINAL);
savedgamecfg = Cvar_Get ("savedgamecfg", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
saved1 = Cvar_Get ("saved1", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
saved2 = Cvar_Get ("saved2", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
saved3 = Cvar_Get ("saved3", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
saved4 = Cvar_Get ("saved4", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes start
pr_builtin_find = Cvar_Get ("pr_builtin_find", "0", CVAR_ROM);
pr_builtin_remap = Cvar_Get ("pr_builtin_remap", "0", CVAR_NONE);
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes end
pr_checkextension = Cvar_Get ("pr_checkextension", "0", CVAR_ROM); // 2001-10-20 Extension System by LordHavoc/Maddes (DP compatibility)
// 2001-09-20 QuakeC string zone by Maddes start
pr_zone_min_strings = Cvar_Get ("pr_zone_min_strings", "64", CVAR_NONE);
Cvar_SetRangecheck (pr_zone_min_strings, Cvar_RangecheckInt, 64, 8*1024); // up to 8MB
Cvar_SetDescription (pr_zone_min_strings, "States the size in KB of the zone for PROGS.DAT strings. Note that the PROGS.DAT may set this cvar itself.");
Cvar_Set(pr_zone_min_strings, pr_zone_min_strings->string); // do rangecheck
// 2001-09-20 QuakeC string zone by Maddes end
}
// 2001-09-18 New cvar system by Maddes (Init) end
/*
===============
PR_Init
===============
*/
void PR_Init (void)
{
Cmd_AddCommand ("edict", ED_PrintEdict_f);
Cmd_AddCommand ("edicts", ED_PrintEdicts);
Cmd_AddCommand ("edictcount", ED_Count);
Cmd_AddCommand ("profile", PR_Profile_f);
Cmd_AddCommand ("builtinlist", PR_BuiltInList_f); // 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes
Cmd_AddCommand ("extensionlist", PR_Extension_List_f); // 2001-10-20 Extension System by LordHavoc/Maddes
// 2001-09-18 New cvar system by Maddes (Init) start
/*
nomonsters = Cvar_Get ("nomonsters", "0", CVAR_ORIGINAL);
gamecfg = Cvar_Get ("gamecfg", "0", CVAR_ORIGINAL);
scratch1 = Cvar_Get ("scratch1", "0", CVAR_ORIGINAL);
scratch2 = Cvar_Get ("scratch2", "0", CVAR_ORIGINAL);
scratch3 = Cvar_Get ("scratch3", "0", CVAR_ORIGINAL);
scratch4 = Cvar_Get ("scratch4", "0", CVAR_ORIGINAL);
savedgamecfg = Cvar_Get ("savedgamecfg", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
saved1 = Cvar_Get ("saved1", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
saved2 = Cvar_Get ("saved2", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
saved3 = Cvar_Get ("saved3", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
saved4 = Cvar_Get ("saved4", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes start
pr_builtin_find = Cvar_Get ("pr_builtin_find", "0", CVAR_ROM);
pr_builtin_remap = Cvar_Get ("pr_builtin_remap", "0", CVAR_NONE);
// 2001-09-14 Enhanced BuiltIn Function System (EBFS) by Maddes end
// pr_checkextension = Cvar_Get ("pr_checkextension", "0", CVAR_ROM); // 2001-10-20 Extension System by LordHavoc/Maddes (DP compatibility)
*/
// 2001-09-18 New cvar system by Maddes (Init) end
}
edict_t *EDICT_NUM(int n)
{
if (n < 0 || n >= sv.max_edicts)
Sys_Error ("EDICT_NUM: bad number %i", n);
return (edict_t *)((byte *)sv.edicts+ (n)*pr_edict_size);
}
int NUM_FOR_EDICT(edict_t *e)
{
int b;
b = (byte *)e - (byte *)sv.edicts;
b = b / pr_edict_size;
if (b < 0 || b >= sv.num_edicts)
Sys_Error ("NUM_FOR_EDICT: bad pointer");
return b;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -