From 557b3f967a69b213a22de046e4b0c53e6084f41a Mon Sep 17 00:00:00 2001 From: riga Date: Mon, 18 Nov 2019 19:43:30 -0900 Subject: [PATCH] New Events, Changed name API, NotificationsComponent text centers on anchors properly, Lagger NBT mode fixed, Added VisualRange, Updated LogoutSpots, Added fade option to Holes, Added WorldPatch(untested mappings) --- .../api/event/world/EventAddEntity.java | 24 ++++++++ .../api/event/world/EventRemoveEntity.java | 24 ++++++++ .../seppuku/api/util/NetworkUtil.java | 18 +++--- .../hud/component/NotificationsComponent.java | 21 ++++++- .../impl/management/ModuleManager.java | 1 + .../impl/module/misc/LaggerModule.java | 13 +--- .../impl/module/misc/VisualRangeModule.java | 52 ++++++++++++++++ .../impl/module/render/HolesModule.java | 15 ++++- .../impl/module/render/LogoutSpotsModule.java | 59 +++++++++++++++---- .../seppuku/impl/patch/WorldPatch.java | 35 +++++++++++ 10 files changed, 224 insertions(+), 38 deletions(-) create mode 100644 src/main/java/me/rigamortis/seppuku/api/event/world/EventAddEntity.java create mode 100644 src/main/java/me/rigamortis/seppuku/api/event/world/EventRemoveEntity.java create mode 100644 src/main/java/me/rigamortis/seppuku/impl/module/misc/VisualRangeModule.java diff --git a/src/main/java/me/rigamortis/seppuku/api/event/world/EventAddEntity.java b/src/main/java/me/rigamortis/seppuku/api/event/world/EventAddEntity.java new file mode 100644 index 0000000..9f0bff8 --- /dev/null +++ b/src/main/java/me/rigamortis/seppuku/api/event/world/EventAddEntity.java @@ -0,0 +1,24 @@ +package me.rigamortis.seppuku.api.event.world; + +import net.minecraft.entity.Entity; + +/** + * Author Seth + * 11/10/2019 @ 3:30 PM. + */ +public class EventAddEntity { + + private Entity entity; + + public EventAddEntity(Entity entity) { + this.entity = entity; + } + + public Entity getEntity() { + return entity; + } + + public void setEntity(Entity entity) { + this.entity = entity; + } +} diff --git a/src/main/java/me/rigamortis/seppuku/api/event/world/EventRemoveEntity.java b/src/main/java/me/rigamortis/seppuku/api/event/world/EventRemoveEntity.java new file mode 100644 index 0000000..8d4f3f4 --- /dev/null +++ b/src/main/java/me/rigamortis/seppuku/api/event/world/EventRemoveEntity.java @@ -0,0 +1,24 @@ +package me.rigamortis.seppuku.api.event.world; + +import net.minecraft.entity.Entity; + +/** + * Author Seth + * 11/10/2019 @ 3:31 PM. + */ +public class EventRemoveEntity { + + private Entity entity; + + public EventRemoveEntity(Entity entity) { + this.entity = entity; + } + + public Entity getEntity() { + return entity; + } + + public void setEntity(Entity entity) { + this.entity = entity; + } +} diff --git a/src/main/java/me/rigamortis/seppuku/api/util/NetworkUtil.java b/src/main/java/me/rigamortis/seppuku/api/util/NetworkUtil.java index 93d93cf..c8b8b37 100644 --- a/src/main/java/me/rigamortis/seppuku/api/util/NetworkUtil.java +++ b/src/main/java/me/rigamortis/seppuku/api/util/NetworkUtil.java @@ -1,7 +1,6 @@ package me.rigamortis.seppuku.api.util; import org.apache.commons.io.IOUtils; -import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.JSONValue; import org.json.simple.parser.ParseException; @@ -16,18 +15,15 @@ import java.util.UUID; public final class NetworkUtil { public static String resolveUsername(UUID id) { - final String url = "https://api.mojang.com/user/profiles/" + id.toString().replace("-", "") + "/names"; + final String url = "https://api.minetools.eu/uuid/" + id.toString().replace("-", ""); try { final String nameJson = IOUtils.toString(new URL(url)); - if (nameJson != null) { - final JSONArray nameValue = (JSONArray) JSONValue.parseWithException(nameJson); - if (nameValue != null) { - final String playerSlot = nameValue.get(nameValue.size() - 1).toString(); - if (playerSlot != null) { - final JSONObject nameObject = (JSONObject) JSONValue.parseWithException(playerSlot); - if (nameObject != null) { - return nameObject.get("name").toString(); - } + if (nameJson != null && nameJson.length() > 0) { + final JSONObject jsonObject = (JSONObject) JSONValue.parseWithException(nameJson); + if (jsonObject != null) { + final String nick = jsonObject.get("name").toString(); + if (nick != null) { + return nick; } } } diff --git a/src/main/java/me/rigamortis/seppuku/impl/gui/hud/component/NotificationsComponent.java b/src/main/java/me/rigamortis/seppuku/impl/gui/hud/component/NotificationsComponent.java index 8852269..b10146e 100644 --- a/src/main/java/me/rigamortis/seppuku/impl/gui/hud/component/NotificationsComponent.java +++ b/src/main/java/me/rigamortis/seppuku/impl/gui/hud/component/NotificationsComponent.java @@ -35,7 +35,26 @@ public final class NotificationsComponent extends DraggableHudComponent { float maxWidth = 0; for (Notification notification : Seppuku.INSTANCE.getNotificationManager().getNotifications()) { - notification.setX(this.getX()); + + float offsetX = 0; + + if (this.getAnchorPoint() != null) { + switch (this.getAnchorPoint().getPoint()) { + case TOP_CENTER: + offsetX = (this.getW() - Minecraft.getMinecraft().fontRenderer.getStringWidth(notification.getText())) / 2; + break; + case TOP_LEFT: + case BOTTOM_LEFT: + offsetX = 0; + break; + case TOP_RIGHT: + case BOTTOM_RIGHT: + offsetX = this.getW() - Minecraft.getMinecraft().fontRenderer.getStringWidth(notification.getText()); + break; + } + } + + notification.setX(this.getX() + offsetX); notification.setY(this.getY() + offsetY); notification.setWidth(Minecraft.getMinecraft().fontRenderer.getStringWidth(notification.getText()) + 4); notification.setHeight(Minecraft.getMinecraft().fontRenderer.FONT_HEIGHT + 5); diff --git a/src/main/java/me/rigamortis/seppuku/impl/management/ModuleManager.java b/src/main/java/me/rigamortis/seppuku/impl/management/ModuleManager.java index 07786df..e28866e 100644 --- a/src/main/java/me/rigamortis/seppuku/impl/management/ModuleManager.java +++ b/src/main/java/me/rigamortis/seppuku/impl/management/ModuleManager.java @@ -142,6 +142,7 @@ public final class ModuleManager { add(new ShulkerPreviewModule()); add(new LogoutSpotsModule()); add(new ChatSuffixModule()); + add(new VisualRangeModule()); this.loadExternalModules(); } diff --git a/src/main/java/me/rigamortis/seppuku/impl/module/misc/LaggerModule.java b/src/main/java/me/rigamortis/seppuku/impl/module/misc/LaggerModule.java index a610196..cf8a973 100644 --- a/src/main/java/me/rigamortis/seppuku/impl/module/misc/LaggerModule.java +++ b/src/main/java/me/rigamortis/seppuku/impl/module/misc/LaggerModule.java @@ -8,7 +8,6 @@ import me.rigamortis.seppuku.api.value.OptionalValue; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.init.Items; -import net.minecraft.inventory.ClickType; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -21,10 +20,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentString; import team.stiff.pomelo.impl.annotated.handler.annotation.Listener; -import java.util.Random; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - /** * Author Seth * 5/3/2019 @ 8:49 PM. @@ -37,12 +32,8 @@ public final class LaggerModule extends Module { final Minecraft mc = Minecraft.getMinecraft(); - private String rand; - public LaggerModule() { super("Lagger", new String[]{"Lag"}, "Spams unoptimized packets", "NONE", -1, ModuleType.MISC); - final IntStream gen = new Random().ints(0x80, 0x10ffff - 0x800).map(i -> i < 0xd800 ? i : i + 0x800); - this.rand = gen.limit(1024).mapToObj(i -> String.valueOf((char) i)).collect(Collectors.joining()); } @Override @@ -91,7 +82,7 @@ public final class LaggerModule extends Module { final NBTTagList pages = new NBTTagList(); for (int page = 0; page < 50; page++) { - pages.appendTag(new NBTTagString(this.rand)); + pages.appendTag(new NBTTagString("192i9i1jr1fj8fj893fj84ujv8924jv2j4c8j248vj2498u2-894u10fuj0jhv20j204uv902jv90j209vj204vj")); } final NBTTagCompound tag = new NBTTagCompound(); @@ -102,7 +93,7 @@ public final class LaggerModule extends Module { for (int i = 0; i <= this.packets.getInt(); i++) { mc.player.connection.sendPacket(new CPacketCreativeInventoryAction(0, itemStack)); - // mc.player.connection.sendPacket(new CPacketClickWindow(0, 0, 0, ClickType.PICKUP, itemStack, (short)0)); + //mc.player.connection.sendPacket(new CPacketClickWindow(0, 0, 0, ClickType.PICKUP, itemStack, (short)0)); } break; } diff --git a/src/main/java/me/rigamortis/seppuku/impl/module/misc/VisualRangeModule.java b/src/main/java/me/rigamortis/seppuku/impl/module/misc/VisualRangeModule.java new file mode 100644 index 0000000..cd39658 --- /dev/null +++ b/src/main/java/me/rigamortis/seppuku/impl/module/misc/VisualRangeModule.java @@ -0,0 +1,52 @@ +package me.rigamortis.seppuku.impl.module.misc; + +import com.mojang.realmsclient.gui.ChatFormatting; +import me.rigamortis.seppuku.Seppuku; +import me.rigamortis.seppuku.api.event.world.EventAddEntity; +import me.rigamortis.seppuku.api.event.world.EventRemoveEntity; +import me.rigamortis.seppuku.api.friend.Friend; +import me.rigamortis.seppuku.api.module.Module; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import team.stiff.pomelo.impl.annotated.handler.annotation.Listener; + +/** + * Author Seth + * 11/10/2019 @ 4:20 AM. + */ +public final class VisualRangeModule extends Module { + + private int prevPlayer = -1; + + public VisualRangeModule() { + super("VisualRange", new String[]{"VisRange", "VRange", "VR"}, "Notifies you when players enter and leave your visual range", "NONE", -1, ModuleType.MISC); + } + + @Listener + public void onEntityAdded(EventAddEntity event) { + if (!Minecraft.getMinecraft().player.isDead && event.getEntity() instanceof EntityPlayer && !event.getEntity().getName().equalsIgnoreCase(Minecraft.getMinecraft().player.getName())) { + final Friend friend = Seppuku.INSTANCE.getFriendManager().isFriend(event.getEntity()); + final String msg = (friend != null ? ChatFormatting.DARK_PURPLE : ChatFormatting.RED) + (friend != null ? friend.getAlias() : event.getEntity().getName()) + ChatFormatting.WHITE + " has entered your visual range."; + Seppuku.INSTANCE.getNotificationManager().addNotification("", msg); + Seppuku.INSTANCE.logChat(msg); + if (event.getEntity().getEntityId() == this.prevPlayer) { + this.prevPlayer = -1; + } + } + } + + @Listener + public void onEntityRemove(EventRemoveEntity event) { + if (!Minecraft.getMinecraft().player.isDead && event.getEntity() instanceof EntityPlayer && !event.getEntity().getName().equalsIgnoreCase(Minecraft.getMinecraft().player.getName())) { + if (this.prevPlayer != event.getEntity().getEntityId()) { + this.prevPlayer = event.getEntity().getEntityId(); + final Friend friend = Seppuku.INSTANCE.getFriendManager().isFriend(event.getEntity()); + final String msg = (friend != null ? ChatFormatting.DARK_PURPLE : ChatFormatting.RED) + (friend != null ? friend.getAlias() : event.getEntity().getName()) + ChatFormatting.WHITE + " has left your visual range."; + Seppuku.INSTANCE.getNotificationManager().addNotification("", msg); + Seppuku.INSTANCE.logChat(msg); + } + } + } + + +} diff --git a/src/main/java/me/rigamortis/seppuku/impl/module/render/HolesModule.java b/src/main/java/me/rigamortis/seppuku/impl/module/render/HolesModule.java index c2c3e90..11bd562 100644 --- a/src/main/java/me/rigamortis/seppuku/impl/module/render/HolesModule.java +++ b/src/main/java/me/rigamortis/seppuku/impl/module/render/HolesModule.java @@ -3,6 +3,8 @@ package me.rigamortis.seppuku.impl.module.render; import me.rigamortis.seppuku.api.event.player.EventPlayerUpdate; import me.rigamortis.seppuku.api.event.render.EventRender3D; import me.rigamortis.seppuku.api.module.Module; +import me.rigamortis.seppuku.api.util.MathUtil; +import me.rigamortis.seppuku.api.value.BooleanValue; import me.rigamortis.seppuku.api.value.NumberValue; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; @@ -28,6 +30,8 @@ public final class HolesModule extends Module { public final NumberValue radius = new NumberValue("Radius", new String[]{"Radius", "Range", "Distance"}, 8, Integer.class, 0, 32, 1); + public final BooleanValue fade = new BooleanValue("Fade", new String[]{"f"}, true); + public final List holes = new ArrayList<>(); private ICamera camera = new Frustum(); @@ -98,8 +102,13 @@ public final class HolesModule extends Module { glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glLineWidth(1.5f); - RenderGlobal.renderFilledBox(bb, 0, 1, 0, 0.25f); - RenderGlobal.drawBoundingBox(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ, 0, 1, 0, 0.25f); + + final double dist = mc.player.getDistance(hole.getX() + 0.5f, hole.getY() + 0.5f, hole.getZ() + 0.5f) * 0.75f; + + float alpha = MathUtil.clamp((float) (dist * 255.0f / (this.radius.getInt()) / 255.0f), 0.0f, 0.3f); + + RenderGlobal.renderFilledBox(bb, 0, 1, 0, this.fade.getBoolean() ? alpha : 0.25f); + RenderGlobal.drawBoundingBox(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ, 0, 1, 0, this.fade.getBoolean() ? alpha : 0.25f); glDisable(GL_LINE_SMOOTH); GlStateManager.depthMask(true); GlStateManager.enableDepth(); @@ -165,4 +174,4 @@ public final class HolesModule extends Module { this.tall = tall; } } -} +} \ No newline at end of file diff --git a/src/main/java/me/rigamortis/seppuku/impl/module/render/LogoutSpotsModule.java b/src/main/java/me/rigamortis/seppuku/impl/module/render/LogoutSpotsModule.java index 9bca1a0..6738bd9 100644 --- a/src/main/java/me/rigamortis/seppuku/impl/module/render/LogoutSpotsModule.java +++ b/src/main/java/me/rigamortis/seppuku/impl/module/render/LogoutSpotsModule.java @@ -6,6 +6,7 @@ import me.rigamortis.seppuku.api.event.player.EventPlayerJoin; import me.rigamortis.seppuku.api.event.player.EventPlayerLeave; import me.rigamortis.seppuku.api.event.player.EventPlayerUpdate; import me.rigamortis.seppuku.api.event.render.EventRender2D; +import me.rigamortis.seppuku.api.event.render.EventRender3D; import me.rigamortis.seppuku.api.module.Module; import me.rigamortis.seppuku.api.texture.Texture; import me.rigamortis.seppuku.api.util.GLUProjection; @@ -25,7 +26,7 @@ public final class LogoutSpotsModule extends Module { public final NumberValue removeDistance = new NumberValue("RemoveDistance", new String[]{"RD", "RemoveRange"}, 200, Integer.class, 1, 2000, 1); - private final Map playerCache = Maps.newConcurrentMap(); + private final Map playerCache = Maps.newConcurrentMap(); private final Map logoutCache = Maps.newConcurrentMap(); private final Texture playerIcon = new Texture("location.png"); @@ -51,9 +52,39 @@ public final class LogoutSpotsModule extends Module { if (player == null || player.equals(mc.player)) continue; - final GameProfile gameProfile = player.getGameProfile(); - final String uuid = gameProfile.getId().toString(); - this.updatePlayerCache(uuid, new PlayerData(gameProfile.getName(), player.getPosition())); + //final PlayerData data = new PlayerData(player.getPosition(), player.getGameProfile(), (EntityOtherPlayerMP) player); + + this.updatePlayerCache(player.getGameProfile().getId().toString(), player); + } + } + + @Listener + public void onRenderWorld(EventRender3D event) { + final Minecraft mc = Minecraft.getMinecraft(); + + for (String uuid : this.logoutCache.keySet()) { + final PlayerData data = this.logoutCache.get(uuid); + + if (this.isOutOfRange(data)) { + this.logoutCache.remove(uuid); + continue; + } + + data.ghost.prevLimbSwingAmount = 0; + data.ghost.limbSwing = 0; + data.ghost.limbSwingAmount = 0; + + GlStateManager.pushMatrix(); + GlStateManager.enableLighting(); + GlStateManager.enableBlend(); + GlStateManager.enableAlpha(); + GlStateManager.enableDepth(); + GlStateManager.color(1, 1, 1, 1); + mc.getRenderManager().renderEntity(data.ghost, data.position.getX() - mc.getRenderManager().renderPosX, data.position.getY() - mc.getRenderManager().renderPosY, data.position.getZ() - mc.getRenderManager().renderPosZ, data.ghost.rotationYaw, mc.getRenderPartialTicks(), false); + GlStateManager.disableLighting(); + GlStateManager.disableBlend(); + GlStateManager.disableAlpha(); + GlStateManager.popMatrix(); } } @@ -73,8 +104,8 @@ public final class LogoutSpotsModule extends Module { if (projection != null && projection.isType(GLUProjection.Projection.Type.INSIDE)) { GlStateManager.pushMatrix(); GlStateManager.translate(projection.getX(), projection.getY(), 0); - playerIcon.render(-8, -16 - 2, 16, 16); - String text = data.username + " logout"; + //playerIcon.render(-8, -16 - 2, 16, 16); + String text = data.profile.getName() + " logout"; float textWidth = mc.fontRenderer.getStringWidth(text); mc.fontRenderer.drawStringWithShadow(text, -(textWidth / 2), 0, -1); GlStateManager.translate(-projection.getX(), -projection.getY(), 0); @@ -91,7 +122,9 @@ public final class LogoutSpotsModule extends Module { if (!uuid.equals(event.getUuid())) // not matching uuid continue; - final PlayerData data = this.playerCache.get(uuid); + final EntityPlayer player = this.playerCache.get(uuid); + + final PlayerData data = new PlayerData(player.getPosition(), player.getGameProfile(), player); if (!this.hasPlayerLogged(uuid)) { this.logoutCache.put(uuid, data); @@ -119,8 +152,8 @@ public final class LogoutSpotsModule extends Module { this.logoutCache.remove(uuid); } - private void updatePlayerCache(String uuid, PlayerData data) { - this.playerCache.put(uuid, data); + private void updatePlayerCache(String uuid, EntityPlayer player) { + this.playerCache.put(uuid, player); } private boolean hasPlayerLogged(String uuid) { @@ -133,12 +166,14 @@ public final class LogoutSpotsModule extends Module { } private class PlayerData { - String username; BlockPos position; + GameProfile profile; + EntityPlayer ghost; - PlayerData(String username, BlockPos position) { - this.username = username; + public PlayerData(BlockPos position, GameProfile profile, EntityPlayer ghost) { this.position = position; + this.profile = profile; + this.ghost = ghost; } } } diff --git a/src/main/java/me/rigamortis/seppuku/impl/patch/WorldPatch.java b/src/main/java/me/rigamortis/seppuku/impl/patch/WorldPatch.java index 46d0858..4d8ae0f 100644 --- a/src/main/java/me/rigamortis/seppuku/impl/patch/WorldPatch.java +++ b/src/main/java/me/rigamortis/seppuku/impl/patch/WorldPatch.java @@ -1,11 +1,14 @@ package me.rigamortis.seppuku.impl.patch; import me.rigamortis.seppuku.Seppuku; +import me.rigamortis.seppuku.api.event.world.EventAddEntity; import me.rigamortis.seppuku.api.event.world.EventLightUpdate; import me.rigamortis.seppuku.api.event.world.EventRainStrength; +import me.rigamortis.seppuku.api.event.world.EventRemoveEntity; import me.rigamortis.seppuku.api.patch.ClassPatch; import me.rigamortis.seppuku.api.patch.MethodPatch; import me.rigamortis.seppuku.impl.management.PatchManager; +import net.minecraft.entity.Entity; import org.objectweb.asm.Type; import org.objectweb.asm.tree.*; @@ -83,4 +86,36 @@ public final class WorldPatch extends ClassPatch { return event.isCanceled(); } + @MethodPatch( + mcpName = "onEntityAdded", + notchName = "b", + mcpDesc = "(Lnet/minecraft/entity/Entity;)V", + notchDesc = "(Lvg;)V") + public void onEntityAdded(MethodNode methodNode, PatchManager.Environment env) { + final InsnList list = new InsnList(); + list.add(new VarInsnNode(ALOAD, 1)); + list.add(new MethodInsnNode(INVOKESTATIC, Type.getInternalName(this.getClass()), "onEntityAddedHook", env == PatchManager.Environment.IDE ? "(Lnet/minecraft/entity/Entity;)V" : "(Lvg;)V", false)); + methodNode.instructions.insert(list); + } + + public static void onEntityAddedHook(Entity entity) { + Seppuku.INSTANCE.getEventManager().dispatchEvent(new EventAddEntity(entity)); + } + + @MethodPatch( + mcpName = "onEntityRemoved", + notchName = "c", + mcpDesc = "(Lnet/minecraft/entity/Entity;)V", + notchDesc = "(Lvg;)V") + public void onEntityRemoved(MethodNode methodNode, PatchManager.Environment env) { + final InsnList list = new InsnList(); + list.add(new VarInsnNode(ALOAD, 1)); + list.add(new MethodInsnNode(INVOKESTATIC, Type.getInternalName(this.getClass()), "onEntityRemovedHook", env == PatchManager.Environment.IDE ? "(Lnet/minecraft/entity/Entity;)V" : "(Lvg;)V", false)); + methodNode.instructions.insert(list); + } + + public static void onEntityRemovedHook(Entity entity) { + Seppuku.INSTANCE.getEventManager().dispatchEvent(new EventRemoveEntity(entity)); + } + }