Added ClaimSystem!

This commit is contained in:
DaTTV 2025-02-18 11:34:36 +01:00
parent b29b691270
commit 3e54c33b2a
7 changed files with 270 additions and 7 deletions

View file

@ -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...");

View file

@ -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("<red>You must be a player to use this command!"));
return true;
}
UUID playerUUID = player.getUniqueId();
if (!clans.isInClan(playerUUID)) {
player.sendMessage(MiniMessage.miniMessage().deserialize("<red>You must be in a clan to claim/unclaim chunks!"));
return true;
} else {
if (label.equalsIgnoreCase("claim")) {
Clan playerClan = clans.getClanByMember(playerUUID);
LinkedHashMap<UUID, LinkedList<Chunk>> existingClaims=clans.getClanChunks(playerClan);
if (existingClaims.containsKey(playerUUID)) {
LinkedList<Chunk> playerClaims = existingClaims.get(playerUUID);
int MAX_CLAIMS = 50;
if (playerClaims.size() >= MAX_CLAIMS) {
player.sendMessage(MiniMessage.miniMessage().deserialize("<red>You have reached the maximum amount of claims!"));
} else {
Chunk playerChunk = player.getLocation().getChunk();
playerClaims.add(playerChunk);
player.sendMessage(MiniMessage.miniMessage().deserialize("<green>Claimed chunk!"));
existingClaims.put(playerUUID, playerClaims);
clans.setClanChunks(playerClan, existingClaims);
}
return true;
}
} else if (label.equalsIgnoreCase("unclaim")) {
Clan playerClan = clans.getClanByMember(playerUUID);
LinkedHashMap<UUID, LinkedList<Chunk>> existingClaims=clans.getClanChunks(playerClan);
if (existingClaims.containsKey(playerUUID)) {
LinkedList<Chunk> playerClaims = existingClaims.get(playerUUID);
Chunk playerChunk = player.getLocation().getChunk();
if (playerClaims.contains(playerChunk)) {
playerClaims.remove(playerChunk);
player.sendMessage(MiniMessage.miniMessage().deserialize("<green>Unclaimed chunk!"));
existingClaims.put(playerUUID, playerClaims);
clans.setClanChunks(playerClan, existingClaims);
} else {
player.sendMessage(MiniMessage.miniMessage().deserialize("<red>You do not own this chunk!"));
}
return true;
}
}
}
return false;
}
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
return List.of();
}
}

View file

@ -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<String> alias) {
this(command, null, null, null, alias);
}
public SimpleCommand(String command, String usage, String description) {
this(command, usage, description, null, null);
}

View file

@ -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(
"<red>You left the claim of <white>" + oldClan.getName() + "</white>!</red>"
)
);
}
if (newClan != null && (!newClan.equals(oldClan))) {
player.sendActionBar(
MiniMessage.miniMessage().deserialize(
"<red>Terretorry of <white>" + newClan.getName() + "</white> - <white>" +
Bukkit.getOfflinePlayer(newClan.getChunkOwnerMap().get(toChunk)).getName() +
"!</white></red>"
)
);
}
}
}

View file

@ -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<UUID, LinkedList<Chunk>> getClanChunks(Clan clan) {
LinkedHashMap<UUID, LinkedList<Chunk>> clanChunks = new LinkedHashMap<>();
for (Map.Entry<Chunk, UUID> 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<Chunk> getPlayerChunks(UUID playerUUID) {
LinkedList<Chunk> playerChunks = new LinkedList<>();
for (Clan clan : clans) {
if (clan.getChunkOwnerMap().containsValue(playerUUID)) {
for (Map.Entry<Chunk, UUID> 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<UUID, LinkedList<Chunk>> existingClaims) {
for (Map.Entry<UUID, LinkedList<Chunk>> entry : existingClaims.entrySet()) {
UUID ownerUUID = entry.getKey();
LinkedList<Chunk> 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;
}
}