1
0
mirror of https://github.com/soarqin/DSP_Mods.git synced 2025-12-08 22:13:30 +08:00

Dustbin v1.4.0

This commit is contained in:
2025-03-25 20:38:01 +08:00
parent 74c61c3eb9
commit e458f42f4a
6 changed files with 72 additions and 130 deletions

View File

@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
@@ -14,7 +13,6 @@ public static class BeltSignal
private static HashSet<int>[] _signalBelts;
private static int _signalBeltsCapacity;
private static bool _initialized;
private static AssetBundle _bundle;
private static Harmony _patch;
public static void Enable(bool on)
@@ -33,13 +31,40 @@ public static class BeltSignal
}
}
private static byte[] LoadEmbeddedResource(string path, Assembly assembly = null)
{
if (assembly == null)
{
assembly = Assembly.GetCallingAssembly();
}
var info = assembly.GetName();
var name = info.Name;
using var stream = assembly.GetManifestResourceStream($"{name}.{path.Replace('/', '.')}")!;
var buffer = new byte[stream.Length];
_ = stream.Read(buffer, 0, buffer.Length);
return buffer;
}
private static Texture2D LoadEmbeddedTexture(string path, Assembly assembly = null)
{
var fileData = LoadEmbeddedResource(path, assembly);
var tex = new Texture2D(2, 2);
tex.LoadImage(fileData);
return tex;
}
private static Sprite LoadEmbeddedSprite(string path, Assembly assembly = null)
{
var tex = LoadEmbeddedTexture(path, assembly);
return Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
}
[HarmonyPostfix, HarmonyPriority(Priority.Last)]
[HarmonyPatch(typeof(VFPreload), "InvokeOnLoadWorkEnded")]
private static void VFPreload_InvokeOnLoadWorkEnded_Postfix()
{
if (_initialized) return;
var pluginfolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
_bundle = AssetBundle.LoadFromFile($"{pluginfolder}/dustbin.assetbundle");
var assembly = Assembly.GetExecutingAssembly();
var signals = LDB._signals;
var index = signals.dataArray.Length;
var p = new SignalProto
@@ -48,7 +73,7 @@ public static class BeltSignal
Name = "DUSTBIN",
GridIndex = 3110,
IconPath = "Assets/signal-410.png",
_iconSprite = _bundle.LoadAsset<Sprite>("Assets/signal-410.png"),
_iconSprite = LoadEmbeddedSprite("assets/icon/signal-410.png", assembly),
SID = ""
};
p.name = p.Name.Translate();

View File

@@ -5,7 +5,7 @@
<TargetFramework>net472</TargetFramework>
<BepInExPluginGuid>org.soardev.dustbin</BepInExPluginGuid>
<Description>DSP MOD - Dustbin</Description>
<Version>1.3.3</Version>
<Version>1.4.0</Version>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion>
<PackageId>Dustbin</PackageId>
@@ -21,6 +21,9 @@
<PackageReference Include="DysonSphereProgram.Modding.NebulaMultiplayerModApi" Version="2.0.0" />
<PackageReference Include="UnityEngine.Modules" Version="2018.4.12" IncludeAssets="compile" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="assets/icon/signal-410.png" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework.TrimEnd(`0123456789`))' == 'net'">
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" PrivateAssets="all" />

View File

