9
0
mirror of https://github.com/LeavesMC/Leaves.git synced 2025-12-24 09:29:22 +00:00

Fix fakeplayer And add more api

This commit is contained in:
violetc
2022-07-28 10:57:04 +08:00
parent 9bf23ce992
commit d4cc9fe63b
3 changed files with 143 additions and 69 deletions

View File

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

View File

@@ -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<? extends Future<? super Void>> 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<? extends Future<? super Void>> 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;

View File

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