Fixed bugs

This commit is contained in:
DaTTV 2025-02-20 21:24:20 +01:00
parent aa7f495488
commit 21e0194f6b
10 changed files with 157 additions and 45 deletions

View file

@ -13,6 +13,7 @@ import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.scoreboard.Team;
import org.slf4j.Logger;
public final class BlazeSMP extends JavaPlugin {
@ -82,7 +83,7 @@ public final class BlazeSMP extends JavaPlugin {
pm.registerEvents(new ChunkInventoryListener(), this);
pm.registerEvents(new PressurePlateListener(), 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("Starting Timer tasks...");
@ -113,6 +114,10 @@ public final class BlazeSMP extends JavaPlugin {
this.clans.saveAllClans();
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!");
}
}

View file

@ -56,7 +56,7 @@ public class ClaimCommand extends SimpleCommand {
player.sendMessage(MiniMessage.miniMessage().deserialize(L4M4.get("error.chunk_already_claimed")));
} else {
// 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")));
return true;
}

View file

@ -23,8 +23,7 @@ public class DiscordCommand extends SimpleCommand {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (sender instanceof Player) {
Player player = (Player) sender;
if (sender instanceof Player player) {
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);
} else {

View file

@ -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();
}
}

View file

@ -2,6 +2,7 @@ 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.L4M4;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
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>");
skullMeta.displayName(itemName);
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>Owner: " + ownerPlayer.getName() + "</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;
Component invTitle = event.getView().title();
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)
.equals(PlainTextComponentSerializer.plainText().serialize(expectedTitle))) {
@ -164,11 +166,18 @@ public class ChunkInventoryListener implements Listener {
}
} else {
// Nutze den zentralen Nachrichtentext für Klicks
String msg = String.format(
me.freezy.plugins.papermc.blazesmp.module.manager.L4M4.get("chunk.clicked"),
displayName
);
player.sendMessage(MiniMessage.miniMessage().deserialize(msg));
String[] parts = displayName.substring(1, displayName.length() - 1).split(",");
int x = Integer.parseInt(parts[0].trim());
int y = Integer.parseInt(parts[1].trim());
Chunk chunk = Objects.requireNonNull(Bukkit.getWorld("world")).getChunkAt(x, y);
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);
}
}
}

View file

@ -2,6 +2,7 @@ package me.freezy.plugins.papermc.blazesmp.listener;
import io.papermc.paper.event.player.AsyncChatEvent;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@ -11,25 +12,16 @@ public class PlayerChatListener implements Listener {
@EventHandler
public void onChat(AsyncChatEvent event) {
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 chatComponent = Component.empty()
//.append(prefix)
.append(player.teamDisplayName())
//.append(suffix)
.append(player.playerListName())
.append(Component.text(": "))
.append(messageComponent);
player.sendMessage(player.playerListName());
event.renderer((source, sourceDisplayName, msg, viewer) -> chatComponent);
}
}

View file

@ -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.module.manager.L4M4;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.scoreboard.Team;
public class PlayerJoinListener implements Listener {
@EventHandler
public void onJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
new PlayerManager().setPlayerTeam(player);
Team team = player.getScoreboard().getEntryTeam(player.getName());
// Verwende den zentral konfigurierten Join-Text aus der JSON-Datei
assert team != null;
event.joinMessage(MiniMessage.miniMessage().deserialize(L4M4.get("player.join"))
.append(player.teamDisplayName()));
.append(player.playerListName()));
}
}

View file

