From 14b082dd1f248fac37c5ec1e60dd9b173df4f8d9 Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Tue, 17 Sep 2024 23:14:54 +0800 Subject: [PATCH] =?UTF-8?q?2024-09-17=201.=E5=8F=96=E6=B6=88=E4=BA=86?= =?UTF-8?q?=E5=AF=B9LivingEntity=E7=9A=84Mixin=202.=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=8F=A6=E4=B8=80=E4=B8=AA=E8=BF=9B=E5=BA=A6=E6=9D=A1=EF=BC=88?= =?UTF-8?q?=E4=BB=8D=E5=9C=A8=E8=B0=83=E8=AF=95=E9=98=B6=E6=AE=B5=EF=BC=89?= =?UTF-8?q?=203.=E4=BF=AE=E5=A4=8D=E6=8C=87=E4=BB=A4=E4=B8=8A=E7=9A=84?= =?UTF-8?q?=E7=BA=B0=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0aef4464247e697f9a7226f384437b478152c21c | 3 +- .../211976637bfb5e111401ad2bfb58570ef2fb3dff | 4 +- .../a1129211d3ad6d65c101bb152ae8c66c8256bccb | 4 +- .../ed628fd843215c1bf29a07b9cbd1b26a6af0636d | 4 +- .../assets/leashedplayer/lang/en_us.json | 1 + .../assets/leashedplayer/lang/zh_cn.json | 1 + .../assets/leashedplayer/lang/zh_tw.json | 1 + .../leashedplayer/models/item/fabric.json | 6 + .../leashedplayer/ClientEventHandler.java | 1 + .../client/processBar/IProcessBar.java | 55 ++++++ .../client/processBar/TestProcessBar.java | 92 ++++++++++ .../renders/AdaptiveGuiRendererHandler.java | 42 +++++ .../renders/IFadingProcessBarRenderer.java | 83 +++++++++ .../client/renders/IProcessBarRenderer.java | 16 ++ .../client/renders/ProcessBarRenderer.java | 90 ++++++++++ .../renders/TestProcessBarRenderer.java | 161 ++++++++++++++++++ .../content/commands/LeashCommand.java | 3 +- .../content/items/ModItemRegister.java | 5 + .../leashedplayer/content/items/TestItem.java | 48 ++++++ .../LanguageAndOtherData/ModLangKeyValue.java | 1 + .../mixin/both/MixinLivingEntity.java | 67 -------- .../leashedplayer/mixin/both/MixinPlayer.java | 39 ++++- .../leashedplayer/utils/ColorUtil.java | 18 ++ .../textures/gui/progress_bar.png | Bin 0 -> 1101 bytes .../leashedplayer/textures/item/fabric.png | Bin 0 -> 5867 bytes src/main/resources/leashedplayer.mixins.json | 1 - 26 files changed, 668 insertions(+), 78 deletions(-) create mode 100644 src/generated/resources/assets/leashedplayer/models/item/fabric.json create mode 100644 src/main/java/com/r3944realms/leashedplayer/client/processBar/IProcessBar.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/client/processBar/TestProcessBar.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/client/renders/AdaptiveGuiRendererHandler.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/client/renders/IFadingProcessBarRenderer.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/client/renders/IProcessBarRenderer.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/client/renders/ProcessBarRenderer.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/client/renders/TestProcessBarRenderer.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/content/items/TestItem.java delete mode 100644 src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinLivingEntity.java create mode 100644 src/main/java/com/r3944realms/leashedplayer/utils/ColorUtil.java create mode 100644 src/main/resources/assets/leashedplayer/textures/gui/progress_bar.png create mode 100644 src/main/resources/assets/leashedplayer/textures/item/fabric.png diff --git a/src/generated/resources/.cache/0aef4464247e697f9a7226f384437b478152c21c b/src/generated/resources/.cache/0aef4464247e697f9a7226f384437b478152c21c index fa0efec..7deb635 100644 --- a/src/generated/resources/.cache/0aef4464247e697f9a7226f384437b478152c21c +++ b/src/generated/resources/.cache/0aef4464247e697f9a7226f384437b478152c21c @@ -1,6 +1,7 @@ -// 1.21.1 2024-09-07T10:24:45.3887825 Item Models: leashedplayer +// 1.21.1 2024-09-11T16:30:11.5982305 Item Models: leashedplayer 5846df9d85726428905701120ef34c9324c20faf assets/leashedplayer/models/item/bow_lra_pulling_0.json 845a7316b86e26f88c6932d4ef2656126503727a assets/leashedplayer/models/item/bow_lra_pulling_1.json 5bd1f9f28b91005c587f1c38fb77cd19b59495e3 assets/leashedplayer/models/item/bow_lra_pulling_2.json 83946f4d60d0fb1758d6553c36330506c8e48ada assets/leashedplayer/models/item/crossbow_leash_rope_arrow.json +bb0d76077719c83c8a8bd4346a24ea1766175125 assets/leashedplayer/models/item/fabric.json 114d3cc5832ef047403114504483c6f3ea07e77c assets/leashedplayer/models/item/leash_rope_arrow.json diff --git a/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff index d7c910a..90f2f69 100644 --- a/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff +++ b/src/generated/resources/.cache/211976637bfb5e111401ad2bfb58570ef2fb3dff @@ -1,2 +1,2 @@ -// 1.21.1 2024-09-09T15:57:30.9531898 Languages: en_us for mod: leashedplayer -c51f1722b91e85159f4c60282bf43a1c934b151a assets/leashedplayer/lang/en_us.json +// 1.21.1 2024-09-11T16:30:11.6002137 Languages: en_us for mod: leashedplayer +c3d8ea4a7d24b56bd6b701c531aab3132cdc6da9 assets/leashedplayer/lang/en_us.json diff --git a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb index a5e9836..6db57b4 100644 --- a/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb +++ b/src/generated/resources/.cache/a1129211d3ad6d65c101bb152ae8c66c8256bccb @@ -1,2 +1,2 @@ -// 1.21.1 2024-09-09T16:00:58.2714402 Languages: zh_cn for mod: leashedplayer -bd4d6fe17ea35390bf61a642df42cb2e7bc60beb assets/leashedplayer/lang/zh_cn.json +// 1.21.1 2024-09-11T16:30:11.5982305 Languages: zh_cn for mod: leashedplayer +7e38a6c0cc14d7f6f362f97b2a00ca1ab2626c68 assets/leashedplayer/lang/zh_cn.json diff --git a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d index c1ecacf..3956bf4 100644 --- a/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d +++ b/src/generated/resources/.cache/ed628fd843215c1bf29a07b9cbd1b26a6af0636d @@ -1,2 +1,2 @@ -// 1.21.1 2024-09-09T16:00:58.2694396 Languages: zh_tw for mod: leashedplayer -ecf1d6cec85b001be6584c37134a76d5d75e65c0 assets/leashedplayer/lang/zh_tw.json +// 1.21.1 2024-09-11T16:30:11.5962153 Languages: zh_tw for mod: leashedplayer +1b05b79582ac4bce69560b88179dd216490ec0fe assets/leashedplayer/lang/zh_tw.json diff --git a/src/generated/resources/assets/leashedplayer/lang/en_us.json b/src/generated/resources/assets/leashedplayer/lang/en_us.json index ea0b601..84d9dda 100644 --- a/src/generated/resources/assets/leashedplayer/lang/en_us.json +++ b/src/generated/resources/assets/leashedplayer/lang/en_us.json @@ -20,6 +20,7 @@ "gamerule.LP.TeleportWithLeashedPlayers": "Teleport leashed player with player holder", "gamerule.LP.TeleportWithLeashedPlayers.description": "Holder will teleport with their leashed players ", "item.leash_rope_arrow.description": "Arrows with ropes attached?", + "item.leashedplayer.fabric": "Fabric", "item.leashedplayer.leash_rope_arrow": "Leash Rope Arrow", "leashedplayer.command.leash.message.leash.data.clear": "%1$s's LeashData(LeashHolderEntity: %2$s) now is clear", "leashedplayer.command.leash.message.leash.data.clear.leash.clear.failed.no_data": "%1$s has no LeashData can be clear", diff --git a/src/generated/resources/assets/leashedplayer/lang/zh_cn.json b/src/generated/resources/assets/leashedplayer/lang/zh_cn.json index f07be80..ddcad42 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_cn.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_cn.json @@ -20,6 +20,7 @@ "gamerule.LP.TeleportWithLeashedPlayers": "被拴玩家随玩家持有者传送", "gamerule.LP.TeleportWithLeashedPlayers.description": "传送时将被拴玩家与持有者一起传送", "item.leash_rope_arrow.description": "带有拴绳的箭矢?", + "item.leashedplayer.fabric": "Fabric", "item.leashedplayer.leash_rope_arrow": "拴绳箭", "leashedplayer.command.leash.message.leash.data.clear": "%1$s的拴绳数据(拴绳持有者实体:%2$s)现在已清除", "leashedplayer.command.leash.message.leash.data.clear.leash.clear.failed.no_data": "%1$s沒有拴绳数据可清除", diff --git a/src/generated/resources/assets/leashedplayer/lang/zh_tw.json b/src/generated/resources/assets/leashedplayer/lang/zh_tw.json index 7dd489d..bd495d3 100644 --- a/src/generated/resources/assets/leashedplayer/lang/zh_tw.json +++ b/src/generated/resources/assets/leashedplayer/lang/zh_tw.json @@ -20,6 +20,7 @@ "gamerule.LP.TeleportWithLeashedPlayers": "被拴玩家随玩家持有者傳送", "gamerule.LP.TeleportWithLeashedPlayers.description": "將被拴玩家將隨持有者一起傳送", "item.leash_rope_arrow.description": "帶有拴繩的箭矢?", + "item.leashedplayer.fabric": "Fabric", "item.leashedplayer.leash_rope_arrow": "拴繩箭", "leashedplayer.command.leash.message.leash.data.clear": "%1$s的拴繩數據(拴繩持有者實體:%2$s)現在已清除", "leashedplayer.command.leash.message.leash.data.clear.leash.clear.failed.no_data": "%1$s沒有拴繩數據實體可被清除", diff --git a/src/generated/resources/assets/leashedplayer/models/item/fabric.json b/src/generated/resources/assets/leashedplayer/models/item/fabric.json new file mode 100644 index 0000000..89aec97 --- /dev/null +++ b/src/generated/resources/assets/leashedplayer/models/item/fabric.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "leashedplayer:item/fabric" + } +} \ No newline at end of file diff --git a/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java b/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java index c41353e..d52187c 100644 --- a/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java +++ b/src/main/java/com/r3944realms/leashedplayer/ClientEventHandler.java @@ -36,4 +36,5 @@ public class ClientEventHandler { public static void RegisterRenderer(EntityRenderersEvent.RegisterRenderers event) { event.registerEntityRenderer(ModEntityRegister.LEASH_ROPE_ARROW.get(), LeashRopeArrowRenderer::new); } + } diff --git a/src/main/java/com/r3944realms/leashedplayer/client/processBar/IProcessBar.java b/src/main/java/com/r3944realms/leashedplayer/client/processBar/IProcessBar.java new file mode 100644 index 0000000..f79bc00 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/client/processBar/IProcessBar.java @@ -0,0 +1,55 @@ +package com.r3944realms.leashedplayer.client.processBar; + +import java.util.concurrent.CompletableFuture; + +/** + * 进度条 + + */ +public interface IProcessBar { + /** + * + * @return 存活计数 (<=0 则会被清除) + */ + int aliveCount(); + /** + * 维持计数 + */ + void retain(); + void decreaseAliveCount(); + void setRenderStatus(boolean status); + boolean shouldRender(); + int getCurrentProcess(); + int getMaxProcess(); + void setMaxProcess(int maxProcess); + void setProcess(int process); + void resetProcess(); + + /** + * 完成进度条执行的任务,由实现者实现 + */ + void completeTask(); + default void decrease() { + int updateValue = getCurrentProcess() - 1; + if(updateValue < 0) { + setRenderStatus(false); + setProcess(0); + } + else { + setRenderStatus(true); + setProcess(updateValue); + } + } + default void increase() { + int updateValue = getCurrentProcess() + 1; + if(updateValue > getMaxProcess()) { + setRenderStatus(false); + setProcess(getMaxProcess()); + completeTask();//执行任务 + } + else { + setRenderStatus(true); + setProcess(updateValue); + } + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/client/processBar/TestProcessBar.java b/src/main/java/com/r3944realms/leashedplayer/client/processBar/TestProcessBar.java new file mode 100644 index 0000000..a514639 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/client/processBar/TestProcessBar.java @@ -0,0 +1,92 @@ +package com.r3944realms.leashedplayer.client.processBar; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.ChatType; +import net.minecraft.network.chat.Component; + +import java.util.concurrent.CompletableFuture; + +public class TestProcessBar implements IProcessBar { + private int aliveCount = 0; + private boolean isRendering; + private int maxProgress; + private int progress; + public TestProcessBar() { + aliveCount++; + isRendering = false; + maxProgress = 100; + progress = 0; + } + public TestProcessBar(int maxProgress) { + aliveCount++; + isRendering = false; + this.maxProgress = maxProgress; + progress = 0; + } + public TestProcessBar(int maxProgress, int progress) { + aliveCount++; + isRendering = false; + this.maxProgress = maxProgress; + this.progress = progress; + } + + @Override + public int aliveCount() { + return aliveCount; + } + + @Override + public void retain() { + aliveCount++; + } + + @Override + public void decreaseAliveCount() { + aliveCount = aliveCount > 0 ? aliveCount - 1 : 0; + } + + @Override + public void setRenderStatus(boolean status) { + isRendering = status; + } + + @Override + public boolean shouldRender() { + return isRendering; + } + + @Override + public int getCurrentProcess() { + return progress; + } + + @Override + public int getMaxProcess() { + return maxProgress; + } + + @Override + public void setMaxProcess(int maxProcess) { + this.maxProgress = maxProcess; + } + + @Override + public void setProcess(int process) { + this.progress = process < 0 ? 0 : (Math.min(process, maxProgress)); + } + + @Override + public void resetProcess() { + this.progress = 0; + } + + @Override + public void completeTask() { + Runnable runnable = () -> { + if (Minecraft.getInstance().player != null) { + Minecraft.getInstance().getChatListener().handleDisguisedChatMessage(Component.literal("Completed"), ChatType.bind(ChatType.MSG_COMMAND_OUTGOING, Minecraft.getInstance().player)); + } + }; + CompletableFuture.runAsync(runnable); + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/client/renders/AdaptiveGuiRendererHandler.java b/src/main/java/com/r3944realms/leashedplayer/client/renders/AdaptiveGuiRendererHandler.java new file mode 100644 index 0000000..de016f4 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/client/renders/AdaptiveGuiRendererHandler.java @@ -0,0 +1,42 @@ +package com.r3944realms.leashedplayer.client.renders; + +import com.google.common.collect.Maps; +import com.mojang.blaze3d.vertex.PoseStack; +import com.r3944realms.leashedplayer.LeashedPlayer; +import com.r3944realms.leashedplayer.client.processBar.IProcessBar; +import net.minecraft.client.gui.GuiGraphics; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.RenderGuiEvent; + +import java.util.Map; + +@EventBusSubscriber(modid = LeashedPlayer.MOD_ID, value = Dist.CLIENT) +public class AdaptiveGuiRendererHandler { + private static final Map> processBars = Maps.newConcurrentMap(); + public static void addProcessBar(IProcessBar processBar, IProcessBarRenderer renderer) { + processBars.put(processBar, renderer); + } + public static IProcessBarRenderer getProcessBarRenderer(IProcessBar processBar) { + return processBars.get(processBar); + } + + @SubscribeEvent + public static void onRendererLevel(RenderGuiEvent.Pre event) { + PoseStack matrixStack = event.getGuiGraphics().pose(); + GuiGraphics guiGraphics = event.getGuiGraphics(); + processBars.keySet().forEach( + processBar -> { + IProcessBarRenderer renderer = processBars.get(processBar); + if(processBar.shouldRender()) { + renderer.renderProcessBar(matrixStack, guiGraphics); + } else { + if (processBar.aliveCount() <= 0) {//计数为非正时移除 + processBars.remove(processBar); + } + } + } + ); + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/client/renders/IFadingProcessBarRenderer.java b/src/main/java/com/r3944realms/leashedplayer/client/renders/IFadingProcessBarRenderer.java new file mode 100644 index 0000000..bf0b0cd --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/client/renders/IFadingProcessBarRenderer.java @@ -0,0 +1,83 @@ +package com.r3944realms.leashedplayer.client.renders; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.r3944realms.leashedplayer.client.processBar.IProcessBar; +import com.r3944realms.leashedplayer.client.processBar.TestProcessBar; +import net.minecraft.client.gui.GuiGraphics; + +public interface IFadingProcessBarRenderer extends IProcessBarRenderer { + /** + * @return 当前透明度,0.0(完全透明)到 1.0(完全不透明) + */ + float getFadeAlpha(); + void setFadeAlpha(float alpha); + /** + * @return 是否淡入 + */ + boolean isFadingIn(); + void setFadingIn(boolean fadingIn); + /** + * @return 是否淡出 + */ + boolean isFadingOut(); + void setFadingOut(boolean fadingOut); + /** + * @return 淡化速度 + */ + float getFadeRate(); + void setFadeRate(float fadeRate); + /** + * @return 完全淡入/淡出所需时间(秒) + */ + float getFadeDuration(); + void setFadeDuration(float fadeDuration); + /** + * 更新淡化效果 + */ + default void updateFadeEffect() { + float fadeSpeed = getFadeRate() / getFadeDuration(); + if (isFadingIn()) { + fadeInTick(fadeSpeed); + + } else if (isFadingOut()) { + fadeOutTick(fadeSpeed); + if(getFadeAlpha() <= 0.0F){ + if (getProcessBar().getCurrentProcess() != 0 || getProcessBar().getCurrentProcess() != getProcessBar().getMaxProcess()) { + getProcessBar().retain(); + } + stopRender(); + } + } + } + + /** + * Do Not Override, instead of using renderProcessBar0()
+ * 请勿重载,请重载renderProcessBar0()替代 + * @deprecated + */ + @Deprecated + @Override + default void renderProcessBar(PoseStack poseStack, GuiGraphics guiGraphics) { + updateFadeEffect(); + renderProcessBar0(poseStack, guiGraphics); + } + void renderProcessBar0(PoseStack poseStack, GuiGraphics guiGraphics); + + default void fadeInTick(float fadeSpeed) { + if (getFadeAlpha() >= 1.0f) { + setFadingIn(false); + return; + } + setFadeAlpha(Math.min(getFadeAlpha() + fadeSpeed, 1.0f)); + + } + default void fadeOutTick(float fadeSpeed) { + if (getFadeAlpha() >= 1.0f) { + setFadingOut(false); + return; + } + setFadeAlpha(Math.max(getFadeAlpha() - fadeSpeed, 0.0f)); + } + + void setProcessBar(TestProcessBar processBar); +} diff --git a/src/main/java/com/r3944realms/leashedplayer/client/renders/IProcessBarRenderer.java b/src/main/java/com/r3944realms/leashedplayer/client/renders/IProcessBarRenderer.java new file mode 100644 index 0000000..0aa6019 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/client/renders/IProcessBarRenderer.java @@ -0,0 +1,16 @@ +package com.r3944realms.leashedplayer.client.renders; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.r3944realms.leashedplayer.client.processBar.IProcessBar; +import net.minecraft.client.gui.GuiGraphics; + +public interface IProcessBarRenderer { + T getProcessBar(); + void setProcessBar(T processBar); + void renderProcessBar(PoseStack poseStack, GuiGraphics guiGraphics); + default void stopRender() { + T processBar = getProcessBar(); + processBar.decreaseAliveCount(); + processBar.setRenderStatus(false); + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/client/renders/ProcessBarRenderer.java b/src/main/java/com/r3944realms/leashedplayer/client/renders/ProcessBarRenderer.java new file mode 100644 index 0000000..ad9bab7 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/client/renders/ProcessBarRenderer.java @@ -0,0 +1,90 @@ +package com.r3944realms.leashedplayer.client.renders; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.r3944realms.leashedplayer.LeashedPlayer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.entity.player.Player; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.event.RenderGuiEvent; + +@EventBusSubscriber(modid = LeashedPlayer.MOD_ID, value = Dist.CLIENT) +public class ProcessBarRenderer { + + private static boolean isRendering = false; + private static final int progressDuration = 100; + private static int currentProgress = 0; + public static void startRenderingProgressBar(Player player) { + isRendering = true; + currentProgress = 0; + } + public static void stopRenderingProgressBar() { + isRendering = false; + } + @SubscribeEvent + public static void onClientTick(ClientTickEvent.Pre event) { + if (isRendering) { + currentProgress++; + if (currentProgress >= progressDuration) { + stopRenderingProgressBar(); + } + } + } + @SubscribeEvent + public static void onRendererLevel(RenderGuiEvent.Pre event) { + PoseStack matrixStack = event.getGuiGraphics().pose(); + GuiGraphics guiGraphics = event.getGuiGraphics(); + if(isRendering) { + renderProgressBar(matrixStack, guiGraphics); + } + } + public static float getProgress() { + return (float) currentProgress / progressDuration; + } + private static void renderProgressBar(PoseStack matrixStack, GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + int screenWidth = mc.getWindow().getGuiScaledWidth(); + int screenHeight = mc.getWindow().getGuiScaledHeight(); + + // 设置进度条的位置和尺寸 + int barWidth = screenWidth / 4; + int barHeight = 12; + int x = (screenWidth - barWidth) / 2; + int y = screenHeight - 47; + + // 绘制背景(灰色) + guiGraphics.fill(x, y, x + barWidth, y + barHeight, 0xFF555555); + + // 计算当前进度并绘制前景(渐变颜色) + float progress = getProgress(); + int progressWidth = (int) (progress * barWidth); + + // 渐变颜色效果:从红色到绿色 + int color = lerpColor(progress); + guiGraphics.fill(x, y, x + progressWidth, y + barHeight, color); + + // 绘制边框:分别绘制四条边 + int borderColor = 0xFFFFFFFF; // 白色 + guiGraphics.fill(x - 1, y - 1, x + barWidth + 1, y, borderColor); // 顶边 + guiGraphics.fill(x - 1, y + barHeight, x + barWidth + 1, y + barHeight + 1, borderColor); // 底边 + guiGraphics.fill(x - 1, y, x, y + barHeight, borderColor); // 左边 + guiGraphics.fill(x + barWidth, y, x + barWidth + 1, y + barHeight, borderColor); // 右边 + } + + // 渐变颜色计算 + private static int lerpColor(float progress) { + int a = (int) (getAlpha(-65536) * (1 - progress) + getAlpha(-16711936) * progress); + int r = (int) (getRed(-65536) * (1 - progress) + getRed(-16711936) * progress); + int g = (int) (getGreen(-65536) * (1 - progress) + getGreen(-16711936) * progress); + int b = (int) (getBlue(-65536) * (1 - progress) + getBlue(-16711936) * progress); + return (a << 24) | (r << 16) | (g << 8) | b; + } + + private static int getAlpha(int color) { return (color >> 24) & 0xFF; } + private static int getRed(int color) { return (color >> 16) & 0xFF; } + private static int getGreen(int color) { return (color >> 8) & 0xFF; } + private static int getBlue(int color) { return color & 0xFF; } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/client/renders/TestProcessBarRenderer.java b/src/main/java/com/r3944realms/leashedplayer/client/renders/TestProcessBarRenderer.java new file mode 100644 index 0000000..a218f44 --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/client/renders/TestProcessBarRenderer.java @@ -0,0 +1,161 @@ +package com.r3944realms.leashedplayer.client.renders; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.r3944realms.leashedplayer.client.processBar.IProcessBar; +import com.r3944realms.leashedplayer.client.processBar.TestProcessBar; +import com.r3944realms.leashedplayer.utils.ColorUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import org.jetbrains.annotations.Nullable; + +public class TestProcessBarRenderer implements IFadingProcessBarRenderer{ + @Nullable + private TestProcessBar processBar; + private float FadeAlpha; + private boolean fadingIn, fadingOut; + private float FadeRate; + private float FadeDuration; + + public TestProcessBarRenderer(boolean fadingIn, boolean fadingOut, float FadeRate, float FadeDuration){ + this.fadingIn = fadingIn; + this.fadingOut = fadingOut; + this.FadeRate = FadeRate; + this.FadeDuration = FadeDuration; + this.FadeAlpha = 0.0F; + } + + public TestProcessBarRenderer(boolean fadingIn, boolean fadingOut, float FadeRate, float FadeDuration, float FadeAlpha){ + this.fadingIn = fadingIn; + this.fadingOut = fadingOut; + this.FadeRate = FadeRate; + this.FadeDuration = FadeDuration; + this.FadeAlpha = FadeAlpha; + } + + public TestProcessBarRenderer(TestProcessBar bar, boolean fadingIn, boolean fadingOut, float FadeRate, float FadeDuration) { + this(fadingIn, fadingOut, FadeRate, FadeDuration); + setProcessBar(bar); + } + + public TestProcessBarRenderer(TestProcessBar bar, boolean fadingIn, boolean fadingOut, float FadeRate, float FadeDuration, float FadeAlpha) { + this(fadingIn, fadingOut, FadeRate, FadeDuration, FadeAlpha); + setProcessBar(bar); + } + + public TestProcessBarRenderer() { + this(true, false, 0.02f, 10.0f, 0.0f); + } + + public TestProcessBarRenderer(TestProcessBar bar) { + this(true, false, 0.02f, 10.0f); + setProcessBar(bar); + } + + + @Override + public float getFadeAlpha() { + return this.FadeAlpha; + } + + @Override + public void setFadeAlpha(float alpha) { + this.FadeAlpha = alpha; + } + + @Override + public boolean isFadingIn() { + return this.fadingIn; + } + + @Override + public void setFadingIn(boolean fadingIn) { + this.fadingIn = fadingIn; + } + + @Override + public boolean isFadingOut() { + return this.fadingOut; + } + + @Override + public void setFadingOut(boolean fadingOut) { + this.fadingOut = fadingOut; + } + + @Override + public float getFadeRate() { + return this.FadeRate; + } + + @Override + public void setFadeRate(float fadeRate) { + this.FadeRate = fadeRate; + } + + @Override + public float getFadeDuration() { + return this.FadeDuration; + } + + @Override + public void setFadeDuration(float fadeDuration) { + this.FadeDuration = fadeDuration; + } + + @Override + public @Nullable TestProcessBar getProcessBar() { + return this.processBar; + } + + @Override + public void setProcessBar(IProcessBar processBar) { + if(processBar instanceof TestProcessBar pB){ + setProcessBar(pB); + } else throw new UnsupportedOperationException("Not supported Non-TestProcessBar"); + } + + @Override + public void setProcessBar(TestProcessBar processBar) { + this.processBar = processBar; + } + + + + @Override + public void renderProcessBar0(PoseStack poseStack, GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + int screenWidth = mc.getWindow().getGuiScaledWidth(); + int screenHeight = mc.getWindow().getGuiScaledHeight(); + + int elementWidth = 200; + int elementHeight = 12; + int x = (screenWidth - elementWidth) / 2; + int y = screenHeight - elementHeight - 47; // 控制 GUI 元素的位置 + + // 计算透明度 + float progress = 0; + if (getProcessBar() != null) { + progress = (float) getProcessBar().getCurrentProcess() / getProcessBar().getMaxProcess(); + } + int alpha = (int) (FadeAlpha * 255); + int backgroundColor = (alpha << 24) | 0xFF555555; // 背景颜色 + int foregroundColor = (alpha << 24) | ColorUtil.lerpColor(progress);; // 前景颜色 + + // 绘制背景 + guiGraphics.fill(x, y, x + elementWidth, y + elementHeight, backgroundColor); + + // 绘制前景(例如进度条) + + int progressWidth = (int) (progress * elementWidth); + guiGraphics.fill(x, y, x + progressWidth, y + elementHeight, foregroundColor); + + // 绘制边框 + int borderColor = 0xFFFFFFFF; // 白色边框 + guiGraphics.fill(x - 1, y - 1, x + elementWidth + 1, y, borderColor); // 顶边 + guiGraphics.fill(x - 1, y + elementHeight, x + elementWidth + 1, y + elementHeight + 1, borderColor); // 底边 + guiGraphics.fill(x - 1, y, x, y + elementHeight, borderColor); // 左边 + guiGraphics.fill(x + elementWidth, y, x + elementWidth + 1, y + elementHeight, borderColor); // 右边 + + } + +} diff --git a/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java b/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java index 3a023ec..1247206 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/commands/LeashCommand.java @@ -132,10 +132,11 @@ public class LeashCommand { CommandSourceStack source = context.getSource(); float leashLength = context.getArgument("leashLength", Float.class); try { - Collection playerCol = EntityArgument.getPlayers(context, "targetPlayer"); + Collection playerCol = EntityArgument.getPlayers(context, "targetPlayers"); playerCol.forEach(player -> { try { ((ILivingEntityExtension)player).setLeashLength(leashLength); + source.sendSuccess(() -> Component.translatable(LEASH_LENGTH_SET, player.getDisplayName(), leashLength), true); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/src/main/java/com/r3944realms/leashedplayer/content/items/ModItemRegister.java b/src/main/java/com/r3944realms/leashedplayer/content/items/ModItemRegister.java index f3cdb3e..6f63505 100644 --- a/src/main/java/com/r3944realms/leashedplayer/content/items/ModItemRegister.java +++ b/src/main/java/com/r3944realms/leashedplayer/content/items/ModItemRegister.java @@ -17,6 +17,11 @@ public class ModItemRegister { public static final Supplier LEASH_ROPE_ARROW = ModItemRegister.register("leash_rope_arrow", () -> new LeashRopeArrowItem(new Item.Properties().stacksTo(16)) ); + + public static final Supplier FABRIC = ModItemRegister.register("fabric", + () -> new TestItem(new Item.Properties().stacksTo(1)) + ); + public static Supplier register(String name, Supplier supplier) { return register(name, supplier, true); } diff --git a/src/main/java/com/r3944realms/leashedplayer/content/items/TestItem.java b/src/main/java/com/r3944realms/leashedplayer/content/items/TestItem.java new file mode 100644 index 0000000..f68a71d --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/content/items/TestItem.java @@ -0,0 +1,48 @@ +package com.r3944realms.leashedplayer.content.items; + +import com.r3944realms.leashedplayer.client.processBar.IProcessBar; +import com.r3944realms.leashedplayer.client.processBar.TestProcessBar; +import com.r3944realms.leashedplayer.client.renders.AdaptiveGuiRendererHandler; +import com.r3944realms.leashedplayer.client.renders.IFadingProcessBarRenderer; +import com.r3944realms.leashedplayer.client.renders.IProcessBarRenderer; +import com.r3944realms.leashedplayer.client.renders.TestProcessBarRenderer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; + +public class TestItem extends Item { + public TestProcessBar testProcessBar = null; + public TestItem(Properties pProperties) { + super(pProperties); + } + + @Override + public @NotNull InteractionResultHolder use(@NotNull Level pLevel, @NotNull Player pPlayer, @NotNull InteractionHand pUsedHand) { + if(!pLevel.isClientSide()){ + //some lo + } + else { + if (testProcessBar == null) { + testProcessBar = new TestProcessBar(); + testProcessBar.setRenderStatus(true); + TestProcessBarRenderer testProcessBarRenderer = new TestProcessBarRenderer(testProcessBar); + AdaptiveGuiRendererHandler.addProcessBar(testProcessBar, testProcessBarRenderer); + } else { + if(testProcessBar.getCurrentProcess() >= testProcessBar.getMaxProcess()) { + testProcessBar.increase(); + IProcessBarRenderer processBarRenderer = AdaptiveGuiRendererHandler.getProcessBarRenderer(testProcessBar); + ((IFadingProcessBarRenderer)processBarRenderer).setFadingOut(true); + testProcessBar = null; + } else { + testProcessBar.increase(); + } + } + + } + return super.use(pLevel, pPlayer, pUsedHand); + } +} diff --git a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java index 80b08a8..8fba89c 100644 --- a/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java +++ b/src/main/java/com/r3944realms/leashedplayer/datagen/LanguageAndOtherData/ModLangKeyValue.java @@ -22,6 +22,7 @@ import static com.r3944realms.leashedplayer.content.items.ModCreativeTab.LEASHED public enum ModLangKeyValue { //ITEM ITEM_LEASH_ROPE_ARROW(ModItemRegister.LEASH_ROPE_ARROW, ModPartEnum.ITEM, "Leash Rope Arrow", "拴绳箭", "拴繩箭", true), + TEST_FABRIC_ITEM(ModItemRegister.FABRIC, ModPartEnum.ITEM, "Fabric", "Fabric", "Fabric", true), //ITEM_DESC DESC_ITEM_LEASH_ROPE_ARROW(LeashRopeArrowItem.descKey, ModPartEnum.DESCRIPTION, "Arrows with ropes attached?","带有拴绳的箭矢?", "帶有拴繩的箭矢?", false), //ENTITY diff --git a/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinLivingEntity.java b/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinLivingEntity.java deleted file mode 100644 index 02b22f6..0000000 --- a/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinLivingEntity.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.r3944realms.leashedplayer.mixin.both; - -import com.r3944realms.leashedplayer.modInterface.ILivingEntityExtension; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.syncher.EntityDataAccessor; -import net.minecraft.network.syncher.EntityDataSerializers; -import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.Level; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(LivingEntity.class) -public abstract class MixinLivingEntity extends Entity implements ILivingEntityExtension { - @Unique - protected int Pl$LeashKeepTick;//保存状态,当超过断裂绳长时若LeashKeepTick大于0,则不断裂 - - public MixinLivingEntity(EntityType pEntityType, Level pLevel) { - super(pEntityType, pLevel); - } - @Unique - @SuppressWarnings("WrongEntityDataParameterClass") - private static final EntityDataAccessor DATA_ENTITY_LEASH_LENGTH = SynchedEntityData.defineId(LivingEntity.class, EntityDataSerializers.FLOAT); - - @SuppressWarnings("AddedMixinMembersNamePattern") - @Override - public float getLeashLength() { - return this.entityData.get(DATA_ENTITY_LEASH_LENGTH); - } - @SuppressWarnings("AddedMixinMembersNamePattern") - @Override - public void setLeashLength(float length) { - this.entityData.set(DATA_ENTITY_LEASH_LENGTH, length); - } - - @SuppressWarnings("AddedMixinMembersNamePattern") - @Override - public void setKeepLeashTick(int keepTick) { - this.Pl$LeashKeepTick = Math.max(keepTick, 0); - } - @SuppressWarnings("AddedMixinMembersNamePattern") - @Override - public int getKeepLeashTick() { - return this.Pl$LeashKeepTick; - } - - @Inject(method = {"defineSynchedData"}, at = {@At("TAIL")}) - //定义Client/Server实体同步数据 - private void defineSyncData(SynchedEntityData.Builder pBuilder, CallbackInfo ci) { - pBuilder.define(DATA_ENTITY_LEASH_LENGTH, 5.0F); - } - @Inject(method = {"readAdditionalSaveData"}, at = {@At("RETURN")}) - private void readSaveData(CompoundTag compoundTag, CallbackInfo callbackInfo) { - if(compoundTag.contains("LeashLength")) { - this.setLeashLength(compoundTag.getFloat("LeashLength")); - } - } - @Inject(method = {"addAdditionalSaveData"}, at = {@At("RETURN")}) - private void addSaveData(CompoundTag compoundTag, CallbackInfo callbackInfo) { - compoundTag.putFloat("LeashLength", getLeashLength()); - } -} diff --git a/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinPlayer.java b/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinPlayer.java index 7a8c294..12b3049 100644 --- a/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinPlayer.java +++ b/src/main/java/com/r3944realms/leashedplayer/mixin/both/MixinPlayer.java @@ -28,16 +28,46 @@ import javax.annotation.Nullable; import java.util.function.Consumer; @Mixin(Player.class) -public abstract class MixinPlayer extends LivingEntity implements PlayerLeashable { +public abstract class MixinPlayer extends LivingEntity implements PlayerLeashable, ILivingEntityExtension { + + @Unique + protected int Pl$LeashKeepTick;//保存状态,当超过断裂绳长时若LeashKeepTick大于0,则不断裂 + @Unique @Nullable private LeashData Pl$LeashData;//Data - @SuppressWarnings("WrongEntityDataParameterClass") @Unique//客户端与服务器端的实体同步数据 private static final EntityDataAccessor Pl$LEASH_DATA = SynchedEntityData.defineId(Player.class, EntityDataSerializers.COMPOUND_TAG); + @Unique + @SuppressWarnings("WrongEntityDataParameterClass") + private static final EntityDataAccessor DATA_ENTITY_LEASH_LENGTH = SynchedEntityData.defineId(Player.class, EntityDataSerializers.FLOAT); + + @SuppressWarnings("AddedMixinMembersNamePattern") + @Override + public float getLeashLength() { + return this.entityData.get(DATA_ENTITY_LEASH_LENGTH); + } + @SuppressWarnings("AddedMixinMembersNamePattern") + @Override + public void setLeashLength(float length) { + this.entityData.set(DATA_ENTITY_LEASH_LENGTH, length); + } + + @SuppressWarnings("AddedMixinMembersNamePattern") + @Override + public void setKeepLeashTick(int keepTick) { + this.Pl$LeashKeepTick = Math.max(keepTick, 0); + } + @SuppressWarnings("AddedMixinMembersNamePattern") + @Override + public int getKeepLeashTick() { + return this.Pl$LeashKeepTick; + } + + protected MixinPlayer(EntityType pEntityType, Level pLevel) { super(pEntityType, pLevel); } @@ -256,6 +286,7 @@ public abstract class MixinPlayer extends LivingEntity implements PlayerLeashabl CompoundTag leashCompoundTag = new CompoundTag(); this.writeLeashData(leashCompoundTag, null); pBuilder.define(Pl$LEASH_DATA, leashCompoundTag); + pBuilder.define(DATA_ENTITY_LEASH_LENGTH, 5.0F); } @Inject( method = {"addAdditionalSaveData"}, at = {@At("RETURN")} @@ -265,6 +296,7 @@ public abstract class MixinPlayer extends LivingEntity implements PlayerLeashabl writeLeashData(pLeashTag, Pl$LeashData); pCompound.put("Pl$LeashData", pLeashTag); this.entityData.set(Pl$LEASH_DATA, pLeashTag); + pCompound.putFloat("LeashLength", getLeashLength()); } @Inject( method = {"readAdditionalSaveData"}, at = {@At("RETURN")} @@ -275,6 +307,9 @@ public abstract class MixinPlayer extends LivingEntity implements PlayerLeashabl this.entityData.set(Pl$LEASH_DATA, pl$LeashData); Pl$LeashData = readLeashData(pl$LeashData); } + if(pCompound.contains("LeashLength")) { + this.setLeashLength(pCompound.getFloat("LeashLength")); + } } diff --git a/src/main/java/com/r3944realms/leashedplayer/utils/ColorUtil.java b/src/main/java/com/r3944realms/leashedplayer/utils/ColorUtil.java new file mode 100644 index 0000000..0be7bdc --- /dev/null +++ b/src/main/java/com/r3944realms/leashedplayer/utils/ColorUtil.java @@ -0,0 +1,18 @@ +package com.r3944realms.leashedplayer.utils; + +public class ColorUtil { + // 渐变颜色计算 + public static int lerpColor(float progress) { + int a = (int) (getAlpha(-65536) * (1 - progress) + getAlpha(-16711936) * progress); + int r = (int) (getRed(-65536) * (1 - progress) + getRed(-16711936) * progress); + int g = (int) (getGreen(-65536) * (1 - progress) + getGreen(-16711936) * progress); + int b = (int) (getBlue(-65536) * (1 - progress) + getBlue(-16711936) * progress); + return (a << 24) | (r << 16) | (g << 8) | b; + } + + private static int getAlpha(int color) { return (color >> 24) & 0xFF; } + private static int getRed(int color) { return (color >> 16) & 0xFF; } + private static int getGreen(int color) { return (color >> 8) & 0xFF; } + private static int getBlue(int color) { return color & 0xFF; } +} + diff --git a/src/main/resources/assets/leashedplayer/textures/gui/progress_bar.png b/src/main/resources/assets/leashedplayer/textures/gui/progress_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..af615a10733fe80d67631d97cbe7c986386492b5 GIT binary patch literal 1101 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU=i_jaSW-L^Y*r3(QP-8V;|oi z)U0K=@3hkRvG5Oul|f5A<{$P5o0$BA#nRzesFwIl6TO&KSN7>2eaECdBSfQXi|eQV zmrr;z@H3>oiB6dA%~?@j`?mPwzhAfR|Nj4ZN{hme7A1^*GAiuZh-NSdUKJR(_x<5Z@@1ECn)pP%} z&M4!3GxMg{vrD?g)o$ks-#V>cds^}I)}>54!u$5U4>l=a@)QCeyAPm-m!1N z-=u!=+RJszvz~Ja>=m6b&1a69ui&hxmEr5N#QcNLKKf>*loiu`b;8lt#b=&pJ@0&2 z!+)yoPx`iR<>B-9?%T2Wo>9&!iT=0cT4n1PCS_f=OPSODyKH~B_UFX1Z*P;+@*gg| zbBpQ4>uCw`yHg7H|9GADUuIMMU&#mGp1JL>{qbS%{nL(j?%jDKvs<&--1KYIU8!@5 zpBXbxulszGa(=VijZJSt(q^76ITbm@D^+vTt#3X{yDz!w ztqkcd*805f-TRon&G*tP1pd4}y`G1~_TV{YNB?VbPcKi~WPdhWQh&m$s^x2P{J#Wc zNxa-_`hQ7w%(cf~zV?@Cf7n0o3hy2F7LnjH{L;ZKNwcE<$8q^``4&H~54tk{#qGt% zeD6Ft+$Za|aY}C0iR)XOIcf71u?1Hmj!!FmDtjk(uPj^nzn-t3^nSl7 zeizxbDc(ZW;FkfK z-kH&<_u}Hq_uv0_+Tnt*%u?|S)qlUnZ#T`eE#Llcx9auO?;n}I@B6<>{Nd6yo4clY zGS_+?uoHIXyVx_o>U6;rt_${GzklHTza#DC{{F|zr&kpQ@7-|GjWyX+eL+9}o9}l1 ze;>&n3S?_~nGJC(^-YYgu=6z3Gt0j}U1=jw*e=38~ki~7jWXoQewX7Sa*Ic)e z&WL!g>gUXDaE?93$mUtmOwJ{V&n_DN>*6k2xfhsIw>Nk{e_pry5v%3${ZFGU{?#z- z$p~rSc4ysD0Hn<8P2a@G&71e>ssT_f@Ju B6w?3z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/leashedplayer/textures/item/fabric.png b/src/main/resources/assets/leashedplayer/textures/item/fabric.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab8370ff4b4de7b4ab665a6628e07b3f94cb44d GIT binary patch literal 5867 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 BTp|Df literal 0 HcmV?d00001 diff --git a/src/main/resources/leashedplayer.mixins.json b/src/main/resources/leashedplayer.mixins.json index 4021e04..a1e1bc8 100644 --- a/src/main/resources/leashedplayer.mixins.json +++ b/src/main/resources/leashedplayer.mixins.json @@ -2,7 +2,6 @@ "package": "com.r3944realms.leashedplayer.mixin", "mixins": [ "both.MixinEntity", - "both.MixinLivingEntity", "both.MixinPlayer", "item.MixinLeadItem", "server.MixinServerGamePacketListenerImpl"