Add: 更新简易移动方法,自动NPC交互

This commit is contained in:
SerendipityR 2024-02-02 00:28:48 +08:00 committed by GitHub
parent 90bdfeaa51
commit 32cd3d2305
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 3077 additions and 126 deletions

View File

@ -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-=======================");

View File

@ -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 - 向目标位置移动:<X>_<Y>_<Z>
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 - 发送崩服数据包:<数量>_<flag/none>
# tabAttack - 执行Tab补全:<数量>_<间隔(ms)>_<flag/none>
# moveToLocation - 向目标位置移动:<只执行一次>_<X>_<Y>_<Z>_<flag/none>
# goToLobby - 尝试寻找并与加入大厅NPC交互:<flag/none> (只执行一次)
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:
# 代理获取方式:

View File

@ -49,6 +49,8 @@ public class ConfigUtil {
public static List<String> RejoinDetect;
public static Boolean EmptyMsgRejoin;
public static List<String> ServerShoutDetect;
public static List<String> JoinNPCDetect;
public static List<String> JoinLobbyItem;
public static Long RejoinDelay;
public static List<String> ClickVerifiesDetect;
public static List<String> 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");

View File

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

View File

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

View File

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

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {
}

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {
}

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {
}

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {
}

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {
}

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {
}

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {}

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {
}

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {
}

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {
}

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {
}

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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();

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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();

View File

@ -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<String> 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<Tag> itemLore = ((ListTag) hashMap.get("Lore")).getValue();
List<String> 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) {
}