diff --git a/build.gradle.kts b/build.gradle.kts index f6f40e6..bf9379c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ group = "me.unurled.sacredrealms" version = "0.1.0" description = "The main SR plugin." -val mcVersion = "1.20.5-R0.1-SNAPSHOT" +val mcVersion = "1.20.6-R0.1-SNAPSHOT" val redisVersion = "5.2.0-beta1" val invuiVersion = "1.30" diff --git a/src/main/java/me/unurled/sacredrealms/sr/commands/admin/ClientBuildCommand.java b/src/main/java/me/unurled/sacredrealms/sr/commands/admin/ClientBuildCommand.java index 210705c..0bce39f 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/commands/admin/ClientBuildCommand.java +++ b/src/main/java/me/unurled/sacredrealms/sr/commands/admin/ClientBuildCommand.java @@ -1,5 +1,7 @@ package me.unurled.sacredrealms.sr.commands.admin; +import static me.unurled.sacredrealms.sr.utils.Component.ERROR; +import static me.unurled.sacredrealms.sr.utils.Component.textComp; import static me.unurled.sacredrealms.sr.utils.Logger.log; import java.util.ArrayList; @@ -9,6 +11,8 @@ import java.util.List; import java.util.Map.Entry; import me.unurled.sacredrealms.sr.components.clientbuild.ClientBuild; import me.unurled.sacredrealms.sr.components.clientbuild.ClientBuildManager; +import me.unurled.sacredrealms.sr.components.player.PlayerManager; +import me.unurled.sacredrealms.sr.components.player.SRPlayer; import me.unurled.sacredrealms.sr.managers.Manager; import org.bukkit.Location; import org.bukkit.block.Block; @@ -18,6 +22,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; @@ -70,6 +75,16 @@ public class ClientBuildCommand implements TabExecutor, Listener { sender.sendMessage("You do not have any temporary blocks to save."); return; } + + PlayerManager pm = Manager.getInstance(PlayerManager.class); + SRPlayer sr = pm.getPlayer(p.getUniqueId()); + if (sr == null) { + clientBuildManager.removeTemporaryBlocks(p); + clientBuildManager.removeTemporaryPreviousBlocks(p); + return; + } + sr.setClientBuilder(false); + HashMap blocks = (HashMap) clientBuildManager.getTemporaryBlocks(p); log("blocks: " + blocks.size()); @@ -101,7 +116,15 @@ public class ClientBuildCommand implements TabExecutor, Listener { sender.sendMessage(DOES_NOT_EXIST); return; } + // set flag for player + PlayerManager pm = Manager.getInstance(PlayerManager.class); + SRPlayer sr = pm.getPlayer(p.getUniqueId()); + if (sr == null) { + sender.sendMessage(textComp(ERROR)); + return; + } sender.sendMessage("Modify the client build and save after you are finished."); + sr.setClientBuilder(true); clientBuildManager.setTemporaryBlocks(p, new HashMap<>()); clientBuildManager.setTemporaryPreviousBlocks(p, new HashMap<>()); } @@ -129,9 +152,16 @@ public class ClientBuildCommand implements TabExecutor, Listener { sender.sendMessage("A client build with that name already exists."); return; } + PlayerManager pm = Manager.getInstance(PlayerManager.class); + SRPlayer sr = pm.getPlayer(p.getUniqueId()); + if (sr == null) { + sender.sendMessage(textComp(ERROR)); + return; + } sender.sendMessage( "Client build created, place blocks that you want to add to the Client" + " Build and save after you are finished."); + sr.setClientBuilder(true); clientBuildManager.setTemporaryBlocks(p, new HashMap<>()); clientBuildManager.setTemporaryPreviousBlocks(p, new HashMap<>()); } @@ -234,9 +264,17 @@ public class ClientBuildCommand implements TabExecutor, Listener { } } - @EventHandler + @EventHandler(priority = EventPriority.HIGH) public void onBlockBreak(@NotNull BlockBreakEvent e) { Player p = e.getPlayer(); + PlayerManager pm = Manager.getInstance(PlayerManager.class); + SRPlayer sr = pm.getPlayer(p.getUniqueId()); + if (sr == null) { + e.setCancelled(true); + return; + } + if (!sr.isClientBuilder()) return; + if (manager == null) { manager = Manager.getInstance(ClientBuildManager.class); } diff --git a/src/main/java/me/unurled/sacredrealms/sr/components/player/PlayerManager.java b/src/main/java/me/unurled/sacredrealms/sr/components/player/PlayerManager.java index b280b09..f4bd0f9 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/components/player/PlayerManager.java +++ b/src/main/java/me/unurled/sacredrealms/sr/components/player/PlayerManager.java @@ -33,14 +33,14 @@ public class PlayerManager extends Manager { public static final String PLAYER_KEY = "sr.players."; public static final String DATA_MANAGER_NULL = "DataManager is null, Can't save player data."; private final HashMap players; - private DataHandler dh; - private final HashMap actionBarTasks; + private DataHandler dh; public PlayerManager() { super(); players = new HashMap<>(); actionBarTasks = new HashMap<>(); + Bukkit.getPluginManager().registerEvents(this, SR.getInstance()); } /** Save the data */ diff --git a/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java b/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java index e8ab1f0..09be873 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java +++ b/src/main/java/me/unurled/sacredrealms/sr/components/player/SRPlayer.java @@ -30,7 +30,7 @@ public class SRPlayer { private static final List levelRequirements = List.of(100L, 200L, 400L, 800L, 1600L, 3200L, 6400L, 12800L, 25600L, 51200L); - @Expose private UUID uuid = null; + @Expose private UUID uuid; @Expose private int level = 1; @Expose private Long experience = 0L; private double health = 100; @@ -39,6 +39,7 @@ public class SRPlayer { @Expose private List potionEffects = new ArrayList<>(); @Expose private Inventory inventory = null; @Expose private List treasuresOpened = new ArrayList<>(); + private boolean isClientBuilder = false; public SRPlayer(@NotNull UUID uuid) { this.uuid = uuid; @@ -272,4 +273,12 @@ public class SRPlayer { public void addTreasureOpened(int id) { treasuresOpened.add(id); } + + public boolean isClientBuilder() { + return isClientBuilder; + } + + public void setClientBuilder(boolean b) { + isClientBuilder = b; + } } diff --git a/src/main/java/me/unurled/sacredrealms/sr/components/player/listener/PlayerBlockEvent.java b/src/main/java/me/unurled/sacredrealms/sr/components/player/listener/PlayerBlockEvent.java new file mode 100644 index 0000000..4fce5a6 --- /dev/null +++ b/src/main/java/me/unurled/sacredrealms/sr/components/player/listener/PlayerBlockEvent.java @@ -0,0 +1,63 @@ +package me.unurled.sacredrealms.sr.components.player.listener; + +import me.unurled.sacredrealms.sr.components.player.PlayerManager; +import me.unurled.sacredrealms.sr.components.player.SRPlayer; +import me.unurled.sacredrealms.sr.managers.Manager; +import org.bukkit.GameMode; +import org.bukkit.Material; +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.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class PlayerBlockEvent implements Listener { + + public boolean isClientBuilder(@NotNull Player p) { + PlayerManager pm = Manager.getInstance(PlayerManager.class); + SRPlayer sr = pm.getPlayer(p.getUniqueId()); + return sr != null && sr.isClientBuilder(); + } + + @EventHandler + public void onBreakBlock(@NotNull BlockBreakEvent event) { + Player p = event.getPlayer(); + if (p.getGameMode().equals(GameMode.CREATIVE)) { + return; + } + + if (isClientBuilder(p)) return; + + // make block break client side + event.setCancelled(true); + + p.sendBlockChange(event.getBlock().getLocation(), Material.AIR.createBlockData()); + // TODO: check if it remove durability from items + p.playSound(p.getLocation(), event.getBlock().getBlockSoundGroup().getBreakSound(), 1, 1); + event.setDropItems(true); + } + + @EventHandler + public void onPlaceBlock(@NotNull BlockPlaceEvent e) { + Player p = e.getPlayer(); + if (p.getGameMode().equals(GameMode.CREATIVE)) { + return; + } + + if (isClientBuilder(p)) return; + + // make block place client side + e.setCancelled(true); + p.sendBlockChange(e.getBlock().getLocation(), e.getBlockReplacedState().getBlockData()); + if (p.getInventory().getItemInMainHand().getAmount() != 1) { + p.getInventory() + .getItemInMainHand() + .setAmount(p.getInventory().getItemInMainHand().getAmount() - 1); + } else { + p.getInventory().setItem(p.getInventory().getHeldItemSlot(), new ItemStack(Material.AIR)); + } + p.playSound(p.getLocation(), e.getBlock().getBlockSoundGroup().getPlaceSound(), 1, 1); + } +} diff --git a/src/main/java/me/unurled/sacredrealms/sr/utils/Component.java b/src/main/java/me/unurled/sacredrealms/sr/utils/Component.java index 3741dd4..55d031e 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/utils/Component.java +++ b/src/main/java/me/unurled/sacredrealms/sr/utils/Component.java @@ -8,6 +8,8 @@ public class Component { public static final String NOT_PLAYER = "You must be a player to use this command."; public static final String NO_PERMISSION = "You do not have permission to use this command."; + public static final String ERROR = + "An error occurred while executing this command. Please" + " contact an admin."; private static MiniMessage miniMessage; private Component() {}