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)

This commit is contained in:
riga 2019-11-18 19:43:30 -09:00
parent 1c07097367
commit 557b3f967a
10 changed files with 224 additions and 38 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -1,7 +1,6 @@
package me.rigamortis.seppuku.api.util; package me.rigamortis.seppuku.api.util;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.JSONValue; import org.json.simple.JSONValue;
import org.json.simple.parser.ParseException; import org.json.simple.parser.ParseException;
@ -16,18 +15,15 @@ import java.util.UUID;
public final class NetworkUtil { public final class NetworkUtil {
public static String resolveUsername(UUID id) { 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 { try {
final String nameJson = IOUtils.toString(new URL(url)); final String nameJson = IOUtils.toString(new URL(url));
if (nameJson != null) { if (nameJson != null && nameJson.length() > 0) {
final JSONArray nameValue = (JSONArray) JSONValue.parseWithException(nameJson); final JSONObject jsonObject = (JSONObject) JSONValue.parseWithException(nameJson);
if (nameValue != null) { if (jsonObject != null) {
final String playerSlot = nameValue.get(nameValue.size() - 1).toString(); final String nick = jsonObject.get("name").toString();
if (playerSlot != null) { if (nick != null) {
final JSONObject nameObject = (JSONObject) JSONValue.parseWithException(playerSlot); return nick;
if (nameObject != null) {
return nameObject.get("name").toString();
}
} }
} }
} }

View File

@ -35,7 +35,26 @@ public final class NotificationsComponent extends DraggableHudComponent {
float maxWidth = 0; float maxWidth = 0;
for (Notification notification : Seppuku.INSTANCE.getNotificationManager().getNotifications()) { 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.setY(this.getY() + offsetY);
notification.setWidth(Minecraft.getMinecraft().fontRenderer.getStringWidth(notification.getText()) + 4); notification.setWidth(Minecraft.getMinecraft().fontRenderer.getStringWidth(notification.getText()) + 4);
notification.setHeight(Minecraft.getMinecraft().fontRenderer.FONT_HEIGHT + 5); notification.setHeight(Minecraft.getMinecraft().fontRenderer.FONT_HEIGHT + 5);

View File

@ -142,6 +142,7 @@ public final class ModuleManager {
add(new ShulkerPreviewModule()); add(new ShulkerPreviewModule());
add(new LogoutSpotsModule()); add(new LogoutSpotsModule());
add(new ChatSuffixModule()); add(new ChatSuffixModule());
add(new VisualRangeModule());
this.loadExternalModules(); this.loadExternalModules();
} }

View File

@ -8,7 +8,6 @@ import me.rigamortis.seppuku.api.value.OptionalValue;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.init.Items; import net.minecraft.init.Items;
import net.minecraft.inventory.ClickType;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagList;
@ -21,10 +20,6 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextComponentString;
import team.stiff.pomelo.impl.annotated.handler.annotation.Listener; 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 * Author Seth
* 5/3/2019 @ 8:49 PM. * 5/3/2019 @ 8:49 PM.
@ -37,12 +32,8 @@ public final class LaggerModule extends Module {
final Minecraft mc = Minecraft.getMinecraft(); final Minecraft mc = Minecraft.getMinecraft();
private String rand;
public LaggerModule() { public LaggerModule() {
super("Lagger", new String[]{"Lag"}, "Spams unoptimized packets", "NONE", -1, ModuleType.MISC); 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 @Override
@ -91,7 +82,7 @@ public final class LaggerModule extends Module {
final NBTTagList pages = new NBTTagList(); final NBTTagList pages = new NBTTagList();
for (int page = 0; page < 50; page++) { for (int page = 0; page < 50; page++) {
pages.appendTag(new NBTTagString(this.rand)); pages.appendTag(new NBTTagString("192i9i1jr1fj8fj893fj84ujv8924jv2j4c8j248vj2498u2-894u10fuj0jhv20j204uv902jv90j209vj204vj"));
} }
final NBTTagCompound tag = new NBTTagCompound(); final NBTTagCompound tag = new NBTTagCompound();
@ -102,7 +93,7 @@ public final class LaggerModule extends Module {
for (int i = 0; i <= this.packets.getInt(); i++) { for (int i = 0; i <= this.packets.getInt(); i++) {
mc.player.connection.sendPacket(new CPacketCreativeInventoryAction(0, itemStack)); 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; break;
} }

View File

@ -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);
}
}
}
}

View File

@ -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.player.EventPlayerUpdate;
import me.rigamortis.seppuku.api.event.render.EventRender3D; import me.rigamortis.seppuku.api.event.render.EventRender3D;
import me.rigamortis.seppuku.api.module.Module; 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 me.rigamortis.seppuku.api.value.NumberValue;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft; 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 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<Hole> holes = new ArrayList<>(); public final List<Hole> holes = new ArrayList<>();
private ICamera camera = new Frustum(); private ICamera camera = new Frustum();
@ -98,8 +102,13 @@ public final class HolesModule extends Module {
glEnable(GL_LINE_SMOOTH); glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glLineWidth(1.5f); 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); glDisable(GL_LINE_SMOOTH);
GlStateManager.depthMask(true); GlStateManager.depthMask(true);
GlStateManager.enableDepth(); GlStateManager.enableDepth();
@ -165,4 +174,4 @@ public final class HolesModule extends Module {
this.tall = tall; this.tall = tall;
} }
} }
} }

View File

@ -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.EventPlayerLeave;
import me.rigamortis.seppuku.api.event.player.EventPlayerUpdate; import me.rigamortis.seppuku.api.event.player.EventPlayerUpdate;
import me.rigamortis.seppuku.api.event.render.EventRender2D; 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.module.Module;
import me.rigamortis.seppuku.api.texture.Texture; import me.rigamortis.seppuku.api.texture.Texture;
import me.rigamortis.seppuku.api.util.GLUProjection; import me.rigamortis.seppuku.api.util.GLUProjection;
@ -25,7 +26,7 @@ public final class LogoutSpotsModule extends Module {
public final NumberValue<Integer> removeDistance = new NumberValue<Integer>("RemoveDistance", new String[]{"RD", "RemoveRange"}, 200, Integer.class, 1, 2000, 1); public final NumberValue<Integer> removeDistance = new NumberValue<Integer>("RemoveDistance", new String[]{"RD", "RemoveRange"}, 200, Integer.class, 1, 2000, 1);
private final Map<String, PlayerData> playerCache = Maps.newConcurrentMap(); private final Map<String, EntityPlayer> playerCache = Maps.newConcurrentMap();
private final Map<String, PlayerData> logoutCache = Maps.newConcurrentMap(); private final Map<String, PlayerData> logoutCache = Maps.newConcurrentMap();
private final Texture playerIcon = new Texture("location.png"); 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)) if (player == null || player.equals(mc.player))
continue; continue;
final GameProfile gameProfile = player.getGameProfile(); //final PlayerData data = new PlayerData(player.getPosition(), player.getGameProfile(), (EntityOtherPlayerMP) player);
final String uuid = gameProfile.getId().toString();
this.updatePlayerCache(uuid, new PlayerData(gameProfile.getName(), player.getPosition())); 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)) { if (projection != null && projection.isType(GLUProjection.Projection.Type.INSIDE)) {
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
GlStateManager.translate(projection.getX(), projection.getY(), 0); GlStateManager.translate(projection.getX(), projection.getY(), 0);
playerIcon.render(-8, -16 - 2, 16, 16); //playerIcon.render(-8, -16 - 2, 16, 16);
String text = data.username + " logout"; String text = data.profile.getName() + " logout";
float textWidth = mc.fontRenderer.getStringWidth(text); float textWidth = mc.fontRenderer.getStringWidth(text);
mc.fontRenderer.drawStringWithShadow(text, -(textWidth / 2), 0, -1); mc.fontRenderer.drawStringWithShadow(text, -(textWidth / 2), 0, -1);
GlStateManager.translate(-projection.getX(), -projection.getY(), 0); 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 if (!uuid.equals(event.getUuid())) // not matching uuid
continue; 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)) { if (!this.hasPlayerLogged(uuid)) {
this.logoutCache.put(uuid, data); this.logoutCache.put(uuid, data);
@ -119,8 +152,8 @@ public final class LogoutSpotsModule extends Module {
this.logoutCache.remove(uuid); this.logoutCache.remove(uuid);
} }
private void updatePlayerCache(String uuid, PlayerData data) { private void updatePlayerCache(String uuid, EntityPlayer player) {
this.playerCache.put(uuid, data); this.playerCache.put(uuid, player);
} }
private boolean hasPlayerLogged(String uuid) { private boolean hasPlayerLogged(String uuid) {
@ -133,12 +166,14 @@ public final class LogoutSpotsModule extends Module {
} }
private class PlayerData { private class PlayerData {
String username;
BlockPos position; BlockPos position;
GameProfile profile;
EntityPlayer ghost;
PlayerData(String username, BlockPos position) { public PlayerData(BlockPos position, GameProfile profile, EntityPlayer ghost) {
this.username = username;
this.position = position; this.position = position;
this.profile = profile;
this.ghost = ghost;
} }
} }
} }

View File

@ -1,11 +1,14 @@
package me.rigamortis.seppuku.impl.patch; package me.rigamortis.seppuku.impl.patch;
import me.rigamortis.seppuku.Seppuku; 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.EventLightUpdate;
import me.rigamortis.seppuku.api.event.world.EventRainStrength; 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.ClassPatch;
import me.rigamortis.seppuku.api.patch.MethodPatch; import me.rigamortis.seppuku.api.patch.MethodPatch;
import me.rigamortis.seppuku.impl.management.PatchManager; import me.rigamortis.seppuku.impl.management.PatchManager;
import net.minecraft.entity.Entity;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
import org.objectweb.asm.tree.*; import org.objectweb.asm.tree.*;
@ -83,4 +86,36 @@ public final class WorldPatch extends ClassPatch {
return event.isCanceled(); 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));
}
} }