diff --git a/src/game/g_player.pas b/src/game/g_player.pas
index d03247cdc5e4e3f2505078aa28ccd5f165f70f55..e1075d40b3d6263db60343dd0349ac33b122d2b0 100644 (file)
--- a/src/game/g_player.pas
+++ b/src/game/g_player.pas
FObj: TObj;
FXTo, FYTo: Integer;
FSpectatePlayer: Integer;
FObj: TObj;
FXTo, FYTo: Integer;
FSpectatePlayer: Integer;
+ FFirePainTime: Integer;
+ FFireAttacker: Word;
FSavedState: TPlayerSavedState;
FSavedState: TPlayerSavedState;
function FullInLift(XInc, YInc: Integer): Integer;
{procedure CollideItem();}
procedure FlySmoke(Times: DWORD = 1);
function FullInLift(XInc, YInc: Integer): Integer;
{procedure CollideItem();}
procedure FlySmoke(Times: DWORD = 1);
+ procedure OnFireFlame(Times: DWORD = 1);
function GetAmmoByWeapon(Weapon: Byte): Word;
procedure SetAction(Action: Byte; Force: Boolean = False);
procedure OnDamage(Angle: SmallInt); virtual;
function GetAmmoByWeapon(Weapon: Byte): Word;
procedure SetAction(Action: Byte; Force: Boolean = False);
procedure OnDamage(Angle: SmallInt); virtual;
FPing: Word;
FLoss: Byte;
FDummy: Boolean;
FPing: Word;
FLoss: Byte;
FDummy: Boolean;
+ FFireTime: Integer;
constructor Create(); virtual;
destructor Destroy(); override;
constructor Create(); virtual;
destructor Destroy(); override;
procedure RealizeCurrentWeapon();
procedure JetpackOn;
procedure JetpackOff;
procedure RealizeCurrentWeapon();
procedure JetpackOn;
procedure JetpackOff;
+ procedure CatchFire(Attacker: Word);
property Name: String read FName write FName;
property Model: TPlayerModel read FModel;
property Name: String read FName write FName;
property Model: TPlayerModel read FModel;
// WEAPON_CHAINGUN, WEAPON_SHOTGUN1, WEAPON_SAW,
// WEAPON_ROCKETLAUNCHER, WEAPON_PISTOL, WEAPON_KASTET);
WEAPON_RELOAD: Array [WP_FIRST..WP_LAST] of Byte =
// WEAPON_CHAINGUN, WEAPON_SHOTGUN1, WEAPON_SAW,
// WEAPON_ROCKETLAUNCHER, WEAPON_PISTOL, WEAPON_KASTET);
WEAPON_RELOAD: Array [WP_FIRST..WP_LAST] of Byte =
- (5, 2, 6, 18, 36, 2, 12, 2, 14, 2, 0);
+ (5, 2, 6, 18, 36, 2, 12, 2, 14, 2, 2);
PLAYER_SIGNATURE = $52594C50; // 'PLYR'
CORPSE_SIGNATURE = $50524F43; // 'CORP'
PLAYER_SIGNATURE = $52594C50; // 'PLYR'
CORPSE_SIGNATURE = $50524F43; // 'CORP'
FLoss := 0;
FSavedState.WaitRecall := False;
FShellTimer := -1;
FLoss := 0;
FSavedState.WaitRecall := False;
FShellTimer := -1;
+ FFireTime := 0;
+ FFirePainTime := 0;
+ FFireAttacker := 0;
FActualModelName := 'doomer';
FActualModelName := 'doomer';
WEAPON_FLAMETHROWER:
if FAmmo[A_FUEL] > 0 then
begin
WEAPON_FLAMETHROWER:
if FAmmo[A_FUEL] > 0 then
begin
+ g_Weapon_flame(wx, wy, xd, yd, FUID);
FReloading[FCurrWeap] := WEAPON_RELOAD[FCurrWeap];
Dec(FAmmo[A_FUEL]);
FFireAngle := FAngle;
FReloading[FCurrWeap] := WEAPON_RELOAD[FCurrWeap];
Dec(FAmmo[A_FUEL]);
FFireAngle := FAngle;
FJetSoundOff.PlayAt(FObj.X, FObj.Y);
end;
FJetSoundOff.PlayAt(FObj.X, FObj.Y);
end;
+procedure TPlayer.CatchFire(Attacker: Word);
+begin
+ if FMegaRulez[MR_SUIT] > 0 then
+ Exit;
+ FFireTime := 100;
+ FFireAttacker := Attacker;
+ if g_Game_IsNet and g_Game_IsServer then
+ MH_SEND_PlayerStats(FUID);
+end;
+
procedure TPlayer.Jump();
begin
if gFly or FJetpack then
procedure TPlayer.Jump();
begin
if gFly or FJetpack then
IncMax(FHealth, 10, PLAYER_HP_SOFT);
Result := True;
remove := True;
IncMax(FHealth, 10, PLAYER_HP_SOFT);
Result := True;
remove := True;
+ FFireTime := 0;
if gFlash = 2 then Inc(FPickup, 5);
end;
if gFlash = 2 then Inc(FPickup, 5);
end;
IncMax(FHealth, 25, PLAYER_HP_SOFT);
Result := True;
remove := True;
IncMax(FHealth, 25, PLAYER_HP_SOFT);
Result := True;
remove := True;
+ FFireTime := 0;
if gFlash = 2 then Inc(FPickup, 5);
end;
if gFlash = 2 then Inc(FPickup, 5);
end;
IncMax(FHealth, 100, PLAYER_HP_LIMIT);
Result := True;
remove := True;
IncMax(FHealth, 100, PLAYER_HP_LIMIT);
Result := True;
remove := True;
+ FFireTime := 0;
if gFlash = 2 then Inc(FPickup, 5);
end;
if gFlash = 2 then Inc(FPickup, 5);
end;
FArmor := PLAYER_AP_LIMIT;
Result := True;
remove := True;
FArmor := PLAYER_AP_LIMIT;
Result := True;
remove := True;
+ FFireTime := 0;
if gFlash = 2 then Inc(FPickup, 5);
end;
if gFlash = 2 then Inc(FPickup, 5);
end;
FMegaRulez[MR_SUIT] := gTime+PLAYER_SUIT_TIME;
Result := True;
remove := True;
FMegaRulez[MR_SUIT] := gTime+PLAYER_SUIT_TIME;
Result := True;
remove := True;
+ FFireTime := 0;
if gFlash = 2 then Inc(FPickup, 5);
end;
if gFlash = 2 then Inc(FPickup, 5);
end;
FBerserk := gTime+30000;
Result := True;
remove := True;
FBerserk := gTime+30000;
Result := True;
remove := True;
+ FFireTime := 0;
end;
if FHealth < PLAYER_HP_SOFT then
begin
end;
if FHealth < PLAYER_HP_SOFT then
begin
FBerserk := gTime+30000;
Result := True;
remove := True;
FBerserk := gTime+30000;
Result := True;
remove := True;
+ FFireTime := 0;
end;
end;
end;
end;
IncMax(FHealth, 4, PLAYER_HP_LIMIT);
Result := True;
remove := True;
IncMax(FHealth, 4, PLAYER_HP_LIMIT);
Result := True;
remove := True;
+ FFireTime := 0;
if gFlash = 2 then Inc(FPickup, 5);
end;
if gFlash = 2 then Inc(FPickup, 5);
end;
FDamageBuffer := 0;
FJetpack := False;
FCanJetpack := False;
FDamageBuffer := 0;
FJetpack := False;
FCanJetpack := False;
+ FFireTime := 0;
+ FFirePainTime := 0;
+ FFireAttacker := 0;
// Àíèìàöèÿ âîçðîæäåíèÿ:
if (not gLoadGameMode) and (not Silent) then
// Àíèìàöèÿ âîçðîæäåíèÿ:
if (not gLoadGameMode) and (not Silent) then
end else if FAir < AIR_DEF then
FAir := AIR_DEF;
end else if FAir < AIR_DEF then
FAir := AIR_DEF;
+ if FFireTime > 0 then
+ begin
+ if BodyInLiquid(0, 0) then
+ begin
+ FFireTime := 0;
+ FFirePainTime := 0;
+ end
+ else
+ begin
+ OnFireFlame(1);
+ if FFirePainTime <= 0 then
+ begin
+ if g_Game_IsServer then
+ Damage(5, FFireAttacker, 0, 0, HIT_FLAME);
+ FFirePainTime := 18;
+ end;
+ FFirePainTime := FFirePainTime - 1;
+ FFireTime := FFireTime - 1;
+ if (FFireTime = 0) and g_Game_IsNet and g_Game_IsServer then
+ MH_SEND_PlayerStats(FUID);
+ end;
+ end;
+
if FDamageBuffer > 0 then
begin
if FDamageBuffer >= 9 then
if FDamageBuffer > 0 then
begin
if FDamageBuffer >= 9 then
WEAPON_FLAMETHROWER:
begin
WEAPON_FLAMETHROWER:
begin
+ g_Weapon_flame(wx, wy, xd, yd, FUID, WID);
FFireAngle := FAngle;
f := True;
end;
FFireAngle := FAngle;
f := True;
end;
end;
end;
end;
end;
+procedure TPlayer.OnFireFlame(Times: DWORD = 1);
+var
+ id, i: DWORD;
+ Anim: TAnimation;
+begin
+ if (Random(10) = 1) and (Times = 1) then
+ Exit;
+
+ if g_Frames_Get(id, 'FRAMES_FLAME') then
+ begin
+ for i := 1 to Times do
+ begin
+ Anim := TAnimation.Create(id, False, 3);
+ Anim.Alpha := 0;
+ g_GFX_OnceAnim(Obj.X+Obj.Rect.X+Random(Obj.Rect.Width+Times*2)-(Anim.Width div 2),
+ Obj.Y+8+Random(8+Times*2), Anim, ONCEANIM_SMOKE);
+ Anim.Free();
+ end;
+ end;
+end;
+
procedure TPlayer.PauseSounds(Enable: Boolean);
begin
FSawSound.Pause(Enable);
procedure TPlayer.PauseSounds(Enable: Boolean);
begin
FSawSound.Pause(Enable);