using Audio; using Platform; namespace Harmony.XUiC_LootWindowGroupPatches { [HarmonyPatch(typeof(XUiC_LootWindowGroup))] [HarmonyPatch("Update")] public class UpdatePatch { public static bool Prefix(XUiC_LootWindowGroup __instance, float _dt ) { //Log.Out("XUiC_LootWindowGroupPatches-Update __instance.xui.playerUI.entityPlayer != null: " + (__instance.xui.playerUI.entityPlayer != null)); //Log.Out("XUiC_LootWindowGroupPatches-Update __instance.xui.playerUI.entityPlayer.hasBeenAttackedTime: " + __instance.xui.playerUI.entityPlayer.hasBeenAttackedTime); //Log.Out("XUiC_LootWindowGroupPatches-Update __instance.isOpening: " + __instance.isOpening); if (__instance.viewComponent != null && __instance.windowGroup != null && __instance.windowGroup.isShowing && __instance.viewComponent.IsVisible) __instance.viewComponent.Update(_dt); if (__instance.curInputStyle != __instance.lastInputStyle) { PlayerInputManager.InputStyle lastInputStyle = __instance.lastInputStyle; __instance.lastInputStyle = __instance.curInputStyle; __instance.RefreshBindings(); __instance.InputStyleChanged(lastInputStyle, __instance.lastInputStyle); } for (int index = 0; index < __instance.children.Count; ++index) { XUiController child = __instance.children[index]; if (!child.IsDormant) child.Update(_dt); } if (__instance.xui.playerUI.entityPlayer != null && __instance.xui.playerUI.entityPlayer.hasBeenAttackedTime > 0 && __instance.isOpening) { //Log.Out("XUiC_LootWindowGroupPatches-Update 1"); GUIWindowManager windowManager = __instance.xui.playerUI.windowManager; windowManager.Close("timer"); __instance.isOpening = false; __instance.isClosingFromDamage = true; windowManager.Close("looting"); } else { //Log.Out("XUiC_LootWindowGroupPatches-Update 2"); if (!__instance.isOpening) { //Log.Out("XUiC_LootWindowGroupPatches-Update 3"); return false; } Entity entity = GameManager.Instance.World.GetEntity(__instance.te.EntityId); EntitySupplyCrate supplyCrate = null; bool forceTimer = false; bool isSupplyCrate = false; if (entity != null && entity is EntitySupplyCrate) { supplyCrate = (EntitySupplyCrate)entity; if (supplyCrate != null) { isSupplyCrate = true; //Log.Out("XUiC_LootWindowGroupPatches-Update IS SUPPLY CRATE"); if (supplyCrate.Buffs.GetCustomVar("$WasOpened") == 0f) { forceTimer = true; } } } if (((__instance.te.bWasTouched && !forceTimer) || (double)__instance.openTimeLeft <= 0.0)) { //Log.Out("XUiC_LootWindowGroupPatches-Update 4 __instance.te.lootListName: " + __instance.te.lootListName); //Log.Out("XUiC_LootWindowGroupPatches-Update 4 __instance.te.bWasTouched: " + __instance.te.bWasTouched); //Log.Out("XUiC_LootWindowGroupPatches-Update 4 __instance.openTimeLeft: " + __instance.openTimeLeft); if (!__instance.te.bWasTouched && !__instance.te.bPlayerStorage && !__instance.te.bPlayerBackpack) { //Log.Out("XUiC_LootWindowGroupPatches-Update 5"); __instance.xui.playerUI.entityPlayer.Progression.AddLevelExp(__instance.xui.playerUI.entityPlayer.gameStage, "_xpFromLoot", Progression.XPTypes.Looting); } __instance.openTimeLeft = 0.0f; __instance.te.bWasTouched = true; if (isSupplyCrate && supplyCrate != null) { supplyCrate.Buffs.SetCustomVar("$WasOpened", 1f); } __instance.OpenContainer(); } else { //Log.Out("XUiC_LootWindowGroupPatches-Update 4 __instance.te.lootListName: " + __instance.te.lootListName); //Log.Out("XUiC_LootWindowGroupPatches-Update 4 __instance.te.bWasTouched: " + __instance.te.bWasTouched); //Log.Out("XUiC_LootWindowGroupPatches-Update 4 __instance.openTimeLeft: " + __instance.openTimeLeft); //Log.Out("XUiC_LootWindowGroupPatches-Update 6"); if (__instance.timerWindow != null) { //Log.Out("XUiC_LootWindowGroupPatches-Update 7"); __instance.timerWindow.UpdateTimer(__instance.openTimeLeft, __instance.openTimeLeft / __instance.totalOpenTime); } __instance.openTimeLeft -= _dt; } } //Log.Out("XUiC_LootWindowGroupPatches-Update END"); return false; } } [HarmonyPatch(typeof(XUiC_LootWindowGroup))] [HarmonyPatch("OnOpen")] public class OnOpenPatch { public static bool Prefix(XUiC_LootWindowGroup __instance ) { //Log.Out("XUiC_LootWindowGroupPatches-OnOpen START"); __instance.isClosingFromDamage = false; if (__instance.te.EntityId != -1) { //Log.Out("XUiC_LootWindowGroupPatches-OnOpen 1"); if ((double)EffectManager.GetValue(PassiveEffects.DisableLoot, _entity: (EntityAlive)__instance.xui.playerUI.entityPlayer, tags: GameManager.Instance.World.GetEntity(__instance.te.EntityId).EntityClass.Tags) > 0.0) { //Log.Out("XUiC_LootWindowGroupPatches-OnOpen 2"); Manager.PlayInsidePlayerHead("twitch_no_attack"); GUIWindowManager windowManager = __instance.xui.playerUI.windowManager; __instance.ignoreCloseSound = true; windowManager.Close("timer"); __instance.isOpening = false; __instance.isClosingFromDamage = true; windowManager.Close("looting"); return false; } } else if ((double)EffectManager.GetValue(PassiveEffects.DisableLoot, _entity: (EntityAlive)__instance.xui.playerUI.entityPlayer, tags: __instance.te.blockValue.Block.Tags) > 0.0) { //Log.Out("XUiC_LootWindowGroupPatches-OnOpen 3"); Manager.PlayInsidePlayerHead("twitch_no_attack"); GUIWindowManager windowManager = __instance.xui.playerUI.windowManager; __instance.ignoreCloseSound = true; windowManager.Close("timer"); __instance.isOpening = false; __instance.isClosingFromDamage = true; windowManager.Close("looting"); return false; } __instance.ignoreCloseSound = false; __instance.xui.playerUI.windowManager.CloseIfOpen("backpack"); __instance.lootWindow.ViewComponent.UiTransform.gameObject.SetActive(false); EntityPlayer entityPlayer = (EntityPlayer)__instance.xui.playerUI.entityPlayer; float openTime = LootContainer.GetLootContainer(__instance.te.lootListName).openTime; __instance.totalOpenTime = __instance.openTimeLeft = EffectManager.GetValue(PassiveEffects.ScavengingTime, _originalValue: entityPlayer.IsCrouching ? openTime * 1.5f : openTime, _entity: (EntityAlive)entityPlayer); //Log.Out("XUiC_LootWindowGroupPatches-OnOpen openTime: " + openTime); //Log.Out("XUiC_LootWindowGroupPatches-OnOpen BEFORE __instance.totalOpenTime: " + __instance.totalOpenTime); //Log.Out("XUiC_LootWindowGroupPatches-OnOpen __instance.openTimeLeft: " + __instance.openTimeLeft); bool optionProtectCrate = RebirthVariables.customProtectCrate; //Log.Out("XUiC_LootWindowGroupPatches-OnOpen optionProtectCrate: " + optionProtectCrate); //Log.Out("XUiC_LootWindowGroupPatches-OnOpen __instance.te.lootListName.ToLower(): " + __instance.te.lootListName.ToLower()); if (optionProtectCrate && __instance.te.lootListName.ToLower().Contains("airdrop")) { //Log.Out("XUiC_LootWindowGroupPatches-OnOpen AIR DROP"); __instance.totalOpenTime = RebirthVariables.supplyCrateOpenTime; __instance.openTimeLeft = RebirthVariables.supplyCrateOpenTime; } //Log.Out("XUiC_LootWindowGroupPatches-OnOpen AFTER __instance.totalOpenTime: " + __instance.totalOpenTime); if (__instance.nonPagingHeaderWindow != null) __instance.nonPagingHeaderWindow.SetHeader("LOOTING"); __instance.xui.playerUI.windowManager.OpenIfNotOpen("CalloutGroup", false); __instance.xui.playerUI.windowManager.Open("timer", false); __instance.timerWindow = __instance.xui.GetChildByType(); __instance.timerWindow.currentOpenEventText = Localization.Get("xuiOpeningLoot"); __instance.isOpening = true; LootContainer lootContainer = LootContainer.GetLootContainer(__instance.te.lootListName); if (lootContainer == null || lootContainer.soundClose == null) { //Log.Out("XUiC_LootWindowGroupPatches-OnOpen 4"); return false; } Vector3 position = __instance.te.ToWorldPos().ToVector3() + Vector3.one * 0.5f; if (__instance.te.EntityId != -1 && GameManager.Instance.World != null) { //Log.Out("XUiC_LootWindowGroupPatches-OnOpen 5"); Entity entity = GameManager.Instance.World.GetEntity(__instance.te.EntityId); if (entity != null) position = entity.GetPosition(); } Manager.BroadcastPlayByLocalPlayer(position, lootContainer.soundOpen); return false; } } }