@@ -3,36 +3,6 @@
#### Can turn Storages and Tanks into Dustbin(Destroy incoming items)
#### 储物仓和储液罐可以转变为垃圾桶(销毁送进的物品)
## Changelog
* 1.3.3
+ Support for NebulaMultiplayerModApi 2.0.0
* 1.3.2
+ Fix a display issue that the dustbin checkbox is overlapped with the filter button in storage UI.
* 1.3.1
+ Support for game version 0.10.28.20759
* 1.3.0
+ Add a belt signal(you can find it in first tab of signal selection panel) as dustbin, which is the simplest way to destroy items.
+ Reworked dustbin support for Tanks, to improve performance and resolve known bugs.
- Be note that the whole tank logic is optimized which may get a slight better performance even if you don't use them as dustbin.
+ Config entry for soil piless gain from destroyed items are changed to a more flexible format.
+ [Nebula Mupltiplayer Mod](https://dsp.thunderstore.io/package/nebula/NebulaMultiplayerMod/) and bug fixes from [ModFixerOne](https://dsp.thunderstore.io/package/starfi5h/ModFixerOne/) by [starfi5h](https://github.com/starfi5h/).
* 1.2.1
+ Fix dynamic array bug in codes, which causes various bugs and errors.
* 1.2.0
+ Use [DSPModSave](https://dsp.thunderstore.io/package/CommonAPI/DSPModSave/) to save dustbin specified data now, which fixes [#1](https://github.com/soarqin/DSP_Mods/issues/1).
+ Fix issue for storages on multiple planets.
+ Fix issue for multi-level tanks.
+ Add a note in README for known bug on tank.
* 1.1.0
+ Rewrite whole plugin, make a checkbox on UI so that you can turn storages into dustbin by just ticking it.
+ Can turn tank into dustbin now.
## Usage
* A checkbox is added to Storages and Tanks UI, which turns them into dustbins.
@@ -40,36 +10,6 @@
* Can get soil piless from destroyed items, configurable through a json encoded config entry.
+ You can get item ID list [here](https://dsp-wiki.com/Modding:Items_IDs).
## 更新日志
* 1.3.3
+ 支持NebulaMultiplayerModApi 2.0.0
* 1.3.2
+ 修正了储物仓UI中的垃圾桶勾选框与筛选按钮重叠的显示问题
* 1.3.1
+ 支持游戏版本 0.10.28.20759
* 1.3.0
+ 添加了一个传送带信号(可以在信号选择面板的第一个页签中找到)作为垃圾桶,这是目前销毁物品最简单的方法
+ 重写了储液罐的垃圾桶实现以提高性能并解决已知的bug
- 注意:整个储液罐逻辑都被优化了,即使你不把他们作为垃圾桶使用,也可能会获得轻微的性能提升
+ 从销毁的物品中获得沙子的配置已变为更灵活的设置项格式
+ [Nebula Mupltiplayer Mod](https://dsp.thunderstore.io/package/nebula/NebulaMultiplayerMod/)支持和Bug修正来自[starfi5h](https://github.com/starfi5h/)的[ModFixerOne](https://dsp.thunderstore.io/package/starfi5h/ModFixerOne/)
* 1.2.1
+ 修正了代码中的动态数组Bug该Bug可能导致各种问题
* 1.2.0
+ 现在使用[DSPModSave](https://dsp.thunderstore.io/package/CommonAPI/DSPModSave/)来保存垃圾桶的数据,修正了[#1](https://github.com/soarqin/DSP_Mods/issues/1)
+ 修正了多星球上的储物仓问题
+ 修正了多层储液罐的问题
+ 在README中添加了一个已知储液罐Bug的说明
* 1.1.0
+ 重写了整个插件现在可以在仓储类建筑的UI上勾选来将其转变为垃圾桶
+ 现在可以将储液罐转变为垃圾桶
## 使用说明
* 在储物仓和储液罐上增加一个垃圾桶的勾选框。

View File

@@ -183,94 +183,68 @@ public static class TankPatch
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void TankComponentUpdateBelt(ref TankComponent thisTank, int belt, bool isOutput, ref CargoTraffic cargoTraffic, ref TankComponent[] tankPool)
{
switch (isOutput)
if (isOutput)
{
case true when thisTank.outputSwitch:
if (thisTank.outputSwitch)
{
if (thisTank.fluidId <= 0 || thisTank.fluidCount <= 0) return;
var inc = thisTank.fluidInc == 0 ? 0 : thisTank.fluidInc / thisTank.fluidCount;
if (!cargoTraffic.TryInsertItemAtHead(belt, thisTank.fluidId, 1, (byte)inc)) return;
thisTank.fluidCount--;
thisTank.fluidInc -= inc;
return;
}
case false when thisTank.inputSwitch:
}
else
{
if (thisTank.inputSwitch)
{
byte stack;
byte inc;
switch (thisTank.fluidId)
var thisFluidId = thisTank.fluidId;
if (thisTank.fluidCount <= 0)
{
case > 0 when thisTank.fluidCount < thisTank.fluidCapacity && cargoTraffic.TryPickItemAtRear(belt, thisTank.fluidId, null, out stack, out inc) > 0 &&
!thisTank.IsDustbin:
thisTank.fluidCount += stack;
thisTank.fluidInc += inc;
return;
case 0:
{
var count = cargoTraffic.TryPickItemAtRear(belt, 0, ItemProto.fluids, out stack, out inc);
if (count <= 0 || thisTank.IsDustbin) return;
thisTank.fluidId = count;
thisTank.fluidCount += stack;
thisTank.fluidInc += inc;
return;
}
var fluidId = cargoTraffic.TryPickItemAtRear(belt, 0, ItemProto.fluids, out stack, out inc);
if (fluidId <= 0 || thisTank.IsDustbin) return;
thisTank.fluidId = fluidId;
thisTank.fluidCount = stack;
thisTank.fluidInc = inc;
return;
}
if (thisTank.fluidCount < thisTank.fluidCapacity || cargoTraffic.GetItemIdAtRear(belt) != thisTank.fluidId || thisTank.nextTankId <= 0) return;
ref var targetTank = ref tankPool[thisTank.nextTankId];
while (targetTank.fluidCount >= targetTank.fluidCapacity)
if (thisTank.fluidCount < thisTank.fluidCapacity || thisTank.IsDustbin)
{
ref var lastTank = ref tankPool[targetTank.lastTankId];
if (targetTank.fluidId != lastTank.fluidId)
if (cargoTraffic.GetItemIdAtRear(belt) != thisFluidId || thisTank.nextTankId <= 0) return;
if (cargoTraffic.TryPickItemAtRear(belt, thisFluidId, null, out stack, out inc) <= 0 || thisTank.IsDustbin) return;
thisTank.fluidCount += stack;
thisTank.fluidInc += inc;
return;
}
if (thisTank.nextTankId <= 0) return;
ref var targetTank = ref tankPool[thisTank.nextTankId];
while (true)
{
if (targetTank.fluidCount < targetTank.fluidCapacity || targetTank.IsDustbin)
{
if (lastTank.id == thisTank.id || targetTank.fluidCount >= targetTank.fluidCapacity) return;
targetTank = ref lastTank;
if (!targetTank.inputSwitch) return;
var targetFluidId = targetTank.fluidId;
if (targetFluidId != 0 && targetFluidId != thisFluidId) return;
break;
}
if (!targetTank.inputSwitch)
{
if (lastTank.id == thisTank.id || targetTank.fluidCount >= targetTank.fluidCapacity) return;
targetTank = ref lastTank;
break;
}
if (targetTank.nextTankId <= 0)
{
break;
}
if (targetTank.nextTankId <= 0) return;
targetTank = ref tankPool[targetTank.nextTankId];
}
ref var lastTank2 = ref tankPool[targetTank.lastTankId];
if (!targetTank.inputSwitch)
if (cargoTraffic.TryPickItemAtRear(belt, thisFluidId, null, out stack, out inc) <= 0 || targetTank.IsDustbin) return;
if (targetTank.fluidCount <= 0)
{
targetTank = ref lastTank2;
targetTank.fluidId = thisFluidId;
targetTank.fluidCount = stack;
targetTank.fluidInc = inc;
}
else
{
var fluidId = targetTank.fluidId;
if (fluidId != 0 && fluidId != lastTank2.fluidId)
{
if (lastTank2.id == thisTank.id || targetTank.fluidCount >= targetTank.fluidCapacity) return;
targetTank = ref lastTank2;
}
else if (!lastTank2.outputSwitch)
{
return;
}
targetTank.fluidCount += stack;
targetTank.fluidInc += inc;
}
if (cargoTraffic.TryPickItemAtRear(belt, thisTank.fluidId, null, out stack, out inc) <= 0 || targetTank.IsDustbin) return;
if (targetTank.fluidCount == 0)
{
targetTank.fluidId = thisTank.fluidId;
}
targetTank.fluidCount += stack;
targetTank.fluidInc += inc;
return;
}
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "Dustbin",
"version_number": "1.3.3",
"version_number": "1.4.0",
"website_url": "https://github.com/soarqin/DSP_Mods/tree/master/Dustbin",
"description": "Can turn Storages and Tanks into Dustbin(Destroy incoming items) / 储物仓和储液罐可以转变为垃圾桶(销毁送进的物品)",
"dependencies": [