📄 p_client.pas
字号:
MOD_CRUSH: message := 'was squished';
MOD_WATER: message := 'sank like a rock';
MOD_SLIME: message := 'melted';
MOD_LAVA: message := 'does a back flip into the lava';
MOD_EXPLOSIVE,
MOD_BARREL: message := 'blew up';
MOD_EXIT: message := 'found a way out';
MOD_TARGET_LASER: message := 'saw the light';
MOD_TARGET_BLASTER:message := 'got blasted';
MOD_BOMB,
MOD_SPLASH,
MOD_TRIGGER_HURT: message := 'was in the wrong place';
end;//case
if (attacker = self) then
begin
Case mod_ of
MOD_HELD_GRENADE: message := 'tried to put the pin back in';
MOD_HG_SPLASH,
MOD_G_SPLASH: begin
{$IFNDEF CTF} //onlyGAME (none CTF)
if IsNeutral(self)
then message := 'tripped on its own grenade'
else
{$ENDIF}
if IsFemale(self)
then message := 'tripped on her own grenade'
else message := 'tripped on his own grenade';
end;
MOD_R_SPLASH: begin
{$IFNDEF CTF} //onlyGAME (none CTF)
if IsNeutral(self)
then message := 'blew itself up'
else
{$ENDIF}
if IsFemale(self)
then message := 'blew herself up'
else message := 'blew himself up';
end;
MOD_BFG_BLAST: message := 'should have used a smaller gun';
else begin
{$IFNDEF CTF} //onlyGAME (none CTF)
if IsNeutral(self)
then message := 'killed itself'
else
{$ENDIF}
if IsFemale(self)
then message := 'killed herself'
else message := 'killed himself';
end;
end;//case
end;//if
//Y if (message) then
begin
//Y gi.bprintf (PRINT_MEDIUM, '%s %s.\n', [self.client.pers.netname, message]);
if (deathmatch.value <> 0) then
Dec(self.client.resp.score);
self.enemy := Nil;
Exit;
end;
self.enemy := attacker;
if (attacker <> Nil) AND (attacker.client <> Nil) then
begin
Case mod_ of
MOD_BLASTER: message := 'was blasted by';
MOD_SHOTGUN: message := 'was gunned down by';
MOD_SSHOTGUN: begin
message := 'was blown away by';
message2 := '"s super shotgun';
end;
MOD_MACHINEGUN: message := 'was machinegunned by';
MOD_CHAINGUN: begin
message := 'was cut in half by';
message2 := '"s chaingun';
end;
MOD_GRENADE: begin
message := 'was popped by';
message2 := '"s grenade';
end;
MOD_G_SPLASH: begin
message := 'was shredded by';
message2 := '"s shrapnel';
end;
MOD_ROCKET: begin
message := 'ate';
message2 := '"s rocket';
end;
MOD_R_SPLASH: begin
message := 'almost dodged';
message2 := '"s rocket';
end;
MOD_HYPERBLASTER:begin
message := 'was melted by';
message2 := '"s hyperblaster';
end;
MOD_RAILGUN: message := 'was railed by';
MOD_BFG_LASER: begin
message := 'saw the pretty lights from';
message2 := '"s BFG';
end;
MOD_BFG_BLAST: begin
message := 'was disintegrated by';
message2 := '"s BFG blast';
end;
MOD_BFG_EFFECT: begin
message := 'couldn"t hide from';
message2 := '"s BFG';
end;
MOD_HANDGRENADE:begin
message := 'caught';
message2 := '"s handgrenade';
end;
MOD_HG_SPLASH: begin
message := 'didn"t see';
message2 := '"s handgrenade';
end;
MOD_HELD_GRENADE:begin
message := 'feels';
message2 := '"s pain';
end;
MOD_TELEFRAG: begin
message := 'tried to invade';
message2 := '"s personal space';
end;
{$IFDEF CTF} //onlyCTF
//ZOID
MOD_GRAPPLE: begin
message := 'was caught by';
message2 := '"s grapple';
end;
//ZOID
{$ENDIF}
end;//case
//Y if (message) then
begin
//Y gi.bprintf (PRINT_MEDIUM, '%s %s %s%s\n', self.client.pers.netname, message, attacker.client.pers.netname, message2);
if (deathmatch.value <> 0) then
if (ff)
then Dec(attacker.client.resp.score)
else Inc(attacker.client.resp.score);
Exit;
end;
end;//if
end;//if
//Y gi.bprintf (PRINT_MEDIUM, '%s died.\n', self.client.pers.netname);
if (deathmatch.value <> 0) then
Dec(self.client.resp.score);
end;//procedure (GAME <> CTF)
//Y: ???
//void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf);
// (GAME=CTF)
//procedure TossClientWeapon (edict_t *self);
procedure TossClientWeapon (self : edict_p); //only imp
var
item : gitem_p;
drop : edict_p;
quad : qboolean;
spread : float;
begin
if (deathmatch.value=0) then
Exit;
item := self.client.pers.weapon;
(*Y if (! self.client.pers.inventory[self.client.ammo_index] ) then
item = NULL;
if (item && (strcmp (item.pickup_name, 'Blaster') == 0)) then
item = NULL;
if (!((int)(dmflags.value) & DF_QUAD_DROP))
then quad := false
else quad := (self.client.quad_framenum > (level.framenum + 10));*)
if (item <> Nil) AND (quad)
then spread := 22.5
else spread := 0.0;
if (item <> Nil) then
begin
self.client.v_angle[YAW] := self.client.v_angle[YAW] - spread;
//Y drop := Drop_Item (self, item);
self.client.v_angle[YAW] := self.client.v_angle[YAW] + spread;
drop.spawnflags := DROPPED_PLAYER_ITEM;
end;
if (quad) then
begin
self.client.v_angle[YAW] := self.client.v_angle[YAW] + spread;
//Y drop := Drop_Item (self, FindItemByClassname ('item_quad'));
self.client.v_angle[YAW] := self.client.v_angle[YAW] - spread;
drop.spawnflags := drop.spawnflags OR DROPPED_PLAYER_ITEM;
//Y drop.touch := Touch_Item;
drop.nextthink := level.time + (self.client.quad_framenum - level.framenum) * FRAMETIME;
//Y drop.think := G_FreeEdict;
end;
end;//procedure (GAME=CTF)
{*
==================
LookAtKiller
==================
*}
// (GAME=CTF)
//procedure LookAtKiller (edict_t *self, edict_t *inflictor, edict_t *attacker);
procedure LookAtKiller (self, inflictor, attacker : edict_p); //only imp
var
dir : vec3_t;
begin
if (attacker <> Nil) AND (attacker <> world) AND (attacker <> self)
then VectorSubtract (attacker.s.origin, self.s.origin, dir)
else
if (inflictor <> Nil) AND (inflictor <> world) AND (inflictor <> self)
then VectorSubtract (inflictor.s.origin, self.s.origin, dir)
else begin
self.client.killer_yaw := self.s.angles[YAW];
Exit;
end;
if (dir[0] <> 0)
then self.client.killer_yaw := 180/M_PI (*Y *atan2(dir[1], dir[0])*)
else begin
self.client.killer_yaw := 0;
if (dir[1] > 0)
then self.client.killer_yaw := 90
else
if (dir[1] < 0) then
self.client.killer_yaw := -90;
end;
if (self.client.killer_yaw < 0) then
self.client.killer_yaw := self.client.killer_yaw + 360;
end;//procedure (GAME=CTF)
{*
==================
player_die
==================
*}
// (GAME <> CTF)
//procedure player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
procedure player_die (self, inflictor, attacker : edict_p; damage : integer; point : vec3_t); //a few files
var
n : integer;
// static int i;
const
i : integer = 0;
begin
VectorClear (self.avelocity);
self.takedamage := DAMAGE_YES;
self.movetype := MOVETYPE_TOSS;
self.s.modelindex2 := 0; // remove linked weapon model
{$IFDEF CTF} //onlyCTF
//ZOID
self.s.modelindex3 := 0; // remove linked ctf flag
//ZOID
{$ENDIF}
self.s.angles[0] := 0;
self.s.angles[2] := 0;
self.s.sound := 0;
self.client.weapon_sound := 0;
self.maxs[2] := -8;
//idsoft self->solid = SOLID_NOT;
self.svflags := self.svflags OR SVF_DEADMONSTER;
if (self.deadflag=0) then
begin
self.client.respawn_time := level.time + 1.0;
LookAtKiller (self, inflictor, attacker);
self.client.ps.pmove.pm_type := PM_DEAD;
ClientObituary (self, inflictor, attacker);
{$IFDEF CTF} //onlyCTF
//ZOID
// if at start and same team, clear
// if (ctf->value && meansOfDeath == MOD_TELEFRAG) AND
if //Y(ctf.value <> 0) AND (meansOfDeath = MOD_TELEFRAG) AND
(self.client.resp.ctf_state < 2) AND
(self.client.resp.ctf_team = attacker.client.resp.ctf_team) then
begin
Dec(attacker.client.resp.score);
self.client.resp.ctf_state := 0;
end;
//Y CTFFragBonuses(self, inflictor, attacker);
//ZOID
{$ENDIF}
TossClientWeapon (self);
{$IFDEF CTF}
//ZOID
(*Y CTFPlayerResetGrapple(self);
CTFDeadDropFlag(self);
CTFDeadDropTech(self);
//ZOID
if (deathmatch.Value <> 0) AND (NOT self.client.showscores) then
Cmd_Help_f (self); // show scores*)
{$ELSE}
(*Y if (deathmatch.value <> 0) then
Cmd_Help_f (self); // show scores*)
// clear inventory
// this is kind of ugly, but it's how we want to handle keys in coop
//Y for n:=0 to game.num_items-1 do
begin
if (coop.value <> 0) AND ((itemlist[n].flags AND IT_KEY) <> 0) then
self.client.resp.coop_respawn.inventory[n] := self.client.pers.inventory[n];
self.client.pers.inventory[n] := 0;
end;//for
{$ENDIF}
end;//if
// remove powerups
self.client.quad_framenum := 0;
self.client.invincible_framenum := 0;
self.client.breather_framenum := 0;
self.client.enviro_framenum := 0;
{$IFDEF CTF}
// clear inventory
//Y memset(self->client->pers.inventory, 0, sizeof(self->client->pers.inventory));
{$ELSE}
self.flags := self.flags AND (NOT FL_POWER_ARMOR);
{$ENDIF}
if (self.health < -40)
then begin
// gib
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);
ThrowClientHead (self, damage);*)
{$IFDEF CTF} //onlyCTF
//ZOID
self.client.anim_priority := ANIM_DEATH;
self.client.anim_end := 0;
//ZOID
{$ENDIF}
self.takedamage := DAMAGE_NO;
end
else begin
// normal death
if (self.deadflag=0) then
begin
//Y i = (i+1)%3;
i := (i+1) MOD 3;
// start a death animation
self.client.anim_priority := ANIM_DEATH;
if (self.client.ps.pmove.pm_flags AND PMF_DUCKED) <> 0
then begin
(*Y self.s.frame := FRAME_crdeath1-1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -