NPC clicking event and miner updates(working)
This commit is contained in:
parent
05ca15ef0c
commit
9090b473cb
17 changed files with 297 additions and 268 deletions
|
@ -8,12 +8,14 @@ import me.night.nullvalkyrie.events.CustomItemEvents;
|
||||||
import me.night.nullvalkyrie.events.DamageEffect;
|
import me.night.nullvalkyrie.events.DamageEffect;
|
||||||
import me.night.nullvalkyrie.hardpoint.ConfigManager;
|
import me.night.nullvalkyrie.hardpoint.ConfigManager;
|
||||||
import me.night.nullvalkyrie.items.CustomItemManager;
|
import me.night.nullvalkyrie.items.CustomItemManager;
|
||||||
|
import me.night.nullvalkyrie.npc.ClickNPC;
|
||||||
import me.night.nullvalkyrie.npc.NPC;
|
import me.night.nullvalkyrie.npc.NPC;
|
||||||
|
import me.night.nullvalkyrie.npc.PacketInjector;
|
||||||
import me.night.nullvalkyrie.rank.ScoreboardListener;
|
import me.night.nullvalkyrie.rank.ScoreboardListener;
|
||||||
|
import me.night.nullvalkyrie.util.FileManager;
|
||||||
import me.night.nullvalkyrie.util.Util;
|
import me.night.nullvalkyrie.util.Util;
|
||||||
import me.night.nullvalkyrie.commands.*;
|
import me.night.nullvalkyrie.commands.*;
|
||||||
import me.night.nullvalkyrie.database.Client;
|
import me.night.nullvalkyrie.database.DatabaseManager;
|
||||||
import me.night.nullvalkyrie.miners.CryptoMiner;
|
|
||||||
import org.bukkit.*;
|
import org.bukkit.*;
|
||||||
import org.bukkit.boss.BarColor;
|
import org.bukkit.boss.BarColor;
|
||||||
import org.bukkit.boss.BarStyle;
|
import org.bukkit.boss.BarStyle;
|
||||||
|
@ -25,23 +27,19 @@ import org.bukkit.event.server.ServerListPingEvent;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import static me.night.nullvalkyrie.items.CustomItemManager.updateYamlFilesToPlugin;
|
|
||||||
|
|
||||||
public final class Main extends JavaPlugin implements Listener {
|
public final class Main extends JavaPlugin implements Listener {
|
||||||
private BossBar bossbar;
|
private BossBar bossbar;
|
||||||
|
private PacketInjector injector;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
getConfig().options().copyDefaults();
|
getConfig().options().copyDefaults();
|
||||||
saveDefaultConfig();
|
saveDefaultConfig();
|
||||||
new NPC(this);
|
|
||||||
EnchantmentManager.register();
|
EnchantmentManager.register();
|
||||||
new CustomItemManager(this);
|
new CustomItemManager(this);
|
||||||
updateYamlFilesToPlugin("shop.yml");
|
new FileManager();
|
||||||
updateYamlFilesToPlugin("hardpoint.yml");
|
|
||||||
updateYamlFilesToPlugin("miners.yml");
|
|
||||||
new CommandManager(this).register();
|
new CommandManager(this).register();
|
||||||
bossbar = Bukkit.createBossBar(ChatColor.GOLD + "Kuudra", BarColor.RED, BarStyle.SEGMENTED_12);
|
bossbar = Bukkit.createBossBar(ChatColor.GOLD + "Kuudra", BarColor.RED, BarStyle.SEGMENTED_12);
|
||||||
Bukkit.getPluginManager().registerEvents(this, this);
|
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 ScoreboardListener(this), this);
|
||||||
Bukkit.getPluginManager().registerEvents(new CustomItemEvents(this), this);
|
Bukkit.getPluginManager().registerEvents(new CustomItemEvents(this), this);
|
||||||
Bukkit.getPluginManager().registerEvents(new DamageEffect(this), this);
|
Bukkit.getPluginManager().registerEvents(new DamageEffect(this), this);
|
||||||
|
Bukkit.getPluginManager().registerEvents(new ClickNPC(), this);
|
||||||
//Bukkit.getPluginManager().registerEvents(new GameEvent(this), this);
|
//Bukkit.getPluginManager().registerEvents(new GameEvent(this), this);
|
||||||
new DiscordClientManager();
|
new DiscordClientManager();
|
||||||
new CryptoMiner(this, "Baka", Material.ENDER_CHEST, 10, 0.7, new Date().getTime());
|
new DatabaseManager();
|
||||||
new Client();
|
|
||||||
ConfigManager.setConfig();
|
ConfigManager.setConfig();
|
||||||
|
NPC.loadNPC(CustomItemManager.loadConfig("npcs.yml"));
|
||||||
|
this.injector = new PacketInjector();
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onJoin(PlayerJoinEvent e) {
|
public void onJoin(PlayerJoinEvent e) {
|
||||||
bossbar.addPlayer(e.getPlayer());
|
bossbar.addPlayer(e.getPlayer());
|
||||||
|
injector.addPlayer(e.getPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package me.night.nullvalkyrie.commands;
|
package me.night.nullvalkyrie.commands;
|
||||||
|
|
||||||
import me.night.nullvalkyrie.Main;
|
import me.night.nullvalkyrie.Main;
|
||||||
|
import me.night.nullvalkyrie.miners.CryptoMiner;
|
||||||
import me.night.nullvalkyrie.miners.MinerGUI;
|
import me.night.nullvalkyrie.miners.MinerGUI;
|
||||||
|
import org.bukkit.Material;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@ -27,11 +29,27 @@ public class MinerCommand extends Command {
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSender sender, String[] args) {
|
public void onCommand(CommandSender sender, String[] args) {
|
||||||
if (sender instanceof Player) {
|
if (sender instanceof Player) {
|
||||||
|
if(args.length == 0) {
|
||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
new MinerGUI(main, player);
|
new MinerGUI(main, player);
|
||||||
int seconds = (int) (new Date().getTime() - (long) getMiner("1").get("lastclaim")) / 1000;
|
int seconds = (int) (new Date().getTime() - getMiner("0").getLastclaim()) / 1000;
|
||||||
System.out.println("Seconds" + seconds);
|
System.out.println("Seconds" + seconds);
|
||||||
generate(50, 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");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,10 +8,9 @@ import org.bson.conversions.Bson;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class Client {
|
public class DatabaseManager {
|
||||||
private MongoClient client;
|
|
||||||
private static MongoCollection<Document> users;
|
private static MongoCollection<Document> users;
|
||||||
public Client() {
|
public DatabaseManager() {
|
||||||
connect();
|
connect();
|
||||||
}
|
}
|
||||||
public void connect() {
|
public void connect() {
|
||||||
|
@ -31,7 +30,7 @@ public class Client {
|
||||||
users.insertOne(document);
|
users.insertOne(document);
|
||||||
}
|
}
|
||||||
public void updateUserBank(String username, Number coins) {
|
public void updateUserBank(String username, Number coins) {
|
||||||
Document document = (Document) users.find(new Document("Username", username)).first();
|
Document document = users.find(new Document("Username", username)).first();
|
||||||
if(document != null) {
|
if(document != null) {
|
||||||
Bson updated = new Document("Bank", coins);
|
Bson updated = new Document("Bank", coins);
|
||||||
Bson update = new Document("$set", updated);
|
Bson update = new Document("$set", updated);
|
|
@ -3,17 +3,24 @@ package me.night.nullvalkyrie.enchantments;
|
||||||
import org.bukkit.enchantments.Enchantment;
|
import org.bukkit.enchantments.Enchantment;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class EnchantmentManager {
|
public class EnchantmentManager {
|
||||||
public static final Enchantment ThunderBolt = new CustomEnchantment("thunderbolt", "ThunderBolt", 5);
|
public static final Enchantment ThunderBolt = new CustomEnchantment("thunderbolt", "ThunderBolt", 5);
|
||||||
public static final Enchantment SmeltingTouch = new CustomEnchantment("smelting-touch", "Smelting Touch", 1);
|
public static final Enchantment SmeltingTouch = new CustomEnchantment("smelting-touch", "Smelting Touch", 1);
|
||||||
public static void register() {
|
public static void register() {
|
||||||
boolean registered = Arrays.stream(Enchantment.values()).collect(Collectors.toList()).contains(ThunderBolt);
|
List<Enchantment> enchants = new ArrayList<>();
|
||||||
if(!registered) {
|
enchants.add(ThunderBolt);
|
||||||
registerEnchantment(ThunderBolt);
|
enchants.add(SmeltingTouch);
|
||||||
registerEnchantment(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));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,7 +221,7 @@ public class CustomItemManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateYamlFilesToPlugin(String path) {
|
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);
|
if (!file.exists()) main.saveResource(path, true);
|
||||||
else main.saveResource(path, true);
|
else main.saveResource(path, true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
|
@ -28,8 +27,7 @@ public class CryptoMiner {
|
||||||
this.level = level;
|
this.level = level;
|
||||||
this.rate = rate; // Percentage generate chance in each tick 20tick per sec
|
this.rate = rate; // Percentage generate chance in each tick 20tick per sec
|
||||||
this.lastclaim = lastclaim;
|
this.lastclaim = lastclaim;
|
||||||
FileConfiguration file = loadConfig("miners.yml");
|
|
||||||
setMiner(Integer.toString(file.getKeys(false).size()), name, type.name(), level, rate, lastclaim);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
|
@ -57,8 +55,15 @@ public class CryptoMiner {
|
||||||
public long getLastclaim() {
|
public long getLastclaim() {
|
||||||
return lastclaim;
|
return lastclaim;
|
||||||
}
|
}
|
||||||
public void setLastClaim(long lastclaim) {
|
public void setLastClaim(String index, long lastclaim) {
|
||||||
this.lastclaim = 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) {
|
public static void generate(int pp, int times) {
|
||||||
for (int counter = 0; counter < times; counter++) {
|
for (int counter = 0; counter < times; counter++) {
|
||||||
|
@ -75,18 +80,18 @@ public class CryptoMiner {
|
||||||
}
|
}
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
public static HashMap<String, Object> getMiner(String index) {
|
public static CryptoMiner getMiner(String index) {
|
||||||
FileConfiguration file = loadConfig("miners.yml");
|
FileConfiguration file = loadConfig("miners.yml");
|
||||||
HashMap<String, Object> details = new HashMap<>();
|
String name = file.getString(index + ".name");
|
||||||
details.put("name", file.getString(index + ".name"));
|
Material material = Material.matchMaterial(file.getString(index + ".material"));
|
||||||
details.put("material", Material.matchMaterial(file.getString(index + ".material")));
|
int level = file.getInt(index + ".level");
|
||||||
details.put("level", file.getInt(index + ".level"));
|
double rate = file.getDouble(index + ".rate");
|
||||||
details.put("rate", file.getDouble(index + ".rate"));
|
long lastclaim = file.getLong(index + ".last-claim");
|
||||||
details.put("lastclaim", file.getLong(index + ".last-claim"));
|
return new CryptoMiner(main, name, material, level, rate, lastclaim);
|
||||||
return details;
|
|
||||||
}
|
}
|
||||||
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");
|
FileConfiguration file = loadConfig("miners.yml");
|
||||||
|
String index = Integer.toString(file.getKeys(false).size());
|
||||||
file.createSection(index);
|
file.createSection(index);
|
||||||
file.set(index + ".name", name);
|
file.set(index + ".name", name);
|
||||||
file.set(index + ".material", material);
|
file.set(index + ".material", material);
|
||||||
|
|
|
@ -11,7 +11,9 @@ import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class MinerGUI {
|
public class MinerGUI {
|
||||||
|
@ -45,6 +47,7 @@ public class MinerGUI {
|
||||||
List<String> lore = new ArrayList<>();
|
List<String> lore = new ArrayList<>();
|
||||||
lore.add("Level: " + file.getString(c + ".level"));
|
lore.add("Level: " + file.getString(c + ".level"));
|
||||||
lore.add("Rate: " + file.getString(c + ".rate"));
|
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!");
|
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);
|
itemMeta.setLore(lore);
|
||||||
item.setItemMeta(itemMeta);
|
item.setItemMeta(itemMeta);
|
||||||
|
|
16
src/main/java/me/night/nullvalkyrie/npc/ClickNPC.java
Normal file
16
src/main/java/me/night/nullvalkyrie/npc/ClickNPC.java
Normal file
|
@ -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"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import com.mojang.authlib.GameProfile;
|
||||||
import com.mojang.authlib.properties.Property;
|
import com.mojang.authlib.properties.Property;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
import me.night.nullvalkyrie.Main;
|
import me.night.nullvalkyrie.Main;
|
||||||
|
import me.night.nullvalkyrie.items.CustomItemManager;
|
||||||
import me.night.nullvalkyrie.util.Util;
|
import me.night.nullvalkyrie.util.Util;
|
||||||
import net.minecraft.network.protocol.game.*;
|
import net.minecraft.network.protocol.game.*;
|
||||||
import net.minecraft.network.syncher.DataWatcher;
|
import net.minecraft.network.syncher.DataWatcher;
|
||||||
|
@ -17,51 +18,86 @@ import net.minecraft.world.entity.EnumItemSlot;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
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.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
|
import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class NPC {
|
public class NPC {
|
||||||
private static Main main;
|
|
||||||
public NPC(Main main) {
|
|
||||||
NPC.main = main;
|
|
||||||
}
|
|
||||||
private static final List<EntityPlayer> NPCs = new ArrayList<>();
|
private static final List<EntityPlayer> NPCs = new ArrayList<>();
|
||||||
|
|
||||||
public static List<EntityPlayer> getNPCs() {
|
public static List<EntityPlayer> getNPCs() {
|
||||||
return NPCs;
|
return NPCs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void createNPC(Player player, String name) { //name must be less than 16 characters including color codes **
|
public static void createNPC(Player player, String name) { //name must be less than 16 characters including color codes **
|
||||||
CraftPlayer creaftPlayer = (CraftPlayer) player;
|
EntityPlayer sp = ((CraftPlayer) player).getHandle();
|
||||||
EntityPlayer sp = creaftPlayer.getHandle();
|
|
||||||
MinecraftServer server = sp.c;
|
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));
|
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]));
|
gameProfile.getProperties().put("textures", new Property("textures", skin[0], skin[1]));
|
||||||
EntityPlayer npc = new EntityPlayer(server, level, gameProfile, null);
|
EntityPlayer npc = new EntityPlayer(server, level, gameProfile, null);
|
||||||
Location location = player.getLocation();
|
Location location = player.getLocation();
|
||||||
npc.a(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
|
npc.a(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
|
||||||
addNPCPacket(npc);
|
addNPCPacket(npc);
|
||||||
NPCs.add(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) {
|
public static void addNPCPacket(EntityPlayer npc) {
|
||||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
CraftPlayer creaftPlayer = (CraftPlayer) player;
|
PlayerConnection pc = ((CraftPlayer) player).getHandle().b;
|
||||||
EntityPlayer sp = creaftPlayer.getHandle();
|
|
||||||
PlayerConnection pc = sp.b;
|
|
||||||
pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npc));
|
pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npc));
|
||||||
pc.a(new PacketPlayOutNamedEntitySpawn(npc));
|
pc.a(new PacketPlayOutNamedEntitySpawn(npc));
|
||||||
pc.a(new PacketPlayOutEntityHeadRotation(npc, (byte) (npc.getBukkitYaw() * 256 / 360)));
|
pc.a(new PacketPlayOutEntityHeadRotation(npc, (byte) (npc.getBukkitYaw() * 256 / 360)));
|
||||||
DataWatcher watcher = npc.ai();
|
DataWatcher watcher = npc.ai();
|
||||||
watcher.b(new DataWatcherObject<>(17, DataWatcherRegistry.a), (byte) 127);
|
watcher.b(new DataWatcherObject<>(17, DataWatcherRegistry.a), (byte) 127);
|
||||||
pc.a(new PacketPlayOutEntityMetadata(npc.ae(), watcher, true));
|
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 netheriteAxe = new ItemStack(Material.NETHERITE_AXE);
|
||||||
ItemStack anotherAxe = new ItemStack(Material.NETHERITE_INGOT);
|
ItemStack anotherAxe = new ItemStack(Material.NETHERITE_INGOT);
|
||||||
List<Pair<EnumItemSlot, net.minecraft.world.item.ItemStack>> list = new ArrayList<>();
|
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));
|
pc.a(new PacketPlayOutEntityEquipment(npc.ae(), list));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addJoinPacket(Player player) {
|
public static void addJoinPacket(Player player) {
|
||||||
for (EntityPlayer npc : NPCs) {
|
for (EntityPlayer npc : NPCs) {
|
||||||
CraftPlayer creaftPlayer = (CraftPlayer) player;
|
PlayerConnection pc = ((CraftPlayer) player).getHandle().b;
|
||||||
EntityPlayer sp = creaftPlayer.getHandle();
|
|
||||||
PlayerConnection pc = sp.b;
|
|
||||||
pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npc));
|
pc.a(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npc));
|
||||||
pc.a(new PacketPlayOutNamedEntitySpawn(npc));
|
pc.a(new PacketPlayOutNamedEntitySpawn(npc));
|
||||||
pc.a(new PacketPlayOutEntityHeadRotation(npc, (byte) (npc.getBukkitYaw() * 256 / 360)));
|
pc.a(new PacketPlayOutEntityHeadRotation(npc, (byte) (npc.getBukkitYaw() * 256 / 360)));
|
||||||
DataWatcher watcher = npc.ai();
|
DataWatcher watcher = npc.ai();
|
||||||
watcher.b(new DataWatcherObject<>(17, DataWatcherRegistry.a), (byte) 127);
|
watcher.b(new DataWatcherObject<>(17, DataWatcherRegistry.a), (byte) 127);
|
||||||
pc.a(new PacketPlayOutEntityMetadata(npc.ae(), watcher, true));
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
57
src/main/java/me/night/nullvalkyrie/npc/PacketHandler.java
Normal file
57
src/main/java/me/night/nullvalkyrie/npc/PacketHandler.java
Normal file
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
41
src/main/java/me/night/nullvalkyrie/npc/PacketInjector.java
Normal file
41
src/main/java/me/night/nullvalkyrie/npc/PacketInjector.java
Normal file
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
40
src/main/java/me/night/nullvalkyrie/npc/RightClickNPC.java
Normal file
40
src/main/java/me/night/nullvalkyrie/npc/RightClickNPC.java
Normal file
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,7 +12,7 @@ import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
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 {
|
public class ScoreboardListener implements Listener {
|
||||||
|
|
||||||
|
|
10
src/main/java/me/night/nullvalkyrie/util/FileManager.java
Normal file
10
src/main/java/me/night/nullvalkyrie/util/FileManager.java
Normal file
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
0
src/main/resources/customEnchants.yml
Normal file
0
src/main/resources/customEnchants.yml
Normal file
|
@ -12,213 +12,3 @@
|
||||||
rate: 0.7
|
rate: 0.7
|
||||||
enabled: true
|
enabled: true
|
||||||
last-claim: 1668208245832
|
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
|
|
1
src/main/resources/npcs.yml
Normal file
1
src/main/resources/npcs.yml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
data:
|
Loading…
Reference in a new issue