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. + *

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