mirror of
https://github.com/Freezy-Studios/BlazeSMP.git
synced 2025-04-21 19:44:05 +02:00
Fixed bugs
This commit is contained in:
parent
aa7f495488
commit
21e0194f6b
10 changed files with 157 additions and 45 deletions
|
@ -13,6 +13,7 @@ import org.bukkit.configuration.file.FileConfiguration;
|
||||||
import org.bukkit.plugin.PluginManager;
|
import org.bukkit.plugin.PluginManager;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
import org.bukkit.scoreboard.Team;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
public final class BlazeSMP extends JavaPlugin {
|
public final class BlazeSMP extends JavaPlugin {
|
||||||
|
@ -82,7 +83,7 @@ public final class BlazeSMP extends JavaPlugin {
|
||||||
pm.registerEvents(new ChunkInventoryListener(), this);
|
pm.registerEvents(new ChunkInventoryListener(), this);
|
||||||
pm.registerEvents(new PressurePlateListener(), this);
|
pm.registerEvents(new PressurePlateListener(), this);
|
||||||
pm.registerEvents(new PlayerVsPlayerListener(clans), this);
|
pm.registerEvents(new PlayerVsPlayerListener(clans), this);
|
||||||
pm.registerEvents(new ProtectedBlockListener(), this);
|
//pm.registerEvents(new ProtectedBlockListener(), this);
|
||||||
this.log.info("Registered EventListeners!");
|
this.log.info("Registered EventListeners!");
|
||||||
|
|
||||||
this.log.info("Starting Timer tasks...");
|
this.log.info("Starting Timer tasks...");
|
||||||
|
@ -113,6 +114,10 @@ public final class BlazeSMP extends JavaPlugin {
|
||||||
this.clans.saveAllClans();
|
this.clans.saveAllClans();
|
||||||
this.log.info("Saved Clans!");
|
this.log.info("Saved Clans!");
|
||||||
|
|
||||||
|
this.log.info("Clearing Teams...");
|
||||||
|
getServer().getScoreboardManager().getMainScoreboard().getTeams().forEach(Team::unregister);
|
||||||
|
this.log.info("Cleared Teams!");
|
||||||
|
|
||||||
this.log.info("Disabling BlazeSMP!");
|
this.log.info("Disabling BlazeSMP!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ public class ClaimCommand extends SimpleCommand {
|
||||||
player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("error.chunk_already_claimed")));
|
player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("error.chunk_already_claimed")));
|
||||||
} else {
|
} else {
|
||||||
// claim too close to spawn 8 chunks
|
// claim too close to spawn 8 chunks
|
||||||
if (playerChunk.getX() < 8 && playerChunk.getZ() < 8) {
|
if (player.getX() < 152 && player.getZ() < 152) {
|
||||||
player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("error.chunk_too_close_to_spawn")));
|
player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("error.chunk_too_close_to_spawn")));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,8 +23,7 @@ public class DiscordCommand extends SimpleCommand {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
||||||
if (sender instanceof Player) {
|
if (sender instanceof Player player) {
|
||||||
Player player = (Player) sender;
|
|
||||||
Component message = MiniMessage.miniMessage().deserialize("<click:open_url:'" + discordUrl + "'><gradient:#00ff00:#0000ff><b>Click here to join our Discord!</b></gradient></click>");
|
Component message = MiniMessage.miniMessage().deserialize("<click:open_url:'" + discordUrl + "'><gradient:#00ff00:#0000ff><b>Click here to join our Discord!</b></gradient></click>");
|
||||||
player.sendMessage(message);
|
player.sendMessage(message);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
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.manager.L4M4;
|
||||||
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
|
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.List;
|
||||||
|
|
||||||
|
public class ReloadCommand extends SimpleCommand {
|
||||||
|
public ReloadCommand() {
|
||||||
|
super("reloadconf");
|
||||||
|
}
|
||||||
|
|
||||||
|
@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(L4M4.get("error.not_a_player")));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
BlazeSMP.getInstance().getClans().saveAllClans();
|
||||||
|
BlazeSMP.getInstance().saveConfig();
|
||||||
|
BlazeSMP.getInstance().reloadConfig();
|
||||||
|
BlazeSMP.getInstance().getProtectedBlocks().save();
|
||||||
|
BlazeSMP.getInstance().getHomes().save();
|
||||||
|
player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("config.reloaded")));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
||||||
|
return List.of();
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ package me.freezy.plugins.papermc.blazesmp.listener;
|
||||||
|
|
||||||
import me.freezy.plugins.papermc.blazesmp.BlazeSMP;
|
import me.freezy.plugins.papermc.blazesmp.BlazeSMP;
|
||||||
import me.freezy.plugins.papermc.blazesmp.module.Clan;
|
import me.freezy.plugins.papermc.blazesmp.module.Clan;
|
||||||
|
import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
|
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
|
||||||
|
@ -89,6 +90,7 @@ public class ChunkInventoryListener implements Listener {
|
||||||
Component itemName = MiniMessage.miniMessage().deserialize("<aqua>Chunk [" + chunk.getX() + ", " + chunk.getZ() + "]</aqua>");
|
Component itemName = MiniMessage.miniMessage().deserialize("<aqua>Chunk [" + chunk.getX() + ", " + chunk.getZ() + "]</aqua>");
|
||||||
skullMeta.displayName(itemName);
|
skullMeta.displayName(itemName);
|
||||||
List<Component> lore = new ArrayList<>();
|
List<Component> lore = new ArrayList<>();
|
||||||
|
lore.add(MiniMessage.miniMessage().deserialize(L4M4.get("chunk.unclaim_lore")));
|
||||||
lore.add(MiniMessage.miniMessage().deserialize("<gray>World: " + chunk.getWorld().getName() + "</gray>"));
|
lore.add(MiniMessage.miniMessage().deserialize("<gray>World: " + chunk.getWorld().getName() + "</gray>"));
|
||||||
lore.add(MiniMessage.miniMessage().deserialize("<gray>Owner: " + ownerPlayer.getName() + "</gray>"));
|
lore.add(MiniMessage.miniMessage().deserialize("<gray>Owner: " + ownerPlayer.getName() + "</gray>"));
|
||||||
lore.add(MiniMessage.miniMessage().deserialize("<gray>Index: " + (i + 1) + "</gray>"));
|
lore.add(MiniMessage.miniMessage().deserialize("<gray>Index: " + (i + 1) + "</gray>"));
|
||||||
|
@ -128,7 +130,7 @@ public class ChunkInventoryListener implements Listener {
|
||||||
if (!(event.getWhoClicked() instanceof Player player)) return;
|
if (!(event.getWhoClicked() instanceof Player player)) return;
|
||||||
Component invTitle = event.getView().title();
|
Component invTitle = event.getView().title();
|
||||||
Component expectedTitle = MiniMessage.miniMessage().deserialize(
|
Component expectedTitle = MiniMessage.miniMessage().deserialize(
|
||||||
me.freezy.plugins.papermc.blazesmp.module.manager.L4M4.get("chunk.title")
|
L4M4.get("chunk.title")
|
||||||
);
|
);
|
||||||
if (!PlainTextComponentSerializer.plainText().serialize(invTitle)
|
if (!PlainTextComponentSerializer.plainText().serialize(invTitle)
|
||||||
.equals(PlainTextComponentSerializer.plainText().serialize(expectedTitle))) {
|
.equals(PlainTextComponentSerializer.plainText().serialize(expectedTitle))) {
|
||||||
|
@ -164,11 +166,18 @@ public class ChunkInventoryListener implements Listener {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Nutze den zentralen Nachrichtentext für Klicks
|
// Nutze den zentralen Nachrichtentext für Klicks
|
||||||
String msg = String.format(
|
String[] parts = displayName.substring(1, displayName.length() - 1).split(",");
|
||||||
me.freezy.plugins.papermc.blazesmp.module.manager.L4M4.get("chunk.clicked"),
|
int x = Integer.parseInt(parts[0].trim());
|
||||||
displayName
|
int y = Integer.parseInt(parts[1].trim());
|
||||||
);
|
Chunk chunk = Objects.requireNonNull(Bukkit.getWorld("world")).getChunkAt(x, y);
|
||||||
player.sendMessage(MiniMessage.miniMessage().deserialize(msg));
|
if (clan.getChunkOwnerMap().containsKey(chunk)) {
|
||||||
|
clan.getChunkOwnerMap().remove(chunk);
|
||||||
|
clan.save();
|
||||||
|
player.sendMessage(MiniMessage.miniMessage().deserialize(
|
||||||
|
L4M4.get("chunk.unclaimed")
|
||||||
|
));
|
||||||
|
openChunksMenu(player, chunkEntries, currentPage, totalPages, itemsPerPage, clan);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ package me.freezy.plugins.papermc.blazesmp.listener;
|
||||||
|
|
||||||
import io.papermc.paper.event.player.AsyncChatEvent;
|
import io.papermc.paper.event.player.AsyncChatEvent;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.format.TextColor;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
@ -11,25 +12,16 @@ public class PlayerChatListener implements Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onChat(AsyncChatEvent event) {
|
public void onChat(AsyncChatEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
Team team = player.getScoreboard().getEntryTeam(player.getName());
|
|
||||||
|
|
||||||
Component prefix = Component.empty();
|
|
||||||
Component suffix = Component.empty();
|
|
||||||
|
|
||||||
if (team != null) {
|
|
||||||
prefix = team.prefix();
|
|
||||||
suffix = team.suffix();
|
|
||||||
}
|
|
||||||
|
|
||||||
Component messageComponent = event.message();
|
Component messageComponent = event.message();
|
||||||
|
|
||||||
Component chatComponent = Component.empty()
|
Component chatComponent = Component.empty()
|
||||||
//.append(prefix)
|
.append(player.playerListName())
|
||||||
.append(player.teamDisplayName())
|
|
||||||
//.append(suffix)
|
|
||||||
.append(Component.text(": "))
|
.append(Component.text(": "))
|
||||||
.append(messageComponent);
|
.append(messageComponent);
|
||||||
|
|
||||||
|
player.sendMessage(player.playerListName());
|
||||||
|
|
||||||
event.renderer((source, sourceDisplayName, msg, viewer) -> chatComponent);
|
event.renderer((source, sourceDisplayName, msg, viewer) -> chatComponent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,20 +2,25 @@ package me.freezy.plugins.papermc.blazesmp.listener;
|
||||||
|
|
||||||
import me.freezy.plugins.papermc.blazesmp.manager.PlayerManager;
|
import me.freezy.plugins.papermc.blazesmp.manager.PlayerManager;
|
||||||
import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4;
|
import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.format.TextColor;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.scoreboard.Team;
|
||||||
|
|
||||||
public class PlayerJoinListener implements Listener {
|
public class PlayerJoinListener implements Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onJoin(PlayerJoinEvent event) {
|
public void onJoin(PlayerJoinEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
new PlayerManager().setPlayerTeam(player);
|
new PlayerManager().setPlayerTeam(player);
|
||||||
|
Team team = player.getScoreboard().getEntryTeam(player.getName());
|
||||||
|
|
||||||
// Verwende den zentral konfigurierten Join-Text aus der JSON-Datei
|
// Verwende den zentral konfigurierten Join-Text aus der JSON-Datei
|
||||||
|
assert team != null;
|
||||||
event.joinMessage(MiniMessage.miniMessage().deserialize(L4M4.get("player.join"))
|
event.joinMessage(MiniMessage.miniMessage().deserialize(L4M4.get("player.join"))
|
||||||
.append(player.teamDisplayName()));
|
.append(player.playerListName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,11 @@ import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4;
|
||||||
import me.freezy.plugins.papermc.blazesmp.module.manager.ProtectedBlocks;
|
import me.freezy.plugins.papermc.blazesmp.module.manager.ProtectedBlocks;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
import org.bukkit.*;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.block.*;
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.Container;
|
||||||
import org.bukkit.entity.HumanEntity;
|
import org.bukkit.entity.HumanEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
|
@ -30,49 +33,61 @@ public class ProtectedBlockListener implements Listener {
|
||||||
private final ProtectedBlocks protectedBlocks = BlazeSMP.getInstance().getProtectedBlocks();
|
private final ProtectedBlocks protectedBlocks = BlazeSMP.getInstance().getProtectedBlocks();
|
||||||
|
|
||||||
// Supported storage block types
|
// Supported storage block types
|
||||||
private final Set<Material> STORAGE_BLOCKS = Set.of(
|
private static final Set<Material> STORAGE_BLOCKS = Set.of(
|
||||||
Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL,
|
Material.CHEST, Material.TRAPPED_CHEST, Material.BARREL,
|
||||||
Material.HOPPER, Material.DROPPER, Material.DISPENSER,
|
Material.HOPPER, Material.DROPPER, Material.DISPENSER,
|
||||||
Material.FURNACE, Material.BLAST_FURNACE, Material.SMOKER
|
Material.FURNACE, Material.BLAST_FURNACE, Material.SMOKER
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prevents items from being transferred into protected storages.
|
||||||
|
*/
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onItemTransferHopperEvent(InventoryMoveItemEvent event) {
|
public void onItemTransferHopperEvent(InventoryMoveItemEvent event) {
|
||||||
Block destinationBlock = Objects.requireNonNull(event.getDestination().getLocation()).getBlock();
|
Location destLocation = event.getDestination().getLocation();
|
||||||
|
if (destLocation == null) return;
|
||||||
|
Block destinationBlock = destLocation.getBlock();
|
||||||
if (isProtected(destinationBlock)) {
|
if (isProtected(destinationBlock)) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handles player interactions with storage blocks.
|
||||||
|
* Supports locking, unlocking, linking keys, and opening GUIs.
|
||||||
|
*/
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBlockInteractEvent(PlayerInteractEvent event) {
|
public void onBlockInteractEvent(PlayerInteractEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
Block block = event.getClickedBlock();
|
Block block = event.getClickedBlock();
|
||||||
if (block == null || !STORAGE_BLOCKS.contains(block.getType())) return;
|
|
||||||
|
if (block == null || !STORAGE_BLOCKS.contains(block.getType())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ItemStack mainHandItem = player.getInventory().getItemInMainHand();
|
ItemStack mainHandItem = player.getInventory().getItemInMainHand();
|
||||||
ProtectedBlock protectedBlock = getProtectedBlock(block);
|
ProtectedBlock protectedBlock = getProtectedBlock(block);
|
||||||
|
|
||||||
// Owner (if the block is locked) can always access the management GUI.
|
// Owner can manage keys with shift-right-click if the block is already locked.
|
||||||
if (player.isSneaking() && protectedBlock != null &&
|
if (player.isSneaking() && protectedBlock != null &&
|
||||||
protectedBlock.owner().equals(player.getUniqueId())) {
|
protectedBlock.owner().equals(player.getUniqueId())) {
|
||||||
openManageKeysGUI(player, block);
|
openManageKeysGUI(player, block);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shift + Right-click with a trial key: Relink the key to the new container.
|
// Shift + Right-click with a valid trial key relinks the key to the new container.
|
||||||
if (player.isSneaking() && isValidKey(mainHandItem)) {
|
if (player.isSneaking() && isValidKey(mainHandItem)) {
|
||||||
relinkKey(player, mainHandItem, block);
|
relinkKey(player, mainHandItem, block);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shift + Right-click without a key (and if the container is not locked) → open lock GUI.
|
// Shift + Right-click on an unlocked container opens the lock GUI.
|
||||||
if (player.isSneaking() && protectedBlock == null) {
|
if (player.isSneaking() && protectedBlock == null) {
|
||||||
openLockGUI(player, block);
|
openLockGUI(player, block);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normal right-click with a valid key: open the container inventory.
|
// Normal right-click: if a valid key is held for a locked container, open the inventory.
|
||||||
if (protectedBlock != null && isValidKey(mainHandItem, protectedBlock.key())) {
|
if (protectedBlock != null && isValidKey(mainHandItem, protectedBlock.key())) {
|
||||||
if (block.getState() instanceof Container container) {
|
if (block.getState() instanceof Container container) {
|
||||||
player.openInventory(container.getInventory());
|
player.openInventory(container.getInventory());
|
||||||
|
@ -80,19 +95,24 @@ public class ProtectedBlockListener implements Listener {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normal right-click without a key on a locked container: show locked message.
|
// Normal right-click on a locked container without a valid key shows a locked message.
|
||||||
if (protectedBlock != null) {
|
if (protectedBlock != null) {
|
||||||
String lockedMsg = String.format(L4M4.get("storage.locked"), "minecraft:trial_key");
|
String lockedMsg = String.format(L4M4.get("storage.locked"), "minecraft:trial_key");
|
||||||
player.sendMessage(miniMessage.deserialize(lockedMsg));
|
player.sendMessage(miniMessage.deserialize(lockedMsg));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Opens the lock GUI for a container.
|
||||||
|
* Two trial keys are created and the container is then registered as protected.
|
||||||
|
*/
|
||||||
private void openLockGUI(Player player, Block block) {
|
private void openLockGUI(Player player, Block block) {
|
||||||
String titleRaw = String.format(L4M4.get("storage.lock_gui_title"), block.getType().toString());
|
String titleRaw = String.format(L4M4.get("storage.lock_gui_title"), block.getType().toString());
|
||||||
Inventory lockInventory = Bukkit.createInventory(player, InventoryType.HOPPER,
|
Inventory lockInventory = Bukkit.createInventory(player, InventoryType.HOPPER,
|
||||||
miniMessage.deserialize(titleRaw));
|
miniMessage.deserialize(titleRaw));
|
||||||
|
|
||||||
UUID lockUUID = UUID.randomUUID();
|
UUID lockUUID = UUID.randomUUID();
|
||||||
|
// Create two identical trial keys for symmetry
|
||||||
ItemStack trialKey1 = createTrialKey(lockUUID);
|
ItemStack trialKey1 = createTrialKey(lockUUID);
|
||||||
ItemStack trialKey2 = createTrialKey(lockUUID);
|
ItemStack trialKey2 = createTrialKey(lockUUID);
|
||||||
|
|
||||||
|
@ -100,24 +120,33 @@ public class ProtectedBlockListener implements Listener {
|
||||||
lockInventory.setItem(4, trialKey2);
|
lockInventory.setItem(4, trialKey2);
|
||||||
|
|
||||||
player.openInventory(lockInventory);
|
player.openInventory(lockInventory);
|
||||||
// Save the protected block.
|
// Save the protected block information
|
||||||
protectedBlocks.addBlock(new ProtectedBlock(player.getUniqueId(), lockUUID, block.getLocation()));
|
protectedBlocks.addBlock(new ProtectedBlock(player.getUniqueId(), lockUUID, block.getLocation()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Opens the manage keys GUI for the owner to add or remove keys.
|
||||||
|
*/
|
||||||
private void openManageKeysGUI(Player player, Block block) {
|
private void openManageKeysGUI(Player player, Block block) {
|
||||||
String titleRaw = String.format(L4M4.get("storage.manage_gui_title"), block.getType().toString());
|
String titleRaw = String.format(L4M4.get("storage.manage_gui_title"), block.getType().toString());
|
||||||
Inventory manageKeysInventory = Bukkit.createInventory(player, InventoryType.HOPPER,
|
Inventory manageKeysInventory = Bukkit.createInventory(player, InventoryType.HOPPER,
|
||||||
miniMessage.deserialize(titleRaw));
|
miniMessage.deserialize(titleRaw));
|
||||||
|
|
||||||
|
// Create "Add Key" button
|
||||||
ItemStack addKey = new ItemStack(Material.PAPER);
|
ItemStack addKey = new ItemStack(Material.PAPER);
|
||||||
ItemMeta addKeyMeta = addKey.getItemMeta();
|
ItemMeta addKeyMeta = addKey.getItemMeta();
|
||||||
|
if (addKeyMeta != null) {
|
||||||
addKeyMeta.displayName(miniMessage.deserialize(L4M4.get("storage.add_key")));
|
addKeyMeta.displayName(miniMessage.deserialize(L4M4.get("storage.add_key")));
|
||||||
addKey.setItemMeta(addKeyMeta);
|
addKey.setItemMeta(addKeyMeta);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create "Remove Key" button
|
||||||
ItemStack removeKey = new ItemStack(Material.BARRIER);
|
ItemStack removeKey = new ItemStack(Material.BARRIER);
|
||||||
ItemMeta removeKeyMeta = removeKey.getItemMeta();
|
ItemMeta removeKeyMeta = removeKey.getItemMeta();
|
||||||
|
if (removeKeyMeta != null) {
|
||||||
removeKeyMeta.displayName(miniMessage.deserialize(L4M4.get("storage.remove_key")));
|
removeKeyMeta.displayName(miniMessage.deserialize(L4M4.get("storage.remove_key")));
|
||||||
removeKey.setItemMeta(removeKeyMeta);
|
removeKey.setItemMeta(removeKeyMeta);
|
||||||
|
}
|
||||||
|
|
||||||
manageKeysInventory.setItem(1, addKey);
|
manageKeysInventory.setItem(1, addKey);
|
||||||
manageKeysInventory.setItem(3, removeKey);
|
manageKeysInventory.setItem(3, removeKey);
|
||||||
|
@ -125,20 +154,29 @@ public class ProtectedBlockListener implements Listener {
|
||||||
player.openInventory(manageKeysInventory);
|
player.openInventory(manageKeysInventory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Relinks the provided trial key to the new block.
|
||||||
|
* A new lock UUID is generated and the key’s lore is updated.
|
||||||
|
*/
|
||||||
private void relinkKey(Player player, ItemStack key, Block newBlock) {
|
private void relinkKey(Player player, ItemStack key, Block newBlock) {
|
||||||
UUID newLockUUID = UUID.randomUUID();
|
UUID newLockUUID = UUID.randomUUID();
|
||||||
ItemMeta meta = key.getItemMeta();
|
ItemMeta meta = key.getItemMeta();
|
||||||
if (meta != null) {
|
if (meta != null) {
|
||||||
meta.lore(List.of(
|
List<Component> newLore = List.of(
|
||||||
miniMessage.deserialize(String.format(L4M4.get("storage.linked_to"), newLockUUID.toString())),
|
miniMessage.deserialize(String.format(L4M4.get("storage.linked_to"), newLockUUID.toString())),
|
||||||
miniMessage.deserialize(L4M4.get("storage.not_usable_on_vaults"))
|
miniMessage.deserialize(L4M4.get("storage.not_usable_on_vaults"))
|
||||||
));
|
);
|
||||||
|
meta.lore(newLore);
|
||||||
key.setItemMeta(meta);
|
key.setItemMeta(meta);
|
||||||
}
|
}
|
||||||
protectedBlocks.addBlock(new ProtectedBlock(player.getUniqueId(), newLockUUID, newBlock.getLocation()));
|
protectedBlocks.addBlock(new ProtectedBlock(player.getUniqueId(), newLockUUID, newBlock.getLocation()));
|
||||||
player.sendMessage(miniMessage.deserialize(L4M4.get("storage.link_success")));
|
player.sendMessage(miniMessage.deserialize(L4M4.get("storage.link_success")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prevents any changes in the lock or manage keys GUIs.
|
||||||
|
* Also informs the player that the action was completed.
|
||||||
|
*/
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onInventoryClick(InventoryClickEvent event) {
|
public void onInventoryClick(InventoryClickEvent event) {
|
||||||
String title = event.getView().title().toString();
|
String title = event.getView().title().toString();
|
||||||
|
@ -153,6 +191,10 @@ public class ProtectedBlockListener implements Listener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handles block breaking.
|
||||||
|
* If the block is protected, only the owner can break it.
|
||||||
|
*/
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBlockBreak(BlockBreakEvent event) {
|
public void onBlockBreak(BlockBreakEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
|
@ -170,11 +212,17 @@ public class ProtectedBlockListener implements Listener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prevents explosions from destroying protected storage blocks.
|
||||||
|
*/
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onExplosion(EntityExplodeEvent event) {
|
public void onExplosion(EntityExplodeEvent event) {
|
||||||
event.blockList().removeIf(this::isProtected);
|
event.blockList().removeIf(this::isProtected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper method to create a trial key with linked lock information.
|
||||||
|
*/
|
||||||
private ItemStack createTrialKey(UUID lockUUID) {
|
private ItemStack createTrialKey(UUID lockUUID) {
|
||||||
ItemStack trialKey = new ItemStack(Material.TRIPWIRE_HOOK);
|
ItemStack trialKey = new ItemStack(Material.TRIPWIRE_HOOK);
|
||||||
ItemMeta meta = trialKey.getItemMeta();
|
ItemMeta meta = trialKey.getItemMeta();
|
||||||
|
@ -189,10 +237,16 @@ public class ProtectedBlockListener implements Listener {
|
||||||
return trialKey;
|
return trialKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Validates if the provided item is a trial key.
|
||||||
|
*/
|
||||||
private boolean isValidKey(ItemStack item) {
|
private boolean isValidKey(ItemStack item) {
|
||||||
return item != null && item.getType() == Material.TRIPWIRE_HOOK && item.hasItemMeta();
|
return item != null && item.getType() == Material.TRIPWIRE_HOOK && item.hasItemMeta();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Validates if the provided item is a trial key that is linked to the given lock UUID.
|
||||||
|
*/
|
||||||
private boolean isValidKey(ItemStack item, UUID lockUUID) {
|
private boolean isValidKey(ItemStack item, UUID lockUUID) {
|
||||||
if (!isValidKey(item)) return false;
|
if (!isValidKey(item)) return false;
|
||||||
ItemMeta meta = item.getItemMeta();
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
@ -200,6 +254,9 @@ public class ProtectedBlockListener implements Listener {
|
||||||
return Objects.requireNonNull(meta.lore()).stream().anyMatch(line -> line.contains(Component.text(lockUUID.toString())));
|
return Objects.requireNonNull(meta.lore()).stream().anyMatch(line -> line.contains(Component.text(lockUUID.toString())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the ProtectedBlock associated with the given block, or null if not found.
|
||||||
|
*/
|
||||||
private ProtectedBlock getProtectedBlock(Block block) {
|
private ProtectedBlock getProtectedBlock(Block block) {
|
||||||
return protectedBlocks.getBlocks().stream()
|
return protectedBlocks.getBlocks().stream()
|
||||||
.filter(pb -> pb.location().equals(block.getLocation()))
|
.filter(pb -> pb.location().equals(block.getLocation()))
|
||||||
|
@ -207,6 +264,9 @@ public class ProtectedBlockListener implements Listener {
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Checks if a block is protected.
|
||||||
|
*/
|
||||||
private boolean isProtected(Block block) {
|
private boolean isProtected(Block block) {
|
||||||
return getProtectedBlock(block) != null;
|
return getProtectedBlock(block) != null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,8 +30,9 @@ public class PlayerManager {
|
||||||
public void setPlayerTeam(Player player) {
|
public void setPlayerTeam(Player player) {
|
||||||
Clans clans = BlazeSMP.getInstance().getClans();
|
Clans clans = BlazeSMP.getInstance().getClans();
|
||||||
UUID playerUUID = player.getUniqueId();
|
UUID playerUUID = player.getUniqueId();
|
||||||
player.setScoreboard(player.getServer().getScoreboardManager().getMainScoreboard());
|
|
||||||
Scoreboard scoreboard = player.getScoreboard();
|
Scoreboard scoreboard = player.getScoreboard();
|
||||||
|
if (!scoreboard.equals(player.getServer().getScoreboardManager().getMainScoreboard()))
|
||||||
|
player.setScoreboard(player.getServer().getScoreboardManager().getMainScoreboard());
|
||||||
String teamName;
|
String teamName;
|
||||||
if (clans.isInClan(playerUUID)) {
|
if (clans.isInClan(playerUUID)) {
|
||||||
teamName=clanChars.get(clans.getClanByMember(playerUUID));
|
teamName=clanChars.get(clans.getClanByMember(playerUUID));
|
||||||
|
@ -46,8 +47,7 @@ public class PlayerManager {
|
||||||
teamName="zzzm";
|
teamName="zzzm";
|
||||||
}
|
}
|
||||||
teamName+=generateRandomString();
|
teamName+=generateRandomString();
|
||||||
scoreboard.getTeams().forEach(Team::unregister);
|
Team team = scoreboard.getPlayerTeam(player);
|
||||||
Team team = scoreboard.getTeam(teamName);
|
|
||||||
if (team == null) {
|
if (team == null) {
|
||||||
team = scoreboard.registerNewTeam(teamName);
|
team = scoreboard.registerNewTeam(teamName);
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,6 +105,7 @@
|
||||||
"chunk.navigation.previous": "<green>Previous Page</green>",
|
"chunk.navigation.previous": "<green>Previous Page</green>",
|
||||||
"chunk.navigation.next": "<green>Next Page</green>",
|
"chunk.navigation.next": "<green>Next Page</green>",
|
||||||
"chunk.clicked": "<yellow>You clicked on Chunk item: %s.</yellow>",
|
"chunk.clicked": "<yellow>You clicked on Chunk item: %s.</yellow>",
|
||||||
|
"chunk.unclaim_lore": "<gray>Click to unclaim!</gray>",
|
||||||
|
|
||||||
"claim.entered": "<red>You entered the claim of <white>%s</white>!</red>",
|
"claim.entered": "<red>You entered the claim of <white>%s</white>!</red>",
|
||||||
"claim.territory": "<red>Territory of <white>%s</white> - <white>%s</white>!</red>",
|
"claim.territory": "<red>Territory of <white>%s</white> - <white>%s</white>!</red>",
|
||||||
|
@ -124,7 +125,7 @@
|
||||||
],
|
],
|
||||||
"tablist.footer": [
|
"tablist.footer": [
|
||||||
"<aqua>hosted by merged.games</aqua>",
|
"<aqua>hosted by merged.games</aqua>",
|
||||||
"<c:light_gray>made by BlazeHC Team & Freezy/DaTTV</c>"
|
"<c:gray>made by BlazeHC Team & Freezy/DaTTV</c>"
|
||||||
],
|
],
|
||||||
|
|
||||||
"storage.locked": "<red>This storage is locked! You need a <yellow>%s</yellow> to open it.</red>",
|
"storage.locked": "<red>This storage is locked! You need a <yellow>%s</yellow> to open it.</red>",
|
||||||
|
@ -140,5 +141,7 @@
|
||||||
"storage.action_completed": "<green>Action completed successfully!</green>",
|
"storage.action_completed": "<green>Action completed successfully!</green>",
|
||||||
"storage.removed_lock": "<green>You removed the lock from this storage.</green>",
|
"storage.removed_lock": "<green>You removed the lock from this storage.</green>",
|
||||||
"storage.break_denied": "<red>You cannot break this locked storage!</red>",
|
"storage.break_denied": "<red>You cannot break this locked storage!</red>",
|
||||||
"storage.trial_key": "<gold>Linked Trial Key</gold>"
|
"storage.trial_key": "<gold>Linked Trial Key</gold>",
|
||||||
|
|
||||||
|
"config.reloaded": "<green>Config reloaded!</green>"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue