Skip to content

Commit

Permalink
Trying to add custom block mining speed
Browse files Browse the repository at this point in the history
  • Loading branch information
tbvns committed Jan 29, 2024
1 parent 0b0329a commit 0816c29
Show file tree
Hide file tree
Showing 6 changed files with 198 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}

}
Original file line number Diff line number Diff line change
@@ -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<Player, Block> PlayerBreakingBlock = new HashMap<>();
public static HashMap<Player, Long> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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();
}

}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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();
Expand Down Expand Up @@ -60,6 +62,8 @@ public void onEnable() {
"§2Status: §aStarted \n" +
"§2Task: §aKML is loaded! \n" +
"§2---------------------------------- ");

BreakManager.Setup();
}

@Override
Expand Down

0 comments on commit 0816c29

Please sign in to comment.