diff --git a/src/game/g_player.pas b/src/game/g_player.pas
index de559b7f008d25083f853e9f4486efef4c6db812..9605c6de6e1a3c9c97b6b14165941b866023fb87 100644 (file)
--- a/src/game/g_player.pas
+++ b/src/game/g_player.pas
PLAYER_AP_SOFT = 100;
PLAYER_AP_LIMIT = 200;
SUICIDE_DAMAGE = 112;
PLAYER_AP_SOFT = 100;
PLAYER_AP_LIMIT = 200;
SUICIDE_DAMAGE = 112;
+ WEAPON_DELAY = 5;
PLAYER1_DEF_COLOR: TRGB = (R:64; G:175; B:48);
PLAYER2_DEF_COLOR: TRGB = (R:96; G:96; B:96);
PLAYER1_DEF_COLOR: TRGB = (R:64; G:175; B:48);
PLAYER2_DEF_COLOR: TRGB = (R:96; G:96; B:96);
FSawSoundIdle: TPlayableSound;
FSawSoundHit: TPlayableSound;
FSawSoundSelect: TPlayableSound;
FSawSoundIdle: TPlayableSound;
FSawSoundHit: TPlayableSound;
FSawSoundSelect: TPlayableSound;
+ FFlameSoundOn: TPlayableSound;
+ FFlameSoundOff: TPlayableSound;
+ FFlameSoundWork: TPlayableSound;
FJetSoundOn: TPlayableSound;
FJetSoundOff: TPlayableSound;
FJetSoundFly: TPlayableSound;
FJetSoundOn: TPlayableSound;
FJetSoundOff: TPlayableSound;
FJetSoundFly: TPlayableSound;
FWantsInGame: Boolean;
FGhost: Boolean;
FPhysics: Boolean;
FWantsInGame: Boolean;
FGhost: Boolean;
FPhysics: Boolean;
+ FFlaming: Boolean;
FJetpack: Boolean;
FActualModelName: string;
FClientID: SmallInt;
FJetpack: Boolean;
FActualModelName: string;
FClientID: SmallInt;
procedure BFGHit();
function GetFlag(Flag: Byte): Boolean;
procedure SetFlag(Flag: Byte);
procedure BFGHit();
function GetFlag(Flag: Byte): Boolean;
procedure SetFlag(Flag: Byte);
- function DropFlag(): Boolean;
+ function DropFlag(Silent: Boolean = True): Boolean;
procedure AllRulez(Health: Boolean);
procedure RestoreHealthArmor();
procedure FragCombo();
procedure AllRulez(Health: Boolean);
procedure RestoreHealthArmor();
procedure FragCombo();
procedure SetLerp(XTo, YTo: Integer);
procedure QueueWeaponSwitch(Weapon: Byte);
procedure RealizeCurrentWeapon();
procedure SetLerp(XTo, YTo: Integer);
procedure QueueWeaponSwitch(Weapon: Byte);
procedure RealizeCurrentWeapon();
+ procedure FlamerOn;
+ procedure FlamerOff;
procedure JetpackOn;
procedure JetpackOff;
procedure CatchFire(Attacker: Word);
procedure JetpackOn;
procedure JetpackOff;
procedure CatchFire(Attacker: Word);
FSawSoundIdle := TPlayableSound.Create();
FSawSoundHit := TPlayableSound.Create();
FSawSoundSelect := TPlayableSound.Create();
FSawSoundIdle := TPlayableSound.Create();
FSawSoundHit := TPlayableSound.Create();
FSawSoundSelect := TPlayableSound.Create();
+ FFlameSoundOn := TPlayableSound.Create();
+ FFlameSoundOff := TPlayableSound.Create();
+ FFlameSoundWork := TPlayableSound.Create();
FJetSoundFly := TPlayableSound.Create();
FJetSoundOn := TPlayableSound.Create();
FJetSoundOff := TPlayableSound.Create();
FJetSoundFly := TPlayableSound.Create();
FJetSoundOn := TPlayableSound.Create();
FJetSoundOff := TPlayableSound.Create();
FSawSoundIdle.SetByName('SOUND_WEAPON_IDLESAW');
FSawSoundHit.SetByName('SOUND_WEAPON_HITSAW');
FSawSoundSelect.SetByName('SOUND_WEAPON_SELECTSAW');
FSawSoundIdle.SetByName('SOUND_WEAPON_IDLESAW');
FSawSoundHit.SetByName('SOUND_WEAPON_HITSAW');
FSawSoundSelect.SetByName('SOUND_WEAPON_SELECTSAW');
+ FFlameSoundOn.SetByName('SOUND_WEAPON_FLAMEON');
+ FFlameSoundOff.SetByName('SOUND_WEAPON_FLAMEOFF');
+ FFlameSoundWork.SetByName('SOUND_WEAPON_FLAMEWORK');
FJetSoundFly.SetByName('SOUND_PLAYER_JETFLY');
FJetSoundOn.SetByName('SOUND_PLAYER_JETON');
FJetSoundOff.SetByName('SOUND_PLAYER_JETOFF');
FJetSoundFly.SetByName('SOUND_PLAYER_JETFLY');
FJetSoundOn.SetByName('SOUND_PLAYER_JETON');
FJetSoundOff.SetByName('SOUND_PLAYER_JETOFF');
FSawSound.Free();
FSawSoundIdle.Free();
FSawSoundHit.Free();
FSawSound.Free();
FSawSoundIdle.Free();
FSawSoundHit.Free();
+ FSawSoundSelect.Free();
+ FFlameSoundOn.Free();
+ FFlameSoundOff.Free();
+ FFlameSoundWork.Free();
FJetSoundFly.Free();
FJetSoundOn.Free();
FJetSoundOff.Free();
FJetSoundFly.Free();
FJetSoundOn.Free();
FJetSoundOff.Free();
if FAlive then
begin
indX := FObj.X+FObj.Rect.X;
if FAlive then
begin
indX := FObj.X+FObj.Rect.X;
- indY := FObj.Y - 12;
+ indY := FObj.Y;
if g_Texture_Get('TEXTURE_PLAYER_INDICATOR', ID) then
begin
e_GetTextureSize(ID, @indW, @indH);
if g_Texture_Get('TEXTURE_PLAYER_INDICATOR', ID) then
begin
e_GetTextureSize(ID, @indW, @indH);
- e_Draw(ID, indX + indW div 2, indY, 0, True, False);
+ e_Draw(ID, indX + indW div 2, indY - indH, 0, True, False);
end;
end;
//e_TextureFontPrint(indX, indY, FName, gStdFont); // Shows player name overhead
end;
end;
//e_TextureFontPrint(indX, indY, FName, gStdFont); // Shows player name overhead
end;
if (gChatBubble > 0) and (FKeys[KEY_CHAT].Pressed) and not FGhost then
end;
if (gChatBubble > 0) and (FKeys[KEY_CHAT].Pressed) and not FGhost then
- DrawBubble();
+ if (FMegaRulez[MR_INVIS] <= gTime) or ((gPlayerDrawn <> nil) and ((Self = gPlayerDrawn) or
+ ((FTeam = gPlayerDrawn.Team) and (gGameSettings.GameMode <> GM_DM)))) then
+ DrawBubble();
// e_DrawPoint(5, 335, 288, 255, 0, 0); // DL, UR, DL, UR
if gAimLine and alive and
((Self = gPlayer1) or (Self = gPlayer2)) then
// e_DrawPoint(5, 335, 288, 255, 0, 0); // DL, UR, DL, UR
if gAimLine and alive and
((Self = gPlayer1) or (Self = gPlayer2)) then
if FAmmo[A_FUEL] > 0 then
begin
g_Weapon_flame(wx, wy, xd, yd, FUID);
if FAmmo[A_FUEL] > 0 then
begin
g_Weapon_flame(wx, wy, xd, yd, FUID);
+ FlamerOn;
FReloading[FCurrWeap] := WEAPON_RELOAD[FCurrWeap];
Dec(FAmmo[A_FUEL]);
FFireAngle := FAngle;
f := True;
DidFire := True;
FReloading[FCurrWeap] := WEAPON_RELOAD[FCurrWeap];
Dec(FAmmo[A_FUEL]);
FFireAngle := FAngle;
f := True;
DidFire := True;
+ end
+ else
+ begin
+ FlamerOff;
+ if g_Game_IsNet and g_Game_IsServer then MH_SEND_PlayerStats(FUID);
end;
end;
end;
end;
PANEL_WATER or PANEL_ACID1 or PANEL_ACID2, True);
end;
PANEL_WATER or PANEL_ACID1 or PANEL_ACID2, True);
end;
+procedure TPlayer.FlamerOn;
+begin
+ FFlameSoundOff.Stop();
+ FFlameSoundOff.SetPosition(0);
+ if FFlaming then
+ begin
+ if (not FFlameSoundOn.IsPlaying()) and (not FFlameSoundWork.IsPlaying()) then
+ FFlameSoundWork.PlayAt(FObj.X, FObj.Y);
+ end
+ else
+ begin
+ FFlameSoundOn.PlayAt(FObj.X, FObj.Y);
+ FFlaming := True;
+ end;
+end;
+
+procedure TPlayer.FlamerOff;
+begin
+ if FFlaming then
+ begin
+ FFlameSoundOn.Stop();
+ FFlameSoundOn.SetPosition(0);
+ FFlameSoundWork.Stop();
+ FFlameSoundWork.SetPosition(0);
+ FFlameSoundOff.PlayAt(FObj.X, FObj.Y);
+ FFlaming := False;
+ end;
+end;
+
procedure TPlayer.JetpackOn;
begin
FJetSoundFly.Stop;
procedure TPlayer.JetpackOn;
begin
FJetSoundFly.Stop;
procedure TPlayer.CatchFire(Attacker: Word);
begin
procedure TPlayer.CatchFire(Attacker: Word);
begin
+ if FFireTime <= 0 then
+ g_Sound_PlayExAt('SOUND_IGNITE', FObj.X, FObj.Y);
FFireTime := 100;
FFireAttacker := Attacker;
if g_Game_IsNet and g_Game_IsServer then
FFireTime := 100;
FFireAttacker := Attacker;
if g_Game_IsNet and g_Game_IsServer then
end;
// Âûáðîñ ôëàãà:
end;
// Âûáðîñ ôëàãà:
- DropFlag();
+ DropFlag(KillType = K_FALLKILL);
end;
g_Player_CreateCorpse(Self);
end;
g_Player_CreateCorpse(Self);
begin
//e_WriteLog(Format(' SWITCH: cur=%d; new=%d', [FCurrWeap, cwi]), MSG_WARNING);
result := Byte(cwi);
begin
//e_WriteLog(Format(' SWITCH: cur=%d; new=%d', [FCurrWeap, cwi]), MSG_WARNING);
result := Byte(cwi);
- FNextWeapDelay := 10;
+ FNextWeapDelay := WEAPON_DELAY;
exit;
end;
end;
exit;
end;
end;
// i found her!
result := Byte(i);
resetWeaponQueue();
// i found her!
result := Byte(i);
resetWeaponQueue();
- FNextWeapDelay := 10; // anyway, 'cause why not
+ FNextWeapDelay := WEAPON_DELAY; // anyway, 'cause why not
exit;
end;
end;
exit;
end;
end;
FDamageBuffer := 0;
FJetpack := False;
FCanJetpack := False;
FDamageBuffer := 0;
FJetpack := False;
FCanJetpack := False;
+ FFlaming := False;
FFireTime := 0;
FFirePainTime := 0;
FFireAttacker := 0;
FFireTime := 0;
FFirePainTime := 0;
FFireAttacker := 0;
if FKeys[KEY_RIGHT].Pressed then Run(TDirection.D_RIGHT);
//if FKeys[KEY_NEXTWEAPON].Pressed and AnyServer then NextWeapon();
//if FKeys[KEY_PREVWEAPON].Pressed and AnyServer then PrevWeapon();
if FKeys[KEY_RIGHT].Pressed then Run(TDirection.D_RIGHT);
//if FKeys[KEY_NEXTWEAPON].Pressed and AnyServer then NextWeapon();
//if FKeys[KEY_PREVWEAPON].Pressed and AnyServer then PrevWeapon();
- if FKeys[KEY_FIRE].Pressed and AnyServer then Fire();
+ if FKeys[KEY_FIRE].Pressed and AnyServer then Fire()
+ else
+ begin
+ if AnyServer then
+ begin
+ FlamerOff;
+ if NetServer then MH_SEND_PlayerStats(FUID);
+ end;
+ end;
if FKeys[KEY_OPEN].Pressed and AnyServer then Use();
if FKeys[KEY_JUMP].Pressed then Jump()
else
if FKeys[KEY_OPEN].Pressed and AnyServer then Use();
if FKeys[KEY_JUMP].Pressed then Jump()
else
WEAPON_FLAMETHROWER:
begin
g_Weapon_flame(wx, wy, xd, yd, FUID, WID);
WEAPON_FLAMETHROWER:
begin
g_Weapon_flame(wx, wy, xd, yd, FUID, WID);
+ FlamerOn;
FFireAngle := FAngle;
f := True;
end;
FFireAngle := FAngle;
f := True;
end;
function TPlayer.GetFlag(Flag: Byte): Boolean;
var
s, ts: String;
function TPlayer.GetFlag(Flag: Byte): Boolean;
var
s, ts: String;
- evtype: Byte;
+ evtype, a: Byte;
begin
Result := False;
begin
Result := False;
g_Map_ResetFlag(FFlag);
g_Game_Message(Format(_lc[I_MESSAGE_FLAG_CAPTURE], [AnsiUpperCase(s)]), 144);
g_Map_ResetFlag(FFlag);
g_Game_Message(Format(_lc[I_MESSAGE_FLAG_CAPTURE], [AnsiUpperCase(s)]), 144);
+ if ((Self = gPlayer1) or (Self = gPlayer2)
+ or ((gPlayer1 <> nil) and (gPlayer1.Team = FTeam))
+ or ((gPlayer2 <> nil) and (gPlayer2.Team = FTeam))) then
+ a := 0
+ else
+ a := 1;
+
+ if not sound_cap_flag[a].IsPlaying() then
+ sound_cap_flag[a].Play();
+
gTeamStat[FTeam].Goals := gTeamStat[FTeam].Goals + 1;
Result := True;
gTeamStat[FTeam].Goals := gTeamStat[FTeam].Goals + 1;
Result := True;
g_Map_ResetFlag(Flag);
g_Game_Message(Format(_lc[I_MESSAGE_FLAG_RETURN], [AnsiUpperCase(s)]), 144);
g_Map_ResetFlag(Flag);
g_Game_Message(Format(_lc[I_MESSAGE_FLAG_RETURN], [AnsiUpperCase(s)]), 144);
+ if ((Self = gPlayer1) or (Self = gPlayer2)
+ or ((gPlayer1 <> nil) and (gPlayer1.Team = FTeam))
+ or ((gPlayer2 <> nil) and (gPlayer2.Team = FTeam))) then
+ a := 0
+ else
+ a := 1;
+
+ if not sound_ret_flag[a].IsPlaying() then
+ sound_ret_flag[a].Play();
+
Result := True;
if g_Game_IsNet then
begin
Result := True;
if g_Game_IsNet then
begin
gFlags[Flag].State := FLAG_STATE_CAPTURED;
gFlags[Flag].State := FLAG_STATE_CAPTURED;
+ if ((Self = gPlayer1) or (Self = gPlayer2)
+ or ((gPlayer1 <> nil) and (gPlayer1.Team = FTeam))
+ or ((gPlayer2 <> nil) and (gPlayer2.Team = FTeam))) then
+ a := 0
+ else
+ a := 1;
+
+ if not sound_get_flag[a].IsPlaying() then
+ sound_get_flag[a].Play();
+
Result := True;
if g_Game_IsNet then
begin
Result := True;
if g_Game_IsNet then
begin
FModel.SetFlag(FFlag);
end;
FModel.SetFlag(FFlag);
end;
-function TPlayer.DropFlag(): Boolean;
+function TPlayer.DropFlag(Silent: Boolean = True): Boolean;
var
s: String;
var
s: String;
+ a: Byte;
begin
Result := False;
if (not g_Game_IsServer) or (FFlag = FLAG_NONE) then
begin
Result := False;
if (not g_Game_IsServer) or (FFlag = FLAG_NONE) then
g_Console_Add(Format(_lc[I_PLAYER_FLAG_DROP], [FName, s]), True);
g_Game_Message(Format(_lc[I_MESSAGE_FLAG_DROP], [AnsiUpperCase(s)]), 144);
g_Console_Add(Format(_lc[I_PLAYER_FLAG_DROP], [FName, s]), True);
g_Game_Message(Format(_lc[I_MESSAGE_FLAG_DROP], [AnsiUpperCase(s)]), 144);
+ if ((Self = gPlayer1) or (Self = gPlayer2)
+ or ((gPlayer1 <> nil) and (gPlayer1.Team = FTeam))
+ or ((gPlayer2 <> nil) and (gPlayer2.Team = FTeam))) then
+ a := 0
+ else
+ a := 1;
+
+ if (not Silent) and (not sound_lost_flag[a].IsPlaying()) then
+ sound_lost_flag[a].Play();
+
if g_Game_IsNet then
MH_SEND_FlagEvent(FLAG_STATE_DROPPED, Flag, FUID, False);
end;
if g_Game_IsNet then
MH_SEND_FlagEvent(FLAG_STATE_DROPPED, Flag, FUID, False);
end;
FSawSoundIdle.Pause(Enable);
FSawSoundHit.Pause(Enable);
FSawSoundSelect.Pause(Enable);
FSawSoundIdle.Pause(Enable);
FSawSoundHit.Pause(Enable);
FSawSoundSelect.Pause(Enable);
+ FFlameSoundOn.Pause(Enable);
+ FFlameSoundOff.Pause(Enable);
+ FFlameSoundWork.Pause(Enable);
+ FJetSoundFly.Pause(Enable);
+ FJetSoundOn.Pause(Enable);
+ FJetSoundOff.Pause(Enable);
end;
{ T C o r p s e : }
end;
{ T C o r p s e : }