From 0816c295c6014c1b9e970a2ae692083f3f162d23 Mon Sep 17 00:00:00 2001 From: tbvns <69420062+tbvns25565@users.noreply.github.com> Date: Mon, 29 Jan 2024 20:58:31 +0000 Subject: [PATCH] Trying to add custom block mining speed --- .../kelpmodloader/Block/BlockUtils.java | 39 ++++++++++ .../Block/BreakHandler/BlockBreakEvent.java | 58 ++++++++++++++ .../Block/BreakHandler/BreakManager.java | 77 +++++++++++++++++++ .../kelpmodloader/Block/ModdedBlock.java | 10 +++ .../kelpmodloader/Dependency/Downloader.java | 14 ++-- .../kelpmodloader/KelpModLoader.java | 6 +- 6 files changed, 198 insertions(+), 6 deletions(-) create mode 100644 src/main/java/xyz/prismenetwork/kelpmodloader/Block/BlockUtils.java create mode 100644 src/main/java/xyz/prismenetwork/kelpmodloader/Block/BreakHandler/BlockBreakEvent.java create mode 100644 src/main/java/xyz/prismenetwork/kelpmodloader/Block/BreakHandler/BreakManager.java diff --git a/src/main/java/xyz/prismenetwork/kelpmodloader/Block/BlockUtils.java b/src/main/java/xyz/prismenetwork/kelpmodloader/Block/BlockUtils.java new file mode 100644 index 0000000..56ee744 --- /dev/null +++ b/src/main/java/xyz/prismenetwork/kelpmodloader/Block/BlockUtils.java @@ -0,0 +1,39 @@ +package xyz.prismenetwork.kelpmodloader.Block; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.MultipleFacing; + +public class BlockUtils { + public static boolean parseBool(String s) { + if (s.equalsIgnoreCase("1")) { + return true; + } else { + return false; + } + } + + public static String parseString(boolean b) { + if (b) { + return "1"; + } else { + return "0"; + } + } + + public static int idFromBlock(Block block) { + if (block.getType().equals(Material.BROWN_MUSHROOM_BLOCK)) { + MultipleFacing facing = (MultipleFacing) block.getBlockData(); + boolean DOWN = facing.hasFace(BlockFace.DOWN); + boolean UP = facing.hasFace(BlockFace.UP); + boolean EAST = facing.hasFace(BlockFace.EAST); + boolean NORTH = facing.hasFace(BlockFace.NORTH); + boolean SOUTH = facing.hasFace(BlockFace.SOUTH); + boolean WEST = facing.hasFace(BlockFace.WEST); + + return Integer.parseInt(parseString(DOWN) + parseString(UP) + parseString(EAST) + parseString(NORTH) + parseString(SOUTH) + parseString(WEST), 2); + } + return 0; + } +} diff --git a/src/main/java/xyz/prismenetwork/kelpmodloader/Block/BreakHandler/BlockBreakEvent.java b/src/main/java/xyz/prismenetwork/kelpmodloader/Block/BreakHandler/BlockBreakEvent.java new file mode 100644 index 0000000..805fd24 --- /dev/null +++ b/src/main/java/xyz/prismenetwork/kelpmodloader/Block/BreakHandler/BlockBreakEvent.java @@ -0,0 +1,58 @@ +package xyz.prismenetwork.kelpmodloader.Block.BreakHandler; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLib; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.BlockPosition; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockDamageAbortEvent; +import org.bukkit.event.block.BlockDamageEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import xyz.prismenetwork.kelpmodloader.Block.BlockUtils; +import xyz.prismenetwork.kelpmodloader.Block.ModdedBlock; +import xyz.prismenetwork.kelpmodloader.ModsAPI.ItemUtils; +import xyz.prismenetwork.kelpmodloader.Utils; + +import java.time.Instant; +import java.util.List; +import java.util.Random; + +public class BlockBreakEvent implements Listener { + @EventHandler + public void onBreak(BlockDamageEvent event) { + if (event.getBlock().getType().equals(Material.BROWN_MUSHROOM_BLOCK)) { + if (BlockUtils.idFromBlock(event.getBlock()) != 63) { + event.setCancelled(true); + Block block = event.getBlock(); + + BreakManager.PlayerBreakingBlock.put(event.getPlayer(), block); + BreakManager.PlayerBreakingTime.put(event.getPlayer(), Instant.now().toEpochMilli()); + } + } else { + if (BreakManager.PlayerBreakingBlock.containsKey(event.getPlayer())) { + event.getPlayer().sendBlockDamage(BreakManager.PlayerBreakingBlock.get(event.getPlayer()).getLocation(), 0); + BreakManager.PlayerBreakingBlock.remove(event.getPlayer()); + } + } + } + @EventHandler + public void onAbort(BlockDamageAbortEvent event) { + if (BreakManager.PlayerBreakingBlock.containsKey(event.getPlayer())) { + BreakManager.PlayerBreakingBlock.remove(event.getPlayer()); + if (!event.getPlayer().getGameMode().equals(GameMode.CREATIVE)) { + event.getPlayer().setGameMode(GameMode.SURVIVAL); + } + } + if (BreakManager.PlayerBreakingTime.containsKey(event.getPlayer())) { + BreakManager.PlayerBreakingTime.remove(event.getPlayer()); + } + } + +} diff --git a/src/main/java/xyz/prismenetwork/kelpmodloader/Block/BreakHandler/BreakManager.java b/src/main/java/xyz/prismenetwork/kelpmodloader/Block/BreakHandler/BreakManager.java new file mode 100644 index 0000000..4142728 --- /dev/null +++ b/src/main/java/xyz/prismenetwork/kelpmodloader/Block/BreakHandler/BreakManager.java @@ -0,0 +1,77 @@ +package xyz.prismenetwork.kelpmodloader.Block.BreakHandler; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.*; +import com.comphenix.protocol.wrappers.BlockPosition; +import org.bukkit.GameMode; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.plugin.Plugin; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitScheduler; +import xyz.prismenetwork.kelpmodloader.Block.BlockUtils; +import xyz.prismenetwork.kelpmodloader.Block.ModdedBlock; +import xyz.prismenetwork.kelpmodloader.Constant; +import xyz.prismenetwork.kelpmodloader.KelpModLoader; + +import javax.swing.plaf.nimbus.State; +import java.time.Instant; +import java.time.temporal.TemporalField; +import java.util.HashMap; +import java.util.List; +import java.util.Random; +import java.util.UUID; + +public class BreakManager { + public static HashMap PlayerBreakingBlock = new HashMap<>(); + public static HashMap PlayerBreakingTime = new HashMap<>(); + public static void Setup() { + BukkitScheduler scheduler = KelpModLoader.getInstance.getServer().getScheduler(); + ProtocolManager manager = ProtocolLibrary.getProtocolManager(); + + //manager.addPacketListener(new PacketAdapter(KelpModLoader.getInstance, ListenerPriority.HIGHEST, PacketType.Play.Server.BLOCK_BREAK_ANIMATION){ + // @Override + // public void onPacketSending(PacketEvent event) { + // event.setCancelled(true); + // } + //}); + + scheduler.scheduleSyncRepeatingTask(KelpModLoader.getInstance, new Runnable() { + @Override + public void run() { + PlayerBreakingBlock.forEach((p, b) -> { + p.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_DIGGING, 5+((p.getPing()/40)), 200, true, false)); + float breakstage = 0; + + ModdedBlock[] block = {new ModdedBlock()}; + + Constant.Blocks.forEach(blck -> { + if (blck.getId() == BlockUtils.idFromBlock(b)) { + block[0] = blck; + } + }); + + breakstage = ((Instant.now().toEpochMilli() - PlayerBreakingTime.get(p))*1000)/20f; + + PacketContainer container = new PacketContainer(PacketType.Play.Server.BLOCK_BREAK_ANIMATION); + container.getIntegers().write(0, p.getEntityId()*1000); + container.getIntegers().write(1, Math.round(breakstage)); + container.getBlockPositionModifier().write(0, new BlockPosition(b.getX(), b.getY(), b.getZ())); + + if (breakstage > block[0].getBreakTime()) { + b.breakNaturally(); + } + + ProtocolLibrary.getProtocolManager().sendServerPacket(p, container); + }); + } + }, 0L, 0L); + } +} diff --git a/src/main/java/xyz/prismenetwork/kelpmodloader/Block/ModdedBlock.java b/src/main/java/xyz/prismenetwork/kelpmodloader/Block/ModdedBlock.java index 8e2d3ca..e4d416e 100644 --- a/src/main/java/xyz/prismenetwork/kelpmodloader/Block/ModdedBlock.java +++ b/src/main/java/xyz/prismenetwork/kelpmodloader/Block/ModdedBlock.java @@ -3,6 +3,7 @@ public class ModdedBlock { public String name; public String TextureName; + private int BreakTime = 1; private int ID; /** * Return the id of the block. @@ -18,4 +19,13 @@ public int getId() { public void setID(int nID) { ID = nID; } + + + public int getBreakTime() { + return BreakTime; + } + + public void setBreakTime(int breakTime) { + BreakTime = breakTime; + } } diff --git a/src/main/java/xyz/prismenetwork/kelpmodloader/Dependency/Downloader.java b/src/main/java/xyz/prismenetwork/kelpmodloader/Dependency/Downloader.java index 9d23d09..6611958 100644 --- a/src/main/java/xyz/prismenetwork/kelpmodloader/Dependency/Downloader.java +++ b/src/main/java/xyz/prismenetwork/kelpmodloader/Dependency/Downloader.java @@ -1,5 +1,7 @@ package xyz.prismenetwork.kelpmodloader.Dependency; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; import xyz.prismenetwork.kelpmodloader.KelpModLoader; import java.io.File; @@ -10,22 +12,24 @@ import java.nio.file.StandardCopyOption; public class Downloader { - static File pluginFolder = KelpModLoader.getPlugin(KelpModLoader.class).getDataFolder().getParentFile(); + static File pluginFolder = KelpModLoader.getInstance.getDataFolder().getParentFile(); public static void download(String name, String link) { - if (KelpModLoader.getPlugin(KelpModLoader.class).getServer().getPluginManager().getPlugin(name)!=null) return; + if (KelpModLoader.getInstance.getServer().getPluginManager().getPlugin(name)!=null) return; - KelpModLoader.getPlugin(KelpModLoader.class).getLogger().warning(name + " is not installed, downloading ProtocolLib from " + link); + KelpModLoader.getInstance.getLogger().warning(name + " is not installed, downloading ProtocolLib from " + link); try { InputStream in = new URL(link).openStream(); Files.copy(in, Path.of(pluginFolder.getPath() + "/"+ name + ".jar"), StandardCopyOption.REPLACE_EXISTING); KelpModLoader.getInstance.getPluginLoader().loadPlugin(new File(pluginFolder.getPath() + "/" + name + ".jar")); + KelpModLoader.getInstance.getPluginLoader().enablePlugin(Bukkit.getPluginManager().getPlugin(name)); - } catch (Exception e) { - KelpModLoader.getPlugin(KelpModLoader.class).getLogger().warning("Could not download protocolLib:"); + } catch (Exception e) { + KelpModLoader.getInstance.getLogger().warning("Could not download " + name + ":"); e.printStackTrace(); + KelpModLoader.getInstance.getServer().shutdown(); } } diff --git a/src/main/java/xyz/prismenetwork/kelpmodloader/KelpModLoader.java b/src/main/java/xyz/prismenetwork/kelpmodloader/KelpModLoader.java index 356aacb..7b32bbb 100644 --- a/src/main/java/xyz/prismenetwork/kelpmodloader/KelpModLoader.java +++ b/src/main/java/xyz/prismenetwork/kelpmodloader/KelpModLoader.java @@ -1,14 +1,15 @@ package xyz.prismenetwork.kelpmodloader; import org.bukkit.plugin.java.JavaPlugin; +import xyz.prismenetwork.kelpmodloader.Block.BreakHandler.BreakManager; import xyz.prismenetwork.kelpmodloader.Block.CreateBlock; import xyz.prismenetwork.kelpmodloader.Dependency.DependencyManager; +import xyz.prismenetwork.kelpmodloader.Block.BreakHandler.BlockBreakEvent; import xyz.prismenetwork.kelpmodloader.EventHandler.BlockPlaceEvent; import xyz.prismenetwork.kelpmodloader.EventHandler.BlockUpdateEvent; import xyz.prismenetwork.kelpmodloader.Item.GenerateBlockItems; import xyz.prismenetwork.kelpmodloader.Mods.ModsLoader; import xyz.prismenetwork.kelpmodloader.Pack.CreatePack; -import xyz.prismenetwork.kelpmodloader.Dependency.Downloader; import java.io.IOException; @@ -30,6 +31,7 @@ public void onEnable() { //Register event getServer().getPluginManager().registerEvents(new BlockUpdateEvent(), this); getServer().getPluginManager().registerEvents(new BlockPlaceEvent(), this); + getServer().getPluginManager().registerEvents(new BlockBreakEvent(), this); //Load mods new ModsLoader().load(); @@ -60,6 +62,8 @@ public void onEnable() { "§2Status: §aStarted \n" + "§2Task: §aKML is loaded! \n" + "§2---------------------------------- "); + + BreakManager.Setup(); } @Override