Block Break and Place management

This commit is contained in:
unurled 2024-05-04 17:58:45 +02:00
parent b2f6ac5bab
commit ff3faed15d
Signed by: unurled
GPG key ID: FDBC9CBE1F82423F
6 changed files with 117 additions and 5 deletions

View file

@ -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"

View file

@ -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<Location, BlockData> blocks =
(HashMap<Location, BlockData>) 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);
}

View file

@ -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<UUID, SRPlayer> players;
private DataHandler dh;
private final HashMap<UUID, BukkitTask> actionBarTasks;
private DataHandler dh;
public PlayerManager() {
super();
players = new HashMap<>();
actionBarTasks = new HashMap<>();
Bukkit.getPluginManager().registerEvents(this, SR.getInstance());
}
/** Save the data */

View file

@ -30,7 +30,7 @@ public class SRPlayer {
private static final List<Long> 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<PotionEffect> potionEffects = new ArrayList<>();
@Expose private Inventory inventory = null;
@Expose private List<Integer> 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;
}
}

View file

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

View file

@ -8,6 +8,8 @@ public class Component {
public static final String NOT_PLAYER = "<red>You must be a player to use this command.";
public static final String NO_PERMISSION = "<red>You do not have permission to use this command.";
public static final String ERROR =
"<red>An error occurred while executing this command. Please" + " contact an admin.";
private static MiniMessage miniMessage;
private Component() {}