⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_client.pas

📁 雷神之锤2(Quake2)Delphi源码
💻 PAS
📖 第 1 页 / 共 3 页
字号:
      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 + -