Untitled

 avatar
unknown
plain_text
5 months ago
26 kB
5
Indexable
package org.ogfactions.factions;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;

import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldguard.WorldGuard;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.flags.Flags;
import com.sk89q.worldguard.protection.flags.RegionGroup;
import com.sk89q.worldguard.protection.flags.StateFlag;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import com.sk89q.worldguard.protection.regions.RegionContainer;

import net.md_5.bungee.api.ChatColor;

public class Main extends JavaPlugin implements Listener {
    private HashMap<UUID, Long> inviteMap = new HashMap<>();

    @Override
    public void onEnable() {
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
        saveDefaultConfig();

        Bukkit.getScheduler().runTaskTimer(this, () -> cleanUpExpiredInvites(), 0L, 1200L); // 1200 ticks = 1 minute
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("faction") || cmd.getName().equalsIgnoreCase("f")) {
            if (sender instanceof Player) {
                Player player = (Player) sender;
                UUID playerUUID = player.getUniqueId();

                if (args.length == 0) {
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &aᴄᴏᴍᴍᴀɴᴅs"));
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &f/f create <name> &7(Create your own faction)"));
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &f/f disband &7(Disband your faction)"));
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &f/f invite <player> &7(Invite a player to your faction)"));
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &f/f kick <player> &7(Kick a player from your faction)"));
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &f/f join <name> &7(Join another player's faction)"));
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &f/f leave &7(Leave your current faction)"));
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &f/f claim &7(Claim land for your faction)"));  // /f claim command
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &f/f unclaim &7(Unclaim land for your faction)"));
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &f/f power &7(View your current power level)"));
                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &f/f info <name/player> &7(View faction or player information)"));
                } else if (args.length == 1) {
                    if (args[0].equalsIgnoreCase("power")) {
                        // Get player's personal power
                        int playerPower = getConfig().getInt("Power." + playerUUID.toString(), 0);
                        player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &aYour Power: &e" + playerPower));
                    } else if(args[0].equalsIgnoreCase("leave")) {
	                    String playerFaction = getFaction(player.getUniqueId());
	                    if(playerFaction != null) {
	                        if(getConfig().getString("Factions." + playerFaction + ".Owner").equals(player.getUniqueId().toString())) {
	                            player.sendMessage(ChatColor.RED + "You cannot leave your own faction. Use /f disband to disband it.");
	                        } else {
	                            List<String> playersInFaction = getConfig().getStringList("Factions." + playerFaction + ".Players");
	                            playersInFaction.remove(player.getUniqueId().toString());
	                            getConfig().set("Factions." + playerFaction + ".Players", playersInFaction);
	                            saveConfig();

	                            player.sendMessage(ChatColor.GREEN + "You have left the faction " + playerFaction + ".");
	                            Bukkit.broadcastMessage(ChatColor.YELLOW + player.getName() + " has left the faction " + playerFaction + "!");
	                        }
	                    } else {
	                        player.sendMessage(ChatColor.RED + "You are not part of any faction.");
	                    }
	                } else if (args[0].equalsIgnoreCase("claim")) {
                        // Claim land for the faction
                        String playerFaction = getFaction(playerUUID);
                        if (playerFaction == null) {
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &cYou are not part of a faction."));
                            return true;
                        }

                        int totalPower = getTotalFactionPower(playerFaction);
                        List<String> claimedChunks = getConfig().getStringList("Factions." + playerFaction + ".Claims");

                        // Calculate how many chunks the faction can claim
                        int maxClaims = (int) (totalPower / 2.5);
                        if (claimedChunks.size() >= maxClaims) {
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &cYou don't have enough power to claim more chunks."));
                            return true;
                        }

                        // Get the chunk the player is standing in
                        Chunk chunk = player.getLocation().getChunk();
                        String regionName = playerFaction + "_" + chunk.getX() + "_" + chunk.getZ();

                        RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
                        RegionManager regions = container.get(BukkitAdapter.adapt(player.getWorld()));

                        if (regions == null) {
                            player.sendMessage(ChatColor.RED + "WorldGuard regions not found.");
                            return true;
                        }

                        // Check if the chunk is already claimed
                        if (regions.hasRegion(regionName)) {
                            player.sendMessage(ChatColor.RED + "This chunk is already claimed.");
                            return true;
                        }

                        // Define the region as a cuboid based on the chunk
                        int bx = chunk.getX() << 4;
                        int bz = chunk.getZ() << 4;
                        ProtectedCuboidRegion region = new ProtectedCuboidRegion(
                                regionName,
                                BlockVector3.at(bx, 0, bz),
                                BlockVector3.at(bx + 15, player.getWorld().getMaxHeight(), bz + 15)
                        );

                        // Add the region and set the owner
                        regions.addRegion(region);
                        region.getOwners().addPlayer(playerUUID);

                        // Set flags with member permissions
                        region.setFlag(Flags.BUILD, StateFlag.State.ALLOW);
                        region.setFlag(Flags.BLOCK_BREAK, StateFlag.State.ALLOW);
                        region.setFlag(Flags.BUILD.getRegionGroupFlag(), RegionGroup.MEMBERS);
                        region.setFlag(Flags.BLOCK_BREAK.getRegionGroupFlag(), RegionGroup.MEMBERS);

                        // Update the config with the claimed chunk
                        String chunkKey = chunk.getX() + "," + chunk.getZ();
                        claimedChunks.add(chunkKey);
                        getConfig().set("Factions." + playerFaction + ".Claims", claimedChunks);
                        saveConfig();

                        player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &aChunk claimed successfully for your faction."));
                    } else if (args[0].equalsIgnoreCase("unclaim")) {
                        // Handle unclaim
                        String playerFaction = getFaction(playerUUID);
                        if (playerFaction == null) {
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &cYou are not part of a faction."));
                            return true;
                        }

                        Chunk chunk = player.getLocation().getChunk();
                        String chunkKey = chunk.getX() + "," + chunk.getZ();
                        List<String> claimedChunks = getConfig().getStringList("Factions." + playerFaction + ".Claims");

                        if (claimedChunks.contains(chunkKey)) {
                            claimedChunks.remove(chunkKey);
                            getConfig().set("Factions." + playerFaction + ".Claims", claimedChunks);
                            saveConfig();
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &aChunk unclaimed successfully."));
                        } else {
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &cThis chunk is not claimed by your faction."));
                        }
                    }
                } else if (args.length == 2) {
                    if (args[0].equalsIgnoreCase("create")) {
                        String name = args[1].toLowerCase();
                        if (name.length() > 6) {
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &aғᴀᴄᴛɪᴏɴ ᴄʀᴇᴀᴛɪᴏɴ"));
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &4Names cannot exceed 6 characters!"));
                            return true;
                        }

                        if (getConfig().getConfigurationSection("Factions") == null) {
                            getConfig().createSection("Factions");
                        }

                        if (getConfig().getString("Factions." + name.toLowerCase()) != null) {
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &aғᴀᴄᴛɪᴏɴ ᴄʀᴇᴀᴛɪᴏɴ"));
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &4This team name is already taken!"));
                            return true;
                        }

                        for (String faction : getConfig().getConfigurationSection("Factions").getKeys(false)) {
                            List<String> playersInFaction = getConfig().getStringList("Factions." + faction + ".Players");
                            String factionOwner = getConfig().getString("Factions." + faction + ".Owner");

                            if (playersInFaction.contains(playerUUID.toString())) {
                                player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &aғᴀᴄᴛɪᴏɴ ᴄʀᴇᴀᴛɪᴏɴ"));
                                player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &4You are already in a faction!"));
                                return true;
                            }

                            if (factionOwner != null && factionOwner.equals(playerUUID.toString())) {
                                player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &aғᴀᴄᴛɪᴏɴ ᴄʀᴇᴀᴛɪᴏɴ"));
                                player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &4You already own a faction!"));
                                return true;
                            }
                        }

                        getConfig().set("Factions." + name.toLowerCase() + ".Owner", player.getUniqueId().toString());
                        getConfig().set("Factions." + name.toLowerCase() + ".Players", new ArrayList<>());
                        getConfig().set("Factions." + name.toLowerCase() + ".Claims", new ArrayList<>());
                        saveConfig();

                        player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &aFaction " + "&e" + name.toLowerCase() + " &acreated successfully!"));
                        Bukkit.broadcastMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &e" + player.getName() + " &ahas created the faction &e" + name.toLowerCase()));
                    }

                    if (args[0].equalsIgnoreCase("info")) {
                        String targetName = args[1].toLowerCase();
                        if (getConfig().getConfigurationSection("Factions." + targetName) != null) {
                            String factionOwner = getConfig().getString("Factions." + targetName + ".Owner");
                            List<String> playersInFaction = getConfig().getStringList("Factions." + targetName + ".Players");
                            List<String> factionClaims = getConfig().getStringList("Factions." + targetName + ".Claims");

                            int totalFactionPower = getTotalFactionPower(targetName);
                            int maxClaims = (int) (totalFactionPower / 2.5);

                            List<String> playerNames = new ArrayList<>();
                            for (String uuid : playersInFaction) {
                                OfflinePlayer factionMember = Bukkit.getOfflinePlayer(UUID.fromString(uuid));
                                playerNames.add(factionMember.getName());
                            }

                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &aFaction &e" + targetName));
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &fOwner: &e" + Bukkit.getOfflinePlayer(UUID.fromString(factionOwner)).getName()));
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &fPlayers: &e" + (playerNames.isEmpty() ? "None" : String.join(", ", playerNames))));
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &fClaims: &e" + factionClaims.size()));
                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &fTotal Power: &e" + (factionClaims.size() * 2.5) + "/" + totalFactionPower));

                            if (!factionClaims.isEmpty()) {
                                for (String claim : factionClaims) {
                                    String[] parts = claim.split(",");
                                    int x = Integer.parseInt(parts[0]);
                                    int z = Integer.parseInt(parts[1]);
                                    player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a➥ &fClaim: [X " + x + ", Z " + z + "]"));
                                }
                            }
                        }
                    }

                    if (args[0].equalsIgnoreCase("invite")) {
                        Player target = Bukkit.getPlayer(args[1]);
                        if (target != null && target.isOnline()) {
                            UUID targetUUID = target.getUniqueId();
                            if (inviteMap.containsKey(targetUUID)) {
                                player.sendMessage(ChatColor.RED + "That player is already invited!");
                            } else {
                                inviteMap.put(targetUUID, System.currentTimeMillis());
                                player.sendMessage(ChatColor.GREEN + "You have invited " + target.getName() + " to your faction.");
                                target.sendMessage(ChatColor.GREEN + "You have been invited to join the faction " + getFaction(playerUUID));

                                List<String> invitedPlayers = getConfig().getStringList("Factions." + getFaction(playerUUID) + ".Invites");
                                invitedPlayers.add(targetUUID.toString());
                                getConfig().set("Factions." + getFaction(playerUUID) + ".Invites", invitedPlayers);
                                saveConfig();
                            }
                        } else {
                            player.sendMessage(ChatColor.RED + "That player is not online.");
                        }
                    }
                    
                    if(args[0].equalsIgnoreCase("join")) {
	                    String factionName = args[1].toLowerCase();
	                    if(getConfig().getConfigurationSection("Factions." + factionName) != null) {
	                        List<String> invitedPlayers = getConfig().getStringList("Factions." + factionName + ".Invites");
	                        if(invitedPlayers.contains(playerUUID.toString())) {
	                            List<String> playersInFaction = getConfig().getStringList("Factions." + factionName + ".Players");
	                            playersInFaction.add(playerUUID.toString());
	                            getConfig().set("Factions." + factionName + ".Players", playersInFaction);
	                            invitedPlayers.remove(playerUUID.toString());
	                            getConfig().set("Factions." + factionName + ".Invites", invitedPlayers);
	                            saveConfig();

	                            player.sendMessage(ChatColor.GREEN + "You have joined the faction " + factionName + "!");
	                            Bukkit.broadcastMessage(ChatColor.YELLOW + player.getName() + " has joined the faction " + factionName + "!");
	                        } else {
	                            player.sendMessage(ChatColor.RED + "You haven't been invited to that faction.");
	                        }
	                    } else {
	                        player.sendMessage(ChatColor.RED + "That faction does not exist.");
	                    }
	                }

                    if (args[0].equalsIgnoreCase("kick")) {
                        if (args.length == 2) {
                            String playerFaction = getFaction(playerUUID);
                            if (playerFaction != null) {
                                if (getConfig().getString("Factions." + playerFaction + ".Owner").equals(playerUUID.toString())) {
                                    OfflinePlayer target = Bukkit.getOfflinePlayer(args[1]);
                                    if (target.hasPlayedBefore()) {
                                        UUID targetUUID = target.getUniqueId();
                                        List<String> playersInFaction = getConfig().getStringList("Factions." + playerFaction + ".Players");

                                        if (playersInFaction.contains(targetUUID.toString())) {
                                            playersInFaction.remove(targetUUID.toString());
                                            getConfig().set("Factions." + playerFaction + ".Players", playersInFaction);
                                            saveConfig();

                                            player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &aYou have kicked &e" + target.getName() + " &afrom the faction &e" + playerFaction + "&a."));
                                            if (target.isOnline()) {
                                                target.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &cYou have been kicked from the faction &e" + playerFaction + "&c!"));
                                            }
                                            Bukkit.broadcastMessage(ChatColor.translateAlternateColorCodes('&', "&eᴏɢ &bғᴀᴄᴛɪᴏɴs &7| &e" + target.getName() + " &ahas been kicked from the faction &e" + playerFaction + "&a!"));
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return true;
    }

    private String getFaction(UUID playerUUID) {
        for (String faction : getConfig().getConfigurationSection("Factions").getKeys(false)) {
            List<String> playersInFaction = getConfig().getStringList("Factions." + faction + ".Players");
            String factionOwner = getConfig().getString("Factions." + faction + ".Owner");

            if (playersInFaction.contains(playerUUID.toString()) || (factionOwner != null && factionOwner.equals(playerUUID.toString()))) {
                return faction;
            }
        }
        return null;
    }

    public int getTotalFactionPower(String factionName) {
        int totalFactionPower = 0;
        String factionOwner = getConfig().getString("Factions." + factionName + ".Owner");
        List<String> playersInFaction = getConfig().getStringList("Factions." + factionName + ".Players");

        if (factionOwner != null) {
            totalFactionPower += getConfig().getInt("Power." + factionOwner, 0);
        }

        for (String uuid : playersInFaction) {
            totalFactionPower += getConfig().getInt("Power." + uuid, 0);
        }

        return totalFactionPower;
    }

    private void cleanUpExpiredInvites() {
        long currentTime = System.currentTimeMillis();
        inviteMap.entrySet().removeIf(entry -> currentTime - entry.getValue() > 300000); // 5 minutes
    }

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        UUID playerUUID = player.getUniqueId();

        if (!player.hasPlayedBefore()) {
            getConfig().set("Power." + playerUUID.toString(), 10);
            saveConfig();
        }

        String playerFaction = getFaction(playerUUID);
        if (playerFaction != null) {
            updateFactionRegionMembers(playerFaction);
        }
    }

    public void updateFactionRegionMembers(String factionName) {
        List<String> factionMembers = new ArrayList<>(getConfig().getStringList("Factions." + factionName + ".Players"));
        factionMembers.add(getConfig().getString("Factions." + factionName + ".Owner")); 
        factionMembers.add(getConfig().getString("Factions." + factionName + ".Players")); 

        List<UUID> memberUUIDs = new ArrayList<>();
        for (String member : factionMembers) {
            memberUUIDs.add(UUID.fromString(member));
        }

        List<String> claimedChunks = getConfig().getStringList("Factions." + factionName + ".Claims");

        if (!claimedChunks.isEmpty()) {
            RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
            for (String claim : claimedChunks) {
                String[] parts = claim.split(",");
                int x = Integer.parseInt(parts[0]);
                int z = Integer.parseInt(parts[1]);
                String regionName = factionName + "_" + x + "_" + z;

                RegionManager regionManager = container.get(BukkitAdapter.adapt(Bukkit.getWorld("world")));
                if (regionManager != null) {
                    ProtectedRegion region = regionManager.getRegion(regionName);
                    if (region != null) {
                        region.getOwners().clear(); 
                        for (UUID uuid : memberUUIDs) {
                            region.getOwners().addPlayer(uuid); 
                        }
                    }
                }
            }
        }
    }

    public void onPlayerLeaveFaction(Player player, String factionName) {
        List<String> playersInFaction = getConfig().getStringList("Factions." + factionName + ".Players");
        playersInFaction.remove(player.getUniqueId().toString());
        getConfig().set("Factions." + factionName + ".Players", playersInFaction);
        saveConfig();

        updateFactionRegionMembers(factionName); 
    }
}
Editor is loading...
Leave a Comment