📄 g_spawn.pas
字号:
begin
inc(c2);
chain^.teamchain := e2;
e2^.teammaster := e;
chain := e2;
e2^.flags := e2^.flags or FL_TEAMSLAVE;
end;
Continue_J:
inc(e2);
end;
Continue_:
inc(e);
end;
gi.dprintf('%i teams with %i entities'#10, c, c2);
end;
(*
==============
SpawnEntities
Creates a server's entity / program execution context by
parsing textual entity definitions out of an ent file.
==============
*)
procedure SpawnEntities(mapname: pchar; entities: pchar; spawnpoint: pchar);
var
ent: edict_p;
inhibit: integer;
com_token: pchar;
i: integer;
skill_level: single;
begin
skill_level := floor(skill^.value);
if skill_level < 0 then
skill_level := 0;
if skill_level > 3 then
skill_level := 3;
if skill^.value <> skill_level then
gi.cvar_forceset('skill', va('%f', [skill_level]));
SaveClientData();
gi.FreeTags(TAG_LEVEL);
FillChar(level, SizeOf(level), 0);
FillChar(g_edicts^, game.maxentities * SizeOf(g_edicts^[0]), 0);
strncpy(level.mapname, mapname, SizeOf(level.mapname)-1);
strncpy(game.spawnpoint, spawnpoint, SizeOf(game.spawnpoint)-1);
(* set client fields on player ents*)
for i := 0 to (game.maxclients - 1) do
g_edicts^[i + 1].client := @gclient_a(game.clients)^[i];
ent := Nil;
inhibit := 0;
(* parse ents*)
while True do
begin
(* parse the opening brace *)
com_token := COM_Parse(entities);
if entities = nil then
Break; //if (!entities)
if com_token[0] <> '{' then
gi.error('ED_LoadFromFile: found %s when expecting {', com_token);
if ent = nil then
ent := @g_edicts^[0] //if (!ent)
else
ent := g_utils.G_Spawn();
entities := ED_ParseEdict(entities, ent);
(* yet another map hack*)
if (Q_stricmp(level.mapname, 'command') = 0) and (Q_stricmp(ent^.classname, 'trigger_once') = 0) and (Q_stricmp(ent^.model, '*27') = 0) then
ent^.spawnflags := ent^.spawnflags and (not SPAWNFLAG_NOT_HARD);
(* remove things (except the world) from different skill levels or deathmatch*)
if ent <> @g_edicts^[0] then
begin
if deathmatch^.value <> 0 then
begin
if (ent^.spawnflags and SPAWNFLAG_NOT_DEATHMATCH) <> 0 then
begin
G_FreeEdict(ent);
inc(inhibit);
Continue;
end;
end
else
begin
if ((skill^.value = 0) and ((ent^.spawnflags and SPAWNFLAG_NOT_EASY) <> 0)) or
((skill^.value = 1) and ((ent^.spawnflags and SPAWNFLAG_NOT_MEDIUM) <> 0)) or
(((skill^.value = 2) or (skill^.value = 3)) and ((ent^.spawnflags and SPAWNFLAG_NOT_HARD) <> 0)) then
begin
G_FreeEdict(ent);
inc(inhibit);
Continue;
end;
end;
ent^.spawnflags := ent^.spawnflags and (not (SPAWNFLAG_NOT_EASY or SPAWNFLAG_NOT_MEDIUM or SPAWNFLAG_NOT_HARD or SPAWNFLAG_NOT_COOP or SPAWNFLAG_NOT_DEATHMATCH));
end;
ED_CallSpawn(ent);
end;
gi.dprintf('%i entities inhibited'#10,inhibit);
{$ifdef DEBUG}
i := 1;
ent := EDICT_NUM(i);
while i < globals.num_edicts do
begin
if (ent^.inuse <> 0) or (ent^.inuse <> 1) then
Com_DPrintf('Invalid entity %d'#10, i);
inc(i);
inc(ent);
end;
{$endif}
G_FindTeams();
PlayerTrail_Init();
end;
{ | | | | }
{ V V ToDo: Scott from Here V V }
(*===================================================================*)
{$ifdef 0}
{ (* cursor positioning*)
xl <value>
xr <value>
yb <value>
yt <value>
xv <value>
yv<value>
(* drawing*)
statpic <name>
pic <stat>
num< fieldwidth> <stat>
string_ <stat>
(* control*)
if <stat>
ifeq <stat> <value>
ifbit <stat> <value>
endif;}
{$endif}
var
single_statusbar: PChar = 'yb -24 '+
(* health*)
'xv 0 '+
'hnum '+
'xv 50 '+
'pic 0 '+
(* ammo*)
'if 2 '+
' xv 100 '+
' anum '+
' xv 150 '+
' pic 2 '+
'endif '+
(* armor*)
'if 4 '+
' xv 200 '+
' rnum '+
' xv 250 '+
' pic 4 '+
'endif '+
(* selected item*)
'if 6 '+
' xv 296 '+
' pic 6 '+
'endif '+
'yb -50 '+
(* picked up item*)
'if 7 '+
' xv 0 '+
' pic 7 '+
' xv 26 '+
' yb -42 '+
' stat_string 8 '+
' yb -50 '+
'endif '+
(* timer*)
'if 9 '+
' xv 262 '+
' num 2 10 '+
' xv 296 '+
' pic 9 '+
'endif '+
(* help / weapon icon *)
'if 11 '+
' xv 148 '+
' pic 11 '+
'endif ';
dm_statusbar: pchar =
'yb -24 '+
(* health*)
'xv 0 '+
'hnum '+
'xv 50 '+
'pic 0 '+
(* ammo*)
'if 2 '+
' xv 100 '+
' anum '+
' xv 150 '+
' pic 2 '+
'endif '+
(* armor*)
'if 4 '+
' xv 200 '+
' rnum '+
' xv 250 '+
' pic 4 '+
'endif '+
(* selected item*)
'if 6 '+
' xv 296 '+
' pic 6 '+
'endif '+
'yb -50 '+
(* picked up item*)
'if 7 '+
' xv 0 '+
' pic 7 '+
' xv 26 '+
' yb -42 '+
' stat_string 8 '+
' yb -50 '+
'endif '+
(* timer*)
'if 9 '+
' xv 246 '+
' num 2 10 '+
' xv 296 '+
' pic 9 '+
'endif '+
(* help / weapon icon *)
'if 11 '+
' xv 148 '+
' pic 11 '+
'endif '+
(* frags*)
'xr -50 '+
'yt 2 '+
'num 3 14 '+
(* spectator*)
'if 17 '+
'xv 0 '+
'yb -58 '+
'string2 "SPECTATOR MODE" '+
'endif '+
(* chase camera*)
'if 16 '+
'xv 0 '+
'yb -68 '+
'string "Chasing" '+
'xv 64 '+
'stat_string 16 '+
'endif ';
(*QUAKED worldspawn (0 0 0) ?
Only used for the world.
"sky" environment map name
"skyaxis" vector axis for rotating sky
"skyrotate" speed of rotation in degrees/second
"sounds" music cd track number
"gravity" 800 is default gravity
"message" text to print at user logon
*)
procedure SP_worldspawn(ent: edict_p);
begin
ent^.movetype := MOVETYPE_PUSH;
ent^.solid := SOLID_BSP;
ent^.inuse := true;
ent^.s.modelindex := 1;
(* since the world doesn't use G_Spawn()*)
(* world model is always index 1*)
(*---------------*)
(* reserve some spots for dead player bodies for coop / deathmatch*)
InitBodyQue();
(* set configstrings for items*)
SetItemNames;
if st.nextmap <> nil then
strcpy(level.nextmap, st.nextmap); // if (st.nextmap)
(* make some data visible to the server*)
if (ent^._message <> nil) and (ent^._message[0] <> #0)then
begin
gi.configstring(CS_NAME, ent^._message);
strncpy(level.level_name, ent^._message, SizeOf(level.level_name));
end
else
strncpy(level.level_name, level.mapname, SizeOf(level.level_name));
if (st.sky <> nil) and (st.sky[0] <> #0) then
gi.configstring(CS_SKY, st.sky)
else
gi.configstring(CS_SKY, 'unit1_');
gi.configstring(CS_SKYROTATE, va('%f', [st.skyrotate]));
gi.configstring(CS_SKYAXIS, va('%f %f %f', [st.skyaxis[0], st.skyaxis[1], st.skyaxis[2]]));
gi.configstring(CS_CDTRACK, va('%i', [ent^.sounds]));
gi.configstring(CS_MAXCLIENTS, va('%i', [trunc(maxclients^.Value)]));
(* status bar program*)
if deathmatch^.value <> 0 then
gi.configstring(CS_STATUSBAR, dm_statusbar)
else
gi.configstring(CS_STATUSBAR, single_statusbar);
(*---------------*)
(* help icon for statusbar*)
gi.imageindex('i_help');
level.pic_health := gi.imageindex('i_health');
gi.imageindex('help');
gi.imageindex('field_3');
if st.gravity = nil then
gi.cvar_set('sv_gravity', '800')
else
gi.cvar_set('sv_gravity', st.gravity);
snd_fry := gi.soundindex('player/fry.wav'); (* standing in lava / slime*)
PrecacheItem(FindItem('Blaster'));
gi.soundindex('player/lava1.wav');
gi.soundindex('player/lava2.wav');
gi.soundindex('misc/pc_up.wav');
gi.soundindex('misc/talk1.wav');
gi.soundindex('misc/udeath.wav');
(* gibs*)
gi.soundindex('items/respawn1.wav');
(* sexed sounds*)
gi.soundindex('*death1.wav');
gi.soundindex('*death2.wav');
gi.soundindex('*death3.wav');
gi.soundindex('*death4.wav');
gi.soundindex('*fall1.wav');
gi.soundindex('*fall2.wav');
(* drowning damage*)
gi.soundindex('*gurp1.wav');
gi.soundindex('*gurp2.wav');
(* player jump*)
gi.soundindex('*jump1.wav');
gi.soundindex('*pain25_1.wav');
gi.soundindex('*pain25_2.wav');
gi.soundindex('*pain50_1.wav');
gi.soundindex('*pain50_2.wav');
gi.soundindex('*pain75_1.wav');
gi.soundindex('*pain75_2.wav');
gi.soundindex('*pain100_1.wav');
gi.soundindex('*pain100_2.wav');
(* sexed models*)
(* THIS ORDER MUST MATCH THE DEFINES IN g_local.h*)
(* you can add more, max 15*)
gi.modelindex('#w_blaster.md2');
gi.modelindex('#w_shotgun.md2');
gi.modelindex('#w_sshotgun.md2');
gi.modelindex('#w_machinegun.md2');
gi.modelindex('#w_chaingun.md2');
gi.modelindex('#a_grenades.md2');
gi.modelindex('#w_glauncher.md2');
gi.modelindex('#w_rlauncher.md2');
gi.modelindex('#w_hyperblaster.md2');
gi.modelindex('#w_railgun.md2');
gi.modelindex('#w_bfg.md2');
(*-------------------*)
gi.soundindex('player/gasp1.wav'); (* gasping for air*)
gi.soundindex('player/gasp2.wav'); (* head breaking surface, not gasping*)
gi.soundindex('player/watr_in.wav'); (* feet hitting water*)
gi.soundindex('player/watr_out.wav'); (* feet leaving water*)
gi.soundindex('player/watr_un.wav'); (* head going underwater*)
gi.soundindex('player/u_breath1.wav');
gi.soundindex('player/u_breath2.wav');
gi.soundindex('items/pkup.wav'); (* bonus item pickup*)
gi.soundindex('world/land.wav'); (* landing thud*)
gi.soundindex('misc/h2ohit1.wav'); (* landing splash*)
gi.soundindex('items/damage.wav');
gi.soundindex('items/protect.wav');
gi.soundindex('items/protect4.wav');
gi.soundindex('weapons/noammo.wav');
gi.soundindex('infantry/inflies1.wav');
sm_meat_index := gi.modelindex('models/objects/gibs/sm_meat/tris.md2');
gi.modelindex('models/objects/gibs/arm/tris.md2');
gi.modelindex('models/objects/gibs/bone/tris.md2');
gi.modelindex('models/objects/gibs/bone2/tris.md2');
gi.modelindex('models/objects/gibs/chest/tris.md2');
gi.modelindex('models/objects/gibs/skull/tris.md2');
gi.modelindex('models/objects/gibs/head2/tris.md2');
(**)
(* Setup light animation tables. 'a' is total darkness, 'z' is doublebright.*)
(**)
(* 0 normal*)
gi.configstring(CS_LIGHTS + 0, 'm');
(* 1 FLICKER (first variety)*)
gi.configstring(CS_LIGHTS + 1, 'mmnmmommommnonmmonqnmmo');
(* 2 SLOW STRONG PULSE*)
gi.configstring(CS_LIGHTS + 2, 'abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba');
(* 3 CANDLE (first variety)*)
gi.configstring(CS_LIGHTS + 3, 'mmmmmaaaaammmmmaaaaaabcdefgabcdefg');
(* 4 FAST STROBE*)
gi.configstring(CS_LIGHTS + 4, 'mamamamamama');
(* 5 GENTLE PULSE 1*)
gi.configstring(CS_LIGHTS + 5, 'jklmnopqrstuvwxyzyxwvutsrqponmlkj');
(* 6 FLICKER (second variety)*)
gi.configstring(CS_LIGHTS + 6, 'nmonqnmomnmomomno');
(* 7 CANDLE (second variety)*)
gi.configstring(CS_LIGHTS + 7, 'mmmaaaabcdefgmmmmaaaammmaamm');
(* 8 CANDLE (third variety)*)
gi.configstring(CS_LIGHTS + 8, 'mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa');
(* 9 SLOW STROBE (fourth variety)*)
gi.configstring(CS_LIGHTS + 9, 'aaaaaaaazzzzzzzz');
(* 10 FLUORESCENT FLICKER*)
gi.configstring(CS_LIGHTS + 10, 'mmamammmmammamamaaamammma');
(* 11 SLOW PULSE NOT FADE TO BLACK*)
gi.configstring(CS_LIGHTS + 11, 'abcdefghijklmnopqrrqponmlkjihgfedcba');
(* styles 32-62 are assigned by the light program for switchable lights*)
(* 63 testing*)
gi.configstring(CS_LIGHTS + 63, 'a');
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -