NullValkyrie

Minecraft 1.19 multipurpose plugin for spigot servers with a lot of features where most modern servers have.
git clone https://codeberg.org/night0721/NullValkyrie
Log | Files | Refs | README | LICENSE

commit 9090b473cba5d491fc0222a83f3d07f1967bbc5c
parent 05ca15ef0cf1fd88cdfb993d7ab87e0dd961a8a6
Author: NK <[email protected]>
Date:   Wed, 23 Nov 2022 22:25:08 +0000

NPC clicking event and miner updates(working)

Diffstat:
Msrc/main/java/me/night/nullvalkyrie/Main.java | 24++++++++++++------------
Msrc/main/java/me/night/nullvalkyrie/commands/MinerCommand.java | 28+++++++++++++++++++++++-----
Dsrc/main/java/me/night/nullvalkyrie/database/Client.java | 57---------------------------------------------------------
Asrc/main/java/me/night/nullvalkyrie/database/DatabaseManager.java | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/main/java/me/night/nullvalkyrie/enchantments/EnchantmentManager.java | 15+++++++++++----
Msrc/main/java/me/night/nullvalkyrie/items/CustomItemManager.java | 2+-
Msrc/main/java/me/night/nullvalkyrie/miners/CryptoMiner.java | 31++++++++++++++++++-------------
Msrc/main/java/me/night/nullvalkyrie/miners/MinerGUI.java | 3+++
Asrc/main/java/me/night/nullvalkyrie/npc/ClickNPC.java | 16++++++++++++++++
Msrc/main/java/me/night/nullvalkyrie/npc/NPC.java | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
Asrc/main/java/me/night/nullvalkyrie/npc/PacketHandler.java | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/me/night/nullvalkyrie/npc/PacketInjector.java | 41+++++++++++++++++++++++++++++++++++++++++
Asrc/main/java/me/night/nullvalkyrie/npc/RightClickNPC.java | 40++++++++++++++++++++++++++++++++++++++++
Msrc/main/java/me/night/nullvalkyrie/rank/ScoreboardListener.java | 2+-
Asrc/main/java/me/night/nullvalkyrie/util/FileManager.java | 10++++++++++
Asrc/main/resources/customEnchants.yml | 0
Msrc/main/resources/miners.yml | 211-------------------------------------------------------------------------------
Asrc/main/resources/npcs.yml | 1+
18 files changed, 351 insertions(+), 322 deletions(-)

diff --git a/src/main/java/me/night/nullvalkyrie/Main.java b/src/main/java/me/night/nullvalkyrie/Main.java @@ -8,12 +8,14 @@ import me.night.nullvalkyrie.events.CustomItemEvents; import me.night.nullvalkyrie.events.DamageEffect; import me.night.nullvalkyrie.hardpoint.ConfigManager; import me.night.nullvalkyrie.items.CustomItemManager; +import me.night.nullvalkyrie.npc.ClickNPC; import me.night.nullvalkyrie.npc.NPC; +import me.night.nullvalkyrie.npc.PacketInjector; import me.night.nullvalkyrie.rank.ScoreboardListener; +import me.night.nullvalkyrie.util.FileManager; import me.night.nullvalkyrie.util.Util; import me.night.nullvalkyrie.commands.*; -import me.night.nullvalkyrie.database.Client; -import me.night.nullvalkyrie.miners.CryptoMiner; +import me.night.nullvalkyrie.database.DatabaseManager; import org.bukkit.*; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarStyle; @@ -25,23 +27,19 @@ import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; -import java.util.Date; - -import static me.night.nullvalkyrie.items.CustomItemManager.updateYamlFilesToPlugin; public final class Main extends JavaPlugin implements Listener { private BossBar bossbar; + private PacketInjector injector; @Override public void onEnable() { getConfig().options().copyDefaults(); saveDefaultConfig(); - new NPC(this); EnchantmentManager.register(); new CustomItemManager(this); - updateYamlFilesToPlugin("shop.yml"); - updateYamlFilesToPlugin("hardpoint.yml"); - updateYamlFilesToPlugin("miners.yml"); + new FileManager(); + new CommandManager(this).register(); bossbar = Bukkit.createBossBar(ChatColor.GOLD + "Kuudra", BarColor.RED, BarStyle.SEGMENTED_12); Bukkit.getPluginManager().registerEvents(this, this); @@ -49,16 +47,18 @@ public final class Main extends JavaPlugin implements Listener { Bukkit.getPluginManager().registerEvents(new ScoreboardListener(this), this); Bukkit.getPluginManager().registerEvents(new CustomItemEvents(this), this); Bukkit.getPluginManager().registerEvents(new DamageEffect(this), this); + Bukkit.getPluginManager().registerEvents(new ClickNPC(), this); //Bukkit.getPluginManager().registerEvents(new GameEvent(this), this); new DiscordClientManager(); - new CryptoMiner(this, "Baka", Material.ENDER_CHEST, 10, 0.7, new Date().getTime()); - new Client(); + new DatabaseManager(); ConfigManager.setConfig(); + NPC.loadNPC(CustomItemManager.loadConfig("npcs.yml")); + this.injector = new PacketInjector(); } - @EventHandler public void onJoin(PlayerJoinEvent e) { bossbar.addPlayer(e.getPlayer()); + injector.addPlayer(e.getPlayer()); } @EventHandler diff --git a/src/main/java/me/night/nullvalkyrie/commands/MinerCommand.java b/src/main/java/me/night/nullvalkyrie/commands/MinerCommand.java @@ -1,7 +1,9 @@ package me.night.nullvalkyrie.commands; import me.night.nullvalkyrie.Main; +import me.night.nullvalkyrie.miners.CryptoMiner; import me.night.nullvalkyrie.miners.MinerGUI; +import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -27,11 +29,27 @@ public class MinerCommand extends Command { @Override public void onCommand(CommandSender sender, String[] args) { if (sender instanceof Player) { - Player player = (Player) sender; - new MinerGUI(main, player); - int seconds = (int) (new Date().getTime() - (long) getMiner("1").get("lastclaim")) / 1000; - System.out.println("Seconds" + seconds); - generate(50, seconds); + if(args.length == 0) { + Player player = (Player) sender; + new MinerGUI(main, player); + int seconds = (int) (new Date().getTime() - getMiner("0").getLastclaim()) / 1000; + System.out.println("Seconds" + seconds); + generate(50, seconds); + } else if (args[0].equalsIgnoreCase("new")) { + String name = args[1]; + Material pick = Material.STONE_PICKAXE; + int level = 20; + double rate = 0.4; + long time = System.currentTimeMillis(); + CryptoMiner miner = new CryptoMiner(main, name, pick, level, rate, time); + miner.setMiner(name, pick.name(), level, rate, time); + } else if (args[0].equalsIgnoreCase("claim")) { + String minerIndex = args[1]; + CryptoMiner miner = getMiner(minerIndex); + miner.setLastClaim(minerIndex, System.currentTimeMillis()); + System.out.println("Done"); + } + } } diff --git a/src/main/java/me/night/nullvalkyrie/database/Client.java b/src/main/java/me/night/nullvalkyrie/database/Client.java @@ -1,57 +0,0 @@ -package me.night.nullvalkyrie.database; - -import com.mongodb.MongoException; -import com.mongodb.client.*; -import com.mongodb.client.model.Filters; -import org.bson.Document; -import org.bson.conversions.Bson; - -import java.util.HashMap; - -public class Client { - private MongoClient client; - private static MongoCollection<Document> users; - public Client() { - connect(); - } - public void connect() { - try (MongoClient client = MongoClients.create("mongodb+srv://cath_exe:[email protected]/NullValkyrie")) { - - } catch (MongoException e) { - System.out.println("An error occurred when logging in to MongoDB" + e); - } - MongoClient client = MongoClients.create("mongodb+srv://cath_exe:[email protected]/NullValkyrie"); - MongoDatabase database = client.getDatabase("NullValkyrie"); - users = database.getCollection("users"); - } - public static void createUserSchema(String username) { - Document document = new Document(); - document.put("Username", username); - document.put("Bank", 0); - users.insertOne(document); - } - public void updateUserBank(String username, Number coins) { - Document document = (Document) users.find(new Document("Username", username)).first(); - if(document != null) { - Bson updated = new Document("Bank", coins); - Bson update = new Document("$set", updated); - users.updateOne(document, update); - } - - } - public static HashMap<String, Object> getUser(String username) { - try (MongoCursor<Document> cursor = users.find(Filters.eq("Username", username)).cursor()) { - while (cursor.hasNext()) { - Document doc = cursor.next(); - for (String a : doc.keySet()) { - if (!a.equals("_id")) { - HashMap<String, Object> details = new HashMap<>(); - details.put(a, doc.get(a)); - return details; - } - } - } - } - return null; - } -} diff --git a/src/main/java/me/night/nullvalkyrie/database/DatabaseManager.java b/src/main/java/me/night/nullvalkyrie/database/DatabaseManager.java @@ -0,0 +1,56 @@ +package me.night.nullvalkyrie.database; + +import com.mongodb.MongoException; +import com.mongodb.client.*; +import com.mongodb.client.model.Filters; +import org.bson.Document; +import org.bson.conversions.Bson; + +import java.util.HashMap; + +public class DatabaseManager { + private static MongoCollection<Document> users; + public DatabaseManager() { + connect(); + } + public void connect() { + try (MongoClient client = MongoClients.create("mongodb+srv://cath_exe:[email protected]/NullValkyrie")) { + + } catch (MongoException e) { + System.out.println("An error occurred when logging in to MongoDB" + e); + } + MongoClient client = MongoClients.create("mongodb+srv://cath_exe:[email protected]/NullValkyrie"); + MongoDatabase database = client.getDatabase("NullValkyrie"); + users = database.getCollection("users"); + } + public static void createUserSchema(String username) { + Document document = new Document(); + document.put("Username", username); + document.put("Bank", 0); + users.insertOne(document); + } + public void updateUserBank(String username, Number coins) { + Document document = users.find(new Document("Username", username)).first(); + if(document != null) { + Bson updated = new Document("Bank", coins); + Bson update = new Document("$set", updated); + users.updateOne(document, update); + } + + } + public static HashMap<String, Object> getUser(String username) { + try (MongoCursor<Document> cursor = users.find(Filters.eq("Username", username)).cursor()) { + while (cursor.hasNext()) { + Document doc = cursor.next(); + for (String a : doc.keySet()) { + if (!a.equals("_id")) { + HashMap<String, Object> details = new HashMap<>(); + details.put(a, doc.get(a)); + return details; + } + } + } + } + return null; + } +} diff --git a/src/main/java/me/night/nullvalkyrie/enchantments/EnchantmentManager.java b/src/main/java/me/night/nullvalkyrie/enchantments/EnchantmentManager.java @@ -3,17 +3,24 @@ package me.night.nullvalkyrie.enchantments; import org.bukkit.enchantments.Enchantment; import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.stream.Collectors; public class EnchantmentManager { public static final Enchantment ThunderBolt = new CustomEnchantment("thunderbolt", "ThunderBolt", 5); public static final Enchantment SmeltingTouch = new CustomEnchantment("smelting-touch", "Smelting Touch", 1); public static void register() { - boolean registered = Arrays.stream(Enchantment.values()).collect(Collectors.toList()).contains(ThunderBolt); - if(!registered) { - registerEnchantment(ThunderBolt); - registerEnchantment(SmeltingTouch); + List<Enchantment> enchants = new ArrayList<>(); + enchants.add(ThunderBolt); + enchants.add(SmeltingTouch); + List<Boolean> registeredList = new ArrayList<>(); + for (Enchantment enchant : enchants) { + registeredList.add(Arrays.stream(Enchantment.values()).collect(Collectors.toList()).contains(enchant)); + } + for (int counter = 0; counter < registeredList.size(); counter++) { + if (!registeredList.get(counter)) registerEnchantment(enchants.get(counter)); } } diff --git a/src/main/java/me/night/nullvalkyrie/items/CustomItemManager.java b/src/main/java/me/night/nullvalkyrie/items/CustomItemManager.java @@ -221,7 +221,7 @@ public class CustomItemManager { } public static void updateYamlFilesToPlugin(String path) { - File file = new File(main.getDataFolder(), path); //xxx.yml + File file = new File(main.getDataFolder(), path); if (!file.exists()) main.saveResource(path, true); else main.saveResource(path, true); } diff --git a/src/main/java/me/night/nullvalkyrie/miners/CryptoMiner.java b/src/main/java/me/night/nullvalkyrie/miners/CryptoMiner.java @@ -6,7 +6,6 @@ import org.bukkit.configuration.file.FileConfiguration; import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.concurrent.ThreadLocalRandom; @@ -28,8 +27,7 @@ public class CryptoMiner { this.level = level; this.rate = rate; // Percentage generate chance in each tick 20tick per sec this.lastclaim = lastclaim; - FileConfiguration file = loadConfig("miners.yml"); - setMiner(Integer.toString(file.getKeys(false).size()), name, type.name(), level, rate, lastclaim); + } public String getName() { @@ -57,8 +55,15 @@ public class CryptoMiner { public long getLastclaim() { return lastclaim; } - public void setLastClaim(long lastclaim) { + public void setLastClaim(String index, long lastclaim) { this.lastclaim = lastclaim; + FileConfiguration file = loadConfig("miners.yml"); + file.set(index + ".last-claim", lastclaim); + try { + file.save(loadFile("miners.yml")); + } catch (IOException ignored) { + + } } public static void generate(int pp, int times) { for (int counter = 0; counter < times; counter++) { @@ -75,18 +80,18 @@ public class CryptoMiner { } return arr; } - public static HashMap<String, Object> getMiner(String index) { + public static CryptoMiner getMiner(String index) { FileConfiguration file = loadConfig("miners.yml"); - HashMap<String, Object> details = new HashMap<>(); - details.put("name", file.getString(index + ".name")); - details.put("material", Material.matchMaterial(file.getString(index + ".material"))); - details.put("level", file.getInt(index + ".level")); - details.put("rate", file.getDouble(index + ".rate")); - details.put("lastclaim", file.getLong(index + ".last-claim")); - return details; + String name = file.getString(index + ".name"); + Material material = Material.matchMaterial(file.getString(index + ".material")); + int level = file.getInt(index + ".level"); + double rate = file.getDouble(index + ".rate"); + long lastclaim = file.getLong(index + ".last-claim"); + return new CryptoMiner(main, name, material, level, rate, lastclaim); } - public void setMiner(String index, String name, String material, int level, double rate, long time) { + public void setMiner(String name, String material, int level, double rate, long time) { FileConfiguration file = loadConfig("miners.yml"); + String index = Integer.toString(file.getKeys(false).size()); file.createSection(index); file.set(index + ".name", name); file.set(index + ".material", material); diff --git a/src/main/java/me/night/nullvalkyrie/miners/MinerGUI.java b/src/main/java/me/night/nullvalkyrie/miners/MinerGUI.java @@ -11,7 +11,9 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.List; public class MinerGUI { @@ -45,6 +47,7 @@ public class MinerGUI { List<String> lore = new ArrayList<>(); lore.add("Level: " + file.getString(c + ".level")); lore.add("Rate: " + file.getString(c + ".rate")); + lore.add("Last Claim: " + new SimpleDateFormat("d MMM yyyy HH:mm:ss").format(new Date(file.getLong(c + ".last-claim")))); boolean b = file.getBoolean(c + ".rate") ? lore.add(ChatColor.GRAY + "Click to enable miner!") : lore.add(ChatColor.RED + "Click to disable miner!"); itemMeta.setLore(lore); item.setItemMeta(itemMeta); diff --git a/src/main/java/me/night/nullvalkyrie/npc/ClickNPC.java b/src/main/java/me/night/nullvalkyrie/npc/ClickNPC.java @@ -0,0 +1,16 @@ +package me.night.nullvalkyrie.npc; + +import me.night.nullvalkyrie.util.Util; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class ClickNPC implements Listener { + @EventHandler + public void onClick(RightClickNPC e) { + Player player = e.getPlayer(); + if (e.getNPC().getBukkitEntity().getName().equalsIgnoreCase(Util.color("&a&lNK"))) { + player.sendMessage(Util.color("Hi")); + } + } +} diff --git a/src/main/java/me/night/nullvalkyrie/npc/NPC.java b/src/main/java/me/night/nullvalkyrie/npc/NPC.java @@ -4,6 +4,7 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.mojang.datafixers.util.Pair; import me.night.nullvalkyrie.Main; +import me.night.nullvalkyrie.items.CustomItemManager; import me.night.nullvalkyrie.util.Util; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.DataWatcher; @@ -17,51 +18,86 @@ import net.minecraft.world.entity.EnumItemSlot; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.craftbukkit.v1_19_R1.CraftServer; import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; public class NPC { - private static Main main; - public NPC(Main main) { - NPC.main = main; - } private static final List<EntityPlayer> NPCs = new ArrayList<>(); + public static List<EntityPlayer> getNPCs() { return NPCs; } + public static void createNPC(Player player, String name) { //name must be less than 16 characters including color codes ** - CraftPlayer creaftPlayer = (CraftPlayer) player; - EntityPlayer sp = creaftPlayer.getHandle(); + EntityPlayer sp = ((CraftPlayer) player).getHandle(); MinecraftServer server = sp.c; - WorldServer level = ((CraftWorld) Bukkit.getWorld(player.getWorld().getName())).getHandle(); + WorldServer level = ((CraftWorld) player.getLocation().getWorld()).getHandle(); GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.color(name)); - String[] skin = Skin.getSkin("Lendortv"); + String[] skin = Skin.getSkin(player); gameProfile.getProperties().put("textures", new Property("textures", skin[0], skin[1])); EntityPlayer npc = new EntityPlayer(server, level, gameProfile, null); Location location = player.getLocation(); npc.a(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); addNPCPacket(npc); NPCs.add(npc); + int var = 1; + FileConfiguration npcFile = CustomItemManager.loadConfig("npcs.yml"); + if (npcFile.contains("data")) var = npcFile.getConfigurationSection("data").getKeys(false).size() + 1; + npcFile.set("data." + var + ".x", (int) player.getLocation().getX()); + npcFile.set("data." + var + ".y", (int) player.getLocation().getY()); + npcFile.set("data." + var + ".z", (int) player.getLocation().getZ()); + npcFile.set("data." + var + ".pitch", (int) player.getLocation().getPitch()); + npcFile.set("data." + var + ".yaw", (int) player.getLocation().getYaw()); + npcFile.set("data." + var + ".world", player.getLocation().getWorld().getName()); + npcFile.set("data." + var + ".name", name); + npcFile.set("data." + var + ".texture", skin[0]); + npcFile.set("data." + var + ".signature", skin[1]); + try { + npcFile.save(CustomItemManager.loadFile("npcs.yml")); + } catch (IOException e) { + e.printStackTrace(); + } } + + public static void loadNPC(FileConfiguration npcFile) { + npcFile.getConfigurationSection("data").getKeys(false).forEach(npc -> { + Location location = new Location(Bukkit.getWorld(Objects.requireNonNull(npcFile.getString("data." + npc + ".world"))), npcFile.getInt("data." + npc + ".x"), npcFile.getInt("data." + npc + ".y"), npcFile.getInt("data." + npc + ".z")); + location.setPitch((float) npcFile.getDouble("data." + npc + ".pitch")); + location.setYaw((float) npcFile.getDouble("data." + npc + ".yaw")); + String name = npcFile.getString("data." + npc + ".name"); + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), Util.color(name)); + gameProfile.getProperties().put("textures", new Property("textures", npcFile.getString("data." + npc + ".texture"), npcFile.getString("data." + npc + ".signature"))); + MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); + WorldServer world = ((CraftWorld) location.getWorld()).getHandle(); + EntityPlayer npcs = new EntityPlayer(server, world, gameProfile, null); + npcs.a(location.getX(), location.getY(), location.getZ(), location.getPitch(), location.getPitch()); + addNPCPacket(npcs); + NPCs.add(npcs); + }); + + } + public static void addNPCPacket(EntityPlayer npc) { - for(Player player : Bukkit.getOnlinePlayers()) { - CraftPlayer creaftPlayer = (CraftPlayer) player; - EntityPlayer sp = creaftPlayer.getHandle(); - PlayerConnection pc = sp.b; + for (Player player : Bukkit.getOnlinePlayers()) { + PlayerConnection pc = ((CraftPlayer) player).getHandle().b; pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npc)); pc.a(new PacketPlayOutNamedEntitySpawn(npc)); pc.a(new PacketPlayOutEntityHeadRotation(npc, (byte) (npc.getBukkitYaw() * 256 / 360))); DataWatcher watcher = npc.ai(); watcher.b(new DataWatcherObject<>(17, DataWatcherRegistry.a), (byte) 127); pc.a(new PacketPlayOutEntityMetadata(npc.ae(), watcher, true)); - Bukkit.getScheduler().runTaskLaterAsynchronously(main, () -> pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npc)), 50); + Bukkit.getScheduler().runTaskLaterAsynchronously(Main.getPlugin(Main.class), () -> pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npc)), 50); ItemStack netheriteAxe = new ItemStack(Material.NETHERITE_AXE); ItemStack anotherAxe = new ItemStack(Material.NETHERITE_INGOT); List<Pair<EnumItemSlot, net.minecraft.world.item.ItemStack>> list = new ArrayList<>(); @@ -70,18 +106,24 @@ public class NPC { pc.a(new PacketPlayOutEntityEquipment(npc.ae(), list)); } } + public static void addJoinPacket(Player player) { - for(EntityPlayer npc : NPCs) { - CraftPlayer creaftPlayer = (CraftPlayer) player; - EntityPlayer sp = creaftPlayer.getHandle(); - PlayerConnection pc = sp.b; + for (EntityPlayer npc : NPCs) { + PlayerConnection pc = ((CraftPlayer) player).getHandle().b; pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npc)); pc.a(new PacketPlayOutNamedEntitySpawn(npc)); pc.a(new PacketPlayOutEntityHeadRotation(npc, (byte) (npc.getBukkitYaw() * 256 / 360))); DataWatcher watcher = npc.ai(); watcher.b(new DataWatcherObject<>(17, DataWatcherRegistry.a), (byte) 127); pc.a(new PacketPlayOutEntityMetadata(npc.ae(), watcher, true)); - Bukkit.getScheduler().runTaskLaterAsynchronously(main, () -> pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npc)), 50); + Bukkit.getScheduler().runTaskLaterAsynchronously(Main.getPlugin(Main.class), () -> pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npc)), 50); + ItemStack netheriteAxe = new ItemStack(Material.NETHERITE_AXE); + ItemStack anotherAxe = new ItemStack(Material.NETHERITE_INGOT); + List<Pair<EnumItemSlot, net.minecraft.world.item.ItemStack>> list = new ArrayList<>(); + list.add(new Pair<>(EnumItemSlot.a, CraftItemStack.asNMSCopy(netheriteAxe))); + list.add(new Pair<>(EnumItemSlot.b, CraftItemStack.asNMSCopy(anotherAxe))); + pc.a(new PacketPlayOutEntityEquipment(npc.ae(), list)); } } + } diff --git a/src/main/java/me/night/nullvalkyrie/npc/PacketHandler.java b/src/main/java/me/night/nullvalkyrie/npc/PacketHandler.java @@ -0,0 +1,57 @@ +package me.night.nullvalkyrie.npc; + +import io.netty.channel.ChannelDuplexHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPromise; +import me.night.nullvalkyrie.Main; +import net.minecraft.network.protocol.game.PacketPlayInUseEntity; +import net.minecraft.server.level.EntityPlayer; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.lang.reflect.Field; + +public class PacketHandler extends ChannelDuplexHandler { + private final Player player; + public PacketHandler(Player player) { + this.player = player; + } + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + super.write(ctx, msg, promise); + } + @Override + public void channelRead(ChannelHandlerContext c, Object packet) throws Exception { + if (packet.getClass().getSimpleName().equalsIgnoreCase("PacketPlayInUseEntity")) { + PacketPlayInUseEntity pk = (PacketPlayInUseEntity) packet; + int entityID = (int) PacketInjector.getFieldValue(packet, "a"); + boolean sneak = (boolean) PacketInjector.getFieldValue(packet, "c"); + + Field type = pk.getClass().getDeclaredField("b"); + type.setAccessible(true); + Object data = type.get(pk); + if (data.toString().split("\\$")[1].charAt(0) == 'e') { return; } + try { + Field hand = data.getClass().getDeclaredField("a"); + hand.setAccessible(true); + if (!hand.get(data).toString().equals("MAIN_HAND")) { return; } + //Right Click + for (EntityPlayer npcs : NPC.getNPCs()) { + if (npcs.ae() == entityID && sneak) { + Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getPlugin(Main.class), new Runnable() { + @Override + public void run() { + Bukkit.getPluginManager().callEvent(new RightClickNPC(player, npcs)); + } + }, 0); + + } + } + } catch (NoSuchFieldException x) { + //Left Click + } + } else { + super.channelRead(c, packet); + } + } +} +\ No newline at end of file diff --git a/src/main/java/me/night/nullvalkyrie/npc/PacketInjector.java b/src/main/java/me/night/nullvalkyrie/npc/PacketInjector.java @@ -0,0 +1,41 @@ +package me.night.nullvalkyrie.npc; + +import io.netty.channel.Channel; +import net.minecraft.server.level.EntityPlayer; +import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.lang.reflect.Field; + +public class PacketInjector { + public void addPlayer(Player p) { + try { + Channel ch = nms(p).b.b.m; + if(ch.pipeline().get("PacketInjector") == null) { + PacketHandler h = new PacketHandler(p); + ch.pipeline().addBefore("packet_handler", "PacketInjector", h); + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + + public void removePlayer(Player p) { + try { + Channel ch = nms(p).b.b.m; + if(ch.pipeline().get("PacketInjector") != null) { + ch.pipeline().remove("PacketInjector"); + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + public static Object getFieldValue(Object instance, String fieldName) throws Exception { + Field field = instance.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + return field.get(instance); + } + public static EntityPlayer nms(Player p) { + return ((CraftPlayer) p).getHandle(); + } +} diff --git a/src/main/java/me/night/nullvalkyrie/npc/RightClickNPC.java b/src/main/java/me/night/nullvalkyrie/npc/RightClickNPC.java @@ -0,0 +1,40 @@ +package me.night.nullvalkyrie.npc; + +import net.minecraft.server.level.EntityPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class RightClickNPC extends Event implements Cancellable { + private final Player player; + private final EntityPlayer npc; + private boolean isCancelled; + private static final HandlerList HANDLERS = new HandlerList(); + public RightClickNPC(Player player, EntityPlayer npc) { + this.player = player; + this.npc = npc; + } + public Player getPlayer() { + return player; + } + public EntityPlayer getNPC() { + return npc; + } + @Override + public boolean isCancelled() { + return isCancelled; + } + + @Override + public void setCancelled(boolean cancel) { + isCancelled = cancel; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return HANDLERS; + } +} diff --git a/src/main/java/me/night/nullvalkyrie/rank/ScoreboardListener.java b/src/main/java/me/night/nullvalkyrie/rank/ScoreboardListener.java @@ -12,7 +12,7 @@ import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; -import static me.night.nullvalkyrie.database.Client.createUserSchema; +import static me.night.nullvalkyrie.database.DatabaseManager.createUserSchema; public class ScoreboardListener implements Listener { diff --git a/src/main/java/me/night/nullvalkyrie/util/FileManager.java b/src/main/java/me/night/nullvalkyrie/util/FileManager.java @@ -0,0 +1,10 @@ +package me.night.nullvalkyrie.util; + +import static me.night.nullvalkyrie.items.CustomItemManager.updateYamlFilesToPlugin; + +public class FileManager { + public FileManager() { + updateYamlFilesToPlugin("shop.yml"); + updateYamlFilesToPlugin("hardpoint.yml"); + } +} diff --git a/src/main/resources/customEnchants.yml b/src/main/resources/customEnchants.yml diff --git a/src/main/resources/miners.yml b/src/main/resources/miners.yml @@ -12,213 +12,3 @@ rate: 0.7 enabled: true last-claim: 1668208245832 -'2': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668208370651 -'3': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668208676271 -'4': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668210448531 -'5': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668210799036 -'6': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668254119769 -'7': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668254787702 -'8': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668256451864 -'9': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668257458167 -'10': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668257773080 -'11': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668259524393 -'12': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668260226503 -'13': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668261403911 -'14': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668261796376 -'15': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668262686577 -'16': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668262788190 -'17': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668263553259 -'18': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668263687264 -'19': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668267428787 -'20': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668267550253 -'21': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668267769594 -'22': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668268013534 -'23': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668268096781 -'24': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668268392432 -'25': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668268601044 -'26': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668300216256 -'27': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668300740524 -'28': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668301188489 -'29': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668303289593 -'30': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668303659410 -'31': - name: Sussy - material: ENDER_CHEST - level: 10 - rate: 0.7 - enabled: true - last-claim: 1668304689097 -\ No newline at end of file diff --git a/src/main/resources/npcs.yml b/src/main/resources/npcs.yml @@ -0,0 +1 @@ +data: