diff --git a/src/main/java/com/alttd/playerutils/PlayerUtils.java b/src/main/java/com/alttd/playerutils/PlayerUtils.java index 6c4e656..c83d2e0 100644 --- a/src/main/java/com/alttd/playerutils/PlayerUtils.java +++ b/src/main/java/com/alttd/playerutils/PlayerUtils.java @@ -1,6 +1,7 @@ package com.alttd.playerutils; import com.alttd.playerutils.commands.PlayerUtilsCommand; +import com.alttd.playerutils.commands.playerutils_subcommands.GhastSpeed; import com.alttd.playerutils.commands.playerutils_subcommands.RotateBlock; import com.alttd.playerutils.config.Config; import com.alttd.playerutils.config.KeyStorage; @@ -47,6 +48,10 @@ public final class PlayerUtils extends JavaPlugin { RotateBlockEvent rotateBlockEvent = new RotateBlockEvent(logger); pluginManager.registerEvents(rotateBlockEvent, this); playerUtilsCommand.addSubCommand(new RotateBlock(rotateBlockEvent)); + + GhastSpeedEvent ghastSpeedEvent = new GhastSpeedEvent(logger); + pluginManager.registerEvents(ghastSpeedEvent, this); + playerUtilsCommand.addSubCommand(new GhastSpeed(logger, ghastSpeedEvent)); } public void reloadConfigs() { diff --git a/src/main/java/com/alttd/playerutils/commands/argument_parser/ArgumentParser.java b/src/main/java/com/alttd/playerutils/commands/argument_parser/ArgumentParser.java new file mode 100644 index 0000000..0f7f36e --- /dev/null +++ b/src/main/java/com/alttd/playerutils/commands/argument_parser/ArgumentParser.java @@ -0,0 +1,11 @@ +package com.alttd.playerutils.commands.argument_parser; + +import org.bukkit.command.CommandSender; + +import java.util.Optional; + +public interface ArgumentParser { + + Optional parse(CommandSender commandSender, String argument); + +} diff --git a/src/main/java/com/alttd/playerutils/commands/argument_parser/GhastSpeedParser.java b/src/main/java/com/alttd/playerutils/commands/argument_parser/GhastSpeedParser.java new file mode 100644 index 0000000..8cf3e59 --- /dev/null +++ b/src/main/java/com/alttd/playerutils/commands/argument_parser/GhastSpeedParser.java @@ -0,0 +1,23 @@ +package com.alttd.playerutils.commands.argument_parser; + +import com.alttd.playerutils.config.Messages; +import com.alttd.playerutils.data_objects.GHAST_SPEED; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.Optional; + +public class GhastSpeedParser implements ArgumentParser { + + @Override + public Optional parse(CommandSender commandSender, String speed) { + GHAST_SPEED ghastSpeed; + try { + ghastSpeed = GHAST_SPEED.valueOf(speed.toUpperCase()); + } catch (IllegalArgumentException e) { + return Optional.empty(); + } + return Optional.of(ghastSpeed); + } +} diff --git a/src/main/java/com/alttd/playerutils/commands/argument_parser/OnlinePlayerParser.java b/src/main/java/com/alttd/playerutils/commands/argument_parser/OnlinePlayerParser.java new file mode 100644 index 0000000..3c9ec46 --- /dev/null +++ b/src/main/java/com/alttd/playerutils/commands/argument_parser/OnlinePlayerParser.java @@ -0,0 +1,21 @@ +package com.alttd.playerutils.commands.argument_parser; + +import com.alttd.playerutils.config.Messages; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.Optional; + +public class OnlinePlayerParser implements ArgumentParser { + + @Override + public Optional parse(CommandSender commandSender, String playerName) { + Player player = commandSender.getServer().getPlayer(playerName); + if (player == null || !player.isOnline()) { + commandSender.sendRichMessage(Messages.GENERIC.PLAYER_NOT_FOUND, Placeholder.parsed("player", playerName)); + return Optional.empty(); + } + return Optional.of(player); + } +} diff --git a/src/main/java/com/alttd/playerutils/commands/playerutils_subcommands/GhastSpeed.java b/src/main/java/com/alttd/playerutils/commands/playerutils_subcommands/GhastSpeed.java new file mode 100644 index 0000000..e7e08f2 --- /dev/null +++ b/src/main/java/com/alttd/playerutils/commands/playerutils_subcommands/GhastSpeed.java @@ -0,0 +1,93 @@ +package com.alttd.playerutils.commands.playerutils_subcommands; + +import com.alttd.playerutils.commands.SubCommand; +import com.alttd.playerutils.commands.argument_parser.GhastSpeedParser; +import com.alttd.playerutils.config.Messages; +import com.alttd.playerutils.data_objects.GHAST_SPEED; +import com.alttd.playerutils.event_listeners.GhastSpeedEvent; +import com.alttd.playerutils.util.Logger; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.HappyGhast; +import org.bukkit.entity.Player; + +import java.util.*; + +public class GhastSpeed extends SubCommand { + + private final static GhastSpeedParser GHAST_SPEED_PARSER = new GhastSpeedParser(); + private final static int GHAST_SPEED_ARG = 1; + + private final Logger logger; + private final GhastSpeedEvent ghastSpeedEvent; + + public GhastSpeed(Logger logger, GhastSpeedEvent ghastSpeedEvent) { + this.logger = logger; + this.ghastSpeedEvent = ghastSpeedEvent; + } + + @Override + public boolean onCommand(CommandSender commandSender, String[] args) { + if (args.length != 2) { + return false; + } + if (!(commandSender instanceof Player player)) { + commandSender.sendRichMessage(Messages.GENERIC.PLAYER_ONLY); + return true; + } + Optional parsedGhastSpeed = GHAST_SPEED_PARSER.parse(commandSender, args[GHAST_SPEED_ARG]); + if (parsedGhastSpeed.isEmpty()) { + return false; + } + GHAST_SPEED ghastSpeed = parsedGhastSpeed.get(); + if (!(player.getVehicle() instanceof HappyGhast happyGhast)) { + commandSender.sendRichMessage(Messages.GHAST_SPEED.NOT_RIDING_A_GHAST); + return true; + } + + AttributeInstance attribute = happyGhast.getAttribute(Attribute.FLYING_SPEED); + if (attribute == null) { + commandSender.sendRichMessage(Messages.GHAST_SPEED.FAILED_TO_SET_SPEED); + return true; + } + + if (!commandSender.hasPermission(getPermission() + "." + ghastSpeed.name().toLowerCase())) { + commandSender.sendRichMessage(Messages.GENERIC.NO_PERMISSION, + Placeholder.parsed("permission", getPermission() + "." + + ghastSpeed.name().toLowerCase())); + return true; + } + + double newSpeed = GHAST_SPEED.getSpeed(ghastSpeed); + + ghastSpeedEvent.setNewSpeed(player.getUniqueId(), ghastSpeed); + + attribute.setBaseValue(newSpeed); + commandSender.sendRichMessage(Messages.GHAST_SPEED.NEW_SPEED_SET_TO, + Placeholder.parsed("speed", String.valueOf(newSpeed))); + return true; + } + + @Override + public String getName() { + return "ghastspeed"; + } + + @Override + public List getTabComplete(CommandSender commandSender, String[] args) { + if (args.length == 2) { + return Arrays.stream(GHAST_SPEED.values()) + .map(GHAST_SPEED::name) + .filter(name -> commandSender.hasPermission( + getPermission() + "." + name.toLowerCase())).toList(); + } + return List.of(); + } + + @Override + public String getHelpMessage() { + return Messages.HELP.GHAST_SPEED; + } +} diff --git a/src/main/java/com/alttd/playerutils/config/Messages.java b/src/main/java/com/alttd/playerutils/config/Messages.java index c1335e0..42d1139 100644 --- a/src/main/java/com/alttd/playerutils/config/Messages.java +++ b/src/main/java/com/alttd/playerutils/config/Messages.java @@ -1,6 +1,7 @@ package com.alttd.playerutils.config; import com.alttd.playerutils.util.Logger; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.List; @@ -35,6 +36,7 @@ public class Messages extends AbstractConfig { public static String RELOAD = "Reload the configs for PlayerUtils: /pu reload"; public static String ROTATE_BLOCK = "Enable rotating blocks with a blaze rod: /pu rotateblock"; public static String KEY = "Receive a key that you are owed: /pu key"; + public static String GHAST_SPEED = "Set the speed of a ghast: /pu ghastspeed "; @SuppressWarnings("unused") private static void load() { @@ -45,6 +47,7 @@ public class Messages extends AbstractConfig { XP_CALC = config.getString(prefix, "xp-calc", XP_CALC); RELOAD = config.getString(prefix, "reload", RELOAD); ROTATE_BLOCK = config.getString(prefix, "rotate-block", ROTATE_BLOCK); + GHAST_SPEED = config.getString(prefix, "ghast-speed", GHAST_SPEED); } } @@ -157,13 +160,29 @@ public class Messages extends AbstractConfig { } } + public static class GHAST_SPEED { + private static final String prefix = "pu-command.ghast-speed."; + + public static String NOT_RIDING_A_GHAST = "You are not riding a ghast"; + public static String FAILED_TO_SET_SPEED = "Failed to set ghast speed"; + public static String NEW_SPEED_SET_TO = "New speed set to "; + + @SuppressWarnings("unused") + private static void load() { + NOT_RIDING_A_GHAST = config.getString(prefix, "not-riding-a-ghast", NOT_RIDING_A_GHAST); + FAILED_TO_SET_SPEED = config.getString(prefix, "failed-to-set-speed", FAILED_TO_SET_SPEED); + NEW_SPEED_SET_TO = config.getString(prefix, "new-speed-set-to", NEW_SPEED_SET_TO); + } + } + public static class BLOCK_BLOCK_USE { private static final String prefix = "block-block-use."; - public static String BLOCKED = "You are not powerful enough!"; + public static String BLOCKED = "You are not powerful enough!"; @SuppressWarnings("unused") private static void load() { BLOCKED = config.getString(prefix, "blocked", BLOCKED); } + } } diff --git a/src/main/java/com/alttd/playerutils/data_objects/GHAST_SPEED.java b/src/main/java/com/alttd/playerutils/data_objects/GHAST_SPEED.java new file mode 100644 index 0000000..e6b90cc --- /dev/null +++ b/src/main/java/com/alttd/playerutils/data_objects/GHAST_SPEED.java @@ -0,0 +1,19 @@ +package com.alttd.playerutils.data_objects; + +public enum GHAST_SPEED { + SLOW, + NORMAL, + FAST, + VERY_FAST, + EXTREMELY_FAST; + + public static double getSpeed(GHAST_SPEED ghastSpeed) { + return switch (ghastSpeed) { + case SLOW -> 0.025; + case NORMAL -> 0.05; + case FAST -> 0.075; + case VERY_FAST -> 0.1; + case EXTREMELY_FAST -> 0.125; + }; + } +} diff --git a/src/main/java/com/alttd/playerutils/event_listeners/GhastSpeedEvent.java b/src/main/java/com/alttd/playerutils/event_listeners/GhastSpeedEvent.java new file mode 100644 index 0000000..3a6232b --- /dev/null +++ b/src/main/java/com/alttd/playerutils/event_listeners/GhastSpeedEvent.java @@ -0,0 +1,75 @@ +package com.alttd.playerutils.event_listeners; + +import com.alttd.playerutils.data_objects.GHAST_SPEED; +import com.alttd.playerutils.util.Logger; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.entity.Entity; +import org.bukkit.entity.HappyGhast; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDismountEvent; +import org.bukkit.event.entity.EntityMountEvent; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.UUID; + +public class GhastSpeedEvent implements Listener { + + private static final org.slf4j.Logger log = LoggerFactory.getLogger(GhastSpeedEvent.class); + private final Logger logger; + + private final HashMap lastSetSpeed = new HashMap<>(); + + public GhastSpeedEvent(Logger logger) { + this.logger = logger; + } + + @EventHandler + public void onEntityMount(EntityMountEvent event) { + if (!(event.getEntity() instanceof Player player)) { + return; + } + + Entity mount = event.getMount(); + + if (!(mount instanceof HappyGhast happyGhast)) { + return; + } + + GHAST_SPEED ghastSpeed = lastSetSpeed.get(player.getUniqueId()); + if (ghastSpeed == null) { + return; + } + + AttributeInstance attribute = happyGhast.getAttribute(Attribute.FLYING_SPEED); + if (attribute == null) { + return; + } + attribute.setBaseValue(GHAST_SPEED.getSpeed(ghastSpeed)); + } + + @EventHandler + public void onEntityDismount(EntityDismountEvent event) { + if (!(event.getDismounted() instanceof HappyGhast happyGhast)) { + return; + } + + if (happyGhast.getPassengers().size() >= 2) { + return; + } + + AttributeInstance attribute = happyGhast.getAttribute(Attribute.FLYING_SPEED); + if (attribute == null) { + return; + } + attribute.setBaseValue(GHAST_SPEED.getSpeed(GHAST_SPEED.NORMAL)); + } + + public void setNewSpeed(UUID uuid, GHAST_SPEED speed) { + lastSetSpeed.put(uuid, speed); + } + +}