From 32cd3d23055a4dc861d8b6957c806de23cb06a5f Mon Sep 17 00:00:00 2001 From: SerendipityR <48401197+SerendipityR-2022@users.noreply.github.com> Date: Fri, 2 Feb 2024 00:28:48 +0800 Subject: [PATCH] =?UTF-8?q?Add:=20=E6=9B=B4=E6=96=B0=E7=AE=80=E6=98=93?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E6=96=B9=E6=B3=95=EF=BC=8C=E8=87=AA=E5=8A=A8?= =?UTF-8?q?NPC=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EndMinecraftPlusV2.java | 4 +- Main/src/config.yml | 27 ++- .../EndMinecraftPlusV2/Tools/ConfigUtil.java | 4 + .../MultipleVersion/Bot/BotManager.java | 80 +++++++ .../MultipleVersion/Packet/PacketHandler.java | 33 +++ .../MultipleVersion/Packet/PacketManager.java | 73 +++++- .../VersionSupport/P1_12_2/PacketHandler.java | 214 ++++++++++++++++- .../VersionSupport/P1_13_X/PacketHandler.java | 220 +++++++++++++++++- .../VersionSupport/P1_14_X/PacketHandler.java | 219 ++++++++++++++++- .../VersionSupport/P1_15_X/PacketHandler.java | 215 ++++++++++++++++- .../VersionSupport/P1_16_X/PacketHandler.java | 217 +++++++++++++++-- .../VersionSupport/P1_17_X/PacketHandler.java | 217 +++++++++++++++-- .../VersionSupport/P1_18_X/PacketHandler.java | 212 ++++++++++++++++- .../VersionSupport/P1_19/PacketHandler.java | 208 ++++++++++++++++- .../P1_19_1_1_19_2/PacketHandler.java | 208 ++++++++++++++++- .../P1_19_3_1_20_1/PacketHandler.java | 208 ++++++++++++++++- .../VersionSupport/P1_20_X/PacketHandler.java | 214 ++++++++++++++++- .../VersionSupport/P1_7_X/PacketHandler.java | 208 ++++++++++++++++- .../VersionSupport/P1_8_X/PacketHandler.java | 208 ++++++++++++++++- .../P1_9_X_1_12_1/PacketHandler.java | 214 ++++++++++++++++- 20 files changed, 3077 insertions(+), 126 deletions(-) diff --git a/Main/src/cn/serendipityr/EndMinecraftPlusV2/EndMinecraftPlusV2.java b/Main/src/cn/serendipityr/EndMinecraftPlusV2/EndMinecraftPlusV2.java index 5a0069f..924efb4 100644 --- a/Main/src/cn/serendipityr/EndMinecraftPlusV2/EndMinecraftPlusV2.java +++ b/Main/src/cn/serendipityr/EndMinecraftPlusV2/EndMinecraftPlusV2.java @@ -6,8 +6,8 @@ import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.SetTitle; public class EndMinecraftPlusV2 { - public static String ver = "2.0.4"; - public static Integer CfgVer = 11; + public static String ver = "2.0.6"; + public static Integer CfgVer = 12; public static void main(String[] args) { System.out.println("=======================-Designed by SerendipityR-======================="); diff --git a/Main/src/config.yml b/Main/src/config.yml index 1097045..42d53bd 100644 --- a/Main/src/config.yml +++ b/Main/src/config.yml @@ -3,7 +3,7 @@ # Designed by SerendipityR # ############################### -CfgVer: 11 +CfgVer: 12 AttackSettings: Address: "example.com" @@ -37,11 +37,16 @@ AttackSettings: # backTeleport - 回到重生点 # register&Login - 执行注册/登录:<密码> # crashPacket - 发送崩服数据包:<数量> + # goToLobby - 尝试寻找并与加入大厅NPC交互 + # moveToLocation - 向目标位置移动:__ Actions: - "wait:2000" - "register&Login:genshinImpact" - "wait:1000" - "chat:原神,启动!" + #- "moveToLocation:13_75_0" + - "goToLobby" + - "wait:30000" #- "randomTeleport:1" #- "wait:1000" #- "backTeleport" @@ -121,6 +126,14 @@ BotSettings: # 针对特定服务器,利用全服喊话跳出登录大厅 ServerShoutDetect: - "tpserver" + # 检测出生点附近的NPC名称 + # 实现通过NPC加入服务器大厅 + JoinNPCDetect: + - "点击加入" + # 与NPC交互后可能返回交互界面 + # 若界面内存在匹配的物品,则尝试模拟物品点击 + JoinLobbyItem: + - "LEFT:点击加入" # 若聊天信息中检测到以下字段,则尝试进行点击验证 ClickVerifiesDetect: - "点击验证" @@ -146,15 +159,19 @@ BotSettings: # register&Login - 执行注册/登录:<是否使用已生成密码>_<自定义密码> - Flag:login # crashPacket - 发送崩服数据包:<数量>_ # tabAttack - 执行Tab补全:<数量>_<间隔(ms)>_ + # moveToLocation - 向目标位置移动:<只执行一次>____ + # goToLobby - 尝试寻找并与加入大厅NPC交互: (只执行一次) Actions: - "wait:3000_none" - "register&Login:true_genshinImpact" - "async|chatSpam:10_3000_login" - - "async|randomTeleport:25_100_login" + #- "async|randomTeleport:25_100_login" - "wait:3000_login" - - "async|backTeleport:login" - - "async|crashPacket:75_login" - - "async|tabAttack:25_75_login" + #- "async|backTeleport:login" + #- "async|crashPacket:75_login" + #- "async|tabAttack:25_75_login" + - "goToLobby:login" + #- "async|moveToLocation:true_13_75_0_login" Proxy: # 代理获取方式: diff --git a/Tools/src/cn/serendipityr/EndMinecraftPlusV2/Tools/ConfigUtil.java b/Tools/src/cn/serendipityr/EndMinecraftPlusV2/Tools/ConfigUtil.java index d0c84de..15389ac 100644 --- a/Tools/src/cn/serendipityr/EndMinecraftPlusV2/Tools/ConfigUtil.java +++ b/Tools/src/cn/serendipityr/EndMinecraftPlusV2/Tools/ConfigUtil.java @@ -49,6 +49,8 @@ public class ConfigUtil { public static List RejoinDetect; public static Boolean EmptyMsgRejoin; public static List ServerShoutDetect; + public static List JoinNPCDetect; + public static List JoinLobbyItem; public static Long RejoinDelay; public static List ClickVerifiesDetect; public static List CustomChat; @@ -113,6 +115,8 @@ public class ConfigUtil { RejoinDetect = config.getStringList("BotSettings.RejoinDetect"); EmptyMsgRejoin = config.getBoolean("BotSettings.EmptyMsgRejoin"); ServerShoutDetect = config.getStringList("BotSettings.ServerShoutDetect"); + JoinNPCDetect = config.getStringList("BotSettings.JoinNPCDetect"); + JoinLobbyItem = config.getStringList("BotSettings.JoinLobbyItem"); RejoinDelay = config.getLong("BotSettings.RejoinDelay"); ClickVerifiesDetect = config.getStringList("BotSettings.ClickVerifiesDetect"); CustomChat = config.getStringList("BotSettings.CustomChat"); diff --git a/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Bot/BotManager.java b/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Bot/BotManager.java index b9f0a35..b61caea 100644 --- a/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Bot/BotManager.java +++ b/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Bot/BotManager.java @@ -6,6 +6,7 @@ import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.*; import java.net.Proxy; +import java.util.Arrays; import java.util.Random; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; @@ -47,6 +48,10 @@ public class BotManager { if (ConfigUtil.DebugPlayerActivities) { for (String action : ConfigUtil.DebugPlayerActions) { + if (!botHandler.checkClientStatus(client)) { + break; + } + String[] _action = action.split(":"); switch (_action[0]) { case "wait": @@ -82,6 +87,23 @@ public class BotManager { LogUtil.doLog(0, "[DEBUG] [行动] 尝试发送崩服数据包: " + count_ + "个", "BotAttack"); sendCrashPacket(client, count_); break; + case "moveToLocation": + String[] moveArgs = _action[1].split("_"); + Double[] loc = new Double[]{Double.valueOf(moveArgs[0]), Double.valueOf(moveArgs[1]), Double.valueOf(moveArgs[2])}; + LogUtil.doLog(0, "[DEBUG] [行动] 尝试移动到指定位置: " + Arrays.toString(loc), "BotAttack"); + moveToLocation(client, loc); + break; + case "goToLobby": + Object npc = getNpc(); + Double[] npcLoc = packetHandler.getSpawnPlayerLocation(npc); + if (npcLoc == null) { + return; + } + LogUtil.doLog(0, "[DEBUG] [行动] 尝试移动到NPC所处位置: " + Arrays.toString(npcLoc), "BotAttack"); + moveToLocation(client, npcLoc); + LogUtil.doLog(0, "[DEBUG] [行动] 尝试与NPC交互: " + Arrays.toString(npcLoc), "BotAttack"); + packetHandler.sendPlayerInteractEntityPacket(client, packetHandler.getSpawnPlayerEntityId(npc), new float[]{npcLoc[0].floatValue(), npcLoc[1].floatValue(), npcLoc[2].floatValue()}); + break; default: LogUtil.doLog(0, "[DEBUG] [行动] 无法识别的action语句: " + action, "BotAttack"); } @@ -204,6 +226,11 @@ public class BotManager { botHandler.setClientFlag(client, "activity", true); for (String action : ConfigUtil.BotActions) { + if (!botHandler.checkClientStatus(client)) { + botHandler.setClientFlag(client, "activity", false); + break; + } + boolean async = "async".equals(action.split("\\|")[0]); String[] _action; @@ -314,6 +341,36 @@ public class BotManager { } } break; + case "moveToLocation": + String[] moveArgs = _action[1].split("_"); + boolean doOnce = Boolean.parseBoolean(moveArgs[0]); + if (doOnce && botHandler.hasClientFlag(client, "moved")) { + return; + } else if (doOnce) { + botHandler.setClientFlag(client, "moved", true); + } + Double[] loc = new Double[]{Double.valueOf(moveArgs[1]), Double.valueOf(moveArgs[2]), Double.valueOf(moveArgs[3])}; + if (ConfigUtil.BotActionDetails) { + LogUtil.doLog(0, "[" + userName + "] [行动] 尝试移动到指定位置: " + Arrays.toString(loc), "BotAttack"); + } + moveToLocation(client, loc); + break; + case "goToLobby": + // 必须禁用默认处理方式 + Object npc = getNpc(); + Double[] npcLoc = packetHandler.getSpawnPlayerLocation(npc); + if (npcLoc == null) { + return; + } + if (ConfigUtil.BotActionDetails) { + LogUtil.doLog(0, "[" + userName + "] [行动] 尝试移动到NPC所处位置: " + Arrays.toString(npcLoc), "BotAttack"); + } + moveToLocation(client, npcLoc); + if (ConfigUtil.BotActionDetails) { + LogUtil.doLog(0, "[" + userName + "] [行动] 尝试与NPC交互: " + Arrays.toString(npcLoc), "BotAttack"); + } + packetHandler.sendPlayerInteractEntityPacket(client, packetHandler.getSpawnPlayerEntityId(npc), new float[]{npcLoc[0].floatValue(), npcLoc[1].floatValue(), npcLoc[2].floatValue()}); + break; default: LogUtil.doLog(0, "[" + userName + "] [行动] 无法识别的action语句: " + action, "BotAttack"); } @@ -438,4 +495,27 @@ public class BotManager { break; } } + + public static void moveToLocation(Object client, Double[] loc) { + // 必须禁用默认处理方式 + boolean moveHandler = ConfigUtil.PacketHandlerMove; + + ConfigUtil.PacketHandlerMove = false; + if (!BotManager.positionList.containsKey(client)) { + LogUtil.doLog(0, "[行动] 尝试移动到指定位置时发生错误! 无法确定原点位置。", "BotAttack"); + return; + } + + packetHandler.moveToLocation(client, loc, 0.2); + ConfigUtil.PacketHandlerMove = moveHandler; + } + + public static Object getNpc() { + if (PacketManager.npcDetect.isEmpty()) { + LogUtil.doLog(0, "[行动] 尝试获取NPC信息时发生错误! 目标不存在。", "BotAttack"); + return null; + } + + return PacketManager.npcDetect.get(0); + } } diff --git a/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Packet/PacketHandler.java b/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Packet/PacketHandler.java index 5c07405..b7a22f2 100644 --- a/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Packet/PacketHandler.java +++ b/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Packet/PacketHandler.java @@ -1,5 +1,7 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet; +import java.util.List; + public interface PacketHandler { boolean checkServerPluginMessagePacket(Object packet); @@ -25,6 +27,37 @@ public interface PacketHandler { void handleServerPlayerHealthPacket(Object client, Object packet, String username); + boolean checkServerSpawnPlayerPacket(Object packet); + boolean checkSpawnPlayerName(Object packet, String checkName); + Double[] getSpawnPlayerLocation(Object packet); + int getSpawnPlayerEntityId(Object packet); + + void moveToLocation(Object client, Double[] targetLocation, double moveSpeed); + + boolean checkServerOpenWindowPacket(Object packet); + + int getWindowIDFromServerOpenWindowPacket(Object packet); + + int getWindowSlotsFromPacket(Object packet); + + String getWindowNameFromPacket(Object packet); + + boolean checkServerWindowItemsPacket(Object packet); + + int getWindowIDFromWindowItemsPacket(Object packet); + + Object[] getItemStackFromWindowItemsPacket(Object packet); + + String getItemName(Object itemStack); + + List getItemLore(Object itemStack); + + void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location); + + void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack); + + void sendRightClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack); + void handleOtherPacket(Object packet); void sendChatPacket(Object client, String text); diff --git a/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Packet/PacketManager.java b/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Packet/PacketManager.java index 76ff40b..2b217ed 100644 --- a/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Packet/PacketManager.java +++ b/VersionFactory/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/Packet/PacketManager.java @@ -4,9 +4,14 @@ import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + public class PacketManager { public static int clickVerifies = 0; public static String serverShoutCmd = null; + public static List npcDetect = new CopyOnWriteArrayList<>(); public static void handlePacket(PacketHandler packetHandler, Object client, Object packet, String username) { if (packetHandler.checkServerPluginMessagePacket(packet)) { @@ -35,10 +40,72 @@ public class PacketManager { packetHandler.handleServerPlayerHealthPacket(client, packet, username); } else if (packetHandler.checkServerPlayerPositionRotationPacket(packet)) { // 移动数据包 - if (ConfigUtil.PacketHandlerMove) { - packetHandler.handleServerPlayerPositionRotationPacket(client, packet, username); - } + packetHandler.handleServerPlayerPositionRotationPacket(client, packet, username); BotManager.positionList.put(client, packet); + } else if (packetHandler.checkServerSpawnPlayerPacket(packet)) { + // 其他玩家位置数据包 + boolean add = true; + for (String checkName : ConfigUtil.JoinNPCDetect) { + if (!packetHandler.checkSpawnPlayerName(packet, checkName)) { + add = false; + break; + } + } + if (add && !npcDetect.contains(packet)) { + LogUtil.doLog(0, "存在符合条件的NPC: " + Arrays.toString(packetHandler.getSpawnPlayerLocation(packet)), "NPCDetect"); + npcDetect.add(packet); + } + } else if (packetHandler.checkServerOpenWindowPacket(packet)) { + // 收到打开Inventory数据包 + if (ConfigUtil.BotActionDetails) { + LogUtil.doLog(0, "[" + username + "] 打开可交互窗口: ID - " + packetHandler.getWindowIDFromServerOpenWindowPacket(packet) + " | 名称 - " + packetHandler.getWindowNameFromPacket(packet) + " | 大小 - " + packetHandler.getWindowSlotsFromPacket(packet), "NPCDetect"); + } + } else if (packetHandler.checkServerWindowItemsPacket(packet)) { + // 收到Inventory物品数据包 + int windowID = packetHandler.getWindowIDFromWindowItemsPacket(packet); + Object[] itemStacks = packetHandler.getItemStackFromWindowItemsPacket(packet); + int windowSize = itemStacks.length; + if (ConfigUtil.BotActionDetails) { + LogUtil.doLog(0, "[" + username + "] 收到可交互窗口物品数据: ID - " + windowID + " | 大小 - " + windowSize, "NPCDetect"); + } + + for (int i = 0; i < windowSize; i++) { + Object item = itemStacks[i]; + if (item == null) { + continue; + } + + String itemName = packetHandler.getItemName(item); + List itemLore = packetHandler.getItemLore(item); + if (ConfigUtil.BotActionDetails) { + LogUtil.doLog(0, "[" + username + "] 收到可交互窗口物品数据: ID - " + windowID + " | 位置 - " + i + " | 名称: " + itemName + " | Lore: " + itemLore, "NPCDetect"); + } + + boolean interact = false; + boolean left = true; + for (String action : ConfigUtil.JoinLobbyItem) { + String[] actionParts = action.split(":"); + if (actionParts[0].equals("RIGHT")) { + left = false; + } + + String actionValue = actionParts[1]; + if ((itemLore != null && itemLore.stream().anyMatch(lore -> lore.contains(actionValue))) || (itemName != null && itemName.contains(actionValue))) { + interact = true; + break; + } + } + + if (interact) { + LogUtil.doLog(0, "[" + username + "] 已发送窗口点击数据: ID - " + windowID + " | 位置 - " + i, "NPCDetect"); + if (left) { + packetHandler.sendLeftClickWindowItemPacket(client, windowID, i, item); + } else { + packetHandler.sendRightClickWindowItemPacket(client, windowID, i, item); + } + break; + } + } } else { // packetHandler.handleOtherPacket(packet); } diff --git a/VersionSupport-P1_12_2/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_12_2/PacketHandler.java b/VersionSupport-P1_12_2/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_12_2/PacketHandler.java index 640a79e..4b6ed8b 100644 --- a/VersionSupport-P1_12_2/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_12_2/PacketHandler.java +++ b/VersionSupport-P1_12_2/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_12_2/PacketHandler.java @@ -3,6 +3,7 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_12_ import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.CatAntiCheat.CatAntiCheat; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; @@ -11,15 +12,18 @@ import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import org.spacehq.mc.protocol.data.game.ClientRequest; +import org.spacehq.mc.protocol.data.game.entity.metadata.EntityMetadata; import org.spacehq.mc.protocol.data.game.entity.metadata.ItemStack; import org.spacehq.mc.protocol.data.game.entity.player.Hand; +import org.spacehq.mc.protocol.data.game.entity.player.InteractAction; import org.spacehq.mc.protocol.data.game.setting.ChatVisibility; import org.spacehq.mc.protocol.data.game.setting.SkinPart; +import org.spacehq.mc.protocol.data.game.window.ClickItemParam; +import org.spacehq.mc.protocol.data.game.window.WindowAction; import org.spacehq.mc.protocol.data.message.Message; import org.spacehq.mc.protocol.packet.ingame.client.*; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerChangeHeldItemPacket; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerMovementPacket; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket; +import org.spacehq.mc.protocol.packet.ingame.client.player.*; +import org.spacehq.mc.protocol.packet.ingame.client.window.ClientWindowActionPacket; import org.spacehq.mc.protocol.packet.ingame.client.world.ClientTeleportConfirmPacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerChatPacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerJoinGamePacket; @@ -27,6 +31,9 @@ import org.spacehq.mc.protocol.packet.ingame.server.ServerKeepAlivePacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerPluginMessagePacket; import org.spacehq.mc.protocol.packet.ingame.server.entity.player.ServerPlayerHealthPacket; import org.spacehq.mc.protocol.packet.ingame.server.entity.player.ServerPlayerPositionRotationPacket; +import org.spacehq.mc.protocol.packet.ingame.server.entity.spawn.ServerSpawnPlayerPacket; +import org.spacehq.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket; +import org.spacehq.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket; import org.spacehq.opennbt.NBTIO; import org.spacehq.opennbt.tag.builtin.CompoundTag; import org.spacehq.opennbt.tag.builtin.ListTag; @@ -40,9 +47,14 @@ import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ServerPluginMessagePacket; @@ -112,10 +124,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { Session session = ((Client) client).getSession(); - ServerPlayerPositionRotationPacket packet = (ServerPlayerPositionRotationPacket) recvPacket; - ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(packet.getTeleportId()); - session.send(teleportConfirmPacket); - sendClientPlayerMovementPacket(session, true); + ServerPlayerPositionRotationPacket positionRotationPacket = (ServerPlayerPositionRotationPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -160,6 +178,188 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ServerSpawnPlayerPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + + for (EntityMetadata metadata:playerPacket.getMetadata()) { + if (metadata.getValue().toString().contains(checkName)) { + return true; + } + } + + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + Session session = ((Client) client).getSession(); + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ClientPlayerPositionPacket playerPositionPacket = new ClientPlayerPositionPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ServerOpenWindowPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getWindowId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getSlots(); + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ServerWindowItemsPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getWindowId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNBT(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNBT(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + Session session = ((Client) client).getSession(); + ClientPlayerInteractEntityPacket interactEntityPacket = new ClientPlayerInteractEntityPacket(entityId, InteractAction.INTERACT); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.LEFT_CLICK); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.RIGHT_CLICK); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { } diff --git a/VersionSupport-P1_13_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_13_X/PacketHandler.java b/VersionSupport-P1_13_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_13_X/PacketHandler.java index 75be6d7..537edeb 100644 --- a/VersionSupport-P1_13_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_13_X/PacketHandler.java +++ b/VersionSupport-P1_13_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_13_X/PacketHandler.java @@ -3,6 +3,7 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_13_ import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.CatAntiCheat.CatAntiCheat; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; @@ -11,14 +12,18 @@ import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import org.spacehq.mc.protocol.data.game.ClientRequest; +import org.spacehq.mc.protocol.data.game.entity.metadata.EntityMetadata; +import org.spacehq.mc.protocol.data.game.entity.metadata.ItemStack; import org.spacehq.mc.protocol.data.game.entity.player.Hand; +import org.spacehq.mc.protocol.data.game.entity.player.InteractAction; import org.spacehq.mc.protocol.data.game.setting.ChatVisibility; import org.spacehq.mc.protocol.data.game.setting.SkinPart; +import org.spacehq.mc.protocol.data.game.window.ClickItemParam; +import org.spacehq.mc.protocol.data.game.window.WindowAction; import org.spacehq.mc.protocol.data.message.Message; import org.spacehq.mc.protocol.packet.ingame.client.*; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerChangeHeldItemPacket; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerMovementPacket; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket; +import org.spacehq.mc.protocol.packet.ingame.client.player.*; +import org.spacehq.mc.protocol.packet.ingame.client.window.ClientWindowActionPacket; import org.spacehq.mc.protocol.packet.ingame.client.world.ClientTeleportConfirmPacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerChatPacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerJoinGamePacket; @@ -26,13 +31,26 @@ import org.spacehq.mc.protocol.packet.ingame.server.ServerKeepAlivePacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerPluginMessagePacket; import org.spacehq.mc.protocol.packet.ingame.server.entity.player.ServerPlayerHealthPacket; import org.spacehq.mc.protocol.packet.ingame.server.entity.player.ServerPlayerPositionRotationPacket; +import org.spacehq.mc.protocol.packet.ingame.server.entity.spawn.ServerSpawnPlayerPacket; +import org.spacehq.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket; +import org.spacehq.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket; +import org.spacehq.opennbt.tag.builtin.CompoundTag; +import org.spacehq.opennbt.tag.builtin.ListTag; +import org.spacehq.opennbt.tag.builtin.StringTag; +import org.spacehq.opennbt.tag.builtin.Tag; import org.spacehq.packetlib.Client; import org.spacehq.packetlib.Session; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; +import java.util.List; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ServerPluginMessagePacket; @@ -102,10 +120,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { Session session = ((Client) client).getSession(); - ServerPlayerPositionRotationPacket packet = (ServerPlayerPositionRotationPacket) recvPacket; - ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(packet.getTeleportId()); - session.send(teleportConfirmPacket); - sendClientPlayerMovementPacket(session, true); + ServerPlayerPositionRotationPacket positionRotationPacket = (ServerPlayerPositionRotationPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -150,6 +174,188 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ServerSpawnPlayerPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + + for (EntityMetadata metadata:playerPacket.getMetadata()) { + if (metadata.getValue().toString().contains(checkName)) { + return true; + } + } + + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + Session session = ((Client) client).getSession(); + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ClientPlayerPositionPacket playerPositionPacket = new ClientPlayerPositionPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ServerOpenWindowPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getWindowId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getSlots(); + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ServerWindowItemsPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getWindowId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNBT(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNBT(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + Session session = ((Client) client).getSession(); + ClientPlayerInteractEntityPacket interactEntityPacket = new ClientPlayerInteractEntityPacket(entityId, InteractAction.INTERACT); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.LEFT_CLICK); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.RIGHT_CLICK); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { } diff --git a/VersionSupport-P1_14_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_14_X/PacketHandler.java b/VersionSupport-P1_14_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_14_X/PacketHandler.java index 0f09278..3b5c85b 100644 --- a/VersionSupport-P1_14_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_14_X/PacketHandler.java +++ b/VersionSupport-P1_14_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_14_X/PacketHandler.java @@ -2,20 +2,25 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_14_ import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.github.steveice10.mc.protocol.data.game.ClientRequest; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction; import com.github.steveice10.mc.protocol.data.game.setting.ChatVisibility; import com.github.steveice10.mc.protocol.data.game.setting.SkinPart; +import com.github.steveice10.mc.protocol.data.game.window.ClickItemParam; +import com.github.steveice10.mc.protocol.data.game.window.WindowAction; import com.github.steveice10.mc.protocol.data.message.Message; import com.github.steveice10.mc.protocol.packet.ingame.client.*; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerChangeHeldItemPacket; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerMovementPacket; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket; +import com.github.steveice10.mc.protocol.packet.ingame.client.player.*; +import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientWindowActionPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientTeleportConfirmPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket; @@ -23,6 +28,13 @@ import com.github.steveice10.mc.protocol.packet.ingame.server.ServerKeepAlivePac import com.github.steveice10.mc.protocol.packet.ingame.server.ServerPluginMessagePacket; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerHealthPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerPositionRotationPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.entity.spawn.ServerSpawnPlayerPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.packetlib.Client; import com.github.steveice10.packetlib.Session; import com.google.gson.JsonElement; @@ -30,8 +42,14 @@ import com.google.gson.JsonObject; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; +import java.util.List; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ServerPluginMessagePacket; @@ -95,10 +113,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { Session session = ((Client) client).getSession(); - ServerPlayerPositionRotationPacket packet = (ServerPlayerPositionRotationPacket) recvPacket; - ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(packet.getTeleportId()); - session.send(teleportConfirmPacket); - sendClientPlayerMovementPacket(session, true); + ServerPlayerPositionRotationPacket positionRotationPacket = (ServerPlayerPositionRotationPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -143,6 +167,187 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ServerSpawnPlayerPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + + for (EntityMetadata metadata:playerPacket.getMetadata()) { + if (metadata.getValue().toString().contains(checkName)) { + return true; + } + } + + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + Session session = ((Client) client).getSession(); + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ClientPlayerPositionPacket playerPositionPacket = new ClientPlayerPositionPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ServerOpenWindowPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getWindowId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + return -1; + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ServerWindowItemsPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getWindowId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + Session session = ((Client) client).getSession(); + ClientPlayerInteractEntityPacket interactEntityPacket = new ClientPlayerInteractEntityPacket(entityId, InteractAction.INTERACT); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.LEFT_CLICK); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.RIGHT_CLICK); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { } diff --git a/VersionSupport-P1_15_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_15_X/PacketHandler.java b/VersionSupport-P1_15_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_15_X/PacketHandler.java index 361ba72..1e5cf60 100644 --- a/VersionSupport-P1_15_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_15_X/PacketHandler.java +++ b/VersionSupport-P1_15_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_15_X/PacketHandler.java @@ -2,27 +2,35 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_15_ import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.github.steveice10.mc.protocol.data.game.ClientRequest; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; +import com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction; import com.github.steveice10.mc.protocol.data.game.setting.ChatVisibility; import com.github.steveice10.mc.protocol.data.game.setting.SkinPart; +import com.github.steveice10.mc.protocol.data.game.window.ClickItemParam; +import com.github.steveice10.mc.protocol.data.game.window.WindowAction; import com.github.steveice10.mc.protocol.data.message.Message; import com.github.steveice10.mc.protocol.packet.ingame.client.*; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerChangeHeldItemPacket; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerMovementPacket; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket; +import com.github.steveice10.mc.protocol.packet.ingame.client.player.*; +import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientWindowActionPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientTeleportConfirmPacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerKeepAlivePacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerPluginMessagePacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.*; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerHealthPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerPositionRotationPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.entity.spawn.ServerSpawnPlayerPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.packetlib.Client; import com.github.steveice10.packetlib.Session; import com.google.gson.JsonElement; @@ -31,8 +39,14 @@ import com.google.gson.JsonParser; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; +import java.util.List; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ServerPluginMessagePacket; @@ -96,10 +110,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { Session session = ((Client) client).getSession(); - ServerPlayerPositionRotationPacket packet = (ServerPlayerPositionRotationPacket) recvPacket; - ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(packet.getTeleportId()); - session.send(teleportConfirmPacket); - sendClientPlayerMovementPacket(session, true); + ServerPlayerPositionRotationPacket positionRotationPacket = (ServerPlayerPositionRotationPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -144,6 +164,179 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ServerPlayerListEntryPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + Session session = ((Client) client).getSession(); + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ClientPlayerPositionPacket playerPositionPacket = new ClientPlayerPositionPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ServerOpenWindowPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getWindowId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + return -1; + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ServerWindowItemsPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getWindowId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + Session session = ((Client) client).getSession(); + ClientPlayerInteractEntityPacket interactEntityPacket = new ClientPlayerInteractEntityPacket(entityId, InteractAction.INTERACT); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.LEFT_CLICK); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.RIGHT_CLICK); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { } diff --git a/VersionSupport-P1_16_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_16_X/PacketHandler.java b/VersionSupport-P1_16_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_16_X/PacketHandler.java index 01cd2c8..211cde0 100644 --- a/VersionSupport-P1_16_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_16_X/PacketHandler.java +++ b/VersionSupport-P1_16_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_16_X/PacketHandler.java @@ -2,38 +2,48 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_16_ import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.github.steveice10.mc.protocol.data.game.ClientRequest; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.entity.player.HandPreference; +import com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction; import com.github.steveice10.mc.protocol.data.game.setting.ChatVisibility; import com.github.steveice10.mc.protocol.data.game.setting.SkinPart; +import com.github.steveice10.mc.protocol.data.game.window.ClickItemParam; +import com.github.steveice10.mc.protocol.data.game.window.WindowAction; import com.github.steveice10.mc.protocol.packet.ingame.client.*; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerChangeHeldItemPacket; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerMovementPacket; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket; +import com.github.steveice10.mc.protocol.packet.ingame.client.player.*; +import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientWindowActionPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientTeleportConfirmPacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerKeepAlivePacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerPluginMessagePacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.*; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerHealthPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerPositionRotationPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.entity.spawn.ServerSpawnPlayerPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.packetlib.Client; import com.github.steveice10.packetlib.Session; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TranslatableComponent; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ServerPluginMessagePacket; @@ -96,10 +106,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { Session session = ((Client) client).getSession(); - ServerPlayerPositionRotationPacket packet = (ServerPlayerPositionRotationPacket) recvPacket; - ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(packet.getTeleportId()); - session.send(teleportConfirmPacket); - sendClientPlayerMovementPacket(session, true); + ServerPlayerPositionRotationPacket positionRotationPacket = (ServerPlayerPositionRotationPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -144,6 +160,179 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ServerPlayerListEntryPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + Session session = ((Client) client).getSession(); + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ClientPlayerPositionPacket playerPositionPacket = new ClientPlayerPositionPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ServerOpenWindowPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getWindowId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + return -1; + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ServerWindowItemsPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getWindowId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + Session session = ((Client) client).getSession(); + ClientPlayerInteractEntityPacket interactEntityPacket = new ClientPlayerInteractEntityPacket(entityId, InteractAction.INTERACT, false); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.LEFT_CLICK); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.RIGHT_CLICK); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { } diff --git a/VersionSupport-P1_17_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_17_X/PacketHandler.java b/VersionSupport-P1_17_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_17_X/PacketHandler.java index cb4afba..e89a652 100644 --- a/VersionSupport-P1_17_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_17_X/PacketHandler.java +++ b/VersionSupport-P1_17_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_17_X/PacketHandler.java @@ -2,38 +2,48 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_17_ import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.github.steveice10.mc.protocol.data.game.ClientRequest; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.entity.player.HandPreference; +import com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction; import com.github.steveice10.mc.protocol.data.game.setting.ChatVisibility; import com.github.steveice10.mc.protocol.data.game.setting.SkinPart; +import com.github.steveice10.mc.protocol.data.game.window.ClickItemParam; +import com.github.steveice10.mc.protocol.data.game.window.WindowAction; import com.github.steveice10.mc.protocol.packet.ingame.client.*; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerChangeHeldItemPacket; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerMovementPacket; -import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket; +import com.github.steveice10.mc.protocol.packet.ingame.client.player.*; +import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientWindowActionPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientTeleportConfirmPacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerChatPacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerJoinGamePacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerKeepAlivePacket; -import com.github.steveice10.mc.protocol.packet.ingame.server.ServerPluginMessagePacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.*; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerHealthPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.player.ServerPlayerPositionRotationPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.entity.spawn.ServerSpawnPlayerPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket; +import com.github.steveice10.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.packetlib.Session; import com.github.steveice10.packetlib.tcp.TcpClientSession; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TranslatableComponent; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ServerPluginMessagePacket; @@ -97,10 +107,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { TcpClientSession session = (TcpClientSession) client; - ServerPlayerPositionRotationPacket packet = (ServerPlayerPositionRotationPacket) recvPacket; - ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(packet.getTeleportId()); - session.send(teleportConfirmPacket); - sendClientPlayerMovementPacket(session, true); + ServerPlayerPositionRotationPacket positionRotationPacket = (ServerPlayerPositionRotationPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -145,6 +161,179 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ServerPlayerListEntryPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + TcpClientSession session = (TcpClientSession) client; + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ClientPlayerPositionPacket playerPositionPacket = new ClientPlayerPositionPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ServerOpenWindowPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getWindowId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + return -1; + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ServerWindowItemsPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getWindowId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + TcpClientSession session = (TcpClientSession) client; + ClientPlayerInteractEntityPacket interactEntityPacket = new ClientPlayerInteractEntityPacket(entityId, InteractAction.INTERACT, false); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, WindowAction.CLICK_ITEM, ClickItemParam.LEFT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, WindowAction.CLICK_ITEM, ClickItemParam.RIGHT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { } diff --git a/VersionSupport-P1_18_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_18_X/PacketHandler.java b/VersionSupport-P1_18_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_18_X/PacketHandler.java index 84b6029..83ece7c 100644 --- a/VersionSupport-P1_18_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_18_X/PacketHandler.java +++ b/VersionSupport-P1_18_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_18_X/PacketHandler.java @@ -2,13 +2,18 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_18_ import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.github.steveice10.mc.protocol.data.game.ClientCommand; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.entity.player.HandPreference; +import com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction; +import com.github.steveice10.mc.protocol.data.game.inventory.ClickItemAction; +import com.github.steveice10.mc.protocol.data.game.inventory.ContainerActionType; import com.github.steveice10.mc.protocol.data.game.setting.ChatVisibility; import com.github.steveice10.mc.protocol.data.game.setting.SkinPart; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundChatPacket; @@ -17,23 +22,31 @@ import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundKe import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLoginPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundPlayerPositionPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundSetHealthPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.spawn.ClientboundAddPlayerPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundContainerSetContentPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundOpenScreenPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.*; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundContainerClickPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundAcceptTeleportationPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerPosRotPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerStatusOnlyPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundSetCarriedItemPacket; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.*; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.packetlib.Session; import com.github.steveice10.packetlib.tcp.TcpClientSession; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TranslatableComponent; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ClientboundCustomPayloadPacket; @@ -97,10 +110,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { TcpClientSession session = (TcpClientSession) client; - ClientboundPlayerPositionPacket packet = (ClientboundPlayerPositionPacket) recvPacket; - ServerboundAcceptTeleportationPacket acceptTeleportationPacket = new ServerboundAcceptTeleportationPacket(packet.getTeleportId()); - session.send(acceptTeleportationPacket); - sendClientPlayerMovementPacket(session, true); + ClientboundPlayerPositionPacket positionRotationPacket = (ClientboundPlayerPositionPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ServerboundAcceptTeleportationPacket teleportConfirmPacket = new ServerboundAcceptTeleportationPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -145,6 +164,179 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ClientboundAddPlayerPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ClientboundAddPlayerPacket playerPacket = (ClientboundAddPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ClientboundAddPlayerPacket playerPacket = (ClientboundAddPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + TcpClientSession session = (TcpClientSession) client; + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ServerboundMovePlayerPosPacket playerPositionPacket = new ServerboundMovePlayerPosPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ClientboundOpenScreenPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ClientboundOpenScreenPacket windowPacket = (ClientboundOpenScreenPacket) packet; + return windowPacket.getContainerId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + return -1; + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ClientboundOpenScreenPacket windowPacket = (ClientboundOpenScreenPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ClientboundContainerSetContentPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ClientboundContainerSetContentPacket windowItemsPacket = (ClientboundContainerSetContentPacket) packet; + return windowItemsPacket.getContainerId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ClientboundContainerSetContentPacket windowItemsPacket = (ClientboundContainerSetContentPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + TcpClientSession session = (TcpClientSession) client; + ServerboundInteractPacket interactEntityPacket = new ServerboundInteractPacket(entityId, InteractAction.INTERACT, false); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ServerboundContainerClickPacket windowActionPacket = new ServerboundContainerClickPacket(windowId, 6, slot, ContainerActionType.CLICK_ITEM, ClickItemAction.LEFT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ServerboundContainerClickPacket windowActionPacket = new ServerboundContainerClickPacket(windowId, 6, slot, ContainerActionType.CLICK_ITEM, ClickItemAction.RIGHT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) {} diff --git a/VersionSupport-P1_19/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19/PacketHandler.java b/VersionSupport-P1_19/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19/PacketHandler.java index 1356f86..a5d9a1b 100644 --- a/VersionSupport-P1_19/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19/PacketHandler.java +++ b/VersionSupport-P1_19/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19/PacketHandler.java @@ -2,13 +2,18 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_19; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.github.steveice10.mc.protocol.data.game.ClientCommand; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.entity.player.HandPreference; +import com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction; +import com.github.steveice10.mc.protocol.data.game.inventory.ClickItemAction; +import com.github.steveice10.mc.protocol.data.game.inventory.ContainerActionType; import com.github.steveice10.mc.protocol.data.game.setting.ChatVisibility; import com.github.steveice10.mc.protocol.data.game.setting.SkinPart; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundCustomPayloadPacket; @@ -17,11 +22,17 @@ import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLo import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundSystemChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundPlayerPositionPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundSetHealthPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.spawn.ClientboundAddPlayerPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundContainerSetContentPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundOpenScreenPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.*; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundContainerClickPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundAcceptTeleportationPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerPosRotPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerStatusOnlyPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundSetCarriedItemPacket; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.*; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.packetlib.Session; import com.github.steveice10.packetlib.tcp.TcpClientSession; import net.kyori.adventure.text.Component; @@ -32,6 +43,10 @@ import java.util.*; import java.util.stream.Collectors; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ClientboundCustomPayloadPacket; @@ -95,10 +110,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { TcpClientSession session = (TcpClientSession) client; - ClientboundPlayerPositionPacket packet = (ClientboundPlayerPositionPacket) recvPacket; - ServerboundAcceptTeleportationPacket acceptTeleportationPacket = new ServerboundAcceptTeleportationPacket(packet.getTeleportId()); - session.send(acceptTeleportationPacket); - sendClientPlayerMovementPacket(session, true); + ClientboundPlayerPositionPacket positionRotationPacket = (ClientboundPlayerPositionPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ServerboundAcceptTeleportationPacket teleportConfirmPacket = new ServerboundAcceptTeleportationPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -143,6 +164,179 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ClientboundAddPlayerPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ClientboundAddPlayerPacket playerPacket = (ClientboundAddPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ClientboundAddPlayerPacket playerPacket = (ClientboundAddPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + TcpClientSession session = (TcpClientSession) client; + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ServerboundMovePlayerPosPacket playerPositionPacket = new ServerboundMovePlayerPosPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ClientboundOpenScreenPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ClientboundOpenScreenPacket windowPacket = (ClientboundOpenScreenPacket) packet; + return windowPacket.getContainerId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + return -1; + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ClientboundOpenScreenPacket windowPacket = (ClientboundOpenScreenPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ClientboundContainerSetContentPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ClientboundContainerSetContentPacket windowItemsPacket = (ClientboundContainerSetContentPacket) packet; + return windowItemsPacket.getContainerId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ClientboundContainerSetContentPacket windowItemsPacket = (ClientboundContainerSetContentPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + TcpClientSession session = (TcpClientSession) client; + ServerboundInteractPacket interactEntityPacket = new ServerboundInteractPacket(entityId, InteractAction.INTERACT, false); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ServerboundContainerClickPacket windowActionPacket = new ServerboundContainerClickPacket(windowId, 6, slot, ContainerActionType.CLICK_ITEM, ClickItemAction.LEFT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ServerboundContainerClickPacket windowActionPacket = new ServerboundContainerClickPacket(windowId, 6, slot, ContainerActionType.CLICK_ITEM, ClickItemAction.RIGHT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { } diff --git a/VersionSupport-P1_19_1_1_19_2/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19_1_1_19_2/PacketHandler.java b/VersionSupport-P1_19_1_1_19_2/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19_1_1_19_2/PacketHandler.java index 241b8d2..cb168d6 100644 --- a/VersionSupport-P1_19_1_1_19_2/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19_1_1_19_2/PacketHandler.java +++ b/VersionSupport-P1_19_1_1_19_2/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19_1_1_19_2/PacketHandler.java @@ -2,13 +2,18 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_19_ import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.github.steveice10.mc.protocol.data.game.ClientCommand; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.entity.player.HandPreference; +import com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction; +import com.github.steveice10.mc.protocol.data.game.inventory.ClickItemAction; +import com.github.steveice10.mc.protocol.data.game.inventory.ContainerActionType; import com.github.steveice10.mc.protocol.data.game.setting.ChatVisibility; import com.github.steveice10.mc.protocol.data.game.setting.SkinPart; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundCustomPayloadPacket; @@ -17,11 +22,17 @@ import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLo import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundSystemChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundPlayerPositionPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundSetHealthPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.spawn.ClientboundAddPlayerPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundContainerSetContentPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundOpenScreenPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.*; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundContainerClickPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundAcceptTeleportationPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerPosRotPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerStatusOnlyPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundSetCarriedItemPacket; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.*; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.packetlib.Session; import com.github.steveice10.packetlib.tcp.TcpClientSession; import net.kyori.adventure.text.Component; @@ -32,6 +43,10 @@ import java.util.*; import java.util.stream.Collectors; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ClientboundCustomPayloadPacket; @@ -95,10 +110,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { TcpClientSession session = (TcpClientSession) client; - ClientboundPlayerPositionPacket packet = (ClientboundPlayerPositionPacket) recvPacket; - ServerboundAcceptTeleportationPacket acceptTeleportationPacket = new ServerboundAcceptTeleportationPacket(packet.getTeleportId()); - session.send(acceptTeleportationPacket); - sendClientPlayerMovementPacket(session, true); + ClientboundPlayerPositionPacket positionRotationPacket = (ClientboundPlayerPositionPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ServerboundAcceptTeleportationPacket teleportConfirmPacket = new ServerboundAcceptTeleportationPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -143,6 +164,179 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ClientboundAddPlayerPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ClientboundAddPlayerPacket playerPacket = (ClientboundAddPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ClientboundAddPlayerPacket playerPacket = (ClientboundAddPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + TcpClientSession session = (TcpClientSession) client; + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ServerboundMovePlayerPosPacket playerPositionPacket = new ServerboundMovePlayerPosPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ClientboundOpenScreenPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ClientboundOpenScreenPacket windowPacket = (ClientboundOpenScreenPacket) packet; + return windowPacket.getContainerId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + return -1; + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ClientboundOpenScreenPacket windowPacket = (ClientboundOpenScreenPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ClientboundContainerSetContentPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ClientboundContainerSetContentPacket windowItemsPacket = (ClientboundContainerSetContentPacket) packet; + return windowItemsPacket.getContainerId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ClientboundContainerSetContentPacket windowItemsPacket = (ClientboundContainerSetContentPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + TcpClientSession session = (TcpClientSession) client; + ServerboundInteractPacket interactEntityPacket = new ServerboundInteractPacket(entityId, InteractAction.INTERACT, false); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ServerboundContainerClickPacket windowActionPacket = new ServerboundContainerClickPacket(windowId, 6, slot, ContainerActionType.CLICK_ITEM, ClickItemAction.LEFT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ServerboundContainerClickPacket windowActionPacket = new ServerboundContainerClickPacket(windowId, 6, slot, ContainerActionType.CLICK_ITEM, ClickItemAction.RIGHT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { } diff --git a/VersionSupport-P1_19_3_1_20_1/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19_3_1_20_1/PacketHandler.java b/VersionSupport-P1_19_3_1_20_1/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19_3_1_20_1/PacketHandler.java index 6c0176d..2ab74fd 100644 --- a/VersionSupport-P1_19_3_1_20_1/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19_3_1_20_1/PacketHandler.java +++ b/VersionSupport-P1_19_3_1_20_1/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_19_3_1_20_1/PacketHandler.java @@ -2,13 +2,18 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_19_ import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.github.steveice10.mc.protocol.data.game.ClientCommand; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.entity.player.HandPreference; +import com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction; +import com.github.steveice10.mc.protocol.data.game.inventory.ClickItemAction; +import com.github.steveice10.mc.protocol.data.game.inventory.ContainerActionType; import com.github.steveice10.mc.protocol.data.game.setting.ChatVisibility; import com.github.steveice10.mc.protocol.data.game.setting.SkinPart; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundCustomPayloadPacket; @@ -17,11 +22,17 @@ import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLo import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundSystemChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundPlayerPositionPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundSetHealthPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.spawn.ClientboundAddPlayerPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundContainerSetContentPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundOpenScreenPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.*; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundContainerClickPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundAcceptTeleportationPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerPosRotPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerStatusOnlyPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundSetCarriedItemPacket; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.*; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.packetlib.Session; import com.github.steveice10.packetlib.tcp.TcpClientSession; import net.kyori.adventure.text.Component; @@ -32,6 +43,10 @@ import java.util.*; import java.util.stream.Collectors; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ClientboundCustomPayloadPacket; @@ -95,10 +110,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { TcpClientSession session = (TcpClientSession) client; - ClientboundPlayerPositionPacket packet = (ClientboundPlayerPositionPacket) recvPacket; - ServerboundAcceptTeleportationPacket acceptTeleportationPacket = new ServerboundAcceptTeleportationPacket(packet.getTeleportId()); - session.send(acceptTeleportationPacket); - sendClientPlayerMovementPacket(session, true); + ClientboundPlayerPositionPacket positionRotationPacket = (ClientboundPlayerPositionPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ServerboundAcceptTeleportationPacket teleportConfirmPacket = new ServerboundAcceptTeleportationPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -143,6 +164,179 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ClientboundAddPlayerPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ClientboundAddPlayerPacket playerPacket = (ClientboundAddPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ClientboundAddPlayerPacket playerPacket = (ClientboundAddPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + TcpClientSession session = (TcpClientSession) client; + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ServerboundMovePlayerPosPacket playerPositionPacket = new ServerboundMovePlayerPosPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ClientboundOpenScreenPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ClientboundOpenScreenPacket windowPacket = (ClientboundOpenScreenPacket) packet; + return windowPacket.getContainerId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + return -1; + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ClientboundOpenScreenPacket windowPacket = (ClientboundOpenScreenPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ClientboundContainerSetContentPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ClientboundContainerSetContentPacket windowItemsPacket = (ClientboundContainerSetContentPacket) packet; + return windowItemsPacket.getContainerId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ClientboundContainerSetContentPacket windowItemsPacket = (ClientboundContainerSetContentPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + TcpClientSession session = (TcpClientSession) client; + ServerboundInteractPacket interactEntityPacket = new ServerboundInteractPacket(entityId, InteractAction.INTERACT, false); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ServerboundContainerClickPacket windowActionPacket = new ServerboundContainerClickPacket(windowId, 6, slot, ContainerActionType.CLICK_ITEM, ClickItemAction.LEFT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ServerboundContainerClickPacket windowActionPacket = new ServerboundContainerClickPacket(windowId, 6, slot, ContainerActionType.CLICK_ITEM, ClickItemAction.RIGHT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { } diff --git a/VersionSupport-P1_20_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_20_X/PacketHandler.java b/VersionSupport-P1_20_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_20_X/PacketHandler.java index d8c37d2..4248982 100644 --- a/VersionSupport-P1_20_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_20_X/PacketHandler.java +++ b/VersionSupport-P1_20_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_20_X/PacketHandler.java @@ -2,13 +2,18 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_20_ import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.github.steveice10.mc.protocol.data.game.ClientCommand; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; import com.github.steveice10.mc.protocol.data.game.entity.player.HandPreference; +import com.github.steveice10.mc.protocol.data.game.entity.player.InteractAction; +import com.github.steveice10.mc.protocol.data.game.inventory.ClickItemAction; +import com.github.steveice10.mc.protocol.data.game.inventory.ContainerActionType; import com.github.steveice10.mc.protocol.data.game.setting.ChatVisibility; import com.github.steveice10.mc.protocol.data.game.setting.SkinPart; import com.github.steveice10.mc.protocol.packet.common.clientbound.ClientboundCustomPayloadPacket; @@ -20,14 +25,20 @@ import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLo import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundSystemChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundPlayerPositionPacket; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.player.ClientboundSetHealthPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.entity.spawn.ClientboundAddEntityPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundContainerSetContentPacket; +import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.ClientboundOpenScreenPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatCommandPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundChatPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundClientCommandPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.ServerboundCommandSuggestionPacket; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundContainerClickPacket; import com.github.steveice10.mc.protocol.packet.ingame.serverbound.level.ServerboundAcceptTeleportationPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerPosRotPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundMovePlayerStatusOnlyPacket; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.ServerboundSetCarriedItemPacket; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.player.*; +import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.github.steveice10.opennbt.tag.builtin.ListTag; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; import com.github.steveice10.packetlib.Session; import com.github.steveice10.packetlib.tcp.TcpClientSession; import net.kyori.adventure.text.Component; @@ -39,6 +50,10 @@ import java.util.*; import java.util.stream.Collectors; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ClientboundCustomPayloadPacket; @@ -102,10 +117,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { TcpClientSession session = (TcpClientSession) client; - ClientboundPlayerPositionPacket packet = (ClientboundPlayerPositionPacket) recvPacket; - ServerboundAcceptTeleportationPacket acceptTeleportationPacket = new ServerboundAcceptTeleportationPacket(packet.getTeleportId()); - session.send(acceptTeleportationPacket); - sendClientPlayerMovementPacket(session, true); + ClientboundPlayerPositionPacket positionRotationPacket = (ClientboundPlayerPositionPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ServerboundAcceptTeleportationPacket teleportConfirmPacket = new ServerboundAcceptTeleportationPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -150,6 +171,185 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ClientboundAddEntityPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ClientboundAddEntityPacket playerPacket = (ClientboundAddEntityPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ClientboundAddEntityPacket playerPacket = (ClientboundAddEntityPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + TcpClientSession session = (TcpClientSession) client; + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ServerboundMovePlayerPosPacket playerPositionPacket = new ServerboundMovePlayerPosPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ClientboundOpenScreenPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ClientboundOpenScreenPacket windowPacket = (ClientboundOpenScreenPacket) packet; + return windowPacket.getContainerId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + return -1; + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ClientboundOpenScreenPacket windowPacket = (ClientboundOpenScreenPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ClientboundContainerSetContentPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ClientboundContainerSetContentPacket windowItemsPacket = (ClientboundContainerSetContentPacket) packet; + return windowItemsPacket.getContainerId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ClientboundContainerSetContentPacket windowItemsPacket = (ClientboundContainerSetContentPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + if (nbtData == null) { + return null; + } + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNbt(); + if (nbtData == null) { + return null; + } + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + TcpClientSession session = (TcpClientSession) client; + ServerboundInteractPacket interactEntityPacket = new ServerboundInteractPacket(entityId, InteractAction.INTERACT, false); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ServerboundContainerClickPacket windowActionPacket = new ServerboundContainerClickPacket(windowId, 6, slot, ContainerActionType.CLICK_ITEM, ClickItemAction.LEFT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + TcpClientSession session = (TcpClientSession) client; + ItemStack item = (ItemStack) itemStack; + ServerboundContainerClickPacket windowActionPacket = new ServerboundContainerClickPacket(windowId, 6, slot, ContainerActionType.CLICK_ITEM, ClickItemAction.RIGHT_CLICK, item, new HashMap<>()); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { } diff --git a/VersionSupport-P1_7_X/VersionSupport-P1_7_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_7_X/PacketHandler.java b/VersionSupport-P1_7_X/VersionSupport-P1_7_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_7_X/PacketHandler.java index 43e9073..36fb757 100644 --- a/VersionSupport-P1_7_X/VersionSupport-P1_7_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_7_X/PacketHandler.java +++ b/VersionSupport-P1_7_X/VersionSupport-P1_7_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_7_X/PacketHandler.java @@ -3,6 +3,7 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_7_X import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.CatAntiCheat.CatAntiCheat; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; @@ -10,18 +11,21 @@ import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import org.spacehq.mc.protocol.data.game.EntityMetadata; import org.spacehq.mc.protocol.data.game.ItemStack; import org.spacehq.mc.protocol.data.message.Message; import org.spacehq.mc.protocol.packet.ingame.client.*; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientChangeHeldItemPacket; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerMovementPacket; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket; +import org.spacehq.mc.protocol.packet.ingame.client.player.*; +import org.spacehq.mc.protocol.packet.ingame.client.window.ClientWindowActionPacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerChatPacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerJoinGamePacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerKeepAlivePacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerPluginMessagePacket; import org.spacehq.mc.protocol.packet.ingame.server.entity.player.ServerPlayerPositionRotationPacket; import org.spacehq.mc.protocol.packet.ingame.server.entity.player.ServerUpdateHealthPacket; +import org.spacehq.mc.protocol.packet.ingame.server.entity.spawn.ServerSpawnPlayerPacket; +import org.spacehq.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket; +import org.spacehq.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket; import org.spacehq.opennbt.NBTIO; import org.spacehq.opennbt.tag.builtin.CompoundTag; import org.spacehq.opennbt.tag.builtin.ListTag; @@ -33,11 +37,13 @@ import org.spacehq.packetlib.io.stream.StreamNetOutput; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ServerPluginMessagePacket; @@ -107,7 +113,13 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { Session session = ((Client) client).getSession(); - sendClientPlayerMovementPacket(session, true); + ServerPlayerPositionRotationPacket positionRotationPacket = (ServerPlayerPositionRotationPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -152,6 +164,188 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ServerSpawnPlayerPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + + for (EntityMetadata metadata:playerPacket.getMetadata()) { + if (metadata.getValue().toString().contains(checkName)) { + return true; + } + } + + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + Session session = ((Client) client).getSession(); + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ClientPlayerPositionPacket playerPositionPacket = new ClientPlayerPositionPacket(true, selfX, selfY, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ServerOpenWindowPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getWindowId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getSlots(); + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ServerWindowItemsPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getWindowId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNBT(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNBT(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + Session session = ((Client) client).getSession(); + ClientPlayerInteractEntityPacket interactEntityPacket = new ClientPlayerInteractEntityPacket(entityId, ClientPlayerInteractEntityPacket.Action.INTERACT); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, ClientWindowActionPacket.Action.CLICK_ITEM, ClientWindowActionPacket.ClickItemParam.LEFT_CLICK); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, ClientWindowActionPacket.Action.CLICK_ITEM, ClientWindowActionPacket.ClickItemParam.RIGHT_CLICK); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { String packetName = packet.getClass().getSimpleName(); diff --git a/VersionSupport-P1_8_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_8_X/PacketHandler.java b/VersionSupport-P1_8_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_8_X/PacketHandler.java index e949d1c..da42950 100644 --- a/VersionSupport-P1_8_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_8_X/PacketHandler.java +++ b/VersionSupport-P1_8_X/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_8_X/PacketHandler.java @@ -3,6 +3,7 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_8_X import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.CatAntiCheat.CatAntiCheat; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; @@ -10,21 +11,27 @@ import cn.serendipityr.EndMinecraftPlusV2.Tools.LogUtil; import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import org.spacehq.mc.protocol.data.game.EntityMetadata; import org.spacehq.mc.protocol.data.game.ItemStack; import org.spacehq.mc.protocol.data.game.values.ClientRequest; +import org.spacehq.mc.protocol.data.game.values.entity.player.InteractAction; import org.spacehq.mc.protocol.data.game.values.setting.ChatVisibility; import org.spacehq.mc.protocol.data.game.values.setting.SkinPart; +import org.spacehq.mc.protocol.data.game.values.window.ClickItemParam; +import org.spacehq.mc.protocol.data.game.values.window.WindowAction; import org.spacehq.mc.protocol.data.message.Message; import org.spacehq.mc.protocol.packet.ingame.client.*; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientChangeHeldItemPacket; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerMovementPacket; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket; +import org.spacehq.mc.protocol.packet.ingame.client.player.*; +import org.spacehq.mc.protocol.packet.ingame.client.window.ClientWindowActionPacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerChatPacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerJoinGamePacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerKeepAlivePacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerPluginMessagePacket; import org.spacehq.mc.protocol.packet.ingame.server.entity.player.ServerPlayerPositionRotationPacket; import org.spacehq.mc.protocol.packet.ingame.server.entity.player.ServerUpdateHealthPacket; +import org.spacehq.mc.protocol.packet.ingame.server.entity.spawn.ServerSpawnPlayerPacket; +import org.spacehq.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket; +import org.spacehq.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket; import org.spacehq.opennbt.NBTIO; import org.spacehq.opennbt.tag.builtin.CompoundTag; import org.spacehq.opennbt.tag.builtin.ListTag; @@ -38,9 +45,14 @@ import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ServerPluginMessagePacket; @@ -110,7 +122,13 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { Session session = ((Client) client).getSession(); - sendClientPlayerMovementPacket(session, true); + ServerPlayerPositionRotationPacket positionRotationPacket = (ServerPlayerPositionRotationPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -155,6 +173,188 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ServerSpawnPlayerPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + + for (EntityMetadata metadata:playerPacket.getMetadata()) { + if (metadata.getValue().toString().contains(checkName)) { + return true; + } + } + + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + Session session = ((Client) client).getSession(); + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ClientPlayerPositionPacket playerPositionPacket = new ClientPlayerPositionPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ServerOpenWindowPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getWindowId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getSlots(); + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ServerWindowItemsPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getWindowId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNBT(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNBT(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + Session session = ((Client) client).getSession(); + ClientPlayerInteractEntityPacket interactEntityPacket = new ClientPlayerInteractEntityPacket(entityId, InteractAction.INTERACT); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.LEFT_CLICK); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.RIGHT_CLICK); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { String packetName = packet.getClass().getSimpleName(); diff --git a/VersionSupport-P1_9_X-1_12_1/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_9_X_1_12_1/PacketHandler.java b/VersionSupport-P1_9_X-1_12_1/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_9_X_1_12_1/PacketHandler.java index d7df33c..febe7a6 100644 --- a/VersionSupport-P1_9_X-1_12_1/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_9_X_1_12_1/PacketHandler.java +++ b/VersionSupport-P1_9_X-1_12_1/src/cn/serendipityr/EndMinecraftPlusV2/MultipleVersion/VersionSupport/P1_9_X_1_12_1/PacketHandler.java @@ -3,6 +3,7 @@ package cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.VersionSupport.P1_9_X import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AnotherStarAntiCheat; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.ACProtocol.AntiCheat3; import cn.serendipityr.EndMinecraftPlusV2.AdvanceModule.CatAntiCheat.CatAntiCheat; +import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Bot.BotManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketManager; import cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.UniverseMethods; import cn.serendipityr.EndMinecraftPlusV2.Tools.ConfigUtil; @@ -11,15 +12,18 @@ import cn.serendipityr.EndMinecraftPlusV2.Tools.OtherUtils; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import org.spacehq.mc.protocol.data.game.ClientRequest; +import org.spacehq.mc.protocol.data.game.entity.metadata.EntityMetadata; import org.spacehq.mc.protocol.data.game.entity.metadata.ItemStack; import org.spacehq.mc.protocol.data.game.entity.player.Hand; +import org.spacehq.mc.protocol.data.game.entity.player.InteractAction; import org.spacehq.mc.protocol.data.game.setting.ChatVisibility; import org.spacehq.mc.protocol.data.game.setting.SkinPart; +import org.spacehq.mc.protocol.data.game.window.ClickItemParam; +import org.spacehq.mc.protocol.data.game.window.WindowAction; import org.spacehq.mc.protocol.data.message.Message; import org.spacehq.mc.protocol.packet.ingame.client.*; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerChangeHeldItemPacket; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerMovementPacket; -import org.spacehq.mc.protocol.packet.ingame.client.player.ClientPlayerPositionRotationPacket; +import org.spacehq.mc.protocol.packet.ingame.client.player.*; +import org.spacehq.mc.protocol.packet.ingame.client.window.ClientWindowActionPacket; import org.spacehq.mc.protocol.packet.ingame.client.world.ClientTeleportConfirmPacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerChatPacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerJoinGamePacket; @@ -27,6 +31,9 @@ import org.spacehq.mc.protocol.packet.ingame.server.ServerKeepAlivePacket; import org.spacehq.mc.protocol.packet.ingame.server.ServerPluginMessagePacket; import org.spacehq.mc.protocol.packet.ingame.server.entity.player.ServerPlayerHealthPacket; import org.spacehq.mc.protocol.packet.ingame.server.entity.player.ServerPlayerPositionRotationPacket; +import org.spacehq.mc.protocol.packet.ingame.server.entity.spawn.ServerSpawnPlayerPacket; +import org.spacehq.mc.protocol.packet.ingame.server.window.ServerOpenWindowPacket; +import org.spacehq.mc.protocol.packet.ingame.server.window.ServerWindowItemsPacket; import org.spacehq.opennbt.NBTIO; import org.spacehq.opennbt.tag.builtin.CompoundTag; import org.spacehq.opennbt.tag.builtin.ListTag; @@ -40,9 +47,14 @@ import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.MultipleVersion.Packet.PacketHandler { + private double selfX = 0; + private double selfY = 0; + private double selfZ = 0; + @Override public boolean checkServerPluginMessagePacket(Object packet) { return packet instanceof ServerPluginMessagePacket; @@ -112,10 +124,16 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl @Override public void handleServerPlayerPositionRotationPacket(Object client, Object recvPacket, String username) { Session session = ((Client) client).getSession(); - ServerPlayerPositionRotationPacket packet = (ServerPlayerPositionRotationPacket) recvPacket; - ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(packet.getTeleportId()); - session.send(teleportConfirmPacket); - sendClientPlayerMovementPacket(session, true); + ServerPlayerPositionRotationPacket positionRotationPacket = (ServerPlayerPositionRotationPacket) recvPacket; + selfX = positionRotationPacket.getX(); + selfY = positionRotationPacket.getY(); + selfZ = positionRotationPacket.getZ(); + if (ConfigUtil.PacketHandlerMove) { + sendClientPlayerMovementPacket(session, true); + ClientTeleportConfirmPacket teleportConfirmPacket = new ClientTeleportConfirmPacket(positionRotationPacket.getTeleportId()); + session.send(teleportConfirmPacket); + sendClientPlayerMovementPacket(session, true); + } } @Override @@ -160,6 +178,188 @@ public class PacketHandler implements cn.serendipityr.EndMinecraftPlusV2.Multipl } } + @Override + public boolean checkServerSpawnPlayerPacket(Object packet) { + return packet instanceof ServerSpawnPlayerPacket; + } + + @Override + public boolean checkSpawnPlayerName(Object packet, String checkName) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + + for (EntityMetadata metadata:playerPacket.getMetadata()) { + if (metadata.getValue().toString().contains(checkName)) { + return true; + } + } + + return false; + } + + @Override + public Double[] getSpawnPlayerLocation(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return new Double[]{playerPacket.getX(), playerPacket.getY(), playerPacket.getZ()}; + } + + @Override + public int getSpawnPlayerEntityId(Object packet) { + ServerSpawnPlayerPacket playerPacket = (ServerSpawnPlayerPacket) packet; + return playerPacket.getEntityId(); + } + + + @Override + public void moveToLocation(Object client, Double[] targetLocation, double moveSpeed) { + Session session = ((Client) client).getSession(); + + // 设置初始目标位置 + double targetX = targetLocation[0]; + double targetY = targetLocation[1]; + double targetZ = targetLocation[2]; + + if (!BotManager.positionList.containsKey(client)) { + return; + } + + boolean movedLastTime = true; // 标记上次是否移动成功 + boolean moveYFirst = true; // 标记是否首先移动Y轴 + + // 持续移动直到接近目标位置 + while (true) { + double previousX = selfX; + double previousY = selfY; + double previousZ = selfZ; + + double distanceX = selfX - targetX; + double distanceY = selfY - targetY; + double distanceZ = selfZ - targetZ; + double totalDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY + distanceZ * distanceZ); + + // 检查是否已经足够接近目标 + if (totalDistance <= moveSpeed) { + break; // 已经接近目标,退出循环 + } + + if ((Math.abs(distanceY) > Math.abs(distanceX) && moveYFirst) || !movedLastTime) { + // 优先移动Y轴,或者上次移动失败时尝试移动Y轴 + double stepRatioY = Math.min(moveSpeed / Math.abs(distanceY), 1.0); + selfY -= distanceY * stepRatioY; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } else { + // 移动X轴和Z轴 + double stepRatioXZ = Math.min(moveSpeed / Math.sqrt(distanceX * distanceX + distanceZ * distanceZ), 1.0); + selfX -= distanceX * stepRatioXZ; + selfZ -= distanceZ * stepRatioXZ; + moveYFirst = !moveYFirst; // 下次尝试另一个方向 + } + + ClientPlayerPositionPacket playerPositionPacket = new ClientPlayerPositionPacket(true, selfX, selfY, selfZ); + session.send(playerPositionPacket); + + OtherUtils.doSleep(100); // 暂停以等待服务器响应 + + // 检查是否成功移动 + movedLastTime = (previousX != selfX || previousY != selfY || previousZ != selfZ); + } + } + + @Override + public boolean checkServerOpenWindowPacket(Object packet) { + return packet instanceof ServerOpenWindowPacket; + } + + @Override + public int getWindowIDFromServerOpenWindowPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getWindowId(); + } + + @Override + public int getWindowSlotsFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getSlots(); + } + + @Override + public String getWindowNameFromPacket(Object packet) { + ServerOpenWindowPacket windowPacket = (ServerOpenWindowPacket) packet; + return windowPacket.getName(); + } + + @Override + public boolean checkServerWindowItemsPacket(Object packet) { + return packet instanceof ServerWindowItemsPacket; + } + + @Override + public int getWindowIDFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getWindowId(); + } + + @Override + public Object[] getItemStackFromWindowItemsPacket(Object packet) { + ServerWindowItemsPacket windowItemsPacket = (ServerWindowItemsPacket) packet; + return windowItemsPacket.getItems(); + } + + @Override + public String getItemName(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNBT(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Name") == null) { + return null; + } + return ((StringTag) hashMap.get("Name")).getValue(); + } + + @Override + public List getItemLore(Object itemStack) { + if (itemStack == null) { + return null; + } + ItemStack item = (ItemStack) itemStack; + CompoundTag nbtData = item.getNBT(); + HashMap hashMap = (HashMap) nbtData.get("display").getValue(); + if (hashMap.get("Lore") == null) { + return null; + } + List itemLore = ((ListTag) hashMap.get("Lore")).getValue(); + List loreList = new ArrayList<>(); + for (Tag tag:itemLore) { + loreList.add((String) tag.getValue()); + } + return loreList; + } + + @Override + public void sendPlayerInteractEntityPacket(Object client, int entityId, float[] location) { + Session session = ((Client) client).getSession(); + ClientPlayerInteractEntityPacket interactEntityPacket = new ClientPlayerInteractEntityPacket(entityId, InteractAction.INTERACT); + session.send(interactEntityPacket); + } + + @Override + public void sendLeftClickWindowItemPacket(Object client, int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.LEFT_CLICK); + session.send(windowActionPacket); + } + + @Override + public void sendRightClickWindowItemPacket(Object client,int windowId, int slot, Object itemStack) { + Session session = ((Client) client).getSession(); + ItemStack item = (ItemStack) itemStack; + ClientWindowActionPacket windowActionPacket = new ClientWindowActionPacket(windowId, 6, slot, item, WindowAction.CLICK_ITEM, ClickItemParam.RIGHT_CLICK); + session.send(windowActionPacket); + } + @Override public void handleOtherPacket(Object packet) { }