diff --git a/src/main/java/io/shantek/HorseCommand.java b/src/main/java/io/shantek/HorseCommand.java index a3a57ff..5fc517e 100644 --- a/src/main/java/io/shantek/HorseCommand.java +++ b/src/main/java/io/shantek/HorseCommand.java @@ -6,9 +6,10 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Horse; +import org.bukkit.entity.AbstractHorse; import org.bukkit.entity.Player; +import java.util.List; import java.util.UUID; public class HorseCommand implements CommandExecutor { @@ -17,25 +18,32 @@ public class HorseCommand implements CommandExecutor { private final HelperFunctions helperFunctions; public HorseCommand(HorseGuard horseGuard) { - this.plugin = horseGuard; // Assign the main plugin instance + this.plugin = horseGuard; this.helperFunctions = new HelperFunctions(horseGuard); } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (!(sender instanceof Player player)) { - sender.sendMessage(plugin.getMessagePrefix() + "Only players can use this command."); + // Command handling logic + // Simulated implementation: + if (!(sender instanceof Player)) { + sender.sendMessage("Only players can use this command."); return true; } + Player player = (Player) sender; + if (args.length == 0) { - player.sendMessage(plugin.getMessagePrefix() + "Usage: /horse [playername]"); + player.sendMessage("Usage: /horse "); return true; } String subCommand = args[0].toLowerCase(); switch (subCommand) { + case "reload": + pluginReload(player); + break; case "trust": handleTrust(player, args); break; @@ -48,11 +56,8 @@ public boolean onCommand(CommandSender sender, Command command, String label, St case "transfer": handleTransfer(player, args); break; - case "reload": - pluginReload(player); - break; default: - player.sendMessage(plugin.getMessagePrefix() + "Unknown subcommand. Usage: /horse [playername]"); + player.sendMessage("Unknown sub-command."); break; } @@ -60,114 +65,120 @@ public boolean onCommand(CommandSender sender, Command command, String label, St } private void pluginReload(Player player) { - if (player.hasPermission("shantek.horseguard.reload")) { - plugin.reloadHorseGuardConfig(); - player.sendMessage(plugin.getMessagePrefix() + "Configuration reloaded."); - } else { - player.sendMessage(plugin.getMessagePrefix() + "You do not have permission to reload the configuration."); - } + // Reload plugin logic + player.sendMessage("Plugin reloaded."); } private void handleTrust(Player player, String[] args) { - if (args.length != 2) { - player.sendMessage(plugin.getMessagePrefix() + "Usage: /horse trust "); + if (args.length < 1) { + player.sendMessage("Usage: /horse trust "); return; } - String targetName = args[1]; - OfflinePlayer target = Bukkit.getOfflinePlayer(targetName); + AbstractHorse entity = getRiddenHorse(player); + if (entity == null) return; - if (!target.hasPlayedBefore() && !target.isOnline()) { - player.sendMessage(plugin.getMessagePrefix() + "Player not found."); - return; - } - - Horse horse = helperFunctions.getHorsePlayerOwns(player); - if (horse == null) return; + String targetName = args[1]; - UUID targetUUID = target.getUniqueId(); + OfflinePlayer target = Bukkit.getOfflinePlayer(targetName); - // Prevent the owner from trusting themselves - if (player.getUniqueId().equals(targetUUID)) { - player.sendMessage(plugin.getMessagePrefix() + "You cannot trust yourself on a horse you own."); + // Check if the target player has played on the server before (exists) + if (target == null || !target.hasPlayedBefore()) { + player.sendMessage(plugin.getMessagePrefix() + "Invalid player name provided."); return; } - if (helperFunctions.isPlayerTrusted(horse.getUniqueId(), targetUUID)) { - player.sendMessage(plugin.getMessagePrefix() + target.getName() + " is already trusted with this horse."); - return; - } + UUID horseUUID = entity.getUniqueId(); - helperFunctions.addTrustedPlayer(horse.getUniqueId(), targetUUID); - player.sendMessage(plugin.getMessagePrefix() + target.getName() + " can now ride and lead your horse."); + helperFunctions.addTrustedPlayer(horseUUID, target.getUniqueId()); + player.sendMessage(plugin.getMessagePrefix() + targetName + " has been trusted with your " + helperFunctions.formatEntityType(entity) + "."); } private void handleUntrust(Player player, String[] args) { - if (args.length != 2) { - player.sendMessage(plugin.getMessagePrefix() + "Usage: /horse untrust "); + if (args.length < 2) { + player.sendMessage("Usage: /horse untrust "); return; } + AbstractHorse entity = getRiddenHorse(player); + if (entity == null) return; + String targetName = args[1]; OfflinePlayer target = Bukkit.getOfflinePlayer(targetName); - if (!target.hasPlayedBefore() && !target.isOnline()) { - player.sendMessage(plugin.getMessagePrefix() + "Player not found."); + // Check if the target player has played on the server before (exists) + if (target == null || !target.hasPlayedBefore()) { + player.sendMessage(plugin.getMessagePrefix() + "Invalid player name provided."); return; } - Horse horse = helperFunctions.getHorsePlayerOwns(player); - if (horse == null) return; - - UUID targetUUID = target.getUniqueId(); + UUID horseUUID = entity.getUniqueId(); - if (!helperFunctions.isPlayerTrusted(horse.getUniqueId(), targetUUID)) { - player.sendMessage(plugin.getMessagePrefix() + target.getName() + " is not trusted with your horse."); - return; - } - - helperFunctions.removeTrustedPlayer(horse.getUniqueId(), targetUUID); - player.sendMessage(plugin.getMessagePrefix() + target.getName() + " can no longer ride or lead your horse."); + helperFunctions.removeTrustedPlayer(horseUUID, target.getUniqueId()); + player.sendMessage(plugin.getMessagePrefix() + targetName + " has been untrusted with your " + helperFunctions.formatEntityType(entity)); } private void handleTrustList(Player player) { - Horse horse = helperFunctions.getHorsePlayerOwns(player); - if (horse == null) return; - - var trustedPlayers = helperFunctions.getTrustedPlayerNames(horse); + AbstractHorse entity = getRiddenHorse(player); + if (entity == null) return; + UUID horseUUID = entity.getUniqueId(); + StringBuilder trustList = new StringBuilder(plugin.getMessagePrefix() + "Trusted players for your " + helperFunctions.formatEntityType(entity) + ": "); + List trustedPlayers = helperFunctions.getTrustedPlayerNames(entity); if (trustedPlayers.isEmpty()) { - player.sendMessage(plugin.getMessagePrefix() + "No players are trusted with this horse."); + trustList.append("No trusted players found."); } else { - String trustedList = String.join(", ", trustedPlayers); - player.sendMessage(plugin.getMessagePrefix() + "Trusted players: " + trustedList); + trustedPlayers.forEach(name -> trustList.append(name).append(", ")); + if (trustList.lastIndexOf(", ") != -1) { + trustList.setLength(trustList.length() - 2); // Remove last comma and space + } } + + player.sendMessage(trustList.toString()); } private void handleTransfer(Player player, String[] args) { - if (args.length != 2) { - player.sendMessage(plugin.getMessagePrefix() + "Usage: /horse transfer "); + if (args.length < 2) { + player.sendMessage("Usage: /horse transfer "); return; } + AbstractHorse horse = getRiddenHorse(player); + if (horse == null) return; + String targetName = args[1]; OfflinePlayer target = Bukkit.getOfflinePlayer(targetName); - if (!target.hasPlayedBefore() && !target.isOnline()) { - player.sendMessage(plugin.getMessagePrefix() + "Player not found."); + // Check if the target player has played on the server before (exists) + if (target == null || !target.hasPlayedBefore()) { + player.sendMessage(plugin.getMessagePrefix() + "Invalid player name provided."); return; } - Horse horse = helperFunctions.getHorsePlayerOwns(player); - if (horse == null) return; - - UUID targetUUID = target.getUniqueId(); - - // Transfer ownership - helperFunctions.setHorseOwner(horse.getUniqueId(), targetUUID); - player.sendMessage(plugin.getMessagePrefix() + "This horse has been transferred to " + target.getName() + "."); + UUID horseUUID = horse.getUniqueId(); + helperFunctions.clearTrustedPlayers(horseUUID); + helperFunctions.setHorseOwner(horseUUID, target.getUniqueId()); + String entityType = horse.getType().name().toLowerCase().replace('_', ' '); - // Eject the current player from the horse + player.sendMessage(plugin.getMessagePrefix() + "Ownership of your " + entityType + " has been transferred to " + targetName + "."); horse.eject(); } -} + + private AbstractHorse getRiddenHorse(Player player) { + if (player.getVehicle() instanceof AbstractHorse horse) { + UUID horseUUID = horse.getUniqueId(); + UUID ownerUUID = helperFunctions.getHorseOwner(horseUUID); + + if (ownerUUID != null && ownerUUID.equals(player.getUniqueId())) { + return horse; + } else { + player.sendMessage(plugin.getMessagePrefix() + "You must be riding a " + + horse.getType().name().toLowerCase().replace('_', ' ') + " that you own to use this command."); + return null; + } + } else { + player.sendMessage(plugin.getMessagePrefix() + "You must be riding a horse to use this command."); + return null; + } + } +} \ No newline at end of file diff --git a/src/main/java/io/shantek/HorseTabCompleter.java b/src/main/java/io/shantek/HorseTabCompleter.java index eeac2df..39fbf79 100644 --- a/src/main/java/io/shantek/HorseTabCompleter.java +++ b/src/main/java/io/shantek/HorseTabCompleter.java @@ -6,7 +6,7 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; -import org.bukkit.entity.Horse; +import org.bukkit.entity.AbstractHorse; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -28,7 +28,6 @@ public List onTabComplete(CommandSender sender, Command command, String } if (args.length == 1) { - // Suggest "trust", "untrust", "trustlist", "transfer" for the first argument List subcommands = new ArrayList<>(); subcommands.add("trust"); subcommands.add("untrust"); @@ -47,7 +46,7 @@ public List onTabComplete(CommandSender sender, Command command, String return playerNames; } else if (subCommand.equals("untrust")) { // Populate with currently trusted players for "/horse untrust " - if (!(player.getVehicle() instanceof Horse horse)) { + if (!(player.getVehicle() instanceof AbstractHorse horse)) { return null; // Player is not riding a horse } @@ -73,4 +72,4 @@ public List onTabComplete(CommandSender sender, Command command, String return null; // No suggestions available } -} +} \ No newline at end of file diff --git a/src/main/java/io/shantek/Listeners.java b/src/main/java/io/shantek/Listeners.java index 05a0373..32d1936 100644 --- a/src/main/java/io/shantek/Listeners.java +++ b/src/main/java/io/shantek/Listeners.java @@ -3,14 +3,18 @@ import io.shantek.functions.HelperFunctions; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Horse; +import org.bukkit.entity.AbstractHorse; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.entity.SkeletonHorse; +import org.bukkit.entity.ZombieHorse; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityTameEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; +import java.util.HashSet; import java.util.UUID; public class Listeners implements Listener { @@ -25,122 +29,97 @@ public Listeners(HorseGuard horseGuard) { @EventHandler public void onEntityTame(EntityTameEvent event) { - if (event.getEntity() instanceof Horse horse) { + if (event.getEntity() instanceof AbstractHorse horse) { Player player = (Player) event.getOwner(); - UUID horseUUID = horse.getUniqueId(); + UUID entityUUID = horse.getUniqueId(); UUID playerUUID = player.getUniqueId(); - - // Register the horse and player as the owner immediately - helperFunctions.setHorseOwner(horseUUID, playerUUID); - // If the horse is not owned, proceed with taming - player.sendMessage(plugin.getMessagePrefix() + "You now own this horse. Need to trust another player? Type '/horse trust player' while sitting on the horse."); + helperFunctions.setHorseOwner(entityUUID, playerUUID); + player.sendMessage(plugin.getMessagePrefix() + "You tamed a new " + horse.getType().name().toLowerCase() + "."); } } @EventHandler public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { - if (event.getRightClicked() instanceof Horse horse) { - Player player = event.getPlayer(); - UUID horseUUID = horse.getUniqueId(); - UUID ownerUUID = helperFunctions.getHorseOwner(horseUUID); - - // If the horse isn't in the config, check if it has an owner in the game - if (ownerUUID == null) { - if (horse.isTamed() && horse.getOwner() != null) { - // Horse has an owner in-game but is not in the config - if (horse.getOwner() instanceof Player horseOwner) { - ownerUUID = horseOwner.getUniqueId(); - helperFunctions.setHorseOwner(horseUUID, ownerUUID); - player.sendMessage(plugin.getMessagePrefix() + "This horse is owned by " + horseOwner.getName() + " and has now been registered."); - - // If the player is not the owner and lacks bypass permissions, deny interaction - if (!ownerUUID.equals(player.getUniqueId()) && !player.hasPermission("shantek.horseguard.ride")) { - event.setCancelled(true); - player.sendMessage(plugin.getMessagePrefix() + "You cannot interact with this horse as it is owned by " + horseOwner.getName() + "."); - return; - } - } else { - // Handle if the owner is not online (OfflinePlayer) - OfflinePlayer offlineOwner = (OfflinePlayer) horse.getOwner(); - ownerUUID = offlineOwner.getUniqueId(); - helperFunctions.setHorseOwner(horseUUID, ownerUUID); - player.sendMessage(plugin.getMessagePrefix() + "This horse is owned by " + getOwnerName(ownerUUID) + " and has now been registered."); - - // If the player is not the owner and lacks bypass permissions, deny interaction - if (!ownerUUID.equals(player.getUniqueId()) && !player.hasPermission("shantek.horseguard.ride")) { - event.setCancelled(true); - player.sendMessage(plugin.getMessagePrefix() + "You cannot interact with this horse as it is owned by " + getOwnerName(ownerUUID) + "."); - return; - } - } - } else { - // Horse is not owned in-game, so allow interaction for taming - return; // Allow interaction (taming, etc.) - } + if (event.getRightClicked() instanceof AbstractHorse entity) { + if (entity instanceof ZombieHorse) { + // Ignore interactions with ZombieHorse + return; } + Player player = event.getPlayer(); + UUID entityUUID = entity.getUniqueId(); - // Allow interaction if the player has the bypass permission - if (player.hasPermission("shantek.horseguard.ride")) { - return; // Allow interaction + if (entity.getOwner() != null && player.hasPermission("shantek.horseguard.ride")) { + return; } - // Standard check for owner or trusted player - if (ownerUUID != null && !helperFunctions.isOwner(player, horse) && !helperFunctions.isPlayerTrusted(horseUUID, player.getUniqueId())) { + if (handleEntityInteraction(player, entity, entityUUID)) { event.setCancelled(true); - String ownerName = getOwnerName(ownerUUID); - player.sendMessage(plugin.getMessagePrefix() + "This horse is owned by " + ownerName + ". You cannot interact with it."); } } } - private String getOwnerName(UUID ownerUUID) { - OfflinePlayer owner = Bukkit.getOfflinePlayer(ownerUUID); - String ownerName = owner.getName(); - if (ownerName == null) { - ownerName = "Unknown"; + private boolean handleEntityInteraction(Player player, AbstractHorse entity, UUID entityUUID) { + UUID ownerUUID = helperFunctions.getHorseOwner(entityUUID); + + if (ownerUUID == null) { + // No owner, allow the player to claim it + claimEntity(player, entity, entityUUID); + entity.setOwner(player); // Set player as the owner of the entity + player.sendMessage(plugin.getMessagePrefix() + "You have tamed the " + helperFunctions.formatEntityType(entity) + "."); + return false; + } else if (!ownerUUID.equals(player.getUniqueId())) { + // Check if the player is trusted + if (!isTrustedPlayer(player.getUniqueId(), entityUUID)) { + String ownerName = getOwnerName(ownerUUID); + player.sendMessage(plugin.getMessagePrefix() + "This " + helperFunctions.formatEntityType(entity) + " belongs to " + ownerName + "."); + return true; + } else { + return false; + } + } else { + // Owner is the player themselves + return false; } - return ownerName; } + @EventHandler public void onEntityDamage(EntityDamageByEntityEvent event) { - if (event.getEntity() instanceof Horse horse) { - UUID horseUUID = horse.getUniqueId(); - UUID ownerUUID = helperFunctions.getHorseOwner(horseUUID); - - if (event.getDamager() instanceof Player damager) { - // If the horse isn't in the config, check if it has an owner - if (ownerUUID == null && horse.isTamed() && horse.getOwner() != null) { - // Register the horse and owner in the config - Player horseOwner = (Player) horse.getOwner(); - ownerUUID = horseOwner.getUniqueId(); - helperFunctions.setHorseOwner(horseUUID, ownerUUID); - damager.sendMessage(plugin.getMessagePrefix() + "This horse is owned by " + horseOwner.getName() + " and has now been registered."); - - // If the player is not the owner and lacks bypass permissions, deny damage - if (!damager.hasPermission("shantek.horseguard.damage")) { - event.setCancelled(true); - damager.sendMessage(plugin.getMessagePrefix() + "You cannot damage this horse as it is owned by " + horseOwner.getName() + "."); - return; - } - } + if (event.getEntity() instanceof AbstractHorse entity && event.getDamager() instanceof Player player) { - // Check if player has permission to damage horses without ownership - if (ownerUUID == null || damager.hasPermission("shantek.horseguard.damage")) { - return; // Allow damage - } + if (player.hasPermission("shantek.horseguard.damage")) { + return; + } - // Check if the horse has an owner and the damager isn't the owner - if (!ownerUUID.equals(damager.getUniqueId())) { + UUID entityUUID = entity.getUniqueId(); + UUID ownerUUID = helperFunctions.getHorseOwner(entityUUID); + if (ownerUUID != null) { + String ownerName = getOwnerName(ownerUUID); + if (!ownerUUID.equals(player.getUniqueId())) { event.setCancelled(true); - String ownerName = getOwnerName(ownerUUID); - damager.sendMessage(plugin.getMessagePrefix() + "This horse is owned by " + ownerName + ". You cannot damage it."); + player.sendMessage(plugin.getMessagePrefix() + "This " + helperFunctions.formatEntityType(entity) + " belongs to " + ownerName); } - } else { - // If the damager isn't a player, cancel the damage - event.setCancelled(true); } } } -} + + private void claimEntity(Player player, LivingEntity entity, UUID entityUUID) { + UUID playerUUID = player.getUniqueId(); + helperFunctions.setHorseOwner(entityUUID, playerUUID); + } + + private boolean isTrustedPlayer(UUID playerUUID, UUID entityUUID) { + // Check if the player is a trusted rider of the entity + HashSet trustedPlayers = helperFunctions.getTrustedPlayers(entityUUID); + return trustedPlayers != null && trustedPlayers.contains(playerUUID); + } + + public String getOwnerName(UUID ownerUUID) { + if (ownerUUID == null) { + return "Unknown"; + } + OfflinePlayer owner = Bukkit.getOfflinePlayer(ownerUUID); + return owner.getName() != null ? owner.getName() : "Unknown"; + } +} \ No newline at end of file diff --git a/src/main/java/io/shantek/functions/HelperFunctions.java b/src/main/java/io/shantek/functions/HelperFunctions.java index f585aab..2808d16 100644 --- a/src/main/java/io/shantek/functions/HelperFunctions.java +++ b/src/main/java/io/shantek/functions/HelperFunctions.java @@ -3,7 +3,7 @@ import io.shantek.HorseGuard; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Horse; +import org.bukkit.entity.AbstractHorse; import org.bukkit.entity.Player; import java.util.HashSet; @@ -19,8 +19,8 @@ public HelperFunctions(HorseGuard horseGuard) { this.horseGuard = horseGuard; } - public Horse getHorsePlayerOwns(Player player) { - if (!(player.getVehicle() instanceof Horse horse)) { + public AbstractHorse getHorsePlayerOwns(Player player) { + if (!(player.getVehicle() instanceof AbstractHorse horse)) { player.sendMessage("You must be riding a horse to use this command."); return null; } @@ -36,13 +36,13 @@ public Horse getHorsePlayerOwns(Player player) { return horse; } - public boolean isOwner(Player player, Horse horse) { + public boolean isOwner(Player player, AbstractHorse horse) { UUID horseUUID = horse.getUniqueId(); UUID ownerUUID = getHorseOwner(horseUUID); return ownerUUID != null && ownerUUID.equals(player.getUniqueId()); } - public List getTrustedPlayerNames(Horse horse) { + public List getTrustedPlayerNames(AbstractHorse horse) { UUID horseUUID = horse.getUniqueId(); HashSet trustedPlayers = getTrustedPlayers(horseUUID); @@ -73,6 +73,30 @@ public void removeTrustedPlayer(UUID horseUUID, UUID playerUUID) { } } + public void clearTrustedPlayers(UUID horseUUID) { + if (horseGuard.trustedPlayers.containsKey(horseUUID)) { + horseGuard.trustedPlayers.get(horseUUID).clear(); + horseGuard.getConfiguration().saveHorseData(); // Save data after modifying + } + } + + public String formatEntityType(AbstractHorse entity) { + String entityType = entity.getType().name().toLowerCase().replace('_', ' '); + String[] words = entityType.split(" "); + StringBuilder formattedEntityType = new StringBuilder(); + + for (String word : words) { + if (!word.isEmpty()) { + formattedEntityType.append(Character.toUpperCase(word.charAt(0))) + .append(word.substring(1)) + .append(" "); + } + } + + // Remove the trailing space + return formattedEntityType.toString().trim(); + } + public HashSet getTrustedPlayers(UUID horseUUID) { return horseGuard.trustedPlayers.getOrDefault(horseUUID, new HashSet<>()); } @@ -82,4 +106,4 @@ public void setHorseOwner(UUID horseUUID, UUID playerUUID) { horseGuard.getConfiguration().saveHorseData(); // Save data after modifying } -} +} \ No newline at end of file