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"
+ ]
+}