diff --git a/Fika.Core/Coop/ClientClasses/HandsControllers/CoopClientFirearmController.cs b/Fika.Core/Coop/ClientClasses/HandsControllers/CoopClientFirearmController.cs index cd92be42..d9db7d8b 100644 --- a/Fika.Core/Coop/ClientClasses/HandsControllers/CoopClientFirearmController.cs +++ b/Fika.Core/Coop/ClientClasses/HandsControllers/CoopClientFirearmController.cs @@ -384,6 +384,23 @@ public override void SetLightsState(GStruct163[] lightsStates, bool force = fals } public override void SetScopeMode(GStruct164[] scopeStates) + { + SendScopeStates(scopeStates); + base.SetScopeMode(scopeStates); + } + public override void OpticCalibrationSwitchUp(GStruct164[] scopeStates) + { + SendScopeStates(scopeStates); + base.OpticCalibrationSwitchUp(scopeStates); + } + + public override void OpticCalibrationSwitchDown(GStruct164[] scopeStates) + { + SendScopeStates(scopeStates); + base.OpticCalibrationSwitchDown(scopeStates); + } + + private void SendScopeStates(GStruct164[] scopeStates) { if (!CurrentOperation.CanChangeScopeStates(scopeStates)) { @@ -399,8 +416,6 @@ public override void SetScopeMode(GStruct164[] scopeStates) GStruct164 = scopeStates } }); - - base.SetScopeMode(scopeStates); } public override void ShotMisfired(BulletClass ammo, Weapon.EMalfunctionState malfunctionState, float overheat) diff --git a/Fika.Core/Coop/Custom/FikaDynamicAI.cs b/Fika.Core/Coop/Custom/FikaDynamicAI.cs index 909212e8..82e4db45 100644 --- a/Fika.Core/Coop/Custom/FikaDynamicAI.cs +++ b/Fika.Core/Coop/Custom/FikaDynamicAI.cs @@ -119,6 +119,8 @@ private void DeactivateBot(CoopBot bot) bot.AIData.BotOwner.DecisionQueue.Clear(); bot.AIData.BotOwner.Memory.GoalEnemy = null; bot.AIData.BotOwner.PatrollingData.Pause(); + bot.AIData.BotOwner.ShootData.EndShoot(); + bot.ActiveHealthController.PauseAllEffects(); bot.gameObject.SetActive(false); if (!disabledBots.Contains(bot)) @@ -139,6 +141,7 @@ private void ActivateBot(CoopBot bot) bot.gameObject.SetActive(true); bot.AIData.BotOwner.PatrollingData.Unpause(); bot.AIData.BotOwner.PostActivate(); + bot.ActiveHealthController.UnpauseAllEffects(); disabledBots.Remove(bot); } diff --git a/Fika.Core/Coop/GameMode/CoopGame.cs b/Fika.Core/Coop/GameMode/CoopGame.cs index 3e368d87..e8ed5558 100644 --- a/Fika.Core/Coop/GameMode/CoopGame.cs +++ b/Fika.Core/Coop/GameMode/CoopGame.cs @@ -1597,10 +1597,19 @@ private void HealthController_DiedEvent(EDamageType obj) if (FikaPlugin.Instance.ForceSaveOnDeath) { - SavePlayer((CoopPlayer)gparam_0.Player, MyExitStatus, null, true); + StartCoroutine(SaveOnDeathRoutine()); } } + private IEnumerator SaveOnDeathRoutine() + { + Task saveTask = SavePlayer((CoopPlayer)gparam_0.Player, MyExitStatus, null, true); + while (!saveTask.IsCompleted) + { + yield return null; + } + } + public override void Stop(string profileId, ExitStatus exitStatus, string exitName, float delay = 0f) { Logger.LogInfo("CoopGame::Stop"); @@ -1726,11 +1735,11 @@ public override void Stop(string profileId, ExitStatus exitStatus, string exitNa GClass549.Config.UseSpiritPlayer = false; } - private void SavePlayer(CoopPlayer player, ExitStatus exitStatus, string exitName, bool fromDeath) + private Task SavePlayer(CoopPlayer player, ExitStatus exitStatus, string exitName, bool fromDeath) { if (hasSaved) { - return; + return Task.CompletedTask; } if (fromDeath) @@ -1758,6 +1767,7 @@ private void SavePlayer(CoopPlayer player, ExitStatus exitStatus, string exitNam RequestHandler.PutJson("/raid/profile/save", SaveRequest.ToJson(Converters.AddItem(new NotesJsonConverter()).ToArray())); hasSaved = true; + return Task.CompletedTask; } private void StopFromError(string profileId, ExitStatus exitStatus) @@ -1978,12 +1988,8 @@ public void HandleExit() MonoBehaviourSingleton.Instance.FadeOutVolumeAfterRaid(); StaticManager staticManager = StaticManager.Instance; float num = delay; - Action action; - if ((action = EndAction) == null) - { - action = (EndAction = new Action(FireCallback)); - } - staticManager.WaitSeconds(num, action); + EndAction = new Action(FireCallback); + staticManager.WaitSeconds(num, EndAction); } private void FireCallback() @@ -2017,12 +2023,8 @@ public void ExitOverride() } MonoBehaviour instance2 = StaticManager.Instance; float num = delay; - Action action; - if ((action = action_0) == null) - { - action = action_0 = new Action(method_1); - } - instance2.WaitSeconds(num, action); + action_0 = new Action(method_1); + instance2.WaitSeconds(num, action_0); } } diff --git a/Fika.Core/Coop/ObservedClasses/HandsControllers/CoopObservedFirearmController.cs b/Fika.Core/Coop/ObservedClasses/HandsControllers/CoopObservedFirearmController.cs index c7507469..11a1fdd0 100644 --- a/Fika.Core/Coop/ObservedClasses/HandsControllers/CoopObservedFirearmController.cs +++ b/Fika.Core/Coop/ObservedClasses/HandsControllers/CoopObservedFirearmController.cs @@ -134,7 +134,9 @@ public override void OnPlayerDead() { triggerPressed = false; SetTriggerPressed(false); - WeaponSoundPlayer.enabled = false; + + needsReset = false; + WeaponSoundPlayer.OnBreakLoop(); coopPlayer.HandsAnimator.Animator.Update(Time.fixedDeltaTime); ManualUpdate(Time.fixedDeltaTime); @@ -143,9 +145,23 @@ public override void OnPlayerDead() CurrentOperation.FastForward(); } + StartCoroutine(BreakFiringLoop()); + base.OnPlayerDead(); } + private IEnumerator BreakFiringLoop() + { + Traverse isFiring = Traverse.Create(WeaponSoundPlayer).Field("_isFiring"); + int attempts = 0; + while (isFiring.Value && attempts < 10) + { + yield return new WaitForEndOfFrame(); + WeaponSoundPlayer.OnBreakLoop(); + attempts++; + } + } + public override void SetScopeMode(GStruct164[] scopeStates) { _player.ProceduralWeaponAnimation.ObservedCalibration(); @@ -222,7 +238,10 @@ public void HandleFirearmPacket(in WeaponPacket packet, InventoryControllerClass } else if (packet.ShotInfoPacket.ShotType == EShotType.DryFire) { + FirearmsAnimator.SetFire(true); DryShot(); + hasFired = true; + lastFireTime = Time.time; } else if (packet.ShotInfoPacket.ShotType == EShotType.RegularShot) { diff --git a/Fika.Core/Coop/PacketHandlers/PacketReceiver.cs b/Fika.Core/Coop/PacketHandlers/PacketReceiver.cs index 710bffff..18293c8e 100644 --- a/Fika.Core/Coop/PacketHandlers/PacketReceiver.cs +++ b/Fika.Core/Coop/PacketHandlers/PacketReceiver.cs @@ -1,6 +1,7 @@ // © 2024 Lacyway All Rights Reserved using Comfort.Common; +using EFT.UI; using Fika.Core.Coop.Matchmaker; using Fika.Core.Coop.Players; using Fika.Core.Networking; @@ -23,7 +24,7 @@ public class PacketReceiver : MonoBehaviour public Queue CommonPlayerPackets { get; private set; } = new(50); public Queue HealthSyncPackets { get; private set; } = new(50); - private void Awake() + protected void Awake() { player = GetComponent(); if (!player.IsYourPlayer) @@ -32,7 +33,7 @@ private void Awake() } } - private void Start() + protected void Start() { if (MatchmakerAcceptPatches.IsServer) { @@ -43,22 +44,22 @@ private void Start() Client = Singleton.Instance; } - LastState = new(player.NetId, player.Position, player.Rotation, player.HeadRotation, - player.LastDirection, player.CurrentManagedState.Name, player.MovementContext.Tilt, - player.MovementContext.Step, player.CurrentAnimatorStateIndex, player.MovementContext.SmoothedCharacterMovementSpeed, - player.IsInPronePose, player.PoseLevel, player.MovementContext.IsSprintEnabled, player.Physical.SerializationStruct, - player.MovementContext.BlindFire, player.observedOverlap, player.leftStanceDisabled, player.MovementContext.IsGrounded, - false, 0, Vector3.zero); + LastState = new(player.NetId, player.Position, player.Rotation, player.HeadRotation, player.LastDirection, + player.CurrentManagedState.Name, player.MovementContext.Tilt, player.MovementContext.Step, + player.CurrentAnimatorStateIndex, player.MovementContext.SmoothedCharacterMovementSpeed, + player.IsInPronePose, player.PoseLevel, player.MovementContext.IsSprintEnabled, + player.Physical.SerializationStruct, player.MovementContext.BlindFire, player.observedOverlap, + player.leftStanceDisabled, player.MovementContext.IsGrounded, false, 0, Vector3.zero); - NewState = new(player.NetId, player.Position, player.Rotation, player.HeadRotation, - player.LastDirection, player.CurrentManagedState.Name, player.MovementContext.Tilt, - player.MovementContext.Step, player.CurrentAnimatorStateIndex, player.MovementContext.SmoothedCharacterMovementSpeed, - player.IsInPronePose, player.PoseLevel, player.MovementContext.IsSprintEnabled, player.Physical.SerializationStruct, - player.MovementContext.BlindFire, player.observedOverlap, player.leftStanceDisabled, player.MovementContext.IsGrounded, - false, 0, Vector3.zero); + NewState = new(player.NetId, player.Position, player.Rotation, player.HeadRotation, player.LastDirection, + player.CurrentManagedState.Name, player.MovementContext.Tilt, player.MovementContext.Step, + player.CurrentAnimatorStateIndex, player.MovementContext.SmoothedCharacterMovementSpeed, + player.IsInPronePose, player.PoseLevel, player.MovementContext.IsSprintEnabled, + player.Physical.SerializationStruct, player.MovementContext.BlindFire, player.observedOverlap, + player.leftStanceDisabled, player.MovementContext.IsGrounded, false, 0, Vector3.zero); } - private void Update() + protected void Update() { if (observedPlayer != null) { @@ -74,6 +75,14 @@ private void Update() observedPlayer.SetAggressor(packet.KillerId, packet.KillerWeaponId); observedPlayer.SetInventory(packet.Equipment); observedPlayer.RagdollPacket = packet.RagdollPacket; + if (packet.TriggerZones.Length > 0) + { + observedPlayer.TriggerZones.Clear(); + foreach (string triggerZone in packet.TriggerZones) + { + observedPlayer.TriggerZones.Add(triggerZone); + } + } } observedPlayer.NetworkHealthController.HandleSyncPacket(packet.Packet); } diff --git a/Fika.Core/Coop/Players/CoopBot.cs b/Fika.Core/Coop/Players/CoopBot.cs index f414af6f..c8648b32 100644 --- a/Fika.Core/Coop/Players/CoopBot.cs +++ b/Fika.Core/Coop/Players/CoopBot.cs @@ -180,23 +180,6 @@ public override void OnDead(EDamageType damageType) SetupDogTag(); } - /*DeathPacket packet = new(ProfileId) - { - RagdollPacket = new() - { - BodyPartColliderType = LastDamageInfo.BodyPartColliderType, - Direction = LastDamageInfo.Direction, - Point = LastDamageInfo.HitPoint, - Force = _corpseAppliedForce, - OverallVelocity = Velocity - }, - HasInventory = true, - Equipment = Inventory.Equipment - }; - - PacketSender?.Server?.SendDataToAll(new NetDataWriter(), ref packet, LiteNetLib.DeliveryMethod.ReliableOrdered); - PacketSender?.Server?.NetServer?.TriggerUpdate();*/ - if (FikaPlugin.ShowNotifications.Value) { if (IsBoss(Profile.Info.Settings.Role, out string name) && LastAggressor != null) @@ -241,6 +224,13 @@ public override void OnDead(EDamageType damageType) } } } + + CoopGame coopGame = (CoopGame)Singleton.Instance; + if (coopGame.Bots.ContainsKey(ProfileId)) + { + coopGame.Bots.Remove(ProfileId); + } + base.OnDead(damageType); } diff --git a/Fika.Core/Coop/Players/CoopPlayer.cs b/Fika.Core/Coop/Players/CoopPlayer.cs index 5da9fe75..f5b623a1 100644 --- a/Fika.Core/Coop/Players/CoopPlayer.cs +++ b/Fika.Core/Coop/Players/CoopPlayer.cs @@ -534,7 +534,8 @@ public HealthSyncPacket SetupDeathPacket(GStruct346 packet) Force = _corpseAppliedForce, OverallVelocity = Velocity }, - Equipment = Equipment + Equipment = Equipment, + TriggerZones = TriggerZones.Count > 0 ? [.. TriggerZones] : null, }; } @@ -1303,14 +1304,6 @@ public virtual void HandleDamagePacket(DamagePacket packet) ClientApplyShot(damageInfo, packet.DamageInfo.BodyPartType, packet.DamageInfo.ColliderType, packet.DamageInfo.ArmorPlateCollider); } - public void HandleDeathPatchet(DeathPacket packet) - { - if (packet.HasInventory) - { - SetInventory(packet.Equipment); - } - } - public virtual void SetupDogTag() { if (LastAggressor != null) diff --git a/Fika.Core/Networking/FikaClient.cs b/Fika.Core/Networking/FikaClient.cs index dce47735..42a1156f 100644 --- a/Fika.Core/Networking/FikaClient.cs +++ b/Fika.Core/Networking/FikaClient.cs @@ -73,7 +73,6 @@ protected void Start() packetProcessor.SubscribeNetSerializable(OnWeatherPacketReceived); packetProcessor.SubscribeNetSerializable(OnBTRPacketReceived); packetProcessor.SubscribeNetSerializable(OnBTRInteractionPacketReceived); - packetProcessor.SubscribeNetSerializable(OnDeathPacketReceived); packetProcessor.SubscribeNetSerializable(OnMinePacketReceived); packetProcessor.SubscribeNetSerializable(OnBorderZonePacketReceived); packetProcessor.SubscribeNetSerializable(OnSendCharacterPacketReceived); @@ -227,14 +226,6 @@ private void OnMinePacketReceived(MinePacket packet) } } - private void OnDeathPacketReceived(DeathPacket packet) - { - if (Players.TryGetValue(packet.NetId, out CoopPlayer playerToApply)) - { - playerToApply.HandleDeathPatchet(packet); - } - } - private void OnBTRInteractionPacketReceived(BTRInteractionPacket packet) { if (Players.TryGetValue(packet.NetId, out CoopPlayer player)) diff --git a/Fika.Core/Networking/FikaServer.cs b/Fika.Core/Networking/FikaServer.cs index 68da25bc..3064f8fc 100644 --- a/Fika.Core/Networking/FikaServer.cs +++ b/Fika.Core/Networking/FikaServer.cs @@ -79,7 +79,6 @@ public async void Start() packetProcessor.SubscribeNetSerializable(OnWeatherPacketReceived); packetProcessor.SubscribeNetSerializable(OnBTRInteractionPacketReceived); packetProcessor.SubscribeNetSerializable(OnBTRServicePacketReceived); - packetProcessor.SubscribeNetSerializable(OnDeathPacketReceived); packetProcessor.SubscribeNetSerializable(OnMinePacketReceived); packetProcessor.SubscribeNetSerializable(OnBorderZonePacketReceived); packetProcessor.SubscribeNetSerializable(OnSendCharacterPacketReceived); @@ -216,17 +215,6 @@ private void OnMinePacketReceived(MinePacket packet, NetPeer peer) } } - private void OnDeathPacketReceived(DeathPacket packet, NetPeer peer) - { - if (Players.TryGetValue(packet.NetId, out CoopPlayer playerToApply)) - { - playerToApply.HandleDeathPatchet(packet); - } - - _dataWriter.Reset(); - SendDataToAll(_dataWriter, ref packet, DeliveryMethod.ReliableOrdered, peer); - } - private void OnBTRServicePacketReceived(BTRServicePacket packet, NetPeer peer) { if (CoopHandler.serverBTR != null) diff --git a/Fika.Core/Networking/Packets/Player/DeathPacket.cs b/Fika.Core/Networking/Packets/Player/DeathPacket.cs deleted file mode 100644 index d16f7536..00000000 --- a/Fika.Core/Networking/Packets/Player/DeathPacket.cs +++ /dev/null @@ -1,35 +0,0 @@ -using LiteNetLib.Utils; -using static Fika.Core.Networking.FikaSerialization; - -namespace Fika.Core.Networking -{ - public struct DeathPacket(int netId) : INetSerializable - { - public int NetId = netId; - public RagdollPacket RagdollPacket; - public bool HasInventory = false; - public EquipmentClass Equipment; - - public void Deserialize(NetDataReader reader) - { - NetId = reader.GetInt(); - RagdollPacket = RagdollPacket.Deserialize(reader); - HasInventory = reader.GetBool(); - if (HasInventory) - { - Equipment = (EquipmentClass)reader.GetItem(); - } - } - - public void Serialize(NetDataWriter writer) - { - writer.Put(NetId); - RagdollPacket.Serialize(writer, RagdollPacket); - writer.Put(HasInventory); - if (HasInventory) - { - writer.PutItem(Equipment); - } - } - } -} diff --git a/Fika.Core/Networking/Packets/Player/HealthSyncPacket.cs b/Fika.Core/Networking/Packets/Player/HealthSyncPacket.cs index c17ac483..9f2d12c2 100644 --- a/Fika.Core/Networking/Packets/Player/HealthSyncPacket.cs +++ b/Fika.Core/Networking/Packets/Player/HealthSyncPacket.cs @@ -12,6 +12,7 @@ public struct HealthSyncPacket(int netId) : INetSerializable public string KillerWeaponId; public RagdollPacket RagdollPacket; public EquipmentClass Equipment; + public string[] TriggerZones; public void Deserialize(NetDataReader reader) { @@ -138,6 +139,7 @@ public void Deserialize(NetDataReader reader) KillerWeaponId = reader.GetString(); RagdollPacket = RagdollPacket.Deserialize(reader); Equipment = (EquipmentClass)reader.GetItem(); + TriggerZones = reader.GetStringArray(); break; } break; @@ -349,6 +351,7 @@ public void Serialize(NetDataWriter writer) writer.Put(KillerWeaponId); RagdollPacket.Serialize(writer, RagdollPacket); writer.PutItem(Equipment); + writer.PutArray(TriggerZones); break; } break;