diff --git a/patches/api/0003-Add-fakeplayer-api.patch b/patches/api/0003-Add-fakeplayer-api.patch index ae6d74f4..f08463b9 100644 --- a/patches/api/0003-Add-fakeplayer-api.patch +++ b/patches/api/0003-Add-fakeplayer-api.patch @@ -21,36 +21,46 @@ index 0000000000000000000000000000000000000000..d4afe549b5e1aba7d468450c5e1570d2 +} diff --git a/src/main/java/top/leavesmc/leaves/event/bot/BotCreateEvent.java b/src/main/java/top/leavesmc/leaves/event/bot/BotCreateEvent.java new file mode 100644 -index 0000000000000000000000000000000000000000..9424a0b82ebfedd571e759db4f41d51364ad0b88 +index 0000000000000000000000000000000000000000..913a750e7ce042dd945be744f5c12343f3fddd9b --- /dev/null +++ b/src/main/java/top/leavesmc/leaves/event/bot/BotCreateEvent.java -@@ -0,0 +1,84 @@ +@@ -0,0 +1,94 @@ +package top.leavesmc.leaves.event.bot; + +import org.bukkit.Location; +import org.bukkit.event.Cancellable; ++import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -+import top.leavesmc.leaves.entity.Bot; + +/** + * Call when a fakeplayer creates a server + */ -+public class BotCreateEvent extends BotEvent implements Cancellable { ++public class BotCreateEvent extends Event implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + ++ private final String bot; + private String joinMessage; + private Location createLocation; + private boolean cancel = false; + -+ public BotCreateEvent(@NotNull final Bot who, @NotNull final Location createLocation, @Nullable final String joinMessage) { -+ super(who); ++ public BotCreateEvent(@NotNull final String who, @NotNull final Location createLocation, @Nullable final String joinMessage) { ++ this.bot = who; + this.joinMessage = joinMessage; + this.createLocation = createLocation; + } + + /** ++ * Gets the fakeplayer name ++ * ++ * @return fakeplayer name ++ */ ++ public String getBot() { ++ return bot; ++ } ++ ++ /** + * Gets the join message to send to all online players + * + * @return string join message. Can be null @@ -146,3 +156,36 @@ index 0000000000000000000000000000000000000000..4a4fe07ce965d4a97e0d8105a91310da + return bot; + } +} +diff --git a/src/main/java/top/leavesmc/leaves/event/bot/BotJoinEvent.java b/src/main/java/top/leavesmc/leaves/event/bot/BotJoinEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..10afa5c7fd4ee8a4e72d64f8ca9bf8731ec2ad61 +--- /dev/null ++++ b/src/main/java/top/leavesmc/leaves/event/bot/BotJoinEvent.java +@@ -0,0 +1,27 @@ ++package top.leavesmc.leaves.event.bot; ++ ++import org.bukkit.event.HandlerList; ++import org.jetbrains.annotations.NotNull; ++import top.leavesmc.leaves.entity.Bot; ++ ++/** ++ * Called when a fakeplayer joins a server ++ */ ++public class BotJoinEvent extends BotEvent { ++ private static final HandlerList handlers = new HandlerList(); ++ ++ public BotJoinEvent(@NotNull Bot who) { ++ super(who); ++ } ++ ++ @Override ++ @NotNull ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++} diff --git a/patches/server/0010-Add-fakeplayer-support.patch b/patches/server/0010-Add-fakeplayer-support.patch index 124ab850..50ad0824 100644 --- a/patches/server/0010-Add-fakeplayer-support.patch +++ b/patches/server/0010-Add-fakeplayer-support.patch @@ -28,8 +28,34 @@ index de0513b38e5fa0138f1cee6bb633561be12449fc..8548ef7f79e85aca593928b8e748d8b6 boolean flag = false; AdvancementProgress advancementprogress = this.getOrStartProgress(advancement); boolean flag1 = advancementprogress.isDone(); +diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java +index 5f0d934399991ae94795ad0a94da689c242ffeba..17daf0e9ef3b3ea79f49388113b87052a2ef87e1 100644 +--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java ++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java +@@ -173,6 +173,7 @@ import org.bukkit.event.player.PlayerPortalEvent; + import org.bukkit.event.player.PlayerTeleportEvent; + import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; + import org.bukkit.inventory.MainHand; ++import top.leavesmc.leaves.bot.ServerBot; + // CraftBukkit end + + public class ServerPlayer extends Player { +@@ -1179,6 +1180,13 @@ public class ServerPlayer extends Player { + this.lastSentHealth = -1.0F; + this.lastSentFood = -1; + ++ // Leaves start - bot support ++ if (top.leavesmc.leaves.LeavesConfig.fakeplayerSupport) { ++ ServerBot.getBots().forEach(bot1 -> ++ bot1.render(this.connection, true,this.getBukkitEntity().getWorld() == bot1.getBukkitEntity().getWorld())); // Leaves - render bot ++ } ++ // Leaves end - bot support ++ + // CraftBukkit start + PlayerChangedWorldEvent changeEvent = new PlayerChangedWorldEvent(this.getBukkitEntity(), worldserver1.getWorld()); + this.level.getCraftServer().getPluginManager().callEvent(changeEvent); diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 20cdfdb3b9351f74e89bc45b3ab972384165659a..fe38a9cd9724d0547e0d1689153a8c155c377d0c 100644 +index 20cdfdb3b9351f74e89bc45b3ab972384165659a..e7d425fc7187dad45416827260804c6b93117032 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -100,10 +100,10 @@ import net.minecraft.world.scores.Objective; @@ -52,7 +78,7 @@ index 20cdfdb3b9351f74e89bc45b3ab972384165659a..fe38a9cd9724d0547e0d1689153a8c15 import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerJoinEvent; -@@ -368,6 +367,17 @@ public abstract class PlayerList { +@@ -368,6 +367,18 @@ public abstract class PlayerList { return; } @@ -63,7 +89,8 @@ index 20cdfdb3b9351f74e89bc45b3ab972384165659a..fe38a9cd9724d0547e0d1689153a8c15 + bot.kill(); // Leaves - remove bot with the same name + } + -+ ServerBot.getBots().forEach(bot1 -> bot1.render(playerconnection, true)); // Leaves - render bot ++ ServerBot.getBots().forEach(bot1 -> ++ bot1.render(playerconnection, true,player.getBukkitEntity().getWorld() == bot1.getBukkitEntity().getWorld())); // Leaves - render bot + } + // Leaves end - bot support + @@ -71,7 +98,7 @@ index 20cdfdb3b9351f74e89bc45b3ab972384165659a..fe38a9cd9724d0547e0d1689153a8c15 if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 2a6c67634c31c332102d24bef293da1bacd0c000..877c9fa13c0ff1fbc90d957258bd0bc1f42c0fd4 100644 +index b80cc0938b2b3928f4450f1314a9fbd7ea9c116b..8624cfb27246c1e39994d14a3cef48e68a3a3488 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -187,6 +187,8 @@ import org.bukkit.plugin.Plugin; @@ -316,10 +343,10 @@ index 0000000000000000000000000000000000000000..daaece30b2a3983f1cc9ee9a851e8f37 +} diff --git a/src/main/java/top/leavesmc/leaves/bot/ServerBot.java b/src/main/java/top/leavesmc/leaves/bot/ServerBot.java new file mode 100644 -index 0000000000000000000000000000000000000000..b833653b671df660686134754c794d3e6686b112 +index 0000000000000000000000000000000000000000..24d90f94da2d2ddea7e7134568b6bfcbe8c53ec3 --- /dev/null +++ b/src/main/java/top/leavesmc/leaves/bot/ServerBot.java -@@ -0,0 +1,510 @@ +@@ -0,0 +1,517 @@ +package top.leavesmc.leaves.bot; + +import com.mojang.authlib.GameProfile; @@ -371,6 +398,8 @@ index 0000000000000000000000000000000000000000..b833653b671df660686134754c794d3e +import top.leavesmc.leaves.entity.Bot; +import top.leavesmc.leaves.entity.CraftBot; +import top.leavesmc.leaves.event.bot.BotCreateEvent; ++import top.leavesmc.leaves.bot.agent.BotAction; ++import top.leavesmc.leaves.event.bot.BotJoinEvent; +import top.leavesmc.leaves.util.MathUtils; + +import javax.annotation.Nullable; @@ -414,42 +443,39 @@ index 0000000000000000000000000000000000000000..b833653b671df660686134754c794d3e + @Nullable + public static ServerBot createBot(@NotNull Location loc, @NotNull String name, String[] skin) { + MinecraftServer server = MinecraftServer.getServer(); -+ ServerLevel world = ((CraftWorld) Objects.requireNonNull(loc.getWorld())).getHandle(); + -+ UUID uuid = UUID.randomUUID(); -+ CustomGameProfile profile = new CustomGameProfile(uuid, name.length() > 16 ? name.substring(0, 16) : name, skin); -+ -+ ServerBot bot = new ServerBot(server, world, profile); -+ -+ bot.connection = new ServerGamePacketListenerImpl(server, new Connection(PacketFlow.CLIENTBOUND) { -+ @Override -+ public void send(Packet packet, @Nullable GenericFutureListener> callback) { -+ } -+ }, bot); -+ bot.isRealPlayer = true; -+ -+ BotCreateEvent event = new BotCreateEvent(bot.getBukkitPlayer(), loc, ChatColor.YELLOW + bot.getName().getString() + " joined the game"); ++ BotCreateEvent event = new BotCreateEvent(name, loc, ChatColor.YELLOW + name + " joined the game"); + server.server.getPluginManager().callEvent(event); + if (!event.isCancelled()) { ++ loc = event.getCreateLocation(); ++ ++ ServerLevel world = ((CraftWorld) Objects.requireNonNull(loc.getWorld())).getHandle(); ++ UUID uuid = UUID.randomUUID(); ++ CustomGameProfile profile = new CustomGameProfile(uuid, name.length() > 16 ? name.substring(0, 16) : name, skin); ++ ++ ServerBot bot = new ServerBot(server, world, profile); ++ ++ bot.connection = new ServerGamePacketListenerImpl(server, new Connection(PacketFlow.CLIENTBOUND) { ++ @Override ++ public void send(@NotNull Packet packet, @Nullable GenericFutureListener> callback) { ++ } ++ }, bot); ++ bot.isRealPlayer = true; ++ + if (event.getJoinMessage() != null) { + Bukkit.broadcastMessage(event.getJoinMessage()); + } + -+ loc = event.getCreateLocation(); -+ ServerLevel world1 = ((CraftWorld) Objects.requireNonNull(loc.getWorld())).getHandle(); -+ -+ if (world1 != world) { -+ world = world1; -+ bot.changeDimension(world, PlayerTeleportEvent.TeleportCause.COMMAND); -+ } -+ + bot.teleportTo(loc.getX(), loc.getY(), loc.getZ()); + bot.setRot(loc.getYaw(), loc.getPitch()); + world.addFreshEntity(bot, CreatureSpawnEvent.SpawnReason.COMMAND); + + bot.renderAll(); -+ + bots.add(bot); ++ ++ BotJoinEvent event1 = new BotJoinEvent(bot.getBukkitPlayer()); ++ server.server.getPluginManager().callEvent(event1); ++ + return bot; + } + @@ -458,22 +484,24 @@ index 0000000000000000000000000000000000000000..b833653b671df660686134754c794d3e + + private void renderAll() { + Packet[] packets = getRenderPackets(); -+ Bukkit.getOnlinePlayers().forEach(p -> render(((CraftPlayer) p).getHandle().connection, packets, false)); ++ Bukkit.getOnlinePlayers().forEach(p -> ++ render(((CraftPlayer) p).getHandle().connection, packets, false, p.getWorld() == getBukkitPlayer().getWorld())); + } + -+ public void render(ServerPlayerConnection connection, boolean login) { -+ render(connection, getRenderPackets(), login); ++ public void render(ServerPlayerConnection connection, boolean login, boolean all) { ++ render(connection, getRenderPackets(), login, all); + } + -+ private void render(ServerPlayerConnection connection, Packet[] packets, boolean login) { // always use getRenderPackets() to get packets. replace it soon ++ private void render(ServerPlayerConnection connection, Packet[] packets, boolean login, boolean all) { // always use getRenderPackets() to get packets. replace it soon + connection.send(packets[0]); -+ connection.send(packets[1]); -+ connection.send(packets[2]); -+ -+ if (login) { -+ connection.send(packets[3]); // This need delay 10 tick ? real ? -+ } else { -+ connection.send(packets[3]); ++ if (all) { ++ connection.send(packets[1]); ++ connection.send(packets[2]); ++ if (login) { ++ connection.send(packets[3]); // This need delay 10 tick ? real ? ++ } else { ++ connection.send(packets[3]); ++ } + } + } + @@ -515,6 +543,12 @@ index 0000000000000000000000000000000000000000..b833653b671df660686134754c794d3e + } + // die check end + ++ @Nullable ++ @Override ++ public Entity changeDimension(ServerLevel destination) { ++ return null; // disable dimension change ++ } ++ + @Override + public boolean isOnGround() { + return groundTicks != 0; diff --git a/patches/server/0011-Add-fakeplayer-action-support.patch b/patches/server/0011-Add-fakeplayer-action-support.patch index 163d6bb7..a045173d 100644 --- a/patches/server/0011-Add-fakeplayer-action-support.patch +++ b/patches/server/0011-Add-fakeplayer-action-support.patch @@ -30,16 +30,17 @@ index 898c61c25675232e203ee2c872ca25804c41358c..4d6d025c78086f186da710ae46f65eda } diff --git a/src/main/java/top/leavesmc/leaves/bot/BotCommand.java b/src/main/java/top/leavesmc/leaves/bot/BotCommand.java -index 292fede3bb850892e57640814440bdcebfd43aec..7693118ee1bb06d9938b866dca8e6cc9d2f1dded 100644 +index 292fede3bb850892e57640814440bdcebfd43aec..348174882a6ccc64aeda3997d20e5c8f37234268 100644 --- a/src/main/java/top/leavesmc/leaves/bot/BotCommand.java +++ b/src/main/java/top/leavesmc/leaves/bot/BotCommand.java -@@ -6,6 +6,10 @@ import org.bukkit.Location; +@@ -5,7 +5,11 @@ import org.bukkit.ChatColor; + import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; ++import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; +import top.leavesmc.leaves.bot.agent.Actions; +import top.leavesmc.leaves.bot.agent.BotAction; -+import top.leavesmc.leaves.entity.CraftBot; +import top.leavesmc.leaves.util.MathUtils; import java.util.ArrayList; @@ -140,12 +141,12 @@ index 292fede3bb850892e57640814440bdcebfd43aec..7693118ee1bb06d9938b866dca8e6cc9 + return; + } + -+ bot.setBotAction(action.getNew(tickDelay, ((CraftBot) sender).getHandle())); ++ bot.setBotAction(action.getNew(tickDelay, ((CraftPlayer) sender).getHandle())); + sender.sendMessage("Action set"); + } } diff --git a/src/main/java/top/leavesmc/leaves/bot/ServerBot.java b/src/main/java/top/leavesmc/leaves/bot/ServerBot.java -index b833653b671df660686134754c794d3e6686b112..d0b88733427d81aacb9699faf695c67988e83fe6 100644 +index 24d90f94da2d2ddea7e7134568b6bfcbe8c53ec3..b945cedb0c35418180415112dbccbca1c908a833 100644 --- a/src/main/java/top/leavesmc/leaves/bot/ServerBot.java +++ b/src/main/java/top/leavesmc/leaves/bot/ServerBot.java @@ -1,9 +1,12 @@ @@ -183,25 +184,21 @@ index b833653b671df660686134754c794d3e6686b112..d0b88733427d81aacb9699faf695c679 import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.phys.AABB; -@@ -37,11 +45,13 @@ import org.bukkit.World; +@@ -37,11 +45,10 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.scheduler.MinecraftInternalPlugin; - import org.bukkit.entity.Player; +-import org.bukkit.entity.Player; import org.bukkit.event.entity.CreatureSpawnEvent; - import org.bukkit.event.player.PlayerJoinEvent; - import org.bukkit.event.player.PlayerTeleportEvent; +-import org.bukkit.event.player.PlayerJoinEvent; +-import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; -@@ -49,10 +59,14 @@ import org.jetbrains.annotations.NotNull; - import top.leavesmc.leaves.entity.Bot; - import top.leavesmc.leaves.entity.CraftBot; - import top.leavesmc.leaves.event.bot.BotCreateEvent; -+import top.leavesmc.leaves.bot.agent.BotAction; +@@ -54,7 +61,10 @@ import top.leavesmc.leaves.event.bot.BotJoinEvent; import top.leavesmc.leaves.util.MathUtils; import javax.annotation.Nullable; @@ -212,7 +209,7 @@ index b833653b671df660686134754c794d3e6686b112..d0b88733427d81aacb9699faf695c679 import java.util.Objects; import java.util.Set; import java.util.UUID; -@@ -61,12 +75,17 @@ public class ServerBot extends ServerPlayer { +@@ -63,12 +73,17 @@ public class ServerBot extends ServerPlayer { private Vector velocity; private Vector oldVelocity; @@ -234,7 +231,7 @@ index b833653b671df660686134754c794d3e6686b112..d0b88733427d81aacb9699faf695c679 private static final Set bots = new HashSet<>(); private static final Plugin MINECRAFT_PLUGIN = new MinecraftInternalPlugin(); -@@ -79,6 +98,8 @@ public class ServerBot extends ServerPlayer { +@@ -81,6 +96,8 @@ public class ServerBot extends ServerPlayer { this.oldVelocity = velocity.clone(); this.noFallTicks = 60; this.fireTicks = 0; @@ -243,7 +240,7 @@ index b833653b671df660686134754c794d3e6686b112..d0b88733427d81aacb9699faf695c679 this.removeOnDeath = true; } -@@ -185,12 +206,17 @@ public class ServerBot extends ServerPlayer { +@@ -186,12 +203,17 @@ public class ServerBot extends ServerPlayer { } } @@ -260,8 +257,8 @@ index b833653b671df660686134754c794d3e6686b112..d0b88733427d81aacb9699faf695c679 + // die check end - @Override -@@ -198,10 +224,6 @@ public class ServerBot extends ServerPlayer { + @Nullable +@@ -205,10 +227,6 @@ public class ServerBot extends ServerPlayer { return groundTicks != 0; } @@ -272,7 +269,7 @@ index b833653b671df660686134754c794d3e6686b112..d0b88733427d81aacb9699faf695c679 public static boolean solidAt(Location loc) { Block block = loc.getBlock(); BoundingBox box = block.getBoundingBox(); -@@ -296,12 +318,24 @@ public class ServerBot extends ServerPlayer { +@@ -303,12 +321,24 @@ public class ServerBot extends ServerPlayer { public void tick() { // loadChunks(); // Load chunks super.tick(); @@ -301,7 +298,7 @@ index b833653b671df660686134754c794d3e6686b112..d0b88733427d81aacb9699faf695c679 if (checkGround()) { if (groundTicks < 5) groundTicks++; -@@ -329,7 +363,88 @@ public class ServerBot extends ServerPlayer { +@@ -336,7 +366,88 @@ public class ServerBot extends ServerPlayer { checkOutOfWorld(); @@ -390,7 +387,7 @@ index b833653b671df660686134754c794d3e6686b112..d0b88733427d81aacb9699faf695c679 } @Override -@@ -362,21 +477,6 @@ public class ServerBot extends ServerPlayer { +@@ -369,21 +480,6 @@ public class ServerBot extends ServerPlayer { } } @@ -412,7 +409,7 @@ index b833653b671df660686134754c794d3e6686b112..d0b88733427d81aacb9699faf695c679 public Location getLocation() { return getBukkitPlayer().getLocation(); } -@@ -468,6 +568,68 @@ public class ServerBot extends ServerPlayer { +@@ -475,6 +571,68 @@ public class ServerBot extends ServerPlayer { this.move(MoverType.SELF, new Vec3(velocity.getX(), y, velocity.getZ())); }