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 4a3ec6bc657e1c877ea5ee2d82a5fe8ff29d15f2
parent 5b6e509cbf5d69ab1fe45e8ddd106d58054f09a3
Author: NK <[email protected]>
Date:   Tue, 20 Dec 2022 15:17:47 +0000

improvements for miners

Diffstat:
Msrc/main/java/me/night/nullvalkyrie/commands/BetaCommand.java | 10++++++----
Msrc/main/java/me/night/nullvalkyrie/commands/MinerCommand.java | 49+++++++++++++++++++++++++++++++++++++------------
Msrc/main/java/me/night/nullvalkyrie/database/MinerDataManager.java | 14+++++++-------
Msrc/main/java/me/night/nullvalkyrie/entities/miners/CryptoMiner.java | 173+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Msrc/main/java/me/night/nullvalkyrie/enums/MinerType.java | 36++++++++++++++++++++++++++++++++++--
5 files changed, 173 insertions(+), 109 deletions(-)

diff --git a/src/main/java/me/night/nullvalkyrie/commands/BetaCommand.java b/src/main/java/me/night/nullvalkyrie/commands/BetaCommand.java @@ -1,6 +1,8 @@ package me.night.nullvalkyrie.commands; +//import me.night.nullvalkyrie.entities.pets.ZombiePet; import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; import org.bukkit.entity.Player; import java.util.List; @@ -8,16 +10,16 @@ import java.util.List; public class BetaCommand extends Command { public BetaCommand() { - super("beta", new String[]{"b", "npc"}, "Beta", ""); + super("beta", new String[]{"b"}, "Beta", ""); } @Override public void onCommand(CommandSender sender, String[] args) { if (sender instanceof Player player) { -// CryptoMiner miner = new CryptoMiner(args[0], Material.DIAMOND_ORE, 1, 0.5, System.currentTimeMillis()); -// miner.spawn(player, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"); -// new LuckyDraw().UI(player); + + //ZombiePet a = new ZombiePet(player.getLocation(), player); + //((CraftWorld) player.getWorld()).getHandle().b(a); } } diff --git a/src/main/java/me/night/nullvalkyrie/commands/MinerCommand.java b/src/main/java/me/night/nullvalkyrie/commands/MinerCommand.java @@ -1,47 +1,72 @@ package me.night.nullvalkyrie.commands; import me.night.nullvalkyrie.database.MinerDataManager; +import me.night.nullvalkyrie.entities.miners.CryptoMiner; +import me.night.nullvalkyrie.enums.MinerType; import me.night.nullvalkyrie.ui.inventory.Miner; -import org.bukkit.Material; +import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; -import java.util.Date; -import java.util.List; +import java.util.*; import static me.night.nullvalkyrie.entities.miners.CryptoMiner.generate; public class MinerCommand extends Command { public MinerCommand() { - super("miner", new String[]{"m", "miners"}, "Miner list", ""); + super("miner", new String[]{"miners"}, "Miners", ""); } @Override public void onCommand(CommandSender sender, String[] args) { if (sender instanceof Player player) { if (args.length == 0) { + player.sendMessage(ChatColor.RED + "Invalid command"); + return; + } + if (args[0].equalsIgnoreCase("list")) { new Miner().UI(player); int seconds = (int) (new Date().getTime() - MinerDataManager.getLastClaim(1)) / 1000; generate(50, seconds); } else if (args[0].equalsIgnoreCase("new")) { - String name = args[1]; - Material pick = Material.NETHERITE_AXE; + String name = args[2]; + MinerType type = MinerType.getByName(args[1]); int level = 20; double rate = 0.4; long time = System.currentTimeMillis(); - MinerDataManager.setNPC(name, pick, level, rate, true, time); + assert type != null; + MinerDataManager.setMiner(name, type, level, rate, true, time); + CryptoMiner miner = new CryptoMiner(name, type, level, rate, time); + miner.spawn(player); } else if (args[0].equalsIgnoreCase("claim")) { - String minerIndex = args[1]; - MinerDataManager.setLastClaim(Long.parseLong(minerIndex)); - player.sendMessage("Claimed"); + MinerDataManager.setLastClaim(args[1]); + player.sendMessage(ChatColor.GREEN + "Claimed"); } - } } @Override public List<String> onTabComplete(CommandSender sender, String[] args) { - return null; + if (args.length == 1) { + List<String> cc = List.of("new", "claim", "list"); + return StringUtil.copyPartialMatches(args[0], cc, new ArrayList<>()); + } else if (args.length == 2) { + if (args[0].equalsIgnoreCase("new")) { + List<String> choices = new ArrayList<>(); + for (MinerType type : MinerType.values()) { + choices.add(type.getName()); + } + return StringUtil.copyPartialMatches(args[1], choices, new ArrayList<>()); + } else if (args[0].equalsIgnoreCase("claim")) { + List<String> choices = new ArrayList<>(); + for (CryptoMiner miner : MinerDataManager.getMiners().values()) { + choices.add(miner.getName()); + } + return StringUtil.copyPartialMatches(args[1], choices, new ArrayList<>()); + } + } + return new ArrayList<>(); } } diff --git a/src/main/java/me/night/nullvalkyrie/database/MinerDataManager.java b/src/main/java/me/night/nullvalkyrie/database/MinerDataManager.java @@ -2,18 +2,18 @@ package me.night.nullvalkyrie.database; import com.mongodb.client.MongoCursor; import me.night.nullvalkyrie.entities.miners.CryptoMiner; +import me.night.nullvalkyrie.enums.MinerType; import org.bson.Document; import org.bson.conversions.Bson; -import org.bukkit.Material; import java.util.HashMap; public class MinerDataManager { - public static void setNPC(String name, Material material, int level, double rate, boolean enabled, long lastclaim) { + public static void setMiner(String name, MinerType type, int level, double rate, boolean enabled, long lastclaim) { Document newDocument = new Document(); newDocument.put("ID", DatabaseManager.getMinersDB().countDocuments() + 1); newDocument.put("Name", name); - newDocument.put("Material", material.name()); + newDocument.put("Material", type.getName()); newDocument.put("Level", level); newDocument.put("Rate", rate); newDocument.put("Enabled", enabled); @@ -21,8 +21,8 @@ public class MinerDataManager { DatabaseManager.getMinersDB().insertOne(newDocument); } - public static void setLastClaim(long id) { - Document document = DatabaseManager.getMinersDB().find(new Document("ID", id)).first(); + public static void setLastClaim(String name) { + Document document = DatabaseManager.getMinersDB().find(new Document("Name", name)).first(); if (document != null) { Bson updated = new Document("LastClaim", System.currentTimeMillis()); Bson update = new Document("$set", updated); @@ -43,7 +43,7 @@ public class MinerDataManager { public static CryptoMiner getMiner(long id) { Document doc = DatabaseManager.getMinersDB().find(new Document("ID", id)).first(); if (doc != null) { - return new CryptoMiner(doc.getString("Name"), Material.matchMaterial(doc.getString("Material")), doc.getInteger("Level"), doc.getDouble("Rate"), doc.getLong("LastClaim")); + return new CryptoMiner(doc.getString("Name"), MinerType.getByName(doc.getString("Material")), doc.getInteger("Level"), doc.getDouble("Rate"), doc.getLong("LastClaim")); } return null; } @@ -53,7 +53,7 @@ public class MinerDataManager { try (MongoCursor<Document> cursor = DatabaseManager.getMinersDB().find().cursor()) { while (cursor.hasNext()) { Document doc = cursor.next(); - list.put(doc.getLong("ID"), new CryptoMiner(doc.getString("Name"), Material.matchMaterial(doc.getString("Material")), doc.getInteger("Level"), doc.getDouble("Rate"), doc.getLong("LastClaim"))); + list.put(doc.getLong("ID"), new CryptoMiner(doc.getString("Name"), MinerType.getByName(doc.getString("Material")), doc.getInteger("Level"), doc.getDouble("Rate"), doc.getLong("LastClaim"))); } return list; } diff --git a/src/main/java/me/night/nullvalkyrie/entities/miners/CryptoMiner.java b/src/main/java/me/night/nullvalkyrie/entities/miners/CryptoMiner.java @@ -2,6 +2,8 @@ package me.night.nullvalkyrie.entities.miners; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; + +import me.night.nullvalkyrie.enums.MinerType; import me.night.nullvalkyrie.util.Skin; import me.night.nullvalkyrie.util.Util; import net.minecraft.network.protocol.game.PacketPlayOutPlayerInfo; @@ -30,14 +32,14 @@ import java.util.concurrent.ThreadLocalRandom; public class CryptoMiner { protected String name; - protected Material type; + protected MinerType type; protected int level; protected double rate; protected final long lastclaim; - public CryptoMiner(String name, Material type, int level, double rate, long lastclaim) { + public CryptoMiner(String name, MinerType type, int level, double rate, long lastclaim) { this.name = name; // Name of the miner - this.type = type; // Material to mine + this.type = type; // Type of the miner this.level = level; this.rate = rate; // Percentage generate chance in each tick 20tick per sec this.lastclaim = lastclaim; @@ -60,10 +62,10 @@ public class CryptoMiner { } public Material getType() { - return type; + return this.type.getMaterial(); } - public void setType(Material type) { + public void setType(MinerType type) { this.type = type; } @@ -88,7 +90,7 @@ public class CryptoMiner { System.out.println(generated); } - public void spawn(Player player, String url) { + public void spawn(Player player) { Location loc = player.getLocation().getWorld().getBlockAt(player.getLocation()).getLocation().add(0.5, 0, 0.5); if (player.getLocation().getWorld() == null) return; ArmorStand stand = player.getLocation().getWorld().spawn(loc, ArmorStand.class); @@ -101,7 +103,7 @@ public class CryptoMiner { SkullMeta meta = (SkullMeta) head.getItemMeta(); if (meta == null) return; GameProfile profile = new GameProfile(UUID.randomUUID(), null); - byte[] encodedData = Base64.encodeBase64(String.format("{textures:{SKIN:{url:\"%s\"}}}", url).getBytes()); + byte[] encodedData = Base64.encodeBase64(String.format("{textures:{SKIN:{url:\"%s\"}}}", this.type.getHeadTexture()).getBytes()); profile.getProperties().put("textures", new Property("textures", new String(encodedData))); try { Util.setFieldValue(meta, "profile", profile); @@ -145,89 +147,92 @@ public class CryptoMiner { for (int x = (int) stand.getLocation().getX() - 3; x <= stand.getLocation().getX() + 2; x++) { for (int z = (int) stand.getLocation().getZ() - 2; z <= stand.getLocation().getZ() + 2; z++) { for (int y = (int) stand.getLocation().getY() - 1; y <= stand.getLocation().getY() - 1; y++) { - if (world.getBlockAt(x, y, z).getType() == this.type) + if (world.getBlockAt(x, y, z).getType() == this.getType()) locs.add(world.getBlockAt(x, y, z).getLocation()); } } } locs.remove(world.getBlockAt(stand.getLocation().subtract(0, -1, 0)).getLocation()); - Location closest = locs.get(0); - for (Location location : locs) { - if (location.distance(stand.getLocation()) < closest.distance(stand.getLocation())) closest = location; - } - ArrayList<ItemStack> items = new ArrayList<>(); - ThreadLocalRandom random = ThreadLocalRandom.current(); - if (closest.getBlock().getType() == this.type) { - closest.getBlock().getDrops().clear(); - int lower = 0; - int upper = 0; - if (this.level == 1) { - lower = 1; - upper = 3; - } else if (this.level == 2) { - lower = 2; - upper = 5; - } else if (this.level == 3) { - lower = 3; - upper = 7; - } else if (this.level == 4) { - lower = 4; - upper = 9; - } else if (this.level == 5) { - lower = 5; - upper = 11; - } else if (this.level == 6) { - lower = 6; - upper = 13; - } else if (this.level == 7) { - lower = 7; - upper = 15; - } else if (this.level == 8) { - lower = 8; - upper = 17; - } else if (this.level == 9) { - lower = 9; - upper = 19; - } else if (this.level == 10) { - lower = 10; - upper = 21; - } else if (this.level == 11) { - lower = 11; - upper = 23; - } else if (this.level == 12) { - lower = 12; - upper = 25; - } else if (this.level == 13) { - lower = 13; - upper = 27; - } else if (this.level == 14) { - lower = 14; - upper = 29; - } else if (this.level == 15) { - lower = 15; - upper = 31; - } else if (this.level == 16) { - lower = 16; - upper = 33; - } else if (this.level == 17) { - lower = 17; - upper = 35; - } else if (this.level == 18) { - lower = 18; - upper = 37; - } else if (this.level == 19) { - lower = 19; - upper = 39; - } else if (this.level == 20) { - lower = 20; - upper = 41; + if (locs.size() != 0) { + Location closest = locs.get(0); + for (Location location : locs) { + if (location.distance(stand.getLocation()) < closest.distance(stand.getLocation())) closest = location; + } + ArrayList<ItemStack> items = new ArrayList<>(); + ThreadLocalRandom random = ThreadLocalRandom.current(); + if (closest.getBlock().getType() == this.getType()) { + closest.getBlock().getDrops().clear(); + int lower = 0; + int upper = 0; + if (this.level == 1) { + lower = 1; + upper = 3; + } else if (this.level == 2) { + lower = 2; + upper = 5; + } else if (this.level == 3) { + lower = 3; + upper = 7; + } else if (this.level == 4) { + lower = 4; + upper = 9; + } else if (this.level == 5) { + lower = 5; + upper = 11; + } else if (this.level == 6) { + lower = 6; + upper = 13; + } else if (this.level == 7) { + lower = 7; + upper = 15; + } else if (this.level == 8) { + lower = 8; + upper = 17; + } else if (this.level == 9) { + lower = 9; + upper = 19; + } else if (this.level == 10) { + lower = 10; + upper = 21; + } else if (this.level == 11) { + lower = 11; + upper = 23; + } else if (this.level == 12) { + lower = 12; + upper = 25; + } else if (this.level == 13) { + lower = 13; + upper = 27; + } else if (this.level == 14) { + lower = 14; + upper = 29; + } else if (this.level == 15) { + lower = 15; + upper = 31; + } else if (this.level == 16) { + lower = 16; + upper = 33; + } else if (this.level == 17) { + lower = 17; + upper = 35; + } else if (this.level == 18) { + lower = 18; + upper = 37; + } else if (this.level == 19) { + lower = 19; + upper = 39; + } else if (this.level == 20) { + lower = 20; + upper = 41; + } + items.add(new ItemStack(this.getType(), random.nextInt(lower, upper))); + closest.getBlock().setType(Material.AIR); + } + // drop the items + for (ItemStack item : items) { + world.dropItemNaturally(closest, item); } - items.add(new ItemStack(this.type, random.nextInt(lower, upper))); - closest.getBlock().setType(Material.AIR); - } - // drop the items - for (ItemStack item : items) { - world.dropItemNaturally(closest, item); } + } } diff --git a/src/main/java/me/night/nullvalkyrie/enums/MinerType.java b/src/main/java/me/night/nullvalkyrie/enums/MinerType.java @@ -1,13 +1,45 @@ package me.night.nullvalkyrie.enums; +import org.bukkit.Material; + public enum MinerType { - DIAMOND("Diamond"), EMERALD("Emerald"), GOLD("Gold"), IRON("Iron"), REDSTONE("Redstone"), COAL("Coal"), LAPIS("Lapis"), QUARTZ("Quartz"), OBSIDIAN("Obsidian"), NETHERITE("Netherite"); + DIAMOND("Diamond", Material.DIAMOND_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), + EMERALD("Emerald", Material.EMERALD_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), + GOLD("Gold", Material.GOLD_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), + IRON("Iron", Material.IRON_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), + REDSTONE("Redstone", Material.REDSTONE_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), + COAL("Coal", Material.COAL_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), + LAPIS("Lapis", Material.LAPIS_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), + QUARTZ("Quartz", Material.NETHER_QUARTZ_ORE, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), + OBSIDIAN("Obsidian", Material.OBSIDIAN, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"), + NETHERITE("Netherite", Material.ANCIENT_DEBRIS, "https://textures.minecraft.net/texture/c09cc3c75bd13c59602040b5970f30dbc76825c0e817da815a65d76ab0e82198"); private final String name; - MinerType(String name) { + private final Material material; + private final String headTexture; + MinerType(String name, Material material, String headTexture) { this.name = name; + this.material = material; + this.headTexture = headTexture; } public String getName() { return name; } + + public Material getMaterial() { + return material; + } + + public String getHeadTexture() { + return headTexture; + } + + public static MinerType getByName(String name) { + for (MinerType type : MinerType.values()) { + if (type.getName().equalsIgnoreCase(name)) { + return type; + } + } + return null; + } }