DEADSOFTWARE

add direct weapon switching
[d2df-sdl.git] / src / game / g_player.pas
index a99e5b069ef21ba255f7f4a4e08b2fe6d1b38d3c..caddc0d9e7612dfa230b9676b010a95373bb6cbb 100644 (file)
@@ -287,6 +287,7 @@ type
     procedure   NetFire(Wpn: Byte; X, Y, AX, AY: Integer; WID: Integer = -1);
     procedure   DoLerp(Level: Integer = 2);
     procedure   SetLerp(XTo, YTo: Integer);
+    procedure   ForceWeapon(Weapon: Byte);
     procedure   JetpackOn;
     procedure   JetpackOff;
 
@@ -2176,6 +2177,7 @@ procedure TPlayer.Draw();
 var
   ID: DWORD;
   w, h: Word;
+  dr: Boolean;
 begin
   if FLive then
   begin
@@ -2195,7 +2197,16 @@ begin
     begin
       if (gPlayerDrawn <> nil) and ((Self = gPlayerDrawn) or
          ((FTeam = gPlayerDrawn.Team) and (gGameSettings.GameMode <> GM_DM))) then
-        FModel.Draw(FObj.X, FObj.Y, 200)
+      begin
+        if (FMegaRulez[MR_INVIS] - gTime) <= 2100 then
+          dr := not Odd((FMegaRulez[MR_INVIS] - gTime) div 300)
+        else
+          dr := True;
+        if dr then
+          FModel.Draw(FObj.X, FObj.Y, 200)
+        else
+          FModel.Draw(FObj.X, FObj.Y);
+      end
       else
         FModel.Draw(FObj.X, FObj.Y, 254);
     end
@@ -3240,6 +3251,30 @@ begin
               150, 0, 0);
 end;
 
+procedure TPlayer.ForceWeapon(Weapon: Byte);
+var
+  i: Byte;
+begin
+  if g_Game_IsClient then Exit;
+  if Weapon > High(FWeapon) then Exit;
+  if FBFGFireCounter <> -1 then Exit;
+
+  if FTime[T_SWITCH] > gTime then Exit;
+
+  for i := WEAPON_KASTET to WEAPON_SUPERPULEMET do
+    if FReloading[i] > 0 then Exit;
+
+  if FWeapon[Weapon] then
+  begin
+    FCurrWeap := Weapon;
+    FTime[T_SWITCH] := gTime+156;
+    if FCurrWeap = WEAPON_SAW then
+      FSawSoundSelect.PlayAt(FObj.X, FObj.Y);
+    FModel.SetWeapon(FCurrWeap);
+    if g_Game_IsNet then MH_SEND_PlayerStats(FUID);
+  end;
+end;
+
 procedure TPlayer.NextWeapon();
 var
   i: Byte;