X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=pr_edict.c;h=985fc4db451d5435f417cc7856d2a3ac2d17e7d6;hp=0e8fbc6db55d805ba03db37a742a44e3ca2c1a59;hb=b4f6284099815f5390c9f00452d15c309f080626;hpb=d20520d58745196f7bbae40976698a30ece9ef0b diff --git a/pr_edict.c b/pr_edict.c index 0e8fbc6d..985fc4db 100644 --- a/pr_edict.c +++ b/pr_edict.c @@ -34,8 +34,7 @@ int pr_edictareasize; // LordHavoc: in bytes unsigned short pr_crc; -mempool_t *progs_mempool; -mempool_t *edictstring_mempool; +mempool_t *serverprogs_mempool; int type_size[8] = {1,sizeof(string_t)/4,1,3,1,1,sizeof(func_t)/4,sizeof(void *)/4}; @@ -92,6 +91,8 @@ int eval_button5; int eval_button6; int eval_button7; int eval_button8; +int eval_buttonuse; +int eval_buttonchat; int eval_glow_size; int eval_glow_trail; int eval_glow_color; @@ -126,6 +127,14 @@ int eval_light_lev; int eval_color; int eval_style; int eval_pflags; +int eval_cursor_active; +int eval_cursor_screen; +int eval_cursor_trace_start; +int eval_cursor_trace_endpos; +int eval_cursor_trace_ent; +int eval_colormod; +int eval_playermodel; +int eval_playerskin; mfunction_t *SV_PlayerPhysicsQC; mfunction_t *EndFrameQC; @@ -150,6 +159,8 @@ void FindEdictFieldOffsets(void) eval_button6 = FindFieldOffset("button6"); eval_button7 = FindFieldOffset("button7"); eval_button8 = FindFieldOffset("button8"); + eval_buttonuse = FindFieldOffset("buttonuse"); + eval_buttonchat = FindFieldOffset("buttonchat"); eval_glow_size = FindFieldOffset("glow_size"); eval_glow_trail = FindFieldOffset("glow_trail"); eval_glow_color = FindFieldOffset("glow_color"); @@ -184,6 +195,14 @@ void FindEdictFieldOffsets(void) eval_color = FindFieldOffset("color"); eval_style = FindFieldOffset("style"); eval_pflags = FindFieldOffset("pflags"); + eval_cursor_active = FindFieldOffset("cursor_active"); + eval_cursor_screen = FindFieldOffset("cursor_screen"); + eval_cursor_trace_start = FindFieldOffset("cursor_trace_start"); + eval_cursor_trace_endpos = FindFieldOffset("cursor_trace_endpos"); + eval_cursor_trace_ent = FindFieldOffset("cursor_trace_ent"); + eval_colormod = FindFieldOffset("colormod"); + eval_playermodel = FindFieldOffset("playermodel"); + eval_playerskin = FindFieldOffset("playerskin"); // LordHavoc: allowing QuakeC to override the player movement code SV_PlayerPhysicsQC = ED_FindFunction ("SV_PlayerPhysics"); @@ -219,6 +238,11 @@ void ED_ClearEdict (edict_t *e) e->v->netname = PR_SetString(svs.clients[num].name); if ((val = GETEDICTFIELDVALUE(e, eval_clientcolors))) val->_float = svs.clients[num].colors; + // NEXUIZ_PLAYERMODEL and NEXUIZ_PLAYERSKIN + if( eval_playermodel ) + GETEDICTFIELDVALUE(host_client->edict, eval_playermodel)->string = PR_SetString(svs.clients[num].playermodel); + if( eval_playerskin ) + GETEDICTFIELDVALUE(host_client->edict, eval_playerskin)->string = PR_SetString(svs.clients[num].playerskin); } } @@ -414,34 +438,34 @@ char *PR_ValueString (etype_t type, eval_t *val) //n = NoCrash_NUM_FOR_EDICT(PROG_TO_EDICT(val->edict)); n = val->edict; if (n < 0 || n >= MAX_EDICTS) - snprintf (line, sizeof (line), "entity %i (invalid!)", n); + dpsnprintf (line, sizeof (line), "entity %i (invalid!)", n); else - snprintf (line, sizeof (line), "entity %i", n); + dpsnprintf (line, sizeof (line), "entity %i", n); break; case ev_function: f = pr_functions + val->function; - snprintf (line, sizeof (line), "%s()", PR_GetString(f->s_name)); + dpsnprintf (line, sizeof (line), "%s()", PR_GetString(f->s_name)); break; case ev_field: def = ED_FieldAtOfs ( val->_int ); - snprintf (line, sizeof (line), ".%s", PR_GetString(def->s_name)); + dpsnprintf (line, sizeof (line), ".%s", PR_GetString(def->s_name)); break; case ev_void: - snprintf (line, sizeof (line), "void"); + dpsnprintf (line, sizeof (line), "void"); break; case ev_float: // LordHavoc: changed from %5.1f to %10.4f - snprintf (line, sizeof (line), "%10.4f", val->_float); + dpsnprintf (line, sizeof (line), "%10.4f", val->_float); break; case ev_vector: // LordHavoc: changed from %5.1f to %10.4f - snprintf (line, sizeof (line), "'%10.4f %10.4f %10.4f'", val->vector[0], val->vector[1], val->vector[2]); + dpsnprintf (line, sizeof (line), "'%10.4f %10.4f %10.4f'", val->vector[0], val->vector[1], val->vector[2]); break; case ev_pointer: - snprintf (line, sizeof (line), "pointer"); + dpsnprintf (line, sizeof (line), "pointer"); break; default: - snprintf (line, sizeof (line), "bad type %i", type); + dpsnprintf (line, sizeof (line), "bad type %i", type); break; } @@ -492,7 +516,7 @@ char *PR_UglyValueString (etype_t type, eval_t *val) line[i] = '\0'; break; case ev_entity: - snprintf (line, sizeof (line), "%i", NUM_FOR_EDICT(PROG_TO_EDICT(val->edict))); + dpsnprintf (line, sizeof (line), "%i", NUM_FOR_EDICT(PROG_TO_EDICT(val->edict))); break; case ev_function: f = pr_functions + val->function; @@ -500,19 +524,19 @@ char *PR_UglyValueString (etype_t type, eval_t *val) break; case ev_field: def = ED_FieldAtOfs ( val->_int ); - snprintf (line, sizeof (line), ".%s", PR_GetString(def->s_name)); + dpsnprintf (line, sizeof (line), ".%s", PR_GetString(def->s_name)); break; case ev_void: - snprintf (line, sizeof (line), "void"); + dpsnprintf (line, sizeof (line), "void"); break; case ev_float: - snprintf (line, sizeof (line), "%f", val->_float); + dpsnprintf (line, sizeof (line), "%f", val->_float); break; case ev_vector: - snprintf (line, sizeof (line), "%f %f %f", val->vector[0], val->vector[1], val->vector[2]); + dpsnprintf (line, sizeof (line), "%f %f %f", val->vector[0], val->vector[1], val->vector[2]); break; default: - snprintf (line, sizeof (line), "bad type %i", type); + dpsnprintf (line, sizeof (line), "bad type %i", type); break; } @@ -538,11 +562,11 @@ char *PR_GlobalString (int ofs) val = (void *)&pr_globals[ofs]; def = ED_GlobalAtOfs(ofs); if (!def) - snprintf (line, sizeof (line), "%i(?)", ofs); + dpsnprintf (line, sizeof (line), "%i(?)", ofs); else { s = PR_ValueString (def->type, val); - snprintf (line, sizeof (line), "%i(%s)%s", ofs, PR_GetString(def->s_name), s); + dpsnprintf (line, sizeof (line), "%i(%s)%s", ofs, PR_GetString(def->s_name), s); } i = strlen(line); @@ -561,9 +585,9 @@ char *PR_GlobalStringNoContents (int ofs) def = ED_GlobalAtOfs(ofs); if (!def) - snprintf (line, sizeof (line), "%i(?)", ofs); + dpsnprintf (line, sizeof (line), "%i(?)", ofs); else - snprintf (line, sizeof (line), "%i(%s)", ofs, PR_GetString(def->s_name)); + dpsnprintf (line, sizeof (line), "%i(%s)", ofs, PR_GetString(def->s_name)); i = strlen(line); for ( ; i<20 ; i++) @@ -600,7 +624,7 @@ void ED_Print(edict_t *ed) } tempstring[0] = 0; - snprintf (tempstring, sizeof (tempstring), "\nEDICT %i:\n", NUM_FOR_EDICT(ed)); + dpsnprintf (tempstring, sizeof (tempstring), "\nEDICT %i:\n", NUM_FOR_EDICT(ed)); for (i=1 ; inumfielddefs ; i++) { d = &pr_fielddefs[i]; @@ -896,7 +920,7 @@ char *ED_NewString (const char *string) int i,l; l = strlen(string) + 1; - new = Mem_Alloc(edictstring_mempool, l); + new = PR_Alloc(l); new_p = new; for (i=0 ; i< l ; i++) @@ -906,6 +930,8 @@ char *ED_NewString (const char *string) i++; if (string[i] == 'n') *new_p++ = '\n'; + else if (string[i] == 'r') + *new_p++ = '\r'; else *new_p++ = '\\'; } @@ -983,7 +1009,8 @@ qboolean ED_ParseEpair(edict_t *ent, ddef_t *key, const char *s) Con_DPrintf("ED_ParseEpair: Can't find field %s\n", s); return false; } - val->_int = G_INT(def->ofs); + //val->_int = G_INT(def->ofs); // AK Please check this - seems to be an org. quake bug + val->_int = def->ofs; break; case ev_function: @@ -1080,7 +1107,7 @@ const char *ED_ParseEdict (const char *data, edict_t *ent) { char temp[32]; strlcpy (temp, com_token, sizeof (temp)); - snprintf (com_token, sizeof (com_token), "0 %s 0", temp); + dpsnprintf (com_token, sizeof (com_token), "0 %s 0", temp); } if (!ED_ParseEpair(ent, key, com_token)) @@ -1139,24 +1166,26 @@ void ED_LoadFromFile (const char *data) parsed++; // remove things from different skill levels or deathmatch - if (deathmatch.integer) + if (gamemode != GAME_TRANSFUSION) //Transfusion does this in QC { - if (((int)ent->v->spawnflags & SPAWNFLAG_NOT_DEATHMATCH)) + if (deathmatch.integer) + { + if (((int)ent->v->spawnflags & SPAWNFLAG_NOT_DEATHMATCH)) + { + ED_Free (ent); + inhibited++; + 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); inhibited++; 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); - inhibited++; - continue; - } - // // immediately call spawn function // @@ -1204,46 +1233,57 @@ dpfield_t; dpfield_t dpfields[] = { - {ev_float, "gravity"}, + {ev_entity, "cursor_trace_ent"}, + {ev_entity, "drawonlytoclient"}, + {ev_entity, "exteriormodeltoclient"}, + {ev_entity, "nodrawtoclient"}, + {ev_entity, "tag_entity"}, + {ev_entity, "viewmodelforclient"}, + {ev_float, "alpha"}, + {ev_float, "ammo_cells1"}, + {ev_float, "ammo_lava_nails"}, + {ev_float, "ammo_multi_rockets"}, + {ev_float, "ammo_nails1"}, + {ev_float, "ammo_plasma"}, + {ev_float, "ammo_rockets1"}, + {ev_float, "ammo_shells1"}, {ev_float, "button3"}, {ev_float, "button4"}, {ev_float, "button5"}, {ev_float, "button6"}, {ev_float, "button7"}, {ev_float, "button8"}, + {ev_float, "buttonchat"}, + {ev_float, "buttonuse"}, + {ev_float, "clientcolors"}, + {ev_float, "cursor_active"}, + {ev_float, "fullbright"}, + {ev_float, "glow_color"}, {ev_float, "glow_size"}, {ev_float, "glow_trail"}, - {ev_float, "glow_color"}, - {ev_float, "items2"}, - {ev_float, "scale"}, - {ev_float, "alpha"}, - {ev_float, "renderamt"}, - {ev_float, "rendermode"}, - {ev_float, "fullbright"}, - {ev_float, "ammo_shells1"}, - {ev_float, "ammo_nails1"}, - {ev_float, "ammo_lava_nails"}, - {ev_float, "ammo_rockets1"}, - {ev_float, "ammo_multi_rockets"}, - {ev_float, "ammo_cells1"}, - {ev_float, "ammo_plasma"}, + {ev_float, "gravity"}, {ev_float, "idealpitch"}, - {ev_float, "pitch_speed"}, - {ev_entity, "viewmodelforclient"}, - {ev_entity, "nodrawtoclient"}, - {ev_entity, "exteriormodeltoclient"}, - {ev_entity, "drawonlytoclient"}, + {ev_float, "items2"}, + {ev_float, "light_lev"}, + {ev_float, "pflags"}, {ev_float, "ping"}, - {ev_vector, "movement"}, + {ev_float, "pitch_speed"}, {ev_float, "pmodel"}, - {ev_vector, "punchvector"}, - {ev_float, "clientcolors"}, - {ev_entity, "tag_entity"}, + {ev_float, "renderamt"}, // HalfLife support + {ev_float, "rendermode"}, // HalfLife support + {ev_float, "scale"}, + {ev_float, "style"}, {ev_float, "tag_index"}, - {ev_float, "light_lev"}, + {ev_float, "viewzoom"}, {ev_vector, "color"}, - {ev_float, "style"}, - {ev_float, "pflags"} + {ev_vector, "colormod"}, + {ev_vector, "cursor_screen"}, + {ev_vector, "cursor_trace_endpos"}, + {ev_vector, "cursor_trace_start"}, + {ev_vector, "movement"}, + {ev_vector, "punchvector"}, + {ev_string, "playermodel"}, + {ev_string, "playerskin"} }; /* @@ -1252,23 +1292,25 @@ PR_LoadProgs =============== */ extern void PR_Cmd_Reset (void); -void PR_LoadProgs (void) +void PR_LoadProgs (const char *progsname) { int i; dstatement_t *st; ddef_t *infielddefs; dfunction_t *dfunctions; + if (!progsname || !*progsname) + Host_Error("PR_LoadProgs: passed empty progsname"); + // flush the non-C variable lookup cache for (i=0 ; iofs_fielddefs); - pr_fielddefs = Mem_Alloc(progs_mempool, (progs->numfielddefs + DPFIELDS) * sizeof(ddef_t)); + pr_fielddefs = PR_Alloc((progs->numfielddefs + DPFIELDS) * sizeof(ddef_t)); + pr_functions = PR_Alloc(sizeof(mfunction_t) * progs->numfunctions); pr_statements = (dstatement_t *)((qbyte *)progs + progs->ofs_statements); @@ -1309,7 +1352,6 @@ void PR_LoadProgs (void) pr_statements[i].c = LittleShort(pr_statements[i].c); } - pr_functions = Mem_Alloc(progs_mempool, sizeof(mfunction_t) * progs->numfunctions); for (i = 0;i < progs->numfunctions;i++) { pr_functions[i].first_statement = LittleLong (dfunctions[i].first_statement); @@ -1537,7 +1579,7 @@ void PR_Fields_f (void) strlcat (tempstring, "pointer ", sizeof (tempstring)); break; default: - snprintf (tempstring2, sizeof (tempstring2), "bad type %i ", d->type & ~DEF_SAVEGLOBAL); + dpsnprintf (tempstring2, sizeof (tempstring2), "bad type %i ", d->type & ~DEF_SAVEGLOBAL); strlcat (tempstring, tempstring2, sizeof (tempstring)); break; } @@ -1551,7 +1593,7 @@ void PR_Fields_f (void) strcat (tempstring, name); for (j = strlen(name);j < 25;j++) strcat(tempstring, " "); - snprintf (tempstring2, sizeof (tempstring2), "%5d", counts[i]); + dpsnprintf (tempstring2, sizeof (tempstring2), "%5d", counts[i]); strlcat (tempstring, tempstring2, sizeof (tempstring)); strlcat (tempstring, "\n", sizeof (tempstring)); if (strlen(tempstring) >= 4096) @@ -1630,12 +1672,42 @@ void PR_Init (void) Cvar_RegisterVariable (&pr_boundscheck); Cvar_RegisterVariable (&pr_traceqc); - progs_mempool = Mem_AllocPool("progs.dat", 0, NULL); - edictstring_mempool = Mem_AllocPool("edict strings", 0, NULL); + serverprogs_mempool = Mem_AllocPool("server progs", 0, NULL); PR_Cmd_Init(); } +/* +=============== +PR_Shutdown +=============== +*/ +extern void PR_Cmd_Shutdown(void); +void PR_Shutdown (void) +{ + PR_Cmd_Shutdown(); + + Mem_FreePool(&serverprogs_mempool); +} + +void *_PR_Alloc(size_t buffersize, const char *filename, int fileline) +{ + return _Mem_Alloc(serverprogs_mempool, buffersize, filename, fileline); +} + +void _PR_Free(void *buffer, const char *filename, int fileline) +{ + _Mem_Free(buffer, filename, fileline); +} + +void _PR_FreeAll(const char *filename, int fileline) +{ + progs = NULL; + pr_fielddefs = NULL; + pr_functions = NULL; + _Mem_EmptyPool(serverprogs_mempool, filename, fileline); +} + // LordHavoc: turned EDICT_NUM into a #define for speed reasons edict_t *EDICT_NUM_ERROR(int n, char *filename, int fileline) {