From c6576c0e11f23382aeb5c04151c19d049af18d49 Mon Sep 17 00:00:00 2001 From: SamSWAT Date: Wed, 21 Jun 2023 00:59:14 +0300 Subject: [PATCH] SPT-AKI 3.5.x --- .../SamSWAT.HeliCrash/GeneratedContainer.cs | 22 --- project/SamSWAT.HeliCrash/HeliCrash.cs | 83 +++-------- .../SamSWAT.HeliCrash/HeliCrashLocations.cs | 1 + project/SamSWAT.HeliCrash/HeliCrashPatch.cs | 2 +- project/SamSWAT.HeliCrash/Plugin.cs | 4 +- .../References/aki-custom.dll | Bin 0 -> 60416 bytes .../SamSWAT.HeliCrash.csproj | 7 +- project/SamSWAT.HeliCrash/Utils.cs | 131 ++++++++++++++++++ 8 files changed, 159 insertions(+), 91 deletions(-) delete mode 100644 project/SamSWAT.HeliCrash/GeneratedContainer.cs create mode 100644 project/SamSWAT.HeliCrash/References/aki-custom.dll create mode 100644 project/SamSWAT.HeliCrash/Utils.cs diff --git a/project/SamSWAT.HeliCrash/GeneratedContainer.cs b/project/SamSWAT.HeliCrash/GeneratedContainer.cs deleted file mode 100644 index 8418f08..0000000 --- a/project/SamSWAT.HeliCrash/GeneratedContainer.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Newtonsoft.Json.Linq; -using System.Collections.Generic; - -namespace SamSWAT.HeliCrash.Json -{ - public class GeneratedContainer - { - public string Id { get; set; } - public string Root { get; set; } - public List Items { get; set; } - } - - public class ItemInfo - { - public string _id { get; set; } - public string _tpl { get; set; } - public string parentId { get; set; } - public string slotId { get; set; } - public LocationInGrid location { get; set; } - public JObject upd { get; set; } - } -} diff --git a/project/SamSWAT.HeliCrash/HeliCrash.cs b/project/SamSWAT.HeliCrash/HeliCrash.cs index 9c83a1b..9068928 100644 --- a/project/SamSWAT.HeliCrash/HeliCrash.cs +++ b/project/SamSWAT.HeliCrash/HeliCrash.cs @@ -1,82 +1,37 @@ -using Aki.Common.Http; -using Comfort.Common; +using Comfort.Common; using EFT; using EFT.Interactive; -using EFT.InventoryLogic; -using Newtonsoft.Json; -using SamSWAT.HeliCrash.Json; -using System; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; +using Aki.Custom.Airdrops.Utils; using UnityEngine; namespace SamSWAT.HeliCrash { public class HeliCrash : MonoBehaviour { - private AssetBundle _uh60Bundle; - private LootableContainer _choppaContainer; - private List _resources; - private string _playerLocation; + private AssetBundle _heliBundle; public async void Init(string location) { - _playerLocation = location; + var heliLocation = GetHeliCrashLocation(location); + var choppa = Instantiate(await LoadChoppaAsync(), heliLocation.Position, Quaternion.Euler(heliLocation.Rotation)); + var container = choppa.GetComponentInChildren(); - Location heliLocation = GetHeliCrashLocation(); - var _choppa = Instantiate(await LoadChoppaAsync(), heliLocation.Position, Quaternion.Euler(heliLocation.Rotation)); - _choppaContainer = _choppa.GetComponentInChildren(); + var itemCrate = Utils.CreateItem("goofyahcontainer", "6223349b3136504a544d1608"); + LootItem.CreateLootContainer(container, itemCrate, "Heavy crate", Singleton.Instance); - Item itemCrate = Singleton.Instance.CreateItem("goofyahcontainer", "61a89e5445a2672acf66c877", null); - LootItem.CreateLootContainer(_choppaContainer, itemCrate, "Heavy crate", Singleton.Instance); - - await Task.Run(() => GenerateLoot()); - await Singleton.Instance.LoadBundlesAndCreatePools(PoolManager.PoolsCategory.Raid, PoolManager.AssemblyType.Local, _resources.ToArray(), JobPriority.Low, null, default); + new ItemFactoryUtil().AddLoot(container); } - void OnDestroy() + private void OnDestroy() { - _uh60Bundle.Unload(true); + _heliBundle.Unload(true); } - private void GenerateLoot() + private Location GetHeliCrashLocation(string location) { - var itemFactory = Singleton.Instance; - var json = RequestHandler.GetJson("/client/helicrash/getLoot"); - var akiContainer = JsonConvert.DeserializeObject(json); - _resources = new List(); - - for (int i = 1; i < akiContainer.Items.Count; i++) - { - var item = akiContainer.Items[i]; - - if (item.slotId != "main") - continue; - - Item actualItem; - - if (Array.Exists(itemFactory.SavedPresets, x => x.Encyclopedia == item._tpl)) - { - actualItem = itemFactory.GetPresetItem(item._tpl); - _resources.AddRange(actualItem.GetAllItems().Select(x => x.Template).SelectMany(x => x.AllResources)); - } - else - { - actualItem = itemFactory.CreateItem(item._id, item._tpl, null); - _resources.AddRange(actualItem.Template.AllResources); - } - - if (item.upd != null) - actualItem.StackObjectsCount = item.upd.Value("StackObjectsCount"); - - _choppaContainer.ItemOwner.MainStorage[0].Add(actualItem, item.location, false); - } - } - - private Location GetHeliCrashLocation() - { - switch (_playerLocation) + switch (location) { case "bigmap": { @@ -102,6 +57,10 @@ namespace SamSWAT.HeliCrash { return PickRandom(Plugin.HeliCrashLocations.Lighthouse); } + case "TarkovStreets": + { + return PickRandom(Plugin.HeliCrashLocations.StreetsOfTarkov); + } case "develop": { return PickRandom(Plugin.HeliCrashLocations.Develop); @@ -119,15 +78,15 @@ namespace SamSWAT.HeliCrash while (!bundleLoadRequest.isDone) await Task.Yield(); - _uh60Bundle = bundleLoadRequest.assetBundle; + _heliBundle = bundleLoadRequest.assetBundle; - if (_uh60Bundle == null) + if (_heliBundle == null) { Debug.LogError("[SamSWAT.HeliCrash]: Can't load UH-60 Blackhawk bundle"); return null; } - var assetLoadRequest = _uh60Bundle.LoadAllAssetsAsync(); + var assetLoadRequest = _heliBundle.LoadAllAssetsAsync(); while (!assetLoadRequest.isDone) await Task.Yield(); @@ -145,7 +104,7 @@ namespace SamSWAT.HeliCrash private T PickRandom(List list) { - return list[UnityEngine.Random.Range(0, list.Count)]; + return list[Random.Range(0, list.Count)]; } } } diff --git a/project/SamSWAT.HeliCrash/HeliCrashLocations.cs b/project/SamSWAT.HeliCrash/HeliCrashLocations.cs index 7537295..0b72622 100644 --- a/project/SamSWAT.HeliCrash/HeliCrashLocations.cs +++ b/project/SamSWAT.HeliCrash/HeliCrashLocations.cs @@ -17,6 +17,7 @@ namespace SamSWAT.HeliCrash public List Lighthouse { get; set; } public List Rezerv { get; set; } public List Shoreline { get; set; } + public List StreetsOfTarkov { get; set; } public List Develop { get; set; } } } diff --git a/project/SamSWAT.HeliCrash/HeliCrashPatch.cs b/project/SamSWAT.HeliCrash/HeliCrashPatch.cs index 0d44b2c..36b5507 100644 --- a/project/SamSWAT.HeliCrash/HeliCrashPatch.cs +++ b/project/SamSWAT.HeliCrash/HeliCrashPatch.cs @@ -13,7 +13,7 @@ namespace SamSWAT.HeliCrash { protected override MethodBase GetTargetMethod() { - return PatchConstants.LocalGameType.BaseType.GetMethod("method_11", BindingFlags.NonPublic | BindingFlags.Instance); + return PatchConstants.LocalGameType.BaseType.GetMethod("method_10", BindingFlags.NonPublic | BindingFlags.Instance); } [PatchPostfix] diff --git a/project/SamSWAT.HeliCrash/Plugin.cs b/project/SamSWAT.HeliCrash/Plugin.cs index 3fbe4cb..d070475 100644 --- a/project/SamSWAT.HeliCrash/Plugin.cs +++ b/project/SamSWAT.HeliCrash/Plugin.cs @@ -5,7 +5,7 @@ using System.IO; namespace SamSWAT.HeliCrash { - [BepInPlugin("com.SamSWAT.HeliCrash", "SamSWAT.HeliCrash", "1.2.0")] + [BepInPlugin("com.SamSWAT.HeliCrash", "SamSWAT.HeliCrash", "2.0.0")] public class Plugin : BaseUnityPlugin { public static HeliCrashLocations HeliCrashLocations; @@ -16,7 +16,7 @@ namespace SamSWAT.HeliCrash { Directory = Path.Combine(BepInEx.Paths.PluginPath, "SamSWAT.HeliCrash/").Replace("\\", "/"); new HeliCrashPatch().Enable(); - var json = new StreamReader(Directory + "HeliCrashLocations.json").ReadToEnd(); + var json = File.ReadAllText(Directory + "HeliCrashLocations.json"); HeliCrashLocations = JsonConvert.DeserializeObject(json); HeliCrashChance = Config.Bind( diff --git a/project/SamSWAT.HeliCrash/References/aki-custom.dll b/project/SamSWAT.HeliCrash/References/aki-custom.dll new file mode 100644 index 0000000000000000000000000000000000000000..da8345cd593ba83f659184526f20c75afda31870 GIT binary patch literal 60416 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 - - False - References\Aki.Common.dll + + References\aki-custom.dll References\Aki.Reflection.dll @@ -63,12 +62,12 @@ - + \ No newline at end of file diff --git a/project/SamSWAT.HeliCrash/Utils.cs b/project/SamSWAT.HeliCrash/Utils.cs new file mode 100644 index 0000000..f3934e3 --- /dev/null +++ b/project/SamSWAT.HeliCrash/Utils.cs @@ -0,0 +1,131 @@ +using System; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using Comfort.Common; +using EFT.InventoryLogic; + +namespace SamSWAT.HeliCrash +{ + public static class Utils + { + private static CreateItemDelegate _createItemDelegate; + private delegate Item CreateItemDelegate(object instance, string id, string tplId, object diff = null); + + static Utils() + { + var createItemMethod = typeof(ItemFactory).GetMethod("CreateItem"); + _createItemDelegate = MethodDelegate(createItemMethod, false); + } + + public static Item CreateItem(string id, string tplId) + { + return _createItemDelegate(Singleton.Instance, id, tplId); + } + + //stolen from kmyuhkyuk + private static DelegateType MethodDelegate(MethodInfo method, bool virtualCall = true) where DelegateType : Delegate + { + if (method == null) + { + throw new ArgumentNullException(nameof(method)); + } + + var delegateType = typeof(DelegateType); + + var declaringType = method.DeclaringType; + + var delegateMethod = delegateType.GetMethod("Invoke"); + var delegateParameters = delegateMethod.GetParameters(); + var delegateParameterTypes = delegateParameters.Select(x => x.ParameterType).ToArray(); + + Type returnType; + bool needBox; + + if (delegateMethod.ReturnType == typeof(object) && method.ReturnType.IsValueType) + { + returnType = typeof(object); + + needBox = true; + } + else + { + returnType = method.ReturnType; + + needBox = false; + } + + var dmd = new DynamicMethod("OpenInstanceDelegate_" + method.Name, returnType, delegateParameterTypes); + + var ilGen = dmd.GetILGenerator(); + + Type[] parameterTypes; + int num; + + if (!method.IsStatic) + { + var parameters = method.GetParameters(); + var numParameters = parameters.Length; + parameterTypes = new Type[numParameters + 1]; + parameterTypes[0] = typeof(object); + + for (int i = 0; i < numParameters; i++) + { + parameterTypes[i + 1] = parameters[i].ParameterType; + } + + if (declaringType != null && declaringType.IsValueType) + { + ilGen.Emit(OpCodes.Ldarga_S, 0); + } + else + { + ilGen.Emit(OpCodes.Ldarg_0); + } + + ilGen.Emit(OpCodes.Castclass, declaringType); + + num = 1; + } + else + { + parameterTypes = method.GetParameters().Select(x => x.ParameterType).ToArray(); + + num = 0; + } + + for (int i = num; i < parameterTypes.Length; i++) + { + ilGen.Emit(OpCodes.Ldarg, i); + var parameterType = parameterTypes[i]; + var isValueType = parameterType.IsValueType; + if (!isValueType) + { + ilGen.Emit(OpCodes.Castclass, parameterType); + } + else if (delegateParameterTypes[i] == typeof(object)) + { + ilGen.Emit(OpCodes.Unbox_Any, parameterType); + } + } + + if (method.IsStatic || !virtualCall) + { + ilGen.Emit(OpCodes.Call, method); + } + else + { + ilGen.Emit(OpCodes.Callvirt, method); + } + + if (needBox) + { + ilGen.Emit(OpCodes.Box, method.ReturnType); + } + + ilGen.Emit(OpCodes.Ret); + + return (DelegateType)dmd.CreateDelegate(delegateType); + } + } +} \ No newline at end of file