From 78e5ba4266227a320d9a017e8df3b0146d90cba7 Mon Sep 17 00:00:00 2001 From: Soar Qin Date: Sat, 10 Sep 2022 23:19:47 +0800 Subject: [PATCH] Add new MOD: Dustbin --- CheatEnabler/CheatEnabler.csproj | 2 +- DSP_Mods.sln | 6 +++ Dustbin/Dustbin.cs | 77 +++++++++++++++++++++++++++++++ Dustbin/Dustbin.csproj | 29 ++++++++++++ Dustbin/package/README.md | 12 +++++ Dustbin/package/icon.png | Bin 0 -> 20482 bytes Dustbin/package/manifest.json | 9 ++++ HideTips/HideTips.csproj | 2 +- README.md | 13 ++++++ 9 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 Dustbin/Dustbin.cs create mode 100644 Dustbin/Dustbin.csproj create mode 100644 Dustbin/package/README.md create mode 100644 Dustbin/package/icon.png create mode 100644 Dustbin/package/manifest.json diff --git a/CheatEnabler/CheatEnabler.csproj b/CheatEnabler/CheatEnabler.csproj index f5f7570..23a8c0d 100644 --- a/CheatEnabler/CheatEnabler.csproj +++ b/CheatEnabler/CheatEnabler.csproj @@ -24,6 +24,6 @@ - + diff --git a/DSP_Mods.sln b/DSP_Mods.sln index 0f2d97d..14bd575 100644 --- a/DSP_Mods.sln +++ b/DSP_Mods.sln @@ -6,6 +6,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LogisticMiner", "LogisticMi EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HideTips", "HideTips\HideTips.csproj", "{4EABD71D-477F-448B-801B-48F8745A3FA7}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dustbin", "Dustbin\Dustbin.csproj", "{931F0230-5941-4E49-AB19-66921AF14096}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -24,5 +26,9 @@ Global {4EABD71D-477F-448B-801B-48F8745A3FA7}.Debug|Any CPU.Build.0 = Debug|Any CPU {4EABD71D-477F-448B-801B-48F8745A3FA7}.Release|Any CPU.ActiveCfg = Release|Any CPU {4EABD71D-477F-448B-801B-48F8745A3FA7}.Release|Any CPU.Build.0 = Release|Any CPU + {931F0230-5941-4E49-AB19-66921AF14096}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {931F0230-5941-4E49-AB19-66921AF14096}.Debug|Any CPU.Build.0 = Debug|Any CPU + {931F0230-5941-4E49-AB19-66921AF14096}.Release|Any CPU.ActiveCfg = Release|Any CPU + {931F0230-5941-4E49-AB19-66921AF14096}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/Dustbin/Dustbin.cs b/Dustbin/Dustbin.cs new file mode 100644 index 0000000..0736e94 --- /dev/null +++ b/Dustbin/Dustbin.cs @@ -0,0 +1,77 @@ +using BepInEx; +using HarmonyLib; + +namespace Dustbin; + +[BepInPlugin(PluginInfo.PLUGIN_GUID, PluginInfo.PLUGIN_NAME, PluginInfo.PLUGIN_VERSION)] +public class Dustbin : BaseUnityPlugin +{ + private new static readonly BepInEx.Logging.ManualLogSource Logger = + BepInEx.Logging.Logger.CreateLogSource(PluginInfo.PLUGIN_NAME); + + private bool _cfgEnabled = true; + private static readonly int[] SandsFactors = { 0, 1, 5, 10, 100 }; + private static readonly bool[] IsFluid = new bool[2000]; + + private void Awake() + { + _cfgEnabled = Config.Bind("General", "Enabled", _cfgEnabled, "enable/disable this plugin").Value; + SandsFactors[1] = Config.Bind("General", "SandsPerItem", SandsFactors[1], "Sands gathered from normal items").Value; + SandsFactors[0] = Config.Bind("General", "SandsPerFluid", SandsFactors[0], "Sands gathered from fluids").Value; + SandsFactors[2] = Config.Bind("General", "SandsPerStone", SandsFactors[2], "Sands gathered from stones").Value; + SandsFactors[3] = Config.Bind("General", "SandsPerSilicon", SandsFactors[3], "Sands gathered from silicon ores").Value; + SandsFactors[4] = Config.Bind("General", "SandsPerFractal", SandsFactors[4], "Sands gathered from fractal silicon ores").Value; + Harmony.CreateAndPatchAll(typeof(Dustbin)); + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(DSPGame), "StartGame", typeof(GameDesc))] + [HarmonyPatch(typeof(DSPGame), "StartGame", typeof(string))] + private static void OnGameStart() + { + foreach (var data in LDB.items.dataArray) + { + if (data.ID < 2000 && data.IsFluid) + { + IsFluid[data.ID] = true; + } + } + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(StorageComponent), "AddItem", + new[] { typeof(int), typeof(int), typeof(int), typeof(int), typeof(bool) }, + new[] + { + ArgumentType.Normal, ArgumentType.Normal, ArgumentType.Normal, ArgumentType.Out, ArgumentType.Normal + })] + public static bool AbandonItems(ref int __result, StorageComponent __instance, int itemId, int count, int inc, + out int remainInc, bool useBan = false) + { + remainInc = inc; + Logger.LogInfo($"${__instance.id} ${__instance.top}"); + if (!useBan || count == 0 || __instance.id != __instance.top) return true; + var size = __instance.size; + if (size == 0 || size != __instance.bans || __instance.grids[0].count > 0) return true; + __result = count; + var isFluid = itemId < 2000 && IsFluid[itemId]; + var sandsPerItem = SandsFactors[isFluid + ? 0 + : itemId switch + { + 1005 => 2, + 1003 => 3, + 1013 => 4, + _ => 1, + }]; + if (sandsPerItem <= 0) return false; + var player = GameMain.mainPlayer; + var addCount = count * sandsPerItem; + player.sandCount += addCount; + GameMain.history.OnSandCountChange(player.sandCount, addCount); + /* Following line crashes game, seems that it should not be called in this working thread: + * UIRoot.instance.uiGame.OnSandCountChanged(player.sandCount, addCount); + */ + return false; + } +} diff --git a/Dustbin/Dustbin.csproj b/Dustbin/Dustbin.csproj new file mode 100644 index 0000000..7c62038 --- /dev/null +++ b/Dustbin/Dustbin.csproj @@ -0,0 +1,29 @@ + + + + netstandard2.0 + org.soardev.dustbin + DSP MOD - Dustbin + 1.0.0 + true + latest + Dustbin + Dustbin + + + + + + + + + + + + + + + + + + diff --git a/Dustbin/package/README.md b/Dustbin/package/README.md new file mode 100644 index 0000000..6698bd0 --- /dev/null +++ b/Dustbin/package/README.md @@ -0,0 +1,12 @@ +## Dustbin + +### Storages with capacity limited to zero act like dustbins(abandon incoming items) + +* Conditions to become dustbin: Storages with capacity limited to zero at top of storage stacks with nothing in 1st cell. +* Items sent into dustbin are removed immediately. +* Can get sands from abandoned items (with factors configurable): + * Get 100 sands from each fractal silicon ore + * Get 10 sands from each silicon ore + * Get nothing from fluids + * Get 1 sand from any other normal item +* Known bug: stack 1 more storage up on a zero limited one and remove it will cause dustbin stop working. Just put somethings in and take them out to make the dustbin working again. \ No newline at end of file diff --git a/Dustbin/package/icon.png b/Dustbin/package/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b6283f2b17cd823bbbedaf76734a327448907c GIT binary patch literal 20482 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 M+{EI19oi-4zvZgR6951J literal 0 HcmV?d00001 diff --git a/Dustbin/package/manifest.json b/Dustbin/package/manifest.json new file mode 100644 index 0000000..3900c6e --- /dev/null +++ b/Dustbin/package/manifest.json @@ -0,0 +1,9 @@ +{ + "name": "Dustbin", + "version_number": "1.0.0", + "website_url": "https://github.com/soarqin/DSP_Mods/tree/master/Dustbin", + "description": "Storages with capacity limited to zero act like dustbins(abandon incoming items)", + "dependencies": [ + "xiaoye97-BepInEx-5.4.17" + ] +} diff --git a/HideTips/HideTips.csproj b/HideTips/HideTips.csproj index 300dcff..6588464 100644 --- a/HideTips/HideTips.csproj +++ b/HideTips/HideTips.csproj @@ -23,6 +23,6 @@ - + diff --git a/README.md b/README.md index 54ea3a3..45db2e5 100644 --- a/README.md +++ b/README.md @@ -68,3 +68,16 @@ * Skip prologue for new game. * Each type of tips/messages is configurable individually. * For sanity check warning messages, please check [CheatEnabler](CheatEnabler) + +## [Dustbin](Dustbin) + +### Storages with capacity limited to zero act like dustbins(abandon incoming items) + +* Conditions to become dustbin: Storages with capacity limited to zero at top of storage stacks with nothing in 1st cell. +* Items sent into dustbin are removed immediately. +* Can get sands from abandoned items (with factors configurable): + * Get 100 sands from each fractal silicon ore + * Get 10 sands from each silicon ore + * Get nothing from fluids + * Get 1 sand from any other normal item +* Known bug: stack 1 more storage up on a zero limited one and remove it will cause dustbin stop working. Just put somethings in and take them out to make the dustbin working again. \ No newline at end of file