📄 g_misc.pas
字号:
ratio := other.mass / self.mass;
VectorSubtract(self.s.origin, other.s.origin, v);
M_walkmove(self, vectoyaw(v), 20 * ratio * FRAMETIME);
end;
procedure barrel_explode(self: edict_p); cdecl;
Var org: vec3_t; spd: Single; save: vec3_t;
begin
T_RadiusDamage (self, self.activator, self.dmg, Nil, self.dmg+40, MOD_BARREL);
VectorCopy(self.s.origin, save);
VectorMA(self.absmin, 0.5, self.size, self.s.origin);
// a few big chunks
spd := 1.5 * self.dmg / 200;
org[0] := self.s.origin[0] + crandom() * self.size[0];
org[1] := self.s.origin[1] + crandom() * self.size[1];
org[2] := self.s.origin[2] + crandom() * self.size[2];
ThrowDebris(self, 'models/objects/debris1/tris.md2', spd, org);
org[0] := self.s.origin[0] + crandom() * self.size[0];
org[1] := self.s.origin[1] + crandom() * self.size[1];
org[2] := self.s.origin[2] + crandom() * self.size[2];
ThrowDebris(self, 'models/objects/debris1/tris.md2', spd, org);
// bottom corners
spd := 1.75 * self.dmg / 200;
VectorCopy(self.absmin, org);
ThrowDebris(self, 'models/objects/debris3/tris.md2', spd, org);
VectorCopy(self.absmin, org);
org[0] := org[0] + self.size[0];
ThrowDebris(self, 'models/objects/debris3/tris.md2', spd, org);
VectorCopy(self.absmin, org);
org[1] := org[1] + self.size[1];
ThrowDebris(self, 'models/objects/debris3/tris.md2', spd, org);
VectorCopy(self.absmin, org);
org[0] := org[0] + self.size[0];
org[1] := org[1] + self.size[1];
ThrowDebris(self, 'models/objects/debris3/tris.md2', spd, org);
// a bunch of little chunks
spd := 2 * self.dmg / 200;
org[0] := self.s.origin[0] + crandom() * self.size[0];
org[1] := self.s.origin[1] + crandom() * self.size[1];
org[2] := self.s.origin[2] + crandom() * self.size[2];
ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
org[0] := self.s.origin[0] + crandom() * self.size[0];
org[1] := self.s.origin[1] + crandom() * self.size[1];
org[2] := self.s.origin[2] + crandom() * self.size[2];
ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
org[0] := self.s.origin[0] + crandom() * self.size[0];
org[1] := self.s.origin[1] + crandom() * self.size[1];
org[2] := self.s.origin[2] + crandom() * self.size[2];
ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
org[0] := self.s.origin[0] + crandom() * self.size[0];
org[1] := self.s.origin[1] + crandom() * self.size[1];
org[2] := self.s.origin[2] + crandom() * self.size[2];
ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
org[0] := self.s.origin[0] + crandom() * self.size[0];
org[1] := self.s.origin[1] + crandom() * self.size[1];
org[2] := self.s.origin[2] + crandom() * self.size[2];
ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
org[0] := self.s.origin[0] + crandom() * self.size[0];
org[1] := self.s.origin[1] + crandom() * self.size[1];
org[2] := self.s.origin[2] + crandom() * self.size[2];
ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
org[0] := self.s.origin[0] + crandom() * self.size[0];
org[1] := self.s.origin[1] + crandom() * self.size[1];
org[2] := self.s.origin[2] + crandom() * self.size[2];
ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
org[0] := self.s.origin[0] + crandom() * self.size[0];
org[1] := self.s.origin[1] + crandom() * self.size[1];
org[2] := self.s.origin[2] + crandom() * self.size[2];
ThrowDebris(self, 'models/objects/debris2/tris.md2', spd, org);
VectorCopy(save, self.s.origin);
if self.groundentity<>Nil then
BecomeExplosion2(self)
else
BecomeExplosion1(self);
end;
procedure barrel_delay(self, inflictor, attacker: edict_p; damage: Integer; point: vec3_t); cdecl;
begin
self.takedamage := DAMAGE_NO;
self.nextthink := level.time + 2 * FRAMETIME;
self.think := barrel_explode;
self.activator := attacker;
end;
procedure SP_misc_explobox(self: edict_p); cdecl;
begin
if deathmatch.value<>0 then begin // auto-remove for deathmatch
G_FreeEdict(self);
exit;
end;
gi.modelindex('models/objects/debris1/tris.md2');
gi.modelindex('models/objects/debris2/tris.md2');
gi.modelindex('models/objects/debris3/tris.md2');
self.solid := SOLID_BBOX;
self.movetype := MOVETYPE_STEP;
self.model := 'models/objects/barrels/tris.md2';
self.s.modelindex := gi.modelindex(self.model);
VectorSet(self.mins, -16, -16, 0);
VectorSet(self.maxs, 16, 16, 40);
if self.mass = 0 then
self.mass := 400;
if self.health = 0 then
self.health := 10;
if self.dmg = 0 then
self.dmg := 150;
self.die := barrel_delay;
self.takedamage := DAMAGE_YES;
self.monsterinfo.aiflags := AI_NOSTEP;
self.touch := barrel_touch;
self.think := M_droptofloor;
self.nextthink := level.time + 2 * FRAMETIME;
gi.linkentity(self);
end;
//
// miscellaneous specialty items
//
(*QUAKED misc_blackhole (1 .5 0) (-8 -8 -8) (8 8 8)
*)
procedure misc_blackhole_use(ent, other, activator: edict_p); cdecl;
begin
(*
gi.WriteByte(svc_temp_entity);
gi.WriteByte(TE_BOSSTPORT);
gi.WritePosition(ent.s.origin);
gi.multicast(ent.s.origin, MULTICAST_PVS);
*)
G_FreeEdict(ent);
end;
procedure misc_blackhole_think(self: edict_p); cdecl;
begin
Inc(self.s.frame);
if self.s.frame < 19 then
self.nextthink := level.time + FRAMETIME
else begin
self.s.frame := 0;
self.nextthink := level.time + FRAMETIME;
end;
end;
procedure SP_misc_blackhole(ent: edict_p); cdecl;
begin
ent.movetype := MOVETYPE_NONE;
ent.solid := SOLID_NOT;
VectorSet (ent.mins, -64, -64, 0);
VectorSet (ent.maxs, 64, 64, 8);
ent.s.modelindex := gi.modelindex('models/objects/black/tris.md2');
ent.s.renderfx := RF_TRANSLUCENT;
ent.use := misc_blackhole_use;
ent.think := misc_blackhole_think;
ent.nextthink := level.time + 2 * FRAMETIME;
gi.linkentity(ent);
end;
(*QUAKED misc_eastertank (1 .5 0) (-32 -32 -16) (32 32 32)
*)
procedure misc_eastertank_think(self: edict_p); cdecl;
begin
Inc (self.s.frame);
if self.s.frame < 293 then
self.nextthink := level.time + FRAMETIME
else begin
self.s.frame := 254;
self.nextthink := level.time + FRAMETIME;
end;
end;
procedure SP_misc_eastertank(ent: edict_p); cdecl;
begin
ent.movetype := MOVETYPE_NONE;
ent.solid := SOLID_BBOX;
VectorSet (ent.mins, -32, -32, -16);
VectorSet (ent.maxs, 32, 32, 32);
ent.s.modelindex := gi.modelindex ('models/monsters/tank/tris.md2');
ent.s.frame := 254;
ent.think := misc_eastertank_think;
ent.nextthink := level.time + 2 * FRAMETIME;
gi.linkentity (ent);
end;
(*QUAKED misc_easterchick (1 .5 0) (-32 -32 0) (32 32 32)
*)
procedure misc_easterchick_think(self: edict_p); cdecl;
begin
Inc(self.s.frame);
if self.s.frame < 247 then
self.nextthink := level.time + FRAMETIME
else begin
self.s.frame := 208;
self.nextthink := level.time + FRAMETIME;
end;
end;
procedure SP_misc_easterchick(ent: edict_p); cdecl;
begin
ent.movetype := MOVETYPE_NONE;
ent.solid := SOLID_BBOX;
VectorSet (ent.mins, -32, -32, 0);
VectorSet (ent.maxs, 32, 32, 32);
ent.s.modelindex := gi.modelindex ('models/monsters/bitch/tris.md2');
ent.s.frame := 208;
ent.think := misc_easterchick_think;
ent.nextthink := level.time + 2 * FRAMETIME;
gi.linkentity(ent);
end;
(*QUAKED misc_easterchick2 (1 .5 0) (-32 -32 0) (32 32 32)
*)
procedure misc_easterchick2_think (self: edict_p); cdecl;
begin
Inc(self.s.frame);
if self.s.frame < 287 then
self.nextthink := level.time + FRAMETIME
else begin
self.s.frame := 248;
self.nextthink := level.time + FRAMETIME;
end;
end;
procedure SP_misc_easterchick2(ent: edict_p); cdecl;
begin
ent.movetype := MOVETYPE_NONE;
ent.solid := SOLID_BBOX;
VectorSet (ent.mins, -32, -32, 0);
VectorSet (ent.maxs, 32, 32, 32);
ent.s.modelindex := gi.modelindex ('models/monsters/bitch/tris.md2');
ent.s.frame := 248;
ent.think := misc_easterchick2_think;
ent.nextthink := level.time + 2 * FRAMETIME;
gi.linkentity(ent);
end;
(*QUAKED monster_commander_body (1 .5 0) (-32 -32 0) (32 32 48)
Not really a monster, this is the Tank Commander's decapitated body.
There should be a item_commander_head that has this as it's target.
*)
procedure commander_body_think(self: edict_p); cdecl;
begin
Inc (self.s.frame);
if self.s.frame < 24 then
self.nextthink := level.time + FRAMETIME
else
self.nextthink := 0;
if self.s.frame = 22 then
gi.sound(self, CHAN_BODY, gi.soundindex('tank/thud.wav'), 1, ATTN_NORM, 0);
end;
procedure commander_body_use(self, other, activator: edict_p); cdecl;
begin
self.think := commander_body_think;
self.nextthink := level.time + FRAMETIME;
gi.sound (self, CHAN_BODY, gi.soundindex ('tank/pain.wav'), 1, ATTN_NORM, 0);
end;
procedure commander_body_drop(self: edict_p); cdecl;
begin
self.movetype := MOVETYPE_TOSS;
self.s.origin[2] := self.s.origin[2] + 2;
end;
procedure SP_monster_commander_body(self: edict_p); cdecl;
begin
self.movetype := MOVETYPE_NONE;
self.solid := SOLID_BBOX;
self.model := 'models/monsters/commandr/tris.md2';
self.s.modelindex := gi.modelindex (self.model);
VectorSet (self.mins, -32, -32, 0);
VectorSet (self.maxs, 32, 32, 48);
self.use := commander_body_use;
self.takedamage := DAMAGE_YES;
self.flags := FL_GODMODE;
self.s.renderfx := self.s.renderfx OR RF_FRAMELERP;
gi.linkentity (self);
gi.soundindex ('tank/thud.wav');
gi.soundindex ('tank/pain.wav');
self.think := commander_body_drop;
self.nextthink := level.time + 5 * FRAMETIME;
end;
(*QUAKED misc_banner (1 .5 0) (-4 -4 -4) (4 4 4)
The origin is the bottom of the banner.
The banner is 128 tall.
*)
procedure misc_banner_think(ent: edict_p); cdecl;
begin
ent.s.frame := (ent.s.frame + 1) mod 16;
ent.nextthink := level.time + FRAMETIME;
end;
procedure SP_misc_banner(ent: edict_p); cdecl;
begin
ent.movetype := MOVETYPE_NONE;
ent.solid := SOLID_NOT;
ent.s.modelindex := gi.modelindex ('models/objects/banner/tris.md2');
ent.s.frame := System.Random(16);
gi.linkentity (ent);
ent.think := misc_banner_think;
ent.nextthink := level.time + FRAMETIME;
end;
(*QUAKED misc_deadsoldier (1 .5 0) (-16 -16 0) (16 16 16) ON_BACK ON_STOMACH BACK_DECAP FETAL_POS SIT_DECAP IMPALED
This is the dead player model. Comes in 6 exciting different poses!
*)
procedure misc_deadsoldier_die(self, inflictor, attacker: edict_p; damage: Integer; point: vec3_t); cdecl;
Var n: Integer;
begin
if self.health > -80 then
exit;
gi.sound (self, CHAN_BODY, gi.soundindex ('misc/udeath.wav'), 1, ATTN_NORM, 0);
for n:=0 to 3 do
ThrowGib(self, 'models/objects/gibs/sm_meat/tris.md2', damage, GIB_ORGANIC);
ThrowHead(self, 'models/objects/gibs/head2/tris.md2', damage, GIB_ORGANIC);
end;
procedure SP_misc_deadsoldier(ent: edict_p); cdecl;
begin
if deathmatch.value <> 0 then begin // auto-remove for deathmatch
G_FreeEdict (ent);
exit;
end;
ent.movetype := MOVETYPE_NONE;
ent.solid := SOLID_BBOX;
ent.s.modelindex:=gi.modelindex('models/deadbods/dude/tris.md2');
// Defaults to frame 0
if (ent.spawnflags AND 2)>0 then
ent.s.frame := 1
else if (ent.spawnflags AND 4)>0 then
ent.s.frame := 2
else if (ent.spawnflags AND 8)>0 then
ent.s.frame := 3
else if (ent.spawnflags AND 16)>0 then
ent.s.frame := 4
else if (ent.spawnflags AND 32)>0 then
ent.s.frame := 5
else
ent.s.frame := 0;
VectorSet(ent.mins, -16, -16, 0);
VectorSet(ent.maxs, 16, 16, 16);
ent.deadflag := DEAD_DEAD;
ent.takedamage := DAMAGE_YES;
ent.svflags := ent.svflags OR SVF_MONSTER OR SVF_DEADMONSTER;
ent.die := misc_deadsoldier_die;
ent.monsterinfo.aiflags := ent.monsterinfo.aiflags OR AI_GOOD_GUY;
gi.linkentity (ent);
end;
(*QUAKED misc_viper (1 .5 0) (-16 -16 0) (16 16 32)
This is the Viper for the flyby bombing.
It is trigger_spawned, so you must have something use it for it to show up.
There must be a path for it to follow once it is activated.
'speed' How fast the Viper should fly
*)
procedure misc_viper_use(self, other, activator: edict_p); cdecl;
begin
self.svflags := self.svflags AND NOT SVF_NOCLIENT;
self.use := train_use;
train_use (self, other, activator);
end;
procedure SP_misc_viper (ent: edict_p); cdecl;
begin
if ent.target=Nil then begin
gi_dprintf('misc_viper without a target at %s'#10, [vtos(ent.absmin)]);
G_FreeEdict(ent);
exit;
end;
if ent.speed = 0 then
ent.speed := 300;
ent.movetype := MOVETYPE_PUSH;
ent.solid := SOLID_NOT;
ent.s.modelindex := gi.modelindex('models/ships/viper/tris.md2');
VectorSet(ent.mins, -16, -16, 0);
VectorSet(ent.maxs, 16, 16, 32);
ent.think := func_train_find;
ent.nextthink := level.time + FRAMETIME;
ent.use := misc_viper_use;
ent.svflags := ent.svflags OR SVF_NOCLIENT;
ent.moveinfo.accel := ent.speed;
ent.moveinfo.decel := ent.speed;
ent.moveinfo.speed := ent.speed;
gi.linkentity(ent);
end;
(*QUAKED misc_bigviper (1 .5 0) (-176 -120 -24) (176 120 72)
This is a large stationary viper as seen in Paul's intro
*)
procedure SP_misc_bigviper(ent: edict_p); cdecl;
begin
ent.movetype := MOVETYPE_NONE;
ent.solid := SOLID_BBOX;
VectorSet(ent.mins, -176, -120, -24);
VectorSet(ent.maxs, 176, 120, 72);
ent.s.modelindex := gi.modelindex('models/ships/bigviper/tris.md2');
gi.linkentity(ent);
end;
(*QUAKED misc_viper_bomb (1 0 0) (-8 -8 -8) (8 8 8)
'dmg' how much boom should the bomb make?
*)
procedure misc_viper_bomb_touch(self, other: edict_p; plane: cplane_p; surf: csurface_p); cdecl;
begin
G_UseTargets (self, self.activator);
self.s.origin[2] := self.absmin[2] + 1;
T_RadiusDamage(self, self, self.dmg, Nil, self.dmg+40, MOD_BOMB);
BecomeExplosion2(self);
end;
procedure misc_viper_bomb_prethink(self: edict_p); cdecl;
Var v: vec3_t; diff: Single;
begin
self.groundentity := Nil;
diff := self.timestamp - level.time;
if diff < -1.0 then
diff := -1.0;
VectorScale(self.moveinfo.dir, 1.0 + diff, v);
v[2] := diff;
diff := self.s.angles[2];
vectoangles(v, self.s.angles);
self.s.angles[2] := diff + 10;
end;
procedure misc_viper_bomb_use(self, other, activator: edict_p); cdecl;
Var viper: edict_p;
begin
self.solid := SOLID_BBOX;
self.svflags := self.svflags AND NOT SVF_NOCLIENT;
self.s.effects := self.s.effects OR EF_ROCKET;
self.use := Nil;
self.movetype := MOVETYPE_TOSS;
self.prethink := misc_viper_bomb_prethink;
self.touch := misc_viper_bomb_touch;
self.activator := activator;
viper := G_Find(Nil, FOFS_classname, 'misc_viper');
VectorScale (viper.moveinfo.dir, viper.moveinfo.speed, self.velocity);
self.timestamp := level.time;
VectorCopy (viper.moveinfo.dir, self.moveinfo.dir);
end;
procedure SP_misc_viper_bomb(self: edict_p); cdecl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -