diff --git a/.idea/modules.xml b/.idea/modules.xml index 26a7d9b..04242aa 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,6 +2,7 @@ + diff --git a/.idea/modules/BlazeSMP.main.iml b/.idea/modules/BlazeSMP.main.iml index d329813..bbeeb3e 100644 --- a/.idea/modules/BlazeSMP.main.iml +++ b/.idea/modules/BlazeSMP.main.iml @@ -1,10 +1,5 @@ - - - - - diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java index d5cfddf..2f9d627 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java @@ -1,6 +1,7 @@ package me.freezy.plugins.papermc.blazesmp; import lombok.Getter; +import me.freezy.plugins.papermc.blazesmp.command.ClaimCommand; import me.freezy.plugins.papermc.blazesmp.command.ClanCommand; import me.freezy.plugins.papermc.blazesmp.command.ReportCommand; import me.freezy.plugins.papermc.blazesmp.listener.PlayerChatListener; @@ -64,6 +65,7 @@ public final class BlazeSMP extends JavaPlugin { this.log.info("Registering Commands..."); new ClanCommand().register(); new ReportCommand().register(); + new ClaimCommand().register(); this.log.info("Registered Commands!"); this.log.info("Registering EventListeners..."); diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClaimCommand.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClaimCommand.java new file mode 100644 index 0000000..3d44d11 --- /dev/null +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/ClaimCommand.java @@ -0,0 +1,79 @@ +package me.freezy.plugins.papermc.blazesmp.command; + +import me.freezy.plugins.papermc.blazesmp.BlazeSMP; +import me.freezy.plugins.papermc.blazesmp.command.util.SimpleCommand; +import me.freezy.plugins.papermc.blazesmp.module.Clan; +import me.freezy.plugins.papermc.blazesmp.module.manager.Clans; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Chunk; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class ClaimCommand extends SimpleCommand { + + private final Clans clans; + + public ClaimCommand() { + super("claim", List.of("unclaim")); + this.clans = BlazeSMP.getInstance().getClans(); + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (!(sender instanceof Player player)) { + sender.sendMessage(MiniMessage.miniMessage().deserialize("You must be a player to use this command!")); + return true; + } + UUID playerUUID = player.getUniqueId(); + if (!clans.isInClan(playerUUID)) { + player.sendMessage(MiniMessage.miniMessage().deserialize("You must be in a clan to claim/unclaim chunks!")); + return true; + } else { + if (label.equalsIgnoreCase("claim")) { + Clan playerClan = clans.getClanByMember(playerUUID); + LinkedHashMap> existingClaims=clans.getClanChunks(playerClan); + if (existingClaims.containsKey(playerUUID)) { + LinkedList playerClaims = existingClaims.get(playerUUID); + int MAX_CLAIMS = 50; + if (playerClaims.size() >= MAX_CLAIMS) { + player.sendMessage(MiniMessage.miniMessage().deserialize("You have reached the maximum amount of claims!")); + } else { + Chunk playerChunk = player.getLocation().getChunk(); + playerClaims.add(playerChunk); + player.sendMessage(MiniMessage.miniMessage().deserialize("Claimed chunk!")); + existingClaims.put(playerUUID, playerClaims); + clans.setClanChunks(playerClan, existingClaims); + } + return true; + } + } else if (label.equalsIgnoreCase("unclaim")) { + Clan playerClan = clans.getClanByMember(playerUUID); + LinkedHashMap> existingClaims=clans.getClanChunks(playerClan); + if (existingClaims.containsKey(playerUUID)) { + LinkedList playerClaims = existingClaims.get(playerUUID); + Chunk playerChunk = player.getLocation().getChunk(); + if (playerClaims.contains(playerChunk)) { + playerClaims.remove(playerChunk); + player.sendMessage(MiniMessage.miniMessage().deserialize("Unclaimed chunk!")); + existingClaims.put(playerUUID, playerClaims); + clans.setClanChunks(playerClan, existingClaims); + } else { + player.sendMessage(MiniMessage.miniMessage().deserialize("You do not own this chunk!")); + } + return true; + } + } + } + return false; + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + return List.of(); + } +} diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/util/SimpleCommand.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/util/SimpleCommand.java index 694225d..8cba3e6 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/command/util/SimpleCommand.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/command/util/SimpleCommand.java @@ -9,7 +9,7 @@ import java.lang.reflect.Field; import java.util.List; import java.util.Objects; import java.util.logging.Logger; - +@SuppressWarnings("ALL") public abstract class SimpleCommand implements CommandExecutor, TabExecutor { protected static Logger logger = Logger.getLogger(BlazeSMP.class.getName()); protected static CommandMap cmap; @@ -27,6 +27,10 @@ public abstract class SimpleCommand implements CommandExecutor, TabExecutor { this(command, usage, null, null, null); } + public SimpleCommand(String command, List alias) { + this(command, null, null, null, alias); + } + public SimpleCommand(String command, String usage, String description) { this(command, usage, description, null, null); } diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerClaimListener.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerClaimListener.java new file mode 100644 index 0000000..d2990a2 --- /dev/null +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/listener/PlayerClaimListener.java @@ -0,0 +1,123 @@ +package me.freezy.plugins.papermc.blazesmp.listener; + +import me.freezy.plugins.papermc.blazesmp.BlazeSMP; +import me.freezy.plugins.papermc.blazesmp.module.Clan; +import me.freezy.plugins.papermc.blazesmp.module.manager.Clans; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerMoveEvent; + +public class PlayerClaimListener implements Listener { + @EventHandler + public void onBlockBreak(BlockBreakEvent event) { + Location location = event.getBlock().getLocation(); + Chunk chunk = location.getChunk(); + Clans clans = BlazeSMP.getInstance().getClans(); + Clan clan = clans.getClanByChunk(chunk); + if (clan != null) { + if (clans.isInClan(event.getPlayer().getUniqueId(), clan)) { + return; + } + event.setCancelled(true); + } + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent event) { + Location location = event.getBlock().getLocation(); + Chunk chunk = location.getChunk(); + Clans clans = BlazeSMP.getInstance().getClans(); + Clan clan = clans.getClanByChunk(chunk); + if (clan != null) { + if (clans.isInClan(event.getPlayer().getUniqueId(), clan)) { + return; + } + event.setCancelled(true); + } + } + + @EventHandler + public void onPlayerInteractEvent(PlayerInteractEvent event) { + Location location = event.getPlayer().getLocation(); + Chunk chunk = location.getChunk(); + Clans clans = BlazeSMP.getInstance().getClans(); + Clan clan = clans.getClanByChunk(chunk); + if (clan != null) { + if (clans.isInClan(event.getPlayer().getUniqueId(), clan)) { + return; + } + event.setCancelled(true); + } + } + + @EventHandler + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + Location location = event.getPlayer().getLocation(); + Chunk chunk = location.getChunk(); + Clans clans = BlazeSMP.getInstance().getClans(); + Clan clan = clans.getClanByChunk(chunk); + if (clan != null) { + if (clans.isInClan(event.getPlayer().getUniqueId(), clan)) { + return; + } + event.setCancelled(true); + } + } + + @EventHandler + public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) { + Location location = event.getPlayer().getLocation(); + Chunk chunk = location.getChunk(); + Clans clans = BlazeSMP.getInstance().getClans(); + Clan clan = clans.getClanByChunk(chunk); + if (clan != null) { + if (clans.isInClan(event.getPlayer().getUniqueId(), clan)) { + return; + } + event.setCancelled(true); + } + } + + @EventHandler + public void onEnterClanClaim(PlayerMoveEvent event) { + Chunk fromChunk = event.getFrom().getChunk(); + Chunk toChunk = event.getTo().getChunk(); + if (fromChunk.equals(toChunk)) { + return; + } + + Player player = event.getPlayer(); + Clans clans = BlazeSMP.getInstance().getClans(); + + Clan oldClan = clans.getClanByChunk(fromChunk); + Clan newClan = clans.getClanByChunk(toChunk); + + if (oldClan != null && (!oldClan.equals(newClan))) { + player.sendActionBar( + MiniMessage.miniMessage().deserialize( + "You left the claim of " + oldClan.getName() + "!" + ) + ); + } + + if (newClan != null && (!newClan.equals(oldClan))) { + player.sendActionBar( + MiniMessage.miniMessage().deserialize( + "Terretorry of " + newClan.getName() + " - " + + Bukkit.getOfflinePlayer(newClan.getChunkOwnerMap().get(toChunk)).getName() + + "!" + ) + ); + } + } +} diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Clans.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Clans.java index 85653bf..ca6639d 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Clans.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/Clans.java @@ -2,12 +2,16 @@ package me.freezy.plugins.papermc.blazesmp.module.manager; import lombok.Getter; import me.freezy.plugins.papermc.blazesmp.module.Clan; +import org.bukkit.Chunk; import java.io.File; +import java.util.LinkedHashMap; import java.util.LinkedList; +import java.util.Map; import java.util.UUID; import java.util.logging.Logger; +@SuppressWarnings("unused") @Getter public class Clans { private static final Logger LOGGER = Logger.getLogger("ClanManager"); @@ -31,7 +35,11 @@ public class Clans { File dir = new File(CLAN_STORAGE_PATH); if (!dir.exists()) { LOGGER.info("Clan storage directory does not exist. Creating directory..."); - dir.mkdirs(); + if (!dir.mkdirs()) { + LOGGER.warning("Failed to create clan storage directory."); + } else { + LOGGER.info("Created clan storage directory."); + } return; } File[] files = dir.listFiles((file, name) -> name.endsWith(".json")); @@ -123,6 +131,33 @@ public class Clans { } } + public LinkedHashMap> getClanChunks(Clan clan) { + LinkedHashMap> clanChunks = new LinkedHashMap<>(); + for (Map.Entry entry : clan.getChunkOwnerMap().entrySet()) { + UUID ownerUUID = entry.getValue(); + Chunk chunk = entry.getKey(); + if (!clanChunks.containsKey(ownerUUID)) { + clanChunks.put(ownerUUID, new LinkedList<>()); + } + clanChunks.get(ownerUUID).add(chunk); + } + return clanChunks; + } + + public LinkedList getPlayerChunks(UUID playerUUID) { + LinkedList playerChunks = new LinkedList<>(); + for (Clan clan : clans) { + if (clan.getChunkOwnerMap().containsValue(playerUUID)) { + for (Map.Entry entry : clan.getChunkOwnerMap().entrySet()) { + if (entry.getValue().equals(playerUUID)) { + playerChunks.add(entry.getKey()); + } + } + } + } + return playerChunks; + } + public boolean isLeader(UUID playerUUID) { for (Clan clan : clans) { if (clan.getLeaderUUID().equals(playerUUID)) { @@ -159,6 +194,10 @@ public class Clans { return false; } + public boolean isInClan(UUID playerUUID,Clan clan) { + return clan.getMembers().contains(playerUUID) || clan.getLeaderUUID().equals(playerUUID) || (clan.getViceUUID() != null && clan.getViceUUID().equals(playerUUID)); + } + public Clan getClanByMember(UUID playerUUID) { for (Clan clan : clans) { if (clan.getMembers().contains(playerUUID) || clan.getLeaderUUID().equals(playerUUID) || (clan.getViceUUID() != null && clan.getViceUUID().equals(playerUUID))) { @@ -167,4 +206,24 @@ public class Clans { } return null; } + + public void setClanChunks(Clan playerClan, LinkedHashMap> existingClaims) { + for (Map.Entry> entry : existingClaims.entrySet()) { + UUID ownerUUID = entry.getKey(); + LinkedList chunks = entry.getValue(); + for (Chunk chunk : chunks) { + playerClan.getChunkOwnerMap().put(chunk, ownerUUID); + } + } + playerClan.save(); + } + + public Clan getClanByChunk(Chunk chunk) { + for (Clan clan : clans) { + if (clan.getChunks().contains(chunk)) { + return clan; + } + } + return null; + } }