mirror of
https://github.com/LeavesMC/Leaves.git
synced 2025-12-20 15:29:35 +00:00
506 lines
15 KiB
Diff
506 lines
15 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: violetc <58360096+s-yh-china@users.noreply.github.com>
|
|
Date: Wed, 27 Jul 2022 15:30:34 +0800
|
|
Subject: [PATCH] Add fakeplayer api
|
|
|
|
|
|
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
|
|
index f78b5fd3c3347d28da58777bff88903d2eb140f6..63d9d30a11eecb872fe64f04ef7fe5d16f0afa3e 100644
|
|
--- a/src/main/java/org/bukkit/Bukkit.java
|
|
+++ b/src/main/java/org/bukkit/Bukkit.java
|
|
@@ -57,6 +57,7 @@ import org.jetbrains.annotations.Contract;
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.jetbrains.annotations.Nullable;
|
|
import io.papermc.paper.util.JarManifests; // Paper
|
|
+import top.leavesmc.leaves.entity.BotManager;
|
|
|
|
/**
|
|
* Represents the Bukkit core, for version and Server singleton handling
|
|
@@ -2752,6 +2753,17 @@ public final class Bukkit {
|
|
}
|
|
// Paper end - Folia region threading API
|
|
|
|
+ // Leaves start - Bot API
|
|
+ /**
|
|
+ * Returns a bot manager.
|
|
+ *
|
|
+ * @return Bot Manager
|
|
+ */
|
|
+ public static @NotNull BotManager getBotManager() {
|
|
+ return server.getBotManager();
|
|
+ }
|
|
+ // Leaves end - Bot API
|
|
+
|
|
@NotNull
|
|
public static Server.Spigot spigot() {
|
|
return server.spigot();
|
|
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
|
|
index 09fa5d4f8cbaf77150459f78d08004f85dd3cdcc..0b58392263898b4ef7eba8a082cddf74d3c7cd82 100644
|
|
--- a/src/main/java/org/bukkit/Server.java
|
|
+++ b/src/main/java/org/bukkit/Server.java
|
|
@@ -57,6 +57,7 @@ import org.bukkit.util.CachedServerIcon;
|
|
import org.jetbrains.annotations.Contract;
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.jetbrains.annotations.Nullable;
|
|
+import top.leavesmc.leaves.entity.BotManager;
|
|
|
|
/**
|
|
* Represents a server implementation.
|
|
@@ -2412,4 +2413,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
|
|
*/
|
|
boolean isOwnedByCurrentRegion(@NotNull Entity entity);
|
|
// Paper end - Folia region threading API
|
|
+
|
|
+ // Leaves start - Bot API
|
|
+ /**
|
|
+ * Returns a bot manager.
|
|
+ *
|
|
+ * @return Bot Manager
|
|
+ */
|
|
+ @NotNull BotManager getBotManager();
|
|
+ // Leaves end - Bot API
|
|
}
|
|
diff --git a/src/main/java/top/leavesmc/leaves/entity/Bot.java b/src/main/java/top/leavesmc/leaves/entity/Bot.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..8816683c795f9be6a4f112203cfac3f59d8faba5
|
|
--- /dev/null
|
|
+++ b/src/main/java/top/leavesmc/leaves/entity/Bot.java
|
|
@@ -0,0 +1,46 @@
|
|
+package top.leavesmc.leaves.entity;
|
|
+
|
|
+import org.bukkit.entity.Player;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+import org.jetbrains.annotations.Nullable;
|
|
+import top.leavesmc.leaves.entity.botaction.LeavesBotAction;
|
|
+
|
|
+/**
|
|
+ * Represents a fakeplayer
|
|
+ */
|
|
+public interface Bot extends Player {
|
|
+
|
|
+ /**
|
|
+ * Gets the fakeplayer skin
|
|
+ *
|
|
+ * @return fakeplayer skin name
|
|
+ */
|
|
+ @Nullable
|
|
+ public String getSkinName();
|
|
+
|
|
+ /**
|
|
+ * Gets the fakeplayer name without prefix and suffix
|
|
+ *
|
|
+ * @return fakeplayer real name
|
|
+ */
|
|
+ @NotNull
|
|
+ public String getRealName();
|
|
+
|
|
+ /**
|
|
+ * Sets the fakeplayer action with args.
|
|
+ *
|
|
+ * @param action action name
|
|
+ * @param player player who create this action
|
|
+ * @param args passed action arguments
|
|
+ */
|
|
+ public boolean setBotAction(@NotNull String action, @NotNull Player player, @NotNull String[] args);
|
|
+
|
|
+ /**
|
|
+ * Sets the fakeplayer action with args.
|
|
+ *
|
|
+ * @param action leaves bot action
|
|
+ * @param player player who create this action
|
|
+ * @param args passed action arguments
|
|
+ */
|
|
+ public boolean setBotAction(@NotNull LeavesBotAction action, @NotNull Player player, @NotNull String[] args);
|
|
+}
|
|
diff --git a/src/main/java/top/leavesmc/leaves/entity/BotManager.java b/src/main/java/top/leavesmc/leaves/entity/BotManager.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..f2258027b2ed4bfcf7feda2e9075b1a1a05a85b6
|
|
--- /dev/null
|
|
+++ b/src/main/java/top/leavesmc/leaves/entity/BotManager.java
|
|
@@ -0,0 +1,107 @@
|
|
+package top.leavesmc.leaves.entity;
|
|
+
|
|
+import org.bukkit.Location;
|
|
+import org.bukkit.util.Consumer;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+import org.jetbrains.annotations.Nullable;
|
|
+import top.leavesmc.leaves.entity.botaction.CustomBotAction;
|
|
+
|
|
+import java.util.Collection;
|
|
+import java.util.UUID;
|
|
+
|
|
+/**
|
|
+ * Simple fakeplayer manager
|
|
+ */
|
|
+public interface BotManager {
|
|
+
|
|
+ /**
|
|
+ * Gets a fakeplayer object by the given uuid.
|
|
+ *
|
|
+ * @param uuid the uuid to look up
|
|
+ * @return a fakeplayer if one was found, null otherwise
|
|
+ */
|
|
+ @Nullable
|
|
+ public Bot getBot(@NotNull UUID uuid);
|
|
+
|
|
+ /**
|
|
+ * Gets a fakeplayer object by the given name.
|
|
+ *
|
|
+ * @param name the name to look up
|
|
+ * @return a fakeplayer if one was found, null otherwise
|
|
+ */
|
|
+ @Nullable
|
|
+ public Bot getBot(@NotNull String name);
|
|
+
|
|
+ /**
|
|
+ * Creates a fakeplayer with given param.
|
|
+ * <p>
|
|
+ * prefix and suffix will not be added.
|
|
+ *
|
|
+ * @param name fakeplayer name
|
|
+ * @param realName fakeplayer real name
|
|
+ * @param skin fakeplayer skin arr
|
|
+ * @param skinName fakeplayer skin name
|
|
+ * @param location a location will create fakeplayer
|
|
+ * @return a fakeplayer if success, null otherwise
|
|
+ */
|
|
+ @Nullable
|
|
+ public Bot createBot(@NotNull String name, @NotNull String realName, @Nullable String[] skin, @Nullable String skinName, @NotNull Location location);
|
|
+
|
|
+ /**
|
|
+ * Creates a fakeplayer with given param.
|
|
+ *
|
|
+ * @param name fakeplayer name
|
|
+ * @param skinName fakeplayer skin name
|
|
+ * @param location a location will create fakeplayer
|
|
+ * @param consumer a consumer after create fakeplayer success
|
|
+ */
|
|
+ public void createBot(@NotNull String name, @Nullable String skinName, @NotNull Location location, @Nullable Consumer<Bot> consumer);
|
|
+
|
|
+ /**
|
|
+ * Removes a fakeplayer object by the given name.
|
|
+ *
|
|
+ * @param name the name to look up
|
|
+ */
|
|
+ public void removeBot(@NotNull String name);
|
|
+
|
|
+ /**
|
|
+ * Removes a fakeplayer object by the given uuid.
|
|
+ *
|
|
+ * @param uuid the uuid to look up
|
|
+ */
|
|
+ public void removeBot(@NotNull UUID uuid);
|
|
+
|
|
+ /**
|
|
+ * Removes all fakeplayers.
|
|
+ */
|
|
+ public void removeAllBots();
|
|
+
|
|
+ /**
|
|
+ * Save fakeplayers data if resident-fakeplayer is true, or remove all fakeplayer.
|
|
+ */
|
|
+ public void saveOrRemoveAllBots();
|
|
+
|
|
+ /**
|
|
+ * Gets a view of all currently logged in fakeplayers. This view is a reused object, making some operations like Collection.size() zero-allocation.
|
|
+ *
|
|
+ * @return a view of fakeplayers.
|
|
+ */
|
|
+ public Collection<Bot> getBots();
|
|
+
|
|
+ /**
|
|
+ * Register a custom bot action.
|
|
+ *
|
|
+ * @param name action name
|
|
+ * @param action action executor
|
|
+ * @return true if success, or false
|
|
+ */
|
|
+ public boolean registerCustomBotAction(String name, CustomBotAction action);
|
|
+
|
|
+ /**
|
|
+ * Unregister a custom bot action.
|
|
+ *
|
|
+ * @param name action name
|
|
+ * @return true if success, or false
|
|
+ */
|
|
+ public boolean unregisterCustomBotAction(String name);
|
|
+}
|
|
diff --git a/src/main/java/top/leavesmc/leaves/entity/botaction/CustomBotAction.java b/src/main/java/top/leavesmc/leaves/entity/botaction/CustomBotAction.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..7abf4eef22e40468929e724ebc07a97b0b2a05f3
|
|
--- /dev/null
|
|
+++ b/src/main/java/top/leavesmc/leaves/entity/botaction/CustomBotAction.java
|
|
@@ -0,0 +1,52 @@
|
|
+package top.leavesmc.leaves.entity.botaction;
|
|
+
|
|
+import org.bukkit.entity.Player;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+import org.jetbrains.annotations.Nullable;
|
|
+import top.leavesmc.leaves.entity.Bot;
|
|
+
|
|
+import java.util.List;
|
|
+
|
|
+/**
|
|
+ * Represents a class which contains methods for a custom bot action
|
|
+ */
|
|
+public interface CustomBotAction {
|
|
+
|
|
+ /**
|
|
+ * Executes the action, returning its success.
|
|
+ *
|
|
+ * @param bot bot of the action
|
|
+ * @return true if once action finish, otherwise false
|
|
+ */
|
|
+ public boolean doTick(Bot bot);
|
|
+
|
|
+ /**
|
|
+ * Created a new action instance.
|
|
+ *
|
|
+ * @param player player who create this action
|
|
+ * @param args passed action arguments
|
|
+ * @return a new action instance with given args
|
|
+ */
|
|
+ public @Nullable CustomBotAction getNew(Player player, String[] args);
|
|
+
|
|
+ /**
|
|
+ * Requests a list of possible completions for a action argument.
|
|
+ *
|
|
+ * @return A List of a List of possible completions for the argument.
|
|
+ */
|
|
+ public @NotNull List<List<String>> getTabComplete();
|
|
+
|
|
+ /**
|
|
+ * Return a ticks to wait between {@link CustomBotAction#doTick(Bot)}
|
|
+ *
|
|
+ * @return the ticks to wait between runs
|
|
+ */
|
|
+ public int getTickDelay();
|
|
+
|
|
+ /**
|
|
+ * Return a number of times {@link CustomBotAction#doTick(Bot)} can return true
|
|
+ *
|
|
+ * @return the number of times an action can be executed
|
|
+ */
|
|
+ public int getNumber();
|
|
+}
|
|
diff --git a/src/main/java/top/leavesmc/leaves/entity/botaction/LeavesBotAction.java b/src/main/java/top/leavesmc/leaves/entity/botaction/LeavesBotAction.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..e298722319ff0cfd52e531693ea3767e5f9a3d52
|
|
--- /dev/null
|
|
+++ b/src/main/java/top/leavesmc/leaves/entity/botaction/LeavesBotAction.java
|
|
@@ -0,0 +1,32 @@
|
|
+package top.leavesmc.leaves.entity.botaction;
|
|
+
|
|
+/**
|
|
+ * A Leaves bot action enum
|
|
+ */
|
|
+public enum LeavesBotAction {
|
|
+ ATTACK("attack"),
|
|
+ ATTACK_SELF("attack_self"),
|
|
+ BREAK("break"),
|
|
+ DROP("drop"),
|
|
+ FISH("fish"),
|
|
+ JUMP("jump"),
|
|
+ LAY("lay"),
|
|
+ LOOK("look"),
|
|
+ ROTATE("rotate"),
|
|
+ SNEAK("sneak"),
|
|
+ STOP("stop"),
|
|
+ SWIM("swim"),
|
|
+ USE("use"),
|
|
+ USE_ON("use_on"),
|
|
+ USE_TO("use_to");
|
|
+
|
|
+ private final String name;
|
|
+
|
|
+ private LeavesBotAction(String name) {
|
|
+ this.name = name;
|
|
+ }
|
|
+
|
|
+ public String getName() {
|
|
+ return name;
|
|
+ }
|
|
+}
|
|
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..7cf1eb4eb3d2fe9310f9272ec53208632b87b49b
|
|
--- /dev/null
|
|
+++ b/src/main/java/top/leavesmc/leaves/event/bot/BotCreateEvent.java
|
|
@@ -0,0 +1,106 @@
|
|
+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;
|
|
+
|
|
+/**
|
|
+ * Call when a fakeplayer creates a server
|
|
+ */
|
|
+public class BotCreateEvent extends Event implements Cancellable {
|
|
+ private static final HandlerList handlers = new HandlerList();
|
|
+
|
|
+ private final String bot;
|
|
+ private final String skin;
|
|
+ private String joinMessage;
|
|
+ private Location createLocation;
|
|
+ private boolean cancel = false;
|
|
+
|
|
+ public BotCreateEvent(@NotNull final String who, @NotNull final String skin, @NotNull final Location createLocation, @Nullable final String joinMessage) {
|
|
+ this.bot = who;
|
|
+ this.skin = skin;
|
|
+ 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
|
|
+ */
|
|
+ @Nullable
|
|
+ public String getJoinMessage() {
|
|
+ return joinMessage;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the join message to send to all online players
|
|
+ *
|
|
+ * @param joinMessage join message. If null, no message will be sent
|
|
+ */
|
|
+ public void setJoinMessage(@Nullable String joinMessage) {
|
|
+ this.joinMessage = joinMessage;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the location to create the fakeplayer
|
|
+ *
|
|
+ * @return Location to create the fakeplayer
|
|
+ */
|
|
+ @NotNull
|
|
+ public Location getCreateLocation() {
|
|
+ return createLocation;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the location to create the fakeplayer
|
|
+ *
|
|
+ * @param createLocation location to create the fakeplayer
|
|
+ */
|
|
+ public void setCreateLocation(@NotNull Location createLocation) {
|
|
+ this.createLocation = createLocation;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the fakeplayer skin
|
|
+ *
|
|
+ * @return fakeplayer skin name
|
|
+ */
|
|
+ @Nullable
|
|
+ public String getSkin() {
|
|
+ return skin;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean isCancelled() {
|
|
+ return cancel;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setCancelled(boolean cancel) {
|
|
+ this.cancel = cancel;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ @NotNull
|
|
+ public HandlerList getHandlers() {
|
|
+ return handlers;
|
|
+ }
|
|
+
|
|
+ @NotNull
|
|
+ public static HandlerList getHandlerList() {
|
|
+ return handlers;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/top/leavesmc/leaves/event/bot/BotEvent.java b/src/main/java/top/leavesmc/leaves/event/bot/BotEvent.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..4a4fe07ce965d4a97e0d8105a91310dac7d1343c
|
|
--- /dev/null
|
|
+++ b/src/main/java/top/leavesmc/leaves/event/bot/BotEvent.java
|
|
@@ -0,0 +1,31 @@
|
|
+package top.leavesmc.leaves.event.bot;
|
|
+
|
|
+import org.bukkit.event.Event;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+import top.leavesmc.leaves.entity.Bot;
|
|
+
|
|
+/**
|
|
+ * Represents a fakeplayer related event
|
|
+ */
|
|
+public abstract class BotEvent extends Event {
|
|
+ protected Bot bot;
|
|
+
|
|
+ public BotEvent(@NotNull final Bot who) {
|
|
+ bot = who;
|
|
+ }
|
|
+
|
|
+ public BotEvent(@NotNull final Bot who, boolean async) { // Paper - public
|
|
+ super(async);
|
|
+ bot = who;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Returns the fakeplayer involved in this event
|
|
+ *
|
|
+ * @return Fakeplayer who is involved in this event
|
|
+ */
|
|
+ @NotNull
|
|
+ public final Bot getBot() {
|
|
+ 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;
|
|
+ }
|
|
+}
|