@ -6,8 +6,11 @@ import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4;
import me.freezy.plugins.papermc.blazesmp.module.manager.ProtectedBlocks;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.*;
import org.bukkit.block.*;
import org.bukkit.Bukkit;
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.Player;
import org.bukkit.event.EventHandler;
@ -30,49 +33,61 @@ public class ProtectedBlockListener implements Listener {
private final ProtectedBlocks protectedBlocks = BlazeSMP.getInstance().getProtectedBlocks();
// 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.HOPPER, Material.DROPPER, Material.DISPENSER,
Material.FURNACE, Material.BLAST_FURNACE, Material.SMOKER
);
/*
* Prevents items from being transferred into protected storages.
*/
@EventHandler
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)) {
event.setCancelled(true);
}
}
/*
* Handles player interactions with storage blocks.
* Supports locking, unlocking, linking keys, and opening GUIs.
*/
@EventHandler
public void onBlockInteractEvent(PlayerInteractEvent event) {
Player player = event.getPlayer();
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();
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 &&
protectedBlock.owner().equals(player.getUniqueId())) {
openManageKeysGUI(player, block);
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)) {
relinkKey(player, mainHandItem, block);
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) {
openLockGUI(player, block);
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 (block.getState() instanceof Container container) {
player.openInventory(container.getInventory());
@ -80,19 +95,24 @@ public class ProtectedBlockListener implements Listener {
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) {
String lockedMsg = String.format(L4M4.get("storage.locked"), "minecraft:trial_key");
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) {
String titleRaw = String.format(L4M4.get("storage.lock_gui_title"), block.getType().toString());
Inventory lockInventory = Bukkit.createInventory(player, InventoryType.HOPPER,
miniMessage.deserialize(titleRaw));
UUID lockUUID = UUID.randomUUID();
// Create two identical trial keys for symmetry
ItemStack trialKey1 = createTrialKey(lockUUID);
ItemStack trialKey2 = createTrialKey(lockUUID);
@ -100,24 +120,33 @@ public class ProtectedBlockListener implements Listener {
lockInventory.setItem(4, trialKey2);
player.openInventory(lockInventory);
// Save the protected block.
// Save the protected block information
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) {
String titleRaw = String.format(L4M4.get("storage.manage_gui_title"), block.getType().toString());
Inventory manageKeysInventory = Bukkit.createInventory(player, InventoryType.HOPPER,
miniMessage.deserialize(titleRaw));
// Create "Add Key" button
ItemStack addKey = new ItemStack(Material.PAPER);
ItemMeta addKeyMeta = addKey.getItemMeta();
addKeyMeta.displayName(miniMessage.deserialize(L4M4.get("storage.add_key")));
addKey.setItemMeta(addKeyMeta);
if (addKeyMeta != null) {
addKeyMeta.displayName(miniMessage.deserialize(L4M4.get("storage.add_key")));
addKey.setItemMeta(addKeyMeta);
}
// Create "Remove Key" button
ItemStack removeKey = new ItemStack(Material.BARRIER);
ItemMeta removeKeyMeta = removeKey.getItemMeta();
removeKeyMeta.displayName(miniMessage.deserialize(L4M4.get("storage.remove_key")));
removeKey.setItemMeta(removeKeyMeta);
if (removeKeyMeta != null) {
removeKeyMeta.displayName(miniMessage.deserialize(L4M4.get("storage.remove_key")));
removeKey.setItemMeta(removeKeyMeta);
}
manageKeysInventory.setItem(1, addKey);
manageKeysInventory.setItem(3, removeKey);
@ -125,20 +154,29 @@ public class ProtectedBlockListener implements Listener {
player.openInventory(manageKeysInventory);
}
/*
* Relinks the provided trial key to the new block.
* A new lock UUID is generated and the keys lore is updated.
*/
private void relinkKey(Player player, ItemStack key, Block newBlock) {
UUID newLockUUID = UUID.randomUUID();
ItemMeta meta = key.getItemMeta();
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(L4M4.get("storage.not_usable_on_vaults"))
));
);
meta.lore(newLore);
key.setItemMeta(meta);
}
protectedBlocks.addBlock(new ProtectedBlock(player.getUniqueId(), newLockUUID, newBlock.getLocation()));
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
public void onInventoryClick(InventoryClickEvent event) {
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
public void onBlockBreak(BlockBreakEvent event) {
Player player = event.getPlayer();
@ -170,11 +212,17 @@ public class ProtectedBlockListener implements Listener {
}
}
/*
* Prevents explosions from destroying protected storage blocks.
*/
@EventHandler
public void onExplosion(EntityExplodeEvent event) {
event.blockList().removeIf(this::isProtected);
}
/*
* Helper method to create a trial key with linked lock information.
*/
private ItemStack createTrialKey(UUID lockUUID) {
ItemStack trialKey = new ItemStack(Material.TRIPWIRE_HOOK);
ItemMeta meta = trialKey.getItemMeta();
@ -189,10 +237,16 @@ public class ProtectedBlockListener implements Listener {
return trialKey;
}
/*
* Validates if the provided item is a trial key.
*/
private boolean isValidKey(ItemStack item) {
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) {
if (!isValidKey(item)) return false;
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())));
}
/*
* Returns the ProtectedBlock associated with the given block, or null if not found.
*/
private ProtectedBlock getProtectedBlock(Block block) {
return protectedBlocks.getBlocks().stream()
.filter(pb -> pb.location().equals(block.getLocation()))
@ -207,6 +264,9 @@ public class ProtectedBlockListener implements Listener {
.orElse(null);
}
/*
* Checks if a block is protected.
*/
private boolean isProtected(Block block) {
return getProtectedBlock(block) != null;
}

View file

@ -30,8 +30,9 @@ public class PlayerManager {
public void setPlayerTeam(Player player) {
Clans clans = BlazeSMP.getInstance().getClans();
UUID playerUUID = player.getUniqueId();
player.setScoreboard(player.getServer().getScoreboardManager().getMainScoreboard());
Scoreboard scoreboard = player.getScoreboard();
if (!scoreboard.equals(player.getServer().getScoreboardManager().getMainScoreboard()))
player.setScoreboard(player.getServer().getScoreboardManager().getMainScoreboard());
String teamName;
if (clans.isInClan(playerUUID)) {
teamName=clanChars.get(clans.getClanByMember(playerUUID));
@ -46,8 +47,7 @@ public class PlayerManager {
teamName="zzzm";
}
teamName+=generateRandomString();
scoreboard.getTeams().forEach(Team::unregister);
Team team = scoreboard.getTeam(teamName);
Team team = scoreboard.getPlayerTeam(player);
if (team == null) {
team = scoreboard.registerNewTeam(teamName);
}

View file

@ -105,6 +105,7 @@
"chunk.navigation.previous": "<green>Previous Page</green>",
"chunk.navigation.next": "<green>Next Page</green>",
"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.territory": "<red>Territory of <white>%s</white> - <white>%s</white>!</red>",
@ -124,7 +125,7 @@
],
"tablist.footer": [
"<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>",
@ -140,5 +141,7 @@
"storage.action_completed": "<green>Action completed successfully!</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.trial_key": "<gold>Linked Trial Key</gold>"
"storage.trial_key": "<gold>Linked Trial Key</gold>",
"config.reloaded": "<green>Config reloaded!</green>"
}