From a31db0111709189dae0614624046eaa2366aeff9 Mon Sep 17 00:00:00 2001 From: Guimc Date: Wed, 14 Aug 2024 05:39:28 +0800 Subject: [PATCH] update --- gradle.properties | 6 +- .../polyfrost/example/config/TestConfig.java | 48 ----- .../org/polyfrost/example/hud/TestHud.java | 20 -- .../example/mixin/MinecraftMixin.java | 21 -- .../zombieshelper/ZombiesHelper.java} | 22 +- .../command/OpenGUICommand.java} | 12 +- .../config/ZombiesHelperConfig.java | 59 ++++++ .../zombieshelper/hud/ZombiesHelperHud.java | 23 +++ .../listener/BlockUseEntityListener.java | 31 +++ .../listener/NoPuncherListener.java | 46 +++++ .../zombieshelper/mixin/EntityMixin.java | 19 ++ .../mixin/EntityPlayerMixin.java | 19 ++ .../mixin/EntityRendererMixin.java | 47 +++++ .../mixin/MinecraftAccessor.java | 21 ++ .../mixin/RenderManagerAccessor.java | 12 ++ .../zombieshelper/utils/RenderUtils.java | 191 ++++++++++++++++++ .../cuteguimc/zombieshelper/utils/Utils.java | 12 ++ src/main/resources/mixins.examplemod.json | 13 -- src/main/resources/mixins.zombieshelper.json | 19 ++ 19 files changed, 521 insertions(+), 120 deletions(-) delete mode 100644 src/main/java/org/polyfrost/example/config/TestConfig.java delete mode 100644 src/main/java/org/polyfrost/example/hud/TestHud.java delete mode 100644 src/main/java/org/polyfrost/example/mixin/MinecraftMixin.java rename src/main/java/{org/polyfrost/example/ExampleMod.java => win/cuteguimc/zombieshelper/ZombiesHelper.java} (50%) rename src/main/java/{org/polyfrost/example/command/ExampleCommand.java => win/cuteguimc/zombieshelper/command/OpenGUICommand.java} (56%) create mode 100644 src/main/java/win/cuteguimc/zombieshelper/config/ZombiesHelperConfig.java create mode 100644 src/main/java/win/cuteguimc/zombieshelper/hud/ZombiesHelperHud.java create mode 100644 src/main/java/win/cuteguimc/zombieshelper/listener/BlockUseEntityListener.java create mode 100644 src/main/java/win/cuteguimc/zombieshelper/listener/NoPuncherListener.java create mode 100644 src/main/java/win/cuteguimc/zombieshelper/mixin/EntityMixin.java create mode 100644 src/main/java/win/cuteguimc/zombieshelper/mixin/EntityPlayerMixin.java create mode 100644 src/main/java/win/cuteguimc/zombieshelper/mixin/EntityRendererMixin.java create mode 100644 src/main/java/win/cuteguimc/zombieshelper/mixin/MinecraftAccessor.java create mode 100644 src/main/java/win/cuteguimc/zombieshelper/mixin/RenderManagerAccessor.java create mode 100644 src/main/java/win/cuteguimc/zombieshelper/utils/RenderUtils.java create mode 100644 src/main/java/win/cuteguimc/zombieshelper/utils/Utils.java delete mode 100644 src/main/resources/mixins.examplemod.json create mode 100644 src/main/resources/mixins.zombieshelper.json diff --git a/gradle.properties b/gradle.properties index f8f0b3b..e6dc354 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,13 +1,13 @@ # gradle.properties file -- CHANGE THE VALUES STARTING WITH `mod_*` AND REMOVE THIS COMMENT. # Sets the name of your mod. -mod_name=ExampleMod +mod_name=ZombiesHelper # Sets the id of your mod that mod loaders use to recognize it. -mod_id=examplemod +mod_id=zombieshelper # Sets the version of your mod. Make sure to update this when you make changes according to semver. mod_version=1.0.0 # Sets the name of the jar file that you put in your 'mods' folder. -mod_archives_name=ExampleMod +mod_archives_name=ZombiesHelper # Gradle Configuration -- DO NOT TOUCH THESE VALUES. polyfrost.defaults.loom=3 diff --git a/src/main/java/org/polyfrost/example/config/TestConfig.java b/src/main/java/org/polyfrost/example/config/TestConfig.java deleted file mode 100644 index a4cc343..0000000 --- a/src/main/java/org/polyfrost/example/config/TestConfig.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.polyfrost.example.config; - -import org.polyfrost.example.ExampleMod; -import org.polyfrost.example.hud.TestHud; -import cc.polyfrost.oneconfig.config.Config; -import cc.polyfrost.oneconfig.config.annotations.Dropdown; -import cc.polyfrost.oneconfig.config.annotations.HUD; -import cc.polyfrost.oneconfig.config.annotations.Slider; -import cc.polyfrost.oneconfig.config.annotations.Switch; -import cc.polyfrost.oneconfig.config.data.Mod; -import cc.polyfrost.oneconfig.config.data.ModType; -import cc.polyfrost.oneconfig.config.data.OptionSize; - -/** - * The main Config entrypoint that extends the Config type and inits the config options. - * See this link for more config Options - */ -public class TestConfig extends Config { - @HUD( - name = "Example HUD" - ) - public TestHud hud = new TestHud(); - - @Switch( - name = "Example Switch", - size = OptionSize.SINGLE // Optional - ) - public static boolean exampleSwitch = false; // The default value for the boolean Switch. - - @Slider( - name = "Example Slider", - min = 0f, max = 100f, // Minimum and maximum values for the slider. - step = 10 // The amount of steps that the slider should have. - ) - public static float exampleSlider = 50f; // The default value for the float Slider. - - @Dropdown( - name = "Example Dropdown", // Name of the Dropdown - options = {"Option 1", "Option 2", "Option 3", "Option 4"} // Options available. - ) - public static int exampleDropdown = 1; // Default option (in this case "Option 2") - - public TestConfig() { - super(new Mod(ExampleMod.NAME, ModType.UTIL_QOL), ExampleMod.MODID + ".json"); - initialize(); - } -} - diff --git a/src/main/java/org/polyfrost/example/hud/TestHud.java b/src/main/java/org/polyfrost/example/hud/TestHud.java deleted file mode 100644 index cd0dfa7..0000000 --- a/src/main/java/org/polyfrost/example/hud/TestHud.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.polyfrost.example.hud; - -import cc.polyfrost.oneconfig.hud.SingleTextHud; -import org.polyfrost.example.config.TestConfig; - -/** - * An example OneConfig HUD that is started in the config and displays text. - * - * @see TestConfig#hud - */ -public class TestHud extends SingleTextHud { - public TestHud() { - super("Test", true); - } - - @Override - public String getText(boolean example) { - return "I'm an example HUD"; - } -} diff --git a/src/main/java/org/polyfrost/example/mixin/MinecraftMixin.java b/src/main/java/org/polyfrost/example/mixin/MinecraftMixin.java deleted file mode 100644 index cc1304c..0000000 --- a/src/main/java/org/polyfrost/example/mixin/MinecraftMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.polyfrost.example.mixin; - -import net.minecraft.client.Minecraft; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -/** - * An example mixin using SpongePowered's Mixin library - * - * @see Inject - * @see Mixin - */ -@Mixin(Minecraft.class) -public class MinecraftMixin { - @Inject(method = "startGame", at = @At(value = "HEAD")) - private void onStartGame(CallbackInfo ci) { - System.out.println("This is a message from an example mod!"); - } -} diff --git a/src/main/java/org/polyfrost/example/ExampleMod.java b/src/main/java/win/cuteguimc/zombieshelper/ZombiesHelper.java similarity index 50% rename from src/main/java/org/polyfrost/example/ExampleMod.java rename to src/main/java/win/cuteguimc/zombieshelper/ZombiesHelper.java index 043a208..026db2f 100644 --- a/src/main/java/org/polyfrost/example/ExampleMod.java +++ b/src/main/java/win/cuteguimc/zombieshelper/ZombiesHelper.java @@ -1,11 +1,13 @@ -package org.polyfrost.example; +package win.cuteguimc.zombieshelper; -import org.polyfrost.example.command.ExampleCommand; -import org.polyfrost.example.config.TestConfig; +import win.cuteguimc.zombieshelper.command.OpenGUICommand; +import win.cuteguimc.zombieshelper.config.ZombiesHelperConfig; import cc.polyfrost.oneconfig.events.event.InitializationEvent; import net.minecraftforge.fml.common.Mod; import cc.polyfrost.oneconfig.utils.commands.CommandManager; import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import win.cuteguimc.zombieshelper.listener.BlockUseEntityListener; +import win.cuteguimc.zombieshelper.listener.NoPuncherListener; /** * The entrypoint of the Example Mod that initializes it. @@ -13,21 +15,23 @@ * @see Mod * @see InitializationEvent */ -@Mod(modid = ExampleMod.MODID, name = ExampleMod.NAME, version = ExampleMod.VERSION) -public class ExampleMod { +@Mod(modid = ZombiesHelper.MODID, name = ZombiesHelper.NAME, version = ZombiesHelper.VERSION) +public class ZombiesHelper { // Sets the variables from `gradle.properties`. See the `blossom` config in `build.gradle.kts`. public static final String MODID = "@ID@"; public static final String NAME = "@NAME@"; public static final String VERSION = "@VER@"; @Mod.Instance(MODID) - public static ExampleMod INSTANCE; // Adds the instance of the mod, so we can access other variables. - public static TestConfig config; + public static ZombiesHelper INSTANCE; // Adds the instance of the mod, so we can access other variables. + public static ZombiesHelperConfig config; // Register the config and commands. @Mod.EventHandler public void onInit(FMLInitializationEvent event) { - config = new TestConfig(); - CommandManager.INSTANCE.registerCommand(new ExampleCommand()); + config = new ZombiesHelperConfig(); + new NoPuncherListener(); + new BlockUseEntityListener(); + CommandManager.INSTANCE.registerCommand(new OpenGUICommand()); } } diff --git a/src/main/java/org/polyfrost/example/command/ExampleCommand.java b/src/main/java/win/cuteguimc/zombieshelper/command/OpenGUICommand.java similarity index 56% rename from src/main/java/org/polyfrost/example/command/ExampleCommand.java rename to src/main/java/win/cuteguimc/zombieshelper/command/OpenGUICommand.java index b4373a3..448e0e8 100644 --- a/src/main/java/org/polyfrost/example/command/ExampleCommand.java +++ b/src/main/java/win/cuteguimc/zombieshelper/command/OpenGUICommand.java @@ -1,6 +1,6 @@ -package org.polyfrost.example.command; +package win.cuteguimc.zombieshelper.command; -import org.polyfrost.example.ExampleMod; +import win.cuteguimc.zombieshelper.ZombiesHelper; import cc.polyfrost.oneconfig.utils.commands.annotations.Command; import cc.polyfrost.oneconfig.utils.commands.annotations.Main; @@ -10,12 +10,12 @@ * * @see Command * @see Main - * @see ExampleMod + * @see ZombiesHelper */ -@Command(value = ExampleMod.MODID, description = "Access the " + ExampleMod.NAME + " GUI.") -public class ExampleCommand { +@Command(value = ZombiesHelper.MODID, description = "Access the " + ZombiesHelper.NAME + " GUI.") +public class OpenGUICommand { @Main private void handle() { - ExampleMod.INSTANCE.config.openGui(); + ZombiesHelper.INSTANCE.config.openGui(); } } \ No newline at end of file diff --git a/src/main/java/win/cuteguimc/zombieshelper/config/ZombiesHelperConfig.java b/src/main/java/win/cuteguimc/zombieshelper/config/ZombiesHelperConfig.java new file mode 100644 index 0000000..b5aaf81 --- /dev/null +++ b/src/main/java/win/cuteguimc/zombieshelper/config/ZombiesHelperConfig.java @@ -0,0 +1,59 @@ +package win.cuteguimc.zombieshelper.config; + +import cc.polyfrost.oneconfig.config.annotations.HUD; +import cc.polyfrost.oneconfig.config.annotations.KeyBind; +import cc.polyfrost.oneconfig.config.core.OneKeyBind; +import cc.polyfrost.oneconfig.libs.universal.UKeyboard; +import win.cuteguimc.zombieshelper.ZombiesHelper; +import cc.polyfrost.oneconfig.config.Config; +import cc.polyfrost.oneconfig.config.annotations.Slider; +import cc.polyfrost.oneconfig.config.annotations.Switch; +import cc.polyfrost.oneconfig.config.data.Mod; +import cc.polyfrost.oneconfig.config.data.ModType; +import win.cuteguimc.zombieshelper.hud.ZombiesHelperHud; + +public class ZombiesHelperConfig extends Config { + @Switch( + name = "Block UseEntity" + ) + public static boolean blockUseEntity = false; + + @KeyBind( + name = "Toggle Block UseEntity Keybind" + ) + public static OneKeyBind toggleBlockUseEntityKeyBind = new OneKeyBind(UKeyboard.KEY_LEFT); + + @Switch( + name = "No Puncher" + ) + public static boolean noPuncher = true; + + @Switch( + name = "Hide Player" + ) + public static boolean hidePlayer = false; + + @Switch( + name = "ESP" + ) + public static boolean esp = false; + + @Slider( + name = "ESP Range", + min = 0f, max = 100f + ) + public static float espRange = 50f; + + @HUD( + name = "Nearby Entity HUD", + category = "NEHUD" + ) + public ZombiesHelperHud hud = new ZombiesHelperHud(); + + public ZombiesHelperConfig() { + super(new Mod(ZombiesHelper.NAME, ModType.UTIL_QOL), ZombiesHelper.MODID + ".json"); + registerKeyBind(toggleBlockUseEntityKeyBind, () -> blockUseEntity = !blockUseEntity); + initialize(); + } +} + diff --git a/src/main/java/win/cuteguimc/zombieshelper/hud/ZombiesHelperHud.java b/src/main/java/win/cuteguimc/zombieshelper/hud/ZombiesHelperHud.java new file mode 100644 index 0000000..ba9f042 --- /dev/null +++ b/src/main/java/win/cuteguimc/zombieshelper/hud/ZombiesHelperHud.java @@ -0,0 +1,23 @@ +package win.cuteguimc.zombieshelper.hud; + +import cc.polyfrost.oneconfig.hud.SingleTextHud; +import net.minecraft.client.Minecraft; +import win.cuteguimc.zombieshelper.config.ZombiesHelperConfig; +import win.cuteguimc.zombieshelper.utils.Utils; + +import java.util.stream.Collectors; + +public class ZombiesHelperHud extends SingleTextHud { + public ZombiesHelperHud() { + super("Nearby Entity", true); + } + + @Override + public String getText(boolean example) { + if (Minecraft.getMinecraft().theWorld == null || Minecraft.getMinecraft().thePlayer == null) return "World not loaded"; + else { + int entityAmount = (int) Minecraft.getMinecraft().theWorld.loadedEntityList.stream().filter(entity -> Utils.isTarget(entity) && Minecraft.getMinecraft().thePlayer.getDistanceToEntity(entity) <= 8).count(); + return entityAmount + ""; + } + } +} diff --git a/src/main/java/win/cuteguimc/zombieshelper/listener/BlockUseEntityListener.java b/src/main/java/win/cuteguimc/zombieshelper/listener/BlockUseEntityListener.java new file mode 100644 index 0000000..e132cb4 --- /dev/null +++ b/src/main/java/win/cuteguimc/zombieshelper/listener/BlockUseEntityListener.java @@ -0,0 +1,31 @@ +package win.cuteguimc.zombieshelper.listener; + +import cc.polyfrost.oneconfig.events.EventManager; +import cc.polyfrost.oneconfig.events.event.SendPacketEvent; +import cc.polyfrost.oneconfig.libs.eventbus.Subscribe; +import net.minecraft.block.BlockChest; +import net.minecraft.client.Minecraft; +import net.minecraft.network.Packet; +import net.minecraft.network.play.client.C02PacketUseEntity; +import net.minecraft.network.play.client.C08PacketPlayerBlockPlacement; +import win.cuteguimc.zombieshelper.config.ZombiesHelperConfig; +import win.cuteguimc.zombieshelper.utils.Utils; + +public class BlockUseEntityListener { + private final Minecraft mc = Minecraft.getMinecraft(); + + public BlockUseEntityListener() { + EventManager.INSTANCE.register(this); + } + + @Subscribe + public void onPacketSend(SendPacketEvent event) { + if (!ZombiesHelperConfig.blockUseEntity) return; + Packet packet = event.packet; + if ((packet instanceof C08PacketPlayerBlockPlacement && + mc.theWorld.getBlockState(((C08PacketPlayerBlockPlacement) packet).getPosition()).getBlock() instanceof BlockChest) || + packet instanceof C02PacketUseEntity && !Utils.isTarget(((C02PacketUseEntity) packet).getEntityFromWorld(mc.theWorld))) { + event.isCancelled = true; + } + } +} diff --git a/src/main/java/win/cuteguimc/zombieshelper/listener/NoPuncherListener.java b/src/main/java/win/cuteguimc/zombieshelper/listener/NoPuncherListener.java new file mode 100644 index 0000000..accc65f --- /dev/null +++ b/src/main/java/win/cuteguimc/zombieshelper/listener/NoPuncherListener.java @@ -0,0 +1,46 @@ +package win.cuteguimc.zombieshelper.listener; + +import cc.polyfrost.oneconfig.events.EventManager; +import cc.polyfrost.oneconfig.events.event.ChatReceiveEvent; +import cc.polyfrost.oneconfig.events.event.SendPacketEvent; +import cc.polyfrost.oneconfig.libs.eventbus.Subscribe; +import net.minecraft.block.BlockChest; +import net.minecraft.client.Minecraft; +import net.minecraft.network.Packet; +import net.minecraft.network.play.client.C02PacketUseEntity; +import net.minecraft.network.play.client.C08PacketPlayerBlockPlacement; +import win.cuteguimc.zombieshelper.config.ZombiesHelperConfig; +import win.cuteguimc.zombieshelper.utils.Utils; + +import java.util.Locale; + +public class NoPuncherListener { + private int lastPuncherTick = -1; + private final Minecraft mc = Minecraft.getMinecraft(); + + public NoPuncherListener() { + EventManager.INSTANCE.register(this); + } + + @Subscribe + public void onChatReceive(ChatReceiveEvent event) { + if (mc.theWorld == null || mc.thePlayer == null) return; + if (!ZombiesHelperConfig.noPuncher) return; + String message = event.message.getUnformattedTextForChat(); + if (message.toLowerCase(Locale.ROOT).contains("you found the puncher in the lucky chest")) { + lastPuncherTick = mc.thePlayer.ticksExisted; + } + } + + @Subscribe + public void onPacketSend(SendPacketEvent event) { + if (!ZombiesHelperConfig.noPuncher) return; + Packet packet = event.packet; + if (((packet instanceof C08PacketPlayerBlockPlacement && + mc.theWorld.getBlockState(((C08PacketPlayerBlockPlacement) packet).getPosition()).getBlock() instanceof BlockChest) || + packet instanceof C02PacketUseEntity && !Utils.isTarget(((C02PacketUseEntity) packet).getEntityFromWorld(mc.theWorld))) && + mc.thePlayer.ticksExisted - lastPuncherTick <= 20*10.2) { + event.isCancelled = true; + } + } +} diff --git a/src/main/java/win/cuteguimc/zombieshelper/mixin/EntityMixin.java b/src/main/java/win/cuteguimc/zombieshelper/mixin/EntityMixin.java new file mode 100644 index 0000000..3e85b86 --- /dev/null +++ b/src/main/java/win/cuteguimc/zombieshelper/mixin/EntityMixin.java @@ -0,0 +1,19 @@ +package win.cuteguimc.zombieshelper.mixin; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import win.cuteguimc.zombieshelper.config.ZombiesHelperConfig; + +@Mixin(Entity.class) +public class EntityMixin { + @Inject(method = "isInvisible()Z", at = @At("RETURN"), cancellable = true) + private void onIsInvisible(CallbackInfoReturnable cir) { + if (((Entity) (Object) this) instanceof EntityPlayer && ZombiesHelperConfig.hidePlayer) { + cir.setReturnValue(true); + } + } +} diff --git a/src/main/java/win/cuteguimc/zombieshelper/mixin/EntityPlayerMixin.java b/src/main/java/win/cuteguimc/zombieshelper/mixin/EntityPlayerMixin.java new file mode 100644 index 0000000..7ac1522 --- /dev/null +++ b/src/main/java/win/cuteguimc/zombieshelper/mixin/EntityPlayerMixin.java @@ -0,0 +1,19 @@ +package win.cuteguimc.zombieshelper.mixin; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import win.cuteguimc.zombieshelper.config.ZombiesHelperConfig; + +@Mixin(EntityPlayer.class) +public class EntityPlayerMixin { + @Inject(method = "isInvisibleToPlayer(Lnet/minecraft/entity/player/EntityPlayer;)Z", at = @At("RETURN"), cancellable = true) + private void onIsInvisibleToPlayer(EntityPlayer player, CallbackInfoReturnable cir) { + if (ZombiesHelperConfig.hidePlayer) { + cir.setReturnValue(false); + } + } +} diff --git a/src/main/java/win/cuteguimc/zombieshelper/mixin/EntityRendererMixin.java b/src/main/java/win/cuteguimc/zombieshelper/mixin/EntityRendererMixin.java new file mode 100644 index 0000000..2b351ae --- /dev/null +++ b/src/main/java/win/cuteguimc/zombieshelper/mixin/EntityRendererMixin.java @@ -0,0 +1,47 @@ +package win.cuteguimc.zombieshelper.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.entity.passive.IAnimals; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Timer; +import org.lwjgl.opengl.GL11; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import win.cuteguimc.zombieshelper.config.ZombiesHelperConfig; +import win.cuteguimc.zombieshelper.utils.RenderUtils; +import win.cuteguimc.zombieshelper.utils.Utils; + +import java.awt.*; +import java.util.List; +import java.util.stream.Collectors; + +@Mixin(EntityRenderer.class) +public class EntityRendererMixin { + @Inject(method = "renderWorldPass", at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/EntityRenderer;renderHand:Z", shift = At.Shift.BEFORE)) + private void renderWorldPass(int pass, float partialTicks, long finishTimeNano, CallbackInfo ci) { + try { + if (ZombiesHelperConfig.esp) { + Color targetcolor = new Color(56, 199, 231); + Color color = new Color(255, 43, 28); + float[] colors = new float[]{(float) color.getRed(), color.getGreen(), color.getBlue()}; + for (Entity entity : Minecraft.getMinecraft().theWorld.getLoadedEntityList()) { + if (entity instanceof IAnimals && !(entity instanceof EntityVillager) && Minecraft.getMinecraft().thePlayer.getDistanceToEntity(entity) <= ZombiesHelperConfig.espRange) { + RenderUtils.drawEntityBox(entity, (Minecraft.getMinecraft().thePlayer.getDistanceToEntity(entity) <= 8) ? color : targetcolor); + } + } + + for (Entity entity : Minecraft.getMinecraft().theWorld.loadedEntityList.stream().filter(entity -> Utils.isTarget(entity) && Minecraft.getMinecraft().thePlayer.getDistanceToEntity(entity) <= 8).collect(Collectors.toList())) { + RenderUtils.drawTracert(entity, colors); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/win/cuteguimc/zombieshelper/mixin/MinecraftAccessor.java b/src/main/java/win/cuteguimc/zombieshelper/mixin/MinecraftAccessor.java new file mode 100644 index 0000000..e5d22d8 --- /dev/null +++ b/src/main/java/win/cuteguimc/zombieshelper/mixin/MinecraftAccessor.java @@ -0,0 +1,21 @@ +package win.cuteguimc.zombieshelper.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.util.Timer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; +import org.spongepowered.asm.mixin.injection.Inject; + +/** + * An example mixin using SpongePowered's Mixin library + * + * @see Inject + * @see Mixin + */ +@Mixin(Minecraft.class) +public interface MinecraftAccessor { + @Accessor Timer getTimer(); + @Invoker("getRenderManager") RenderManager invokeGetRenderManager(); +} diff --git a/src/main/java/win/cuteguimc/zombieshelper/mixin/RenderManagerAccessor.java b/src/main/java/win/cuteguimc/zombieshelper/mixin/RenderManagerAccessor.java new file mode 100644 index 0000000..6a0bc17 --- /dev/null +++ b/src/main/java/win/cuteguimc/zombieshelper/mixin/RenderManagerAccessor.java @@ -0,0 +1,12 @@ +package win.cuteguimc.zombieshelper.mixin; + +import net.minecraft.client.renderer.entity.RenderManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(RenderManager.class) +public interface RenderManagerAccessor { + @Accessor double getRenderPosX(); + @Accessor double getRenderPosY(); + @Accessor double getRenderPosZ(); +} diff --git a/src/main/java/win/cuteguimc/zombieshelper/utils/RenderUtils.java b/src/main/java/win/cuteguimc/zombieshelper/utils/RenderUtils.java new file mode 100644 index 0000000..09c47de --- /dev/null +++ b/src/main/java/win/cuteguimc/zombieshelper/utils/RenderUtils.java @@ -0,0 +1,191 @@ +package win.cuteguimc.zombieshelper.utils; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Timer; +import org.lwjgl.opengl.GL11; +import win.cuteguimc.zombieshelper.mixin.MinecraftAccessor; +import win.cuteguimc.zombieshelper.mixin.RenderManagerAccessor; + +import java.awt.*; +import java.util.HashMap; +import java.util.Map; + +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL11.glDepthMask; + +public class RenderUtils { + private static final Map glCapMap = new HashMap<>(); + public static final MinecraftAccessor mc = ((MinecraftAccessor) Minecraft.getMinecraft()); + + public static void drawEntityBox(final Entity entity, final Color color) { + final RenderManagerAccessor renderManager = ((RenderManagerAccessor) mc.invokeGetRenderManager()); + final Timer timer = mc.getTimer(); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + enableGlCap(GL_BLEND); + disableGlCap(GL_TEXTURE_2D, GL_DEPTH_TEST); + glDepthMask(false); + + final double x = entity.lastTickPosX + (entity.posX - entity.lastTickPosX) * timer.renderPartialTicks + - renderManager.getRenderPosX(); + final double y = entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * timer.renderPartialTicks + - renderManager.getRenderPosY(); + final double z = entity.lastTickPosZ + (entity.posZ - entity.lastTickPosZ) * timer.renderPartialTicks + - renderManager.getRenderPosZ(); + + AxisAlignedBB entityBox = entity.getEntityBoundingBox(); + AxisAlignedBB axisAlignedBB = new AxisAlignedBB( + entityBox.minX - entity.posX + x - 0.05D, + entityBox.minY - entity.posY + y, + entityBox.minZ - entity.posZ + z - 0.05D, + entityBox.maxX - entity.posX + x + 0.05D, + entityBox.maxY - entity.posY + y + 0.15D, + entityBox.maxZ - entity.posZ + z + 0.05D + ); + + glColor(color.getRed(), color.getGreen(), color.getBlue(), 95); + drawFilledBox(axisAlignedBB); + GlStateManager.resetColor(); + glDepthMask(true); + resetCaps(); + } + public static void enableGlCap(final int cap) { + setGlCap(cap, true); + } + public static void setGlState(final int cap, final boolean state) { + if (state) + glEnable(cap); + else + glDisable(cap); + } + public static void setGlCap(final int cap, final boolean state) { + glCapMap.put(cap, glGetBoolean(cap)); + setGlState(cap, state); + } + public static void disableGlCap(final int... caps) { + for (final int cap : caps) + setGlCap(cap, false); + } + public static void resetCaps() { + glCapMap.forEach(RenderUtils::setGlState); + } + public static void glColor(final int red, final int green, final int blue, final int alpha) { + GlStateManager.color(red / 255F, green / 255F, blue / 255F, alpha / 255F); + } + public static void glColor(int hex) { + float alpha = (hex >> 24 & 0xFF) / 255.0F; + float red = (hex >> 16 & 0xFF) / 255.0F; + float green = (hex >> 8 & 0xFF) / 255.0F; + float blue = (hex & 0xFF) / 255.0F; + GL11.glColor4f(red, green, blue, alpha); + } + public static void drawTracert(Entity entity, float[] colors) { + final RenderManagerAccessor renderManager = ((RenderManagerAccessor) ((MinecraftAccessor) Minecraft.getMinecraft()).invokeGetRenderManager()); + final Timer timer = ((MinecraftAccessor) Minecraft.getMinecraft()).getTimer(); + + final double x = entity.lastTickPosX + (entity.posX - entity.lastTickPosX) * timer.renderPartialTicks + - renderManager.getRenderPosX(); + final double y = entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * timer.renderPartialTicks + - renderManager.getRenderPosY() + entity.getEyeHeight(); + final double z = entity.lastTickPosZ + (entity.posZ - entity.lastTickPosZ) * timer.renderPartialTicks + - renderManager.getRenderPosZ(); + + GlStateManager.disableAlpha(); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(770, 771); + GlStateManager.disableTexture2D(); + GlStateManager.disableDepth(); + GL11.glEnable(2848); + RenderUtils.glColor(toRGBAHex(colors[0] / 255.0f, colors[1] / 255.0f, colors[2] / 255.0f, 0.8f)); + // Draw line + GL11.glEnable(GL11.GL_LINE_SMOOTH); + GL11.glLineWidth(1.5f); + GL11.glBegin(1); + GL11.glVertex3d(0.0D, Minecraft.getMinecraft().thePlayer.getEyeHeight(), 0.0D); + GL11.glVertex3d(x, y, z); + GL11.glEnd(); + GL11.glDisable(GL11.GL_LINE_SMOOTH); + // Draw line end + + GL11.glDisable(2848); + GlStateManager.enableDepth(); + GlStateManager.enableTexture2D(); + GlStateManager.enableBlend(); + GlStateManager.enableAlpha(); + } + public static int toRGBAHex(float r, float g, float b, float a) { + return ((int) (a * 255.0f) & 255) << 24 | ((int) (r * 255.0f) & 255) << 16 | ((int) (g * 255.0f) & 255) << 8 | (int) (b * 255.0f) & 255; + } + public static void drawFilledBox(final AxisAlignedBB axisAlignedBB) { + final Tessellator tessellator = Tessellator.getInstance(); + final WorldRenderer worldRenderer = tessellator.getWorldRenderer(); + worldRenderer.begin(7, DefaultVertexFormats.POSITION); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + tessellator.draw(); + worldRenderer.begin(7, DefaultVertexFormats.POSITION); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + tessellator.draw(); + worldRenderer.begin(7, DefaultVertexFormats.POSITION); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + tessellator.draw(); + worldRenderer.begin(7, DefaultVertexFormats.POSITION); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + tessellator.draw(); + worldRenderer.begin(7, DefaultVertexFormats.POSITION); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + tessellator.draw(); + worldRenderer.begin(7, DefaultVertexFormats.POSITION); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex(); + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex(); + tessellator.draw(); + } +} diff --git a/src/main/java/win/cuteguimc/zombieshelper/utils/Utils.java b/src/main/java/win/cuteguimc/zombieshelper/utils/Utils.java new file mode 100644 index 0000000..cc3f49f --- /dev/null +++ b/src/main/java/win/cuteguimc/zombieshelper/utils/Utils.java @@ -0,0 +1,12 @@ +package win.cuteguimc.zombieshelper.utils; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.monster.IMob; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.entity.passive.IAnimals; + +public class Utils { + public static boolean isTarget(Entity entity) { + return entity instanceof IAnimals && !(entity instanceof EntityVillager); + } +} diff --git a/src/main/resources/mixins.examplemod.json b/src/main/resources/mixins.examplemod.json deleted file mode 100644 index c5a6f21..0000000 --- a/src/main/resources/mixins.examplemod.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compatibilityLevel": "JAVA_8", - "minVersion": "0.7", - "package": "org.polyfrost.example.mixin", - "refmap": "mixins.${id}.refmap.json", - "injectors": { - "maxShiftBy": 5 - }, - "client": [ - "MinecraftMixin" - ], - "verbose": true -} diff --git a/src/main/resources/mixins.zombieshelper.json b/src/main/resources/mixins.zombieshelper.json new file mode 100644 index 0000000..ee6c939 --- /dev/null +++ b/src/main/resources/mixins.zombieshelper.json @@ -0,0 +1,19 @@ +{ + "compatibilityLevel": "JAVA_8", + "minVersion": "0.7", + "package": "win.cuteguimc.zombieshelper.mixin", + "refmap": "mixins.zombieshelper.refmap.json", + "injectors": { + "maxShiftBy": 5 + }, + "client": [ + "EntityRendererMixin", + "MinecraftAccessor", + "RenderManagerAccessor" + ], + "verbose": true, + "mixins": [ + "EntityMixin", + "EntityPlayerMixin" + ] +}