From 2891b6ad51bf30148cc2d50159bc3e9a645bd597 Mon Sep 17 00:00:00 2001 From: Erica Marigold Date: Tue, 21 May 2024 16:50:00 +0530 Subject: [PATCH] feat: elytra unequip when locked but equipped * Made the elytra get removed from the chestplate slot when it is locked, prevents user for dragging it into their chestplate when locked too * Renamed config.Util to config.ConfigUtil * Added placeholder locked & unlocked elytra textures to resources --- .../xyz/devcomp/elytralock/ElytraLock.java | 11 ++++-- .../config/{Util.java => ConfigUtil.java} | 2 +- .../elytralock/events/ClientTickEndEvent.java | 10 ------ .../events/ClientTickEndHandler.java | 34 ++++++++++++++++++ .../integrations/ModMenuIntegration.java | 4 +-- .../elytra-lock/textures/gui/locked.png | Bin 0 -> 2903 bytes .../elytra-lock/textures/gui/unlocked.png | Bin 0 -> 2903 bytes 7 files changed, 45 insertions(+), 16 deletions(-) rename src/main/java/xyz/devcomp/elytralock/config/{Util.java => ConfigUtil.java} (88%) delete mode 100644 src/main/java/xyz/devcomp/elytralock/events/ClientTickEndEvent.java create mode 100644 src/main/java/xyz/devcomp/elytralock/events/ClientTickEndHandler.java create mode 100644 src/main/resources/assets/elytra-lock/textures/gui/locked.png create mode 100644 src/main/resources/assets/elytra-lock/textures/gui/unlocked.png diff --git a/src/main/java/xyz/devcomp/elytralock/ElytraLock.java b/src/main/java/xyz/devcomp/elytralock/ElytraLock.java index e8eab6e..3be9cd0 100644 --- a/src/main/java/xyz/devcomp/elytralock/ElytraLock.java +++ b/src/main/java/xyz/devcomp/elytralock/ElytraLock.java @@ -1,7 +1,8 @@ package xyz.devcomp.elytralock; import xyz.devcomp.elytralock.config.ConfigHandler; -import xyz.devcomp.elytralock.config.Util; +import xyz.devcomp.elytralock.config.ConfigUtil; +import xyz.devcomp.elytralock.events.ClientTickEndHandler; import xyz.devcomp.elytralock.events.HudRenderHandler; import org.lwjgl.glfw.GLFW; @@ -10,6 +11,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.fabricmc.loader.api.FabricLoader; @@ -27,7 +29,7 @@ public class ElytraLock implements ClientModInitializer { @Override public void onInitializeClient() { - LOGGER.info("Elytra lock initializing!"); + LOGGER.info("ElytraLock initializing!"); lockKeybind = KeyBindingHelper.registerKeyBinding( new KeyBinding("key.elytralock.lock", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_J, "category.elytralock")); @@ -35,7 +37,7 @@ public class ElytraLock implements ClientModInitializer { client = MinecraftClient.getInstance(); - if (Util.isYaclLoaded()) { + if (ConfigUtil.isYaclLoaded()) { LOGGER.info("YACL_v3 is loaded, loading elytra toggle"); locked = new ConfigHandler().getInstance().toggle; } else { @@ -43,6 +45,9 @@ public class ElytraLock implements ClientModInitializer { } HudRenderCallback.EVENT.register(new HudRenderHandler()); + ClientTickEvents.END_CLIENT_TICK.register(new ClientTickEndHandler()); + + LOGGER.info("Registered HUD_RENDER & END_CLIENT_TICK events successfully!"); } public static boolean isLocked() { diff --git a/src/main/java/xyz/devcomp/elytralock/config/Util.java b/src/main/java/xyz/devcomp/elytralock/config/ConfigUtil.java similarity index 88% rename from src/main/java/xyz/devcomp/elytralock/config/Util.java rename to src/main/java/xyz/devcomp/elytralock/config/ConfigUtil.java index ad5635d..de42b2f 100644 --- a/src/main/java/xyz/devcomp/elytralock/config/Util.java +++ b/src/main/java/xyz/devcomp/elytralock/config/ConfigUtil.java @@ -2,7 +2,7 @@ package xyz.devcomp.elytralock.config; import xyz.devcomp.elytralock.ElytraLock; -public class Util { +public class ConfigUtil { public static boolean isYaclLoaded() { return ElytraLock.LOADER.isModLoaded("yet_another_config_lib_v3"); } diff --git a/src/main/java/xyz/devcomp/elytralock/events/ClientTickEndEvent.java b/src/main/java/xyz/devcomp/elytralock/events/ClientTickEndEvent.java deleted file mode 100644 index 1c23308..0000000 --- a/src/main/java/xyz/devcomp/elytralock/events/ClientTickEndEvent.java +++ /dev/null @@ -1,10 +0,0 @@ -package xyz.devcomp.elytralock.events; - -import net.minecraft.client.MinecraftClient; - -public class ClientTickEndEvent { - public void callbackHandler(MinecraftClient client) { - // Check if guy wearing elytra, if so, then remove - - } -} diff --git a/src/main/java/xyz/devcomp/elytralock/events/ClientTickEndHandler.java b/src/main/java/xyz/devcomp/elytralock/events/ClientTickEndHandler.java new file mode 100644 index 0000000..4c270db --- /dev/null +++ b/src/main/java/xyz/devcomp/elytralock/events/ClientTickEndHandler.java @@ -0,0 +1,34 @@ +package xyz.devcomp.elytralock.events; + +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents.EndTick; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import xyz.devcomp.elytralock.ElytraLock; + +public class ClientTickEndHandler implements EndTick { + public void onEndTick(MinecraftClient client) { + if (client.isWindowFocused() && ElytraLock.isLocked() && client.player != null) { + PlayerInventory inventory = client.player.getInventory(); + + // 0 -> boots + // 1 -> leggings + // 2 -> chestplate + // 3 -> helmet + ItemStack chestArmor = inventory.armor.get(2); + + if (chestArmor.isOf(Items.ELYTRA)) { + ElytraLock.LOGGER.info("Detected player wearing elytra even though it's locked"); + ItemStack elytra = chestArmor.copyAndEmpty(); + int inventorySlot = inventory.getSwappableHotbarSlot(); + + boolean ok = inventory.insertStack(inventorySlot, elytra); + + if (!ok) { + ElytraLock.LOGGER.warn("Failed to remove equipped elytra, which is locked"); + } + } + } + } +} diff --git a/src/main/java/xyz/devcomp/elytralock/integrations/ModMenuIntegration.java b/src/main/java/xyz/devcomp/elytralock/integrations/ModMenuIntegration.java index 2877b5d..12253a4 100644 --- a/src/main/java/xyz/devcomp/elytralock/integrations/ModMenuIntegration.java +++ b/src/main/java/xyz/devcomp/elytralock/integrations/ModMenuIntegration.java @@ -1,7 +1,7 @@ package xyz.devcomp.elytralock.integrations; import xyz.devcomp.elytralock.config.ConfigHandler; -import xyz.devcomp.elytralock.config.Util; +import xyz.devcomp.elytralock.config.ConfigUtil; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; @@ -10,7 +10,7 @@ public class ModMenuIntegration implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { return (parent) -> { - if (!Util.isYaclLoaded()) + if (!ConfigUtil.isYaclLoaded()) return parent; return new ConfigHandler().showGui(parent); }; diff --git a/src/main/resources/assets/elytra-lock/textures/gui/locked.png b/src/main/resources/assets/elytra-lock/textures/gui/locked.png new file mode 100644 index 0000000000000000000000000000000000000000..a821a0cbfc88f3f530d264e8730c26f27920e363 GIT binary patch literal 2903 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 Ti*S2M6U+c3Ju`F-$|dF>NijVr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/elytra-lock/textures/gui/unlocked.png b/src/main/resources/assets/elytra-lock/textures/gui/unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..a821a0cbfc88f3f530d264e8730c26f27920e363 GIT binary patch literal 2903 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 Ti*S2M6U+c3Ju`F-$|dF>NijVr literal 0 HcmV?d00001