Files
7d2dXG/Mods/zzz_REBIRTH__Utils/Harmony/Harmony_TileEntityLootContainer.cs
Nathaniel Cosford 062dfab2cd Patched
2025-05-30 01:04:40 +09:30

116 lines
5.3 KiB
C#

namespace Harmony.TileEntityLootContainerAdditionRebirth
{
public class TileEntityLootContainerPatches
{
[HarmonyPatch(typeof(TileEntityLootContainer))]
[HarmonyPatch("UpdateTick")]
public class UpdateTickPatch
{
public static bool Prefix(TileEntityLootContainer __instance, World world)
{
if (RebirthVariables.customScenario == "purge")
{
return false;
}
return true;
}
}
[HarmonyPatch(typeof(TileEntityLootContainer))]
[HarmonyPatch("write")]
public class WritePatch
{
public static bool Prefix(TileEntityLootContainer __instance, PooledBinaryWriter stream, TileEntity.StreamModeWrite _eStreamMode)
{
if (__instance.lootListName == "traderNPC")
{
if (!SingletonMonoBehaviour<ConnectionManager>.Instance.IsServer)
{
//Log.Out("TileEntityLootContainerPatches-write __instance.EntityId: " + __instance.EntityId);
SingletonMonoBehaviour<ConnectionManager>.Instance.SendToServer(NetPackageManager.GetPackage<NetPackageEntityLootContainerWriteRebirth>().Setup(__instance.EntityId, __instance.items), false);
}
}
return true;
}
}
[HarmonyPatch(typeof(TileEntityLootContainer))]
[HarmonyPatch("read")]
public class ReadPatch
{
public static bool Prefix(TileEntityLootContainer __instance, PooledBinaryReader _br, TileEntity.StreamModeRead _eStreamMode)
{
if (_eStreamMode == TileEntity.StreamModeRead.Persistency)
{
__instance.readVersion = (int)_br.ReadUInt16();
__instance.localChunkPos = StreamUtils.ReadVector3i((BinaryReader)_br);
__instance.entityId = _br.ReadInt32();
if (__instance.readVersion <= 1)
return false;
__instance.heapMapUpdateTime = _br.ReadUInt64();
__instance.heapMapLastTime = __instance.heapMapUpdateTime - AIDirector.GetActivityWorldTimeDelay();
}
else
{
__instance.localChunkPos = StreamUtils.ReadVector3i((BinaryReader)_br);
__instance.entityId = _br.ReadInt32();
}
if (_eStreamMode == TileEntity.StreamModeRead.Persistency && __instance.readVersion <= 8)
throw new Exception("Outdated loot data");
if (_br.ReadBoolean())
__instance.lootListName = _br.ReadString();
__instance.containerSize = new Vector2i();
__instance.containerSize.x = (int)_br.ReadUInt16();
__instance.containerSize.y = (int)_br.ReadUInt16();
__instance.bTouched = _br.ReadBoolean();
__instance.worldTimeTouched = (ulong)_br.ReadUInt32();
__instance.bPlayerBackpack = _br.ReadBoolean();
int num = Math.Min((int)_br.ReadInt16(), __instance.containerSize.x * __instance.containerSize.y);
if (__instance.bUserAccessing)
{
ItemStack itemStack = ItemStack.Empty.Clone();
if (_eStreamMode == TileEntity.StreamModeRead.Persistency && __instance.readVersion < 3)
{
for (int index = 0; index < num; ++index)
itemStack.ReadOld((BinaryReader)_br);
}
else
{
for (int index = 0; index < num; ++index)
itemStack.Read((BinaryReader)_br);
}
}
else
{
if (__instance.containerSize.x * __instance.containerSize.y != __instance.items.Length)
__instance.items = ItemStack.CreateArray(__instance.containerSize.x * __instance.containerSize.y);
if (_eStreamMode == TileEntity.StreamModeRead.Persistency && __instance.readVersion < 3)
{
for (int index = 0; index < num; ++index)
{
__instance.items[index].Clear();
__instance.items[index].ReadOld((BinaryReader)_br);
}
}
else
{
for (int index = 0; index < num; ++index)
{
__instance.items[index].Clear();
__instance.items[index].Read((BinaryReader)_br);
}
}
}
__instance.bPlayerStorage = _br.ReadBoolean();
if (_eStreamMode == TileEntity.StreamModeRead.Persistency && __instance.readVersion <= 9 || !_br.ReadBoolean())
return false;
__instance.preferences = new PreferenceTracker(-1);
__instance.preferences.Read(_br);
return false;
}
}
}
}