X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=blobdiff_plain;f=src%2Fgame%2Fg_player.pas;h=050e0e650950b20e5e51a65d23f40564b87d3638;hp=d03247cdc5e4e3f2505078aa28ccd5f165f70f55;hb=2b4061ae07fe1bf12d49fc1213d7eb3e9e34ccb6;hpb=f0c98dc86657bdc08f6049872f12b554e1654fa4 diff --git a/src/game/g_player.pas b/src/game/g_player.pas index d03247c..050e0e6 100644 --- a/src/game/g_player.pas +++ b/src/game/g_player.pas @@ -167,6 +167,8 @@ type FObj: TObj; FXTo, FYTo: Integer; FSpectatePlayer: Integer; + FFirePainTime: Integer; + FFireAttacker: Word; FSavedState: TPlayerSavedState; @@ -201,6 +203,7 @@ type 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; @@ -244,6 +247,7 @@ type FPing: Word; FLoss: Byte; FDummy: Boolean; + FFireTime: Integer; constructor Create(); virtual; destructor Destroy(); override; @@ -305,6 +309,7 @@ type procedure RealizeCurrentWeapon(); procedure JetpackOn; procedure JetpackOff; + procedure CatchFire(Attacker: Word); property Name: String read FName write FName; property Model: TPlayerModel read FModel; @@ -571,7 +576,7 @@ const // 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' @@ -1987,6 +1992,9 @@ begin FLoss := 0; FSavedState.WaitRecall := False; FShellTimer := -1; + FFireTime := 0; + FFirePainTime := 0; + FFireAttacker := 0; FActualModelName := 'doomer'; @@ -2808,6 +2816,7 @@ 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; @@ -2873,6 +2882,14 @@ begin FJetSoundOff.PlayAt(FObj.X, FObj.Y); end; +procedure TPlayer.CatchFire(Attacker: Word); +begin + 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 @@ -4222,6 +4239,9 @@ begin FDamageBuffer := 0; FJetpack := False; FCanJetpack := False; + FFireTime := 0; + FFirePainTime := 0; + FFireAttacker := 0; // Àíèìàöèÿ âîçðîæäåíèÿ: if (not gLoadGameMode) and (not Silent) then @@ -4813,6 +4833,29 @@ begin 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 @@ -5087,6 +5130,7 @@ begin WEAPON_FLAMETHROWER: begin + g_Weapon_flame(wx, wy, xd, yd, FUID, WID); FFireAngle := FAngle; f := True; end; @@ -5853,6 +5897,27 @@ begin 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);