mirror of
https://github.com/soarqin/DSP_Mods.git
synced 2025-12-09 14:53:30 +08:00
Dustbin WIP
This commit is contained in:
@@ -95,7 +95,7 @@ public class Dustbin : BaseUnityPlugin, IModCanSave, IMultiplayerMod
|
|||||||
{
|
{
|
||||||
var storage = storagePool[i];
|
var storage = storagePool[i];
|
||||||
if (storage == null || storage.id != i) continue;
|
if (storage == null || storage.id != i) continue;
|
||||||
if ((bool)StoragePatch.IsDustbinField.GetValue(storage))
|
if (storage.IsDustbin)
|
||||||
storageIds.Add(i);
|
storageIds.Add(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +104,7 @@ public class Dustbin : BaseUnityPlugin, IModCanSave, IMultiplayerMod
|
|||||||
{
|
{
|
||||||
ref var tank = ref tankPool[i];
|
ref var tank = ref tankPool[i];
|
||||||
if (tank.id != i) continue;
|
if (tank.id != i) continue;
|
||||||
if ((bool)TankPatch.IsDustbinField.GetValue(tank))
|
if (tank.IsDustbin)
|
||||||
tankIds.Add(i);
|
tankIds.Add(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,13 +136,13 @@ public class Dustbin : BaseUnityPlugin, IModCanSave, IMultiplayerMod
|
|||||||
{
|
{
|
||||||
var storage = storagePool[i];
|
var storage = storagePool[i];
|
||||||
if (storage == null || storage.id != i) continue;
|
if (storage == null || storage.id != i) continue;
|
||||||
StoragePatch.IsDustbinField.SetValue(storage, false);
|
storage.IsDustbin = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var i = 0; i < count; i++)
|
for (var i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
var id = r.ReadInt32();
|
var id = r.ReadInt32();
|
||||||
StoragePatch.IsDustbinField.SetValue(storagePool[id], true);
|
storagePool[id].IsDustbin = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
count = r.ReadInt32();
|
count = r.ReadInt32();
|
||||||
@@ -152,13 +152,16 @@ public class Dustbin : BaseUnityPlugin, IModCanSave, IMultiplayerMod
|
|||||||
{
|
{
|
||||||
ref var tank = ref tankPool[i];
|
ref var tank = ref tankPool[i];
|
||||||
if (tank.id != i) continue;
|
if (tank.id != i) continue;
|
||||||
StoragePatch.IsDustbinField.SetValueDirect(__makeref(tank), false);
|
tank.IsDustbin = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var i = 0; i < count; i++)
|
for (var i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
var id = r.ReadInt32();
|
var id = r.ReadInt32();
|
||||||
StoragePatch.IsDustbinField.SetValueDirect(__makeref(tankPool[id]), true);
|
if (id >= cursor) continue;
|
||||||
|
ref var tank = ref tankPool[id];
|
||||||
|
if (tank.id != id) continue;
|
||||||
|
tank.IsDustbin = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,16 @@
|
|||||||
<ItemGroup Condition="'$(TargetFramework.TrimEnd(`0123456789`))' == 'net'">
|
<ItemGroup Condition="'$(TargetFramework.TrimEnd(`0123456789`))' == 'net'">
|
||||||
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" PrivateAssets="all" />
|
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" PrivateAssets="all" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="assemblies\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Assembly-CSharp">
|
||||||
|
<HintPath>assemblies\Assembly-CSharp.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||||
<Exec Command="del /F /Q package\$(ProjectName)-$(Version).zip
IF NOT EXIST package\plugins (mkdir package\plugins)
copy /y $(TargetPath) package\plugins\
zip -9 -j package/$(ProjectName)-$(Version).zip package/icon.png package/manifest.json README.md
cd package
zip -9 -r $(ProjectName)-$(Version).zip patchers plugins" />
|
<Exec Command="del /F /Q package\$(ProjectName)-$(Version).zip
IF NOT EXIST package\plugins (mkdir package\plugins)
copy /y $(TargetPath) package\plugins\
zip -9 -j package/$(ProjectName)-$(Version).zip package/icon.png package/manifest.json README.md
cd package
zip -9 -r $(ProjectName)-$(Version).zip patchers plugins" />
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ namespace Dustbin.NebulaSupport
|
|||||||
{
|
{
|
||||||
public class SyncPlanetData
|
public class SyncPlanetData
|
||||||
{
|
{
|
||||||
public byte[] Data { get; set; }
|
public byte[] Data { get; }
|
||||||
|
|
||||||
public SyncPlanetData()
|
public SyncPlanetData()
|
||||||
{
|
{
|
||||||
@@ -20,9 +20,9 @@ namespace Dustbin.NebulaSupport
|
|||||||
|
|
||||||
public class ToggleEvent
|
public class ToggleEvent
|
||||||
{
|
{
|
||||||
public int PlanetId { get; set; }
|
public int PlanetId { get; }
|
||||||
public int StorageId { get; set; }
|
public int StorageId { get; }
|
||||||
public bool Enable { get; set; }
|
public bool Enable { get; }
|
||||||
|
|
||||||
public ToggleEvent()
|
public ToggleEvent()
|
||||||
{
|
{
|
||||||
@@ -61,13 +61,13 @@ namespace Dustbin.NebulaSupport
|
|||||||
case < 0:
|
case < 0:
|
||||||
{
|
{
|
||||||
var tankPool = factory.factoryStorage.tankPool;
|
var tankPool = factory.factoryStorage.tankPool;
|
||||||
TankPatch.IsDustbinField.SetValue(tankPool[-storageId], packet.Enable);
|
tankPool[-storageId].IsDustbin = packet.Enable;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
var storagePool = factory.factoryStorage.storagePool;
|
var storagePool = factory.factoryStorage.storagePool;
|
||||||
StoragePatch.IsDustbinField.SetValue(storagePool[storageId], packet.Enable);
|
storagePool[storageId].IsDustbin = packet.Enable;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,7 @@
|
|||||||
#### Can turn Storages and Tanks into Dustbin(Destroy incoming items)
|
#### Can turn Storages and Tanks into Dustbin(Destroy incoming items)
|
||||||
#### 储物仓和储液罐可以转变为垃圾桶(销毁送进的物品)
|
#### 储物仓和储液罐可以转变为垃圾桶(销毁送进的物品)
|
||||||
|
|
||||||
## Updates
|
## Changelog
|
||||||
|
|
||||||
* 1.3.0
|
* 1.3.0
|
||||||
* Reworked dustbin support for Tanks, to improve performance and resolve known bugs.
|
* Reworked dustbin support for Tanks, to improve performance and resolve known bugs.
|
||||||
* Support for [Nebula Mupltiplayer Mod](https://dsp.thunderstore.io/package/nebula/NebulaMultiplayerMod/).
|
* Support for [Nebula Mupltiplayer Mod](https://dsp.thunderstore.io/package/nebula/NebulaMultiplayerMod/).
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
using System.IO;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.IO;
|
||||||
|
using System.Reflection.Emit;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
using NebulaAPI;
|
using NebulaAPI;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
@@ -9,7 +11,6 @@ namespace Dustbin;
|
|||||||
[HarmonyPatch]
|
[HarmonyPatch]
|
||||||
public static class StoragePatch
|
public static class StoragePatch
|
||||||
{
|
{
|
||||||
public static readonly FieldInfo IsDustbinField = AccessTools.Field(typeof(StorageComponent), "IsDustbin");
|
|
||||||
private static UI.MyCheckBox _storageDustbinCheckBox;
|
private static UI.MyCheckBox _storageDustbinCheckBox;
|
||||||
private static int _lastStorageId;
|
private static int _lastStorageId;
|
||||||
|
|
||||||
@@ -35,7 +36,7 @@ public static class StoragePatch
|
|||||||
for (var j = 1; j < cursor; j++)
|
for (var j = 1; j < cursor; j++)
|
||||||
{
|
{
|
||||||
if (storagePool[j] == null || storagePool[j].id != j) continue;
|
if (storagePool[j] == null || storagePool[j].id != j) continue;
|
||||||
if (!(bool)IsDustbinField.GetValue(storagePool[j])) continue;
|
if (!storagePool[j].IsDustbin) continue;
|
||||||
tempWriter.Write(j);
|
tempWriter.Write(j);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
@@ -75,7 +76,7 @@ public static class StoragePatch
|
|||||||
var id = r.ReadInt32();
|
var id = r.ReadInt32();
|
||||||
if (id > 0 && id < storagePool.Length && storagePool[id] != null && storagePool[id].id == id)
|
if (id > 0 && id < storagePool.Length && storagePool[id] != null && storagePool[id].id == id)
|
||||||
{
|
{
|
||||||
IsDustbinField.SetValue(storagePool[id], true);
|
storagePool[id].IsDustbin = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -94,7 +95,7 @@ public static class StoragePatch
|
|||||||
var storagePool = window.factoryStorage.storagePool;
|
var storagePool = window.factoryStorage.storagePool;
|
||||||
if (storagePool[storageId].id != storageId) return;
|
if (storagePool[storageId].id != storageId) return;
|
||||||
var enabled = _storageDustbinCheckBox.Checked;
|
var enabled = _storageDustbinCheckBox.Checked;
|
||||||
IsDustbinField.SetValue(storagePool[storageId], enabled);
|
storagePool[storageId].IsDustbin = enabled;
|
||||||
if (!NebulaModAPI.IsMultiplayerActive) return;
|
if (!NebulaModAPI.IsMultiplayerActive) return;
|
||||||
var planetId = window.factory.planetId;
|
var planetId = window.factory.planetId;
|
||||||
NebulaModAPI.MultiplayerSession.Network.SendPacketToLocalStar(new NebulaSupport.Packet.ToggleEvent(planetId, storageId, enabled));
|
NebulaModAPI.MultiplayerSession.Network.SendPacketToLocalStar(new NebulaSupport.Packet.ToggleEvent(planetId, storageId, enabled));
|
||||||
@@ -111,7 +112,7 @@ public static class StoragePatch
|
|||||||
if (storageId <= 0) return;
|
if (storageId <= 0) return;
|
||||||
var storagePool = __instance.factoryStorage.storagePool;
|
var storagePool = __instance.factoryStorage.storagePool;
|
||||||
if (storagePool[storageId].id != storageId) return;
|
if (storagePool[storageId].id != storageId) return;
|
||||||
_storageDustbinCheckBox.Checked = (bool)IsDustbinField.GetValue(storagePool[storageId]);
|
_storageDustbinCheckBox.Checked = storagePool[storageId].IsDustbin;
|
||||||
if (__instance.transform is RectTransform rectTrans)
|
if (__instance.transform is RectTransform rectTrans)
|
||||||
{
|
{
|
||||||
_storageDustbinCheckBox.rectTrans.anchoredPosition3D = new Vector3(50, 58 - rectTrans.sizeDelta.y, 0);
|
_storageDustbinCheckBox.rectTrans.anchoredPosition3D = new Vector3(50, 58 - rectTrans.sizeDelta.y, 0);
|
||||||
@@ -127,21 +128,11 @@ public static class StoragePatch
|
|||||||
_lastStorageId = 0; // Refresh UI to reposition button on client side
|
_lastStorageId = 0; // Refresh UI to reposition button on client side
|
||||||
}
|
}
|
||||||
|
|
||||||
[HarmonyPrefix]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
[HarmonyPatch(typeof(StorageComponent), "AddItem",
|
private static int DustbinAddItem(int itemId, int count)
|
||||||
new[] { typeof(int), typeof(int), typeof(int), typeof(int), typeof(bool) },
|
|
||||||
new[]
|
|
||||||
{
|
|
||||||
ArgumentType.Normal, ArgumentType.Normal, ArgumentType.Normal, ArgumentType.Out, ArgumentType.Normal
|
|
||||||
})]
|
|
||||||
private static bool StorageComponent_AddItem_Prefix(ref int __result, StorageComponent __instance, int itemId, int count, int inc,
|
|
||||||
ref int remainInc, bool useBan = false)
|
|
||||||
{
|
{
|
||||||
if (!(bool)IsDustbinField.GetValue(__instance)) return true;
|
|
||||||
remainInc = inc;
|
|
||||||
__result = count;
|
|
||||||
var fluidArr = Dustbin.IsFluid;
|
var fluidArr = Dustbin.IsFluid;
|
||||||
var sandsPerItem = Dustbin.SandsFactors[itemId < fluidArr.Length && fluidArr[itemId]
|
var sandIndex = itemId < fluidArr.Length && fluidArr[itemId]
|
||||||
? 0
|
? 0
|
||||||
: itemId switch
|
: itemId switch
|
||||||
{
|
{
|
||||||
@@ -149,13 +140,36 @@ public static class StoragePatch
|
|||||||
1003 => 3,
|
1003 => 3,
|
||||||
1013 => 4,
|
1013 => 4,
|
||||||
_ => 1,
|
_ => 1,
|
||||||
}];
|
};
|
||||||
if (sandsPerItem <= 0) return false;
|
var sandsPerItem = Dustbin.SandsFactors[sandIndex];
|
||||||
|
if (sandsPerItem <= 0) return count;
|
||||||
var player = GameMain.mainPlayer;
|
var player = GameMain.mainPlayer;
|
||||||
var addCount = count * sandsPerItem;
|
var addCount = count * sandsPerItem;
|
||||||
player.sandCount += addCount;
|
player.sandCount += addCount;
|
||||||
GameMain.history.OnSandCountChange(player.sandCount, addCount);
|
GameMain.history.OnSandCountChange(player.sandCount, addCount);
|
||||||
return false;
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyTranspiler]
|
||||||
|
[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 })]
|
||||||
|
private static IEnumerable<CodeInstruction> StorageComponent_AddItem_HarmonyTranspiler(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
|
||||||
|
{
|
||||||
|
var matcher = new CodeMatcher(instructions, generator);
|
||||||
|
var label1 = generator.DefineLabel();
|
||||||
|
matcher.Start().MatchForward(false,
|
||||||
|
new CodeMatch(OpCodes.Stind_I4)
|
||||||
|
).Advance(1).InsertAndAdvance(
|
||||||
|
new CodeInstruction(OpCodes.Ldarg_0),
|
||||||
|
new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(StorageComponent), nameof(StorageComponent.IsDustbin))),
|
||||||
|
new CodeInstruction(OpCodes.Brfalse, label1),
|
||||||
|
new CodeInstruction(OpCodes.Ldarg_1),
|
||||||
|
new CodeInstruction(OpCodes.Ldarg_2),
|
||||||
|
new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(StoragePatch), nameof(StoragePatch.DustbinAddItem))),
|
||||||
|
new CodeInstruction(OpCodes.Ret)
|
||||||
|
);
|
||||||
|
matcher.Labels.Add(label1);
|
||||||
|
return matcher.InstructionEnumeration();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We keep this to make MOD compatible with older version */
|
/* We keep this to make MOD compatible with older version */
|
||||||
@@ -166,6 +180,6 @@ public static class StoragePatch
|
|||||||
if (__instance.bans >= 0)
|
if (__instance.bans >= 0)
|
||||||
return;
|
return;
|
||||||
__instance.bans = -__instance.bans - 1;
|
__instance.bans = -__instance.bans - 1;
|
||||||
IsDustbinField.SetValue(__instance, true);
|
__instance.IsDustbin = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ namespace Dustbin;
|
|||||||
[HarmonyPatch]
|
[HarmonyPatch]
|
||||||
public static class TankPatch
|
public static class TankPatch
|
||||||
{
|
{
|
||||||
public static readonly FieldInfo IsDustbinField = AccessTools.Field(typeof(TankComponent), "IsDustbin");
|
|
||||||
private static UI.MyCheckBox _tankDustbinCheckBox;
|
private static UI.MyCheckBox _tankDustbinCheckBox;
|
||||||
private static int _lastTankId;
|
private static int _lastTankId;
|
||||||
|
|
||||||
@@ -37,7 +36,7 @@ public static class TankPatch
|
|||||||
for (var j = 1; j < cursor; j++)
|
for (var j = 1; j < cursor; j++)
|
||||||
{
|
{
|
||||||
if (tankPool[j].id != j) continue;
|
if (tankPool[j].id != j) continue;
|
||||||
if (!(bool)IsDustbinField.GetValue(tankPool[j])) continue;
|
if (!tankPool[j].IsDustbin) continue;
|
||||||
tempWriter.Write(j);
|
tempWriter.Write(j);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
@@ -81,7 +80,7 @@ public static class TankPatch
|
|||||||
var id = r.ReadInt32();
|
var id = r.ReadInt32();
|
||||||
if (id > 0 && id < tankPool.Length && tankPool[id].id == id)
|
if (id > 0 && id < tankPool.Length && tankPool[id].id == id)
|
||||||
{
|
{
|
||||||
IsDustbinField.SetValueDirect(__makeref(tankPool[id]), true);
|
tankPool[id].IsDustbin = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,7 +99,7 @@ public static class TankPatch
|
|||||||
var tankPool = window.storage.tankPool;
|
var tankPool = window.storage.tankPool;
|
||||||
if (tankPool[tankId].id != tankId) return;
|
if (tankPool[tankId].id != tankId) return;
|
||||||
var enabled = _tankDustbinCheckBox.Checked;
|
var enabled = _tankDustbinCheckBox.Checked;
|
||||||
IsDustbinField.SetValueDirect(__makeref(tankPool[tankId]), enabled);
|
tankPool[tankId].IsDustbin = enabled;
|
||||||
if (!NebulaModAPI.IsMultiplayerActive) return;
|
if (!NebulaModAPI.IsMultiplayerActive) return;
|
||||||
var planetId = window.factory.planetId;
|
var planetId = window.factory.planetId;
|
||||||
NebulaModAPI.MultiplayerSession.Network.SendPacketToLocalStar(new NebulaSupport.Packet.ToggleEvent(planetId, -tankId, enabled));
|
NebulaModAPI.MultiplayerSession.Network.SendPacketToLocalStar(new NebulaSupport.Packet.ToggleEvent(planetId, -tankId, enabled));
|
||||||
@@ -117,8 +116,9 @@ public static class TankPatch
|
|||||||
|
|
||||||
if (tankId <= 0) return;
|
if (tankId <= 0) return;
|
||||||
var tankPool = __instance.storage.tankPool;
|
var tankPool = __instance.storage.tankPool;
|
||||||
if (tankPool[tankId].id != tankId) return;
|
ref var tank = ref tankPool[tankId];
|
||||||
_tankDustbinCheckBox.Checked = (bool)IsDustbinField.GetValue(tankPool[tankId]);
|
if (tank.id != tankId) return;
|
||||||
|
_tankDustbinCheckBox.Checked = tank.IsDustbin;
|
||||||
}
|
}
|
||||||
|
|
||||||
[HarmonyPrefix]
|
[HarmonyPrefix]
|
||||||
@@ -181,14 +181,14 @@ public static class TankPatch
|
|||||||
switch (thisTank.fluidId)
|
switch (thisTank.fluidId)
|
||||||
{
|
{
|
||||||
case > 0 when thisTank.fluidCount < thisTank.fluidCapacity && cargoTraffic.TryPickItemAtRear(belt, thisTank.fluidId, null, out stack, out inc) > 0 &&
|
case > 0 when thisTank.fluidCount < thisTank.fluidCapacity && cargoTraffic.TryPickItemAtRear(belt, thisTank.fluidId, null, out stack, out inc) > 0 &&
|
||||||
!(bool)IsDustbinField.GetValue(thisTank):
|
!thisTank.IsDustbin:
|
||||||
thisTank.fluidCount += stack;
|
thisTank.fluidCount += stack;
|
||||||
thisTank.fluidInc += inc;
|
thisTank.fluidInc += inc;
|
||||||
return;
|
return;
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
var count = cargoTraffic.TryPickItemAtRear(belt, 0, ItemProto.fluids, out stack, out inc);
|
var count = cargoTraffic.TryPickItemAtRear(belt, 0, ItemProto.fluids, out stack, out inc);
|
||||||
if (count <= 0 || (bool)IsDustbinField.GetValue(thisTank)) return;
|
if (count <= 0 || thisTank.IsDustbin) return;
|
||||||
thisTank.fluidId = count;
|
thisTank.fluidId = count;
|
||||||
thisTank.fluidCount += stack;
|
thisTank.fluidCount += stack;
|
||||||
thisTank.fluidInc += inc;
|
thisTank.fluidInc += inc;
|
||||||
@@ -242,7 +242,7 @@ public static class TankPatch
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cargoTraffic.TryPickItemAtRear(belt, thisTank.fluidId, null, out stack, out inc) <= 0 || (bool)IsDustbinField.GetValue(targetTank)) return;
|
if (cargoTraffic.TryPickItemAtRear(belt, thisTank.fluidId, null, out stack, out inc) <= 0 || targetTank.IsDustbin) return;
|
||||||
if (targetTank.fluidCount == 0)
|
if (targetTank.fluidCount == 0)
|
||||||
{
|
{
|
||||||
targetTank.fluidId = thisTank.fluidId;
|
targetTank.fluidId = thisTank.fluidId;
|
||||||
|
|||||||
BIN
Dustbin/assemblies/Assembly-CSharp.dll
Normal file
BIN
Dustbin/assemblies/Assembly-CSharp.dll
Normal file
Binary file not shown.
Reference in New Issue
Block a user