From f579eee88b43ddd10c2deb0ef25a661e30ef1836 Mon Sep 17 00:00:00 2001 From: Sen Date: Tue, 17 Jun 2025 11:41:25 +0200 Subject: [PATCH] add magic command, fix arg parser single digit negative numbers getting interpreted as flags --- .../java/common/enchantment/Enchantment.java | 53 ++++++++----------- .../enchantment/EnchantmentArrowDamage.java | 2 +- .../enchantment/EnchantmentArrowFire.java | 2 +- .../enchantment/EnchantmentArrowInfinite.java | 2 +- .../EnchantmentArrowKnockback.java | 2 +- .../common/enchantment/EnchantmentDamage.java | 2 +- .../enchantment/EnchantmentDigging.java | 2 +- .../enchantment/EnchantmentDraining.java | 2 +- .../enchantment/EnchantmentDurability.java | 2 +- .../enchantment/EnchantmentFireAspect.java | 2 +- .../enchantment/EnchantmentFishingSpeed.java | 2 +- .../common/enchantment/EnchantmentHelper.java | 2 +- .../enchantment/EnchantmentKnockback.java | 2 +- .../enchantment/EnchantmentLootBonus.java | 6 +-- .../enchantment/EnchantmentProtection.java | 9 +--- .../common/enchantment/EnchantmentThorns.java | 2 +- .../enchantment/EnchantmentUntouching.java | 2 +- .../main/java/common/init/TradeRegistry.java | 2 +- .../java/common/item/ItemEnchantedBook.java | 2 +- .../java/server/command/ArgumentSplitter.java | 8 +-- .../src/main/java/server/command/Command.java | 8 +++ .../server/command/CommandEnvironment.java | 1 + .../java/server/command/CompletingParser.java | 4 +- .../main/java/server/command/EnumParser.java | 5 +- .../java/server/command/PlayerItemParser.java | 27 ++++++++++ .../server/command/commands/CommandMagic.java | 52 ++++++++++++++++++ 26 files changed, 142 insertions(+), 63 deletions(-) create mode 100644 server/src/main/java/server/command/PlayerItemParser.java create mode 100644 server/src/main/java/server/command/commands/CommandMagic.java diff --git a/common/src/main/java/common/enchantment/Enchantment.java b/common/src/main/java/common/enchantment/Enchantment.java index a83fe87..01e5150 100755 --- a/common/src/main/java/common/enchantment/Enchantment.java +++ b/common/src/main/java/common/enchantment/Enchantment.java @@ -10,26 +10,23 @@ import common.entity.DamageSource; import common.entity.Entity; import common.entity.types.EntityLiving; import common.item.ItemStack; +import common.util.Displayable; +import common.util.Identifyable; -public abstract class Enchantment +public abstract class Enchantment implements Displayable, Identifyable { private static final String[] LEVELS = new String[] {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"}; - private static final Enchantment[] enchantmentsList = new Enchantment[256]; - public static final Enchantment[] enchantmentsBookList; - private static final Map locationEnchantments = Maps.newHashMap(); + private static final Enchantment[] LOOKUP = new Enchantment[256]; + public static final Enchantment[] ENCHANTMENTS; + private static final Map NAME_LOOKUP = Maps.newHashMap(); public static final Enchantment protection = new EnchantmentProtection(0, "protection", 10, 0); public static final Enchantment fireProtection = new EnchantmentProtection(1, "fire_protection", 5, 1); public static final Enchantment featherFalling = new EnchantmentProtection(2, "feather_falling", 5, 2); public static final Enchantment blastProtection = new EnchantmentProtection(3, "blast_protection", 2, 3); public static final Enchantment projectileProtection = new EnchantmentProtection(4, "projectile_protection", 5, 4); -// public static final Enchantment respiration = new EnchantmentOxygen(5, "respiration", 2); -// public static final Enchantment aquaAffinity = new EnchantmentWaterWorker(6, "aqua_affinity", 2); public static final Enchantment thorns = new EnchantmentThorns(7, "thorns", 1); -// public static final Enchantment depthStrider = new EnchantmentWaterWalker(8, "depth_strider", 2); public static final Enchantment sharpness = new EnchantmentDamage(16, "sharpness", 10); -// public static final Enchantment smite = new EnchantmentDamage(17, "smite", 5, 1); -// public static final Enchantment baneOfArthropods = new EnchantmentDamage(18, "bane_of_arthropods", 5, 2); public static final Enchantment knockback = new EnchantmentKnockback(19, "knockback", 5); public static final Enchantment fireAspect = new EnchantmentFireAspect(20, "fire_aspect", 2); public static final Enchantment looting = new EnchantmentLootBonus(21, "looting", 2, EnumEnchantmentType.WEAPON); @@ -43,40 +40,35 @@ public abstract class Enchantment public static final Enchantment infinity = new EnchantmentArrowInfinite(51, "infinity", 1); public static final Enchantment luckOfTheSea = new EnchantmentLootBonus(61, "luck_of_the_sea", 2, EnumEnchantmentType.FISHING_ROD); public static final Enchantment lure = new EnchantmentFishingSpeed(62, "lure", 2, EnumEnchantmentType.FISHING_ROD); - public static final Enchantment draining = new EnchantmentDraining(64, "draining", 1); public final int effectId; + private final String id; private final int weight; - /** The EnumEnchantmentType given to this Enchantment. */ public EnumEnchantmentType type; - - /** Used in localisation and stats. */ protected String name; - /** - * Retrieves an Enchantment from the enchantmentsList - */ public static Enchantment getEnchantmentById(int enchID) { - return enchID >= 0 && enchID < enchantmentsList.length ? enchantmentsList[enchID] : null; + return enchID >= 0 && enchID < LOOKUP.length ? LOOKUP[enchID] : null; } protected Enchantment(int enchID, String enchName, int enchWeight, EnumEnchantmentType enchType) { this.effectId = enchID; + this.id = enchName; this.weight = enchWeight; this.type = enchType; - if (enchantmentsList[enchID] != null) + if (LOOKUP[enchID] != null) { throw new IllegalArgumentException("Duplicate enchantment id!"); } else { - enchantmentsList[enchID] = this; - locationEnchantments.put(enchName, this); + LOOKUP[enchID] = this; + NAME_LOOKUP.put(enchName, this); } } @@ -85,12 +77,12 @@ public abstract class Enchantment */ public static Enchantment getEnchantmentByLocation(String location) { - return locationEnchantments.get(location); + return NAME_LOOKUP.get(location); } public static Set getNames() { - return locationEnchantments.keySet(); + return NAME_LOOKUP.keySet(); } /** @@ -159,26 +151,27 @@ public abstract class Enchantment return this != ench; } - /** - * Sets the enchantment name - */ - public Enchantment setName(String enchName) + public Enchantment setDisplay(String enchName) { this.name = enchName; return this; } + + public final String getName() { + return this.id; + } /** * Return the name of key of this enchantment. */ - public String getName() + public String getDisplay() { return this.name; } public String getFormattedName(int level) { - return this.getName() + " " + ((level >= 1 && level <= 10) ? LEVELS[level - 1] : "" + level); + return this.getDisplay() + " " + ((level >= 1 && level <= LEVELS.length) ? LEVELS[level - 1] : "" + level); } /** @@ -208,7 +201,7 @@ public abstract class Enchantment { List list = Lists.newArrayList(); - for (Enchantment enchantment : enchantmentsList) + for (Enchantment enchantment : LOOKUP) { if (enchantment != null) { @@ -216,6 +209,6 @@ public abstract class Enchantment } } - enchantmentsBookList = (Enchantment[])list.toArray(new Enchantment[list.size()]); + ENCHANTMENTS = (Enchantment[])list.toArray(new Enchantment[list.size()]); } } diff --git a/common/src/main/java/common/enchantment/EnchantmentArrowDamage.java b/common/src/main/java/common/enchantment/EnchantmentArrowDamage.java index 0525e6a..b4b35be 100755 --- a/common/src/main/java/common/enchantment/EnchantmentArrowDamage.java +++ b/common/src/main/java/common/enchantment/EnchantmentArrowDamage.java @@ -7,7 +7,7 @@ public class EnchantmentArrowDamage extends Enchantment public EnchantmentArrowDamage(int enchID, String enchName, int enchWeight) { super(enchID, enchName, enchWeight, EnumEnchantmentType.BOW); - this.setName("Stärke"); + this.setDisplay("Stärke"); } /** diff --git a/common/src/main/java/common/enchantment/EnchantmentArrowFire.java b/common/src/main/java/common/enchantment/EnchantmentArrowFire.java index e5e2658..659fd9f 100755 --- a/common/src/main/java/common/enchantment/EnchantmentArrowFire.java +++ b/common/src/main/java/common/enchantment/EnchantmentArrowFire.java @@ -7,7 +7,7 @@ public class EnchantmentArrowFire extends Enchantment public EnchantmentArrowFire(int enchID, String enchName, int enchWeight) { super(enchID, enchName, enchWeight, EnumEnchantmentType.BOW); - this.setName("Flamme"); + this.setDisplay("Flamme"); } /** diff --git a/common/src/main/java/common/enchantment/EnchantmentArrowInfinite.java b/common/src/main/java/common/enchantment/EnchantmentArrowInfinite.java index 860a44a..351b5c3 100755 --- a/common/src/main/java/common/enchantment/EnchantmentArrowInfinite.java +++ b/common/src/main/java/common/enchantment/EnchantmentArrowInfinite.java @@ -7,7 +7,7 @@ public class EnchantmentArrowInfinite extends Enchantment public EnchantmentArrowInfinite(int enchID, String enchName, int enchWeight) { super(enchID, enchName, enchWeight, EnumEnchantmentType.BOW); - this.setName("Unendlich"); + this.setDisplay("Unendlich"); } /** diff --git a/common/src/main/java/common/enchantment/EnchantmentArrowKnockback.java b/common/src/main/java/common/enchantment/EnchantmentArrowKnockback.java index 2e15fae..256adee 100755 --- a/common/src/main/java/common/enchantment/EnchantmentArrowKnockback.java +++ b/common/src/main/java/common/enchantment/EnchantmentArrowKnockback.java @@ -7,7 +7,7 @@ public class EnchantmentArrowKnockback extends Enchantment public EnchantmentArrowKnockback(int enchID, String enchName, int enchWeight) { super(enchID, enchName, enchWeight, EnumEnchantmentType.BOW); - this.setName("Schlag"); + this.setDisplay("Schlag"); } /** diff --git a/common/src/main/java/common/enchantment/EnchantmentDamage.java b/common/src/main/java/common/enchantment/EnchantmentDamage.java index 9be0458..d92bd1d 100755 --- a/common/src/main/java/common/enchantment/EnchantmentDamage.java +++ b/common/src/main/java/common/enchantment/EnchantmentDamage.java @@ -9,7 +9,7 @@ public class EnchantmentDamage extends Enchantment public EnchantmentDamage(int enchID, String enchName, int enchWeight) { super(enchID, enchName, enchWeight, EnumEnchantmentType.WEAPON); - this.setName("Schärfe"); + this.setDisplay("Schärfe"); } /** diff --git a/common/src/main/java/common/enchantment/EnchantmentDigging.java b/common/src/main/java/common/enchantment/EnchantmentDigging.java index a504816..0763826 100755 --- a/common/src/main/java/common/enchantment/EnchantmentDigging.java +++ b/common/src/main/java/common/enchantment/EnchantmentDigging.java @@ -9,7 +9,7 @@ public class EnchantmentDigging extends Enchantment protected EnchantmentDigging(int enchID, String enchName, int enchWeight) { super(enchID, enchName, enchWeight, EnumEnchantmentType.DIGGER); - this.setName("Effizienz"); + this.setDisplay("Effizienz"); } /** diff --git a/common/src/main/java/common/enchantment/EnchantmentDraining.java b/common/src/main/java/common/enchantment/EnchantmentDraining.java index ec8be82..8976a5a 100755 --- a/common/src/main/java/common/enchantment/EnchantmentDraining.java +++ b/common/src/main/java/common/enchantment/EnchantmentDraining.java @@ -10,7 +10,7 @@ import common.item.ItemStack; public class EnchantmentDraining extends Enchantment { public EnchantmentDraining(int enchID, String enchName, int enchWeight) { super(enchID, enchName, enchWeight, EnumEnchantmentType.WEAPON); - this.setName("Seelenentzug"); + this.setDisplay("Seelenentzug"); } public int getMinEnchantability(int enchantmentLevel) { diff --git a/common/src/main/java/common/enchantment/EnchantmentDurability.java b/common/src/main/java/common/enchantment/EnchantmentDurability.java index 8181411..0ed702f 100755 --- a/common/src/main/java/common/enchantment/EnchantmentDurability.java +++ b/common/src/main/java/common/enchantment/EnchantmentDurability.java @@ -10,7 +10,7 @@ public class EnchantmentDurability extends Enchantment protected EnchantmentDurability(int enchID, String enchName, int enchWeight) { super(enchID, enchName, enchWeight, EnumEnchantmentType.BREAKABLE); - this.setName("Haltbarkeit"); + this.setDisplay("Haltbarkeit"); } /** diff --git a/common/src/main/java/common/enchantment/EnchantmentFireAspect.java b/common/src/main/java/common/enchantment/EnchantmentFireAspect.java index 0e91e40..32b4cf9 100755 --- a/common/src/main/java/common/enchantment/EnchantmentFireAspect.java +++ b/common/src/main/java/common/enchantment/EnchantmentFireAspect.java @@ -7,7 +7,7 @@ public class EnchantmentFireAspect extends Enchantment protected EnchantmentFireAspect(int enchID, String enchName, int enchWeight) { super(enchID, enchName, enchWeight, EnumEnchantmentType.WEAPON); - this.setName("Verbrennung"); + this.setDisplay("Verbrennung"); } /** diff --git a/common/src/main/java/common/enchantment/EnchantmentFishingSpeed.java b/common/src/main/java/common/enchantment/EnchantmentFishingSpeed.java index 0ba0dd0..6be1fb4 100755 --- a/common/src/main/java/common/enchantment/EnchantmentFishingSpeed.java +++ b/common/src/main/java/common/enchantment/EnchantmentFishingSpeed.java @@ -7,7 +7,7 @@ public class EnchantmentFishingSpeed extends Enchantment protected EnchantmentFishingSpeed(int enchID, String enchName, int enchWeight, EnumEnchantmentType enchType) { super(enchID, enchName, enchWeight, enchType); - this.setName("Köder"); + this.setDisplay("Köder"); } /** diff --git a/common/src/main/java/common/enchantment/EnchantmentHelper.java b/common/src/main/java/common/enchantment/EnchantmentHelper.java index 4f99682..ec2572c 100755 --- a/common/src/main/java/common/enchantment/EnchantmentHelper.java +++ b/common/src/main/java/common/enchantment/EnchantmentHelper.java @@ -483,7 +483,7 @@ public class EnchantmentHelper Map map = null; boolean flag = p_77505_1_.getItem() == Items.book; - for (Enchantment enchantment : Enchantment.enchantmentsBookList) + for (Enchantment enchantment : Enchantment.ENCHANTMENTS) { if (enchantment != null && (enchantment.type.canEnchantItem(item) || flag)) { diff --git a/common/src/main/java/common/enchantment/EnchantmentKnockback.java b/common/src/main/java/common/enchantment/EnchantmentKnockback.java index 5fd4642..2f59c20 100755 --- a/common/src/main/java/common/enchantment/EnchantmentKnockback.java +++ b/common/src/main/java/common/enchantment/EnchantmentKnockback.java @@ -7,7 +7,7 @@ public class EnchantmentKnockback extends Enchantment protected EnchantmentKnockback(int p_i45768_1_, String p_i45768_2_, int p_i45768_3_) { super(p_i45768_1_, p_i45768_2_, p_i45768_3_, EnumEnchantmentType.WEAPON); - this.setName("Rückstoß"); + this.setDisplay("Rückstoß"); } /** diff --git a/common/src/main/java/common/enchantment/EnchantmentLootBonus.java b/common/src/main/java/common/enchantment/EnchantmentLootBonus.java index 036fdb8..80ac0f6 100755 --- a/common/src/main/java/common/enchantment/EnchantmentLootBonus.java +++ b/common/src/main/java/common/enchantment/EnchantmentLootBonus.java @@ -10,15 +10,15 @@ public class EnchantmentLootBonus extends Enchantment if (p_i45767_4_ == EnumEnchantmentType.DIGGER) { - this.setName("Glück"); + this.setDisplay("Glück"); } else if (p_i45767_4_ == EnumEnchantmentType.FISHING_ROD) { - this.setName("Glück des Meeres"); + this.setDisplay("Glück des Meeres"); } else { - this.setName("Plünderung"); + this.setDisplay("Plünderung"); } } diff --git a/common/src/main/java/common/enchantment/EnchantmentProtection.java b/common/src/main/java/common/enchantment/EnchantmentProtection.java index 6cfe6bc..34c26b8 100755 --- a/common/src/main/java/common/enchantment/EnchantmentProtection.java +++ b/common/src/main/java/common/enchantment/EnchantmentProtection.java @@ -33,13 +33,8 @@ public class EnchantmentProtection extends Enchantment public EnchantmentProtection(int id, String name, int weight, int type) { - super(id, name, weight, EnumEnchantmentType.ARMOR); + super(id, name, weight, type == 2 ? EnumEnchantmentType.ARMOR_FEET : EnumEnchantmentType.ARMOR); this.protectionType = type; - - if (type == 2) - { - this.type = EnumEnchantmentType.ARMOR_FEET; - } } /** @@ -82,7 +77,7 @@ public class EnchantmentProtection extends Enchantment } } - public String getName() + public String getDisplay() { return NAMES[this.protectionType]; } diff --git a/common/src/main/java/common/enchantment/EnchantmentThorns.java b/common/src/main/java/common/enchantment/EnchantmentThorns.java index 37b7455..2c69f57 100755 --- a/common/src/main/java/common/enchantment/EnchantmentThorns.java +++ b/common/src/main/java/common/enchantment/EnchantmentThorns.java @@ -13,7 +13,7 @@ public class EnchantmentThorns extends Enchantment public EnchantmentThorns(int p_i45764_1_, String p_i45764_2_, int p_i45764_3_) { super(p_i45764_1_, p_i45764_2_, p_i45764_3_, EnumEnchantmentType.ARMOR_TORSO); - this.setName("Dornen"); + this.setDisplay("Dornen"); } /** diff --git a/common/src/main/java/common/enchantment/EnchantmentUntouching.java b/common/src/main/java/common/enchantment/EnchantmentUntouching.java index 3508fca..df3dca6 100755 --- a/common/src/main/java/common/enchantment/EnchantmentUntouching.java +++ b/common/src/main/java/common/enchantment/EnchantmentUntouching.java @@ -9,7 +9,7 @@ public class EnchantmentUntouching extends Enchantment protected EnchantmentUntouching(int p_i45763_1_, String p_i45763_2_, int p_i45763_3_) { super(p_i45763_1_, p_i45763_2_, p_i45763_3_, EnumEnchantmentType.DIGGER); - this.setName("Behutsamkeit"); + this.setDisplay("Behutsamkeit"); } /** diff --git a/common/src/main/java/common/init/TradeRegistry.java b/common/src/main/java/common/init/TradeRegistry.java index 9d20098..3960f54 100755 --- a/common/src/main/java/common/init/TradeRegistry.java +++ b/common/src/main/java/common/init/TradeRegistry.java @@ -179,7 +179,7 @@ public abstract class TradeRegistry { static class BookForGem implements ITradeList { public void modifyMerchantRecipeList(MerchantRecipeList recipeList, Random random) { - Enchantment enchantment = random.pick(Enchantment.enchantmentsBookList); + Enchantment enchantment = random.pick(Enchantment.ENCHANTMENTS); int i = random.range(enchantment.getMinLevel(), enchantment.getMaxLevel()); ItemStack itemstack = Items.enchanted_book.getEnchantedItemStack(new RngEnchantment(enchantment, i)); int j = 2 + random.zrange(5 + i * 10) + 3 * i; diff --git a/common/src/main/java/common/item/ItemEnchantedBook.java b/common/src/main/java/common/item/ItemEnchantedBook.java index a09e39a..d162bc5 100755 --- a/common/src/main/java/common/item/ItemEnchantedBook.java +++ b/common/src/main/java/common/item/ItemEnchantedBook.java @@ -34,7 +34,7 @@ public class ItemEnchantedBook extends Item public void getSubItems(Item itemIn, CheatTab tab, List subItems) { - for (Enchantment enchantment : Enchantment.enchantmentsBookList) { + for (Enchantment enchantment : Enchantment.ENCHANTMENTS) { if(enchantment != null && enchantment.type != null) subItems.add(Items.enchanted_book.getEnchantedItemStack(new RngEnchantment(enchantment, enchantment.getMaxLevel()))); } diff --git a/server/src/main/java/server/command/ArgumentSplitter.java b/server/src/main/java/server/command/ArgumentSplitter.java index 8ad2700..b6aaa59 100644 --- a/server/src/main/java/server/command/ArgumentSplitter.java +++ b/server/src/main/java/server/command/ArgumentSplitter.java @@ -36,7 +36,7 @@ public record ArgumentSplitter(Map arguments, String command, parse = false; continue; } - else if(parse && (arg.startsWith("--") || (arg.startsWith("-") && arg.length() == 2))) { + else if(parse && (arg.startsWith("--") || (arg.startsWith("-") && arg.length() == 2 && (arg.charAt(1) < '0' || arg.charAt(1) > '9')))) { param = parameters.get(arg.substring(arg.startsWith("--") ? 2 : 1)); if(param != null && param.positional() && !args.containsKey(param.name())) { for(int n = 0; n < positionals.size(); n++) { @@ -75,7 +75,7 @@ public record ArgumentSplitter(Map arguments, String command, for(int n = pos ? 0 : 1; n < nargs + (pos ? 0 : 1); n++) { String par = inputs[n] = argv[z + n]; ArgumentParser parser = param.parsers().get(apos); - if(parse && (par.startsWith("--") || (par.startsWith("-") && par.length() == 2))) + if(parse && (par.startsWith("--") || (par.startsWith("-") && par.length() == 2 && (par.charAt(1) < '0' || par.charAt(1) > '9')))) if(nargs == 1 && param.name().equals(parser.getName())) throw new RunException("Position %d: Argument '%s': '%s' als Parameter verwendet", z + n, param.name(), par); else @@ -151,7 +151,7 @@ public record ArgumentSplitter(Map arguments, String command, parse = false; continue; } - else if(parse && (arg.startsWith("--") || (arg.startsWith("-") && arg.length() == 2))) { + else if(parse && (arg.startsWith("--") || (arg.startsWith("-") && arg.length() == 2 && (arg.charAt(1) < '0' || arg.charAt(1) > '9')))) { param = parameters.get(arg.substring(arg.startsWith("--") ? 2 : 1)); if(param != null && param.positional() && !args.contains(param.name())) { for(int n = 0; n < positionals.size(); n++) { @@ -182,7 +182,7 @@ public record ArgumentSplitter(Map arguments, String command, return custom != null ? custom : param.parsers().get(apos).getCompletions(env); } String par = argv[z + n]; - if(parse && (par.startsWith("--") || (par.startsWith("-") && par.length() == 2))) + if(parse && (par.startsWith("--") || (par.startsWith("-") && par.length() == 2 && (par.charAt(1) < '0' || par.charAt(1) > '9')))) return null; apos += 1; } diff --git a/server/src/main/java/server/command/Command.java b/server/src/main/java/server/command/Command.java index 8bfaad3..ca2e47c 100644 --- a/server/src/main/java/server/command/Command.java +++ b/server/src/main/java/server/command/Command.java @@ -192,6 +192,14 @@ public abstract class Command implements Executable { return this.addParameter(new PlayerEntityParser(name, defaulted, policy)); } + protected Command addPlayerItem(String name, boolean defaulted, UserPolicy policy) { + return this.addParameter(new PlayerItemParser(name, defaulted, policy)); + } + + protected Command addPlayerItem(String name, char shortName, boolean defaulted, UserPolicy policy) { + return this.addParameter(shortName, new PlayerItemParser(name, defaulted, policy)); + } + protected Command addPlayerEntityList(String name, boolean defaulted, UserPolicy policy) { return this.addParameter(new PlayerEntityListParser(name, defaulted, policy)); } diff --git a/server/src/main/java/server/command/CommandEnvironment.java b/server/src/main/java/server/command/CommandEnvironment.java index 756e7d2..0f9b257 100644 --- a/server/src/main/java/server/command/CommandEnvironment.java +++ b/server/src/main/java/server/command/CommandEnvironment.java @@ -262,5 +262,6 @@ public class CommandEnvironment { this.registerExecutable(new CommandRunat()); this.registerExecutable(new CommandRunas()); this.registerExecutable(new CommandExp()); + this.registerExecutable(new CommandMagic()); } } diff --git a/server/src/main/java/server/command/CompletingParser.java b/server/src/main/java/server/command/CompletingParser.java index 21c7de1..154f7a4 100644 --- a/server/src/main/java/server/command/CompletingParser.java +++ b/server/src/main/java/server/command/CompletingParser.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import common.util.Identifyable; + public abstract class CompletingParser extends ArgumentParser { private final List defCompletions; @@ -11,7 +13,7 @@ public abstract class CompletingParser extends ArgumentParser { super(name); this.defCompletions = new ArrayList(completions.length); for(Object comp : completions) { - this.defCompletions.add(String.valueOf(comp)); + this.defCompletions.add(comp instanceof Identifyable id ? id.getName() : String.valueOf(comp)); } } diff --git a/server/src/main/java/server/command/EnumParser.java b/server/src/main/java/server/command/EnumParser.java index 305dd00..2378fe8 100644 --- a/server/src/main/java/server/command/EnumParser.java +++ b/server/src/main/java/server/command/EnumParser.java @@ -3,6 +3,7 @@ package server.command; import java.util.Map; import common.collect.Maps; +import common.util.Identifyable; public class EnumParser extends DefaultingParser { private final Class clazz; @@ -14,7 +15,7 @@ public class EnumParser extends DefaultingParser { for(T obj : iter) { if(sb.length() > 1) sb.append("', '"); - sb.append(String.valueOf(obj)); + sb.append(obj instanceof Identifyable id ? id.getName() : String.valueOf(obj)); } return sb.append("'").toString(); } @@ -24,7 +25,7 @@ public class EnumParser extends DefaultingParser { this.clazz = clazz; this.selections = selections; for(T o : selections) { - this.lookup.put(o.toString().toLowerCase(), o); + this.lookup.put(o instanceof Identifyable id ? id.getName() : o.toString().toLowerCase(), o); } } diff --git a/server/src/main/java/server/command/PlayerItemParser.java b/server/src/main/java/server/command/PlayerItemParser.java new file mode 100644 index 0000000..6c77aa0 --- /dev/null +++ b/server/src/main/java/server/command/PlayerItemParser.java @@ -0,0 +1,27 @@ +package server.command; + +import common.entity.npc.EntityNPC; +import common.item.ItemStack; + +public class PlayerItemParser extends PlayerEntityParser { + public PlayerItemParser(String name, boolean useSender, UserPolicy policy) { + super(name, useSender, policy); + } + + public Object parse(CommandEnvironment env, String input) { + EntityNPC entity = (EntityNPC)super.parse(env, input); + ItemStack stack = entity.getHeldItem(); + if(stack == null) + throw new RunException("%s hält keinen Gegenstand in der Hand", entity.getCommandName()); + return stack; + } + + public Object getDefault(CommandEnvironment env) { + EntityNPC entity = (EntityNPC)super.getDefault(env); + return entity == null ? null : entity.getHeldItem(); + } + + public Class getTypeClass(boolean required) { + return ItemStack.class; + } +} diff --git a/server/src/main/java/server/command/commands/CommandMagic.java b/server/src/main/java/server/command/commands/CommandMagic.java new file mode 100644 index 0000000..b08d660 --- /dev/null +++ b/server/src/main/java/server/command/commands/CommandMagic.java @@ -0,0 +1,52 @@ +package server.command.commands; + +import java.util.Map.Entry; + +import common.enchantment.Enchantment; +import common.enchantment.EnchantmentHelper; +import common.item.ItemStack; +import server.command.Command; +import server.command.CommandEnvironment; +import server.command.Executor; +import server.command.RunException; +import server.command.UserPolicy; + +public class CommandMagic extends Command { + public CommandMagic() { + super("magic"); + + this.addEnum("enchantment", Enchantment.class, Enchantment.ENCHANTMENTS); + this.setParamsOptional(); + this.addInt("level", 1, 32767); + this.addFlag("remove", 'r'); + this.addFlag("force", 'f'); + this.setParamsRequired(); + this.addPlayerItem("player", 'p', true, UserPolicy.NON_ADMINS_OR_SELF); + } + + public void exec(CommandEnvironment env, Executor exec, Enchantment ench, Integer level, boolean remove, boolean force, ItemStack stack) { + if(remove) { + int current = EnchantmentHelper.getEnchantmentLevel(ench.effectId, stack); + if(current == 0) + throw new RunException("%s hat die Verzauberung %s nicht", stack.getDisplayName(), ench.getDisplay()); + stack.removeEnchantment(ench); + exec.log("Verzauberung %s wurde von %s entfernt", ench.getFormattedName(current), stack.getDisplayName()); + return; + } + level = level == null ? ench.getMaxLevel() : level; + if(!force) { + if(level > ench.getMaxLevel()) + throw new RunException("Level %d ist zu hoch für %s, maximal %d erlaubt", level, ench.getDisplay(), ench.getMaxLevel()); + if(!ench.canApply(stack)) + throw new RunException("Verzauberung %s kann nicht auf %s verwendet werden", ench.getDisplay(), stack.getDisplayName()); + for(Entry id : EnchantmentHelper.getEnchantments(stack).entrySet()) { + Enchantment enc = Enchantment.getEnchantmentById(id.getKey()); + if(enc != ench && !ench.canApplyTogether(enc)) + throw new RunException("Verzauberung %s kann nicht zusammen mit %s verwendet werden", ench.getDisplay(), enc.getFormattedName(id.getValue())); + } + } + stack.removeEnchantment(ench); + stack.addEnchantment(ench, level); + exec.log("Verzauberung %s wurde zu %s hinzugefügt", ench.getFormattedName(level), stack.getDisplayName()); + } +}