From 450d394a991a1769041d70c09e82a34ff268eaa2 Mon Sep 17 00:00:00 2001 From: Paulov Date: Mon, 13 May 2024 08:27:20 +0100 Subject: [PATCH 01/10] Refactored Airdrops into serialized packets --- Source/Coop/Airdrops/SITAirdropsManager.cs | 47 ++++++++++--------- .../Airdrop/AirdropLootPacket.cs | 30 +++++++----- .../NetworkPacket/Airdrop/AirdropPacket.cs | 25 ++++++---- 3 files changed, 59 insertions(+), 43 deletions(-) diff --git a/Source/Coop/Airdrops/SITAirdropsManager.cs b/Source/Coop/Airdrops/SITAirdropsManager.cs index 3ad144943..c3542af4b 100644 --- a/Source/Coop/Airdrops/SITAirdropsManager.cs +++ b/Source/Coop/Airdrops/SITAirdropsManager.cs @@ -3,7 +3,6 @@ using BepInEx.Logging; using Comfort.Common; using EFT; -using EFT.Game.Spawning; using EFT.Interactive; using StayInTarkov; using StayInTarkov.AkiSupport.Airdrops; @@ -11,8 +10,7 @@ using StayInTarkov.AkiSupport.Airdrops.Utils; using StayInTarkov.Coop.Components.CoopGameComponents; using StayInTarkov.Coop.Matchmaker; -using StayInTarkov.Coop.NetworkPacket; -using StayInTarkov.Coop.Web; +using StayInTarkov.Coop.NetworkPacket.Airdrop; using StayInTarkov.Networking; using System.Collections; using System.Collections.Generic; @@ -113,11 +111,14 @@ public IEnumerator SendParamsToClients() yield return new WaitForSeconds(AirdropParameters.TimeToStart); Logger.LogDebug("Sending Airdrop Params"); - var packet = new Dictionary(); - packet.Add("serverId", SITGameComponent.GetServerId()); - packet.Add("m", "AirdropPacket"); - packet.Add("model", AirdropParameters); - GameClient.SendData(packet.SITToJson()); + //var packet = new Dictionary(); + //packet.Add("serverId", SITGameComponent.GetServerId()); + //packet.Add("m", "AirdropPacket"); + //packet.Add("model", AirdropParameters); + //GameClient.SendData(packet.SITToJson()); + var airdropPacket = new AirdropPacket(); + airdropPacket.AirdropParametersModelJson = AirdropParameters.SITToJson(); + GameClient.SendData(airdropPacket.Serialize()); yield break; } @@ -152,7 +153,7 @@ public async void FixedUpdate() { if (SITGameComponent.TryGetCoopGameComponent(out var coopGameComponent)) { - List oldInteractiveObjectList = new List(coopGameComponent.ListOfInteractiveObjects) + List oldInteractiveObjectList = new(coopGameComponent.ListOfInteractiveObjects) { AirdropBox.Container }; @@ -235,25 +236,21 @@ private void StartBox() private async Task BuildLootContainer(AirdropConfigModel config) { - if (SITMatchmaking.IsClient) + if (!SITMatchmaking.IsServer) return; + // Get the lootData for this Raid var lootData = await factory.GetLoot(); - // Get the lootData. Sent to Clients. - if (SITMatchmaking.IsServer) - { - var packet = new Dictionary(); - packet.Add("serverId", SITGameComponent.GetServerId()); - packet.Add("m", "AirdropLootPacket"); - packet.Add("config", config); - packet.Add("result", lootData); - GameClient.SendData(packet.SITToJson()); - } + // Send the lootData to Clients. + var airdropLootPacket = new AirdropLootPacket(); + airdropLootPacket.AirdropLootResultModelJson = lootData.SITToJson(); + airdropLootPacket.AirdropConfigModelJson = config.SITToJson(); + GameClient.SendData(airdropLootPacket.Serialize()); if (lootData == null) throw new System.Exception("Airdrops. Tried to BuildLootContainer without any Loot."); - + factory.BuildContainer(AirdropBox.Container, config, lootData.DropType); factory.AddLoot(AirdropBox.Container, lootData); ClientLootBuilt = true; @@ -261,7 +258,7 @@ private async Task BuildLootContainer(AirdropConfigModel config) { if (SITGameComponent.TryGetCoopGameComponent(out var coopGameComponent)) { - List oldInteractiveObjectList = new List(coopGameComponent.ListOfInteractiveObjects) + List oldInteractiveObjectList = new(coopGameComponent.ListOfInteractiveObjects) { AirdropBox.Container }; @@ -282,5 +279,11 @@ private void SetDistanceToDrop() new Vector3(AirdropParameters.RandomAirdropPoint.x, AirdropParameters.DropHeight, AirdropParameters.RandomAirdropPoint.z), airdropPlane.transform.position); } + + void OnDestroy() + { + if (Singleton.Instantiated) + Singleton.Release(Singleton.Instance); + } } } \ No newline at end of file diff --git a/Source/Coop/NetworkPacket/Airdrop/AirdropLootPacket.cs b/Source/Coop/NetworkPacket/Airdrop/AirdropLootPacket.cs index 8c285cd90..215e2d805 100644 --- a/Source/Coop/NetworkPacket/Airdrop/AirdropLootPacket.cs +++ b/Source/Coop/NetworkPacket/Airdrop/AirdropLootPacket.cs @@ -1,11 +1,7 @@ -using Aki.Custom.Airdrops.Models; -using StayInTarkov.AkiSupport.Airdrops.Models; -using System; -using System.Collections.Generic; +using Aki.Custom.Airdrops; +using Aki.Custom.Airdrops.Models; +using Comfort.Common; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace StayInTarkov.Coop.NetworkPacket.Airdrop { @@ -14,20 +10,20 @@ public sealed class AirdropLootPacket : BasePacket public string AirdropLootResultModelJson { get; set; } public string AirdropConfigModelJson { get; set; } - public AirdropLootPacket(AirdropLootResultModel airdropLootResultModel, AirdropConfigModel airdropConfigModel) : base("AirdropLootPacket") + public AirdropLootPacket(AirdropLootResultModel airdropLootResultModel, AirdropConfigModel airdropConfigModel) : base(nameof(AirdropLootPacket)) { AirdropLootResultModelJson = airdropLootResultModel.SITToJson(); AirdropConfigModelJson = airdropConfigModel.SITToJson(); } - public AirdropLootPacket() : base("AirdropLootPacket") + public AirdropLootPacket() : base(nameof(AirdropLootPacket)) { } public override byte[] Serialize() { var ms = new MemoryStream(); - using BinaryWriter writer = new BinaryWriter(ms); + using BinaryWriter writer = new(ms); WriteHeader(writer); writer.Write(AirdropLootResultModelJson); writer.Write(AirdropConfigModelJson); @@ -36,11 +32,23 @@ public override byte[] Serialize() public override ISITPacket Deserialize(byte[] bytes) { - using BinaryReader reader = new BinaryReader(new MemoryStream(bytes)); + using BinaryReader reader = new(new MemoryStream(bytes)); ReadHeader(reader); AirdropLootResultModelJson = reader.ReadString(); AirdropConfigModelJson = reader.ReadString(); return this; } + + public override void Process() + { + if (!Singleton.Instantiated) + return; + + + Singleton.Instance.ReceiveBuildLootContainer( + this.AirdropLootResultModelJson.SITParseJson(), + this.AirdropConfigModelJson.SITParseJson() + ); + } } } diff --git a/Source/Coop/NetworkPacket/Airdrop/AirdropPacket.cs b/Source/Coop/NetworkPacket/Airdrop/AirdropPacket.cs index 2055e6796..b94317e9a 100644 --- a/Source/Coop/NetworkPacket/Airdrop/AirdropPacket.cs +++ b/Source/Coop/NetworkPacket/Airdrop/AirdropPacket.cs @@ -1,10 +1,7 @@ -using StayInTarkov.AkiSupport.Airdrops.Models; -using System; -using System.Collections.Generic; +using Aki.Custom.Airdrops; +using Comfort.Common; +using StayInTarkov.AkiSupport.Airdrops.Models; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace StayInTarkov.Coop.NetworkPacket.Airdrop { @@ -12,19 +9,19 @@ public sealed class AirdropPacket : BasePacket { public string AirdropParametersModelJson { get; set; } - public AirdropPacket(AirdropParametersModel airdropParametersModel) : base("AirdropPacket") + public AirdropPacket(AirdropParametersModel airdropParametersModel) : base(nameof(AirdropPacket)) { AirdropParametersModelJson = airdropParametersModel.SITToJson(); } - public AirdropPacket() : base("AirdropPacket") + public AirdropPacket() : base(nameof(AirdropPacket)) { } public override byte[] Serialize() { var ms = new MemoryStream(); - using BinaryWriter writer = new BinaryWriter(ms); + using BinaryWriter writer = new(ms); WriteHeader(writer); writer.Write(AirdropParametersModelJson); return ms.ToArray(); @@ -32,10 +29,18 @@ public override byte[] Serialize() public override ISITPacket Deserialize(byte[] bytes) { - using BinaryReader reader = new BinaryReader(new MemoryStream(bytes)); + using BinaryReader reader = new(new MemoryStream(bytes)); ReadHeader(reader); AirdropParametersModelJson = reader.ReadString(); return this; } + + public override void Process() + { + if (!Singleton.Instantiated) + return; + + Singleton.Instance.AirdropParameters = this.AirdropParametersModelJson.SITParseJson(); + } } } From cb63d79a7a777aa9e07e57473582a35b6dfdad6c Mon Sep 17 00:00:00 2001 From: Paulov Date: Mon, 13 May 2024 13:06:47 +0100 Subject: [PATCH 02/10] Remove annoying logging from TimeAndWeatherPacket --- .../Coop/NetworkPacket/Raid/TimeAndWeatherPacket.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Source/Coop/NetworkPacket/Raid/TimeAndWeatherPacket.cs b/Source/Coop/NetworkPacket/Raid/TimeAndWeatherPacket.cs index 3358f6890..f9cb3d962 100644 --- a/Source/Coop/NetworkPacket/Raid/TimeAndWeatherPacket.cs +++ b/Source/Coop/NetworkPacket/Raid/TimeAndWeatherPacket.cs @@ -2,12 +2,10 @@ using StayInTarkov.Coop.Matchmaker; using StayInTarkov.Coop.SITGameModes; using StayInTarkov.Networking; -using System.Collections.Generic; using System; using System.IO; using System.Linq; using UnityEngine; -using EFT; namespace StayInTarkov.Coop.NetworkPacket.Raid { @@ -29,7 +27,7 @@ public TimeAndWeatherPacket() : base(nameof(TimeAndWeatherPacket)) public override byte[] Serialize() { var ms = new MemoryStream(); - using BinaryWriter writer = new BinaryWriter(ms); + using BinaryWriter writer = new(ms); WriteHeader(writer); //writer.Write(GameDateTime); writer.Write(CloudDensity); @@ -45,7 +43,7 @@ public override byte[] Serialize() public override ISITPacket Deserialize(byte[] bytes) { - using BinaryReader reader = new BinaryReader(new MemoryStream(bytes)); + using BinaryReader reader = new(new MemoryStream(bytes)); ReadHeader(reader); //GameDateTime = reader.ReadSingle(); CloudDensity = reader.ReadSingle(); @@ -72,10 +70,10 @@ void ReplicateTimeAndWeather() if (!SITMatchmaking.IsClient) return; -#if DEBUG - StayInTarkov.StayInTarkovHelperConstants.Logger.LogDebug($"{nameof(ReplicateTimeAndWeather)}"); + //#if DEBUG + // StayInTarkov.StayInTarkovHelperConstants.Logger.LogDebug($"{nameof(ReplicateTimeAndWeather)}"); -#endif + //#endif var gameDateTime = new DateTime(long.Parse(GameDateTime.ToString())); if (coopGameComponent.LocalGameInstance is CoopSITGame coopGame && coopGame.GameDateTime != null) From da6193e5015c18ab5e6d1a5d5318217d32566ed4 Mon Sep 17 00:00:00 2001 From: Paulov Date: Mon, 13 May 2024 13:32:41 +0100 Subject: [PATCH 03/10] Cleanup UpdateExfiltrationPointPacket --- .../World/UpdateExfiltrationPointPacket.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Source/Coop/NetworkPacket/World/UpdateExfiltrationPointPacket.cs b/Source/Coop/NetworkPacket/World/UpdateExfiltrationPointPacket.cs index 630620e81..48f03e647 100644 --- a/Source/Coop/NetworkPacket/World/UpdateExfiltrationPointPacket.cs +++ b/Source/Coop/NetworkPacket/World/UpdateExfiltrationPointPacket.cs @@ -13,12 +13,12 @@ public sealed class UpdateExfiltrationPointPacket : BasePacket public EFT.Interactive.EExfiltrationStatus Command; public List QueuedPlayers; - public UpdateExfiltrationPointPacket() : base(nameof(UpdateExfiltrationPointPacket)) {} + public UpdateExfiltrationPointPacket() : base(nameof(UpdateExfiltrationPointPacket)) { } public override byte[] Serialize() { var ms = new MemoryStream(); - using BinaryWriter writer = new BinaryWriter(ms); + using BinaryWriter writer = new(ms); WriteHeader(writer); writer.Write(PointName); writer.Write((byte)Command); @@ -32,7 +32,7 @@ public override byte[] Serialize() public override ISITPacket Deserialize(byte[] bytes) { - using BinaryReader reader = new BinaryReader(new MemoryStream(bytes)); + using BinaryReader reader = new(new MemoryStream(bytes)); ReadHeader(reader); PointName = reader.ReadString(); Command = (EFT.Interactive.EExfiltrationStatus)reader.ReadByte(); @@ -46,7 +46,13 @@ public override ISITPacket Deserialize(byte[] bytes) } public override void Process() { - var point = ExfiltrationControllerClass.Instance.ExfiltrationPoints.First(x => x.Settings.Name == PointName); + if (ExfiltrationControllerClass.Instance == null) + return; + + if (ExfiltrationControllerClass.Instance.ExfiltrationPoints == null) + return; + + var point = ExfiltrationControllerClass.Instance.ExfiltrationPoints.FirstOrDefault(x => x.Settings != null && x.Settings.Name == PointName); if (point == null) { return; From 4ff98fd4815f3d62a92c5f444cb5d145bac81c1d Mon Sep 17 00:00:00 2001 From: Paulov Date: Mon, 13 May 2024 13:48:19 +0100 Subject: [PATCH 04/10] Synchronize Airdrop box Position --- Source/AkiSupport/Airdrops/AirdropBox.cs | 16 +++++ .../Airdrop/AirdropBoxPositionSyncPacket.cs | 60 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 Source/Coop/NetworkPacket/Airdrop/AirdropBoxPositionSyncPacket.cs diff --git a/Source/AkiSupport/Airdrops/AirdropBox.cs b/Source/AkiSupport/Airdrops/AirdropBox.cs index 51f56f61c..32124800a 100644 --- a/Source/AkiSupport/Airdrops/AirdropBox.cs +++ b/Source/AkiSupport/Airdrops/AirdropBox.cs @@ -2,6 +2,7 @@ using EFT.Airdrop; using EFT.Interactive; using EFT.SynchronizableObjects; +using StayInTarkov.Coop.Matchmaker; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; @@ -44,6 +45,8 @@ private BetterSource AudioSource } } + public Vector3 ClientSyncPosition { get; internal set; } + public static async Task Init(float crateFallSpeed) { var instance = (await LoadCrate()).AddComponent(); @@ -121,6 +124,19 @@ public IEnumerator DropCrate(Vector3 position) OpenParachute(); while (RaycastBoxDistance(LayerMaskClass.TerrainLowPoly, out _)) { + if (SITMatchmaking.IsClient) + { + + if (transform.position.x != this.ClientSyncPosition.x) + transform.position = ClientSyncPosition; + + // only do this if the box is higher than the client sync + if (transform.position.y > this.ClientSyncPosition.y) + transform.position = ClientSyncPosition; + + if (transform.position.z != this.ClientSyncPosition.z) + transform.position = ClientSyncPosition; + } transform.Translate(Vector3.down * (Time.deltaTime * fallSpeed)); transform.Rotate(Vector3.up, Time.deltaTime * 6f); yield return null; diff --git a/Source/Coop/NetworkPacket/Airdrop/AirdropBoxPositionSyncPacket.cs b/Source/Coop/NetworkPacket/Airdrop/AirdropBoxPositionSyncPacket.cs new file mode 100644 index 000000000..956d4b87d --- /dev/null +++ b/Source/Coop/NetworkPacket/Airdrop/AirdropBoxPositionSyncPacket.cs @@ -0,0 +1,60 @@ +using Aki.Custom.Airdrops; +using BepInEx.Logging; +using Comfort.Common; +using StayInTarkov.Coop.Matchmaker; +using System.IO; +using UnityEngine; +using static StayInTarkov.Networking.SITSerialization; + +namespace StayInTarkov.Coop.NetworkPacket.Airdrop +{ + public sealed class AirdropBoxPositionSyncPacket : BasePacket + { + static AirdropBoxPositionSyncPacket() + { + Logger = BepInEx.Logging.Logger.CreateLogSource(nameof(AirdropPacket)); + } + + public AirdropBoxPositionSyncPacket() : base(nameof(AirdropBoxPositionSyncPacket)) + { + } + + public Vector3 Position { get; set; } + public static ManualLogSource Logger { get; } + + public override byte[] Serialize() + { + var ms = new MemoryStream(); + using BinaryWriter writer = new(ms); + WriteHeader(writer); + Vector3Utils.Serialize(writer, this.Position); + return ms.ToArray(); + } + + public override ISITPacket Deserialize(byte[] bytes) + { + using BinaryReader reader = new(new MemoryStream(bytes)); + ReadHeader(reader); + Position = Vector3Utils.Deserialize(reader); + return this; + } + + public override void Process() + { + if (!SITMatchmaking.IsClient) + return; + + if (!Singleton.Instantiated) + { + Logger.LogError($"{nameof(SITAirdropsManager)} has not been instantiated!"); + return; + } + + + //Logger.LogDebug($"{nameof(Process)}"); + + Singleton.Instance.AirdropBox.ClientSyncPosition = Position; + } + + } +} From 93235655c8b15d48c573c333e451bf0516adc39e Mon Sep 17 00:00:00 2001 From: Paulov Date: Mon, 13 May 2024 13:48:42 +0100 Subject: [PATCH 05/10] Synchronize box position from Server --- Source/Coop/Airdrops/SITAirdropsManager.cs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/Source/Coop/Airdrops/SITAirdropsManager.cs b/Source/Coop/Airdrops/SITAirdropsManager.cs index c3542af4b..252d0cc03 100644 --- a/Source/Coop/Airdrops/SITAirdropsManager.cs +++ b/Source/Coop/Airdrops/SITAirdropsManager.cs @@ -12,6 +12,7 @@ using StayInTarkov.Coop.Matchmaker; using StayInTarkov.Coop.NetworkPacket.Airdrop; using StayInTarkov.Networking; +using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; @@ -36,7 +37,7 @@ public class SITAirdropsManager : MonoBehaviour void Awake() { - Logger = BepInEx.Logging.Logger.CreateLogSource("SITAirdropsManager"); + Logger = BepInEx.Logging.Logger.CreateLogSource(nameof(SITAirdropsManager)); Logger.LogInfo("Awake"); Singleton.Create(this); } @@ -182,6 +183,8 @@ public async void FixedUpdate() { return; } + + } else { @@ -199,6 +202,18 @@ public async void FixedUpdate() StartBox(); } + if (AirdropParameters.BoxSpawned && !SITMatchmaking.IsClient) + { + if (this.LastSyncTime < DateTime.Now.AddSeconds(-1)) + { + this.LastSyncTime = DateTime.Now; + + AirdropBoxPositionSyncPacket packet = new(); + packet.Position = AirdropBox.transform.position; + GameClient.SendData(packet.Serialize()); + } + } + if (distanceTravelled < AirdropParameters.DistanceToTravel) { distanceTravelled += Time.deltaTime * AirdropParameters.Config.PlaneSpeed; @@ -229,6 +244,7 @@ private void StartBox() AirdropBox.StartCoroutine(AirdropBox.DropCrate(dropPos)); } + private DateTime LastSyncTime { get; set; } public bool ClientPlaneSpawned { get; private set; } public AirdropLootResultModel ClientAirdropLootResultModel { get; private set; } public AirdropConfigModel ClientAirdropConfigModel { get; private set; } @@ -269,6 +285,7 @@ private async Task BuildLootContainer(AirdropConfigModel config) public void ReceiveBuildLootContainer(AirdropLootResultModel lootData, AirdropConfigModel config) { + Logger.LogDebug(nameof(ReceiveBuildLootContainer)); ClientAirdropConfigModel = config; ClientAirdropLootResultModel = lootData; } From 99e663046f3ba9afcaf6a95b4118f6cb92dcba0f Mon Sep 17 00:00:00 2001 From: Paulov Date: Mon, 13 May 2024 13:49:24 +0100 Subject: [PATCH 06/10] Remove unused WeatherSync coroutine --- Source/Coop/SITGameModes/CoopSITGame.cs | 79 +++++-------------------- 1 file changed, 15 insertions(+), 64 deletions(-) diff --git a/Source/Coop/SITGameModes/CoopSITGame.cs b/Source/Coop/SITGameModes/CoopSITGame.cs index 8f4bac2e2..057a392c1 100644 --- a/Source/Coop/SITGameModes/CoopSITGame.cs +++ b/Source/Coop/SITGameModes/CoopSITGame.cs @@ -30,7 +30,6 @@ using StayInTarkov.Coop.Components.CoopGameComponents; using StayInTarkov.Coop.FreeCamera; using StayInTarkov.Coop.Matchmaker; -using StayInTarkov.Coop.NetworkPacket.Player; using StayInTarkov.Coop.NetworkPacket.Raid; using StayInTarkov.Coop.NetworkPacket.World; using StayInTarkov.Coop.Players; @@ -41,7 +40,6 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; -using System.Security.Permissions; using System.Text; using System.Threading.Tasks; using UnityEngine; @@ -216,7 +214,7 @@ void OnDestroy() Logger.LogDebug("OnDestroy()"); Singleton.Instance.AfterGameStarted -= Instance_AfterGameStarted; - Comfort.Common.Singleton.TryRelease(this); + Comfort.Common.Singleton.TryRelease(this); } public void CreateCoopGameComponent() @@ -243,7 +241,6 @@ public void CreateCoopGameComponent() if (SITMatchmaking.IsServer) { StartCoroutine(GameTimerSync()); - StartCoroutine(TimeAndWeatherSync()); StartCoroutine(ArmoredTrainTimeSync()); } @@ -308,59 +305,13 @@ private IEnumerator GameTimerSync() // { "sessionTime", (GameTimer.SessionTime - GameTimer.PastTime).Value.Ticks }, //}; //Networking.GameClient.SendData(raidTimerDict.ToJson()); - RaidTimerPacket packet = new RaidTimerPacket(); + RaidTimerPacket packet = new(); packet.SessionTime = (GameTimer.SessionTime - GameTimer.PastTime).Value.Ticks; Networking.GameClient.SendData(packet.Serialize()); } } } - private IEnumerator TimeAndWeatherSync() - { - var waitSeconds = new WaitForSeconds(15f); - - while (true) - { - yield return waitSeconds; - - if (!SITGameComponent.TryGetCoopGameComponent(out var coopGameComponent)) - yield break; - - Dictionary timeAndWeatherDict = new() - { - { "serverId", coopGameComponent.ServerId }, - { "m", "TimeAndWeather" } - }; - - if (GameDateTime != null) - timeAndWeatherDict.Add("GameDateTime", GameDateTime.Calculate().Ticks); - - var weatherController = WeatherController.Instance; - if (weatherController != null) - { - if (weatherController.CloudsController != null) - timeAndWeatherDict.Add("CloudDensity", weatherController.CloudsController.Density); - - var weatherCurve = weatherController.WeatherCurve; - if (weatherCurve != null) - { - timeAndWeatherDict.Add("Fog", weatherCurve.Fog); - timeAndWeatherDict.Add("LightningThunderProbability", weatherCurve.LightningThunderProbability); - timeAndWeatherDict.Add("Rain", weatherCurve.Rain); - timeAndWeatherDict.Add("Temperature", weatherCurve.Temperature); - timeAndWeatherDict.Add("WindDirection.x", weatherCurve.Wind.x); - timeAndWeatherDict.Add("WindDirection.y", weatherCurve.Wind.y); - timeAndWeatherDict.Add("TopWindDirection.x", weatherCurve.TopWind.x); - timeAndWeatherDict.Add("TopWindDirection.y", weatherCurve.TopWind.y); - } - - string packet = timeAndWeatherDict.ToJson(); - Logger.LogDebug(packet); - Networking.GameClient.SendData(packet); - } - } - } - private IEnumerator ArmoredTrainTimeSync() { var waitSeconds = new WaitForSeconds(30f); @@ -619,7 +570,7 @@ public override async Task vmethod_2(int playerId, Vector3 position switch (SITMatchmaking.SITProtocol) { case ESITProtocol.RelayTcp: - JObject j = new JObject(); + JObject j = new(); j.Add("serverId", SITGameComponent.GetServerId()); j.Add("profileId", profile.ProfileId); j.Add("connect", true); @@ -771,7 +722,7 @@ private async Task WaitForPlayersToSpawn() } //}); - ReadyToStartGamePacket packet = new ReadyToStartGamePacket(SITMatchmaking.Profile.ProfileId); + ReadyToStartGamePacket packet = new(SITMatchmaking.Profile.ProfileId); GameClient.SendData(packet.Serialize()); } @@ -836,7 +787,7 @@ private async Task WaitForPlayersToBeReady() if (!SITMatchmaking.IsClient) { - HostStartingGamePacket packet = new HostStartingGamePacket(); + HostStartingGamePacket packet = new(); GameClient.SendData(packet.Serialize()); } } @@ -895,7 +846,7 @@ private async Task WaitForHostToStart() private void SendRequestSpawnPlayersPacket() { - RequestSpawnPlayersPacket requestSpawnPlayersPacket = new RequestSpawnPlayersPacket([Singleton.Instance.MainPlayer.ProfileId]); + RequestSpawnPlayersPacket requestSpawnPlayersPacket = new([Singleton.Instance.MainPlayer.ProfileId]); GameClient.SendData(requestSpawnPlayersPacket.Serialize()); } @@ -1069,7 +1020,7 @@ public override IEnumerator vmethod_4(float startDelay, BotControllerSettings co try { bool isWinter = BackEndSession.IsWinter; - WinterEventController winterEventController = new WinterEventController(); + WinterEventController winterEventController = new(); ReflectionHelpers.GetFieldFromTypeByFieldType(typeof(GameWorld), typeof(WinterEventController)).SetValue(Singleton.Instance, winterEventController); winterEventController.Run(isWinter).ContinueWith(x => { if (x.IsFaulted) Logger.LogError(x.Exception); return Task.CompletedTask; }); } @@ -1486,19 +1437,19 @@ public async Task Run(BotControllerSettings botsSettings, string backendUrl, Inv location = await BackEndSession.LoadLocationLoot(Location_0.Id, variantId); } } - + BackendConfigManagerConfig config = BackendConfigManager.Config; if (config.FixedFrameRate > 0f) { base.FixedDeltaTime = 1f / config.FixedFrameRate; } - - EFT.Player player = await CreatePlayerSpawn(); - dictionary_0.Add(player.ProfileId, player); - gparam_0 = func_1(player); - PlayerCameraController.Create(gparam_0.Player); - CameraClass.Instance.SetOcclusionCullingEnabled(Location_0.OcculsionCullingEnabled); - CameraClass.Instance.IsActive = false; + + EFT.Player player = await CreatePlayerSpawn(); + dictionary_0.Add(player.ProfileId, player); + gparam_0 = func_1(player); + PlayerCameraController.Create(gparam_0.Player); + CameraClass.Instance.SetOcclusionCullingEnabled(Location_0.OcculsionCullingEnabled); + CameraClass.Instance.IsActive = false; await SpawnLoot(location); await WaitForPlayersToSpawn(); From e81ac619166b1dc304457e44371eb94fd2a281a1 Mon Sep 17 00:00:00 2001 From: Paulov Date: Mon, 13 May 2024 13:50:35 +0100 Subject: [PATCH 07/10] Fix issues with Airdrop Sync between Server -> Client --- .../Airdrop/AirdropLootPacket.cs | 47 ++++++++++++++++++- .../NetworkPacket/Airdrop/AirdropPacket.cs | 21 +++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/Source/Coop/NetworkPacket/Airdrop/AirdropLootPacket.cs b/Source/Coop/NetworkPacket/Airdrop/AirdropLootPacket.cs index 215e2d805..3af47fc16 100644 --- a/Source/Coop/NetworkPacket/Airdrop/AirdropLootPacket.cs +++ b/Source/Coop/NetworkPacket/Airdrop/AirdropLootPacket.cs @@ -1,12 +1,24 @@ using Aki.Custom.Airdrops; using Aki.Custom.Airdrops.Models; +using BepInEx.Logging; using Comfort.Common; +using StayInTarkov.Coop.Matchmaker; +using System.Collections; using System.IO; +using UnityEngine; namespace StayInTarkov.Coop.NetworkPacket.Airdrop { public sealed class AirdropLootPacket : BasePacket { + + static AirdropLootPacket() + { + Logger = BepInEx.Logging.Logger.CreateLogSource(nameof(AirdropLootPacket)); + } + + private static ManualLogSource Logger { get; set; } + public string AirdropLootResultModelJson { get; set; } public string AirdropConfigModelJson { get; set; } @@ -41,14 +53,45 @@ public override ISITPacket Deserialize(byte[] bytes) public override void Process() { + if (!SITMatchmaking.IsClient) + return; + if (!Singleton.Instantiated) + { + Logger.LogDebug($"{nameof(SITAirdropsManager)} has not been instantiated! Waiting..."); + StayInTarkovPlugin.Instance.StartCoroutine(AirdropLootPacketWaitAndProcess()); + return; + } + + + if (!this.AirdropLootResultModelJson.TrySITParseJson(out var airdropLootResultModel)) + { + Logger.LogError($"{nameof(AirdropLootResultModel)} failed to deserialize!"); + return; + } + + if (!this.AirdropConfigModelJson.TrySITParseJson(out var airdropConfigModel)) + { + Logger.LogError($"{nameof(AirdropConfigModel)} failed to deserialize!"); return; + } Singleton.Instance.ReceiveBuildLootContainer( - this.AirdropLootResultModelJson.SITParseJson(), - this.AirdropConfigModelJson.SITParseJson() + airdropLootResultModel, + airdropConfigModel ); + + + } + + private IEnumerator AirdropLootPacketWaitAndProcess() + { + var waitForSec = new WaitForSeconds(5); + while (!Singleton.Instantiated) + yield return waitForSec; + + Process(); } } } diff --git a/Source/Coop/NetworkPacket/Airdrop/AirdropPacket.cs b/Source/Coop/NetworkPacket/Airdrop/AirdropPacket.cs index b94317e9a..3b360eb03 100644 --- a/Source/Coop/NetworkPacket/Airdrop/AirdropPacket.cs +++ b/Source/Coop/NetworkPacket/Airdrop/AirdropPacket.cs @@ -1,12 +1,21 @@ using Aki.Custom.Airdrops; +using BepInEx.Logging; using Comfort.Common; using StayInTarkov.AkiSupport.Airdrops.Models; +using StayInTarkov.Coop.Matchmaker; using System.IO; namespace StayInTarkov.Coop.NetworkPacket.Airdrop { public sealed class AirdropPacket : BasePacket { + static AirdropPacket() + { + Logger = BepInEx.Logging.Logger.CreateLogSource(nameof(AirdropPacket)); + } + + private static ManualLogSource Logger; + public string AirdropParametersModelJson { get; set; } public AirdropPacket(AirdropParametersModel airdropParametersModel) : base(nameof(AirdropPacket)) @@ -37,10 +46,22 @@ public override ISITPacket Deserialize(byte[] bytes) public override void Process() { + if (!SITMatchmaking.IsClient) + return; + if (!Singleton.Instantiated) + { + Logger.LogError($"{nameof(SITAirdropsManager)} has not been instantiated!"); return; + } Singleton.Instance.AirdropParameters = this.AirdropParametersModelJson.SITParseJson(); + +#if DEBUG + Logger.LogDebug($"{nameof(SITAirdropsManager)}{nameof(Singleton.Instance.AirdropParameters)}"); + Logger.LogDebug($"{Singleton.Instance.AirdropParameters.SITToJson()}"); +#endif + } } } From 0ac0e35fb715c0ae34dd0642621b6df40f3872eb Mon Sep 17 00:00:00 2001 From: artehe <112902041+artehe@users.noreply.github.com> Date: Fri, 31 May 2024 10:32:52 +0100 Subject: [PATCH 08/10] update airdrop box from SPT --- Source/AkiSupport/Airdrops/AirdropBox.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Source/AkiSupport/Airdrops/AirdropBox.cs b/Source/AkiSupport/Airdrops/AirdropBox.cs index 32124800a..7d54745aa 100644 --- a/Source/AkiSupport/Airdrops/AirdropBox.cs +++ b/Source/AkiSupport/Airdrops/AirdropBox.cs @@ -7,12 +7,13 @@ using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; +using UnityEngine.AI; namespace StayInTarkov.AkiSupport.Airdrops { /// /// Created by: SPT-Aki team - /// Link: https://dev.sp-tarkov.com/SPT-AKI/Modules/src/branch/master/project/Aki.Custom/Airdrops/AirdropBox.cs + /// Link: https://dev.sp-tarkov.com/SPT/Modules/src/branch/master/project/SPT.Custom/Airdrops/AirdropBox.cs /// public class AirdropBox : MonoBehaviour { @@ -163,6 +164,15 @@ private void OnBoxLand(out float clipLength) Falloff = (int)surfaceSet.LandingSoundBank.Rolloff, Volume = surfaceSet.LandingSoundBank.BaseVolume }); + + AddNavMeshObstacle(); + } + + private void AddNavMeshObstacle() + { + var navMeshObstacle = this.GetOrAddComponent(); + navMeshObstacle.size = boxSync.CollisionCollider.bounds.size; + navMeshObstacle.carving = true; } private bool RaycastBoxDistance(LayerMask layerMask, out RaycastHit hitInfo) From 524626b2cf8389ca7156de7900b889944985dfef Mon Sep 17 00:00:00 2001 From: artehe <112902041+artehe@users.noreply.github.com> Date: Fri, 31 May 2024 12:57:12 +0100 Subject: [PATCH 09/10] apply change from SPT to flare patch --- Source/AkiSupport/Airdrops/Patches/AirdropFlarePatch.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Source/AkiSupport/Airdrops/Patches/AirdropFlarePatch.cs b/Source/AkiSupport/Airdrops/Patches/AirdropFlarePatch.cs index e1c63b1b7..b0bed908d 100644 --- a/Source/AkiSupport/Airdrops/Patches/AirdropFlarePatch.cs +++ b/Source/AkiSupport/Airdrops/Patches/AirdropFlarePatch.cs @@ -20,18 +20,19 @@ public class AirdropFlarePatch : ModulePatch protected override MethodBase GetTargetMethod() { - return ReflectionHelpers.GetMethodForType(typeof(FlareCartridge), nameof(FlareCartridge.Init), false, true); + return typeof(FlareCartridge).GetMethod(nameof(FlareCartridge.Init), + BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); } [PatchPostfix] - private static void PatchPostfix(FlareCartridgeSettings flareCartridgeSettings, IPlayer player, BulletClass flareCartridge, Weapon weapon) + private static void PatchPostfix(BulletClass flareCartridge) { var gameWorld = Singleton.Instance; var points = LocationScene.GetAll().Any(); if (gameWorld != null && points && _usableFlares.Any(x => x == flareCartridge.Template._id)) { - gameWorld.gameObject.AddComponent().isFlareDrop = true; + gameWorld.gameObject.AddComponent().IsFlareDrop = true; } } } From 87842d88291b71e536799bfae636ef3718180fcf Mon Sep 17 00:00:00 2001 From: artehe <112902041+artehe@users.noreply.github.com> Date: Fri, 31 May 2024 12:57:48 +0100 Subject: [PATCH 10/10] switch list to dictionary and clean up airdrops manager --- Source/AkiSupport/Airdrops/AirdropBox.cs | 4 + Source/Coop/Airdrops/SITAirdropsManager.cs | 88 ++++++++----------- .../CoopGameComponents/SITGameComponent.cs | 7 +- .../HandControllers/SITFirearmController.cs | 2 +- .../Player/PlayerInteractWithDoorPacket.cs | 11 +-- .../Player/PlayerInteractWithObjectPacket.cs | 5 +- .../LootableContainerInteractionPacket.cs | 8 +- 7 files changed, 53 insertions(+), 72 deletions(-) diff --git a/Source/AkiSupport/Airdrops/AirdropBox.cs b/Source/AkiSupport/Airdrops/AirdropBox.cs index 7d54745aa..b39e3b5ad 100644 --- a/Source/AkiSupport/Airdrops/AirdropBox.cs +++ b/Source/AkiSupport/Airdrops/AirdropBox.cs @@ -22,6 +22,8 @@ public class AirdropBox : MonoBehaviour private readonly int CROSSFADE = Shader.PropertyToID("_Crossfade"); private readonly int COLLISION = Animator.StringToHash("collision"); + private static int AirdropContainerCount = 0; + public LootableContainer Container { get; set; } private float fallSpeed; private AirdropSynchronizableObject boxSync; @@ -54,6 +56,8 @@ public static async Task Init(float crateFallSpeed) instance.soundsDictionary = await LoadSounds(); instance.Container = instance.GetComponentInChildren(); + instance.Container.Id = $"AirdropBox_{AirdropContainerCount}"; + AirdropContainerCount++; instance.boxSync = instance.GetComponent(); instance.boxLogic = new AirdropLogicClass(); diff --git a/Source/Coop/Airdrops/SITAirdropsManager.cs b/Source/Coop/Airdrops/SITAirdropsManager.cs index 252d0cc03..61816ab35 100644 --- a/Source/Coop/Airdrops/SITAirdropsManager.cs +++ b/Source/Coop/Airdrops/SITAirdropsManager.cs @@ -3,7 +3,6 @@ using BepInEx.Logging; using Comfort.Common; using EFT; -using EFT.Interactive; using StayInTarkov; using StayInTarkov.AkiSupport.Airdrops; using StayInTarkov.AkiSupport.Airdrops.Models; @@ -14,7 +13,6 @@ using StayInTarkov.Networking; using System; using System.Collections; -using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; @@ -28,16 +26,23 @@ namespace Aki.Custom.Airdrops public class SITAirdropsManager : MonoBehaviour { private AirdropPlane airdropPlane; - public AirdropBox AirdropBox { get; private set; } private ItemFactoryUtil factory; - public bool isFlareDrop; + private float distanceTravelled = 0; + + private DateTime LastSyncTime { get; set; } + private ManualLogSource Logger { get; } = BepInEx.Logging.Logger.CreateLogSource(nameof(SITAirdropsManager)); + + public AirdropBox AirdropBox { get; private set; } public AirdropParametersModel AirdropParameters { get; set; } - private ManualLogSource Logger { get; set; } + public bool ClientPlaneSpawned { get; private set; } + public AirdropLootResultModel ClientAirdropLootResultModel { get; private set; } + public AirdropConfigModel ClientAirdropConfigModel { get; private set; } + public bool ClientLootBuilt { get; private set; } + public bool IsFlareDrop { get; set; } void Awake() { - Logger = BepInEx.Logging.Logger.CreateLogSource(nameof(SITAirdropsManager)); Logger.LogInfo("Awake"); Singleton.Create(this); } @@ -67,7 +72,7 @@ public async void Start() // The server will generate stuff ready for the packet - AirdropParameters = await AirdropUtil.InitAirdropParams(gameWorld, isFlareDrop); + AirdropParameters = await AirdropUtil.InitAirdropParams(gameWorld, IsFlareDrop); if (!AirdropParameters.AirdropAvailable) { @@ -101,7 +106,6 @@ public async void Start() await BuildLootContainer(AirdropParameters.Config); StartCoroutine(SendParamsToClients()); - } public IEnumerator SendParamsToClients() @@ -112,13 +116,10 @@ public IEnumerator SendParamsToClients() yield return new WaitForSeconds(AirdropParameters.TimeToStart); Logger.LogDebug("Sending Airdrop Params"); - //var packet = new Dictionary(); - //packet.Add("serverId", SITGameComponent.GetServerId()); - //packet.Add("m", "AirdropPacket"); - //packet.Add("model", AirdropParameters); - //GameClient.SendData(packet.SITToJson()); - var airdropPacket = new AirdropPacket(); - airdropPacket.AirdropParametersModelJson = AirdropParameters.SITToJson(); + AirdropPacket airdropPacket = new() + { + AirdropParametersModelJson = AirdropParameters.SITToJson() + }; GameClient.SendData(airdropPacket.Serialize()); yield break; @@ -150,16 +151,11 @@ public async void FixedUpdate() factory.BuildContainer(AirdropBox.Container, ClientAirdropConfigModel, ClientAirdropLootResultModel.DropType); factory.AddLoot(AirdropBox.Container, ClientAirdropLootResultModel); - if (AirdropBox.Container != null) + + if (AirdropBox.Container != null && SITGameComponent.TryGetCoopGameComponent(out SITGameComponent coopGameComponent)) { - if (SITGameComponent.TryGetCoopGameComponent(out var coopGameComponent)) - { - List oldInteractiveObjectList = new(coopGameComponent.ListOfInteractiveObjects) - { - AirdropBox.Container - }; - coopGameComponent.ListOfInteractiveObjects = [.. oldInteractiveObjectList]; - } + Logger.LogDebug($"Adding Airdrop box with id {AirdropBox.Container.Id}"); + coopGameComponent.WorldnteractiveObjects.TryAdd(AirdropBox.Container.Id, AirdropBox.Container); } } @@ -183,8 +179,6 @@ public async void FixedUpdate() { return; } - - } else { @@ -208,8 +202,10 @@ public async void FixedUpdate() { this.LastSyncTime = DateTime.Now; - AirdropBoxPositionSyncPacket packet = new(); - packet.Position = AirdropBox.transform.position; + AirdropBoxPositionSyncPacket packet = new() + { + Position = AirdropBox.transform.position + }; GameClient.SendData(packet.Serialize()); } } @@ -227,8 +223,6 @@ public async void FixedUpdate() } } - float distanceTravelled = 0; - private void StartPlane() { airdropPlane.gameObject.SetActive(true); @@ -244,42 +238,30 @@ private void StartBox() AirdropBox.StartCoroutine(AirdropBox.DropCrate(dropPos)); } - private DateTime LastSyncTime { get; set; } - public bool ClientPlaneSpawned { get; private set; } - public AirdropLootResultModel ClientAirdropLootResultModel { get; private set; } - public AirdropConfigModel ClientAirdropConfigModel { get; private set; } - public bool ClientLootBuilt { get; private set; } - private async Task BuildLootContainer(AirdropConfigModel config) { if (!SITMatchmaking.IsServer) return; // Get the lootData for this Raid - var lootData = await factory.GetLoot(); + AirdropLootResultModel lootData = await factory.GetLoot() ?? throw new Exception("Airdrops. Tried to BuildLootContainer without any Loot."); // Send the lootData to Clients. - var airdropLootPacket = new AirdropLootPacket(); - airdropLootPacket.AirdropLootResultModelJson = lootData.SITToJson(); - airdropLootPacket.AirdropConfigModelJson = config.SITToJson(); + AirdropLootPacket airdropLootPacket = new() + { + AirdropLootResultModelJson = lootData.SITToJson(), + AirdropConfigModelJson = config.SITToJson() + }; GameClient.SendData(airdropLootPacket.Serialize()); - if (lootData == null) - throw new System.Exception("Airdrops. Tried to BuildLootContainer without any Loot."); - factory.BuildContainer(AirdropBox.Container, config, lootData.DropType); factory.AddLoot(AirdropBox.Container, lootData); ClientLootBuilt = true; - if (AirdropBox.Container != null) + + if (AirdropBox.Container != null && SITGameComponent.TryGetCoopGameComponent(out SITGameComponent coopGameComponent)) { - if (SITGameComponent.TryGetCoopGameComponent(out var coopGameComponent)) - { - List oldInteractiveObjectList = new(coopGameComponent.ListOfInteractiveObjects) - { - AirdropBox.Container - }; - coopGameComponent.ListOfInteractiveObjects = [.. oldInteractiveObjectList]; - } + Logger.LogDebug($"Adding Airdrop box with id {AirdropBox.Container.Id}"); + coopGameComponent.WorldnteractiveObjects.TryAdd(AirdropBox.Container.Id, AirdropBox.Container); } } @@ -297,7 +279,7 @@ private void SetDistanceToDrop() airdropPlane.transform.position); } - void OnDestroy() + protected void OnDestroy() { if (Singleton.Instantiated) Singleton.Release(Singleton.Instance); diff --git a/Source/Coop/Components/CoopGameComponents/SITGameComponent.cs b/Source/Coop/Components/CoopGameComponents/SITGameComponent.cs index a1aced0d0..866b3fd07 100644 --- a/Source/Coop/Components/CoopGameComponents/SITGameComponent.cs +++ b/Source/Coop/Components/CoopGameComponents/SITGameComponent.cs @@ -41,7 +41,7 @@ namespace StayInTarkov.Coop.Components.CoopGameComponents public class SITGameComponent : MonoBehaviour { #region Fields/Properties - public WorldInteractiveObject[] ListOfInteractiveObjects { get; set; } + public ConcurrentDictionary WorldnteractiveObjects { get; set; } = []; private AkiBackendCommunication RequestingObj { get; set; } public SITConfig SITConfig { get; private set; } = new SITConfig(); public string ServerId { get; set; } = null; @@ -379,7 +379,10 @@ private void GameWorld_AfterGameStarted() } // Get a List of Interactive Objects (this is a slow method), so run once here to maintain a reference - ListOfInteractiveObjects = FindObjectsOfType(); + foreach (WorldInteractiveObject worldInteractiveObject in FindObjectsOfType()) + { + this.WorldnteractiveObjects.TryAdd(worldInteractiveObject.Id, worldInteractiveObject); + } } diff --git a/Source/Coop/Controllers/HandControllers/SITFirearmController.cs b/Source/Coop/Controllers/HandControllers/SITFirearmController.cs index 63f1c56ba..4a95d7061 100644 --- a/Source/Coop/Controllers/HandControllers/SITFirearmController.cs +++ b/Source/Coop/Controllers/HandControllers/SITFirearmController.cs @@ -335,11 +335,11 @@ public override bool ToggleLauncher() public override void CreateFlareShot(BulletClass flareItem, Vector3 shotPosition, Vector3 forward) { + Logger.LogDebug(nameof(CreateFlareShot)); var createFlareShotPacket = new CreateFlareShotPacket(_player.ProfileId, shotPosition, forward, flareItem.TemplateId); GameClient.SendData(createFlareShotPacket.Serialize()); base.CreateFlareShot(flareItem, shotPosition, forward); } - } } diff --git a/Source/Coop/NetworkPacket/Player/PlayerInteractWithDoorPacket.cs b/Source/Coop/NetworkPacket/Player/PlayerInteractWithDoorPacket.cs index cf6047327..d2e6558b7 100644 --- a/Source/Coop/NetworkPacket/Player/PlayerInteractWithDoorPacket.cs +++ b/Source/Coop/NetworkPacket/Player/PlayerInteractWithDoorPacket.cs @@ -1,16 +1,11 @@ -using Comfort.Common; -using EFT; +using EFT; using EFT.Interactive; using EFT.InventoryLogic; using Newtonsoft.Json.Linq; using StayInTarkov.Coop.Components.CoopGameComponents; using StayInTarkov.Coop.Players; -using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace StayInTarkov.Coop.NetworkPacket.Player { @@ -95,9 +90,7 @@ protected override void Process(CoopPlayerClient client) } } - - WorldInteractiveObject worldInteractiveObject = SITGameComponent.GetCoopGameComponent().ListOfInteractiveObjects.FirstOrDefault(x => x.Id == ProcessJson["WIOId"].ToString()); - if (worldInteractiveObject == null) + if (!SITGameComponent.GetCoopGameComponent().WorldnteractiveObjects.TryGetValue(ProcessJson["WIOId"].ToString(), out WorldInteractiveObject worldInteractiveObject)) { StayInTarkovHelperConstants.Logger.LogError($"Player_ExecuteDoorInteraction_Patch:Replicated:Could not find {nameof(worldInteractiveObject)}"); return; diff --git a/Source/Coop/NetworkPacket/Player/PlayerInteractWithObjectPacket.cs b/Source/Coop/NetworkPacket/Player/PlayerInteractWithObjectPacket.cs index 19829de89..07ae22935 100644 --- a/Source/Coop/NetworkPacket/Player/PlayerInteractWithObjectPacket.cs +++ b/Source/Coop/NetworkPacket/Player/PlayerInteractWithObjectPacket.cs @@ -5,7 +5,6 @@ using StayInTarkov.Coop.Components.CoopGameComponents; using StayInTarkov.Coop.Players; using System.IO; -using System.Linq; using System.Text; namespace StayInTarkov.Coop.NetworkPacket.Player @@ -56,9 +55,7 @@ protected override void Process(CoopPlayerClient client) return; } - WorldInteractiveObject worldInteractiveObject = SITGameComponent.GetCoopGameComponent().ListOfInteractiveObjects.FirstOrDefault(x => x.Id == ProcessJson["WIOId"].ToString()); - - if (worldInteractiveObject == null) + if (!SITGameComponent.GetCoopGameComponent().WorldnteractiveObjects.TryGetValue(ProcessJson["WIOId"].ToString(), out WorldInteractiveObject worldInteractiveObject)) { StayInTarkovHelperConstants.Logger.LogError($"Player_ExecuteDoorInteraction_Patch:Replicated:Could not find {nameof(worldInteractiveObject)}"); return; diff --git a/Source/Coop/NetworkPacket/Raid/LootableContainerInteractionPacket.cs b/Source/Coop/NetworkPacket/Raid/LootableContainerInteractionPacket.cs index 1eae6bc1e..273baf1f2 100644 --- a/Source/Coop/NetworkPacket/Raid/LootableContainerInteractionPacket.cs +++ b/Source/Coop/NetworkPacket/Raid/LootableContainerInteractionPacket.cs @@ -43,10 +43,12 @@ public override ISITPacket Deserialize(byte[] bytes) public override void Process() { SITGameComponent coopGameComponent = SITGameComponent.GetCoopGameComponent(); - LootableContainer lootableContainer = coopGameComponent.ListOfInteractiveObjects.FirstOrDefault(x => x.Id == this.LootableContainerId) as LootableContainer; - - if (lootableContainer == null) + if (!coopGameComponent.WorldnteractiveObjects.TryGetValue(LootableContainerId, out WorldInteractiveObject worldInteractiveObject)) + { + StayInTarkovHelperConstants.Logger.LogError($"LootableContainerInteractionPacket:Process:Could not find {nameof(worldInteractiveObject)}"); return; + } + LootableContainer lootableContainer = worldInteractiveObject as LootableContainer; string methodName = string.Empty; switch (InteractionType)