Added custom craft

This commit is contained in:
thetrouper
2025-03-25 17:57:04 -05:00
parent b2cb00a186
commit 4fd9c0144a
13 changed files with 291 additions and 37 deletions

View File

@@ -11,14 +11,20 @@ public final class ArmorSMP extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
getLogger().info("Initializing PDK");
PDK.init(this); PDK.init(this);
getLogger().info("Instantiating Plugin");
instance = this; instance = this;
getLogger().info("Initializing Manager");
manager = new Manager().init(); manager = new Manager().init();
} }
@Override @Override
public void onDisable() { public void onDisable() {
manager.io.saveAll();
getLogger().info("Saved all IO files.");
} }
public static ArmorSMP getInstance() { public static ArmorSMP getInstance() {

View File

@@ -0,0 +1,31 @@
package me.trouper.armorsmp.data;
public enum ArmorTier {
NONE(0),
LEATHER(1),
CHAINMAIL(2),
GOLD(3),
IRON(4),
DIAMOND(5);
private int numeric;
ArmorTier(int numeric) {
this.numeric = numeric;
}
public int getNumeric() {
return numeric;
}
public static ArmorTier getTier(int numeric) {
for (ArmorTier value : values()) {
if (value.getNumeric() == numeric) return value;
if (value.getNumeric() < 1 ) return NONE;
if (value.getNumeric() > 5) {
return DIAMOND;
}
}
return NONE;
}
}

View File

@@ -9,12 +9,16 @@ import java.util.List;
public class Config implements JsonSerializable<Config> { public class Config implements JsonSerializable<Config> {
public boolean debugMode = false;
@Override @Override
public File getFile() { public File getFile() {
return ArmorSMP.getInstance().getManager().io.CONFIG_FILE; return ArmorSMP.getInstance().getManager().io.CONFIG_FILE;
} }
public boolean maceCraftingeEnabled = true; public boolean maceCraftingEnabled = true;
public boolean netherEnabled = true;
public boolean endEnabled = true;
public String mainColor = "&#00ff00"; public String mainColor = "&#00ff00";
public String prefix = "&9ArmorSMP> &7"; public String prefix = "&9ArmorSMP> &7";

View File

@@ -4,7 +4,9 @@ import io.github.itzispyder.pdk.utils.misc.config.JsonSerializable;
import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.ArmorSMP;
import java.io.File; import java.io.File;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map;
import java.util.Set; import java.util.Set;
public class Storage implements JsonSerializable<Storage> { public class Storage implements JsonSerializable<Storage> {
@@ -18,5 +20,7 @@ public class Storage implements JsonSerializable<Storage> {
public class UserData { public class UserData {
public Set<String> tipsDisabled = new HashSet<>(); public Set<String> tipsDisabled = new HashSet<>();
public Map<String, Integer> playerTiers = new HashMap<>();
public Map<String, Set<String>> playerTrust = new HashMap<>();
} }
} }

View File

@@ -1,16 +1,38 @@
package me.trouper.armorsmp.server; package me.trouper.armorsmp.server;
import me.trouper.armorsmp.ArmorSMP;
import me.trouper.armorsmp.data.IO; import me.trouper.armorsmp.data.IO;
import me.trouper.armorsmp.server.commands.AdminCommand;
import me.trouper.armorsmp.server.commands.TrustCommand;
import me.trouper.armorsmp.server.crafting.ArmorUpgrade;
import me.trouper.armorsmp.server.events.CraftEvent;
import me.trouper.armorsmp.server.functions.ArmorBackend;
public class Manager { public class Manager {
// My systems
public IO io; public IO io;
public ArmorBackend armor;
// Commands
public AdminCommand adminCommand;
public TrustCommand trustCommand;
// Events
public CraftEvent craftEvent;
public Manager() { public Manager() {
io = new IO(); io = new IO(); // IO must come as the first.
armor = new ArmorBackend();
adminCommand = new AdminCommand();
trustCommand = new TrustCommand();
craftEvent = new CraftEvent();
} }
public Manager init() { public Manager init() {
ArmorSMP.getInstance().getLogger().info("Loading all IO Files");
io.loadAll(); io.loadAll();
registerCommands(); registerCommands();
registerEvents(); registerEvents();
registerCrafting(); registerCrafting();
@@ -18,16 +40,23 @@ public class Manager {
return this; return this;
} }
private void registerEvents() {
private void registerEvents() {
ArmorSMP.getInstance().getLogger().info("Registering Events");
craftEvent.register();
} }
private void registerCommands() { private void registerCommands() {
ArmorSMP.getInstance().getLogger().info("Registering Commands");
adminCommand.register();
trustCommand.register();
} }
private void registerCrafting() { private void registerCrafting() {
ArmorSMP.getInstance().getLogger().info("Repairing Crafts");
ArmorUpgrade.removeRecipe();
ArmorUpgrade.addRecipe();
} }
} }

View File

@@ -11,22 +11,21 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandRegistry(value = "armorsmp_give", permission = @Permission("armorsmp.give")) @CommandRegistry(value = "armorsmp", permission = @Permission("op"), printStackTrace = true)
public class GiveCommand implements CustomCommand { public class AdminCommand implements CustomCommand {
@Override @Override
public void dispatchCommand(CommandSender commandSender, Command command, String label, Args args) { public void dispatchCommand(CommandSender sender, Command command, String label, Args args) {
String target = args.get(0).toString(); if (args.getSize() < 1) {
Player t = Bukkit.getPlayer(target); Text.sendError(sender, "Error: Valid sub-commands are: [change, give, toggle, reset, remove]");
if (t == null) {
Text.sendError((Player) commandSender);
return;
} }
switch (label) { switch (label) {
case "neth_axe" -> { case "change" -> {
} }
default -> {
Text.sendError(sender, "Error: Valid sub-commands are: [change, give, toggle, reset, remove]");
}
} }
} }

View File

@@ -6,7 +6,7 @@ import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
public class MaceToggleCommand implements CustomCommand { public class TrustCommand implements CustomCommand {
@Override @Override
public void dispatchCommand(CommandSender commandSender, Command command, String s, Args args) { public void dispatchCommand(CommandSender commandSender, Command command, String s, Args args) {

View File

@@ -0,0 +1,44 @@
package me.trouper.armorsmp.server.crafting;
import io.github.itzispyder.pdk.plugin.builders.ItemBuilder;
import me.trouper.armorsmp.ArmorSMP;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.ShapedRecipe;
public class ArmorUpgrade {
public static final ItemStack ARMOR_UGPRADE = ItemBuilder.create()
.material(Material.NETHER_STAR)
.name("§b§lArmor Upgrade")
.lore("§9| §3Right click to upgrade your gear")
.count(1)
.customModelData(1)
.build();
public static final NamespacedKey KEY = new NamespacedKey(ArmorSMP.getInstance(), "armor_upgrade_recipe");
public static ShapedRecipe recipe = new ShapedRecipe(KEY, ARMOR_UGPRADE);
public static void addRecipe() {
recipe.shape("ABC", "DEF", "GHI");
recipe.setIngredient('A', Material.DIAMOND_BLOCK);
recipe.setIngredient('B', Material.DIAMOND_BLOCK);
recipe.setIngredient('C', Material.DIAMOND_BLOCK);
recipe.setIngredient('D', Material.OMINOUS_TRIAL_KEY);
recipe.setIngredient('E', Material.ENCHANTED_GOLDEN_APPLE);
recipe.setIngredient('F', Material.OMINOUS_TRIAL_KEY);
recipe.setIngredient('G', Material.DIAMOND_BLOCK);
recipe.setIngredient('H', Material.DIAMOND_BLOCK);
recipe.setIngredient('I', Material.DIAMOND_BLOCK);
ArmorSMP.getInstance().getServer().addRecipe(recipe);
}
public static void removeRecipe() {
ArmorSMP.getInstance().getServer().removeRecipe(KEY);
}
}

View File

@@ -19,11 +19,11 @@ public class CraftEvent implements CustomListener {
&& !name.contains("CHESTPLATE") && !name.contains("CHESTPLATE")
&& !name.contains("LEGGINGS") && !name.contains("LEGGINGS")
&& !name.contains("BOOTS") && !name.contains("BOOTS")
&& !name.contains("NETHERITE_AXE")
&& !name.contains("NETHERITE_SWORD") && !name.contains("NETHERITE_SWORD")
&& !name.contains("NETHERITE_PICKAXE")
&& !name.contains("NETHERITE_AXE")
&& !name.contains("NETHERITE_SHOVEL") && !name.contains("NETHERITE_SHOVEL")
&& !name.contains("NETHERITE_HOE") && !name.contains("NETHERITE_HOE")
&& !name.contains("NETHERITE_PICKAXE")
) return; ) return;
e.setCancelled(true); e.setCancelled(true);

View File

@@ -0,0 +1,47 @@
package me.trouper.armorsmp.server.functions;
import me.trouper.armorsmp.ArmorSMP;
import me.trouper.armorsmp.data.ArmorTier;
import me.trouper.armorsmp.data.Storage;
import org.bukkit.entity.Player;
public class ArmorBackend {
private final Storage storage;
public ArmorBackend() {
storage = ArmorSMP.getInstance().getManager().io.storage;
}
public void setTier(Player target, ArmorTier tier) {
storage.userData.playerTiers.put(target.getUniqueId().toString(),tier.getNumeric());
storage.save();
}
public void setTier(Player target, int tier) {
setTier(target,ArmorTier.getTier(tier));
}
public void downTier(Player target) {
int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString());
setTier(target,ArmorTier.getTier(numeric - 1));
}
public void upTier(Player target) {
int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString());
setTier(target,ArmorTier.getTier(numeric + 1));
}
public ArmorTier getTier(Player target) {
int numeric = storage.userData.playerTiers.get(target.getUniqueId().toString());
for (ArmorTier value : ArmorTier.values()) {
if (value.getNumeric() == numeric) return value;
if (value.getNumeric() > 5) {
ArmorSMP.getInstance().getLogger().warning("Detected a player above tier 5 (diamond) this should not be possible. Setting them back to diamond.");
setTier(target,ArmorTier.DIAMOND);
return ArmorTier.DIAMOND;
}
}
return ArmorTier.NONE;
}
}

View File

@@ -8,6 +8,7 @@ import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.*; import java.util.*;
@@ -24,27 +25,33 @@ public class Text {
return LegacyComponentSerializer.legacyAmpersand().deserialize(msg); return LegacyComponentSerializer.legacyAmpersand().deserialize(msg);
} }
public static void sendWarning(Player player,String warning, Object... args) { public static void sendWarning(CommandSender sender, String warning, Object... args) {
sendMessage(Pallet.WARNING,player,warning,false,args); sendMessage(Pallet.WARNING, sender, warning, false, args);
} }
public static void sendError(Player player, String error, Object... args) { public static void sendError(CommandSender sender, String error, Object... args) {
sendMessage(Pallet.ERROR,player,error,false,args); sendMessage(Pallet.ERROR, sender, error, false, args);
} }
public static void sendMessage(Player player, String text, boolean allowTip, Object... args) { public static void sendMessage(CommandSender sender, String text, boolean allowTip, Object... args) {
sendMessage(Pallet.NEUTRAL,player,text,allowTip,args); sendMessage(Pallet.NEUTRAL, sender, text, allowTip, args);
} }
public static void sendMessage(Pallet pallet, Player player, String text, boolean allowTip, Object... args) { public static void sendMessage(Pallet pallet, CommandSender sender, String text, boolean allowTip, Object... args) {
text = formatArgs(pallet, text, args); text = formatArgs(pallet, text, args);
sendMessage(player,text,allowTip); sendMessage(sender, text, allowTip);
} }
public static void sendMessage(Player player, String text, boolean allowTip) { public static void sendMessage(CommandSender sender, String text, boolean allowTip) {
allowTip = allowTip && ArmorSMP.getInstance().getManager().io.config.tips.tipsEnabled && !ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.contains(player.getUniqueId().toString()); if (sender instanceof Player player) {
allowTip = allowTip
&& ArmorSMP.getInstance().getManager().io.config.tips.tipsEnabled
&& !ArmorSMP.getInstance().getManager().io.storage.userData.tipsDisabled.contains(player.getUniqueId().toString());
} else {
allowTip = false;
}
Component message = getMessage(text, allowTip); Component message = getMessage(text, allowTip);
player.sendMessage(message); sender.sendMessage(message);
} }
public static Component getMessage(String text, boolean addFancyTip) { public static Component getMessage(String text, boolean addFancyTip) {

View File

@@ -0,0 +1,70 @@
package me.trouper.armorsmp.utils;
import me.trouper.armorsmp.ArmorSMP;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.util.Arrays;
public class Verbose {
public static void send(int backtrace, String message, Object... args) {
if (!ArmorSMP.getInstance().getManager().io.config.debugMode) return;
String callerInfo = "Unknown Caller";
// Capture the stack trace to determine the caller
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
if (stackTrace.length > 2 + backtrace) { // Ensure we have enough depth
StackTraceElement caller = stackTrace[2 + backtrace]; // The method that called `verbose()`
String className = caller.getClassName();
className = className.substring(className.lastIndexOf(".") + 1);
if (className.contains("-")) {
callerInfo = "Protected";
} else {
callerInfo = className + "." + caller.getMethodName();
}
}
String formattedMessage = message.formatted(args);
String log = "[Sentinel] [DEBUG ^ %s] [%s]: %s".formatted(backtrace, callerInfo, formattedMessage);
ArmorSMP.getInstance().getLogger().info(log);
for (Player operator : Bukkit.getOnlinePlayers()) {
if (operator.isOp()) operator.sendMessage("§d§lSentinel §7[§bDEBUG ^ %s§7] §7[§e%s§7] §8» §7%s"
.formatted(backtrace, callerInfo, formattedMessage));
}
}
public static void send(String message, Object... args) {
if (!ArmorSMP.getInstance().getManager().io.config.debugMode) return;
String callerInfo = "Unknown Caller";
// Capture the stack trace to determine the caller
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
if (stackTrace.length > 2) { // Ensure we have enough depth
StackTraceElement caller = stackTrace[2]; // The method that called `verbose()`
String className = caller.getClassName();
className = className.substring(className.lastIndexOf(".") + 1);
if (className.contains("-")) {
callerInfo = "Protected";
} else {
callerInfo = className + "." + caller.getMethodName();
}
}
String formattedMessage = message.formatted(args);
String log = "[Sentinel] [DEBUG] [%s]: %s".formatted(callerInfo, formattedMessage);
ArmorSMP.getInstance().getLogger().info(log);
for (Player operator : Bukkit.getOnlinePlayers()) {
if (operator.isOp()) operator.sendMessage("§d§lSentinel §7[§bDEBUG§7] §7[§e%s§7] §8» §7%s"
.formatted(callerInfo, formattedMessage));
}
}
}

View File

@@ -6,3 +6,16 @@ prefix: ArmorSMP
load: STARTUP load: STARTUP
authors: [ obvWolf ] authors: [ obvWolf ]
description: Kill Based Armor Upgrading description: Kill Based Armor Upgrading
commands:
trust:
description: Make your friends immune to your abilities.
usage: "<add|remove|list> <target>"
aliases:
- t
armorsmp:
permission: op
description: Root command for giving items, everything is handled though alias labels.
usage: "/asmp usage"
aliases:
- asmp
- armor_smp