mirror of
https://github.com/LeavesMC/Leaves.git
synced 2025-12-19 14:59:32 +00:00
169 lines
10 KiB
Diff
169 lines
10 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: violetc <58360096+s-yh-china@users.noreply.github.com>
|
|
Date: Sun, 2 Feb 2025 15:28:12 +0800
|
|
Subject: [PATCH] Leaves Fakeplayer
|
|
|
|
|
|
diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
|
index a589689e3a9de1fffef62e0e3dcd79bb2e848c5b..c0910f908ffad3bb94563836c032bb1d6d50c4ed 100644
|
|
--- a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
|
+++ b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
|
@@ -41,6 +41,22 @@ class PaperEventManager {
|
|
throw new IllegalStateException(event.getEventName() + " may only be triggered synchronously.");
|
|
}
|
|
|
|
+ // Leaves start - skip bot
|
|
+ if (event instanceof org.bukkit.event.player.PlayerEvent playerEvent && playerEvent.getPlayer() instanceof org.leavesmc.leaves.entity.bot.Bot) {
|
|
+ return;
|
|
+ }
|
|
+ // Leaves end - skip bot
|
|
+
|
|
+ // Leaves start - process bot load/save
|
|
+ if (org.leavesmc.leaves.LeavesConfig.modify.fakeplayer.enable && org.leavesmc.leaves.LeavesConfig.modify.fakeplayer.canResident) {
|
|
+ if (event instanceof org.bukkit.event.world.WorldLoadEvent worldLoadEvent) {
|
|
+ org.leavesmc.leaves.bot.BotList.INSTANCE.loadResume(worldLoadEvent.getWorld().getUID().toString());
|
|
+ } else if (event instanceof org.bukkit.event.world.WorldUnloadEvent worldUnloadEvent) {
|
|
+ org.leavesmc.leaves.bot.BotList.INSTANCE.removeAllIn(worldUnloadEvent.getWorld().getUID().toString());
|
|
+ }
|
|
+ }
|
|
+ // Leaves end - process bot load/save
|
|
+
|
|
HandlerList handlers = event.getHandlers();
|
|
RegisteredListener[] listeners = handlers.getRegisteredListeners();
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
|
|
index 119f4c23e351eab0a503f78b48136dc6ae55bf60..7d99e7f29156723a3f20f1daba21aed2bc6649c6 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
|
|
@@ -373,6 +373,7 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
|
|
@SuppressWarnings("unchecked")
|
|
public <T extends Entity> T addEntity(T entity) {
|
|
Preconditions.checkArgument(!entity.isInWorld(), "Entity has already been added to a world");
|
|
+ Preconditions.checkState(!(entity instanceof org.leavesmc.leaves.entity.bot.CraftBot), "[Leaves] Fakeplayers do not support changing world, Please use leaves fakeplayer-api instead!");
|
|
net.minecraft.world.entity.Entity nmsEntity = ((CraftEntity) entity).getHandle();
|
|
if (nmsEntity.level() != this.getHandle().getLevel()) {
|
|
throw new IllegalArgumentException(entity + " wasn't created with this world, you must create the entity with the world you want to add it to.");
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
index 3a81b4c659d35fd273542a8bb343c256c29dfccc..dd132b146a694ac60348b0a3173d12fdd064f29e 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
@@ -305,6 +305,7 @@ public final class CraftServer implements Server {
|
|
private final io.papermc.paper.potion.PaperPotionBrewer potionBrewer;
|
|
public final io.papermc.paper.SparksFly spark;
|
|
private final ServerConfiguration serverConfig = new PaperServerConfiguration();
|
|
+ private final org.leavesmc.leaves.entity.bot.CraftBotManager botManager; // Leaves
|
|
|
|
// Paper start - Folia region threading API
|
|
private final io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler regionizedScheduler = new io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler();
|
|
@@ -486,6 +487,7 @@ public final class CraftServer implements Server {
|
|
datapackManager = new io.papermc.paper.datapack.PaperDatapackManager(console.getPackRepository()); // Paper
|
|
this.spark = new io.papermc.paper.SparksFly(this); // Paper - spark
|
|
org.leavesmc.leaves.protocol.core.LeavesProtocolManager.init(); // Leaves - protocol
|
|
+ this.botManager = new org.leavesmc.leaves.entity.bot.CraftBotManager(); // Leaves
|
|
}
|
|
|
|
public boolean getCommandBlockOverride(String command) {
|
|
@@ -1341,7 +1343,7 @@ public final class CraftServer implements Server {
|
|
return false;
|
|
}
|
|
|
|
- if (!handle.players().isEmpty()) {
|
|
+ if (!handle.realPlayers().isEmpty()) { // Leaves - skip
|
|
return false;
|
|
}
|
|
|
|
@@ -2965,4 +2967,11 @@ public final class CraftServer implements Server {
|
|
public void allowPausing(final Plugin plugin, final boolean value) {
|
|
this.console.addPluginAllowingSleep(plugin.getName(), value);
|
|
}
|
|
+
|
|
+ // Leaves start - Bot API
|
|
+ @Override
|
|
+ public org.leavesmc.leaves.entity.bot.CraftBotManager getBotManager() {
|
|
+ return botManager;
|
|
+ }
|
|
+ // Leaves end - Bot API
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
index e92827b83d2cd7f18ed214ce389ac423b6d2d922..7fca335bb7db5b85ee5fc155cc4341b808db9a07 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
@@ -251,7 +251,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
|
|
@Override
|
|
public int getPlayerCount() {
|
|
- return world.players().size();
|
|
+ return world.realPlayers().size(); // Leaves - skip
|
|
}
|
|
|
|
@Override
|
|
@@ -1111,9 +1111,9 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
|
|
@Override
|
|
public List<Player> getPlayers() {
|
|
- List<Player> list = new ArrayList<Player>(this.world.players().size());
|
|
+ List<Player> list = new ArrayList<Player>(this.world.realPlayers().size()); // Leaves - skip
|
|
|
|
- for (net.minecraft.world.entity.player.Player human : this.world.players()) {
|
|
+ for (net.minecraft.world.entity.player.Player human : this.world.realPlayers()) { // Leaves - skip
|
|
HumanEntity bukkitEntity = human.getBukkitEntity();
|
|
|
|
if ((bukkitEntity != null) && (bukkitEntity instanceof Player)) {
|
|
@@ -1600,7 +1600,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
public void playSound(final net.kyori.adventure.sound.Sound sound) {
|
|
org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper
|
|
final long seed = sound.seed().orElseGet(this.world.getRandom()::nextLong);
|
|
- for (ServerPlayer player : this.getHandle().players()) {
|
|
+ for (ServerPlayer player : this.getHandle().realPlayers()) { // Leaves - skip
|
|
player.connection.send(io.papermc.paper.adventure.PaperAdventure.asSoundPacket(sound, player.getX(), player.getY(), player.getZ(), seed, null));
|
|
}
|
|
}
|
|
@@ -1628,7 +1628,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper
|
|
final long seed = sound.seed().orElseGet(this.getHandle().getRandom()::nextLong);
|
|
if (emitter == net.kyori.adventure.sound.Sound.Emitter.self()) {
|
|
- for (ServerPlayer player : this.getHandle().players()) {
|
|
+ for (ServerPlayer player : this.getHandle().realPlayers()) { // Leaves - skip
|
|
player.connection.send(io.papermc.paper.adventure.PaperAdventure.asSoundPacket(sound, player, seed, null));
|
|
}
|
|
} else if (emitter instanceof CraftEntity craftEntity) {
|
|
@@ -1792,7 +1792,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
|
Preconditions.checkArgument(particle.getDataType().isInstance(data), "data (%s) should be %s", data.getClass(), particle.getDataType());
|
|
}
|
|
this.getHandle().sendParticlesSource(
|
|
- receivers == null ? this.getHandle().players() : Lists.transform(receivers, player -> ((CraftPlayer) player).getHandle()), // Paper - Particle API
|
|
+ receivers == null ? this.getHandle().realPlayers() : Lists.transform(receivers, player -> ((CraftPlayer) player).getHandle()), // Paper - Particle API
|
|
sender != null ? ((CraftPlayer) sender).getHandle() : null, // Sender // Paper - Particle API
|
|
CraftParticle.createParticleParam(particle, data), // Particle
|
|
force,
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
index b177e23db960323b901909a3f845a9ae0426d0df..b28129242d13afc72ea863aaf405063c38663e0e 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
|
@@ -121,6 +121,8 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
|
|
return new CraftHumanEntity(server, (net.minecraft.world.entity.player.Player) entity);
|
|
}
|
|
|
|
+ if (entity instanceof org.leavesmc.leaves.bot.ServerBot bot) { return new org.leavesmc.leaves.entity.bot.CraftBot(server, bot); }
|
|
+
|
|
// Special case complex part, since there is no extra entity type for them
|
|
if (entity instanceof EnderDragonPart complexPart) {
|
|
if (complexPart.parentMob instanceof EnderDragon) {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
index d5496e5fbb5fcd65df2933ebc7cb39df7d832923..250a7d5427fc59478d8a540cfb2319939a489e65 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
@@ -882,7 +882,11 @@ public class CraftEventFactory {
|
|
event.setKeepInventory(keepInventory);
|
|
event.setKeepLevel(victim.keepLevel); // SPIGOT-2222: pre-set keepLevel
|
|
populateFields(victim, event); // Paper - make cancellable
|
|
- Bukkit.getServer().getPluginManager().callEvent(event);
|
|
+ // Leaves start - disable bot death event
|
|
+ if (!(victim instanceof org.leavesmc.leaves.bot.ServerBot)) {
|
|
+ Bukkit.getServer().getPluginManager().callEvent(event);
|
|
+ }
|
|
+ // Leaves end - disable bot death event
|
|
// Paper start - make cancellable
|
|
if (event.isCancelled()) {
|
|
return event;
|