From 9b0ea16da4dbd8794cc04263b902d97a31d5a78c Mon Sep 17 00:00:00 2001 From: linusglimm Date: Sat, 4 May 2024 13:57:18 +0200 Subject: [PATCH 1/8] Done some stuff - Added a button component - Made button fixed in front of the player - Made difference between 1.20.1 and 1.20.2 in the method used to move the display --- build.gradle | 2 +- .../java/de/littleprogrammer/guiapi/Api.java | 39 +++++++++++ .../java/de/littleprogrammer/guiapi/GUI.java | 9 +++ .../guiapi/commands/SpawnButtonCommand.java | 18 +++++ .../guiapi/components/Button.java | 70 +++++++++++++++++++ .../guiapi/components/Text.java | 4 ++ .../guiapi/enums/ServerVersion.java | 9 +++ .../guiapi/listeners/MoveListener.java | 15 ++++ .../guiapi/utils/Calculations.java | 18 +++++ .../guiapi/utils/TeleportInterpolator.java | 51 ++++++++++++++ src/main/resources/plugin.yml | 2 + 11 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/littleprogrammer/guiapi/GUI.java create mode 100644 src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java create mode 100644 src/main/java/de/littleprogrammer/guiapi/components/Button.java create mode 100644 src/main/java/de/littleprogrammer/guiapi/components/Text.java create mode 100644 src/main/java/de/littleprogrammer/guiapi/enums/ServerVersion.java create mode 100644 src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java create mode 100644 src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java create mode 100644 src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java diff --git a/build.gradle b/build.gradle index b590cf7..f9ab6e3 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ repositories { } dependencies { - compileOnly "org.spigotmc:spigot-api:1.19.4-R0.1-SNAPSHOT" + compileOnly "org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT" } def targetJavaVersion = 17 diff --git a/src/main/java/de/littleprogrammer/guiapi/Api.java b/src/main/java/de/littleprogrammer/guiapi/Api.java index 712d889..a65f06d 100644 --- a/src/main/java/de/littleprogrammer/guiapi/Api.java +++ b/src/main/java/de/littleprogrammer/guiapi/Api.java @@ -1,17 +1,56 @@ package de.littleprogrammer.guiapi; +import de.littleprogrammer.guiapi.commands.SpawnButtonCommand; +import de.littleprogrammer.guiapi.components.Button; +import de.littleprogrammer.guiapi.enums.ServerVersion; +import de.littleprogrammer.guiapi.listeners.MoveListener; +import org.bukkit.Bukkit; +import org.bukkit.Server; import org.bukkit.plugin.java.JavaPlugin; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + public final class Api extends JavaPlugin { + private static Api instance; + private static ServerVersion version; + private Map buttons = new HashMap<>(); + @Override public void onEnable() { // Plugin startup logic + instance = this; + + String secIndicator = Bukkit.getBukkitVersion().split("\\.")[1]; + String preTrdIndicator = Bukkit.getBukkitVersion().split("\\.")[2]; + String trdIndicator = preTrdIndicator.split("-")[0]; + if (Integer.parseInt(secIndicator) == 20) { + if (Integer.parseInt(trdIndicator) >= 2) { + version = ServerVersion.POST_1_20_2; + } else { + version = ServerVersion.PRE_1_20_2; + } + } else { + if (Integer.parseInt(secIndicator) > 20) { + version = ServerVersion.POST_1_20_2; + } else { + version = ServerVersion.PRE_1_20_2; + } + } + + getCommand("spawnBtn").setExecutor(new SpawnButtonCommand()); + Bukkit.getPluginManager().registerEvents(new MoveListener(), this); } @Override public void onDisable() { // Plugin shutdown logic } + + public static Api getInstance() { return instance; } + public Map getButtons() { return buttons; } + public static ServerVersion getVersion() { return version; } } diff --git a/src/main/java/de/littleprogrammer/guiapi/GUI.java b/src/main/java/de/littleprogrammer/guiapi/GUI.java new file mode 100644 index 0000000..89ec9ce --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/GUI.java @@ -0,0 +1,9 @@ +package de.littleprogrammer.guiapi; + +public class GUI { + + public GUI() { + + } + +} diff --git a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java new file mode 100644 index 0000000..6d36a4b --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java @@ -0,0 +1,18 @@ +package de.littleprogrammer.guiapi.commands; + +import de.littleprogrammer.guiapi.components.Button; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class SpawnButtonCommand implements CommandExecutor { + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + + new Button((Player) commandSender, "This is the \n text on the display", "localName"); + + + return false; + } +} diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Button.java b/src/main/java/de/littleprogrammer/guiapi/components/Button.java new file mode 100644 index 0000000..9eff4c4 --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/components/Button.java @@ -0,0 +1,70 @@ +package de.littleprogrammer.guiapi.components; + +import de.littleprogrammer.guiapi.Api; +import de.littleprogrammer.guiapi.enums.ServerVersion; +import de.littleprogrammer.guiapi.utils.Calculations; +import de.littleprogrammer.guiapi.utils.TeleportInterpolator; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Display; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.util.Transformation; + +import java.util.UUID; + +public class Button implements Listener { + + private String texture; + private String localizedName; + private UUID uuid; + private TextDisplay textDisplay; + private Location location; + private Player player; + + public Button(Player player, String texture, String localizedName) { + this.player = player; + this.texture = texture; + this.localizedName = localizedName; + uuid = UUID.randomUUID(); + + spawn(); + } + + private void spawn() { + Api.getInstance().getButtons().put(player.getUniqueId(), this); + + textDisplay = (TextDisplay) player.getWorld().spawnEntity(Calculations.calculateInventoryLoc(player.getLocation()), EntityType.TEXT_DISPLAY); + textDisplay.setText(texture); + textDisplay.setGlowing(true); + textDisplay.setBillboard(Display.Billboard.CENTER); + textDisplay.setDisplayWidth(30); + textDisplay.setDisplayHeight(30); + Bukkit.getScheduler().runTaskLater(Api.getInstance(), () -> { + + }, 2); + } + + public void updatePosition(Location playerLoc) { +// textDisplay.setTeleportDuration(5); +// + location = Calculations.calculateInventoryLoc(playerLoc); +// textDisplay.teleport(location); +// textDisplay.setInterpolationDuration(5); +// textDisplay.setInterpolationDelay(-1); +// Transformation transformation = textDisplay.getTransformation(); +// transformation.getTranslation().set(location.toVector().subtract(textDisplay.getLocation().toVector()).toVector3f()); +// textDisplay.setTransformation(transformation); + if (Api.getVersion().equals(ServerVersion.PRE_1_20_2)) { + TeleportInterpolator teleportInterpolator = new TeleportInterpolator(textDisplay, location, 5, 1); + teleportInterpolator.startInterpolation(); + } else { + textDisplay.setTeleportDuration(5); + textDisplay.teleport(location); + } + } +} diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Text.java b/src/main/java/de/littleprogrammer/guiapi/components/Text.java new file mode 100644 index 0000000..ed4e49b --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/components/Text.java @@ -0,0 +1,4 @@ +package de.littleprogrammer.guiapi.components; + +public class Text { +} diff --git a/src/main/java/de/littleprogrammer/guiapi/enums/ServerVersion.java b/src/main/java/de/littleprogrammer/guiapi/enums/ServerVersion.java new file mode 100644 index 0000000..fe43d3e --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/enums/ServerVersion.java @@ -0,0 +1,9 @@ +package de.littleprogrammer.guiapi.enums; + +public enum ServerVersion { + PRE_1_20_2, + POST_1_20_2; + ServerVersion() { + + } +} diff --git a/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java b/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java new file mode 100644 index 0000000..66ca3ad --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java @@ -0,0 +1,15 @@ +package de.littleprogrammer.guiapi.listeners; + +import de.littleprogrammer.guiapi.Api; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; + +public class MoveListener implements Listener { + @EventHandler + public void onPlayerMove(PlayerMoveEvent event) { + if (Api.getInstance().getButtons().containsKey(event.getPlayer().getUniqueId())) { + Api.getInstance().getButtons().get(event.getPlayer().getUniqueId()).updatePosition(event.getPlayer().getEyeLocation()); + } + } +} diff --git a/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java new file mode 100644 index 0000000..35eafd7 --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java @@ -0,0 +1,18 @@ +package de.littleprogrammer.guiapi.utils; + +import org.bukkit.Location; + +public class Calculations { + + public static Location calculateInventoryLoc(Location midLocation) { + double distance = 4; // 4 blocks away + double yawRadians = Math.toRadians(midLocation.getYaw()); + double pitchRadians = Math.toRadians(midLocation.getPitch()); + double x = midLocation.getX() - distance * Math.sin(yawRadians); + double y = midLocation.getY() - 1; + double z = midLocation.getZ() + distance * Math.cos(yawRadians); // Negative here to match player rotation direction + + return new Location(midLocation.getWorld(), x, y, z, midLocation.getYaw(), 0); + } + +} diff --git a/src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java b/src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java new file mode 100644 index 0000000..e12c02e --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java @@ -0,0 +1,51 @@ +package de.littleprogrammer.guiapi.utils; + +import de.littleprogrammer.guiapi.Api; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.scheduler.BukkitTask; + +import java.util.ArrayList; +import java.util.List; + +public class TeleportInterpolator { + + private Entity entity; + private Location targetLocation; + private int steps; + private int delay; + + public TeleportInterpolator(Entity entity, Location targetLocation, int steps, int delay) { + this.entity = entity; + this.targetLocation = targetLocation; + this.steps = steps; + this.delay = delay; + } + + public void startInterpolation() { + Location currentLocation = entity.getLocation(); + + double dx = (targetLocation.getX() - currentLocation.getX()) / steps; + double dy = (targetLocation.getY() - currentLocation.getY()) / steps; + double dz = (targetLocation.getZ() - currentLocation.getZ()) / steps; + + for (int i = 1; i <= steps; i++) { + double newX = currentLocation.getX() + dx * i; + double newY = currentLocation.getY() + dy * i; + double newZ = currentLocation.getZ() + dz * i; + + Location intermediateLocation = new Location(targetLocation.getWorld(), newX, newY, newZ); + + // Teleport the entity to the intermediate location after a delay + teleportWithDelay(intermediateLocation, i * delay); + } + } + + private void teleportWithDelay(Location location, int delayTicks) { + Bukkit.getScheduler().runTaskLater(Api.getInstance(), () -> { + entity.teleport(location); + }, delayTicks); + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 96665f6..cdc4b01 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,3 +4,5 @@ main: de.littleprogrammer.guiapi.Api api-version: '1.19' authors: [LittleProgrammer] description: An API to make 3D Gui's in minecraft +commands: + spawnBtn: From b75979be9c359af5efedded7c9f8f37a4cd28ccb Mon Sep 17 00:00:00 2001 From: linusglimm Date: Sat, 4 May 2024 20:56:03 +0200 Subject: [PATCH 2/8] Redid nearly everything - Changed the way the API will work later - Is now not a plugin anymore but just a gradle project - Added a class for GuiEvents - Moved some code around - Actually tried to do OOP - Added stuff to the GUI class to make it a gui --- build.gradle | 4 ++ .../java/de/littleprogrammer/guiapi/Api.java | 59 ++++++++++++------- .../java/de/littleprogrammer/guiapi/GUI.java | 47 ++++++++++++++- .../guiapi/commands/SpawnButtonCommand.java | 6 +- .../guiapi/components/Button.java | 59 ++++++++----------- .../guiapi/components/Component.java | 11 ++++ .../guiapi/listeners/GuiEvents.java | 27 +++++++++ .../guiapi/listeners/MoveListener.java | 6 +- .../guiapi/utils/TeleportInterpolator.java | 6 +- 9 files changed, 159 insertions(+), 66 deletions(-) create mode 100644 src/main/java/de/littleprogrammer/guiapi/components/Component.java create mode 100644 src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java diff --git a/build.gradle b/build.gradle index f9ab6e3..d033f69 100644 --- a/build.gradle +++ b/build.gradle @@ -31,6 +31,10 @@ java { } } +jar { + destinationDirectory.set(file("/Users/linusglimm/Desktop/mineopoly stuff/servers/spigotTest/plugins")) +} + tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' diff --git a/src/main/java/de/littleprogrammer/guiapi/Api.java b/src/main/java/de/littleprogrammer/guiapi/Api.java index a65f06d..364807a 100644 --- a/src/main/java/de/littleprogrammer/guiapi/Api.java +++ b/src/main/java/de/littleprogrammer/guiapi/Api.java @@ -1,30 +1,32 @@ package de.littleprogrammer.guiapi; -import de.littleprogrammer.guiapi.commands.SpawnButtonCommand; -import de.littleprogrammer.guiapi.components.Button; import de.littleprogrammer.guiapi.enums.ServerVersion; -import de.littleprogrammer.guiapi.listeners.MoveListener; -import org.bukkit.Bukkit; -import org.bukkit.Server; +import de.littleprogrammer.guiapi.listeners.GuiEvents; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitScheduler; import java.util.HashMap; import java.util.Map; import java.util.UUID; -public final class Api extends JavaPlugin { +public final class Api { + private final JavaPlugin plugin; private static Api instance; - private static ServerVersion version; - private Map buttons = new HashMap<>(); + private ServerVersion version; + private final Listener listener = new GuiEvents(); + private Map guis = new HashMap<>(); - @Override - public void onEnable() { - // Plugin startup logic + private Api(JavaPlugin plugin) { + this.plugin = plugin; instance = this; + } - String secIndicator = Bukkit.getBukkitVersion().split("\\.")[1]; - String preTrdIndicator = Bukkit.getBukkitVersion().split("\\.")[2]; + public void init() { + String secIndicator = plugin.getServer().getBukkitVersion().split("\\.")[1]; + String preTrdIndicator = plugin.getServer().getBukkitVersion().split("\\.")[2]; String trdIndicator = preTrdIndicator.split("-")[0]; if (Integer.parseInt(secIndicator) == 20) { @@ -41,16 +43,31 @@ public void onEnable() { } } - getCommand("spawnBtn").setExecutor(new SpawnButtonCommand()); - Bukkit.getPluginManager().registerEvents(new MoveListener(), this); + this.plugin.getServer().getPluginManager().registerEvents(this.listener, this.plugin); } - @Override - public void onDisable() { - // Plugin shutdown logic + public JavaPlugin getPlugin() {return this.plugin;} + public static Api getInstance() {return instance;} + public ServerVersion getVersion() { + return version; + } + public static BukkitScheduler getScheduler() { + return Api.getInstance().getPlugin().getServer().getScheduler(); } - public static Api getInstance() { return instance; } - public Map getButtons() { return buttons; } - public static ServerVersion getVersion() { return version; } + public GUI getGUI(UUID uuid) { + return guis.get(uuid); + } + + public GUI getGUI(Player player) { + return guis.get(player.getUniqueId()); + } + + public Map getGuis() { + return guis; + } + + public Listener getListener() { + return listener; + } } diff --git a/src/main/java/de/littleprogrammer/guiapi/GUI.java b/src/main/java/de/littleprogrammer/guiapi/GUI.java index 89ec9ce..c2ad0e7 100644 --- a/src/main/java/de/littleprogrammer/guiapi/GUI.java +++ b/src/main/java/de/littleprogrammer/guiapi/GUI.java @@ -1,9 +1,54 @@ package de.littleprogrammer.guiapi; +import de.littleprogrammer.guiapi.components.Button; +import de.littleprogrammer.guiapi.components.Component; +import de.littleprogrammer.guiapi.enums.ServerVersion; +import de.littleprogrammer.guiapi.utils.Calculations; +import de.littleprogrammer.guiapi.utils.TeleportInterpolator; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + public class GUI { - public GUI() { + private final Player player; + private final UUID uuid; + private final Map components; + + public GUI(Player player, String title, int gridWidth, int gridHeight) { + this.player = player; + this.uuid = player.getUniqueId(); + this.components = new HashMap<>(); + + Api.getInstance().getGuis().put(player.getUniqueId(), this); + } + + public void updatePosition(Location playerLoc) { + Location location = Calculations.calculateInventoryLoc(playerLoc); + + if (Api.getInstance().getVersion().equals(ServerVersion.PRE_1_20_2)) { + for (Component component : components.values()) { + TeleportInterpolator teleportInterpolator = new TeleportInterpolator(component.getEntity(), location, 5, 1); + teleportInterpolator.startInterpolation(); + } + } else { + for (Component component : components.values()) { + component.getDisplay().setTeleportDuration(5); + component.getDisplay().teleport(location); + } + } + } + + public Component getComponent(UUID uuid) { + return components.get(uuid); + } + public GUI addButton(String text, String localizedName) { + Button button = new Button(this, this.player, text, localizedName); + return this; } } diff --git a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java index 6d36a4b..f4fdc58 100644 --- a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java +++ b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java @@ -1,6 +1,6 @@ package de.littleprogrammer.guiapi.commands; -import de.littleprogrammer.guiapi.components.Button; +import de.littleprogrammer.guiapi.GUI; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -9,9 +9,7 @@ public class SpawnButtonCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { - - new Button((Player) commandSender, "This is the \n text on the display", "localName"); - + new GUI((Player) commandSender, "Title", 1, 1).addButton("Button Text", "localNameHere"); return false; } diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Button.java b/src/main/java/de/littleprogrammer/guiapi/components/Button.java index 9eff4c4..86bacb7 100644 --- a/src/main/java/de/littleprogrammer/guiapi/components/Button.java +++ b/src/main/java/de/littleprogrammer/guiapi/components/Button.java @@ -1,23 +1,18 @@ package de.littleprogrammer.guiapi.components; import de.littleprogrammer.guiapi.Api; -import de.littleprogrammer.guiapi.enums.ServerVersion; +import de.littleprogrammer.guiapi.GUI; import de.littleprogrammer.guiapi.utils.Calculations; -import de.littleprogrammer.guiapi.utils.TeleportInterpolator; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.entity.Display; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.entity.TextDisplay; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.util.Transformation; +import org.bukkit.entity.*; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import javax.annotation.Nonnull; import java.util.UUID; +import java.util.function.Consumer; -public class Button implements Listener { +public class Button implements Component { private String texture; private String localizedName; @@ -25,46 +20,44 @@ public class Button implements Listener { private TextDisplay textDisplay; private Location location; private Player player; + private Consumer clickAction; + private GUI gui; - public Button(Player player, String texture, String localizedName) { + public Button(GUI gui, Player player, String texture, String localizedName) { this.player = player; this.texture = texture; this.localizedName = localizedName; + this.gui = gui; uuid = UUID.randomUUID(); spawn(); } private void spawn() { - Api.getInstance().getButtons().put(player.getUniqueId(), this); - textDisplay = (TextDisplay) player.getWorld().spawnEntity(Calculations.calculateInventoryLoc(player.getLocation()), EntityType.TEXT_DISPLAY); textDisplay.setText(texture); textDisplay.setGlowing(true); textDisplay.setBillboard(Display.Billboard.CENTER); textDisplay.setDisplayWidth(30); textDisplay.setDisplayHeight(30); - Bukkit.getScheduler().runTaskLater(Api.getInstance(), () -> { + } + + @Nonnull + public Consumer getClickAction() { + return clickAction; + } + + @Nonnull + public Button onClick(Consumer clickAction) { + this.clickAction = clickAction; + return this; + } - }, 2); + public Entity getEntity() { + return textDisplay; } - public void updatePosition(Location playerLoc) { -// textDisplay.setTeleportDuration(5); -// - location = Calculations.calculateInventoryLoc(playerLoc); -// textDisplay.teleport(location); -// textDisplay.setInterpolationDuration(5); -// textDisplay.setInterpolationDelay(-1); -// Transformation transformation = textDisplay.getTransformation(); -// transformation.getTranslation().set(location.toVector().subtract(textDisplay.getLocation().toVector()).toVector3f()); -// textDisplay.setTransformation(transformation); - if (Api.getVersion().equals(ServerVersion.PRE_1_20_2)) { - TeleportInterpolator teleportInterpolator = new TeleportInterpolator(textDisplay, location, 5, 1); - teleportInterpolator.startInterpolation(); - } else { - textDisplay.setTeleportDuration(5); - textDisplay.teleport(location); - } + public Display getDisplay() { + return textDisplay; } } diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Component.java b/src/main/java/de/littleprogrammer/guiapi/components/Component.java new file mode 100644 index 0000000..5c95213 --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/components/Component.java @@ -0,0 +1,11 @@ +package de.littleprogrammer.guiapi.components; + +import org.bukkit.entity.Display; +import org.bukkit.entity.Entity; + +public interface Component { + + public Entity getEntity(); + public Display getDisplay(); + +} diff --git a/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java b/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java new file mode 100644 index 0000000..ecc182b --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java @@ -0,0 +1,27 @@ +package de.littleprogrammer.guiapi.listeners; + +import de.littleprogrammer.guiapi.Api; +import de.littleprogrammer.guiapi.GUI; +import de.littleprogrammer.guiapi.components.Button; +import de.littleprogrammer.guiapi.components.Component; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEntityEvent; + +import java.util.UUID; + +public class GuiEvents implements Listener { + + @EventHandler + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + final GUI gui = Api.getInstance().getGUI(event.getPlayer()); + + if (gui == null) return; + + UUID uuid = event.getRightClicked().getUniqueId(); + Component component = gui.getComponent(uuid); + if (!(component instanceof Button)) return; + + ((Button) component).getClickAction().accept(event); + } +} diff --git a/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java b/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java index 66ca3ad..4bc61d7 100644 --- a/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java +++ b/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java @@ -1,6 +1,7 @@ package de.littleprogrammer.guiapi.listeners; import de.littleprogrammer.guiapi.Api; +import de.littleprogrammer.guiapi.GUI; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; @@ -8,8 +9,9 @@ public class MoveListener implements Listener { @EventHandler public void onPlayerMove(PlayerMoveEvent event) { - if (Api.getInstance().getButtons().containsKey(event.getPlayer().getUniqueId())) { - Api.getInstance().getButtons().get(event.getPlayer().getUniqueId()).updatePosition(event.getPlayer().getEyeLocation()); + if (Api.getInstance().getGuis().containsKey(event.getPlayer().getUniqueId())) { + GUI gui = Api.getInstance().getGuis().get(event.getPlayer().getUniqueId()); + gui.updatePosition(event.getPlayer().getEyeLocation()); } } } diff --git a/src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java b/src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java index e12c02e..4c4ea1e 100644 --- a/src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java +++ b/src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java @@ -4,10 +4,6 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Entity; -import org.bukkit.scheduler.BukkitTask; - -import java.util.ArrayList; -import java.util.List; public class TeleportInterpolator { @@ -43,7 +39,7 @@ public void startInterpolation() { } private void teleportWithDelay(Location location, int delayTicks) { - Bukkit.getScheduler().runTaskLater(Api.getInstance(), () -> { + Api.getScheduler().runTaskLater(Api.getInstance().getPlugin(), () -> { entity.teleport(location); }, delayTicks); } From 008b4c84a3a684bb70ed2715754d694d86b9d44b Mon Sep 17 00:00:00 2001 From: linusglimm Date: Sun, 5 May 2024 18:35:31 +0200 Subject: [PATCH 3/8] Done so much - Added method for opening, closing gui - Added support for multiple buttons - Got stuck on a math problem where I have to calculate the position of 2 buttons in 3d space depending on the players position --- build.gradle | 13 -- .../java/de/littleprogrammer/guiapi/GUI.java | 54 --------- .../guiapi/{Api.java => GuiApi.java} | 20 ++-- .../de/littleprogrammer/guiapi/SimpleGui.java | 112 ++++++++++++++++++ .../guiapi/commands/SpawnButtonCommand.java | 16 --- .../guiapi/components/Button.java | 41 +++++-- .../guiapi/components/Component.java | 8 ++ .../guiapi/components/Text.java | 47 +++++++- .../guiapi/listeners/GuiEvents.java | 10 +- .../guiapi/listeners/MoveListener.java | 11 +- .../guiapi/utils/Calculations.java | 63 +++++++++- .../guiapi/utils/TeleportInterpolator.java | 5 +- src/main/resources/plugin.yml | 8 -- 13 files changed, 283 insertions(+), 125 deletions(-) delete mode 100644 src/main/java/de/littleprogrammer/guiapi/GUI.java rename src/main/java/de/littleprogrammer/guiapi/{Api.java => GuiApi.java} (75%) create mode 100644 src/main/java/de/littleprogrammer/guiapi/SimpleGui.java delete mode 100644 src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java delete mode 100644 src/main/resources/plugin.yml diff --git a/build.gradle b/build.gradle index d033f69..3fa5a4d 100644 --- a/build.gradle +++ b/build.gradle @@ -31,10 +31,6 @@ java { } } -jar { - destinationDirectory.set(file("/Users/linusglimm/Desktop/mineopoly stuff/servers/spigotTest/plugins")) -} - tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' @@ -42,12 +38,3 @@ tasks.withType(JavaCompile).configureEach { options.release.set(targetJavaVersion) } } - -processResources { - def props = [version: version] - inputs.properties props - filteringCharset 'UTF-8' - filesMatching('plugin.yml') { - expand props - } -} diff --git a/src/main/java/de/littleprogrammer/guiapi/GUI.java b/src/main/java/de/littleprogrammer/guiapi/GUI.java deleted file mode 100644 index c2ad0e7..0000000 --- a/src/main/java/de/littleprogrammer/guiapi/GUI.java +++ /dev/null @@ -1,54 +0,0 @@ -package de.littleprogrammer.guiapi; - -import de.littleprogrammer.guiapi.components.Button; -import de.littleprogrammer.guiapi.components.Component; -import de.littleprogrammer.guiapi.enums.ServerVersion; -import de.littleprogrammer.guiapi.utils.Calculations; -import de.littleprogrammer.guiapi.utils.TeleportInterpolator; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -public class GUI { - - private final Player player; - private final UUID uuid; - private final Map components; - - public GUI(Player player, String title, int gridWidth, int gridHeight) { - this.player = player; - this.uuid = player.getUniqueId(); - this.components = new HashMap<>(); - - Api.getInstance().getGuis().put(player.getUniqueId(), this); - } - - public void updatePosition(Location playerLoc) { - Location location = Calculations.calculateInventoryLoc(playerLoc); - - if (Api.getInstance().getVersion().equals(ServerVersion.PRE_1_20_2)) { - for (Component component : components.values()) { - TeleportInterpolator teleportInterpolator = new TeleportInterpolator(component.getEntity(), location, 5, 1); - teleportInterpolator.startInterpolation(); - } - } else { - for (Component component : components.values()) { - component.getDisplay().setTeleportDuration(5); - component.getDisplay().teleport(location); - } - } - } - - public Component getComponent(UUID uuid) { - return components.get(uuid); - } - - public GUI addButton(String text, String localizedName) { - Button button = new Button(this, this.player, text, localizedName); - return this; - } - -} diff --git a/src/main/java/de/littleprogrammer/guiapi/Api.java b/src/main/java/de/littleprogrammer/guiapi/GuiApi.java similarity index 75% rename from src/main/java/de/littleprogrammer/guiapi/Api.java rename to src/main/java/de/littleprogrammer/guiapi/GuiApi.java index 364807a..285d399 100644 --- a/src/main/java/de/littleprogrammer/guiapi/Api.java +++ b/src/main/java/de/littleprogrammer/guiapi/GuiApi.java @@ -2,6 +2,7 @@ import de.littleprogrammer.guiapi.enums.ServerVersion; import de.littleprogrammer.guiapi.listeners.GuiEvents; +import de.littleprogrammer.guiapi.listeners.MoveListener; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; @@ -11,15 +12,15 @@ import java.util.Map; import java.util.UUID; -public final class Api { +public final class GuiApi { private final JavaPlugin plugin; - private static Api instance; + private static GuiApi instance; private ServerVersion version; private final Listener listener = new GuiEvents(); - private Map guis = new HashMap<>(); + private Map guis = new HashMap<>(); - private Api(JavaPlugin plugin) { + public GuiApi(JavaPlugin plugin) { this.plugin = plugin; instance = this; } @@ -44,26 +45,27 @@ public void init() { } this.plugin.getServer().getPluginManager().registerEvents(this.listener, this.plugin); + this.plugin.getServer().getPluginManager().registerEvents(new MoveListener(), this.plugin); } public JavaPlugin getPlugin() {return this.plugin;} - public static Api getInstance() {return instance;} + public static GuiApi getInstance() {return instance;} public ServerVersion getVersion() { return version; } public static BukkitScheduler getScheduler() { - return Api.getInstance().getPlugin().getServer().getScheduler(); + return GuiApi.getInstance().getPlugin().getServer().getScheduler(); } - public GUI getGUI(UUID uuid) { + public SimpleGui getGUI(UUID uuid) { return guis.get(uuid); } - public GUI getGUI(Player player) { + public SimpleGui getGUI(Player player) { return guis.get(player.getUniqueId()); } - public Map getGuis() { + public Map getGuis() { return guis; } diff --git a/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java b/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java new file mode 100644 index 0000000..898fbea --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java @@ -0,0 +1,112 @@ +package de.littleprogrammer.guiapi; + +import de.littleprogrammer.guiapi.components.Button; +import de.littleprogrammer.guiapi.components.Component; +import de.littleprogrammer.guiapi.components.Text; +import de.littleprogrammer.guiapi.enums.ServerVersion; +import de.littleprogrammer.guiapi.utils.Calculations; +import de.littleprogrammer.guiapi.utils.TeleportInterpolator; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class SimpleGui { + + private Player player; + private final UUID uuid; + private final Map components; + private final Map buttons; + private Component content; + private Location centerLocation; + private boolean open; + + public SimpleGui(String title, int gridWidth, int gridHeight) { + this.uuid = UUID.randomUUID(); + this.components = new HashMap<>(); + this.buttons = new HashMap<>(); + } + + public void updatePosition(Location playerLoc) { + if (player != null) { + centerLocation = Calculations.calculateInventoryCenter(playerLoc); + + if (GuiApi.getInstance().getVersion().equals(ServerVersion.PRE_1_20_2)) { + for (Component component : components.values()) { + Location newComponentLocation = Calculations.calculateComponentLocation(this, component, buttons.size()); + + TeleportInterpolator teleportInterpolator = new TeleportInterpolator(component.getEntity(), newComponentLocation, 5, 1); + teleportInterpolator.startInterpolation(); + } + } else { + for (Component component : components.values()) { + Location newComponentLocation = Calculations.calculateComponentLocation(this, component, buttons.size()); + + component.getDisplay().setTeleportDuration(5); + component.getDisplay().teleport(newComponentLocation); + } + } + } + } + + public void close() { + //close GUI + GuiApi.getInstance().getGuis().remove(player.getUniqueId()); + + for (Component component : components.values()) { + component.hide(player); + component.remove(); + } + open = false; + } + + public SimpleGui open(Player player) { + if (this.player != null && this.player.getUniqueId().equals(player.getUniqueId())) { + //close GUI and open for the new player + close(); + } + this.player = player; + GuiApi.getInstance().getGuis().put(player.getUniqueId(), this); + + for (Component component : components.values()) { + component.spawn(); + component.show(player); + } + open = true; + return this; + } + + public Component getComponent(UUID uuid) { + return components.get(uuid); + } + + public Location getCenterLocation() { + return centerLocation; + } + + public boolean isOpen() { + return open; + } + + public SimpleGui addButton(Button button) { + if (buttons.size() < 3) { + components.put(button.getUniqueId(), button); + buttons.put(button.getUniqueId(), button); + } + return this; + } + + public SimpleGui addContent(Text content) { + if (content != null) { + content.remove(); + } + this.content = content; + return this; + } + + public Player getPlayer() { + return player; + } +} diff --git a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java deleted file mode 100644 index f4fdc58..0000000 --- a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnButtonCommand.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.littleprogrammer.guiapi.commands; - -import de.littleprogrammer.guiapi.GUI; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -public class SpawnButtonCommand implements CommandExecutor { - @Override - public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { - new GUI((Player) commandSender, "Title", 1, 1).addButton("Button Text", "localNameHere"); - - return false; - } -} diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Button.java b/src/main/java/de/littleprogrammer/guiapi/components/Button.java index 86bacb7..ce87394 100644 --- a/src/main/java/de/littleprogrammer/guiapi/components/Button.java +++ b/src/main/java/de/littleprogrammer/guiapi/components/Button.java @@ -1,9 +1,8 @@ package de.littleprogrammer.guiapi.components; -import de.littleprogrammer.guiapi.Api; -import de.littleprogrammer.guiapi.GUI; +import de.littleprogrammer.guiapi.GuiApi; +import de.littleprogrammer.guiapi.SimpleGui; import de.littleprogrammer.guiapi.utils.Calculations; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.*; import org.bukkit.event.player.PlayerInteractEntityEvent; @@ -21,25 +20,39 @@ public class Button implements Component { private Location location; private Player player; private Consumer clickAction; - private GUI gui; + private int slot; - public Button(GUI gui, Player player, String texture, String localizedName) { + public Button(Player player, String texture, String localizedName, int slot) { this.player = player; this.texture = texture; this.localizedName = localizedName; - this.gui = gui; - uuid = UUID.randomUUID(); + this.slot = slot; - spawn(); + uuid = UUID.randomUUID(); } - private void spawn() { - textDisplay = (TextDisplay) player.getWorld().spawnEntity(Calculations.calculateInventoryLoc(player.getLocation()), EntityType.TEXT_DISPLAY); + public void spawn() { + textDisplay = (TextDisplay) player.getWorld().spawnEntity(Calculations.calculateInventoryCenter(player.getLocation()), EntityType.TEXT_DISPLAY); + textDisplay.setCustomName(uuid.toString()); + textDisplay.setCustomNameVisible(false); textDisplay.setText(texture); textDisplay.setGlowing(true); textDisplay.setBillboard(Display.Billboard.CENTER); textDisplay.setDisplayWidth(30); textDisplay.setDisplayHeight(30); + textDisplay.setVisibleByDefault(false); + } + + public void show(Player player) { + player.showEntity(GuiApi.getInstance().getPlugin(), textDisplay); + } + + public void hide(Player player) { + player.hideEntity(GuiApi.getInstance().getPlugin(), textDisplay); + } + + public void remove() { + textDisplay.remove(); } @Nonnull @@ -60,4 +73,12 @@ public Entity getEntity() { public Display getDisplay() { return textDisplay; } + + public UUID getUniqueId() { + return uuid; + } + + public int getSlot() { + return slot; + } } diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Component.java b/src/main/java/de/littleprogrammer/guiapi/components/Component.java index 5c95213..b06c8ee 100644 --- a/src/main/java/de/littleprogrammer/guiapi/components/Component.java +++ b/src/main/java/de/littleprogrammer/guiapi/components/Component.java @@ -2,10 +2,18 @@ import org.bukkit.entity.Display; import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +import java.util.UUID; public interface Component { public Entity getEntity(); public Display getDisplay(); + public UUID getUniqueId(); + public void show(Player player); + public void hide(Player player); + public void remove(); + public void spawn(); } diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Text.java b/src/main/java/de/littleprogrammer/guiapi/components/Text.java index ed4e49b..5b33dc2 100644 --- a/src/main/java/de/littleprogrammer/guiapi/components/Text.java +++ b/src/main/java/de/littleprogrammer/guiapi/components/Text.java @@ -1,4 +1,49 @@ package de.littleprogrammer.guiapi.components; -public class Text { +import org.bukkit.entity.Display; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +import java.util.UUID; + +public class Text implements Component { + + public Text(String text) { + + } + + @Override + public Entity getEntity() { + return null; + } + + @Override + public Display getDisplay() { + return null; + } + + @Override + public UUID getUniqueId() { + return null; + } + + @Override + public void show(Player player) { + + } + + @Override + public void hide(Player player) { + + } + + @Override + public void remove() { + + } + + @Override + public void spawn() { + + } } diff --git a/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java b/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java index ecc182b..a1c2fae 100644 --- a/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java +++ b/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java @@ -1,7 +1,7 @@ package de.littleprogrammer.guiapi.listeners; -import de.littleprogrammer.guiapi.Api; -import de.littleprogrammer.guiapi.GUI; +import de.littleprogrammer.guiapi.GuiApi; +import de.littleprogrammer.guiapi.SimpleGui; import de.littleprogrammer.guiapi.components.Button; import de.littleprogrammer.guiapi.components.Component; import org.bukkit.event.EventHandler; @@ -14,12 +14,12 @@ public class GuiEvents implements Listener { @EventHandler public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { - final GUI gui = Api.getInstance().getGUI(event.getPlayer()); + final SimpleGui simpleGui = GuiApi.getInstance().getGUI(event.getPlayer()); - if (gui == null) return; + if (simpleGui == null) return; UUID uuid = event.getRightClicked().getUniqueId(); - Component component = gui.getComponent(uuid); + Component component = simpleGui.getComponent(uuid); if (!(component instanceof Button)) return; ((Button) component).getClickAction().accept(event); diff --git a/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java b/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java index 4bc61d7..68f10d9 100644 --- a/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java +++ b/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java @@ -1,17 +1,18 @@ package de.littleprogrammer.guiapi.listeners; -import de.littleprogrammer.guiapi.Api; -import de.littleprogrammer.guiapi.GUI; +import de.littleprogrammer.guiapi.GuiApi; +import de.littleprogrammer.guiapi.SimpleGui; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; public class MoveListener implements Listener { + @EventHandler public void onPlayerMove(PlayerMoveEvent event) { - if (Api.getInstance().getGuis().containsKey(event.getPlayer().getUniqueId())) { - GUI gui = Api.getInstance().getGuis().get(event.getPlayer().getUniqueId()); - gui.updatePosition(event.getPlayer().getEyeLocation()); + if (GuiApi.getInstance().getGuis().containsKey(event.getPlayer().getUniqueId())) { + SimpleGui simpleGui = GuiApi.getInstance().getGuis().get(event.getPlayer().getUniqueId()); + simpleGui.updatePosition(event.getPlayer().getEyeLocation()); } } } diff --git a/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java index 35eafd7..a1ac09b 100644 --- a/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java +++ b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java @@ -1,10 +1,13 @@ package de.littleprogrammer.guiapi.utils; +import de.littleprogrammer.guiapi.SimpleGui; +import de.littleprogrammer.guiapi.components.Button; +import de.littleprogrammer.guiapi.components.Component; import org.bukkit.Location; public class Calculations { - public static Location calculateInventoryLoc(Location midLocation) { + public static Location calculateInventoryCenter(Location midLocation) { double distance = 4; // 4 blocks away double yawRadians = Math.toRadians(midLocation.getYaw()); double pitchRadians = Math.toRadians(midLocation.getPitch()); @@ -15,4 +18,62 @@ public static Location calculateInventoryLoc(Location midLocation) { return new Location(midLocation.getWorld(), x, y, z, midLocation.getYaw(), 0); } + public static Location calculateComponentLocation(SimpleGui simpleGui, Component component, int buttonAmount) { + Location centerLoc = simpleGui.getCenterLocation(); + if (component instanceof Button) { + Button button = (Button) component; + + Location[] locations = calculateTrianglePoints(simpleGui.getPlayer().getLocation(), centerLoc); + //Is button in row + switch (buttonAmount) { + case 1: + return centerLoc.clone().subtract(0, 0.5, 0); + case 2: + if (button.getSlot() == 1) { + return locations[0]; + } else if (button.getSlot() == 2) { + return locations[1]; + } + break; + case 3: + if (button.getSlot() == 1) { + return locations[0]; + } else if (button.getSlot() == 2) { + return centerLoc.clone().subtract(0, 0.5, 0); + } else if (button.getSlot() == 3) { + return locations[1]; + } + break; + } + } else { + //Is content + return centerLoc.clone().add(0, 1, 0); + } + return null; + } + + private static Location[] calculateTrianglePoints(Location midLocation, Location centerLocation) { + // Calculate distance between mid and center locations + double distance = midLocation.distance(centerLocation); + + // Calculate angle between mid and center locations + double angle = Math.atan2(centerLocation.getZ() - midLocation.getZ(), centerLocation.getX() - midLocation.getX()); + + // Calculate offset angles for left and right points + double leftOffsetAngle = angle + Math.PI / 2; // 90 degrees counterclockwise + double rightOffsetAngle = angle - Math.PI / 2; // 90 degrees clockwise + + // Calculate left and right points using offset angles and distance + Location leftPoint = calculatePointOnCircle(centerLocation, leftOffsetAngle, 4); + Location rightPoint = calculatePointOnCircle(centerLocation, rightOffsetAngle, 4); + + return new Location[]{leftPoint, rightPoint}; + } + + private static Location calculatePointOnCircle(Location centerLocation, double angle, double radius) { + double x = centerLocation.getX() + radius * Math.cos(angle); + double z = centerLocation.getZ() + radius * Math.sin(angle); + return new Location(centerLocation.getWorld(), x, centerLocation.getY(), z, centerLocation.getYaw(), centerLocation.getPitch()); + } + } diff --git a/src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java b/src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java index 4c4ea1e..c4d8870 100644 --- a/src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java +++ b/src/main/java/de/littleprogrammer/guiapi/utils/TeleportInterpolator.java @@ -1,7 +1,6 @@ package de.littleprogrammer.guiapi.utils; -import de.littleprogrammer.guiapi.Api; -import org.bukkit.Bukkit; +import de.littleprogrammer.guiapi.GuiApi; import org.bukkit.Location; import org.bukkit.entity.Entity; @@ -39,7 +38,7 @@ public void startInterpolation() { } private void teleportWithDelay(Location location, int delayTicks) { - Api.getScheduler().runTaskLater(Api.getInstance().getPlugin(), () -> { + GuiApi.getScheduler().runTaskLater(GuiApi.getInstance().getPlugin(), () -> { entity.teleport(location); }, delayTicks); } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml deleted file mode 100644 index cdc4b01..0000000 --- a/src/main/resources/plugin.yml +++ /dev/null @@ -1,8 +0,0 @@ -name: 3dGuiApi -version: '${version}' -main: de.littleprogrammer.guiapi.Api -api-version: '1.19' -authors: [LittleProgrammer] -description: An API to make 3D Gui's in minecraft -commands: - spawnBtn: From cbe1ed551dda2f99c73764e5049dbb0699fa0fa5 Mon Sep 17 00:00:00 2001 From: linusglimm Date: Mon, 6 May 2024 20:30:18 +0200 Subject: [PATCH 4/8] Nice progress - Made the gui buttons align on a circle around the player, so they are always in front of the player - Changed it back to a plugin, to make testing easier - Made the click check work (Might want to change the event to something where I can get the left and th right click) - Clicking on a button is working now --- build.gradle | 13 +++++ .../de/littleprogrammer/guiapi/GuiApi.java | 25 +++++++--- .../guiapi/commands/SpawnCommand.java | 31 ++++++++++++ .../guiapi/components/Button.java | 6 +++ .../guiapi/listeners/GuiEvents.java | 27 ++++++++-- .../guiapi/utils/Calculations.java | 50 ++++++++++++------- src/main/resources/plugin.yml | 8 +++ 7 files changed, 131 insertions(+), 29 deletions(-) create mode 100644 src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java create mode 100644 src/main/resources/plugin.yml diff --git a/build.gradle b/build.gradle index 3fa5a4d..c62e57d 100644 --- a/build.gradle +++ b/build.gradle @@ -31,6 +31,10 @@ java { } } +jar { + destinationDirectory.set(file("/Users/linusglimm/Desktop/mineopoly stuff/servers/spigotTest/plugins")) +} + tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' @@ -38,3 +42,12 @@ tasks.withType(JavaCompile).configureEach { options.release.set(targetJavaVersion) } } + +processResources { + def props = [version: version] + inputs.properties props + filteringCharset 'UTF-8' + filesMatching('plugin.yml') { + expand props + } +} \ No newline at end of file diff --git a/src/main/java/de/littleprogrammer/guiapi/GuiApi.java b/src/main/java/de/littleprogrammer/guiapi/GuiApi.java index 285d399..cbfd448 100644 --- a/src/main/java/de/littleprogrammer/guiapi/GuiApi.java +++ b/src/main/java/de/littleprogrammer/guiapi/GuiApi.java @@ -1,8 +1,10 @@ package de.littleprogrammer.guiapi; +import de.littleprogrammer.guiapi.commands.SpawnCommand; import de.littleprogrammer.guiapi.enums.ServerVersion; import de.littleprogrammer.guiapi.listeners.GuiEvents; import de.littleprogrammer.guiapi.listeners.MoveListener; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; @@ -12,17 +14,26 @@ import java.util.Map; import java.util.UUID; -public final class GuiApi { +public final class GuiApi extends JavaPlugin { - private final JavaPlugin plugin; + private JavaPlugin plugin; private static GuiApi instance; private ServerVersion version; private final Listener listener = new GuiEvents(); private Map guis = new HashMap<>(); - public GuiApi(JavaPlugin plugin) { - this.plugin = plugin; + @Override + public void onEnable() { + // Plugin startup logic + this.plugin = this; instance = this; + + init(); + } + + @Override + public void onDisable() { + // Plugin shutdown logic } public void init() { @@ -44,8 +55,10 @@ public void init() { } } - this.plugin.getServer().getPluginManager().registerEvents(this.listener, this.plugin); - this.plugin.getServer().getPluginManager().registerEvents(new MoveListener(), this.plugin); + Bukkit.getPluginManager().registerEvents(this.listener, this.plugin); + Bukkit.getPluginManager().registerEvents(new MoveListener(), this.plugin); + + getCommand("spawnGui").setExecutor(new SpawnCommand()); } public JavaPlugin getPlugin() {return this.plugin;} diff --git a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java new file mode 100644 index 0000000..e411952 --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java @@ -0,0 +1,31 @@ +package de.littleprogrammer.guiapi.commands; + +import de.littleprogrammer.guiapi.SimpleGui; +import de.littleprogrammer.guiapi.components.Button; +import de.littleprogrammer.guiapi.components.Text; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class SpawnCommand implements CommandExecutor { + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + Button button = new Button((Player) commandSender, "\uE001", "LcoalizedName", 1).onClick(event -> { + event.getPlayer().sendMessage("You clicked a button1"); + }); + + Button button2 = new Button((Player) commandSender, "\uE001", "LcoalizedName", 2).onClick(event -> { + event.getPlayer().sendMessage("You clicked a button2"); + }); + + Button button3 = new Button((Player) commandSender, "\uE001", "LcoalizedName", 3).onClick(event -> { + event.getPlayer().sendMessage("You clicked a button3"); + }); + + SimpleGui gui = new SimpleGui("Some title", 1, 1).addContent(new Text("Test")).addButton(button).addButton(button2).addButton(button3); + gui.open((Player) commandSender); + + return false; + } +} diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Button.java b/src/main/java/de/littleprogrammer/guiapi/components/Button.java index ce87394..8af691d 100644 --- a/src/main/java/de/littleprogrammer/guiapi/components/Button.java +++ b/src/main/java/de/littleprogrammer/guiapi/components/Button.java @@ -6,6 +6,8 @@ import org.bukkit.Location; import org.bukkit.entity.*; import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.util.Transformation; +import org.joml.Vector3f; import javax.annotation.Nonnull; import java.util.UUID; @@ -41,6 +43,10 @@ public void spawn() { textDisplay.setDisplayWidth(30); textDisplay.setDisplayHeight(30); textDisplay.setVisibleByDefault(false); + textDisplay.setDefaultBackground(false); + Transformation transformation = textDisplay.getTransformation(); + transformation.getScale().set(new Vector3f(2, 2, 2)); + textDisplay.setTransformation(transformation); } public void show(Player player) { diff --git a/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java b/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java index a1c2fae..6d224b6 100644 --- a/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java +++ b/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java @@ -4,24 +4,43 @@ import de.littleprogrammer.guiapi.SimpleGui; import de.littleprogrammer.guiapi.components.Button; import de.littleprogrammer.guiapi.components.Component; +import de.littleprogrammer.guiapi.utils.Calculations; +import org.bukkit.entity.Display; +import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerAnimationEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import java.util.UUID; public class GuiEvents implements Listener { - @EventHandler - public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + @EventHandler(ignoreCancelled = true) + public void onPlayerAnimation(PlayerAnimationEvent event) { final SimpleGui simpleGui = GuiApi.getInstance().getGUI(event.getPlayer()); + System.out.println("Fired click event"); if (simpleGui == null) return; - UUID uuid = event.getRightClicked().getUniqueId(); + Entity awaitenEntity = null; + for (Entity entity : event.getPlayer().getNearbyEntities(7, 7, 7)) { + if (entity instanceof Display && entity.getCustomName() != null) { + if (Calculations.playerLookingAtEntity(event.getPlayer(), entity)) { + awaitenEntity = entity; + break; + } + } + } + + if (awaitenEntity == null) { return; } + + UUID uuid = UUID.fromString(awaitenEntity.getCustomName()); Component component = simpleGui.getComponent(uuid); if (!(component instanceof Button)) return; - ((Button) component).getClickAction().accept(event); + Button button = (Button) component; + System.out.println("Click on button: " + button.getUniqueId()); + button.getClickAction().accept(new PlayerInteractEntityEvent(event.getPlayer(), button.getEntity())); } } diff --git a/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java index a1ac09b..6c0139c 100644 --- a/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java +++ b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java @@ -4,6 +4,10 @@ import de.littleprogrammer.guiapi.components.Button; import de.littleprogrammer.guiapi.components.Component; import org.bukkit.Location; +import org.bukkit.entity.Display; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; public class Calculations { @@ -27,7 +31,7 @@ public static Location calculateComponentLocation(SimpleGui simpleGui, Component //Is button in row switch (buttonAmount) { case 1: - return centerLoc.clone().subtract(0, 0.5, 0); + return centerLoc.clone().subtract(0, 0, 0); case 2: if (button.getSlot() == 1) { return locations[0]; @@ -39,7 +43,7 @@ public static Location calculateComponentLocation(SimpleGui simpleGui, Component if (button.getSlot() == 1) { return locations[0]; } else if (button.getSlot() == 2) { - return centerLoc.clone().subtract(0, 0.5, 0); + return centerLoc.clone().subtract(0, 0, 0); } else if (button.getSlot() == 3) { return locations[1]; } @@ -52,28 +56,36 @@ public static Location calculateComponentLocation(SimpleGui simpleGui, Component return null; } - private static Location[] calculateTrianglePoints(Location midLocation, Location centerLocation) { - // Calculate distance between mid and center locations - double distance = midLocation.distance(centerLocation); + /** + * @param playerLocation the location of the player (the point in the middle) + * @param centerLocation the location on the circle to get the correct height + */ + private static Location[] calculateTrianglePoints(Location playerLocation, Location centerLocation) { + double radius = playerLocation.distance(centerLocation); - // Calculate angle between mid and center locations - double angle = Math.atan2(centerLocation.getZ() - midLocation.getZ(), centerLocation.getX() - midLocation.getX()); + Vector vector1 = playerLocation.getDirection().setY(0).normalize().multiply(radius).rotateAroundY(Math.toRadians(30)); + Vector vector2 = playerLocation.getDirection().setY(0).normalize().multiply(radius).rotateAroundY(Math.toRadians(-30)); - // Calculate offset angles for left and right points - double leftOffsetAngle = angle + Math.PI / 2; // 90 degrees counterclockwise - double rightOffsetAngle = angle - Math.PI / 2; // 90 degrees clockwise + Location loc1 = playerLocation.clone().add(vector1); + loc1.setY(centerLocation.getY()); - // Calculate left and right points using offset angles and distance - Location leftPoint = calculatePointOnCircle(centerLocation, leftOffsetAngle, 4); - Location rightPoint = calculatePointOnCircle(centerLocation, rightOffsetAngle, 4); + Location loc2 = playerLocation.clone().add(vector2); + loc2.setY(centerLocation.getY()); - return new Location[]{leftPoint, rightPoint}; + return new Location[]{loc1, loc2}; } - private static Location calculatePointOnCircle(Location centerLocation, double angle, double radius) { - double x = centerLocation.getX() + radius * Math.cos(angle); - double z = centerLocation.getZ() + radius * Math.sin(angle); - return new Location(centerLocation.getWorld(), x, centerLocation.getY(), z, centerLocation.getYaw(), centerLocation.getPitch()); - } + public static boolean playerLookingAtEntity(Player player, Entity entity) { + Vector playerDirection = player.getLocation().getDirection().normalize(); + + Location entityLocation = entity.getLocation(); + Location playerEyeLocation = player.getEyeLocation(); + + Vector playerToEntity = entityLocation.toVector().subtract(playerEyeLocation.toVector()).normalize(); + double dotProduct = playerDirection.dot(playerToEntity); + //System.out.println("Checking entity" + entity + " " + entity.getCustomName() + " dot: " + dotProduct); + + return dotProduct > 0.97; + } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..63eedf4 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,8 @@ +name: 3dGuiApi +version: '${version}' +main: de.littleprogrammer.guiapi.GuiApi +api-version: '1.19' +authors: [LittleProgrammer] +description: An API to make 3D Gui's in minecraft +commands: + spawnGui: \ No newline at end of file From 67c83130b43793483b0f016abad1ceee1acbecbf Mon Sep 17 00:00:00 2001 From: linusglimm Date: Tue, 7 May 2024 22:04:22 +0200 Subject: [PATCH 5/8] Nearly done - Made moving the gui only if the user laves a specified angle - Added an hover and unhover event to let the user customize stuff when hovering over the buttons - Made the button text change if the user hovers it - Fixed a bug, where the click event could return null if it wasn't specified --- .../de/littleprogrammer/guiapi/SimpleGui.java | 18 +++--- .../guiapi/commands/SpawnCommand.java | 6 +- .../guiapi/components/Button.java | 59 ++++++++++++++++++- .../guiapi/components/Component.java | 1 + .../customeEvents/HoverButtonEvent.java | 56 ++++++++++++++++++ .../customeEvents/UnHoverButtonEvent.java | 56 ++++++++++++++++++ .../guiapi/listeners/GuiEvents.java | 31 ++-------- .../guiapi/listeners/MoveListener.java | 41 ++++++++++++- .../guiapi/utils/Calculations.java | 11 +++- 9 files changed, 237 insertions(+), 42 deletions(-) create mode 100644 src/main/java/de/littleprogrammer/guiapi/customeEvents/HoverButtonEvent.java create mode 100644 src/main/java/de/littleprogrammer/guiapi/customeEvents/UnHoverButtonEvent.java diff --git a/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java b/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java index 898fbea..d177e75 100644 --- a/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java +++ b/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java @@ -9,9 +9,7 @@ import org.bukkit.Location; import org.bukkit.entity.Player; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; public class SimpleGui { @@ -69,6 +67,7 @@ public SimpleGui open(Player player) { } this.player = player; GuiApi.getInstance().getGuis().put(player.getUniqueId(), this); + centerLocation = new Location(player.getWorld(), 0, 0, 0); for (Component component : components.values()) { component.spawn(); @@ -86,6 +85,14 @@ public Location getCenterLocation() { return centerLocation; } + public Player getPlayer() { + return player; + } + + public List getComponents() { + return new ArrayList<>(components.values()); + } + public boolean isOpen() { return open; } @@ -94,6 +101,7 @@ public SimpleGui addButton(Button button) { if (buttons.size() < 3) { components.put(button.getUniqueId(), button); buttons.put(button.getUniqueId(), button); + button.setGui(this); } return this; } @@ -105,8 +113,4 @@ public SimpleGui addContent(Text content) { this.content = content; return this; } - - public Player getPlayer() { - return player; - } } diff --git a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java index e411952..4087f36 100644 --- a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java +++ b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java @@ -11,15 +11,15 @@ public class SpawnCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { - Button button = new Button((Player) commandSender, "\uE001", "LcoalizedName", 1).onClick(event -> { + Button button = new Button((Player) commandSender, "\uE001", "\uE002", "LcoalizedName", 1).onClick(event -> { event.getPlayer().sendMessage("You clicked a button1"); }); - Button button2 = new Button((Player) commandSender, "\uE001", "LcoalizedName", 2).onClick(event -> { + Button button2 = new Button((Player) commandSender, "\uE001", "\uE002", "LcoalizedName", 2).onClick(event -> { event.getPlayer().sendMessage("You clicked a button2"); }); - Button button3 = new Button((Player) commandSender, "\uE001", "LcoalizedName", 3).onClick(event -> { + Button button3 = new Button((Player) commandSender, "\uE001", "\uE002", "LcoalizedName", 3).onClick(event -> { event.getPlayer().sendMessage("You clicked a button3"); }); diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Button.java b/src/main/java/de/littleprogrammer/guiapi/components/Button.java index 8af691d..839f205 100644 --- a/src/main/java/de/littleprogrammer/guiapi/components/Button.java +++ b/src/main/java/de/littleprogrammer/guiapi/components/Button.java @@ -2,6 +2,8 @@ import de.littleprogrammer.guiapi.GuiApi; import de.littleprogrammer.guiapi.SimpleGui; +import de.littleprogrammer.guiapi.customeEvents.HoverButtonEvent; +import de.littleprogrammer.guiapi.customeEvents.UnHoverButtonEvent; import de.littleprogrammer.guiapi.utils.Calculations; import org.bukkit.Location; import org.bukkit.entity.*; @@ -16,17 +18,22 @@ public class Button implements Component { private String texture; + private String hoverTexture; private String localizedName; private UUID uuid; private TextDisplay textDisplay; private Location location; private Player player; private Consumer clickAction; + private Consumer hoverAction; + private Consumer unHoverAction; private int slot; + private SimpleGui simpleGui; - public Button(Player player, String texture, String localizedName, int slot) { + public Button(Player player, String texture, String hoverTexture, String localizedName, int slot) { this.player = player; this.texture = texture; + this.hoverTexture = hoverTexture; this.localizedName = localizedName; this.slot = slot; @@ -63,7 +70,11 @@ public void remove() { @Nonnull public Consumer getClickAction() { - return clickAction; + if (clickAction != null) { + return clickAction; + } else { + return (event -> {}); + } } @Nonnull @@ -72,11 +83,37 @@ public Button onClick(Consumer clickAction) { return this; } + public Consumer getHoverAction() { + if (hoverAction != null) { + return hoverAction; + } else { + return (event -> {}); + } + } + + public Button onHover(Consumer hoverAction) { + this.hoverAction = hoverAction; + return this; + } + + public Consumer getUnHoverAction() { + if (unHoverAction != null) { + return unHoverAction; + } else { + return (event -> {}); + } + } + + public Button onUnHover(Consumer unHoverAction) { + this.unHoverAction = unHoverAction; + return this; + } + public Entity getEntity() { return textDisplay; } - public Display getDisplay() { + public TextDisplay getDisplay() { return textDisplay; } @@ -84,7 +121,23 @@ public UUID getUniqueId() { return uuid; } + public SimpleGui getGui() { + return simpleGui; + } + + public String getText() { + return texture; + } + + public String getHoverText() { + return hoverTexture; + } + public int getSlot() { return slot; } + + public void setGui(SimpleGui gui) { + simpleGui = gui; + } } diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Component.java b/src/main/java/de/littleprogrammer/guiapi/components/Component.java index b06c8ee..5fa061f 100644 --- a/src/main/java/de/littleprogrammer/guiapi/components/Component.java +++ b/src/main/java/de/littleprogrammer/guiapi/components/Component.java @@ -1,5 +1,6 @@ package de.littleprogrammer.guiapi.components; +import de.littleprogrammer.guiapi.SimpleGui; import org.bukkit.entity.Display; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; diff --git a/src/main/java/de/littleprogrammer/guiapi/customeEvents/HoverButtonEvent.java b/src/main/java/de/littleprogrammer/guiapi/customeEvents/HoverButtonEvent.java new file mode 100644 index 0000000..ff3c493 --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/customeEvents/HoverButtonEvent.java @@ -0,0 +1,56 @@ +package de.littleprogrammer.guiapi.customeEvents; + +import de.littleprogrammer.guiapi.SimpleGui; +import de.littleprogrammer.guiapi.components.Button; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class HoverButtonEvent extends Event { + private static final HandlerList HANDLERS = new HandlerList(); + + private final SimpleGui gui; + private final Player player; + private final Button button; + private final String hoverText; + private final String text; + + public HoverButtonEvent(SimpleGui gui, Player player, Button button, String hoverText, String text) { + this.gui = gui; + this.player = player; + this.button = button; + this.hoverText = hoverText; + this.text = text; + + button.getDisplay().setText(hoverText); + } + + @Override + public HandlerList getHandlers() { + return HANDLERS; + } + + public static HandlerList getHandlerList() { + return HANDLERS; + } + + public SimpleGui getGui() { + return gui; + } + + public Player getPlayer() { + return player; + } + + public Button getButton() { + return button; + } + + public String getHoverText() { + return hoverText; + } + + public String getText() { + return text; + } +} diff --git a/src/main/java/de/littleprogrammer/guiapi/customeEvents/UnHoverButtonEvent.java b/src/main/java/de/littleprogrammer/guiapi/customeEvents/UnHoverButtonEvent.java new file mode 100644 index 0000000..03966e1 --- /dev/null +++ b/src/main/java/de/littleprogrammer/guiapi/customeEvents/UnHoverButtonEvent.java @@ -0,0 +1,56 @@ +package de.littleprogrammer.guiapi.customeEvents; + +import de.littleprogrammer.guiapi.SimpleGui; +import de.littleprogrammer.guiapi.components.Button; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class UnHoverButtonEvent extends Event { + private static final HandlerList HANDLERS = new HandlerList(); + + private final SimpleGui gui; + private final Player player; + private final Button button; + private final String hoverText; + private final String text; + + public UnHoverButtonEvent(SimpleGui gui, Player player, Button button, String hoverText, String text) { + this.gui = gui; + this.player = player; + this.button = button; + this.hoverText = hoverText; + this.text = text; + + button.getDisplay().setText(text); + } + + @Override + public HandlerList getHandlers() { + return HANDLERS; + } + + public static HandlerList getHandlerList() { + return HANDLERS; + } + + public SimpleGui getGui() { + return gui; + } + + public Player getPlayer() { + return player; + } + + public Button getButton() { + return button; + } + + public String getHoverText() { + return hoverText; + } + + public String getText() { + return text; + } +} diff --git a/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java b/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java index 6d224b6..63c4f37 100644 --- a/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java +++ b/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java @@ -9,38 +9,15 @@ import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerAnimationEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; import java.util.UUID; public class GuiEvents implements Listener { - @EventHandler(ignoreCancelled = true) - public void onPlayerAnimation(PlayerAnimationEvent event) { - final SimpleGui simpleGui = GuiApi.getInstance().getGUI(event.getPlayer()); - System.out.println("Fired click event"); - - if (simpleGui == null) return; - - Entity awaitenEntity = null; - for (Entity entity : event.getPlayer().getNearbyEntities(7, 7, 7)) { - if (entity instanceof Display && entity.getCustomName() != null) { - if (Calculations.playerLookingAtEntity(event.getPlayer(), entity)) { - awaitenEntity = entity; - break; - } - } - } - - if (awaitenEntity == null) { return; } - - UUID uuid = UUID.fromString(awaitenEntity.getCustomName()); - Component component = simpleGui.getComponent(uuid); - if (!(component instanceof Button)) return; - - Button button = (Button) component; - System.out.println("Click on button: " + button.getUniqueId()); - button.getClickAction().accept(new PlayerInteractEntityEvent(event.getPlayer(), button.getEntity())); + @EventHandler + public void onPlayerInteractEvent(PlayerInteractEvent event) { + System.out.println(event.getAction()); } } diff --git a/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java b/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java index 68f10d9..dacf7e2 100644 --- a/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java +++ b/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java @@ -2,17 +2,56 @@ import de.littleprogrammer.guiapi.GuiApi; import de.littleprogrammer.guiapi.SimpleGui; +import de.littleprogrammer.guiapi.components.Button; +import de.littleprogrammer.guiapi.components.Component; +import de.littleprogrammer.guiapi.customeEvents.HoverButtonEvent; +import de.littleprogrammer.guiapi.customeEvents.UnHoverButtonEvent; +import de.littleprogrammer.guiapi.utils.Calculations; +import org.bukkit.entity.Display; +import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; +import java.util.UUID; + public class MoveListener implements Listener { @EventHandler public void onPlayerMove(PlayerMoveEvent event) { if (GuiApi.getInstance().getGuis().containsKey(event.getPlayer().getUniqueId())) { SimpleGui simpleGui = GuiApi.getInstance().getGuis().get(event.getPlayer().getUniqueId()); - simpleGui.updatePosition(event.getPlayer().getEyeLocation()); + + if (event.getFrom().getX() != event.getTo().getX() || event.getFrom().getY() != event.getTo().getY() || event.getFrom().getZ() != event.getTo().getZ()) { + //Location is different + simpleGui.updatePosition(event.getPlayer().getEyeLocation()); + } else if (!Calculations.isInRange(event.getPlayer().getEyeLocation(), simpleGui.getCenterLocation(), 40)) { + simpleGui.updatePosition(event.getPlayer().getEyeLocation()); + } + + Entity hoveredEntity = null; + for (Entity entity : event.getPlayer().getNearbyEntities(5, 5, 5)) { + if (entity instanceof Display && entity.getCustomName() != null) { + if (Calculations.isInRange(event.getPlayer().getEyeLocation(), entity.getLocation(), 7)) { + hoveredEntity = entity; + break; + } + } + } + + if (hoveredEntity != null) { + if (simpleGui.getComponent(UUID.fromString(hoveredEntity.getCustomName())) instanceof Button) { + Button button = (Button) simpleGui.getComponent(UUID.fromString(hoveredEntity.getCustomName())); + button.getHoverAction().accept(new HoverButtonEvent(simpleGui, event.getPlayer(), button, button.getHoverText(), button.getText())); + } + } else { + for (Component component : simpleGui.getComponents()) { + if (component instanceof Button) { + Button button = (Button) component; + button.getUnHoverAction().accept(new UnHoverButtonEvent(simpleGui, event.getPlayer(), button, button.getHoverText(), button.getText())); + } + } + } } } } diff --git a/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java index 6c0139c..d86f4c6 100644 --- a/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java +++ b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java @@ -4,7 +4,6 @@ import de.littleprogrammer.guiapi.components.Button; import de.littleprogrammer.guiapi.components.Component; import org.bukkit.Location; -import org.bukkit.entity.Display; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.util.Vector; @@ -88,4 +87,14 @@ public static boolean playerLookingAtEntity(Player player, Entity entity) { return dotProduct > 0.97; } + + public static boolean isInRange(Location playerEyeLocation, Location centerLocation, double rangeInDegrees) { + Vector playerEyeVector = playerEyeLocation.getDirection().setY(0).normalize(); + Vector playerToCenter = centerLocation.toVector().subtract(playerEyeLocation.toVector()).setY(0).normalize(); + + double dotProduct = playerToCenter.dot(playerEyeVector); + double angle = Math.toDegrees(Math.acos(dotProduct)); + + return angle <= rangeInDegrees; + } } From f6ff359061a53da7766b71aa4d4f656e51736af6 Mon Sep 17 00:00:00 2001 From: LitleProgrammer Date: Fri, 10 May 2024 20:12:19 +0200 Subject: [PATCH 6/8] Texts done - Added functionality to texts - Added option to change size to button and text --- .../de/littleprogrammer/guiapi/SimpleGui.java | 11 +++- .../guiapi/commands/SpawnCommand.java | 8 +-- .../guiapi/components/Button.java | 15 +++-- .../guiapi/components/Text.java | 64 +++++++++++++++---- .../guiapi/utils/Calculations.java | 2 +- 5 files changed, 73 insertions(+), 27 deletions(-) diff --git a/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java b/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java index d177e75..8ed06b1 100644 --- a/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java +++ b/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java @@ -93,6 +93,10 @@ public List getComponents() { return new ArrayList<>(components.values()); } + public int getButtonAmount() { + return buttons.size(); + } + public boolean isOpen() { return open; } @@ -107,10 +111,13 @@ public SimpleGui addButton(Button button) { } public SimpleGui addContent(Text content) { - if (content != null) { - content.remove(); + if (this.content != null) { + components.remove(this.content.getUniqueId()); + this.content.remove(); } this.content = content; + components.put(content.getUniqueId(), content); + content.setGui(this); return this; } } diff --git a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java index 4087f36..710ce52 100644 --- a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java +++ b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java @@ -11,19 +11,19 @@ public class SpawnCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { - Button button = new Button((Player) commandSender, "\uE001", "\uE002", "LcoalizedName", 1).onClick(event -> { + Button button = new Button("\uE001", "\uE002", 1).setSize(2).onClick(event -> { event.getPlayer().sendMessage("You clicked a button1"); }); - Button button2 = new Button((Player) commandSender, "\uE001", "\uE002", "LcoalizedName", 2).onClick(event -> { + Button button2 = new Button("\uE001", "\uE002", 2).onClick(event -> { event.getPlayer().sendMessage("You clicked a button2"); }); - Button button3 = new Button((Player) commandSender, "\uE001", "\uE002", "LcoalizedName", 3).onClick(event -> { + Button button3 = new Button("\uE001", "\uE002", 3).onClick(event -> { event.getPlayer().sendMessage("You clicked a button3"); }); - SimpleGui gui = new SimpleGui("Some title", 1, 1).addContent(new Text("Test")).addButton(button).addButton(button2).addButton(button3); + SimpleGui gui = new SimpleGui("Some title", 1, 1).addContent(new Text("Test").setSize(2)).addButton(button).addButton(button2).addButton(button3); gui.open((Player) commandSender); return false; diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Button.java b/src/main/java/de/littleprogrammer/guiapi/components/Button.java index 839f205..e53b42b 100644 --- a/src/main/java/de/littleprogrammer/guiapi/components/Button.java +++ b/src/main/java/de/littleprogrammer/guiapi/components/Button.java @@ -19,29 +19,26 @@ public class Button implements Component { private String texture; private String hoverTexture; - private String localizedName; private UUID uuid; private TextDisplay textDisplay; private Location location; - private Player player; private Consumer clickAction; private Consumer hoverAction; private Consumer unHoverAction; private int slot; + private int size = 2; private SimpleGui simpleGui; - public Button(Player player, String texture, String hoverTexture, String localizedName, int slot) { - this.player = player; + public Button(String texture, String hoverTexture, int slot) { this.texture = texture; this.hoverTexture = hoverTexture; - this.localizedName = localizedName; this.slot = slot; uuid = UUID.randomUUID(); } public void spawn() { - textDisplay = (TextDisplay) player.getWorld().spawnEntity(Calculations.calculateInventoryCenter(player.getLocation()), EntityType.TEXT_DISPLAY); + textDisplay = (TextDisplay) simpleGui.getCenterLocation().getWorld().spawnEntity(Calculations.calculateComponentLocation(simpleGui, this, simpleGui.getButtonAmount()), EntityType.TEXT_DISPLAY); textDisplay.setCustomName(uuid.toString()); textDisplay.setCustomNameVisible(false); textDisplay.setText(texture); @@ -52,7 +49,7 @@ public void spawn() { textDisplay.setVisibleByDefault(false); textDisplay.setDefaultBackground(false); Transformation transformation = textDisplay.getTransformation(); - transformation.getScale().set(new Vector3f(2, 2, 2)); + transformation.getScale().set(new Vector3f(size, size, size)); textDisplay.setTransformation(transformation); } @@ -140,4 +137,8 @@ public int getSlot() { public void setGui(SimpleGui gui) { simpleGui = gui; } + public Button setSize(int size) { + this.size = size; + return this; + } } diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Text.java b/src/main/java/de/littleprogrammer/guiapi/components/Text.java index 5b33dc2..14819e1 100644 --- a/src/main/java/de/littleprogrammer/guiapi/components/Text.java +++ b/src/main/java/de/littleprogrammer/guiapi/components/Text.java @@ -1,49 +1,87 @@ package de.littleprogrammer.guiapi.components; -import org.bukkit.entity.Display; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; +import de.littleprogrammer.guiapi.GuiApi; +import de.littleprogrammer.guiapi.SimpleGui; +import org.bukkit.entity.*; +import org.bukkit.util.Transformation; +import org.joml.Vector3f; import java.util.UUID; public class Text implements Component { + private String text; + private UUID uuid; + private int size = 2; + private TextDisplay textDisplay; + private SimpleGui simpleGui; + public Text(String text) { + this.text = text; + uuid = UUID.randomUUID(); + } + @Override + public void spawn() { + textDisplay = (TextDisplay) simpleGui.getCenterLocation().getWorld().spawnEntity(simpleGui.getCenterLocation(), EntityType.TEXT_DISPLAY); + textDisplay.setCustomName(uuid.toString()); + textDisplay.setCustomNameVisible(false); + textDisplay.setText(text); + textDisplay.setGlowing(true); + textDisplay.setBillboard(Display.Billboard.CENTER); + textDisplay.setDisplayWidth(30); + textDisplay.setDisplayHeight(30); + textDisplay.setVisibleByDefault(false); + textDisplay.setDefaultBackground(false); + Transformation transformation = textDisplay.getTransformation(); + transformation.getScale().set(new Vector3f(size, size, size)); + textDisplay.setTransformation(transformation); } @Override public Entity getEntity() { - return null; + return textDisplay; } @Override public Display getDisplay() { - return null; + return textDisplay; } @Override public UUID getUniqueId() { - return null; + return uuid; } - @Override - public void show(Player player) { + public SimpleGui getGui() { + return simpleGui; + } + public int getSize() { + return size; } - @Override - public void hide(Player player) { + public void setGui(SimpleGui simpleGui) { + this.simpleGui = simpleGui; + } + public Text setSize(int size) { + this.size = size; + return this; } @Override - public void remove() { - + public void show(Player player) { + player.showEntity(GuiApi.getInstance().getPlugin(), textDisplay); } @Override - public void spawn() { + public void hide(Player player) { + player.hideEntity(GuiApi.getInstance().getPlugin(), textDisplay); + } + @Override + public void remove() { + textDisplay.remove(); } } diff --git a/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java index d86f4c6..e4fa087 100644 --- a/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java +++ b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java @@ -50,7 +50,7 @@ public static Location calculateComponentLocation(SimpleGui simpleGui, Component } } else { //Is content - return centerLoc.clone().add(0, 1, 0); + return centerLoc.clone().add(0, 0.5, 0); } return null; } From a23d60cbe7f7f525d69f177202b328e7e56f5d48 Mon Sep 17 00:00:00 2001 From: LitleProgrammer Date: Sat, 11 May 2024 12:02:39 +0200 Subject: [PATCH 7/8] Wiki work - Added some pages to the wiki - Changed the code for the command to mirror the code in the wiki --- .../de/littleprogrammer/guiapi/SimpleGui.java | 4 +++- .../guiapi/commands/SpawnCommand.java | 23 +++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java b/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java index 8ed06b1..9d898f7 100644 --- a/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java +++ b/src/main/java/de/littleprogrammer/guiapi/SimpleGui.java @@ -17,11 +17,13 @@ public class SimpleGui { private final UUID uuid; private final Map components; private final Map buttons; + private final String title; private Component content; private Location centerLocation; private boolean open; - public SimpleGui(String title, int gridWidth, int gridHeight) { + public SimpleGui(String title) { + this.title = title; this.uuid = UUID.randomUUID(); this.components = new HashMap<>(); this.buttons = new HashMap<>(); diff --git a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java index 710ce52..0eae9d1 100644 --- a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java +++ b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java @@ -11,9 +11,17 @@ public class SpawnCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { - Button button = new Button("\uE001", "\uE002", 1).setSize(2).onClick(event -> { - event.getPlayer().sendMessage("You clicked a button1"); - }); + Button button = new Button("\uE001", "\uE002", 1) + .setSize(2) + .onClick(event -> { + event.getPlayer().sendMessage("You clicked a button1"); + }) + .onHover(event -> { + event.getPlayer().sendMessage("You hovered over a button"); + }) + .onUnHover(event -> { + event.getPlayer().sendMessage("You unhovered a button"); + }); Button button2 = new Button("\uE001", "\uE002", 2).onClick(event -> { event.getPlayer().sendMessage("You clicked a button2"); @@ -23,7 +31,14 @@ public boolean onCommand(CommandSender commandSender, Command command, String s, event.getPlayer().sendMessage("You clicked a button3"); }); - SimpleGui gui = new SimpleGui("Some title", 1, 1).addContent(new Text("Test").setSize(2)).addButton(button).addButton(button2).addButton(button3); + Text text = new Text("Here you can put some text for testing purposes") + .setSize(2); + + SimpleGui gui = new SimpleGui("Some title") + .addContent(text) + .addButton(button) + .addButton(button2) + .addButton(button3); gui.open((Player) commandSender); return false; From 975d1c0de713ec2a359f1b5eb2290ab40238aab0 Mon Sep 17 00:00:00 2001 From: linusglimm Date: Sun, 12 May 2024 18:20:56 +0200 Subject: [PATCH 8/8] Made ready for release - Changed from plugin to API - Fixed some minor problems - Text is working fine --- .../de/littleprogrammer/guiapi/GuiApi.java | 21 +++++---- .../guiapi/commands/SpawnCommand.java | 46 ------------------- .../guiapi/components/Button.java | 14 +++++- .../guiapi/components/Text.java | 6 +-- .../guiapi/listeners/GuiEvents.java | 24 +++++++++- .../guiapi/listeners/MoveListener.java | 8 +++- .../guiapi/utils/Calculations.java | 2 +- 7 files changed, 58 insertions(+), 63 deletions(-) delete mode 100644 src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java diff --git a/src/main/java/de/littleprogrammer/guiapi/GuiApi.java b/src/main/java/de/littleprogrammer/guiapi/GuiApi.java index cbfd448..932ead0 100644 --- a/src/main/java/de/littleprogrammer/guiapi/GuiApi.java +++ b/src/main/java/de/littleprogrammer/guiapi/GuiApi.java @@ -1,6 +1,5 @@ package de.littleprogrammer.guiapi; -import de.littleprogrammer.guiapi.commands.SpawnCommand; import de.littleprogrammer.guiapi.enums.ServerVersion; import de.littleprogrammer.guiapi.listeners.GuiEvents; import de.littleprogrammer.guiapi.listeners.MoveListener; @@ -14,15 +13,21 @@ import java.util.Map; import java.util.UUID; -public final class GuiApi extends JavaPlugin { +public final class GuiApi { private JavaPlugin plugin; private static GuiApi instance; private ServerVersion version; private final Listener listener = new GuiEvents(); + private final Listener moveListener = new MoveListener(); private Map guis = new HashMap<>(); - @Override + public GuiApi(JavaPlugin plugin) { + this.plugin = plugin; + instance = this; + } + + /*@Override public void onEnable() { // Plugin startup logic this.plugin = this; @@ -34,9 +39,10 @@ public void onEnable() { @Override public void onDisable() { // Plugin shutdown logic - } + }*/ public void init() { + //This method checks the server version, to determine weather it should use the new 1.20.2 teleport interpolation or my own teleport interpolation String secIndicator = plugin.getServer().getBukkitVersion().split("\\.")[1]; String preTrdIndicator = plugin.getServer().getBukkitVersion().split("\\.")[2]; String trdIndicator = preTrdIndicator.split("-")[0]; @@ -55,10 +61,9 @@ public void init() { } } - Bukkit.getPluginManager().registerEvents(this.listener, this.plugin); - Bukkit.getPluginManager().registerEvents(new MoveListener(), this.plugin); - - getCommand("spawnGui").setExecutor(new SpawnCommand()); + //register the two listeners needed + getPlugin().getServer().getPluginManager().registerEvents(this.listener, this.plugin); + getPlugin().getServer().getPluginManager().registerEvents(this.moveListener, this.plugin); } public JavaPlugin getPlugin() {return this.plugin;} diff --git a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java b/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java deleted file mode 100644 index 0eae9d1..0000000 --- a/src/main/java/de/littleprogrammer/guiapi/commands/SpawnCommand.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.littleprogrammer.guiapi.commands; - -import de.littleprogrammer.guiapi.SimpleGui; -import de.littleprogrammer.guiapi.components.Button; -import de.littleprogrammer.guiapi.components.Text; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -public class SpawnCommand implements CommandExecutor { - @Override - public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { - Button button = new Button("\uE001", "\uE002", 1) - .setSize(2) - .onClick(event -> { - event.getPlayer().sendMessage("You clicked a button1"); - }) - .onHover(event -> { - event.getPlayer().sendMessage("You hovered over a button"); - }) - .onUnHover(event -> { - event.getPlayer().sendMessage("You unhovered a button"); - }); - - Button button2 = new Button("\uE001", "\uE002", 2).onClick(event -> { - event.getPlayer().sendMessage("You clicked a button2"); - }); - - Button button3 = new Button("\uE001", "\uE002", 3).onClick(event -> { - event.getPlayer().sendMessage("You clicked a button3"); - }); - - Text text = new Text("Here you can put some text for testing purposes") - .setSize(2); - - SimpleGui gui = new SimpleGui("Some title") - .addContent(text) - .addButton(button) - .addButton(button2) - .addButton(button3); - gui.open((Player) commandSender); - - return false; - } -} diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Button.java b/src/main/java/de/littleprogrammer/guiapi/components/Button.java index e53b42b..12cdc3e 100644 --- a/src/main/java/de/littleprogrammer/guiapi/components/Button.java +++ b/src/main/java/de/littleprogrammer/guiapi/components/Button.java @@ -26,8 +26,9 @@ public class Button implements Component { private Consumer hoverAction; private Consumer unHoverAction; private int slot; - private int size = 2; + private float size = 2; private SimpleGui simpleGui; + private boolean hover = false; public Button(String texture, String hoverTexture, int slot) { this.texture = texture; @@ -137,8 +138,17 @@ public int getSlot() { public void setGui(SimpleGui gui) { simpleGui = gui; } - public Button setSize(int size) { + + public Button setSize(float size) { this.size = size; return this; } + + public void setHover(boolean hover) { + this.hover = hover; + } + + public boolean isHover() { + return hover; + } } diff --git a/src/main/java/de/littleprogrammer/guiapi/components/Text.java b/src/main/java/de/littleprogrammer/guiapi/components/Text.java index 14819e1..98ba122 100644 --- a/src/main/java/de/littleprogrammer/guiapi/components/Text.java +++ b/src/main/java/de/littleprogrammer/guiapi/components/Text.java @@ -12,7 +12,7 @@ public class Text implements Component { private String text; private UUID uuid; - private int size = 2; + private float size = 2; private TextDisplay textDisplay; private SimpleGui simpleGui; @@ -57,7 +57,7 @@ public SimpleGui getGui() { return simpleGui; } - public int getSize() { + public float getSize() { return size; } @@ -65,7 +65,7 @@ public void setGui(SimpleGui simpleGui) { this.simpleGui = simpleGui; } - public Text setSize(int size) { + public Text setSize(float size) { this.size = size; return this; } diff --git a/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java b/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java index 63c4f37..18b2b34 100644 --- a/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java +++ b/src/main/java/de/littleprogrammer/guiapi/listeners/GuiEvents.java @@ -18,6 +18,28 @@ public class GuiEvents implements Listener { @EventHandler public void onPlayerInteractEvent(PlayerInteractEvent event) { - System.out.println(event.getAction()); + final SimpleGui simpleGui = GuiApi.getInstance().getGUI(event.getPlayer()); + + if (simpleGui == null) return; + + Entity awaitenEntity = null; + for (Entity entity : event.getPlayer().getNearbyEntities(7, 7, 7)) { + if (entity instanceof Display && entity.getCustomName() != null) { + if (Calculations.playerLookingAtEntity(event.getPlayer(), entity)) { + awaitenEntity = entity; + break; + } + } + } + + if (awaitenEntity == null) { return; } + + UUID uuid = UUID.fromString(awaitenEntity.getCustomName()); + Component component = simpleGui.getComponent(uuid); + if (!(component instanceof Button)) return; + + Button button = (Button) component; + //System.out.println("Click on button: " + button.getUniqueId()); + button.getClickAction().accept(new PlayerInteractEntityEvent(event.getPlayer(), button.getEntity())); } } diff --git a/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java b/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java index dacf7e2..f63a764 100644 --- a/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java +++ b/src/main/java/de/littleprogrammer/guiapi/listeners/MoveListener.java @@ -30,7 +30,7 @@ public void onPlayerMove(PlayerMoveEvent event) { } Entity hoveredEntity = null; - for (Entity entity : event.getPlayer().getNearbyEntities(5, 5, 5)) { + for (Entity entity : event.getPlayer().getNearbyEntities(8, 8, 8)) { if (entity instanceof Display && entity.getCustomName() != null) { if (Calculations.isInRange(event.getPlayer().getEyeLocation(), entity.getLocation(), 7)) { hoveredEntity = entity; @@ -43,12 +43,16 @@ public void onPlayerMove(PlayerMoveEvent event) { if (simpleGui.getComponent(UUID.fromString(hoveredEntity.getCustomName())) instanceof Button) { Button button = (Button) simpleGui.getComponent(UUID.fromString(hoveredEntity.getCustomName())); button.getHoverAction().accept(new HoverButtonEvent(simpleGui, event.getPlayer(), button, button.getHoverText(), button.getText())); + button.setHover(true); } } else { for (Component component : simpleGui.getComponents()) { if (component instanceof Button) { Button button = (Button) component; - button.getUnHoverAction().accept(new UnHoverButtonEvent(simpleGui, event.getPlayer(), button, button.getHoverText(), button.getText())); + if (button.isHover()) { + button.getUnHoverAction().accept(new UnHoverButtonEvent(simpleGui, event.getPlayer(), button, button.getHoverText(), button.getText())); + button.setHover(false); + } } } } diff --git a/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java index e4fa087..80e87af 100644 --- a/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java +++ b/src/main/java/de/littleprogrammer/guiapi/utils/Calculations.java @@ -50,7 +50,7 @@ public static Location calculateComponentLocation(SimpleGui simpleGui, Component } } else { //Is content - return centerLoc.clone().add(0, 0.5, 0); + return centerLoc.clone().add(0, 1.5, 0); } return null; }