using System.Collections.Generic; namespace Harmony.EntityLootContainerPatches { /*[HarmonyPatch(typeof(EntityLootContainer))] [HarmonyPatch("OnUpdateEntity")] public class OnUpdateEntityPatch { [HarmonyTranspiler] public static IEnumerable OnUpdateEntity(IEnumerable instructions) { var codes = new List(instructions); for (int i = 0; i < codes.Count; i++) { if ((codes[i].opcode == OpCodes.Ldarg_0) && (codes[i+2].opcode == OpCodes.Ldc_I4_1)) { codes[i+2].opcode = OpCodes.Ldc_I4_0; break; } } return codes; } }*/ [HarmonyPatch(typeof(EntityLootContainer))] [HarmonyPatch("OnUpdateEntity")] public class OnUpdateEntityPatch { public static bool Prefix(EntityLootContainer __instance) { Log.Out("EntityLootContainerPatches-OnUpdateEntity START"); bool isInWater = __instance.isInWater; if (!__instance.isEntityStatic()) __instance.TickInWater(); if (__instance.isEntityRemote) return false; if (__instance.isInWater) { if (!isInWater && !__instance.firstUpdate && (double)__instance.fallDistance > 1.0) __instance.PlayOneShot("waterfallinginto"); __instance.fallDistance = 0.0f; } if (!__instance.RootMotion && !__instance.IsDead() && __instance.CanBePushed()) { List entitiesInBounds = __instance.world.GetEntitiesInBounds(__instance, BoundsUtils.ExpandBounds(__instance.boundingBox, 0.2f, __instance.GetPushBoundsVertical(), 0.2f)); if (entitiesInBounds != null && entitiesInBounds.Count > 0) { for (int index = 0; index < entitiesInBounds.Count; ++index) __instance.OnPushEntity(entitiesInBounds[index]); } } __instance.firstUpdate = false; if (!__instance.bMeshCreated) __instance.createMesh(); if (__instance.itemWorldData != null) __instance.itemClass.OnDroppedUpdate(__instance.itemWorldData); if ((double)Utils.FastAbs(__instance.position.y - __instance.prevPos.y) < 0.10000000149011612) { ++__instance.onGroundCounter; if (__instance.onGroundCounter > 10) __instance.onGround = true; } if (__instance.isPhysicsMaster && !SingletonMonoBehaviour.Instance.IsServer && (__instance.ticksExisted & 1) != 0) __instance.PhysicsMasterSendToServer(__instance.transform); __instance.checkGravitySetting(__instance.isPhysicsMaster); if (__instance.isEntityRemote) return false; if (!(bool)(UnityEngine.Object)__instance.itemTransform) __instance.lifetime = 0.0f; __instance.lifetime -= 0.05f; if ((double)__instance.lifetime <= 0.0) __instance.SetDead(); if (__instance.itemClass != null && __instance.itemClass.IsEatDistraction && __instance.distractionLifetime > 0 && __instance.distractionEatTicks <= 0) __instance.SetDead(); if ((double)__instance.transform.position.y + (double)Origin.position.y < 0.0) __instance.SetDead(); if (__instance.IsDead()) return false; __instance.tickDistraction(); if (__instance.lootContainer != null && __instance.deathUpdateTime > 0) { bool flag = GameManager.Instance.GetEntityIDForLockedTileEntity((TileEntity)__instance.lootContainer) != -1; if (!__instance.bRemoved && !__instance.lootContainer.IsUserAccessing() && !flag && (__instance.lootContainer.bTouched && __instance.lootContainer.IsEmpty() || __instance.deathUpdateTime >= __instance.timeStayAfterDeath - 1)) __instance.removeBackpack(); } ++__instance.deathUpdateTime; if (__instance.world.IsRemote() || !__instance.forceInventoryCreate && __instance.lootContainer != null) return false; __instance.lootContainer = new TileEntityLootContainer((Chunk)null); __instance.lootContainer.bTouched = false; __instance.lootContainer.entityId = __instance.entityId; __instance.lootContainer.lootListName = __instance.GetLootList(); __instance.lootContainer.SetContainerSize(LootContainer.GetLootContainer(__instance.lootContainer.lootListName).size, true); if (__instance.isInventory != null) { __instance.lootContainer.bTouched = false; Log.Out("EntityLootContainerPatches-OnUpdateEntity CREATING IVENTORY"); for (int index = 0; index < __instance.isInventory.Length; ++index) { if (!__instance.isInventory[index].IsEmpty()) __instance.lootContainer.AddItem(__instance.isInventory[index]); } } __instance.lootContainer.SetModified(); __instance.forceInventoryCreate = false; return false; } } }