From 9bd35a2cd2a6a91602afb4309e82f18a4c421de3 Mon Sep 17 00:00:00 2001 From: triagonal <10545540+triagonal@users.noreply.github.com> Date: Wed, 23 Jun 2021 22:44:47 +1000 Subject: [PATCH 01/29] Fix regression in /back behavior (#4264) --- .../main/java/com/earth2me/essentials/AsyncTeleport.java | 7 +++++-- .../src/main/java/com/earth2me/essentials/UserData.java | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java index 12d5eb23be2..1befe4ecb6c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java @@ -163,7 +163,6 @@ protected void nowAsync(final IUser teleportee, final ITarget target, final Tele future.complete(false); return; } - teleportee.setLastLocation(); if (!ess.getSettings().isForcePassengerTeleport() && !teleportee.getBase().isEmpty()) { if (!ess.getSettings().isTeleportPassengerDismount()) { @@ -178,7 +177,11 @@ protected void nowAsync(final IUser teleportee, final ITarget target, final Tele return; } } - teleportee.setLastLocation(); + + if (teleportee.isAuthorized("essentials.back.onteleport")) { + teleportee.setLastLocation(); + } + final Location targetLoc = target.getLocation(); if (ess.getSettings().isTeleportSafetyEnabled() && LocationUtil.isBlockOutsideWorldBorder(targetLoc.getWorld(), targetLoc.getBlockX(), targetLoc.getBlockZ())) { targetLoc.setX(LocationUtil.getXInsideWorldBorder(targetLoc.getWorld(), targetLoc.getBlockX())); diff --git a/Essentials/src/main/java/com/earth2me/essentials/UserData.java b/Essentials/src/main/java/com/earth2me/essentials/UserData.java index f6ebd70f92e..46834a18354 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/UserData.java +++ b/Essentials/src/main/java/com/earth2me/essentials/UserData.java @@ -262,7 +262,8 @@ public boolean hasPowerTools() { } public Location getLastLocation() { - return holder.lastLocation().location(); + final LazyLocation lastLocation = holder.lastLocation(); + return lastLocation != null ? lastLocation.location() : null; } public void setLastLocation(final Location loc) { From e1441c1d330ef60890a80c40c1a05ac805135243 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Tue, 8 Jun 2021 13:53:42 -0400 Subject: [PATCH 02/29] Update mobs and NMS usage to 1.17 Co-authored-by: MD <1917406+mdcfe@users.noreply.github.com> --- .../java/com/earth2me/essentials/Mob.java | 3 +++ .../com/earth2me/essentials/MobCompat.java | 12 ++++++++++++ .../java/com/earth2me/essentials/MobData.java | 19 +++++++++++++++++++ .../essentials/utils/VersionUtil.java | 9 +++++++-- README.md | 2 +- .../essentials.base-conventions.gradle.kts | 2 +- .../main/java/net/ess3/nms/refl/ReflUtil.java | 16 +++++++++++++--- 7 files changed, 56 insertions(+), 7 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Mob.java b/Essentials/src/main/java/com/earth2me/essentials/Mob.java index 70e42d2fad3..d48507d5d30 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Mob.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Mob.java @@ -102,6 +102,9 @@ public enum Mob { STRIDER("Strider", Enemies.FRIENDLY, "STRIDER"), ZOGLIN("Zoglin", Enemies.ENEMY, "ZOGLIN"), PIGLIN_BRUTE("PiglinBrute", Enemies.ADULT_ENEMY, "PIGLIN_BRUTE"), + AXOLOTL("Axolotl", Enemies.FRIENDLY, "AXOLOTL"), + GOAT("Goat", Enemies.NEUTRAL, "GOAT"), + GLOW_SQUID("GlowSquid", Enemies.FRIENDLY, "GLOW_SQUID"), ; public static final Logger logger = Logger.getLogger("Essentials"); diff --git a/Essentials/src/main/java/com/earth2me/essentials/MobCompat.java b/Essentials/src/main/java/com/earth2me/essentials/MobCompat.java index e54e20800d3..aca8ad8768d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/MobCompat.java +++ b/Essentials/src/main/java/com/earth2me/essentials/MobCompat.java @@ -3,6 +3,7 @@ import com.earth2me.essentials.utils.EnumUtil; import com.earth2me.essentials.utils.VersionUtil; import net.ess3.nms.refl.ReflUtil; +import org.bukkit.entity.Axolotl; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Fox; @@ -34,6 +35,8 @@ public final class MobCompat { public static final EntityType STRAY = getEntityType("STRAY"); public static final EntityType FOX = getEntityType("FOX"); public static final EntityType PHANTOM = getEntityType("PHANTOM"); + public static final EntityType AXOLOTL = getEntityType("AXOLOTL"); + public static final EntityType GOAT = getEntityType("GOAT"); // Constants for mobs that have changed since earlier versions public static final EntityType CAT = getEntityType("CAT", "OCELOT"); @@ -152,6 +155,15 @@ public static void setFoxType(final Entity entity, final String type) { } } + public static void setAxolotlVariant(final Entity entity, final String variant) { + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_17_R01)) { + return; + } + if (entity instanceof Axolotl) { + ((Axolotl) entity).setVariant(Axolotl.Variant.valueOf(variant)); + } + } + public enum CatType { // These are (loosely) Mojang names for the cats SIAMESE("SIAMESE", "SIAMESE_CAT"), diff --git a/Essentials/src/main/java/com/earth2me/essentials/MobData.java b/Essentials/src/main/java/com/earth2me/essentials/MobData.java index 20397d35203..1ce907d4153 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/MobData.java +++ b/Essentials/src/main/java/com/earth2me/essentials/MobData.java @@ -3,13 +3,17 @@ import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import com.earth2me.essentials.utils.EnumUtil; import com.earth2me.essentials.utils.StringUtil; +import com.earth2me.essentials.utils.VersionUtil; import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.entity.Ageable; +import org.bukkit.entity.Axolotl; +import org.bukkit.entity.ChestedHorse; import org.bukkit.entity.Creeper; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.ExperienceOrb; +import org.bukkit.entity.Goat; import org.bukkit.entity.Horse; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Phantom; @@ -185,6 +189,8 @@ public enum MobData { RAID_LEADER("leader", MobCompat.RAIDER, Data.RAID_LEADER, true), TROPICAL_FISH_BODY_COLOR("fish_body_color", Arrays.stream(DyeColor.values()).map(color -> color.name().toLowerCase(Locale.ENGLISH) + "body").collect(Collectors.toList()), MobCompat.TROPICAL_FISH, Data.FISH_BODY_COLOR, true), TROPICAL_FISH_PATTERN_COLOR("fish_pattern_color", Arrays.stream(DyeColor.values()).map(color -> color.name().toLowerCase(Locale.ENGLISH) + "pattern").collect(Collectors.toList()), MobCompat.TROPICAL_FISH, Data.FISH_PATTERN_COLOR, true), + COLORABLE_AXOLOTL("", Arrays.stream(Axolotl.Variant.values()).map(color -> color.name().toLowerCase(Locale.ENGLISH)).collect(Collectors.toList()), MobCompat.AXOLOTL, Data.COLORABLE, true), + SCREAMING_GOAT("screaming", MobCompat.GOAT, Data.GOAT_SCREAMING, true), ; public static final Logger logger = Logger.getLogger("Essentials"); @@ -270,6 +276,12 @@ public void setData(final Entity spawned, final Player target, final String rawD ((Ageable) spawned).setAdult(); } else if (this.value.equals(Data.BABY)) { ((Ageable) spawned).setBaby(); + } else if (this.value.equals(Data.CHEST)) { + if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_11_R01)) { + ((ChestedHorse) spawned).setCarryingChest(true); + } else { + ((Horse) spawned).setCarryingChest(true); + } } else if (this.value.equals(Data.ADULTZOMBIE)) { ((Zombie) spawned).setBaby(false); } else if (this.value.equals(Data.BABYZOMBIE)) { @@ -356,6 +368,8 @@ public void setData(final Entity spawned, final Player target, final String rawD break; } } + } else if (this.value.equals(Data.GOAT_SCREAMING)) { + ((Goat) spawned).setScreaming(true); } else if (this.value instanceof String) { final String[] split = ((String) this.value).split(":"); switch (split[0]) { @@ -383,6 +397,10 @@ public void setData(final Entity spawned, final Player target, final String rawD case "fox": MobCompat.setFoxType(spawned, split[1]); break; + case "axolotl": { + MobCompat.setAxolotlVariant(spawned, split[1]); + break; + } } } else { logger.warning("Unknown mob data type: " + this.toString()); @@ -406,5 +424,6 @@ public enum Data { RAID_LEADER, FISH_BODY_COLOR, FISH_PATTERN_COLOR, + GOAT_SCREAMING, } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java index 11a9db6015c..83477f4811a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java @@ -32,8 +32,9 @@ public final class VersionUtil { public static final BukkitVersion v1_15_2_R01 = BukkitVersion.fromString("1.15.2-R0.1-SNAPSHOT"); public static final BukkitVersion v1_16_1_R01 = BukkitVersion.fromString("1.16.1-R0.1-SNAPSHOT"); public static final BukkitVersion v1_16_5_R01 = BukkitVersion.fromString("1.16.5-R0.1-SNAPSHOT"); + public static final BukkitVersion v1_17_R01 = BukkitVersion.fromString("1.17-R0.1-SNAPSHOT"); - private static final Set supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01, v1_14_4_R01, v1_15_2_R01, v1_16_5_R01); + private static final Set supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01, v1_14_4_R01, v1_15_2_R01, v1_16_5_R01, v1_17_R01); private static final Map unsupportedServerClasses; @@ -65,7 +66,11 @@ public final class VersionUtil { builder.put("net.fabricmc.loader.launch.knot.KnotServer", SupportStatus.UNSTABLE); // Misc translation layers that do not add NMS will be caught by this - builder.put("!net.minecraft.server." + ReflUtil.getNMSVersion() + ".MinecraftServer", SupportStatus.NMS_CLEANROOM); + if (ReflUtil.getNmsVersionObject().isHigherThanOrEqualTo(ReflUtil.V1_17_R1)) { + builder.put("!net.minecraft.server.MinecraftServer", SupportStatus.NMS_CLEANROOM); + } else { + builder.put("!net.minecraft.server." + ReflUtil.getNMSVersion() + ".MinecraftServer", SupportStatus.NMS_CLEANROOM); + } unsupportedServerClasses = builder.build(); } diff --git a/README.md b/README.md index 54ebc9dd328..3ba7eed330c 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ EssentialsX is almost a completely drop-in replacement for Essentials. However, * **EssentialsX requires Java 8 or higher.** On older versions, the plugin may not work properly. -* **EssentialsX supports Minecraft versions 1.8.8, 1.9.4, 1.10.2, 1.11.2, 1.12.2, 1.13.2, 1.14.4, 1.15.2, and 1.16.5.** +* **EssentialsX supports Minecraft versions 1.8.8, 1.9.4, 1.10.2, 1.11.2, 1.12.2, 1.13.2, 1.14.4, 1.15.2, 1.16.5, and 1.17** Support diff --git a/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts b/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts index d046d8c87bb..1fdc23cfd58 100644 --- a/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/essentials.base-conventions.gradle.kts @@ -10,7 +10,7 @@ plugins { val baseExtension = extensions.create("essentials", project) val checkstyleVersion = "8.36.2" -val spigotVersion = "1.16.5-R0.1-SNAPSHOT" +val spigotVersion = "1.17-R0.1-SNAPSHOT" val junit5Version = "5.7.0" val mockitoVersion = "3.2.0" diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/ReflUtil.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/ReflUtil.java index 7515c3e8f35..7d1a3ac9124 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/ReflUtil.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/ReflUtil.java @@ -19,6 +19,7 @@ public final class ReflUtil { public static final NMSVersion V1_12_R1 = NMSVersion.fromString("v1_12_R1"); public static final NMSVersion V1_9_R1 = NMSVersion.fromString("v1_9_R1"); public static final NMSVersion V1_11_R1 = NMSVersion.fromString("v1_11_R1"); + public static final NMSVersion V1_17_R1 = NMSVersion.fromString("v1_17_R1"); private static final Map> classCache = new HashMap<>(); private static final Table, String, Method> methodCache = HashBasedTable.create(); private static final Table, MethodParams, Method> methodParamCache = HashBasedTable.create(); @@ -46,17 +47,26 @@ public static String getNMSVersion() { public static NMSVersion getNmsVersionObject() { if (nmsVersionObject == null) { - nmsVersionObject = NMSVersion.fromString(getNMSVersion()); + try { + nmsVersionObject = NMSVersion.fromString(getNMSVersion()); + } catch (final IllegalArgumentException e) { + try { + Class.forName("org.bukkit.craftbukkit.CraftServer"); + nmsVersionObject = new NMSVersion(99, 99, 99); // Mojang Dev Mappings + } catch (final ClassNotFoundException ignored) { + throw e; + } + } } return nmsVersionObject; } public static Class getNMSClass(final String className) { - return getClassCached("net.minecraft.server." + getNMSVersion() + "." + className); + return getClassCached("net.minecraft.server" + (ReflUtil.getNmsVersionObject().isLowerThan(ReflUtil.V1_17_R1) ? "." + getNMSVersion() : "") + "." + className); } public static Class getOBCClass(final String className) { - return getClassCached("org.bukkit.craftbukkit." + getNMSVersion() + "." + className); + return getClassCached("org.bukkit.craftbukkit" + (getNmsVersionObject().getMajor() == 99 ? "" : ("." + getNMSVersion())) + "." + className); } public static Class getClassCached(final String className) { From 4271938c3af26bf10677c50fb1434a95c8dcc25d Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Fri, 11 Jun 2021 10:46:48 -0400 Subject: [PATCH 03/29] Add ice commmand #EasterEgg --- .../essentials/commands/Commandice.java | 59 +++++++++++++++++++ .../src/main/resources/messages.properties | 10 ++++ Essentials/src/main/resources/plugin.yml | 4 ++ 3 files changed, 73 insertions(+) create mode 100644 Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java new file mode 100644 index 00000000000..dc0eaba9b0b --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java @@ -0,0 +1,59 @@ +package com.earth2me.essentials.commands; + +import com.earth2me.essentials.ChargeException; +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.VersionUtil; +import net.ess3.api.IUser; +import net.ess3.api.MaxMoneyException; +import org.bukkit.Server; + +import java.util.Collections; +import java.util.List; + +import static com.earth2me.essentials.I18n.tl; + +public class Commandice extends EssentialsLoopCommand { + public Commandice() { + super("ice"); + } + + @Override + protected void run(Server server, CommandSource sender, String commandLabel, String[] args) throws Exception { + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_17_R01)) { + sender.sendMessage(tl("unsupportedFeature")); + return; + } + + if (args.length == 0 && !sender.isPlayer()) { + throw new NotEnoughArgumentsException(); + } + + if (args.length > 0 && sender.isAuthorized("essentials.ice.others", ess)) { + loopOnlinePlayers(server, sender, false, true, args[0], null); + return; + } + //noinspection ConstantConditions + freezePlayer(sender.getUser(ess)); + } + + @Override + protected void updatePlayer(Server server, CommandSource sender, User user, String[] args) throws NotEnoughArgumentsException, PlayerExemptException, ChargeException, MaxMoneyException { + freezePlayer(user); + user.sendMessage(tl("iceOther")); + } + + private void freezePlayer(final IUser user) { + user.getBase().setFreezeTicks(user.getBase().getMaxFreezeTicks()); + user.sendMessage(tl("ice")); + } + + @Override + protected List getTabCompleteOptions(Server server, CommandSource sender, String commandLabel, String[] args) { + if (args.length == 1 && sender.isAuthorized("essentials.ice.others", ess)) { + return getPlayers(server, sender); + } else { + return Collections.emptyList(); + } + } +} diff --git a/Essentials/src/main/resources/messages.properties b/Essentials/src/main/resources/messages.properties index 408287cc711..36b94f3c37f 100644 --- a/Essentials/src/main/resources/messages.properties +++ b/Essentials/src/main/resources/messages.properties @@ -438,6 +438,16 @@ homeConfirmation=\u00a76You already have a home named \u00a7c{0}\u00a76!\nTo ove homeSet=\u00a76Home set to current location. hour=hour hours=hours +ice=\u00a76You feel much colder... +iceCommandDescription=Cools a player off. +iceCommandUsage=/ [player] +iceCommandUsage1=/ +iceCommandUsage1Description=Cools you off +iceCommandUsage2=/ +iceCommandUsage2Description=Cools the given player off +iceCommandUsage3=/ * +iceCommandUsage3Description=Cools all online players off +iceOther=\u00a76Chilling\u00a7c {0}\u00a76. ignoreCommandDescription=Ignore or unignore other players. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/plugin.yml b/Essentials/src/main/resources/plugin.yml index abe569bcd50..e96ec4affa5 100644 --- a/Essentials/src/main/resources/plugin.yml +++ b/Essentials/src/main/resources/plugin.yml @@ -208,6 +208,10 @@ commands: description: Teleport to your home. usage: / [player:][name] aliases: [ehome,homes,ehomes] + ice: + description: Cools a player off. + usage: / [player] + aliases: [eice, efreeze] ignore: description: Ignore or unignore other players. usage: / From 6bd4a6a037c691392dcf4aa652e9f8d195469b40 Mon Sep 17 00:00:00 2001 From: Flask Bot <67512990+Flask-Bot@users.noreply.github.com> Date: Sat, 26 Jun 2021 16:40:50 +0100 Subject: [PATCH 04/29] Update items.json from generator --- Essentials/src/main/resources/items.json | 11559 ++++++++++++++++++++- 1 file changed, 11530 insertions(+), 29 deletions(-) diff --git a/Essentials/src/main/resources/items.json b/Essentials/src/main/resources/items.json index d664e3e1f7d..f84a126f738 100644 --- a/Essentials/src/main/resources/items.json +++ b/Essentials/src/main/resources/items.json @@ -338,6 +338,34 @@ "material": "ALLIUM" }, "minecraft:allium": "allium", + "amethyst_block": { + "material": "AMETHYST_BLOCK" + }, + "amethyst": "amethyst_block", + "amethystblock": "amethyst_block", + "cave": "amethyst_block", + "caveblock": "amethyst_block", + "minecraft:amethyst_block": "amethyst_block", + "amethyst_cluster": { + "material": "AMETHYST_CLUSTER" + }, + "amethystclump": "amethyst_cluster", + "amethystcluster": "amethyst_cluster", + "caveclump": "amethyst_cluster", + "cavecluster": "amethyst_cluster", + "clumpamethyst": "amethyst_cluster", + "clumpcave": "amethyst_cluster", + "clusteramethyst": "amethyst_cluster", + "clustercave": "amethyst_cluster", + "minecraft:amethyst_cluster": "amethyst_cluster", + "amethyst_shard": { + "material": "AMETHYST_SHARD" + }, + "amethystfragment": "amethyst_shard", + "amethystshard": "amethyst_shard", + "cavefragment": "amethyst_shard", + "caveshard": "amethyst_shard", + "minecraft:amethyst_shard": "amethyst_shard", "ancient_debris": { "material": "ANCIENT_DEBRIS" }, @@ -477,6 +505,117 @@ "awkwardtarr": "awkward_tipped_arrow", "awkwardtarrow": "awkward_tipped_arrow", "awkwardtippedarrow": "awkward_tipped_arrow", + "axolotl_bucket": { + "material": "AXOLOTL_BUCKET" + }, + "axolotlbucket": "axolotl_bucket", + "axolotlbukkit": "axolotl_bucket", + "axolotlpail": "axolotl_bucket", + "bucketoaxolotl": "axolotl_bucket", + "bucketowalkingfish": "axolotl_bucket", + "minecraft:axolotl_bucket": "axolotl_bucket", + "walkingfishbucket": "axolotl_bucket", + "walkingfishbukkit": "axolotl_bucket", + "walkingfishpail": "axolotl_bucket", + "axolotl_spawn_egg": { + "material": "AXOLOTL_SPAWN_EGG" + }, + "axolotlegg": "axolotl_spawn_egg", + "axolotlsegg": "axolotl_spawn_egg", + "axolotlspawn": "axolotl_spawn_egg", + "axolotlspawnegg": "axolotl_spawn_egg", + "eggaxolotl": "axolotl_spawn_egg", + "eggwalkingfish": "axolotl_spawn_egg", + "minecraft:axolotl_spawn_egg": "axolotl_spawn_egg", + "seggaxolotl": "axolotl_spawn_egg", + "seggwalkingfish": "axolotl_spawn_egg", + "spawnaxolotl": "axolotl_spawn_egg", + "spawneggaxolotl": "axolotl_spawn_egg", + "spawneggwalkingfish": "axolotl_spawn_egg", + "spawnwalkingfish": "axolotl_spawn_egg", + "walkingfishegg": "axolotl_spawn_egg", + "walkingfishsegg": "axolotl_spawn_egg", + "walkingfishspawn": "axolotl_spawn_egg", + "walkingfishspawnegg": "axolotl_spawn_egg", + "axolotl_spawner": { + "entity": "AXOLOTL", + "material": "SPAWNER" + }, + "axolotlcage": "axolotl_spawner", + "axolotlmcage": "axolotl_spawner", + "axolotlmobcage": "axolotl_spawner", + "axolotlmobspawner": "axolotl_spawner", + "axolotlmonstercage": "axolotl_spawner", + "axolotlmonsterspawner": "axolotl_spawner", + "axolotlmspawner": "axolotl_spawner", + "axolotlspawner": "axolotl_spawner", + "walkingfishcage": "axolotl_spawner", + "walkingfishmcage": "axolotl_spawner", + "walkingfishmobcage": "axolotl_spawner", + "walkingfishmobspawner": "axolotl_spawner", + "walkingfishmonstercage": "axolotl_spawner", + "walkingfishmonsterspawner": "axolotl_spawner", + "walkingfishmspawner": "axolotl_spawner", + "walkingfishspawner": "axolotl_spawner", + "azalea": { + "material": "AZALEA" + }, + "minecraft:azalea": "azalea", + "azalea_leaves": { + "material": "AZALEA_LEAVES" + }, + "azaleaf": "azalea_leaves", + "azalealeaf": "azalea_leaves", + "azalealeave": "azalea_leaves", + "azalealeaves": "azalea_leaves", + "azalealogleaf": "azalea_leaves", + "azalealogleave": "azalea_leaves", + "azalealogleaves": "azalea_leaves", + "azaleatreeleaf": "azalea_leaves", + "azaleatreeleave": "azalea_leaves", + "azaleatreeleaves": "azalea_leaves", + "azaleatrunkleaf": "azalea_leaves", + "azaleatrunkleave": "azalea_leaves", + "azaleatrunkleaves": "azalea_leaves", + "azaleave": "azalea_leaves", + "azaleaves": "azalea_leaves", + "azaleawoodleaf": "azalea_leaves", + "azaleawoodleave": "azalea_leaves", + "azaleawoodleaves": "azalea_leaves", + "azalogleaf": "azalea_leaves", + "azalogleave": "azalea_leaves", + "azalogleaves": "azalea_leaves", + "azatreeleaf": "azalea_leaves", + "azatreeleave": "azalea_leaves", + "azatreeleaves": "azalea_leaves", + "azatrunkleaf": "azalea_leaves", + "azatrunkleave": "azalea_leaves", + "azatrunkleaves": "azalea_leaves", + "azawoodleaf": "azalea_leaves", + "azawoodleave": "azalea_leaves", + "azawoodleaves": "azalea_leaves", + "azleaf": "azalea_leaves", + "azleave": "azalea_leaves", + "azleaves": "azalea_leaves", + "azlogleaf": "azalea_leaves", + "azlogleave": "azalea_leaves", + "azlogleaves": "azalea_leaves", + "aztreeleaf": "azalea_leaves", + "aztreeleave": "azalea_leaves", + "aztreeleaves": "azalea_leaves", + "aztrunkleaf": "azalea_leaves", + "aztrunkleave": "azalea_leaves", + "aztrunkleaves": "azalea_leaves", + "azwoodleaf": "azalea_leaves", + "azwoodleave": "azalea_leaves", + "azwoodleaves": "azalea_leaves", + "leafaz": "azalea_leaves", + "leafaza": "azalea_leaves", + "leafazalea": "azalea_leaves", + "leavesaz": "azalea_leaves", + "leavesaza": "azalea_leaves", + "leavesazalea": "azalea_leaves", + "minecraft:azalea_leaves": "azalea_leaves", "azure_bluet": { "material": "AZURE_BLUET" }, @@ -502,6 +641,7 @@ "basalt": { "material": "BASALT" }, + "bas": "basalt", "basaltb": "basalt", "basaltbl": "basalt", "basaltblock": "basalt", @@ -509,6 +649,9 @@ "basaltstb": "basalt", "basaltstbl": "basalt", "basaltstblock": "basalt", + "basb": "basalt", + "basbl": "basalt", + "basblock": "basalt", "bast": "basalt", "bastb": "basalt", "bastbl": "basalt", @@ -615,6 +758,11 @@ "material": "BELL" }, "minecraft:bell": "bell", + "big_dripleaf": { + "material": "BIG_DRIPLEAF" + }, + "bigdripleaf": "big_dripleaf", + "minecraft:big_dripleaf": "big_dripleaf", "birch_boat": { "material": "BIRCH_BOAT" }, @@ -1169,6 +1317,13 @@ "blabed": "black_bed", "blackbed": "black_bed", "minecraft:black_bed": "black_bed", + "black_candle": { + "material": "BLACK_CANDLE" + }, + "bkcandle": "black_candle", + "blacandle": "black_candle", + "blackcandle": "black_candle", + "minecraft:black_candle": "black_candle", "black_carpet": { "material": "BLACK_CARPET" }, @@ -1412,6 +1567,12 @@ "blubed": "blue_bed", "bluebed": "blue_bed", "minecraft:blue_bed": "blue_bed", + "blue_candle": { + "material": "BLUE_CANDLE" + }, + "blucandle": "blue_candle", + "bluecandle": "blue_candle", + "minecraft:blue_candle": "blue_candle", "blue_carpet": { "material": "BLUE_CARPET" }, @@ -1624,6 +1785,13 @@ "brobed": "brown_bed", "brownbed": "brown_bed", "minecraft:brown_bed": "brown_bed", + "brown_candle": { + "material": "BROWN_CANDLE" + }, + "brcandle": "brown_candle", + "brocandle": "brown_candle", + "browncandle": "brown_candle", + "minecraft:brown_candle": "brown_candle", "brown_carpet": { "material": "BROWN_CARPET" }, @@ -1798,6 +1966,15 @@ "material": "BUCKET" }, "minecraft:bucket": "bucket", + "budding_amethyst": { + "material": "BUDDING_AMETHYST" + }, + "buddingamethyst": "budding_amethyst", + "minecraft:budding_amethyst": "budding_amethyst", + "bundle": { + "material": "BUNDLE" + }, + "minecraft:bundle": "bundle", "cactus": { "material": "CACTUS" }, @@ -1806,10 +1983,18 @@ "material": "CAKE" }, "minecraft:cake": "cake", + "calcite": { + "material": "CALCITE" + }, + "minecraft:calcite": "calcite", "campfire": { "material": "CAMPFIRE" }, "minecraft:campfire": "campfire", + "candle": { + "material": "CANDLE" + }, + "minecraft:candle": "candle", "carrot": { "material": "CARROT" }, @@ -2074,6 +2259,46 @@ }, "chippedanvil": "chipped_anvil", "minecraft:chipped_anvil": "chipped_anvil", + "chiseled_deepslate": { + "material": "CHISELED_DEEPSLATE" + }, + "chiseleddeepslate": "chiseled_deepslate", + "chiseleddeepslateb": "chiseled_deepslate", + "chiseleddeepslatebl": "chiseled_deepslate", + "chiseleddeepslateblock": "chiseled_deepslate", + "chiseleddslate": "chiseled_deepslate", + "chiseleddslateb": "chiseled_deepslate", + "chiseleddslatebl": "chiseled_deepslate", + "chiseleddslateblock": "chiseled_deepslate", + "chiseledslate": "chiseled_deepslate", + "chiseledslateb": "chiseled_deepslate", + "chiseledslatebl": "chiseled_deepslate", + "chiseledslateblock": "chiseled_deepslate", + "cideepslate": "chiseled_deepslate", + "cideepslateb": "chiseled_deepslate", + "cideepslatebl": "chiseled_deepslate", + "cideepslateblock": "chiseled_deepslate", + "cidslate": "chiseled_deepslate", + "cidslateb": "chiseled_deepslate", + "cidslatebl": "chiseled_deepslate", + "cidslateblock": "chiseled_deepslate", + "circledeepslate": "chiseled_deepslate", + "circledeepslateb": "chiseled_deepslate", + "circledeepslatebl": "chiseled_deepslate", + "circledeepslateblock": "chiseled_deepslate", + "circledslate": "chiseled_deepslate", + "circledslateb": "chiseled_deepslate", + "circledslatebl": "chiseled_deepslate", + "circledslateblock": "chiseled_deepslate", + "circleslate": "chiseled_deepslate", + "circleslateb": "chiseled_deepslate", + "circleslatebl": "chiseled_deepslate", + "circleslateblock": "chiseled_deepslate", + "cislate": "chiseled_deepslate", + "cislateb": "chiseled_deepslate", + "cislatebl": "chiseled_deepslate", + "cislateblock": "chiseled_deepslate", + "minecraft:chiseled_deepslate": "chiseled_deepslate", "chiseled_nether_bricks": { "material": "CHISELED_NETHER_BRICKS" }, @@ -2428,11 +2653,140 @@ "ocoal": "coal_ore", "orec": "coal_ore", "orecoal": "coal_ore", + "stonecoalore": "coal_ore", + "stonecore": "coal_ore", "coarse_dirt": { "material": "COARSE_DIRT" }, "coarsedirt": "coarse_dirt", "minecraft:coarse_dirt": "coarse_dirt", + "cobbled_deepslate": { + "material": "COBBLED_DEEPSLATE" + }, + "cbdeepslate": "cobbled_deepslate", + "cbdeepslateb": "cobbled_deepslate", + "cbdeepslatebl": "cobbled_deepslate", + "cbdeepslateblock": "cobbled_deepslate", + "cbdslate": "cobbled_deepslate", + "cbdslateb": "cobbled_deepslate", + "cbdslatebl": "cobbled_deepslate", + "cbdslateblock": "cobbled_deepslate", + "cbslate": "cobbled_deepslate", + "cbslateb": "cobbled_deepslate", + "cbslatebl": "cobbled_deepslate", + "cbslateblock": "cobbled_deepslate", + "cobbleddeepslate": "cobbled_deepslate", + "cobbleddeepslateb": "cobbled_deepslate", + "cobbleddeepslatebl": "cobbled_deepslate", + "cobbleddeepslateblock": "cobbled_deepslate", + "cobbleddslate": "cobbled_deepslate", + "cobbleddslateb": "cobbled_deepslate", + "cobbleddslatebl": "cobbled_deepslate", + "cobbleddslateblock": "cobbled_deepslate", + "cobbledeepslate": "cobbled_deepslate", + "cobbledeepslateb": "cobbled_deepslate", + "cobbledeepslatebl": "cobbled_deepslate", + "cobbledeepslateblock": "cobbled_deepslate", + "cobbledslate": "cobbled_deepslate", + "cobbledslateb": "cobbled_deepslate", + "cobbledslatebl": "cobbled_deepslate", + "cobbledslateblock": "cobbled_deepslate", + "cobbleslate": "cobbled_deepslate", + "cobbleslateb": "cobbled_deepslate", + "cobbleslatebl": "cobbled_deepslate", + "cobbleslateblock": "cobbled_deepslate", + "cobdeepslate": "cobbled_deepslate", + "cobdeepslateb": "cobbled_deepslate", + "cobdeepslatebl": "cobbled_deepslate", + "cobdeepslateblock": "cobbled_deepslate", + "cobdslate": "cobbled_deepslate", + "cobdslateb": "cobbled_deepslate", + "cobdslatebl": "cobbled_deepslate", + "cobdslateblock": "cobbled_deepslate", + "cobslate": "cobbled_deepslate", + "cobslateb": "cobbled_deepslate", + "cobslatebl": "cobbled_deepslate", + "cobslateblock": "cobbled_deepslate", + "minecraft:cobbled_deepslate": "cobbled_deepslate", + "cobbled_deepslate_slab": { + "material": "COBBLED_DEEPSLATE_SLAB" + }, + "cbdeepslatehalfblock": "cobbled_deepslate_slab", + "cbdeepslatestep": "cobbled_deepslate_slab", + "cbdslatehalfblock": "cobbled_deepslate_slab", + "cbdslatestep": "cobbled_deepslate_slab", + "cbslatehalfblock": "cobbled_deepslate_slab", + "cbslatestep": "cobbled_deepslate_slab", + "cobbleddeepslatehalfblock": "cobbled_deepslate_slab", + "cobbleddeepslateslab": "cobbled_deepslate_slab", + "cobbleddeepslatestep": "cobbled_deepslate_slab", + "cobbleddslatehalfblock": "cobbled_deepslate_slab", + "cobbleddslatestep": "cobbled_deepslate_slab", + "cobbledeepslatehalfblock": "cobbled_deepslate_slab", + "cobbledeepslatestep": "cobbled_deepslate_slab", + "cobbledslatehalfblock": "cobbled_deepslate_slab", + "cobbledslatestep": "cobbled_deepslate_slab", + "cobbleslatehalfblock": "cobbled_deepslate_slab", + "cobbleslatestep": "cobbled_deepslate_slab", + "cobdeepslatehalfblock": "cobbled_deepslate_slab", + "cobdeepslatestep": "cobbled_deepslate_slab", + "cobdslatehalfblock": "cobbled_deepslate_slab", + "cobdslatestep": "cobbled_deepslate_slab", + "cobslatehalfblock": "cobbled_deepslate_slab", + "cobslatestep": "cobbled_deepslate_slab", + "minecraft:cobbled_deepslate_slab": "cobbled_deepslate_slab", + "cobbled_deepslate_stairs": { + "material": "COBBLED_DEEPSLATE_STAIRS" + }, + "cbdeepslatestair": "cobbled_deepslate_stairs", + "cbdeepslatestairs": "cobbled_deepslate_stairs", + "cbdslatestair": "cobbled_deepslate_stairs", + "cbdslatestairs": "cobbled_deepslate_stairs", + "cbslatestair": "cobbled_deepslate_stairs", + "cbslatestairs": "cobbled_deepslate_stairs", + "cobbleddeepslatestair": "cobbled_deepslate_stairs", + "cobbleddeepslatestairs": "cobbled_deepslate_stairs", + "cobbleddslatestair": "cobbled_deepslate_stairs", + "cobbleddslatestairs": "cobbled_deepslate_stairs", + "cobbledeepslatestair": "cobbled_deepslate_stairs", + "cobbledeepslatestairs": "cobbled_deepslate_stairs", + "cobbledslatestair": "cobbled_deepslate_stairs", + "cobbledslatestairs": "cobbled_deepslate_stairs", + "cobbleslatestair": "cobbled_deepslate_stairs", + "cobbleslatestairs": "cobbled_deepslate_stairs", + "cobdeepslatestair": "cobbled_deepslate_stairs", + "cobdeepslatestairs": "cobbled_deepslate_stairs", + "cobdslatestair": "cobbled_deepslate_stairs", + "cobdslatestairs": "cobbled_deepslate_stairs", + "cobslatestair": "cobbled_deepslate_stairs", + "cobslatestairs": "cobbled_deepslate_stairs", + "minecraft:cobbled_deepslate_stairs": "cobbled_deepslate_stairs", + "cobbled_deepslate_wall": { + "material": "COBBLED_DEEPSLATE_WALL" + }, + "cbdeepslatewall": "cobbled_deepslate_wall", + "cbdslatewall": "cobbled_deepslate_wall", + "cbslatewall": "cobbled_deepslate_wall", + "cobbleddeepslatewall": "cobbled_deepslate_wall", + "cobbleddslatewall": "cobbled_deepslate_wall", + "cobbledeepslatewall": "cobbled_deepslate_wall", + "cobbledslatewall": "cobbled_deepslate_wall", + "cobbleslatewall": "cobbled_deepslate_wall", + "cobdeepslatewall": "cobbled_deepslate_wall", + "cobdslatewall": "cobbled_deepslate_wall", + "cobslatewall": "cobbled_deepslate_wall", + "minecraft:cobbled_deepslate_wall": "cobbled_deepslate_wall", + "wallcbdeepslate": "cobbled_deepslate_wall", + "wallcbdslate": "cobbled_deepslate_wall", + "wallcbslate": "cobbled_deepslate_wall", + "wallcobbleddeepslate": "cobbled_deepslate_wall", + "wallcobbleddslate": "cobbled_deepslate_wall", + "wallcobbledeepslate": "cobbled_deepslate_wall", + "wallcobbledslate": "cobbled_deepslate_wall", + "wallcobbleslate": "cobbled_deepslate_wall", + "wallcobdeepslate": "cobbled_deepslate_wall", + "wallcobdslate": "cobbled_deepslate_wall", + "wallcobslate": "cobbled_deepslate_wall", "cobblestone": { "material": "COBBLESTONE" }, @@ -3008,6 +3362,60 @@ "material": "COOKIE" }, "minecraft:cookie": "cookie", + "copper_block": { + "material": "COPPER_BLOCK" + }, + "coblock": "copper_block", + "copblock": "copper_block", + "copperblock": "copper_block", + "minecraft:copper_block": "copper_block", + "plaincoblock": "copper_block", + "plaincopblock": "copper_block", + "plaincopperblock": "copper_block", + "purecoblock": "copper_block", + "purecopblock": "copper_block", + "purecopperblock": "copper_block", + "copper_ingot": { + "material": "COPPER_INGOT" + }, + "barcop": "copper_ingot", + "barcopp": "copper_ingot", + "barcopper": "copper_ingot", + "copbar": "copper_ingot", + "copi": "copper_ingot", + "copingot": "copper_ingot", + "coppbar": "copper_ingot", + "copperbar": "copper_ingot", + "copperi": "copper_ingot", + "copperingot": "copper_ingot", + "coppi": "copper_ingot", + "coppingot": "copper_ingot", + "icop": "copper_ingot", + "icopp": "copper_ingot", + "icopper": "copper_ingot", + "ingotcop": "copper_ingot", + "ingotcopp": "copper_ingot", + "ingotcopper": "copper_ingot", + "minecraft:copper_ingot": "copper_ingot", + "copper_ore": { + "material": "COPPER_ORE" + }, + "copo": "copper_ore", + "copore": "copper_ore", + "coppero": "copper_ore", + "copperore": "copper_ore", + "coppo": "copper_ore", + "coppore": "copper_ore", + "minecraft:copper_ore": "copper_ore", + "ocop": "copper_ore", + "ocopp": "copper_ore", + "ocopper": "copper_ore", + "orecop": "copper_ore", + "orecopp": "copper_ore", + "orecopper": "copper_ore", + "stonecopore": "copper_ore", + "stonecopperore": "copper_ore", + "stonecoppore": "copper_ore", "cornflower": { "material": "CORNFLOWER" }, @@ -3036,6 +3444,68 @@ "cowmonsterspawner": "cow_spawner", "cowmspawner": "cow_spawner", "cowspawner": "cow_spawner", + "cracked_deepslate_bricks": { + "material": "CRACKED_DEEPSLATE_BRICKS" + }, + "crackdeepslatebr": "cracked_deepslate_bricks", + "crackdeepslatebricks": "cracked_deepslate_bricks", + "crackdslatebr": "cracked_deepslate_bricks", + "crackdslatebricks": "cracked_deepslate_bricks", + "crackeddeepslatebr": "cracked_deepslate_bricks", + "crackeddeepslatebricks": "cracked_deepslate_bricks", + "crackeddslatebr": "cracked_deepslate_bricks", + "crackeddslatebricks": "cracked_deepslate_bricks", + "crackedslatebr": "cracked_deepslate_bricks", + "crackedslatebricks": "cracked_deepslate_bricks", + "crackslatebr": "cracked_deepslate_bricks", + "crackslatebricks": "cracked_deepslate_bricks", + "crdeepslatebr": "cracked_deepslate_bricks", + "crdeepslatebricks": "cracked_deepslate_bricks", + "crdslatebr": "cracked_deepslate_bricks", + "crdslatebricks": "cracked_deepslate_bricks", + "crslatebr": "cracked_deepslate_bricks", + "crslatebricks": "cracked_deepslate_bricks", + "minecraft:cracked_deepslate_bricks": "cracked_deepslate_bricks", + "cracked_deepslate_tiles": { + "material": "CRACKED_DEEPSLATE_TILES" + }, + "crackdeepslatetile": "cracked_deepslate_tiles", + "crackdeepslatetiles": "cracked_deepslate_tiles", + "crackdslatetile": "cracked_deepslate_tiles", + "crackdslatetiles": "cracked_deepslate_tiles", + "crackeddeepslatetile": "cracked_deepslate_tiles", + "crackeddeepslatetiles": "cracked_deepslate_tiles", + "crackeddslatetile": "cracked_deepslate_tiles", + "crackeddslatetiles": "cracked_deepslate_tiles", + "crackedslatetile": "cracked_deepslate_tiles", + "crackedslatetiles": "cracked_deepslate_tiles", + "crackslatetile": "cracked_deepslate_tiles", + "crackslatetiles": "cracked_deepslate_tiles", + "crdeepslatetile": "cracked_deepslate_tiles", + "crdeepslatetiles": "cracked_deepslate_tiles", + "crdslatetile": "cracked_deepslate_tiles", + "crdslatetiles": "cracked_deepslate_tiles", + "crslatetile": "cracked_deepslate_tiles", + "crslatetiles": "cracked_deepslate_tiles", + "minecraft:cracked_deepslate_tiles": "cracked_deepslate_tiles", + "tilecrackdeepslate": "cracked_deepslate_tiles", + "tilecrackdslate": "cracked_deepslate_tiles", + "tilecrackeddeepslate": "cracked_deepslate_tiles", + "tilecrackeddslate": "cracked_deepslate_tiles", + "tilecrackedslate": "cracked_deepslate_tiles", + "tilecrackslate": "cracked_deepslate_tiles", + "tilecrdeepslate": "cracked_deepslate_tiles", + "tilecrdslate": "cracked_deepslate_tiles", + "tilecrslate": "cracked_deepslate_tiles", + "tilescrackdeepslate": "cracked_deepslate_tiles", + "tilescrackdslate": "cracked_deepslate_tiles", + "tilescrackeddeepslate": "cracked_deepslate_tiles", + "tilescrackeddslate": "cracked_deepslate_tiles", + "tilescrackedslate": "cracked_deepslate_tiles", + "tilescrackslate": "cracked_deepslate_tiles", + "tilescrdeepslate": "cracked_deepslate_tiles", + "tilescrdslate": "cracked_deepslate_tiles", + "tilescrslate": "cracked_deepslate_tiles", "cracked_nether_bricks": { "material": "CRACKED_NETHER_BRICKS" }, @@ -3406,6 +3876,61 @@ }, "cryingobsidian": "crying_obsidian", "minecraft:crying_obsidian": "crying_obsidian", + "cut_copper": { + "material": "CUT_COPPER" + }, + "ccoblock": "cut_copper", + "ccopblock": "cut_copper", + "ccopperblock": "cut_copper", + "cutcoblock": "cut_copper", + "cutcopblock": "cut_copper", + "cutcopper": "cut_copper", + "cutcopperblock": "cut_copper", + "minecraft:cut_copper": "cut_copper", + "cut_copper_slab": { + "material": "CUT_COPPER_SLAB" + }, + "ccohalfblock": "cut_copper_slab", + "ccophalfblock": "cut_copper_slab", + "ccopperhalfblock": "cut_copper_slab", + "ccoppersl": "cut_copper_slab", + "ccopperslab": "cut_copper_slab", + "ccopperstep": "cut_copper_slab", + "ccopsl": "cut_copper_slab", + "ccopslab": "cut_copper_slab", + "ccopstep": "cut_copper_slab", + "ccosl": "cut_copper_slab", + "ccoslab": "cut_copper_slab", + "ccostep": "cut_copper_slab", + "cutcohalfblock": "cut_copper_slab", + "cutcophalfblock": "cut_copper_slab", + "cutcopperhalfblock": "cut_copper_slab", + "cutcoppersl": "cut_copper_slab", + "cutcopperslab": "cut_copper_slab", + "cutcopperstep": "cut_copper_slab", + "cutcopsl": "cut_copper_slab", + "cutcopslab": "cut_copper_slab", + "cutcopstep": "cut_copper_slab", + "cutcosl": "cut_copper_slab", + "cutcoslab": "cut_copper_slab", + "cutcostep": "cut_copper_slab", + "minecraft:cut_copper_slab": "cut_copper_slab", + "cut_copper_stairs": { + "material": "CUT_COPPER_STAIRS" + }, + "ccopperstair": "cut_copper_stairs", + "ccopperstairs": "cut_copper_stairs", + "ccopstair": "cut_copper_stairs", + "ccopstairs": "cut_copper_stairs", + "ccostair": "cut_copper_stairs", + "ccostairs": "cut_copper_stairs", + "cutcopperstair": "cut_copper_stairs", + "cutcopperstairs": "cut_copper_stairs", + "cutcopstair": "cut_copper_stairs", + "cutcopstairs": "cut_copper_stairs", + "cutcostair": "cut_copper_stairs", + "cutcostairs": "cut_copper_stairs", + "minecraft:cut_copper_stairs": "cut_copper_stairs", "cut_red_sandstone": { "material": "CUT_RED_SANDSTONE" }, @@ -3472,6 +3997,12 @@ "cbed": "cyan_bed", "cyanbed": "cyan_bed", "minecraft:cyan_bed": "cyan_bed", + "cyan_candle": { + "material": "CYAN_CANDLE" + }, + "ccandle": "cyan_candle", + "cyancandle": "cyan_candle", + "minecraft:cyan_candle": "cyan_candle", "cyan_carpet": { "material": "CYAN_CARPET" }, @@ -4121,6 +4652,327 @@ }, "debugstick": "debug_stick", "minecraft:debug_stick": "debug_stick", + "deepslate": { + "material": "DEEPSLATE" + }, + "deepslateb": "deepslate", + "deepslatebl": "deepslate", + "deepslateblock": "deepslate", + "dslate": "deepslate", + "dslateb": "deepslate", + "dslatebl": "deepslate", + "dslateblock": "deepslate", + "minecraft:deepslate": "deepslate", + "slate": "deepslate", + "slateb": "deepslate", + "slatebl": "deepslate", + "slateblock": "deepslate", + "deepslate_brick_slab": { + "material": "DEEPSLATE_BRICK_SLAB" + }, + "deepslatebrhalfblock": "deepslate_brick_slab", + "deepslatebrickhalfblock": "deepslate_brick_slab", + "deepslatebrickshalfblock": "deepslate_brick_slab", + "deepslatebrickslab": "deepslate_brick_slab", + "deepslatebricksstep": "deepslate_brick_slab", + "deepslatebrickstep": "deepslate_brick_slab", + "deepslatebrstep": "deepslate_brick_slab", + "dslatebrhalfblock": "deepslate_brick_slab", + "dslatebrickshalfblock": "deepslate_brick_slab", + "dslatebricksstep": "deepslate_brick_slab", + "dslatebrstep": "deepslate_brick_slab", + "minecraft:deepslate_brick_slab": "deepslate_brick_slab", + "slatebrhalfblock": "deepslate_brick_slab", + "slatebrickshalfblock": "deepslate_brick_slab", + "slatebricksstep": "deepslate_brick_slab", + "slatebrstep": "deepslate_brick_slab", + "deepslate_brick_stairs": { + "material": "DEEPSLATE_BRICK_STAIRS" + }, + "deepslatebricksstair": "deepslate_brick_stairs", + "deepslatebricksstairs": "deepslate_brick_stairs", + "deepslatebrickstair": "deepslate_brick_stairs", + "deepslatebrickstairs": "deepslate_brick_stairs", + "deepslatebrstair": "deepslate_brick_stairs", + "deepslatebrstairs": "deepslate_brick_stairs", + "dslatebricksstair": "deepslate_brick_stairs", + "dslatebricksstairs": "deepslate_brick_stairs", + "dslatebrstair": "deepslate_brick_stairs", + "dslatebrstairs": "deepslate_brick_stairs", + "minecraft:deepslate_brick_stairs": "deepslate_brick_stairs", + "slatebricksstair": "deepslate_brick_stairs", + "slatebricksstairs": "deepslate_brick_stairs", + "slatebrstair": "deepslate_brick_stairs", + "slatebrstairs": "deepslate_brick_stairs", + "deepslate_brick_wall": { + "material": "DEEPSLATE_BRICK_WALL" + }, + "deepslatebrickswall": "deepslate_brick_wall", + "deepslatebrickwall": "deepslate_brick_wall", + "deepslatebrwall": "deepslate_brick_wall", + "dslatebrickswall": "deepslate_brick_wall", + "dslatebrwall": "deepslate_brick_wall", + "minecraft:deepslate_brick_wall": "deepslate_brick_wall", + "slatebrickswall": "deepslate_brick_wall", + "slatebrwall": "deepslate_brick_wall", + "walldeepslatebr": "deepslate_brick_wall", + "walldeepslatebrick": "deepslate_brick_wall", + "walldeepslatebricks": "deepslate_brick_wall", + "walldslatebr": "deepslate_brick_wall", + "walldslatebricks": "deepslate_brick_wall", + "wallslatebr": "deepslate_brick_wall", + "wallslatebricks": "deepslate_brick_wall", + "deepslate_bricks": { + "material": "DEEPSLATE_BRICKS" + }, + "deepslatebr": "deepslate_bricks", + "deepslatebrick": "deepslate_bricks", + "deepslatebricks": "deepslate_bricks", + "dslatebr": "deepslate_bricks", + "dslatebricks": "deepslate_bricks", + "minecraft:deepslate_bricks": "deepslate_bricks", + "slatebr": "deepslate_bricks", + "slatebricks": "deepslate_bricks", + "deepslate_coal_ore": { + "material": "DEEPSLATE_COAL_ORE" + }, + "deepcoalore": "deepslate_coal_ore", + "deepcore": "deepslate_coal_ore", + "deeporec": "deepslate_coal_ore", + "deeporecoal": "deepslate_coal_ore", + "deepslatecoalore": "deepslate_coal_ore", + "deepslatecore": "deepslate_coal_ore", + "dorec": "deepslate_coal_ore", + "dorecoal": "deepslate_coal_ore", + "minecraft:deepslate_coal_ore": "deepslate_coal_ore", + "slatecoalore": "deepslate_coal_ore", + "slatecore": "deepslate_coal_ore", + "deepslate_copper_ore": { + "material": "DEEPSLATE_COPPER_ORE" + }, + "deepcopore": "deepslate_copper_ore", + "deepcopperore": "deepslate_copper_ore", + "deepcoppore": "deepslate_copper_ore", + "deeporecop": "deepslate_copper_ore", + "deeporecopp": "deepslate_copper_ore", + "deeporecopper": "deepslate_copper_ore", + "deepslatecopore": "deepslate_copper_ore", + "deepslatecopperore": "deepslate_copper_ore", + "deepslatecoppore": "deepslate_copper_ore", + "dorecop": "deepslate_copper_ore", + "dorecopp": "deepslate_copper_ore", + "dorecopper": "deepslate_copper_ore", + "minecraft:deepslate_copper_ore": "deepslate_copper_ore", + "slatecopore": "deepslate_copper_ore", + "slatecopperore": "deepslate_copper_ore", + "slatecoppore": "deepslate_copper_ore", + "deepslate_diamond_ore": { + "material": "DEEPSLATE_DIAMOND_ORE" + }, + "deepcrystalore": "deepslate_diamond_ore", + "deepdiamondore": "deepslate_diamond_ore", + "deepdore": "deepslate_diamond_ore", + "deeporecrystal": "deepslate_diamond_ore", + "deepored": "deepslate_diamond_ore", + "deeporediamond": "deepslate_diamond_ore", + "deepslatecrystalore": "deepslate_diamond_ore", + "deepslatediamondore": "deepslate_diamond_ore", + "deepslatedore": "deepslate_diamond_ore", + "dorecrystal": "deepslate_diamond_ore", + "dored": "deepslate_diamond_ore", + "dorediamond": "deepslate_diamond_ore", + "minecraft:deepslate_diamond_ore": "deepslate_diamond_ore", + "slatecrystalore": "deepslate_diamond_ore", + "slatediamondore": "deepslate_diamond_ore", + "slatedore": "deepslate_diamond_ore", + "deepslate_emerald_ore": { + "material": "DEEPSLATE_EMERALD_ORE" + }, + "deepemeraldore": "deepslate_emerald_ore", + "deepeore": "deepslate_emerald_ore", + "deeporee": "deepslate_emerald_ore", + "deeporeemerald": "deepslate_emerald_ore", + "deepslateemeraldore": "deepslate_emerald_ore", + "deepslateeore": "deepslate_emerald_ore", + "doree": "deepslate_emerald_ore", + "doreemerald": "deepslate_emerald_ore", + "minecraft:deepslate_emerald_ore": "deepslate_emerald_ore", + "slateemeraldore": "deepslate_emerald_ore", + "slateeore": "deepslate_emerald_ore", + "deepslate_gold_ore": { + "material": "DEEPSLATE_GOLD_ORE" + }, + "deepgoldore": "deepslate_gold_ore", + "deepgore": "deepslate_gold_ore", + "deeporeg": "deepslate_gold_ore", + "deeporegold": "deepslate_gold_ore", + "deepslategoldore": "deepslate_gold_ore", + "deepslategore": "deepslate_gold_ore", + "doreg": "deepslate_gold_ore", + "doregold": "deepslate_gold_ore", + "minecraft:deepslate_gold_ore": "deepslate_gold_ore", + "slategoldore": "deepslate_gold_ore", + "slategore": "deepslate_gold_ore", + "deepslate_iron_ore": { + "material": "DEEPSLATE_IRON_ORE" + }, + "deepiore": "deepslate_iron_ore", + "deepironore": "deepslate_iron_ore", + "deeporei": "deepslate_iron_ore", + "deeporeiron": "deepslate_iron_ore", + "deepores": "deepslate_iron_ore", + "deeporest": "deepslate_iron_ore", + "deeporesteel": "deepslate_iron_ore", + "deepslateiore": "deepslate_iron_ore", + "deepslateironore": "deepslate_iron_ore", + "deepslatesore": "deepslate_iron_ore", + "deepslatesteelore": "deepslate_iron_ore", + "deepslatestore": "deepslate_iron_ore", + "deepsore": "deepslate_iron_ore", + "deepsteelore": "deepslate_iron_ore", + "deepstore": "deepslate_iron_ore", + "dorei": "deepslate_iron_ore", + "doreiron": "deepslate_iron_ore", + "dores": "deepslate_iron_ore", + "dorest": "deepslate_iron_ore", + "doresteel": "deepslate_iron_ore", + "minecraft:deepslate_iron_ore": "deepslate_iron_ore", + "slateiore": "deepslate_iron_ore", + "slateironore": "deepslate_iron_ore", + "slatesore": "deepslate_iron_ore", + "slatesteelore": "deepslate_iron_ore", + "slatestore": "deepslate_iron_ore", + "deepslate_lapis_ore": { + "material": "DEEPSLATE_LAPIS_ORE" + }, + "deeplapislazuliore": "deepslate_lapis_ore", + "deeplapisore": "deepslate_lapis_ore", + "deeplore": "deepslate_lapis_ore", + "deeporel": "deepslate_lapis_ore", + "deeporelapis": "deepslate_lapis_ore", + "deeporelapislazuli": "deepslate_lapis_ore", + "deepslatelapislazuliore": "deepslate_lapis_ore", + "deepslatelapisore": "deepslate_lapis_ore", + "deepslatelore": "deepslate_lapis_ore", + "dorel": "deepslate_lapis_ore", + "dorelapis": "deepslate_lapis_ore", + "dorelapislazuli": "deepslate_lapis_ore", + "minecraft:deepslate_lapis_ore": "deepslate_lapis_ore", + "slatelapislazuliore": "deepslate_lapis_ore", + "slatelapisore": "deepslate_lapis_ore", + "slatelore": "deepslate_lapis_ore", + "deepslate_redstone_ore": { + "material": "DEEPSLATE_REDSTONE_ORE" + }, + "deeporer": "deepslate_redstone_ore", + "deeporered": "deepslate_redstone_ore", + "deeporereds": "deepslate_redstone_ore", + "deeporeredstone": "deepslate_redstone_ore", + "deeporers": "deepslate_redstone_ore", + "deeporerstone": "deepslate_redstone_ore", + "deepredore": "deepslate_redstone_ore", + "deepredsore": "deepslate_redstone_ore", + "deepredstoneore": "deepslate_redstone_ore", + "deeprore": "deepslate_redstone_ore", + "deeprsore": "deepslate_redstone_ore", + "deeprstoneore": "deepslate_redstone_ore", + "deepslateredore": "deepslate_redstone_ore", + "deepslateredsore": "deepslate_redstone_ore", + "deepslateredstoneore": "deepslate_redstone_ore", + "deepslaterore": "deepslate_redstone_ore", + "deepslatersore": "deepslate_redstone_ore", + "deepslaterstoneore": "deepslate_redstone_ore", + "dorer": "deepslate_redstone_ore", + "dorered": "deepslate_redstone_ore", + "dorereds": "deepslate_redstone_ore", + "doreredstone": "deepslate_redstone_ore", + "dorers": "deepslate_redstone_ore", + "dorerstone": "deepslate_redstone_ore", + "minecraft:deepslate_redstone_ore": "deepslate_redstone_ore", + "slateredore": "deepslate_redstone_ore", + "slateredsore": "deepslate_redstone_ore", + "slateredstoneore": "deepslate_redstone_ore", + "slaterore": "deepslate_redstone_ore", + "slatersore": "deepslate_redstone_ore", + "slaterstoneore": "deepslate_redstone_ore", + "deepslate_tile_slab": { + "material": "DEEPSLATE_TILE_SLAB" + }, + "deepslatetilehalfblock": "deepslate_tile_slab", + "deepslatetileshalfblock": "deepslate_tile_slab", + "deepslatetileslab": "deepslate_tile_slab", + "deepslatetilesstep": "deepslate_tile_slab", + "deepslatetilestep": "deepslate_tile_slab", + "dslatetilehalfblock": "deepslate_tile_slab", + "dslatetileshalfblock": "deepslate_tile_slab", + "dslatetilesstep": "deepslate_tile_slab", + "dslatetilestep": "deepslate_tile_slab", + "minecraft:deepslate_tile_slab": "deepslate_tile_slab", + "slatetilehalfblock": "deepslate_tile_slab", + "slatetileshalfblock": "deepslate_tile_slab", + "slatetilesstep": "deepslate_tile_slab", + "slatetilestep": "deepslate_tile_slab", + "deepslate_tile_stairs": { + "material": "DEEPSLATE_TILE_STAIRS" + }, + "deepslatetilesstair": "deepslate_tile_stairs", + "deepslatetilesstairs": "deepslate_tile_stairs", + "deepslatetilestair": "deepslate_tile_stairs", + "deepslatetilestairs": "deepslate_tile_stairs", + "dslatetilesstair": "deepslate_tile_stairs", + "dslatetilesstairs": "deepslate_tile_stairs", + "dslatetilestair": "deepslate_tile_stairs", + "dslatetilestairs": "deepslate_tile_stairs", + "minecraft:deepslate_tile_stairs": "deepslate_tile_stairs", + "slatetilesstair": "deepslate_tile_stairs", + "slatetilesstairs": "deepslate_tile_stairs", + "slatetilestair": "deepslate_tile_stairs", + "slatetilestairs": "deepslate_tile_stairs", + "deepslate_tile_wall": { + "material": "DEEPSLATE_TILE_WALL" + }, + "deepslatetileswall": "deepslate_tile_wall", + "deepslatetilewall": "deepslate_tile_wall", + "dslatetileswall": "deepslate_tile_wall", + "dslatetilewall": "deepslate_tile_wall", + "minecraft:deepslate_tile_wall": "deepslate_tile_wall", + "slatetileswall": "deepslate_tile_wall", + "slatetilewall": "deepslate_tile_wall", + "walldeepslatetile": "deepslate_tile_wall", + "walldeepslatetiles": "deepslate_tile_wall", + "walldslatetile": "deepslate_tile_wall", + "walldslatetiles": "deepslate_tile_wall", + "wallslatetile": "deepslate_tile_wall", + "wallslatetiles": "deepslate_tile_wall", + "deepslate_tiles": { + "material": "DEEPSLATE_TILES" + }, + "deepslatetiles": "deepslate_tiles", + "deepslatetilestile": "deepslate_tiles", + "deepslatetilestiles": "deepslate_tiles", + "deepslatetiletile": "deepslate_tiles", + "deepslatetiletiles": "deepslate_tiles", + "dslatetilestile": "deepslate_tiles", + "dslatetilestiles": "deepslate_tiles", + "dslatetiletile": "deepslate_tiles", + "dslatetiletiles": "deepslate_tiles", + "minecraft:deepslate_tiles": "deepslate_tiles", + "slatetilestile": "deepslate_tiles", + "slatetilestiles": "deepslate_tiles", + "slatetiletile": "deepslate_tiles", + "slatetiletiles": "deepslate_tiles", + "tiledeepslatetile": "deepslate_tiles", + "tiledeepslatetiles": "deepslate_tiles", + "tiledslatetile": "deepslate_tiles", + "tiledslatetiles": "deepslate_tiles", + "tilesdeepslatetile": "deepslate_tiles", + "tilesdeepslatetiles": "deepslate_tiles", + "tilesdslatetile": "deepslate_tiles", + "tilesdslatetiles": "deepslate_tiles", + "tileslatetile": "deepslate_tiles", + "tileslatetiles": "deepslate_tiles", + "tilesslatetile": "deepslate_tiles", + "tilesslatetiles": "deepslate_tiles", "detector_rail": { "material": "DETECTOR_RAIL" }, @@ -4255,6 +5107,9 @@ "orecrystal": "diamond_ore", "ored": "redstone_ore", "orediamond": "diamond_ore", + "stonecrystalore": "diamond_ore", + "stonediamondore": "diamond_ore", + "stonedore": "diamond_ore", "diamond_pickaxe": { "material": "DIAMOND_PICKAXE" }, @@ -4332,6 +5187,14 @@ "material": "DIRT" }, "minecraft:dirt": "dirt", + "dirt_path": { + "material": "DIRT_PATH", + "fallbacks": [ + "GRASS_PATH" + ] + }, + "dirtpath": "dirt_path", + "minecraft:dirt_path": "dirt_path", "dispenser": { "material": "DISPENSER" }, @@ -4425,6 +5288,18 @@ }, "driedkelpblock": "dried_kelp_block", "minecraft:dried_kelp_block": "dried_kelp_block", + "dripstone_block": { + "material": "DRIPSTONE_BLOCK" + }, + "drip": "dripstone_block", + "dripb": "dripstone_block", + "dripbl": "dripstone_block", + "dripblock": "dripstone_block", + "dripstone": "dripstone_block", + "dripstoneb": "dripstone_block", + "dripstonebl": "dripstone_block", + "dripstoneblock": "dripstone_block", + "minecraft:dripstone_block": "dripstone_block", "dropper": { "material": "DROPPER" }, @@ -4526,6 +5401,8 @@ "oemerald": "emerald_ore", "oree": "emerald_ore", "oreemerald": "emerald_ore", + "stoneemeraldore": "emerald_ore", + "stoneeore": "emerald_ore", "empty_lingering_potion": { "potionData": { "type": "UNCRAFTABLE", @@ -4808,6 +5685,285 @@ }, "experiencebottle": "experience_bottle", "minecraft:experience_bottle": "experience_bottle", + "exposed_copper": { + "material": "EXPOSED_COPPER" + }, + "excoblock": "exposed_copper", + "excopblock": "exposed_copper", + "excopperblock": "exposed_copper", + "expcoblock": "exposed_copper", + "expcopblock": "exposed_copper", + "expcopperblock": "exposed_copper", + "exposedcoblock": "exposed_copper", + "exposedcopblock": "exposed_copper", + "exposedcopper": "exposed_copper", + "exposedcopperblock": "exposed_copper", + "minecraft:exposed_copper": "exposed_copper", + "exposed_cut_copper": { + "material": "EXPOSED_CUT_COPPER" + }, + "cexcoblock": "exposed_cut_copper", + "cexcopblock": "exposed_cut_copper", + "cexcopperblock": "exposed_cut_copper", + "cexpcoblock": "exposed_cut_copper", + "cexpcopblock": "exposed_cut_copper", + "cexpcopperblock": "exposed_cut_copper", + "cexposedcoblock": "exposed_cut_copper", + "cexposedcopblock": "exposed_cut_copper", + "cexposedcopperblock": "exposed_cut_copper", + "cutexcoblock": "exposed_cut_copper", + "cutexcopblock": "exposed_cut_copper", + "cutexcopperblock": "exposed_cut_copper", + "cutexpcoblock": "exposed_cut_copper", + "cutexpcopblock": "exposed_cut_copper", + "cutexpcopperblock": "exposed_cut_copper", + "cutexposedcoblock": "exposed_cut_copper", + "cutexposedcopblock": "exposed_cut_copper", + "cutexposedcopperblock": "exposed_cut_copper", + "exccoblock": "exposed_cut_copper", + "exccopblock": "exposed_cut_copper", + "exccopperblock": "exposed_cut_copper", + "excutcoblock": "exposed_cut_copper", + "excutcopblock": "exposed_cut_copper", + "excutcopperblock": "exposed_cut_copper", + "expccoblock": "exposed_cut_copper", + "expccopblock": "exposed_cut_copper", + "expccopperblock": "exposed_cut_copper", + "expcutcoblock": "exposed_cut_copper", + "expcutcopblock": "exposed_cut_copper", + "expcutcopperblock": "exposed_cut_copper", + "exposedccoblock": "exposed_cut_copper", + "exposedccopblock": "exposed_cut_copper", + "exposedccopperblock": "exposed_cut_copper", + "exposedcutcoblock": "exposed_cut_copper", + "exposedcutcopblock": "exposed_cut_copper", + "exposedcutcopper": "exposed_cut_copper", + "exposedcutcopperblock": "exposed_cut_copper", + "minecraft:exposed_cut_copper": "exposed_cut_copper", + "exposed_cut_copper_slab": { + "material": "EXPOSED_CUT_COPPER_SLAB" + }, + "cexcohalfblock": "exposed_cut_copper_slab", + "cexcophalfblock": "exposed_cut_copper_slab", + "cexcopperhalfblock": "exposed_cut_copper_slab", + "cexcoppersl": "exposed_cut_copper_slab", + "cexcopperslab": "exposed_cut_copper_slab", + "cexcopperstep": "exposed_cut_copper_slab", + "cexcopsl": "exposed_cut_copper_slab", + "cexcopslab": "exposed_cut_copper_slab", + "cexcopstep": "exposed_cut_copper_slab", + "cexcosl": "exposed_cut_copper_slab", + "cexcoslab": "exposed_cut_copper_slab", + "cexcostep": "exposed_cut_copper_slab", + "cexpcohalfblock": "exposed_cut_copper_slab", + "cexpcophalfblock": "exposed_cut_copper_slab", + "cexpcopperhalfblock": "exposed_cut_copper_slab", + "cexpcoppersl": "exposed_cut_copper_slab", + "cexpcopperslab": "exposed_cut_copper_slab", + "cexpcopperstep": "exposed_cut_copper_slab", + "cexpcopsl": "exposed_cut_copper_slab", + "cexpcopslab": "exposed_cut_copper_slab", + "cexpcopstep": "exposed_cut_copper_slab", + "cexpcosl": "exposed_cut_copper_slab", + "cexpcoslab": "exposed_cut_copper_slab", + "cexpcostep": "exposed_cut_copper_slab", + "cexposedcohalfblock": "exposed_cut_copper_slab", + "cexposedcophalfblock": "exposed_cut_copper_slab", + "cexposedcopperhalfblock": "exposed_cut_copper_slab", + "cexposedcoppersl": "exposed_cut_copper_slab", + "cexposedcopperslab": "exposed_cut_copper_slab", + "cexposedcopperstep": "exposed_cut_copper_slab", + "cexposedcopsl": "exposed_cut_copper_slab", + "cexposedcopslab": "exposed_cut_copper_slab", + "cexposedcopstep": "exposed_cut_copper_slab", + "cexposedcosl": "exposed_cut_copper_slab", + "cexposedcoslab": "exposed_cut_copper_slab", + "cexposedcostep": "exposed_cut_copper_slab", + "cutexcohalfblock": "exposed_cut_copper_slab", + "cutexcophalfblock": "exposed_cut_copper_slab", + "cutexcopperhalfblock": "exposed_cut_copper_slab", + "cutexcoppersl": "exposed_cut_copper_slab", + "cutexcopperslab": "exposed_cut_copper_slab", + "cutexcopperstep": "exposed_cut_copper_slab", + "cutexcopsl": "exposed_cut_copper_slab", + "cutexcopslab": "exposed_cut_copper_slab", + "cutexcopstep": "exposed_cut_copper_slab", + "cutexcosl": "exposed_cut_copper_slab", + "cutexcoslab": "exposed_cut_copper_slab", + "cutexcostep": "exposed_cut_copper_slab", + "cutexpcohalfblock": "exposed_cut_copper_slab", + "cutexpcophalfblock": "exposed_cut_copper_slab", + "cutexpcopperhalfblock": "exposed_cut_copper_slab", + "cutexpcoppersl": "exposed_cut_copper_slab", + "cutexpcopperslab": "exposed_cut_copper_slab", + "cutexpcopperstep": "exposed_cut_copper_slab", + "cutexpcopsl": "exposed_cut_copper_slab", + "cutexpcopslab": "exposed_cut_copper_slab", + "cutexpcopstep": "exposed_cut_copper_slab", + "cutexpcosl": "exposed_cut_copper_slab", + "cutexpcoslab": "exposed_cut_copper_slab", + "cutexpcostep": "exposed_cut_copper_slab", + "cutexposedcohalfblock": "exposed_cut_copper_slab", + "cutexposedcophalfblock": "exposed_cut_copper_slab", + "cutexposedcopperhalfblock": "exposed_cut_copper_slab", + "cutexposedcoppersl": "exposed_cut_copper_slab", + "cutexposedcopperslab": "exposed_cut_copper_slab", + "cutexposedcopperstep": "exposed_cut_copper_slab", + "cutexposedcopsl": "exposed_cut_copper_slab", + "cutexposedcopslab": "exposed_cut_copper_slab", + "cutexposedcopstep": "exposed_cut_copper_slab", + "cutexposedcosl": "exposed_cut_copper_slab", + "cutexposedcoslab": "exposed_cut_copper_slab", + "cutexposedcostep": "exposed_cut_copper_slab", + "exccohalfblock": "exposed_cut_copper_slab", + "exccophalfblock": "exposed_cut_copper_slab", + "exccopperhalfblock": "exposed_cut_copper_slab", + "exccoppersl": "exposed_cut_copper_slab", + "exccopperslab": "exposed_cut_copper_slab", + "exccopperstep": "exposed_cut_copper_slab", + "exccopsl": "exposed_cut_copper_slab", + "exccopslab": "exposed_cut_copper_slab", + "exccopstep": "exposed_cut_copper_slab", + "exccosl": "exposed_cut_copper_slab", + "exccoslab": "exposed_cut_copper_slab", + "exccostep": "exposed_cut_copper_slab", + "excutcohalfblock": "exposed_cut_copper_slab", + "excutcophalfblock": "exposed_cut_copper_slab", + "excutcopperhalfblock": "exposed_cut_copper_slab", + "excutcoppersl": "exposed_cut_copper_slab", + "excutcopperslab": "exposed_cut_copper_slab", + "excutcopperstep": "exposed_cut_copper_slab", + "excutcopsl": "exposed_cut_copper_slab", + "excutcopslab": "exposed_cut_copper_slab", + "excutcopstep": "exposed_cut_copper_slab", + "excutcosl": "exposed_cut_copper_slab", + "excutcoslab": "exposed_cut_copper_slab", + "excutcostep": "exposed_cut_copper_slab", + "expccohalfblock": "exposed_cut_copper_slab", + "expccophalfblock": "exposed_cut_copper_slab", + "expccopperhalfblock": "exposed_cut_copper_slab", + "expccoppersl": "exposed_cut_copper_slab", + "expccopperslab": "exposed_cut_copper_slab", + "expccopperstep": "exposed_cut_copper_slab", + "expccopsl": "exposed_cut_copper_slab", + "expccopslab": "exposed_cut_copper_slab", + "expccopstep": "exposed_cut_copper_slab", + "expccosl": "exposed_cut_copper_slab", + "expccoslab": "exposed_cut_copper_slab", + "expccostep": "exposed_cut_copper_slab", + "expcutcohalfblock": "exposed_cut_copper_slab", + "expcutcophalfblock": "exposed_cut_copper_slab", + "expcutcopperhalfblock": "exposed_cut_copper_slab", + "expcutcoppersl": "exposed_cut_copper_slab", + "expcutcopperslab": "exposed_cut_copper_slab", + "expcutcopperstep": "exposed_cut_copper_slab", + "expcutcopsl": "exposed_cut_copper_slab", + "expcutcopslab": "exposed_cut_copper_slab", + "expcutcopstep": "exposed_cut_copper_slab", + "expcutcosl": "exposed_cut_copper_slab", + "expcutcoslab": "exposed_cut_copper_slab", + "expcutcostep": "exposed_cut_copper_slab", + "exposedccohalfblock": "exposed_cut_copper_slab", + "exposedccophalfblock": "exposed_cut_copper_slab", + "exposedccopperhalfblock": "exposed_cut_copper_slab", + "exposedccoppersl": "exposed_cut_copper_slab", + "exposedccopperslab": "exposed_cut_copper_slab", + "exposedccopperstep": "exposed_cut_copper_slab", + "exposedccopsl": "exposed_cut_copper_slab", + "exposedccopslab": "exposed_cut_copper_slab", + "exposedccopstep": "exposed_cut_copper_slab", + "exposedccosl": "exposed_cut_copper_slab", + "exposedccoslab": "exposed_cut_copper_slab", + "exposedccostep": "exposed_cut_copper_slab", + "exposedcutcohalfblock": "exposed_cut_copper_slab", + "exposedcutcophalfblock": "exposed_cut_copper_slab", + "exposedcutcopperhalfblock": "exposed_cut_copper_slab", + "exposedcutcoppersl": "exposed_cut_copper_slab", + "exposedcutcopperslab": "exposed_cut_copper_slab", + "exposedcutcopperstep": "exposed_cut_copper_slab", + "exposedcutcopsl": "exposed_cut_copper_slab", + "exposedcutcopslab": "exposed_cut_copper_slab", + "exposedcutcopstep": "exposed_cut_copper_slab", + "exposedcutcosl": "exposed_cut_copper_slab", + "exposedcutcoslab": "exposed_cut_copper_slab", + "exposedcutcostep": "exposed_cut_copper_slab", + "minecraft:exposed_cut_copper_slab": "exposed_cut_copper_slab", + "exposed_cut_copper_stairs": { + "material": "EXPOSED_CUT_COPPER_STAIRS" + }, + "cexcopperstair": "exposed_cut_copper_stairs", + "cexcopperstairs": "exposed_cut_copper_stairs", + "cexcopstair": "exposed_cut_copper_stairs", + "cexcopstairs": "exposed_cut_copper_stairs", + "cexcostair": "exposed_cut_copper_stairs", + "cexcostairs": "exposed_cut_copper_stairs", + "cexpcopperstair": "exposed_cut_copper_stairs", + "cexpcopperstairs": "exposed_cut_copper_stairs", + "cexpcopstair": "exposed_cut_copper_stairs", + "cexpcopstairs": "exposed_cut_copper_stairs", + "cexpcostair": "exposed_cut_copper_stairs", + "cexpcostairs": "exposed_cut_copper_stairs", + "cexposedcopperstair": "exposed_cut_copper_stairs", + "cexposedcopperstairs": "exposed_cut_copper_stairs", + "cexposedcopstair": "exposed_cut_copper_stairs", + "cexposedcopstairs": "exposed_cut_copper_stairs", + "cexposedcostair": "exposed_cut_copper_stairs", + "cexposedcostairs": "exposed_cut_copper_stairs", + "cutexcopperstair": "exposed_cut_copper_stairs", + "cutexcopperstairs": "exposed_cut_copper_stairs", + "cutexcopstair": "exposed_cut_copper_stairs", + "cutexcopstairs": "exposed_cut_copper_stairs", + "cutexcostair": "exposed_cut_copper_stairs", + "cutexcostairs": "exposed_cut_copper_stairs", + "cutexpcopperstair": "exposed_cut_copper_stairs", + "cutexpcopperstairs": "exposed_cut_copper_stairs", + "cutexpcopstair": "exposed_cut_copper_stairs", + "cutexpcopstairs": "exposed_cut_copper_stairs", + "cutexpcostair": "exposed_cut_copper_stairs", + "cutexpcostairs": "exposed_cut_copper_stairs", + "cutexposedcopperstair": "exposed_cut_copper_stairs", + "cutexposedcopperstairs": "exposed_cut_copper_stairs", + "cutexposedcopstair": "exposed_cut_copper_stairs", + "cutexposedcopstairs": "exposed_cut_copper_stairs", + "cutexposedcostair": "exposed_cut_copper_stairs", + "cutexposedcostairs": "exposed_cut_copper_stairs", + "exccopperstair": "exposed_cut_copper_stairs", + "exccopperstairs": "exposed_cut_copper_stairs", + "exccopstair": "exposed_cut_copper_stairs", + "exccopstairs": "exposed_cut_copper_stairs", + "exccostair": "exposed_cut_copper_stairs", + "exccostairs": "exposed_cut_copper_stairs", + "excutcopperstair": "exposed_cut_copper_stairs", + "excutcopperstairs": "exposed_cut_copper_stairs", + "excutcopstair": "exposed_cut_copper_stairs", + "excutcopstairs": "exposed_cut_copper_stairs", + "excutcostair": "exposed_cut_copper_stairs", + "excutcostairs": "exposed_cut_copper_stairs", + "expccopperstair": "exposed_cut_copper_stairs", + "expccopperstairs": "exposed_cut_copper_stairs", + "expccopstair": "exposed_cut_copper_stairs", + "expccopstairs": "exposed_cut_copper_stairs", + "expccostair": "exposed_cut_copper_stairs", + "expccostairs": "exposed_cut_copper_stairs", + "expcutcopperstair": "exposed_cut_copper_stairs", + "expcutcopperstairs": "exposed_cut_copper_stairs", + "expcutcopstair": "exposed_cut_copper_stairs", + "expcutcopstairs": "exposed_cut_copper_stairs", + "expcutcostair": "exposed_cut_copper_stairs", + "expcutcostairs": "exposed_cut_copper_stairs", + "exposedccopperstair": "exposed_cut_copper_stairs", + "exposedccopperstairs": "exposed_cut_copper_stairs", + "exposedccopstair": "exposed_cut_copper_stairs", + "exposedccopstairs": "exposed_cut_copper_stairs", + "exposedccostair": "exposed_cut_copper_stairs", + "exposedccostairs": "exposed_cut_copper_stairs", + "exposedcutcopperstair": "exposed_cut_copper_stairs", + "exposedcutcopperstairs": "exposed_cut_copper_stairs", + "exposedcutcopstair": "exposed_cut_copper_stairs", + "exposedcutcopstairs": "exposed_cut_copper_stairs", + "exposedcutcostair": "exposed_cut_copper_stairs", + "exposedcutcostairs": "exposed_cut_copper_stairs", + "minecraft:exposed_cut_copper_stairs": "exposed_cut_copper_stairs", "farmland": { "material": "FARMLAND" }, @@ -5008,6 +6164,67 @@ }, "flowerpot": "flower_pot", "minecraft:flower_pot": "flower_pot", + "flowering_azalea": { + "material": "FLOWERING_AZALEA" + }, + "floweringazalea": "flowering_azalea", + "minecraft:flowering_azalea": "flowering_azalea", + "flowering_azalea_leaves": { + "material": "FLOWERING_AZALEA_LEAVES" + }, + "flowerazaleaf": "flowering_azalea_leaves", + "flowerazalealeaf": "flowering_azalea_leaves", + "flowerazalealeave": "flowering_azalea_leaves", + "flowerazalealeaves": "flowering_azalea_leaves", + "flowerazalealogleaf": "flowering_azalea_leaves", + "flowerazalealogleave": "flowering_azalea_leaves", + "flowerazalealogleaves": "flowering_azalea_leaves", + "flowerazaleatreeleaf": "flowering_azalea_leaves", + "flowerazaleatreeleave": "flowering_azalea_leaves", + "flowerazaleatreeleaves": "flowering_azalea_leaves", + "flowerazaleatrunkleaf": "flowering_azalea_leaves", + "flowerazaleatrunkleave": "flowering_azalea_leaves", + "flowerazaleatrunkleaves": "flowering_azalea_leaves", + "flowerazaleave": "flowering_azalea_leaves", + "flowerazaleaves": "flowering_azalea_leaves", + "flowerazaleawoodleaf": "flowering_azalea_leaves", + "flowerazaleawoodleave": "flowering_azalea_leaves", + "flowerazaleawoodleaves": "flowering_azalea_leaves", + "flowerazalogleaf": "flowering_azalea_leaves", + "flowerazalogleave": "flowering_azalea_leaves", + "flowerazalogleaves": "flowering_azalea_leaves", + "flowerazatreeleaf": "flowering_azalea_leaves", + "flowerazatreeleave": "flowering_azalea_leaves", + "flowerazatreeleaves": "flowering_azalea_leaves", + "flowerazatrunkleaf": "flowering_azalea_leaves", + "flowerazatrunkleave": "flowering_azalea_leaves", + "flowerazatrunkleaves": "flowering_azalea_leaves", + "flowerazawoodleaf": "flowering_azalea_leaves", + "flowerazawoodleave": "flowering_azalea_leaves", + "flowerazawoodleaves": "flowering_azalea_leaves", + "flowerazleaf": "flowering_azalea_leaves", + "flowerazleave": "flowering_azalea_leaves", + "flowerazleaves": "flowering_azalea_leaves", + "flowerazlogleaf": "flowering_azalea_leaves", + "flowerazlogleave": "flowering_azalea_leaves", + "flowerazlogleaves": "flowering_azalea_leaves", + "floweraztreeleaf": "flowering_azalea_leaves", + "floweraztreeleave": "flowering_azalea_leaves", + "floweraztreeleaves": "flowering_azalea_leaves", + "floweraztrunkleaf": "flowering_azalea_leaves", + "floweraztrunkleave": "flowering_azalea_leaves", + "floweraztrunkleaves": "flowering_azalea_leaves", + "flowerazwoodleaf": "flowering_azalea_leaves", + "flowerazwoodleave": "flowering_azalea_leaves", + "flowerazwoodleaves": "flowering_azalea_leaves", + "floweringazalealeaves": "flowering_azalea_leaves", + "flowerleafaz": "flowering_azalea_leaves", + "flowerleafaza": "flowering_azalea_leaves", + "flowerleafazalea": "flowering_azalea_leaves", + "flowerleavesaz": "flowering_azalea_leaves", + "flowerleavesaza": "flowering_azalea_leaves", + "flowerleavesazalea": "flowering_azalea_leaves", + "minecraft:flowering_azalea_leaves": "flowering_azalea_leaves", "fox_spawn_egg": { "material": "FOX_SPAWN_EGG" }, @@ -5153,6 +6370,114 @@ }, "globebannerpattern": "globe_banner_pattern", "minecraft:globe_banner_pattern": "globe_banner_pattern", + "glow_berries": { + "material": "GLOW_BERRIES" + }, + "glowberries": "glow_berries", + "minecraft:glow_berries": "glow_berries", + "glow_ink_sac": { + "material": "GLOW_INK_SAC" + }, + "glowinksac": "glow_ink_sac", + "minecraft:glow_ink_sac": "glow_ink_sac", + "glow_item_frame": { + "material": "GLOW_ITEM_FRAME" + }, + "glowitemframe": "glow_item_frame", + "minecraft:glow_item_frame": "glow_item_frame", + "glow_lichen": { + "material": "GLOW_LICHEN" + }, + "glowlichen": "glow_lichen", + "minecraft:glow_lichen": "glow_lichen", + "glow_squid_spawn_egg": { + "material": "GLOW_SQUID_SPAWN_EGG" + }, + "eggglow_squid": "glow_squid_spawn_egg", + "eggglowsq": "glow_squid_spawn_egg", + "eggglowsquid": "glow_squid_spawn_egg", + "eggglsq": "glow_squid_spawn_egg", + "eggglsquid": "glow_squid_spawn_egg", + "glow_squidegg": "glow_squid_spawn_egg", + "glow_squidsegg": "glow_squid_spawn_egg", + "glow_squidspawn": "glow_squid_spawn_egg", + "glow_squidspawnegg": "glow_squid_spawn_egg", + "glowsqegg": "glow_squid_spawn_egg", + "glowsqsegg": "glow_squid_spawn_egg", + "glowsqspawn": "glow_squid_spawn_egg", + "glowsqspawnegg": "glow_squid_spawn_egg", + "glowsquidegg": "glow_squid_spawn_egg", + "glowsquidsegg": "glow_squid_spawn_egg", + "glowsquidspawn": "glow_squid_spawn_egg", + "glowsquidspawnegg": "glow_squid_spawn_egg", + "glsqegg": "glow_squid_spawn_egg", + "glsqsegg": "glow_squid_spawn_egg", + "glsqspawn": "glow_squid_spawn_egg", + "glsqspawnegg": "glow_squid_spawn_egg", + "glsquidegg": "glow_squid_spawn_egg", + "glsquidsegg": "glow_squid_spawn_egg", + "glsquidspawn": "glow_squid_spawn_egg", + "glsquidspawnegg": "glow_squid_spawn_egg", + "minecraft:glow_squid_spawn_egg": "glow_squid_spawn_egg", + "seggglow_squid": "glow_squid_spawn_egg", + "seggglowsq": "glow_squid_spawn_egg", + "seggglowsquid": "glow_squid_spawn_egg", + "seggglsq": "glow_squid_spawn_egg", + "seggglsquid": "glow_squid_spawn_egg", + "spawneggglow_squid": "glow_squid_spawn_egg", + "spawneggglowsq": "glow_squid_spawn_egg", + "spawneggglowsquid": "glow_squid_spawn_egg", + "spawneggglsq": "glow_squid_spawn_egg", + "spawneggglsquid": "glow_squid_spawn_egg", + "spawnglow_squid": "glow_squid_spawn_egg", + "spawnglowsq": "glow_squid_spawn_egg", + "spawnglowsquid": "glow_squid_spawn_egg", + "spawnglsq": "glow_squid_spawn_egg", + "spawnglsquid": "glow_squid_spawn_egg", + "glow_squid_spawner": { + "entity": "GLOW_SQUID", + "material": "SPAWNER" + }, + "glow_squidcage": "glow_squid_spawner", + "glow_squidmcage": "glow_squid_spawner", + "glow_squidmobcage": "glow_squid_spawner", + "glow_squidmobspawner": "glow_squid_spawner", + "glow_squidmonstercage": "glow_squid_spawner", + "glow_squidmonsterspawner": "glow_squid_spawner", + "glow_squidmspawner": "glow_squid_spawner", + "glow_squidspawner": "glow_squid_spawner", + "glowsqcage": "glow_squid_spawner", + "glowsqmcage": "glow_squid_spawner", + "glowsqmobcage": "glow_squid_spawner", + "glowsqmobspawner": "glow_squid_spawner", + "glowsqmonstercage": "glow_squid_spawner", + "glowsqmonsterspawner": "glow_squid_spawner", + "glowsqmspawner": "glow_squid_spawner", + "glowsqspawner": "glow_squid_spawner", + "glowsquidcage": "glow_squid_spawner", + "glowsquidmcage": "glow_squid_spawner", + "glowsquidmobcage": "glow_squid_spawner", + "glowsquidmobspawner": "glow_squid_spawner", + "glowsquidmonstercage": "glow_squid_spawner", + "glowsquidmonsterspawner": "glow_squid_spawner", + "glowsquidmspawner": "glow_squid_spawner", + "glowsquidspawner": "glow_squid_spawner", + "glsqcage": "glow_squid_spawner", + "glsqmcage": "glow_squid_spawner", + "glsqmobcage": "glow_squid_spawner", + "glsqmobspawner": "glow_squid_spawner", + "glsqmonstercage": "glow_squid_spawner", + "glsqmonsterspawner": "glow_squid_spawner", + "glsqmspawner": "glow_squid_spawner", + "glsqspawner": "glow_squid_spawner", + "glsquidcage": "glow_squid_spawner", + "glsquidmcage": "glow_squid_spawner", + "glsquidmobcage": "glow_squid_spawner", + "glsquidmobspawner": "glow_squid_spawner", + "glsquidmonstercage": "glow_squid_spawner", + "glsquidmonsterspawner": "glow_squid_spawner", + "glsquidmspawner": "glow_squid_spawner", + "glsquidspawner": "glow_squid_spawner", "glowstone": { "material": "GLOWSTONE" }, @@ -5162,6 +6487,46 @@ }, "glowstonedust": "glowstone_dust", "minecraft:glowstone_dust": "glowstone_dust", + "goat_spawn_egg": { + "material": "GOAT_SPAWN_EGG" + }, + "egggoat": "goat_spawn_egg", + "eggthegoat": "goat_spawn_egg", + "goategg": "goat_spawn_egg", + "goatsegg": "goat_spawn_egg", + "goatspawn": "goat_spawn_egg", + "goatspawnegg": "goat_spawn_egg", + "minecraft:goat_spawn_egg": "goat_spawn_egg", + "segggoat": "goat_spawn_egg", + "seggthegoat": "goat_spawn_egg", + "spawnegggoat": "goat_spawn_egg", + "spawneggthegoat": "goat_spawn_egg", + "spawngoat": "goat_spawn_egg", + "spawnthegoat": "goat_spawn_egg", + "thegoategg": "goat_spawn_egg", + "thegoatsegg": "goat_spawn_egg", + "thegoatspawn": "goat_spawn_egg", + "thegoatspawnegg": "goat_spawn_egg", + "goat_spawner": { + "entity": "GOAT", + "material": "SPAWNER" + }, + "goatcage": "goat_spawner", + "goatmcage": "goat_spawner", + "goatmobcage": "goat_spawner", + "goatmobspawner": "goat_spawner", + "goatmonstercage": "goat_spawner", + "goatmonsterspawner": "goat_spawner", + "goatmspawner": "goat_spawner", + "goatspawner": "goat_spawner", + "thegoatcage": "goat_spawner", + "thegoatmcage": "goat_spawner", + "thegoatmobcage": "goat_spawner", + "thegoatmobspawner": "goat_spawner", + "thegoatmonstercage": "goat_spawner", + "thegoatmonsterspawner": "goat_spawner", + "thegoatmspawner": "goat_spawner", + "thegoatspawner": "goat_spawner", "gold_block": { "material": "GOLD_BLOCK" }, @@ -5203,6 +6568,8 @@ "ogold": "gold_ore", "oreg": "gold_ore", "oregold": "gold_ore", + "stonegoldore": "gold_ore", + "stonegore": "gold_ore", "golden_apple": { "material": "GOLDEN_APPLE" }, @@ -5366,11 +6733,6 @@ }, "grassblock": "grass_block", "minecraft:grass_block": "grass_block", - "grass_path": { - "material": "GRASS_PATH" - }, - "grasspath": "grass_path", - "minecraft:grass_path": "grass_path", "gravel": { "material": "GRAVEL" }, @@ -5401,6 +6763,19 @@ "graybed": "gray_bed", "greybed": "gray_bed", "minecraft:gray_bed": "gray_bed", + "gray_candle": { + "material": "GRAY_CANDLE" + }, + "darkgracandle": "gray_candle", + "darkgraycandle": "gray_candle", + "darkgreycandle": "gray_candle", + "dgracandle": "gray_candle", + "dgraycandle": "gray_candle", + "dgreycandle": "gray_candle", + "gracandle": "gray_candle", + "graycandle": "gray_candle", + "greycandle": "gray_candle", + "minecraft:gray_candle": "gray_candle", "gray_carpet": { "material": "GRAY_CARPET" }, @@ -5767,6 +7142,16 @@ "grebed": "green_bed", "greenbed": "green_bed", "minecraft:green_bed": "green_bed", + "green_candle": { + "material": "GREEN_CANDLE" + }, + "darkgrecandle": "green_candle", + "darkgreencandle": "green_candle", + "dgrecandle": "green_candle", + "dgreencandle": "green_candle", + "grecandle": "green_candle", + "greencandle": "green_candle", + "minecraft:green_candle": "green_candle", "green_carpet": { "material": "GREEN_CARPET" }, @@ -6062,6 +7447,16 @@ "material": "GUNPOWDER" }, "minecraft:gunpowder": "gunpowder", + "hanging_roots": { + "material": "HANGING_ROOTS" + }, + "caveroot": "hanging_roots", + "caveroots": "hanging_roots", + "hangingroot": "hanging_roots", + "hangingroots": "hanging_roots", + "hangroot": "hanging_roots", + "hangroots": "hanging_roots", + "minecraft:hanging_roots": "hanging_roots", "harming_lingering_potion": { "potionData": { "type": "INSTANT_DAMAGE", @@ -7043,6 +8438,130 @@ "trapcrackstone": "infested_cracked_stone_bricks", "trapcrst": "infested_cracked_stone_bricks", "trapcrstone": "infested_cracked_stone_bricks", + "infested_deepslate": { + "material": "INFESTED_DEEPSLATE" + }, + "fishdeepslate": "infested_deepslate", + "fishdeepslateb": "infested_deepslate", + "fishdeepslatebl": "infested_deepslate", + "fishdeepslateblock": "infested_deepslate", + "fishdslate": "infested_deepslate", + "fishdslateb": "infested_deepslate", + "fishdslatebl": "infested_deepslate", + "fishdslateblock": "infested_deepslate", + "fishslate": "infested_deepslate", + "fishslateb": "infested_deepslate", + "fishslatebl": "infested_deepslate", + "fishslateblock": "infested_deepslate", + "infestdeepslate": "infested_deepslate", + "infestdeepslateb": "infested_deepslate", + "infestdeepslatebl": "infested_deepslate", + "infestdeepslateblock": "infested_deepslate", + "infestdslate": "infested_deepslate", + "infestdslateb": "infested_deepslate", + "infestdslatebl": "infested_deepslate", + "infestdslateblock": "infested_deepslate", + "infesteddeepslate": "infested_deepslate", + "infesteddeepslateb": "infested_deepslate", + "infesteddeepslatebl": "infested_deepslate", + "infesteddeepslateblock": "infested_deepslate", + "infesteddslate": "infested_deepslate", + "infesteddslateb": "infested_deepslate", + "infesteddslatebl": "infested_deepslate", + "infesteddslateblock": "infested_deepslate", + "infestedslate": "infested_deepslate", + "infestedslateb": "infested_deepslate", + "infestedslatebl": "infested_deepslate", + "infestedslateblock": "infested_deepslate", + "infestslate": "infested_deepslate", + "infestslateb": "infested_deepslate", + "infestslatebl": "infested_deepslate", + "infestslateblock": "infested_deepslate", + "medeepslate": "infested_deepslate", + "medeepslateb": "infested_deepslate", + "medeepslatebl": "infested_deepslate", + "medeepslateblock": "infested_deepslate", + "medslate": "infested_deepslate", + "medslateb": "infested_deepslate", + "medslatebl": "infested_deepslate", + "medslateblock": "infested_deepslate", + "meggdeepslate": "infested_deepslate", + "meggdeepslateb": "infested_deepslate", + "meggdeepslatebl": "infested_deepslate", + "meggdeepslateblock": "infested_deepslate", + "meggdslate": "infested_deepslate", + "meggdslateb": "infested_deepslate", + "meggdslatebl": "infested_deepslate", + "meggdslateblock": "infested_deepslate", + "meggslate": "infested_deepslate", + "meggslateb": "infested_deepslate", + "meggslatebl": "infested_deepslate", + "meggslateblock": "infested_deepslate", + "meslate": "infested_deepslate", + "meslateb": "infested_deepslate", + "meslatebl": "infested_deepslate", + "meslateblock": "infested_deepslate", + "minecraft:infested_deepslate": "infested_deepslate", + "monstereggdeepslate": "infested_deepslate", + "monstereggdeepslateb": "infested_deepslate", + "monstereggdeepslatebl": "infested_deepslate", + "monstereggdeepslateblock": "infested_deepslate", + "monstereggdslate": "infested_deepslate", + "monstereggdslateb": "infested_deepslate", + "monstereggdslatebl": "infested_deepslate", + "monstereggdslateblock": "infested_deepslate", + "monstereggslate": "infested_deepslate", + "monstereggslateb": "infested_deepslate", + "monstereggslatebl": "infested_deepslate", + "monstereggslateblock": "infested_deepslate", + "sfdeepslate": "infested_deepslate", + "sfdeepslateb": "infested_deepslate", + "sfdeepslatebl": "infested_deepslate", + "sfdeepslateblock": "infested_deepslate", + "sfdslate": "infested_deepslate", + "sfdslateb": "infested_deepslate", + "sfdslatebl": "infested_deepslate", + "sfdslateblock": "infested_deepslate", + "sfishdeepslate": "infested_deepslate", + "sfishdeepslateb": "infested_deepslate", + "sfishdeepslatebl": "infested_deepslate", + "sfishdeepslateblock": "infested_deepslate", + "sfishdslate": "infested_deepslate", + "sfishdslateb": "infested_deepslate", + "sfishdslatebl": "infested_deepslate", + "sfishdslateblock": "infested_deepslate", + "sfishslate": "infested_deepslate", + "sfishslateb": "infested_deepslate", + "sfishslatebl": "infested_deepslate", + "sfishslateblock": "infested_deepslate", + "sfslate": "infested_deepslate", + "sfslateb": "infested_deepslate", + "sfslatebl": "infested_deepslate", + "sfslateblock": "infested_deepslate", + "silverfishdeepslate": "infested_deepslate", + "silverfishdeepslateb": "infested_deepslate", + "silverfishdeepslatebl": "infested_deepslate", + "silverfishdeepslateblock": "infested_deepslate", + "silverfishdslate": "infested_deepslate", + "silverfishdslateb": "infested_deepslate", + "silverfishdslatebl": "infested_deepslate", + "silverfishdslateblock": "infested_deepslate", + "silverfishslate": "infested_deepslate", + "silverfishslateb": "infested_deepslate", + "silverfishslatebl": "infested_deepslate", + "silverfishslateblock": "infested_deepslate", + "trapdeepslate": "infested_deepslate", + "trapdeepslateb": "infested_deepslate", + "trapdeepslatebl": "infested_deepslate", + "trapdeepslateblock": "infested_deepslate", + "trapdslate": "infested_deepslate", + "trapdslateb": "infested_deepslate", + "trapdslatebl": "infested_deepslate", + "trapdslateblock": "infested_deepslate", + "trapslate": "infested_deepslate", + "trapslateb": "infested_deepslate", + "trapslatebl": "infested_deepslate", + "trapslateblock": "infested_deepslate", "infested_mossy_stone_bricks": { "material": "INFESTED_MOSSY_STONE_BRICKS" }, @@ -7696,6 +9215,11 @@ "steelo": "iron_ore", "steelore": "iron_ore", "sto": "iron_ore", + "stoneiore": "iron_ore", + "stoneironore": "iron_ore", + "stonesore": "iron_ore", + "stonesteelore": "iron_ore", + "stonestore": "iron_ore", "store": "iron_ore", "iron_pickaxe": { "material": "IRON_PICKAXE" @@ -8220,6 +9744,21 @@ "orel": "lapis_ore", "orelapis": "lapis_ore", "orelapislazuli": "lapis_ore", + "stonelapislazuliore": "lapis_ore", + "stonelapisore": "lapis_ore", + "stonelore": "lapis_ore", + "large_amethyst_bud": { + "material": "LARGE_AMETHYST_BUD" + }, + "amethystbudl": "large_amethyst_bud", + "bigamethystbud": "large_amethyst_bud", + "bigcavebud": "large_amethyst_bud", + "cavebudl": "large_amethyst_bud", + "lamethystbud": "large_amethyst_bud", + "largeamethystbud": "large_amethyst_bud", + "largecavebud": "large_amethyst_bud", + "lcavebud": "large_amethyst_bud", + "minecraft:large_amethyst_bud": "large_amethyst_bud", "large_fern": { "material": "LARGE_FERN" }, @@ -8418,6 +9957,10 @@ "material": "LEVER" }, "minecraft:lever": "lever", + "light": { + "material": "LIGHT" + }, + "minecraft:light": "light", "light_blue_banner": { "material": "LIGHT_BLUE_BANNER" }, @@ -8438,6 +9981,16 @@ "lightblubed": "light_blue_bed", "lightbluebed": "light_blue_bed", "minecraft:light_blue_bed": "light_blue_bed", + "light_blue_candle": { + "material": "LIGHT_BLUE_CANDLE" + }, + "lbcandle": "light_blue_candle", + "lblucandle": "light_blue_candle", + "lbluecandle": "light_blue_candle", + "light_bluecandle": "light_blue_candle", + "lightblucandle": "light_blue_candle", + "lightbluecandle": "light_blue_candle", + "minecraft:light_blue_candle": "light_blue_candle", "light_blue_carpet": { "material": "LIGHT_BLUE_CARPET" }, @@ -8712,6 +10265,21 @@ "siabed": "light_gray_bed", "sibed": "light_gray_bed", "silverbed": "light_gray_bed", + "light_gray_candle": { + "material": "LIGHT_GRAY_CANDLE" + }, + "lgcandle": "light_gray_candle", + "lgracandle": "light_gray_candle", + "lgraycandle": "light_gray_candle", + "lgreycandle": "light_gray_candle", + "light_graycandle": "light_gray_candle", + "lightgracandle": "light_gray_candle", + "lightgraycandle": "light_gray_candle", + "lightgreycandle": "light_gray_candle", + "minecraft:light_gray_candle": "light_gray_candle", + "siacandle": "light_gray_candle", + "sicandle": "light_gray_candle", + "silvercandle": "light_gray_candle", "light_gray_carpet": { "material": "LIGHT_GRAY_CARPET" }, @@ -9131,6 +10699,11 @@ }, "lightweightedpressureplate": "light_weighted_pressure_plate", "minecraft:light_weighted_pressure_plate": "light_weighted_pressure_plate", + "lightning_rod": { + "material": "LIGHTNING_ROD" + }, + "lightningrod": "lightning_rod", + "minecraft:lightning_rod": "lightning_rod", "lilac": { "material": "LILAC" }, @@ -9165,6 +10738,16 @@ "lightgreenbed": "lime_bed", "limebed": "lime_bed", "minecraft:lime_bed": "lime_bed", + "lime_candle": { + "material": "LIME_CANDLE" + }, + "lcandle": "lime_candle", + "lgrecandle": "lime_candle", + "lgreencandle": "lime_candle", + "lightgrecandle": "lime_candle", + "lightgreencandle": "lime_candle", + "limecandle": "lime_candle", + "minecraft:lime_candle": "lime_candle", "lime_carpet": { "material": "LIME_CARPET" }, @@ -16517,6 +18100,12 @@ "magentabed": "magenta_bed", "mbed": "magenta_bed", "minecraft:magenta_bed": "magenta_bed", + "magenta_candle": { + "material": "MAGENTA_CANDLE" + }, + "magentacandle": "magenta_candle", + "mcandle": "magenta_candle", + "minecraft:magenta_candle": "magenta_candle", "magenta_carpet": { "material": "MAGENTA_CARPET" }, @@ -16712,6 +18301,18 @@ "material": "MAP" }, "minecraft:map": "map", + "medium_amethyst_bud": { + "material": "MEDIUM_AMETHYST_BUD" + }, + "amethystbudm": "medium_amethyst_bud", + "cavebudm": "medium_amethyst_bud", + "mamethystbud": "medium_amethyst_bud", + "mcavebud": "medium_amethyst_bud", + "mediumamethystbud": "medium_amethyst_bud", + "mediumcavebud": "medium_amethyst_bud", + "midamethystbud": "medium_amethyst_bud", + "midcavebud": "medium_amethyst_bud", + "minecraft:medium_amethyst_bud": "medium_amethyst_bud", "melon": { "material": "MELON" }, @@ -16779,6 +18380,16 @@ "spawnmushroom": "mooshroom_spawn_egg", "spawnmushroom_cow": "mooshroom_spawn_egg", "spawnmushroomcow": "mooshroom_spawn_egg", + "moss_block": { + "material": "MOSS_BLOCK" + }, + "minecraft:moss_block": "moss_block", + "mossblock": "moss_block", + "moss_carpet": { + "material": "MOSS_CARPET" + }, + "minecraft:moss_carpet": "moss_carpet", + "mosscarpet": "moss_carpet", "mossy_cobblestone": { "material": "MOSSY_COBBLESTONE" }, @@ -18219,16 +19830,8 @@ "nether_quartzore": "nether_quartz_ore", "netherqo": "nether_quartz_ore", "netherqore": "nether_quartz_ore", - "netherquartz": "quartz_block", - "netherquartzb": "quartz_block", - "netherquartzbl": "quartz_block", - "netherquartzblock": "quartz_block", "netherquartzo": "nether_quartz_ore", "netherquartzore": "nether_quartz_ore", - "nq": "quartz_block", - "nqb": "quartz_block", - "nqbl": "quartz_block", - "nqblock": "quartz_block", "nqo": "nether_quartz_ore", "nqore": "nether_quartz_ore", "nquartzo": "nether_quartz_ore", @@ -18263,22 +19866,8 @@ "orenquartz": "nether_quartz_ore", "oreq": "nether_quartz_ore", "orequartz": "nether_quartz_ore", - "q": "quartz_block", - "qb": "quartz_block", - "qbl": "quartz_block", - "qblock": "quartz_block", "qo": "nether_quartz_ore", "qore": "nether_quartz_ore", - "quar": "quartz_block", - "quarb": "quartz_block", - "quarbl": "quartz_block", - "quarblock": "quartz_block", - "quartz": { - "material": "QUARTZ" - }, - "quartzb": "quartz_block", - "quartzbl": "quartz_block", - "quartzblock": "quartz_block", "quartzo": "nether_quartz_ore", "quartzore": "nether_quartz_ore", "nether_sprouts": { @@ -18997,6 +20586,12 @@ "minecraft:orange_bed": "orange_bed", "obed": "orange_bed", "orangebed": "orange_bed", + "orange_candle": { + "material": "ORANGE_CANDLE" + }, + "minecraft:orange_candle": "orange_candle", + "ocandle": "orange_candle", + "orangecandle": "orange_candle", "orange_carpet": { "material": "ORANGE_CARPET" }, @@ -19115,6 +20710,372 @@ }, "minecraft:oxeye_daisy": "oxeye_daisy", "oxeyedaisy": "oxeye_daisy", + "oxidized_copper": { + "material": "OXIDIZED_COPPER" + }, + "minecraft:oxidized_copper": "oxidized_copper", + "oxicoblock": "oxidized_copper", + "oxicopblock": "oxidized_copper", + "oxicopperblock": "oxidized_copper", + "oxidisedcoblock": "oxidized_copper", + "oxidisedcopblock": "oxidized_copper", + "oxidisedcopperblock": "oxidized_copper", + "oxidizedcoblock": "oxidized_copper", + "oxidizedcopblock": "oxidized_copper", + "oxidizedcopper": "oxidized_copper", + "oxidizedcopperblock": "oxidized_copper", + "oxycoblock": "oxidized_copper", + "oxycopblock": "oxidized_copper", + "oxycopperblock": "oxidized_copper", + "oxidized_cut_copper": { + "material": "OXIDIZED_CUT_COPPER" + }, + "coxicoblock": "oxidized_cut_copper", + "coxicopblock": "oxidized_cut_copper", + "coxicopperblock": "oxidized_cut_copper", + "coxidisedcoblock": "oxidized_cut_copper", + "coxidisedcopblock": "oxidized_cut_copper", + "coxidisedcopperblock": "oxidized_cut_copper", + "coxidizedcoblock": "oxidized_cut_copper", + "coxidizedcopblock": "oxidized_cut_copper", + "coxidizedcopperblock": "oxidized_cut_copper", + "coxycoblock": "oxidized_cut_copper", + "coxycopblock": "oxidized_cut_copper", + "coxycopperblock": "oxidized_cut_copper", + "cutoxicoblock": "oxidized_cut_copper", + "cutoxicopblock": "oxidized_cut_copper", + "cutoxicopperblock": "oxidized_cut_copper", + "cutoxidisedcoblock": "oxidized_cut_copper", + "cutoxidisedcopblock": "oxidized_cut_copper", + "cutoxidisedcopperblock": "oxidized_cut_copper", + "cutoxidizedcoblock": "oxidized_cut_copper", + "cutoxidizedcopblock": "oxidized_cut_copper", + "cutoxidizedcopperblock": "oxidized_cut_copper", + "cutoxycoblock": "oxidized_cut_copper", + "cutoxycopblock": "oxidized_cut_copper", + "cutoxycopperblock": "oxidized_cut_copper", + "minecraft:oxidized_cut_copper": "oxidized_cut_copper", + "oxiccoblock": "oxidized_cut_copper", + "oxiccopblock": "oxidized_cut_copper", + "oxiccopperblock": "oxidized_cut_copper", + "oxicutcoblock": "oxidized_cut_copper", + "oxicutcopblock": "oxidized_cut_copper", + "oxicutcopperblock": "oxidized_cut_copper", + "oxidisedccoblock": "oxidized_cut_copper", + "oxidisedccopblock": "oxidized_cut_copper", + "oxidisedccopperblock": "oxidized_cut_copper", + "oxidisedcutcoblock": "oxidized_cut_copper", + "oxidisedcutcopblock": "oxidized_cut_copper", + "oxidisedcutcopperblock": "oxidized_cut_copper", + "oxidizedccoblock": "oxidized_cut_copper", + "oxidizedccopblock": "oxidized_cut_copper", + "oxidizedccopperblock": "oxidized_cut_copper", + "oxidizedcutcoblock": "oxidized_cut_copper", + "oxidizedcutcopblock": "oxidized_cut_copper", + "oxidizedcutcopper": "oxidized_cut_copper", + "oxidizedcutcopperblock": "oxidized_cut_copper", + "oxyccoblock": "oxidized_cut_copper", + "oxyccopblock": "oxidized_cut_copper", + "oxyccopperblock": "oxidized_cut_copper", + "oxycutcoblock": "oxidized_cut_copper", + "oxycutcopblock": "oxidized_cut_copper", + "oxycutcopperblock": "oxidized_cut_copper", + "oxidized_cut_copper_slab": { + "material": "OXIDIZED_CUT_COPPER_SLAB" + }, + "coxicohalfblock": "oxidized_cut_copper_slab", + "coxicophalfblock": "oxidized_cut_copper_slab", + "coxicopperhalfblock": "oxidized_cut_copper_slab", + "coxicoppersl": "oxidized_cut_copper_slab", + "coxicopperslab": "oxidized_cut_copper_slab", + "coxicopperstep": "oxidized_cut_copper_slab", + "coxicopsl": "oxidized_cut_copper_slab", + "coxicopslab": "oxidized_cut_copper_slab", + "coxicopstep": "oxidized_cut_copper_slab", + "coxicosl": "oxidized_cut_copper_slab", + "coxicoslab": "oxidized_cut_copper_slab", + "coxicostep": "oxidized_cut_copper_slab", + "coxidisedcohalfblock": "oxidized_cut_copper_slab", + "coxidisedcophalfblock": "oxidized_cut_copper_slab", + "coxidisedcopperhalfblock": "oxidized_cut_copper_slab", + "coxidisedcoppersl": "oxidized_cut_copper_slab", + "coxidisedcopperslab": "oxidized_cut_copper_slab", + "coxidisedcopperstep": "oxidized_cut_copper_slab", + "coxidisedcopsl": "oxidized_cut_copper_slab", + "coxidisedcopslab": "oxidized_cut_copper_slab", + "coxidisedcopstep": "oxidized_cut_copper_slab", + "coxidisedcosl": "oxidized_cut_copper_slab", + "coxidisedcoslab": "oxidized_cut_copper_slab", + "coxidisedcostep": "oxidized_cut_copper_slab", + "coxidizedcohalfblock": "oxidized_cut_copper_slab", + "coxidizedcophalfblock": "oxidized_cut_copper_slab", + "coxidizedcopperhalfblock": "oxidized_cut_copper_slab", + "coxidizedcoppersl": "oxidized_cut_copper_slab", + "coxidizedcopperslab": "oxidized_cut_copper_slab", + "coxidizedcopperstep": "oxidized_cut_copper_slab", + "coxidizedcopsl": "oxidized_cut_copper_slab", + "coxidizedcopslab": "oxidized_cut_copper_slab", + "coxidizedcopstep": "oxidized_cut_copper_slab", + "coxidizedcosl": "oxidized_cut_copper_slab", + "coxidizedcoslab": "oxidized_cut_copper_slab", + "coxidizedcostep": "oxidized_cut_copper_slab", + "coxycohalfblock": "oxidized_cut_copper_slab", + "coxycophalfblock": "oxidized_cut_copper_slab", + "coxycopperhalfblock": "oxidized_cut_copper_slab", + "coxycoppersl": "oxidized_cut_copper_slab", + "coxycopperslab": "oxidized_cut_copper_slab", + "coxycopperstep": "oxidized_cut_copper_slab", + "coxycopsl": "oxidized_cut_copper_slab", + "coxycopslab": "oxidized_cut_copper_slab", + "coxycopstep": "oxidized_cut_copper_slab", + "coxycosl": "oxidized_cut_copper_slab", + "coxycoslab": "oxidized_cut_copper_slab", + "coxycostep": "oxidized_cut_copper_slab", + "cutoxicohalfblock": "oxidized_cut_copper_slab", + "cutoxicophalfblock": "oxidized_cut_copper_slab", + "cutoxicopperhalfblock": "oxidized_cut_copper_slab", + "cutoxicoppersl": "oxidized_cut_copper_slab", + "cutoxicopperslab": "oxidized_cut_copper_slab", + "cutoxicopperstep": "oxidized_cut_copper_slab", + "cutoxicopsl": "oxidized_cut_copper_slab", + "cutoxicopslab": "oxidized_cut_copper_slab", + "cutoxicopstep": "oxidized_cut_copper_slab", + "cutoxicosl": "oxidized_cut_copper_slab", + "cutoxicoslab": "oxidized_cut_copper_slab", + "cutoxicostep": "oxidized_cut_copper_slab", + "cutoxidisedcohalfblock": "oxidized_cut_copper_slab", + "cutoxidisedcophalfblock": "oxidized_cut_copper_slab", + "cutoxidisedcopperhalfblock": "oxidized_cut_copper_slab", + "cutoxidisedcoppersl": "oxidized_cut_copper_slab", + "cutoxidisedcopperslab": "oxidized_cut_copper_slab", + "cutoxidisedcopperstep": "oxidized_cut_copper_slab", + "cutoxidisedcopsl": "oxidized_cut_copper_slab", + "cutoxidisedcopslab": "oxidized_cut_copper_slab", + "cutoxidisedcopstep": "oxidized_cut_copper_slab", + "cutoxidisedcosl": "oxidized_cut_copper_slab", + "cutoxidisedcoslab": "oxidized_cut_copper_slab", + "cutoxidisedcostep": "oxidized_cut_copper_slab", + "cutoxidizedcohalfblock": "oxidized_cut_copper_slab", + "cutoxidizedcophalfblock": "oxidized_cut_copper_slab", + "cutoxidizedcopperhalfblock": "oxidized_cut_copper_slab", + "cutoxidizedcoppersl": "oxidized_cut_copper_slab", + "cutoxidizedcopperslab": "oxidized_cut_copper_slab", + "cutoxidizedcopperstep": "oxidized_cut_copper_slab", + "cutoxidizedcopsl": "oxidized_cut_copper_slab", + "cutoxidizedcopslab": "oxidized_cut_copper_slab", + "cutoxidizedcopstep": "oxidized_cut_copper_slab", + "cutoxidizedcosl": "oxidized_cut_copper_slab", + "cutoxidizedcoslab": "oxidized_cut_copper_slab", + "cutoxidizedcostep": "oxidized_cut_copper_slab", + "cutoxycohalfblock": "oxidized_cut_copper_slab", + "cutoxycophalfblock": "oxidized_cut_copper_slab", + "cutoxycopperhalfblock": "oxidized_cut_copper_slab", + "cutoxycoppersl": "oxidized_cut_copper_slab", + "cutoxycopperslab": "oxidized_cut_copper_slab", + "cutoxycopperstep": "oxidized_cut_copper_slab", + "cutoxycopsl": "oxidized_cut_copper_slab", + "cutoxycopslab": "oxidized_cut_copper_slab", + "cutoxycopstep": "oxidized_cut_copper_slab", + "cutoxycosl": "oxidized_cut_copper_slab", + "cutoxycoslab": "oxidized_cut_copper_slab", + "cutoxycostep": "oxidized_cut_copper_slab", + "minecraft:oxidized_cut_copper_slab": "oxidized_cut_copper_slab", + "oxiccohalfblock": "oxidized_cut_copper_slab", + "oxiccophalfblock": "oxidized_cut_copper_slab", + "oxiccopperhalfblock": "oxidized_cut_copper_slab", + "oxiccoppersl": "oxidized_cut_copper_slab", + "oxiccopperslab": "oxidized_cut_copper_slab", + "oxiccopperstep": "oxidized_cut_copper_slab", + "oxiccopsl": "oxidized_cut_copper_slab", + "oxiccopslab": "oxidized_cut_copper_slab", + "oxiccopstep": "oxidized_cut_copper_slab", + "oxiccosl": "oxidized_cut_copper_slab", + "oxiccoslab": "oxidized_cut_copper_slab", + "oxiccostep": "oxidized_cut_copper_slab", + "oxicutcohalfblock": "oxidized_cut_copper_slab", + "oxicutcophalfblock": "oxidized_cut_copper_slab", + "oxicutcopperhalfblock": "oxidized_cut_copper_slab", + "oxicutcoppersl": "oxidized_cut_copper_slab", + "oxicutcopperslab": "oxidized_cut_copper_slab", + "oxicutcopperstep": "oxidized_cut_copper_slab", + "oxicutcopsl": "oxidized_cut_copper_slab", + "oxicutcopslab": "oxidized_cut_copper_slab", + "oxicutcopstep": "oxidized_cut_copper_slab", + "oxicutcosl": "oxidized_cut_copper_slab", + "oxicutcoslab": "oxidized_cut_copper_slab", + "oxicutcostep": "oxidized_cut_copper_slab", + "oxidisedccohalfblock": "oxidized_cut_copper_slab", + "oxidisedccophalfblock": "oxidized_cut_copper_slab", + "oxidisedccopperhalfblock": "oxidized_cut_copper_slab", + "oxidisedccoppersl": "oxidized_cut_copper_slab", + "oxidisedccopperslab": "oxidized_cut_copper_slab", + "oxidisedccopperstep": "oxidized_cut_copper_slab", + "oxidisedccopsl": "oxidized_cut_copper_slab", + "oxidisedccopslab": "oxidized_cut_copper_slab", + "oxidisedccopstep": "oxidized_cut_copper_slab", + "oxidisedccosl": "oxidized_cut_copper_slab", + "oxidisedccoslab": "oxidized_cut_copper_slab", + "oxidisedccostep": "oxidized_cut_copper_slab", + "oxidisedcutcohalfblock": "oxidized_cut_copper_slab", + "oxidisedcutcophalfblock": "oxidized_cut_copper_slab", + "oxidisedcutcopperhalfblock": "oxidized_cut_copper_slab", + "oxidisedcutcoppersl": "oxidized_cut_copper_slab", + "oxidisedcutcopperslab": "oxidized_cut_copper_slab", + "oxidisedcutcopperstep": "oxidized_cut_copper_slab", + "oxidisedcutcopsl": "oxidized_cut_copper_slab", + "oxidisedcutcopslab": "oxidized_cut_copper_slab", + "oxidisedcutcopstep": "oxidized_cut_copper_slab", + "oxidisedcutcosl": "oxidized_cut_copper_slab", + "oxidisedcutcoslab": "oxidized_cut_copper_slab", + "oxidisedcutcostep": "oxidized_cut_copper_slab", + "oxidizedccohalfblock": "oxidized_cut_copper_slab", + "oxidizedccophalfblock": "oxidized_cut_copper_slab", + "oxidizedccopperhalfblock": "oxidized_cut_copper_slab", + "oxidizedccoppersl": "oxidized_cut_copper_slab", + "oxidizedccopperslab": "oxidized_cut_copper_slab", + "oxidizedccopperstep": "oxidized_cut_copper_slab", + "oxidizedccopsl": "oxidized_cut_copper_slab", + "oxidizedccopslab": "oxidized_cut_copper_slab", + "oxidizedccopstep": "oxidized_cut_copper_slab", + "oxidizedccosl": "oxidized_cut_copper_slab", + "oxidizedccoslab": "oxidized_cut_copper_slab", + "oxidizedccostep": "oxidized_cut_copper_slab", + "oxidizedcutcohalfblock": "oxidized_cut_copper_slab", + "oxidizedcutcophalfblock": "oxidized_cut_copper_slab", + "oxidizedcutcopperhalfblock": "oxidized_cut_copper_slab", + "oxidizedcutcoppersl": "oxidized_cut_copper_slab", + "oxidizedcutcopperslab": "oxidized_cut_copper_slab", + "oxidizedcutcopperstep": "oxidized_cut_copper_slab", + "oxidizedcutcopsl": "oxidized_cut_copper_slab", + "oxidizedcutcopslab": "oxidized_cut_copper_slab", + "oxidizedcutcopstep": "oxidized_cut_copper_slab", + "oxidizedcutcosl": "oxidized_cut_copper_slab", + "oxidizedcutcoslab": "oxidized_cut_copper_slab", + "oxidizedcutcostep": "oxidized_cut_copper_slab", + "oxyccohalfblock": "oxidized_cut_copper_slab", + "oxyccophalfblock": "oxidized_cut_copper_slab", + "oxyccopperhalfblock": "oxidized_cut_copper_slab", + "oxyccoppersl": "oxidized_cut_copper_slab", + "oxyccopperslab": "oxidized_cut_copper_slab", + "oxyccopperstep": "oxidized_cut_copper_slab", + "oxyccopsl": "oxidized_cut_copper_slab", + "oxyccopslab": "oxidized_cut_copper_slab", + "oxyccopstep": "oxidized_cut_copper_slab", + "oxyccosl": "oxidized_cut_copper_slab", + "oxyccoslab": "oxidized_cut_copper_slab", + "oxyccostep": "oxidized_cut_copper_slab", + "oxycutcohalfblock": "oxidized_cut_copper_slab", + "oxycutcophalfblock": "oxidized_cut_copper_slab", + "oxycutcopperhalfblock": "oxidized_cut_copper_slab", + "oxycutcoppersl": "oxidized_cut_copper_slab", + "oxycutcopperslab": "oxidized_cut_copper_slab", + "oxycutcopperstep": "oxidized_cut_copper_slab", + "oxycutcopsl": "oxidized_cut_copper_slab", + "oxycutcopslab": "oxidized_cut_copper_slab", + "oxycutcopstep": "oxidized_cut_copper_slab", + "oxycutcosl": "oxidized_cut_copper_slab", + "oxycutcoslab": "oxidized_cut_copper_slab", + "oxycutcostep": "oxidized_cut_copper_slab", + "oxidized_cut_copper_stairs": { + "material": "OXIDIZED_CUT_COPPER_STAIRS" + }, + "coxicopperstair": "oxidized_cut_copper_stairs", + "coxicopperstairs": "oxidized_cut_copper_stairs", + "coxicopstair": "oxidized_cut_copper_stairs", + "coxicopstairs": "oxidized_cut_copper_stairs", + "coxicostair": "oxidized_cut_copper_stairs", + "coxicostairs": "oxidized_cut_copper_stairs", + "coxidisedcopperstair": "oxidized_cut_copper_stairs", + "coxidisedcopperstairs": "oxidized_cut_copper_stairs", + "coxidisedcopstair": "oxidized_cut_copper_stairs", + "coxidisedcopstairs": "oxidized_cut_copper_stairs", + "coxidisedcostair": "oxidized_cut_copper_stairs", + "coxidisedcostairs": "oxidized_cut_copper_stairs", + "coxidizedcopperstair": "oxidized_cut_copper_stairs", + "coxidizedcopperstairs": "oxidized_cut_copper_stairs", + "coxidizedcopstair": "oxidized_cut_copper_stairs", + "coxidizedcopstairs": "oxidized_cut_copper_stairs", + "coxidizedcostair": "oxidized_cut_copper_stairs", + "coxidizedcostairs": "oxidized_cut_copper_stairs", + "coxycopperstair": "oxidized_cut_copper_stairs", + "coxycopperstairs": "oxidized_cut_copper_stairs", + "coxycopstair": "oxidized_cut_copper_stairs", + "coxycopstairs": "oxidized_cut_copper_stairs", + "coxycostair": "oxidized_cut_copper_stairs", + "coxycostairs": "oxidized_cut_copper_stairs", + "cutoxicopperstair": "oxidized_cut_copper_stairs", + "cutoxicopperstairs": "oxidized_cut_copper_stairs", + "cutoxicopstair": "oxidized_cut_copper_stairs", + "cutoxicopstairs": "oxidized_cut_copper_stairs", + "cutoxicostair": "oxidized_cut_copper_stairs", + "cutoxicostairs": "oxidized_cut_copper_stairs", + "cutoxidisedcopperstair": "oxidized_cut_copper_stairs", + "cutoxidisedcopperstairs": "oxidized_cut_copper_stairs", + "cutoxidisedcopstair": "oxidized_cut_copper_stairs", + "cutoxidisedcopstairs": "oxidized_cut_copper_stairs", + "cutoxidisedcostair": "oxidized_cut_copper_stairs", + "cutoxidisedcostairs": "oxidized_cut_copper_stairs", + "cutoxidizedcopperstair": "oxidized_cut_copper_stairs", + "cutoxidizedcopperstairs": "oxidized_cut_copper_stairs", + "cutoxidizedcopstair": "oxidized_cut_copper_stairs", + "cutoxidizedcopstairs": "oxidized_cut_copper_stairs", + "cutoxidizedcostair": "oxidized_cut_copper_stairs", + "cutoxidizedcostairs": "oxidized_cut_copper_stairs", + "cutoxycopperstair": "oxidized_cut_copper_stairs", + "cutoxycopperstairs": "oxidized_cut_copper_stairs", + "cutoxycopstair": "oxidized_cut_copper_stairs", + "cutoxycopstairs": "oxidized_cut_copper_stairs", + "cutoxycostair": "oxidized_cut_copper_stairs", + "cutoxycostairs": "oxidized_cut_copper_stairs", + "minecraft:oxidized_cut_copper_stairs": "oxidized_cut_copper_stairs", + "oxiccopperstair": "oxidized_cut_copper_stairs", + "oxiccopperstairs": "oxidized_cut_copper_stairs", + "oxiccopstair": "oxidized_cut_copper_stairs", + "oxiccopstairs": "oxidized_cut_copper_stairs", + "oxiccostair": "oxidized_cut_copper_stairs", + "oxiccostairs": "oxidized_cut_copper_stairs", + "oxicutcopperstair": "oxidized_cut_copper_stairs", + "oxicutcopperstairs": "oxidized_cut_copper_stairs", + "oxicutcopstair": "oxidized_cut_copper_stairs", + "oxicutcopstairs": "oxidized_cut_copper_stairs", + "oxicutcostair": "oxidized_cut_copper_stairs", + "oxicutcostairs": "oxidized_cut_copper_stairs", + "oxidisedccopperstair": "oxidized_cut_copper_stairs", + "oxidisedccopperstairs": "oxidized_cut_copper_stairs", + "oxidisedccopstair": "oxidized_cut_copper_stairs", + "oxidisedccopstairs": "oxidized_cut_copper_stairs", + "oxidisedccostair": "oxidized_cut_copper_stairs", + "oxidisedccostairs": "oxidized_cut_copper_stairs", + "oxidisedcutcopperstair": "oxidized_cut_copper_stairs", + "oxidisedcutcopperstairs": "oxidized_cut_copper_stairs", + "oxidisedcutcopstair": "oxidized_cut_copper_stairs", + "oxidisedcutcopstairs": "oxidized_cut_copper_stairs", + "oxidisedcutcostair": "oxidized_cut_copper_stairs", + "oxidisedcutcostairs": "oxidized_cut_copper_stairs", + "oxidizedccopperstair": "oxidized_cut_copper_stairs", + "oxidizedccopperstairs": "oxidized_cut_copper_stairs", + "oxidizedccopstair": "oxidized_cut_copper_stairs", + "oxidizedccopstairs": "oxidized_cut_copper_stairs", + "oxidizedccostair": "oxidized_cut_copper_stairs", + "oxidizedccostairs": "oxidized_cut_copper_stairs", + "oxidizedcutcopperstair": "oxidized_cut_copper_stairs", + "oxidizedcutcopperstairs": "oxidized_cut_copper_stairs", + "oxidizedcutcopstair": "oxidized_cut_copper_stairs", + "oxidizedcutcopstairs": "oxidized_cut_copper_stairs", + "oxidizedcutcostair": "oxidized_cut_copper_stairs", + "oxidizedcutcostairs": "oxidized_cut_copper_stairs", + "oxyccopperstair": "oxidized_cut_copper_stairs", + "oxyccopperstairs": "oxidized_cut_copper_stairs", + "oxyccopstair": "oxidized_cut_copper_stairs", + "oxyccopstairs": "oxidized_cut_copper_stairs", + "oxyccostair": "oxidized_cut_copper_stairs", + "oxyccostairs": "oxidized_cut_copper_stairs", + "oxycutcopperstair": "oxidized_cut_copper_stairs", + "oxycutcopperstairs": "oxidized_cut_copper_stairs", + "oxycutcopstair": "oxidized_cut_copper_stairs", + "oxycutcopstairs": "oxidized_cut_copper_stairs", + "oxycutcostair": "oxidized_cut_copper_stairs", + "oxycutcostairs": "oxidized_cut_copper_stairs", "packed_ice": { "material": "PACKED_ICE" }, @@ -19454,6 +21415,12 @@ "minecraft:pink_bed": "pink_bed", "pibed": "pink_bed", "pinkbed": "pink_bed", + "pink_candle": { + "material": "PINK_CANDLE" + }, + "minecraft:pink_candle": "pink_candle", + "picandle": "pink_candle", + "pinkcandle": "pink_candle", "pink_carpet": { "material": "PINK_CARPET" }, @@ -19580,6 +21547,20 @@ "material": "PODZOL" }, "minecraft:podzol": "podzol", + "pointed_dripstone": { + "material": "POINTED_DRIPSTONE" + }, + "hangingdrip": "pointed_dripstone", + "hangingdripstone": "pointed_dripstone", + "minecraft:pointed_dripstone": "pointed_dripstone", + "pdrip": "pointed_dripstone", + "pdripstone": "pointed_dripstone", + "pointdrip": "pointed_dripstone", + "pointdripstone": "pointed_dripstone", + "pointeddrip": "pointed_dripstone", + "pointeddripstone": "pointed_dripstone", + "spikydrip": "pointed_dripstone", + "spikydripstone": "pointed_dripstone", "poison_lingering_potion": { "potionData": { "type": "POISON", @@ -20065,6 +22046,83 @@ "wallpolishedblackstone": "polished_blackstone_wall", "wallpolishedblst": "polished_blackstone_wall", "wallpolishedblstone": "polished_blackstone_wall", + "polished_deepslate": { + "material": "POLISHED_DEEPSLATE" + }, + "minecraft:polished_deepslate": "polished_deepslate", + "pdeepslate": "polished_deepslate", + "pdeepslateb": "polished_deepslate", + "pdeepslatebl": "polished_deepslate", + "pdeepslateblock": "polished_deepslate", + "pdslate": "polished_deepslate", + "pdslateb": "polished_deepslate", + "pdslatebl": "polished_deepslate", + "pdslateblock": "polished_deepslate", + "polisheddeepslate": "polished_deepslate", + "polisheddeepslateb": "polished_deepslate", + "polisheddeepslatebl": "polished_deepslate", + "polisheddeepslateblock": "polished_deepslate", + "polisheddslate": "polished_deepslate", + "polisheddslateb": "polished_deepslate", + "polisheddslatebl": "polished_deepslate", + "polisheddslateblock": "polished_deepslate", + "polishedslate": "polished_deepslate", + "polishedslateb": "polished_deepslate", + "polishedslatebl": "polished_deepslate", + "polishedslateblock": "polished_deepslate", + "pslate": "polished_deepslate", + "pslateb": "polished_deepslate", + "pslatebl": "polished_deepslate", + "pslateblock": "polished_deepslate", + "polished_deepslate_slab": { + "material": "POLISHED_DEEPSLATE_SLAB" + }, + "minecraft:polished_deepslate_slab": "polished_deepslate_slab", + "pdeepslatehalfblock": "polished_deepslate_slab", + "pdeepslatestep": "polished_deepslate_slab", + "pdslatehalfblock": "polished_deepslate_slab", + "pdslatestep": "polished_deepslate_slab", + "polisheddeepslatehalfblock": "polished_deepslate_slab", + "polisheddeepslateslab": "polished_deepslate_slab", + "polisheddeepslatestep": "polished_deepslate_slab", + "polisheddslatehalfblock": "polished_deepslate_slab", + "polisheddslatestep": "polished_deepslate_slab", + "polishedslatehalfblock": "polished_deepslate_slab", + "polishedslatestep": "polished_deepslate_slab", + "pslatehalfblock": "polished_deepslate_slab", + "pslatestep": "polished_deepslate_slab", + "polished_deepslate_stairs": { + "material": "POLISHED_DEEPSLATE_STAIRS" + }, + "minecraft:polished_deepslate_stairs": "polished_deepslate_stairs", + "pdeepslatestair": "polished_deepslate_stairs", + "pdeepslatestairs": "polished_deepslate_stairs", + "pdslatestair": "polished_deepslate_stairs", + "pdslatestairs": "polished_deepslate_stairs", + "polisheddeepslatestair": "polished_deepslate_stairs", + "polisheddeepslatestairs": "polished_deepslate_stairs", + "polisheddslatestair": "polished_deepslate_stairs", + "polisheddslatestairs": "polished_deepslate_stairs", + "polishedslatestair": "polished_deepslate_stairs", + "polishedslatestairs": "polished_deepslate_stairs", + "pslatestair": "polished_deepslate_stairs", + "pslatestairs": "polished_deepslate_stairs", + "polished_deepslate_wall": { + "material": "POLISHED_DEEPSLATE_WALL" + }, + "minecraft:polished_deepslate_wall": "polished_deepslate_wall", + "pdeepslatewall": "polished_deepslate_wall", + "pdslatewall": "polished_deepslate_wall", + "polisheddeepslatewall": "polished_deepslate_wall", + "polisheddslatewall": "polished_deepslate_wall", + "polishedslatewall": "polished_deepslate_wall", + "pslatewall": "polished_deepslate_wall", + "wallpdeepslate": "polished_deepslate_wall", + "wallpdslate": "polished_deepslate_wall", + "wallpolisheddeepslate": "polished_deepslate_wall", + "wallpolisheddslate": "polished_deepslate_wall", + "wallpolishedslate": "polished_deepslate_wall", + "wallpslate": "polished_deepslate_wall", "polished_diorite": { "material": "POLISHED_DIORITE" }, @@ -20217,6 +22275,11 @@ "material": "POTION" }, "minecraft:potion": "potion", + "powder_snow_bucket": { + "material": "POWDER_SNOW_BUCKET" + }, + "minecraft:powder_snow_bucket": "powder_snow_bucket", + "powdersnowbucket": "powder_snow_bucket", "powered_rail": { "material": "POWERED_RAIL" }, @@ -20500,6 +22563,12 @@ "minecraft:purple_bed": "purple_bed", "pubed": "purple_bed", "purplebed": "purple_bed", + "purple_candle": { + "material": "PURPLE_CANDLE" + }, + "minecraft:purple_candle": "purple_candle", + "pucandle": "purple_candle", + "purplecandle": "purple_candle", "purple_carpet": { "material": "PURPLE_CARPET" }, @@ -20628,11 +22697,33 @@ }, "minecraft:purpur_stairs": "purpur_stairs", "purpurstairs": "purpur_stairs", + "quartz": { + "material": "QUARTZ" + }, "minecraft:quartz": "quartz", + "netherquartz": "quartz_block", + "nq": "quartz_block", + "q": "quartz_block", + "quar": "quartz_block", "quartz_block": { "material": "QUARTZ_BLOCK" }, "minecraft:quartz_block": "quartz_block", + "netherquartzb": "quartz_block", + "netherquartzbl": "quartz_block", + "netherquartzblock": "quartz_block", + "nqb": "quartz_block", + "nqbl": "quartz_block", + "nqblock": "quartz_block", + "qb": "quartz_block", + "qbl": "quartz_block", + "qblock": "quartz_block", + "quarb": "quartz_block", + "quarbl": "quartz_block", + "quarblock": "quartz_block", + "quartzb": "quartz_block", + "quartzbl": "quartz_block", + "quartzblock": "quartz_block", "quartz_bricks": { "material": "QUARTZ_BRICKS" }, @@ -20801,6 +22892,96 @@ "ravagermonsterspawner": "ravager_spawner", "ravagermspawner": "ravager_spawner", "ravagerspawner": "ravager_spawner", + "raw_copper": { + "material": "RAW_COPPER" + }, + "minecraft:raw_copper": "raw_copper", + "rawcopper": "raw_copper", + "raw_copper_block": { + "material": "RAW_COPPER_BLOCK" + }, + "coporechunkbl": "raw_copper_block", + "coporechunkblock": "raw_copper_block", + "copperorechunkbl": "raw_copper_block", + "copperorechunkblock": "raw_copper_block", + "copporechunkbl": "raw_copper_block", + "copporechunkblock": "raw_copper_block", + "minecraft:raw_copper_block": "raw_copper_block", + "rawcoporebl": "raw_copper_block", + "rawcoporeblock": "raw_copper_block", + "rawcopperblock": "raw_copper_block", + "rawcopperorebl": "raw_copper_block", + "rawcopperoreblock": "raw_copper_block", + "rawcopporebl": "raw_copper_block", + "rawcopporeblock": "raw_copper_block", + "rcoporebl": "raw_copper_block", + "rcoporeblock": "raw_copper_block", + "rcopperorebl": "raw_copper_block", + "rcopperoreblock": "raw_copper_block", + "rcopporebl": "raw_copper_block", + "rcopporeblock": "raw_copper_block", + "raw_gold": { + "material": "RAW_GOLD" + }, + "minecraft:raw_gold": "raw_gold", + "rawgold": "raw_gold", + "raw_gold_block": { + "material": "RAW_GOLD_BLOCK" + }, + "goldorechunkbl": "raw_gold_block", + "goldorechunkblock": "raw_gold_block", + "gorechunkbl": "raw_gold_block", + "gorechunkblock": "raw_gold_block", + "minecraft:raw_gold_block": "raw_gold_block", + "rawgoldblock": "raw_gold_block", + "rawgoldorebl": "raw_gold_block", + "rawgoldoreblock": "raw_gold_block", + "rawgorebl": "raw_gold_block", + "rawgoreblock": "raw_gold_block", + "rgoldorebl": "raw_gold_block", + "rgoldoreblock": "raw_gold_block", + "rgorebl": "raw_gold_block", + "rgoreblock": "raw_gold_block", + "raw_iron": { + "material": "RAW_IRON" + }, + "minecraft:raw_iron": "raw_iron", + "rawiron": "raw_iron", + "raw_iron_block": { + "material": "RAW_IRON_BLOCK" + }, + "iorechunkbl": "raw_iron_block", + "iorechunkblock": "raw_iron_block", + "ironorechunkbl": "raw_iron_block", + "ironorechunkblock": "raw_iron_block", + "minecraft:raw_iron_block": "raw_iron_block", + "rawiorebl": "raw_iron_block", + "rawioreblock": "raw_iron_block", + "rawironblock": "raw_iron_block", + "rawironorebl": "raw_iron_block", + "rawironoreblock": "raw_iron_block", + "rawsorebl": "raw_iron_block", + "rawsoreblock": "raw_iron_block", + "rawsteelorebl": "raw_iron_block", + "rawsteeloreblock": "raw_iron_block", + "rawstorebl": "raw_iron_block", + "rawstoreblock": "raw_iron_block", + "riorebl": "raw_iron_block", + "rioreblock": "raw_iron_block", + "rironorebl": "raw_iron_block", + "rironoreblock": "raw_iron_block", + "rsorebl": "raw_iron_block", + "rsoreblock": "raw_iron_block", + "rsteelorebl": "raw_iron_block", + "rsteeloreblock": "raw_iron_block", + "rstorebl": "raw_iron_block", + "rstoreblock": "raw_iron_block", + "sorechunkbl": "raw_iron_block", + "sorechunkblock": "raw_iron_block", + "steelorechunkbl": "raw_iron_block", + "steelorechunkblock": "raw_iron_block", + "storechunkbl": "raw_iron_block", + "storechunkblock": "raw_iron_block", "red_banner": { "material": "RED_BANNER" }, @@ -20813,6 +22994,12 @@ "minecraft:red_bed": "red_bed", "rbed": "red_bed", "redbed": "red_bed", + "red_candle": { + "material": "RED_CANDLE" + }, + "minecraft:red_candle": "red_candle", + "rcandle": "red_candle", + "redcandle": "red_candle", "red_carpet": { "material": "RED_CARPET" }, @@ -21117,6 +23304,12 @@ "rsore": "redstone_ore", "rstoneo": "redstone_ore", "rstoneore": "redstone_ore", + "stoneredore": "redstone_ore", + "stoneredsore": "redstone_ore", + "stoneredstoneore": "redstone_ore", + "stonerore": "redstone_ore", + "stonersore": "redstone_ore", + "stonerstoneore": "redstone_ore", "redstone_torch": { "material": "REDSTONE_TORCH" }, @@ -21255,6 +23448,11 @@ }, "minecraft:respawn_anchor": "respawn_anchor", "respawnanchor": "respawn_anchor", + "rooted_dirt": { + "material": "ROOTED_DIRT" + }, + "minecraft:rooted_dirt": "rooted_dirt", + "rooteddirt": "rooted_dirt", "rose_bush": { "material": "ROSE_BUSH" }, @@ -21378,6 +23576,11 @@ "material": "SCAFFOLDING" }, "minecraft:scaffolding": "scaffolding", + "sculk_sensor": { + "material": "SCULK_SENSOR" + }, + "minecraft:sculk_sensor": "sculk_sensor", + "sculksensor": "sculk_sensor", "scute": { "material": "SCUTE" }, @@ -21897,6 +24100,23 @@ "slowtarr": "slowness_tipped_arrow", "slowtarrow": "slowness_tipped_arrow", "slowtippedarrow": "slowness_tipped_arrow", + "small_amethyst_bud": { + "material": "SMALL_AMETHYST_BUD" + }, + "amethystbuds": "small_amethyst_bud", + "cavebuds": "small_amethyst_bud", + "littleamethystbud": "small_amethyst_bud", + "littlecavebud": "small_amethyst_bud", + "minecraft:small_amethyst_bud": "small_amethyst_bud", + "samethystbud": "small_amethyst_bud", + "scavebud": "small_amethyst_bud", + "smallamethystbud": "small_amethyst_bud", + "smallcavebud": "small_amethyst_bud", + "small_dripleaf": { + "material": "SMALL_DRIPLEAF" + }, + "minecraft:small_dripleaf": "small_dripleaf", + "smalldripleaf": "small_dripleaf", "smithing_table": { "material": "SMITHING_TABLE" }, @@ -21906,6 +24126,42 @@ "material": "SMOKER" }, "minecraft:smoker": "smoker", + "smooth_basalt": { + "material": "SMOOTH_BASALT" + }, + "minecraft:smooth_basalt": "smooth_basalt", + "smbas": "smooth_basalt", + "smbasalt": "smooth_basalt", + "smbasaltb": "smooth_basalt", + "smbasaltbl": "smooth_basalt", + "smbasaltblock": "smooth_basalt", + "smbasaltst": "smooth_basalt", + "smbasaltstb": "smooth_basalt", + "smbasaltstbl": "smooth_basalt", + "smbasaltstblock": "smooth_basalt", + "smbasb": "smooth_basalt", + "smbasbl": "smooth_basalt", + "smbasblock": "smooth_basalt", + "smbast": "smooth_basalt", + "smbastb": "smooth_basalt", + "smbastbl": "smooth_basalt", + "smbastblock": "smooth_basalt", + "smoothbas": "smooth_basalt", + "smoothbasalt": "smooth_basalt", + "smoothbasaltb": "smooth_basalt", + "smoothbasaltbl": "smooth_basalt", + "smoothbasaltblock": "smooth_basalt", + "smoothbasaltst": "smooth_basalt", + "smoothbasaltstb": "smooth_basalt", + "smoothbasaltstbl": "smooth_basalt", + "smoothbasaltstblock": "smooth_basalt", + "smoothbasb": "smooth_basalt", + "smoothbasbl": "smooth_basalt", + "smoothbasblock": "smooth_basalt", + "smoothbast": "smooth_basalt", + "smoothbastb": "smooth_basalt", + "smoothbastbl": "smooth_basalt", + "smoothbastblock": "smooth_basalt", "smooth_quartz": { "material": "SMOOTH_QUARTZ" }, @@ -22254,6 +24510,11 @@ "material": "SPONGE" }, "minecraft:sponge": "sponge", + "spore_blossom": { + "material": "SPORE_BLOSSOM" + }, + "minecraft:spore_blossom": "spore_blossom", + "sporeblossom": "spore_blossom", "spruce_boat": { "material": "SPRUCE_BOAT" }, @@ -22784,6 +25045,10 @@ "woodpine": "spruce_wood", "woods": "spruce_wood", "woodspruce": "spruce_wood", + "spyglass": { + "material": "SPYGLASS" + }, + "minecraft:spyglass": "spyglass", "squid_spawn_egg": { "material": "SQUID_SPAWN_EGG" }, @@ -26869,6 +29134,11 @@ "thicktarr": "thick_tipped_arrow", "thicktarrow": "thick_tipped_arrow", "thicktippedarrow": "thick_tipped_arrow", + "tinted_glass": { + "material": "TINTED_GLASS" + }, + "minecraft:tinted_glass": "tinted_glass", + "tintedglass": "tinted_glass", "tipped_arrow": { "material": "TIPPED_ARROW" }, @@ -27088,11 +29358,15 @@ }, "minecraft:tube_coral_fan": "tube_coral_fan", "tubecoralfan": "tube_coral_fan", + "tuff": { + "material": "TUFF" + }, + "minecraft:tuff": "tuff", "turtle_egg": { "material": "TURTLE_EGG" }, "minecraft:turtle_egg": "turtle_egg", - "turtleegg": "turtle_spawn_egg", + "turtleegg": "turtle_egg", "turtle_helmet": { "material": "TURTLE_HELMET" }, @@ -27833,6 +30107,8852 @@ "watertarr": "water_tipped_arrow", "watertarrow": "water_tipped_arrow", "watertippedarrow": "water_tipped_arrow", + "waxed_copper_block": { + "material": "WAXED_COPPER_BLOCK" + }, + "minecraft:waxed_copper_block": "waxed_copper_block", + "wacoblock": "waxed_copper_block", + "wacopblock": "waxed_copper_block", + "wacopperblock": "waxed_copper_block", + "waxcoblock": "waxed_copper_block", + "waxcopblock": "waxed_copper_block", + "waxcopperblock": "waxed_copper_block", + "waxedcoblock": "waxed_copper_block", + "waxedcopblock": "waxed_copper_block", + "waxedcopperblock": "waxed_copper_block", + "waxed_cut_copper": { + "material": "WAXED_CUT_COPPER" + }, + "cutwacoblock": "waxed_cut_copper", + "cutwacopblock": "waxed_cut_copper", + "cutwacopperblock": "waxed_cut_copper", + "cutwaxcoblock": "waxed_cut_copper", + "cutwaxcopblock": "waxed_cut_copper", + "cutwaxcopperblock": "waxed_cut_copper", + "cutwaxedcoblock": "waxed_cut_copper", + "cutwaxedcopblock": "waxed_cut_copper", + "cutwaxedcopperblock": "waxed_cut_copper", + "cwacoblock": "waxed_cut_copper", + "cwacopblock": "waxed_cut_copper", + "cwacopperblock": "waxed_cut_copper", + "cwaxcoblock": "waxed_cut_copper", + "cwaxcopblock": "waxed_cut_copper", + "cwaxcopperblock": "waxed_cut_copper", + "cwaxedcoblock": "waxed_cut_copper", + "cwaxedcopblock": "waxed_cut_copper", + "cwaxedcopperblock": "waxed_cut_copper", + "minecraft:waxed_cut_copper": "waxed_cut_copper", + "waccoblock": "waxed_cut_copper", + "waccopblock": "waxed_cut_copper", + "waccopperblock": "waxed_cut_copper", + "wacutcoblock": "waxed_cut_copper", + "wacutcopblock": "waxed_cut_copper", + "wacutcopperblock": "waxed_cut_copper", + "waxccoblock": "waxed_cut_copper", + "waxccopblock": "waxed_cut_copper", + "waxccopperblock": "waxed_cut_copper", + "waxcutcoblock": "waxed_cut_copper", + "waxcutcopblock": "waxed_cut_copper", + "waxcutcopperblock": "waxed_cut_copper", + "waxedccoblock": "waxed_cut_copper", + "waxedccopblock": "waxed_cut_copper", + "waxedccopperblock": "waxed_cut_copper", + "waxedcutcoblock": "waxed_cut_copper", + "waxedcutcopblock": "waxed_cut_copper", + "waxedcutcopper": "waxed_cut_copper", + "waxedcutcopperblock": "waxed_cut_copper", + "waxed_cut_copper_slab": { + "material": "WAXED_CUT_COPPER_SLAB" + }, + "cutwacohalfblock": "waxed_cut_copper_slab", + "cutwacophalfblock": "waxed_cut_copper_slab", + "cutwacopperhalfblock": "waxed_cut_copper_slab", + "cutwacoppersl": "waxed_cut_copper_slab", + "cutwacopperslab": "waxed_cut_copper_slab", + "cutwacopperstep": "waxed_cut_copper_slab", + "cutwacopsl": "waxed_cut_copper_slab", + "cutwacopslab": "waxed_cut_copper_slab", + "cutwacopstep": "waxed_cut_copper_slab", + "cutwacosl": "waxed_cut_copper_slab", + "cutwacoslab": "waxed_cut_copper_slab", + "cutwacostep": "waxed_cut_copper_slab", + "cutwaxcohalfblock": "waxed_cut_copper_slab", + "cutwaxcophalfblock": "waxed_cut_copper_slab", + "cutwaxcopperhalfblock": "waxed_cut_copper_slab", + "cutwaxcoppersl": "waxed_cut_copper_slab", + "cutwaxcopperslab": "waxed_cut_copper_slab", + "cutwaxcopperstep": "waxed_cut_copper_slab", + "cutwaxcopsl": "waxed_cut_copper_slab", + "cutwaxcopslab": "waxed_cut_copper_slab", + "cutwaxcopstep": "waxed_cut_copper_slab", + "cutwaxcosl": "waxed_cut_copper_slab", + "cutwaxcoslab": "waxed_cut_copper_slab", + "cutwaxcostep": "waxed_cut_copper_slab", + "cutwaxedcohalfblock": "waxed_cut_copper_slab", + "cutwaxedcophalfblock": "waxed_cut_copper_slab", + "cutwaxedcopperhalfblock": "waxed_cut_copper_slab", + "cutwaxedcoppersl": "waxed_cut_copper_slab", + "cutwaxedcopperslab": "waxed_cut_copper_slab", + "cutwaxedcopperstep": "waxed_cut_copper_slab", + "cutwaxedcopsl": "waxed_cut_copper_slab", + "cutwaxedcopslab": "waxed_cut_copper_slab", + "cutwaxedcopstep": "waxed_cut_copper_slab", + "cutwaxedcosl": "waxed_cut_copper_slab", + "cutwaxedcoslab": "waxed_cut_copper_slab", + "cutwaxedcostep": "waxed_cut_copper_slab", + "cwacohalfblock": "waxed_cut_copper_slab", + "cwacophalfblock": "waxed_cut_copper_slab", + "cwacopperhalfblock": "waxed_cut_copper_slab", + "cwacoppersl": "waxed_cut_copper_slab", + "cwacopperslab": "waxed_cut_copper_slab", + "cwacopperstep": "waxed_cut_copper_slab", + "cwacopsl": "waxed_cut_copper_slab", + "cwacopslab": "waxed_cut_copper_slab", + "cwacopstep": "waxed_cut_copper_slab", + "cwacosl": "waxed_cut_copper_slab", + "cwacoslab": "waxed_cut_copper_slab", + "cwacostep": "waxed_cut_copper_slab", + "cwaxcohalfblock": "waxed_cut_copper_slab", + "cwaxcophalfblock": "waxed_cut_copper_slab", + "cwaxcopperhalfblock": "waxed_cut_copper_slab", + "cwaxcoppersl": "waxed_cut_copper_slab", + "cwaxcopperslab": "waxed_cut_copper_slab", + "cwaxcopperstep": "waxed_cut_copper_slab", + "cwaxcopsl": "waxed_cut_copper_slab", + "cwaxcopslab": "waxed_cut_copper_slab", + "cwaxcopstep": "waxed_cut_copper_slab", + "cwaxcosl": "waxed_cut_copper_slab", + "cwaxcoslab": "waxed_cut_copper_slab", + "cwaxcostep": "waxed_cut_copper_slab", + "cwaxedcohalfblock": "waxed_cut_copper_slab", + "cwaxedcophalfblock": "waxed_cut_copper_slab", + "cwaxedcopperhalfblock": "waxed_cut_copper_slab", + "cwaxedcoppersl": "waxed_cut_copper_slab", + "cwaxedcopperslab": "waxed_cut_copper_slab", + "cwaxedcopperstep": "waxed_cut_copper_slab", + "cwaxedcopsl": "waxed_cut_copper_slab", + "cwaxedcopslab": "waxed_cut_copper_slab", + "cwaxedcopstep": "waxed_cut_copper_slab", + "cwaxedcosl": "waxed_cut_copper_slab", + "cwaxedcoslab": "waxed_cut_copper_slab", + "cwaxedcostep": "waxed_cut_copper_slab", + "minecraft:waxed_cut_copper_slab": "waxed_cut_copper_slab", + "waccohalfblock": "waxed_cut_copper_slab", + "waccophalfblock": "waxed_cut_copper_slab", + "waccopperhalfblock": "waxed_cut_copper_slab", + "waccoppersl": "waxed_cut_copper_slab", + "waccopperslab": "waxed_cut_copper_slab", + "waccopperstep": "waxed_cut_copper_slab", + "waccopsl": "waxed_cut_copper_slab", + "waccopslab": "waxed_cut_copper_slab", + "waccopstep": "waxed_cut_copper_slab", + "waccosl": "waxed_cut_copper_slab", + "waccoslab": "waxed_cut_copper_slab", + "waccostep": "waxed_cut_copper_slab", + "wacutcohalfblock": "waxed_cut_copper_slab", + "wacutcophalfblock": "waxed_cut_copper_slab", + "wacutcopperhalfblock": "waxed_cut_copper_slab", + "wacutcoppersl": "waxed_cut_copper_slab", + "wacutcopperslab": "waxed_cut_copper_slab", + "wacutcopperstep": "waxed_cut_copper_slab", + "wacutcopsl": "waxed_cut_copper_slab", + "wacutcopslab": "waxed_cut_copper_slab", + "wacutcopstep": "waxed_cut_copper_slab", + "wacutcosl": "waxed_cut_copper_slab", + "wacutcoslab": "waxed_cut_copper_slab", + "wacutcostep": "waxed_cut_copper_slab", + "waxccohalfblock": "waxed_cut_copper_slab", + "waxccophalfblock": "waxed_cut_copper_slab", + "waxccopperhalfblock": "waxed_cut_copper_slab", + "waxccoppersl": "waxed_cut_copper_slab", + "waxccopperslab": "waxed_cut_copper_slab", + "waxccopperstep": "waxed_cut_copper_slab", + "waxccopsl": "waxed_cut_copper_slab", + "waxccopslab": "waxed_cut_copper_slab", + "waxccopstep": "waxed_cut_copper_slab", + "waxccosl": "waxed_cut_copper_slab", + "waxccoslab": "waxed_cut_copper_slab", + "waxccostep": "waxed_cut_copper_slab", + "waxcutcohalfblock": "waxed_cut_copper_slab", + "waxcutcophalfblock": "waxed_cut_copper_slab", + "waxcutcopperhalfblock": "waxed_cut_copper_slab", + "waxcutcoppersl": "waxed_cut_copper_slab", + "waxcutcopperslab": "waxed_cut_copper_slab", + "waxcutcopperstep": "waxed_cut_copper_slab", + "waxcutcopsl": "waxed_cut_copper_slab", + "waxcutcopslab": "waxed_cut_copper_slab", + "waxcutcopstep": "waxed_cut_copper_slab", + "waxcutcosl": "waxed_cut_copper_slab", + "waxcutcoslab": "waxed_cut_copper_slab", + "waxcutcostep": "waxed_cut_copper_slab", + "waxedccohalfblock": "waxed_cut_copper_slab", + "waxedccophalfblock": "waxed_cut_copper_slab", + "waxedccopperhalfblock": "waxed_cut_copper_slab", + "waxedccoppersl": "waxed_cut_copper_slab", + "waxedccopperslab": "waxed_cut_copper_slab", + "waxedccopperstep": "waxed_cut_copper_slab", + "waxedccopsl": "waxed_cut_copper_slab", + "waxedccopslab": "waxed_cut_copper_slab", + "waxedccopstep": "waxed_cut_copper_slab", + "waxedccosl": "waxed_cut_copper_slab", + "waxedccoslab": "waxed_cut_copper_slab", + "waxedccostep": "waxed_cut_copper_slab", + "waxedcutcohalfblock": "waxed_cut_copper_slab", + "waxedcutcophalfblock": "waxed_cut_copper_slab", + "waxedcutcopperhalfblock": "waxed_cut_copper_slab", + "waxedcutcoppersl": "waxed_cut_copper_slab", + "waxedcutcopperslab": "waxed_cut_copper_slab", + "waxedcutcopperstep": "waxed_cut_copper_slab", + "waxedcutcopsl": "waxed_cut_copper_slab", + "waxedcutcopslab": "waxed_cut_copper_slab", + "waxedcutcopstep": "waxed_cut_copper_slab", + "waxedcutcosl": "waxed_cut_copper_slab", + "waxedcutcoslab": "waxed_cut_copper_slab", + "waxedcutcostep": "waxed_cut_copper_slab", + "waxed_cut_copper_stairs": { + "material": "WAXED_CUT_COPPER_STAIRS" + }, + "cutwacopperstair": "waxed_cut_copper_stairs", + "cutwacopperstairs": "waxed_cut_copper_stairs", + "cutwacopstair": "waxed_cut_copper_stairs", + "cutwacopstairs": "waxed_cut_copper_stairs", + "cutwacostair": "waxed_cut_copper_stairs", + "cutwacostairs": "waxed_cut_copper_stairs", + "cutwaxcopperstair": "waxed_cut_copper_stairs", + "cutwaxcopperstairs": "waxed_cut_copper_stairs", + "cutwaxcopstair": "waxed_cut_copper_stairs", + "cutwaxcopstairs": "waxed_cut_copper_stairs", + "cutwaxcostair": "waxed_cut_copper_stairs", + "cutwaxcostairs": "waxed_cut_copper_stairs", + "cutwaxedcopperstair": "waxed_cut_copper_stairs", + "cutwaxedcopperstairs": "waxed_cut_copper_stairs", + "cutwaxedcopstair": "waxed_cut_copper_stairs", + "cutwaxedcopstairs": "waxed_cut_copper_stairs", + "cutwaxedcostair": "waxed_cut_copper_stairs", + "cutwaxedcostairs": "waxed_cut_copper_stairs", + "cwacopperstair": "waxed_cut_copper_stairs", + "cwacopperstairs": "waxed_cut_copper_stairs", + "cwacopstair": "waxed_cut_copper_stairs", + "cwacopstairs": "waxed_cut_copper_stairs", + "cwacostair": "waxed_cut_copper_stairs", + "cwacostairs": "waxed_cut_copper_stairs", + "cwaxcopperstair": "waxed_cut_copper_stairs", + "cwaxcopperstairs": "waxed_cut_copper_stairs", + "cwaxcopstair": "waxed_cut_copper_stairs", + "cwaxcopstairs": "waxed_cut_copper_stairs", + "cwaxcostair": "waxed_cut_copper_stairs", + "cwaxcostairs": "waxed_cut_copper_stairs", + "cwaxedcopperstair": "waxed_cut_copper_stairs", + "cwaxedcopperstairs": "waxed_cut_copper_stairs", + "cwaxedcopstair": "waxed_cut_copper_stairs", + "cwaxedcopstairs": "waxed_cut_copper_stairs", + "cwaxedcostair": "waxed_cut_copper_stairs", + "cwaxedcostairs": "waxed_cut_copper_stairs", + "minecraft:waxed_cut_copper_stairs": "waxed_cut_copper_stairs", + "waccopperstair": "waxed_cut_copper_stairs", + "waccopperstairs": "waxed_cut_copper_stairs", + "waccopstair": "waxed_cut_copper_stairs", + "waccopstairs": "waxed_cut_copper_stairs", + "waccostair": "waxed_cut_copper_stairs", + "waccostairs": "waxed_cut_copper_stairs", + "wacutcopperstair": "waxed_cut_copper_stairs", + "wacutcopperstairs": "waxed_cut_copper_stairs", + "wacutcopstair": "waxed_cut_copper_stairs", + "wacutcopstairs": "waxed_cut_copper_stairs", + "wacutcostair": "waxed_cut_copper_stairs", + "wacutcostairs": "waxed_cut_copper_stairs", + "waxccopperstair": "waxed_cut_copper_stairs", + "waxccopperstairs": "waxed_cut_copper_stairs", + "waxccopstair": "waxed_cut_copper_stairs", + "waxccopstairs": "waxed_cut_copper_stairs", + "waxccostair": "waxed_cut_copper_stairs", + "waxccostairs": "waxed_cut_copper_stairs", + "waxcutcopperstair": "waxed_cut_copper_stairs", + "waxcutcopperstairs": "waxed_cut_copper_stairs", + "waxcutcopstair": "waxed_cut_copper_stairs", + "waxcutcopstairs": "waxed_cut_copper_stairs", + "waxcutcostair": "waxed_cut_copper_stairs", + "waxcutcostairs": "waxed_cut_copper_stairs", + "waxedccopperstair": "waxed_cut_copper_stairs", + "waxedccopperstairs": "waxed_cut_copper_stairs", + "waxedccopstair": "waxed_cut_copper_stairs", + "waxedccopstairs": "waxed_cut_copper_stairs", + "waxedccostair": "waxed_cut_copper_stairs", + "waxedccostairs": "waxed_cut_copper_stairs", + "waxedcutcopperstair": "waxed_cut_copper_stairs", + "waxedcutcopperstairs": "waxed_cut_copper_stairs", + "waxedcutcopstair": "waxed_cut_copper_stairs", + "waxedcutcopstairs": "waxed_cut_copper_stairs", + "waxedcutcostair": "waxed_cut_copper_stairs", + "waxedcutcostairs": "waxed_cut_copper_stairs", + "waxed_exposed_copper": { + "material": "WAXED_EXPOSED_COPPER" + }, + "exposedwacoblock": "waxed_exposed_copper", + "exposedwacopblock": "waxed_exposed_copper", + "exposedwacopperblock": "waxed_exposed_copper", + "exposedwaxcoblock": "waxed_exposed_copper", + "exposedwaxcopblock": "waxed_exposed_copper", + "exposedwaxcopperblock": "waxed_exposed_copper", + "exposedwaxedcoblock": "waxed_exposed_copper", + "exposedwaxedcopblock": "waxed_exposed_copper", + "exposedwaxedcopperblock": "waxed_exposed_copper", + "expwacoblock": "waxed_exposed_copper", + "expwacopblock": "waxed_exposed_copper", + "expwacopperblock": "waxed_exposed_copper", + "expwaxcoblock": "waxed_exposed_copper", + "expwaxcopblock": "waxed_exposed_copper", + "expwaxcopperblock": "waxed_exposed_copper", + "expwaxedcoblock": "waxed_exposed_copper", + "expwaxedcopblock": "waxed_exposed_copper", + "expwaxedcopperblock": "waxed_exposed_copper", + "exwacoblock": "waxed_exposed_copper", + "exwacopblock": "waxed_exposed_copper", + "exwacopperblock": "waxed_exposed_copper", + "exwaxcoblock": "waxed_exposed_copper", + "exwaxcopblock": "waxed_exposed_copper", + "exwaxcopperblock": "waxed_exposed_copper", + "exwaxedcoblock": "waxed_exposed_copper", + "exwaxedcopblock": "waxed_exposed_copper", + "exwaxedcopperblock": "waxed_exposed_copper", + "minecraft:waxed_exposed_copper": "waxed_exposed_copper", + "waexcoblock": "waxed_exposed_copper", + "waexcopblock": "waxed_exposed_copper", + "waexcopperblock": "waxed_exposed_copper", + "waexpcoblock": "waxed_exposed_copper", + "waexpcopblock": "waxed_exposed_copper", + "waexpcopperblock": "waxed_exposed_copper", + "waexposedcoblock": "waxed_exposed_copper", + "waexposedcopblock": "waxed_exposed_copper", + "waexposedcopperblock": "waxed_exposed_copper", + "waxedexcoblock": "waxed_exposed_copper", + "waxedexcopblock": "waxed_exposed_copper", + "waxedexcopperblock": "waxed_exposed_copper", + "waxedexpcoblock": "waxed_exposed_copper", + "waxedexpcopblock": "waxed_exposed_copper", + "waxedexpcopperblock": "waxed_exposed_copper", + "waxedexposedcoblock": "waxed_exposed_copper", + "waxedexposedcopblock": "waxed_exposed_copper", + "waxedexposedcopper": "waxed_exposed_copper", + "waxedexposedcopperblock": "waxed_exposed_copper", + "waxexcoblock": "waxed_exposed_copper", + "waxexcopblock": "waxed_exposed_copper", + "waxexcopperblock": "waxed_exposed_copper", + "waxexpcoblock": "waxed_exposed_copper", + "waxexpcopblock": "waxed_exposed_copper", + "waxexpcopperblock": "waxed_exposed_copper", + "waxexposedcoblock": "waxed_exposed_copper", + "waxexposedcopblock": "waxed_exposed_copper", + "waxexposedcopperblock": "waxed_exposed_copper", + "waxed_exposed_cut_copper": { + "material": "WAXED_EXPOSED_CUT_COPPER" + }, + "cexposedwacoblock": "waxed_exposed_cut_copper", + "cexposedwacopblock": "waxed_exposed_cut_copper", + "cexposedwacopperblock": "waxed_exposed_cut_copper", + "cexposedwaxcoblock": "waxed_exposed_cut_copper", + "cexposedwaxcopblock": "waxed_exposed_cut_copper", + "cexposedwaxcopperblock": "waxed_exposed_cut_copper", + "cexposedwaxedcoblock": "waxed_exposed_cut_copper", + "cexposedwaxedcopblock": "waxed_exposed_cut_copper", + "cexposedwaxedcopperblock": "waxed_exposed_cut_copper", + "cexpwacoblock": "waxed_exposed_cut_copper", + "cexpwacopblock": "waxed_exposed_cut_copper", + "cexpwacopperblock": "waxed_exposed_cut_copper", + "cexpwaxcoblock": "waxed_exposed_cut_copper", + "cexpwaxcopblock": "waxed_exposed_cut_copper", + "cexpwaxcopperblock": "waxed_exposed_cut_copper", + "cexpwaxedcoblock": "waxed_exposed_cut_copper", + "cexpwaxedcopblock": "waxed_exposed_cut_copper", + "cexpwaxedcopperblock": "waxed_exposed_cut_copper", + "cexwacoblock": "waxed_exposed_cut_copper", + "cexwacopblock": "waxed_exposed_cut_copper", + "cexwacopperblock": "waxed_exposed_cut_copper", + "cexwaxcoblock": "waxed_exposed_cut_copper", + "cexwaxcopblock": "waxed_exposed_cut_copper", + "cexwaxcopperblock": "waxed_exposed_cut_copper", + "cexwaxedcoblock": "waxed_exposed_cut_copper", + "cexwaxedcopblock": "waxed_exposed_cut_copper", + "cexwaxedcopperblock": "waxed_exposed_cut_copper", + "cutexposedwacoblock": "waxed_exposed_cut_copper", + "cutexposedwacopblock": "waxed_exposed_cut_copper", + "cutexposedwacopperblock": "waxed_exposed_cut_copper", + "cutexposedwaxcoblock": "waxed_exposed_cut_copper", + "cutexposedwaxcopblock": "waxed_exposed_cut_copper", + "cutexposedwaxcopperblock": "waxed_exposed_cut_copper", + "cutexposedwaxedcoblock": "waxed_exposed_cut_copper", + "cutexposedwaxedcopblock": "waxed_exposed_cut_copper", + "cutexposedwaxedcopperblock": "waxed_exposed_cut_copper", + "cutexpwacoblock": "waxed_exposed_cut_copper", + "cutexpwacopblock": "waxed_exposed_cut_copper", + "cutexpwacopperblock": "waxed_exposed_cut_copper", + "cutexpwaxcoblock": "waxed_exposed_cut_copper", + "cutexpwaxcopblock": "waxed_exposed_cut_copper", + "cutexpwaxcopperblock": "waxed_exposed_cut_copper", + "cutexpwaxedcoblock": "waxed_exposed_cut_copper", + "cutexpwaxedcopblock": "waxed_exposed_cut_copper", + "cutexpwaxedcopperblock": "waxed_exposed_cut_copper", + "cutexwacoblock": "waxed_exposed_cut_copper", + "cutexwacopblock": "waxed_exposed_cut_copper", + "cutexwacopperblock": "waxed_exposed_cut_copper", + "cutexwaxcoblock": "waxed_exposed_cut_copper", + "cutexwaxcopblock": "waxed_exposed_cut_copper", + "cutexwaxcopperblock": "waxed_exposed_cut_copper", + "cutexwaxedcoblock": "waxed_exposed_cut_copper", + "cutexwaxedcopblock": "waxed_exposed_cut_copper", + "cutexwaxedcopperblock": "waxed_exposed_cut_copper", + "cutwaexcoblock": "waxed_exposed_cut_copper", + "cutwaexcopblock": "waxed_exposed_cut_copper", + "cutwaexcopperblock": "waxed_exposed_cut_copper", + "cutwaexpcoblock": "waxed_exposed_cut_copper", + "cutwaexpcopblock": "waxed_exposed_cut_copper", + "cutwaexpcopperblock": "waxed_exposed_cut_copper", + "cutwaexposedcoblock": "waxed_exposed_cut_copper", + "cutwaexposedcopblock": "waxed_exposed_cut_copper", + "cutwaexposedcopperblock": "waxed_exposed_cut_copper", + "cutwaxedexcoblock": "waxed_exposed_cut_copper", + "cutwaxedexcopblock": "waxed_exposed_cut_copper", + "cutwaxedexcopperblock": "waxed_exposed_cut_copper", + "cutwaxedexpcoblock": "waxed_exposed_cut_copper", + "cutwaxedexpcopblock": "waxed_exposed_cut_copper", + "cutwaxedexpcopperblock": "waxed_exposed_cut_copper", + "cutwaxedexposedcoblock": "waxed_exposed_cut_copper", + "cutwaxedexposedcopblock": "waxed_exposed_cut_copper", + "cutwaxedexposedcopperblock": "waxed_exposed_cut_copper", + "cutwaxexcoblock": "waxed_exposed_cut_copper", + "cutwaxexcopblock": "waxed_exposed_cut_copper", + "cutwaxexcopperblock": "waxed_exposed_cut_copper", + "cutwaxexpcoblock": "waxed_exposed_cut_copper", + "cutwaxexpcopblock": "waxed_exposed_cut_copper", + "cutwaxexpcopperblock": "waxed_exposed_cut_copper", + "cutwaxexposedcoblock": "waxed_exposed_cut_copper", + "cutwaxexposedcopblock": "waxed_exposed_cut_copper", + "cutwaxexposedcopperblock": "waxed_exposed_cut_copper", + "cwaexcoblock": "waxed_exposed_cut_copper", + "cwaexcopblock": "waxed_exposed_cut_copper", + "cwaexcopperblock": "waxed_exposed_cut_copper", + "cwaexpcoblock": "waxed_exposed_cut_copper", + "cwaexpcopblock": "waxed_exposed_cut_copper", + "cwaexpcopperblock": "waxed_exposed_cut_copper", + "cwaexposedcoblock": "waxed_exposed_cut_copper", + "cwaexposedcopblock": "waxed_exposed_cut_copper", + "cwaexposedcopperblock": "waxed_exposed_cut_copper", + "cwaxedexcoblock": "waxed_exposed_cut_copper", + "cwaxedexcopblock": "waxed_exposed_cut_copper", + "cwaxedexcopperblock": "waxed_exposed_cut_copper", + "cwaxedexpcoblock": "waxed_exposed_cut_copper", + "cwaxedexpcopblock": "waxed_exposed_cut_copper", + "cwaxedexpcopperblock": "waxed_exposed_cut_copper", + "cwaxedexposedcoblock": "waxed_exposed_cut_copper", + "cwaxedexposedcopblock": "waxed_exposed_cut_copper", + "cwaxedexposedcopperblock": "waxed_exposed_cut_copper", + "cwaxexcoblock": "waxed_exposed_cut_copper", + "cwaxexcopblock": "waxed_exposed_cut_copper", + "cwaxexcopperblock": "waxed_exposed_cut_copper", + "cwaxexpcoblock": "waxed_exposed_cut_copper", + "cwaxexpcopblock": "waxed_exposed_cut_copper", + "cwaxexpcopperblock": "waxed_exposed_cut_copper", + "cwaxexposedcoblock": "waxed_exposed_cut_copper", + "cwaxexposedcopblock": "waxed_exposed_cut_copper", + "cwaxexposedcopperblock": "waxed_exposed_cut_copper", + "excutwacoblock": "waxed_exposed_cut_copper", + "excutwacopblock": "waxed_exposed_cut_copper", + "excutwacopperblock": "waxed_exposed_cut_copper", + "excutwaxcoblock": "waxed_exposed_cut_copper", + "excutwaxcopblock": "waxed_exposed_cut_copper", + "excutwaxcopperblock": "waxed_exposed_cut_copper", + "excutwaxedcoblock": "waxed_exposed_cut_copper", + "excutwaxedcopblock": "waxed_exposed_cut_copper", + "excutwaxedcopperblock": "waxed_exposed_cut_copper", + "excwacoblock": "waxed_exposed_cut_copper", + "excwacopblock": "waxed_exposed_cut_copper", + "excwacopperblock": "waxed_exposed_cut_copper", + "excwaxcoblock": "waxed_exposed_cut_copper", + "excwaxcopblock": "waxed_exposed_cut_copper", + "excwaxcopperblock": "waxed_exposed_cut_copper", + "excwaxedcoblock": "waxed_exposed_cut_copper", + "excwaxedcopblock": "waxed_exposed_cut_copper", + "excwaxedcopperblock": "waxed_exposed_cut_copper", + "expcutwacoblock": "waxed_exposed_cut_copper", + "expcutwacopblock": "waxed_exposed_cut_copper", + "expcutwacopperblock": "waxed_exposed_cut_copper", + "expcutwaxcoblock": "waxed_exposed_cut_copper", + "expcutwaxcopblock": "waxed_exposed_cut_copper", + "expcutwaxcopperblock": "waxed_exposed_cut_copper", + "expcutwaxedcoblock": "waxed_exposed_cut_copper", + "expcutwaxedcopblock": "waxed_exposed_cut_copper", + "expcutwaxedcopperblock": "waxed_exposed_cut_copper", + "expcwacoblock": "waxed_exposed_cut_copper", + "expcwacopblock": "waxed_exposed_cut_copper", + "expcwacopperblock": "waxed_exposed_cut_copper", + "expcwaxcoblock": "waxed_exposed_cut_copper", + "expcwaxcopblock": "waxed_exposed_cut_copper", + "expcwaxcopperblock": "waxed_exposed_cut_copper", + "expcwaxedcoblock": "waxed_exposed_cut_copper", + "expcwaxedcopblock": "waxed_exposed_cut_copper", + "expcwaxedcopperblock": "waxed_exposed_cut_copper", + "exposedcutwacoblock": "waxed_exposed_cut_copper", + "exposedcutwacopblock": "waxed_exposed_cut_copper", + "exposedcutwacopperblock": "waxed_exposed_cut_copper", + "exposedcutwaxcoblock": "waxed_exposed_cut_copper", + "exposedcutwaxcopblock": "waxed_exposed_cut_copper", + "exposedcutwaxcopperblock": "waxed_exposed_cut_copper", + "exposedcutwaxedcoblock": "waxed_exposed_cut_copper", + "exposedcutwaxedcopblock": "waxed_exposed_cut_copper", + "exposedcutwaxedcopperblock": "waxed_exposed_cut_copper", + "exposedcwacoblock": "waxed_exposed_cut_copper", + "exposedcwacopblock": "waxed_exposed_cut_copper", + "exposedcwacopperblock": "waxed_exposed_cut_copper", + "exposedcwaxcoblock": "waxed_exposed_cut_copper", + "exposedcwaxcopblock": "waxed_exposed_cut_copper", + "exposedcwaxcopperblock": "waxed_exposed_cut_copper", + "exposedcwaxedcoblock": "waxed_exposed_cut_copper", + "exposedcwaxedcopblock": "waxed_exposed_cut_copper", + "exposedcwaxedcopperblock": "waxed_exposed_cut_copper", + "exposedwaccoblock": "waxed_exposed_cut_copper", + "exposedwaccopblock": "waxed_exposed_cut_copper", + "exposedwaccopperblock": "waxed_exposed_cut_copper", + "exposedwacutcoblock": "waxed_exposed_cut_copper", + "exposedwacutcopblock": "waxed_exposed_cut_copper", + "exposedwacutcopperblock": "waxed_exposed_cut_copper", + "exposedwaxccoblock": "waxed_exposed_cut_copper", + "exposedwaxccopblock": "waxed_exposed_cut_copper", + "exposedwaxccopperblock": "waxed_exposed_cut_copper", + "exposedwaxcutcoblock": "waxed_exposed_cut_copper", + "exposedwaxcutcopblock": "waxed_exposed_cut_copper", + "exposedwaxcutcopperblock": "waxed_exposed_cut_copper", + "exposedwaxedccoblock": "waxed_exposed_cut_copper", + "exposedwaxedccopblock": "waxed_exposed_cut_copper", + "exposedwaxedccopperblock": "waxed_exposed_cut_copper", + "exposedwaxedcutcoblock": "waxed_exposed_cut_copper", + "exposedwaxedcutcopblock": "waxed_exposed_cut_copper", + "exposedwaxedcutcopperblock": "waxed_exposed_cut_copper", + "expwaccoblock": "waxed_exposed_cut_copper", + "expwaccopblock": "waxed_exposed_cut_copper", + "expwaccopperblock": "waxed_exposed_cut_copper", + "expwacutcoblock": "waxed_exposed_cut_copper", + "expwacutcopblock": "waxed_exposed_cut_copper", + "expwacutcopperblock": "waxed_exposed_cut_copper", + "expwaxccoblock": "waxed_exposed_cut_copper", + "expwaxccopblock": "waxed_exposed_cut_copper", + "expwaxccopperblock": "waxed_exposed_cut_copper", + "expwaxcutcoblock": "waxed_exposed_cut_copper", + "expwaxcutcopblock": "waxed_exposed_cut_copper", + "expwaxcutcopperblock": "waxed_exposed_cut_copper", + "expwaxedccoblock": "waxed_exposed_cut_copper", + "expwaxedccopblock": "waxed_exposed_cut_copper", + "expwaxedccopperblock": "waxed_exposed_cut_copper", + "expwaxedcutcoblock": "waxed_exposed_cut_copper", + "expwaxedcutcopblock": "waxed_exposed_cut_copper", + "expwaxedcutcopperblock": "waxed_exposed_cut_copper", + "exwaccoblock": "waxed_exposed_cut_copper", + "exwaccopblock": "waxed_exposed_cut_copper", + "exwaccopperblock": "waxed_exposed_cut_copper", + "exwacutcoblock": "waxed_exposed_cut_copper", + "exwacutcopblock": "waxed_exposed_cut_copper", + "exwacutcopperblock": "waxed_exposed_cut_copper", + "exwaxccoblock": "waxed_exposed_cut_copper", + "exwaxccopblock": "waxed_exposed_cut_copper", + "exwaxccopperblock": "waxed_exposed_cut_copper", + "exwaxcutcoblock": "waxed_exposed_cut_copper", + "exwaxcutcopblock": "waxed_exposed_cut_copper", + "exwaxcutcopperblock": "waxed_exposed_cut_copper", + "exwaxedccoblock": "waxed_exposed_cut_copper", + "exwaxedccopblock": "waxed_exposed_cut_copper", + "exwaxedccopperblock": "waxed_exposed_cut_copper", + "exwaxedcutcoblock": "waxed_exposed_cut_copper", + "exwaxedcutcopblock": "waxed_exposed_cut_copper", + "exwaxedcutcopperblock": "waxed_exposed_cut_copper", + "minecraft:waxed_exposed_cut_copper": "waxed_exposed_cut_copper", + "wacexcoblock": "waxed_exposed_cut_copper", + "wacexcopblock": "waxed_exposed_cut_copper", + "wacexcopperblock": "waxed_exposed_cut_copper", + "wacexpcoblock": "waxed_exposed_cut_copper", + "wacexpcopblock": "waxed_exposed_cut_copper", + "wacexpcopperblock": "waxed_exposed_cut_copper", + "wacexposedcoblock": "waxed_exposed_cut_copper", + "wacexposedcopblock": "waxed_exposed_cut_copper", + "wacexposedcopperblock": "waxed_exposed_cut_copper", + "wacutexcoblock": "waxed_exposed_cut_copper", + "wacutexcopblock": "waxed_exposed_cut_copper", + "wacutexcopperblock": "waxed_exposed_cut_copper", + "wacutexpcoblock": "waxed_exposed_cut_copper", + "wacutexpcopblock": "waxed_exposed_cut_copper", + "wacutexpcopperblock": "waxed_exposed_cut_copper", + "wacutexposedcoblock": "waxed_exposed_cut_copper", + "wacutexposedcopblock": "waxed_exposed_cut_copper", + "wacutexposedcopperblock": "waxed_exposed_cut_copper", + "waexccoblock": "waxed_exposed_cut_copper", + "waexccopblock": "waxed_exposed_cut_copper", + "waexccopperblock": "waxed_exposed_cut_copper", + "waexcutcoblock": "waxed_exposed_cut_copper", + "waexcutcopblock": "waxed_exposed_cut_copper", + "waexcutcopperblock": "waxed_exposed_cut_copper", + "waexpccoblock": "waxed_exposed_cut_copper", + "waexpccopblock": "waxed_exposed_cut_copper", + "waexpccopperblock": "waxed_exposed_cut_copper", + "waexpcutcoblock": "waxed_exposed_cut_copper", + "waexpcutcopblock": "waxed_exposed_cut_copper", + "waexpcutcopperblock": "waxed_exposed_cut_copper", + "waexposedccoblock": "waxed_exposed_cut_copper", + "waexposedccopblock": "waxed_exposed_cut_copper", + "waexposedccopperblock": "waxed_exposed_cut_copper", + "waexposedcutcoblock": "waxed_exposed_cut_copper", + "waexposedcutcopblock": "waxed_exposed_cut_copper", + "waexposedcutcopperblock": "waxed_exposed_cut_copper", + "waxcexcoblock": "waxed_exposed_cut_copper", + "waxcexcopblock": "waxed_exposed_cut_copper", + "waxcexcopperblock": "waxed_exposed_cut_copper", + "waxcexpcoblock": "waxed_exposed_cut_copper", + "waxcexpcopblock": "waxed_exposed_cut_copper", + "waxcexpcopperblock": "waxed_exposed_cut_copper", + "waxcexposedcoblock": "waxed_exposed_cut_copper", + "waxcexposedcopblock": "waxed_exposed_cut_copper", + "waxcexposedcopperblock": "waxed_exposed_cut_copper", + "waxcutexcoblock": "waxed_exposed_cut_copper", + "waxcutexcopblock": "waxed_exposed_cut_copper", + "waxcutexcopperblock": "waxed_exposed_cut_copper", + "waxcutexpcoblock": "waxed_exposed_cut_copper", + "waxcutexpcopblock": "waxed_exposed_cut_copper", + "waxcutexpcopperblock": "waxed_exposed_cut_copper", + "waxcutexposedcoblock": "waxed_exposed_cut_copper", + "waxcutexposedcopblock": "waxed_exposed_cut_copper", + "waxcutexposedcopperblock": "waxed_exposed_cut_copper", + "waxedcexcoblock": "waxed_exposed_cut_copper", + "waxedcexcopblock": "waxed_exposed_cut_copper", + "waxedcexcopperblock": "waxed_exposed_cut_copper", + "waxedcexpcoblock": "waxed_exposed_cut_copper", + "waxedcexpcopblock": "waxed_exposed_cut_copper", + "waxedcexpcopperblock": "waxed_exposed_cut_copper", + "waxedcexposedcoblock": "waxed_exposed_cut_copper", + "waxedcexposedcopblock": "waxed_exposed_cut_copper", + "waxedcexposedcopperblock": "waxed_exposed_cut_copper", + "waxedcutexcoblock": "waxed_exposed_cut_copper", + "waxedcutexcopblock": "waxed_exposed_cut_copper", + "waxedcutexcopperblock": "waxed_exposed_cut_copper", + "waxedcutexpcoblock": "waxed_exposed_cut_copper", + "waxedcutexpcopblock": "waxed_exposed_cut_copper", + "waxedcutexpcopperblock": "waxed_exposed_cut_copper", + "waxedcutexposedcoblock": "waxed_exposed_cut_copper", + "waxedcutexposedcopblock": "waxed_exposed_cut_copper", + "waxedcutexposedcopperblock": "waxed_exposed_cut_copper", + "waxedexccoblock": "waxed_exposed_cut_copper", + "waxedexccopblock": "waxed_exposed_cut_copper", + "waxedexccopperblock": "waxed_exposed_cut_copper", + "waxedexcutcoblock": "waxed_exposed_cut_copper", + "waxedexcutcopblock": "waxed_exposed_cut_copper", + "waxedexcutcopperblock": "waxed_exposed_cut_copper", + "waxedexpccoblock": "waxed_exposed_cut_copper", + "waxedexpccopblock": "waxed_exposed_cut_copper", + "waxedexpccopperblock": "waxed_exposed_cut_copper", + "waxedexpcutcoblock": "waxed_exposed_cut_copper", + "waxedexpcutcopblock": "waxed_exposed_cut_copper", + "waxedexpcutcopperblock": "waxed_exposed_cut_copper", + "waxedexposedccoblock": "waxed_exposed_cut_copper", + "waxedexposedccopblock": "waxed_exposed_cut_copper", + "waxedexposedccopperblock": "waxed_exposed_cut_copper", + "waxedexposedcutcoblock": "waxed_exposed_cut_copper", + "waxedexposedcutcopblock": "waxed_exposed_cut_copper", + "waxedexposedcutcopper": "waxed_exposed_cut_copper", + "waxedexposedcutcopperblock": "waxed_exposed_cut_copper", + "waxexccoblock": "waxed_exposed_cut_copper", + "waxexccopblock": "waxed_exposed_cut_copper", + "waxexccopperblock": "waxed_exposed_cut_copper", + "waxexcutcoblock": "waxed_exposed_cut_copper", + "waxexcutcopblock": "waxed_exposed_cut_copper", + "waxexcutcopperblock": "waxed_exposed_cut_copper", + "waxexpccoblock": "waxed_exposed_cut_copper", + "waxexpccopblock": "waxed_exposed_cut_copper", + "waxexpccopperblock": "waxed_exposed_cut_copper", + "waxexpcutcoblock": "waxed_exposed_cut_copper", + "waxexpcutcopblock": "waxed_exposed_cut_copper", + "waxexpcutcopperblock": "waxed_exposed_cut_copper", + "waxexposedccoblock": "waxed_exposed_cut_copper", + "waxexposedccopblock": "waxed_exposed_cut_copper", + "waxexposedccopperblock": "waxed_exposed_cut_copper", + "waxexposedcutcoblock": "waxed_exposed_cut_copper", + "waxexposedcutcopblock": "waxed_exposed_cut_copper", + "waxexposedcutcopperblock": "waxed_exposed_cut_copper", + "waxed_exposed_cut_copper_slab": { + "material": "WAXED_EXPOSED_CUT_COPPER_SLAB" + }, + "cexposedwacohalfblock": "waxed_exposed_cut_copper_slab", + "cexposedwacophalfblock": "waxed_exposed_cut_copper_slab", + "cexposedwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "cexposedwacoppersl": "waxed_exposed_cut_copper_slab", + "cexposedwacopperslab": "waxed_exposed_cut_copper_slab", + "cexposedwacopperstep": "waxed_exposed_cut_copper_slab", + "cexposedwacopsl": "waxed_exposed_cut_copper_slab", + "cexposedwacopslab": "waxed_exposed_cut_copper_slab", + "cexposedwacopstep": "waxed_exposed_cut_copper_slab", + "cexposedwacosl": "waxed_exposed_cut_copper_slab", + "cexposedwacoslab": "waxed_exposed_cut_copper_slab", + "cexposedwacostep": "waxed_exposed_cut_copper_slab", + "cexposedwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "cexposedwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "cexposedwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cexposedwaxcoppersl": "waxed_exposed_cut_copper_slab", + "cexposedwaxcopperslab": "waxed_exposed_cut_copper_slab", + "cexposedwaxcopperstep": "waxed_exposed_cut_copper_slab", + "cexposedwaxcopsl": "waxed_exposed_cut_copper_slab", + "cexposedwaxcopslab": "waxed_exposed_cut_copper_slab", + "cexposedwaxcopstep": "waxed_exposed_cut_copper_slab", + "cexposedwaxcosl": "waxed_exposed_cut_copper_slab", + "cexposedwaxcoslab": "waxed_exposed_cut_copper_slab", + "cexposedwaxcostep": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcopsl": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcopslab": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcopstep": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcosl": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcoslab": "waxed_exposed_cut_copper_slab", + "cexposedwaxedcostep": "waxed_exposed_cut_copper_slab", + "cexpwacohalfblock": "waxed_exposed_cut_copper_slab", + "cexpwacophalfblock": "waxed_exposed_cut_copper_slab", + "cexpwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "cexpwacoppersl": "waxed_exposed_cut_copper_slab", + "cexpwacopperslab": "waxed_exposed_cut_copper_slab", + "cexpwacopperstep": "waxed_exposed_cut_copper_slab", + "cexpwacopsl": "waxed_exposed_cut_copper_slab", + "cexpwacopslab": "waxed_exposed_cut_copper_slab", + "cexpwacopstep": "waxed_exposed_cut_copper_slab", + "cexpwacosl": "waxed_exposed_cut_copper_slab", + "cexpwacoslab": "waxed_exposed_cut_copper_slab", + "cexpwacostep": "waxed_exposed_cut_copper_slab", + "cexpwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "cexpwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "cexpwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cexpwaxcoppersl": "waxed_exposed_cut_copper_slab", + "cexpwaxcopperslab": "waxed_exposed_cut_copper_slab", + "cexpwaxcopperstep": "waxed_exposed_cut_copper_slab", + "cexpwaxcopsl": "waxed_exposed_cut_copper_slab", + "cexpwaxcopslab": "waxed_exposed_cut_copper_slab", + "cexpwaxcopstep": "waxed_exposed_cut_copper_slab", + "cexpwaxcosl": "waxed_exposed_cut_copper_slab", + "cexpwaxcoslab": "waxed_exposed_cut_copper_slab", + "cexpwaxcostep": "waxed_exposed_cut_copper_slab", + "cexpwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "cexpwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "cexpwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cexpwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "cexpwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "cexpwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "cexpwaxedcopsl": "waxed_exposed_cut_copper_slab", + "cexpwaxedcopslab": "waxed_exposed_cut_copper_slab", + "cexpwaxedcopstep": "waxed_exposed_cut_copper_slab", + "cexpwaxedcosl": "waxed_exposed_cut_copper_slab", + "cexpwaxedcoslab": "waxed_exposed_cut_copper_slab", + "cexpwaxedcostep": "waxed_exposed_cut_copper_slab", + "cexwacohalfblock": "waxed_exposed_cut_copper_slab", + "cexwacophalfblock": "waxed_exposed_cut_copper_slab", + "cexwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "cexwacoppersl": "waxed_exposed_cut_copper_slab", + "cexwacopperslab": "waxed_exposed_cut_copper_slab", + "cexwacopperstep": "waxed_exposed_cut_copper_slab", + "cexwacopsl": "waxed_exposed_cut_copper_slab", + "cexwacopslab": "waxed_exposed_cut_copper_slab", + "cexwacopstep": "waxed_exposed_cut_copper_slab", + "cexwacosl": "waxed_exposed_cut_copper_slab", + "cexwacoslab": "waxed_exposed_cut_copper_slab", + "cexwacostep": "waxed_exposed_cut_copper_slab", + "cexwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "cexwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "cexwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cexwaxcoppersl": "waxed_exposed_cut_copper_slab", + "cexwaxcopperslab": "waxed_exposed_cut_copper_slab", + "cexwaxcopperstep": "waxed_exposed_cut_copper_slab", + "cexwaxcopsl": "waxed_exposed_cut_copper_slab", + "cexwaxcopslab": "waxed_exposed_cut_copper_slab", + "cexwaxcopstep": "waxed_exposed_cut_copper_slab", + "cexwaxcosl": "waxed_exposed_cut_copper_slab", + "cexwaxcoslab": "waxed_exposed_cut_copper_slab", + "cexwaxcostep": "waxed_exposed_cut_copper_slab", + "cexwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "cexwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "cexwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cexwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "cexwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "cexwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "cexwaxedcopsl": "waxed_exposed_cut_copper_slab", + "cexwaxedcopslab": "waxed_exposed_cut_copper_slab", + "cexwaxedcopstep": "waxed_exposed_cut_copper_slab", + "cexwaxedcosl": "waxed_exposed_cut_copper_slab", + "cexwaxedcoslab": "waxed_exposed_cut_copper_slab", + "cexwaxedcostep": "waxed_exposed_cut_copper_slab", + "cutexposedwacohalfblock": "waxed_exposed_cut_copper_slab", + "cutexposedwacophalfblock": "waxed_exposed_cut_copper_slab", + "cutexposedwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutexposedwacoppersl": "waxed_exposed_cut_copper_slab", + "cutexposedwacopperslab": "waxed_exposed_cut_copper_slab", + "cutexposedwacopperstep": "waxed_exposed_cut_copper_slab", + "cutexposedwacopsl": "waxed_exposed_cut_copper_slab", + "cutexposedwacopslab": "waxed_exposed_cut_copper_slab", + "cutexposedwacopstep": "waxed_exposed_cut_copper_slab", + "cutexposedwacosl": "waxed_exposed_cut_copper_slab", + "cutexposedwacoslab": "waxed_exposed_cut_copper_slab", + "cutexposedwacostep": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcoppersl": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcopperslab": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcopperstep": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcopsl": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcopslab": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcopstep": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcosl": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcoslab": "waxed_exposed_cut_copper_slab", + "cutexposedwaxcostep": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcopsl": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcopslab": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcopstep": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcosl": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcoslab": "waxed_exposed_cut_copper_slab", + "cutexposedwaxedcostep": "waxed_exposed_cut_copper_slab", + "cutexpwacohalfblock": "waxed_exposed_cut_copper_slab", + "cutexpwacophalfblock": "waxed_exposed_cut_copper_slab", + "cutexpwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutexpwacoppersl": "waxed_exposed_cut_copper_slab", + "cutexpwacopperslab": "waxed_exposed_cut_copper_slab", + "cutexpwacopperstep": "waxed_exposed_cut_copper_slab", + "cutexpwacopsl": "waxed_exposed_cut_copper_slab", + "cutexpwacopslab": "waxed_exposed_cut_copper_slab", + "cutexpwacopstep": "waxed_exposed_cut_copper_slab", + "cutexpwacosl": "waxed_exposed_cut_copper_slab", + "cutexpwacoslab": "waxed_exposed_cut_copper_slab", + "cutexpwacostep": "waxed_exposed_cut_copper_slab", + "cutexpwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "cutexpwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "cutexpwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutexpwaxcoppersl": "waxed_exposed_cut_copper_slab", + "cutexpwaxcopperslab": "waxed_exposed_cut_copper_slab", + "cutexpwaxcopperstep": "waxed_exposed_cut_copper_slab", + "cutexpwaxcopsl": "waxed_exposed_cut_copper_slab", + "cutexpwaxcopslab": "waxed_exposed_cut_copper_slab", + "cutexpwaxcopstep": "waxed_exposed_cut_copper_slab", + "cutexpwaxcosl": "waxed_exposed_cut_copper_slab", + "cutexpwaxcoslab": "waxed_exposed_cut_copper_slab", + "cutexpwaxcostep": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcopsl": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcopslab": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcopstep": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcosl": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcoslab": "waxed_exposed_cut_copper_slab", + "cutexpwaxedcostep": "waxed_exposed_cut_copper_slab", + "cutexwacohalfblock": "waxed_exposed_cut_copper_slab", + "cutexwacophalfblock": "waxed_exposed_cut_copper_slab", + "cutexwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutexwacoppersl": "waxed_exposed_cut_copper_slab", + "cutexwacopperslab": "waxed_exposed_cut_copper_slab", + "cutexwacopperstep": "waxed_exposed_cut_copper_slab", + "cutexwacopsl": "waxed_exposed_cut_copper_slab", + "cutexwacopslab": "waxed_exposed_cut_copper_slab", + "cutexwacopstep": "waxed_exposed_cut_copper_slab", + "cutexwacosl": "waxed_exposed_cut_copper_slab", + "cutexwacoslab": "waxed_exposed_cut_copper_slab", + "cutexwacostep": "waxed_exposed_cut_copper_slab", + "cutexwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "cutexwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "cutexwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutexwaxcoppersl": "waxed_exposed_cut_copper_slab", + "cutexwaxcopperslab": "waxed_exposed_cut_copper_slab", + "cutexwaxcopperstep": "waxed_exposed_cut_copper_slab", + "cutexwaxcopsl": "waxed_exposed_cut_copper_slab", + "cutexwaxcopslab": "waxed_exposed_cut_copper_slab", + "cutexwaxcopstep": "waxed_exposed_cut_copper_slab", + "cutexwaxcosl": "waxed_exposed_cut_copper_slab", + "cutexwaxcoslab": "waxed_exposed_cut_copper_slab", + "cutexwaxcostep": "waxed_exposed_cut_copper_slab", + "cutexwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "cutexwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "cutexwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutexwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "cutexwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "cutexwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "cutexwaxedcopsl": "waxed_exposed_cut_copper_slab", + "cutexwaxedcopslab": "waxed_exposed_cut_copper_slab", + "cutexwaxedcopstep": "waxed_exposed_cut_copper_slab", + "cutexwaxedcosl": "waxed_exposed_cut_copper_slab", + "cutexwaxedcoslab": "waxed_exposed_cut_copper_slab", + "cutexwaxedcostep": "waxed_exposed_cut_copper_slab", + "cutwaexcohalfblock": "waxed_exposed_cut_copper_slab", + "cutwaexcophalfblock": "waxed_exposed_cut_copper_slab", + "cutwaexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutwaexcoppersl": "waxed_exposed_cut_copper_slab", + "cutwaexcopperslab": "waxed_exposed_cut_copper_slab", + "cutwaexcopperstep": "waxed_exposed_cut_copper_slab", + "cutwaexcopsl": "waxed_exposed_cut_copper_slab", + "cutwaexcopslab": "waxed_exposed_cut_copper_slab", + "cutwaexcopstep": "waxed_exposed_cut_copper_slab", + "cutwaexcosl": "waxed_exposed_cut_copper_slab", + "cutwaexcoslab": "waxed_exposed_cut_copper_slab", + "cutwaexcostep": "waxed_exposed_cut_copper_slab", + "cutwaexpcohalfblock": "waxed_exposed_cut_copper_slab", + "cutwaexpcophalfblock": "waxed_exposed_cut_copper_slab", + "cutwaexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutwaexpcoppersl": "waxed_exposed_cut_copper_slab", + "cutwaexpcopperslab": "waxed_exposed_cut_copper_slab", + "cutwaexpcopperstep": "waxed_exposed_cut_copper_slab", + "cutwaexpcopsl": "waxed_exposed_cut_copper_slab", + "cutwaexpcopslab": "waxed_exposed_cut_copper_slab", + "cutwaexpcopstep": "waxed_exposed_cut_copper_slab", + "cutwaexpcosl": "waxed_exposed_cut_copper_slab", + "cutwaexpcoslab": "waxed_exposed_cut_copper_slab", + "cutwaexpcostep": "waxed_exposed_cut_copper_slab", + "cutwaexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "cutwaexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "cutwaexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutwaexposedcoppersl": "waxed_exposed_cut_copper_slab", + "cutwaexposedcopperslab": "waxed_exposed_cut_copper_slab", + "cutwaexposedcopperstep": "waxed_exposed_cut_copper_slab", + "cutwaexposedcopsl": "waxed_exposed_cut_copper_slab", + "cutwaexposedcopslab": "waxed_exposed_cut_copper_slab", + "cutwaexposedcopstep": "waxed_exposed_cut_copper_slab", + "cutwaexposedcosl": "waxed_exposed_cut_copper_slab", + "cutwaexposedcoslab": "waxed_exposed_cut_copper_slab", + "cutwaexposedcostep": "waxed_exposed_cut_copper_slab", + "cutwaxedexcohalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxedexcophalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxedexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxedexcoppersl": "waxed_exposed_cut_copper_slab", + "cutwaxedexcopperslab": "waxed_exposed_cut_copper_slab", + "cutwaxedexcopperstep": "waxed_exposed_cut_copper_slab", + "cutwaxedexcopsl": "waxed_exposed_cut_copper_slab", + "cutwaxedexcopslab": "waxed_exposed_cut_copper_slab", + "cutwaxedexcopstep": "waxed_exposed_cut_copper_slab", + "cutwaxedexcosl": "waxed_exposed_cut_copper_slab", + "cutwaxedexcoslab": "waxed_exposed_cut_copper_slab", + "cutwaxedexcostep": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcohalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcophalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcoppersl": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcopperslab": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcopperstep": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcopsl": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcopslab": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcopstep": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcosl": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcoslab": "waxed_exposed_cut_copper_slab", + "cutwaxedexpcostep": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcoppersl": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcopperslab": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcopperstep": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcopsl": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcopslab": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcopstep": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcosl": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcoslab": "waxed_exposed_cut_copper_slab", + "cutwaxedexposedcostep": "waxed_exposed_cut_copper_slab", + "cutwaxexcohalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxexcophalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxexcoppersl": "waxed_exposed_cut_copper_slab", + "cutwaxexcopperslab": "waxed_exposed_cut_copper_slab", + "cutwaxexcopperstep": "waxed_exposed_cut_copper_slab", + "cutwaxexcopsl": "waxed_exposed_cut_copper_slab", + "cutwaxexcopslab": "waxed_exposed_cut_copper_slab", + "cutwaxexcopstep": "waxed_exposed_cut_copper_slab", + "cutwaxexcosl": "waxed_exposed_cut_copper_slab", + "cutwaxexcoslab": "waxed_exposed_cut_copper_slab", + "cutwaxexcostep": "waxed_exposed_cut_copper_slab", + "cutwaxexpcohalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxexpcophalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxexpcoppersl": "waxed_exposed_cut_copper_slab", + "cutwaxexpcopperslab": "waxed_exposed_cut_copper_slab", + "cutwaxexpcopperstep": "waxed_exposed_cut_copper_slab", + "cutwaxexpcopsl": "waxed_exposed_cut_copper_slab", + "cutwaxexpcopslab": "waxed_exposed_cut_copper_slab", + "cutwaxexpcopstep": "waxed_exposed_cut_copper_slab", + "cutwaxexpcosl": "waxed_exposed_cut_copper_slab", + "cutwaxexpcoslab": "waxed_exposed_cut_copper_slab", + "cutwaxexpcostep": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcoppersl": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcopperslab": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcopperstep": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcopsl": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcopslab": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcopstep": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcosl": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcoslab": "waxed_exposed_cut_copper_slab", + "cutwaxexposedcostep": "waxed_exposed_cut_copper_slab", + "cwaexcohalfblock": "waxed_exposed_cut_copper_slab", + "cwaexcophalfblock": "waxed_exposed_cut_copper_slab", + "cwaexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cwaexcoppersl": "waxed_exposed_cut_copper_slab", + "cwaexcopperslab": "waxed_exposed_cut_copper_slab", + "cwaexcopperstep": "waxed_exposed_cut_copper_slab", + "cwaexcopsl": "waxed_exposed_cut_copper_slab", + "cwaexcopslab": "waxed_exposed_cut_copper_slab", + "cwaexcopstep": "waxed_exposed_cut_copper_slab", + "cwaexcosl": "waxed_exposed_cut_copper_slab", + "cwaexcoslab": "waxed_exposed_cut_copper_slab", + "cwaexcostep": "waxed_exposed_cut_copper_slab", + "cwaexpcohalfblock": "waxed_exposed_cut_copper_slab", + "cwaexpcophalfblock": "waxed_exposed_cut_copper_slab", + "cwaexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cwaexpcoppersl": "waxed_exposed_cut_copper_slab", + "cwaexpcopperslab": "waxed_exposed_cut_copper_slab", + "cwaexpcopperstep": "waxed_exposed_cut_copper_slab", + "cwaexpcopsl": "waxed_exposed_cut_copper_slab", + "cwaexpcopslab": "waxed_exposed_cut_copper_slab", + "cwaexpcopstep": "waxed_exposed_cut_copper_slab", + "cwaexpcosl": "waxed_exposed_cut_copper_slab", + "cwaexpcoslab": "waxed_exposed_cut_copper_slab", + "cwaexpcostep": "waxed_exposed_cut_copper_slab", + "cwaexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "cwaexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "cwaexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cwaexposedcoppersl": "waxed_exposed_cut_copper_slab", + "cwaexposedcopperslab": "waxed_exposed_cut_copper_slab", + "cwaexposedcopperstep": "waxed_exposed_cut_copper_slab", + "cwaexposedcopsl": "waxed_exposed_cut_copper_slab", + "cwaexposedcopslab": "waxed_exposed_cut_copper_slab", + "cwaexposedcopstep": "waxed_exposed_cut_copper_slab", + "cwaexposedcosl": "waxed_exposed_cut_copper_slab", + "cwaexposedcoslab": "waxed_exposed_cut_copper_slab", + "cwaexposedcostep": "waxed_exposed_cut_copper_slab", + "cwaxedexcohalfblock": "waxed_exposed_cut_copper_slab", + "cwaxedexcophalfblock": "waxed_exposed_cut_copper_slab", + "cwaxedexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cwaxedexcoppersl": "waxed_exposed_cut_copper_slab", + "cwaxedexcopperslab": "waxed_exposed_cut_copper_slab", + "cwaxedexcopperstep": "waxed_exposed_cut_copper_slab", + "cwaxedexcopsl": "waxed_exposed_cut_copper_slab", + "cwaxedexcopslab": "waxed_exposed_cut_copper_slab", + "cwaxedexcopstep": "waxed_exposed_cut_copper_slab", + "cwaxedexcosl": "waxed_exposed_cut_copper_slab", + "cwaxedexcoslab": "waxed_exposed_cut_copper_slab", + "cwaxedexcostep": "waxed_exposed_cut_copper_slab", + "cwaxedexpcohalfblock": "waxed_exposed_cut_copper_slab", + "cwaxedexpcophalfblock": "waxed_exposed_cut_copper_slab", + "cwaxedexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cwaxedexpcoppersl": "waxed_exposed_cut_copper_slab", + "cwaxedexpcopperslab": "waxed_exposed_cut_copper_slab", + "cwaxedexpcopperstep": "waxed_exposed_cut_copper_slab", + "cwaxedexpcopsl": "waxed_exposed_cut_copper_slab", + "cwaxedexpcopslab": "waxed_exposed_cut_copper_slab", + "cwaxedexpcopstep": "waxed_exposed_cut_copper_slab", + "cwaxedexpcosl": "waxed_exposed_cut_copper_slab", + "cwaxedexpcoslab": "waxed_exposed_cut_copper_slab", + "cwaxedexpcostep": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcoppersl": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcopperslab": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcopperstep": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcopsl": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcopslab": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcopstep": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcosl": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcoslab": "waxed_exposed_cut_copper_slab", + "cwaxedexposedcostep": "waxed_exposed_cut_copper_slab", + "cwaxexcohalfblock": "waxed_exposed_cut_copper_slab", + "cwaxexcophalfblock": "waxed_exposed_cut_copper_slab", + "cwaxexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cwaxexcoppersl": "waxed_exposed_cut_copper_slab", + "cwaxexcopperslab": "waxed_exposed_cut_copper_slab", + "cwaxexcopperstep": "waxed_exposed_cut_copper_slab", + "cwaxexcopsl": "waxed_exposed_cut_copper_slab", + "cwaxexcopslab": "waxed_exposed_cut_copper_slab", + "cwaxexcopstep": "waxed_exposed_cut_copper_slab", + "cwaxexcosl": "waxed_exposed_cut_copper_slab", + "cwaxexcoslab": "waxed_exposed_cut_copper_slab", + "cwaxexcostep": "waxed_exposed_cut_copper_slab", + "cwaxexpcohalfblock": "waxed_exposed_cut_copper_slab", + "cwaxexpcophalfblock": "waxed_exposed_cut_copper_slab", + "cwaxexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cwaxexpcoppersl": "waxed_exposed_cut_copper_slab", + "cwaxexpcopperslab": "waxed_exposed_cut_copper_slab", + "cwaxexpcopperstep": "waxed_exposed_cut_copper_slab", + "cwaxexpcopsl": "waxed_exposed_cut_copper_slab", + "cwaxexpcopslab": "waxed_exposed_cut_copper_slab", + "cwaxexpcopstep": "waxed_exposed_cut_copper_slab", + "cwaxexpcosl": "waxed_exposed_cut_copper_slab", + "cwaxexpcoslab": "waxed_exposed_cut_copper_slab", + "cwaxexpcostep": "waxed_exposed_cut_copper_slab", + "cwaxexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "cwaxexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "cwaxexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "cwaxexposedcoppersl": "waxed_exposed_cut_copper_slab", + "cwaxexposedcopperslab": "waxed_exposed_cut_copper_slab", + "cwaxexposedcopperstep": "waxed_exposed_cut_copper_slab", + "cwaxexposedcopsl": "waxed_exposed_cut_copper_slab", + "cwaxexposedcopslab": "waxed_exposed_cut_copper_slab", + "cwaxexposedcopstep": "waxed_exposed_cut_copper_slab", + "cwaxexposedcosl": "waxed_exposed_cut_copper_slab", + "cwaxexposedcoslab": "waxed_exposed_cut_copper_slab", + "cwaxexposedcostep": "waxed_exposed_cut_copper_slab", + "excutwacohalfblock": "waxed_exposed_cut_copper_slab", + "excutwacophalfblock": "waxed_exposed_cut_copper_slab", + "excutwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "excutwacoppersl": "waxed_exposed_cut_copper_slab", + "excutwacopperslab": "waxed_exposed_cut_copper_slab", + "excutwacopperstep": "waxed_exposed_cut_copper_slab", + "excutwacopsl": "waxed_exposed_cut_copper_slab", + "excutwacopslab": "waxed_exposed_cut_copper_slab", + "excutwacopstep": "waxed_exposed_cut_copper_slab", + "excutwacosl": "waxed_exposed_cut_copper_slab", + "excutwacoslab": "waxed_exposed_cut_copper_slab", + "excutwacostep": "waxed_exposed_cut_copper_slab", + "excutwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "excutwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "excutwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "excutwaxcoppersl": "waxed_exposed_cut_copper_slab", + "excutwaxcopperslab": "waxed_exposed_cut_copper_slab", + "excutwaxcopperstep": "waxed_exposed_cut_copper_slab", + "excutwaxcopsl": "waxed_exposed_cut_copper_slab", + "excutwaxcopslab": "waxed_exposed_cut_copper_slab", + "excutwaxcopstep": "waxed_exposed_cut_copper_slab", + "excutwaxcosl": "waxed_exposed_cut_copper_slab", + "excutwaxcoslab": "waxed_exposed_cut_copper_slab", + "excutwaxcostep": "waxed_exposed_cut_copper_slab", + "excutwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "excutwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "excutwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "excutwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "excutwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "excutwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "excutwaxedcopsl": "waxed_exposed_cut_copper_slab", + "excutwaxedcopslab": "waxed_exposed_cut_copper_slab", + "excutwaxedcopstep": "waxed_exposed_cut_copper_slab", + "excutwaxedcosl": "waxed_exposed_cut_copper_slab", + "excutwaxedcoslab": "waxed_exposed_cut_copper_slab", + "excutwaxedcostep": "waxed_exposed_cut_copper_slab", + "excwacohalfblock": "waxed_exposed_cut_copper_slab", + "excwacophalfblock": "waxed_exposed_cut_copper_slab", + "excwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "excwacoppersl": "waxed_exposed_cut_copper_slab", + "excwacopperslab": "waxed_exposed_cut_copper_slab", + "excwacopperstep": "waxed_exposed_cut_copper_slab", + "excwacopsl": "waxed_exposed_cut_copper_slab", + "excwacopslab": "waxed_exposed_cut_copper_slab", + "excwacopstep": "waxed_exposed_cut_copper_slab", + "excwacosl": "waxed_exposed_cut_copper_slab", + "excwacoslab": "waxed_exposed_cut_copper_slab", + "excwacostep": "waxed_exposed_cut_copper_slab", + "excwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "excwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "excwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "excwaxcoppersl": "waxed_exposed_cut_copper_slab", + "excwaxcopperslab": "waxed_exposed_cut_copper_slab", + "excwaxcopperstep": "waxed_exposed_cut_copper_slab", + "excwaxcopsl": "waxed_exposed_cut_copper_slab", + "excwaxcopslab": "waxed_exposed_cut_copper_slab", + "excwaxcopstep": "waxed_exposed_cut_copper_slab", + "excwaxcosl": "waxed_exposed_cut_copper_slab", + "excwaxcoslab": "waxed_exposed_cut_copper_slab", + "excwaxcostep": "waxed_exposed_cut_copper_slab", + "excwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "excwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "excwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "excwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "excwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "excwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "excwaxedcopsl": "waxed_exposed_cut_copper_slab", + "excwaxedcopslab": "waxed_exposed_cut_copper_slab", + "excwaxedcopstep": "waxed_exposed_cut_copper_slab", + "excwaxedcosl": "waxed_exposed_cut_copper_slab", + "excwaxedcoslab": "waxed_exposed_cut_copper_slab", + "excwaxedcostep": "waxed_exposed_cut_copper_slab", + "expcutwacohalfblock": "waxed_exposed_cut_copper_slab", + "expcutwacophalfblock": "waxed_exposed_cut_copper_slab", + "expcutwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "expcutwacoppersl": "waxed_exposed_cut_copper_slab", + "expcutwacopperslab": "waxed_exposed_cut_copper_slab", + "expcutwacopperstep": "waxed_exposed_cut_copper_slab", + "expcutwacopsl": "waxed_exposed_cut_copper_slab", + "expcutwacopslab": "waxed_exposed_cut_copper_slab", + "expcutwacopstep": "waxed_exposed_cut_copper_slab", + "expcutwacosl": "waxed_exposed_cut_copper_slab", + "expcutwacoslab": "waxed_exposed_cut_copper_slab", + "expcutwacostep": "waxed_exposed_cut_copper_slab", + "expcutwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "expcutwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "expcutwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "expcutwaxcoppersl": "waxed_exposed_cut_copper_slab", + "expcutwaxcopperslab": "waxed_exposed_cut_copper_slab", + "expcutwaxcopperstep": "waxed_exposed_cut_copper_slab", + "expcutwaxcopsl": "waxed_exposed_cut_copper_slab", + "expcutwaxcopslab": "waxed_exposed_cut_copper_slab", + "expcutwaxcopstep": "waxed_exposed_cut_copper_slab", + "expcutwaxcosl": "waxed_exposed_cut_copper_slab", + "expcutwaxcoslab": "waxed_exposed_cut_copper_slab", + "expcutwaxcostep": "waxed_exposed_cut_copper_slab", + "expcutwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "expcutwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "expcutwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "expcutwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "expcutwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "expcutwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "expcutwaxedcopsl": "waxed_exposed_cut_copper_slab", + "expcutwaxedcopslab": "waxed_exposed_cut_copper_slab", + "expcutwaxedcopstep": "waxed_exposed_cut_copper_slab", + "expcutwaxedcosl": "waxed_exposed_cut_copper_slab", + "expcutwaxedcoslab": "waxed_exposed_cut_copper_slab", + "expcutwaxedcostep": "waxed_exposed_cut_copper_slab", + "expcwacohalfblock": "waxed_exposed_cut_copper_slab", + "expcwacophalfblock": "waxed_exposed_cut_copper_slab", + "expcwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "expcwacoppersl": "waxed_exposed_cut_copper_slab", + "expcwacopperslab": "waxed_exposed_cut_copper_slab", + "expcwacopperstep": "waxed_exposed_cut_copper_slab", + "expcwacopsl": "waxed_exposed_cut_copper_slab", + "expcwacopslab": "waxed_exposed_cut_copper_slab", + "expcwacopstep": "waxed_exposed_cut_copper_slab", + "expcwacosl": "waxed_exposed_cut_copper_slab", + "expcwacoslab": "waxed_exposed_cut_copper_slab", + "expcwacostep": "waxed_exposed_cut_copper_slab", + "expcwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "expcwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "expcwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "expcwaxcoppersl": "waxed_exposed_cut_copper_slab", + "expcwaxcopperslab": "waxed_exposed_cut_copper_slab", + "expcwaxcopperstep": "waxed_exposed_cut_copper_slab", + "expcwaxcopsl": "waxed_exposed_cut_copper_slab", + "expcwaxcopslab": "waxed_exposed_cut_copper_slab", + "expcwaxcopstep": "waxed_exposed_cut_copper_slab", + "expcwaxcosl": "waxed_exposed_cut_copper_slab", + "expcwaxcoslab": "waxed_exposed_cut_copper_slab", + "expcwaxcostep": "waxed_exposed_cut_copper_slab", + "expcwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "expcwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "expcwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "expcwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "expcwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "expcwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "expcwaxedcopsl": "waxed_exposed_cut_copper_slab", + "expcwaxedcopslab": "waxed_exposed_cut_copper_slab", + "expcwaxedcopstep": "waxed_exposed_cut_copper_slab", + "expcwaxedcosl": "waxed_exposed_cut_copper_slab", + "expcwaxedcoslab": "waxed_exposed_cut_copper_slab", + "expcwaxedcostep": "waxed_exposed_cut_copper_slab", + "exposedcutwacohalfblock": "waxed_exposed_cut_copper_slab", + "exposedcutwacophalfblock": "waxed_exposed_cut_copper_slab", + "exposedcutwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedcutwacoppersl": "waxed_exposed_cut_copper_slab", + "exposedcutwacopperslab": "waxed_exposed_cut_copper_slab", + "exposedcutwacopperstep": "waxed_exposed_cut_copper_slab", + "exposedcutwacopsl": "waxed_exposed_cut_copper_slab", + "exposedcutwacopslab": "waxed_exposed_cut_copper_slab", + "exposedcutwacopstep": "waxed_exposed_cut_copper_slab", + "exposedcutwacosl": "waxed_exposed_cut_copper_slab", + "exposedcutwacoslab": "waxed_exposed_cut_copper_slab", + "exposedcutwacostep": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcoppersl": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcopperslab": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcopperstep": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcopsl": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcopslab": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcopstep": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcosl": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcoslab": "waxed_exposed_cut_copper_slab", + "exposedcutwaxcostep": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcopsl": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcopslab": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcopstep": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcosl": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcoslab": "waxed_exposed_cut_copper_slab", + "exposedcutwaxedcostep": "waxed_exposed_cut_copper_slab", + "exposedcwacohalfblock": "waxed_exposed_cut_copper_slab", + "exposedcwacophalfblock": "waxed_exposed_cut_copper_slab", + "exposedcwacopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedcwacoppersl": "waxed_exposed_cut_copper_slab", + "exposedcwacopperslab": "waxed_exposed_cut_copper_slab", + "exposedcwacopperstep": "waxed_exposed_cut_copper_slab", + "exposedcwacopsl": "waxed_exposed_cut_copper_slab", + "exposedcwacopslab": "waxed_exposed_cut_copper_slab", + "exposedcwacopstep": "waxed_exposed_cut_copper_slab", + "exposedcwacosl": "waxed_exposed_cut_copper_slab", + "exposedcwacoslab": "waxed_exposed_cut_copper_slab", + "exposedcwacostep": "waxed_exposed_cut_copper_slab", + "exposedcwaxcohalfblock": "waxed_exposed_cut_copper_slab", + "exposedcwaxcophalfblock": "waxed_exposed_cut_copper_slab", + "exposedcwaxcopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedcwaxcoppersl": "waxed_exposed_cut_copper_slab", + "exposedcwaxcopperslab": "waxed_exposed_cut_copper_slab", + "exposedcwaxcopperstep": "waxed_exposed_cut_copper_slab", + "exposedcwaxcopsl": "waxed_exposed_cut_copper_slab", + "exposedcwaxcopslab": "waxed_exposed_cut_copper_slab", + "exposedcwaxcopstep": "waxed_exposed_cut_copper_slab", + "exposedcwaxcosl": "waxed_exposed_cut_copper_slab", + "exposedcwaxcoslab": "waxed_exposed_cut_copper_slab", + "exposedcwaxcostep": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcohalfblock": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcophalfblock": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcoppersl": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcopperslab": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcopperstep": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcopsl": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcopslab": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcopstep": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcosl": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcoslab": "waxed_exposed_cut_copper_slab", + "exposedcwaxedcostep": "waxed_exposed_cut_copper_slab", + "exposedwaccohalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaccophalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaccopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaccoppersl": "waxed_exposed_cut_copper_slab", + "exposedwaccopperslab": "waxed_exposed_cut_copper_slab", + "exposedwaccopperstep": "waxed_exposed_cut_copper_slab", + "exposedwaccopsl": "waxed_exposed_cut_copper_slab", + "exposedwaccopslab": "waxed_exposed_cut_copper_slab", + "exposedwaccopstep": "waxed_exposed_cut_copper_slab", + "exposedwaccosl": "waxed_exposed_cut_copper_slab", + "exposedwaccoslab": "waxed_exposed_cut_copper_slab", + "exposedwaccostep": "waxed_exposed_cut_copper_slab", + "exposedwacutcohalfblock": "waxed_exposed_cut_copper_slab", + "exposedwacutcophalfblock": "waxed_exposed_cut_copper_slab", + "exposedwacutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedwacutcoppersl": "waxed_exposed_cut_copper_slab", + "exposedwacutcopperslab": "waxed_exposed_cut_copper_slab", + "exposedwacutcopperstep": "waxed_exposed_cut_copper_slab", + "exposedwacutcopsl": "waxed_exposed_cut_copper_slab", + "exposedwacutcopslab": "waxed_exposed_cut_copper_slab", + "exposedwacutcopstep": "waxed_exposed_cut_copper_slab", + "exposedwacutcosl": "waxed_exposed_cut_copper_slab", + "exposedwacutcoslab": "waxed_exposed_cut_copper_slab", + "exposedwacutcostep": "waxed_exposed_cut_copper_slab", + "exposedwaxccohalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxccophalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxccopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxccoppersl": "waxed_exposed_cut_copper_slab", + "exposedwaxccopperslab": "waxed_exposed_cut_copper_slab", + "exposedwaxccopperstep": "waxed_exposed_cut_copper_slab", + "exposedwaxccopsl": "waxed_exposed_cut_copper_slab", + "exposedwaxccopslab": "waxed_exposed_cut_copper_slab", + "exposedwaxccopstep": "waxed_exposed_cut_copper_slab", + "exposedwaxccosl": "waxed_exposed_cut_copper_slab", + "exposedwaxccoslab": "waxed_exposed_cut_copper_slab", + "exposedwaxccostep": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcohalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcophalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcoppersl": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcopperslab": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcopperstep": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcopsl": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcopslab": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcopstep": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcosl": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcoslab": "waxed_exposed_cut_copper_slab", + "exposedwaxcutcostep": "waxed_exposed_cut_copper_slab", + "exposedwaxedccohalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxedccophalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxedccopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxedccoppersl": "waxed_exposed_cut_copper_slab", + "exposedwaxedccopperslab": "waxed_exposed_cut_copper_slab", + "exposedwaxedccopperstep": "waxed_exposed_cut_copper_slab", + "exposedwaxedccopsl": "waxed_exposed_cut_copper_slab", + "exposedwaxedccopslab": "waxed_exposed_cut_copper_slab", + "exposedwaxedccopstep": "waxed_exposed_cut_copper_slab", + "exposedwaxedccosl": "waxed_exposed_cut_copper_slab", + "exposedwaxedccoslab": "waxed_exposed_cut_copper_slab", + "exposedwaxedccostep": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcohalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcophalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcoppersl": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcopperslab": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcopperstep": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcopsl": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcopslab": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcopstep": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcosl": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcoslab": "waxed_exposed_cut_copper_slab", + "exposedwaxedcutcostep": "waxed_exposed_cut_copper_slab", + "expwaccohalfblock": "waxed_exposed_cut_copper_slab", + "expwaccophalfblock": "waxed_exposed_cut_copper_slab", + "expwaccopperhalfblock": "waxed_exposed_cut_copper_slab", + "expwaccoppersl": "waxed_exposed_cut_copper_slab", + "expwaccopperslab": "waxed_exposed_cut_copper_slab", + "expwaccopperstep": "waxed_exposed_cut_copper_slab", + "expwaccopsl": "waxed_exposed_cut_copper_slab", + "expwaccopslab": "waxed_exposed_cut_copper_slab", + "expwaccopstep": "waxed_exposed_cut_copper_slab", + "expwaccosl": "waxed_exposed_cut_copper_slab", + "expwaccoslab": "waxed_exposed_cut_copper_slab", + "expwaccostep": "waxed_exposed_cut_copper_slab", + "expwacutcohalfblock": "waxed_exposed_cut_copper_slab", + "expwacutcophalfblock": "waxed_exposed_cut_copper_slab", + "expwacutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "expwacutcoppersl": "waxed_exposed_cut_copper_slab", + "expwacutcopperslab": "waxed_exposed_cut_copper_slab", + "expwacutcopperstep": "waxed_exposed_cut_copper_slab", + "expwacutcopsl": "waxed_exposed_cut_copper_slab", + "expwacutcopslab": "waxed_exposed_cut_copper_slab", + "expwacutcopstep": "waxed_exposed_cut_copper_slab", + "expwacutcosl": "waxed_exposed_cut_copper_slab", + "expwacutcoslab": "waxed_exposed_cut_copper_slab", + "expwacutcostep": "waxed_exposed_cut_copper_slab", + "expwaxccohalfblock": "waxed_exposed_cut_copper_slab", + "expwaxccophalfblock": "waxed_exposed_cut_copper_slab", + "expwaxccopperhalfblock": "waxed_exposed_cut_copper_slab", + "expwaxccoppersl": "waxed_exposed_cut_copper_slab", + "expwaxccopperslab": "waxed_exposed_cut_copper_slab", + "expwaxccopperstep": "waxed_exposed_cut_copper_slab", + "expwaxccopsl": "waxed_exposed_cut_copper_slab", + "expwaxccopslab": "waxed_exposed_cut_copper_slab", + "expwaxccopstep": "waxed_exposed_cut_copper_slab", + "expwaxccosl": "waxed_exposed_cut_copper_slab", + "expwaxccoslab": "waxed_exposed_cut_copper_slab", + "expwaxccostep": "waxed_exposed_cut_copper_slab", + "expwaxcutcohalfblock": "waxed_exposed_cut_copper_slab", + "expwaxcutcophalfblock": "waxed_exposed_cut_copper_slab", + "expwaxcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "expwaxcutcoppersl": "waxed_exposed_cut_copper_slab", + "expwaxcutcopperslab": "waxed_exposed_cut_copper_slab", + "expwaxcutcopperstep": "waxed_exposed_cut_copper_slab", + "expwaxcutcopsl": "waxed_exposed_cut_copper_slab", + "expwaxcutcopslab": "waxed_exposed_cut_copper_slab", + "expwaxcutcopstep": "waxed_exposed_cut_copper_slab", + "expwaxcutcosl": "waxed_exposed_cut_copper_slab", + "expwaxcutcoslab": "waxed_exposed_cut_copper_slab", + "expwaxcutcostep": "waxed_exposed_cut_copper_slab", + "expwaxedccohalfblock": "waxed_exposed_cut_copper_slab", + "expwaxedccophalfblock": "waxed_exposed_cut_copper_slab", + "expwaxedccopperhalfblock": "waxed_exposed_cut_copper_slab", + "expwaxedccoppersl": "waxed_exposed_cut_copper_slab", + "expwaxedccopperslab": "waxed_exposed_cut_copper_slab", + "expwaxedccopperstep": "waxed_exposed_cut_copper_slab", + "expwaxedccopsl": "waxed_exposed_cut_copper_slab", + "expwaxedccopslab": "waxed_exposed_cut_copper_slab", + "expwaxedccopstep": "waxed_exposed_cut_copper_slab", + "expwaxedccosl": "waxed_exposed_cut_copper_slab", + "expwaxedccoslab": "waxed_exposed_cut_copper_slab", + "expwaxedccostep": "waxed_exposed_cut_copper_slab", + "expwaxedcutcohalfblock": "waxed_exposed_cut_copper_slab", + "expwaxedcutcophalfblock": "waxed_exposed_cut_copper_slab", + "expwaxedcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "expwaxedcutcoppersl": "waxed_exposed_cut_copper_slab", + "expwaxedcutcopperslab": "waxed_exposed_cut_copper_slab", + "expwaxedcutcopperstep": "waxed_exposed_cut_copper_slab", + "expwaxedcutcopsl": "waxed_exposed_cut_copper_slab", + "expwaxedcutcopslab": "waxed_exposed_cut_copper_slab", + "expwaxedcutcopstep": "waxed_exposed_cut_copper_slab", + "expwaxedcutcosl": "waxed_exposed_cut_copper_slab", + "expwaxedcutcoslab": "waxed_exposed_cut_copper_slab", + "expwaxedcutcostep": "waxed_exposed_cut_copper_slab", + "exwaccohalfblock": "waxed_exposed_cut_copper_slab", + "exwaccophalfblock": "waxed_exposed_cut_copper_slab", + "exwaccopperhalfblock": "waxed_exposed_cut_copper_slab", + "exwaccoppersl": "waxed_exposed_cut_copper_slab", + "exwaccopperslab": "waxed_exposed_cut_copper_slab", + "exwaccopperstep": "waxed_exposed_cut_copper_slab", + "exwaccopsl": "waxed_exposed_cut_copper_slab", + "exwaccopslab": "waxed_exposed_cut_copper_slab", + "exwaccopstep": "waxed_exposed_cut_copper_slab", + "exwaccosl": "waxed_exposed_cut_copper_slab", + "exwaccoslab": "waxed_exposed_cut_copper_slab", + "exwaccostep": "waxed_exposed_cut_copper_slab", + "exwacutcohalfblock": "waxed_exposed_cut_copper_slab", + "exwacutcophalfblock": "waxed_exposed_cut_copper_slab", + "exwacutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "exwacutcoppersl": "waxed_exposed_cut_copper_slab", + "exwacutcopperslab": "waxed_exposed_cut_copper_slab", + "exwacutcopperstep": "waxed_exposed_cut_copper_slab", + "exwacutcopsl": "waxed_exposed_cut_copper_slab", + "exwacutcopslab": "waxed_exposed_cut_copper_slab", + "exwacutcopstep": "waxed_exposed_cut_copper_slab", + "exwacutcosl": "waxed_exposed_cut_copper_slab", + "exwacutcoslab": "waxed_exposed_cut_copper_slab", + "exwacutcostep": "waxed_exposed_cut_copper_slab", + "exwaxccohalfblock": "waxed_exposed_cut_copper_slab", + "exwaxccophalfblock": "waxed_exposed_cut_copper_slab", + "exwaxccopperhalfblock": "waxed_exposed_cut_copper_slab", + "exwaxccoppersl": "waxed_exposed_cut_copper_slab", + "exwaxccopperslab": "waxed_exposed_cut_copper_slab", + "exwaxccopperstep": "waxed_exposed_cut_copper_slab", + "exwaxccopsl": "waxed_exposed_cut_copper_slab", + "exwaxccopslab": "waxed_exposed_cut_copper_slab", + "exwaxccopstep": "waxed_exposed_cut_copper_slab", + "exwaxccosl": "waxed_exposed_cut_copper_slab", + "exwaxccoslab": "waxed_exposed_cut_copper_slab", + "exwaxccostep": "waxed_exposed_cut_copper_slab", + "exwaxcutcohalfblock": "waxed_exposed_cut_copper_slab", + "exwaxcutcophalfblock": "waxed_exposed_cut_copper_slab", + "exwaxcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "exwaxcutcoppersl": "waxed_exposed_cut_copper_slab", + "exwaxcutcopperslab": "waxed_exposed_cut_copper_slab", + "exwaxcutcopperstep": "waxed_exposed_cut_copper_slab", + "exwaxcutcopsl": "waxed_exposed_cut_copper_slab", + "exwaxcutcopslab": "waxed_exposed_cut_copper_slab", + "exwaxcutcopstep": "waxed_exposed_cut_copper_slab", + "exwaxcutcosl": "waxed_exposed_cut_copper_slab", + "exwaxcutcoslab": "waxed_exposed_cut_copper_slab", + "exwaxcutcostep": "waxed_exposed_cut_copper_slab", + "exwaxedccohalfblock": "waxed_exposed_cut_copper_slab", + "exwaxedccophalfblock": "waxed_exposed_cut_copper_slab", + "exwaxedccopperhalfblock": "waxed_exposed_cut_copper_slab", + "exwaxedccoppersl": "waxed_exposed_cut_copper_slab", + "exwaxedccopperslab": "waxed_exposed_cut_copper_slab", + "exwaxedccopperstep": "waxed_exposed_cut_copper_slab", + "exwaxedccopsl": "waxed_exposed_cut_copper_slab", + "exwaxedccopslab": "waxed_exposed_cut_copper_slab", + "exwaxedccopstep": "waxed_exposed_cut_copper_slab", + "exwaxedccosl": "waxed_exposed_cut_copper_slab", + "exwaxedccoslab": "waxed_exposed_cut_copper_slab", + "exwaxedccostep": "waxed_exposed_cut_copper_slab", + "exwaxedcutcohalfblock": "waxed_exposed_cut_copper_slab", + "exwaxedcutcophalfblock": "waxed_exposed_cut_copper_slab", + "exwaxedcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "exwaxedcutcoppersl": "waxed_exposed_cut_copper_slab", + "exwaxedcutcopperslab": "waxed_exposed_cut_copper_slab", + "exwaxedcutcopperstep": "waxed_exposed_cut_copper_slab", + "exwaxedcutcopsl": "waxed_exposed_cut_copper_slab", + "exwaxedcutcopslab": "waxed_exposed_cut_copper_slab", + "exwaxedcutcopstep": "waxed_exposed_cut_copper_slab", + "exwaxedcutcosl": "waxed_exposed_cut_copper_slab", + "exwaxedcutcoslab": "waxed_exposed_cut_copper_slab", + "exwaxedcutcostep": "waxed_exposed_cut_copper_slab", + "minecraft:waxed_exposed_cut_copper_slab": "waxed_exposed_cut_copper_slab", + "wacexcohalfblock": "waxed_exposed_cut_copper_slab", + "wacexcophalfblock": "waxed_exposed_cut_copper_slab", + "wacexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "wacexcoppersl": "waxed_exposed_cut_copper_slab", + "wacexcopperslab": "waxed_exposed_cut_copper_slab", + "wacexcopperstep": "waxed_exposed_cut_copper_slab", + "wacexcopsl": "waxed_exposed_cut_copper_slab", + "wacexcopslab": "waxed_exposed_cut_copper_slab", + "wacexcopstep": "waxed_exposed_cut_copper_slab", + "wacexcosl": "waxed_exposed_cut_copper_slab", + "wacexcoslab": "waxed_exposed_cut_copper_slab", + "wacexcostep": "waxed_exposed_cut_copper_slab", + "wacexpcohalfblock": "waxed_exposed_cut_copper_slab", + "wacexpcophalfblock": "waxed_exposed_cut_copper_slab", + "wacexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "wacexpcoppersl": "waxed_exposed_cut_copper_slab", + "wacexpcopperslab": "waxed_exposed_cut_copper_slab", + "wacexpcopperstep": "waxed_exposed_cut_copper_slab", + "wacexpcopsl": "waxed_exposed_cut_copper_slab", + "wacexpcopslab": "waxed_exposed_cut_copper_slab", + "wacexpcopstep": "waxed_exposed_cut_copper_slab", + "wacexpcosl": "waxed_exposed_cut_copper_slab", + "wacexpcoslab": "waxed_exposed_cut_copper_slab", + "wacexpcostep": "waxed_exposed_cut_copper_slab", + "wacexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "wacexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "wacexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "wacexposedcoppersl": "waxed_exposed_cut_copper_slab", + "wacexposedcopperslab": "waxed_exposed_cut_copper_slab", + "wacexposedcopperstep": "waxed_exposed_cut_copper_slab", + "wacexposedcopsl": "waxed_exposed_cut_copper_slab", + "wacexposedcopslab": "waxed_exposed_cut_copper_slab", + "wacexposedcopstep": "waxed_exposed_cut_copper_slab", + "wacexposedcosl": "waxed_exposed_cut_copper_slab", + "wacexposedcoslab": "waxed_exposed_cut_copper_slab", + "wacexposedcostep": "waxed_exposed_cut_copper_slab", + "wacutexcohalfblock": "waxed_exposed_cut_copper_slab", + "wacutexcophalfblock": "waxed_exposed_cut_copper_slab", + "wacutexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "wacutexcoppersl": "waxed_exposed_cut_copper_slab", + "wacutexcopperslab": "waxed_exposed_cut_copper_slab", + "wacutexcopperstep": "waxed_exposed_cut_copper_slab", + "wacutexcopsl": "waxed_exposed_cut_copper_slab", + "wacutexcopslab": "waxed_exposed_cut_copper_slab", + "wacutexcopstep": "waxed_exposed_cut_copper_slab", + "wacutexcosl": "waxed_exposed_cut_copper_slab", + "wacutexcoslab": "waxed_exposed_cut_copper_slab", + "wacutexcostep": "waxed_exposed_cut_copper_slab", + "wacutexpcohalfblock": "waxed_exposed_cut_copper_slab", + "wacutexpcophalfblock": "waxed_exposed_cut_copper_slab", + "wacutexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "wacutexpcoppersl": "waxed_exposed_cut_copper_slab", + "wacutexpcopperslab": "waxed_exposed_cut_copper_slab", + "wacutexpcopperstep": "waxed_exposed_cut_copper_slab", + "wacutexpcopsl": "waxed_exposed_cut_copper_slab", + "wacutexpcopslab": "waxed_exposed_cut_copper_slab", + "wacutexpcopstep": "waxed_exposed_cut_copper_slab", + "wacutexpcosl": "waxed_exposed_cut_copper_slab", + "wacutexpcoslab": "waxed_exposed_cut_copper_slab", + "wacutexpcostep": "waxed_exposed_cut_copper_slab", + "wacutexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "wacutexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "wacutexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "wacutexposedcoppersl": "waxed_exposed_cut_copper_slab", + "wacutexposedcopperslab": "waxed_exposed_cut_copper_slab", + "wacutexposedcopperstep": "waxed_exposed_cut_copper_slab", + "wacutexposedcopsl": "waxed_exposed_cut_copper_slab", + "wacutexposedcopslab": "waxed_exposed_cut_copper_slab", + "wacutexposedcopstep": "waxed_exposed_cut_copper_slab", + "wacutexposedcosl": "waxed_exposed_cut_copper_slab", + "wacutexposedcoslab": "waxed_exposed_cut_copper_slab", + "wacutexposedcostep": "waxed_exposed_cut_copper_slab", + "waexccohalfblock": "waxed_exposed_cut_copper_slab", + "waexccophalfblock": "waxed_exposed_cut_copper_slab", + "waexccopperhalfblock": "waxed_exposed_cut_copper_slab", + "waexccoppersl": "waxed_exposed_cut_copper_slab", + "waexccopperslab": "waxed_exposed_cut_copper_slab", + "waexccopperstep": "waxed_exposed_cut_copper_slab", + "waexccopsl": "waxed_exposed_cut_copper_slab", + "waexccopslab": "waxed_exposed_cut_copper_slab", + "waexccopstep": "waxed_exposed_cut_copper_slab", + "waexccosl": "waxed_exposed_cut_copper_slab", + "waexccoslab": "waxed_exposed_cut_copper_slab", + "waexccostep": "waxed_exposed_cut_copper_slab", + "waexcutcohalfblock": "waxed_exposed_cut_copper_slab", + "waexcutcophalfblock": "waxed_exposed_cut_copper_slab", + "waexcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waexcutcoppersl": "waxed_exposed_cut_copper_slab", + "waexcutcopperslab": "waxed_exposed_cut_copper_slab", + "waexcutcopperstep": "waxed_exposed_cut_copper_slab", + "waexcutcopsl": "waxed_exposed_cut_copper_slab", + "waexcutcopslab": "waxed_exposed_cut_copper_slab", + "waexcutcopstep": "waxed_exposed_cut_copper_slab", + "waexcutcosl": "waxed_exposed_cut_copper_slab", + "waexcutcoslab": "waxed_exposed_cut_copper_slab", + "waexcutcostep": "waxed_exposed_cut_copper_slab", + "waexpccohalfblock": "waxed_exposed_cut_copper_slab", + "waexpccophalfblock": "waxed_exposed_cut_copper_slab", + "waexpccopperhalfblock": "waxed_exposed_cut_copper_slab", + "waexpccoppersl": "waxed_exposed_cut_copper_slab", + "waexpccopperslab": "waxed_exposed_cut_copper_slab", + "waexpccopperstep": "waxed_exposed_cut_copper_slab", + "waexpccopsl": "waxed_exposed_cut_copper_slab", + "waexpccopslab": "waxed_exposed_cut_copper_slab", + "waexpccopstep": "waxed_exposed_cut_copper_slab", + "waexpccosl": "waxed_exposed_cut_copper_slab", + "waexpccoslab": "waxed_exposed_cut_copper_slab", + "waexpccostep": "waxed_exposed_cut_copper_slab", + "waexpcutcohalfblock": "waxed_exposed_cut_copper_slab", + "waexpcutcophalfblock": "waxed_exposed_cut_copper_slab", + "waexpcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waexpcutcoppersl": "waxed_exposed_cut_copper_slab", + "waexpcutcopperslab": "waxed_exposed_cut_copper_slab", + "waexpcutcopperstep": "waxed_exposed_cut_copper_slab", + "waexpcutcopsl": "waxed_exposed_cut_copper_slab", + "waexpcutcopslab": "waxed_exposed_cut_copper_slab", + "waexpcutcopstep": "waxed_exposed_cut_copper_slab", + "waexpcutcosl": "waxed_exposed_cut_copper_slab", + "waexpcutcoslab": "waxed_exposed_cut_copper_slab", + "waexpcutcostep": "waxed_exposed_cut_copper_slab", + "waexposedccohalfblock": "waxed_exposed_cut_copper_slab", + "waexposedccophalfblock": "waxed_exposed_cut_copper_slab", + "waexposedccopperhalfblock": "waxed_exposed_cut_copper_slab", + "waexposedccoppersl": "waxed_exposed_cut_copper_slab", + "waexposedccopperslab": "waxed_exposed_cut_copper_slab", + "waexposedccopperstep": "waxed_exposed_cut_copper_slab", + "waexposedccopsl": "waxed_exposed_cut_copper_slab", + "waexposedccopslab": "waxed_exposed_cut_copper_slab", + "waexposedccopstep": "waxed_exposed_cut_copper_slab", + "waexposedccosl": "waxed_exposed_cut_copper_slab", + "waexposedccoslab": "waxed_exposed_cut_copper_slab", + "waexposedccostep": "waxed_exposed_cut_copper_slab", + "waexposedcutcohalfblock": "waxed_exposed_cut_copper_slab", + "waexposedcutcophalfblock": "waxed_exposed_cut_copper_slab", + "waexposedcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waexposedcutcoppersl": "waxed_exposed_cut_copper_slab", + "waexposedcutcopperslab": "waxed_exposed_cut_copper_slab", + "waexposedcutcopperstep": "waxed_exposed_cut_copper_slab", + "waexposedcutcopsl": "waxed_exposed_cut_copper_slab", + "waexposedcutcopslab": "waxed_exposed_cut_copper_slab", + "waexposedcutcopstep": "waxed_exposed_cut_copper_slab", + "waexposedcutcosl": "waxed_exposed_cut_copper_slab", + "waexposedcutcoslab": "waxed_exposed_cut_copper_slab", + "waexposedcutcostep": "waxed_exposed_cut_copper_slab", + "waxcexcohalfblock": "waxed_exposed_cut_copper_slab", + "waxcexcophalfblock": "waxed_exposed_cut_copper_slab", + "waxcexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxcexcoppersl": "waxed_exposed_cut_copper_slab", + "waxcexcopperslab": "waxed_exposed_cut_copper_slab", + "waxcexcopperstep": "waxed_exposed_cut_copper_slab", + "waxcexcopsl": "waxed_exposed_cut_copper_slab", + "waxcexcopslab": "waxed_exposed_cut_copper_slab", + "waxcexcopstep": "waxed_exposed_cut_copper_slab", + "waxcexcosl": "waxed_exposed_cut_copper_slab", + "waxcexcoslab": "waxed_exposed_cut_copper_slab", + "waxcexcostep": "waxed_exposed_cut_copper_slab", + "waxcexpcohalfblock": "waxed_exposed_cut_copper_slab", + "waxcexpcophalfblock": "waxed_exposed_cut_copper_slab", + "waxcexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxcexpcoppersl": "waxed_exposed_cut_copper_slab", + "waxcexpcopperslab": "waxed_exposed_cut_copper_slab", + "waxcexpcopperstep": "waxed_exposed_cut_copper_slab", + "waxcexpcopsl": "waxed_exposed_cut_copper_slab", + "waxcexpcopslab": "waxed_exposed_cut_copper_slab", + "waxcexpcopstep": "waxed_exposed_cut_copper_slab", + "waxcexpcosl": "waxed_exposed_cut_copper_slab", + "waxcexpcoslab": "waxed_exposed_cut_copper_slab", + "waxcexpcostep": "waxed_exposed_cut_copper_slab", + "waxcexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "waxcexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "waxcexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxcexposedcoppersl": "waxed_exposed_cut_copper_slab", + "waxcexposedcopperslab": "waxed_exposed_cut_copper_slab", + "waxcexposedcopperstep": "waxed_exposed_cut_copper_slab", + "waxcexposedcopsl": "waxed_exposed_cut_copper_slab", + "waxcexposedcopslab": "waxed_exposed_cut_copper_slab", + "waxcexposedcopstep": "waxed_exposed_cut_copper_slab", + "waxcexposedcosl": "waxed_exposed_cut_copper_slab", + "waxcexposedcoslab": "waxed_exposed_cut_copper_slab", + "waxcexposedcostep": "waxed_exposed_cut_copper_slab", + "waxcutexcohalfblock": "waxed_exposed_cut_copper_slab", + "waxcutexcophalfblock": "waxed_exposed_cut_copper_slab", + "waxcutexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxcutexcoppersl": "waxed_exposed_cut_copper_slab", + "waxcutexcopperslab": "waxed_exposed_cut_copper_slab", + "waxcutexcopperstep": "waxed_exposed_cut_copper_slab", + "waxcutexcopsl": "waxed_exposed_cut_copper_slab", + "waxcutexcopslab": "waxed_exposed_cut_copper_slab", + "waxcutexcopstep": "waxed_exposed_cut_copper_slab", + "waxcutexcosl": "waxed_exposed_cut_copper_slab", + "waxcutexcoslab": "waxed_exposed_cut_copper_slab", + "waxcutexcostep": "waxed_exposed_cut_copper_slab", + "waxcutexpcohalfblock": "waxed_exposed_cut_copper_slab", + "waxcutexpcophalfblock": "waxed_exposed_cut_copper_slab", + "waxcutexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxcutexpcoppersl": "waxed_exposed_cut_copper_slab", + "waxcutexpcopperslab": "waxed_exposed_cut_copper_slab", + "waxcutexpcopperstep": "waxed_exposed_cut_copper_slab", + "waxcutexpcopsl": "waxed_exposed_cut_copper_slab", + "waxcutexpcopslab": "waxed_exposed_cut_copper_slab", + "waxcutexpcopstep": "waxed_exposed_cut_copper_slab", + "waxcutexpcosl": "waxed_exposed_cut_copper_slab", + "waxcutexpcoslab": "waxed_exposed_cut_copper_slab", + "waxcutexpcostep": "waxed_exposed_cut_copper_slab", + "waxcutexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "waxcutexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "waxcutexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxcutexposedcoppersl": "waxed_exposed_cut_copper_slab", + "waxcutexposedcopperslab": "waxed_exposed_cut_copper_slab", + "waxcutexposedcopperstep": "waxed_exposed_cut_copper_slab", + "waxcutexposedcopsl": "waxed_exposed_cut_copper_slab", + "waxcutexposedcopslab": "waxed_exposed_cut_copper_slab", + "waxcutexposedcopstep": "waxed_exposed_cut_copper_slab", + "waxcutexposedcosl": "waxed_exposed_cut_copper_slab", + "waxcutexposedcoslab": "waxed_exposed_cut_copper_slab", + "waxcutexposedcostep": "waxed_exposed_cut_copper_slab", + "waxedcexcohalfblock": "waxed_exposed_cut_copper_slab", + "waxedcexcophalfblock": "waxed_exposed_cut_copper_slab", + "waxedcexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedcexcoppersl": "waxed_exposed_cut_copper_slab", + "waxedcexcopperslab": "waxed_exposed_cut_copper_slab", + "waxedcexcopperstep": "waxed_exposed_cut_copper_slab", + "waxedcexcopsl": "waxed_exposed_cut_copper_slab", + "waxedcexcopslab": "waxed_exposed_cut_copper_slab", + "waxedcexcopstep": "waxed_exposed_cut_copper_slab", + "waxedcexcosl": "waxed_exposed_cut_copper_slab", + "waxedcexcoslab": "waxed_exposed_cut_copper_slab", + "waxedcexcostep": "waxed_exposed_cut_copper_slab", + "waxedcexpcohalfblock": "waxed_exposed_cut_copper_slab", + "waxedcexpcophalfblock": "waxed_exposed_cut_copper_slab", + "waxedcexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedcexpcoppersl": "waxed_exposed_cut_copper_slab", + "waxedcexpcopperslab": "waxed_exposed_cut_copper_slab", + "waxedcexpcopperstep": "waxed_exposed_cut_copper_slab", + "waxedcexpcopsl": "waxed_exposed_cut_copper_slab", + "waxedcexpcopslab": "waxed_exposed_cut_copper_slab", + "waxedcexpcopstep": "waxed_exposed_cut_copper_slab", + "waxedcexpcosl": "waxed_exposed_cut_copper_slab", + "waxedcexpcoslab": "waxed_exposed_cut_copper_slab", + "waxedcexpcostep": "waxed_exposed_cut_copper_slab", + "waxedcexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "waxedcexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "waxedcexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedcexposedcoppersl": "waxed_exposed_cut_copper_slab", + "waxedcexposedcopperslab": "waxed_exposed_cut_copper_slab", + "waxedcexposedcopperstep": "waxed_exposed_cut_copper_slab", + "waxedcexposedcopsl": "waxed_exposed_cut_copper_slab", + "waxedcexposedcopslab": "waxed_exposed_cut_copper_slab", + "waxedcexposedcopstep": "waxed_exposed_cut_copper_slab", + "waxedcexposedcosl": "waxed_exposed_cut_copper_slab", + "waxedcexposedcoslab": "waxed_exposed_cut_copper_slab", + "waxedcexposedcostep": "waxed_exposed_cut_copper_slab", + "waxedcutexcohalfblock": "waxed_exposed_cut_copper_slab", + "waxedcutexcophalfblock": "waxed_exposed_cut_copper_slab", + "waxedcutexcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedcutexcoppersl": "waxed_exposed_cut_copper_slab", + "waxedcutexcopperslab": "waxed_exposed_cut_copper_slab", + "waxedcutexcopperstep": "waxed_exposed_cut_copper_slab", + "waxedcutexcopsl": "waxed_exposed_cut_copper_slab", + "waxedcutexcopslab": "waxed_exposed_cut_copper_slab", + "waxedcutexcopstep": "waxed_exposed_cut_copper_slab", + "waxedcutexcosl": "waxed_exposed_cut_copper_slab", + "waxedcutexcoslab": "waxed_exposed_cut_copper_slab", + "waxedcutexcostep": "waxed_exposed_cut_copper_slab", + "waxedcutexpcohalfblock": "waxed_exposed_cut_copper_slab", + "waxedcutexpcophalfblock": "waxed_exposed_cut_copper_slab", + "waxedcutexpcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedcutexpcoppersl": "waxed_exposed_cut_copper_slab", + "waxedcutexpcopperslab": "waxed_exposed_cut_copper_slab", + "waxedcutexpcopperstep": "waxed_exposed_cut_copper_slab", + "waxedcutexpcopsl": "waxed_exposed_cut_copper_slab", + "waxedcutexpcopslab": "waxed_exposed_cut_copper_slab", + "waxedcutexpcopstep": "waxed_exposed_cut_copper_slab", + "waxedcutexpcosl": "waxed_exposed_cut_copper_slab", + "waxedcutexpcoslab": "waxed_exposed_cut_copper_slab", + "waxedcutexpcostep": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcohalfblock": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcophalfblock": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcoppersl": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcopperslab": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcopperstep": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcopsl": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcopslab": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcopstep": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcosl": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcoslab": "waxed_exposed_cut_copper_slab", + "waxedcutexposedcostep": "waxed_exposed_cut_copper_slab", + "waxedexccohalfblock": "waxed_exposed_cut_copper_slab", + "waxedexccophalfblock": "waxed_exposed_cut_copper_slab", + "waxedexccopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedexccoppersl": "waxed_exposed_cut_copper_slab", + "waxedexccopperslab": "waxed_exposed_cut_copper_slab", + "waxedexccopperstep": "waxed_exposed_cut_copper_slab", + "waxedexccopsl": "waxed_exposed_cut_copper_slab", + "waxedexccopslab": "waxed_exposed_cut_copper_slab", + "waxedexccopstep": "waxed_exposed_cut_copper_slab", + "waxedexccosl": "waxed_exposed_cut_copper_slab", + "waxedexccoslab": "waxed_exposed_cut_copper_slab", + "waxedexccostep": "waxed_exposed_cut_copper_slab", + "waxedexcutcohalfblock": "waxed_exposed_cut_copper_slab", + "waxedexcutcophalfblock": "waxed_exposed_cut_copper_slab", + "waxedexcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedexcutcoppersl": "waxed_exposed_cut_copper_slab", + "waxedexcutcopperslab": "waxed_exposed_cut_copper_slab", + "waxedexcutcopperstep": "waxed_exposed_cut_copper_slab", + "waxedexcutcopsl": "waxed_exposed_cut_copper_slab", + "waxedexcutcopslab": "waxed_exposed_cut_copper_slab", + "waxedexcutcopstep": "waxed_exposed_cut_copper_slab", + "waxedexcutcosl": "waxed_exposed_cut_copper_slab", + "waxedexcutcoslab": "waxed_exposed_cut_copper_slab", + "waxedexcutcostep": "waxed_exposed_cut_copper_slab", + "waxedexpccohalfblock": "waxed_exposed_cut_copper_slab", + "waxedexpccophalfblock": "waxed_exposed_cut_copper_slab", + "waxedexpccopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedexpccoppersl": "waxed_exposed_cut_copper_slab", + "waxedexpccopperslab": "waxed_exposed_cut_copper_slab", + "waxedexpccopperstep": "waxed_exposed_cut_copper_slab", + "waxedexpccopsl": "waxed_exposed_cut_copper_slab", + "waxedexpccopslab": "waxed_exposed_cut_copper_slab", + "waxedexpccopstep": "waxed_exposed_cut_copper_slab", + "waxedexpccosl": "waxed_exposed_cut_copper_slab", + "waxedexpccoslab": "waxed_exposed_cut_copper_slab", + "waxedexpccostep": "waxed_exposed_cut_copper_slab", + "waxedexpcutcohalfblock": "waxed_exposed_cut_copper_slab", + "waxedexpcutcophalfblock": "waxed_exposed_cut_copper_slab", + "waxedexpcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedexpcutcoppersl": "waxed_exposed_cut_copper_slab", + "waxedexpcutcopperslab": "waxed_exposed_cut_copper_slab", + "waxedexpcutcopperstep": "waxed_exposed_cut_copper_slab", + "waxedexpcutcopsl": "waxed_exposed_cut_copper_slab", + "waxedexpcutcopslab": "waxed_exposed_cut_copper_slab", + "waxedexpcutcopstep": "waxed_exposed_cut_copper_slab", + "waxedexpcutcosl": "waxed_exposed_cut_copper_slab", + "waxedexpcutcoslab": "waxed_exposed_cut_copper_slab", + "waxedexpcutcostep": "waxed_exposed_cut_copper_slab", + "waxedexposedccohalfblock": "waxed_exposed_cut_copper_slab", + "waxedexposedccophalfblock": "waxed_exposed_cut_copper_slab", + "waxedexposedccopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedexposedccoppersl": "waxed_exposed_cut_copper_slab", + "waxedexposedccopperslab": "waxed_exposed_cut_copper_slab", + "waxedexposedccopperstep": "waxed_exposed_cut_copper_slab", + "waxedexposedccopsl": "waxed_exposed_cut_copper_slab", + "waxedexposedccopslab": "waxed_exposed_cut_copper_slab", + "waxedexposedccopstep": "waxed_exposed_cut_copper_slab", + "waxedexposedccosl": "waxed_exposed_cut_copper_slab", + "waxedexposedccoslab": "waxed_exposed_cut_copper_slab", + "waxedexposedccostep": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcohalfblock": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcophalfblock": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcoppersl": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcopperslab": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcopperstep": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcopsl": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcopslab": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcopstep": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcosl": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcoslab": "waxed_exposed_cut_copper_slab", + "waxedexposedcutcostep": "waxed_exposed_cut_copper_slab", + "waxexccohalfblock": "waxed_exposed_cut_copper_slab", + "waxexccophalfblock": "waxed_exposed_cut_copper_slab", + "waxexccopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxexccoppersl": "waxed_exposed_cut_copper_slab", + "waxexccopperslab": "waxed_exposed_cut_copper_slab", + "waxexccopperstep": "waxed_exposed_cut_copper_slab", + "waxexccopsl": "waxed_exposed_cut_copper_slab", + "waxexccopslab": "waxed_exposed_cut_copper_slab", + "waxexccopstep": "waxed_exposed_cut_copper_slab", + "waxexccosl": "waxed_exposed_cut_copper_slab", + "waxexccoslab": "waxed_exposed_cut_copper_slab", + "waxexccostep": "waxed_exposed_cut_copper_slab", + "waxexcutcohalfblock": "waxed_exposed_cut_copper_slab", + "waxexcutcophalfblock": "waxed_exposed_cut_copper_slab", + "waxexcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxexcutcoppersl": "waxed_exposed_cut_copper_slab", + "waxexcutcopperslab": "waxed_exposed_cut_copper_slab", + "waxexcutcopperstep": "waxed_exposed_cut_copper_slab", + "waxexcutcopsl": "waxed_exposed_cut_copper_slab", + "waxexcutcopslab": "waxed_exposed_cut_copper_slab", + "waxexcutcopstep": "waxed_exposed_cut_copper_slab", + "waxexcutcosl": "waxed_exposed_cut_copper_slab", + "waxexcutcoslab": "waxed_exposed_cut_copper_slab", + "waxexcutcostep": "waxed_exposed_cut_copper_slab", + "waxexpccohalfblock": "waxed_exposed_cut_copper_slab", + "waxexpccophalfblock": "waxed_exposed_cut_copper_slab", + "waxexpccopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxexpccoppersl": "waxed_exposed_cut_copper_slab", + "waxexpccopperslab": "waxed_exposed_cut_copper_slab", + "waxexpccopperstep": "waxed_exposed_cut_copper_slab", + "waxexpccopsl": "waxed_exposed_cut_copper_slab", + "waxexpccopslab": "waxed_exposed_cut_copper_slab", + "waxexpccopstep": "waxed_exposed_cut_copper_slab", + "waxexpccosl": "waxed_exposed_cut_copper_slab", + "waxexpccoslab": "waxed_exposed_cut_copper_slab", + "waxexpccostep": "waxed_exposed_cut_copper_slab", + "waxexpcutcohalfblock": "waxed_exposed_cut_copper_slab", + "waxexpcutcophalfblock": "waxed_exposed_cut_copper_slab", + "waxexpcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxexpcutcoppersl": "waxed_exposed_cut_copper_slab", + "waxexpcutcopperslab": "waxed_exposed_cut_copper_slab", + "waxexpcutcopperstep": "waxed_exposed_cut_copper_slab", + "waxexpcutcopsl": "waxed_exposed_cut_copper_slab", + "waxexpcutcopslab": "waxed_exposed_cut_copper_slab", + "waxexpcutcopstep": "waxed_exposed_cut_copper_slab", + "waxexpcutcosl": "waxed_exposed_cut_copper_slab", + "waxexpcutcoslab": "waxed_exposed_cut_copper_slab", + "waxexpcutcostep": "waxed_exposed_cut_copper_slab", + "waxexposedccohalfblock": "waxed_exposed_cut_copper_slab", + "waxexposedccophalfblock": "waxed_exposed_cut_copper_slab", + "waxexposedccopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxexposedccoppersl": "waxed_exposed_cut_copper_slab", + "waxexposedccopperslab": "waxed_exposed_cut_copper_slab", + "waxexposedccopperstep": "waxed_exposed_cut_copper_slab", + "waxexposedccopsl": "waxed_exposed_cut_copper_slab", + "waxexposedccopslab": "waxed_exposed_cut_copper_slab", + "waxexposedccopstep": "waxed_exposed_cut_copper_slab", + "waxexposedccosl": "waxed_exposed_cut_copper_slab", + "waxexposedccoslab": "waxed_exposed_cut_copper_slab", + "waxexposedccostep": "waxed_exposed_cut_copper_slab", + "waxexposedcutcohalfblock": "waxed_exposed_cut_copper_slab", + "waxexposedcutcophalfblock": "waxed_exposed_cut_copper_slab", + "waxexposedcutcopperhalfblock": "waxed_exposed_cut_copper_slab", + "waxexposedcutcoppersl": "waxed_exposed_cut_copper_slab", + "waxexposedcutcopperslab": "waxed_exposed_cut_copper_slab", + "waxexposedcutcopperstep": "waxed_exposed_cut_copper_slab", + "waxexposedcutcopsl": "waxed_exposed_cut_copper_slab", + "waxexposedcutcopslab": "waxed_exposed_cut_copper_slab", + "waxexposedcutcopstep": "waxed_exposed_cut_copper_slab", + "waxexposedcutcosl": "waxed_exposed_cut_copper_slab", + "waxexposedcutcoslab": "waxed_exposed_cut_copper_slab", + "waxexposedcutcostep": "waxed_exposed_cut_copper_slab", + "waxed_exposed_cut_copper_stairs": { + "material": "WAXED_EXPOSED_CUT_COPPER_STAIRS" + }, + "cexposedwacopperstair": "waxed_exposed_cut_copper_stairs", + "cexposedwacopperstairs": "waxed_exposed_cut_copper_stairs", + "cexposedwacopstair": "waxed_exposed_cut_copper_stairs", + "cexposedwacopstairs": "waxed_exposed_cut_copper_stairs", + "cexposedwacostair": "waxed_exposed_cut_copper_stairs", + "cexposedwacostairs": "waxed_exposed_cut_copper_stairs", + "cexposedwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "cexposedwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "cexposedwaxcopstair": "waxed_exposed_cut_copper_stairs", + "cexposedwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "cexposedwaxcostair": "waxed_exposed_cut_copper_stairs", + "cexposedwaxcostairs": "waxed_exposed_cut_copper_stairs", + "cexposedwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "cexposedwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cexposedwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "cexposedwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "cexposedwaxedcostair": "waxed_exposed_cut_copper_stairs", + "cexposedwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "cexpwacopperstair": "waxed_exposed_cut_copper_stairs", + "cexpwacopperstairs": "waxed_exposed_cut_copper_stairs", + "cexpwacopstair": "waxed_exposed_cut_copper_stairs", + "cexpwacopstairs": "waxed_exposed_cut_copper_stairs", + "cexpwacostair": "waxed_exposed_cut_copper_stairs", + "cexpwacostairs": "waxed_exposed_cut_copper_stairs", + "cexpwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "cexpwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "cexpwaxcopstair": "waxed_exposed_cut_copper_stairs", + "cexpwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "cexpwaxcostair": "waxed_exposed_cut_copper_stairs", + "cexpwaxcostairs": "waxed_exposed_cut_copper_stairs", + "cexpwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "cexpwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cexpwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "cexpwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "cexpwaxedcostair": "waxed_exposed_cut_copper_stairs", + "cexpwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "cexwacopperstair": "waxed_exposed_cut_copper_stairs", + "cexwacopperstairs": "waxed_exposed_cut_copper_stairs", + "cexwacopstair": "waxed_exposed_cut_copper_stairs", + "cexwacopstairs": "waxed_exposed_cut_copper_stairs", + "cexwacostair": "waxed_exposed_cut_copper_stairs", + "cexwacostairs": "waxed_exposed_cut_copper_stairs", + "cexwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "cexwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "cexwaxcopstair": "waxed_exposed_cut_copper_stairs", + "cexwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "cexwaxcostair": "waxed_exposed_cut_copper_stairs", + "cexwaxcostairs": "waxed_exposed_cut_copper_stairs", + "cexwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "cexwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cexwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "cexwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "cexwaxedcostair": "waxed_exposed_cut_copper_stairs", + "cexwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "cutexposedwacopperstair": "waxed_exposed_cut_copper_stairs", + "cutexposedwacopperstairs": "waxed_exposed_cut_copper_stairs", + "cutexposedwacopstair": "waxed_exposed_cut_copper_stairs", + "cutexposedwacopstairs": "waxed_exposed_cut_copper_stairs", + "cutexposedwacostair": "waxed_exposed_cut_copper_stairs", + "cutexposedwacostairs": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxcopstair": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxcostair": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxcostairs": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxedcostair": "waxed_exposed_cut_copper_stairs", + "cutexposedwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "cutexpwacopperstair": "waxed_exposed_cut_copper_stairs", + "cutexpwacopperstairs": "waxed_exposed_cut_copper_stairs", + "cutexpwacopstair": "waxed_exposed_cut_copper_stairs", + "cutexpwacopstairs": "waxed_exposed_cut_copper_stairs", + "cutexpwacostair": "waxed_exposed_cut_copper_stairs", + "cutexpwacostairs": "waxed_exposed_cut_copper_stairs", + "cutexpwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "cutexpwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutexpwaxcopstair": "waxed_exposed_cut_copper_stairs", + "cutexpwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "cutexpwaxcostair": "waxed_exposed_cut_copper_stairs", + "cutexpwaxcostairs": "waxed_exposed_cut_copper_stairs", + "cutexpwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "cutexpwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutexpwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "cutexpwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "cutexpwaxedcostair": "waxed_exposed_cut_copper_stairs", + "cutexpwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "cutexwacopperstair": "waxed_exposed_cut_copper_stairs", + "cutexwacopperstairs": "waxed_exposed_cut_copper_stairs", + "cutexwacopstair": "waxed_exposed_cut_copper_stairs", + "cutexwacopstairs": "waxed_exposed_cut_copper_stairs", + "cutexwacostair": "waxed_exposed_cut_copper_stairs", + "cutexwacostairs": "waxed_exposed_cut_copper_stairs", + "cutexwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "cutexwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutexwaxcopstair": "waxed_exposed_cut_copper_stairs", + "cutexwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "cutexwaxcostair": "waxed_exposed_cut_copper_stairs", + "cutexwaxcostairs": "waxed_exposed_cut_copper_stairs", + "cutexwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "cutexwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutexwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "cutexwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "cutexwaxedcostair": "waxed_exposed_cut_copper_stairs", + "cutexwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "cutwaexcopperstair": "waxed_exposed_cut_copper_stairs", + "cutwaexcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutwaexcopstair": "waxed_exposed_cut_copper_stairs", + "cutwaexcopstairs": "waxed_exposed_cut_copper_stairs", + "cutwaexcostair": "waxed_exposed_cut_copper_stairs", + "cutwaexcostairs": "waxed_exposed_cut_copper_stairs", + "cutwaexpcopperstair": "waxed_exposed_cut_copper_stairs", + "cutwaexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutwaexpcopstair": "waxed_exposed_cut_copper_stairs", + "cutwaexpcopstairs": "waxed_exposed_cut_copper_stairs", + "cutwaexpcostair": "waxed_exposed_cut_copper_stairs", + "cutwaexpcostairs": "waxed_exposed_cut_copper_stairs", + "cutwaexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "cutwaexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutwaexposedcopstair": "waxed_exposed_cut_copper_stairs", + "cutwaexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "cutwaexposedcostair": "waxed_exposed_cut_copper_stairs", + "cutwaexposedcostairs": "waxed_exposed_cut_copper_stairs", + "cutwaxedexcopperstair": "waxed_exposed_cut_copper_stairs", + "cutwaxedexcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxedexcopstair": "waxed_exposed_cut_copper_stairs", + "cutwaxedexcopstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxedexcostair": "waxed_exposed_cut_copper_stairs", + "cutwaxedexcostairs": "waxed_exposed_cut_copper_stairs", + "cutwaxedexpcopperstair": "waxed_exposed_cut_copper_stairs", + "cutwaxedexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxedexpcopstair": "waxed_exposed_cut_copper_stairs", + "cutwaxedexpcopstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxedexpcostair": "waxed_exposed_cut_copper_stairs", + "cutwaxedexpcostairs": "waxed_exposed_cut_copper_stairs", + "cutwaxedexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "cutwaxedexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxedexposedcopstair": "waxed_exposed_cut_copper_stairs", + "cutwaxedexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxedexposedcostair": "waxed_exposed_cut_copper_stairs", + "cutwaxedexposedcostairs": "waxed_exposed_cut_copper_stairs", + "cutwaxexcopperstair": "waxed_exposed_cut_copper_stairs", + "cutwaxexcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxexcopstair": "waxed_exposed_cut_copper_stairs", + "cutwaxexcopstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxexcostair": "waxed_exposed_cut_copper_stairs", + "cutwaxexcostairs": "waxed_exposed_cut_copper_stairs", + "cutwaxexpcopperstair": "waxed_exposed_cut_copper_stairs", + "cutwaxexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxexpcopstair": "waxed_exposed_cut_copper_stairs", + "cutwaxexpcopstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxexpcostair": "waxed_exposed_cut_copper_stairs", + "cutwaxexpcostairs": "waxed_exposed_cut_copper_stairs", + "cutwaxexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "cutwaxexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxexposedcopstair": "waxed_exposed_cut_copper_stairs", + "cutwaxexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "cutwaxexposedcostair": "waxed_exposed_cut_copper_stairs", + "cutwaxexposedcostairs": "waxed_exposed_cut_copper_stairs", + "cwaexcopperstair": "waxed_exposed_cut_copper_stairs", + "cwaexcopperstairs": "waxed_exposed_cut_copper_stairs", + "cwaexcopstair": "waxed_exposed_cut_copper_stairs", + "cwaexcopstairs": "waxed_exposed_cut_copper_stairs", + "cwaexcostair": "waxed_exposed_cut_copper_stairs", + "cwaexcostairs": "waxed_exposed_cut_copper_stairs", + "cwaexpcopperstair": "waxed_exposed_cut_copper_stairs", + "cwaexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "cwaexpcopstair": "waxed_exposed_cut_copper_stairs", + "cwaexpcopstairs": "waxed_exposed_cut_copper_stairs", + "cwaexpcostair": "waxed_exposed_cut_copper_stairs", + "cwaexpcostairs": "waxed_exposed_cut_copper_stairs", + "cwaexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "cwaexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cwaexposedcopstair": "waxed_exposed_cut_copper_stairs", + "cwaexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "cwaexposedcostair": "waxed_exposed_cut_copper_stairs", + "cwaexposedcostairs": "waxed_exposed_cut_copper_stairs", + "cwaxedexcopperstair": "waxed_exposed_cut_copper_stairs", + "cwaxedexcopperstairs": "waxed_exposed_cut_copper_stairs", + "cwaxedexcopstair": "waxed_exposed_cut_copper_stairs", + "cwaxedexcopstairs": "waxed_exposed_cut_copper_stairs", + "cwaxedexcostair": "waxed_exposed_cut_copper_stairs", + "cwaxedexcostairs": "waxed_exposed_cut_copper_stairs", + "cwaxedexpcopperstair": "waxed_exposed_cut_copper_stairs", + "cwaxedexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "cwaxedexpcopstair": "waxed_exposed_cut_copper_stairs", + "cwaxedexpcopstairs": "waxed_exposed_cut_copper_stairs", + "cwaxedexpcostair": "waxed_exposed_cut_copper_stairs", + "cwaxedexpcostairs": "waxed_exposed_cut_copper_stairs", + "cwaxedexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "cwaxedexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cwaxedexposedcopstair": "waxed_exposed_cut_copper_stairs", + "cwaxedexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "cwaxedexposedcostair": "waxed_exposed_cut_copper_stairs", + "cwaxedexposedcostairs": "waxed_exposed_cut_copper_stairs", + "cwaxexcopperstair": "waxed_exposed_cut_copper_stairs", + "cwaxexcopperstairs": "waxed_exposed_cut_copper_stairs", + "cwaxexcopstair": "waxed_exposed_cut_copper_stairs", + "cwaxexcopstairs": "waxed_exposed_cut_copper_stairs", + "cwaxexcostair": "waxed_exposed_cut_copper_stairs", + "cwaxexcostairs": "waxed_exposed_cut_copper_stairs", + "cwaxexpcopperstair": "waxed_exposed_cut_copper_stairs", + "cwaxexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "cwaxexpcopstair": "waxed_exposed_cut_copper_stairs", + "cwaxexpcopstairs": "waxed_exposed_cut_copper_stairs", + "cwaxexpcostair": "waxed_exposed_cut_copper_stairs", + "cwaxexpcostairs": "waxed_exposed_cut_copper_stairs", + "cwaxexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "cwaxexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "cwaxexposedcopstair": "waxed_exposed_cut_copper_stairs", + "cwaxexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "cwaxexposedcostair": "waxed_exposed_cut_copper_stairs", + "cwaxexposedcostairs": "waxed_exposed_cut_copper_stairs", + "excutwacopperstair": "waxed_exposed_cut_copper_stairs", + "excutwacopperstairs": "waxed_exposed_cut_copper_stairs", + "excutwacopstair": "waxed_exposed_cut_copper_stairs", + "excutwacopstairs": "waxed_exposed_cut_copper_stairs", + "excutwacostair": "waxed_exposed_cut_copper_stairs", + "excutwacostairs": "waxed_exposed_cut_copper_stairs", + "excutwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "excutwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "excutwaxcopstair": "waxed_exposed_cut_copper_stairs", + "excutwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "excutwaxcostair": "waxed_exposed_cut_copper_stairs", + "excutwaxcostairs": "waxed_exposed_cut_copper_stairs", + "excutwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "excutwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "excutwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "excutwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "excutwaxedcostair": "waxed_exposed_cut_copper_stairs", + "excutwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "excwacopperstair": "waxed_exposed_cut_copper_stairs", + "excwacopperstairs": "waxed_exposed_cut_copper_stairs", + "excwacopstair": "waxed_exposed_cut_copper_stairs", + "excwacopstairs": "waxed_exposed_cut_copper_stairs", + "excwacostair": "waxed_exposed_cut_copper_stairs", + "excwacostairs": "waxed_exposed_cut_copper_stairs", + "excwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "excwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "excwaxcopstair": "waxed_exposed_cut_copper_stairs", + "excwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "excwaxcostair": "waxed_exposed_cut_copper_stairs", + "excwaxcostairs": "waxed_exposed_cut_copper_stairs", + "excwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "excwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "excwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "excwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "excwaxedcostair": "waxed_exposed_cut_copper_stairs", + "excwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "expcutwacopperstair": "waxed_exposed_cut_copper_stairs", + "expcutwacopperstairs": "waxed_exposed_cut_copper_stairs", + "expcutwacopstair": "waxed_exposed_cut_copper_stairs", + "expcutwacopstairs": "waxed_exposed_cut_copper_stairs", + "expcutwacostair": "waxed_exposed_cut_copper_stairs", + "expcutwacostairs": "waxed_exposed_cut_copper_stairs", + "expcutwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "expcutwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "expcutwaxcopstair": "waxed_exposed_cut_copper_stairs", + "expcutwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "expcutwaxcostair": "waxed_exposed_cut_copper_stairs", + "expcutwaxcostairs": "waxed_exposed_cut_copper_stairs", + "expcutwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "expcutwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "expcutwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "expcutwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "expcutwaxedcostair": "waxed_exposed_cut_copper_stairs", + "expcutwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "expcwacopperstair": "waxed_exposed_cut_copper_stairs", + "expcwacopperstairs": "waxed_exposed_cut_copper_stairs", + "expcwacopstair": "waxed_exposed_cut_copper_stairs", + "expcwacopstairs": "waxed_exposed_cut_copper_stairs", + "expcwacostair": "waxed_exposed_cut_copper_stairs", + "expcwacostairs": "waxed_exposed_cut_copper_stairs", + "expcwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "expcwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "expcwaxcopstair": "waxed_exposed_cut_copper_stairs", + "expcwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "expcwaxcostair": "waxed_exposed_cut_copper_stairs", + "expcwaxcostairs": "waxed_exposed_cut_copper_stairs", + "expcwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "expcwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "expcwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "expcwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "expcwaxedcostair": "waxed_exposed_cut_copper_stairs", + "expcwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "exposedcutwacopperstair": "waxed_exposed_cut_copper_stairs", + "exposedcutwacopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedcutwacopstair": "waxed_exposed_cut_copper_stairs", + "exposedcutwacopstairs": "waxed_exposed_cut_copper_stairs", + "exposedcutwacostair": "waxed_exposed_cut_copper_stairs", + "exposedcutwacostairs": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxcopstair": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxcostair": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxcostairs": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxedcostair": "waxed_exposed_cut_copper_stairs", + "exposedcutwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "exposedcwacopperstair": "waxed_exposed_cut_copper_stairs", + "exposedcwacopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedcwacopstair": "waxed_exposed_cut_copper_stairs", + "exposedcwacopstairs": "waxed_exposed_cut_copper_stairs", + "exposedcwacostair": "waxed_exposed_cut_copper_stairs", + "exposedcwacostairs": "waxed_exposed_cut_copper_stairs", + "exposedcwaxcopperstair": "waxed_exposed_cut_copper_stairs", + "exposedcwaxcopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedcwaxcopstair": "waxed_exposed_cut_copper_stairs", + "exposedcwaxcopstairs": "waxed_exposed_cut_copper_stairs", + "exposedcwaxcostair": "waxed_exposed_cut_copper_stairs", + "exposedcwaxcostairs": "waxed_exposed_cut_copper_stairs", + "exposedcwaxedcopperstair": "waxed_exposed_cut_copper_stairs", + "exposedcwaxedcopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedcwaxedcopstair": "waxed_exposed_cut_copper_stairs", + "exposedcwaxedcopstairs": "waxed_exposed_cut_copper_stairs", + "exposedcwaxedcostair": "waxed_exposed_cut_copper_stairs", + "exposedcwaxedcostairs": "waxed_exposed_cut_copper_stairs", + "exposedwaccopperstair": "waxed_exposed_cut_copper_stairs", + "exposedwaccopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedwaccopstair": "waxed_exposed_cut_copper_stairs", + "exposedwaccopstairs": "waxed_exposed_cut_copper_stairs", + "exposedwaccostair": "waxed_exposed_cut_copper_stairs", + "exposedwaccostairs": "waxed_exposed_cut_copper_stairs", + "exposedwacutcopperstair": "waxed_exposed_cut_copper_stairs", + "exposedwacutcopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedwacutcopstair": "waxed_exposed_cut_copper_stairs", + "exposedwacutcopstairs": "waxed_exposed_cut_copper_stairs", + "exposedwacutcostair": "waxed_exposed_cut_copper_stairs", + "exposedwacutcostairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxccopperstair": "waxed_exposed_cut_copper_stairs", + "exposedwaxccopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxccopstair": "waxed_exposed_cut_copper_stairs", + "exposedwaxccopstairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxccostair": "waxed_exposed_cut_copper_stairs", + "exposedwaxccostairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxcutcopperstair": "waxed_exposed_cut_copper_stairs", + "exposedwaxcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxcutcopstair": "waxed_exposed_cut_copper_stairs", + "exposedwaxcutcopstairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxcutcostair": "waxed_exposed_cut_copper_stairs", + "exposedwaxcutcostairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxedccopperstair": "waxed_exposed_cut_copper_stairs", + "exposedwaxedccopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxedccopstair": "waxed_exposed_cut_copper_stairs", + "exposedwaxedccopstairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxedccostair": "waxed_exposed_cut_copper_stairs", + "exposedwaxedccostairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxedcutcopperstair": "waxed_exposed_cut_copper_stairs", + "exposedwaxedcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxedcutcopstair": "waxed_exposed_cut_copper_stairs", + "exposedwaxedcutcopstairs": "waxed_exposed_cut_copper_stairs", + "exposedwaxedcutcostair": "waxed_exposed_cut_copper_stairs", + "exposedwaxedcutcostairs": "waxed_exposed_cut_copper_stairs", + "expwaccopperstair": "waxed_exposed_cut_copper_stairs", + "expwaccopperstairs": "waxed_exposed_cut_copper_stairs", + "expwaccopstair": "waxed_exposed_cut_copper_stairs", + "expwaccopstairs": "waxed_exposed_cut_copper_stairs", + "expwaccostair": "waxed_exposed_cut_copper_stairs", + "expwaccostairs": "waxed_exposed_cut_copper_stairs", + "expwacutcopperstair": "waxed_exposed_cut_copper_stairs", + "expwacutcopperstairs": "waxed_exposed_cut_copper_stairs", + "expwacutcopstair": "waxed_exposed_cut_copper_stairs", + "expwacutcopstairs": "waxed_exposed_cut_copper_stairs", + "expwacutcostair": "waxed_exposed_cut_copper_stairs", + "expwacutcostairs": "waxed_exposed_cut_copper_stairs", + "expwaxccopperstair": "waxed_exposed_cut_copper_stairs", + "expwaxccopperstairs": "waxed_exposed_cut_copper_stairs", + "expwaxccopstair": "waxed_exposed_cut_copper_stairs", + "expwaxccopstairs": "waxed_exposed_cut_copper_stairs", + "expwaxccostair": "waxed_exposed_cut_copper_stairs", + "expwaxccostairs": "waxed_exposed_cut_copper_stairs", + "expwaxcutcopperstair": "waxed_exposed_cut_copper_stairs", + "expwaxcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "expwaxcutcopstair": "waxed_exposed_cut_copper_stairs", + "expwaxcutcopstairs": "waxed_exposed_cut_copper_stairs", + "expwaxcutcostair": "waxed_exposed_cut_copper_stairs", + "expwaxcutcostairs": "waxed_exposed_cut_copper_stairs", + "expwaxedccopperstair": "waxed_exposed_cut_copper_stairs", + "expwaxedccopperstairs": "waxed_exposed_cut_copper_stairs", + "expwaxedccopstair": "waxed_exposed_cut_copper_stairs", + "expwaxedccopstairs": "waxed_exposed_cut_copper_stairs", + "expwaxedccostair": "waxed_exposed_cut_copper_stairs", + "expwaxedccostairs": "waxed_exposed_cut_copper_stairs", + "expwaxedcutcopperstair": "waxed_exposed_cut_copper_stairs", + "expwaxedcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "expwaxedcutcopstair": "waxed_exposed_cut_copper_stairs", + "expwaxedcutcopstairs": "waxed_exposed_cut_copper_stairs", + "expwaxedcutcostair": "waxed_exposed_cut_copper_stairs", + "expwaxedcutcostairs": "waxed_exposed_cut_copper_stairs", + "exwaccopperstair": "waxed_exposed_cut_copper_stairs", + "exwaccopperstairs": "waxed_exposed_cut_copper_stairs", + "exwaccopstair": "waxed_exposed_cut_copper_stairs", + "exwaccopstairs": "waxed_exposed_cut_copper_stairs", + "exwaccostair": "waxed_exposed_cut_copper_stairs", + "exwaccostairs": "waxed_exposed_cut_copper_stairs", + "exwacutcopperstair": "waxed_exposed_cut_copper_stairs", + "exwacutcopperstairs": "waxed_exposed_cut_copper_stairs", + "exwacutcopstair": "waxed_exposed_cut_copper_stairs", + "exwacutcopstairs": "waxed_exposed_cut_copper_stairs", + "exwacutcostair": "waxed_exposed_cut_copper_stairs", + "exwacutcostairs": "waxed_exposed_cut_copper_stairs", + "exwaxccopperstair": "waxed_exposed_cut_copper_stairs", + "exwaxccopperstairs": "waxed_exposed_cut_copper_stairs", + "exwaxccopstair": "waxed_exposed_cut_copper_stairs", + "exwaxccopstairs": "waxed_exposed_cut_copper_stairs", + "exwaxccostair": "waxed_exposed_cut_copper_stairs", + "exwaxccostairs": "waxed_exposed_cut_copper_stairs", + "exwaxcutcopperstair": "waxed_exposed_cut_copper_stairs", + "exwaxcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "exwaxcutcopstair": "waxed_exposed_cut_copper_stairs", + "exwaxcutcopstairs": "waxed_exposed_cut_copper_stairs", + "exwaxcutcostair": "waxed_exposed_cut_copper_stairs", + "exwaxcutcostairs": "waxed_exposed_cut_copper_stairs", + "exwaxedccopperstair": "waxed_exposed_cut_copper_stairs", + "exwaxedccopperstairs": "waxed_exposed_cut_copper_stairs", + "exwaxedccopstair": "waxed_exposed_cut_copper_stairs", + "exwaxedccopstairs": "waxed_exposed_cut_copper_stairs", + "exwaxedccostair": "waxed_exposed_cut_copper_stairs", + "exwaxedccostairs": "waxed_exposed_cut_copper_stairs", + "exwaxedcutcopperstair": "waxed_exposed_cut_copper_stairs", + "exwaxedcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "exwaxedcutcopstair": "waxed_exposed_cut_copper_stairs", + "exwaxedcutcopstairs": "waxed_exposed_cut_copper_stairs", + "exwaxedcutcostair": "waxed_exposed_cut_copper_stairs", + "exwaxedcutcostairs": "waxed_exposed_cut_copper_stairs", + "minecraft:waxed_exposed_cut_copper_stairs": "waxed_exposed_cut_copper_stairs", + "wacexcopperstair": "waxed_exposed_cut_copper_stairs", + "wacexcopperstairs": "waxed_exposed_cut_copper_stairs", + "wacexcopstair": "waxed_exposed_cut_copper_stairs", + "wacexcopstairs": "waxed_exposed_cut_copper_stairs", + "wacexcostair": "waxed_exposed_cut_copper_stairs", + "wacexcostairs": "waxed_exposed_cut_copper_stairs", + "wacexpcopperstair": "waxed_exposed_cut_copper_stairs", + "wacexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "wacexpcopstair": "waxed_exposed_cut_copper_stairs", + "wacexpcopstairs": "waxed_exposed_cut_copper_stairs", + "wacexpcostair": "waxed_exposed_cut_copper_stairs", + "wacexpcostairs": "waxed_exposed_cut_copper_stairs", + "wacexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "wacexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "wacexposedcopstair": "waxed_exposed_cut_copper_stairs", + "wacexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "wacexposedcostair": "waxed_exposed_cut_copper_stairs", + "wacexposedcostairs": "waxed_exposed_cut_copper_stairs", + "wacutexcopperstair": "waxed_exposed_cut_copper_stairs", + "wacutexcopperstairs": "waxed_exposed_cut_copper_stairs", + "wacutexcopstair": "waxed_exposed_cut_copper_stairs", + "wacutexcopstairs": "waxed_exposed_cut_copper_stairs", + "wacutexcostair": "waxed_exposed_cut_copper_stairs", + "wacutexcostairs": "waxed_exposed_cut_copper_stairs", + "wacutexpcopperstair": "waxed_exposed_cut_copper_stairs", + "wacutexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "wacutexpcopstair": "waxed_exposed_cut_copper_stairs", + "wacutexpcopstairs": "waxed_exposed_cut_copper_stairs", + "wacutexpcostair": "waxed_exposed_cut_copper_stairs", + "wacutexpcostairs": "waxed_exposed_cut_copper_stairs", + "wacutexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "wacutexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "wacutexposedcopstair": "waxed_exposed_cut_copper_stairs", + "wacutexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "wacutexposedcostair": "waxed_exposed_cut_copper_stairs", + "wacutexposedcostairs": "waxed_exposed_cut_copper_stairs", + "waexccopperstair": "waxed_exposed_cut_copper_stairs", + "waexccopperstairs": "waxed_exposed_cut_copper_stairs", + "waexccopstair": "waxed_exposed_cut_copper_stairs", + "waexccopstairs": "waxed_exposed_cut_copper_stairs", + "waexccostair": "waxed_exposed_cut_copper_stairs", + "waexccostairs": "waxed_exposed_cut_copper_stairs", + "waexcutcopperstair": "waxed_exposed_cut_copper_stairs", + "waexcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "waexcutcopstair": "waxed_exposed_cut_copper_stairs", + "waexcutcopstairs": "waxed_exposed_cut_copper_stairs", + "waexcutcostair": "waxed_exposed_cut_copper_stairs", + "waexcutcostairs": "waxed_exposed_cut_copper_stairs", + "waexpccopperstair": "waxed_exposed_cut_copper_stairs", + "waexpccopperstairs": "waxed_exposed_cut_copper_stairs", + "waexpccopstair": "waxed_exposed_cut_copper_stairs", + "waexpccopstairs": "waxed_exposed_cut_copper_stairs", + "waexpccostair": "waxed_exposed_cut_copper_stairs", + "waexpccostairs": "waxed_exposed_cut_copper_stairs", + "waexpcutcopperstair": "waxed_exposed_cut_copper_stairs", + "waexpcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "waexpcutcopstair": "waxed_exposed_cut_copper_stairs", + "waexpcutcopstairs": "waxed_exposed_cut_copper_stairs", + "waexpcutcostair": "waxed_exposed_cut_copper_stairs", + "waexpcutcostairs": "waxed_exposed_cut_copper_stairs", + "waexposedccopperstair": "waxed_exposed_cut_copper_stairs", + "waexposedccopperstairs": "waxed_exposed_cut_copper_stairs", + "waexposedccopstair": "waxed_exposed_cut_copper_stairs", + "waexposedccopstairs": "waxed_exposed_cut_copper_stairs", + "waexposedccostair": "waxed_exposed_cut_copper_stairs", + "waexposedccostairs": "waxed_exposed_cut_copper_stairs", + "waexposedcutcopperstair": "waxed_exposed_cut_copper_stairs", + "waexposedcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "waexposedcutcopstair": "waxed_exposed_cut_copper_stairs", + "waexposedcutcopstairs": "waxed_exposed_cut_copper_stairs", + "waexposedcutcostair": "waxed_exposed_cut_copper_stairs", + "waexposedcutcostairs": "waxed_exposed_cut_copper_stairs", + "waxcexcopperstair": "waxed_exposed_cut_copper_stairs", + "waxcexcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxcexcopstair": "waxed_exposed_cut_copper_stairs", + "waxcexcopstairs": "waxed_exposed_cut_copper_stairs", + "waxcexcostair": "waxed_exposed_cut_copper_stairs", + "waxcexcostairs": "waxed_exposed_cut_copper_stairs", + "waxcexpcopperstair": "waxed_exposed_cut_copper_stairs", + "waxcexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxcexpcopstair": "waxed_exposed_cut_copper_stairs", + "waxcexpcopstairs": "waxed_exposed_cut_copper_stairs", + "waxcexpcostair": "waxed_exposed_cut_copper_stairs", + "waxcexpcostairs": "waxed_exposed_cut_copper_stairs", + "waxcexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "waxcexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxcexposedcopstair": "waxed_exposed_cut_copper_stairs", + "waxcexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "waxcexposedcostair": "waxed_exposed_cut_copper_stairs", + "waxcexposedcostairs": "waxed_exposed_cut_copper_stairs", + "waxcutexcopperstair": "waxed_exposed_cut_copper_stairs", + "waxcutexcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxcutexcopstair": "waxed_exposed_cut_copper_stairs", + "waxcutexcopstairs": "waxed_exposed_cut_copper_stairs", + "waxcutexcostair": "waxed_exposed_cut_copper_stairs", + "waxcutexcostairs": "waxed_exposed_cut_copper_stairs", + "waxcutexpcopperstair": "waxed_exposed_cut_copper_stairs", + "waxcutexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxcutexpcopstair": "waxed_exposed_cut_copper_stairs", + "waxcutexpcopstairs": "waxed_exposed_cut_copper_stairs", + "waxcutexpcostair": "waxed_exposed_cut_copper_stairs", + "waxcutexpcostairs": "waxed_exposed_cut_copper_stairs", + "waxcutexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "waxcutexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxcutexposedcopstair": "waxed_exposed_cut_copper_stairs", + "waxcutexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "waxcutexposedcostair": "waxed_exposed_cut_copper_stairs", + "waxcutexposedcostairs": "waxed_exposed_cut_copper_stairs", + "waxedcexcopperstair": "waxed_exposed_cut_copper_stairs", + "waxedcexcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedcexcopstair": "waxed_exposed_cut_copper_stairs", + "waxedcexcopstairs": "waxed_exposed_cut_copper_stairs", + "waxedcexcostair": "waxed_exposed_cut_copper_stairs", + "waxedcexcostairs": "waxed_exposed_cut_copper_stairs", + "waxedcexpcopperstair": "waxed_exposed_cut_copper_stairs", + "waxedcexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedcexpcopstair": "waxed_exposed_cut_copper_stairs", + "waxedcexpcopstairs": "waxed_exposed_cut_copper_stairs", + "waxedcexpcostair": "waxed_exposed_cut_copper_stairs", + "waxedcexpcostairs": "waxed_exposed_cut_copper_stairs", + "waxedcexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "waxedcexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedcexposedcopstair": "waxed_exposed_cut_copper_stairs", + "waxedcexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "waxedcexposedcostair": "waxed_exposed_cut_copper_stairs", + "waxedcexposedcostairs": "waxed_exposed_cut_copper_stairs", + "waxedcutexcopperstair": "waxed_exposed_cut_copper_stairs", + "waxedcutexcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedcutexcopstair": "waxed_exposed_cut_copper_stairs", + "waxedcutexcopstairs": "waxed_exposed_cut_copper_stairs", + "waxedcutexcostair": "waxed_exposed_cut_copper_stairs", + "waxedcutexcostairs": "waxed_exposed_cut_copper_stairs", + "waxedcutexpcopperstair": "waxed_exposed_cut_copper_stairs", + "waxedcutexpcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedcutexpcopstair": "waxed_exposed_cut_copper_stairs", + "waxedcutexpcopstairs": "waxed_exposed_cut_copper_stairs", + "waxedcutexpcostair": "waxed_exposed_cut_copper_stairs", + "waxedcutexpcostairs": "waxed_exposed_cut_copper_stairs", + "waxedcutexposedcopperstair": "waxed_exposed_cut_copper_stairs", + "waxedcutexposedcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedcutexposedcopstair": "waxed_exposed_cut_copper_stairs", + "waxedcutexposedcopstairs": "waxed_exposed_cut_copper_stairs", + "waxedcutexposedcostair": "waxed_exposed_cut_copper_stairs", + "waxedcutexposedcostairs": "waxed_exposed_cut_copper_stairs", + "waxedexccopperstair": "waxed_exposed_cut_copper_stairs", + "waxedexccopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedexccopstair": "waxed_exposed_cut_copper_stairs", + "waxedexccopstairs": "waxed_exposed_cut_copper_stairs", + "waxedexccostair": "waxed_exposed_cut_copper_stairs", + "waxedexccostairs": "waxed_exposed_cut_copper_stairs", + "waxedexcutcopperstair": "waxed_exposed_cut_copper_stairs", + "waxedexcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedexcutcopstair": "waxed_exposed_cut_copper_stairs", + "waxedexcutcopstairs": "waxed_exposed_cut_copper_stairs", + "waxedexcutcostair": "waxed_exposed_cut_copper_stairs", + "waxedexcutcostairs": "waxed_exposed_cut_copper_stairs", + "waxedexpccopperstair": "waxed_exposed_cut_copper_stairs", + "waxedexpccopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedexpccopstair": "waxed_exposed_cut_copper_stairs", + "waxedexpccopstairs": "waxed_exposed_cut_copper_stairs", + "waxedexpccostair": "waxed_exposed_cut_copper_stairs", + "waxedexpccostairs": "waxed_exposed_cut_copper_stairs", + "waxedexpcutcopperstair": "waxed_exposed_cut_copper_stairs", + "waxedexpcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedexpcutcopstair": "waxed_exposed_cut_copper_stairs", + "waxedexpcutcopstairs": "waxed_exposed_cut_copper_stairs", + "waxedexpcutcostair": "waxed_exposed_cut_copper_stairs", + "waxedexpcutcostairs": "waxed_exposed_cut_copper_stairs", + "waxedexposedccopperstair": "waxed_exposed_cut_copper_stairs", + "waxedexposedccopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedexposedccopstair": "waxed_exposed_cut_copper_stairs", + "waxedexposedccopstairs": "waxed_exposed_cut_copper_stairs", + "waxedexposedccostair": "waxed_exposed_cut_copper_stairs", + "waxedexposedccostairs": "waxed_exposed_cut_copper_stairs", + "waxedexposedcutcopperstair": "waxed_exposed_cut_copper_stairs", + "waxedexposedcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxedexposedcutcopstair": "waxed_exposed_cut_copper_stairs", + "waxedexposedcutcopstairs": "waxed_exposed_cut_copper_stairs", + "waxedexposedcutcostair": "waxed_exposed_cut_copper_stairs", + "waxedexposedcutcostairs": "waxed_exposed_cut_copper_stairs", + "waxexccopperstair": "waxed_exposed_cut_copper_stairs", + "waxexccopperstairs": "waxed_exposed_cut_copper_stairs", + "waxexccopstair": "waxed_exposed_cut_copper_stairs", + "waxexccopstairs": "waxed_exposed_cut_copper_stairs", + "waxexccostair": "waxed_exposed_cut_copper_stairs", + "waxexccostairs": "waxed_exposed_cut_copper_stairs", + "waxexcutcopperstair": "waxed_exposed_cut_copper_stairs", + "waxexcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxexcutcopstair": "waxed_exposed_cut_copper_stairs", + "waxexcutcopstairs": "waxed_exposed_cut_copper_stairs", + "waxexcutcostair": "waxed_exposed_cut_copper_stairs", + "waxexcutcostairs": "waxed_exposed_cut_copper_stairs", + "waxexpccopperstair": "waxed_exposed_cut_copper_stairs", + "waxexpccopperstairs": "waxed_exposed_cut_copper_stairs", + "waxexpccopstair": "waxed_exposed_cut_copper_stairs", + "waxexpccopstairs": "waxed_exposed_cut_copper_stairs", + "waxexpccostair": "waxed_exposed_cut_copper_stairs", + "waxexpccostairs": "waxed_exposed_cut_copper_stairs", + "waxexpcutcopperstair": "waxed_exposed_cut_copper_stairs", + "waxexpcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxexpcutcopstair": "waxed_exposed_cut_copper_stairs", + "waxexpcutcopstairs": "waxed_exposed_cut_copper_stairs", + "waxexpcutcostair": "waxed_exposed_cut_copper_stairs", + "waxexpcutcostairs": "waxed_exposed_cut_copper_stairs", + "waxexposedccopperstair": "waxed_exposed_cut_copper_stairs", + "waxexposedccopperstairs": "waxed_exposed_cut_copper_stairs", + "waxexposedccopstair": "waxed_exposed_cut_copper_stairs", + "waxexposedccopstairs": "waxed_exposed_cut_copper_stairs", + "waxexposedccostair": "waxed_exposed_cut_copper_stairs", + "waxexposedccostairs": "waxed_exposed_cut_copper_stairs", + "waxexposedcutcopperstair": "waxed_exposed_cut_copper_stairs", + "waxexposedcutcopperstairs": "waxed_exposed_cut_copper_stairs", + "waxexposedcutcopstair": "waxed_exposed_cut_copper_stairs", + "waxexposedcutcopstairs": "waxed_exposed_cut_copper_stairs", + "waxexposedcutcostair": "waxed_exposed_cut_copper_stairs", + "waxexposedcutcostairs": "waxed_exposed_cut_copper_stairs", + "waxed_oxidized_copper": { + "material": "WAXED_OXIDIZED_COPPER" + }, + "minecraft:waxed_oxidized_copper": "waxed_oxidized_copper", + "oxidisedwacoblock": "waxed_oxidized_copper", + "oxidisedwacopblock": "waxed_oxidized_copper", + "oxidisedwacopperblock": "waxed_oxidized_copper", + "oxidisedwaxcoblock": "waxed_oxidized_copper", + "oxidisedwaxcopblock": "waxed_oxidized_copper", + "oxidisedwaxcopperblock": "waxed_oxidized_copper", + "oxidisedwaxedcoblock": "waxed_oxidized_copper", + "oxidisedwaxedcopblock": "waxed_oxidized_copper", + "oxidisedwaxedcopperblock": "waxed_oxidized_copper", + "oxidizedwacoblock": "waxed_oxidized_copper", + "oxidizedwacopblock": "waxed_oxidized_copper", + "oxidizedwacopperblock": "waxed_oxidized_copper", + "oxidizedwaxcoblock": "waxed_oxidized_copper", + "oxidizedwaxcopblock": "waxed_oxidized_copper", + "oxidizedwaxcopperblock": "waxed_oxidized_copper", + "oxidizedwaxedcoblock": "waxed_oxidized_copper", + "oxidizedwaxedcopblock": "waxed_oxidized_copper", + "oxidizedwaxedcopperblock": "waxed_oxidized_copper", + "oxiwacoblock": "waxed_oxidized_copper", + "oxiwacopblock": "waxed_oxidized_copper", + "oxiwacopperblock": "waxed_oxidized_copper", + "oxiwaxcoblock": "waxed_oxidized_copper", + "oxiwaxcopblock": "waxed_oxidized_copper", + "oxiwaxcopperblock": "waxed_oxidized_copper", + "oxiwaxedcoblock": "waxed_oxidized_copper", + "oxiwaxedcopblock": "waxed_oxidized_copper", + "oxiwaxedcopperblock": "waxed_oxidized_copper", + "oxywacoblock": "waxed_oxidized_copper", + "oxywacopblock": "waxed_oxidized_copper", + "oxywacopperblock": "waxed_oxidized_copper", + "oxywaxcoblock": "waxed_oxidized_copper", + "oxywaxcopblock": "waxed_oxidized_copper", + "oxywaxcopperblock": "waxed_oxidized_copper", + "oxywaxedcoblock": "waxed_oxidized_copper", + "oxywaxedcopblock": "waxed_oxidized_copper", + "oxywaxedcopperblock": "waxed_oxidized_copper", + "waoxicoblock": "waxed_oxidized_copper", + "waoxicopblock": "waxed_oxidized_copper", + "waoxicopperblock": "waxed_oxidized_copper", + "waoxidisedcoblock": "waxed_oxidized_copper", + "waoxidisedcopblock": "waxed_oxidized_copper", + "waoxidisedcopperblock": "waxed_oxidized_copper", + "waoxidizedcoblock": "waxed_oxidized_copper", + "waoxidizedcopblock": "waxed_oxidized_copper", + "waoxidizedcopperblock": "waxed_oxidized_copper", + "waoxycoblock": "waxed_oxidized_copper", + "waoxycopblock": "waxed_oxidized_copper", + "waoxycopperblock": "waxed_oxidized_copper", + "waxedoxicoblock": "waxed_oxidized_copper", + "waxedoxicopblock": "waxed_oxidized_copper", + "waxedoxicopperblock": "waxed_oxidized_copper", + "waxedoxidisedcoblock": "waxed_oxidized_copper", + "waxedoxidisedcopblock": "waxed_oxidized_copper", + "waxedoxidisedcopperblock": "waxed_oxidized_copper", + "waxedoxidizedcoblock": "waxed_oxidized_copper", + "waxedoxidizedcopblock": "waxed_oxidized_copper", + "waxedoxidizedcopper": "waxed_oxidized_copper", + "waxedoxidizedcopperblock": "waxed_oxidized_copper", + "waxedoxycoblock": "waxed_oxidized_copper", + "waxedoxycopblock": "waxed_oxidized_copper", + "waxedoxycopperblock": "waxed_oxidized_copper", + "waxoxicoblock": "waxed_oxidized_copper", + "waxoxicopblock": "waxed_oxidized_copper", + "waxoxicopperblock": "waxed_oxidized_copper", + "waxoxidisedcoblock": "waxed_oxidized_copper", + "waxoxidisedcopblock": "waxed_oxidized_copper", + "waxoxidisedcopperblock": "waxed_oxidized_copper", + "waxoxidizedcoblock": "waxed_oxidized_copper", + "waxoxidizedcopblock": "waxed_oxidized_copper", + "waxoxidizedcopperblock": "waxed_oxidized_copper", + "waxoxycoblock": "waxed_oxidized_copper", + "waxoxycopblock": "waxed_oxidized_copper", + "waxoxycopperblock": "waxed_oxidized_copper", + "waxed_oxidized_cut_copper": { + "material": "WAXED_OXIDIZED_CUT_COPPER" + }, + "coxidisedwacoblock": "waxed_oxidized_cut_copper", + "coxidisedwacopblock": "waxed_oxidized_cut_copper", + "coxidisedwacopperblock": "waxed_oxidized_cut_copper", + "coxidisedwaxcoblock": "waxed_oxidized_cut_copper", + "coxidisedwaxcopblock": "waxed_oxidized_cut_copper", + "coxidisedwaxcopperblock": "waxed_oxidized_cut_copper", + "coxidisedwaxedcoblock": "waxed_oxidized_cut_copper", + "coxidisedwaxedcopblock": "waxed_oxidized_cut_copper", + "coxidisedwaxedcopperblock": "waxed_oxidized_cut_copper", + "coxidizedwacoblock": "waxed_oxidized_cut_copper", + "coxidizedwacopblock": "waxed_oxidized_cut_copper", + "coxidizedwacopperblock": "waxed_oxidized_cut_copper", + "coxidizedwaxcoblock": "waxed_oxidized_cut_copper", + "coxidizedwaxcopblock": "waxed_oxidized_cut_copper", + "coxidizedwaxcopperblock": "waxed_oxidized_cut_copper", + "coxidizedwaxedcoblock": "waxed_oxidized_cut_copper", + "coxidizedwaxedcopblock": "waxed_oxidized_cut_copper", + "coxidizedwaxedcopperblock": "waxed_oxidized_cut_copper", + "coxiwacoblock": "waxed_oxidized_cut_copper", + "coxiwacopblock": "waxed_oxidized_cut_copper", + "coxiwacopperblock": "waxed_oxidized_cut_copper", + "coxiwaxcoblock": "waxed_oxidized_cut_copper", + "coxiwaxcopblock": "waxed_oxidized_cut_copper", + "coxiwaxcopperblock": "waxed_oxidized_cut_copper", + "coxiwaxedcoblock": "waxed_oxidized_cut_copper", + "coxiwaxedcopblock": "waxed_oxidized_cut_copper", + "coxiwaxedcopperblock": "waxed_oxidized_cut_copper", + "coxywacoblock": "waxed_oxidized_cut_copper", + "coxywacopblock": "waxed_oxidized_cut_copper", + "coxywacopperblock": "waxed_oxidized_cut_copper", + "coxywaxcoblock": "waxed_oxidized_cut_copper", + "coxywaxcopblock": "waxed_oxidized_cut_copper", + "coxywaxcopperblock": "waxed_oxidized_cut_copper", + "coxywaxedcoblock": "waxed_oxidized_cut_copper", + "coxywaxedcopblock": "waxed_oxidized_cut_copper", + "coxywaxedcopperblock": "waxed_oxidized_cut_copper", + "cutoxidisedwacoblock": "waxed_oxidized_cut_copper", + "cutoxidisedwacopblock": "waxed_oxidized_cut_copper", + "cutoxidisedwacopperblock": "waxed_oxidized_cut_copper", + "cutoxidisedwaxcoblock": "waxed_oxidized_cut_copper", + "cutoxidisedwaxcopblock": "waxed_oxidized_cut_copper", + "cutoxidisedwaxcopperblock": "waxed_oxidized_cut_copper", + "cutoxidisedwaxedcoblock": "waxed_oxidized_cut_copper", + "cutoxidisedwaxedcopblock": "waxed_oxidized_cut_copper", + "cutoxidisedwaxedcopperblock": "waxed_oxidized_cut_copper", + "cutoxidizedwacoblock": "waxed_oxidized_cut_copper", + "cutoxidizedwacopblock": "waxed_oxidized_cut_copper", + "cutoxidizedwacopperblock": "waxed_oxidized_cut_copper", + "cutoxidizedwaxcoblock": "waxed_oxidized_cut_copper", + "cutoxidizedwaxcopblock": "waxed_oxidized_cut_copper", + "cutoxidizedwaxcopperblock": "waxed_oxidized_cut_copper", + "cutoxidizedwaxedcoblock": "waxed_oxidized_cut_copper", + "cutoxidizedwaxedcopblock": "waxed_oxidized_cut_copper", + "cutoxidizedwaxedcopperblock": "waxed_oxidized_cut_copper", + "cutoxiwacoblock": "waxed_oxidized_cut_copper", + "cutoxiwacopblock": "waxed_oxidized_cut_copper", + "cutoxiwacopperblock": "waxed_oxidized_cut_copper", + "cutoxiwaxcoblock": "waxed_oxidized_cut_copper", + "cutoxiwaxcopblock": "waxed_oxidized_cut_copper", + "cutoxiwaxcopperblock": "waxed_oxidized_cut_copper", + "cutoxiwaxedcoblock": "waxed_oxidized_cut_copper", + "cutoxiwaxedcopblock": "waxed_oxidized_cut_copper", + "cutoxiwaxedcopperblock": "waxed_oxidized_cut_copper", + "cutoxywacoblock": "waxed_oxidized_cut_copper", + "cutoxywacopblock": "waxed_oxidized_cut_copper", + "cutoxywacopperblock": "waxed_oxidized_cut_copper", + "cutoxywaxcoblock": "waxed_oxidized_cut_copper", + "cutoxywaxcopblock": "waxed_oxidized_cut_copper", + "cutoxywaxcopperblock": "waxed_oxidized_cut_copper", + "cutoxywaxedcoblock": "waxed_oxidized_cut_copper", + "cutoxywaxedcopblock": "waxed_oxidized_cut_copper", + "cutoxywaxedcopperblock": "waxed_oxidized_cut_copper", + "cutwaoxicoblock": "waxed_oxidized_cut_copper", + "cutwaoxicopblock": "waxed_oxidized_cut_copper", + "cutwaoxicopperblock": "waxed_oxidized_cut_copper", + "cutwaoxidisedcoblock": "waxed_oxidized_cut_copper", + "cutwaoxidisedcopblock": "waxed_oxidized_cut_copper", + "cutwaoxidisedcopperblock": "waxed_oxidized_cut_copper", + "cutwaoxidizedcoblock": "waxed_oxidized_cut_copper", + "cutwaoxidizedcopblock": "waxed_oxidized_cut_copper", + "cutwaoxidizedcopperblock": "waxed_oxidized_cut_copper", + "cutwaoxycoblock": "waxed_oxidized_cut_copper", + "cutwaoxycopblock": "waxed_oxidized_cut_copper", + "cutwaoxycopperblock": "waxed_oxidized_cut_copper", + "cutwaxedoxicoblock": "waxed_oxidized_cut_copper", + "cutwaxedoxicopblock": "waxed_oxidized_cut_copper", + "cutwaxedoxicopperblock": "waxed_oxidized_cut_copper", + "cutwaxedoxidisedcoblock": "waxed_oxidized_cut_copper", + "cutwaxedoxidisedcopblock": "waxed_oxidized_cut_copper", + "cutwaxedoxidisedcopperblock": "waxed_oxidized_cut_copper", + "cutwaxedoxidizedcoblock": "waxed_oxidized_cut_copper", + "cutwaxedoxidizedcopblock": "waxed_oxidized_cut_copper", + "cutwaxedoxidizedcopperblock": "waxed_oxidized_cut_copper", + "cutwaxedoxycoblock": "waxed_oxidized_cut_copper", + "cutwaxedoxycopblock": "waxed_oxidized_cut_copper", + "cutwaxedoxycopperblock": "waxed_oxidized_cut_copper", + "cutwaxoxicoblock": "waxed_oxidized_cut_copper", + "cutwaxoxicopblock": "waxed_oxidized_cut_copper", + "cutwaxoxicopperblock": "waxed_oxidized_cut_copper", + "cutwaxoxidisedcoblock": "waxed_oxidized_cut_copper", + "cutwaxoxidisedcopblock": "waxed_oxidized_cut_copper", + "cutwaxoxidisedcopperblock": "waxed_oxidized_cut_copper", + "cutwaxoxidizedcoblock": "waxed_oxidized_cut_copper", + "cutwaxoxidizedcopblock": "waxed_oxidized_cut_copper", + "cutwaxoxidizedcopperblock": "waxed_oxidized_cut_copper", + "cutwaxoxycoblock": "waxed_oxidized_cut_copper", + "cutwaxoxycopblock": "waxed_oxidized_cut_copper", + "cutwaxoxycopperblock": "waxed_oxidized_cut_copper", + "cwaoxicoblock": "waxed_oxidized_cut_copper", + "cwaoxicopblock": "waxed_oxidized_cut_copper", + "cwaoxicopperblock": "waxed_oxidized_cut_copper", + "cwaoxidisedcoblock": "waxed_oxidized_cut_copper", + "cwaoxidisedcopblock": "waxed_oxidized_cut_copper", + "cwaoxidisedcopperblock": "waxed_oxidized_cut_copper", + "cwaoxidizedcoblock": "waxed_oxidized_cut_copper", + "cwaoxidizedcopblock": "waxed_oxidized_cut_copper", + "cwaoxidizedcopperblock": "waxed_oxidized_cut_copper", + "cwaoxycoblock": "waxed_oxidized_cut_copper", + "cwaoxycopblock": "waxed_oxidized_cut_copper", + "cwaoxycopperblock": "waxed_oxidized_cut_copper", + "cwaxedoxicoblock": "waxed_oxidized_cut_copper", + "cwaxedoxicopblock": "waxed_oxidized_cut_copper", + "cwaxedoxicopperblock": "waxed_oxidized_cut_copper", + "cwaxedoxidisedcoblock": "waxed_oxidized_cut_copper", + "cwaxedoxidisedcopblock": "waxed_oxidized_cut_copper", + "cwaxedoxidisedcopperblock": "waxed_oxidized_cut_copper", + "cwaxedoxidizedcoblock": "waxed_oxidized_cut_copper", + "cwaxedoxidizedcopblock": "waxed_oxidized_cut_copper", + "cwaxedoxidizedcopperblock": "waxed_oxidized_cut_copper", + "cwaxedoxycoblock": "waxed_oxidized_cut_copper", + "cwaxedoxycopblock": "waxed_oxidized_cut_copper", + "cwaxedoxycopperblock": "waxed_oxidized_cut_copper", + "cwaxoxicoblock": "waxed_oxidized_cut_copper", + "cwaxoxicopblock": "waxed_oxidized_cut_copper", + "cwaxoxicopperblock": "waxed_oxidized_cut_copper", + "cwaxoxidisedcoblock": "waxed_oxidized_cut_copper", + "cwaxoxidisedcopblock": "waxed_oxidized_cut_copper", + "cwaxoxidisedcopperblock": "waxed_oxidized_cut_copper", + "cwaxoxidizedcoblock": "waxed_oxidized_cut_copper", + "cwaxoxidizedcopblock": "waxed_oxidized_cut_copper", + "cwaxoxidizedcopperblock": "waxed_oxidized_cut_copper", + "cwaxoxycoblock": "waxed_oxidized_cut_copper", + "cwaxoxycopblock": "waxed_oxidized_cut_copper", + "cwaxoxycopperblock": "waxed_oxidized_cut_copper", + "minecraft:waxed_oxidized_cut_copper": "waxed_oxidized_cut_copper", + "oxicutwacoblock": "waxed_oxidized_cut_copper", + "oxicutwacopblock": "waxed_oxidized_cut_copper", + "oxicutwacopperblock": "waxed_oxidized_cut_copper", + "oxicutwaxcoblock": "waxed_oxidized_cut_copper", + "oxicutwaxcopblock": "waxed_oxidized_cut_copper", + "oxicutwaxcopperblock": "waxed_oxidized_cut_copper", + "oxicutwaxedcoblock": "waxed_oxidized_cut_copper", + "oxicutwaxedcopblock": "waxed_oxidized_cut_copper", + "oxicutwaxedcopperblock": "waxed_oxidized_cut_copper", + "oxicwacoblock": "waxed_oxidized_cut_copper", + "oxicwacopblock": "waxed_oxidized_cut_copper", + "oxicwacopperblock": "waxed_oxidized_cut_copper", + "oxicwaxcoblock": "waxed_oxidized_cut_copper", + "oxicwaxcopblock": "waxed_oxidized_cut_copper", + "oxicwaxcopperblock": "waxed_oxidized_cut_copper", + "oxicwaxedcoblock": "waxed_oxidized_cut_copper", + "oxicwaxedcopblock": "waxed_oxidized_cut_copper", + "oxicwaxedcopperblock": "waxed_oxidized_cut_copper", + "oxidisedcutwacoblock": "waxed_oxidized_cut_copper", + "oxidisedcutwacopblock": "waxed_oxidized_cut_copper", + "oxidisedcutwacopperblock": "waxed_oxidized_cut_copper", + "oxidisedcutwaxcoblock": "waxed_oxidized_cut_copper", + "oxidisedcutwaxcopblock": "waxed_oxidized_cut_copper", + "oxidisedcutwaxcopperblock": "waxed_oxidized_cut_copper", + "oxidisedcutwaxedcoblock": "waxed_oxidized_cut_copper", + "oxidisedcutwaxedcopblock": "waxed_oxidized_cut_copper", + "oxidisedcutwaxedcopperblock": "waxed_oxidized_cut_copper", + "oxidisedcwacoblock": "waxed_oxidized_cut_copper", + "oxidisedcwacopblock": "waxed_oxidized_cut_copper", + "oxidisedcwacopperblock": "waxed_oxidized_cut_copper", + "oxidisedcwaxcoblock": "waxed_oxidized_cut_copper", + "oxidisedcwaxcopblock": "waxed_oxidized_cut_copper", + "oxidisedcwaxcopperblock": "waxed_oxidized_cut_copper", + "oxidisedcwaxedcoblock": "waxed_oxidized_cut_copper", + "oxidisedcwaxedcopblock": "waxed_oxidized_cut_copper", + "oxidisedcwaxedcopperblock": "waxed_oxidized_cut_copper", + "oxidisedwaccoblock": "waxed_oxidized_cut_copper", + "oxidisedwaccopblock": "waxed_oxidized_cut_copper", + "oxidisedwaccopperblock": "waxed_oxidized_cut_copper", + "oxidisedwacutcoblock": "waxed_oxidized_cut_copper", + "oxidisedwacutcopblock": "waxed_oxidized_cut_copper", + "oxidisedwacutcopperblock": "waxed_oxidized_cut_copper", + "oxidisedwaxccoblock": "waxed_oxidized_cut_copper", + "oxidisedwaxccopblock": "waxed_oxidized_cut_copper", + "oxidisedwaxccopperblock": "waxed_oxidized_cut_copper", + "oxidisedwaxcutcoblock": "waxed_oxidized_cut_copper", + "oxidisedwaxcutcopblock": "waxed_oxidized_cut_copper", + "oxidisedwaxcutcopperblock": "waxed_oxidized_cut_copper", + "oxidisedwaxedccoblock": "waxed_oxidized_cut_copper", + "oxidisedwaxedccopblock": "waxed_oxidized_cut_copper", + "oxidisedwaxedccopperblock": "waxed_oxidized_cut_copper", + "oxidisedwaxedcutcoblock": "waxed_oxidized_cut_copper", + "oxidisedwaxedcutcopblock": "waxed_oxidized_cut_copper", + "oxidisedwaxedcutcopperblock": "waxed_oxidized_cut_copper", + "oxidizedcutwacoblock": "waxed_oxidized_cut_copper", + "oxidizedcutwacopblock": "waxed_oxidized_cut_copper", + "oxidizedcutwacopperblock": "waxed_oxidized_cut_copper", + "oxidizedcutwaxcoblock": "waxed_oxidized_cut_copper", + "oxidizedcutwaxcopblock": "waxed_oxidized_cut_copper", + "oxidizedcutwaxcopperblock": "waxed_oxidized_cut_copper", + "oxidizedcutwaxedcoblock": "waxed_oxidized_cut_copper", + "oxidizedcutwaxedcopblock": "waxed_oxidized_cut_copper", + "oxidizedcutwaxedcopperblock": "waxed_oxidized_cut_copper", + "oxidizedcwacoblock": "waxed_oxidized_cut_copper", + "oxidizedcwacopblock": "waxed_oxidized_cut_copper", + "oxidizedcwacopperblock": "waxed_oxidized_cut_copper", + "oxidizedcwaxcoblock": "waxed_oxidized_cut_copper", + "oxidizedcwaxcopblock": "waxed_oxidized_cut_copper", + "oxidizedcwaxcopperblock": "waxed_oxidized_cut_copper", + "oxidizedcwaxedcoblock": "waxed_oxidized_cut_copper", + "oxidizedcwaxedcopblock": "waxed_oxidized_cut_copper", + "oxidizedcwaxedcopperblock": "waxed_oxidized_cut_copper", + "oxidizedwaccoblock": "waxed_oxidized_cut_copper", + "oxidizedwaccopblock": "waxed_oxidized_cut_copper", + "oxidizedwaccopperblock": "waxed_oxidized_cut_copper", + "oxidizedwacutcoblock": "waxed_oxidized_cut_copper", + "oxidizedwacutcopblock": "waxed_oxidized_cut_copper", + "oxidizedwacutcopperblock": "waxed_oxidized_cut_copper", + "oxidizedwaxccoblock": "waxed_oxidized_cut_copper", + "oxidizedwaxccopblock": "waxed_oxidized_cut_copper", + "oxidizedwaxccopperblock": "waxed_oxidized_cut_copper", + "oxidizedwaxcutcoblock": "waxed_oxidized_cut_copper", + "oxidizedwaxcutcopblock": "waxed_oxidized_cut_copper", + "oxidizedwaxcutcopperblock": "waxed_oxidized_cut_copper", + "oxidizedwaxedccoblock": "waxed_oxidized_cut_copper", + "oxidizedwaxedccopblock": "waxed_oxidized_cut_copper", + "oxidizedwaxedccopperblock": "waxed_oxidized_cut_copper", + "oxidizedwaxedcutcoblock": "waxed_oxidized_cut_copper", + "oxidizedwaxedcutcopblock": "waxed_oxidized_cut_copper", + "oxidizedwaxedcutcopperblock": "waxed_oxidized_cut_copper", + "oxiwaccoblock": "waxed_oxidized_cut_copper", + "oxiwaccopblock": "waxed_oxidized_cut_copper", + "oxiwaccopperblock": "waxed_oxidized_cut_copper", + "oxiwacutcoblock": "waxed_oxidized_cut_copper", + "oxiwacutcopblock": "waxed_oxidized_cut_copper", + "oxiwacutcopperblock": "waxed_oxidized_cut_copper", + "oxiwaxccoblock": "waxed_oxidized_cut_copper", + "oxiwaxccopblock": "waxed_oxidized_cut_copper", + "oxiwaxccopperblock": "waxed_oxidized_cut_copper", + "oxiwaxcutcoblock": "waxed_oxidized_cut_copper", + "oxiwaxcutcopblock": "waxed_oxidized_cut_copper", + "oxiwaxcutcopperblock": "waxed_oxidized_cut_copper", + "oxiwaxedccoblock": "waxed_oxidized_cut_copper", + "oxiwaxedccopblock": "waxed_oxidized_cut_copper", + "oxiwaxedccopperblock": "waxed_oxidized_cut_copper", + "oxiwaxedcutcoblock": "waxed_oxidized_cut_copper", + "oxiwaxedcutcopblock": "waxed_oxidized_cut_copper", + "oxiwaxedcutcopperblock": "waxed_oxidized_cut_copper", + "oxycutwacoblock": "waxed_oxidized_cut_copper", + "oxycutwacopblock": "waxed_oxidized_cut_copper", + "oxycutwacopperblock": "waxed_oxidized_cut_copper", + "oxycutwaxcoblock": "waxed_oxidized_cut_copper", + "oxycutwaxcopblock": "waxed_oxidized_cut_copper", + "oxycutwaxcopperblock": "waxed_oxidized_cut_copper", + "oxycutwaxedcoblock": "waxed_oxidized_cut_copper", + "oxycutwaxedcopblock": "waxed_oxidized_cut_copper", + "oxycutwaxedcopperblock": "waxed_oxidized_cut_copper", + "oxycwacoblock": "waxed_oxidized_cut_copper", + "oxycwacopblock": "waxed_oxidized_cut_copper", + "oxycwacopperblock": "waxed_oxidized_cut_copper", + "oxycwaxcoblock": "waxed_oxidized_cut_copper", + "oxycwaxcopblock": "waxed_oxidized_cut_copper", + "oxycwaxcopperblock": "waxed_oxidized_cut_copper", + "oxycwaxedcoblock": "waxed_oxidized_cut_copper", + "oxycwaxedcopblock": "waxed_oxidized_cut_copper", + "oxycwaxedcopperblock": "waxed_oxidized_cut_copper", + "oxywaccoblock": "waxed_oxidized_cut_copper", + "oxywaccopblock": "waxed_oxidized_cut_copper", + "oxywaccopperblock": "waxed_oxidized_cut_copper", + "oxywacutcoblock": "waxed_oxidized_cut_copper", + "oxywacutcopblock": "waxed_oxidized_cut_copper", + "oxywacutcopperblock": "waxed_oxidized_cut_copper", + "oxywaxccoblock": "waxed_oxidized_cut_copper", + "oxywaxccopblock": "waxed_oxidized_cut_copper", + "oxywaxccopperblock": "waxed_oxidized_cut_copper", + "oxywaxcutcoblock": "waxed_oxidized_cut_copper", + "oxywaxcutcopblock": "waxed_oxidized_cut_copper", + "oxywaxcutcopperblock": "waxed_oxidized_cut_copper", + "oxywaxedccoblock": "waxed_oxidized_cut_copper", + "oxywaxedccopblock": "waxed_oxidized_cut_copper", + "oxywaxedccopperblock": "waxed_oxidized_cut_copper", + "oxywaxedcutcoblock": "waxed_oxidized_cut_copper", + "oxywaxedcutcopblock": "waxed_oxidized_cut_copper", + "oxywaxedcutcopperblock": "waxed_oxidized_cut_copper", + "wacoxicoblock": "waxed_oxidized_cut_copper", + "wacoxicopblock": "waxed_oxidized_cut_copper", + "wacoxicopperblock": "waxed_oxidized_cut_copper", + "wacoxidisedcoblock": "waxed_oxidized_cut_copper", + "wacoxidisedcopblock": "waxed_oxidized_cut_copper", + "wacoxidisedcopperblock": "waxed_oxidized_cut_copper", + "wacoxidizedcoblock": "waxed_oxidized_cut_copper", + "wacoxidizedcopblock": "waxed_oxidized_cut_copper", + "wacoxidizedcopperblock": "waxed_oxidized_cut_copper", + "wacoxycoblock": "waxed_oxidized_cut_copper", + "wacoxycopblock": "waxed_oxidized_cut_copper", + "wacoxycopperblock": "waxed_oxidized_cut_copper", + "wacutoxicoblock": "waxed_oxidized_cut_copper", + "wacutoxicopblock": "waxed_oxidized_cut_copper", + "wacutoxicopperblock": "waxed_oxidized_cut_copper", + "wacutoxidisedcoblock": "waxed_oxidized_cut_copper", + "wacutoxidisedcopblock": "waxed_oxidized_cut_copper", + "wacutoxidisedcopperblock": "waxed_oxidized_cut_copper", + "wacutoxidizedcoblock": "waxed_oxidized_cut_copper", + "wacutoxidizedcopblock": "waxed_oxidized_cut_copper", + "wacutoxidizedcopperblock": "waxed_oxidized_cut_copper", + "wacutoxycoblock": "waxed_oxidized_cut_copper", + "wacutoxycopblock": "waxed_oxidized_cut_copper", + "wacutoxycopperblock": "waxed_oxidized_cut_copper", + "waoxiccoblock": "waxed_oxidized_cut_copper", + "waoxiccopblock": "waxed_oxidized_cut_copper", + "waoxiccopperblock": "waxed_oxidized_cut_copper", + "waoxicutcoblock": "waxed_oxidized_cut_copper", + "waoxicutcopblock": "waxed_oxidized_cut_copper", + "waoxicutcopperblock": "waxed_oxidized_cut_copper", + "waoxidisedccoblock": "waxed_oxidized_cut_copper", + "waoxidisedccopblock": "waxed_oxidized_cut_copper", + "waoxidisedccopperblock": "waxed_oxidized_cut_copper", + "waoxidisedcutcoblock": "waxed_oxidized_cut_copper", + "waoxidisedcutcopblock": "waxed_oxidized_cut_copper", + "waoxidisedcutcopperblock": "waxed_oxidized_cut_copper", + "waoxidizedccoblock": "waxed_oxidized_cut_copper", + "waoxidizedccopblock": "waxed_oxidized_cut_copper", + "waoxidizedccopperblock": "waxed_oxidized_cut_copper", + "waoxidizedcutcoblock": "waxed_oxidized_cut_copper", + "waoxidizedcutcopblock": "waxed_oxidized_cut_copper", + "waoxidizedcutcopperblock": "waxed_oxidized_cut_copper", + "waoxyccoblock": "waxed_oxidized_cut_copper", + "waoxyccopblock": "waxed_oxidized_cut_copper", + "waoxyccopperblock": "waxed_oxidized_cut_copper", + "waoxycutcoblock": "waxed_oxidized_cut_copper", + "waoxycutcopblock": "waxed_oxidized_cut_copper", + "waoxycutcopperblock": "waxed_oxidized_cut_copper", + "waxcoxicoblock": "waxed_oxidized_cut_copper", + "waxcoxicopblock": "waxed_oxidized_cut_copper", + "waxcoxicopperblock": "waxed_oxidized_cut_copper", + "waxcoxidisedcoblock": "waxed_oxidized_cut_copper", + "waxcoxidisedcopblock": "waxed_oxidized_cut_copper", + "waxcoxidisedcopperblock": "waxed_oxidized_cut_copper", + "waxcoxidizedcoblock": "waxed_oxidized_cut_copper", + "waxcoxidizedcopblock": "waxed_oxidized_cut_copper", + "waxcoxidizedcopperblock": "waxed_oxidized_cut_copper", + "waxcoxycoblock": "waxed_oxidized_cut_copper", + "waxcoxycopblock": "waxed_oxidized_cut_copper", + "waxcoxycopperblock": "waxed_oxidized_cut_copper", + "waxcutoxicoblock": "waxed_oxidized_cut_copper", + "waxcutoxicopblock": "waxed_oxidized_cut_copper", + "waxcutoxicopperblock": "waxed_oxidized_cut_copper", + "waxcutoxidisedcoblock": "waxed_oxidized_cut_copper", + "waxcutoxidisedcopblock": "waxed_oxidized_cut_copper", + "waxcutoxidisedcopperblock": "waxed_oxidized_cut_copper", + "waxcutoxidizedcoblock": "waxed_oxidized_cut_copper", + "waxcutoxidizedcopblock": "waxed_oxidized_cut_copper", + "waxcutoxidizedcopperblock": "waxed_oxidized_cut_copper", + "waxcutoxycoblock": "waxed_oxidized_cut_copper", + "waxcutoxycopblock": "waxed_oxidized_cut_copper", + "waxcutoxycopperblock": "waxed_oxidized_cut_copper", + "waxedcoxicoblock": "waxed_oxidized_cut_copper", + "waxedcoxicopblock": "waxed_oxidized_cut_copper", + "waxedcoxicopperblock": "waxed_oxidized_cut_copper", + "waxedcoxidisedcoblock": "waxed_oxidized_cut_copper", + "waxedcoxidisedcopblock": "waxed_oxidized_cut_copper", + "waxedcoxidisedcopperblock": "waxed_oxidized_cut_copper", + "waxedcoxidizedcoblock": "waxed_oxidized_cut_copper", + "waxedcoxidizedcopblock": "waxed_oxidized_cut_copper", + "waxedcoxidizedcopperblock": "waxed_oxidized_cut_copper", + "waxedcoxycoblock": "waxed_oxidized_cut_copper", + "waxedcoxycopblock": "waxed_oxidized_cut_copper", + "waxedcoxycopperblock": "waxed_oxidized_cut_copper", + "waxedcutoxicoblock": "waxed_oxidized_cut_copper", + "waxedcutoxicopblock": "waxed_oxidized_cut_copper", + "waxedcutoxicopperblock": "waxed_oxidized_cut_copper", + "waxedcutoxidisedcoblock": "waxed_oxidized_cut_copper", + "waxedcutoxidisedcopblock": "waxed_oxidized_cut_copper", + "waxedcutoxidisedcopperblock": "waxed_oxidized_cut_copper", + "waxedcutoxidizedcoblock": "waxed_oxidized_cut_copper", + "waxedcutoxidizedcopblock": "waxed_oxidized_cut_copper", + "waxedcutoxidizedcopperblock": "waxed_oxidized_cut_copper", + "waxedcutoxycoblock": "waxed_oxidized_cut_copper", + "waxedcutoxycopblock": "waxed_oxidized_cut_copper", + "waxedcutoxycopperblock": "waxed_oxidized_cut_copper", + "waxedoxiccoblock": "waxed_oxidized_cut_copper", + "waxedoxiccopblock": "waxed_oxidized_cut_copper", + "waxedoxiccopperblock": "waxed_oxidized_cut_copper", + "waxedoxicutcoblock": "waxed_oxidized_cut_copper", + "waxedoxicutcopblock": "waxed_oxidized_cut_copper", + "waxedoxicutcopperblock": "waxed_oxidized_cut_copper", + "waxedoxidisedccoblock": "waxed_oxidized_cut_copper", + "waxedoxidisedccopblock": "waxed_oxidized_cut_copper", + "waxedoxidisedccopperblock": "waxed_oxidized_cut_copper", + "waxedoxidisedcutcoblock": "waxed_oxidized_cut_copper", + "waxedoxidisedcutcopblock": "waxed_oxidized_cut_copper", + "waxedoxidisedcutcopperblock": "waxed_oxidized_cut_copper", + "waxedoxidizedccoblock": "waxed_oxidized_cut_copper", + "waxedoxidizedccopblock": "waxed_oxidized_cut_copper", + "waxedoxidizedccopperblock": "waxed_oxidized_cut_copper", + "waxedoxidizedcutcoblock": "waxed_oxidized_cut_copper", + "waxedoxidizedcutcopblock": "waxed_oxidized_cut_copper", + "waxedoxidizedcutcopper": "waxed_oxidized_cut_copper", + "waxedoxidizedcutcopperblock": "waxed_oxidized_cut_copper", + "waxedoxyccoblock": "waxed_oxidized_cut_copper", + "waxedoxyccopblock": "waxed_oxidized_cut_copper", + "waxedoxyccopperblock": "waxed_oxidized_cut_copper", + "waxedoxycutcoblock": "waxed_oxidized_cut_copper", + "waxedoxycutcopblock": "waxed_oxidized_cut_copper", + "waxedoxycutcopperblock": "waxed_oxidized_cut_copper", + "waxoxiccoblock": "waxed_oxidized_cut_copper", + "waxoxiccopblock": "waxed_oxidized_cut_copper", + "waxoxiccopperblock": "waxed_oxidized_cut_copper", + "waxoxicutcoblock": "waxed_oxidized_cut_copper", + "waxoxicutcopblock": "waxed_oxidized_cut_copper", + "waxoxicutcopperblock": "waxed_oxidized_cut_copper", + "waxoxidisedccoblock": "waxed_oxidized_cut_copper", + "waxoxidisedccopblock": "waxed_oxidized_cut_copper", + "waxoxidisedccopperblock": "waxed_oxidized_cut_copper", + "waxoxidisedcutcoblock": "waxed_oxidized_cut_copper", + "waxoxidisedcutcopblock": "waxed_oxidized_cut_copper", + "waxoxidisedcutcopperblock": "waxed_oxidized_cut_copper", + "waxoxidizedccoblock": "waxed_oxidized_cut_copper", + "waxoxidizedccopblock": "waxed_oxidized_cut_copper", + "waxoxidizedccopperblock": "waxed_oxidized_cut_copper", + "waxoxidizedcutcoblock": "waxed_oxidized_cut_copper", + "waxoxidizedcutcopblock": "waxed_oxidized_cut_copper", + "waxoxidizedcutcopperblock": "waxed_oxidized_cut_copper", + "waxoxyccoblock": "waxed_oxidized_cut_copper", + "waxoxyccopblock": "waxed_oxidized_cut_copper", + "waxoxyccopperblock": "waxed_oxidized_cut_copper", + "waxoxycutcoblock": "waxed_oxidized_cut_copper", + "waxoxycutcopblock": "waxed_oxidized_cut_copper", + "waxoxycutcopperblock": "waxed_oxidized_cut_copper", + "waxed_oxidized_cut_copper_slab": { + "material": "WAXED_OXIDIZED_CUT_COPPER_SLAB" + }, + "coxidisedwacohalfblock": "waxed_oxidized_cut_copper_slab", + "coxidisedwacophalfblock": "waxed_oxidized_cut_copper_slab", + "coxidisedwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxidisedwacoppersl": "waxed_oxidized_cut_copper_slab", + "coxidisedwacopperslab": "waxed_oxidized_cut_copper_slab", + "coxidisedwacopperstep": "waxed_oxidized_cut_copper_slab", + "coxidisedwacopsl": "waxed_oxidized_cut_copper_slab", + "coxidisedwacopslab": "waxed_oxidized_cut_copper_slab", + "coxidisedwacopstep": "waxed_oxidized_cut_copper_slab", + "coxidisedwacosl": "waxed_oxidized_cut_copper_slab", + "coxidisedwacoslab": "waxed_oxidized_cut_copper_slab", + "coxidisedwacostep": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcopsl": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcopslab": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcopstep": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcosl": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcoslab": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxcostep": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcosl": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "coxidisedwaxedcostep": "waxed_oxidized_cut_copper_slab", + "coxidizedwacohalfblock": "waxed_oxidized_cut_copper_slab", + "coxidizedwacophalfblock": "waxed_oxidized_cut_copper_slab", + "coxidizedwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxidizedwacoppersl": "waxed_oxidized_cut_copper_slab", + "coxidizedwacopperslab": "waxed_oxidized_cut_copper_slab", + "coxidizedwacopperstep": "waxed_oxidized_cut_copper_slab", + "coxidizedwacopsl": "waxed_oxidized_cut_copper_slab", + "coxidizedwacopslab": "waxed_oxidized_cut_copper_slab", + "coxidizedwacopstep": "waxed_oxidized_cut_copper_slab", + "coxidizedwacosl": "waxed_oxidized_cut_copper_slab", + "coxidizedwacoslab": "waxed_oxidized_cut_copper_slab", + "coxidizedwacostep": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcopsl": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcopslab": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcopstep": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcosl": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcoslab": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxcostep": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcosl": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "coxidizedwaxedcostep": "waxed_oxidized_cut_copper_slab", + "coxiwacohalfblock": "waxed_oxidized_cut_copper_slab", + "coxiwacophalfblock": "waxed_oxidized_cut_copper_slab", + "coxiwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxiwacoppersl": "waxed_oxidized_cut_copper_slab", + "coxiwacopperslab": "waxed_oxidized_cut_copper_slab", + "coxiwacopperstep": "waxed_oxidized_cut_copper_slab", + "coxiwacopsl": "waxed_oxidized_cut_copper_slab", + "coxiwacopslab": "waxed_oxidized_cut_copper_slab", + "coxiwacopstep": "waxed_oxidized_cut_copper_slab", + "coxiwacosl": "waxed_oxidized_cut_copper_slab", + "coxiwacoslab": "waxed_oxidized_cut_copper_slab", + "coxiwacostep": "waxed_oxidized_cut_copper_slab", + "coxiwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "coxiwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "coxiwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxiwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "coxiwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "coxiwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "coxiwaxcopsl": "waxed_oxidized_cut_copper_slab", + "coxiwaxcopslab": "waxed_oxidized_cut_copper_slab", + "coxiwaxcopstep": "waxed_oxidized_cut_copper_slab", + "coxiwaxcosl": "waxed_oxidized_cut_copper_slab", + "coxiwaxcoslab": "waxed_oxidized_cut_copper_slab", + "coxiwaxcostep": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcosl": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "coxiwaxedcostep": "waxed_oxidized_cut_copper_slab", + "coxywacohalfblock": "waxed_oxidized_cut_copper_slab", + "coxywacophalfblock": "waxed_oxidized_cut_copper_slab", + "coxywacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxywacoppersl": "waxed_oxidized_cut_copper_slab", + "coxywacopperslab": "waxed_oxidized_cut_copper_slab", + "coxywacopperstep": "waxed_oxidized_cut_copper_slab", + "coxywacopsl": "waxed_oxidized_cut_copper_slab", + "coxywacopslab": "waxed_oxidized_cut_copper_slab", + "coxywacopstep": "waxed_oxidized_cut_copper_slab", + "coxywacosl": "waxed_oxidized_cut_copper_slab", + "coxywacoslab": "waxed_oxidized_cut_copper_slab", + "coxywacostep": "waxed_oxidized_cut_copper_slab", + "coxywaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "coxywaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "coxywaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxywaxcoppersl": "waxed_oxidized_cut_copper_slab", + "coxywaxcopperslab": "waxed_oxidized_cut_copper_slab", + "coxywaxcopperstep": "waxed_oxidized_cut_copper_slab", + "coxywaxcopsl": "waxed_oxidized_cut_copper_slab", + "coxywaxcopslab": "waxed_oxidized_cut_copper_slab", + "coxywaxcopstep": "waxed_oxidized_cut_copper_slab", + "coxywaxcosl": "waxed_oxidized_cut_copper_slab", + "coxywaxcoslab": "waxed_oxidized_cut_copper_slab", + "coxywaxcostep": "waxed_oxidized_cut_copper_slab", + "coxywaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "coxywaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "coxywaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "coxywaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "coxywaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "coxywaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "coxywaxedcopsl": "waxed_oxidized_cut_copper_slab", + "coxywaxedcopslab": "waxed_oxidized_cut_copper_slab", + "coxywaxedcopstep": "waxed_oxidized_cut_copper_slab", + "coxywaxedcosl": "waxed_oxidized_cut_copper_slab", + "coxywaxedcoslab": "waxed_oxidized_cut_copper_slab", + "coxywaxedcostep": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacopsl": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacopslab": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacopstep": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacosl": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacoslab": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwacostep": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcopsl": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcopslab": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcopstep": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcosl": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcoslab": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxcostep": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcosl": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "cutoxidisedwaxedcostep": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacopsl": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacopslab": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacopstep": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacosl": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacoslab": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwacostep": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcopsl": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcopslab": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcopstep": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcosl": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcoslab": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxcostep": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcosl": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "cutoxidizedwaxedcostep": "waxed_oxidized_cut_copper_slab", + "cutoxiwacohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxiwacophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxiwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxiwacoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxiwacopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxiwacopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxiwacopsl": "waxed_oxidized_cut_copper_slab", + "cutoxiwacopslab": "waxed_oxidized_cut_copper_slab", + "cutoxiwacopstep": "waxed_oxidized_cut_copper_slab", + "cutoxiwacosl": "waxed_oxidized_cut_copper_slab", + "cutoxiwacoslab": "waxed_oxidized_cut_copper_slab", + "cutoxiwacostep": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcopsl": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcopslab": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcopstep": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcosl": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcoslab": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxcostep": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcosl": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "cutoxiwaxedcostep": "waxed_oxidized_cut_copper_slab", + "cutoxywacohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxywacophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxywacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxywacoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxywacopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxywacopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxywacopsl": "waxed_oxidized_cut_copper_slab", + "cutoxywacopslab": "waxed_oxidized_cut_copper_slab", + "cutoxywacopstep": "waxed_oxidized_cut_copper_slab", + "cutoxywacosl": "waxed_oxidized_cut_copper_slab", + "cutoxywacoslab": "waxed_oxidized_cut_copper_slab", + "cutoxywacostep": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcopsl": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcopslab": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcopstep": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcosl": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcoslab": "waxed_oxidized_cut_copper_slab", + "cutoxywaxcostep": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcopsl": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcopslab": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcopstep": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcosl": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcoslab": "waxed_oxidized_cut_copper_slab", + "cutoxywaxedcostep": "waxed_oxidized_cut_copper_slab", + "cutwaoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxicoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaoxicopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxicopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaoxicopsl": "waxed_oxidized_cut_copper_slab", + "cutwaoxicopslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxicopstep": "waxed_oxidized_cut_copper_slab", + "cutwaoxicosl": "waxed_oxidized_cut_copper_slab", + "cutwaoxicoslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxicostep": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "cutwaoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaoxycoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaoxycopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxycopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaoxycopsl": "waxed_oxidized_cut_copper_slab", + "cutwaoxycopslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxycopstep": "waxed_oxidized_cut_copper_slab", + "cutwaoxycosl": "waxed_oxidized_cut_copper_slab", + "cutwaoxycoslab": "waxed_oxidized_cut_copper_slab", + "cutwaoxycostep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicopsl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicopslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicopstep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicosl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicoslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxicostep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycopsl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycopslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycopstep": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycosl": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycoslab": "waxed_oxidized_cut_copper_slab", + "cutwaxedoxycostep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicopsl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicopslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicopstep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicosl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicoslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxicostep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycoppersl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycopperslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycopperstep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycopsl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycopslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycopstep": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycosl": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycoslab": "waxed_oxidized_cut_copper_slab", + "cutwaxoxycostep": "waxed_oxidized_cut_copper_slab", + "cwaoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxicoppersl": "waxed_oxidized_cut_copper_slab", + "cwaoxicopperslab": "waxed_oxidized_cut_copper_slab", + "cwaoxicopperstep": "waxed_oxidized_cut_copper_slab", + "cwaoxicopsl": "waxed_oxidized_cut_copper_slab", + "cwaoxicopslab": "waxed_oxidized_cut_copper_slab", + "cwaoxicopstep": "waxed_oxidized_cut_copper_slab", + "cwaoxicosl": "waxed_oxidized_cut_copper_slab", + "cwaoxicoslab": "waxed_oxidized_cut_copper_slab", + "cwaoxicostep": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "cwaoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "cwaoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "cwaoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaoxycoppersl": "waxed_oxidized_cut_copper_slab", + "cwaoxycopperslab": "waxed_oxidized_cut_copper_slab", + "cwaoxycopperstep": "waxed_oxidized_cut_copper_slab", + "cwaoxycopsl": "waxed_oxidized_cut_copper_slab", + "cwaoxycopslab": "waxed_oxidized_cut_copper_slab", + "cwaoxycopstep": "waxed_oxidized_cut_copper_slab", + "cwaoxycosl": "waxed_oxidized_cut_copper_slab", + "cwaoxycoslab": "waxed_oxidized_cut_copper_slab", + "cwaoxycostep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicoppersl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicopperslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicopperstep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicopsl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicopslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicopstep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicosl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicoslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxicostep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycoppersl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycopperslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycopperstep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycopsl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycopslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycopstep": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycosl": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycoslab": "waxed_oxidized_cut_copper_slab", + "cwaxedoxycostep": "waxed_oxidized_cut_copper_slab", + "cwaxoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxicoppersl": "waxed_oxidized_cut_copper_slab", + "cwaxoxicopperslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxicopperstep": "waxed_oxidized_cut_copper_slab", + "cwaxoxicopsl": "waxed_oxidized_cut_copper_slab", + "cwaxoxicopslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxicopstep": "waxed_oxidized_cut_copper_slab", + "cwaxoxicosl": "waxed_oxidized_cut_copper_slab", + "cwaxoxicoslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxicostep": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "cwaxoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "cwaxoxycoppersl": "waxed_oxidized_cut_copper_slab", + "cwaxoxycopperslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxycopperstep": "waxed_oxidized_cut_copper_slab", + "cwaxoxycopsl": "waxed_oxidized_cut_copper_slab", + "cwaxoxycopslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxycopstep": "waxed_oxidized_cut_copper_slab", + "cwaxoxycosl": "waxed_oxidized_cut_copper_slab", + "cwaxoxycoslab": "waxed_oxidized_cut_copper_slab", + "cwaxoxycostep": "waxed_oxidized_cut_copper_slab", + "minecraft:waxed_oxidized_cut_copper_slab": "waxed_oxidized_cut_copper_slab", + "oxicutwacohalfblock": "waxed_oxidized_cut_copper_slab", + "oxicutwacophalfblock": "waxed_oxidized_cut_copper_slab", + "oxicutwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxicutwacoppersl": "waxed_oxidized_cut_copper_slab", + "oxicutwacopperslab": "waxed_oxidized_cut_copper_slab", + "oxicutwacopperstep": "waxed_oxidized_cut_copper_slab", + "oxicutwacopsl": "waxed_oxidized_cut_copper_slab", + "oxicutwacopslab": "waxed_oxidized_cut_copper_slab", + "oxicutwacopstep": "waxed_oxidized_cut_copper_slab", + "oxicutwacosl": "waxed_oxidized_cut_copper_slab", + "oxicutwacoslab": "waxed_oxidized_cut_copper_slab", + "oxicutwacostep": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcopsl": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcopslab": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcopstep": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcosl": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcoslab": "waxed_oxidized_cut_copper_slab", + "oxicutwaxcostep": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcosl": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "oxicutwaxedcostep": "waxed_oxidized_cut_copper_slab", + "oxicwacohalfblock": "waxed_oxidized_cut_copper_slab", + "oxicwacophalfblock": "waxed_oxidized_cut_copper_slab", + "oxicwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxicwacoppersl": "waxed_oxidized_cut_copper_slab", + "oxicwacopperslab": "waxed_oxidized_cut_copper_slab", + "oxicwacopperstep": "waxed_oxidized_cut_copper_slab", + "oxicwacopsl": "waxed_oxidized_cut_copper_slab", + "oxicwacopslab": "waxed_oxidized_cut_copper_slab", + "oxicwacopstep": "waxed_oxidized_cut_copper_slab", + "oxicwacosl": "waxed_oxidized_cut_copper_slab", + "oxicwacoslab": "waxed_oxidized_cut_copper_slab", + "oxicwacostep": "waxed_oxidized_cut_copper_slab", + "oxicwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxicwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxicwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxicwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "oxicwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "oxicwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "oxicwaxcopsl": "waxed_oxidized_cut_copper_slab", + "oxicwaxcopslab": "waxed_oxidized_cut_copper_slab", + "oxicwaxcopstep": "waxed_oxidized_cut_copper_slab", + "oxicwaxcosl": "waxed_oxidized_cut_copper_slab", + "oxicwaxcoslab": "waxed_oxidized_cut_copper_slab", + "oxicwaxcostep": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcosl": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "oxicwaxedcostep": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacosl": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwacostep": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcosl": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxcostep": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcosl": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcutwaxedcostep": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacosl": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcwacostep": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcosl": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxcostep": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcosl": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedcwaxedcostep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccosl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaccostep": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcosl": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwacutcostep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccosl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxccostep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcosl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxcutcostep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccosl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedccostep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcopsl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcopslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcopstep": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcosl": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcoslab": "waxed_oxidized_cut_copper_slab", + "oxidisedwaxedcutcostep": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacosl": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwacostep": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcosl": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxcostep": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcosl": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcutwaxedcostep": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacosl": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcwacostep": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcosl": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxcostep": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcosl": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedcwaxedcostep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccosl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaccostep": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcosl": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwacutcostep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccosl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxccostep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcosl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxcutcostep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccosl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedccostep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcopsl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcopslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcopstep": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcosl": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcoslab": "waxed_oxidized_cut_copper_slab", + "oxidizedwaxedcutcostep": "waxed_oxidized_cut_copper_slab", + "oxiwaccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaccoppersl": "waxed_oxidized_cut_copper_slab", + "oxiwaccopperslab": "waxed_oxidized_cut_copper_slab", + "oxiwaccopperstep": "waxed_oxidized_cut_copper_slab", + "oxiwaccopsl": "waxed_oxidized_cut_copper_slab", + "oxiwaccopslab": "waxed_oxidized_cut_copper_slab", + "oxiwaccopstep": "waxed_oxidized_cut_copper_slab", + "oxiwaccosl": "waxed_oxidized_cut_copper_slab", + "oxiwaccoslab": "waxed_oxidized_cut_copper_slab", + "oxiwaccostep": "waxed_oxidized_cut_copper_slab", + "oxiwacutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwacutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwacutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwacutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxiwacutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxiwacutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxiwacutcopsl": "waxed_oxidized_cut_copper_slab", + "oxiwacutcopslab": "waxed_oxidized_cut_copper_slab", + "oxiwacutcopstep": "waxed_oxidized_cut_copper_slab", + "oxiwacutcosl": "waxed_oxidized_cut_copper_slab", + "oxiwacutcoslab": "waxed_oxidized_cut_copper_slab", + "oxiwacutcostep": "waxed_oxidized_cut_copper_slab", + "oxiwaxccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxccoppersl": "waxed_oxidized_cut_copper_slab", + "oxiwaxccopperslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxccopperstep": "waxed_oxidized_cut_copper_slab", + "oxiwaxccopsl": "waxed_oxidized_cut_copper_slab", + "oxiwaxccopslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxccopstep": "waxed_oxidized_cut_copper_slab", + "oxiwaxccosl": "waxed_oxidized_cut_copper_slab", + "oxiwaxccoslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxccostep": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcopsl": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcopslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcopstep": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcosl": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcoslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxcutcostep": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccoppersl": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccopperslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccopperstep": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccopsl": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccopslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccopstep": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccosl": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccoslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxedccostep": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcopsl": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcopslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcopstep": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcosl": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcoslab": "waxed_oxidized_cut_copper_slab", + "oxiwaxedcutcostep": "waxed_oxidized_cut_copper_slab", + "oxycutwacohalfblock": "waxed_oxidized_cut_copper_slab", + "oxycutwacophalfblock": "waxed_oxidized_cut_copper_slab", + "oxycutwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxycutwacoppersl": "waxed_oxidized_cut_copper_slab", + "oxycutwacopperslab": "waxed_oxidized_cut_copper_slab", + "oxycutwacopperstep": "waxed_oxidized_cut_copper_slab", + "oxycutwacopsl": "waxed_oxidized_cut_copper_slab", + "oxycutwacopslab": "waxed_oxidized_cut_copper_slab", + "oxycutwacopstep": "waxed_oxidized_cut_copper_slab", + "oxycutwacosl": "waxed_oxidized_cut_copper_slab", + "oxycutwacoslab": "waxed_oxidized_cut_copper_slab", + "oxycutwacostep": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcopsl": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcopslab": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcopstep": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcosl": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcoslab": "waxed_oxidized_cut_copper_slab", + "oxycutwaxcostep": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcosl": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "oxycutwaxedcostep": "waxed_oxidized_cut_copper_slab", + "oxycwacohalfblock": "waxed_oxidized_cut_copper_slab", + "oxycwacophalfblock": "waxed_oxidized_cut_copper_slab", + "oxycwacopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxycwacoppersl": "waxed_oxidized_cut_copper_slab", + "oxycwacopperslab": "waxed_oxidized_cut_copper_slab", + "oxycwacopperstep": "waxed_oxidized_cut_copper_slab", + "oxycwacopsl": "waxed_oxidized_cut_copper_slab", + "oxycwacopslab": "waxed_oxidized_cut_copper_slab", + "oxycwacopstep": "waxed_oxidized_cut_copper_slab", + "oxycwacosl": "waxed_oxidized_cut_copper_slab", + "oxycwacoslab": "waxed_oxidized_cut_copper_slab", + "oxycwacostep": "waxed_oxidized_cut_copper_slab", + "oxycwaxcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxycwaxcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxycwaxcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxycwaxcoppersl": "waxed_oxidized_cut_copper_slab", + "oxycwaxcopperslab": "waxed_oxidized_cut_copper_slab", + "oxycwaxcopperstep": "waxed_oxidized_cut_copper_slab", + "oxycwaxcopsl": "waxed_oxidized_cut_copper_slab", + "oxycwaxcopslab": "waxed_oxidized_cut_copper_slab", + "oxycwaxcopstep": "waxed_oxidized_cut_copper_slab", + "oxycwaxcosl": "waxed_oxidized_cut_copper_slab", + "oxycwaxcoslab": "waxed_oxidized_cut_copper_slab", + "oxycwaxcostep": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcoppersl": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcopperslab": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcopperstep": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcopsl": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcopslab": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcopstep": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcosl": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcoslab": "waxed_oxidized_cut_copper_slab", + "oxycwaxedcostep": "waxed_oxidized_cut_copper_slab", + "oxywaccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaccoppersl": "waxed_oxidized_cut_copper_slab", + "oxywaccopperslab": "waxed_oxidized_cut_copper_slab", + "oxywaccopperstep": "waxed_oxidized_cut_copper_slab", + "oxywaccopsl": "waxed_oxidized_cut_copper_slab", + "oxywaccopslab": "waxed_oxidized_cut_copper_slab", + "oxywaccopstep": "waxed_oxidized_cut_copper_slab", + "oxywaccosl": "waxed_oxidized_cut_copper_slab", + "oxywaccoslab": "waxed_oxidized_cut_copper_slab", + "oxywaccostep": "waxed_oxidized_cut_copper_slab", + "oxywacutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxywacutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxywacutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxywacutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxywacutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxywacutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxywacutcopsl": "waxed_oxidized_cut_copper_slab", + "oxywacutcopslab": "waxed_oxidized_cut_copper_slab", + "oxywacutcopstep": "waxed_oxidized_cut_copper_slab", + "oxywacutcosl": "waxed_oxidized_cut_copper_slab", + "oxywacutcoslab": "waxed_oxidized_cut_copper_slab", + "oxywacutcostep": "waxed_oxidized_cut_copper_slab", + "oxywaxccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxccoppersl": "waxed_oxidized_cut_copper_slab", + "oxywaxccopperslab": "waxed_oxidized_cut_copper_slab", + "oxywaxccopperstep": "waxed_oxidized_cut_copper_slab", + "oxywaxccopsl": "waxed_oxidized_cut_copper_slab", + "oxywaxccopslab": "waxed_oxidized_cut_copper_slab", + "oxywaxccopstep": "waxed_oxidized_cut_copper_slab", + "oxywaxccosl": "waxed_oxidized_cut_copper_slab", + "oxywaxccoslab": "waxed_oxidized_cut_copper_slab", + "oxywaxccostep": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcopsl": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcopslab": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcopstep": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcosl": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcoslab": "waxed_oxidized_cut_copper_slab", + "oxywaxcutcostep": "waxed_oxidized_cut_copper_slab", + "oxywaxedccohalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxedccophalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxedccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxedccoppersl": "waxed_oxidized_cut_copper_slab", + "oxywaxedccopperslab": "waxed_oxidized_cut_copper_slab", + "oxywaxedccopperstep": "waxed_oxidized_cut_copper_slab", + "oxywaxedccopsl": "waxed_oxidized_cut_copper_slab", + "oxywaxedccopslab": "waxed_oxidized_cut_copper_slab", + "oxywaxedccopstep": "waxed_oxidized_cut_copper_slab", + "oxywaxedccosl": "waxed_oxidized_cut_copper_slab", + "oxywaxedccoslab": "waxed_oxidized_cut_copper_slab", + "oxywaxedccostep": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcoppersl": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcopperslab": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcopperstep": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcopsl": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcopslab": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcopstep": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcosl": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcoslab": "waxed_oxidized_cut_copper_slab", + "oxywaxedcutcostep": "waxed_oxidized_cut_copper_slab", + "wacoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxicoppersl": "waxed_oxidized_cut_copper_slab", + "wacoxicopperslab": "waxed_oxidized_cut_copper_slab", + "wacoxicopperstep": "waxed_oxidized_cut_copper_slab", + "wacoxicopsl": "waxed_oxidized_cut_copper_slab", + "wacoxicopslab": "waxed_oxidized_cut_copper_slab", + "wacoxicopstep": "waxed_oxidized_cut_copper_slab", + "wacoxicosl": "waxed_oxidized_cut_copper_slab", + "wacoxicoslab": "waxed_oxidized_cut_copper_slab", + "wacoxicostep": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "wacoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "wacoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "wacoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "wacoxycoppersl": "waxed_oxidized_cut_copper_slab", + "wacoxycopperslab": "waxed_oxidized_cut_copper_slab", + "wacoxycopperstep": "waxed_oxidized_cut_copper_slab", + "wacoxycopsl": "waxed_oxidized_cut_copper_slab", + "wacoxycopslab": "waxed_oxidized_cut_copper_slab", + "wacoxycopstep": "waxed_oxidized_cut_copper_slab", + "wacoxycosl": "waxed_oxidized_cut_copper_slab", + "wacoxycoslab": "waxed_oxidized_cut_copper_slab", + "wacoxycostep": "waxed_oxidized_cut_copper_slab", + "wacutoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxicoppersl": "waxed_oxidized_cut_copper_slab", + "wacutoxicopperslab": "waxed_oxidized_cut_copper_slab", + "wacutoxicopperstep": "waxed_oxidized_cut_copper_slab", + "wacutoxicopsl": "waxed_oxidized_cut_copper_slab", + "wacutoxicopslab": "waxed_oxidized_cut_copper_slab", + "wacutoxicopstep": "waxed_oxidized_cut_copper_slab", + "wacutoxicosl": "waxed_oxidized_cut_copper_slab", + "wacutoxicoslab": "waxed_oxidized_cut_copper_slab", + "wacutoxicostep": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "wacutoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "wacutoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "wacutoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "wacutoxycoppersl": "waxed_oxidized_cut_copper_slab", + "wacutoxycopperslab": "waxed_oxidized_cut_copper_slab", + "wacutoxycopperstep": "waxed_oxidized_cut_copper_slab", + "wacutoxycopsl": "waxed_oxidized_cut_copper_slab", + "wacutoxycopslab": "waxed_oxidized_cut_copper_slab", + "wacutoxycopstep": "waxed_oxidized_cut_copper_slab", + "wacutoxycosl": "waxed_oxidized_cut_copper_slab", + "wacutoxycoslab": "waxed_oxidized_cut_copper_slab", + "wacutoxycostep": "waxed_oxidized_cut_copper_slab", + "waoxiccohalfblock": "waxed_oxidized_cut_copper_slab", + "waoxiccophalfblock": "waxed_oxidized_cut_copper_slab", + "waoxiccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waoxiccoppersl": "waxed_oxidized_cut_copper_slab", + "waoxiccopperslab": "waxed_oxidized_cut_copper_slab", + "waoxiccopperstep": "waxed_oxidized_cut_copper_slab", + "waoxiccopsl": "waxed_oxidized_cut_copper_slab", + "waoxiccopslab": "waxed_oxidized_cut_copper_slab", + "waoxiccopstep": "waxed_oxidized_cut_copper_slab", + "waoxiccosl": "waxed_oxidized_cut_copper_slab", + "waoxiccoslab": "waxed_oxidized_cut_copper_slab", + "waoxiccostep": "waxed_oxidized_cut_copper_slab", + "waoxicutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waoxicutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waoxicutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waoxicutcoppersl": "waxed_oxidized_cut_copper_slab", + "waoxicutcopperslab": "waxed_oxidized_cut_copper_slab", + "waoxicutcopperstep": "waxed_oxidized_cut_copper_slab", + "waoxicutcopsl": "waxed_oxidized_cut_copper_slab", + "waoxicutcopslab": "waxed_oxidized_cut_copper_slab", + "waoxicutcopstep": "waxed_oxidized_cut_copper_slab", + "waoxicutcosl": "waxed_oxidized_cut_copper_slab", + "waoxicutcoslab": "waxed_oxidized_cut_copper_slab", + "waoxicutcostep": "waxed_oxidized_cut_copper_slab", + "waoxidisedccohalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidisedccophalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidisedccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidisedccoppersl": "waxed_oxidized_cut_copper_slab", + "waoxidisedccopperslab": "waxed_oxidized_cut_copper_slab", + "waoxidisedccopperstep": "waxed_oxidized_cut_copper_slab", + "waoxidisedccopsl": "waxed_oxidized_cut_copper_slab", + "waoxidisedccopslab": "waxed_oxidized_cut_copper_slab", + "waoxidisedccopstep": "waxed_oxidized_cut_copper_slab", + "waoxidisedccosl": "waxed_oxidized_cut_copper_slab", + "waoxidisedccoslab": "waxed_oxidized_cut_copper_slab", + "waoxidisedccostep": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcoppersl": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcopperslab": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcopperstep": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcopsl": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcopslab": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcopstep": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcosl": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcoslab": "waxed_oxidized_cut_copper_slab", + "waoxidisedcutcostep": "waxed_oxidized_cut_copper_slab", + "waoxidizedccohalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidizedccophalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidizedccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidizedccoppersl": "waxed_oxidized_cut_copper_slab", + "waoxidizedccopperslab": "waxed_oxidized_cut_copper_slab", + "waoxidizedccopperstep": "waxed_oxidized_cut_copper_slab", + "waoxidizedccopsl": "waxed_oxidized_cut_copper_slab", + "waoxidizedccopslab": "waxed_oxidized_cut_copper_slab", + "waoxidizedccopstep": "waxed_oxidized_cut_copper_slab", + "waoxidizedccosl": "waxed_oxidized_cut_copper_slab", + "waoxidizedccoslab": "waxed_oxidized_cut_copper_slab", + "waoxidizedccostep": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcoppersl": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcopperslab": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcopperstep": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcopsl": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcopslab": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcopstep": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcosl": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcoslab": "waxed_oxidized_cut_copper_slab", + "waoxidizedcutcostep": "waxed_oxidized_cut_copper_slab", + "waoxyccohalfblock": "waxed_oxidized_cut_copper_slab", + "waoxyccophalfblock": "waxed_oxidized_cut_copper_slab", + "waoxyccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waoxyccoppersl": "waxed_oxidized_cut_copper_slab", + "waoxyccopperslab": "waxed_oxidized_cut_copper_slab", + "waoxyccopperstep": "waxed_oxidized_cut_copper_slab", + "waoxyccopsl": "waxed_oxidized_cut_copper_slab", + "waoxyccopslab": "waxed_oxidized_cut_copper_slab", + "waoxyccopstep": "waxed_oxidized_cut_copper_slab", + "waoxyccosl": "waxed_oxidized_cut_copper_slab", + "waoxyccoslab": "waxed_oxidized_cut_copper_slab", + "waoxyccostep": "waxed_oxidized_cut_copper_slab", + "waoxycutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waoxycutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waoxycutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waoxycutcoppersl": "waxed_oxidized_cut_copper_slab", + "waoxycutcopperslab": "waxed_oxidized_cut_copper_slab", + "waoxycutcopperstep": "waxed_oxidized_cut_copper_slab", + "waoxycutcopsl": "waxed_oxidized_cut_copper_slab", + "waoxycutcopslab": "waxed_oxidized_cut_copper_slab", + "waoxycutcopstep": "waxed_oxidized_cut_copper_slab", + "waoxycutcosl": "waxed_oxidized_cut_copper_slab", + "waoxycutcoslab": "waxed_oxidized_cut_copper_slab", + "waoxycutcostep": "waxed_oxidized_cut_copper_slab", + "waxcoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxicoppersl": "waxed_oxidized_cut_copper_slab", + "waxcoxicopperslab": "waxed_oxidized_cut_copper_slab", + "waxcoxicopperstep": "waxed_oxidized_cut_copper_slab", + "waxcoxicopsl": "waxed_oxidized_cut_copper_slab", + "waxcoxicopslab": "waxed_oxidized_cut_copper_slab", + "waxcoxicopstep": "waxed_oxidized_cut_copper_slab", + "waxcoxicosl": "waxed_oxidized_cut_copper_slab", + "waxcoxicoslab": "waxed_oxidized_cut_copper_slab", + "waxcoxicostep": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "waxcoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "waxcoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "waxcoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxcoxycoppersl": "waxed_oxidized_cut_copper_slab", + "waxcoxycopperslab": "waxed_oxidized_cut_copper_slab", + "waxcoxycopperstep": "waxed_oxidized_cut_copper_slab", + "waxcoxycopsl": "waxed_oxidized_cut_copper_slab", + "waxcoxycopslab": "waxed_oxidized_cut_copper_slab", + "waxcoxycopstep": "waxed_oxidized_cut_copper_slab", + "waxcoxycosl": "waxed_oxidized_cut_copper_slab", + "waxcoxycoslab": "waxed_oxidized_cut_copper_slab", + "waxcoxycostep": "waxed_oxidized_cut_copper_slab", + "waxcutoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxicoppersl": "waxed_oxidized_cut_copper_slab", + "waxcutoxicopperslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxicopperstep": "waxed_oxidized_cut_copper_slab", + "waxcutoxicopsl": "waxed_oxidized_cut_copper_slab", + "waxcutoxicopslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxicopstep": "waxed_oxidized_cut_copper_slab", + "waxcutoxicosl": "waxed_oxidized_cut_copper_slab", + "waxcutoxicoslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxicostep": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "waxcutoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxcutoxycoppersl": "waxed_oxidized_cut_copper_slab", + "waxcutoxycopperslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxycopperstep": "waxed_oxidized_cut_copper_slab", + "waxcutoxycopsl": "waxed_oxidized_cut_copper_slab", + "waxcutoxycopslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxycopstep": "waxed_oxidized_cut_copper_slab", + "waxcutoxycosl": "waxed_oxidized_cut_copper_slab", + "waxcutoxycoslab": "waxed_oxidized_cut_copper_slab", + "waxcutoxycostep": "waxed_oxidized_cut_copper_slab", + "waxedcoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxicoppersl": "waxed_oxidized_cut_copper_slab", + "waxedcoxicopperslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxicopperstep": "waxed_oxidized_cut_copper_slab", + "waxedcoxicopsl": "waxed_oxidized_cut_copper_slab", + "waxedcoxicopslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxicopstep": "waxed_oxidized_cut_copper_slab", + "waxedcoxicosl": "waxed_oxidized_cut_copper_slab", + "waxedcoxicoslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxicostep": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "waxedcoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcoxycoppersl": "waxed_oxidized_cut_copper_slab", + "waxedcoxycopperslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxycopperstep": "waxed_oxidized_cut_copper_slab", + "waxedcoxycopsl": "waxed_oxidized_cut_copper_slab", + "waxedcoxycopslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxycopstep": "waxed_oxidized_cut_copper_slab", + "waxedcoxycosl": "waxed_oxidized_cut_copper_slab", + "waxedcoxycoslab": "waxed_oxidized_cut_copper_slab", + "waxedcoxycostep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicoppersl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicopperslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicopperstep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicopsl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicopslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicopstep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicosl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicoslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxicostep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcoppersl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcopperslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcopperstep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcopsl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcopslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcopstep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcosl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcoslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidisedcostep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcoppersl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcopperslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcopperstep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcopsl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcopslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcopstep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcosl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcoslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxidizedcostep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycoppersl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycopperslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycopperstep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycopsl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycopslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycopstep": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycosl": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycoslab": "waxed_oxidized_cut_copper_slab", + "waxedcutoxycostep": "waxed_oxidized_cut_copper_slab", + "waxedoxiccohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxiccophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxiccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxiccoppersl": "waxed_oxidized_cut_copper_slab", + "waxedoxiccopperslab": "waxed_oxidized_cut_copper_slab", + "waxedoxiccopperstep": "waxed_oxidized_cut_copper_slab", + "waxedoxiccopsl": "waxed_oxidized_cut_copper_slab", + "waxedoxiccopslab": "waxed_oxidized_cut_copper_slab", + "waxedoxiccopstep": "waxed_oxidized_cut_copper_slab", + "waxedoxiccosl": "waxed_oxidized_cut_copper_slab", + "waxedoxiccoslab": "waxed_oxidized_cut_copper_slab", + "waxedoxiccostep": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcoppersl": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcopperslab": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcopperstep": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcopsl": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcopslab": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcopstep": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcosl": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcoslab": "waxed_oxidized_cut_copper_slab", + "waxedoxicutcostep": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccoppersl": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccopperslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccopperstep": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccopsl": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccopslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccopstep": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccosl": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccoslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedccostep": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcoppersl": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcopperslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcopperstep": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcopsl": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcopslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcopstep": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcosl": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcoslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidisedcutcostep": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccoppersl": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccopperslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccopperstep": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccopsl": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccopslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccopstep": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccosl": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccoslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedccostep": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcoppersl": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcopperslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcopperstep": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcopsl": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcopslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcopstep": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcosl": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcoslab": "waxed_oxidized_cut_copper_slab", + "waxedoxidizedcutcostep": "waxed_oxidized_cut_copper_slab", + "waxedoxyccohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxyccophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxyccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxyccoppersl": "waxed_oxidized_cut_copper_slab", + "waxedoxyccopperslab": "waxed_oxidized_cut_copper_slab", + "waxedoxyccopperstep": "waxed_oxidized_cut_copper_slab", + "waxedoxyccopsl": "waxed_oxidized_cut_copper_slab", + "waxedoxyccopslab": "waxed_oxidized_cut_copper_slab", + "waxedoxyccopstep": "waxed_oxidized_cut_copper_slab", + "waxedoxyccosl": "waxed_oxidized_cut_copper_slab", + "waxedoxyccoslab": "waxed_oxidized_cut_copper_slab", + "waxedoxyccostep": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcoppersl": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcopperslab": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcopperstep": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcopsl": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcopslab": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcopstep": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcosl": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcoslab": "waxed_oxidized_cut_copper_slab", + "waxedoxycutcostep": "waxed_oxidized_cut_copper_slab", + "waxoxiccohalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxiccophalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxiccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxiccoppersl": "waxed_oxidized_cut_copper_slab", + "waxoxiccopperslab": "waxed_oxidized_cut_copper_slab", + "waxoxiccopperstep": "waxed_oxidized_cut_copper_slab", + "waxoxiccopsl": "waxed_oxidized_cut_copper_slab", + "waxoxiccopslab": "waxed_oxidized_cut_copper_slab", + "waxoxiccopstep": "waxed_oxidized_cut_copper_slab", + "waxoxiccosl": "waxed_oxidized_cut_copper_slab", + "waxoxiccoslab": "waxed_oxidized_cut_copper_slab", + "waxoxiccostep": "waxed_oxidized_cut_copper_slab", + "waxoxicutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxicutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxicutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxicutcoppersl": "waxed_oxidized_cut_copper_slab", + "waxoxicutcopperslab": "waxed_oxidized_cut_copper_slab", + "waxoxicutcopperstep": "waxed_oxidized_cut_copper_slab", + "waxoxicutcopsl": "waxed_oxidized_cut_copper_slab", + "waxoxicutcopslab": "waxed_oxidized_cut_copper_slab", + "waxoxicutcopstep": "waxed_oxidized_cut_copper_slab", + "waxoxicutcosl": "waxed_oxidized_cut_copper_slab", + "waxoxicutcoslab": "waxed_oxidized_cut_copper_slab", + "waxoxicutcostep": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccohalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccophalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccoppersl": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccopperslab": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccopperstep": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccopsl": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccopslab": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccopstep": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccosl": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccoslab": "waxed_oxidized_cut_copper_slab", + "waxoxidisedccostep": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcoppersl": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcopperslab": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcopperstep": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcopsl": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcopslab": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcopstep": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcosl": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcoslab": "waxed_oxidized_cut_copper_slab", + "waxoxidisedcutcostep": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccohalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccophalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccoppersl": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccopperslab": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccopperstep": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccopsl": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccopslab": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccopstep": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccosl": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccoslab": "waxed_oxidized_cut_copper_slab", + "waxoxidizedccostep": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcoppersl": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcopperslab": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcopperstep": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcopsl": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcopslab": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcopstep": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcosl": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcoslab": "waxed_oxidized_cut_copper_slab", + "waxoxidizedcutcostep": "waxed_oxidized_cut_copper_slab", + "waxoxyccohalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxyccophalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxyccopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxyccoppersl": "waxed_oxidized_cut_copper_slab", + "waxoxyccopperslab": "waxed_oxidized_cut_copper_slab", + "waxoxyccopperstep": "waxed_oxidized_cut_copper_slab", + "waxoxyccopsl": "waxed_oxidized_cut_copper_slab", + "waxoxyccopslab": "waxed_oxidized_cut_copper_slab", + "waxoxyccopstep": "waxed_oxidized_cut_copper_slab", + "waxoxyccosl": "waxed_oxidized_cut_copper_slab", + "waxoxyccoslab": "waxed_oxidized_cut_copper_slab", + "waxoxyccostep": "waxed_oxidized_cut_copper_slab", + "waxoxycutcohalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxycutcophalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxycutcopperhalfblock": "waxed_oxidized_cut_copper_slab", + "waxoxycutcoppersl": "waxed_oxidized_cut_copper_slab", + "waxoxycutcopperslab": "waxed_oxidized_cut_copper_slab", + "waxoxycutcopperstep": "waxed_oxidized_cut_copper_slab", + "waxoxycutcopsl": "waxed_oxidized_cut_copper_slab", + "waxoxycutcopslab": "waxed_oxidized_cut_copper_slab", + "waxoxycutcopstep": "waxed_oxidized_cut_copper_slab", + "waxoxycutcosl": "waxed_oxidized_cut_copper_slab", + "waxoxycutcoslab": "waxed_oxidized_cut_copper_slab", + "waxoxycutcostep": "waxed_oxidized_cut_copper_slab", + "waxed_oxidized_cut_copper_stairs": { + "material": "WAXED_OXIDIZED_CUT_COPPER_STAIRS" + }, + "coxidisedwacopperstair": "waxed_oxidized_cut_copper_stairs", + "coxidisedwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxidisedwacopstair": "waxed_oxidized_cut_copper_stairs", + "coxidisedwacopstairs": "waxed_oxidized_cut_copper_stairs", + "coxidisedwacostair": "waxed_oxidized_cut_copper_stairs", + "coxidisedwacostairs": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxcostair": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "coxidisedwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "coxidizedwacopperstair": "waxed_oxidized_cut_copper_stairs", + "coxidizedwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxidizedwacopstair": "waxed_oxidized_cut_copper_stairs", + "coxidizedwacopstairs": "waxed_oxidized_cut_copper_stairs", + "coxidizedwacostair": "waxed_oxidized_cut_copper_stairs", + "coxidizedwacostairs": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxcostair": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "coxidizedwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "coxiwacopperstair": "waxed_oxidized_cut_copper_stairs", + "coxiwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxiwacopstair": "waxed_oxidized_cut_copper_stairs", + "coxiwacopstairs": "waxed_oxidized_cut_copper_stairs", + "coxiwacostair": "waxed_oxidized_cut_copper_stairs", + "coxiwacostairs": "waxed_oxidized_cut_copper_stairs", + "coxiwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "coxiwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxiwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "coxiwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "coxiwaxcostair": "waxed_oxidized_cut_copper_stairs", + "coxiwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "coxiwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "coxiwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxiwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "coxiwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "coxiwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "coxiwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "coxywacopperstair": "waxed_oxidized_cut_copper_stairs", + "coxywacopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxywacopstair": "waxed_oxidized_cut_copper_stairs", + "coxywacopstairs": "waxed_oxidized_cut_copper_stairs", + "coxywacostair": "waxed_oxidized_cut_copper_stairs", + "coxywacostairs": "waxed_oxidized_cut_copper_stairs", + "coxywaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "coxywaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxywaxcopstair": "waxed_oxidized_cut_copper_stairs", + "coxywaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "coxywaxcostair": "waxed_oxidized_cut_copper_stairs", + "coxywaxcostairs": "waxed_oxidized_cut_copper_stairs", + "coxywaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "coxywaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "coxywaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "coxywaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "coxywaxedcostair": "waxed_oxidized_cut_copper_stairs", + "coxywaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwacopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwacopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwacopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwacostair": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwacostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxcostair": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "cutoxidisedwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwacopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwacopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwacopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwacostair": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwacostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxcostair": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "cutoxidizedwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxiwacopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxiwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxiwacopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxiwacopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxiwacostair": "waxed_oxidized_cut_copper_stairs", + "cutoxiwacostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxcostair": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "cutoxiwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxywacopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxywacopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxywacopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxywacopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxywacostair": "waxed_oxidized_cut_copper_stairs", + "cutoxywacostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxcopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxcostair": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxcostairs": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxedcostair": "waxed_oxidized_cut_copper_stairs", + "cutoxywaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxicopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxicostair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxicostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxycopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaoxycostair": "waxed_oxidized_cut_copper_stairs", + "cutwaoxycostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxicopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxicostair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxicostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxycopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxycostair": "waxed_oxidized_cut_copper_stairs", + "cutwaxedoxycostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxicopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxicostair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxicostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxycopstair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxycostair": "waxed_oxidized_cut_copper_stairs", + "cutwaxoxycostairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxicopstair": "waxed_oxidized_cut_copper_stairs", + "cwaoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxicostair": "waxed_oxidized_cut_copper_stairs", + "cwaoxicostairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "cwaoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "cwaoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "cwaoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "cwaoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxycopstair": "waxed_oxidized_cut_copper_stairs", + "cwaoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaoxycostair": "waxed_oxidized_cut_copper_stairs", + "cwaoxycostairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxicopstair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxicostair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxicostairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxycopstair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxycostair": "waxed_oxidized_cut_copper_stairs", + "cwaxedoxycostairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxicopstair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxicostair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxicostairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxycopstair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "cwaxoxycostair": "waxed_oxidized_cut_copper_stairs", + "cwaxoxycostairs": "waxed_oxidized_cut_copper_stairs", + "minecraft:waxed_oxidized_cut_copper_stairs": "waxed_oxidized_cut_copper_stairs", + "oxicutwacopperstair": "waxed_oxidized_cut_copper_stairs", + "oxicutwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxicutwacopstair": "waxed_oxidized_cut_copper_stairs", + "oxicutwacopstairs": "waxed_oxidized_cut_copper_stairs", + "oxicutwacostair": "waxed_oxidized_cut_copper_stairs", + "oxicutwacostairs": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxcostair": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "oxicutwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "oxicwacopperstair": "waxed_oxidized_cut_copper_stairs", + "oxicwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxicwacopstair": "waxed_oxidized_cut_copper_stairs", + "oxicwacopstairs": "waxed_oxidized_cut_copper_stairs", + "oxicwacostair": "waxed_oxidized_cut_copper_stairs", + "oxicwacostairs": "waxed_oxidized_cut_copper_stairs", + "oxicwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxicwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxicwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "oxicwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxicwaxcostair": "waxed_oxidized_cut_copper_stairs", + "oxicwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "oxicwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxicwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxicwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "oxicwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxicwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "oxicwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwacopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwacopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwacopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwacostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwacostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxcostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcutwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwacopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwacopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwacopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwacostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwacostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxcostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedcwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaccopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaccostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaccostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwacutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwacutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwacutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwacutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwacutcostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwacutcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxccopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxccostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxccostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxcutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxcutcostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxcutcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedccopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedccostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedccostairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedcutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedcutcostair": "waxed_oxidized_cut_copper_stairs", + "oxidisedwaxedcutcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwacopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwacopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwacopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwacostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwacostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxcostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcutwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwacopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwacopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwacopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwacostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwacostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxcostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedcwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaccopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaccostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaccostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwacutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwacutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwacutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwacutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwacutcostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwacutcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxccopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxccostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxccostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxcutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxcutcostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxcutcostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedccopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedccostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedccostairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedcutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedcutcostair": "waxed_oxidized_cut_copper_stairs", + "oxidizedwaxedcutcostairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxiwaccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaccopstair": "waxed_oxidized_cut_copper_stairs", + "oxiwaccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaccostair": "waxed_oxidized_cut_copper_stairs", + "oxiwaccostairs": "waxed_oxidized_cut_copper_stairs", + "oxiwacutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxiwacutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwacutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxiwacutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwacutcostair": "waxed_oxidized_cut_copper_stairs", + "oxiwacutcostairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxccopstair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxccostair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxccostairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxcutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxcutcostair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxcutcostairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedccopstair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedccostair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedccostairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedcutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedcutcostair": "waxed_oxidized_cut_copper_stairs", + "oxiwaxedcutcostairs": "waxed_oxidized_cut_copper_stairs", + "oxycutwacopperstair": "waxed_oxidized_cut_copper_stairs", + "oxycutwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxycutwacopstair": "waxed_oxidized_cut_copper_stairs", + "oxycutwacopstairs": "waxed_oxidized_cut_copper_stairs", + "oxycutwacostair": "waxed_oxidized_cut_copper_stairs", + "oxycutwacostairs": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxcostair": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "oxycutwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "oxycwacopperstair": "waxed_oxidized_cut_copper_stairs", + "oxycwacopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxycwacopstair": "waxed_oxidized_cut_copper_stairs", + "oxycwacopstairs": "waxed_oxidized_cut_copper_stairs", + "oxycwacostair": "waxed_oxidized_cut_copper_stairs", + "oxycwacostairs": "waxed_oxidized_cut_copper_stairs", + "oxycwaxcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxycwaxcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxycwaxcopstair": "waxed_oxidized_cut_copper_stairs", + "oxycwaxcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxycwaxcostair": "waxed_oxidized_cut_copper_stairs", + "oxycwaxcostairs": "waxed_oxidized_cut_copper_stairs", + "oxycwaxedcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxycwaxedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxycwaxedcopstair": "waxed_oxidized_cut_copper_stairs", + "oxycwaxedcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxycwaxedcostair": "waxed_oxidized_cut_copper_stairs", + "oxycwaxedcostairs": "waxed_oxidized_cut_copper_stairs", + "oxywaccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxywaccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxywaccopstair": "waxed_oxidized_cut_copper_stairs", + "oxywaccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxywaccostair": "waxed_oxidized_cut_copper_stairs", + "oxywaccostairs": "waxed_oxidized_cut_copper_stairs", + "oxywacutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxywacutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxywacutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxywacutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxywacutcostair": "waxed_oxidized_cut_copper_stairs", + "oxywacutcostairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxywaxccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxccopstair": "waxed_oxidized_cut_copper_stairs", + "oxywaxccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxccostair": "waxed_oxidized_cut_copper_stairs", + "oxywaxccostairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxywaxcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxcutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxywaxcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxcutcostair": "waxed_oxidized_cut_copper_stairs", + "oxywaxcutcostairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxedccopperstair": "waxed_oxidized_cut_copper_stairs", + "oxywaxedccopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxedccopstair": "waxed_oxidized_cut_copper_stairs", + "oxywaxedccopstairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxedccostair": "waxed_oxidized_cut_copper_stairs", + "oxywaxedccostairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxedcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "oxywaxedcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxedcutcopstair": "waxed_oxidized_cut_copper_stairs", + "oxywaxedcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "oxywaxedcutcostair": "waxed_oxidized_cut_copper_stairs", + "oxywaxedcutcostairs": "waxed_oxidized_cut_copper_stairs", + "wacoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "wacoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "wacoxicopstair": "waxed_oxidized_cut_copper_stairs", + "wacoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "wacoxicostair": "waxed_oxidized_cut_copper_stairs", + "wacoxicostairs": "waxed_oxidized_cut_copper_stairs", + "wacoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "wacoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "wacoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "wacoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "wacoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "wacoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "wacoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "wacoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "wacoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "wacoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "wacoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "wacoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "wacoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "wacoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "wacoxycopstair": "waxed_oxidized_cut_copper_stairs", + "wacoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "wacoxycostair": "waxed_oxidized_cut_copper_stairs", + "wacoxycostairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "wacutoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxicopstair": "waxed_oxidized_cut_copper_stairs", + "wacutoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxicostair": "waxed_oxidized_cut_copper_stairs", + "wacutoxicostairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "wacutoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "wacutoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "wacutoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "wacutoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "wacutoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "wacutoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "wacutoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxycopstair": "waxed_oxidized_cut_copper_stairs", + "wacutoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "wacutoxycostair": "waxed_oxidized_cut_copper_stairs", + "wacutoxycostairs": "waxed_oxidized_cut_copper_stairs", + "waoxiccopperstair": "waxed_oxidized_cut_copper_stairs", + "waoxiccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waoxiccopstair": "waxed_oxidized_cut_copper_stairs", + "waoxiccopstairs": "waxed_oxidized_cut_copper_stairs", + "waoxiccostair": "waxed_oxidized_cut_copper_stairs", + "waoxiccostairs": "waxed_oxidized_cut_copper_stairs", + "waoxicutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waoxicutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waoxicutcopstair": "waxed_oxidized_cut_copper_stairs", + "waoxicutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waoxicutcostair": "waxed_oxidized_cut_copper_stairs", + "waoxicutcostairs": "waxed_oxidized_cut_copper_stairs", + "waoxidisedccopperstair": "waxed_oxidized_cut_copper_stairs", + "waoxidisedccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waoxidisedccopstair": "waxed_oxidized_cut_copper_stairs", + "waoxidisedccopstairs": "waxed_oxidized_cut_copper_stairs", + "waoxidisedccostair": "waxed_oxidized_cut_copper_stairs", + "waoxidisedccostairs": "waxed_oxidized_cut_copper_stairs", + "waoxidisedcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waoxidisedcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waoxidisedcutcopstair": "waxed_oxidized_cut_copper_stairs", + "waoxidisedcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waoxidisedcutcostair": "waxed_oxidized_cut_copper_stairs", + "waoxidisedcutcostairs": "waxed_oxidized_cut_copper_stairs", + "waoxidizedccopperstair": "waxed_oxidized_cut_copper_stairs", + "waoxidizedccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waoxidizedccopstair": "waxed_oxidized_cut_copper_stairs", + "waoxidizedccopstairs": "waxed_oxidized_cut_copper_stairs", + "waoxidizedccostair": "waxed_oxidized_cut_copper_stairs", + "waoxidizedccostairs": "waxed_oxidized_cut_copper_stairs", + "waoxidizedcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waoxidizedcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waoxidizedcutcopstair": "waxed_oxidized_cut_copper_stairs", + "waoxidizedcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waoxidizedcutcostair": "waxed_oxidized_cut_copper_stairs", + "waoxidizedcutcostairs": "waxed_oxidized_cut_copper_stairs", + "waoxyccopperstair": "waxed_oxidized_cut_copper_stairs", + "waoxyccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waoxyccopstair": "waxed_oxidized_cut_copper_stairs", + "waoxyccopstairs": "waxed_oxidized_cut_copper_stairs", + "waoxyccostair": "waxed_oxidized_cut_copper_stairs", + "waoxyccostairs": "waxed_oxidized_cut_copper_stairs", + "waoxycutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waoxycutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waoxycutcopstair": "waxed_oxidized_cut_copper_stairs", + "waoxycutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waoxycutcostair": "waxed_oxidized_cut_copper_stairs", + "waoxycutcostairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "waxcoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxicopstair": "waxed_oxidized_cut_copper_stairs", + "waxcoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxicostair": "waxed_oxidized_cut_copper_stairs", + "waxcoxicostairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxcoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "waxcoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "waxcoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxcoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "waxcoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "waxcoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "waxcoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxycopstair": "waxed_oxidized_cut_copper_stairs", + "waxcoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "waxcoxycostair": "waxed_oxidized_cut_copper_stairs", + "waxcoxycostairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxicopstair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxicostair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxicostairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxycopstair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "waxcutoxycostair": "waxed_oxidized_cut_copper_stairs", + "waxcutoxycostairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxicopstair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxicostair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxicostairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxycopstair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcoxycostair": "waxed_oxidized_cut_copper_stairs", + "waxedcoxycostairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxicopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxicopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxicopstair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxicopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxicostair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxicostairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidisedcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidisedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidisedcopstair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidisedcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidisedcostair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidisedcostairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidizedcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidizedcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidizedcopstair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidizedcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidizedcostair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxidizedcostairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxycopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxycopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxycopstair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxycopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxycostair": "waxed_oxidized_cut_copper_stairs", + "waxedcutoxycostairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxiccopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxiccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxiccopstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxiccopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxiccostair": "waxed_oxidized_cut_copper_stairs", + "waxedoxiccostairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxicutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxicutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxicutcopstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxicutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxicutcostair": "waxed_oxidized_cut_copper_stairs", + "waxedoxicutcostairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedccopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedccopstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedccopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedccostair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedccostairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedcutcopstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedcutcostair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidisedcutcostairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedccopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedccopstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedccopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedccostair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedccostairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedcutcopstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedcutcostair": "waxed_oxidized_cut_copper_stairs", + "waxedoxidizedcutcostairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxyccopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxyccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxyccopstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxyccopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxyccostair": "waxed_oxidized_cut_copper_stairs", + "waxedoxyccostairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxycutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxycutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxycutcopstair": "waxed_oxidized_cut_copper_stairs", + "waxedoxycutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxedoxycutcostair": "waxed_oxidized_cut_copper_stairs", + "waxedoxycutcostairs": "waxed_oxidized_cut_copper_stairs", + "waxoxiccopperstair": "waxed_oxidized_cut_copper_stairs", + "waxoxiccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxiccopstair": "waxed_oxidized_cut_copper_stairs", + "waxoxiccopstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxiccostair": "waxed_oxidized_cut_copper_stairs", + "waxoxiccostairs": "waxed_oxidized_cut_copper_stairs", + "waxoxicutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxoxicutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxicutcopstair": "waxed_oxidized_cut_copper_stairs", + "waxoxicutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxicutcostair": "waxed_oxidized_cut_copper_stairs", + "waxoxicutcostairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedccopperstair": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedccopstair": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedccopstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedccostair": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedccostairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedcutcopstair": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedcutcostair": "waxed_oxidized_cut_copper_stairs", + "waxoxidisedcutcostairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedccopperstair": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedccopstair": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedccopstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedccostair": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedccostairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedcutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedcutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedcutcopstair": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedcutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedcutcostair": "waxed_oxidized_cut_copper_stairs", + "waxoxidizedcutcostairs": "waxed_oxidized_cut_copper_stairs", + "waxoxyccopperstair": "waxed_oxidized_cut_copper_stairs", + "waxoxyccopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxyccopstair": "waxed_oxidized_cut_copper_stairs", + "waxoxyccopstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxyccostair": "waxed_oxidized_cut_copper_stairs", + "waxoxyccostairs": "waxed_oxidized_cut_copper_stairs", + "waxoxycutcopperstair": "waxed_oxidized_cut_copper_stairs", + "waxoxycutcopperstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxycutcopstair": "waxed_oxidized_cut_copper_stairs", + "waxoxycutcopstairs": "waxed_oxidized_cut_copper_stairs", + "waxoxycutcostair": "waxed_oxidized_cut_copper_stairs", + "waxoxycutcostairs": "waxed_oxidized_cut_copper_stairs", + "waxed_weathered_copper": { + "material": "WAXED_WEATHERED_COPPER" + }, + "minecraft:waxed_weathered_copper": "waxed_weathered_copper", + "waweathercoblock": "waxed_weathered_copper", + "waweathercopblock": "waxed_weathered_copper", + "waweathercopperblock": "waxed_weathered_copper", + "waweatheredcoblock": "waxed_weathered_copper", + "waweatheredcopblock": "waxed_weathered_copper", + "waweatheredcopperblock": "waxed_weathered_copper", + "wawecoblock": "waxed_weathered_copper", + "wawecopblock": "waxed_weathered_copper", + "wawecopperblock": "waxed_weathered_copper", + "wawthcoblock": "waxed_weathered_copper", + "wawthcopblock": "waxed_weathered_copper", + "wawthcopperblock": "waxed_weathered_copper", + "waxedweathercoblock": "waxed_weathered_copper", + "waxedweathercopblock": "waxed_weathered_copper", + "waxedweathercopperblock": "waxed_weathered_copper", + "waxedweatheredcoblock": "waxed_weathered_copper", + "waxedweatheredcopblock": "waxed_weathered_copper", + "waxedweatheredcopper": "waxed_weathered_copper", + "waxedweatheredcopperblock": "waxed_weathered_copper", + "waxedwecoblock": "waxed_weathered_copper", + "waxedwecopblock": "waxed_weathered_copper", + "waxedwecopperblock": "waxed_weathered_copper", + "waxedwthcoblock": "waxed_weathered_copper", + "waxedwthcopblock": "waxed_weathered_copper", + "waxedwthcopperblock": "waxed_weathered_copper", + "waxweathercoblock": "waxed_weathered_copper", + "waxweathercopblock": "waxed_weathered_copper", + "waxweathercopperblock": "waxed_weathered_copper", + "waxweatheredcoblock": "waxed_weathered_copper", + "waxweatheredcopblock": "waxed_weathered_copper", + "waxweatheredcopperblock": "waxed_weathered_copper", + "waxwecoblock": "waxed_weathered_copper", + "waxwecopblock": "waxed_weathered_copper", + "waxwecopperblock": "waxed_weathered_copper", + "waxwthcoblock": "waxed_weathered_copper", + "waxwthcopblock": "waxed_weathered_copper", + "waxwthcopperblock": "waxed_weathered_copper", + "weatheredwacoblock": "waxed_weathered_copper", + "weatheredwacopblock": "waxed_weathered_copper", + "weatheredwacopperblock": "waxed_weathered_copper", + "weatheredwaxcoblock": "waxed_weathered_copper", + "weatheredwaxcopblock": "waxed_weathered_copper", + "weatheredwaxcopperblock": "waxed_weathered_copper", + "weatheredwaxedcoblock": "waxed_weathered_copper", + "weatheredwaxedcopblock": "waxed_weathered_copper", + "weatheredwaxedcopperblock": "waxed_weathered_copper", + "weatherwacoblock": "waxed_weathered_copper", + "weatherwacopblock": "waxed_weathered_copper", + "weatherwacopperblock": "waxed_weathered_copper", + "weatherwaxcoblock": "waxed_weathered_copper", + "weatherwaxcopblock": "waxed_weathered_copper", + "weatherwaxcopperblock": "waxed_weathered_copper", + "weatherwaxedcoblock": "waxed_weathered_copper", + "weatherwaxedcopblock": "waxed_weathered_copper", + "weatherwaxedcopperblock": "waxed_weathered_copper", + "wewacoblock": "waxed_weathered_copper", + "wewacopblock": "waxed_weathered_copper", + "wewacopperblock": "waxed_weathered_copper", + "wewaxcoblock": "waxed_weathered_copper", + "wewaxcopblock": "waxed_weathered_copper", + "wewaxcopperblock": "waxed_weathered_copper", + "wewaxedcoblock": "waxed_weathered_copper", + "wewaxedcopblock": "waxed_weathered_copper", + "wewaxedcopperblock": "waxed_weathered_copper", + "wthwacoblock": "waxed_weathered_copper", + "wthwacopblock": "waxed_weathered_copper", + "wthwacopperblock": "waxed_weathered_copper", + "wthwaxcoblock": "waxed_weathered_copper", + "wthwaxcopblock": "waxed_weathered_copper", + "wthwaxcopperblock": "waxed_weathered_copper", + "wthwaxedcoblock": "waxed_weathered_copper", + "wthwaxedcopblock": "waxed_weathered_copper", + "wthwaxedcopperblock": "waxed_weathered_copper", + "waxed_weathered_cut_copper": { + "material": "WAXED_WEATHERED_CUT_COPPER" + }, + "cutwaweathercoblock": "waxed_weathered_cut_copper", + "cutwaweathercopblock": "waxed_weathered_cut_copper", + "cutwaweathercopperblock": "waxed_weathered_cut_copper", + "cutwaweatheredcoblock": "waxed_weathered_cut_copper", + "cutwaweatheredcopblock": "waxed_weathered_cut_copper", + "cutwaweatheredcopperblock": "waxed_weathered_cut_copper", + "cutwawecoblock": "waxed_weathered_cut_copper", + "cutwawecopblock": "waxed_weathered_cut_copper", + "cutwawecopperblock": "waxed_weathered_cut_copper", + "cutwawthcoblock": "waxed_weathered_cut_copper", + "cutwawthcopblock": "waxed_weathered_cut_copper", + "cutwawthcopperblock": "waxed_weathered_cut_copper", + "cutwaxedweathercoblock": "waxed_weathered_cut_copper", + "cutwaxedweathercopblock": "waxed_weathered_cut_copper", + "cutwaxedweathercopperblock": "waxed_weathered_cut_copper", + "cutwaxedweatheredcoblock": "waxed_weathered_cut_copper", + "cutwaxedweatheredcopblock": "waxed_weathered_cut_copper", + "cutwaxedweatheredcopperblock": "waxed_weathered_cut_copper", + "cutwaxedwecoblock": "waxed_weathered_cut_copper", + "cutwaxedwecopblock": "waxed_weathered_cut_copper", + "cutwaxedwecopperblock": "waxed_weathered_cut_copper", + "cutwaxedwthcoblock": "waxed_weathered_cut_copper", + "cutwaxedwthcopblock": "waxed_weathered_cut_copper", + "cutwaxedwthcopperblock": "waxed_weathered_cut_copper", + "cutwaxweathercoblock": "waxed_weathered_cut_copper", + "cutwaxweathercopblock": "waxed_weathered_cut_copper", + "cutwaxweathercopperblock": "waxed_weathered_cut_copper", + "cutwaxweatheredcoblock": "waxed_weathered_cut_copper", + "cutwaxweatheredcopblock": "waxed_weathered_cut_copper", + "cutwaxweatheredcopperblock": "waxed_weathered_cut_copper", + "cutwaxwecoblock": "waxed_weathered_cut_copper", + "cutwaxwecopblock": "waxed_weathered_cut_copper", + "cutwaxwecopperblock": "waxed_weathered_cut_copper", + "cutwaxwthcoblock": "waxed_weathered_cut_copper", + "cutwaxwthcopblock": "waxed_weathered_cut_copper", + "cutwaxwthcopperblock": "waxed_weathered_cut_copper", + "cutweatheredwacoblock": "waxed_weathered_cut_copper", + "cutweatheredwacopblock": "waxed_weathered_cut_copper", + "cutweatheredwacopperblock": "waxed_weathered_cut_copper", + "cutweatheredwaxcoblock": "waxed_weathered_cut_copper", + "cutweatheredwaxcopblock": "waxed_weathered_cut_copper", + "cutweatheredwaxcopperblock": "waxed_weathered_cut_copper", + "cutweatheredwaxedcoblock": "waxed_weathered_cut_copper", + "cutweatheredwaxedcopblock": "waxed_weathered_cut_copper", + "cutweatheredwaxedcopperblock": "waxed_weathered_cut_copper", + "cutweatherwacoblock": "waxed_weathered_cut_copper", + "cutweatherwacopblock": "waxed_weathered_cut_copper", + "cutweatherwacopperblock": "waxed_weathered_cut_copper", + "cutweatherwaxcoblock": "waxed_weathered_cut_copper", + "cutweatherwaxcopblock": "waxed_weathered_cut_copper", + "cutweatherwaxcopperblock": "waxed_weathered_cut_copper", + "cutweatherwaxedcoblock": "waxed_weathered_cut_copper", + "cutweatherwaxedcopblock": "waxed_weathered_cut_copper", + "cutweatherwaxedcopperblock": "waxed_weathered_cut_copper", + "cutwewacoblock": "waxed_weathered_cut_copper", + "cutwewacopblock": "waxed_weathered_cut_copper", + "cutwewacopperblock": "waxed_weathered_cut_copper", + "cutwewaxcoblock": "waxed_weathered_cut_copper", + "cutwewaxcopblock": "waxed_weathered_cut_copper", + "cutwewaxcopperblock": "waxed_weathered_cut_copper", + "cutwewaxedcoblock": "waxed_weathered_cut_copper", + "cutwewaxedcopblock": "waxed_weathered_cut_copper", + "cutwewaxedcopperblock": "waxed_weathered_cut_copper", + "cutwthwacoblock": "waxed_weathered_cut_copper", + "cutwthwacopblock": "waxed_weathered_cut_copper", + "cutwthwacopperblock": "waxed_weathered_cut_copper", + "cutwthwaxcoblock": "waxed_weathered_cut_copper", + "cutwthwaxcopblock": "waxed_weathered_cut_copper", + "cutwthwaxcopperblock": "waxed_weathered_cut_copper", + "cutwthwaxedcoblock": "waxed_weathered_cut_copper", + "cutwthwaxedcopblock": "waxed_weathered_cut_copper", + "cutwthwaxedcopperblock": "waxed_weathered_cut_copper", + "cwaweathercoblock": "waxed_weathered_cut_copper", + "cwaweathercopblock": "waxed_weathered_cut_copper", + "cwaweathercopperblock": "waxed_weathered_cut_copper", + "cwaweatheredcoblock": "waxed_weathered_cut_copper", + "cwaweatheredcopblock": "waxed_weathered_cut_copper", + "cwaweatheredcopperblock": "waxed_weathered_cut_copper", + "cwawecoblock": "waxed_weathered_cut_copper", + "cwawecopblock": "waxed_weathered_cut_copper", + "cwawecopperblock": "waxed_weathered_cut_copper", + "cwawthcoblock": "waxed_weathered_cut_copper", + "cwawthcopblock": "waxed_weathered_cut_copper", + "cwawthcopperblock": "waxed_weathered_cut_copper", + "cwaxedweathercoblock": "waxed_weathered_cut_copper", + "cwaxedweathercopblock": "waxed_weathered_cut_copper", + "cwaxedweathercopperblock": "waxed_weathered_cut_copper", + "cwaxedweatheredcoblock": "waxed_weathered_cut_copper", + "cwaxedweatheredcopblock": "waxed_weathered_cut_copper", + "cwaxedweatheredcopperblock": "waxed_weathered_cut_copper", + "cwaxedwecoblock": "waxed_weathered_cut_copper", + "cwaxedwecopblock": "waxed_weathered_cut_copper", + "cwaxedwecopperblock": "waxed_weathered_cut_copper", + "cwaxedwthcoblock": "waxed_weathered_cut_copper", + "cwaxedwthcopblock": "waxed_weathered_cut_copper", + "cwaxedwthcopperblock": "waxed_weathered_cut_copper", + "cwaxweathercoblock": "waxed_weathered_cut_copper", + "cwaxweathercopblock": "waxed_weathered_cut_copper", + "cwaxweathercopperblock": "waxed_weathered_cut_copper", + "cwaxweatheredcoblock": "waxed_weathered_cut_copper", + "cwaxweatheredcopblock": "waxed_weathered_cut_copper", + "cwaxweatheredcopperblock": "waxed_weathered_cut_copper", + "cwaxwecoblock": "waxed_weathered_cut_copper", + "cwaxwecopblock": "waxed_weathered_cut_copper", + "cwaxwecopperblock": "waxed_weathered_cut_copper", + "cwaxwthcoblock": "waxed_weathered_cut_copper", + "cwaxwthcopblock": "waxed_weathered_cut_copper", + "cwaxwthcopperblock": "waxed_weathered_cut_copper", + "cweatheredwacoblock": "waxed_weathered_cut_copper", + "cweatheredwacopblock": "waxed_weathered_cut_copper", + "cweatheredwacopperblock": "waxed_weathered_cut_copper", + "cweatheredwaxcoblock": "waxed_weathered_cut_copper", + "cweatheredwaxcopblock": "waxed_weathered_cut_copper", + "cweatheredwaxcopperblock": "waxed_weathered_cut_copper", + "cweatheredwaxedcoblock": "waxed_weathered_cut_copper", + "cweatheredwaxedcopblock": "waxed_weathered_cut_copper", + "cweatheredwaxedcopperblock": "waxed_weathered_cut_copper", + "cweatherwacoblock": "waxed_weathered_cut_copper", + "cweatherwacopblock": "waxed_weathered_cut_copper", + "cweatherwacopperblock": "waxed_weathered_cut_copper", + "cweatherwaxcoblock": "waxed_weathered_cut_copper", + "cweatherwaxcopblock": "waxed_weathered_cut_copper", + "cweatherwaxcopperblock": "waxed_weathered_cut_copper", + "cweatherwaxedcoblock": "waxed_weathered_cut_copper", + "cweatherwaxedcopblock": "waxed_weathered_cut_copper", + "cweatherwaxedcopperblock": "waxed_weathered_cut_copper", + "cwewacoblock": "waxed_weathered_cut_copper", + "cwewacopblock": "waxed_weathered_cut_copper", + "cwewacopperblock": "waxed_weathered_cut_copper", + "cwewaxcoblock": "waxed_weathered_cut_copper", + "cwewaxcopblock": "waxed_weathered_cut_copper", + "cwewaxcopperblock": "waxed_weathered_cut_copper", + "cwewaxedcoblock": "waxed_weathered_cut_copper", + "cwewaxedcopblock": "waxed_weathered_cut_copper", + "cwewaxedcopperblock": "waxed_weathered_cut_copper", + "cwthwacoblock": "waxed_weathered_cut_copper", + "cwthwacopblock": "waxed_weathered_cut_copper", + "cwthwacopperblock": "waxed_weathered_cut_copper", + "cwthwaxcoblock": "waxed_weathered_cut_copper", + "cwthwaxcopblock": "waxed_weathered_cut_copper", + "cwthwaxcopperblock": "waxed_weathered_cut_copper", + "cwthwaxedcoblock": "waxed_weathered_cut_copper", + "cwthwaxedcopblock": "waxed_weathered_cut_copper", + "cwthwaxedcopperblock": "waxed_weathered_cut_copper", + "minecraft:waxed_weathered_cut_copper": "waxed_weathered_cut_copper", + "wacutweathercoblock": "waxed_weathered_cut_copper", + "wacutweathercopblock": "waxed_weathered_cut_copper", + "wacutweathercopperblock": "waxed_weathered_cut_copper", + "wacutweatheredcoblock": "waxed_weathered_cut_copper", + "wacutweatheredcopblock": "waxed_weathered_cut_copper", + "wacutweatheredcopperblock": "waxed_weathered_cut_copper", + "wacutwecoblock": "waxed_weathered_cut_copper", + "wacutwecopblock": "waxed_weathered_cut_copper", + "wacutwecopperblock": "waxed_weathered_cut_copper", + "wacutwthcoblock": "waxed_weathered_cut_copper", + "wacutwthcopblock": "waxed_weathered_cut_copper", + "wacutwthcopperblock": "waxed_weathered_cut_copper", + "wacweathercoblock": "waxed_weathered_cut_copper", + "wacweathercopblock": "waxed_weathered_cut_copper", + "wacweathercopperblock": "waxed_weathered_cut_copper", + "wacweatheredcoblock": "waxed_weathered_cut_copper", + "wacweatheredcopblock": "waxed_weathered_cut_copper", + "wacweatheredcopperblock": "waxed_weathered_cut_copper", + "wacwecoblock": "waxed_weathered_cut_copper", + "wacwecopblock": "waxed_weathered_cut_copper", + "wacwecopperblock": "waxed_weathered_cut_copper", + "wacwthcoblock": "waxed_weathered_cut_copper", + "wacwthcopblock": "waxed_weathered_cut_copper", + "wacwthcopperblock": "waxed_weathered_cut_copper", + "waweatherccoblock": "waxed_weathered_cut_copper", + "waweatherccopblock": "waxed_weathered_cut_copper", + "waweatherccopperblock": "waxed_weathered_cut_copper", + "waweathercutcoblock": "waxed_weathered_cut_copper", + "waweathercutcopblock": "waxed_weathered_cut_copper", + "waweathercutcopperblock": "waxed_weathered_cut_copper", + "waweatheredccoblock": "waxed_weathered_cut_copper", + "waweatheredccopblock": "waxed_weathered_cut_copper", + "waweatheredccopperblock": "waxed_weathered_cut_copper", + "waweatheredcutcoblock": "waxed_weathered_cut_copper", + "waweatheredcutcopblock": "waxed_weathered_cut_copper", + "waweatheredcutcopperblock": "waxed_weathered_cut_copper", + "waweccoblock": "waxed_weathered_cut_copper", + "waweccopblock": "waxed_weathered_cut_copper", + "waweccopperblock": "waxed_weathered_cut_copper", + "wawecutcoblock": "waxed_weathered_cut_copper", + "wawecutcopblock": "waxed_weathered_cut_copper", + "wawecutcopperblock": "waxed_weathered_cut_copper", + "wawthccoblock": "waxed_weathered_cut_copper", + "wawthccopblock": "waxed_weathered_cut_copper", + "wawthccopperblock": "waxed_weathered_cut_copper", + "wawthcutcoblock": "waxed_weathered_cut_copper", + "wawthcutcopblock": "waxed_weathered_cut_copper", + "wawthcutcopperblock": "waxed_weathered_cut_copper", + "waxcutweathercoblock": "waxed_weathered_cut_copper", + "waxcutweathercopblock": "waxed_weathered_cut_copper", + "waxcutweathercopperblock": "waxed_weathered_cut_copper", + "waxcutweatheredcoblock": "waxed_weathered_cut_copper", + "waxcutweatheredcopblock": "waxed_weathered_cut_copper", + "waxcutweatheredcopperblock": "waxed_weathered_cut_copper", + "waxcutwecoblock": "waxed_weathered_cut_copper", + "waxcutwecopblock": "waxed_weathered_cut_copper", + "waxcutwecopperblock": "waxed_weathered_cut_copper", + "waxcutwthcoblock": "waxed_weathered_cut_copper", + "waxcutwthcopblock": "waxed_weathered_cut_copper", + "waxcutwthcopperblock": "waxed_weathered_cut_copper", + "waxcweathercoblock": "waxed_weathered_cut_copper", + "waxcweathercopblock": "waxed_weathered_cut_copper", + "waxcweathercopperblock": "waxed_weathered_cut_copper", + "waxcweatheredcoblock": "waxed_weathered_cut_copper", + "waxcweatheredcopblock": "waxed_weathered_cut_copper", + "waxcweatheredcopperblock": "waxed_weathered_cut_copper", + "waxcwecoblock": "waxed_weathered_cut_copper", + "waxcwecopblock": "waxed_weathered_cut_copper", + "waxcwecopperblock": "waxed_weathered_cut_copper", + "waxcwthcoblock": "waxed_weathered_cut_copper", + "waxcwthcopblock": "waxed_weathered_cut_copper", + "waxcwthcopperblock": "waxed_weathered_cut_copper", + "waxedcutweathercoblock": "waxed_weathered_cut_copper", + "waxedcutweathercopblock": "waxed_weathered_cut_copper", + "waxedcutweathercopperblock": "waxed_weathered_cut_copper", + "waxedcutweatheredcoblock": "waxed_weathered_cut_copper", + "waxedcutweatheredcopblock": "waxed_weathered_cut_copper", + "waxedcutweatheredcopperblock": "waxed_weathered_cut_copper", + "waxedcutwecoblock": "waxed_weathered_cut_copper", + "waxedcutwecopblock": "waxed_weathered_cut_copper", + "waxedcutwecopperblock": "waxed_weathered_cut_copper", + "waxedcutwthcoblock": "waxed_weathered_cut_copper", + "waxedcutwthcopblock": "waxed_weathered_cut_copper", + "waxedcutwthcopperblock": "waxed_weathered_cut_copper", + "waxedcweathercoblock": "waxed_weathered_cut_copper", + "waxedcweathercopblock": "waxed_weathered_cut_copper", + "waxedcweathercopperblock": "waxed_weathered_cut_copper", + "waxedcweatheredcoblock": "waxed_weathered_cut_copper", + "waxedcweatheredcopblock": "waxed_weathered_cut_copper", + "waxedcweatheredcopperblock": "waxed_weathered_cut_copper", + "waxedcwecoblock": "waxed_weathered_cut_copper", + "waxedcwecopblock": "waxed_weathered_cut_copper", + "waxedcwecopperblock": "waxed_weathered_cut_copper", + "waxedcwthcoblock": "waxed_weathered_cut_copper", + "waxedcwthcopblock": "waxed_weathered_cut_copper", + "waxedcwthcopperblock": "waxed_weathered_cut_copper", + "waxedweatherccoblock": "waxed_weathered_cut_copper", + "waxedweatherccopblock": "waxed_weathered_cut_copper", + "waxedweatherccopperblock": "waxed_weathered_cut_copper", + "waxedweathercutcoblock": "waxed_weathered_cut_copper", + "waxedweathercutcopblock": "waxed_weathered_cut_copper", + "waxedweathercutcopperblock": "waxed_weathered_cut_copper", + "waxedweatheredccoblock": "waxed_weathered_cut_copper", + "waxedweatheredccopblock": "waxed_weathered_cut_copper", + "waxedweatheredccopperblock": "waxed_weathered_cut_copper", + "waxedweatheredcutcoblock": "waxed_weathered_cut_copper", + "waxedweatheredcutcopblock": "waxed_weathered_cut_copper", + "waxedweatheredcutcopper": "waxed_weathered_cut_copper", + "waxedweatheredcutcopperblock": "waxed_weathered_cut_copper", + "waxedweccoblock": "waxed_weathered_cut_copper", + "waxedweccopblock": "waxed_weathered_cut_copper", + "waxedweccopperblock": "waxed_weathered_cut_copper", + "waxedwecutcoblock": "waxed_weathered_cut_copper", + "waxedwecutcopblock": "waxed_weathered_cut_copper", + "waxedwecutcopperblock": "waxed_weathered_cut_copper", + "waxedwthccoblock": "waxed_weathered_cut_copper", + "waxedwthccopblock": "waxed_weathered_cut_copper", + "waxedwthccopperblock": "waxed_weathered_cut_copper", + "waxedwthcutcoblock": "waxed_weathered_cut_copper", + "waxedwthcutcopblock": "waxed_weathered_cut_copper", + "waxedwthcutcopperblock": "waxed_weathered_cut_copper", + "waxweatherccoblock": "waxed_weathered_cut_copper", + "waxweatherccopblock": "waxed_weathered_cut_copper", + "waxweatherccopperblock": "waxed_weathered_cut_copper", + "waxweathercutcoblock": "waxed_weathered_cut_copper", + "waxweathercutcopblock": "waxed_weathered_cut_copper", + "waxweathercutcopperblock": "waxed_weathered_cut_copper", + "waxweatheredccoblock": "waxed_weathered_cut_copper", + "waxweatheredccopblock": "waxed_weathered_cut_copper", + "waxweatheredccopperblock": "waxed_weathered_cut_copper", + "waxweatheredcutcoblock": "waxed_weathered_cut_copper", + "waxweatheredcutcopblock": "waxed_weathered_cut_copper", + "waxweatheredcutcopperblock": "waxed_weathered_cut_copper", + "waxweccoblock": "waxed_weathered_cut_copper", + "waxweccopblock": "waxed_weathered_cut_copper", + "waxweccopperblock": "waxed_weathered_cut_copper", + "waxwecutcoblock": "waxed_weathered_cut_copper", + "waxwecutcopblock": "waxed_weathered_cut_copper", + "waxwecutcopperblock": "waxed_weathered_cut_copper", + "waxwthccoblock": "waxed_weathered_cut_copper", + "waxwthccopblock": "waxed_weathered_cut_copper", + "waxwthccopperblock": "waxed_weathered_cut_copper", + "waxwthcutcoblock": "waxed_weathered_cut_copper", + "waxwthcutcopblock": "waxed_weathered_cut_copper", + "waxwthcutcopperblock": "waxed_weathered_cut_copper", + "weathercutwacoblock": "waxed_weathered_cut_copper", + "weathercutwacopblock": "waxed_weathered_cut_copper", + "weathercutwacopperblock": "waxed_weathered_cut_copper", + "weathercutwaxcoblock": "waxed_weathered_cut_copper", + "weathercutwaxcopblock": "waxed_weathered_cut_copper", + "weathercutwaxcopperblock": "waxed_weathered_cut_copper", + "weathercutwaxedcoblock": "waxed_weathered_cut_copper", + "weathercutwaxedcopblock": "waxed_weathered_cut_copper", + "weathercutwaxedcopperblock": "waxed_weathered_cut_copper", + "weathercwacoblock": "waxed_weathered_cut_copper", + "weathercwacopblock": "waxed_weathered_cut_copper", + "weathercwacopperblock": "waxed_weathered_cut_copper", + "weathercwaxcoblock": "waxed_weathered_cut_copper", + "weathercwaxcopblock": "waxed_weathered_cut_copper", + "weathercwaxcopperblock": "waxed_weathered_cut_copper", + "weathercwaxedcoblock": "waxed_weathered_cut_copper", + "weathercwaxedcopblock": "waxed_weathered_cut_copper", + "weathercwaxedcopperblock": "waxed_weathered_cut_copper", + "weatheredcutwacoblock": "waxed_weathered_cut_copper", + "weatheredcutwacopblock": "waxed_weathered_cut_copper", + "weatheredcutwacopperblock": "waxed_weathered_cut_copper", + "weatheredcutwaxcoblock": "waxed_weathered_cut_copper", + "weatheredcutwaxcopblock": "waxed_weathered_cut_copper", + "weatheredcutwaxcopperblock": "waxed_weathered_cut_copper", + "weatheredcutwaxedcoblock": "waxed_weathered_cut_copper", + "weatheredcutwaxedcopblock": "waxed_weathered_cut_copper", + "weatheredcutwaxedcopperblock": "waxed_weathered_cut_copper", + "weatheredcwacoblock": "waxed_weathered_cut_copper", + "weatheredcwacopblock": "waxed_weathered_cut_copper", + "weatheredcwacopperblock": "waxed_weathered_cut_copper", + "weatheredcwaxcoblock": "waxed_weathered_cut_copper", + "weatheredcwaxcopblock": "waxed_weathered_cut_copper", + "weatheredcwaxcopperblock": "waxed_weathered_cut_copper", + "weatheredcwaxedcoblock": "waxed_weathered_cut_copper", + "weatheredcwaxedcopblock": "waxed_weathered_cut_copper", + "weatheredcwaxedcopperblock": "waxed_weathered_cut_copper", + "weatheredwaccoblock": "waxed_weathered_cut_copper", + "weatheredwaccopblock": "waxed_weathered_cut_copper", + "weatheredwaccopperblock": "waxed_weathered_cut_copper", + "weatheredwacutcoblock": "waxed_weathered_cut_copper", + "weatheredwacutcopblock": "waxed_weathered_cut_copper", + "weatheredwacutcopperblock": "waxed_weathered_cut_copper", + "weatheredwaxccoblock": "waxed_weathered_cut_copper", + "weatheredwaxccopblock": "waxed_weathered_cut_copper", + "weatheredwaxccopperblock": "waxed_weathered_cut_copper", + "weatheredwaxcutcoblock": "waxed_weathered_cut_copper", + "weatheredwaxcutcopblock": "waxed_weathered_cut_copper", + "weatheredwaxcutcopperblock": "waxed_weathered_cut_copper", + "weatheredwaxedccoblock": "waxed_weathered_cut_copper", + "weatheredwaxedccopblock": "waxed_weathered_cut_copper", + "weatheredwaxedccopperblock": "waxed_weathered_cut_copper", + "weatheredwaxedcutcoblock": "waxed_weathered_cut_copper", + "weatheredwaxedcutcopblock": "waxed_weathered_cut_copper", + "weatheredwaxedcutcopperblock": "waxed_weathered_cut_copper", + "weatherwaccoblock": "waxed_weathered_cut_copper", + "weatherwaccopblock": "waxed_weathered_cut_copper", + "weatherwaccopperblock": "waxed_weathered_cut_copper", + "weatherwacutcoblock": "waxed_weathered_cut_copper", + "weatherwacutcopblock": "waxed_weathered_cut_copper", + "weatherwacutcopperblock": "waxed_weathered_cut_copper", + "weatherwaxccoblock": "waxed_weathered_cut_copper", + "weatherwaxccopblock": "waxed_weathered_cut_copper", + "weatherwaxccopperblock": "waxed_weathered_cut_copper", + "weatherwaxcutcoblock": "waxed_weathered_cut_copper", + "weatherwaxcutcopblock": "waxed_weathered_cut_copper", + "weatherwaxcutcopperblock": "waxed_weathered_cut_copper", + "weatherwaxedccoblock": "waxed_weathered_cut_copper", + "weatherwaxedccopblock": "waxed_weathered_cut_copper", + "weatherwaxedccopperblock": "waxed_weathered_cut_copper", + "weatherwaxedcutcoblock": "waxed_weathered_cut_copper", + "weatherwaxedcutcopblock": "waxed_weathered_cut_copper", + "weatherwaxedcutcopperblock": "waxed_weathered_cut_copper", + "wecutwacoblock": "waxed_weathered_cut_copper", + "wecutwacopblock": "waxed_weathered_cut_copper", + "wecutwacopperblock": "waxed_weathered_cut_copper", + "wecutwaxcoblock": "waxed_weathered_cut_copper", + "wecutwaxcopblock": "waxed_weathered_cut_copper", + "wecutwaxcopperblock": "waxed_weathered_cut_copper", + "wecutwaxedcoblock": "waxed_weathered_cut_copper", + "wecutwaxedcopblock": "waxed_weathered_cut_copper", + "wecutwaxedcopperblock": "waxed_weathered_cut_copper", + "wecwacoblock": "waxed_weathered_cut_copper", + "wecwacopblock": "waxed_weathered_cut_copper", + "wecwacopperblock": "waxed_weathered_cut_copper", + "wecwaxcoblock": "waxed_weathered_cut_copper", + "wecwaxcopblock": "waxed_weathered_cut_copper", + "wecwaxcopperblock": "waxed_weathered_cut_copper", + "wecwaxedcoblock": "waxed_weathered_cut_copper", + "wecwaxedcopblock": "waxed_weathered_cut_copper", + "wecwaxedcopperblock": "waxed_weathered_cut_copper", + "wewaccoblock": "waxed_weathered_cut_copper", + "wewaccopblock": "waxed_weathered_cut_copper", + "wewaccopperblock": "waxed_weathered_cut_copper", + "wewacutcoblock": "waxed_weathered_cut_copper", + "wewacutcopblock": "waxed_weathered_cut_copper", + "wewacutcopperblock": "waxed_weathered_cut_copper", + "wewaxccoblock": "waxed_weathered_cut_copper", + "wewaxccopblock": "waxed_weathered_cut_copper", + "wewaxccopperblock": "waxed_weathered_cut_copper", + "wewaxcutcoblock": "waxed_weathered_cut_copper", + "wewaxcutcopblock": "waxed_weathered_cut_copper", + "wewaxcutcopperblock": "waxed_weathered_cut_copper", + "wewaxedccoblock": "waxed_weathered_cut_copper", + "wewaxedccopblock": "waxed_weathered_cut_copper", + "wewaxedccopperblock": "waxed_weathered_cut_copper", + "wewaxedcutcoblock": "waxed_weathered_cut_copper", + "wewaxedcutcopblock": "waxed_weathered_cut_copper", + "wewaxedcutcopperblock": "waxed_weathered_cut_copper", + "wthcutwacoblock": "waxed_weathered_cut_copper", + "wthcutwacopblock": "waxed_weathered_cut_copper", + "wthcutwacopperblock": "waxed_weathered_cut_copper", + "wthcutwaxcoblock": "waxed_weathered_cut_copper", + "wthcutwaxcopblock": "waxed_weathered_cut_copper", + "wthcutwaxcopperblock": "waxed_weathered_cut_copper", + "wthcutwaxedcoblock": "waxed_weathered_cut_copper", + "wthcutwaxedcopblock": "waxed_weathered_cut_copper", + "wthcutwaxedcopperblock": "waxed_weathered_cut_copper", + "wthcwacoblock": "waxed_weathered_cut_copper", + "wthcwacopblock": "waxed_weathered_cut_copper", + "wthcwacopperblock": "waxed_weathered_cut_copper", + "wthcwaxcoblock": "waxed_weathered_cut_copper", + "wthcwaxcopblock": "waxed_weathered_cut_copper", + "wthcwaxcopperblock": "waxed_weathered_cut_copper", + "wthcwaxedcoblock": "waxed_weathered_cut_copper", + "wthcwaxedcopblock": "waxed_weathered_cut_copper", + "wthcwaxedcopperblock": "waxed_weathered_cut_copper", + "wthwaccoblock": "waxed_weathered_cut_copper", + "wthwaccopblock": "waxed_weathered_cut_copper", + "wthwaccopperblock": "waxed_weathered_cut_copper", + "wthwacutcoblock": "waxed_weathered_cut_copper", + "wthwacutcopblock": "waxed_weathered_cut_copper", + "wthwacutcopperblock": "waxed_weathered_cut_copper", + "wthwaxccoblock": "waxed_weathered_cut_copper", + "wthwaxccopblock": "waxed_weathered_cut_copper", + "wthwaxccopperblock": "waxed_weathered_cut_copper", + "wthwaxcutcoblock": "waxed_weathered_cut_copper", + "wthwaxcutcopblock": "waxed_weathered_cut_copper", + "wthwaxcutcopperblock": "waxed_weathered_cut_copper", + "wthwaxedccoblock": "waxed_weathered_cut_copper", + "wthwaxedccopblock": "waxed_weathered_cut_copper", + "wthwaxedccopperblock": "waxed_weathered_cut_copper", + "wthwaxedcutcoblock": "waxed_weathered_cut_copper", + "wthwaxedcutcopblock": "waxed_weathered_cut_copper", + "wthwaxedcutcopperblock": "waxed_weathered_cut_copper", + "waxed_weathered_cut_copper_slab": { + "material": "WAXED_WEATHERED_CUT_COPPER_SLAB" + }, + "cutwaweathercohalfblock": "waxed_weathered_cut_copper_slab", + "cutwaweathercophalfblock": "waxed_weathered_cut_copper_slab", + "cutwaweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwaweathercoppersl": "waxed_weathered_cut_copper_slab", + "cutwaweathercopperslab": "waxed_weathered_cut_copper_slab", + "cutwaweathercopperstep": "waxed_weathered_cut_copper_slab", + "cutwaweathercopsl": "waxed_weathered_cut_copper_slab", + "cutwaweathercopslab": "waxed_weathered_cut_copper_slab", + "cutwaweathercopstep": "waxed_weathered_cut_copper_slab", + "cutwaweathercosl": "waxed_weathered_cut_copper_slab", + "cutwaweathercoslab": "waxed_weathered_cut_copper_slab", + "cutwaweathercostep": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcopsl": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcopslab": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcopstep": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcosl": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcoslab": "waxed_weathered_cut_copper_slab", + "cutwaweatheredcostep": "waxed_weathered_cut_copper_slab", + "cutwawecohalfblock": "waxed_weathered_cut_copper_slab", + "cutwawecophalfblock": "waxed_weathered_cut_copper_slab", + "cutwawecopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwawecoppersl": "waxed_weathered_cut_copper_slab", + "cutwawecopperslab": "waxed_weathered_cut_copper_slab", + "cutwawecopperstep": "waxed_weathered_cut_copper_slab", + "cutwawecopsl": "waxed_weathered_cut_copper_slab", + "cutwawecopslab": "waxed_weathered_cut_copper_slab", + "cutwawecopstep": "waxed_weathered_cut_copper_slab", + "cutwawecosl": "waxed_weathered_cut_copper_slab", + "cutwawecoslab": "waxed_weathered_cut_copper_slab", + "cutwawecostep": "waxed_weathered_cut_copper_slab", + "cutwawthcohalfblock": "waxed_weathered_cut_copper_slab", + "cutwawthcophalfblock": "waxed_weathered_cut_copper_slab", + "cutwawthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwawthcoppersl": "waxed_weathered_cut_copper_slab", + "cutwawthcopperslab": "waxed_weathered_cut_copper_slab", + "cutwawthcopperstep": "waxed_weathered_cut_copper_slab", + "cutwawthcopsl": "waxed_weathered_cut_copper_slab", + "cutwawthcopslab": "waxed_weathered_cut_copper_slab", + "cutwawthcopstep": "waxed_weathered_cut_copper_slab", + "cutwawthcosl": "waxed_weathered_cut_copper_slab", + "cutwawthcoslab": "waxed_weathered_cut_copper_slab", + "cutwawthcostep": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercohalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercophalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercoppersl": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercopperslab": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercopperstep": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercopsl": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercopslab": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercopstep": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercosl": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercoslab": "waxed_weathered_cut_copper_slab", + "cutwaxedweathercostep": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcopsl": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcopslab": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcopstep": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcosl": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcoslab": "waxed_weathered_cut_copper_slab", + "cutwaxedweatheredcostep": "waxed_weathered_cut_copper_slab", + "cutwaxedwecohalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedwecophalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedwecopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedwecoppersl": "waxed_weathered_cut_copper_slab", + "cutwaxedwecopperslab": "waxed_weathered_cut_copper_slab", + "cutwaxedwecopperstep": "waxed_weathered_cut_copper_slab", + "cutwaxedwecopsl": "waxed_weathered_cut_copper_slab", + "cutwaxedwecopslab": "waxed_weathered_cut_copper_slab", + "cutwaxedwecopstep": "waxed_weathered_cut_copper_slab", + "cutwaxedwecosl": "waxed_weathered_cut_copper_slab", + "cutwaxedwecoslab": "waxed_weathered_cut_copper_slab", + "cutwaxedwecostep": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcohalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcophalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcoppersl": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcopperslab": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcopperstep": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcopsl": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcopslab": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcopstep": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcosl": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcoslab": "waxed_weathered_cut_copper_slab", + "cutwaxedwthcostep": "waxed_weathered_cut_copper_slab", + "cutwaxweathercohalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxweathercophalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxweathercoppersl": "waxed_weathered_cut_copper_slab", + "cutwaxweathercopperslab": "waxed_weathered_cut_copper_slab", + "cutwaxweathercopperstep": "waxed_weathered_cut_copper_slab", + "cutwaxweathercopsl": "waxed_weathered_cut_copper_slab", + "cutwaxweathercopslab": "waxed_weathered_cut_copper_slab", + "cutwaxweathercopstep": "waxed_weathered_cut_copper_slab", + "cutwaxweathercosl": "waxed_weathered_cut_copper_slab", + "cutwaxweathercoslab": "waxed_weathered_cut_copper_slab", + "cutwaxweathercostep": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcopsl": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcopslab": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcopstep": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcosl": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcoslab": "waxed_weathered_cut_copper_slab", + "cutwaxweatheredcostep": "waxed_weathered_cut_copper_slab", + "cutwaxwecohalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxwecophalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxwecopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxwecoppersl": "waxed_weathered_cut_copper_slab", + "cutwaxwecopperslab": "waxed_weathered_cut_copper_slab", + "cutwaxwecopperstep": "waxed_weathered_cut_copper_slab", + "cutwaxwecopsl": "waxed_weathered_cut_copper_slab", + "cutwaxwecopslab": "waxed_weathered_cut_copper_slab", + "cutwaxwecopstep": "waxed_weathered_cut_copper_slab", + "cutwaxwecosl": "waxed_weathered_cut_copper_slab", + "cutwaxwecoslab": "waxed_weathered_cut_copper_slab", + "cutwaxwecostep": "waxed_weathered_cut_copper_slab", + "cutwaxwthcohalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxwthcophalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxwthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwaxwthcoppersl": "waxed_weathered_cut_copper_slab", + "cutwaxwthcopperslab": "waxed_weathered_cut_copper_slab", + "cutwaxwthcopperstep": "waxed_weathered_cut_copper_slab", + "cutwaxwthcopsl": "waxed_weathered_cut_copper_slab", + "cutwaxwthcopslab": "waxed_weathered_cut_copper_slab", + "cutwaxwthcopstep": "waxed_weathered_cut_copper_slab", + "cutwaxwthcosl": "waxed_weathered_cut_copper_slab", + "cutwaxwthcoslab": "waxed_weathered_cut_copper_slab", + "cutwaxwthcostep": "waxed_weathered_cut_copper_slab", + "cutweatheredwacohalfblock": "waxed_weathered_cut_copper_slab", + "cutweatheredwacophalfblock": "waxed_weathered_cut_copper_slab", + "cutweatheredwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutweatheredwacoppersl": "waxed_weathered_cut_copper_slab", + "cutweatheredwacopperslab": "waxed_weathered_cut_copper_slab", + "cutweatheredwacopperstep": "waxed_weathered_cut_copper_slab", + "cutweatheredwacopsl": "waxed_weathered_cut_copper_slab", + "cutweatheredwacopslab": "waxed_weathered_cut_copper_slab", + "cutweatheredwacopstep": "waxed_weathered_cut_copper_slab", + "cutweatheredwacosl": "waxed_weathered_cut_copper_slab", + "cutweatheredwacoslab": "waxed_weathered_cut_copper_slab", + "cutweatheredwacostep": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcoppersl": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcopperslab": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcopperstep": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcopsl": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcopslab": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcopstep": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcosl": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcoslab": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxcostep": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcopsl": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcopslab": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcopstep": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcosl": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcoslab": "waxed_weathered_cut_copper_slab", + "cutweatheredwaxedcostep": "waxed_weathered_cut_copper_slab", + "cutweatherwacohalfblock": "waxed_weathered_cut_copper_slab", + "cutweatherwacophalfblock": "waxed_weathered_cut_copper_slab", + "cutweatherwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutweatherwacoppersl": "waxed_weathered_cut_copper_slab", + "cutweatherwacopperslab": "waxed_weathered_cut_copper_slab", + "cutweatherwacopperstep": "waxed_weathered_cut_copper_slab", + "cutweatherwacopsl": "waxed_weathered_cut_copper_slab", + "cutweatherwacopslab": "waxed_weathered_cut_copper_slab", + "cutweatherwacopstep": "waxed_weathered_cut_copper_slab", + "cutweatherwacosl": "waxed_weathered_cut_copper_slab", + "cutweatherwacoslab": "waxed_weathered_cut_copper_slab", + "cutweatherwacostep": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcoppersl": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcopperslab": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcopperstep": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcopsl": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcopslab": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcopstep": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcosl": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcoslab": "waxed_weathered_cut_copper_slab", + "cutweatherwaxcostep": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcopsl": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcopslab": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcopstep": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcosl": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcoslab": "waxed_weathered_cut_copper_slab", + "cutweatherwaxedcostep": "waxed_weathered_cut_copper_slab", + "cutwewacohalfblock": "waxed_weathered_cut_copper_slab", + "cutwewacophalfblock": "waxed_weathered_cut_copper_slab", + "cutwewacopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwewacoppersl": "waxed_weathered_cut_copper_slab", + "cutwewacopperslab": "waxed_weathered_cut_copper_slab", + "cutwewacopperstep": "waxed_weathered_cut_copper_slab", + "cutwewacopsl": "waxed_weathered_cut_copper_slab", + "cutwewacopslab": "waxed_weathered_cut_copper_slab", + "cutwewacopstep": "waxed_weathered_cut_copper_slab", + "cutwewacosl": "waxed_weathered_cut_copper_slab", + "cutwewacoslab": "waxed_weathered_cut_copper_slab", + "cutwewacostep": "waxed_weathered_cut_copper_slab", + "cutwewaxcohalfblock": "waxed_weathered_cut_copper_slab", + "cutwewaxcophalfblock": "waxed_weathered_cut_copper_slab", + "cutwewaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwewaxcoppersl": "waxed_weathered_cut_copper_slab", + "cutwewaxcopperslab": "waxed_weathered_cut_copper_slab", + "cutwewaxcopperstep": "waxed_weathered_cut_copper_slab", + "cutwewaxcopsl": "waxed_weathered_cut_copper_slab", + "cutwewaxcopslab": "waxed_weathered_cut_copper_slab", + "cutwewaxcopstep": "waxed_weathered_cut_copper_slab", + "cutwewaxcosl": "waxed_weathered_cut_copper_slab", + "cutwewaxcoslab": "waxed_weathered_cut_copper_slab", + "cutwewaxcostep": "waxed_weathered_cut_copper_slab", + "cutwewaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "cutwewaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "cutwewaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwewaxedcoppersl": "waxed_weathered_cut_copper_slab", + "cutwewaxedcopperslab": "waxed_weathered_cut_copper_slab", + "cutwewaxedcopperstep": "waxed_weathered_cut_copper_slab", + "cutwewaxedcopsl": "waxed_weathered_cut_copper_slab", + "cutwewaxedcopslab": "waxed_weathered_cut_copper_slab", + "cutwewaxedcopstep": "waxed_weathered_cut_copper_slab", + "cutwewaxedcosl": "waxed_weathered_cut_copper_slab", + "cutwewaxedcoslab": "waxed_weathered_cut_copper_slab", + "cutwewaxedcostep": "waxed_weathered_cut_copper_slab", + "cutwthwacohalfblock": "waxed_weathered_cut_copper_slab", + "cutwthwacophalfblock": "waxed_weathered_cut_copper_slab", + "cutwthwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwthwacoppersl": "waxed_weathered_cut_copper_slab", + "cutwthwacopperslab": "waxed_weathered_cut_copper_slab", + "cutwthwacopperstep": "waxed_weathered_cut_copper_slab", + "cutwthwacopsl": "waxed_weathered_cut_copper_slab", + "cutwthwacopslab": "waxed_weathered_cut_copper_slab", + "cutwthwacopstep": "waxed_weathered_cut_copper_slab", + "cutwthwacosl": "waxed_weathered_cut_copper_slab", + "cutwthwacoslab": "waxed_weathered_cut_copper_slab", + "cutwthwacostep": "waxed_weathered_cut_copper_slab", + "cutwthwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "cutwthwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "cutwthwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwthwaxcoppersl": "waxed_weathered_cut_copper_slab", + "cutwthwaxcopperslab": "waxed_weathered_cut_copper_slab", + "cutwthwaxcopperstep": "waxed_weathered_cut_copper_slab", + "cutwthwaxcopsl": "waxed_weathered_cut_copper_slab", + "cutwthwaxcopslab": "waxed_weathered_cut_copper_slab", + "cutwthwaxcopstep": "waxed_weathered_cut_copper_slab", + "cutwthwaxcosl": "waxed_weathered_cut_copper_slab", + "cutwthwaxcoslab": "waxed_weathered_cut_copper_slab", + "cutwthwaxcostep": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcopsl": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcopslab": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcopstep": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcosl": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcoslab": "waxed_weathered_cut_copper_slab", + "cutwthwaxedcostep": "waxed_weathered_cut_copper_slab", + "cwaweathercohalfblock": "waxed_weathered_cut_copper_slab", + "cwaweathercophalfblock": "waxed_weathered_cut_copper_slab", + "cwaweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwaweathercoppersl": "waxed_weathered_cut_copper_slab", + "cwaweathercopperslab": "waxed_weathered_cut_copper_slab", + "cwaweathercopperstep": "waxed_weathered_cut_copper_slab", + "cwaweathercopsl": "waxed_weathered_cut_copper_slab", + "cwaweathercopslab": "waxed_weathered_cut_copper_slab", + "cwaweathercopstep": "waxed_weathered_cut_copper_slab", + "cwaweathercosl": "waxed_weathered_cut_copper_slab", + "cwaweathercoslab": "waxed_weathered_cut_copper_slab", + "cwaweathercostep": "waxed_weathered_cut_copper_slab", + "cwaweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "cwaweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "cwaweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwaweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "cwaweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "cwaweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "cwaweatheredcopsl": "waxed_weathered_cut_copper_slab", + "cwaweatheredcopslab": "waxed_weathered_cut_copper_slab", + "cwaweatheredcopstep": "waxed_weathered_cut_copper_slab", + "cwaweatheredcosl": "waxed_weathered_cut_copper_slab", + "cwaweatheredcoslab": "waxed_weathered_cut_copper_slab", + "cwaweatheredcostep": "waxed_weathered_cut_copper_slab", + "cwawecohalfblock": "waxed_weathered_cut_copper_slab", + "cwawecophalfblock": "waxed_weathered_cut_copper_slab", + "cwawecopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwawecoppersl": "waxed_weathered_cut_copper_slab", + "cwawecopperslab": "waxed_weathered_cut_copper_slab", + "cwawecopperstep": "waxed_weathered_cut_copper_slab", + "cwawecopsl": "waxed_weathered_cut_copper_slab", + "cwawecopslab": "waxed_weathered_cut_copper_slab", + "cwawecopstep": "waxed_weathered_cut_copper_slab", + "cwawecosl": "waxed_weathered_cut_copper_slab", + "cwawecoslab": "waxed_weathered_cut_copper_slab", + "cwawecostep": "waxed_weathered_cut_copper_slab", + "cwawthcohalfblock": "waxed_weathered_cut_copper_slab", + "cwawthcophalfblock": "waxed_weathered_cut_copper_slab", + "cwawthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwawthcoppersl": "waxed_weathered_cut_copper_slab", + "cwawthcopperslab": "waxed_weathered_cut_copper_slab", + "cwawthcopperstep": "waxed_weathered_cut_copper_slab", + "cwawthcopsl": "waxed_weathered_cut_copper_slab", + "cwawthcopslab": "waxed_weathered_cut_copper_slab", + "cwawthcopstep": "waxed_weathered_cut_copper_slab", + "cwawthcosl": "waxed_weathered_cut_copper_slab", + "cwawthcoslab": "waxed_weathered_cut_copper_slab", + "cwawthcostep": "waxed_weathered_cut_copper_slab", + "cwaxedweathercohalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedweathercophalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedweathercoppersl": "waxed_weathered_cut_copper_slab", + "cwaxedweathercopperslab": "waxed_weathered_cut_copper_slab", + "cwaxedweathercopperstep": "waxed_weathered_cut_copper_slab", + "cwaxedweathercopsl": "waxed_weathered_cut_copper_slab", + "cwaxedweathercopslab": "waxed_weathered_cut_copper_slab", + "cwaxedweathercopstep": "waxed_weathered_cut_copper_slab", + "cwaxedweathercosl": "waxed_weathered_cut_copper_slab", + "cwaxedweathercoslab": "waxed_weathered_cut_copper_slab", + "cwaxedweathercostep": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcopsl": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcopslab": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcopstep": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcosl": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcoslab": "waxed_weathered_cut_copper_slab", + "cwaxedweatheredcostep": "waxed_weathered_cut_copper_slab", + "cwaxedwecohalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedwecophalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedwecopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedwecoppersl": "waxed_weathered_cut_copper_slab", + "cwaxedwecopperslab": "waxed_weathered_cut_copper_slab", + "cwaxedwecopperstep": "waxed_weathered_cut_copper_slab", + "cwaxedwecopsl": "waxed_weathered_cut_copper_slab", + "cwaxedwecopslab": "waxed_weathered_cut_copper_slab", + "cwaxedwecopstep": "waxed_weathered_cut_copper_slab", + "cwaxedwecosl": "waxed_weathered_cut_copper_slab", + "cwaxedwecoslab": "waxed_weathered_cut_copper_slab", + "cwaxedwecostep": "waxed_weathered_cut_copper_slab", + "cwaxedwthcohalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedwthcophalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedwthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwaxedwthcoppersl": "waxed_weathered_cut_copper_slab", + "cwaxedwthcopperslab": "waxed_weathered_cut_copper_slab", + "cwaxedwthcopperstep": "waxed_weathered_cut_copper_slab", + "cwaxedwthcopsl": "waxed_weathered_cut_copper_slab", + "cwaxedwthcopslab": "waxed_weathered_cut_copper_slab", + "cwaxedwthcopstep": "waxed_weathered_cut_copper_slab", + "cwaxedwthcosl": "waxed_weathered_cut_copper_slab", + "cwaxedwthcoslab": "waxed_weathered_cut_copper_slab", + "cwaxedwthcostep": "waxed_weathered_cut_copper_slab", + "cwaxweathercohalfblock": "waxed_weathered_cut_copper_slab", + "cwaxweathercophalfblock": "waxed_weathered_cut_copper_slab", + "cwaxweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwaxweathercoppersl": "waxed_weathered_cut_copper_slab", + "cwaxweathercopperslab": "waxed_weathered_cut_copper_slab", + "cwaxweathercopperstep": "waxed_weathered_cut_copper_slab", + "cwaxweathercopsl": "waxed_weathered_cut_copper_slab", + "cwaxweathercopslab": "waxed_weathered_cut_copper_slab", + "cwaxweathercopstep": "waxed_weathered_cut_copper_slab", + "cwaxweathercosl": "waxed_weathered_cut_copper_slab", + "cwaxweathercoslab": "waxed_weathered_cut_copper_slab", + "cwaxweathercostep": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcopsl": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcopslab": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcopstep": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcosl": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcoslab": "waxed_weathered_cut_copper_slab", + "cwaxweatheredcostep": "waxed_weathered_cut_copper_slab", + "cwaxwecohalfblock": "waxed_weathered_cut_copper_slab", + "cwaxwecophalfblock": "waxed_weathered_cut_copper_slab", + "cwaxwecopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwaxwecoppersl": "waxed_weathered_cut_copper_slab", + "cwaxwecopperslab": "waxed_weathered_cut_copper_slab", + "cwaxwecopperstep": "waxed_weathered_cut_copper_slab", + "cwaxwecopsl": "waxed_weathered_cut_copper_slab", + "cwaxwecopslab": "waxed_weathered_cut_copper_slab", + "cwaxwecopstep": "waxed_weathered_cut_copper_slab", + "cwaxwecosl": "waxed_weathered_cut_copper_slab", + "cwaxwecoslab": "waxed_weathered_cut_copper_slab", + "cwaxwecostep": "waxed_weathered_cut_copper_slab", + "cwaxwthcohalfblock": "waxed_weathered_cut_copper_slab", + "cwaxwthcophalfblock": "waxed_weathered_cut_copper_slab", + "cwaxwthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwaxwthcoppersl": "waxed_weathered_cut_copper_slab", + "cwaxwthcopperslab": "waxed_weathered_cut_copper_slab", + "cwaxwthcopperstep": "waxed_weathered_cut_copper_slab", + "cwaxwthcopsl": "waxed_weathered_cut_copper_slab", + "cwaxwthcopslab": "waxed_weathered_cut_copper_slab", + "cwaxwthcopstep": "waxed_weathered_cut_copper_slab", + "cwaxwthcosl": "waxed_weathered_cut_copper_slab", + "cwaxwthcoslab": "waxed_weathered_cut_copper_slab", + "cwaxwthcostep": "waxed_weathered_cut_copper_slab", + "cweatheredwacohalfblock": "waxed_weathered_cut_copper_slab", + "cweatheredwacophalfblock": "waxed_weathered_cut_copper_slab", + "cweatheredwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "cweatheredwacoppersl": "waxed_weathered_cut_copper_slab", + "cweatheredwacopperslab": "waxed_weathered_cut_copper_slab", + "cweatheredwacopperstep": "waxed_weathered_cut_copper_slab", + "cweatheredwacopsl": "waxed_weathered_cut_copper_slab", + "cweatheredwacopslab": "waxed_weathered_cut_copper_slab", + "cweatheredwacopstep": "waxed_weathered_cut_copper_slab", + "cweatheredwacosl": "waxed_weathered_cut_copper_slab", + "cweatheredwacoslab": "waxed_weathered_cut_copper_slab", + "cweatheredwacostep": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcoppersl": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcopperslab": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcopperstep": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcopsl": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcopslab": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcopstep": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcosl": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcoslab": "waxed_weathered_cut_copper_slab", + "cweatheredwaxcostep": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcopsl": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcopslab": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcopstep": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcosl": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcoslab": "waxed_weathered_cut_copper_slab", + "cweatheredwaxedcostep": "waxed_weathered_cut_copper_slab", + "cweatherwacohalfblock": "waxed_weathered_cut_copper_slab", + "cweatherwacophalfblock": "waxed_weathered_cut_copper_slab", + "cweatherwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "cweatherwacoppersl": "waxed_weathered_cut_copper_slab", + "cweatherwacopperslab": "waxed_weathered_cut_copper_slab", + "cweatherwacopperstep": "waxed_weathered_cut_copper_slab", + "cweatherwacopsl": "waxed_weathered_cut_copper_slab", + "cweatherwacopslab": "waxed_weathered_cut_copper_slab", + "cweatherwacopstep": "waxed_weathered_cut_copper_slab", + "cweatherwacosl": "waxed_weathered_cut_copper_slab", + "cweatherwacoslab": "waxed_weathered_cut_copper_slab", + "cweatherwacostep": "waxed_weathered_cut_copper_slab", + "cweatherwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "cweatherwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "cweatherwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cweatherwaxcoppersl": "waxed_weathered_cut_copper_slab", + "cweatherwaxcopperslab": "waxed_weathered_cut_copper_slab", + "cweatherwaxcopperstep": "waxed_weathered_cut_copper_slab", + "cweatherwaxcopsl": "waxed_weathered_cut_copper_slab", + "cweatherwaxcopslab": "waxed_weathered_cut_copper_slab", + "cweatherwaxcopstep": "waxed_weathered_cut_copper_slab", + "cweatherwaxcosl": "waxed_weathered_cut_copper_slab", + "cweatherwaxcoslab": "waxed_weathered_cut_copper_slab", + "cweatherwaxcostep": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcopsl": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcopslab": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcopstep": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcosl": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcoslab": "waxed_weathered_cut_copper_slab", + "cweatherwaxedcostep": "waxed_weathered_cut_copper_slab", + "cwewacohalfblock": "waxed_weathered_cut_copper_slab", + "cwewacophalfblock": "waxed_weathered_cut_copper_slab", + "cwewacopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwewacoppersl": "waxed_weathered_cut_copper_slab", + "cwewacopperslab": "waxed_weathered_cut_copper_slab", + "cwewacopperstep": "waxed_weathered_cut_copper_slab", + "cwewacopsl": "waxed_weathered_cut_copper_slab", + "cwewacopslab": "waxed_weathered_cut_copper_slab", + "cwewacopstep": "waxed_weathered_cut_copper_slab", + "cwewacosl": "waxed_weathered_cut_copper_slab", + "cwewacoslab": "waxed_weathered_cut_copper_slab", + "cwewacostep": "waxed_weathered_cut_copper_slab", + "cwewaxcohalfblock": "waxed_weathered_cut_copper_slab", + "cwewaxcophalfblock": "waxed_weathered_cut_copper_slab", + "cwewaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwewaxcoppersl": "waxed_weathered_cut_copper_slab", + "cwewaxcopperslab": "waxed_weathered_cut_copper_slab", + "cwewaxcopperstep": "waxed_weathered_cut_copper_slab", + "cwewaxcopsl": "waxed_weathered_cut_copper_slab", + "cwewaxcopslab": "waxed_weathered_cut_copper_slab", + "cwewaxcopstep": "waxed_weathered_cut_copper_slab", + "cwewaxcosl": "waxed_weathered_cut_copper_slab", + "cwewaxcoslab": "waxed_weathered_cut_copper_slab", + "cwewaxcostep": "waxed_weathered_cut_copper_slab", + "cwewaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "cwewaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "cwewaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwewaxedcoppersl": "waxed_weathered_cut_copper_slab", + "cwewaxedcopperslab": "waxed_weathered_cut_copper_slab", + "cwewaxedcopperstep": "waxed_weathered_cut_copper_slab", + "cwewaxedcopsl": "waxed_weathered_cut_copper_slab", + "cwewaxedcopslab": "waxed_weathered_cut_copper_slab", + "cwewaxedcopstep": "waxed_weathered_cut_copper_slab", + "cwewaxedcosl": "waxed_weathered_cut_copper_slab", + "cwewaxedcoslab": "waxed_weathered_cut_copper_slab", + "cwewaxedcostep": "waxed_weathered_cut_copper_slab", + "cwthwacohalfblock": "waxed_weathered_cut_copper_slab", + "cwthwacophalfblock": "waxed_weathered_cut_copper_slab", + "cwthwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwthwacoppersl": "waxed_weathered_cut_copper_slab", + "cwthwacopperslab": "waxed_weathered_cut_copper_slab", + "cwthwacopperstep": "waxed_weathered_cut_copper_slab", + "cwthwacopsl": "waxed_weathered_cut_copper_slab", + "cwthwacopslab": "waxed_weathered_cut_copper_slab", + "cwthwacopstep": "waxed_weathered_cut_copper_slab", + "cwthwacosl": "waxed_weathered_cut_copper_slab", + "cwthwacoslab": "waxed_weathered_cut_copper_slab", + "cwthwacostep": "waxed_weathered_cut_copper_slab", + "cwthwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "cwthwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "cwthwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwthwaxcoppersl": "waxed_weathered_cut_copper_slab", + "cwthwaxcopperslab": "waxed_weathered_cut_copper_slab", + "cwthwaxcopperstep": "waxed_weathered_cut_copper_slab", + "cwthwaxcopsl": "waxed_weathered_cut_copper_slab", + "cwthwaxcopslab": "waxed_weathered_cut_copper_slab", + "cwthwaxcopstep": "waxed_weathered_cut_copper_slab", + "cwthwaxcosl": "waxed_weathered_cut_copper_slab", + "cwthwaxcoslab": "waxed_weathered_cut_copper_slab", + "cwthwaxcostep": "waxed_weathered_cut_copper_slab", + "cwthwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "cwthwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "cwthwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "cwthwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "cwthwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "cwthwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "cwthwaxedcopsl": "waxed_weathered_cut_copper_slab", + "cwthwaxedcopslab": "waxed_weathered_cut_copper_slab", + "cwthwaxedcopstep": "waxed_weathered_cut_copper_slab", + "cwthwaxedcosl": "waxed_weathered_cut_copper_slab", + "cwthwaxedcoslab": "waxed_weathered_cut_copper_slab", + "cwthwaxedcostep": "waxed_weathered_cut_copper_slab", + "minecraft:waxed_weathered_cut_copper_slab": "waxed_weathered_cut_copper_slab", + "wacutweathercohalfblock": "waxed_weathered_cut_copper_slab", + "wacutweathercophalfblock": "waxed_weathered_cut_copper_slab", + "wacutweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "wacutweathercoppersl": "waxed_weathered_cut_copper_slab", + "wacutweathercopperslab": "waxed_weathered_cut_copper_slab", + "wacutweathercopperstep": "waxed_weathered_cut_copper_slab", + "wacutweathercopsl": "waxed_weathered_cut_copper_slab", + "wacutweathercopslab": "waxed_weathered_cut_copper_slab", + "wacutweathercopstep": "waxed_weathered_cut_copper_slab", + "wacutweathercosl": "waxed_weathered_cut_copper_slab", + "wacutweathercoslab": "waxed_weathered_cut_copper_slab", + "wacutweathercostep": "waxed_weathered_cut_copper_slab", + "wacutweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "wacutweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "wacutweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wacutweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "wacutweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "wacutweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "wacutweatheredcopsl": "waxed_weathered_cut_copper_slab", + "wacutweatheredcopslab": "waxed_weathered_cut_copper_slab", + "wacutweatheredcopstep": "waxed_weathered_cut_copper_slab", + "wacutweatheredcosl": "waxed_weathered_cut_copper_slab", + "wacutweatheredcoslab": "waxed_weathered_cut_copper_slab", + "wacutweatheredcostep": "waxed_weathered_cut_copper_slab", + "wacutwecohalfblock": "waxed_weathered_cut_copper_slab", + "wacutwecophalfblock": "waxed_weathered_cut_copper_slab", + "wacutwecopperhalfblock": "waxed_weathered_cut_copper_slab", + "wacutwecoppersl": "waxed_weathered_cut_copper_slab", + "wacutwecopperslab": "waxed_weathered_cut_copper_slab", + "wacutwecopperstep": "waxed_weathered_cut_copper_slab", + "wacutwecopsl": "waxed_weathered_cut_copper_slab", + "wacutwecopslab": "waxed_weathered_cut_copper_slab", + "wacutwecopstep": "waxed_weathered_cut_copper_slab", + "wacutwecosl": "waxed_weathered_cut_copper_slab", + "wacutwecoslab": "waxed_weathered_cut_copper_slab", + "wacutwecostep": "waxed_weathered_cut_copper_slab", + "wacutwthcohalfblock": "waxed_weathered_cut_copper_slab", + "wacutwthcophalfblock": "waxed_weathered_cut_copper_slab", + "wacutwthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wacutwthcoppersl": "waxed_weathered_cut_copper_slab", + "wacutwthcopperslab": "waxed_weathered_cut_copper_slab", + "wacutwthcopperstep": "waxed_weathered_cut_copper_slab", + "wacutwthcopsl": "waxed_weathered_cut_copper_slab", + "wacutwthcopslab": "waxed_weathered_cut_copper_slab", + "wacutwthcopstep": "waxed_weathered_cut_copper_slab", + "wacutwthcosl": "waxed_weathered_cut_copper_slab", + "wacutwthcoslab": "waxed_weathered_cut_copper_slab", + "wacutwthcostep": "waxed_weathered_cut_copper_slab", + "wacweathercohalfblock": "waxed_weathered_cut_copper_slab", + "wacweathercophalfblock": "waxed_weathered_cut_copper_slab", + "wacweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "wacweathercoppersl": "waxed_weathered_cut_copper_slab", + "wacweathercopperslab": "waxed_weathered_cut_copper_slab", + "wacweathercopperstep": "waxed_weathered_cut_copper_slab", + "wacweathercopsl": "waxed_weathered_cut_copper_slab", + "wacweathercopslab": "waxed_weathered_cut_copper_slab", + "wacweathercopstep": "waxed_weathered_cut_copper_slab", + "wacweathercosl": "waxed_weathered_cut_copper_slab", + "wacweathercoslab": "waxed_weathered_cut_copper_slab", + "wacweathercostep": "waxed_weathered_cut_copper_slab", + "wacweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "wacweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "wacweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wacweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "wacweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "wacweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "wacweatheredcopsl": "waxed_weathered_cut_copper_slab", + "wacweatheredcopslab": "waxed_weathered_cut_copper_slab", + "wacweatheredcopstep": "waxed_weathered_cut_copper_slab", + "wacweatheredcosl": "waxed_weathered_cut_copper_slab", + "wacweatheredcoslab": "waxed_weathered_cut_copper_slab", + "wacweatheredcostep": "waxed_weathered_cut_copper_slab", + "wacwecohalfblock": "waxed_weathered_cut_copper_slab", + "wacwecophalfblock": "waxed_weathered_cut_copper_slab", + "wacwecopperhalfblock": "waxed_weathered_cut_copper_slab", + "wacwecoppersl": "waxed_weathered_cut_copper_slab", + "wacwecopperslab": "waxed_weathered_cut_copper_slab", + "wacwecopperstep": "waxed_weathered_cut_copper_slab", + "wacwecopsl": "waxed_weathered_cut_copper_slab", + "wacwecopslab": "waxed_weathered_cut_copper_slab", + "wacwecopstep": "waxed_weathered_cut_copper_slab", + "wacwecosl": "waxed_weathered_cut_copper_slab", + "wacwecoslab": "waxed_weathered_cut_copper_slab", + "wacwecostep": "waxed_weathered_cut_copper_slab", + "wacwthcohalfblock": "waxed_weathered_cut_copper_slab", + "wacwthcophalfblock": "waxed_weathered_cut_copper_slab", + "wacwthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wacwthcoppersl": "waxed_weathered_cut_copper_slab", + "wacwthcopperslab": "waxed_weathered_cut_copper_slab", + "wacwthcopperstep": "waxed_weathered_cut_copper_slab", + "wacwthcopsl": "waxed_weathered_cut_copper_slab", + "wacwthcopslab": "waxed_weathered_cut_copper_slab", + "wacwthcopstep": "waxed_weathered_cut_copper_slab", + "wacwthcosl": "waxed_weathered_cut_copper_slab", + "wacwthcoslab": "waxed_weathered_cut_copper_slab", + "wacwthcostep": "waxed_weathered_cut_copper_slab", + "waweatherccohalfblock": "waxed_weathered_cut_copper_slab", + "waweatherccophalfblock": "waxed_weathered_cut_copper_slab", + "waweatherccopperhalfblock": "waxed_weathered_cut_copper_slab", + "waweatherccoppersl": "waxed_weathered_cut_copper_slab", + "waweatherccopperslab": "waxed_weathered_cut_copper_slab", + "waweatherccopperstep": "waxed_weathered_cut_copper_slab", + "waweatherccopsl": "waxed_weathered_cut_copper_slab", + "waweatherccopslab": "waxed_weathered_cut_copper_slab", + "waweatherccopstep": "waxed_weathered_cut_copper_slab", + "waweatherccosl": "waxed_weathered_cut_copper_slab", + "waweatherccoslab": "waxed_weathered_cut_copper_slab", + "waweatherccostep": "waxed_weathered_cut_copper_slab", + "waweathercutcohalfblock": "waxed_weathered_cut_copper_slab", + "waweathercutcophalfblock": "waxed_weathered_cut_copper_slab", + "waweathercutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waweathercutcoppersl": "waxed_weathered_cut_copper_slab", + "waweathercutcopperslab": "waxed_weathered_cut_copper_slab", + "waweathercutcopperstep": "waxed_weathered_cut_copper_slab", + "waweathercutcopsl": "waxed_weathered_cut_copper_slab", + "waweathercutcopslab": "waxed_weathered_cut_copper_slab", + "waweathercutcopstep": "waxed_weathered_cut_copper_slab", + "waweathercutcosl": "waxed_weathered_cut_copper_slab", + "waweathercutcoslab": "waxed_weathered_cut_copper_slab", + "waweathercutcostep": "waxed_weathered_cut_copper_slab", + "waweatheredccohalfblock": "waxed_weathered_cut_copper_slab", + "waweatheredccophalfblock": "waxed_weathered_cut_copper_slab", + "waweatheredccopperhalfblock": "waxed_weathered_cut_copper_slab", + "waweatheredccoppersl": "waxed_weathered_cut_copper_slab", + "waweatheredccopperslab": "waxed_weathered_cut_copper_slab", + "waweatheredccopperstep": "waxed_weathered_cut_copper_slab", + "waweatheredccopsl": "waxed_weathered_cut_copper_slab", + "waweatheredccopslab": "waxed_weathered_cut_copper_slab", + "waweatheredccopstep": "waxed_weathered_cut_copper_slab", + "waweatheredccosl": "waxed_weathered_cut_copper_slab", + "waweatheredccoslab": "waxed_weathered_cut_copper_slab", + "waweatheredccostep": "waxed_weathered_cut_copper_slab", + "waweatheredcutcohalfblock": "waxed_weathered_cut_copper_slab", + "waweatheredcutcophalfblock": "waxed_weathered_cut_copper_slab", + "waweatheredcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waweatheredcutcoppersl": "waxed_weathered_cut_copper_slab", + "waweatheredcutcopperslab": "waxed_weathered_cut_copper_slab", + "waweatheredcutcopperstep": "waxed_weathered_cut_copper_slab", + "waweatheredcutcopsl": "waxed_weathered_cut_copper_slab", + "waweatheredcutcopslab": "waxed_weathered_cut_copper_slab", + "waweatheredcutcopstep": "waxed_weathered_cut_copper_slab", + "waweatheredcutcosl": "waxed_weathered_cut_copper_slab", + "waweatheredcutcoslab": "waxed_weathered_cut_copper_slab", + "waweatheredcutcostep": "waxed_weathered_cut_copper_slab", + "waweccohalfblock": "waxed_weathered_cut_copper_slab", + "waweccophalfblock": "waxed_weathered_cut_copper_slab", + "waweccopperhalfblock": "waxed_weathered_cut_copper_slab", + "waweccoppersl": "waxed_weathered_cut_copper_slab", + "waweccopperslab": "waxed_weathered_cut_copper_slab", + "waweccopperstep": "waxed_weathered_cut_copper_slab", + "waweccopsl": "waxed_weathered_cut_copper_slab", + "waweccopslab": "waxed_weathered_cut_copper_slab", + "waweccopstep": "waxed_weathered_cut_copper_slab", + "waweccosl": "waxed_weathered_cut_copper_slab", + "waweccoslab": "waxed_weathered_cut_copper_slab", + "waweccostep": "waxed_weathered_cut_copper_slab", + "wawecutcohalfblock": "waxed_weathered_cut_copper_slab", + "wawecutcophalfblock": "waxed_weathered_cut_copper_slab", + "wawecutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wawecutcoppersl": "waxed_weathered_cut_copper_slab", + "wawecutcopperslab": "waxed_weathered_cut_copper_slab", + "wawecutcopperstep": "waxed_weathered_cut_copper_slab", + "wawecutcopsl": "waxed_weathered_cut_copper_slab", + "wawecutcopslab": "waxed_weathered_cut_copper_slab", + "wawecutcopstep": "waxed_weathered_cut_copper_slab", + "wawecutcosl": "waxed_weathered_cut_copper_slab", + "wawecutcoslab": "waxed_weathered_cut_copper_slab", + "wawecutcostep": "waxed_weathered_cut_copper_slab", + "wawthccohalfblock": "waxed_weathered_cut_copper_slab", + "wawthccophalfblock": "waxed_weathered_cut_copper_slab", + "wawthccopperhalfblock": "waxed_weathered_cut_copper_slab", + "wawthccoppersl": "waxed_weathered_cut_copper_slab", + "wawthccopperslab": "waxed_weathered_cut_copper_slab", + "wawthccopperstep": "waxed_weathered_cut_copper_slab", + "wawthccopsl": "waxed_weathered_cut_copper_slab", + "wawthccopslab": "waxed_weathered_cut_copper_slab", + "wawthccopstep": "waxed_weathered_cut_copper_slab", + "wawthccosl": "waxed_weathered_cut_copper_slab", + "wawthccoslab": "waxed_weathered_cut_copper_slab", + "wawthccostep": "waxed_weathered_cut_copper_slab", + "wawthcutcohalfblock": "waxed_weathered_cut_copper_slab", + "wawthcutcophalfblock": "waxed_weathered_cut_copper_slab", + "wawthcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wawthcutcoppersl": "waxed_weathered_cut_copper_slab", + "wawthcutcopperslab": "waxed_weathered_cut_copper_slab", + "wawthcutcopperstep": "waxed_weathered_cut_copper_slab", + "wawthcutcopsl": "waxed_weathered_cut_copper_slab", + "wawthcutcopslab": "waxed_weathered_cut_copper_slab", + "wawthcutcopstep": "waxed_weathered_cut_copper_slab", + "wawthcutcosl": "waxed_weathered_cut_copper_slab", + "wawthcutcoslab": "waxed_weathered_cut_copper_slab", + "wawthcutcostep": "waxed_weathered_cut_copper_slab", + "waxcutweathercohalfblock": "waxed_weathered_cut_copper_slab", + "waxcutweathercophalfblock": "waxed_weathered_cut_copper_slab", + "waxcutweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxcutweathercoppersl": "waxed_weathered_cut_copper_slab", + "waxcutweathercopperslab": "waxed_weathered_cut_copper_slab", + "waxcutweathercopperstep": "waxed_weathered_cut_copper_slab", + "waxcutweathercopsl": "waxed_weathered_cut_copper_slab", + "waxcutweathercopslab": "waxed_weathered_cut_copper_slab", + "waxcutweathercopstep": "waxed_weathered_cut_copper_slab", + "waxcutweathercosl": "waxed_weathered_cut_copper_slab", + "waxcutweathercoslab": "waxed_weathered_cut_copper_slab", + "waxcutweathercostep": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcopsl": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcopslab": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcopstep": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcosl": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcoslab": "waxed_weathered_cut_copper_slab", + "waxcutweatheredcostep": "waxed_weathered_cut_copper_slab", + "waxcutwecohalfblock": "waxed_weathered_cut_copper_slab", + "waxcutwecophalfblock": "waxed_weathered_cut_copper_slab", + "waxcutwecopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxcutwecoppersl": "waxed_weathered_cut_copper_slab", + "waxcutwecopperslab": "waxed_weathered_cut_copper_slab", + "waxcutwecopperstep": "waxed_weathered_cut_copper_slab", + "waxcutwecopsl": "waxed_weathered_cut_copper_slab", + "waxcutwecopslab": "waxed_weathered_cut_copper_slab", + "waxcutwecopstep": "waxed_weathered_cut_copper_slab", + "waxcutwecosl": "waxed_weathered_cut_copper_slab", + "waxcutwecoslab": "waxed_weathered_cut_copper_slab", + "waxcutwecostep": "waxed_weathered_cut_copper_slab", + "waxcutwthcohalfblock": "waxed_weathered_cut_copper_slab", + "waxcutwthcophalfblock": "waxed_weathered_cut_copper_slab", + "waxcutwthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxcutwthcoppersl": "waxed_weathered_cut_copper_slab", + "waxcutwthcopperslab": "waxed_weathered_cut_copper_slab", + "waxcutwthcopperstep": "waxed_weathered_cut_copper_slab", + "waxcutwthcopsl": "waxed_weathered_cut_copper_slab", + "waxcutwthcopslab": "waxed_weathered_cut_copper_slab", + "waxcutwthcopstep": "waxed_weathered_cut_copper_slab", + "waxcutwthcosl": "waxed_weathered_cut_copper_slab", + "waxcutwthcoslab": "waxed_weathered_cut_copper_slab", + "waxcutwthcostep": "waxed_weathered_cut_copper_slab", + "waxcweathercohalfblock": "waxed_weathered_cut_copper_slab", + "waxcweathercophalfblock": "waxed_weathered_cut_copper_slab", + "waxcweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxcweathercoppersl": "waxed_weathered_cut_copper_slab", + "waxcweathercopperslab": "waxed_weathered_cut_copper_slab", + "waxcweathercopperstep": "waxed_weathered_cut_copper_slab", + "waxcweathercopsl": "waxed_weathered_cut_copper_slab", + "waxcweathercopslab": "waxed_weathered_cut_copper_slab", + "waxcweathercopstep": "waxed_weathered_cut_copper_slab", + "waxcweathercosl": "waxed_weathered_cut_copper_slab", + "waxcweathercoslab": "waxed_weathered_cut_copper_slab", + "waxcweathercostep": "waxed_weathered_cut_copper_slab", + "waxcweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "waxcweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "waxcweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxcweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "waxcweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "waxcweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "waxcweatheredcopsl": "waxed_weathered_cut_copper_slab", + "waxcweatheredcopslab": "waxed_weathered_cut_copper_slab", + "waxcweatheredcopstep": "waxed_weathered_cut_copper_slab", + "waxcweatheredcosl": "waxed_weathered_cut_copper_slab", + "waxcweatheredcoslab": "waxed_weathered_cut_copper_slab", + "waxcweatheredcostep": "waxed_weathered_cut_copper_slab", + "waxcwecohalfblock": "waxed_weathered_cut_copper_slab", + "waxcwecophalfblock": "waxed_weathered_cut_copper_slab", + "waxcwecopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxcwecoppersl": "waxed_weathered_cut_copper_slab", + "waxcwecopperslab": "waxed_weathered_cut_copper_slab", + "waxcwecopperstep": "waxed_weathered_cut_copper_slab", + "waxcwecopsl": "waxed_weathered_cut_copper_slab", + "waxcwecopslab": "waxed_weathered_cut_copper_slab", + "waxcwecopstep": "waxed_weathered_cut_copper_slab", + "waxcwecosl": "waxed_weathered_cut_copper_slab", + "waxcwecoslab": "waxed_weathered_cut_copper_slab", + "waxcwecostep": "waxed_weathered_cut_copper_slab", + "waxcwthcohalfblock": "waxed_weathered_cut_copper_slab", + "waxcwthcophalfblock": "waxed_weathered_cut_copper_slab", + "waxcwthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxcwthcoppersl": "waxed_weathered_cut_copper_slab", + "waxcwthcopperslab": "waxed_weathered_cut_copper_slab", + "waxcwthcopperstep": "waxed_weathered_cut_copper_slab", + "waxcwthcopsl": "waxed_weathered_cut_copper_slab", + "waxcwthcopslab": "waxed_weathered_cut_copper_slab", + "waxcwthcopstep": "waxed_weathered_cut_copper_slab", + "waxcwthcosl": "waxed_weathered_cut_copper_slab", + "waxcwthcoslab": "waxed_weathered_cut_copper_slab", + "waxcwthcostep": "waxed_weathered_cut_copper_slab", + "waxedcutweathercohalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutweathercophalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutweathercoppersl": "waxed_weathered_cut_copper_slab", + "waxedcutweathercopperslab": "waxed_weathered_cut_copper_slab", + "waxedcutweathercopperstep": "waxed_weathered_cut_copper_slab", + "waxedcutweathercopsl": "waxed_weathered_cut_copper_slab", + "waxedcutweathercopslab": "waxed_weathered_cut_copper_slab", + "waxedcutweathercopstep": "waxed_weathered_cut_copper_slab", + "waxedcutweathercosl": "waxed_weathered_cut_copper_slab", + "waxedcutweathercoslab": "waxed_weathered_cut_copper_slab", + "waxedcutweathercostep": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcopsl": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcopslab": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcopstep": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcosl": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcoslab": "waxed_weathered_cut_copper_slab", + "waxedcutweatheredcostep": "waxed_weathered_cut_copper_slab", + "waxedcutwecohalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutwecophalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutwecopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutwecoppersl": "waxed_weathered_cut_copper_slab", + "waxedcutwecopperslab": "waxed_weathered_cut_copper_slab", + "waxedcutwecopperstep": "waxed_weathered_cut_copper_slab", + "waxedcutwecopsl": "waxed_weathered_cut_copper_slab", + "waxedcutwecopslab": "waxed_weathered_cut_copper_slab", + "waxedcutwecopstep": "waxed_weathered_cut_copper_slab", + "waxedcutwecosl": "waxed_weathered_cut_copper_slab", + "waxedcutwecoslab": "waxed_weathered_cut_copper_slab", + "waxedcutwecostep": "waxed_weathered_cut_copper_slab", + "waxedcutwthcohalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutwthcophalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutwthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedcutwthcoppersl": "waxed_weathered_cut_copper_slab", + "waxedcutwthcopperslab": "waxed_weathered_cut_copper_slab", + "waxedcutwthcopperstep": "waxed_weathered_cut_copper_slab", + "waxedcutwthcopsl": "waxed_weathered_cut_copper_slab", + "waxedcutwthcopslab": "waxed_weathered_cut_copper_slab", + "waxedcutwthcopstep": "waxed_weathered_cut_copper_slab", + "waxedcutwthcosl": "waxed_weathered_cut_copper_slab", + "waxedcutwthcoslab": "waxed_weathered_cut_copper_slab", + "waxedcutwthcostep": "waxed_weathered_cut_copper_slab", + "waxedcweathercohalfblock": "waxed_weathered_cut_copper_slab", + "waxedcweathercophalfblock": "waxed_weathered_cut_copper_slab", + "waxedcweathercopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedcweathercoppersl": "waxed_weathered_cut_copper_slab", + "waxedcweathercopperslab": "waxed_weathered_cut_copper_slab", + "waxedcweathercopperstep": "waxed_weathered_cut_copper_slab", + "waxedcweathercopsl": "waxed_weathered_cut_copper_slab", + "waxedcweathercopslab": "waxed_weathered_cut_copper_slab", + "waxedcweathercopstep": "waxed_weathered_cut_copper_slab", + "waxedcweathercosl": "waxed_weathered_cut_copper_slab", + "waxedcweathercoslab": "waxed_weathered_cut_copper_slab", + "waxedcweathercostep": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcohalfblock": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcophalfblock": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcoppersl": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcopperslab": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcopperstep": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcopsl": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcopslab": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcopstep": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcosl": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcoslab": "waxed_weathered_cut_copper_slab", + "waxedcweatheredcostep": "waxed_weathered_cut_copper_slab", + "waxedcwecohalfblock": "waxed_weathered_cut_copper_slab", + "waxedcwecophalfblock": "waxed_weathered_cut_copper_slab", + "waxedcwecopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedcwecoppersl": "waxed_weathered_cut_copper_slab", + "waxedcwecopperslab": "waxed_weathered_cut_copper_slab", + "waxedcwecopperstep": "waxed_weathered_cut_copper_slab", + "waxedcwecopsl": "waxed_weathered_cut_copper_slab", + "waxedcwecopslab": "waxed_weathered_cut_copper_slab", + "waxedcwecopstep": "waxed_weathered_cut_copper_slab", + "waxedcwecosl": "waxed_weathered_cut_copper_slab", + "waxedcwecoslab": "waxed_weathered_cut_copper_slab", + "waxedcwecostep": "waxed_weathered_cut_copper_slab", + "waxedcwthcohalfblock": "waxed_weathered_cut_copper_slab", + "waxedcwthcophalfblock": "waxed_weathered_cut_copper_slab", + "waxedcwthcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedcwthcoppersl": "waxed_weathered_cut_copper_slab", + "waxedcwthcopperslab": "waxed_weathered_cut_copper_slab", + "waxedcwthcopperstep": "waxed_weathered_cut_copper_slab", + "waxedcwthcopsl": "waxed_weathered_cut_copper_slab", + "waxedcwthcopslab": "waxed_weathered_cut_copper_slab", + "waxedcwthcopstep": "waxed_weathered_cut_copper_slab", + "waxedcwthcosl": "waxed_weathered_cut_copper_slab", + "waxedcwthcoslab": "waxed_weathered_cut_copper_slab", + "waxedcwthcostep": "waxed_weathered_cut_copper_slab", + "waxedweatherccohalfblock": "waxed_weathered_cut_copper_slab", + "waxedweatherccophalfblock": "waxed_weathered_cut_copper_slab", + "waxedweatherccopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedweatherccoppersl": "waxed_weathered_cut_copper_slab", + "waxedweatherccopperslab": "waxed_weathered_cut_copper_slab", + "waxedweatherccopperstep": "waxed_weathered_cut_copper_slab", + "waxedweatherccopsl": "waxed_weathered_cut_copper_slab", + "waxedweatherccopslab": "waxed_weathered_cut_copper_slab", + "waxedweatherccopstep": "waxed_weathered_cut_copper_slab", + "waxedweatherccosl": "waxed_weathered_cut_copper_slab", + "waxedweatherccoslab": "waxed_weathered_cut_copper_slab", + "waxedweatherccostep": "waxed_weathered_cut_copper_slab", + "waxedweathercutcohalfblock": "waxed_weathered_cut_copper_slab", + "waxedweathercutcophalfblock": "waxed_weathered_cut_copper_slab", + "waxedweathercutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedweathercutcoppersl": "waxed_weathered_cut_copper_slab", + "waxedweathercutcopperslab": "waxed_weathered_cut_copper_slab", + "waxedweathercutcopperstep": "waxed_weathered_cut_copper_slab", + "waxedweathercutcopsl": "waxed_weathered_cut_copper_slab", + "waxedweathercutcopslab": "waxed_weathered_cut_copper_slab", + "waxedweathercutcopstep": "waxed_weathered_cut_copper_slab", + "waxedweathercutcosl": "waxed_weathered_cut_copper_slab", + "waxedweathercutcoslab": "waxed_weathered_cut_copper_slab", + "waxedweathercutcostep": "waxed_weathered_cut_copper_slab", + "waxedweatheredccohalfblock": "waxed_weathered_cut_copper_slab", + "waxedweatheredccophalfblock": "waxed_weathered_cut_copper_slab", + "waxedweatheredccopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedweatheredccoppersl": "waxed_weathered_cut_copper_slab", + "waxedweatheredccopperslab": "waxed_weathered_cut_copper_slab", + "waxedweatheredccopperstep": "waxed_weathered_cut_copper_slab", + "waxedweatheredccopsl": "waxed_weathered_cut_copper_slab", + "waxedweatheredccopslab": "waxed_weathered_cut_copper_slab", + "waxedweatheredccopstep": "waxed_weathered_cut_copper_slab", + "waxedweatheredccosl": "waxed_weathered_cut_copper_slab", + "waxedweatheredccoslab": "waxed_weathered_cut_copper_slab", + "waxedweatheredccostep": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcohalfblock": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcophalfblock": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcoppersl": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcopperslab": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcopperstep": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcopsl": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcopslab": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcopstep": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcosl": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcoslab": "waxed_weathered_cut_copper_slab", + "waxedweatheredcutcostep": "waxed_weathered_cut_copper_slab", + "waxedweccohalfblock": "waxed_weathered_cut_copper_slab", + "waxedweccophalfblock": "waxed_weathered_cut_copper_slab", + "waxedweccopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedweccoppersl": "waxed_weathered_cut_copper_slab", + "waxedweccopperslab": "waxed_weathered_cut_copper_slab", + "waxedweccopperstep": "waxed_weathered_cut_copper_slab", + "waxedweccopsl": "waxed_weathered_cut_copper_slab", + "waxedweccopslab": "waxed_weathered_cut_copper_slab", + "waxedweccopstep": "waxed_weathered_cut_copper_slab", + "waxedweccosl": "waxed_weathered_cut_copper_slab", + "waxedweccoslab": "waxed_weathered_cut_copper_slab", + "waxedweccostep": "waxed_weathered_cut_copper_slab", + "waxedwecutcohalfblock": "waxed_weathered_cut_copper_slab", + "waxedwecutcophalfblock": "waxed_weathered_cut_copper_slab", + "waxedwecutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedwecutcoppersl": "waxed_weathered_cut_copper_slab", + "waxedwecutcopperslab": "waxed_weathered_cut_copper_slab", + "waxedwecutcopperstep": "waxed_weathered_cut_copper_slab", + "waxedwecutcopsl": "waxed_weathered_cut_copper_slab", + "waxedwecutcopslab": "waxed_weathered_cut_copper_slab", + "waxedwecutcopstep": "waxed_weathered_cut_copper_slab", + "waxedwecutcosl": "waxed_weathered_cut_copper_slab", + "waxedwecutcoslab": "waxed_weathered_cut_copper_slab", + "waxedwecutcostep": "waxed_weathered_cut_copper_slab", + "waxedwthccohalfblock": "waxed_weathered_cut_copper_slab", + "waxedwthccophalfblock": "waxed_weathered_cut_copper_slab", + "waxedwthccopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedwthccoppersl": "waxed_weathered_cut_copper_slab", + "waxedwthccopperslab": "waxed_weathered_cut_copper_slab", + "waxedwthccopperstep": "waxed_weathered_cut_copper_slab", + "waxedwthccopsl": "waxed_weathered_cut_copper_slab", + "waxedwthccopslab": "waxed_weathered_cut_copper_slab", + "waxedwthccopstep": "waxed_weathered_cut_copper_slab", + "waxedwthccosl": "waxed_weathered_cut_copper_slab", + "waxedwthccoslab": "waxed_weathered_cut_copper_slab", + "waxedwthccostep": "waxed_weathered_cut_copper_slab", + "waxedwthcutcohalfblock": "waxed_weathered_cut_copper_slab", + "waxedwthcutcophalfblock": "waxed_weathered_cut_copper_slab", + "waxedwthcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxedwthcutcoppersl": "waxed_weathered_cut_copper_slab", + "waxedwthcutcopperslab": "waxed_weathered_cut_copper_slab", + "waxedwthcutcopperstep": "waxed_weathered_cut_copper_slab", + "waxedwthcutcopsl": "waxed_weathered_cut_copper_slab", + "waxedwthcutcopslab": "waxed_weathered_cut_copper_slab", + "waxedwthcutcopstep": "waxed_weathered_cut_copper_slab", + "waxedwthcutcosl": "waxed_weathered_cut_copper_slab", + "waxedwthcutcoslab": "waxed_weathered_cut_copper_slab", + "waxedwthcutcostep": "waxed_weathered_cut_copper_slab", + "waxweatherccohalfblock": "waxed_weathered_cut_copper_slab", + "waxweatherccophalfblock": "waxed_weathered_cut_copper_slab", + "waxweatherccopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxweatherccoppersl": "waxed_weathered_cut_copper_slab", + "waxweatherccopperslab": "waxed_weathered_cut_copper_slab", + "waxweatherccopperstep": "waxed_weathered_cut_copper_slab", + "waxweatherccopsl": "waxed_weathered_cut_copper_slab", + "waxweatherccopslab": "waxed_weathered_cut_copper_slab", + "waxweatherccopstep": "waxed_weathered_cut_copper_slab", + "waxweatherccosl": "waxed_weathered_cut_copper_slab", + "waxweatherccoslab": "waxed_weathered_cut_copper_slab", + "waxweatherccostep": "waxed_weathered_cut_copper_slab", + "waxweathercutcohalfblock": "waxed_weathered_cut_copper_slab", + "waxweathercutcophalfblock": "waxed_weathered_cut_copper_slab", + "waxweathercutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxweathercutcoppersl": "waxed_weathered_cut_copper_slab", + "waxweathercutcopperslab": "waxed_weathered_cut_copper_slab", + "waxweathercutcopperstep": "waxed_weathered_cut_copper_slab", + "waxweathercutcopsl": "waxed_weathered_cut_copper_slab", + "waxweathercutcopslab": "waxed_weathered_cut_copper_slab", + "waxweathercutcopstep": "waxed_weathered_cut_copper_slab", + "waxweathercutcosl": "waxed_weathered_cut_copper_slab", + "waxweathercutcoslab": "waxed_weathered_cut_copper_slab", + "waxweathercutcostep": "waxed_weathered_cut_copper_slab", + "waxweatheredccohalfblock": "waxed_weathered_cut_copper_slab", + "waxweatheredccophalfblock": "waxed_weathered_cut_copper_slab", + "waxweatheredccopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxweatheredccoppersl": "waxed_weathered_cut_copper_slab", + "waxweatheredccopperslab": "waxed_weathered_cut_copper_slab", + "waxweatheredccopperstep": "waxed_weathered_cut_copper_slab", + "waxweatheredccopsl": "waxed_weathered_cut_copper_slab", + "waxweatheredccopslab": "waxed_weathered_cut_copper_slab", + "waxweatheredccopstep": "waxed_weathered_cut_copper_slab", + "waxweatheredccosl": "waxed_weathered_cut_copper_slab", + "waxweatheredccoslab": "waxed_weathered_cut_copper_slab", + "waxweatheredccostep": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcohalfblock": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcophalfblock": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcoppersl": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcopperslab": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcopperstep": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcopsl": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcopslab": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcopstep": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcosl": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcoslab": "waxed_weathered_cut_copper_slab", + "waxweatheredcutcostep": "waxed_weathered_cut_copper_slab", + "waxweccohalfblock": "waxed_weathered_cut_copper_slab", + "waxweccophalfblock": "waxed_weathered_cut_copper_slab", + "waxweccopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxweccoppersl": "waxed_weathered_cut_copper_slab", + "waxweccopperslab": "waxed_weathered_cut_copper_slab", + "waxweccopperstep": "waxed_weathered_cut_copper_slab", + "waxweccopsl": "waxed_weathered_cut_copper_slab", + "waxweccopslab": "waxed_weathered_cut_copper_slab", + "waxweccopstep": "waxed_weathered_cut_copper_slab", + "waxweccosl": "waxed_weathered_cut_copper_slab", + "waxweccoslab": "waxed_weathered_cut_copper_slab", + "waxweccostep": "waxed_weathered_cut_copper_slab", + "waxwecutcohalfblock": "waxed_weathered_cut_copper_slab", + "waxwecutcophalfblock": "waxed_weathered_cut_copper_slab", + "waxwecutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxwecutcoppersl": "waxed_weathered_cut_copper_slab", + "waxwecutcopperslab": "waxed_weathered_cut_copper_slab", + "waxwecutcopperstep": "waxed_weathered_cut_copper_slab", + "waxwecutcopsl": "waxed_weathered_cut_copper_slab", + "waxwecutcopslab": "waxed_weathered_cut_copper_slab", + "waxwecutcopstep": "waxed_weathered_cut_copper_slab", + "waxwecutcosl": "waxed_weathered_cut_copper_slab", + "waxwecutcoslab": "waxed_weathered_cut_copper_slab", + "waxwecutcostep": "waxed_weathered_cut_copper_slab", + "waxwthccohalfblock": "waxed_weathered_cut_copper_slab", + "waxwthccophalfblock": "waxed_weathered_cut_copper_slab", + "waxwthccopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxwthccoppersl": "waxed_weathered_cut_copper_slab", + "waxwthccopperslab": "waxed_weathered_cut_copper_slab", + "waxwthccopperstep": "waxed_weathered_cut_copper_slab", + "waxwthccopsl": "waxed_weathered_cut_copper_slab", + "waxwthccopslab": "waxed_weathered_cut_copper_slab", + "waxwthccopstep": "waxed_weathered_cut_copper_slab", + "waxwthccosl": "waxed_weathered_cut_copper_slab", + "waxwthccoslab": "waxed_weathered_cut_copper_slab", + "waxwthccostep": "waxed_weathered_cut_copper_slab", + "waxwthcutcohalfblock": "waxed_weathered_cut_copper_slab", + "waxwthcutcophalfblock": "waxed_weathered_cut_copper_slab", + "waxwthcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "waxwthcutcoppersl": "waxed_weathered_cut_copper_slab", + "waxwthcutcopperslab": "waxed_weathered_cut_copper_slab", + "waxwthcutcopperstep": "waxed_weathered_cut_copper_slab", + "waxwthcutcopsl": "waxed_weathered_cut_copper_slab", + "waxwthcutcopslab": "waxed_weathered_cut_copper_slab", + "waxwthcutcopstep": "waxed_weathered_cut_copper_slab", + "waxwthcutcosl": "waxed_weathered_cut_copper_slab", + "waxwthcutcoslab": "waxed_weathered_cut_copper_slab", + "waxwthcutcostep": "waxed_weathered_cut_copper_slab", + "weathercutwacohalfblock": "waxed_weathered_cut_copper_slab", + "weathercutwacophalfblock": "waxed_weathered_cut_copper_slab", + "weathercutwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "weathercutwacoppersl": "waxed_weathered_cut_copper_slab", + "weathercutwacopperslab": "waxed_weathered_cut_copper_slab", + "weathercutwacopperstep": "waxed_weathered_cut_copper_slab", + "weathercutwacopsl": "waxed_weathered_cut_copper_slab", + "weathercutwacopslab": "waxed_weathered_cut_copper_slab", + "weathercutwacopstep": "waxed_weathered_cut_copper_slab", + "weathercutwacosl": "waxed_weathered_cut_copper_slab", + "weathercutwacoslab": "waxed_weathered_cut_copper_slab", + "weathercutwacostep": "waxed_weathered_cut_copper_slab", + "weathercutwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "weathercutwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "weathercutwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weathercutwaxcoppersl": "waxed_weathered_cut_copper_slab", + "weathercutwaxcopperslab": "waxed_weathered_cut_copper_slab", + "weathercutwaxcopperstep": "waxed_weathered_cut_copper_slab", + "weathercutwaxcopsl": "waxed_weathered_cut_copper_slab", + "weathercutwaxcopslab": "waxed_weathered_cut_copper_slab", + "weathercutwaxcopstep": "waxed_weathered_cut_copper_slab", + "weathercutwaxcosl": "waxed_weathered_cut_copper_slab", + "weathercutwaxcoslab": "waxed_weathered_cut_copper_slab", + "weathercutwaxcostep": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcopsl": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcopslab": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcopstep": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcosl": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcoslab": "waxed_weathered_cut_copper_slab", + "weathercutwaxedcostep": "waxed_weathered_cut_copper_slab", + "weathercwacohalfblock": "waxed_weathered_cut_copper_slab", + "weathercwacophalfblock": "waxed_weathered_cut_copper_slab", + "weathercwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "weathercwacoppersl": "waxed_weathered_cut_copper_slab", + "weathercwacopperslab": "waxed_weathered_cut_copper_slab", + "weathercwacopperstep": "waxed_weathered_cut_copper_slab", + "weathercwacopsl": "waxed_weathered_cut_copper_slab", + "weathercwacopslab": "waxed_weathered_cut_copper_slab", + "weathercwacopstep": "waxed_weathered_cut_copper_slab", + "weathercwacosl": "waxed_weathered_cut_copper_slab", + "weathercwacoslab": "waxed_weathered_cut_copper_slab", + "weathercwacostep": "waxed_weathered_cut_copper_slab", + "weathercwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "weathercwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "weathercwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weathercwaxcoppersl": "waxed_weathered_cut_copper_slab", + "weathercwaxcopperslab": "waxed_weathered_cut_copper_slab", + "weathercwaxcopperstep": "waxed_weathered_cut_copper_slab", + "weathercwaxcopsl": "waxed_weathered_cut_copper_slab", + "weathercwaxcopslab": "waxed_weathered_cut_copper_slab", + "weathercwaxcopstep": "waxed_weathered_cut_copper_slab", + "weathercwaxcosl": "waxed_weathered_cut_copper_slab", + "weathercwaxcoslab": "waxed_weathered_cut_copper_slab", + "weathercwaxcostep": "waxed_weathered_cut_copper_slab", + "weathercwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "weathercwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "weathercwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weathercwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "weathercwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "weathercwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "weathercwaxedcopsl": "waxed_weathered_cut_copper_slab", + "weathercwaxedcopslab": "waxed_weathered_cut_copper_slab", + "weathercwaxedcopstep": "waxed_weathered_cut_copper_slab", + "weathercwaxedcosl": "waxed_weathered_cut_copper_slab", + "weathercwaxedcoslab": "waxed_weathered_cut_copper_slab", + "weathercwaxedcostep": "waxed_weathered_cut_copper_slab", + "weatheredcutwacohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcutwacophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcutwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcutwacoppersl": "waxed_weathered_cut_copper_slab", + "weatheredcutwacopperslab": "waxed_weathered_cut_copper_slab", + "weatheredcutwacopperstep": "waxed_weathered_cut_copper_slab", + "weatheredcutwacopsl": "waxed_weathered_cut_copper_slab", + "weatheredcutwacopslab": "waxed_weathered_cut_copper_slab", + "weatheredcutwacopstep": "waxed_weathered_cut_copper_slab", + "weatheredcutwacosl": "waxed_weathered_cut_copper_slab", + "weatheredcutwacoslab": "waxed_weathered_cut_copper_slab", + "weatheredcutwacostep": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcoppersl": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcopperslab": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcopperstep": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcopsl": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcopslab": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcopstep": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcosl": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcoslab": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxcostep": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcopsl": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcopslab": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcopstep": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcosl": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcoslab": "waxed_weathered_cut_copper_slab", + "weatheredcutwaxedcostep": "waxed_weathered_cut_copper_slab", + "weatheredcwacohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcwacophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcwacoppersl": "waxed_weathered_cut_copper_slab", + "weatheredcwacopperslab": "waxed_weathered_cut_copper_slab", + "weatheredcwacopperstep": "waxed_weathered_cut_copper_slab", + "weatheredcwacopsl": "waxed_weathered_cut_copper_slab", + "weatheredcwacopslab": "waxed_weathered_cut_copper_slab", + "weatheredcwacopstep": "waxed_weathered_cut_copper_slab", + "weatheredcwacosl": "waxed_weathered_cut_copper_slab", + "weatheredcwacoslab": "waxed_weathered_cut_copper_slab", + "weatheredcwacostep": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcoppersl": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcopperslab": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcopperstep": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcopsl": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcopslab": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcopstep": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcosl": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcoslab": "waxed_weathered_cut_copper_slab", + "weatheredcwaxcostep": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcopsl": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcopslab": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcopstep": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcosl": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcoslab": "waxed_weathered_cut_copper_slab", + "weatheredcwaxedcostep": "waxed_weathered_cut_copper_slab", + "weatheredwaccohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaccophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaccopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaccoppersl": "waxed_weathered_cut_copper_slab", + "weatheredwaccopperslab": "waxed_weathered_cut_copper_slab", + "weatheredwaccopperstep": "waxed_weathered_cut_copper_slab", + "weatheredwaccopsl": "waxed_weathered_cut_copper_slab", + "weatheredwaccopslab": "waxed_weathered_cut_copper_slab", + "weatheredwaccopstep": "waxed_weathered_cut_copper_slab", + "weatheredwaccosl": "waxed_weathered_cut_copper_slab", + "weatheredwaccoslab": "waxed_weathered_cut_copper_slab", + "weatheredwaccostep": "waxed_weathered_cut_copper_slab", + "weatheredwacutcohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwacutcophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwacutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwacutcoppersl": "waxed_weathered_cut_copper_slab", + "weatheredwacutcopperslab": "waxed_weathered_cut_copper_slab", + "weatheredwacutcopperstep": "waxed_weathered_cut_copper_slab", + "weatheredwacutcopsl": "waxed_weathered_cut_copper_slab", + "weatheredwacutcopslab": "waxed_weathered_cut_copper_slab", + "weatheredwacutcopstep": "waxed_weathered_cut_copper_slab", + "weatheredwacutcosl": "waxed_weathered_cut_copper_slab", + "weatheredwacutcoslab": "waxed_weathered_cut_copper_slab", + "weatheredwacutcostep": "waxed_weathered_cut_copper_slab", + "weatheredwaxccohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxccophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxccopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxccoppersl": "waxed_weathered_cut_copper_slab", + "weatheredwaxccopperslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxccopperstep": "waxed_weathered_cut_copper_slab", + "weatheredwaxccopsl": "waxed_weathered_cut_copper_slab", + "weatheredwaxccopslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxccopstep": "waxed_weathered_cut_copper_slab", + "weatheredwaxccosl": "waxed_weathered_cut_copper_slab", + "weatheredwaxccoslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxccostep": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcoppersl": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcopperslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcopperstep": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcopsl": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcopslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcopstep": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcosl": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcoslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxcutcostep": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccoppersl": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccopperslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccopperstep": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccopsl": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccopslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccopstep": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccosl": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccoslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxedccostep": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcohalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcophalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcoppersl": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcopperslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcopperstep": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcopsl": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcopslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcopstep": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcosl": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcoslab": "waxed_weathered_cut_copper_slab", + "weatheredwaxedcutcostep": "waxed_weathered_cut_copper_slab", + "weatherwaccohalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaccophalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaccopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaccoppersl": "waxed_weathered_cut_copper_slab", + "weatherwaccopperslab": "waxed_weathered_cut_copper_slab", + "weatherwaccopperstep": "waxed_weathered_cut_copper_slab", + "weatherwaccopsl": "waxed_weathered_cut_copper_slab", + "weatherwaccopslab": "waxed_weathered_cut_copper_slab", + "weatherwaccopstep": "waxed_weathered_cut_copper_slab", + "weatherwaccosl": "waxed_weathered_cut_copper_slab", + "weatherwaccoslab": "waxed_weathered_cut_copper_slab", + "weatherwaccostep": "waxed_weathered_cut_copper_slab", + "weatherwacutcohalfblock": "waxed_weathered_cut_copper_slab", + "weatherwacutcophalfblock": "waxed_weathered_cut_copper_slab", + "weatherwacutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatherwacutcoppersl": "waxed_weathered_cut_copper_slab", + "weatherwacutcopperslab": "waxed_weathered_cut_copper_slab", + "weatherwacutcopperstep": "waxed_weathered_cut_copper_slab", + "weatherwacutcopsl": "waxed_weathered_cut_copper_slab", + "weatherwacutcopslab": "waxed_weathered_cut_copper_slab", + "weatherwacutcopstep": "waxed_weathered_cut_copper_slab", + "weatherwacutcosl": "waxed_weathered_cut_copper_slab", + "weatherwacutcoslab": "waxed_weathered_cut_copper_slab", + "weatherwacutcostep": "waxed_weathered_cut_copper_slab", + "weatherwaxccohalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxccophalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxccopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxccoppersl": "waxed_weathered_cut_copper_slab", + "weatherwaxccopperslab": "waxed_weathered_cut_copper_slab", + "weatherwaxccopperstep": "waxed_weathered_cut_copper_slab", + "weatherwaxccopsl": "waxed_weathered_cut_copper_slab", + "weatherwaxccopslab": "waxed_weathered_cut_copper_slab", + "weatherwaxccopstep": "waxed_weathered_cut_copper_slab", + "weatherwaxccosl": "waxed_weathered_cut_copper_slab", + "weatherwaxccoslab": "waxed_weathered_cut_copper_slab", + "weatherwaxccostep": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcohalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcophalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcoppersl": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcopperslab": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcopperstep": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcopsl": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcopslab": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcopstep": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcosl": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcoslab": "waxed_weathered_cut_copper_slab", + "weatherwaxcutcostep": "waxed_weathered_cut_copper_slab", + "weatherwaxedccohalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxedccophalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxedccopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxedccoppersl": "waxed_weathered_cut_copper_slab", + "weatherwaxedccopperslab": "waxed_weathered_cut_copper_slab", + "weatherwaxedccopperstep": "waxed_weathered_cut_copper_slab", + "weatherwaxedccopsl": "waxed_weathered_cut_copper_slab", + "weatherwaxedccopslab": "waxed_weathered_cut_copper_slab", + "weatherwaxedccopstep": "waxed_weathered_cut_copper_slab", + "weatherwaxedccosl": "waxed_weathered_cut_copper_slab", + "weatherwaxedccoslab": "waxed_weathered_cut_copper_slab", + "weatherwaxedccostep": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcohalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcophalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcoppersl": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcopperslab": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcopperstep": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcopsl": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcopslab": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcopstep": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcosl": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcoslab": "waxed_weathered_cut_copper_slab", + "weatherwaxedcutcostep": "waxed_weathered_cut_copper_slab", + "wecutwacohalfblock": "waxed_weathered_cut_copper_slab", + "wecutwacophalfblock": "waxed_weathered_cut_copper_slab", + "wecutwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "wecutwacoppersl": "waxed_weathered_cut_copper_slab", + "wecutwacopperslab": "waxed_weathered_cut_copper_slab", + "wecutwacopperstep": "waxed_weathered_cut_copper_slab", + "wecutwacopsl": "waxed_weathered_cut_copper_slab", + "wecutwacopslab": "waxed_weathered_cut_copper_slab", + "wecutwacopstep": "waxed_weathered_cut_copper_slab", + "wecutwacosl": "waxed_weathered_cut_copper_slab", + "wecutwacoslab": "waxed_weathered_cut_copper_slab", + "wecutwacostep": "waxed_weathered_cut_copper_slab", + "wecutwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "wecutwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "wecutwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wecutwaxcoppersl": "waxed_weathered_cut_copper_slab", + "wecutwaxcopperslab": "waxed_weathered_cut_copper_slab", + "wecutwaxcopperstep": "waxed_weathered_cut_copper_slab", + "wecutwaxcopsl": "waxed_weathered_cut_copper_slab", + "wecutwaxcopslab": "waxed_weathered_cut_copper_slab", + "wecutwaxcopstep": "waxed_weathered_cut_copper_slab", + "wecutwaxcosl": "waxed_weathered_cut_copper_slab", + "wecutwaxcoslab": "waxed_weathered_cut_copper_slab", + "wecutwaxcostep": "waxed_weathered_cut_copper_slab", + "wecutwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "wecutwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "wecutwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wecutwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "wecutwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "wecutwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "wecutwaxedcopsl": "waxed_weathered_cut_copper_slab", + "wecutwaxedcopslab": "waxed_weathered_cut_copper_slab", + "wecutwaxedcopstep": "waxed_weathered_cut_copper_slab", + "wecutwaxedcosl": "waxed_weathered_cut_copper_slab", + "wecutwaxedcoslab": "waxed_weathered_cut_copper_slab", + "wecutwaxedcostep": "waxed_weathered_cut_copper_slab", + "wecwacohalfblock": "waxed_weathered_cut_copper_slab", + "wecwacophalfblock": "waxed_weathered_cut_copper_slab", + "wecwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "wecwacoppersl": "waxed_weathered_cut_copper_slab", + "wecwacopperslab": "waxed_weathered_cut_copper_slab", + "wecwacopperstep": "waxed_weathered_cut_copper_slab", + "wecwacopsl": "waxed_weathered_cut_copper_slab", + "wecwacopslab": "waxed_weathered_cut_copper_slab", + "wecwacopstep": "waxed_weathered_cut_copper_slab", + "wecwacosl": "waxed_weathered_cut_copper_slab", + "wecwacoslab": "waxed_weathered_cut_copper_slab", + "wecwacostep": "waxed_weathered_cut_copper_slab", + "wecwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "wecwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "wecwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wecwaxcoppersl": "waxed_weathered_cut_copper_slab", + "wecwaxcopperslab": "waxed_weathered_cut_copper_slab", + "wecwaxcopperstep": "waxed_weathered_cut_copper_slab", + "wecwaxcopsl": "waxed_weathered_cut_copper_slab", + "wecwaxcopslab": "waxed_weathered_cut_copper_slab", + "wecwaxcopstep": "waxed_weathered_cut_copper_slab", + "wecwaxcosl": "waxed_weathered_cut_copper_slab", + "wecwaxcoslab": "waxed_weathered_cut_copper_slab", + "wecwaxcostep": "waxed_weathered_cut_copper_slab", + "wecwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "wecwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "wecwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wecwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "wecwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "wecwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "wecwaxedcopsl": "waxed_weathered_cut_copper_slab", + "wecwaxedcopslab": "waxed_weathered_cut_copper_slab", + "wecwaxedcopstep": "waxed_weathered_cut_copper_slab", + "wecwaxedcosl": "waxed_weathered_cut_copper_slab", + "wecwaxedcoslab": "waxed_weathered_cut_copper_slab", + "wecwaxedcostep": "waxed_weathered_cut_copper_slab", + "wewaccohalfblock": "waxed_weathered_cut_copper_slab", + "wewaccophalfblock": "waxed_weathered_cut_copper_slab", + "wewaccopperhalfblock": "waxed_weathered_cut_copper_slab", + "wewaccoppersl": "waxed_weathered_cut_copper_slab", + "wewaccopperslab": "waxed_weathered_cut_copper_slab", + "wewaccopperstep": "waxed_weathered_cut_copper_slab", + "wewaccopsl": "waxed_weathered_cut_copper_slab", + "wewaccopslab": "waxed_weathered_cut_copper_slab", + "wewaccopstep": "waxed_weathered_cut_copper_slab", + "wewaccosl": "waxed_weathered_cut_copper_slab", + "wewaccoslab": "waxed_weathered_cut_copper_slab", + "wewaccostep": "waxed_weathered_cut_copper_slab", + "wewacutcohalfblock": "waxed_weathered_cut_copper_slab", + "wewacutcophalfblock": "waxed_weathered_cut_copper_slab", + "wewacutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wewacutcoppersl": "waxed_weathered_cut_copper_slab", + "wewacutcopperslab": "waxed_weathered_cut_copper_slab", + "wewacutcopperstep": "waxed_weathered_cut_copper_slab", + "wewacutcopsl": "waxed_weathered_cut_copper_slab", + "wewacutcopslab": "waxed_weathered_cut_copper_slab", + "wewacutcopstep": "waxed_weathered_cut_copper_slab", + "wewacutcosl": "waxed_weathered_cut_copper_slab", + "wewacutcoslab": "waxed_weathered_cut_copper_slab", + "wewacutcostep": "waxed_weathered_cut_copper_slab", + "wewaxccohalfblock": "waxed_weathered_cut_copper_slab", + "wewaxccophalfblock": "waxed_weathered_cut_copper_slab", + "wewaxccopperhalfblock": "waxed_weathered_cut_copper_slab", + "wewaxccoppersl": "waxed_weathered_cut_copper_slab", + "wewaxccopperslab": "waxed_weathered_cut_copper_slab", + "wewaxccopperstep": "waxed_weathered_cut_copper_slab", + "wewaxccopsl": "waxed_weathered_cut_copper_slab", + "wewaxccopslab": "waxed_weathered_cut_copper_slab", + "wewaxccopstep": "waxed_weathered_cut_copper_slab", + "wewaxccosl": "waxed_weathered_cut_copper_slab", + "wewaxccoslab": "waxed_weathered_cut_copper_slab", + "wewaxccostep": "waxed_weathered_cut_copper_slab", + "wewaxcutcohalfblock": "waxed_weathered_cut_copper_slab", + "wewaxcutcophalfblock": "waxed_weathered_cut_copper_slab", + "wewaxcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wewaxcutcoppersl": "waxed_weathered_cut_copper_slab", + "wewaxcutcopperslab": "waxed_weathered_cut_copper_slab", + "wewaxcutcopperstep": "waxed_weathered_cut_copper_slab", + "wewaxcutcopsl": "waxed_weathered_cut_copper_slab", + "wewaxcutcopslab": "waxed_weathered_cut_copper_slab", + "wewaxcutcopstep": "waxed_weathered_cut_copper_slab", + "wewaxcutcosl": "waxed_weathered_cut_copper_slab", + "wewaxcutcoslab": "waxed_weathered_cut_copper_slab", + "wewaxcutcostep": "waxed_weathered_cut_copper_slab", + "wewaxedccohalfblock": "waxed_weathered_cut_copper_slab", + "wewaxedccophalfblock": "waxed_weathered_cut_copper_slab", + "wewaxedccopperhalfblock": "waxed_weathered_cut_copper_slab", + "wewaxedccoppersl": "waxed_weathered_cut_copper_slab", + "wewaxedccopperslab": "waxed_weathered_cut_copper_slab", + "wewaxedccopperstep": "waxed_weathered_cut_copper_slab", + "wewaxedccopsl": "waxed_weathered_cut_copper_slab", + "wewaxedccopslab": "waxed_weathered_cut_copper_slab", + "wewaxedccopstep": "waxed_weathered_cut_copper_slab", + "wewaxedccosl": "waxed_weathered_cut_copper_slab", + "wewaxedccoslab": "waxed_weathered_cut_copper_slab", + "wewaxedccostep": "waxed_weathered_cut_copper_slab", + "wewaxedcutcohalfblock": "waxed_weathered_cut_copper_slab", + "wewaxedcutcophalfblock": "waxed_weathered_cut_copper_slab", + "wewaxedcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wewaxedcutcoppersl": "waxed_weathered_cut_copper_slab", + "wewaxedcutcopperslab": "waxed_weathered_cut_copper_slab", + "wewaxedcutcopperstep": "waxed_weathered_cut_copper_slab", + "wewaxedcutcopsl": "waxed_weathered_cut_copper_slab", + "wewaxedcutcopslab": "waxed_weathered_cut_copper_slab", + "wewaxedcutcopstep": "waxed_weathered_cut_copper_slab", + "wewaxedcutcosl": "waxed_weathered_cut_copper_slab", + "wewaxedcutcoslab": "waxed_weathered_cut_copper_slab", + "wewaxedcutcostep": "waxed_weathered_cut_copper_slab", + "wthcutwacohalfblock": "waxed_weathered_cut_copper_slab", + "wthcutwacophalfblock": "waxed_weathered_cut_copper_slab", + "wthcutwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthcutwacoppersl": "waxed_weathered_cut_copper_slab", + "wthcutwacopperslab": "waxed_weathered_cut_copper_slab", + "wthcutwacopperstep": "waxed_weathered_cut_copper_slab", + "wthcutwacopsl": "waxed_weathered_cut_copper_slab", + "wthcutwacopslab": "waxed_weathered_cut_copper_slab", + "wthcutwacopstep": "waxed_weathered_cut_copper_slab", + "wthcutwacosl": "waxed_weathered_cut_copper_slab", + "wthcutwacoslab": "waxed_weathered_cut_copper_slab", + "wthcutwacostep": "waxed_weathered_cut_copper_slab", + "wthcutwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "wthcutwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "wthcutwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthcutwaxcoppersl": "waxed_weathered_cut_copper_slab", + "wthcutwaxcopperslab": "waxed_weathered_cut_copper_slab", + "wthcutwaxcopperstep": "waxed_weathered_cut_copper_slab", + "wthcutwaxcopsl": "waxed_weathered_cut_copper_slab", + "wthcutwaxcopslab": "waxed_weathered_cut_copper_slab", + "wthcutwaxcopstep": "waxed_weathered_cut_copper_slab", + "wthcutwaxcosl": "waxed_weathered_cut_copper_slab", + "wthcutwaxcoslab": "waxed_weathered_cut_copper_slab", + "wthcutwaxcostep": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcopsl": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcopslab": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcopstep": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcosl": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcoslab": "waxed_weathered_cut_copper_slab", + "wthcutwaxedcostep": "waxed_weathered_cut_copper_slab", + "wthcwacohalfblock": "waxed_weathered_cut_copper_slab", + "wthcwacophalfblock": "waxed_weathered_cut_copper_slab", + "wthcwacopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthcwacoppersl": "waxed_weathered_cut_copper_slab", + "wthcwacopperslab": "waxed_weathered_cut_copper_slab", + "wthcwacopperstep": "waxed_weathered_cut_copper_slab", + "wthcwacopsl": "waxed_weathered_cut_copper_slab", + "wthcwacopslab": "waxed_weathered_cut_copper_slab", + "wthcwacopstep": "waxed_weathered_cut_copper_slab", + "wthcwacosl": "waxed_weathered_cut_copper_slab", + "wthcwacoslab": "waxed_weathered_cut_copper_slab", + "wthcwacostep": "waxed_weathered_cut_copper_slab", + "wthcwaxcohalfblock": "waxed_weathered_cut_copper_slab", + "wthcwaxcophalfblock": "waxed_weathered_cut_copper_slab", + "wthcwaxcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthcwaxcoppersl": "waxed_weathered_cut_copper_slab", + "wthcwaxcopperslab": "waxed_weathered_cut_copper_slab", + "wthcwaxcopperstep": "waxed_weathered_cut_copper_slab", + "wthcwaxcopsl": "waxed_weathered_cut_copper_slab", + "wthcwaxcopslab": "waxed_weathered_cut_copper_slab", + "wthcwaxcopstep": "waxed_weathered_cut_copper_slab", + "wthcwaxcosl": "waxed_weathered_cut_copper_slab", + "wthcwaxcoslab": "waxed_weathered_cut_copper_slab", + "wthcwaxcostep": "waxed_weathered_cut_copper_slab", + "wthcwaxedcohalfblock": "waxed_weathered_cut_copper_slab", + "wthcwaxedcophalfblock": "waxed_weathered_cut_copper_slab", + "wthcwaxedcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthcwaxedcoppersl": "waxed_weathered_cut_copper_slab", + "wthcwaxedcopperslab": "waxed_weathered_cut_copper_slab", + "wthcwaxedcopperstep": "waxed_weathered_cut_copper_slab", + "wthcwaxedcopsl": "waxed_weathered_cut_copper_slab", + "wthcwaxedcopslab": "waxed_weathered_cut_copper_slab", + "wthcwaxedcopstep": "waxed_weathered_cut_copper_slab", + "wthcwaxedcosl": "waxed_weathered_cut_copper_slab", + "wthcwaxedcoslab": "waxed_weathered_cut_copper_slab", + "wthcwaxedcostep": "waxed_weathered_cut_copper_slab", + "wthwaccohalfblock": "waxed_weathered_cut_copper_slab", + "wthwaccophalfblock": "waxed_weathered_cut_copper_slab", + "wthwaccopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthwaccoppersl": "waxed_weathered_cut_copper_slab", + "wthwaccopperslab": "waxed_weathered_cut_copper_slab", + "wthwaccopperstep": "waxed_weathered_cut_copper_slab", + "wthwaccopsl": "waxed_weathered_cut_copper_slab", + "wthwaccopslab": "waxed_weathered_cut_copper_slab", + "wthwaccopstep": "waxed_weathered_cut_copper_slab", + "wthwaccosl": "waxed_weathered_cut_copper_slab", + "wthwaccoslab": "waxed_weathered_cut_copper_slab", + "wthwaccostep": "waxed_weathered_cut_copper_slab", + "wthwacutcohalfblock": "waxed_weathered_cut_copper_slab", + "wthwacutcophalfblock": "waxed_weathered_cut_copper_slab", + "wthwacutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthwacutcoppersl": "waxed_weathered_cut_copper_slab", + "wthwacutcopperslab": "waxed_weathered_cut_copper_slab", + "wthwacutcopperstep": "waxed_weathered_cut_copper_slab", + "wthwacutcopsl": "waxed_weathered_cut_copper_slab", + "wthwacutcopslab": "waxed_weathered_cut_copper_slab", + "wthwacutcopstep": "waxed_weathered_cut_copper_slab", + "wthwacutcosl": "waxed_weathered_cut_copper_slab", + "wthwacutcoslab": "waxed_weathered_cut_copper_slab", + "wthwacutcostep": "waxed_weathered_cut_copper_slab", + "wthwaxccohalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxccophalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxccopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxccoppersl": "waxed_weathered_cut_copper_slab", + "wthwaxccopperslab": "waxed_weathered_cut_copper_slab", + "wthwaxccopperstep": "waxed_weathered_cut_copper_slab", + "wthwaxccopsl": "waxed_weathered_cut_copper_slab", + "wthwaxccopslab": "waxed_weathered_cut_copper_slab", + "wthwaxccopstep": "waxed_weathered_cut_copper_slab", + "wthwaxccosl": "waxed_weathered_cut_copper_slab", + "wthwaxccoslab": "waxed_weathered_cut_copper_slab", + "wthwaxccostep": "waxed_weathered_cut_copper_slab", + "wthwaxcutcohalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxcutcophalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxcutcoppersl": "waxed_weathered_cut_copper_slab", + "wthwaxcutcopperslab": "waxed_weathered_cut_copper_slab", + "wthwaxcutcopperstep": "waxed_weathered_cut_copper_slab", + "wthwaxcutcopsl": "waxed_weathered_cut_copper_slab", + "wthwaxcutcopslab": "waxed_weathered_cut_copper_slab", + "wthwaxcutcopstep": "waxed_weathered_cut_copper_slab", + "wthwaxcutcosl": "waxed_weathered_cut_copper_slab", + "wthwaxcutcoslab": "waxed_weathered_cut_copper_slab", + "wthwaxcutcostep": "waxed_weathered_cut_copper_slab", + "wthwaxedccohalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxedccophalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxedccopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxedccoppersl": "waxed_weathered_cut_copper_slab", + "wthwaxedccopperslab": "waxed_weathered_cut_copper_slab", + "wthwaxedccopperstep": "waxed_weathered_cut_copper_slab", + "wthwaxedccopsl": "waxed_weathered_cut_copper_slab", + "wthwaxedccopslab": "waxed_weathered_cut_copper_slab", + "wthwaxedccopstep": "waxed_weathered_cut_copper_slab", + "wthwaxedccosl": "waxed_weathered_cut_copper_slab", + "wthwaxedccoslab": "waxed_weathered_cut_copper_slab", + "wthwaxedccostep": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcohalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcophalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcopperhalfblock": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcoppersl": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcopperslab": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcopperstep": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcopsl": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcopslab": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcopstep": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcosl": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcoslab": "waxed_weathered_cut_copper_slab", + "wthwaxedcutcostep": "waxed_weathered_cut_copper_slab", + "waxed_weathered_cut_copper_stairs": { + "material": "WAXED_WEATHERED_CUT_COPPER_STAIRS" + }, + "cutwaweathercopperstair": "waxed_weathered_cut_copper_stairs", + "cutwaweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwaweathercopstair": "waxed_weathered_cut_copper_stairs", + "cutwaweathercopstairs": "waxed_weathered_cut_copper_stairs", + "cutwaweathercostair": "waxed_weathered_cut_copper_stairs", + "cutwaweathercostairs": "waxed_weathered_cut_copper_stairs", + "cutwaweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "cutwaweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwaweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "cutwaweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "cutwaweatheredcostair": "waxed_weathered_cut_copper_stairs", + "cutwaweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "cutwawecopperstair": "waxed_weathered_cut_copper_stairs", + "cutwawecopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwawecopstair": "waxed_weathered_cut_copper_stairs", + "cutwawecopstairs": "waxed_weathered_cut_copper_stairs", + "cutwawecostair": "waxed_weathered_cut_copper_stairs", + "cutwawecostairs": "waxed_weathered_cut_copper_stairs", + "cutwawthcopperstair": "waxed_weathered_cut_copper_stairs", + "cutwawthcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwawthcopstair": "waxed_weathered_cut_copper_stairs", + "cutwawthcopstairs": "waxed_weathered_cut_copper_stairs", + "cutwawthcostair": "waxed_weathered_cut_copper_stairs", + "cutwawthcostairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedweathercopperstair": "waxed_weathered_cut_copper_stairs", + "cutwaxedweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedweathercopstair": "waxed_weathered_cut_copper_stairs", + "cutwaxedweathercopstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedweathercostair": "waxed_weathered_cut_copper_stairs", + "cutwaxedweathercostairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "cutwaxedweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "cutwaxedweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedweatheredcostair": "waxed_weathered_cut_copper_stairs", + "cutwaxedweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedwecopperstair": "waxed_weathered_cut_copper_stairs", + "cutwaxedwecopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedwecopstair": "waxed_weathered_cut_copper_stairs", + "cutwaxedwecopstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedwecostair": "waxed_weathered_cut_copper_stairs", + "cutwaxedwecostairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedwthcopperstair": "waxed_weathered_cut_copper_stairs", + "cutwaxedwthcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedwthcopstair": "waxed_weathered_cut_copper_stairs", + "cutwaxedwthcopstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxedwthcostair": "waxed_weathered_cut_copper_stairs", + "cutwaxedwthcostairs": "waxed_weathered_cut_copper_stairs", + "cutwaxweathercopperstair": "waxed_weathered_cut_copper_stairs", + "cutwaxweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxweathercopstair": "waxed_weathered_cut_copper_stairs", + "cutwaxweathercopstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxweathercostair": "waxed_weathered_cut_copper_stairs", + "cutwaxweathercostairs": "waxed_weathered_cut_copper_stairs", + "cutwaxweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "cutwaxweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "cutwaxweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxweatheredcostair": "waxed_weathered_cut_copper_stairs", + "cutwaxweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "cutwaxwecopperstair": "waxed_weathered_cut_copper_stairs", + "cutwaxwecopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxwecopstair": "waxed_weathered_cut_copper_stairs", + "cutwaxwecopstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxwecostair": "waxed_weathered_cut_copper_stairs", + "cutwaxwecostairs": "waxed_weathered_cut_copper_stairs", + "cutwaxwthcopperstair": "waxed_weathered_cut_copper_stairs", + "cutwaxwthcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxwthcopstair": "waxed_weathered_cut_copper_stairs", + "cutwaxwthcopstairs": "waxed_weathered_cut_copper_stairs", + "cutwaxwthcostair": "waxed_weathered_cut_copper_stairs", + "cutwaxwthcostairs": "waxed_weathered_cut_copper_stairs", + "cutweatheredwacopperstair": "waxed_weathered_cut_copper_stairs", + "cutweatheredwacopperstairs": "waxed_weathered_cut_copper_stairs", + "cutweatheredwacopstair": "waxed_weathered_cut_copper_stairs", + "cutweatheredwacopstairs": "waxed_weathered_cut_copper_stairs", + "cutweatheredwacostair": "waxed_weathered_cut_copper_stairs", + "cutweatheredwacostairs": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxcopstair": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxcostair": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxcostairs": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxedcostair": "waxed_weathered_cut_copper_stairs", + "cutweatheredwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "cutweatherwacopperstair": "waxed_weathered_cut_copper_stairs", + "cutweatherwacopperstairs": "waxed_weathered_cut_copper_stairs", + "cutweatherwacopstair": "waxed_weathered_cut_copper_stairs", + "cutweatherwacopstairs": "waxed_weathered_cut_copper_stairs", + "cutweatherwacostair": "waxed_weathered_cut_copper_stairs", + "cutweatherwacostairs": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxcopstair": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxcostair": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxcostairs": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxedcostair": "waxed_weathered_cut_copper_stairs", + "cutweatherwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "cutwewacopperstair": "waxed_weathered_cut_copper_stairs", + "cutwewacopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwewacopstair": "waxed_weathered_cut_copper_stairs", + "cutwewacopstairs": "waxed_weathered_cut_copper_stairs", + "cutwewacostair": "waxed_weathered_cut_copper_stairs", + "cutwewacostairs": "waxed_weathered_cut_copper_stairs", + "cutwewaxcopperstair": "waxed_weathered_cut_copper_stairs", + "cutwewaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwewaxcopstair": "waxed_weathered_cut_copper_stairs", + "cutwewaxcopstairs": "waxed_weathered_cut_copper_stairs", + "cutwewaxcostair": "waxed_weathered_cut_copper_stairs", + "cutwewaxcostairs": "waxed_weathered_cut_copper_stairs", + "cutwewaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "cutwewaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwewaxedcopstair": "waxed_weathered_cut_copper_stairs", + "cutwewaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "cutwewaxedcostair": "waxed_weathered_cut_copper_stairs", + "cutwewaxedcostairs": "waxed_weathered_cut_copper_stairs", + "cutwthwacopperstair": "waxed_weathered_cut_copper_stairs", + "cutwthwacopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwthwacopstair": "waxed_weathered_cut_copper_stairs", + "cutwthwacopstairs": "waxed_weathered_cut_copper_stairs", + "cutwthwacostair": "waxed_weathered_cut_copper_stairs", + "cutwthwacostairs": "waxed_weathered_cut_copper_stairs", + "cutwthwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "cutwthwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwthwaxcopstair": "waxed_weathered_cut_copper_stairs", + "cutwthwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "cutwthwaxcostair": "waxed_weathered_cut_copper_stairs", + "cutwthwaxcostairs": "waxed_weathered_cut_copper_stairs", + "cutwthwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "cutwthwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "cutwthwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "cutwthwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "cutwthwaxedcostair": "waxed_weathered_cut_copper_stairs", + "cutwthwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "cwaweathercopperstair": "waxed_weathered_cut_copper_stairs", + "cwaweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "cwaweathercopstair": "waxed_weathered_cut_copper_stairs", + "cwaweathercopstairs": "waxed_weathered_cut_copper_stairs", + "cwaweathercostair": "waxed_weathered_cut_copper_stairs", + "cwaweathercostairs": "waxed_weathered_cut_copper_stairs", + "cwaweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "cwaweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "cwaweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "cwaweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "cwaweatheredcostair": "waxed_weathered_cut_copper_stairs", + "cwaweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "cwawecopperstair": "waxed_weathered_cut_copper_stairs", + "cwawecopperstairs": "waxed_weathered_cut_copper_stairs", + "cwawecopstair": "waxed_weathered_cut_copper_stairs", + "cwawecopstairs": "waxed_weathered_cut_copper_stairs", + "cwawecostair": "waxed_weathered_cut_copper_stairs", + "cwawecostairs": "waxed_weathered_cut_copper_stairs", + "cwawthcopperstair": "waxed_weathered_cut_copper_stairs", + "cwawthcopperstairs": "waxed_weathered_cut_copper_stairs", + "cwawthcopstair": "waxed_weathered_cut_copper_stairs", + "cwawthcopstairs": "waxed_weathered_cut_copper_stairs", + "cwawthcostair": "waxed_weathered_cut_copper_stairs", + "cwawthcostairs": "waxed_weathered_cut_copper_stairs", + "cwaxedweathercopperstair": "waxed_weathered_cut_copper_stairs", + "cwaxedweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "cwaxedweathercopstair": "waxed_weathered_cut_copper_stairs", + "cwaxedweathercopstairs": "waxed_weathered_cut_copper_stairs", + "cwaxedweathercostair": "waxed_weathered_cut_copper_stairs", + "cwaxedweathercostairs": "waxed_weathered_cut_copper_stairs", + "cwaxedweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "cwaxedweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "cwaxedweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "cwaxedweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "cwaxedweatheredcostair": "waxed_weathered_cut_copper_stairs", + "cwaxedweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "cwaxedwecopperstair": "waxed_weathered_cut_copper_stairs", + "cwaxedwecopperstairs": "waxed_weathered_cut_copper_stairs", + "cwaxedwecopstair": "waxed_weathered_cut_copper_stairs", + "cwaxedwecopstairs": "waxed_weathered_cut_copper_stairs", + "cwaxedwecostair": "waxed_weathered_cut_copper_stairs", + "cwaxedwecostairs": "waxed_weathered_cut_copper_stairs", + "cwaxedwthcopperstair": "waxed_weathered_cut_copper_stairs", + "cwaxedwthcopperstairs": "waxed_weathered_cut_copper_stairs", + "cwaxedwthcopstair": "waxed_weathered_cut_copper_stairs", + "cwaxedwthcopstairs": "waxed_weathered_cut_copper_stairs", + "cwaxedwthcostair": "waxed_weathered_cut_copper_stairs", + "cwaxedwthcostairs": "waxed_weathered_cut_copper_stairs", + "cwaxweathercopperstair": "waxed_weathered_cut_copper_stairs", + "cwaxweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "cwaxweathercopstair": "waxed_weathered_cut_copper_stairs", + "cwaxweathercopstairs": "waxed_weathered_cut_copper_stairs", + "cwaxweathercostair": "waxed_weathered_cut_copper_stairs", + "cwaxweathercostairs": "waxed_weathered_cut_copper_stairs", + "cwaxweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "cwaxweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "cwaxweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "cwaxweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "cwaxweatheredcostair": "waxed_weathered_cut_copper_stairs", + "cwaxweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "cwaxwecopperstair": "waxed_weathered_cut_copper_stairs", + "cwaxwecopperstairs": "waxed_weathered_cut_copper_stairs", + "cwaxwecopstair": "waxed_weathered_cut_copper_stairs", + "cwaxwecopstairs": "waxed_weathered_cut_copper_stairs", + "cwaxwecostair": "waxed_weathered_cut_copper_stairs", + "cwaxwecostairs": "waxed_weathered_cut_copper_stairs", + "cwaxwthcopperstair": "waxed_weathered_cut_copper_stairs", + "cwaxwthcopperstairs": "waxed_weathered_cut_copper_stairs", + "cwaxwthcopstair": "waxed_weathered_cut_copper_stairs", + "cwaxwthcopstairs": "waxed_weathered_cut_copper_stairs", + "cwaxwthcostair": "waxed_weathered_cut_copper_stairs", + "cwaxwthcostairs": "waxed_weathered_cut_copper_stairs", + "cweatheredwacopperstair": "waxed_weathered_cut_copper_stairs", + "cweatheredwacopperstairs": "waxed_weathered_cut_copper_stairs", + "cweatheredwacopstair": "waxed_weathered_cut_copper_stairs", + "cweatheredwacopstairs": "waxed_weathered_cut_copper_stairs", + "cweatheredwacostair": "waxed_weathered_cut_copper_stairs", + "cweatheredwacostairs": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxcopstair": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxcostair": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxcostairs": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxedcostair": "waxed_weathered_cut_copper_stairs", + "cweatheredwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "cweatherwacopperstair": "waxed_weathered_cut_copper_stairs", + "cweatherwacopperstairs": "waxed_weathered_cut_copper_stairs", + "cweatherwacopstair": "waxed_weathered_cut_copper_stairs", + "cweatherwacopstairs": "waxed_weathered_cut_copper_stairs", + "cweatherwacostair": "waxed_weathered_cut_copper_stairs", + "cweatherwacostairs": "waxed_weathered_cut_copper_stairs", + "cweatherwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "cweatherwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "cweatherwaxcopstair": "waxed_weathered_cut_copper_stairs", + "cweatherwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "cweatherwaxcostair": "waxed_weathered_cut_copper_stairs", + "cweatherwaxcostairs": "waxed_weathered_cut_copper_stairs", + "cweatherwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "cweatherwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "cweatherwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "cweatherwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "cweatherwaxedcostair": "waxed_weathered_cut_copper_stairs", + "cweatherwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "cwewacopperstair": "waxed_weathered_cut_copper_stairs", + "cwewacopperstairs": "waxed_weathered_cut_copper_stairs", + "cwewacopstair": "waxed_weathered_cut_copper_stairs", + "cwewacopstairs": "waxed_weathered_cut_copper_stairs", + "cwewacostair": "waxed_weathered_cut_copper_stairs", + "cwewacostairs": "waxed_weathered_cut_copper_stairs", + "cwewaxcopperstair": "waxed_weathered_cut_copper_stairs", + "cwewaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "cwewaxcopstair": "waxed_weathered_cut_copper_stairs", + "cwewaxcopstairs": "waxed_weathered_cut_copper_stairs", + "cwewaxcostair": "waxed_weathered_cut_copper_stairs", + "cwewaxcostairs": "waxed_weathered_cut_copper_stairs", + "cwewaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "cwewaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "cwewaxedcopstair": "waxed_weathered_cut_copper_stairs", + "cwewaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "cwewaxedcostair": "waxed_weathered_cut_copper_stairs", + "cwewaxedcostairs": "waxed_weathered_cut_copper_stairs", + "cwthwacopperstair": "waxed_weathered_cut_copper_stairs", + "cwthwacopperstairs": "waxed_weathered_cut_copper_stairs", + "cwthwacopstair": "waxed_weathered_cut_copper_stairs", + "cwthwacopstairs": "waxed_weathered_cut_copper_stairs", + "cwthwacostair": "waxed_weathered_cut_copper_stairs", + "cwthwacostairs": "waxed_weathered_cut_copper_stairs", + "cwthwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "cwthwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "cwthwaxcopstair": "waxed_weathered_cut_copper_stairs", + "cwthwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "cwthwaxcostair": "waxed_weathered_cut_copper_stairs", + "cwthwaxcostairs": "waxed_weathered_cut_copper_stairs", + "cwthwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "cwthwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "cwthwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "cwthwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "cwthwaxedcostair": "waxed_weathered_cut_copper_stairs", + "cwthwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "minecraft:waxed_weathered_cut_copper_stairs": "waxed_weathered_cut_copper_stairs", + "wacutweathercopperstair": "waxed_weathered_cut_copper_stairs", + "wacutweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "wacutweathercopstair": "waxed_weathered_cut_copper_stairs", + "wacutweathercopstairs": "waxed_weathered_cut_copper_stairs", + "wacutweathercostair": "waxed_weathered_cut_copper_stairs", + "wacutweathercostairs": "waxed_weathered_cut_copper_stairs", + "wacutweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "wacutweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "wacutweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "wacutweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "wacutweatheredcostair": "waxed_weathered_cut_copper_stairs", + "wacutweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "wacutwecopperstair": "waxed_weathered_cut_copper_stairs", + "wacutwecopperstairs": "waxed_weathered_cut_copper_stairs", + "wacutwecopstair": "waxed_weathered_cut_copper_stairs", + "wacutwecopstairs": "waxed_weathered_cut_copper_stairs", + "wacutwecostair": "waxed_weathered_cut_copper_stairs", + "wacutwecostairs": "waxed_weathered_cut_copper_stairs", + "wacutwthcopperstair": "waxed_weathered_cut_copper_stairs", + "wacutwthcopperstairs": "waxed_weathered_cut_copper_stairs", + "wacutwthcopstair": "waxed_weathered_cut_copper_stairs", + "wacutwthcopstairs": "waxed_weathered_cut_copper_stairs", + "wacutwthcostair": "waxed_weathered_cut_copper_stairs", + "wacutwthcostairs": "waxed_weathered_cut_copper_stairs", + "wacweathercopperstair": "waxed_weathered_cut_copper_stairs", + "wacweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "wacweathercopstair": "waxed_weathered_cut_copper_stairs", + "wacweathercopstairs": "waxed_weathered_cut_copper_stairs", + "wacweathercostair": "waxed_weathered_cut_copper_stairs", + "wacweathercostairs": "waxed_weathered_cut_copper_stairs", + "wacweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "wacweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "wacweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "wacweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "wacweatheredcostair": "waxed_weathered_cut_copper_stairs", + "wacweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "wacwecopperstair": "waxed_weathered_cut_copper_stairs", + "wacwecopperstairs": "waxed_weathered_cut_copper_stairs", + "wacwecopstair": "waxed_weathered_cut_copper_stairs", + "wacwecopstairs": "waxed_weathered_cut_copper_stairs", + "wacwecostair": "waxed_weathered_cut_copper_stairs", + "wacwecostairs": "waxed_weathered_cut_copper_stairs", + "wacwthcopperstair": "waxed_weathered_cut_copper_stairs", + "wacwthcopperstairs": "waxed_weathered_cut_copper_stairs", + "wacwthcopstair": "waxed_weathered_cut_copper_stairs", + "wacwthcopstairs": "waxed_weathered_cut_copper_stairs", + "wacwthcostair": "waxed_weathered_cut_copper_stairs", + "wacwthcostairs": "waxed_weathered_cut_copper_stairs", + "waweatherccopperstair": "waxed_weathered_cut_copper_stairs", + "waweatherccopperstairs": "waxed_weathered_cut_copper_stairs", + "waweatherccopstair": "waxed_weathered_cut_copper_stairs", + "waweatherccopstairs": "waxed_weathered_cut_copper_stairs", + "waweatherccostair": "waxed_weathered_cut_copper_stairs", + "waweatherccostairs": "waxed_weathered_cut_copper_stairs", + "waweathercutcopperstair": "waxed_weathered_cut_copper_stairs", + "waweathercutcopperstairs": "waxed_weathered_cut_copper_stairs", + "waweathercutcopstair": "waxed_weathered_cut_copper_stairs", + "waweathercutcopstairs": "waxed_weathered_cut_copper_stairs", + "waweathercutcostair": "waxed_weathered_cut_copper_stairs", + "waweathercutcostairs": "waxed_weathered_cut_copper_stairs", + "waweatheredccopperstair": "waxed_weathered_cut_copper_stairs", + "waweatheredccopperstairs": "waxed_weathered_cut_copper_stairs", + "waweatheredccopstair": "waxed_weathered_cut_copper_stairs", + "waweatheredccopstairs": "waxed_weathered_cut_copper_stairs", + "waweatheredccostair": "waxed_weathered_cut_copper_stairs", + "waweatheredccostairs": "waxed_weathered_cut_copper_stairs", + "waweatheredcutcopperstair": "waxed_weathered_cut_copper_stairs", + "waweatheredcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "waweatheredcutcopstair": "waxed_weathered_cut_copper_stairs", + "waweatheredcutcopstairs": "waxed_weathered_cut_copper_stairs", + "waweatheredcutcostair": "waxed_weathered_cut_copper_stairs", + "waweatheredcutcostairs": "waxed_weathered_cut_copper_stairs", + "waweccopperstair": "waxed_weathered_cut_copper_stairs", + "waweccopperstairs": "waxed_weathered_cut_copper_stairs", + "waweccopstair": "waxed_weathered_cut_copper_stairs", + "waweccopstairs": "waxed_weathered_cut_copper_stairs", + "waweccostair": "waxed_weathered_cut_copper_stairs", + "waweccostairs": "waxed_weathered_cut_copper_stairs", + "wawecutcopperstair": "waxed_weathered_cut_copper_stairs", + "wawecutcopperstairs": "waxed_weathered_cut_copper_stairs", + "wawecutcopstair": "waxed_weathered_cut_copper_stairs", + "wawecutcopstairs": "waxed_weathered_cut_copper_stairs", + "wawecutcostair": "waxed_weathered_cut_copper_stairs", + "wawecutcostairs": "waxed_weathered_cut_copper_stairs", + "wawthccopperstair": "waxed_weathered_cut_copper_stairs", + "wawthccopperstairs": "waxed_weathered_cut_copper_stairs", + "wawthccopstair": "waxed_weathered_cut_copper_stairs", + "wawthccopstairs": "waxed_weathered_cut_copper_stairs", + "wawthccostair": "waxed_weathered_cut_copper_stairs", + "wawthccostairs": "waxed_weathered_cut_copper_stairs", + "wawthcutcopperstair": "waxed_weathered_cut_copper_stairs", + "wawthcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "wawthcutcopstair": "waxed_weathered_cut_copper_stairs", + "wawthcutcopstairs": "waxed_weathered_cut_copper_stairs", + "wawthcutcostair": "waxed_weathered_cut_copper_stairs", + "wawthcutcostairs": "waxed_weathered_cut_copper_stairs", + "waxcutweathercopperstair": "waxed_weathered_cut_copper_stairs", + "waxcutweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "waxcutweathercopstair": "waxed_weathered_cut_copper_stairs", + "waxcutweathercopstairs": "waxed_weathered_cut_copper_stairs", + "waxcutweathercostair": "waxed_weathered_cut_copper_stairs", + "waxcutweathercostairs": "waxed_weathered_cut_copper_stairs", + "waxcutweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "waxcutweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxcutweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "waxcutweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "waxcutweatheredcostair": "waxed_weathered_cut_copper_stairs", + "waxcutweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "waxcutwecopperstair": "waxed_weathered_cut_copper_stairs", + "waxcutwecopperstairs": "waxed_weathered_cut_copper_stairs", + "waxcutwecopstair": "waxed_weathered_cut_copper_stairs", + "waxcutwecopstairs": "waxed_weathered_cut_copper_stairs", + "waxcutwecostair": "waxed_weathered_cut_copper_stairs", + "waxcutwecostairs": "waxed_weathered_cut_copper_stairs", + "waxcutwthcopperstair": "waxed_weathered_cut_copper_stairs", + "waxcutwthcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxcutwthcopstair": "waxed_weathered_cut_copper_stairs", + "waxcutwthcopstairs": "waxed_weathered_cut_copper_stairs", + "waxcutwthcostair": "waxed_weathered_cut_copper_stairs", + "waxcutwthcostairs": "waxed_weathered_cut_copper_stairs", + "waxcweathercopperstair": "waxed_weathered_cut_copper_stairs", + "waxcweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "waxcweathercopstair": "waxed_weathered_cut_copper_stairs", + "waxcweathercopstairs": "waxed_weathered_cut_copper_stairs", + "waxcweathercostair": "waxed_weathered_cut_copper_stairs", + "waxcweathercostairs": "waxed_weathered_cut_copper_stairs", + "waxcweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "waxcweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxcweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "waxcweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "waxcweatheredcostair": "waxed_weathered_cut_copper_stairs", + "waxcweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "waxcwecopperstair": "waxed_weathered_cut_copper_stairs", + "waxcwecopperstairs": "waxed_weathered_cut_copper_stairs", + "waxcwecopstair": "waxed_weathered_cut_copper_stairs", + "waxcwecopstairs": "waxed_weathered_cut_copper_stairs", + "waxcwecostair": "waxed_weathered_cut_copper_stairs", + "waxcwecostairs": "waxed_weathered_cut_copper_stairs", + "waxcwthcopperstair": "waxed_weathered_cut_copper_stairs", + "waxcwthcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxcwthcopstair": "waxed_weathered_cut_copper_stairs", + "waxcwthcopstairs": "waxed_weathered_cut_copper_stairs", + "waxcwthcostair": "waxed_weathered_cut_copper_stairs", + "waxcwthcostairs": "waxed_weathered_cut_copper_stairs", + "waxedcutweathercopperstair": "waxed_weathered_cut_copper_stairs", + "waxedcutweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedcutweathercopstair": "waxed_weathered_cut_copper_stairs", + "waxedcutweathercopstairs": "waxed_weathered_cut_copper_stairs", + "waxedcutweathercostair": "waxed_weathered_cut_copper_stairs", + "waxedcutweathercostairs": "waxed_weathered_cut_copper_stairs", + "waxedcutweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "waxedcutweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedcutweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "waxedcutweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "waxedcutweatheredcostair": "waxed_weathered_cut_copper_stairs", + "waxedcutweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "waxedcutwecopperstair": "waxed_weathered_cut_copper_stairs", + "waxedcutwecopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedcutwecopstair": "waxed_weathered_cut_copper_stairs", + "waxedcutwecopstairs": "waxed_weathered_cut_copper_stairs", + "waxedcutwecostair": "waxed_weathered_cut_copper_stairs", + "waxedcutwecostairs": "waxed_weathered_cut_copper_stairs", + "waxedcutwthcopperstair": "waxed_weathered_cut_copper_stairs", + "waxedcutwthcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedcutwthcopstair": "waxed_weathered_cut_copper_stairs", + "waxedcutwthcopstairs": "waxed_weathered_cut_copper_stairs", + "waxedcutwthcostair": "waxed_weathered_cut_copper_stairs", + "waxedcutwthcostairs": "waxed_weathered_cut_copper_stairs", + "waxedcweathercopperstair": "waxed_weathered_cut_copper_stairs", + "waxedcweathercopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedcweathercopstair": "waxed_weathered_cut_copper_stairs", + "waxedcweathercopstairs": "waxed_weathered_cut_copper_stairs", + "waxedcweathercostair": "waxed_weathered_cut_copper_stairs", + "waxedcweathercostairs": "waxed_weathered_cut_copper_stairs", + "waxedcweatheredcopperstair": "waxed_weathered_cut_copper_stairs", + "waxedcweatheredcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedcweatheredcopstair": "waxed_weathered_cut_copper_stairs", + "waxedcweatheredcopstairs": "waxed_weathered_cut_copper_stairs", + "waxedcweatheredcostair": "waxed_weathered_cut_copper_stairs", + "waxedcweatheredcostairs": "waxed_weathered_cut_copper_stairs", + "waxedcwecopperstair": "waxed_weathered_cut_copper_stairs", + "waxedcwecopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedcwecopstair": "waxed_weathered_cut_copper_stairs", + "waxedcwecopstairs": "waxed_weathered_cut_copper_stairs", + "waxedcwecostair": "waxed_weathered_cut_copper_stairs", + "waxedcwecostairs": "waxed_weathered_cut_copper_stairs", + "waxedcwthcopperstair": "waxed_weathered_cut_copper_stairs", + "waxedcwthcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedcwthcopstair": "waxed_weathered_cut_copper_stairs", + "waxedcwthcopstairs": "waxed_weathered_cut_copper_stairs", + "waxedcwthcostair": "waxed_weathered_cut_copper_stairs", + "waxedcwthcostairs": "waxed_weathered_cut_copper_stairs", + "waxedweatherccopperstair": "waxed_weathered_cut_copper_stairs", + "waxedweatherccopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedweatherccopstair": "waxed_weathered_cut_copper_stairs", + "waxedweatherccopstairs": "waxed_weathered_cut_copper_stairs", + "waxedweatherccostair": "waxed_weathered_cut_copper_stairs", + "waxedweatherccostairs": "waxed_weathered_cut_copper_stairs", + "waxedweathercutcopperstair": "waxed_weathered_cut_copper_stairs", + "waxedweathercutcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedweathercutcopstair": "waxed_weathered_cut_copper_stairs", + "waxedweathercutcopstairs": "waxed_weathered_cut_copper_stairs", + "waxedweathercutcostair": "waxed_weathered_cut_copper_stairs", + "waxedweathercutcostairs": "waxed_weathered_cut_copper_stairs", + "waxedweatheredccopperstair": "waxed_weathered_cut_copper_stairs", + "waxedweatheredccopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedweatheredccopstair": "waxed_weathered_cut_copper_stairs", + "waxedweatheredccopstairs": "waxed_weathered_cut_copper_stairs", + "waxedweatheredccostair": "waxed_weathered_cut_copper_stairs", + "waxedweatheredccostairs": "waxed_weathered_cut_copper_stairs", + "waxedweatheredcutcopperstair": "waxed_weathered_cut_copper_stairs", + "waxedweatheredcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedweatheredcutcopstair": "waxed_weathered_cut_copper_stairs", + "waxedweatheredcutcopstairs": "waxed_weathered_cut_copper_stairs", + "waxedweatheredcutcostair": "waxed_weathered_cut_copper_stairs", + "waxedweatheredcutcostairs": "waxed_weathered_cut_copper_stairs", + "waxedweccopperstair": "waxed_weathered_cut_copper_stairs", + "waxedweccopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedweccopstair": "waxed_weathered_cut_copper_stairs", + "waxedweccopstairs": "waxed_weathered_cut_copper_stairs", + "waxedweccostair": "waxed_weathered_cut_copper_stairs", + "waxedweccostairs": "waxed_weathered_cut_copper_stairs", + "waxedwecutcopperstair": "waxed_weathered_cut_copper_stairs", + "waxedwecutcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedwecutcopstair": "waxed_weathered_cut_copper_stairs", + "waxedwecutcopstairs": "waxed_weathered_cut_copper_stairs", + "waxedwecutcostair": "waxed_weathered_cut_copper_stairs", + "waxedwecutcostairs": "waxed_weathered_cut_copper_stairs", + "waxedwthccopperstair": "waxed_weathered_cut_copper_stairs", + "waxedwthccopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedwthccopstair": "waxed_weathered_cut_copper_stairs", + "waxedwthccopstairs": "waxed_weathered_cut_copper_stairs", + "waxedwthccostair": "waxed_weathered_cut_copper_stairs", + "waxedwthccostairs": "waxed_weathered_cut_copper_stairs", + "waxedwthcutcopperstair": "waxed_weathered_cut_copper_stairs", + "waxedwthcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxedwthcutcopstair": "waxed_weathered_cut_copper_stairs", + "waxedwthcutcopstairs": "waxed_weathered_cut_copper_stairs", + "waxedwthcutcostair": "waxed_weathered_cut_copper_stairs", + "waxedwthcutcostairs": "waxed_weathered_cut_copper_stairs", + "waxweatherccopperstair": "waxed_weathered_cut_copper_stairs", + "waxweatherccopperstairs": "waxed_weathered_cut_copper_stairs", + "waxweatherccopstair": "waxed_weathered_cut_copper_stairs", + "waxweatherccopstairs": "waxed_weathered_cut_copper_stairs", + "waxweatherccostair": "waxed_weathered_cut_copper_stairs", + "waxweatherccostairs": "waxed_weathered_cut_copper_stairs", + "waxweathercutcopperstair": "waxed_weathered_cut_copper_stairs", + "waxweathercutcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxweathercutcopstair": "waxed_weathered_cut_copper_stairs", + "waxweathercutcopstairs": "waxed_weathered_cut_copper_stairs", + "waxweathercutcostair": "waxed_weathered_cut_copper_stairs", + "waxweathercutcostairs": "waxed_weathered_cut_copper_stairs", + "waxweatheredccopperstair": "waxed_weathered_cut_copper_stairs", + "waxweatheredccopperstairs": "waxed_weathered_cut_copper_stairs", + "waxweatheredccopstair": "waxed_weathered_cut_copper_stairs", + "waxweatheredccopstairs": "waxed_weathered_cut_copper_stairs", + "waxweatheredccostair": "waxed_weathered_cut_copper_stairs", + "waxweatheredccostairs": "waxed_weathered_cut_copper_stairs", + "waxweatheredcutcopperstair": "waxed_weathered_cut_copper_stairs", + "waxweatheredcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxweatheredcutcopstair": "waxed_weathered_cut_copper_stairs", + "waxweatheredcutcopstairs": "waxed_weathered_cut_copper_stairs", + "waxweatheredcutcostair": "waxed_weathered_cut_copper_stairs", + "waxweatheredcutcostairs": "waxed_weathered_cut_copper_stairs", + "waxweccopperstair": "waxed_weathered_cut_copper_stairs", + "waxweccopperstairs": "waxed_weathered_cut_copper_stairs", + "waxweccopstair": "waxed_weathered_cut_copper_stairs", + "waxweccopstairs": "waxed_weathered_cut_copper_stairs", + "waxweccostair": "waxed_weathered_cut_copper_stairs", + "waxweccostairs": "waxed_weathered_cut_copper_stairs", + "waxwecutcopperstair": "waxed_weathered_cut_copper_stairs", + "waxwecutcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxwecutcopstair": "waxed_weathered_cut_copper_stairs", + "waxwecutcopstairs": "waxed_weathered_cut_copper_stairs", + "waxwecutcostair": "waxed_weathered_cut_copper_stairs", + "waxwecutcostairs": "waxed_weathered_cut_copper_stairs", + "waxwthccopperstair": "waxed_weathered_cut_copper_stairs", + "waxwthccopperstairs": "waxed_weathered_cut_copper_stairs", + "waxwthccopstair": "waxed_weathered_cut_copper_stairs", + "waxwthccopstairs": "waxed_weathered_cut_copper_stairs", + "waxwthccostair": "waxed_weathered_cut_copper_stairs", + "waxwthccostairs": "waxed_weathered_cut_copper_stairs", + "waxwthcutcopperstair": "waxed_weathered_cut_copper_stairs", + "waxwthcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "waxwthcutcopstair": "waxed_weathered_cut_copper_stairs", + "waxwthcutcopstairs": "waxed_weathered_cut_copper_stairs", + "waxwthcutcostair": "waxed_weathered_cut_copper_stairs", + "waxwthcutcostairs": "waxed_weathered_cut_copper_stairs", + "weathercutwacopperstair": "waxed_weathered_cut_copper_stairs", + "weathercutwacopperstairs": "waxed_weathered_cut_copper_stairs", + "weathercutwacopstair": "waxed_weathered_cut_copper_stairs", + "weathercutwacopstairs": "waxed_weathered_cut_copper_stairs", + "weathercutwacostair": "waxed_weathered_cut_copper_stairs", + "weathercutwacostairs": "waxed_weathered_cut_copper_stairs", + "weathercutwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "weathercutwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "weathercutwaxcopstair": "waxed_weathered_cut_copper_stairs", + "weathercutwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "weathercutwaxcostair": "waxed_weathered_cut_copper_stairs", + "weathercutwaxcostairs": "waxed_weathered_cut_copper_stairs", + "weathercutwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "weathercutwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "weathercutwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "weathercutwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "weathercutwaxedcostair": "waxed_weathered_cut_copper_stairs", + "weathercutwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "weathercwacopperstair": "waxed_weathered_cut_copper_stairs", + "weathercwacopperstairs": "waxed_weathered_cut_copper_stairs", + "weathercwacopstair": "waxed_weathered_cut_copper_stairs", + "weathercwacopstairs": "waxed_weathered_cut_copper_stairs", + "weathercwacostair": "waxed_weathered_cut_copper_stairs", + "weathercwacostairs": "waxed_weathered_cut_copper_stairs", + "weathercwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "weathercwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "weathercwaxcopstair": "waxed_weathered_cut_copper_stairs", + "weathercwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "weathercwaxcostair": "waxed_weathered_cut_copper_stairs", + "weathercwaxcostairs": "waxed_weathered_cut_copper_stairs", + "weathercwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "weathercwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "weathercwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "weathercwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "weathercwaxedcostair": "waxed_weathered_cut_copper_stairs", + "weathercwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "weatheredcutwacopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredcutwacopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcutwacopstair": "waxed_weathered_cut_copper_stairs", + "weatheredcutwacopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcutwacostair": "waxed_weathered_cut_copper_stairs", + "weatheredcutwacostairs": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxcopstair": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxcostair": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxcostairs": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxedcostair": "waxed_weathered_cut_copper_stairs", + "weatheredcutwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "weatheredcwacopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredcwacopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcwacopstair": "waxed_weathered_cut_copper_stairs", + "weatheredcwacopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcwacostair": "waxed_weathered_cut_copper_stairs", + "weatheredcwacostairs": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxcopstair": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxcostair": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxcostairs": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxedcostair": "waxed_weathered_cut_copper_stairs", + "weatheredcwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaccopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredwaccopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaccopstair": "waxed_weathered_cut_copper_stairs", + "weatheredwaccopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaccostair": "waxed_weathered_cut_copper_stairs", + "weatheredwaccostairs": "waxed_weathered_cut_copper_stairs", + "weatheredwacutcopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredwacutcopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwacutcopstair": "waxed_weathered_cut_copper_stairs", + "weatheredwacutcopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwacutcostair": "waxed_weathered_cut_copper_stairs", + "weatheredwacutcostairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxccopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxccopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxccopstair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxccopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxccostair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxccostairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxcutcopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxcutcopstair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxcutcopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxcutcostair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxcutcostairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedccopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedccopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedccopstair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedccopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedccostair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedccostairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedcutcopperstair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedcutcopstair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedcutcopstairs": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedcutcostair": "waxed_weathered_cut_copper_stairs", + "weatheredwaxedcutcostairs": "waxed_weathered_cut_copper_stairs", + "weatherwaccopperstair": "waxed_weathered_cut_copper_stairs", + "weatherwaccopperstairs": "waxed_weathered_cut_copper_stairs", + "weatherwaccopstair": "waxed_weathered_cut_copper_stairs", + "weatherwaccopstairs": "waxed_weathered_cut_copper_stairs", + "weatherwaccostair": "waxed_weathered_cut_copper_stairs", + "weatherwaccostairs": "waxed_weathered_cut_copper_stairs", + "weatherwacutcopperstair": "waxed_weathered_cut_copper_stairs", + "weatherwacutcopperstairs": "waxed_weathered_cut_copper_stairs", + "weatherwacutcopstair": "waxed_weathered_cut_copper_stairs", + "weatherwacutcopstairs": "waxed_weathered_cut_copper_stairs", + "weatherwacutcostair": "waxed_weathered_cut_copper_stairs", + "weatherwacutcostairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxccopperstair": "waxed_weathered_cut_copper_stairs", + "weatherwaxccopperstairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxccopstair": "waxed_weathered_cut_copper_stairs", + "weatherwaxccopstairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxccostair": "waxed_weathered_cut_copper_stairs", + "weatherwaxccostairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxcutcopperstair": "waxed_weathered_cut_copper_stairs", + "weatherwaxcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxcutcopstair": "waxed_weathered_cut_copper_stairs", + "weatherwaxcutcopstairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxcutcostair": "waxed_weathered_cut_copper_stairs", + "weatherwaxcutcostairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxedccopperstair": "waxed_weathered_cut_copper_stairs", + "weatherwaxedccopperstairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxedccopstair": "waxed_weathered_cut_copper_stairs", + "weatherwaxedccopstairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxedccostair": "waxed_weathered_cut_copper_stairs", + "weatherwaxedccostairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxedcutcopperstair": "waxed_weathered_cut_copper_stairs", + "weatherwaxedcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxedcutcopstair": "waxed_weathered_cut_copper_stairs", + "weatherwaxedcutcopstairs": "waxed_weathered_cut_copper_stairs", + "weatherwaxedcutcostair": "waxed_weathered_cut_copper_stairs", + "weatherwaxedcutcostairs": "waxed_weathered_cut_copper_stairs", + "wecutwacopperstair": "waxed_weathered_cut_copper_stairs", + "wecutwacopperstairs": "waxed_weathered_cut_copper_stairs", + "wecutwacopstair": "waxed_weathered_cut_copper_stairs", + "wecutwacopstairs": "waxed_weathered_cut_copper_stairs", + "wecutwacostair": "waxed_weathered_cut_copper_stairs", + "wecutwacostairs": "waxed_weathered_cut_copper_stairs", + "wecutwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "wecutwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "wecutwaxcopstair": "waxed_weathered_cut_copper_stairs", + "wecutwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "wecutwaxcostair": "waxed_weathered_cut_copper_stairs", + "wecutwaxcostairs": "waxed_weathered_cut_copper_stairs", + "wecutwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "wecutwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "wecutwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "wecutwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "wecutwaxedcostair": "waxed_weathered_cut_copper_stairs", + "wecutwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "wecwacopperstair": "waxed_weathered_cut_copper_stairs", + "wecwacopperstairs": "waxed_weathered_cut_copper_stairs", + "wecwacopstair": "waxed_weathered_cut_copper_stairs", + "wecwacopstairs": "waxed_weathered_cut_copper_stairs", + "wecwacostair": "waxed_weathered_cut_copper_stairs", + "wecwacostairs": "waxed_weathered_cut_copper_stairs", + "wecwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "wecwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "wecwaxcopstair": "waxed_weathered_cut_copper_stairs", + "wecwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "wecwaxcostair": "waxed_weathered_cut_copper_stairs", + "wecwaxcostairs": "waxed_weathered_cut_copper_stairs", + "wecwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "wecwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "wecwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "wecwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "wecwaxedcostair": "waxed_weathered_cut_copper_stairs", + "wecwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "wewaccopperstair": "waxed_weathered_cut_copper_stairs", + "wewaccopperstairs": "waxed_weathered_cut_copper_stairs", + "wewaccopstair": "waxed_weathered_cut_copper_stairs", + "wewaccopstairs": "waxed_weathered_cut_copper_stairs", + "wewaccostair": "waxed_weathered_cut_copper_stairs", + "wewaccostairs": "waxed_weathered_cut_copper_stairs", + "wewacutcopperstair": "waxed_weathered_cut_copper_stairs", + "wewacutcopperstairs": "waxed_weathered_cut_copper_stairs", + "wewacutcopstair": "waxed_weathered_cut_copper_stairs", + "wewacutcopstairs": "waxed_weathered_cut_copper_stairs", + "wewacutcostair": "waxed_weathered_cut_copper_stairs", + "wewacutcostairs": "waxed_weathered_cut_copper_stairs", + "wewaxccopperstair": "waxed_weathered_cut_copper_stairs", + "wewaxccopperstairs": "waxed_weathered_cut_copper_stairs", + "wewaxccopstair": "waxed_weathered_cut_copper_stairs", + "wewaxccopstairs": "waxed_weathered_cut_copper_stairs", + "wewaxccostair": "waxed_weathered_cut_copper_stairs", + "wewaxccostairs": "waxed_weathered_cut_copper_stairs", + "wewaxcutcopperstair": "waxed_weathered_cut_copper_stairs", + "wewaxcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "wewaxcutcopstair": "waxed_weathered_cut_copper_stairs", + "wewaxcutcopstairs": "waxed_weathered_cut_copper_stairs", + "wewaxcutcostair": "waxed_weathered_cut_copper_stairs", + "wewaxcutcostairs": "waxed_weathered_cut_copper_stairs", + "wewaxedccopperstair": "waxed_weathered_cut_copper_stairs", + "wewaxedccopperstairs": "waxed_weathered_cut_copper_stairs", + "wewaxedccopstair": "waxed_weathered_cut_copper_stairs", + "wewaxedccopstairs": "waxed_weathered_cut_copper_stairs", + "wewaxedccostair": "waxed_weathered_cut_copper_stairs", + "wewaxedccostairs": "waxed_weathered_cut_copper_stairs", + "wewaxedcutcopperstair": "waxed_weathered_cut_copper_stairs", + "wewaxedcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "wewaxedcutcopstair": "waxed_weathered_cut_copper_stairs", + "wewaxedcutcopstairs": "waxed_weathered_cut_copper_stairs", + "wewaxedcutcostair": "waxed_weathered_cut_copper_stairs", + "wewaxedcutcostairs": "waxed_weathered_cut_copper_stairs", + "wthcutwacopperstair": "waxed_weathered_cut_copper_stairs", + "wthcutwacopperstairs": "waxed_weathered_cut_copper_stairs", + "wthcutwacopstair": "waxed_weathered_cut_copper_stairs", + "wthcutwacopstairs": "waxed_weathered_cut_copper_stairs", + "wthcutwacostair": "waxed_weathered_cut_copper_stairs", + "wthcutwacostairs": "waxed_weathered_cut_copper_stairs", + "wthcutwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "wthcutwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "wthcutwaxcopstair": "waxed_weathered_cut_copper_stairs", + "wthcutwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "wthcutwaxcostair": "waxed_weathered_cut_copper_stairs", + "wthcutwaxcostairs": "waxed_weathered_cut_copper_stairs", + "wthcutwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "wthcutwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "wthcutwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "wthcutwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "wthcutwaxedcostair": "waxed_weathered_cut_copper_stairs", + "wthcutwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "wthcwacopperstair": "waxed_weathered_cut_copper_stairs", + "wthcwacopperstairs": "waxed_weathered_cut_copper_stairs", + "wthcwacopstair": "waxed_weathered_cut_copper_stairs", + "wthcwacopstairs": "waxed_weathered_cut_copper_stairs", + "wthcwacostair": "waxed_weathered_cut_copper_stairs", + "wthcwacostairs": "waxed_weathered_cut_copper_stairs", + "wthcwaxcopperstair": "waxed_weathered_cut_copper_stairs", + "wthcwaxcopperstairs": "waxed_weathered_cut_copper_stairs", + "wthcwaxcopstair": "waxed_weathered_cut_copper_stairs", + "wthcwaxcopstairs": "waxed_weathered_cut_copper_stairs", + "wthcwaxcostair": "waxed_weathered_cut_copper_stairs", + "wthcwaxcostairs": "waxed_weathered_cut_copper_stairs", + "wthcwaxedcopperstair": "waxed_weathered_cut_copper_stairs", + "wthcwaxedcopperstairs": "waxed_weathered_cut_copper_stairs", + "wthcwaxedcopstair": "waxed_weathered_cut_copper_stairs", + "wthcwaxedcopstairs": "waxed_weathered_cut_copper_stairs", + "wthcwaxedcostair": "waxed_weathered_cut_copper_stairs", + "wthcwaxedcostairs": "waxed_weathered_cut_copper_stairs", + "wthwaccopperstair": "waxed_weathered_cut_copper_stairs", + "wthwaccopperstairs": "waxed_weathered_cut_copper_stairs", + "wthwaccopstair": "waxed_weathered_cut_copper_stairs", + "wthwaccopstairs": "waxed_weathered_cut_copper_stairs", + "wthwaccostair": "waxed_weathered_cut_copper_stairs", + "wthwaccostairs": "waxed_weathered_cut_copper_stairs", + "wthwacutcopperstair": "waxed_weathered_cut_copper_stairs", + "wthwacutcopperstairs": "waxed_weathered_cut_copper_stairs", + "wthwacutcopstair": "waxed_weathered_cut_copper_stairs", + "wthwacutcopstairs": "waxed_weathered_cut_copper_stairs", + "wthwacutcostair": "waxed_weathered_cut_copper_stairs", + "wthwacutcostairs": "waxed_weathered_cut_copper_stairs", + "wthwaxccopperstair": "waxed_weathered_cut_copper_stairs", + "wthwaxccopperstairs": "waxed_weathered_cut_copper_stairs", + "wthwaxccopstair": "waxed_weathered_cut_copper_stairs", + "wthwaxccopstairs": "waxed_weathered_cut_copper_stairs", + "wthwaxccostair": "waxed_weathered_cut_copper_stairs", + "wthwaxccostairs": "waxed_weathered_cut_copper_stairs", + "wthwaxcutcopperstair": "waxed_weathered_cut_copper_stairs", + "wthwaxcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "wthwaxcutcopstair": "waxed_weathered_cut_copper_stairs", + "wthwaxcutcopstairs": "waxed_weathered_cut_copper_stairs", + "wthwaxcutcostair": "waxed_weathered_cut_copper_stairs", + "wthwaxcutcostairs": "waxed_weathered_cut_copper_stairs", + "wthwaxedccopperstair": "waxed_weathered_cut_copper_stairs", + "wthwaxedccopperstairs": "waxed_weathered_cut_copper_stairs", + "wthwaxedccopstair": "waxed_weathered_cut_copper_stairs", + "wthwaxedccopstairs": "waxed_weathered_cut_copper_stairs", + "wthwaxedccostair": "waxed_weathered_cut_copper_stairs", + "wthwaxedccostairs": "waxed_weathered_cut_copper_stairs", + "wthwaxedcutcopperstair": "waxed_weathered_cut_copper_stairs", + "wthwaxedcutcopperstairs": "waxed_weathered_cut_copper_stairs", + "wthwaxedcutcopstair": "waxed_weathered_cut_copper_stairs", + "wthwaxedcutcopstairs": "waxed_weathered_cut_copper_stairs", + "wthwaxedcutcostair": "waxed_weathered_cut_copper_stairs", + "wthwaxedcutcostairs": "waxed_weathered_cut_copper_stairs", "weakness_lingering_potion": { "potionData": { "type": "WEAKNESS", @@ -27952,6 +39072,372 @@ "wetarr": "weakness_tipped_arrow", "wetarrow": "weakness_tipped_arrow", "wetippedarrow": "weakness_tipped_arrow", + "weathered_copper": { + "material": "WEATHERED_COPPER" + }, + "minecraft:weathered_copper": "weathered_copper", + "weathercoblock": "weathered_copper", + "weathercopblock": "weathered_copper", + "weathercopperblock": "weathered_copper", + "weatheredcoblock": "weathered_copper", + "weatheredcopblock": "weathered_copper", + "weatheredcopper": "weathered_copper", + "weatheredcopperblock": "weathered_copper", + "wecoblock": "weathered_copper", + "wecopblock": "weathered_copper", + "wecopperblock": "weathered_copper", + "wthcoblock": "weathered_copper", + "wthcopblock": "weathered_copper", + "wthcopperblock": "weathered_copper", + "weathered_cut_copper": { + "material": "WEATHERED_CUT_COPPER" + }, + "cutweathercoblock": "weathered_cut_copper", + "cutweathercopblock": "weathered_cut_copper", + "cutweathercopperblock": "weathered_cut_copper", + "cutweatheredcoblock": "weathered_cut_copper", + "cutweatheredcopblock": "weathered_cut_copper", + "cutweatheredcopperblock": "weathered_cut_copper", + "cutwecoblock": "weathered_cut_copper", + "cutwecopblock": "weathered_cut_copper", + "cutwecopperblock": "weathered_cut_copper", + "cutwthcoblock": "weathered_cut_copper", + "cutwthcopblock": "weathered_cut_copper", + "cutwthcopperblock": "weathered_cut_copper", + "cweathercoblock": "weathered_cut_copper", + "cweathercopblock": "weathered_cut_copper", + "cweathercopperblock": "weathered_cut_copper", + "cweatheredcoblock": "weathered_cut_copper", + "cweatheredcopblock": "weathered_cut_copper", + "cweatheredcopperblock": "weathered_cut_copper", + "cwecoblock": "weathered_cut_copper", + "cwecopblock": "weathered_cut_copper", + "cwecopperblock": "weathered_cut_copper", + "cwthcoblock": "weathered_cut_copper", + "cwthcopblock": "weathered_cut_copper", + "cwthcopperblock": "weathered_cut_copper", + "minecraft:weathered_cut_copper": "weathered_cut_copper", + "weatherccoblock": "weathered_cut_copper", + "weatherccopblock": "weathered_cut_copper", + "weatherccopperblock": "weathered_cut_copper", + "weathercutcoblock": "weathered_cut_copper", + "weathercutcopblock": "weathered_cut_copper", + "weathercutcopperblock": "weathered_cut_copper", + "weatheredccoblock": "weathered_cut_copper", + "weatheredccopblock": "weathered_cut_copper", + "weatheredccopperblock": "weathered_cut_copper", + "weatheredcutcoblock": "weathered_cut_copper", + "weatheredcutcopblock": "weathered_cut_copper", + "weatheredcutcopper": "weathered_cut_copper", + "weatheredcutcopperblock": "weathered_cut_copper", + "weccoblock": "weathered_cut_copper", + "weccopblock": "weathered_cut_copper", + "weccopperblock": "weathered_cut_copper", + "wecutcoblock": "weathered_cut_copper", + "wecutcopblock": "weathered_cut_copper", + "wecutcopperblock": "weathered_cut_copper", + "wthccoblock": "weathered_cut_copper", + "wthccopblock": "weathered_cut_copper", + "wthccopperblock": "weathered_cut_copper", + "wthcutcoblock": "weathered_cut_copper", + "wthcutcopblock": "weathered_cut_copper", + "wthcutcopperblock": "weathered_cut_copper", + "weathered_cut_copper_slab": { + "material": "WEATHERED_CUT_COPPER_SLAB" + }, + "cutweathercohalfblock": "weathered_cut_copper_slab", + "cutweathercophalfblock": "weathered_cut_copper_slab", + "cutweathercopperhalfblock": "weathered_cut_copper_slab", + "cutweathercoppersl": "weathered_cut_copper_slab", + "cutweathercopperslab": "weathered_cut_copper_slab", + "cutweathercopperstep": "weathered_cut_copper_slab", + "cutweathercopsl": "weathered_cut_copper_slab", + "cutweathercopslab": "weathered_cut_copper_slab", + "cutweathercopstep": "weathered_cut_copper_slab", + "cutweathercosl": "weathered_cut_copper_slab", + "cutweathercoslab": "weathered_cut_copper_slab", + "cutweathercostep": "weathered_cut_copper_slab", + "cutweatheredcohalfblock": "weathered_cut_copper_slab", + "cutweatheredcophalfblock": "weathered_cut_copper_slab", + "cutweatheredcopperhalfblock": "weathered_cut_copper_slab", + "cutweatheredcoppersl": "weathered_cut_copper_slab", + "cutweatheredcopperslab": "weathered_cut_copper_slab", + "cutweatheredcopperstep": "weathered_cut_copper_slab", + "cutweatheredcopsl": "weathered_cut_copper_slab", + "cutweatheredcopslab": "weathered_cut_copper_slab", + "cutweatheredcopstep": "weathered_cut_copper_slab", + "cutweatheredcosl": "weathered_cut_copper_slab", + "cutweatheredcoslab": "weathered_cut_copper_slab", + "cutweatheredcostep": "weathered_cut_copper_slab", + "cutwecohalfblock": "weathered_cut_copper_slab", + "cutwecophalfblock": "weathered_cut_copper_slab", + "cutwecopperhalfblock": "weathered_cut_copper_slab", + "cutwecoppersl": "weathered_cut_copper_slab", + "cutwecopperslab": "weathered_cut_copper_slab", + "cutwecopperstep": "weathered_cut_copper_slab", + "cutwecopsl": "weathered_cut_copper_slab", + "cutwecopslab": "weathered_cut_copper_slab", + "cutwecopstep": "weathered_cut_copper_slab", + "cutwecosl": "weathered_cut_copper_slab", + "cutwecoslab": "weathered_cut_copper_slab", + "cutwecostep": "weathered_cut_copper_slab", + "cutwthcohalfblock": "weathered_cut_copper_slab", + "cutwthcophalfblock": "weathered_cut_copper_slab", + "cutwthcopperhalfblock": "weathered_cut_copper_slab", + "cutwthcoppersl": "weathered_cut_copper_slab", + "cutwthcopperslab": "weathered_cut_copper_slab", + "cutwthcopperstep": "weathered_cut_copper_slab", + "cutwthcopsl": "weathered_cut_copper_slab", + "cutwthcopslab": "weathered_cut_copper_slab", + "cutwthcopstep": "weathered_cut_copper_slab", + "cutwthcosl": "weathered_cut_copper_slab", + "cutwthcoslab": "weathered_cut_copper_slab", + "cutwthcostep": "weathered_cut_copper_slab", + "cweathercohalfblock": "weathered_cut_copper_slab", + "cweathercophalfblock": "weathered_cut_copper_slab", + "cweathercopperhalfblock": "weathered_cut_copper_slab", + "cweathercoppersl": "weathered_cut_copper_slab", + "cweathercopperslab": "weathered_cut_copper_slab", + "cweathercopperstep": "weathered_cut_copper_slab", + "cweathercopsl": "weathered_cut_copper_slab", + "cweathercopslab": "weathered_cut_copper_slab", + "cweathercopstep": "weathered_cut_copper_slab", + "cweathercosl": "weathered_cut_copper_slab", + "cweathercoslab": "weathered_cut_copper_slab", + "cweathercostep": "weathered_cut_copper_slab", + "cweatheredcohalfblock": "weathered_cut_copper_slab", + "cweatheredcophalfblock": "weathered_cut_copper_slab", + "cweatheredcopperhalfblock": "weathered_cut_copper_slab", + "cweatheredcoppersl": "weathered_cut_copper_slab", + "cweatheredcopperslab": "weathered_cut_copper_slab", + "cweatheredcopperstep": "weathered_cut_copper_slab", + "cweatheredcopsl": "weathered_cut_copper_slab", + "cweatheredcopslab": "weathered_cut_copper_slab", + "cweatheredcopstep": "weathered_cut_copper_slab", + "cweatheredcosl": "weathered_cut_copper_slab", + "cweatheredcoslab": "weathered_cut_copper_slab", + "cweatheredcostep": "weathered_cut_copper_slab", + "cwecohalfblock": "weathered_cut_copper_slab", + "cwecophalfblock": "weathered_cut_copper_slab", + "cwecopperhalfblock": "weathered_cut_copper_slab", + "cwecoppersl": "weathered_cut_copper_slab", + "cwecopperslab": "weathered_cut_copper_slab", + "cwecopperstep": "weathered_cut_copper_slab", + "cwecopsl": "weathered_cut_copper_slab", + "cwecopslab": "weathered_cut_copper_slab", + "cwecopstep": "weathered_cut_copper_slab", + "cwecosl": "weathered_cut_copper_slab", + "cwecoslab": "weathered_cut_copper_slab", + "cwecostep": "weathered_cut_copper_slab", + "cwthcohalfblock": "weathered_cut_copper_slab", + "cwthcophalfblock": "weathered_cut_copper_slab", + "cwthcopperhalfblock": "weathered_cut_copper_slab", + "cwthcoppersl": "weathered_cut_copper_slab", + "cwthcopperslab": "weathered_cut_copper_slab", + "cwthcopperstep": "weathered_cut_copper_slab", + "cwthcopsl": "weathered_cut_copper_slab", + "cwthcopslab": "weathered_cut_copper_slab", + "cwthcopstep": "weathered_cut_copper_slab", + "cwthcosl": "weathered_cut_copper_slab", + "cwthcoslab": "weathered_cut_copper_slab", + "cwthcostep": "weathered_cut_copper_slab", + "minecraft:weathered_cut_copper_slab": "weathered_cut_copper_slab", + "weatherccohalfblock": "weathered_cut_copper_slab", + "weatherccophalfblock": "weathered_cut_copper_slab", + "weatherccopperhalfblock": "weathered_cut_copper_slab", + "weatherccoppersl": "weathered_cut_copper_slab", + "weatherccopperslab": "weathered_cut_copper_slab", + "weatherccopperstep": "weathered_cut_copper_slab", + "weatherccopsl": "weathered_cut_copper_slab", + "weatherccopslab": "weathered_cut_copper_slab", + "weatherccopstep": "weathered_cut_copper_slab", + "weatherccosl": "weathered_cut_copper_slab", + "weatherccoslab": "weathered_cut_copper_slab", + "weatherccostep": "weathered_cut_copper_slab", + "weathercutcohalfblock": "weathered_cut_copper_slab", + "weathercutcophalfblock": "weathered_cut_copper_slab", + "weathercutcopperhalfblock": "weathered_cut_copper_slab", + "weathercutcoppersl": "weathered_cut_copper_slab", + "weathercutcopperslab": "weathered_cut_copper_slab", + "weathercutcopperstep": "weathered_cut_copper_slab", + "weathercutcopsl": "weathered_cut_copper_slab", + "weathercutcopslab": "weathered_cut_copper_slab", + "weathercutcopstep": "weathered_cut_copper_slab", + "weathercutcosl": "weathered_cut_copper_slab", + "weathercutcoslab": "weathered_cut_copper_slab", + "weathercutcostep": "weathered_cut_copper_slab", + "weatheredccohalfblock": "weathered_cut_copper_slab", + "weatheredccophalfblock": "weathered_cut_copper_slab", + "weatheredccopperhalfblock": "weathered_cut_copper_slab", + "weatheredccoppersl": "weathered_cut_copper_slab", + "weatheredccopperslab": "weathered_cut_copper_slab", + "weatheredccopperstep": "weathered_cut_copper_slab", + "weatheredccopsl": "weathered_cut_copper_slab", + "weatheredccopslab": "weathered_cut_copper_slab", + "weatheredccopstep": "weathered_cut_copper_slab", + "weatheredccosl": "weathered_cut_copper_slab", + "weatheredccoslab": "weathered_cut_copper_slab", + "weatheredccostep": "weathered_cut_copper_slab", + "weatheredcutcohalfblock": "weathered_cut_copper_slab", + "weatheredcutcophalfblock": "weathered_cut_copper_slab", + "weatheredcutcopperhalfblock": "weathered_cut_copper_slab", + "weatheredcutcoppersl": "weathered_cut_copper_slab", + "weatheredcutcopperslab": "weathered_cut_copper_slab", + "weatheredcutcopperstep": "weathered_cut_copper_slab", + "weatheredcutcopsl": "weathered_cut_copper_slab", + "weatheredcutcopslab": "weathered_cut_copper_slab", + "weatheredcutcopstep": "weathered_cut_copper_slab", + "weatheredcutcosl": "weathered_cut_copper_slab", + "weatheredcutcoslab": "weathered_cut_copper_slab", + "weatheredcutcostep": "weathered_cut_copper_slab", + "weccohalfblock": "weathered_cut_copper_slab", + "weccophalfblock": "weathered_cut_copper_slab", + "weccopperhalfblock": "weathered_cut_copper_slab", + "weccoppersl": "weathered_cut_copper_slab", + "weccopperslab": "weathered_cut_copper_slab", + "weccopperstep": "weathered_cut_copper_slab", + "weccopsl": "weathered_cut_copper_slab", + "weccopslab": "weathered_cut_copper_slab", + "weccopstep": "weathered_cut_copper_slab", + "weccosl": "weathered_cut_copper_slab", + "weccoslab": "weathered_cut_copper_slab", + "weccostep": "weathered_cut_copper_slab", + "wecutcohalfblock": "weathered_cut_copper_slab", + "wecutcophalfblock": "weathered_cut_copper_slab", + "wecutcopperhalfblock": "weathered_cut_copper_slab", + "wecutcoppersl": "weathered_cut_copper_slab", + "wecutcopperslab": "weathered_cut_copper_slab", + "wecutcopperstep": "weathered_cut_copper_slab", + "wecutcopsl": "weathered_cut_copper_slab", + "wecutcopslab": "weathered_cut_copper_slab", + "wecutcopstep": "weathered_cut_copper_slab", + "wecutcosl": "weathered_cut_copper_slab", + "wecutcoslab": "weathered_cut_copper_slab", + "wecutcostep": "weathered_cut_copper_slab", + "wthccohalfblock": "weathered_cut_copper_slab", + "wthccophalfblock": "weathered_cut_copper_slab", + "wthccopperhalfblock": "weathered_cut_copper_slab", + "wthccoppersl": "weathered_cut_copper_slab", + "wthccopperslab": "weathered_cut_copper_slab", + "wthccopperstep": "weathered_cut_copper_slab", + "wthccopsl": "weathered_cut_copper_slab", + "wthccopslab": "weathered_cut_copper_slab", + "wthccopstep": "weathered_cut_copper_slab", + "wthccosl": "weathered_cut_copper_slab", + "wthccoslab": "weathered_cut_copper_slab", + "wthccostep": "weathered_cut_copper_slab", + "wthcutcohalfblock": "weathered_cut_copper_slab", + "wthcutcophalfblock": "weathered_cut_copper_slab", + "wthcutcopperhalfblock": "weathered_cut_copper_slab", + "wthcutcoppersl": "weathered_cut_copper_slab", + "wthcutcopperslab": "weathered_cut_copper_slab", + "wthcutcopperstep": "weathered_cut_copper_slab", + "wthcutcopsl": "weathered_cut_copper_slab", + "wthcutcopslab": "weathered_cut_copper_slab", + "wthcutcopstep": "weathered_cut_copper_slab", + "wthcutcosl": "weathered_cut_copper_slab", + "wthcutcoslab": "weathered_cut_copper_slab", + "wthcutcostep": "weathered_cut_copper_slab", + "weathered_cut_copper_stairs": { + "material": "WEATHERED_CUT_COPPER_STAIRS" + }, + "cutweathercopperstair": "weathered_cut_copper_stairs", + "cutweathercopperstairs": "weathered_cut_copper_stairs", + "cutweathercopstair": "weathered_cut_copper_stairs", + "cutweathercopstairs": "weathered_cut_copper_stairs", + "cutweathercostair": "weathered_cut_copper_stairs", + "cutweathercostairs": "weathered_cut_copper_stairs", + "cutweatheredcopperstair": "weathered_cut_copper_stairs", + "cutweatheredcopperstairs": "weathered_cut_copper_stairs", + "cutweatheredcopstair": "weathered_cut_copper_stairs", + "cutweatheredcopstairs": "weathered_cut_copper_stairs", + "cutweatheredcostair": "weathered_cut_copper_stairs", + "cutweatheredcostairs": "weathered_cut_copper_stairs", + "cutwecopperstair": "weathered_cut_copper_stairs", + "cutwecopperstairs": "weathered_cut_copper_stairs", + "cutwecopstair": "weathered_cut_copper_stairs", + "cutwecopstairs": "weathered_cut_copper_stairs", + "cutwecostair": "weathered_cut_copper_stairs", + "cutwecostairs": "weathered_cut_copper_stairs", + "cutwthcopperstair": "weathered_cut_copper_stairs", + "cutwthcopperstairs": "weathered_cut_copper_stairs", + "cutwthcopstair": "weathered_cut_copper_stairs", + "cutwthcopstairs": "weathered_cut_copper_stairs", + "cutwthcostair": "weathered_cut_copper_stairs", + "cutwthcostairs": "weathered_cut_copper_stairs", + "cweathercopperstair": "weathered_cut_copper_stairs", + "cweathercopperstairs": "weathered_cut_copper_stairs", + "cweathercopstair": "weathered_cut_copper_stairs", + "cweathercopstairs": "weathered_cut_copper_stairs", + "cweathercostair": "weathered_cut_copper_stairs", + "cweathercostairs": "weathered_cut_copper_stairs", + "cweatheredcopperstair": "weathered_cut_copper_stairs", + "cweatheredcopperstairs": "weathered_cut_copper_stairs", + "cweatheredcopstair": "weathered_cut_copper_stairs", + "cweatheredcopstairs": "weathered_cut_copper_stairs", + "cweatheredcostair": "weathered_cut_copper_stairs", + "cweatheredcostairs": "weathered_cut_copper_stairs", + "cwecopperstair": "weathered_cut_copper_stairs", + "cwecopperstairs": "weathered_cut_copper_stairs", + "cwecopstair": "weathered_cut_copper_stairs", + "cwecopstairs": "weathered_cut_copper_stairs", + "cwecostair": "weathered_cut_copper_stairs", + "cwecostairs": "weathered_cut_copper_stairs", + "cwthcopperstair": "weathered_cut_copper_stairs", + "cwthcopperstairs": "weathered_cut_copper_stairs", + "cwthcopstair": "weathered_cut_copper_stairs", + "cwthcopstairs": "weathered_cut_copper_stairs", + "cwthcostair": "weathered_cut_copper_stairs", + "cwthcostairs": "weathered_cut_copper_stairs", + "minecraft:weathered_cut_copper_stairs": "weathered_cut_copper_stairs", + "weatherccopperstair": "weathered_cut_copper_stairs", + "weatherccopperstairs": "weathered_cut_copper_stairs", + "weatherccopstair": "weathered_cut_copper_stairs", + "weatherccopstairs": "weathered_cut_copper_stairs", + "weatherccostair": "weathered_cut_copper_stairs", + "weatherccostairs": "weathered_cut_copper_stairs", + "weathercutcopperstair": "weathered_cut_copper_stairs", + "weathercutcopperstairs": "weathered_cut_copper_stairs", + "weathercutcopstair": "weathered_cut_copper_stairs", + "weathercutcopstairs": "weathered_cut_copper_stairs", + "weathercutcostair": "weathered_cut_copper_stairs", + "weathercutcostairs": "weathered_cut_copper_stairs", + "weatheredccopperstair": "weathered_cut_copper_stairs", + "weatheredccopperstairs": "weathered_cut_copper_stairs", + "weatheredccopstair": "weathered_cut_copper_stairs", + "weatheredccopstairs": "weathered_cut_copper_stairs", + "weatheredccostair": "weathered_cut_copper_stairs", + "weatheredccostairs": "weathered_cut_copper_stairs", + "weatheredcutcopperstair": "weathered_cut_copper_stairs", + "weatheredcutcopperstairs": "weathered_cut_copper_stairs", + "weatheredcutcopstair": "weathered_cut_copper_stairs", + "weatheredcutcopstairs": "weathered_cut_copper_stairs", + "weatheredcutcostair": "weathered_cut_copper_stairs", + "weatheredcutcostairs": "weathered_cut_copper_stairs", + "weccopperstair": "weathered_cut_copper_stairs", + "weccopperstairs": "weathered_cut_copper_stairs", + "weccopstair": "weathered_cut_copper_stairs", + "weccopstairs": "weathered_cut_copper_stairs", + "weccostair": "weathered_cut_copper_stairs", + "weccostairs": "weathered_cut_copper_stairs", + "wecutcopperstair": "weathered_cut_copper_stairs", + "wecutcopperstairs": "weathered_cut_copper_stairs", + "wecutcopstair": "weathered_cut_copper_stairs", + "wecutcopstairs": "weathered_cut_copper_stairs", + "wecutcostair": "weathered_cut_copper_stairs", + "wecutcostairs": "weathered_cut_copper_stairs", + "wthccopperstair": "weathered_cut_copper_stairs", + "wthccopperstairs": "weathered_cut_copper_stairs", + "wthccopstair": "weathered_cut_copper_stairs", + "wthccopstairs": "weathered_cut_copper_stairs", + "wthccostair": "weathered_cut_copper_stairs", + "wthccostairs": "weathered_cut_copper_stairs", + "wthcutcopperstair": "weathered_cut_copper_stairs", + "wthcutcopperstairs": "weathered_cut_copper_stairs", + "wthcutcopstair": "weathered_cut_copper_stairs", + "wthcutcopstairs": "weathered_cut_copper_stairs", + "wthcutcostair": "weathered_cut_copper_stairs", + "wthcutcostairs": "weathered_cut_copper_stairs", "weeping_vines": { "material": "WEEPING_VINES" }, @@ -27983,6 +39469,12 @@ "minecraft:white_bed": "white_bed", "wbed": "white_bed", "whitebed": "white_bed", + "white_candle": { + "material": "WHITE_CANDLE" + }, + "minecraft:white_candle": "white_candle", + "wcandle": "white_candle", + "whitecandle": "white_candle", "white_carpet": { "material": "WHITE_CARPET" }, @@ -28362,6 +39854,12 @@ "minecraft:yellow_bed": "yellow_bed", "ybed": "yellow_bed", "yellowbed": "yellow_bed", + "yellow_candle": { + "material": "YELLOW_CANDLE" + }, + "minecraft:yellow_candle": "yellow_candle", + "ycandle": "yellow_candle", + "yellowcandle": "yellow_candle", "yellow_carpet": { "material": "YELLOW_CARPET" }, @@ -28801,7 +40299,10 @@ "zvillmspawner": "zombie_villager_spawner", "zvillspawner": "zombie_villager_spawner", "zombified_piglin_spawn_egg": { - "material": "ZOMBIFIED_PIGLIN_SPAWN_EGG" + "material": "ZOMBIFIED_PIGLIN_SPAWN_EGG", + "fallbacks": [ + "ZOMBIE_PIGMAN_SPAWN_EGG" + ] }, "eggzombiepiglin": "zombified_piglin_spawn_egg", "eggzombiepigm": "zombified_piglin_spawn_egg", From 736ecae5ffe1ace9930c6ffbcdebfbe4bb6cebae Mon Sep 17 00:00:00 2001 From: MD <1917406+mdcfe@users.noreply.github.com> Date: Sat, 26 Jun 2021 18:12:31 +0100 Subject: [PATCH 05/29] Add missing FakeServer methods --- .../test/java/com/earth2me/essentials/FakeServer.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Essentials/src/test/java/com/earth2me/essentials/FakeServer.java b/Essentials/src/test/java/com/earth2me/essentials/FakeServer.java index 1934e3042ac..1fa5064c213 100644 --- a/Essentials/src/test/java/com/earth2me/essentials/FakeServer.java +++ b/Essentials/src/test/java/com/earth2me/essentials/FakeServer.java @@ -560,6 +560,16 @@ public void setWhitelist(final boolean bln) { throw new UnsupportedOperationException("Not supported yet."); } + @Override + public boolean isWhitelistEnforced() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setWhitelistEnforced(boolean value) { + throw new UnsupportedOperationException("Not supported yet."); + } + @Override public Set getWhitelistedPlayers() { throw new UnsupportedOperationException("Not supported yet."); From 64eb39a417ae37eda91cce8451f663f9054fe7b8 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sat, 26 Jun 2021 16:03:27 -0400 Subject: [PATCH 06/29] Add serialization support to kits (#3248) Co-authored-by: MD <1917406+mdcfe@users.noreply.github.com> This PR makes use of Paper's item serialization to serialize items into base64 allowing for all items to be properly stored without needing to manual write in special cases for every complex item. There is a config option to disable using this new serialization and use the legacy ItemDB serializer since the new serializer removes the ability to manually edit/read kits. Defaults to not enabled Note: The new serializer places an @ sign in front of items serialized by the new format in order to quickly determine what is serialized by the new serializer and also to retain backward compatibility with the old serializer. Att #3114 Att #2867 Att #1694 Att #31 Att #1283 --- .../com/earth2me/essentials/Essentials.java | 9 ++++++++ .../com/earth2me/essentials/IEssentials.java | 3 +++ .../com/earth2me/essentials/ISettings.java | 2 ++ .../java/com/earth2me/essentials/Kit.java | 10 +++++++++ .../com/earth2me/essentials/Settings.java | 5 +++++ .../essentials/commands/Commandcreatekit.java | 18 +++++++++++++-- Essentials/src/main/resources/config.yml | 11 +++++++++- .../src/main/resources/messages.properties | 2 ++ .../ess3/provider/SerializationProvider.java | 9 ++++++++ .../providers/PaperSerializationProvider.java | 22 +++++++++++++++++++ 10 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/SerializationProvider.java create mode 100644 providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperSerializationProvider.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 6215883ec5a..d3e198051bb 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -58,6 +58,7 @@ import net.ess3.provider.MaterialTagProvider; import net.ess3.provider.PersistentDataProvider; import net.ess3.provider.PotionMetaProvider; +import net.ess3.provider.SerializationProvider; import net.ess3.provider.ProviderListener; import net.ess3.provider.ServerStateProvider; import net.ess3.provider.SpawnEggProvider; @@ -76,6 +77,7 @@ import net.ess3.provider.providers.PaperKnownCommandsProvider; import net.ess3.provider.providers.PaperMaterialTagProvider; import net.ess3.provider.providers.PaperRecipeBookListener; +import net.ess3.provider.providers.PaperSerializationProvider; import net.ess3.provider.providers.PaperServerStateProvider; import net.essentialsx.api.v2.services.BalanceTop; import org.bukkit.Bukkit; @@ -151,6 +153,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient PotionMetaProvider potionMetaProvider; private transient ServerStateProvider serverStateProvider; private transient ContainerProvider containerProvider; + private transient SerializationProvider serializationProvider; private transient KnownCommandsProvider knownCommandsProvider; private transient FormattedCommandAliasProvider formattedCommandAliasProvider; private transient ProviderListener recipeBookEventProvider; @@ -350,6 +353,7 @@ public void onEnable() { if (PaperLib.isPaper() && VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_15_2_R01)) { serverStateProvider = new PaperServerStateProvider(); containerProvider = new PaperContainerProvider(); + serializationProvider = new PaperSerializationProvider(); } else { serverStateProvider = new ReflServerStateProvider(); } @@ -1132,6 +1136,11 @@ public KnownCommandsProvider getKnownCommandsProvider() { return knownCommandsProvider; } + @Override + public SerializationProvider getSerializationProvider() { + return serializationProvider; + } + @Override public FormattedCommandAliasProvider getFormattedCommandAliasProvider() { return formattedCommandAliasProvider; diff --git a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java index c8cd2c43dc0..a2234298fc4 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java @@ -12,6 +12,7 @@ import net.ess3.provider.MaterialTagProvider; import net.ess3.provider.PersistentDataProvider; import net.ess3.provider.ServerStateProvider; +import net.ess3.provider.SerializationProvider; import net.ess3.provider.SpawnerBlockProvider; import net.ess3.provider.SpawnerItemProvider; import net.ess3.provider.SyncCommandsProvider; @@ -136,6 +137,8 @@ public interface IEssentials extends Plugin { KnownCommandsProvider getKnownCommandsProvider(); + SerializationProvider getSerializationProvider(); + FormattedCommandAliasProvider getFormattedCommandAliasProvider(); SyncCommandsProvider getSyncCommandsProvider(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/ISettings.java b/Essentials/src/main/java/com/earth2me/essentials/ISettings.java index 017af75fb90..e757bd103af 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/main/java/com/earth2me/essentials/ISettings.java @@ -327,6 +327,8 @@ public interface ISettings extends IConf { boolean isPastebinCreateKit(); + boolean isUseBetterKits(); + boolean isAllowBulkBuySell(); boolean isAllowSellNamedItems(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/Kit.java b/Essentials/src/main/java/com/earth2me/essentials/Kit.java index f8725bd4f35..fc4d3ccad4e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Kit.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Kit.java @@ -16,6 +16,7 @@ import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; import java.math.BigDecimal; import java.util.ArrayList; @@ -188,6 +189,15 @@ public boolean expandItems(final User user, final List items) throws Exc continue; } + if (kitItem.startsWith("@")) { + if (ess.getSerializationProvider() == null) { + ess.getLogger().log(Level.WARNING, tl("kitError3", kitName, user.getName())); + continue; + } + itemList.add(ess.getSerializationProvider().deserializeItem(Base64Coder.decodeLines(kitItem.substring(1)))); + continue; + } + final String[] parts = kitItem.split(" +"); final ItemStack parseStack = ess.getItemDb().get(parts[0], parts.length > 1 ? Integer.parseInt(parts[1]) : 1); diff --git a/Essentials/src/main/java/com/earth2me/essentials/Settings.java b/Essentials/src/main/java/com/earth2me/essentials/Settings.java index 6d5203a5152..ff303fde464 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Settings.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Settings.java @@ -1640,6 +1640,11 @@ public boolean isPastebinCreateKit() { return config.getBoolean("pastebin-createkit", false); } + @Override + public boolean isUseBetterKits() { + return config.getBoolean("use-nbt-serialization-in-createkit", false); + } + @Override public boolean isAllowBulkBuySell() { return config.getBoolean("allow-bulk-buy-sell", false); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java index 590d28779ba..d00c803513a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java @@ -14,6 +14,7 @@ import org.spongepowered.configurate.ConfigurationNode; import org.spongepowered.configurate.yaml.NodeStyle; import org.spongepowered.configurate.yaml.YamlConfigurationLoader; +import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; import java.io.BufferedWriter; import java.io.InputStreamReader; @@ -51,9 +52,22 @@ public void run(final Server server, final User user, final String commandLabel, final String kitname = args[0]; final ItemStack[] items = user.getBase().getInventory().getContents(); final List list = new ArrayList<>(); - for (final ItemStack is : items) { + + boolean useSerializationProvider = ess.getSettings().isUseBetterKits(); + + if (useSerializationProvider && ess.getSerializationProvider() == null) { + ess.showError(user.getSource(), new Exception(tl("createKitUnsupported")), commandLabel); + useSerializationProvider = false; + } + + for (ItemStack is : items) { if (is != null && is.getType() != null && is.getType() != Material.AIR) { - final String serialized = ess.getItemDb().serialize(is); + final String serialized; + if (useSerializationProvider) { + serialized = "@" + Base64Coder.encodeLines(ess.getSerializationProvider().serializeItem(is)); + } else { + serialized = ess.getItemDb().serialize(is); + } list.add(serialized); } } diff --git a/Essentials/src/main/resources/config.yml b/Essentials/src/main/resources/config.yml index 8e575d06c85..339eb17076d 100644 --- a/Essentials/src/main/resources/config.yml +++ b/Essentials/src/main/resources/config.yml @@ -331,9 +331,18 @@ kit-auto-equip: false # Determines the functionality of the /createkit command. # If this is true, /createkit will give the user a link with the kit code. # If this is false, /createkit will add the kit to the kits.yml config file directly. -# +# Default is false. pastebin-createkit: false +# Determines if /createkit will generate kits using NBT item serialization. +# If this is true, /createkit will store items as NBT; otherwise, it will use Essentials' human-readable item format. +# By using NBT serialization, /createkit can store items with complex metadata such as shulker boxes and weapons with custom attributes. +# WARNING: This option only works on 1.15.2+ Paper servers, and it will bypass any custom serializers from other plugins such as Magic. +# WARNING: When creating kits via /createkit with this option enabled, you will not be able to downgrade your server with these kit items. +# This option only affects /createkit - you can still create kits by hand in `kits.yml` using Essentials' human-readable item format. +# Default is false. +use-nbt-serialization-in-createkit: false + # Essentials Sign Control # See http://wiki.ess3.net/wiki/Sign_Tutorial for instructions on how to use these. # To enable signs, remove # symbol. To disable all signs, comment/remove each sign. diff --git a/Essentials/src/main/resources/messages.properties b/Essentials/src/main/resources/messages.properties index 36b94f3c37f..2dba33cb876 100644 --- a/Essentials/src/main/resources/messages.properties +++ b/Essentials/src/main/resources/messages.properties @@ -181,6 +181,7 @@ createkitCommandUsage1Description=Creates a kit with the given name and delay createKitFailed=\u00a74Error occurred whilst creating kit {0}. createKitSeparator=\u00a7m----------------------- createKitSuccess=\u00a76Created Kit: \u00a7f{0}\n\u00a76Delay: \u00a7f{1}\n\u00a76Link: \u00a7f{2}\n\u00a76Copy contents in the link above into your kits.yml. +createKitUnsupported=\u00a74NBT item serialization has been enabled, but this server is not running Paper 1.15.2+. Falling back to standard item serialization. creatingConfigFromTemplate=Creating config from template\: {0} creatingEmptyConfig=Creating empty config\: {0} creative=creative @@ -582,6 +583,7 @@ kitCost=\ \u00a77\u00a7o({0})\u00a7r kitDelay=\u00a7m{0}\u00a7r kitError=\u00a74There are no valid kits. kitError2=\u00a74That kit is improperly defined. Contact an administrator. +kitError3=Cannot give kit item in kit "{0}" to user {1} as kit item requires Paper 1.15.2+ to deserialize. kitGiveTo=\u00a76Giving kit\u00a7c {0}\u00a76 to \u00a7c{1}\u00a76. kitInvFull=\u00a74Your inventory was full, placing kit on the floor. kitInvFullNoDrop=\u00a74There is not enough room in your inventory for that kit. diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/SerializationProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/SerializationProvider.java new file mode 100644 index 00000000000..252af46be6b --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/SerializationProvider.java @@ -0,0 +1,9 @@ +package net.ess3.provider; + +import org.bukkit.inventory.ItemStack; + +public interface SerializationProvider extends Provider { + byte[] serializeItem(ItemStack stack); + + ItemStack deserializeItem(byte[] bytes); +} diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperSerializationProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperSerializationProvider.java new file mode 100644 index 00000000000..9665cdf18a1 --- /dev/null +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperSerializationProvider.java @@ -0,0 +1,22 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.SerializationProvider; +import org.bukkit.inventory.ItemStack; + +public class PaperSerializationProvider implements SerializationProvider { + + @Override + public byte[] serializeItem(ItemStack stack) { + return stack.serializeAsBytes(); + } + + @Override + public ItemStack deserializeItem(byte[] bytes) { + return ItemStack.deserializeBytes(bytes); + } + + @Override + public String getDescription() { + return "Paper Serialization Provider"; + } +} From 3f36a52685ec3456a31214cc759ae48c4d35f9fe Mon Sep 17 00:00:00 2001 From: triagonal <10545540+triagonal@users.noreply.github.com> Date: Sun, 27 Jun 2021 06:11:03 +1000 Subject: [PATCH 07/29] Prevent NPEs in /powertool (#4276) This PR fixes a long-standing bug where using the `a:` or `r:` modes in `/powertool` with no commands already set on the item would result in an NPE. To prevent this, the powertool command list is now immediately initialized if it doesn't exist upon retrieval. --- .../essentials/commands/Commandpowertool.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpowertool.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpowertool.java index 88b7a0c4f0b..d6ba3fa0ec6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpowertool.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpowertool.java @@ -8,7 +8,6 @@ import org.bukkit.Server; import org.bukkit.inventory.ItemStack; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; @@ -52,10 +51,11 @@ protected void powertool(final CommandSource sender, final User user, final Item } final String itemName = itemStack.getType().toString().toLowerCase(Locale.ENGLISH).replaceAll("_", " "); - List powertools = user.getPowertool(itemStack); + final List powertools = user.getPowertool(itemStack) != null ? user.getPowertool(itemStack) : Lists.newArrayList(); + if (command != null && !command.isEmpty()) { if (command.equalsIgnoreCase("l:")) { - if (powertools == null || powertools.isEmpty()) { + if (powertools.isEmpty()) { throw new Exception(tl("powerToolListEmpty", itemName)); } else { sender.sendMessage(tl("powerToolList", StringUtil.joinList(powertools), itemName)); @@ -79,20 +79,16 @@ protected void powertool(final CommandSource sender, final User user, final Item if (powertools.contains(command)) { throw new Exception(tl("powerToolAlreadySet", command, itemName)); } - } else if (powertools != null && !powertools.isEmpty()) { + } else if (!powertools.isEmpty()) { // Replace all commands with this one powertools.clear(); - } else { - powertools = new ArrayList<>(); } powertools.add(command); sender.sendMessage(tl("powerToolAttach", StringUtil.joinList(powertools), itemName)); } } else { - if (powertools != null) { - powertools.clear(); - } + powertools.clear(); sender.sendMessage(tl("powerToolRemoveAll", itemName)); } From c18830ce756a61272c9caac0da8432adcbacd559 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sat, 26 Jun 2021 19:36:28 -0700 Subject: [PATCH 08/29] Fix pickup delay with essentials.build.pickup permission (#4273) Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com> --- .../essentials/antibuild/EssentialsAntiBuildListener.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java b/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java index 5270889e1dc..97f0b76759d 100644 --- a/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java +++ b/EssentialsAntiBuild/src/main/java/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java @@ -393,7 +393,6 @@ public void onPlayerPickupItem(final EntityPickupItemEvent event) { if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild()) { if (!metaPermCheck(user, "pickup", item.getType(), item.getDurability())) { event.setCancelled(true); - event.getItem().setPickupDelay(50); } } } @@ -409,7 +408,6 @@ public void onPlayerPickupItem(final PlayerPickupItemEvent event) { if (prot.getSettingBool(AntiBuildConfig.disable_use) && !user.canBuild()) { if (!metaPermCheck(user, "pickup", item.getType(), item.getDurability())) { event.setCancelled(true); - event.getItem().setPickupDelay(50); } } } From e7e3f58c8f9a1fd3da52dea0dc54b2103e1d1146 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 27 Jun 2021 09:22:52 -0400 Subject: [PATCH 09/29] Fix missing translation param in ice command --- .../main/java/com/earth2me/essentials/commands/Commandice.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java index dc0eaba9b0b..feb9f46b5cd 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandice.java @@ -40,7 +40,7 @@ protected void run(Server server, CommandSource sender, String commandLabel, Str @Override protected void updatePlayer(Server server, CommandSource sender, User user, String[] args) throws NotEnoughArgumentsException, PlayerExemptException, ChargeException, MaxMoneyException { freezePlayer(user); - user.sendMessage(tl("iceOther")); + user.sendMessage(tl("iceOther", user.getDisplayName())); } private void freezePlayer(final IUser user) { From 4e4eb352408071aec2d1450279027c592199d7cc Mon Sep 17 00:00:00 2001 From: Flask Bot <67512990+Flask-Bot@users.noreply.github.com> Date: Sun, 27 Jun 2021 14:46:04 +0100 Subject: [PATCH 10/29] New Crowdin updates (#4182) Co-authored-by: MD <1917406+mdcfe@users.noreply.github.com> --- .../src/main/resources/messages_bg.properties | 3 + .../src/main/resources/messages_cs.properties | 56 ++ .../src/main/resources/messages_de.properties | 3 + .../src/main/resources/messages_en.properties | 3 + .../main/resources/messages_en_GB.properties | 3 + .../src/main/resources/messages_es.properties | 18 + .../src/main/resources/messages_et.properties | 141 +++++ .../src/main/resources/messages_eu.properties | 8 + .../src/main/resources/messages_fi.properties | 3 + .../main/resources/messages_fil_PH.properties | 3 + .../src/main/resources/messages_fr.properties | 183 +++++- .../src/main/resources/messages_hu.properties | 3 + .../src/main/resources/messages_it.properties | 23 + .../src/main/resources/messages_ja.properties | 14 + .../src/main/resources/messages_ko.properties | 89 ++- .../src/main/resources/messages_lt.properties | 2 + .../main/resources/messages_lv_LV.properties | 3 + .../src/main/resources/messages_nl.properties | 3 + .../src/main/resources/messages_no.properties | 3 + .../src/main/resources/messages_pl.properties | 24 +- .../src/main/resources/messages_pt.properties | 56 +- .../main/resources/messages_pt_BR.properties | 20 + .../src/main/resources/messages_ro.properties | 102 ++++ .../src/main/resources/messages_ru.properties | 44 +- .../main/resources/messages_si_LK.properties | 2 + .../src/main/resources/messages_sk.properties | 22 + .../src/main/resources/messages_sv.properties | 5 + .../src/main/resources/messages_tr.properties | 3 + .../src/main/resources/messages_uk.properties | 3 + .../src/main/resources/messages_vi.properties | 74 ++- .../src/main/resources/messages_zh.properties | 340 ++++++++--- .../main/resources/messages_zh_TW.properties | 550 +++++++++--------- 32 files changed, 1436 insertions(+), 373 deletions(-) diff --git a/Essentials/src/main/resources/messages_bg.properties b/Essentials/src/main/resources/messages_bg.properties index b4bf07a755c..663ddfe24dc 100644 --- a/Essentials/src/main/resources/messages_bg.properties +++ b/Essentials/src/main/resources/messages_bg.properties @@ -309,6 +309,9 @@ homeConfirmation=§6Вече имате дом на име §c{0}§6\!\nЗа д homeSet=§6Вече имате дом на тази локация. hour=час hours=часа +iceCommandUsage=/ [player] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Игнорирайте или не игнорирайте други играчи. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_cs.properties b/Essentials/src/main/resources/messages_cs.properties index 7fb3ec5fc0f..b8854813093 100644 --- a/Essentials/src/main/resources/messages_cs.properties +++ b/Essentials/src/main/resources/messages_cs.properties @@ -181,6 +181,7 @@ createkitCommandUsage1Description=Vytvoří sadu se zadaným jménem a zpožděn createKitFailed=§4Při vytváření sady {0} došlo k chybě. createKitSeparator=§m----------------------- createKitSuccess=§6Vytvořena sada\: §f{0}\n§6Interval\: §f{1}\n§6Odkaz\: §f{2}\n§6Zkopíruj obsah z uvedeného odkazu do souboru kits.yml. +createKitUnsupported=§4NBT serializace předmětů byla povolena, avšak tento server neběží pod Paper 1.15.2+. Návrat ke standardní serializaci předmětů. creatingConfigFromTemplate=Vytváří se konfigurace podle šablony\: {0} creatingEmptyConfig=Vytváří se prázdná konfigurace\: {0} creative=tvořivá hra @@ -191,11 +192,15 @@ customtextCommandUsage=/ - definuj v souboru bukkit.yml day=den days=dny defaultBanReason=Protože proto\! +deletedHomes=Všechny domovy byly smazány. +deletedHomesWorld=Všechny domovy ve světě {0} byly smazány. deleteFileError=Nelze odstranit soubor\: {0} deleteHome=§6Domov§c {0} §6byl úspěšně odstraněn. deleteJail=§6JVězení§c {0} §6bylo úspěšně odstraněno. deleteKit=§6Sada§c {0} §6byla odstraněna. deleteWarp=§6Warp§c {0} §6byl úspěšně odstraněn. +deletingHomes=Odstraňování všech domovů... +deletingHomesWorld=Odstraňování všech domovů ve světě {0}... delhomeCommandDescription=Odstraní domov. delhomeCommandUsage=/ [hráč\:] delhomeCommandUsage1=/ @@ -278,6 +283,10 @@ essentialsCommandUsage4=/ debug essentialsCommandUsage4Description=Zapne Essentials "debug mod" essentialsCommandUsage5=/ reset essentialsCommandUsage5Description=Resetuje hráčská data daného hráče +essentialsCommandUsage6=/ cleanup +essentialsCommandUsage6Description=Vyčistí stará uživatelská data +essentialsCommandUsage7=/ homes +essentialsCommandUsage7Description=Spravuje uživatelské domovy essentialsHelp1=Soubor je poškozen a Essentials jej nemůže otevřít. Essentials byl vypnut. Pokud nedokážete soubor opravit sami, navštivte http\://tiny.cc/EssentialsChat essentialsHelp2=Soubor je poškozen a Essentials jej nemůže otevřít. Essentials byl vypnut. Pokud nedokážete soubor opravit sami, napište ve hře /essentialshelp nebo navštivte http\://tiny.cc/EssentialsChat essentialsReload=§6Essentials byl znovu načten§c {0}. @@ -329,6 +338,8 @@ fireworkCommandUsage4=/ fireworkCommandUsage4Description=Přidá daný efekt do rachejtle v ruce fireworkEffectsCleared=§6Vsechny efekty byly odstraněny. fireworkSyntax=§6Parametry ohňostroje\:§c color\: [fade\:] [shape\:] [effect\:]\n§6Pro více barev/efektů odděl hodnoty čárkou\: §cred,blue,pink\n§6Tvary\:§c star, ball, large, creeper, burst §6Efekty\:§c trail, twinkle. +fixedHomes=Neplatné domovy byly smazány. +fixingHomes=Odstraňování neplatných domovů... flyCommandDescription=Vzlétni a vznášej se\! flyCommandUsage=/ [hráč] [on|off] flyCommandUsage1=/ [hráč] @@ -361,6 +372,7 @@ giveCommandUsage=/ [počet [meta_předm giveCommandUsage1=/ [počet] giveCommandUsage1Description=Dá cílovému hráči 64 (nebo uvedené množství) zadaného předmětu giveCommandUsage2=/ +giveCommandUsage2Description=Dá cílovému hráči zadané množství určitého předmětu s uvedenými metadaty geoipCantFind=§6Hráč §c{0} §6přichází z §aneznámé země§6. geoIpErrorOnJoin=Nepodařilo se načíst GeoIP data pro {0}. Ujisti se, že tvůj licenční klíč a konfigurace jsou správné. geoIpLicenseMissing=Licenční klíč nebyl nalezen\! Na adrese https\://essentialsx.net/geoip jsou pokyny pro první nastavení. @@ -370,6 +382,7 @@ givenSkull=§6Obdržel jsi lebku hráče §c{0}§6. godCommandDescription=Zapíná ti božské schopnosti. godCommandUsage=/ [hráč] [on|off] godCommandUsage1=/ [hráč] +godCommandUsage1Description=Přepíná nesmrtelnost pro tebe nebo jiného hráče, byl-li zadán giveSpawn=§6Hráč §c{2} §6dostává §c{0}§6x §c{1}§6. giveSpawnFailure=§4Málo místa v inventáři, §c{0}§4x §c{1} §4bylo ztraceno. godDisabledFor=§cvypnuto§6 pro§c {0} @@ -383,6 +396,7 @@ hatArmor=§4Tento předmět nemůžeš použít jako klobouk\! hatCommandDescription=Získej nějaké nové úžasné pokrývky hlavy. hatCommandUsage=/ [remove] hatCommandUsage1=/ +hatCommandUsage1Description=Předmět v ruce se použije jako klobouk hatCommandUsage2=/ [remove] hatCommandUsage2Description=Odstraní tvůj aktuální klobouk hatCurse=§4Nemůžeš odstranit klobouk s kletbou spoutání\! @@ -425,6 +439,16 @@ homeConfirmation=§6Již máš domov s názvem §c{0}§6\!\nChceš-li přepsat s homeSet=§6Domov nastaven na tomto místě. hour=hodina hours=hodin +ice=§6Je ti dost zima... +iceCommandDescription=Zchladí hráče. +iceCommandUsage=/ [hráč] +iceCommandUsage1=/ +iceCommandUsage1Description=Zchladí tě +iceCommandUsage2=/ +iceCommandUsage2Description=Zchladí daného hráče +iceCommandUsage3=/ * +iceCommandUsage3Description=Zchladí všechny připojené hráče +iceOther=§6Chlazení hráče§c {0}§6. ignoreCommandDescription=Ignorovat nebo neignorovat jiné hráče. ignoreCommandUsage=/ ignoreCommandUsage1=/ @@ -471,10 +495,19 @@ itemCannotBeSold=§4Tento předmět nelze prodat serveru. itemCommandDescription=Vyvolá předmět. itemCommandUsage=/ [počet [meta_předmětu...]] itemCommandUsage1=/ [počet] +itemCommandUsage1Description=Dá cílovému hráči celý stack (nebo uvedené množství) zadaného předmětu +itemCommandUsage2=/ +itemCommandUsage2Description=Dá ti zadané množství určitého předmětu s uvedenými metadaty itemId=§6ID\:§c {0} itemloreClear=§6Odstranil jsi moudro tohoto předmětu. itemloreCommandDescription=Upravit moudro předmětu. itemloreCommandUsage=/ [text/řádek] [text] +itemloreCommandUsage1=/ [text] +itemloreCommandUsage1Description=Přidá zadaný text na konec moudra předmětu v ruce +itemloreCommandUsage2=/ [číslo řádku] +itemloreCommandUsage2Description=Nastaví zadaný řádek moudra drženého předmětu na daný text +itemloreCommandUsage3=/ +itemloreCommandUsage3Description=Vymaže moudro drženého předmětu itemloreInvalidItem=§4Předmět, u něhož chceš upravit moudro, musíš držet v ruce. itemloreNoLine=§4Předmět ve tvé ruce nemá žádné moudro na řádce §c{0}§4. itemloreNoLore=§4Předmět ve tvé ruce nemá žádné moudro. @@ -486,7 +519,9 @@ itemnameClear=§6Odstranil jsi název tohoto předmětu. itemnameCommandDescription=Nazve předmět. itemnameCommandUsage=/ [název] itemnameCommandUsage1=/ +itemnameCommandUsage1Description=Vymaže název drženého předmětu itemnameCommandUsage2=/ +itemnameCommandUsage2Description=Nastaví název drženého předmětu na zadaný text itemnameInvalidItem=§cPředmět, který chceš přejmenovat, musíš držet v ruce. itemnameSuccess=§6Předmět v ruce jsi přejmenoval na „§c{0}§6“. itemNotEnough1=§4Na prodej nemáš dostatečné množství. @@ -503,6 +538,7 @@ itemType=§6Předmět\:§c {0} itemdbCommandDescription=Vyhledá předmět. itemdbCommandUsage=/ itemdbCommandUsage1=/ +itemdbCommandUsage1Description=Hledá daný předmět v databázi předmětů jailAlreadyIncarcerated=§4Tento hráč již úpí ve vězení\:§c {0} jailList=§6Vězení\:§r {0} jailMessage=§4Provinil ses, tak teď musíš pykat. @@ -511,6 +547,7 @@ jailReleased=§6Hráč §c{0}§6 byl propuštěn na svobodu. jailReleasedPlayerNotify=§6Byl jsi propuštěn na svobodu\! jailSentenceExtended=§6Uvěznění bylo prodlouženo na §c{0}§6. jailSet=§6Vězení§c {0} §6bylo zřízeno. +jailWorldNotExist=§4Svět tohoto vězení neexistuje. jumpEasterDisable=§6Režim létajícího kouzelníka vypnut. jumpEasterEnable=§6Režim létajícího kouzelníka zapnut. jailsCommandDescription=Vypíše seznam všech vězení. @@ -521,26 +558,32 @@ jumpError=§4Tohle by tvuj procesor nemusel rozdychat. kickCommandDescription=Vyhodí určeného hráče s uvedením důvodu. kickCommandUsage=/ [důvod] kickCommandUsage1=/ [důvod] +kickCommandUsage1Description=Vyhodí daného hráče s volitelným důvodem kickDefault=Vyhozen ze serveru. kickedAll=§4Vyhodil jsi všechny hráče ze serveru. kickExempt=§4Tohoto hráče nemůžeš vyhodit. kickallCommandDescription=Vyhodí všechny hráče ze serveru kromě zadavatele příkazu. kickallCommandUsage=/ [důvod] kickallCommandUsage1=/ [důvod] +kickallCommandUsage1Description=Vyhodí všechny hráče s volitelným důvodem kill=§6Hráč§c {0}§6 byl usmrcen. killCommandDescription=Zabije zadaného hráče. killCommandUsage=/ killCommandUsage1=/ +killCommandUsage1Description=Zabije zadaného hráče killExempt=§4Nemůžeš zabít hráče §c{0}§4. kitCommandDescription=Získá zadanou sadu nebo zobrazí všechny dostupné sady. kitCommandUsage=/ [sada] [hráč] kitCommandUsage1=/ +kitCommandUsage1Description=Zobrazí veškeré dostupné sady kitCommandUsage2=/ [hráč] +kitCommandUsage2Description=Dá uvedenou sadu tobě nebo jinému hráč, byl-li zadán kitContains=§6Sada §c{0} §6obsahuje\: kitCost=\ §7§o({0})§r kitDelay=§m{0}§r kitError=§4Neexistují žádné platné sady. kitError2=§4Tato sada není správně definována. Kontaktuj správce. +kitError3=Nelze dát předmět sady v sadě "{0}" uživateli {1}, jelikož předmět vyžaduje k deserializaci Paper 1.15.2+. kitGiveTo=§6Hráč §c{1}§6 dostává sadu §c{0}§6. kitInvFull=§4Tvůj inventář byl plný, sada byla položena na zem. kitInvFullNoDrop=§4V inventáři není na tuto sadu dost místa. @@ -552,6 +595,7 @@ kitReset=§6Vynulovat čekací dobu pro sadu §c{0}§6. kitresetCommandDescription=Nuluje čekací dobu pro zadanou sadu. kitresetCommandUsage=/ [hráč] kitresetCommandUsage1=/ [hráč] +kitresetCommandUsage1Description=Vynuluje čekací dobu na uvedenou sadu pro tebe nebo jiného hráče, byl-li zadán kitResetOther=§6Nulování čekací doby sady §c{0} §6pro hráče §c{1}§6. kits=§6Sady\:§r {0} kittycannonCommandDescription=Mrští po protivníkovi vybuchující kočičku. @@ -561,6 +605,9 @@ leatherSyntax=§6Syntaxe barvy kůže\: §ccolor\:,, §6např\ lightningCommandDescription=Thórova síla. Udeří hráče nebo na místo zaměřené kurzorem. lightningCommandUsage=/ [síla] lightningCommandUsage1=/ [hráč] +lightningCommandUsage1Description=Vrhne blesk na místo, kam se díváš nebo po jiném hráči, byl-li zadán +lightningCommandUsage2=/ +lightningCommandUsage2Description=Vrhne blesk po cílovém hráči se zadanou silou lightningSmited=§6Zasáhl tě blesk\! lightningUse=§6Hráč§c {0} §6byl zasažen bleskem listAfkTag=§7[AFK]§r @@ -569,6 +616,7 @@ listAmountHidden=§6Je připojeno §c{0}§6/§c{1}§6 z maximálního počtu §c listCommandDescription=Vypíše všechny připojené hráče. listCommandUsage=/ [skupina] listCommandUsage1=/ [skupina] +listCommandUsage1Description=Zobrazí seznam všech hráčů na serveru nebo v dané skupině, byla-li zadána listGroupTag=§6/{0}§r\: listHiddenTag=§7[SKRYTÝ]§r loadWarpError=§4Nepodařilo se načíst warp {0}. @@ -579,7 +627,14 @@ mailClear=§6Zprávy vymažeš příkazem §c/mail clear§6. mailCleared=§6Zpráva smazána\! mailCommandDescription=Spravuje vnitroserverovou poštu mezi hráči. mailCommandUsage=/ [read|clear|send [komu] [zpráva]|sendall [zpráva]] +mailCommandUsage1=/ read [strana] +mailCommandUsage1Description=Čte první (nebo zadanou) stránku e-mailu mailCommandUsage2=/ clear +mailCommandUsage2Description=Vymaže tvou poštu +mailCommandUsage3=/ send +mailCommandUsage3Description=Odešle zadanému hráči danou zprávu +mailCommandUsage4=/ sendall +mailCommandUsage4Description=Odešle všem hráčům danou zprávu mailDelay=Za poslední minutu bylo odesláno příliš mnoho zpráv. Maximum\: {0} mailFormat=§6[§r{0}§6] §r{1} mailMessage={0} @@ -595,6 +650,7 @@ mayNotJailOffline=§Nemůžeš uvěznit hráče, který není ve hře. meCommandDescription=Umožňuje napsat o sobě ve třetí osobě. meCommandUsage=/ meCommandUsage1=/ +meCommandUsage1Description=Popisuje akci meSender=já meRecipient=já minimumBalanceError=§4Nejnižší možný zůstatek uživatele je {0}. diff --git a/Essentials/src/main/resources/messages_de.properties b/Essentials/src/main/resources/messages_de.properties index d95dc455799..a92a063cc92 100644 --- a/Essentials/src/main/resources/messages_de.properties +++ b/Essentials/src/main/resources/messages_de.properties @@ -323,6 +323,9 @@ homeConfirmation=§6Du hast schon ein Zuhause mit dem Namen §c{0}§6\!\nUm dein homeSet=§6Zuhause auf aktuellen Standort gesetzt. hour=Stunde hours=Stunden +iceCommandUsage=/ [spieler] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Andere Spieler nicht ignorieren oder ignorieren. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_en.properties b/Essentials/src/main/resources/messages_en.properties index 262c1d24b22..ed7e9ea60d0 100644 --- a/Essentials/src/main/resources/messages_en.properties +++ b/Essentials/src/main/resources/messages_en.properties @@ -323,6 +323,9 @@ homeConfirmation=§6You already have a home named §c{0}§6\!\nTo overwrite your homeSet=§6Home set to current location. hour=hour hours=hours +iceCommandUsage=/ [player] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Ignore or unignore other players. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_en_GB.properties b/Essentials/src/main/resources/messages_en_GB.properties index 9d0e1a00ae2..b66f662257b 100644 --- a/Essentials/src/main/resources/messages_en_GB.properties +++ b/Essentials/src/main/resources/messages_en_GB.properties @@ -323,6 +323,9 @@ homeConfirmation=§6You already have a home named §c{0}§6\!\nTo overwrite your homeSet=§6Home set to current location. hour=hour hours=hours +iceCommandUsage=/ [player] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Ignore or unignore other players. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_es.properties b/Essentials/src/main/resources/messages_es.properties index 5ec2c2e75be..504cb7c40b3 100644 --- a/Essentials/src/main/resources/messages_es.properties +++ b/Essentials/src/main/resources/messages_es.properties @@ -10,6 +10,7 @@ afkCommandDescription=Te pone como ausente. afkCommandUsage=/ [jugador/mensaje...] afkCommandUsage1=/ [message] afkCommandUsage1Description=Cambia tu estado de ausente con un motivo opcional +afkCommandUsage2Description=Alterna el estado de afk de el jugador especificado con una razón opcional alertBroke=roto\: alertFormat=§3[{0}] §f {1} §6 {2} en\: {3} alertPlaced=colocado\: @@ -34,7 +35,9 @@ backAfterDeath=§6Usa el comando §c/back §6para volver al lugar de tu muerte. backCommandDescription=Te teletransporta a tu ubicación anterior a tp/spawn/warp. backCommandUsage=/ [jugador] backCommandUsage1=/ +backCommandUsage1Description=Te teletransporta a tu ubicación anterior backCommandUsage2=/ +backCommandUsage2Description=Teletransporta al jugador especificado a su ubicación anterior backOther=§6Regresando§c {0}§6 a la ubicación anterior. backupCommandDescription=Ejecuta la creación de copia de seguridad si está configurada. backupCommandUsage=/ @@ -48,19 +51,23 @@ balanceCommandDescription=Muestra el saldo actual de un jugador. balanceCommandUsage=/ [jugador] balanceCommandUsage1=/ balanceCommandUsage2=/ +balanceCommandUsage2Description=Muestra el saldo de un jugador especificado balanceOther=§aDinero de {0} §a\:§c {1} balanceTop=§6Ranking de economías ({0}) balanceTopLine={0}. {1}, {2} balancetopCommandDescription=Obtiene los valores más altos de dinero. +balancetopCommandUsage1Description=Muestra la primera (o especificada) página de el top valores de saldo banCommandDescription=Banea a un jugador. banCommandUsage=/ [razón] banCommandUsage1=/ [razón] +banCommandUsage1Description=Banea a el jugador especificado con una razón opcional banExempt=§4No puedes banear a ese jugador. banExemptOffline=§4No puedes banear a jugadores que no están conectados. banFormat=§4Baneado\: §r {0} banIpJoin=Your IP address is banned from this server. Reason\: {0} banJoin=Estás baneado de este servidor. Motivo\: {0} banipCommandDescription=Banea una dirección IP. +banipCommandUsage1Description=Banea la dirección IP especificada con una razón opcional bed=§ocama§r bedMissing=§cTu cama no esta, se encuentra obstruída o no esta segura bedNull=§mcama§r @@ -73,12 +80,16 @@ bigTreeSuccess=§6Árbol grande generado. bigtreeCommandDescription=Genera un árbol grande donde estás mirando. bigtreeCommandUsage=/ bigtreeCommandUsage1=/ +bigtreeCommandUsage1Description=Genera un gran árbol del tipo especificado blockList=§6EssentialsX está transmitiendo los siguientes comandos a otros plugins\: blockListEmpty=§6EssentialsX no está reenviando ningún comando a otros plugins. bookAuthorSet=§6Ahora el autor de este libro es {0}. bookCommandDescription=Permite reabrir y editar libros sellados. bookCommandUsage=/ [título|autor [nombre]] bookCommandUsage1=/ +bookCommandUsage1Description=Bloquea/desbloquea un libro con pluma/libro firmado +bookCommandUsage2Description=Establece el autor de un libro firmado +bookCommandUsage3Description=Establece el título de un libro firmado bookLocked=§6El libro ha sido bloqueado. bookTitleSet=§6Ahora el título del libro es {0}. breakCommandDescription=Rompe el bloque que estás mirando. @@ -324,6 +335,12 @@ homeConfirmation=§6Ya tienes una casa llamada §c{0}§6\!\nPara sobrescribir tu homeSet=§7Hogar establecido. hour=hora hours=horas +ice=§6Sientes mucho más frío... +iceCommandDescription=Enfría a un jugador. +iceCommandUsage=/ [jugador] +iceCommandUsage1=/ +iceCommandUsage1Description=Te enfría +iceCommandUsage2=/ ignoreCommandDescription=Ignorar o dejar de ignorar a otros jugadores. ignoreCommandUsage=/ ignoreCommandUsage1=/ @@ -406,6 +423,7 @@ jailReleased=§6El jugador §c{0}§6 ha salido de la cárcel. jailReleasedPlayerNotify=§7¡Has sido liberado\! jailSentenceExtended=Tiempo en la cárcel extendido a {0} jailSet=§6La cárcel {0} ha sido creada. +jailWorldNotExist=§4Ese mundo de la cárcel no existe. jumpEasterDisable=§6Modo asistente de vuelo desactivado. jumpEasterEnable=§6Modo asistente de vuelo activado. jailsCommandDescription=Lista todas las cárceles. diff --git a/Essentials/src/main/resources/messages_et.properties b/Essentials/src/main/resources/messages_et.properties index 8176d35eb1e..98de96bcec0 100644 --- a/Essentials/src/main/resources/messages_et.properties +++ b/Essentials/src/main/resources/messages_et.properties @@ -428,6 +428,9 @@ homeConfirmation=§6Sul juba on kodu nimega §c{0}§6\!\nOlemasoleva kodu üleki homeSet=§6Kodu määratud. hour=tund hours=tundi +iceCommandUsage=/ [mängija] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Ignoreeri või ära ignoreeri teisi mängijaid. ignoreCommandUsage=/ ignoreCommandUsage1=/ @@ -475,11 +478,18 @@ itemCommandDescription=Tekita ese. itemCommandUsage=/ [kogus [esememeta...]] itemCommandUsage1=/ [kogus] itemCommandUsage1Description=Annab sulle terve kuhja (või määratud koguses) esemeid +itemCommandUsage2=/ +itemCommandUsage2Description=Annab mängijale määratud koguse määratud koguse esemeid koos antud metaandmetega itemId=§6ID\:§c {0} itemloreClear=§6Sa oled tühjendanud selle eseme vihjeteksti. itemloreCommandDescription=Muuda eseme vihjeteksti. itemloreCommandUsage=/ [text/line] [tekst] +itemloreCommandUsage1=The source string should be\n/ [text] +itemloreCommandUsage1Description=Lisatud antud teksti käes hoitava eseme vihjeteksti +itemloreCommandUsage2=/ +itemloreCommandUsage2Description=Määrab kindlaks etteantud eseme vihjeteksti rea itemloreCommandUsage3=/ clear +itemloreCommandUsage3Description=Tühjendab käes hoitava eseme vihjeteksti itemloreInvalidItem=§4Eseme vihjeteksti muutmiseks pead seda käes hoidma. itemloreNoLine=§4Sinu käeshoitaval esemel ei ole vihjeteksti §c{0}§4. real. itemloreNoLore=§4Sinu käeshoitaval esemel ei ole vihjeteksti. @@ -491,7 +501,9 @@ itemnameClear=§6Sa oled tühjendanud selle eseme nime. itemnameCommandDescription=Nimeta ese. itemnameCommandUsage=/ [nimi] itemnameCommandUsage1=/ +itemnameCommandUsage1Description=Tühjendab käes hoitava eseme vihjeteksti itemnameCommandUsage2=/ +itemnameCommandUsage2Description=Seadistab käes hoitavale esemele etteantud teksti itemnameInvalidItem=§cEseme ümbernimetamiseks pead seda käes hoidma. itemnameSuccess=§6Sa oled nimetanud käesoleva eseme ümber\: "§c{0}§6". itemNotEnough1=§4Sul pole sellest esemest müümiseks piisavat hulka. @@ -508,6 +520,7 @@ itemType=§6Ese\:§c {0} §6 itemdbCommandDescription=Otsi eset. itemdbCommandUsage=/ itemdbCommandUsage1=/ +itemdbCommandUsage1Description=Otsib eset andmebaasist etteantud esemega jailAlreadyIncarcerated=§4Mängija on juba vanglas\:§c {0} jailList=§6Vanglad\:§r {0} jailMessage=§4Sooritasid kuriteo, istud oma aja ära. @@ -516,6 +529,7 @@ jailReleased=§6Mängija §c{0}§6 on vanglast vabastatud. jailReleasedPlayerNotify=§6Sind vabastati vanglast\! jailSentenceExtended=§6Vangi aega pikendati järgnevalt\: {0} jailSet=§6Vangla§c {0} §6on määratud. +jailWorldNotExist=§4Selle vangla maailma pole olemas. jumpEasterDisable=§6Lendava võluri režiim keelatud. jumpEasterEnable=§6Lendava võluri režiim lubatud. jailsCommandDescription=Loetleb kõik vanglad. @@ -526,21 +540,26 @@ jumpError=§4See teeks su arvuti ajule haiget. kickCommandDescription=Viskab valitud mängija põhjusega välja. kickCommandUsage=/ [põhjus] kickCommandUsage1=/ [põhjus] +kickCommandUsage1Description=Viskab valitud mängija välja valikulise põhjusega kickDefault=Serverist välja visatud. kickedAll=§4Kõik mängijad on serverist välja visatud. kickExempt=§4Sa ei saa seda mängijat mängust välja visata. kickallCommandDescription=Viskab kõik mängijad serverist välja, välja arvatud viskaja enda. kickallCommandUsage=/ [põhjus] kickallCommandUsage1=/ [põhjus] +kickallCommandUsage1Description=Viskab kõik mängijad välja valikulise põhjusega kill=§6Hukkasid§c {0}§6. killCommandDescription=Tapab valitud mängija. killCommandUsage=/ killCommandUsage1=/ +killCommandUsage1Description=Tapab valitud mängija killExempt=§4Sa ei saa §c{0}§4 hukata. kitCommandDescription=Hangib soovitud abipaki või vaatab kõiki saadaolevaid abipakke. kitCommandUsage=/ [abipakk] [mängija] kitCommandUsage1=/ +kitCommandUsage1Description=Loetleb kõik saadaval olevad komplektid kitCommandUsage2=/ [mängija] +kitCommandUsage2Description=Annab määratud komplekti sulle või teisele mängijale, kui on määratud kitContains=§6Abipakk §c{0} §6sisaldab\: kitCost=\ §7§o({0})§r kitDelay=§m{0}§r @@ -557,6 +576,7 @@ kitReset=§6Abipaki §c{0}§6 mahajahtumine lähtestatud. kitresetCommandDescription=Lähtestab valitud abipaki mahajahtumisaja. kitresetCommandUsage=/ [mängija] kitresetCommandUsage1=/ [mängija] +kitresetCommandUsage1Description=Lähtestab teie või mõne muu mängija jaoks määratud komplekti mahajahtumise, kui see on määratud kitResetOther=§6Abipaki §c{0}§6 mahajahtumine lähtestatud mängijale §c{1}§6. kits=§6Abipakid\:§r {0} kittycannonCommandDescription=Viska plahvatav kassipoeg oma vastase suunas. @@ -566,6 +586,9 @@ leatherSyntax=§6Naha värvisüntaks\:§c color\:,, nt lightningCommandDescription=Thori võim. Löö välk sihitud kohta või mängijasse. lightningCommandUsage=/ [mängija] [võim] lightningCommandUsage1=/ [mängija] +lightningCommandUsage1Description=Lööb välku kas sinna kuhu vaatate või teisse mängijasse kui on määratud +lightningCommandUsage2=/ +lightningCommandUsage2Description=Lööb välku mängija suunas etteantud jõuga lightningSmited=§6Sind on löönud välk\! lightningUse=§6Lööd välgunoole mängijasse§c {0} listAfkTag=§7[Eemal]§r @@ -574,6 +597,7 @@ listAmountHidden=§6Võrgus on §c{0}§6 (§c{1}§6)/§c{2}§6 mängijat. listCommandDescription=Loetleb kõik võrgus olevad mängijad. listCommandUsage=/ [grupp] listCommandUsage1=/ [grupp] +listCommandUsage1Description=Loetleb kõik mängijad serveris või antud rühmas, kui see on määratletud listGroupTag=§6{0}§r\: listHiddenTag=§7[PEIDETUD]§r loadWarpError=§4Koolu {0} laadimisel esines viga. @@ -585,7 +609,13 @@ mailCleared=§6Postkast tühjendatud\! mailCommandDescription=Haldab üle-mängija, üle-serverilist postkastisüsteemi. mailCommandUsage=/ [read|clear|send [mängija] [sõnum]|sendall [sõnum]] mailCommandUsage1=/ read [lk] +mailCommandUsage1Description=Loeb teie kirja esimest (või täpsustatud) lehte mailCommandUsage2=/ clear +mailCommandUsage2Description=Puhastab meili +mailCommandUsage3=/ send +mailCommandUsage3Description=Saadab määratud mängijale antud sõnumi +mailCommandUsage4=/ sendall +mailCommandUsage4Description=Saadab kõikidele mängijatele antud sõnumi mailDelay=Saatsid viimase minuti jooksul liiga palju kirju. Maksimaalne kirjade saatmise arv\: {0} mailFormat=§6[§r{0}§6] §r{1} mailMessage={0} @@ -601,6 +631,7 @@ mayNotJailOffline=§4Sa ei tohi vangistada võrgust väljas olevaid mängijaid. meCommandDescription=Kirjeldab tegevust mängija kontekstis. meCommandUsage=/ meCommandUsage1=/ +meCommandUsage1Description=Kirjeldab tegevust meSender=mina meRecipient=mina minimumBalanceError=§4Miinimumsumma, mis saab kontol olla on {0}. @@ -620,6 +651,7 @@ months=kuud moreCommandDescription=Täidab käesoleva esemekuhja määratud suurusele või kui suurus pole määratud, maksimaalsele suurusele. moreCommandUsage=/ [kogus] moreCommandUsage1=/ [kogus] +moreCommandUsage1Description=Täidab käesoleva esemekuhja määratud suurusele või kui suurus pole määratud, maksimaalsele suurusele moreThanZero=§4Kogused peavad olema suuremad kui 0. motdCommandDescription=Vaatab päevasõnumit (Message Of The Day). motdCommandUsage=/ [peatükk] [leht] @@ -627,6 +659,7 @@ moveSpeed=§6Mängija §c{2} {0}§6kiiruseks on seatud§c {1} §6. msgCommandDescription=Saadab valitud mängijale privaatsõnumi. msgCommandUsage=/ msgCommandUsage1=/ +msgCommandUsage1Description=Saadab antud sõnumi privaatselt määratud mängijale msgDisabled=§6Sõnumite vastuvõtmine on §ckeelatud§6. msgDisabledFor=§6Sõnumite vastuvõtmine on §ckeelatud §6mängijale §c{0}§6. msgEnabled=§6Sõnumite vastuvõtmine on §clubatud§6. @@ -642,6 +675,9 @@ multiplePotionEffects=§4Sa ei saa sellele võlujoogile lisada rohkemat, kui ük muteCommandDescription=Vaigistab mängija või lubab tal rääkida. muteCommandUsage=/ [kestus] [põhjus] muteCommandUsage1=/ +muteCommandUsage1Description=Vaigistab määratud mängija jäädavalt või tühistab selle, kui ta on juba vaigistatud +muteCommandUsage2=/ [põhjus] +muteCommandUsage2Description=Vaigistab määratud mängija valitud ajaks valitud põhjusega mutedPlayer=§6Mängija§c {0} §6on vaigistatud. mutedPlayerFor=§6Mängija§c {0} §6on vaigistatud§c {1}§6. mutedPlayerForReason=§6Mängija§c {0} §6on vaigistatud§c {1}§6. Põhjus\: §c{2} @@ -656,15 +692,26 @@ muteNotifyReason=§6Mängija §c{0} §6vaigistas mängija §c{1}§6. Põhjus\: nearCommandDescription=Loetleb sinu lähedal või ümber olevad mängijad. nearCommandUsage=/ [mängijanimi] [raadius] nearCommandUsage1=/ +nearCommandUsage1Description=Loetleb kõik mängijad, kes asuvad vaikimisi läheduse raadiuses nearCommandUsage2=/ +nearCommandUsage2Description=Loetleb kõik mängijad teie antud raadiuses nearCommandUsage3=/ +nearCommandUsage3Description=Loetleb kõik mängijad, kes asuvad täpsustatud mängija vaikimisi läheduse raadiuses +nearCommandUsage4=/ +nearCommandUsage4Description=Loetleb kõik mängijad, kes asuvad täpsustatud mängija antud raadiuses nearbyPlayers=§6Läheduses olevad mängijad\:§r {0} negativeBalanceError=§4Kasutajal ei tohi olla negatiivne rahasumma. nickChanged=§6Hüüdnimi on muudetud. nickCommandDescription=Muuda enda või teise mängija hüüdnime. nickCommandUsage=/ [mängija] nickCommandUsage1=/ +nickCommandUsage1Description=Muudab sinu hüüdnime antud tekstiks nickCommandUsage2=/ off +nickCommandUsage2Description=Eemaldab sinu hüüdnime +nickCommandUsage3=/ +nickCommandUsage3Description=Muudab täpsustatud mängija hüüdnime antud tekstiks +nickCommandUsage4=/ off +nickCommandUsage4Description=Eemaldab antud mängija hüüdnime nickDisplayName=§4Sa pead lubama Essentialsi seadistustes change-displayname. nickInUse=§4See nimi on juba kasutusel. nickNameBlacklist=§4See hüüdnimi pole lubatud. @@ -717,6 +764,8 @@ noWarpsDefined=§6Kooldusid pole määratud. nuke=§5Olgu Jumal neile armuline. nukeCommandDescription=Olgu Jumal neile armuline. nukeCommandUsage=/ [mängija] +nukeCommandUsage1=/ [mängijad...] +nukeCommandUsage1Description=Saadab pommid kõikidele mängijatele või teisele mängijale, kui on täpsustatud numberRequired=Sinna läheb arv, rumaluke. onlyDayNight=/time toetab vaid valikuid day ja night. onlyPlayers=§4Käsklust §c{0}§4 saab kasutada ainult mängusiseselt. @@ -730,6 +779,7 @@ passengerTeleportFail=§4Sind ei saa teleportida, kuni kannad kaasreisijaid. payCommandDescription=Maksab teisele mängijale oma rahasummast. payCommandUsage=/ payCommandUsage1=/ +payCommandUsage1Description=Maksab määratud mängijale valitud hulgal raha payConfirmToggleOff=§6Sinult ei küsita enam maksete kinnitusi. payConfirmToggleOn=§6Sinult nüüd küsitakse maksete kinnitusi. payDisabledFor=§6Mängijale§c {0}§6 on keelatud maksete vastuvõtmine. @@ -743,6 +793,7 @@ payconfirmtoggleCommandUsage=/ paytoggleCommandDescription=Lülitab maksete vastuvõtu sisse/välja. paytoggleCommandUsage=/ [mängija] paytoggleCommandUsage1=/ [mängija] +paytoggleCommandUsage1Description=Lülitab sinu, või teisel mängijal, kui on täpsustatud, maksete vastuvõtmise pendingTeleportCancelled=§4Ootel teleporteerumiskutse on hüljatud. pingCommandDescription=Pong\! pingCommandUsage=/ @@ -768,7 +819,11 @@ possibleWorlds=§6Võimalikud maailmad on arvud vahemikus §c0§6-§c{0}§6. potionCommandDescription=Lisab võlujoogile kohandatud mõjud. potionCommandUsage=/ power\: duration\:> potionCommandUsage1=/ clear +potionCommandUsage1Description=Puhastab kõik efektid käeshoitaval võlujoogil potionCommandUsage2=/ apply +potionCommandUsage2Description=Lisab kõik võlujoogis olevad efektid sinule, ilma võlujooki tarvitamata +potionCommandUsage3=/ effect\: power\: duration\: +potionCommandUsage3Description=Lisab antud võlujoogi metaandmed käeshoitavale võlujoogile posX=§6X\: {0} (+ida <-> -lääs) posY=§6Y\: {0} (+üles <-> -alla) posYaw=§6Hor. pööre\: {0} (pööre) @@ -788,14 +843,33 @@ powerToolsEnabled=§6Kõik sinu võimutööriistad on lubatud. powertoolCommandDescription=Määrab käes hoitavale esemele käskluse. powertoolCommandUsage=/ [l\:|a\:|r\:|c\:|d\:][käsklus] [parameetrid] - {player} saab kasutada, asendamaks klõpsatud mängija nimega. powertoolCommandUsage1=/ l\: +powertoolCommandUsage1Description=Loetleb kõik käes oleva eseme tööriistad powertoolCommandUsage2=/ d\: +powertoolCommandUsage2Description=Kustutab kõik käes oleva eseme tööriistad powertoolCommandUsage3=/ r\: +powertoolCommandUsage3Description=Eemaldab antud käskluse käeshoitavalt esemelt +powertoolCommandUsage4=/ +powertoolCommandUsage4Description=Määrab tööriista käskluse käeshoitavale eseme antud käskluse +powertoolCommandUsage5=/ a\: +powertoolCommandUsage5Description=Lisab antud tööriista käskluse käeshoitavale esemele powertooltoggleCommandDescription=Lubab või keelab kõik määratud võimutööriistad. powertooltoggleCommandUsage=/ ptimeCommandDescription=Muudab mängija mängupoolset aega. Külmutamiseks lisa eesliide @. ptimeCommandUsage=/ [list|reset|day|night|dawn|17\:30|4pm|4000ticks] [mängija|*] +ptimeCommandUsage1=/ list [mängija]|*] +ptimeCommandUsage1Description=Loetleb mängija aja teie või teiste mängija(te) jaoks, kui see on täpsustatud +ptimeCommandUsage2=/ [mängija]|*] +ptimeCommandUsage2Description=Määrab aja sinule või teistele mängijale kui on etteantud aeg +ptimeCommandUsage3=/ reset [mängija|*] +ptimeCommandUsage3Description=Lähtestab aja sinu või teisele mängijale, kui on täpsustatud pweatherCommandDescription=Määra mängija ilma pweatherCommandUsage=/ [list|reset|storm|sun|clear] [mängija|*] +pweatherCommandUsage1=/ list [mängija]|*] +pweatherCommandUsage1Description=Loetleb mängija ilma sinu jaoks või teise mängija, kui on täpsustatud +pweatherCommandUsage2=/ [mängija]|*] +pweatherCommandUsage2Description=Määrab ilma sinule või teistele mängijale kui on etteantud ilm +pweatherCommandUsage3=/ reset [mängija|*] +pweatherCommandUsage3Description=Lähtestab ilma sinu või teisele mängijale, kui on täpsustatud pTimeCurrent=§6Mängija §c{0}§6 aeg on§c {1}§6. pTimeCurrentFixed=§6Mängija §c{0}§6 aeg on fikseeritud väärtuseks §c {1}§6. pTimeNormal=§6Mängija §c{0}§6 aeg on normaalne ja kattub serveri omaga. @@ -815,17 +889,21 @@ questionFormat=§2[Küsimus]§r {0} rCommandDescription=Vasta kiirelt viimasele mängijale, kes sulle sõnumi saatis. rCommandUsage=/ rCommandUsage1=/ +rCommandUsage1Description=Vastab viimasele mängijale, kes teile sõnumi saatis antud tekstiga radiusTooBig=§4Raadius on liiga suur\! Maksimaalne raadius on§c {0}§4. readNextPage=§6Järgmise lehe lugemiseks kirjuta§c /{0} {1}§6. realName=§f{0}§r§6 on §f{1} realnameCommandDescription=Kuva kasutaja kasutajanime hüüdnime alusel. realnameCommandUsage=/ realnameCommandUsage1=/ +realnameCommandUsage1Description=Kuva kasutaja kasutajanime hüüdnime alusel recentlyForeverAlone=§4Mängija {0} läks hiljuti võrgust välja. recipe=§6Retsept esemele §c{0}§6 (§c{1}§6/§c{2}§6) recipeBadIndex=Selle arvuga retsepti ei leitud. recipeCommandDescription=Kuvab, kuidas esemeid meisterdada. recipeCommandUsage=/ [number] +recipeCommandUsage1=/ [lehekülg] +recipeCommandUsage1Description=Näitab kuidas meisterdada antud eset recipeFurnace=§6Sulata\: §c{0}§6. recipeGrid=§c{0}X §6| §{1}X §6| §{2}X recipeGridItem=§c{0}X §6on §c{1} @@ -836,13 +914,19 @@ recipeShapeless=§6Kombineeri §c{0} recipeWhere=§6Kus\: {0} removeCommandDescription=Eemaldab sinu maailmast olemid. removeCommandUsage=/ [raadius|maailm] +removeCommandUsage1=/ [maailm] +removeCommandUsage1Description=Eemaldab kõik eluka tüübid selles maailmas või teises, kui on täpsustatud +removeCommandUsage2=/ [maailm] +removeCommandUsage2Description=Eemaldab antud eluka tüübi antud raadiuses praeguses maailmas või teises, kui on täpsustatud removed=§c {0} §6 olemit on eemaldatud. repair=§6Parandasid edukalt oma §c{0}§6. repairAlreadyFixed=§4See ese ei vaja parandamist. repairCommandDescription=Parandab ühe või kõikide esemete vastupidavuse. repairCommandUsage=/ [hand|all] repairCommandUsage1=/ +repairCommandUsage1Description=Parandab käeshoitava eseme repairCommandUsage2=/ all +repairCommandUsage2Description=Parandab sinu seljakotis kõik esemed repairEnchanted=§4Sul puudub loitsitud esemete parandamiseks luba. repairInvalidType=§4Seda eset ei saa parandada. repairNone=§4Polnud ühtegi eset, mis vajaksid parandamist. @@ -865,6 +949,7 @@ rest=§6Tunned end puhanuna. restCommandDescription=Saadab sind või valitud mängijat puhkama. restCommandUsage=/ [mängija] restCommandUsage1=/ [mängija] +restCommandUsage1Description=Lähtestab aja sinu või teisele mängijale, kui on täpsustatud restOther=§6Mängija§c {0} §6puhkab. returnPlayerToJailError=§4Mängija§c {0} §4 vanglasse tagasi saatmisel esines viga\: §c{1}§4\! rtoggleCommandDescription=Muuda, kas vastuse saajaks on viimane kirja saaja või viimane kirja saatja @@ -878,11 +963,20 @@ seenAccounts=§6Mängija on tuntud ka kui\:§c {0} seenCommandDescription=Kuvab mängija viimast väljalogimisaega. seenCommandUsage=/ seenCommandUsage1=/ +seenCommandUsage1Description=Näitab väljalogimise aega, keelu, vaigistamise ja UUID informatsiooni määratud mängija kohta seenOffline=§6Mängija§c {0} §6on olnud §4võrgust väljas§6 alates §c{1}§6. seenOnline=§6Mängija§c {0} §6on olnud §avõrgus§6 alates §c{1}§6. sellBulkPermission=§6Sul puudub hulgimüügi luba. sellCommandDescription=Müüb käes oleva eseme. +sellCommandUsage=/ <||hand|inventory|blocks> [kogus] +sellCommandUsage1=/ [kogus] +sellCommandUsage1Description=Müüb kõik(või antud koguses, kui on täpsustatud) antud eset sinu seljakotis +sellCommandUsage2=/ hand [kogus] +sellCommandUsage2Description=Müüb kõik(või antud koguses, kui on täpsustatud) käeshoitavat eset sellCommandUsage3=/ all +sellCommandUsage3Description=Müüb kõik võimalikud asjad sinu seljakotist +sellCommandUsage4=/ blocks [kogus] +sellCommandUsage4Description=Müüb kõik(või antud koguses, kui on täpsustatud) antud plokki sinu seljakotis sellHandPermission=§6Sul puudub käsimüügi luba. serverFull=Server on täis\! serverReloading=On suur tõenäosus, et laadid oma serverit hetkel uuesti. Kui see on tõsi, miks sa end vihkad? EssentialsX meeskond ei paku sulle tuge, kui kasutad käsklust /reload. @@ -899,12 +993,18 @@ setSpawner=§6Muutsid elukatekitaja tüübiks §c {0}§6. sethomeCommandDescription=Määrab su koduks praeguse asukoha. sethomeCommandUsage=/ [[mängija\:]nimi] sethomeCommandUsage1=/ +sethomeCommandUsage1Description=Seadistab sinu kodu antud nimega sinu asukohta sethomeCommandUsage2=/\: +sethomeCommandUsage2Description=Seadistab täpsustatud mängija kodu antud nimega sinu asukohta setjailCommandDescription=Loob siia vangla nimega [vanglanimi]. setjailCommandUsage=/ setjailCommandUsage1=/ +setjailCommandUsage1Description=Seadistab vangla antud nimega sinu asukohta settprCommandDescription=Määra juhusliku teleporteerumise koht ja parameetrid. settprCommandUsage=/ [center|minrange|maxrange] [väärtus] +settprCommandUsage1=/ center +settprCommandUsage1Description=Seadistab suvalise teleporteerumise keskpaiga sinu asukohta +settprCommandUsage2=/ minrange settpr=§6Juhusliku teleporteerumise keskkoht määratud. settprValue=§6Juhusliku teleporteerumise §c{0}§6 väärtuseks on määratud §c{1}§6. setwarpCommandDescription=Loob uue koolu. @@ -1009,6 +1109,7 @@ tempbanExemptOffline=§4Sa ei tohi ajutiselt blokeerida võrgust väljas olevaid tempbanJoin=Sa oled sellest serverist {0} blokeeritud. Põhjus\: {1} tempBanned=§cSind blokeeriti sellest serverist ajutiselt§r {0}\:\n§r{2} tempbanCommandDescription=Blokeerib mängija ajutiselt. +tempbanCommandUsage1=/ [põhjus] tempbanipCommandDescription=Blokeerib IP-aadressi ajutiselt. thunder=§6Sa§c {0} §6äikeseliseks oma maailmas. thunderCommandDescription=Luba/keela äike. @@ -1053,46 +1154,60 @@ tpacancelCommandUsage2=/ tpacceptCommandDescription=Võtab teleporteerumiskutse vastu. tpacceptCommandUsage=/ [teinemängija] tpacceptCommandUsage1=/ +tpacceptCommandUsage1Description=Võtab teleporteerumiskutse vastu tpahereCommandDescription=Taotle valitud mängijal sinu juurde teleporteerumist. tpahereCommandUsage=/ tpahereCommandUsage1=/ +tpahereCommandUsage1Description=Taotle valitud mängijal sinu juurde teleporteerumist tpallCommandDescription=Teleporteeri kõik võrgus olevad mängijad teise mängija juurde. tpallCommandUsage=/ [mängija] tpallCommandUsage1=/ [mängija] +tpallCommandUsage1Description=Teleporteerib kõik mängijad sinu juurde, või teine mängija, kui on täpsustatud tpautoCommandDescription=Võta automaatselt teleporteerumiskutsed vastu. tpautoCommandUsage=/ [mängija] tpautoCommandUsage1=/ [mängija] +tpautoCommandUsage1Description=Lülitab teleporteerumise kutsete automaatse vastuvõtmise sinule või teisele mängijale, kui on täpsustatud tpdenyCommandDescription=Keeldub teleporteerumiskutsest. tpdenyCommandUsage=/ tpdenyCommandUsage1=/ +tpdenyCommandUsage1Description=Eirab teleporteerumiskutset tphereCommandDescription=Teleporteeri mängija enda juurde. tphereCommandUsage=/ tphereCommandUsage1=/ +tphereCommandUsage1Description=Teleporteerib määratud mängija sinu juurde tpoCommandDescription=Teleporteerumise sundimine /tptoggle jaoks. tpoCommandUsage=/ [teinemängija] tpoCommandUsage1=/ +tpoCommandUsage1Description=Teleporteerib valitud mängija sinu juurde, eirates tema seadistust +tpoCommandUsage2Description=Teleporteerib esimesena määratud mängija teise juurde, eirates nende seadistusi tpofflineCommandDescription=Teleporteeru mängija viimase teadaoleva asukoha juurde enne välja logimist tpofflineCommandUsage=/ tpofflineCommandUsage1=/ +tpofflineCommandUsage1Description=Telepordib teid määratud nimega mängija väljalogimise asukohta tpohereCommandDescription=Siia teleporteerimise sundimine /tptoggle jaoks. tpohereCommandUsage=/ tpohereCommandUsage1=/ +tpohereCommandUsage1Description=Teleporteerib valitud mängija sinu juurde, eirates tema seadistust tpposCommandDescription=Teleporteeru koordinaatidele. tpposCommandUsage=/ [hor. pööre] [vert. pööre] [maailm] tpposCommandUsage1=/ [hor. pööre] [vert. pööre] [maailm] +tpposCommandUsage1Description=Teleporteerib teid täpsustatud asukohta valikulise hor. pööre, vert. pööre ja/või maailma tprCommandDescription=Teleporteeru juhuslikult. tprCommandUsage=/ tprCommandUsage1=/ +tprCommandUsage1Description=Teleporteerib teid juhuslikku asukohta tprSuccess=§6Teleporteerumine juhuslikku asukohta... tps=§6Hetkel on serveris {0} tiksu/s tptoggleCommandDescription=Blokeerib kõik teleporteerimise viisid. tptoggleCommandUsage=/ [mängija] [on|off] tptoggleCommandUsage1=/ [mängija] +tptoggleCommandUsageDescription=Lülitab teleporteerumise kutsete vastuvõtmise sinule või teisele mängijale, kui on täpsustatud tradeSignEmpty=§4Kauplemissildil pole sulle midagi pakkuda. tradeSignEmptyOwner=§4Siit kauplemissildilt pole midagi korjata. treeCommandDescription=Tekitab vaadatavasse kohta puu. treeCommandUsage=/ treeCommandUsage1=/ +treeCommandUsage1Description=Tekitab puu täpsustatud kohta, kuhu vaatad treeFailure=§4Puu genereerimisel esines viga. Proovi uuesti muru või mulla peal. treeSpawned=§6Puu on tekitatud. true=§atrue§r @@ -1105,15 +1220,23 @@ unableToSpawnMob=§4Eluka tekitamisel esines viga. unbanCommandDescription=Eemaldab valitud mängija blokeeringu. unbanCommandUsage=/ unbanCommandUsage1=/ +unbanCommandUsage1Description=Eemaldab valitud mängija blokeeringu unbanipCommandDescription=Eemaldab valitud IP-aadressi blokeeringu. unbanipCommandUsage=/ unbanipCommandUsage1=/ +unbanipCommandUsage1Description=Eemaldab valitud IP-aadressi blokeeringu unignorePlayer=§6Sa ei ignoreeri enam mängijat§c {0}§6. unknownItemId=§4Tundmatu eseme ID\:§r {0}§4. unknownItemInList=§4Tundmatu ese {0} nimekirjas {1}. unknownItemName=§4Tundmatu esemenimi\: {0}. unlimitedCommandDescription=Võimaldab esemeid piiramatult asetada. unlimitedCommandUsage=/ [mängija] +unlimitedCommandUsage1=/ list [mängija] +unlimitedCommandUsage1Description=Kuvab nimekirja lõpmatutest asjadest sinule või teisele mängijale kui on täpsustatud +unlimitedCommandUsage2=/ [mängija] +unlimitedCommandUsage2Description=Lülitab eseme lõpmatuse sinule või teisele mängijale kui on täpsustatud +unlimitedCommandUsage3=/ clear [mängija] +unlimitedCommandUsage3Description=Puhastab kõik lõpmatud asjad sinult või teiselt mängijalt kui on täpsustatud unlimitedItemPermission=§4Sul puudub luba lõpmatu eseme §c{0}§4 jaoks. unlimitedItems=§6Lõpmatud esemed\:§r unmutedPlayer=§6Mängija§c {0} §6vaigistus eemaldatud. @@ -1142,6 +1265,7 @@ vanish=§6Haihtumine on mängijale {0} {1}§6 vanishCommandDescription=Peida end teiste mängijate eest. vanishCommandUsage=/ [mängija] [on|off] vanishCommandUsage1=/ [mängija] +vanishCommandUsage1Description=Lülitab enda või valikuliselt teise mängija haihtumise vanished=§6Oled nüüd tavakasutajatele täiesti nähtamatu ning mängusiseste käskluste eest varjatud. versionCheckDisabled=§6Uuenduste kontrollimine on seadistustes keelatud. versionCustom=§6Versiooni kontrollimine ebaõnnestus\! Käsitsi ehitatud? Redaktsiooni info\: §c{0}§6. @@ -1171,11 +1295,15 @@ walking=kõnnib warpCommandDescription=Loetleb kõik koolud või kooldub valitud asukohta. warpCommandUsage=/ [mängija] warpCommandUsage1=/ [lk] +warpCommandUsage1Description=Annab nimekirja kõikidest lõimudest esimesel või täpsustatud leheküljel +warpCommandUsage2=/ [mängija] +warpCommandUsage2Description=Telepordib teid või määratud nimega mängija antud lõimu warpDeleteError=§4Koolufaili kustutamisel esines probleem. warpInfo=§6Koolu§c {0}§6 teave\: warpinfoCommandDescription=Leiab valitud koolu asukohateabe. warpinfoCommandUsage=/ warpinfoCommandUsage1=/ +warpinfoCommandUsage1Description=Annab informatsiooni antud lõimu kohta warpingTo=§6Kooldud asukohta§c {0}§6. warpList={0} warpListPermission=§4Sul puudub luba koolunimekirja vaatamiseks. @@ -1185,6 +1313,8 @@ warps=§6Koolud\:§r {0} warpsCount=§6Kokku on§c {0} §6kooldu. Kuvan lehte §c{1}§6/§c{2}§6. weatherCommandDescription=Määrab ilma. weatherCommandUsage=/ [kestus] +weatherCommandUsage1=/ [kestus] +weatherCommandUsage1Description=Seadistab ilma antud tüübiks valikulise kestusega warpSet=§6Koold§c {0} §6on määratud. warpUsePermission=§4Sul puudub luba selle koolu kasutamiseks. weatherInvalidWorld=Maailma nimega {0} ei leitud\! @@ -1201,6 +1331,7 @@ whoisBanned=§6 - Blokeeritud\:§r {0} whoisCommandDescription=Uuri hüüdnime alusel välja kasutajanimi. whoisCommandUsage=/ whoisCommandUsage1=/ +whoisCommandUsage1Description=Annab üldise informatsiooni täpsustatud mängija kohta whoisExp=§6 - Kogemuspunkte\:§r {0} (tase {1}) whoisFly=§6 - Lennurežiim\:§r {0} ({1}) whoisSpeed=§6 - Kiirus\:§r {0} @@ -1226,10 +1357,20 @@ workbenchCommandUsage=/ worldCommandDescription=Vaheta maailmate vahel. worldCommandUsage=/ [maailm] worldCommandUsage1=/ +worldCommandUsage1Description=Teleporeerib teid vastavasse asukohta, kas põrgus või maailmas +worldCommandUsage2=/ +worldCommandUsage2Description=Teleporteerib teie asukohta antud maailmas worth=§aEseme {0} kuhi on väärt §c{1}§a ({2} ese(t) hinnaga {3} tükk) worthCommandDescription=Arvutab käes olevate või määratud esemete väärtuse. worthCommandUsage=/ <||hand|inventory|blocks> [-][kogus] +worthCommandUsage1=/ [kogus] +worthCommandUsage1Description=Kontrollib kõigi(või antud koguses, kui on täpsustatud) antud eseme väärtust teie seljakotis +worthCommandUsage2=/ hand [kogus] +worthCommandUsage2Description=Kontrollib kõigi(või antud koguses, kui on täpsustatud) käes hoitava eseme väärtust teie seljakotis worthCommandUsage3=/ all +worthCommandUsage3Description=Kontrollib kõikide võimalike esemete väärtust teie seljakotis +worthCommandUsage4=/ blocks [kogus] +worthCommandUsage4Description=Kontrollib kõigi(või antud koguses, kui on täpsustatud) antud plokkide väärtust teie seljakotis worthMeta=§aEseme {0} kuhi metaandmetega {1} on väärt §c{2}§a ({3} ese(t) hinnaga {4} tükk) worthSet=§6Eseme väärtus määratud year=aasta diff --git a/Essentials/src/main/resources/messages_eu.properties b/Essentials/src/main/resources/messages_eu.properties index ce211fddf56..a02956e2063 100644 --- a/Essentials/src/main/resources/messages_eu.properties +++ b/Essentials/src/main/resources/messages_eu.properties @@ -2,18 +2,26 @@ #version: ${full.version} # Single quotes have to be doubled: '' # by: +action=§5* {0} §5{1} addedToAccount=§a{0} zure kontura gehitu dira. addedToOthersAccount=§a{0} gehituak {1}§a-en kontura. Balantze berria\: {2} adventure=abentura +afkCommandDescription=Teklatutik urrun zaudela esaten dute. +afkCommandUsage=/ [jokalaria/mezua...] +afkCommandUsage1=/ [Mezua] +afkCommandUsage2=/ [mezua] alertBroke=puskatu\: +alertFormat=§3[{0}] §r {1} §6 {2} at\: {3} alertPlaced=jarri\: alertUsed=erabili\: alphaNames=§4Jokalari izenek letrak eta zenbakiak bakarrik izan ditzakete. antiBuildBreak=§4Ez daukazu hemen §c {0} §4 blokerik puskatzeko baimenik. antiBuildCraft=§4Ez daukazu §c {0} §4 sortzeko baimenik. antiBuildDrop=§4Ez daukazu §c {0} §4 botatzeko baimenik. +antiBuildInteract=§4Ez duzu §c {0}§4-rekin interaktzioa jartzeko permisiorik. antiBuildPlace=§4Ez daukazu hemen §c {0} §4 blokerik jartzeko baimenik. antiBuildUse=§4Ez daukazu§c {0}§4 erabiltzeko baimenik. +antiochCommandUsage=/ [Mezua] backupFinished=§6Segurtasun kopia ondo burutu da. backupStarted=§6Segurtasun kopia burutzea hasi da. backUsageMsg=§6Aurreko kokalekura itzultzen. diff --git a/Essentials/src/main/resources/messages_fi.properties b/Essentials/src/main/resources/messages_fi.properties index 8fddcba98c8..ec102b0bcb5 100644 --- a/Essentials/src/main/resources/messages_fi.properties +++ b/Essentials/src/main/resources/messages_fi.properties @@ -323,6 +323,9 @@ homeConfirmation=§6Sinulla on jo koti nimeltä §c{0}§6\!\nKorvataksesi edelli homeSet=§6Koti asetettu nykyiseen sijaintiin. hour=tunti hours=tuntia +iceCommandUsage=/ [pelaaja] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Jättää huomiotta tai poistaa muilta pelaajilta eston. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_fil_PH.properties b/Essentials/src/main/resources/messages_fil_PH.properties index eca6d6f73c7..823a4ef755e 100644 --- a/Essentials/src/main/resources/messages_fil_PH.properties +++ b/Essentials/src/main/resources/messages_fil_PH.properties @@ -318,6 +318,9 @@ homeConfirmation=§6Mayroon ka nang bahay na tawag §c{0}§6\!\nKung gusto mong homeSet=§6Itinakda ang iyong bagong bahay sa kasalukuyang locasyon. hour=oras hours=oras +iceCommandUsage=/ [manlalaro] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Pwede mong hindi i-pansin mo mag-pansin ng mga iba pang manlalaro dito gamit ang utos na ito.\n\n§4§lPaalala\: §r§4Magbabawal ka ng mga manlalaro ng tinutukoy sa pamamagitan ng chat gamit ang utos na ito. Ibig sabihin noon hindi ka makakasalita sa kanila. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_fr.properties b/Essentials/src/main/resources/messages_fr.properties index 5e25a494399..93ac8cced45 100644 --- a/Essentials/src/main/resources/messages_fr.properties +++ b/Essentials/src/main/resources/messages_fr.properties @@ -173,11 +173,11 @@ consoleName=Console cooldownWithMessage=§cTemps d''attente \: {0} coordsKeyword={0}, {1}, {2} couldNotFindTemplate=§4Impossible de trouver le modèle {0} -createdKit=§6Created kit §c{0} §6with §c{1} §6entries and delay §c{2} +createdKit=§6Kit §c{0} §6créé avec §c{1} §6entrée(s) et un délai de §c{2} createkitCommandDescription=Créer un kit en jeu \! createkitCommandUsage=/ createkitCommandUsage1=/ -createkitCommandUsage1Description=Crée un kit avec le nom donné et le délai indiquée +createkitCommandUsage1Description=Crée un kit avec le nom donné et le délai indiqué createKitFailed=§4Erreur lors de la création du kit {0}. createKitSeparator=§m----------------------- createKitSuccess=§6Kit créé \: §f{0}\n§6Délai \: §f{1}\n§6Lien \: §f{2}\n§6Copiez le contenu du lien ci-dessus dans votre fichier kits.yml. @@ -191,29 +191,33 @@ customtextCommandUsage=/ - Défini dans le fichier bukkit.yml day=jour days=jours defaultBanReason=Le marteau du bannissement a frappé \! +deletedHomes=Toutes les résidences ont été supprimées. +deletedHomesWorld=Toutes les résidences dans {0} ont été supprimées. deleteFileError=Impossible de supprimer le fichier \: {0} deleteHome=§7La résidence {0} a été supprimée. deleteJail=§7La prison {0} a été supprimée. deleteKit=§6Le kit §c{0} §6a été supprimé. deleteWarp=§6Le point de téléportation§c {0} §6a été supprimé. +deletingHomes=Suppression de toutes les résidences... +deletingHomesWorld=Suppression de toutes les résidences dans {0}... delhomeCommandDescription=Supprime une résidence. delhomeCommandUsage=/ [joueur\:] delhomeCommandUsage1=/ -delhomeCommandUsage1Description=Supprimer le home avec le nom donnée +delhomeCommandUsage1Description=Supprime la résidence avec le nom donné delhomeCommandUsage2=/ \: -delhomeCommandUsage2Description=Supprimer un home précis d''un joueur spécifié +delhomeCommandUsage2Description=Supprime la résidence du joueur spécifié avec le nom donné deljailCommandDescription=Supprime une prison. deljailCommandUsage=/ deljailCommandUsage1=/ -deljailCommandUsage1Description=Supprime la prison spécifié +deljailCommandUsage1Description=Supprime la prison avec le nom donné delkitCommandDescription=Supprime le kit spécifié. delkitCommandUsage=/ delkitCommandUsage1=/ -delkitCommandUsage1Description=Supprimé le kit spécifié +delkitCommandUsage1Description=Supprime le kit avec le nom spécifié delwarpCommandDescription=Supprime le point de téléportation spécifié. delwarpCommandUsage=/ delwarpCommandUsage1=/ -delwarpCommandUsage1Description=Supprimé le warp spécifié +delwarpCommandUsage1Description=Supprimé le warp avec le nom spécifié deniedAccessCommand=L''accès à la commande a été refusé pour {0}. denyBookEdit=§4Vous ne pouvez pas éditer ce livre. denyChangeAuthor=§4Vous ne pouvez pas changer l''auteur de ce livre. @@ -239,15 +243,19 @@ east=E ecoCommandDescription=Gère l''économie du serveur. ecoCommandUsage=/ ecoCommandUsage1=/ give -ecoCommandUsage1Description=Donnez au joueur spécifié un montant d''argent choisis +ecoCommandUsage1Description=Donne au joueur spécifié la somme d''argent spécifié ecoCommandUsage2=/ take +ecoCommandUsage2Description=Retire la somme d''argent spécifié du joueur spécifié ecoCommandUsage3=/ set +ecoCommandUsage3Description=Définit le solde du joueur spécifié au montant spécifié ecoCommandUsage4=/ reset +ecoCommandUsage4Description=Réinitialise le solde du joueur spécifié au solde de départ du serveur editBookContents=§eVous pouvez maintenant éditer le contenu de ce livre. enabled=activé enchantCommandDescription=Enchante l''objet que l''utilisateur tient en main. enchantCommandUsage=/ [niveau] enchantCommandUsage1=/ [niveau] +enchantCommandUsage1Description=Enchante l''objet tenu en main avec l''enchantement spécifié à un niveau facultatif enableUnlimited=&6Don d''une quantité illimitée de§c {0} §6à §c{1}§6. enchantmentApplied=§6L''enchantement§c {0} §6a été appliqué à l''objet en main. enchantmentNotFound=§4Enchantement introuvable \! @@ -257,7 +265,9 @@ enchantments=§6Enchantements \:§r {0} enderchestCommandDescription=Permet de voir le contenu d''un coffre de l''ender. enderchestCommandUsage=/ [joueur] enderchestCommandUsage1=/ +enderchestCommandUsage1Description=Ouvre votre coffre de l''Ender enderchestCommandUsage2=/ +enderchestCommandUsage2Description=Ouvre le coffre de l''Ender du joueur ciblé errorCallingCommand=Erreur en appelant la commande /{0} errorWithMessage=§cErreur \:§4 {0} essentialsCommandDescription=Recharge EssentialsX. @@ -271,6 +281,11 @@ essentialsCommandUsage3Description=Donne des informations sur les commandes qu'' essentialsCommandUsage4=/ debug essentialsCommandUsage4Description=Active/désactive le "mode debug" d''Essentials essentialsCommandUsage5=/ reset +essentialsCommandUsage5Description=Réinitialise les données utilisateur du joueur spécifié +essentialsCommandUsage6=/ cleanup +essentialsCommandUsage6Description=Nettoie les anciennes données de joueur +essentialsCommandUsage7=/ homes +essentialsCommandUsage7Description=Gère les résidences de joueurs essentialsHelp1=Le fichier est corrompu et Essentials ne peut l''ouvrir. Essentials est désormais désactivé. Si vous ne pouvez corriger vous-même le problème, rendez-vous sur https\://essentialsx.net/community.html essentialsHelp2=Le fichier est corrompu et Essentials ne peut pas l''ouvrir. Essentials est maintenant désactivé. Si vous ne pouvez pas réparer le fichier vous-même, tapez /essentialshelp dans le jeu ou rendez-vous sur http\://tiny.cc/EssentialsChat essentialsReload=§6Essentials§c {0} §6a été rechargé. @@ -278,14 +293,18 @@ exp=§c{0} §6a§c {1} §6exp (niveau§c {2}§6) et a besoin de§c {3} §6pour m expCommandDescription=Donner, définir ou vérifier l''expérience d''un joueur. expCommandUsage=/ [reset|show|set|give] [nom du joueur [quantité]] expCommandUsage1=/ give +expCommandUsage1Description=Donne au joueur ciblé la quantité d''exp spécifiée expCommandUsage2=/ set +expCommandUsage2Description=Définit l''exp du joueur ciblé au montant spécifié expCommandUsage3=/ show +expCommandUsage4Description=Affiche la quantité d''exp que le joueur ciblé possède expCommandUsage5=/ reset expCommandUsage5Description=Réinitialise l’exp du joueur spécifié à 0 expSet=§c{0} §6a maintenant§c {1} §6exp. extCommandDescription=Éteint les joueurs enflammés. extCommandUsage=/ [joueur] extCommandUsage1=/ [joueur] +extCommandUsage1Description=Éteignez-vous ou éteignez un autre joueur si spécifié extinguish=§6Vous avez arrêté de brûler. extinguishOthers=§6Vous avez éteint le feu sur {0}§6. failedToCloseConfig=Échec de la fermeture de la configuration {0}. @@ -296,24 +315,34 @@ feed=§7Vous avez été rassasié(e). feedCommandDescription=Satisfait la faim. feedCommandUsage=/ [joueur] feedCommandUsage1=/ [joueur] +feedCommandUsage1Description=Vous rassasie complètement ou rassasie un autre joueur si spécifié feedOther=§6Vous avez rassasié §c{0}§6. fileRenameError=Échec du renommage du fichier {0} \! fireballCommandDescription=Lancer une boule de feu ou d''autres projectiles assortis. fireballCommandUsage=/ [fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident] [vitesse] fireballCommandUsage1=/ +fireballCommandUsage1Description=Lance une boule de feu normale depuis votre emplacement fireballCommandUsage2=/ [vitesse] +fireballCommandUsage2Description=Lance le projectile spécifié depuis votre emplacement, avec une vitesse facultative fireworkColor=§4Vous devez ajouter une couleur au feu d''artifice pour pouvoir lui ajouter un effet. fireworkCommandDescription=Permet de modifier un stack de feux d''artifice. fireworkCommandUsage=/ <|power [quantité]|clear|fire [quantité]> fireworkCommandUsage1=/ clear +fireworkCommandUsage1Description=Efface tous les effets de vos feux d''artifice tenus en main fireworkCommandUsage2=/ power +fireworkCommandUsage2Description=Définit la puissance du feu d''artifice tenu en main fireworkCommandUsage3=/ fire [quantité] +fireworkCommandUsage3Description=Lance soit une, soit la quantité spécifiée, de copies du feu d''artifice tenu en main fireworkCommandUsage4=/ +fireworkCommandUsage4Description=Ajoute l''effet spécifié au feu d''artifice tenu en main fireworkEffectsCleared=§6Les effets ont été retirés du stack en main. fireworkSyntax=§6Paramètres du feu d''artifice\:§c color\: [fade\:] [shape\:] [effect\:]\n§6Pour utiliser plusieurs couleurs/effets, séparez les valeurs avec des virgules\: §cred,blue,pink\n§6Formes\:§c star, ball, large, creeper, burst §6Effets \:§c trail, twinkle. +fixedHomes=Résidences invalides supprimées. +fixingHomes=Suppression des résidences invalides... flyCommandDescription=Décollez et volez \! flyCommandUsage=/ [joueur] [on|off] flyCommandUsage1=/ [joueur] +flyCommandUsage1Description=Active/désactive le vol pour vous-même ou un autre joueur si spécifié flying=en vol flyMode=§7Fly mode {0} pour {1} défini. foreverAlone=§4Vous n''avez personne à qui répondre. @@ -325,6 +354,7 @@ gameModeInvalid=§4Vous devez spécifier un joueur/mode valide. gamemodeCommandDescription=Changer le mode de jeu du joueur. gamemodeCommandUsage=/ [joueur] gamemodeCommandUsage1=/ [joueur] +gamemodeCommandUsage1Description=Définit votre mode de jeu ou celui d''un autre joueur si spécifié gcCommandDescription=Rapports sur la mémoire, le temps de fonctionnement et les informations sur les ticks. gcCommandUsage=/ gcfree=§6Mémoire libre \: §c{0} §6Mo. @@ -335,9 +365,11 @@ geoipJoinFormat=§6Joueur §c{0} §6vient de §c{1}§6. getposCommandDescription=Récupère vos coordonnées actuelles ou celles d''un joueur. getposCommandUsage=/ [joueur] getposCommandUsage1=/ [joueur] +getposCommandUsage1Description=Obtient vos coordonnées ou celles d''un autre joueur si spécifié giveCommandDescription=Donner un objet à un joueur. giveCommandUsage=/ [quantité [itemmeta...]] giveCommandUsage1=/ [quantité] +giveCommandUsage1Description=Donne au joueur ciblé 64 (ou le montant indiqué) de l''objet spécifié giveCommandUsage2=/ giveCommandUsage2Description=Donne au joueur indiqué la quantité spécifiée de l''objet spécifié avec les métadonnées fournies geoipCantFind=§6Le joueur§c {0} §6vient d''un §apays inconnu§6. @@ -349,6 +381,7 @@ givenSkull=§6Vous avez reçu la tête de §c{0}§6. godCommandDescription=Active vos pouvoirs divins. godCommandUsage=/ [joueur] [on|off] godCommandUsage1=/ [joueur] +godCommandUsage1Description=Active/désactive le mode dieu pour vous ou pour un autre joueur si spécifié giveSpawn=§c {0} {1} §6ont été donnés à §c {2}§6. giveSpawnFailure=§4Pas assez d''espace dans l''inventaire, §c{0} §c{1} §4n''ont pas pu être donnés. godDisabledFor=§cdésactivé§6 pour \:§c {0} @@ -362,7 +395,9 @@ hatArmor=§cErreur, vous ne pouvez pas utiliser cet item comme chapeau \! hatCommandDescription=Obtenez un nouveau couvre-chef. hatCommandUsage=/ [remove] hatCommandUsage1=/ +hatCommandUsage1Description=Définit l''objet tenu en main comme votre chapeau hatCommandUsage2=/ remove +hatCommandUsage2Description=Enlève votre chapeau actuel hatCurse=§4Vous ne pouvez pas enlever un chapeau avec la malédiction du lien éternel \! hatEmpty=§4Vous ne portez pas de chapeau. hatFail=§4Vous devez avoir quelque chose à porter dans votre main. @@ -373,6 +408,7 @@ heal=§6Vous avez été soigné(e). healCommandDescription=Vous soigne ou soigne un joueur donné. healCommandUsage=/ [joueur] healCommandUsage1=/ [joueur] +healCommandUsage1Description=Vous soigne ou soigne un autre joueur si spécifié healDead=§4Vous ne pouvez pas soigner quelqu''un qui est mort \! healOther=§7{0} a été soigné. helpCommandDescription=Affiche une liste des commandes disponibles. @@ -386,6 +422,7 @@ helpPlugin=§4{0}§f \: Aide Plugin \: /help {1} helpopCommandDescription=Envoyer un message aux administrateurs en ligne. helpopCommandUsage=/ helpopCommandUsage1=/ +helpopCommandUsage1Description=Envoie le message donné à tous les administrateurs en ligne holdBook=§4Vous ne tenez pas un livre dans lequel on peut écrire. holdFirework=§4Vous devez tenir un feu d''artifice pour lui ajouter des effets. holdPotion=§4Vous devez tenir une potion pour lui ajouter des effets. @@ -393,15 +430,21 @@ holeInFloor=§4Il y a un trou dans le sol \! homeCommandDescription=Téléporter à votre domicile. homeCommandUsage=/ [joueur\:][nom] homeCommandUsage1=/ +homeCommandUsage1Description=Vous téléporte à votre résidence portant le nom spécifié homeCommandUsage2=/ \: +homeCommandUsage2Description=Vous téléporte à la résidence du joueur spécifié avec le nom donné homes=§6Résidences \:§r {0} homeConfirmation=§6Vous avez déjà une résidence nommée §c{0} §6\!\nPour écraser votre résidence existante, tapez la commande à nouveau. homeSet=§7Résidence définie. hour=heure hours=heures +iceCommandUsage=/ [joueur] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Ignorer ou ne pas ignorer les autres joueurs. ignoreCommandUsage=/ ignoreCommandUsage1=/ +ignoreCommandUsage1Description=Ignorer ou débloquer le joueur spécifié ignoredList=§6Ignoré(s) \:§r {0} ignoreExempt=§4Vous ne pouvez pas ignorer ce joueur. ignorePlayer=Vous ignorez désormais {0}. @@ -436,6 +479,7 @@ inventoryClearingStack=§c{0} §c{1} §6ont été supprimés de l''inventaire de invseeCommandDescription=Voir l''inventaire des autres joueurs. invseeCommandUsage=/ invseeCommandUsage1=/ +invseeCommandUsage1Description=Ouvre l''inventaire du joueur spécifié is=est isIpBanned=§6L''adresse IP §c{0} §6est bannie. internalError=§cUne erreur interne est survenue lors de l''exécution de cette commande. @@ -443,14 +487,19 @@ itemCannotBeSold=Cet objet ne peut être vendu au serveur. itemCommandDescription=Fait apparaître un objet. itemCommandUsage=/ [quantité [itemmeta...]] itemCommandUsage1=/ [quantité] +itemCommandUsage1Description=Vous donne une pile complète (ou le montant spécifié) de l''objet spécifié itemCommandUsage2=/ +itemCommandUsage2Description=Vous donne la quantité spécifiée de l''objet spécifié avec les métadonnées données itemId=§6ID \:§c {0} itemloreClear=§7Vous avez effacé la description de cet objet. itemloreCommandDescription=Modifie la description d''un objet. itemloreCommandUsage=/ [texte|ligne] [texte] itemloreCommandUsage1=/ add [texte] +itemloreCommandUsage1Description=Ajoute le texte donné à la fin de la description de l''objet tenu en main itemloreCommandUsage2=/ set +itemloreCommandUsage2Description=Définit la ligne spécifiée de la description de l''objet tenu en main au texte donné itemloreCommandUsage3=/ +itemloreCommandUsage3Description=Efface la description de l''objet tenu en main itemloreInvalidItem=§cVous devez tenir un objet pour modifier sa description. itemloreNoLine=§4Il n''y à pas de texte sur la ligne §c{0}§4 de la description de l''objet que vous tenez en mains. itemloreNoLore=§4L''objet que vous tenez n''a pas de description. @@ -462,7 +511,9 @@ itemnameClear=§6Vous avez effacé le nom de cet objet. itemnameCommandDescription=Nomme un objet. itemnameCommandUsage=/ [nom] itemnameCommandUsage1=/ +itemnameCommandUsage1Description=Efface le nom de l''élément tenu en main itemnameCommandUsage2=/ +itemnameCommandUsage2Description=Définit le nom de l''élément tenu en main au texte donné itemnameInvalidItem=§cVous devez tenir un objet pour le renommer. itemnameSuccess=§6Vous avez renommé l''objet tenu en "§c{0}§6". itemNotEnough1=§4Vous n''avez pas une quantité suffisante de cet objet pour le vendre. @@ -479,6 +530,7 @@ itemType=§6Objet \:§c {0} itemdbCommandDescription=Recherche un objet. itemdbCommandUsage=/ itemdbCommandUsage1=/ +itemdbCommandUsage1Description=Recherche l''objet donné dans la base de données jailAlreadyIncarcerated=§cJoueur déjà emprisonné \: {0} jailList=§6Prisons \:§r {0} jailMessage=§cVous avez commis un crime, vous en payez le prix. @@ -487,6 +539,7 @@ jailReleased=§6Le joueur §c{0}§6 a été libéré. jailReleasedPlayerNotify=§6Vous avez été libéré(e) \! jailSentenceExtended=Durée d''emprisonnement rallongée de \: {0} jailSet=§6La prison§c {0} §6a été créée. +jailWorldNotExist=§4Le monde de cette prison n''existe pas. jumpEasterDisable=§6Mode assistant de vol désactivé. jumpEasterEnable=§6Mode assistant de vol activé. jailsCommandDescription=Liste toutes les prisons. @@ -497,21 +550,26 @@ jumpError=Ça aurait pu faire mal au cerveau de votre ordinateur. kickCommandDescription=Expulse un joueur spécifié avec une raison. kickCommandUsage=/ [raison] kickCommandUsage1=/ [raison] +kickCommandUsage1Description=Expulse le joueur spécifié avec un motif optionnel kickDefault=Expulsé(e) du serveur. kickedAll=§4Tous les joueurs ont été expulsés du serveur. kickExempt=§4Vous ne pouvez pas expulser ce joueur. kickallCommandDescription=Expulse tous les joueurs du serveur sauf l''émetteur de la commande. kickallCommandUsage=/ [raison] kickallCommandUsage1=/ [raison] +kickallCommandUsage1Description=Expulse tous les joueurs avec un motif optionnel kill=§c{0}§6 a été tué. killCommandDescription=Tue le joueur spécifié. killCommandUsage=/ killCommandUsage1=/ +killCommandUsage1Description=Tue le joueur spécifié killExempt=§4Vous ne pouvez pas tuer §c{0}§4. kitCommandDescription=Obtient le kit spécifié ou affiche tous les kits disponibles. kitCommandUsage=/ [kit] [joueur] kitCommandUsage1=/ +kitCommandUsage1Description=Liste tous les kits disponibles kitCommandUsage2=/ [joueur] +kitCommandUsage2Description=Vous donne le kit spécifié ou à un autre joueur si spécifié kitContains=§6Le kit §c{0} §6contient \: kitCost=\ §7§o({0})§r kitDelay=§m{0}§r @@ -528,6 +586,7 @@ kitReset=§7Réinitialise le délai de réutilisation du kit §c{0}§6. kitresetCommandDescription=Réinitialise le délai de réutilisation du kit spécifié. kitresetCommandUsage=/ [joueur] kitresetCommandUsage1=/ [joueur] +kitresetCommandUsage1Description=Réinitialise le temps de récupération du kit spécifié pour vous ou pour un autre joueur si spécifié kitResetOther=§6Réinitialisation du délai de réutilisation du kit §c{0} §6pour §c{1}§6. kits=§6Kits \:§r {0} kittycannonCommandDescription=Jetez un chaton explosif sur votre adversaire. @@ -537,7 +596,9 @@ leatherSyntax=§6Syntaxe de la couleur du cuir \:§c color\:,, lightningCommandDescription=La puissance de Thor. Frappez à au niveau de votre curseur ou sur un joueur. lightningCommandUsage=/ [joueur] [puissance] lightningCommandUsage1=/ [joueur] +lightningCommandUsage1Description=La foudre frappe soit à l''endroit où vous regardez, soit à l''emplacement d''un autre joueur si spécifié lightningCommandUsage2=/ +lightningCommandUsage2Description=La foudre frappe le joueur ciblé avec la puissance donnée lightningSmited=§7Vous venez d''être foudroyé(e) \! lightningUse=§c{0} §6s''est fait(e) foudroyer listAfkTag=§7[AFK]§r @@ -546,6 +607,7 @@ listAmountHidden=§6Il y a §c{0}§6/§c{1}§6 joueurs en ligne sur un maximum d listCommandDescription=Liste tous les joueurs en ligne. listCommandUsage=/ [groupe] listCommandUsage1=/ [groupe] +listCommandUsage1Description=Liste tous les joueurs du serveur, ou le groupe donné si spécifié listGroupTag=§6{0}§r \: listHiddenTag=§7[MASQUÉ]§f loadWarpError=§4Échec du chargement du point de téléportation {0}. @@ -557,9 +619,13 @@ mailCleared=§6Courrier supprimé \! mailCommandDescription=Gère le courrier inter-joueur, intra-serveur. mailCommandUsage=/ [read|clear|send [to] [message]|sendall [message]] mailCommandUsage1=/ read [page] +mailCommandUsage1Description=Lit la première page (ou la page spécifiée) de votre courrier mailCommandUsage2=/ clear +mailCommandUsage2Description=Efface tout votre courrier mailCommandUsage3=/ send +mailCommandUsage3Description=Envoie le message donné au joueur spécifié mailCommandUsage4=/ sendall +mailCommandUsage4Description=Envoie le message donné à tous les joueurs mailDelay=Trop de courriers ont été envoyés au cours de la dernière minute. Maximum \: {0} mailFormat=§6[§r{0}§6] §r{1} mailMessage={0} @@ -575,6 +641,7 @@ mayNotJailOffline=§4Vous ne pouvez pas emprisonner les joueurs déconnectés. meCommandDescription=Décrit une action dans le contexte du joueur. meCommandUsage=/ meCommandUsage1=/ +meCommandUsage1Description=Décrit une action meSender=moi meRecipient=moi minimumBalanceError=§4Le solde minimum qu''un joueur peut avoir est {0}. @@ -594,6 +661,7 @@ months=mois moreCommandDescription=Complète la pile de l''objet que vous tenez avec la quantité spécifiée, ou à la quantité maximale si non-spécifiée. moreCommandUsage=/ [quantité] moreCommandUsage1=/ [quantité] +moreCommandUsage1Description=Complète la pile de l''objet que vous tenez avec la quantité spécifiée, ou à la quantité maximale si non-spécifiée moreThanZero=Les quantités doivent être supérieures à zéro. motdCommandDescription=Affiche le message du jour. motdCommandUsage=/ [chapitre] [page] @@ -601,6 +669,7 @@ moveSpeed=§6Vitesse de §c{0} définie sur §c{1} §6pour §c{2}§6. msgCommandDescription=Envoie un message privé au joueur spécifié. msgCommandUsage=/ msgCommandUsage1=/ +msgCommandUsage1Description=Envoie en privé le message donné au joueur spécifié msgDisabled=§6Réception des messages §cdésactivée§6. msgDisabledFor=§6Réception des messages §cdésactivée §6pour §c{0}§6. msgEnabled=§6Réception des messages §cactivée§6. @@ -610,12 +679,15 @@ msgIgnore=§c{0} §4a désactivé les messages. msgtoggleCommandDescription=Bloque la réception de messages privés. msgtoggleCommandUsage=/ [joueur] [on|off] msgtoggleCommandUsage1=/ [joueur] +msgtoggleCommandUsage1Description=Active/désactive le vol pour vous-même ou un autre joueur si spécifié multipleCharges=§4Vous ne pouvez pas appliquer plus d''une charge à ce feu d''artifice. multiplePotionEffects=§4Vous ne pouvez pas appliquer plus d''un effet à cette potion. muteCommandDescription=Rend muet ou rend la voix à un joueur. muteCommandUsage=/ [durée] [raison] muteCommandUsage1=/ +muteCommandUsage1Description=Rend muet définitivement le joueur spécifié ou lui rend la possibilité de parler s''il était déjà muet muteCommandUsage2=/ [raison] +muteCommandUsage2Description=Rend muet le joueur spécifié pour la durée donnée avec un motif optionnel mutedPlayer=§6Le joueur§c {0} §6a été réduit au silence. mutedPlayerFor=§6Le joueur§c {0} §6a été réduit au silence pendant§c {1}§6. mutedPlayerForReason=§6Le joueur§c {0} §6a été réduit au silence pendant§c {1}§6. Raison \: §c{2} @@ -630,18 +702,26 @@ muteNotifyReason=§c{0} §6a réduit au silence le joueur §c{1}§6. Raison \: nearCommandDescription=Liste les joueurs proches ou aux alentours d''un autre joueur. nearCommandUsage=/ [pseudonyme] [radius] nearCommandUsage1=/ +nearCommandUsage1Description=Liste tous les joueurs dans le rayon par défaut autour de vous nearCommandUsage2=/ +nearCommandUsage2Description=Liste tous les joueurs dans le rayon donné autour de vous nearCommandUsage3=/ +nearCommandUsage3Description=Liste tous les joueurs dans le rayon par défaut autour du joueur spécifié nearCommandUsage4=/ +nearCommandUsage4Description=Liste tous les joueurs dans le rayon donné autour du joueur spécifié nearbyPlayers=§6Joueurs aux alentours \:§r {0} negativeBalanceError=§4L''utilisateur n''est pas autorisé à avoir un solde négatif. nickChanged=§6Surnom changé. nickCommandDescription=Changer votre pseudo ou celui d''un autre joueur. nickCommandUsage=/ [joueur] nickCommandUsage1=/ +nickCommandUsage1Description=Change votre pseudo par le texte donné nickCommandUsage2=/ off +nickCommandUsage2Description=Supprime votre pseudo nickCommandUsage3=/ +nickCommandUsage3Description=Change le pseudo du joueur spécifié par le texte donné nickCommandUsage4=/ off +nickCommandUsage4Description=Supprime le pseudo du joueur donné nickDisplayName=§7Vous devez activer change-displayname dans la configuration Essentials. nickInUse=§cCe nom est déjà utilisé. nickNameBlacklist=§4Ce surnom n''est pas autorisé. @@ -708,6 +788,7 @@ passengerTeleportFail=§4Vous ne pouvez pas être téléporté lorsque vous tran payCommandDescription=Payez un autre joueur avec votre argent. payCommandUsage=/ payCommandUsage1=/ +payCommandUsage1Description=Donne au joueur spécifié le montant d''argent spécifié payConfirmToggleOff=§6Il ne vous sera plus demandé de confirmer les paiements. payConfirmToggleOn=§6Il vous sera désormais demandé de confirmer les paiements. payDisabledFor=§6L''acceptation des paiements a été désactivée pour §c{0}§6. @@ -721,6 +802,7 @@ payconfirmtoggleCommandUsage=/ paytoggleCommandDescription=Active/désactive l''acceptation des paiements. paytoggleCommandUsage=/ [joueur] paytoggleCommandUsage1=/ [joueur] +paytoggleCommandUsage1Description=Active/désactive si vous, ou un autre joueur si spécifié, acceptez les paiements pendingTeleportCancelled=§4Demande de téléportation annulée. pingCommandDescription=Pong \! pingCommandUsage=/ @@ -746,8 +828,11 @@ possibleWorlds=§6Les mondes possibles sont les nombres de §c0§6 à §c{0}§6. potionCommandDescription=Ajoute des effets de potion personnalisés à une potion. potionCommandUsage=/ power\: duration\: potionCommandUsage1=/ clear +potionCommandUsage1Description=Efface tous les effets sur la potion tenue en main potionCommandUsage2=/ apply +potionCommandUsage2Description=Applique tous les effets sur la potion tenue en main sur vous sans consommer la potion potionCommandUsage3=/ effect\: power\: duration\: +potionCommandUsage3Description=Applique la méta de potion donnée à la potion tenue en main posX=§6X\: {0} (+Est <-> -Ouest) posY=§6Y\: {0} (+Haut <-> -Bas) posYaw=§6Yaw \: {0} (Rotation) @@ -769,6 +854,7 @@ powertoolCommandUsage=/ [l\:|a\:|r\:|c\:|d\:][commande] [arguments] - { powertoolCommandUsage1=/ l\: powertoolCommandUsage2=/ d\: powertoolCommandUsage3=/ r\: +powertoolCommandUsage3Description=Supprime la commande donnée de l''objet tenu en main powertoolCommandUsage4=/ powertoolCommandUsage5=/ a\: powertooltoggleCommandDescription=Active ou désactive tous les outils macros actuels. @@ -776,13 +862,19 @@ powertooltoggleCommandUsage=/ ptimeCommandDescription=Ajuster le temps personnel du joueur. Ajouter le préfixe @ pour corriger. ptimeCommandUsage=/ [list|reset|day|night|dawn|17\:30|4pm|4000ticks] [joueur|*] ptimeCommandUsage1=/ list [joueur|*] +ptimeCommandUsage1Description=Liste l''heure pour vous ou les autres joueurs si spécifiés ptimeCommandUsage2=/ [joueur|*] +ptimeCommandUsage2Description=Définit l''heure à l''heure indiquée pour vous ou les autres joueurs si spécifiés ptimeCommandUsage3=/ reset [joueur|*] +ptimeCommandUsage3Description=Réinitialise l''heure pour vous ou pour les autres joueurs si spécifiés pweatherCommandDescription=Ajuster la météo personnelle d''un joueur pweatherCommandUsage=/ [list|reset|storm|sun|clear] [joueur|*] pweatherCommandUsage1=/ list [joueur|*] +pweatherCommandUsage1Description=Liste la météo pour vous ou les autres joueurs si spécifiés pweatherCommandUsage2=/ [joueur|*] +pweatherCommandUsage2Description=Définit la météo à la météo donnée pour vous ou pour les autres joueurs si spécifiés pweatherCommandUsage3=/ reset [joueur|*] +pweatherCommandUsage3Description=Réinitialise la météo pour vous ou les autres joueurs si spécifiés pTimeCurrent=§6Pour §c{0}§6 il est §c{1}§6. pTimeCurrentFixed=L''heure de §e{0}§f est corrigée à {1}. pTimeNormal=§fPour §e{0}§f l''heure est normale et correspond au serveur. @@ -802,18 +894,21 @@ questionFormat=§2[Question]§r {0} rCommandDescription=Répondre à l''expéditeur ou au receveur du dernier message privé. rCommandUsage=/ rCommandUsage1=/ +rCommandUsage1Description=Répond au dernier joueur avec le texte donné radiusTooBig=§4Le rayon est trop grand \! Le rayon maximum est§c {0}§4. readNextPage=§6Tapez§c /{0} {1} §6pour lire la page suivante. realName=§f{0}§r§6 est §f{1} realnameCommandDescription=Affiche le nom d''utilisateur d''un utilisateur basé sur le surnom. realnameCommandUsage=/ realnameCommandUsage1=/ +realnameCommandUsage1Description=Affiche le nom d''utilisateur d''un joueur basé sur le pseudo donné recentlyForeverAlone=§4{0} s''est récemment déconnecté(e). recipe=§6Recette pour §c{0}§6 (§c{1}§6 sur §c{2}§6) recipeBadIndex=Il n''y a pas de recette pour ce numéro. recipeCommandDescription=Affiche la recette de fabrication de l''objet spécifié. recipeCommandUsage=/ [nombre] recipeCommandUsage1=/ [page] +recipeCommandUsage1Description=Affiche comment fabriquer l''objet donné recipeFurnace=§6Faire fondre \: §c{0}§6. recipeGrid=§c{0}X §6| §{1}X §6| §{2}X recipeGridItem=§c{0}X §6est §c{1} @@ -825,7 +920,9 @@ recipeWhere=§6Où \: {0} removeCommandDescription=Supprime des entités de votre monde. removeCommandUsage=/ [rayon|monde] removeCommandUsage1=/ [monde] +removeCommandUsage1Description=Supprime tous les mobs du type donné dans le monde actuel ou dans un autre monde si spécifié removeCommandUsage2=/ [monde] +removeCommandUsage2Description=Supprime tous les mobs du type donné dans le rayon donné dans le monde actuel ou dans un autre monde si spécifié removed=§7{0} entités supprimées. repair=§6Vous avez réparé votre \: §c{0}§6. repairAlreadyFixed=§7Cet objet n''a pas besoin de réparation. @@ -878,9 +975,13 @@ sellBulkPermission=§6Vous n''avez pas la permission de vendre tout le contenu d sellCommandDescription=Vendre l''objet dans votre main. sellCommandUsage=/ <||hand|inventory|blocks> [quantité] sellCommandUsage1=/ [quantité] +sellCommandUsage1Description=Vend l''entièreté (ou le montant spécifié) de l''objet indiqué dans votre inventaire sellCommandUsage2=/ hand [quantité] +sellCommandUsage2Description=Vend l''entièreté (ou le montant spécifié) de l''objet tenu en main sellCommandUsage3=/ all +sellCommandUsage3Description=Vend tous les objets possibles dans votre inventaire sellCommandUsage4=/ blocks [quantité] +sellCommandUsage4Description=Vend la totalité (ou la quantité spécifiée) de blocs dans votre inventaire sellHandPermission=§6Vous n''avez pas la permission de vendre le contenu de votre main. serverFull=Le serveur est complet \! serverReloading=Il y a de bonnes chances que vous soyez entrain de recharger votre serveur en ce moment. Si c''est le cas, pourquoi vous détestez vous-même ? N''attendez aucun support de l''équipe EssentialsX en utilisant /reload. @@ -897,24 +998,33 @@ setSpawner=§6Le type de générateur a été changé en§c {0}§6. sethomeCommandDescription=Définit votre résidence à votre emplacement actuel. sethomeCommandUsage=/ [[joueur\:]nom] sethomeCommandUsage1=/ +sethomeCommandUsage1Description=Définit votre résidence sur votre position actuelle avec le nom spécifié sethomeCommandUsage2=/ \: +sethomeCommandUsage2Description=Définit la résidence du joueur spécifié sur votre position actuelle avec le nom spécifié setjailCommandDescription=Crée une prison à l''endroit spécifié nommé [nom de la prison]. setjailCommandUsage=/ setjailCommandUsage1=/ +setjailCommandUsage1Description=Définit la prison sur votre position actuelle avec le nom spécifié settprCommandDescription=Définissez l''emplacement et les paramètres de téléportation aléatoires. settprCommandUsage=/ [center|minrange|maxrange] [valeur] settprCommandUsage1=/ center +settprCommandUsage1Description=Définit le centre du point de téléportation aléatoire sur votre position actuelle settprCommandUsage2=/ minrange +settprCommandUsage2Description=Définit le rayon minimal de téléportation aléatoire sur la valeur spécifiée settprCommandUsage3=/ maxrange +settprCommandUsage3Description=Définit le rayon maximal de téléportation aléatoire sur la valeur spécifiée settpr=§6Définit le centre de la téléportation aléatoire. settprValue=§6Téléportation aléatoire §c{0}§6 défini à §c{1}§6. setwarpCommandDescription=Crée un nouveau point de téléportation. setwarpCommandUsage=/ setwarpCommandUsage1=/ +setwarpCommandUsage1Description=Définit le warp avec le nom spécifié sur votre position actuelle setworthCommandDescription=Définit la valeur de vente d''un objet. setworthCommandUsage=/ [nom de l''item|id] setworthCommandUsage1=/ +setworthCommandUsage1Description=Définit la valeur de l''objet tenu en main au prix spécifié setworthCommandUsage2=/ +setworthCommandUsage2Description=Définit la valeur de l''objet spécifié au prix donné sheepMalformedColor=§4Couleur incorrecte. shoutDisabled=§6Mode cri §cdésactivé§6. shoutDisabledFor=§6Mode cri §cdésactivé §6pour §c{0}§6. @@ -926,6 +1036,7 @@ editsignCommandClearLine=§6Ligne §c{0} §6effacée. showkitCommandDescription=Affiche le contenu d''un kit. showkitCommandUsage=/ showkitCommandUsage1=/ +showkitCommandUsage1Description=Affiche un résumé des objets du kit spécifié editsignCommandDescription=Modifie une pancarte dans le monde. editsignCommandLimit=§4Le texte fourni est trop grand pour tenir sur la pancarte ciblée. editsignCommandNoLine=§4Vous devez spécifier un numéro de ligne compris entre §c1-4§4. @@ -937,9 +1048,13 @@ editsignPaste=§6Pancarte collée \! editsignPasteLine=§6Ligne §c{0} §6de la pancarte collée \! editsignCommandUsage=/ [numéro de la ligne] [texte] editsignCommandUsage1=/ set +editsignCommandUsage1Description=Écrit le texte indiqué sur la ligne spécifiée de la pancarte ciblée editsignCommandUsage2=/ clear +editsignCommandUsage2Description=Efface la ligne spécifiée de la pancarte ciblée editsignCommandUsage3=/ copy [numéro de ligne] +editsignCommandUsage3Description=Copie la totalité (ou la ligne spécifiée) de la pancarte ciblée vers votre presse-papiers editsignCommandUsage4=/ paste [numéro de ligne] +editsignCommandUsage4Description=Colle votre presse-papiers sur la totalité (ou la ligne spécifiée) de la pancarte ciblée signFormatFail=§4[{0}] signFormatSuccess=§1[{0}] signFormatTemplate=[{0}] @@ -952,7 +1067,9 @@ skullChanged=§6Tête changée en celle de §c{0}§6. skullCommandDescription=Définit le propriétaire d''une tête skullCommandUsage=/ [propriétaire] skullCommandUsage1=/ +skullCommandUsage1Description=Obtenir votre crâne skullCommandUsage2=/ +skullCommandUsage2Description=Obtenir le crâne du joueur spécifié slimeMalformedSize=§4Taille incorrecte. smithingtableCommandDescription=Ouvre une table de forgeron. smithingtableCommandUsage=/ @@ -962,27 +1079,34 @@ socialSpyMutedPrefix=§f[§6SS§f] §7(muet) §r socialspyCommandDescription=Active ou désactive l''affichage des commandes msg/mail dans le chat. socialspyCommandUsage=/ [joueur] [on|off] socialspyCommandUsage1=/ [joueur] +socialspyCommandUsage1Description=Active/désactive le mode espion pour vous-même ou pour un autre joueur si spécifié socialSpyPrefix=§f[§6SS§f] §r soloMob=Cette créature préfère être seule. spawned=invoqué(s) spawnerCommandDescription=Change le type de créature d''un générateur. spawnerCommandUsage=/ [délai] spawnerCommandUsage1=/ [délai] +spawnerCommandUsage1Description=Modifie le type de mob (et facultativement le délai) du générateur que vous regardez spawnmobCommandDescription=Fait apparaître une créature. spawnmobCommandUsage=/ [\:data][[\:data]] [quantité] [joueur] spawnmobCommandUsage1=/ [\:données] [quantité] [joueur] +spawnmobCommandUsage1Description=Fait apparaître un (ou la quantité spécifiée) du mob donné sur votre emplacement (ou sur celui d''un autre joueur si spécifié) spawnmobCommandUsage2=/ [\:données],[\:données] [quantité] [joueur] +spawnmobCommandUsage2Description=Fait apparaître un (ou la quantité spécifiée) du mob donné chevauchant le mob indiqué sur votre emplacement (ou sur celui d''un autre joueur si spécifié) spawnSet=§6Le point de spawn a été défini pour le groupe§c {0}§6. spectator=spectateur speedCommandDescription=Change vos limites de vitesse. speedCommandUsage=/ [type] [joueur] speedCommandUsage1=/ +speedCommandUsage1Description=Définit votre vitesse de vol ou de marche à la vitesse spécifiée speedCommandUsage2=/ [joueur] +speedCommandUsage2Description=Définit soit le type de vitesse spécifié à la vitesse donnée pour vous ou pour un autre joueur si spécifié stonecutterCommandDescription=Ouvre un tailleur de pierre. stonecutterCommandUsage=/ sudoCommandDescription=Forcer l’exécution d''une commande par un joueur. sudoCommandUsage=/ sudoCommandUsage1=/ [paramètres] +sudoCommandUsage1Description=Fait exécuter la commande donnée par le joueur spécifié sudoExempt=§4Vous ne pouvez pas exécuter une commande de force à la place de §c{0}. sudoRun=§c{0} §6a été forcé d’exécuter \:§r /{1} suicideCommandDescription=Vous fait périr. @@ -1023,21 +1147,27 @@ tempBanned=§cVous avez été banni(e) temporairement pendant§r {0} \:\n§r{2} tempbanCommandDescription=Bannir un utilisateur temporairement. tempbanCommandUsage=/ [raison] tempbanCommandUsage1=/ [raison] +tempbanCommandUsage1Description=Bannit le joueur spécifiée pour la durée indiquée avec une raison facultative tempbanipCommandDescription=Bannit temporairement une adresse IP. tempbanipCommandUsage=/ [raison] tempbanipCommandUsage1=/ [raison] +tempbanipCommandUsage1Description=Bannit l''adresse IP donnée pour la durée spécifiée avec une raison facultative thunder=Vous avez {0} la foudre dans votre monde. thunderCommandDescription=Activer/désactiver le tonnerre. thunderCommandUsage=/ [durée] thunderCommandUsage1=/ [durée] +thunderCommandUsage1Description=Active/désactive le tonnerre pour une durée facultative thunderDuration=Vous avez {0} la foudre sur le serveur pendant {1} seconde(s). timeBeforeHeal=§4Temps avant le prochain soin \:§c {0}§4. timeBeforeTeleport=§4Temps avant la prochaine téléportation \:§c {0}§4. timeCommandDescription=Afficher/Changer l''heure du monde. Par défaut, le monde actuel. timeCommandUsage=/ [set|add] [day|night|dawn|17\:30|4pm|4000ticks] [nom du monde|all] timeCommandUsage1=/ +timeCommandUsage1Description=Affiche l''heure de tous les mondes timeCommandUsage2=/ set [monde|all] +timeCommandUsage2Description=Définit l''heure dans le monde actuel (ou dans le monde spécifié) sur l''heure indiquée timeCommandUsage3=/ add [monde|all] +timeCommandUsage3Description=Ajoute le temps donné à l''heure actuelle dans le monde actuel (ou dans le monde spécifié) timeFormat=§c{0}§6 ou §c{1}§6 ou §c{2}§6 timeSetPermission=§cVous n''êtes pas autorisé à régler l''heure. timeSetWorldPermission=§cVous n''êtes pas autorisé à régler l''heure du monde ''{0}''. @@ -1050,6 +1180,7 @@ togglejailCommandUsage=/ [durée] toggleshoutCommandDescription=Active/désactive le mode cri toggleshoutCommandUsage=/ [joueur] [on|off] toggleshoutCommandUsage1=/ [joueur] +toggleshoutCommandUsage1Description=Active/désactive le mode de cri pour vous-même ou pour un autre joueur si spécifié topCommandDescription=Se téléporter vers le bloc le plus haut, à votre position actuelle. topCommandUsage=/ totalSellableAll=§aLa valeur totale de tous les objets et blocs que vous pouvez vendre est de §c{1}§a. @@ -1059,61 +1190,81 @@ totalWorthBlocks=§aTous les blocs ont été vendus pour une valeur totale de § tpCommandDescription=Se téléporter à un autre joueur. tpCommandUsage=/ [autre joueur] tpCommandUsage1=/ +tpCommandUsage1Description=Vous téléporte sur le joueur spécifié tpCommandUsage2=/ +tpCommandUsage2Description=Téléporte le premier joueur spécifié au second tpaCommandDescription=Envoie une requête de téléportation au joueur spécifié. tpaCommandUsage=/ tpaCommandUsage1=/ +tpaCommandUsage1Description=Demande une téléportation au joueur spécifié tpaallCommandDescription=Envoie une requête de téléportation à votre position actuelle à tous les joueurs connectés. tpaallCommandUsage=/ tpaallCommandUsage1=/ +tpaallCommandUsage1Description=Demande à tous les joueurs de se téléporter sur vous tpacancelCommandDescription=Annule toutes les requêtes de téléportation en cours. Utilisez le paramètre [joueur] pour annuler les requêtes d''un joueur spécifique. tpacancelCommandUsage=/ [joueur] tpacancelCommandUsage1=/ +tpacancelCommandUsage1Description=Annule toutes vos demandes de téléportation en attente tpacancelCommandUsage2=/ +tpacancelCommandUsage2Description=Annule toutes vos demandes de téléportation en attente avec le joueur spécifié tpacceptCommandDescription=Accepte une requête de téléportation. tpacceptCommandUsage=/ [autre joueur] tpacceptCommandUsage1=/ +tpacceptCommandUsage1Description=Accepte une demande de téléportation entrante tpahereCommandDescription=Envoie une requête au joueur spécifié pour qu''il se téléporte à vous. tpahereCommandUsage=/ tpahereCommandUsage1=/ +tpahereCommandUsage1Description=Demande au joueur spécifié de se téléporter sur vous tpallCommandDescription=Téléporte tous les joueurs connectés au joueur spécifié. tpallCommandUsage=/ [joueur] tpallCommandUsage1=/ [joueur] +tpallCommandUsage1Description=Téléporte tous les joueurs sur vous, ou sur un autre joueur si spécifié tpautoCommandDescription=Accepte automatiquement les requêtes de téléportation. tpautoCommandUsage=/ [joueur] tpautoCommandUsage1=/ [joueur] +tpautoCommandUsage1Description=Active/désactive si les requêtes tpa sont automatiquement acceptées pour vous ou pour un autre joueur si spécifié tpdenyCommandDescription=Rejette une requête de téléportation. tpdenyCommandUsage=/ tpdenyCommandUsage1=/ +tpdenyCommandUsage1Description=Rejette une demande de téléportation entrante tphereCommandDescription=Téléporte un joueur à votre position. tphereCommandUsage=/ tphereCommandUsage1=/ +tphereCommandUsage1Description=Téléporte le joueur spécifié à vous tpoCommandDescription=Téléportation en outrepassant le tptoggle. tpoCommandUsage=/ [autre joueur] tpoCommandUsage1=/ +tpoCommandUsage1Description=Téléporte le joueur spécifié à vous en ignorant ses préférences tpoCommandUsage2=/ +tpoCommandUsage2Description=Téléporte le premier joueur spécifié au second tout en ignorant leurs préférences tpofflineCommandDescription=Se téléporter au dernier lieu de déconnexion connu d''un joueur tpofflineCommandUsage=/ tpofflineCommandUsage1=/ +tpofflineCommandUsage1Description=Vous téléporte à l''emplacement de déconnexion du joueur spécifié tpohereCommandDescription=Se téléporter ici en outrepassant le tptoggle. tpohereCommandUsage=/ tpohereCommandUsage1=/ +tpohereCommandUsage1Description=Téléporte le joueur spécifié à vous en ignorant ses préférences tpposCommandDescription=Se téléporter aux coordonnées spécifiées. tpposCommandUsage=/ [yaw] [pitch] [monde] tpposCommandUsage1=/ [yaw] [pitch] [monde] +tpposCommandUsage1Description=Vous téléporte à l''emplacement spécifié avec un yaw, un pitch et/ou un monde optionnels tprCommandDescription=Se téléporter aléatoirement. tprCommandUsage=/ tprCommandUsage1=/ +tprCommandUsage1Description=Vous téléporte à un emplacement aléatoire tprSuccess=§6Téléportation vers une position aléatoire... tps=§6TPS actuel \= {0} tptoggleCommandDescription=Bloque toutes les formes de téléportation. tptoggleCommandUsage=/ [joueur] [on|off] tptoggleCommandUsage1=/ [joueur] +tptoggleCommandUsageDescription=Active/désactive si les téléportations sont activés pour vous ou pour un autre joueur si spécifié tradeSignEmpty=Le panneau de vente n''a pas encore assez de stock. tradeSignEmptyOwner=Il n''y a rien à collecter de cette pancarte d''échange commercial. treeCommandDescription=Fait apparaître un arbre où vous regardez. treeCommandUsage=/ treeCommandUsage1=/ +treeCommandUsage1Description=Fait apparaître un arbre du type spécifié à l''emplacement où vous regardez treeFailure=§cÉchec de la génération de l''arbre. Essayez de nouveau sur de l''herbe ou de la terre. treeSpawned=§6Arbre généré. true=§aoui§r @@ -1126,9 +1277,11 @@ unableToSpawnMob=§4Impossible de faire apparaître la créature. unbanCommandDescription=Débannit le joueur spécifié. unbanCommandUsage=/ unbanCommandUsage1=/ +unbanCommandUsage1Description=Débannit le joueur spécifié unbanipCommandDescription=Débannit l''adresse IP spécifiée. unbanipCommandUsage=/ unbanipCommandUsage1=/ +unbanipCommandUsage1Description=Débannit l''adresse IP spécifiée unignorePlayer=Vous n''ignorez plus {0}. unknownItemId=§4ID d''objet inconnu \:§r {0}§4. unknownItemInList=L''objet {0} est inconnu dans la liste {1}. @@ -1136,8 +1289,11 @@ unknownItemName=§4Nom d''objet inconnu \: {0}. unlimitedCommandDescription=Permet le placement illimité d''objets. unlimitedCommandUsage=/ [joueur] unlimitedCommandUsage1=/ list [joueur] +unlimitedCommandUsage1Description=Affiche une liste d''objets illimités pour vous ou pour un autre joueur si spécifié unlimitedCommandUsage2=/ [joueur] +unlimitedCommandUsage2Description=Active/désactive si l''objet donné est illimité pour vous ou pour un autre joueur si spécifié unlimitedCommandUsage3=/ clear [joueur] +unlimitedCommandUsage3Description=Efface tous les objets illimités pour vous ou pour un autre joueur si spécifié unlimitedItemPermission=§4Pas de permission pour l''objet illimité §c{0}§4. unlimitedItems=§6Objets illimités \:§r unmutedPlayer=§6Le joueur§c {0} §6a de nouveau la parole. @@ -1195,12 +1351,15 @@ walking=marche warpCommandDescription=Liste tous les points de téléportation ou vous téléporte au point de téléportation spécifié. warpCommandUsage=/ [joueur] warpCommandUsage1=/ [page] +warpCommandUsage1Description=Donne une liste de toutes les warps de la première ou de la page spécifiée warpCommandUsage2=/ [joueur] +warpCommandUsage2Description=Vous téléporte ou téléporte un joueur spécifié vers le warp donné warpDeleteError=§4Un problème est survenu lors de la suppression du fichier des points de téléportation. warpInfo=§6Informations sur le point de téléportation§c {0}§6 \: warpinfoCommandDescription=Trouve les informations sur la position d''un point de téléportation donné. warpinfoCommandUsage=/ warpinfoCommandUsage1=/ +warpinfoCommandUsage1Description=Fournit des informations sur le warp donné warpingTo=§6Téléportation vers le point§c {0}§6. warpList={0} warpListPermission=§4Vous n''avez pas la permission d''accéder à la liste des points de téléportation. @@ -1211,6 +1370,7 @@ warpsCount=§6Il y a§c {0} §6points de téléportation. Page §c{1} §6sur §c weatherCommandDescription=Définit la météo. weatherCommandUsage=/ [durée] weatherCommandUsage1=/ [durée] +weatherCommandUsage1Description=Définit la météo au type donné pour une durée optionnelle warpSet=§6Le point de téléportation§c {0} §6a été défini. warpUsePermission=§4Vous n''avez pas la permission d''utiliser ce point de téléportation. weatherInvalidWorld=Le monde {0} est introuvable \! @@ -1227,6 +1387,7 @@ whoisBanned=§6 - Banni(s) \:§r {0} whoisCommandDescription=Détermine le nom d''utilisateur derrière un surnom. whoisCommandUsage=/ whoisCommandUsage1=/ +whoisCommandUsage1Description=Donne des informations basiques sur le joueur spécifié whoisExp=§6 - Expérience \:§r {0} (Niveau {1}) whoisFly=§6 - Mode Vol \:§r {0} ({1}) whoisSpeed=§6 - Vitesse \:§r {0} @@ -1252,14 +1413,20 @@ workbenchCommandUsage=/ worldCommandDescription=Bascule entre mondes. worldCommandUsage=/ [monde] worldCommandUsage1=/ +worldCommandUsage1Description=Vous téléporte dans le Nether ou dans l''End à l''emplacement correspondant à votre emplacement actuel worldCommandUsage2=/ +worldCommandUsage2Description=Vous téléporte à votre position actuelle dans le monde donné worth=§7Un stack de {0} vaut §c{1}§7 ({2} objet(s) à {3} chacun) worthCommandDescription=Calcule la valeur des objets en main ou tel que spécifié. worthCommandUsage=/ <||hand|inventory|blocks> [-][quantité] worthCommandUsage1=/ [quantité] +worthCommandUsage1Description=Vérifie la valeur de tout (ou du montant donné, si spécifié) de l''objet donné dans votre inventaire worthCommandUsage2=/ hand [quantité] +worthCommandUsage2Description=Vérifie la valeur de tout (ou du montant donné, si spécifié) de l''objet tenu en main worthCommandUsage3=/ all +worthCommandUsage3Description=Vérifie la valeur de tous les objets possibles dans votre inventaire worthCommandUsage4=/ blocks [quantité] +worthCommandUsage4Description=Vérifie la valeur de tout (ou le montant donné, si spécifié) les blocs dans votre inventaire worthMeta=§aUn stack de {0} de type {1} vaut §c{2}§a ({3} objet(s) à {4} chacun) worthSet=§6Valeur définie year=année diff --git a/Essentials/src/main/resources/messages_hu.properties b/Essentials/src/main/resources/messages_hu.properties index 0795034f031..963b2ce1684 100644 --- a/Essentials/src/main/resources/messages_hu.properties +++ b/Essentials/src/main/resources/messages_hu.properties @@ -398,6 +398,9 @@ homeConfirmation=§6Már van egy ilyen nevű otthonod §c{0}§6\!\nA meglévő o homeSet=§6Beállítva otthonnak ez a hely. hour=óra hours=óra +iceCommandUsage=/ [játékos] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Játékosok figyelmen kívül hagyása vagy a figyelmen kívül hagyás visszavonása. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_it.properties b/Essentials/src/main/resources/messages_it.properties index d8ce8f5717d..510b73e35ca 100644 --- a/Essentials/src/main/resources/messages_it.properties +++ b/Essentials/src/main/resources/messages_it.properties @@ -181,6 +181,7 @@ createkitCommandUsage1Description=Crea un kit con il nome specificato e il ritar createKitFailed=§4Si è verificato un errore creando il kit {0}. createKitSeparator=§m----------------------- createKitSuccess=§6Kit Creato\: §f{0}\n§6Attesa\: §f{1}\n§6Link\: §f{2}\n§6Copia i contenuti nel link qui sopra nel tuo kits.yml. +createKitUnsupported=§4La serializzazione dell''oggetto Nbt è stata abilitata, ma questo server non è in esecuzione Paper 1.15.2+. Rientro alla serializzazione dell''oggetto standard. creatingConfigFromTemplate=Creazione della configurazione dal template\: {0} creatingEmptyConfig=Creazione configurazione vuota\: {0} creative=creativa @@ -191,11 +192,15 @@ customtextCommandUsage=/ - Definisci in bukkit.yml day=giorno days=giorni defaultBanReason=Il Martello Ban ha parlato\! +deletedHomes=Tutte le case cancellate. +deletedHomesWorld=Tutte le case in {0} cancellate. deleteFileError=Impossibile eliminare il file\: {0} deleteHome=§6La casa§c {0} §6è stata rimossa. deleteJail=§6La prigione§c {0} §6è stata rimossa. deleteKit=§6Il kit§c {0} §6è stato rimosso. deleteWarp=§6Il warp§c {0} §6è stato rimosso. +deletingHomes=Eliminazione di tutte le case... +deletingHomesWorld=Eliminazione di tutte le case in {0}... delhomeCommandDescription=Rimuove una casa. delhomeCommandUsage=/ [giocatore\:] delhomeCommandUsage1=/ @@ -278,6 +283,10 @@ essentialsCommandUsage4=/ debug essentialsCommandUsage4Description=Attiva/Disattiva "modalità debug di Essentials" essentialsCommandUsage5=/ reset essentialsCommandUsage5Description=Ripristina i dati utente del giocatore +essentialsCommandUsage6=/ ripulire +essentialsCommandUsage6Description=Pulisce vecchi dati utente +essentialsCommandUsage7=/ case +essentialsCommandUsage7Description=Gestisce le case utente essentialsHelp1=Il file è corrotto ed Essentials non lo può aprire. Essentials è ora disabilitato. Se non riesci a riparare il file, vai su http\://tiny.cc/EssentialsChat essentialsHelp2=Il file è corrotto ed Essentials non lo può aprire. Essentials è ora disabilitato. Se non riesci a riparare il file, scrivi /essentialshelp in gioco o vai su http\://tiny.cc/EssentialsChat essentialsReload=§6Essentials ricaricato§c {0}. @@ -329,6 +338,8 @@ fireworkCommandUsage4=/ fireworkCommandUsage4Description=Aggiunge l''effetto dato ai fuochi d''artificio tenuti fireworkEffectsCleared=§6Rimossi tutti gli effetti dallo stack attualmente tenuta. fireworkSyntax=§6Parametri Fuochi d''Artificio\:§c color\: [fade\:] [shape\:] [effect\:]\n§6Per utilizzare più di un colore/effetto, separa i valori con una virgola\: §cred,blue,pink\n§6Forme\:§c star, ball, large, creeper, burst §6Effetti\:§c trail, twinkle. +fixedHomes=Case non valide eliminate. +fixingHomes=Eliminazione di case non valide... flyCommandDescription=Decolla e vola\! flyCommandUsage=/ [player] [power] flyCommandUsage1=/ [player] @@ -428,6 +439,16 @@ homeConfirmation=§6Hai già una casa chiamata §c{0}§6\!\nPer sovrascrivere la homeSet=§7Casa impostata alla posizione corrente. hour=ora hours=ore +ice=§6Senti molto più freddo... +iceCommandDescription=Raffredda un giocatore. +iceCommandUsage=/ [player] +iceCommandUsage1=/ +iceCommandUsage1Description=Ti rinfresca +iceCommandUsage2=/ +iceCommandUsage2Description=Raffredda un giocatore +iceCommandUsage3=/ * +iceCommandUsage3Description=Rinfresca tutti i giocatori online +iceOther=§6Agghiacciante§c {0}§6. ignoreCommandDescription=Ignora o ignora altri giocatori. ignoreCommandUsage=/ ignoreCommandUsage1=/ @@ -526,6 +547,7 @@ jailReleased=§6Il giocatore §c{0}§6 è stato scarcerato. jailReleasedPlayerNotify=§6Sei stato scarcerato\! jailSentenceExtended=§6Tempo di prigionia esteso a §c{0}§6. jailSet=§6La prigione§c {0} §6è stata stabilita. +jailWorldNotExist=§4Il mondo della prigione non esiste. jumpEasterDisable=Modalità guidata di volo disattivata. jumpEasterEnable=Modalità guidata di volo disattivata. jailsCommandDescription=Elenca tutte le carceri. @@ -561,6 +583,7 @@ kitCost=\ §7§o({0})§r kitDelay=§m{0}§r kitError=§cNon ci sono kit validi. kitError2=§4Quel kit non è definito correttamente. Contatta un amministratore. +kitError3=Impossibile dare l''oggetto del kit nel kit "{0}" all''utente {1} come elemento del kit richiede Paper 1.15.2+ per deserializzare. kitGiveTo=§6Kit§c {0}§6 dato a §c{1}§6. kitInvFull=§4Il tuo inventario è pieno, il kit verrà piazzato a terra. kitInvFullNoDrop=§4Non c''è abbastanza spazio nel tuo inventario per quel kit. diff --git a/Essentials/src/main/resources/messages_ja.properties b/Essentials/src/main/resources/messages_ja.properties index 37a114320a9..da636be1326 100644 --- a/Essentials/src/main/resources/messages_ja.properties +++ b/Essentials/src/main/resources/messages_ja.properties @@ -54,6 +54,7 @@ balancetopCommandDescription=トップ残高値を取得します。 banCommandDescription=プレーヤをBANします。 banCommandUsage=/ [reason] banCommandUsage1=/ [reason] +banCommandUsage1Description=指定したプレイヤーを理由別でBANします banExempt=§4そのプレイヤーをBANすることはできません。 banExemptOffline=§4オフラインのプレイヤーをBANすることはできません。 banFormat=§cあなたはBANされました\:\n§r{0} @@ -211,6 +212,7 @@ errorCallingCommand=/{0} コマンド呼び出しエラー errorWithMessage=§cエラー\:§4 {0} essentialsCommandDescription=EssentialXを再読込します。 essentialsCommandUsage=/ +essentialsCommandUsage1Description=Essentialsの設定を再読み込み essentialsHelp1=ファイルが壊れているため、Essentialsは無効化されました。対処できない場合は、 http\://tiny.cc/EssentialsChat を参照して下さい。 essentialsHelp2=ファイルが壊れているため、Essentialsは無効化されました. 対処できない場合は、/essentialshelpコマンドを実行するか、こちらを参照して下さい。 http\://tiny.cc/EssentialsChat essentialsReload=§6Essentials §c{0}§6をリロードしました。 @@ -287,6 +289,7 @@ hatArmor=§4このアイテムをかぶることは出来ません。 hatCommandDescription=クールな新しいヘッドギアを手に入れよう。 hatCommandUsage=/ [remove] hatCommandUsage1=/ +hatCommandUsage2Description=現在の帽子を外します。 hatCurse=§4束縛の呪いで帽子は外せません! hatEmpty=§4あなたは何も被っていません。 hatFail=§6アイテムをかぶるには、それを手に持つ必要があります。 @@ -321,6 +324,9 @@ homeConfirmation=§c{0}§6という名前のホームをすでに持っていま homeSet=§6現在の場所に§cホーム地点§6を設定しました。 hour=時間 hours=時間 +iceCommandUsage=/ [player] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=他のプレーヤーを無視したり、無視を解除したりすることができます。 ignoreCommandUsage=/ ignoreCommandUsage1=/ @@ -358,6 +364,7 @@ inventoryClearingStack=§c {2} §6から§c {1} §6の§c {0} §6を削除しま invseeCommandDescription=他のプレイヤーのインベントリを見る invseeCommandUsage=/ invseeCommandUsage1=/ +invseeCommandUsage1Description=指定したプレイヤーのインベントリを開きます is=は isIpBanned=§6IP §c{0} §6はBANされています。 internalError=§cこのコマンドを実行しようとしたときに内部エラーが発生しました。 @@ -503,6 +510,7 @@ msgtoggleCommandUsage=/ [player] [on|off] msgtoggleCommandUsage1=/ [player] muteCommandUsage=/ [datediff] [reason] muteCommandUsage1=/ +muteCommandUsage1Description=指定したプレイヤーを永久にミュートするか、すでにミュートされている場合はミュートを解除します。 mutedPlayer=§c {0} §6は発言禁止になりました。 muteExempt=§4そのプレイヤーを発言禁止にすることはできません。 muteExemptOffline=§4オフラインのプレイヤーを発言禁止にすることはできません。 @@ -511,12 +519,15 @@ muteNotifyForReason=§c{0}§6は§c{2}§6まで§c{1}§6をミュートしまし muteNotifyReason=§c{0}§6は§c{1}§6をミュートしました。理由\: §c{2} nearCommandUsage=/ [playername] [radius] nearCommandUsage1=/ +nearCommandUsage2Description=半径内のすべてのプレイヤーを一覧表示します nearCommandUsage3=/ nearbyPlayers=§6近くにいるプレイヤー\:§r {0} negativeBalanceError=§4ユーザーはお金がマイナスになることは許可されていません. nickChanged=§6ニックネームが変更されました。 +nickCommandDescription=ニックネームや他のプレイヤーのニックネームを変更します。 nickCommandUsage=/ [player] nickCommandUsage1=/ +nickCommandUsage1Description=ニックネームを与えられたテキストに変更します nickDisplayName=§4Essentialsのコンフィグで、change-displayname を有効にする必要があります。 nickInUse=§4その名前はすでに使われています。 nickNamesAlpha=§4ニックネームは英数字である必要があります。 @@ -564,6 +575,7 @@ nothingInHand=§4手に何も持っていません。 now=現在 noWarpsDefined=§6そのワープ地点は存在しません。 nuke=§5上から死の雨が… +nukeCommandDescription=彼らに死の雨が降るかもしれない。 nukeCommandUsage=/ [player] numberRequired=数字を入力して下さい。 onlyDayNight=timeコマンドは、dayかnightを使用して下さい。 @@ -580,9 +592,11 @@ payConfirmToggleOn=§6支払いの確認が求められるようになりまし payMustBePositive=§4支払う金額は正の値である必要があります。 payToggleOff=§6支払いを受け付けないようにしました。 payToggleOn=§6支払いを受け付けています。 +payconfirmtoggleCommandDescription=支払いの確認を求めるかどうかを切り替えます。 payconfirmtoggleCommandUsage=/ paytoggleCommandUsage=/ [player] paytoggleCommandUsage1=/ [player] +paytoggleCommandUsage1Description=支払いを受け付けるかどうかを切り替えます。または他のプレイヤーが指定した場合、支払いを受け付けるかどうかを切り替えます。 pendingTeleportCancelled=§4テレポート要求が§c拒否§rされました。 pingCommandDescription=Pong\! pingCommandUsage=/ diff --git a/Essentials/src/main/resources/messages_ko.properties b/Essentials/src/main/resources/messages_ko.properties index e3a0ae630c6..ec70d4a1849 100644 --- a/Essentials/src/main/resources/messages_ko.properties +++ b/Essentials/src/main/resources/messages_ko.properties @@ -34,7 +34,7 @@ backCommandDescription=tp/spawn/warp 이전 위치로 텔레포트합니다. backCommandUsage=/ [player] backCommandUsage1=/ backCommandUsage1Description=이전 위치로 이동합니다 -backCommandUsage2Description=특정 플레이어를 이전 위치로 이동 시킵니다 +backCommandUsage2Description=해당 플레이어를 이전 위치로 돌려보냅니다. backOther=§c{0} §6을(를) 이전 위치로 이동시켰습니다. backupCommandDescription=구성된 설정이 있을 경우 백업을 실행합니다. backupCommandUsage=/ @@ -48,20 +48,23 @@ balanceCommandDescription=플레이어의 현재 잔고를 보여줍니다. balanceCommandUsage=/ [player] balanceCommandUsage1=/ balanceCommandUsage1Description=현재 잔고를 표시합니다 -balanceCommandUsage2Description=다른 플레이어의 잔고를 확인합니다 +balanceCommandUsage2Description=해당 플레이어의 잔고를 보여줍니다. balanceOther=§a{0}의 잔고§a\:§c {1} balanceTop=§6잔고 순위 ({0}) balanceTopLine={0}. {1}, {2} balancetopCommandDescription=잔고 순위를 봅니다. +balancetopCommandUsage1Description=첫 페이지 (또는 해당 페이지) 의 잔고 순위를 보여줍니다. banCommandDescription=플레이어를 차단합니다. banCommandUsage=/<닉네임>[사유] banCommandUsage1=/<닉네임>[사유] +banCommandUsage1Description=사유와 함께 해당 플레이어를 차단합니다. banExempt=§4당신은 이 플레이어를 차단할 수 없습니다. banExemptOffline=§4당신은 접속중이지 않은 플레이어를 차단시킬 수 없습니다. banFormat=§4차단됨\:\n§r {0} banIpJoin=당신의 IP 주소가 서버에서 차단되었습니다. 사유\: {0} banJoin=당신은 이 서버에서 차단되어 있습니다. 사유\: {0} banipCommandDescription=IP 주소를 차단합니다. +banipCommandUsage1Description=사유와 함께 해당 IP를 차단합니다. bed=§obed§r bedMissing=§4당신의 침대가 놓여지지 않았거나 없어졌거나 막혀있습니다. bedNull=§mbed§r @@ -74,12 +77,16 @@ bigTreeSuccess=§6큰 나무를 성공적으로 생성하였습니다. bigtreeCommandDescription=바라보고 있는 곳에 큰 나무를 소환합니다. bigtreeCommandUsage=/ bigtreeCommandUsage1=/ +bigtreeCommandUsage1Description=해당 유형의 큰 나무를 소환합니다. blockList=§6EssentialsX는 다음 명령어들을 다른 플러그인으로 전달하고 있습니다\: blockListEmpty=§6EssentialsX는 다른 플러그인에 명령어를 전달하지 않습니다. bookAuthorSet=§6책의 저자를 §c{0}§6으로 설정합니다. bookCommandDescription=쓰여진 책을 다시 열고 수정하는 것을 허가합니다. bookCommandUsage=/ [제목|[name] 이 씀] bookCommandUsage1=/ +bookCommandUsage1Description=책/쓰여진 책의 잠금을 걸거나 풉니다 +bookCommandUsage2Description=책의 저자를 설정합니다. +bookCommandUsage3Description=책의 제목을 설정합니다. bookLocked=§6이 책은 잠긴상태로 전환되었습니다. bookTitleSet=§6책의 제목을 §c{0}§6으로 설정합니다. breakCommandDescription=바라보고 있는 블록을 부숩니다. @@ -87,12 +94,15 @@ breakCommandUsage=/ broadcast=§6[§4공지§6]§a {0} broadcastCommandDescription=서버 전체에 메시지를 공지합니다. broadcastCommandUsage=/ +broadcastCommandUsage1Description=서버 전체에 메시지를 공지합니다 broadcastworldCommandDescription=월드에 메시지를 공지합니다. broadcastworldCommandUsage=/ broadcastworldCommandUsage1=/ +broadcastworldCommandUsage1Description=해당 월드에 메시지를 공지합니다 burnCommandDescription=플레이어에게 불을 붙입니다. burnCommandUsage=/<닉네임><시간>[사유] burnCommandUsage1=/<닉네임><시간>[사유] +burnCommandUsage1Description=해당 플레이어에게 일정 초 동안 불을 붙입니다 burnMsg=§6당신은 §c{0} §6님에게 §c{1} §6초 만큼 불을 질렀습니다. cannotSellNamedItem=§6이름이 설정된 아이템은 판매할 수 없습니다. cannotSellTheseNamedItems=§6이름이 설정된 아이템은 판매할 수 없습니다\: §4{0} @@ -113,18 +123,25 @@ clearInventoryConfirmToggleOn=§6이제 인벤토리를 비울 때 확인을 받 clearinventoryCommandDescription=인벤토리의 모든 아이템을 비웁니다. clearinventoryCommandUsage=/ [플레이어|*] [아이템[\:]|*|**] [수량] clearinventoryCommandUsage1=/ +clearinventoryCommandUsage1Description=인벤토리의 모든 아이템을 비웁니다 +clearinventoryCommandUsage2Description=해당 플레이어의 인벤토리의 모든 아이템을 비웁니다 clearinventoryconfirmtoggleCommandDescription=인벤토리를 비울 때 확인을 받을지 정합니다. clearinventoryconfirmtoggleCommandUsage=/ commandCooldown=§c그 명령어는 사용할 수 없습니다. 사유\: {0}. commandDisabled=§c명령어§6 {0}§c (은)는 비활성화되었습니다. commandFailed=명령어 {0} 사용 실패\: commandHelpFailedForPlugin={0} 플러그인의 도움말을 불러올 수 없습니다. +commandHelpLine1=§6명령어 도움말\: §f/{0} +commandHelpLine2=§6설명\: §f{0} +commandHelpLine3=§6사용법(s); +commandHelpLine4=§6별칭\: §f{0} commandNotLoaded=§c 명령어 {0}를 잘못 불러왔습니다. compassBearing=§6방위\: {0} ({1} 도). compassCommandDescription=현재 방위를 보여줍니다. compassCommandUsage=/ condenseCommandDescription=아이템을 더 작은 블록으로 압축합니다. condenseCommandUsage1=/ +condenseCommandUsage1Description=인벤토리의 모든 아이템을 비웁니다 configFileMoveError=config.yml를 백업 위치로 이동하지 못했습니다. configFileRenameError=임시 파일의 이름을 config.yml로 변경하지 못했습니다. confirmClear=§7정말로 인벤토리를 §l비우시겠습니까?§7 다음 명령어를 반복하세요\: §6{0} @@ -139,6 +156,7 @@ createdKit=§c{1} §6개의 아이템이 포함된 §c{0} §6키트를 생성했 createkitCommandDescription=게임 안에서 키트를 만듭니다\! createkitCommandUsage=/ createkitCommandUsage1=/ +createkitCommandUsage1Description=설정된 이름과 딜레이에 맞춰 키트를 만듭니다. createKitFailed=§4{0} 키트를 생성하는 도중 오류가 발생했습니다. createKitSeparator=§m----------------------- createKitSuccess=§6생성된 키트\: §f{0}\n§6쿨타임\: §f{1}\n§6링크\: §f{2}\n§6위의 링크에 있는 내용을 kits.yml에 복사합니다. @@ -152,22 +170,31 @@ customtextCommandUsage=/ - bukkit.yml 에 정의됨 day=일 days=일 defaultBanReason=당신은 관리자에 의해 서버에서 차단되었습니다\! +deletedHomes=모든 집이 삭제되었습니다. +deletedHomesWorld={0} 에 있는 모든 집이 삭제되었습니다. deleteFileError={0} 파일이 삭제되지 않았습니다. deleteHome=§6집§c {0} 이 제거가 되었습니다. deleteJail=§7{0} 감옥이 제거되었습니다. deleteKit=§6키트 §c{0} §6(이)가 제거되었습니다. deleteWarp=§6워프 {0}는(은) 삭제되었습니다. +deletingHomes=집을 모두 삭제하는 중... +deletingHomesWorld={0} 에 있는 집을 모두 삭제하는 중... delhomeCommandDescription=집을 제거합니다. delhomeCommandUsage=/ [player\:] +delhomeCommandUsage1Description=주어진 이름을 가진 집을 삭제합니다. +delhomeCommandUsage2Description=해당 플레이어의 주어진 이름을 가진 집을 삭제합니다. deljailCommandDescription=감옥을 제거합니다. deljailCommandUsage=/ deljailCommandUsage1=/ +deljailCommandUsage1Description=주어진 이름을 가진 감옥을 삭제합니다. delkitCommandDescription=해당 키트를 삭제합니다. delkitCommandUsage=/ delkitCommandUsage1=/ +delkitCommandUsage1Description=주어진 이름을 가진 키트를 삭제합니다. delwarpCommandDescription=해당 워프를 삭제합니다. delwarpCommandUsage=/ delwarpCommandUsage1=/ +delwarpCommandUsage1Description=주어진 이름을 가진 워프를 삭제합니다. deniedAccessCommand=§c{0}님은 해당 명령어에 접근할 권한이 없습니다. denyBookEdit=§4당신은 이 책의 잠금을 해제할 수 없습니다. denyChangeAuthor=§4당신은 이 책의 저자를 변경할 수 없습니다. @@ -192,6 +219,10 @@ durability=§6이 도구는 사용 가능 횟수가 s §c{0}§6번 남았습니 east=E ecoCommandDescription=서버 경제를 관리합니다. ecoCommandUsage=/ +ecoCommandUsage1Description=해당 플레이어에게 주어진 값만큼의 돈을 줍니다. +ecoCommandUsage2Description=해당 플레이어에게서 주어진 값만큼의 돈을 뺍니다. +ecoCommandUsage3Description=해당 플레이어의 잔고를 주어진 값으로 설정합니다. +ecoCommandUsage4Description=해당 플레이어의 잔고를 서버의 시작 잔고로 초기화합니다. editBookContents=§e이제 이 책의 내용을 수정할 수 있습니다. enabled=활성화 enchantCommandDescription=유저가 들고있는 아이템에 마법을 부여합니다. @@ -205,15 +236,27 @@ enchantments=§6인챈트\:§r {0} enderchestCommandDescription=엔더 상자를 열어봅니다. enderchestCommandUsage=/ [player] enderchestCommandUsage1=/ +enderchestCommandUsage1Description=엔더 상자를 엽니다 +enderchestCommandUsage2Description=해당 플레이어의 엔더 상자를 엽니다. errorCallingCommand=/{0} 명령어 사용 중 오류 발생. errorWithMessage=§c오류\:§4 {0} essentialsCommandDescription=에센셜 리로드. essentialsCommandUsage=/ +essentialsCommandUsage1Description=에센셜 설정을 리로드합니다. +essentialsCommandUsage2Description=에센셜 버전을 불러옵니다. +essentialsCommandUsage4Description=에센셜 "디버그 모드"를 켜고 끕니다. +essentialsCommandUsage5Description=해당 플레이어의 userdata를 초기화합니다 +essentialsCommandUsage6Description=오래된 userdata를 정리합니다 +essentialsCommandUsage7Description=유저의 집을 관리합니다 essentialsHelp1=파일이 망가져서 Essentials에서 열 수 없습니다. Essentials은 비활성화 되었습니다. 만약 해결하지 어려우시다면, 다음으로 가세요 http\://tiny.cc/EssentialsChat essentialsHelp2=파일이 망가져서 Essentials에서 열 수 없습니다. Essentials은 비활성화 되었습니다. 만약 스스로 해결하지 못하겠다면, /essentialshelp 명령어나 다음으로 가세요. http\://tiny.cc/EssentialsChat essentialsReload=§6에센셜§c {0}§6리로드가 완료되었습니다. exp=§c{0} §6는§c {1} §6경험치 (레벨§c {2}§6) 을 가지고 있고,§c {3} §6의 경험치가 있으면 레벨 업 할 수 있습니다.. expCommandDescription=플레이어의 경험치를 주거나, 설정하고, 초기화하고, 봅니다. +expCommandUsage1Description=해당 플레이어에게 주어진 값만큼의 경험치를 줍니다. +expCommandUsage2Description=해당 플레이어의 경험치를 주어진 값으로 설정합니다 +expCommandUsage4Description=해당 플레이어가 가지고 있는 경험치를 표시합니다 +expCommandUsage5Description=해당 플레이어의 경험치를 0으로 초기화합니다 expSet=§c{0} §6은 이제§c {1} §6경험치 입니다. extCommandDescription=플레이어 불 끄기 extCommandUsage=/ [player] @@ -234,8 +277,11 @@ fireballCommandDescription=화염구나 다른 던질 수 있는 것들을 던 fireballCommandUsage1=/ fireworkColor=§4불꽃놀이 매게수가 알맞지 않습니다. 불꽃놀이 매게 변수 삽입, 색상을 먼저 설정해주세요. fireworkCommandDescription=폭죽의 스택을 수정합니다. +fireworkCommandUsage4Description=들고 있는 폭죽에 효과를 추가합니다. fireworkEffectsCleared=§6들고있는 폭죽의 효과를 모두 제거했습니다. fireworkSyntax=§6불꽃놀이 매개변수\:§c 색깔\:<색깔> [페이드\:<색깔>] [모양\:<모양>] [효과\:<효과>]\n§6다중 색깔/효과, 사용하여 값을 쉼표로 구분하세요 \: §우는색,파란색,분홍색\n§6모양\:§c 별, 공, 대형, 크리퍼, 버스트 §6효과\:§c 트레일, 반짝. +fixedHomes=잘못된 집이 삭제되었습니다. +fixingHomes=잘못된 집을 삭제하는 중... flyCommandDescription=이륙하고, 비상하라\! flyCommandUsage1=/ [player] flying=비행중 @@ -308,7 +354,11 @@ homeConfirmation=§6집 §c{0} §6(이)가 이미 있습니다\!\n이미 있는 homeSet=§6이곳을 집으로 설정하였습니다. hour=시간 hours=시(시간) +iceCommandUsage=/ [player] +iceCommandUsage1=/ +iceOther=§c{0}§6 식히는 중. ignoreCommandDescription=다른 플레이어를 무시하거나 무시하지 않습니다. +ignoreCommandUsage1Description=해당 플레이어를 무시하거나 무시하지 않습니다 ignoredList=§6무시됨\:§r {0} ignoreExempt=§4당신은 이 플레이어를 무시할 수 없습니다. ignorePlayer=당신은 이제 {0} 플레이어를 무시합니다. @@ -340,6 +390,7 @@ inventoryClearingAllItems=§c{0} §6의 모든 인벤토리 아이템을 비웠 inventoryClearingFromAll=§6모든 유저의 인벤토리가 초기화됩니다. inventoryClearingStack=§c{2}§6에게서 §c {0} §6개의§c {1} §6(을)를 제거했습니다. invseeCommandDescription=다른 플레이어의 인벤토리를 봅니다. +invseeCommandUsage1Description=해당 플레이어의 인벤토리를 엽니다 is=은/는 isIpBanned=§6IP §c{0} §6는 차단 되었습니다. internalError=§c명령어를 수행하던 중 내부 오류가 발생했습니다. @@ -348,6 +399,9 @@ itemCommandDescription=아이템을 소환합니다. itemId=§6ID\:§c {0} itemloreClear=§6아이템의 설명을 지웠습니다. itemloreCommandDescription=아이템의 설명을 수정합니다. +itemloreCommandUsage1Description=들고 있는 아이템의 설명에 주어진 텍스트를 추가합니다. +itemloreCommandUsage2Description=들고 있는 아이템의 설명을 주어진 줄과 설명으로 설정합니다. +itemloreCommandUsage3Description=들고 있는 아이템의 설명을 초기화합니다 itemloreInvalidItem=§4설명을 수정하려면 아이템을 손에 들고있어야 합니다. itemloreNoLine=§4들고있는 아이템의 §c{0}§4번째 줄에 설명이 없습니다. itemloreNoLore=§4들고있는 아이템에는 아무 설명도 없습니다. @@ -358,6 +412,8 @@ itemNames=§6짧은 아이템 이름\:§r {0} itemnameClear=§6아이템의 이름을 지웠습니다. itemnameCommandDescription=아이템의 이름을 정합니다. itemnameCommandUsage1=/ +itemnameCommandUsage1Description=들고 있는 아이템의 이름을 초기화합니다 +itemnameCommandUsage2Description=들고 있는 아이템의 이름을 주어진 이름으로 설정합니다 itemnameInvalidItem=§c이름을 수정하려면 아이템을 손에 들고있어야 합니다. itemnameSuccess=§6들고있는 아이템의 이름을 "§c{0}§6"§6 (으)로 수정했습니다. itemNotEnough1=§c당신은 판매하기위한 아이템을 충분히 가지고있지 않습니다. @@ -372,6 +428,7 @@ itemSoldConsole=§e{0} (이)가 §e {1}§a(을)를 §e{2} §a에 판매함 ({3} itemSpawn=§7아이템 {1}을/를 {0}개 줍니다. itemType=§6아이템\:§c {0} itemdbCommandDescription=아이템을 검색합니다. +itemdbCommandUsage1Description=주어진 아이템의 데이터베이스를 검색합니다 jailAlreadyIncarcerated=§4사람이 이미 감옥에 있음\:§c {0} jailList=§6감옥\:§r {0} jailMessage=§c당신은 범죄를 저지르고있습니다, 당신은 시간이 필요합니다. @@ -380,6 +437,7 @@ jailReleased=§6유저 §c{0}§6는 감옥에서 석방되었습니다. jailReleasedPlayerNotify=§6당신은 석방되었습니다\! jailSentenceExtended=§6감옥 시간이 다음과 같이 연장되었습니다.\: {0} jailSet=§c{0} §6 감옥이 생성되었습니다. +jailWorldNotExist=§4그 감옥의 월드가 존재하지 않습니다. jumpEasterDisable=§6Flying wizard 모드 비활성화됨. jumpEasterEnable=§6Flying wizard 모드 활성화됨. jailsCommandDescription=감옥 목록을 봅니다. @@ -390,16 +448,21 @@ jumpError=이것은 당신의 컴퓨터에 오류를 일으킬 수 있습니다. kickCommandDescription=해당 플레이어를 사유와 함께 강퇴합니다. kickCommandUsage=/<닉네임>[사유] kickCommandUsage1=/<닉네임>[사유] +kickCommandUsage1Description=사유와 함께 해당 플레이어를 추방합니다 kickDefault=서버에서 추방되셨습니다. kickedAll=§4모든사람을 킥했습니다. kickExempt=§4당신은 킥을 할수 없습니다. kickallCommandDescription=본인을 제외한 모든 플레이어를 강퇴합니다. +kickallCommandUsage1Description=사유와 함께 모든 플레이어를 추방합니다 kill=§c{0}§6님이 사망하였습니다. killCommandDescription=해당 플레이어를 죽입니다. +killCommandUsage1Description=해당 플레이어를 죽입니다 killExempt=§4당신은 §c{0} §4를 죽일수 없습니다. kitCommandDescription=해당 키트를 얻거나 사용 가능한 키트를 봅니다. kitCommandUsage1=/ +kitCommandUsage1Description=모든 사용 가능한 키트를 봅니다 kitCommandUsage2=/ [player] +kitCommandUsage2Description=그 키트를 자신이나 다른 플레이어에게 줍니다 kitContains=§6키트 §c{0} §6에는 다음이 포함됩니다\: kitCost=\ §7§o({0})§r kitDelay=§m{0}§r @@ -439,6 +502,9 @@ loomCommandUsage=/ mailClear=§6메일을 읽음으로 표시하려면, §c /mail clear§6를 입력하세요. mailCleared=§6메일함을 비웠습니다\! mailCommandDescription=플레이어에게 서버 내 메일을 보냅니다. +mailCommandUsage2Description=메일을 정리합니다 +mailCommandUsage3Description=주어진 메시지를 해당 플레이어에게 보냅니다 +mailCommandUsage4Description=주어진 메시지를 모든 플레이어에게 보냅니다 mailDelay=너무 많은 양의 이메일을 보냈습니다. 최대\: {0} mailFormat=§6[§r{0}§6] §r{1} mailMessage={0} @@ -452,6 +518,7 @@ maxMoney=§4 이 트랜잭션이 계정에 대한 균형 제한을 초과할 것 mayNotJail=§4이 플레이어는 감옥에 가둘 수 없습니다\! mayNotJailOffline=§4당신은 접속중이지 않은 플레이어를 감옥에 보낼 수 없습니다. meCommandDescription=플레이어의 현재 상황을 설명합니다. +meCommandUsage1Description=상황을 설명합니다 meSender=나 meRecipient=나 minimumBalanceError=§4유저가 최소로 가질 수 있는 잔고는 {0} 입니다. @@ -660,6 +727,8 @@ repair=§c{0}§6를 성공적으로 수리하였습니다. repairAlreadyFixed=§4이 아이템은 수리가 필요하지 않습니다. repairCommandDescription=한개 또는 모든 아이템의 내구도를 수리합니다. repairCommandUsage1=/ +repairCommandUsage1Description=들고 있는 아이템을 수리합니다 +repairCommandUsage2Description=인벤토리의 모든 아이템을 수리합니다 repairEnchanted=§4당신은 인챈트 된 아이템을 수리할 수 없습니다. repairInvalidType=§4이 아이템은 수리될 수 없습니다. repairNone=§4수리하는데 필요한 아이템이 없습니다. @@ -713,6 +782,7 @@ setjailCommandDescription=[jailname] (으)로 감옥을 만듭니다. setjailCommandUsage=/ setjailCommandUsage1=/ settprCommandDescription=§6무작위 텔레포트 장소와 매개변수를 정합니다. +settprCommandUsage1Description=무작위 텔레포트의 중심을 현재 위치로 설정합니다 settpr=§6무작위 텔레포트의 중심을 정합니다. settprValue=§6무작위 텔레포트 §c{0} §6(을)를 §c{1} §6(으)로 설정합니다. setwarpCommandDescription=새 워프를 만듭니다. @@ -813,11 +883,13 @@ timeBeforeHeal=§4다음 회복까지 필요한 시간\:§c {0}§4. timeBeforeTeleport=§4다음 텔레포트까지 필요한 시간\:§c {0}§4. timeCommandDescription=월드의 시간을 표시/변경합니다. 기본값은 현재 월드입니다. timeCommandUsage1=/ +timeCommandUsage1Description=모든 월드의 시간을 표시합니다 timeFormat=§c{0}§6 또는 §c{1}§6 또는 §c{2}§6 timeSetPermission=시간을 설정할 권한이 없습니다. timeSetWorldPermission=§4''{0}'' §4월드의 시간을 설정할 권한이 없습니다. timeWorldAdd=§c{1}§6의 시간이 §c {0} §6만큼 앞으로 이동했습니다. timeWorldCurrent=§6§c{0}§6의 현재 시간은§c {1} §6입니다. +timeWorldCurrentSign=§6현재 시간은 §c{0} §6입니다. timeWorldSet=§6월드\: §c{1} §6의 시간이 §c{0} §6(으)로 설정되었습니다. togglejailCommandDescription=감옥에 플레이어를 가두거나 석방합니다. toggleshoutCommandDescription=외치기 모드를 활성화하거나 비활성화합니다. @@ -829,11 +901,16 @@ totalSellableBlocks=§a판매할 수 있는 블록의 총 가치는 §c{1} §a totalWorthAll=§a모든 아이템과 블럭들을 판매한 총합은 §c{1}§a 입니다. totalWorthBlocks=§a모든 블럭을 판매한 총합은 §c{1}§a 입니다. tpCommandDescription=플레이어에게 텔레포트합니다. +tpCommandUsage1Description=자신을 해당 플레이어에게 텔레포트시킵니다. +tpCommandUsage2Description=첫번째 플레이어를 두번째 플레이어에게 텔레포트시킵니다. tpaCommandDescription=해당 플레이어에게 텔레포트를 요청합니다. +tpaCommandUsage1Description=해당 플레이어에게 텔레포트를 요청합니다 tpaallCommandDescription=모든 접속중인 플레이어를 나에게 텔레포트하도록 요청합니다. +tpaallCommandUsage1Description=모든 플레이어를 나에게 텔레포트하도록 요청합니다 tpacancelCommandDescription=모든 미결정된 텔레포트 요청을 취소합니다. [player] 를 지정해 취소할 수도 있습니다. tpacancelCommandUsage=/ [player] tpacancelCommandUsage1=/ +tpacancelCommandUsage1Description=모든 대기중인 텔레포트 요청을 취소합니다. tpacceptCommandDescription=텔레포트 요청을 수락합니다. tpacceptCommandUsage1=/ tpahereCommandDescription=해당 플레이어를 나에게 텔레포트하도록 요청합니다. @@ -854,6 +931,7 @@ tpposCommandDescription=좌표로 텔레포트합니다. tprCommandDescription=무작위로 텔레포트합니다. tprCommandUsage=/ tprCommandUsage1=/ +tprCommandUsage1Description=무작위 위치로 텔레포트합니다 tprSuccess=§6무작위 위치로 텔레포트중... tps=§6현재 TPS \= {0} tptoggleCommandDescription=모든 형태의 텔레포트를 차단합니다. @@ -933,11 +1011,13 @@ voiceSilencedReason=§6목소리가 침묵되었습니다\! 사유\: §c{0} voiceSilencedReasonTime=§6목소리가 {0} 동안 침묵되었습니다\! 사유\: §c{1} walking=걷기 warpCommandDescription=워프 목록을 보거나 해당 장소로 워프합니다. +warpCommandUsage2Description=자신 또는 해당 플레이어를 주어진 워프로 텔레포트시킵니다. warpDeleteError=§4워프 파일 삭제중 문제가 발생했습니다. warpInfo=§6워프§c {0} §6의 정보\: warpinfoCommandDescription=해당 워프의 위치 정보를 찾아봅니다. warpinfoCommandUsage=/ warpinfoCommandUsage1=/ +warpinfoCommandUsage1Description=해당 워프의 정보를 보여줍니다. warpingTo=§c{0}§6으로 워프합니다. warpList={0} warpListPermission=§4당신은 워프 목록을 볼 권한이 없습니다. @@ -946,9 +1026,12 @@ warpOverwrite=§4당신은 워프를 덮어 씌울 수 없습니다. warps=§6워프 리스트\:§r {0} warpsCount=§6현재§c {0} §6개의 워프가 있습니다. 페이지 §c{1}§6/§c{2}§6. weatherCommandDescription=날씨를 설정합니다. +weatherCommandUsage1Description=일정 기간동안 주어진 날씨로 설정합니다. warpSet=§6워프 {0}이 추가되었습니다. warpUsePermission=§c당신은 그 워프를 사용할 권한이 없습니다. weatherInvalidWorld={0}이라는 월드를 찾을 수 없습니다. +weatherSignStorm=§6날씨\: §c폭풍우§6. +weatherSignSun=§6날씨\: §c맑음§6. weatherStorm=§6{0}의 날씨가 폭풍으로 설정되었습니다 weatherStormFor=§c{0} §6의 날씨를 §c{1} §6 동안 §c폭풍§6으로 설정했습니다. weatherSun=§6{0}§6의 날씨가 맑음으로 설정되었습니다. @@ -958,6 +1041,7 @@ whoisAFK=§6 - 잠수\:§r {0} whoisAFKSince=§6 - 잠수\:§r {0} ({1} 부터) whoisBanned=§6 - 차단\:§r {0} whoisCommandDescription=닉네임 뒤에 가려진 진짜 닉네임을 확인합니다. +whoisCommandUsage1Description=해당 플레이어의 기본적인 정보를 보여줍니다. whoisExp=§6 - 경험치\:§r {0} (레벨 {1}) whoisFly=§6 - 비행 모드\:§r {0} ({1}) whoisSpeed=§6 - 속도\:§r {0} @@ -982,6 +1066,7 @@ workbenchCommandDescription=작업대를 엽니다. workbenchCommandUsage=/ worldCommandDescription=월드를 이동합니다. worldCommandUsage1=/ +worldCommandUsage2Description=주어진 월드의 위치로 이동합니다. worth=§a{0} {2}개의 가격은 §c{1}§a 입니다. (아이템 1개의 가격은 {3} 입니다.) worthCommandDescription=들고있는 아이템 또는 해당 아이템의 가치를 계산합니다. worthMeta=§7겹쳐진 {0}\:{1} 는 §c{2}의 가치가 있씁니다.§7 (아이템 {3}는 각 {4} 만큼의 가치) diff --git a/Essentials/src/main/resources/messages_lt.properties b/Essentials/src/main/resources/messages_lt.properties index 669f946abe1..9add8288dab 100644 --- a/Essentials/src/main/resources/messages_lt.properties +++ b/Essentials/src/main/resources/messages_lt.properties @@ -240,6 +240,8 @@ homes=§6Namai\:§r {0} homeSet=§6Namai nustatyti. hour=valanda hours=valandos +iceCommandUsage=/ [player] +iceCommandUsage1=/ ignoredList=§6Ignoruoji\:§r {0} ignoreExempt=§4Tu negali ignoruoti šio žaidėjo. ignorePlayer=§6Nuo dabar tu ignoruoji§c {0} §6žaidėją. diff --git a/Essentials/src/main/resources/messages_lv_LV.properties b/Essentials/src/main/resources/messages_lv_LV.properties index 75c6f12a336..904998251c3 100644 --- a/Essentials/src/main/resources/messages_lv_LV.properties +++ b/Essentials/src/main/resources/messages_lv_LV.properties @@ -322,6 +322,9 @@ homeConfirmation=§6YJums jau ir māja ar nosaukumu §c{0}§6\!\nLai pārrakstī homeSet=§6Māja iestatīta uz pašreizējo atrašanās vietu. hour=stunda hours=stundas +iceCommandUsage=/ [player] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Ignorē vai atcel ignorēšanu citiem spēlētājiem. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_nl.properties b/Essentials/src/main/resources/messages_nl.properties index 1ef532176d9..7da3a472b5c 100644 --- a/Essentials/src/main/resources/messages_nl.properties +++ b/Essentials/src/main/resources/messages_nl.properties @@ -329,6 +329,9 @@ homeConfirmation=§6Je hebt al een huis genaamd §c{0}§6\!\nOm je bestaande hui homeSet=§6Thuisadres ingesteld als huidige locatie. hour=uur hours=uren +iceCommandUsage=/ [speler] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Negeer of stop negeren van andere spelers. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_no.properties b/Essentials/src/main/resources/messages_no.properties index d41aebff8a2..9f070a4466f 100644 --- a/Essentials/src/main/resources/messages_no.properties +++ b/Essentials/src/main/resources/messages_no.properties @@ -357,6 +357,9 @@ homeConfirmation=§6Du har allerede et hjem som heter §c{0}§6\!\nFor å oversk homeSet=§6Hjem satt til nåværende posisjon. hour=time hours=timer +iceCommandUsage=/ [spiller] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Ignorer eller slutt å ignorere andre spillere. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_pl.properties b/Essentials/src/main/resources/messages_pl.properties index 938a6c9ff06..62d2691151c 100644 --- a/Essentials/src/main/resources/messages_pl.properties +++ b/Essentials/src/main/resources/messages_pl.properties @@ -180,6 +180,7 @@ createkitCommandUsage1Description=Tworzy zestaw o podanej nazwie i czasie odnowi createKitFailed=§4Wystąpił błąd podczas tworzenia zestawu {0}. createKitSeparator=§m----------------------- createKitSuccess=§6Stworzono zestaw\: §f{0}\n§6Czas odnowienia\: §f{1}\n§6Link\: §f{2}\n§6Skopiuj zawartość linku do kits.yml. +createKitUnsupported=§4Serializacja NBT przedmiotów została włączona, ale ten serwer nie działa pod Paper 1.15.2+. Powrót do standardowej serializacji przedmiotów. creatingConfigFromTemplate=Tworzenie konfiguracji z szablonu\: {0} creatingEmptyConfig=Stworzono pusty plik konfiguracyjny\: {0} creative=Kreatywny @@ -190,11 +191,15 @@ customtextCommandUsage=/ - Zdefiniuj w bukkit.yml day=dzień days=dni defaultBanReason=Nie ustawiono powodu\! +deletedHomes=Wszystkie domy zostały usunięte. +deletedHomesWorld=Wszystkie domy w świecie {0} zostały usunięte. deleteFileError=Nie można usunąć pliku\: {0} deleteHome=§7Dom§c {0} §7został usunięty. deleteJail=§7Wiezienie§c {0} §7zostało usunięte. deleteKit=§6Zestaw§c {0} §6został usunięty. deleteWarp=§7Warp§c {0} §7został usunięty. +deletingHomes=Usuwanie wszystkich domów... +deletingHomesWorld=Usuwanie wszystkich domów w świecie {0}... delhomeCommandDescription=Usuwa dom. delhomeCommandUsage=/ [gracz\:] delhomeCommandUsage1=/ @@ -273,6 +278,10 @@ essentialsCommandUsage3Description=Daje informacje o tym, jakie polecenia Essent essentialsCommandUsage4=/ debug essentialsCommandUsage4Description=Przełącza "tryb debugowania" essentialsCommandUsage5Description=Resetuje dane danego gracza +essentialsCommandUsage6=/ cleanup +essentialsCommandUsage6Description=Czyści stare dane użytkownika +essentialsCommandUsage7=/ homes +essentialsCommandUsage7Description=Zarządza domami użytkownika essentialsHelp1=Plik jest uszkodzony i Essentials nie może go otworzyc. Essentials jest teraz wyłączone. Jesli nie możesz samemu naprawić pliku, idź na  http\://tiny.cc/EssentialsChat essentialsHelp2=Plik jest uszkodzony i Essentials nie może go otworzyc. Essentials jest teraz wyłączone. Jesli nie możesz samemu naprawić pliku, wpisz /essentialshelp w grze lub wejdź na http\://tiny.cc/EssentialsChat essentialsReload=§6Essentials przeładował§c {0}. @@ -313,6 +322,8 @@ fireworkCommandUsage1Description=Czyści wszystkie efekty z trzymanych fajerwerk fireworkCommandUsage2Description=Ustawia moc trzymanych fajerwerków fireworkEffectsCleared=§7Usunięto wszystkie efekty trzymanych w ręku fajerwerek. fireworkSyntax=§7Parametry fajerwerki\:§4 color\: [fade\:] [shape\:] [effect\:]\n§7By użyć wielu kolorow/efektow, oddziel wartości przecinkami\: §4red,blue,pink\n§7Ksztalty\:§4 star, ball, large, creeper, burst §7Efekty\:§4 trail, twinkle. +fixedHomes=Usunięto nieprawidłowe domy. +fixingHomes=Usuwanie nieprawidłowych domów... flyCommandDescription=Startuj i szybuj\! flyCommandUsage=/ [player] [on|off] flyCommandUsage1=/ [gracz] @@ -397,6 +408,16 @@ homeConfirmation=§6Masz już dom o nazwie §c{0}§6\! Aby go nadpisać, wpisz p homeSet=§7Dom został ustawiony. hour=godzina hours=godzin +ice=§7Zimno ci... +iceCommandDescription=Schłodzi gracza. +iceCommandUsage=/ [gracz] +iceCommandUsage1=/ +iceCommandUsage1Description=Schłodzi cię +iceCommandUsage2=/ +iceCommandUsage2Description=Schłodzi danego gracza +iceCommandUsage3=/ * +iceCommandUsage3Description=Schłodzi wszystkich graczy online +iceOther=§6Schładzanie gracza§c {0}§6. ignoreCommandDescription=Ignoruj lub odignoruj innych graczy. ignoreCommandUsage=/ ignoreCommandUsage1=/ @@ -510,6 +531,7 @@ kitCost=\ §7§o({0})§r kitDelay=§m{0}§r kitError=§4Nie ma prawidłowych zestawów. kitError2=§4Ten zestaw jest źle skonfigurowany. Skontaktuj się z administratorem\! +kitError3=Nie można dać przedmiotu zestawu w zestawie "{0}" użytkownikowi {1}, ponieważ przedmiot zestawu wymaga do deserializacji Paper 1.15.2+. kitGiveTo=§6Przyznano {1}§6 zestaw§c {0}§6. kitInvFull=§4Twój ekwipunek jest pełen, zestaw został wyrzucony na podłoge. kitInvFullNoDrop=§4W Twoim ekwipunku nie ma miejsca na ten zestaw. @@ -1141,7 +1163,7 @@ vanishCommandUsage1=/ [gracz] vanished=§7Już jesteś niewidoczny. versionCheckDisabled=§6Sprawdzanie aktualizacji jest wyłączone w pliku kofiguracyjnym. versionCustom=§6Sprawdzenie wersji nie jest możliwe\! Własna kompilacja? Informacje o kompilacji\: §c{0}§6. -versionDevBehind=§4Twoja programistyczna wersja EssentialsX (§c{0}§4) jest nie aktualna\! +versionDevBehind=§4Twoja programistyczna wersja EssentialsX (§c{0}§4) jest nieaktualna\! versionDevDiverged=§6Używasz eksperymentalnej komplacji EssentialsX''a, która jest o §c{0} §6wersje/wersji wstecz od ostatniej kompilacji programistycznej\! versionDevDivergedBranch=§6Gałąź funkcji\: §c{0}§6. versionDevDivergedLatest=§6Używasz aktualnej wersji eksperymentalnej EssentialsX\! diff --git a/Essentials/src/main/resources/messages_pt.properties b/Essentials/src/main/resources/messages_pt.properties index d678fd9efac..ecc56d9183a 100644 --- a/Essentials/src/main/resources/messages_pt.properties +++ b/Essentials/src/main/resources/messages_pt.properties @@ -182,11 +182,15 @@ customtextCommandUsage=/ - Definido no bukkit.yml day=dia days=dias defaultBanReason=Foste banido\! +deletedHomes=Todas as casas foram eliminadas. +deletedHomesWorld=Todas as casas em {0} foram eliminadas. deleteFileError=Não foi possível eliminar o ficheiro\: {0} deleteHome=§6A casa§c {0} §6foi removida. deleteJail=§6A jaula§c {0} §6foi removida. deleteKit=§6O kit§c {0} §6foi removido. deleteWarp=§6O warp§c {0} §6foi removido. +deletingHomes=A eliminar todas as casas... +deletingHomesWorld=A eliminar todas as casas em {0}... delhomeCommandDescription=Remove uma casa. delhomeCommandUsage=/ [jogador\:] delhomeCommandUsage1Description=Elimina uma das tuas casas @@ -258,13 +262,18 @@ essentialsCommandUsage2Description=Dispõe informação sobre a versão do Essen essentialsCommandUsage3Description=Dispõe informação sobre os comandos que o Essentials está a reencaminhar essentialsCommandUsage4Description=Alterna o modo depuração do Essentials essentialsCommandUsage5Description=Repõe os dados de um jogador +essentialsCommandUsage6Description=Elimina os dados antigos de um jogador +essentialsCommandUsage7Description=Gere as casas de um jogador essentialsHelp1=O ficheiro está corrompido e o Essentials não o consegue abrir. O Essentials está agora desativado. Se não conseguires corrigir o ficheiro por ti mesmo, acede a http\://tiny.cc/EssentialsChat essentialsHelp2=O ficheiro está corrompido e o Essentials não o consegue abrir. O Essentials está agora desativado. Se não conseguires corrigir o ficheiro por ti mesmo, usa o comando /essentialshelp ou acede http\://tiny.cc/EssentialsChat essentialsReload=§6O Essentials foi recarregado§c {0}. exp=§c{0} §6tem§c {1} §6de experiência (nível§c {2}§6) e precisa de mais§c {3} §6para subir de nível. expCommandDescription=Dá, define, repôe ou vê a quantidade de experiência de um jogador. expCommandUsage=/ [reset|show|set|give] [nome do jogador [quantidade]] +expCommandUsage1Description=Dá uma quantidade especificada de experiência a um jogador +expCommandUsage2Description=Define a quantidade especificada de experiência a um jogador expCommandUsage4Description=Dispõe a quantidade de experiência que um jogador tem +expCommandUsage5Description=Remove a experiência de um jogador expSet=§c{0} §6tem agora§c {1} §6de experiência. extCommandDescription=Apaga o fogo dos jogadores que estejam a arder. extCommandUsage=/ [jogador] @@ -280,6 +289,7 @@ feed=§6O teu apetite foi saciado. feedCommandDescription=Satisfaz a fome. feedCommandUsage=/ [jogador] feedCommandUsage1=/ [jogador] +feedCommandUsage1Description=Satisfaz a fome de um jogador feedOther=§6O apetite de {0}§6 foi saciado. fileRenameError=Ocorreu um erro ao alterar o nome do ficherio {0}. fireballCommandDescription=Atira uma bola de fogo ou outro projétil. @@ -291,9 +301,12 @@ fireworkCommandUsage=/ <|power [quantidade]|clear|fire [qua fireworkCommandUsage1Description=Elimina todos os efeitos do fogo-de-artifício em mão fireworkEffectsCleared=§6Foram removidos todos os efeitos destes itens. fireworkSyntax=§6Parâmetros do fogo-de-artifício\:§c color\: [fade\:] [shape\:] [effect\:]\n§6Para usar várias cores ou efeitos, separa-os por vírgulas\: §cred,blue,pink\n§6Formatos\:§c star, ball, large, creeper, burst §6Efeitos\:§c trail, twinkle. +fixedHomes=Todas as casas inválidas foram eliminadas. +fixingHomes=A eliminar casa inválidas... flyCommandDescription=Altera o modo de voo. flyCommandUsage=/ [jogador] [on|off] flyCommandUsage1=/ [jogador] +flyCommandUsage1Description=Alterna o modo de voo de um jogador flying=a voar flyMode=§6O modo de voo foi§c {0} §6para {1}§6. foreverAlone=§4Não tens ninguém a quem responder. @@ -305,6 +318,7 @@ gameModeInvalid=§4É necessário especificar um modo ou jogador válido. gamemodeCommandDescription=Altera o modo de jogo de um jogador. gamemodeCommandUsage=/ [jogador] gamemodeCommandUsage1=/ [jogador] +gamemodeCommandUsage1Description=Define o modo de jogo de um jogador gcCommandDescription=Indica a memória, o tempo online e as informações dos tiques. gcCommandUsage=/ gcfree=§6Memória livre\:§c {0} MB. @@ -315,8 +329,10 @@ geoipJoinFormat=§6O jogador §c{0} §6é de §c{1}§6. getposCommandDescription=Obtém as tuas coordenadas ou as de um jogador. getposCommandUsage=/ [jogador] getposCommandUsage1=/ [jogador] +getposCommandUsage1Description=Obtém as coordenadas de um jogador giveCommandDescription=Dá um item a um jogador. giveCommandUsage=/ [quantidade [itemmeta...]] +giveCommandUsage1Description=Dá 64 itens (ou uma quantidade especificada) a um jogador geoipCantFind=§6O jogador §c{0} §6vem de §aum país desconhecido§6. geoIpErrorOnJoin=Não foi possível obter os dados do GeoIP de {0}. Certifica-te que o número da licença e da configuração estão corretos. geoIpLicenseMissing=Não foi encontrada nenhuma chave de licença. Acede a https\://essentialsx.net/geoip para obteres ajuda com a configuração. @@ -326,6 +342,7 @@ givenSkull=§6Recebeste a cabeça de §c{0}§6. godCommandDescription=Ativa os teus poderes míticos. godCommandUsage=/ [jogador] [on|off] godCommandUsage1=/ [jogador] +godCommandUsage1Description=Alterna os poderes míticos (god mode) de um jogador giveSpawn=§6A dar§c {0} §6de§c {1} §6a§c {2}§6. giveSpawnFailure=§4Não há espaço suficiente. O item §c{0} {1} §4não foi dado. godDisabledFor=§cdesativado§6 para§c {0} @@ -340,6 +357,7 @@ hatCommandDescription=Obtém um chapéu todo janota. hatCommandUsage=/ [remove] hatCommandUsage1=/ hatCommandUsage1Description=Define o item que tens em mão como chapéu +hatCommandUsage2Description=Remove o teu chapéu hatCurse=§4Não podes remover um chapéu com a maldição da união\! hatEmpty=§4Não estás a usar um chapéu. hatFail=§4Tens de ter um item na tua mão para usar como chapéu. @@ -350,6 +368,7 @@ heal=§6Foste curado. healCommandDescription=Cura-te a ti ou a outro jogador. healCommandUsage=/ [jogador] healCommandUsage1=/ [jogador] +healCommandUsage1Description=Cura um jogador healDead=§4Não podes curar um jogador morto\! healOther=§c{0} §6foi curado. helpCommandDescription=Mostra uma lista de comandos disponíveis. @@ -363,6 +382,7 @@ helpPlugin=§4{0}§r\: Ajuda do plugin\: /help {1} helpopCommandDescription=Envia uma mensagem aos administradores online. helpopCommandUsage=/ helpopCommandUsage1=/ +helpopCommandUsage1Description=Envia uma mensagem a todos os administradores online holdBook=§Não estás a segurar num livro em que possas escrever. holdFirework=§4Segura num fogo-de-artifício para lhe adicionares efeitos. holdPotion=§4Segura numa poção para lhe adicionares efeitos. @@ -376,9 +396,20 @@ homeConfirmation=§6Já tens uma casa nomeada §c{0}§6\!\nUsa novamente o coman homeSet=§6Casa definida para a posição atual. hour=hora hours=horas +ice=§6Sentes-te com muito mais frio... +iceCommandDescription=Arrefece um jogador. +iceCommandUsage=/ [jogador] +iceCommandUsage1=/ +iceCommandUsage1Description=Arrefece-te +iceCommandUsage2=/ +iceCommandUsage2Description=Arrefece um jogador +iceCommandUsage3=/ * +iceCommandUsage3Description=Arrefece todos os jogadores online +iceOther=§6A arrefecer§c {0}§6. ignoreCommandDescription=Ignora outros jogadores. ignoreCommandUsage=/ ignoreCommandUsage1=/ +ignoreCommandUsage1Description=Ignora ou deixa de ignorar um jogador ignoredList=§6Ignorado(s)\:§r {0} ignoreExempt=§Não podes ignorar este jogador. ignorePlayer=§6Estás agora a ignorar§c {0} §6. @@ -464,6 +495,7 @@ jailReleased=§6 §c{0}§6 foi libertado. jailReleasedPlayerNotify=§6Estás livre da jaula\! jailSentenceExtended=§6O tempo na jaula foi prolongado para §c{0}§6. jailSet=§6A jaula§c {0} §6foi definida. +jailWorldNotExist=§4A jaula desse mundo não existe. jumpEasterDisable=§6O assistente de voo foi desativado. jumpEasterEnable=§6O assistente de voo foi ativado. jailsCommandDescription=Mostra uma lista de todas as jaulas. @@ -521,6 +553,7 @@ lightningCommandDescription=Ataca um jogador com os poderes míticos. lightningCommandUsage=/ [jogador] [intensidade] lightningCommandUsage1=/ [jogador] lightningCommandUsage1Description=Lança um relâmpago para onde estás a olhar ou para outro jogador +lightningCommandUsage2Description=Atinge um jogador com um relâmpago com uma força especificada lightningSmited=§6Foste atingido\! lightningUse=§6A atingir§c {0} listAfkTag=§7[Ausente]§r @@ -596,6 +629,7 @@ msgIgnore=§c{0} §4tem as mensagens desativadas. msgtoggleCommandDescription=Bloqueia a receção de todas as mensagens privadas. msgtoggleCommandUsage=/ [jogador] [on|off] msgtoggleCommandUsage1=/ [jogador] +msgtoggleCommandUsage1Description=Alterna o modo de voo de um jogador multipleCharges=§4Não podes aplicar mais do que uma carga a este fogo-de-artifício. multiplePotionEffects=§4Não podes aplicar mais do que um efeito a esta poção. muteCommandDescription=Silencia um jogador. @@ -613,16 +647,27 @@ muteNotify=§c {0} §6 silenciou §6 §c {1}. muteNotifyFor=§c{0} §6silenciou §c{1}§6 por§c {2}§6. muteNotifyForReason=§c{0} §6silenciou §c{1}§6 por§c {2}§6. Motivo\: §c{3} muteNotifyReason=§c{0} §6. silenciou §c{1}§6. Motivo\: §c{2} -nearCommandDescription=Mostra uma lista dos jogadores perto de um jogador. +nearCommandDescription=Dispõe uma lista dos jogadores perto de um jogador. nearCommandUsage=/ [nome do jogador] [raio] nearCommandUsage1=/ +nearCommandUsage1Description=Dispõe uma lista de todos os jogadores na área à tua volta +nearCommandUsage2Description=Dispõe uma lista de todos os jogadores numa dada área à tua volta nearCommandUsage3=/ +nearCommandUsage3Description=Dispõe uma lista de todos os jogadores na área à volta de um jogador +nearCommandUsage4Description=Dispõe uma lista de todos os jogadores numa dada área à volta de um jogador nearbyPlayers=§6Jogadores perto\:§r {0} negativeBalanceError=§4Este jogador não tem permissões para ter dinheiro negativo. nickChanged=§6A alcunha foi alterada. nickCommandDescription=Muda a alcunha de um jogador. nickCommandUsage=/ [jogador] nickCommandUsage1=/ +nickCommandUsage1Description=Altera a alcunha +nickCommandUsage2=/ off +nickCommandUsage2Description=Remove a tua alcunha +nickCommandUsage3=/ +nickCommandUsage3Description=Altera a alcunha de um jogador +nickCommandUsage4=/ off +nickCommandUsage4Description=Remove a alcunha de um jogador nickDisplayName=§4Tens de ativar "change-displayname" no ficheiro de configurações do Essentials. nickInUse=§4Esse nome já está a ser utilizado. nickNameBlacklist=§4Não é permitido o uso dessa alcunha. @@ -675,6 +720,8 @@ noWarpsDefined=§6Não foi definido nenhum warp. nuke=§5Que chova morte sobre eles. nukeCommandDescription=Que chova morte sobre eles. nukeCommandUsage=/ [jogador] +nukeCommandUsage1=/ [jogadores...] +nukeCommandUsage1Description=Bombardeia todos os jogadores ou um jogador especificado numberRequired=Tens de indicar um número. onlyDayNight=Só podes usar "day" ou "night" no comando "/time". onlyPlayers=§4Só os jogadores online podem usar §c{0}§4. @@ -688,6 +735,7 @@ passengerTeleportFail=§4Não é possível seres teletransportado enquanto carre payCommandDescription=Paga a outro jogador com o teu dinheiro. payCommandUsage=/ payCommandUsage1=/ +payCommandUsage1Description=Paga um valor especificado a um jogador payConfirmToggleOff=§6A confirmação de pagamentos foi desativada. payConfirmToggleOn=§6A confirmação de pagamentos foi ativada. payDisabledFor=§6A aceitação de pagamentos foi desativado para §c{0}§6. @@ -744,6 +792,8 @@ powerToolsDisabled=§6Todas as tuas ferramentas de poder foram desativadas. powerToolsEnabled=§6Todas as ferramentas de poder foram ativadas. powertoolCommandDescription=Atribui um comando ao item que tens nas mãos. powertoolCommandUsage=/ [l\:|a\:|r\:|c\:|d\:][comando] [argumentos] - {player} pode ser trocado pelo nome de um jogador. +powertoolCommandUsage1Description=Dispõe todas as powertools do item em mão +powertoolCommandUsage2Description=Elimina todas as powertools do item em mão powertooltoggleCommandDescription=Ativa ou desativa as super ferramentas. powertooltoggleCommandUsage=/ ptimeCommandDescription=Configura as horas de cliente de um jogador. Adiciona @ como prefixo para corrigires. @@ -921,6 +971,7 @@ spawnSet=§6O local de renascimento foi definido para o grupo§c {0}§6. spectator=espectador speedCommandDescription=Altera os limites de velocidade. speedCommandUsage=/ [type] [jogador] +speedCommandUsage1Description=Define a velocidade de voo ou de movimento de um jogador stonecutterCommandDescription=Abre o interface de um cortador de pedras. stonecutterCommandUsage=/ sudoCommandDescription=Executa um comando por outro jogador. @@ -1182,9 +1233,12 @@ workbenchCommandUsage=/ worldCommandDescription=Troca entre mundos. worldCommandUsage=/ [mundo] worldCommandUsage1=/ +worldCommandUsage2=/ +worldCommandUsage2Description=Teletransporta-te para a tua localização num mundo especificado worth=§aConjunto de {0} que vale §c{1}§a ({2} item(s) a {3} cada) worthCommandDescription=Calcula o valor do item que tens em mão ou um especificado. worthCommandUsage=/ <||hand|inventory|blocks> [-][quantidade] +worthCommandUsage3Description=Determina o valor dos itens que tens no inventário worthMeta=§aConjunto de {0} com os metadados de {1} que vale §c{2}§a ({3} item(s) a {4} cada) worthSet=§6Valor definido year=ano diff --git a/Essentials/src/main/resources/messages_pt_BR.properties b/Essentials/src/main/resources/messages_pt_BR.properties index c4258abb896..f9d91c0e626 100644 --- a/Essentials/src/main/resources/messages_pt_BR.properties +++ b/Essentials/src/main/resources/messages_pt_BR.properties @@ -191,11 +191,15 @@ customtextCommandUsage=/ - Defina no bukkit.yml day=dia days=dias defaultBanReason=O Martelo de Banimento proclamou\! +deletedHomes=Todas as casas deletadas. +deletedHomesWorld=Todas as casas em {0} deletadas. deleteFileError=Não foi possível apagar o arquivo\: {0} deleteHome=§6A casa§c {0} §6foi removida. deleteJail=§6A cadeia§c {0} §6foi removida. deleteKit=§6O kit§c {0} §6foi removido. deleteWarp=§6A warp§c {0} §6foi removida. +deletingHomes=Excluindo todas as casas... +deletingHomesWorld=Excluindo todas as casas em {0}... delhomeCommandDescription=Remove uma casa. delhomeCommandUsage=/ [jogador\:] delhomeCommandUsage1=/ @@ -268,10 +272,15 @@ errorCallingCommand=Erro ao usar o comando /{0} errorWithMessage=§cErro\:§4 {0} essentialsCommandDescription=Recarrega o EssentialsX. essentialsCommandUsage=/ +essentialsCommandUsage1=/ reload essentialsCommandUsage1Description=Recarrega a configuração do Essentials +essentialsCommandUsage2=/ version essentialsCommandUsage2Description=Mostra informações sobre a versão do Essentials +essentialsCommandUsage3=/ commands essentialsCommandUsage3Description=Mostra informações sobre quais comandos o Essentials está encaminhando +essentialsCommandUsage4=/ debug essentialsCommandUsage4Description=Alterna o "modo depuração" do Essentials +essentialsCommandUsage5=/ reset essentialsCommandUsage5Description=Redefine os dados de usuário do jogador essentialsHelp1=O arquivo está corrompido e o Essentials não consegue abri-lo. O Essentials foi desativado. Se você não conseguir arrumar o arquivo sozinho, acesse http\://tiny.cc/EssentialsChat essentialsHelp2=O arquivo está corrompido e o Essentials não consegue abri-lo. O Essentials foi desativado. Se você não conseguir arrumar o arquivo sozinho, digite /essentialshelp no jogo ou acesse http\://tiny.cc/EssentialsChat @@ -281,8 +290,11 @@ expCommandDescription=Dê, defina, redefina ou olhe a experiência de um jogador expCommandUsage=/ [reset|show|set|give} [nome do jogador [amount]] expCommandUsage1=/ give expCommandUsage1Description=Dá ao jogador alvo a quantia especificada de xp +expCommandUsage2=/ set expCommandUsage2Description=Define a xp do jogador alvo para a quantidade especificada +expCommandUsage3=/ show expCommandUsage4Description=Mostra a quantidade de xp que o jogador alvo possui +expCommandUsage5=/ reset expCommandUsage5Description=Redefine a xp do jogador alvo para 0 expSet=§c{0} §6agora tem§c {1} §6de exp. extCommandDescription=Apaga o fogo de jogadores. @@ -310,6 +322,7 @@ fireballCommandUsage2Description=Lança o projétil especificado de sua localiza fireworkColor=§4Parâmetros de fogo de artifício inválidos. Defina uma cor antes. fireworkCommandDescription=Permite que você modifique uma pilha de fogos de artifício. fireworkCommandUsage=/ <|power [amount]|clear|fire [amount]> +fireworkCommandUsage1=/ clear fireworkCommandUsage1Description=Limpa todos os efeitos de seus fogos de artifício guardados fireworkCommandUsage2Description=Define o poder do fogo de artifício segurado fireworkEffectsCleared=§6Todos os efeitos desse pack foram removidos. @@ -363,6 +376,8 @@ hatArmor=§4Você não pode usar este item como chapéu\! hatCommandDescription=Equipa o item segurado como um chapéu. hatCommandUsage=/ [remove] hatCommandUsage1=/ +hatCommandUsage2=/ remove +hatCommandUsage2Description=Remove o seu chapéu hatCurse=§4Você não pode remover um chapéu que tem a maldição do ligamento\! hatEmpty=§4Você não está usando um chapéu. hatFail=§4Você deve ter algo em sua mão para vestir. @@ -401,6 +416,9 @@ homeConfirmation=§6Você já possui uma casa chamada §c{0}§6\!\nPara substitu homeSet=§6Casa definida na posição atual. hour=hora hours=horas +iceCommandUsage=/ [jogador] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Alterna se você está ignorando um jogador. ignoreCommandUsage=/ ignoreCommandUsage1=/ @@ -565,6 +583,7 @@ mailClear=§6Para marcar seus e-mails como lidos, digite§c /mail clear§6. mailCleared=§6E-mails removidos\! mailCommandDescription=Gerencia o email entre jogadores, entre servers. mailCommandUsage=/ [read|clear|send [to] [message]|sendall [message]] +mailCommandUsage2=/ clear mailDelay=Muitos e-mails foram enviados no último minuto. Máximo\: {0} mailFormat=§6[§r{0}§6] §r{1} mailMessage={0} @@ -743,6 +762,7 @@ posPitch=§6Pitch\: {0} (Ângulo da cabeça) possibleWorlds=§6Possíveis mundos são os números §c0§6 através de §c {0} §6. potionCommandDescription=Adiciona efeitos de poção personalizados a uma poção. potionCommandUsage=/ power\: duration\:> +potionCommandUsage1=/ clear posX=§6X\: {0} (+Leste <-> -Oeste) posY=§6Y\: {0} (+Cima <-> -Baixo) posYaw=§6Yaw\: {0} (Rotação) diff --git a/Essentials/src/main/resources/messages_ro.properties b/Essentials/src/main/resources/messages_ro.properties index 2004891b2c3..0d45c9cd1f2 100644 --- a/Essentials/src/main/resources/messages_ro.properties +++ b/Essentials/src/main/resources/messages_ro.properties @@ -6,6 +6,12 @@ action=§5* {0} §5{1} addedToAccount=§a{0} au fost adaugati in contul tau. addedToOthersAccount=§a{0} au fost adaugati in contul lui {1}§a. Balanta noua\: {2} adventure=aventură +afkCommandDescription=Te marcheaza ca si plecat de la tastatura. +afkCommandUsage=/ [jucător/mesaj...] +afkCommandUsage1=/ +afkCommandUsage1Description=Activează/dezactivează starea afk cu un motiv opțional +afkCommandUsage2=/ [mesaj] +afkCommandUsage2Description=Activează/dezactivează starea afk a jucătorului specificat cu un motiv opțional alertBroke=stricat\: alertFormat=§3[{0}] §r {1} §6 {2} la\: {3} alertPlaced=situat\: @@ -18,14 +24,40 @@ antiBuildInteract=§4Nu ai permisiunea să interactionezi cu§c {0}§4. antiBuildPlace=§4Nu ai permisiunea să plasezi§c {0} §4aici. antiBuildUse=§4Nu ai permisiunea să utilizezi§c {0}§4. antiochCommandDescription=O mică surpriză pentru operatori. +antiochCommandUsage=/ +anvilCommandDescription=Deschide o nicovală. +anvilCommandUsage=/ autoAfkKickReason=Ai fost dat afară deoarece ai fost AFK mai mult de {0} minute. +autoTeleportDisabled=§6Nu mai aprobi automat cererile de teleportare. +autoTeleportDisabledFor=§c{0} §6nu mai aprobă automat cererile de teleportare. +autoTeleportEnabled=§6Acum aprobi automat cererile de teleportare. +autoTeleportEnabledFor=§c{0}§6 acum aprobă automat cererile de teleportare. +backAfterDeath=§6Foloseste comanda §c /inapoi§6 pentru a reveni la punctul mortii. +backCommandDescription=Te teleportează la locația ta înainte de tp/spawn/warp. +backCommandUsage=/ [player] +backCommandUsage1=/ +backCommandUsage1Description=Te teleportează la locația anterioară +backCommandUsage2Description=Teleportează jucătorul specificat la locația anterioară +backOther=§6L-am returnat pe §c {0}§6 la locatia anterioara. +backupCommandDescription=Rulează backup-ul dacă este configurat. +backupCommandUsage=/ backupDisabled=§4Scriptul extern pentru Backup nu a fost configurat. backupFinished=§6Backup terminat. backupStarted=§6Backup început. +backupInProgress=§6Un script extern de backup este in curs de desfasurare\! Nu se poate dezactiva plugin-ul pana se sfarseste. backUsageMsg=§6întoarcerea la locul anterior. balance=§aBalanţă\:§c {0} +balanceCommandDescription=Indică soldul curent al unui jucător. +balanceCommandUsage=/ [player] +balanceCommandUsage1=/ +balanceCommandUsage1Description=Indică soldul tău curent +balanceCommandUsage2Description=Afișează soldul jucătorului specificat balanceOther=§aBalanţa lui {0} §a\:§c {1} balanceTop=§6Topul balanţelor ({0}) +balanceTopLine={0}, {1}, {2} +balancetopCommandDescription=Obține valorile soldului maxim. +balancetopCommandUsage=/ [page] +balancetopCommandUsage1=/ [page] banExempt=§4Nu poţi interzice acest jucător. banExemptOffline=§4Nu poti interzice jucatorii inactivi. banFormat=§4Interziși\:\n§r{0} @@ -35,11 +67,14 @@ bed=§opat§r bedMissing=§4Patul tău nu a fost setat, lipsește sau este blocat. bedNull=§mpat§r bedSet=§6Patul a fost setat\! +beezookaCommandUsage=/ bigTreeFailure=§4Generarea copacului mare a eșuat. Încearcă pe pământ sau iarbă. bigTreeSuccess=§6Copac mare generat. bookAuthorSet=§6Autorul cărții setat la {0}. +bookCommandUsage1=/ bookLocked=§6Această carte este acum blocată. bookTitleSet=§6Titlul cărții setat la {0}. +breakCommandUsage=/ burnMsg=§6I-ai dat foc lui§c {0} §6pentru§c {1} secunde§6. cannotStackMob=§4Nu. ai permissiunea sa stackezi mobii. canTalkAgain=§6Poti vorbi din nou acum. @@ -47,16 +82,21 @@ cantFindGeoIpDB=Nu se gaseste baza de data GeoIP\! cantGamemode=§4You do not have permission to change to gamemode {0} cantReadGeoIpDB=Citirea bazei de date GeoIP a dat gres\! cantSpawnItem=§4Nu ai permisiunea de a genera obiectul§c {0}§4. +cartographytableCommandUsage=/ chatTypeLocal=[L] chatTypeSpy=[Spion] cleaned=Fisierele jucatorilor au fost curatate. cleaning=Fisierele jucatorilor se curata. clearInventoryConfirmToggleOff=§6You will no longer be prompted to confirm inventory clears. clearInventoryConfirmToggleOn=§6You will now be prompted to confirm inventory clears. +clearinventoryCommandUsage1=/ +clearinventoryconfirmtoggleCommandUsage=/ commandCooldown=§cYou cannot type that command for {0}. commandFailed=Comanda {0} a esuat\: commandHelpFailedForPlugin=Eroare primire ajutor pentru pluginul\: {0} commandNotLoaded=§4Comanda {0} este partial incarcata. +compassCommandUsage=/ +condenseCommandUsage1=/ configFileMoveError=Eroare mutând fișierul config.yml in locația Backup. configFileRenameError=Eroare redenumind fișierul config.yml. confirmClear=§7To §lCONFIRM§7 inventory clear, please repeat command\: §6{0} @@ -111,6 +151,7 @@ disabledToSpawnMob=§4Generarea acestui mob a fost dezactivata din configuratie. disableUnlimited=§6Plasarea nelimitată de§c {0} §6a fost dezactivată pentru§c {1}§6. disposal=Cos de gunoi disposalCommandDescription=Deschide un cos de gunoi portabil. +disposalCommandUsage=/ distance=§6Distanta\: {0} dontMoveMessage=§6Vei fi teleportat in§c {0}§6. Nu te misca. downloadingGeoIp=Baza GeoIP se descarca... Poate dura o vreme. @@ -129,15 +170,20 @@ enchantmentPerm=§4YNu ai permisiunea pentru§c {0}§4. enchantmentRemoved=§6Magia§c {0} §6a fost scoasa de pe obiect. enchantments=§6Magii\:§r {0} enderchestCommandDescription=Vă permite să vedeți în interiorul unui enderchest. +enderchestCommandUsage=/ [player] +enderchestCommandUsage1=/ errorCallingCommand=Eroare executand comanda /{0} errorWithMessage=§cEroare\:§4 {0} essentialsCommandDescription=Reîncarcă essentials. +essentialsCommandUsage=/ essentialsHelp1=Fisierul este stricat si nu poate fi deschis. Essentials este acum dezactivat. Daca nu poti rezolva problema singur, dute la http\://tiny.cc/EssentialsChat essentialsHelp2=Fisierul este stricat si nu poate fi deschis. Essentials este acum dezactivat. Daca nu poti rezolva problema singur, dute la http\://tiny.cc/EssentialsChat essentialsReload=§6Essentials reloaded§c {0}. exp=§c{0} §6are§c {1} §6experienta (nivel§c {2}§6) si are nevoie de §c {3} §6experienta pentru a atinge un nou nivel. expSet=§c{0} §6are acum§c {1} §6experienta. extCommandDescription=Stinge jucătorii. +extCommandUsage=/ [player] +extCommandUsage1=/ [player] extinguish=§6Te-ai stins singur. extinguishOthers=§6Ai stins pe {0}§6. failedToCloseConfig=Eroare la inchiderea configuratiei {0}. @@ -146,16 +192,20 @@ failedToWriteConfig=Eroare la scrierea configuratiei {0}. false=§4fals§r feed=§6Apetitul tau a fost saturat. feedCommandDescription=Satisface foametea. +feedCommandUsage=/ [player] +feedCommandUsage1=/ [player] feedOther=§6You satiated the appetite of §c{0}§6. fileRenameError=Redenumirea fisierului {0} a esuat\! fireballCommandDescription=Aruncă un fireball sau alte proiectile asortate. fireballCommandUsage=/ [fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident] [speed] +fireballCommandUsage1=/ fireworkColor=§4Parametri de incarcare insertati sunt invalizi, trebuie sa setati o culoare intai. fireworkCommandUsage=/ <|power [amount]|clear|fire [amount]> fireworkEffectsCleared=§6Efectele rachetelor au fost scoase. fireworkSyntax=§6Parametri rachetelor\:§c culoare\: [cadere\:] [forma\:] [efect\:]\n§6Pentru a utiliza mai mult culor/efecte, separati valorile prin virgula\: §cred,blue,pink\n§6forme\:§c star, ball, large, creeper, burst §6efecte\:§c trail, twinkle. flyCommandDescription=Decolează și ia-ti avant\! flyCommandUsage=/ [player] [on|off] +flyCommandUsage1=/ [player] flying=zburand flyMode=§6Modul de zburat§c {0} §6a fost setat pentru {1}§6. foreverAlone=§4Nu ai pe nimeni la care sa raspunzi. @@ -168,12 +218,15 @@ gamemodeCommandDescription=Schimba modul de joc al jucatorului. gamemodeCommandUsage=/ [player] gamemodeCommandUsage1=/ [player] gcCommandDescription=Arata rapoartele de memorie, uptime si informatii despre tick-uri. +gcCommandUsage=/ gcfree=§6Memorie libera\:§c {0} MB. gcmax=§6Memorie maxima\:§c {0} MB. gctotal=§6Memorie alocata\:§c {0} MB. gcWorld=§6 {0} "§6 §c {1}"\: §c {2} §6 bucati, §c {3} §6 entitati, §c {4} §6 gresie. geoipJoinFormat=§6Jucatorul §c{0} §6a intrat din §c{1}§6. getposCommandDescription=Obține coordonatele tale curente sau pe cele ale unui jucător. +getposCommandUsage=/ [player] +getposCommandUsage1=/ [player] giveCommandDescription=Dă unui jucător un obiect. giveCommandUsage=/ [amount [itemmeta...]] geoipCantFind=§6Jucatorul §c{0} §6vine dintr-o §atara necunoscuta§6. @@ -184,16 +237,19 @@ geoIpUrlInvalid=URL-ul pentru descarcare GeoIP este invalid. givenSkull=§6Ti-a fost dat craniul lui §c{0}§6. godCommandDescription=Activează puterile tale god. godCommandUsage=/ [player] [on|off] +godCommandUsage1=/ [player] giveSpawn=§6I-ai dat§c {0} §6bucata(ti) de§c {1} lui§c {2}§6. giveSpawnFailure=§4Spatiu insuficient, §c {0} §c {1} §4au fost pierdute. godDisabledFor=§cdisabled§6 for§c {0} godEnabledFor=§aactivat§6 pentru§c {0}. godMode=§6Modul GOD§c {0}§6. +grindstoneCommandUsage=/ groupDoesNotExist=§4Nu sunt jucatori conectati din aceasta grupa\! groupNumber=§c{0}§f online, toata lista\:§c /{1} {2} hatArmor=§4Nu poti folosi acest obicat ca palarie\! hatCommandDescription=Obțineți niște pălării noi și interesante. hatCommandUsage=/ [remove] +hatCommandUsage1=/ hatCurse=§4Nu poti inlatura o palarie cu curse of binding\! hatEmpty=§4Nu porti o palarie. hatFail=§4Trebuie sa ai ceva de purtat in mana. @@ -202,6 +258,8 @@ hatRemoved=§6Palaria ta a fost scoasa. haveBeenReleased=§6Ai fost eliberat. heal=§6Ai fost vindecat. healCommandDescription=Vindecă-te pe tine sau pe alt jucător. +healCommandUsage=/ [player] +healCommandUsage1=/ [player] healDead=§4Nu pot vindeca pe cineva mort\! healOther=§6L-ai vindecat pe§c {0}§6. helpCommandDescription=Vizualizează lista comenzilor disponibile. @@ -219,6 +277,8 @@ homes=§6Case\:§r {0} homeSet=§6Casa setata. hour=ora hours=ore +iceCommandUsage=/ [player] +iceCommandUsage1=/ ignoredList=§6Ignorat\:§r {0} ignoreExempt=§4Nu poti ignora acest jucator. ignorePlayer=§6Il ignori pe jucatorul§c {0} §6de acum. @@ -251,6 +311,7 @@ itemCannotBeSold=§4Acest obiect nu poate fi vandut pe server. itemId=§6ID\:§c {0} itemMustBeStacked=§4Obiectul trebuie comercializat in stacuri. O cantitate de 2s ar trebuie sa fie 2 stacuri, s.a.m.d. itemNames=§6Numele scurte ale obiectului\:§r {0} +itemnameCommandUsage1=/ itemNotEnough1=§4YNu ai destul din acest obiect pentru a-l putea vinde. itemsConverted=§6Converted all items into blocks. itemSellAir=Chiar ai incercat sa vinzi ''aer''? Pune-ti un obiect in mana. @@ -266,12 +327,15 @@ jailReleased=§6Jucatorul §c{0}§6 a fost eliberat. jailReleasedPlayerNotify=§6Ai fost eliberat\! jailSentenceExtended=§6Timpul pedepsei a fost crescut la\: {0} jailSet=§6Inchisoarea§c {0} §6a fost creata. +jailsCommandUsage=/ +jumpCommandUsage=/ jumpError=§4Asta ar putea sa raneasca creierul calculatorul. kickDefault=Ai fost dat afara de pe server. kickedAll=§4Ai dat afara toti jucatorii de pe server. kickExempt=§4Nu poti da afara acest jucator. kill=§6Ai ucis (pe)§c {0} §6. killExempt=§4You cannot kill §c{0}§4. +kitCommandUsage1=/ kitContains=§6Kit §c{0} §6contains\: kitCost=\ §7§o({0})§r kitDelay=§m{0}§r @@ -284,8 +348,10 @@ kitNotFound=§4Acest kit nu exista. kitOnce=§4Nu poti folosi acest kit din nou. kitReceive=§6Ai primit kitul§c {0}§6. kits=§6Kituri\:§r {0} +kittycannonCommandUsage=/ kitTimed=§4Nu poti folosit acest kit inca§c {0}§4. lightningCommandUsage=/ [player] [power] +lightningCommandUsage1=/ [player] lightningSmited=§6Ai fost fulgerat\! lightningUse=§6L-ai fulgerat pe§c {0} listAfkTag=§7 [AFK] §r @@ -298,6 +364,7 @@ listGroupTag=§6{0}§r\: listHiddenTag=§7[Ascuns]§r loadWarpError=§4Incarcarea teleportarii a esuat {0}. localFormat=[L]<{0}> {1} +loomCommandUsage=/ mailClear=§6To mark your mail as read, type§c /mail clear§6. mailCleared=§6Posta curatata\! mailCommandDescription=Gestionează intra-player, intra-server mail. @@ -349,6 +416,7 @@ msgFormat=§6[§c{0}§6 -> §c{1}§6] §r{2} msgIgnore=§c{0} §4has messages disabled. msgtoggleCommandDescription=Blocheaza primirea tuturor mesajelor private. msgtoggleCommandUsage=/ [player] [on|off] +msgtoggleCommandUsage1=/ [player] multipleCharges=§4Nu poti aplica mai mult de o incarcare pe racheta. multiplePotionEffects=§4Nu poti aplica mai mult de un efect pe potiune. muteCommandDescription=Amuteste sau dezamuteste un jucator. @@ -366,6 +434,7 @@ muteNotifyForReason=§c{0} §6l-a amuțit pe §c{1}§6 pentru§c {2}§6. Motiv\: muteNotifyReason=§c{0} §6l-a amuțit pe §c{1}§6. Motiv\: §c{2} nearCommandDescription=Arata jucatorii din apropierea ta sau a altui jucator. nearCommandUsage=/ [playername] [radius] +nearCommandUsage1=/ nearbyPlayers=§6Jucatori in apropiere\:§r {0} negativeBalanceError=§4Jucatorul nu are permisiunea sa aiba o balanta negativa. nickChanged=§6Nume schimbat. @@ -421,6 +490,7 @@ now=acum noWarpsDefined=§6Nu sunt teleportari specificate. nuke=§5Ploua cu decese. nukeCommandDescription=Ploua cu decese asupra lor. +nukeCommandUsage=/ [player] numberRequired=Un numar merge acolo, prostesc. onlyDayNight=/time suporta doar day/night. onlyPlayers=§4Only in-game players can use §c{0}§4. @@ -440,8 +510,12 @@ payMustBePositive=§4Amount to pay must be positive. payToggleOff=§6You are no longer accepting payments. payToggleOn=§6You are now accepting payments. payconfirmtoggleCommandDescription=Activează dacă vi se solicită să confirmați plățile. +payconfirmtoggleCommandUsage=/ +paytoggleCommandUsage=/ [player] +paytoggleCommandUsage1=/ [player] pendingTeleportCancelled=§4Cererea de teleportare a fost refuzata. pingCommandDescription=Pong\! +pingCommandUsage=/ playerBanIpAddress=§6Player§c {0} §6banned IP address§c {1} §6for\: §c{2}§6. playerBanned=§6Player§c {0} §6banned§c {1} §6for\: §c{2}§6. playerJailed=§6Jucatorul§c {0} §6a fost inchis. @@ -468,6 +542,7 @@ powerToolRemove=§6Command §c{0}§6 removed from §c{1}§6. powerToolRemoveAll=§6All commands removed from §c{0}§6. powerToolsDisabled=§6Toate comenzile de pe obiecte au fost scoase. powerToolsEnabled=§6Toate comenzile de pe obiect au fost puse. +powertooltoggleCommandUsage=/ pTimeCurrent=§6Timpul jucatorului §c{0}§6 este§c {1}§6. pTimeCurrentFixed=§6Timpul jucatorului §c{0}§6 a fost fixat la§c {1}§6. pTimeNormal=§6Timpul jucatorului §c{0}§6 este timpul normal si potrivit serverului. @@ -499,6 +574,7 @@ recipeWhere=§6Unde\: {0} removed=§6S-au sters§c {0} §6entitati. repair=§6You have successfully repaired your\: §c{0}§6. repairAlreadyFixed=§4Aces obiect nu trebuie reparat. +repairCommandUsage1=/ repairEnchanted=§4Ai ai permisiunea sa repair obiecte magice. repairInvalidType=§4Acest obiect nu poate fi reparat. repairNone=§4Nu sunt obiecte ce trebuiesc reparate. @@ -511,6 +587,8 @@ requestSentAlready=§4You have already sent {0}§4 a teleport request. requestTimedOut=§4Timpul de acceptare s-a terminat. resetBal=§6Balance has been reset to §c{0} §6for all online players. resetBalAll=§6Balance has been reset to §c{0} §6for all players. +restCommandUsage=/ [player] +restCommandUsage1=/ [player] returnPlayerToJailError=§4Error occurred when trying to return player§c {0} §4to jail\: §c{1}§4\! rtoggleCommandUsage=/ [player] [on|off] runningPlayerMatch=§6Ruleaza cautarea pentru potrivite jucatori ''§c{0}§6'' (Poate dura ceva) @@ -542,18 +620,23 @@ southEast=SE south=S southWest=SW skullChanged=§6Skull changed to §c{0}§6. +skullCommandUsage1=/ slimeMalformedSize=§4Marile malformata. +smithingtableCommandUsage=/ socialSpy=§6SocialSpy for §c{0}§6\: §c{1} socialSpyMutedPrefix=§f[§6SS§f] §7(muted) §r socialspyCommandDescription=Activează/dezactivează dacă poți vedea mesajele din /msg sau /mail în chat. socialspyCommandUsage=/ [player] [on|off] +socialspyCommandUsage1=/ [player] socialSpyPrefix=§f[§6SS§f] §r soloMob=§4Acel mob pare sa fie singur. spawned=generati(te) spawnSet=§6Locatia spawn a fost setata grupului§c {0}§6. spectator=spectator +stonecutterCommandUsage=/ sudoExempt=§4Nu poti forta acest jucator. sudoRun=§6Forcing§c {0} §6to run\:§r /{1} +suicideCommandUsage=/ suicideMessage=§6La revedere lume cruda... suicideSuccess=§6{0} §6si-a luat viata. survival=supravietuire @@ -584,22 +667,37 @@ thunder=§6Ai§c {0} §6ploaia in lumea ta. thunderDuration=§6Ai§c {0} §6ploaia in luma ta pentru§c {1} §6secunde. timeBeforeHeal=§6Timp pana la urmatoarea vindecare\:§c {0}§6. timeBeforeTeleport=§6Timp intre teleportari\:§c {0} +timeCommandUsage1=/ timeFormat=§c{0}§6 or §c{1}§6 or §c{2}§6 timeSetPermission=§4Nu ai permisiunea sa setezi timpul. timeSetWorldPermission=§4You are not authorized to set the time in world ''{0}''. timeWorldCurrent=§6Timpul curent in lumea§c {0} §6este §c{1}§6. timeWorldSet=§6Timul a fost setat u00a7c {0} §6in\: §c{1}§6. toggleshoutCommandUsage=/ [player] [on|off] +toggleshoutCommandUsage1=/ [player] +topCommandUsage=/ totalSellableAll=§aValoare totala a obiectelor vanzabile este de §c{1}§a. totalSellableBlocks=§aValoare totala a obiectelor vanzabile este de §c{1}§a. totalWorthAll=§aVindeti toate obiectele pentru un toltal de §c{1}§a. totalWorthBlocks=§aVindeti toate obiectele pentru un toltal de §c{1}§a. tpCommandDescription=Te teleportezi catre un jucator. tpaCommandDescription=Trimite o cerere de teleportare catre un jucator. +tpacancelCommandUsage=/ [player] +tpacancelCommandUsage1=/ +tpacceptCommandUsage1=/ tpahereCommandDescription=Trimite o cerere catre un jucator pentru teleportare la locatia ta. +tpallCommandUsage=/ [player] +tpallCommandUsage1=/ [player] +tpautoCommandUsage=/ [player] +tpautoCommandUsage1=/ [player] +tpdenyCommandUsage=/ +tpdenyCommandUsage1=/ tphereCommandDescription=Teleporteaza un jucator catre tine.\n +tprCommandUsage=/ +tprCommandUsage1=/ tps=§6TPSul curent \= {0} tptoggleCommandUsage=/ [player] [on|off] +tptoggleCommandUsage1=/ [player] tradeSignEmpty=§4Semnul pentru negociere nu are nimic pentru tine. tradeSignEmptyOwner=§4Nu este nimic de colectat de la acest semn. treeFailure=§4Generarea copacului a esuat. Incearca pe pamand sau iarba. @@ -635,6 +733,7 @@ userUnknown=§4Advertisment\: Jucatorul ''§c{0}§4'' nu a intrat niciodata pe a usingTempFolderForTesting=Se utilizicea un folder temportat pentru test\: vanish=§6Invizibil pentru {0}§6\: {1} vanishCommandUsage=/ [player] [on|off] +vanishCommandUsage1=/ [player] vanished=§6Ai devenit invizibil. versionOutputVaultMissing=§4Vault nu este instalat. Chat şi permisiunile poate nu funcţioneze. versionOutputFine=§6{0} versiune\: §a{1} @@ -645,6 +744,7 @@ versionMismatch=§4Versiunea nu se potriveste\! Fa update {0} la aceasi versiune versionMismatchAll=§4Versiunea nu se potriveste\! Fa uptate la acceasi versiune. voiceSilenced=§6Vocea ta e fost interzisa walking=mergand +warpCommandUsage1=/ [page] warpDeleteError=§4Problema in stergerea teleportarii. warpinfoCommandUsage=/ warpinfoCommandUsage1=/ @@ -682,6 +782,8 @@ whoisPlaytime=§6 - Playtime\:§r {0} whoisTempBanned=§6 - Ban expires\:§r {0} whoisTop=§6 \=\=\= Cine este\:§c {0} §6 \=\=\= whoisUuid=§6 - UUID\:§r {0} +workbenchCommandUsage=/ +worldCommandUsage1=/ worth=§aUn stac de {0} valoreaza §c{1}§a ({2} obiect(e) la {3} fiecare) worthMeta=§aUn stac de {0} cu metadata de {1} valoreaza §c{2}§a ({3} obiect(e) la {4} fiecare) worthSet=§6Valoarea ''valorii'' setata diff --git a/Essentials/src/main/resources/messages_ru.properties b/Essentials/src/main/resources/messages_ru.properties index 9491a4e978d..3166ed74457 100644 --- a/Essentials/src/main/resources/messages_ru.properties +++ b/Essentials/src/main/resources/messages_ru.properties @@ -127,7 +127,7 @@ cantSpawnItem=§4У Вас нет прав для получения§c {0}§4. cartographytableCommandDescription=Открывает стол картографа. cartographytableCommandUsage=/ chatTypeLocal=[Л] -chatTypeSpy=[Шпик] +chatTypeSpy=[Слежка] cleaned=Файлы пользователей очищены. cleaning=Очистка файлов пользователей. clearInventoryConfirmToggleOff=§6Вам больше не будет предложено подтвердить очистку инвентаря. @@ -191,11 +191,15 @@ customtextCommandUsage=/ - Определить в bukkit.yml day=день days=дней defaultBanReason=На Вас наложили великую печать Бана\! +deletedHomes=Все дома удалены. +deletedHomesWorld=Все дома в {0} удалены. deleteFileError=Не удается удалить файл\: {0} deleteHome=§6Точка дома§c {0} §6удалена. deleteJail=§6Тюрьма§c {0} §6удалена. deleteKit=§6Набор§c {0} §6удалён. deleteWarp=§6Варп§c {0} §6удалён. +deletingHomes=Удаление всех домов... +deletingHomesWorld=Удаление всех домов в {0}... delhomeCommandDescription=Удаляет точку дома. delhomeCommandUsage=/ [игрок\:]<название> delhomeCommandUsage1=/ <название> @@ -278,6 +282,10 @@ essentialsCommandUsage4=/ debug essentialsCommandUsage4Description=Переключает "режим отладки" Essentials essentialsCommandUsage5=/ reset <игрок> essentialsCommandUsage5Description=Сбрасывает данные данного игрока +essentialsCommandUsage6=/ cleanup +essentialsCommandUsage6Description=Очищает старые пользовательские данные +essentialsCommandUsage7=/ дома +essentialsCommandUsage7Description=Управляет домами игроков essentialsHelp1=Файл поврежден, поэтому Essentials не может его открыть. Плагин будет отключен. Если Вы не можете исправить проблему самостоятельно, перейдите по ссылке https\://essentialsx.cf/community.html essentialsHelp2=Файл поврежден, поэтому Essentials не может его открыть. Плагин будет отключен. Если Вы не можете исправить проблему самостоятельно, введите /essentialshelp или перейдите по ссылке https\://essentialsx.cf/community.html essentialsReload=§6Essentials перезагружен§c {0}. @@ -324,10 +332,13 @@ fireworkCommandUsage1Description=Очищает все эффекты из уд fireworkCommandUsage2=/ power <сумма> fireworkCommandUsage2Description=Устанавливает силу удерживаемого феерверка fireworkCommandUsage3=/ fire [сумма] +fireworkCommandUsage3Description=Запускает одну либо несколько копий фейрверка, который находится в руке fireworkCommandUsage4=/ fireworkCommandUsage4Description=Добавляет указанный эффект в удерживаемый феерверк fireworkEffectsCleared=§6Убраны все эффекты с удерживаемого стака. fireworkSyntax=§6Параметры фейерверка\:§c color\:<цвет> [fade\:<цвет>] [shape\:<форма>] [effect\:<эффект>]\n§6Чтобы использовать несколько цветов/эффектов, разделяйте значения запятыми\: §cred,blue,pink\n§6Формы\:§c star, ball, large, creeper, burst§6. Эффекты\:§c trail, twinkle§6. +fixedHomes=Недействительные дома удалены. +fixingHomes=Удаление недействительных домов... flyCommandDescription=Лети, как птица\! flyCommandUsage=/ [игрок] [on|off] flyCommandUsage1=/ [игрок] @@ -384,6 +395,7 @@ hatArmor=§4Вы не можете надеть этот предмет на г hatCommandDescription=Надевает на Вас крутой головной убор. hatCommandUsage=/ [remove] hatCommandUsage1=/ +hatCommandUsage1Description=Надевает блок в руке Вам на голову hatCommandUsage2=/ remove hatCommandUsage2Description=Убирает вашу текущую шляпу hatCurse=§4Вы не можете снять шляпу с проклятием несъёмности\! @@ -426,6 +438,9 @@ homeConfirmation=§6У Вас уже есть дом с названием §c{0 homeSet=§6Точка дома установлена. hour=час hours=часов +iceCommandUsage=/ [игрок] +iceCommandUsage1=/ +iceCommandUsage2=/ <игрок> ignoreCommandDescription=Включает или отключает игнорирование игроков. ignoreCommandUsage=/ <игрок> ignoreCommandUsage1=/ <игрок> @@ -479,8 +494,11 @@ itemId=§6ID\:§c {0} itemloreClear=§6Вы убрали описание этого предмета. itemloreCommandDescription=Редактирует описание предмета. itemloreCommandUsage=/ [линия] [текст] +itemloreCommandUsage1=/ add [текст] itemloreCommandUsage1Description=Добавляет заданный текст в конец описания удерживаемого предмета +itemloreCommandUsage2=/ set <строка> <текст> itemloreCommandUsage2Description=Устанавливает указанную строку описания удерживаемого предмета на заданный текст +itemloreCommandUsage3=/ clear itemloreCommandUsage3Description=Очищает описание удерживаемого предмета itemloreInvalidItem=§cВам нужно держать предмет, чтобы редактировать его описание. itemloreNoLine=§4В описании предмета из Вашей руки на строке §c{0}§4 отсутствует текст. @@ -521,6 +539,7 @@ jailReleased=§6Игрок §c{0}§6 выпущен на свободу. jailReleasedPlayerNotify=§6Вы были выпущен\! jailSentenceExtended=§6Срок тюремного заключения продлен до §c{0}§6. jailSet=§6Тюрьма§c {0} §6установлена. +jailWorldNotExist=§4Мира, в которой находится эта тюрьма, не существует. jumpEasterDisable=§6Режим летающего волшебника отключен. jumpEasterEnable=§6Режим летающего волшебника включен. jailsCommandDescription=Выводит список всех тюрем. @@ -756,6 +775,7 @@ nuke=§5Пусть смерть прольется на них дождем. nukeCommandDescription=Пусть смерть прольется на них дождем. nukeCommandUsage=/ [игрок] nukeCommandUsage1=/ [игроки...] +nukeCommandUsage1Description=Направляет ядерный удар на всех игроков, или на указанного numberRequired=Глупенький, тут должно быть число. onlyDayNight=Команда /time поддерживает только day/night. onlyPlayers=§4Только в игре можно использовать §c{0}§4. @@ -839,6 +859,7 @@ powertoolCommandUsage2Description=Удаляет все командные ин powertoolCommandUsage3=/ r\:<команда> powertoolCommandUsage3Description=Удаляет указанную команду из удерживаемого предмета powertoolCommandUsage4=/ <команда> +powertoolCommandUsage4Description=Устанавливает указанную команду в удерживаемый командный инструмент powertoolCommandUsage5=/ a\:<команда> powertoolCommandUsage5Description=Добавляет указанную команду в удерживаемый предмет powertooltoggleCommandDescription=Включает или выключает все командные инструменты. @@ -846,9 +867,19 @@ powertooltoggleCommandUsage=/ ptimeCommandDescription=Регулирует персональное время игрока. Добавьте в начало @, чтобы зафиксировать. ptimeCommandUsage=/ [list|reset|day|night|dawn|17\:30|4pm|4000ticks] [игрок|*] ptimeCommandUsage1=/ list [игрок|*] +ptimeCommandUsage1Description=Перечисляет время либо для Вас, либо для других игроков, если указаны +ptimeCommandUsage2=/ <время> [игрок|*] +ptimeCommandUsage2Description=Устанавливает время для Вас или других игроков, если указано определённое время +ptimeCommandUsage3=/ reset [игрок|*] +ptimeCommandUsage3Description=Сбрасывает время либо для Вас, либо для других игроков, если указаны pweatherCommandDescription=Регулирует персональную погоду игрока. pweatherCommandUsage=/ [list|reset|storm|sun|clear] [игрок|*] pweatherCommandUsage1=/ list [игрок|*] +pweatherCommandUsage1Description=Перечисляет погоду либо для Вас, либо для других игроков, если указаны +pweatherCommandUsage2=/ [игрок|*] +pweatherCommandUsage2Description=Устанавливает погоду для Вас или других игроков, если указана определённая погода +pweatherCommandUsage3=/ reset [игрок|*] +pweatherCommandUsage3Description=Сбрасывает погоду либо для Вас, либо для других игроков, если указаны pTimeCurrent=§6Время игрока §c{0}§6 - §c{1}§6. pTimeCurrentFixed=§6Время игрока §c{0}§6 зафиксировано на§c {1}§6. pTimeNormal=§6Время игрока §c{0}§6 теперь совпадает с серверным. @@ -868,17 +899,21 @@ questionFormat=§2[Вопрос]§r {0} rCommandDescription=Быстрый ответ игроку, отправившему Вам сообщение. rCommandUsage=/ <сообщение> rCommandUsage1=/ <сообщение> +rCommandUsage1Description=Отвечает на последнее сообщение игрока переданным текстом radiusTooBig=§4Радиус слишком большой\! Максимальный радиус -§c {0}§4. readNextPage=§6Введите§c /{0} {1} §6для просмотра следующей страницы. realName=§f{0}§r§6 is §f{1} realnameCommandDescription=Отображает действительный никнейм игрока. realnameCommandUsage=/ <никнейм> realnameCommandUsage1=/ <никнейм> +realnameCommandUsage1Description=Отображает действительный никнейм игрока на основе переданного псевдонима recentlyForeverAlone=§4{0} недавно вышел. recipe=§6Рецепт §c{0}§6 (§c{1}§6 из §c{2}§6) recipeBadIndex=Рецепта под этим номером не найдено. recipeCommandDescription=Показывает рецепты предметов. recipeCommandUsage=/ <предмет> [номер] +recipeCommandUsage1=/ <предмет> [страница] +recipeCommandUsage1Description=Показывает, как создать указанный предмет recipeFurnace=§6Жарить в печи\: §c{0}§6. recipeGrid=§c{0}X §6| §{1}X §6| §{2}X recipeGridItem=§c{0}X §6это §c{1} @@ -889,12 +924,16 @@ recipeShapeless=§6Объединить §c{0} recipeWhere=§6Где\: {0} removeCommandDescription=Удаляет сущности из Вашего текущего мира. removeCommandUsage=/ > [радиус|мир] +removeCommandUsage1=/ <тип моба> [мир] +removeCommandUsage2=/ <тип моба> <радиус> [мир] removed=§6Убрано§c {0} §6сущностей. repair=§6Вы успешно починили §c{0}§6. repairAlreadyFixed=§4Этот предмет не нуждается в починке. repairCommandDescription=Восстанавливает прочность одного или всех предметов. repairCommandUsage=/ [hand|all] repairCommandUsage1=/ +repairCommandUsage1Description=Ремонт предмета в руке +repairCommandUsage2Description=Чинит все предметы в вашем инвентаре repairEnchanted=§4У Вас недостаточно прав для ремонта зачарованных вещей. repairInvalidType=§4Этот предмет не может быть отремонтирован. repairNone=§4Нуждающиеся в починке предметы не найдены. @@ -984,6 +1023,7 @@ editsignCopyLine=§6Скопирована строка таблички §c{0} editsignPaste=§6Надпись таблички вставлена\! editsignPasteLine=§6Вставлена строка таблички §c{0}§6\! editsignCommandUsage=/ [строка] [текст] +editsignCommandUsage2Description=Очищает выбранную строку текста на определенной табличке signFormatFail=§4[{0}] signFormatSuccess=§1[{0}] signFormatTemplate=[{0}] @@ -1018,6 +1058,8 @@ spawnSet=§6Точка спавна для группы§c {0}§6 была ус spectator=наблюдатель speedCommandDescription=Изменяет Вашу скорость. speedCommandUsage=/ [fly/walk] <скорость> [игрок] +speedCommandUsage1Description=Устанавливает вашу скорость полёта или ходьбы до заданного значения +speedCommandUsage2=/ [fly/walk] <скорость> [игрок] stonecutterCommandDescription=Открывает камнерез. stonecutterCommandUsage=/ sudoCommandDescription=Выполняет команду от лица другого игрока. diff --git a/Essentials/src/main/resources/messages_si_LK.properties b/Essentials/src/main/resources/messages_si_LK.properties index dcd767ff49d..0ae58ec88ed 100644 --- a/Essentials/src/main/resources/messages_si_LK.properties +++ b/Essentials/src/main/resources/messages_si_LK.properties @@ -56,6 +56,8 @@ hatCommandUsage1=/ healCommandUsage=/ [player] healCommandUsage1=/ [player] helpLine=§6/{0}§r\: {1} +iceCommandUsage=/ [player] +iceCommandUsage1=/ itemnameCommandUsage1=/ jailsCommandUsage=/ jumpCommandUsage=/ diff --git a/Essentials/src/main/resources/messages_sk.properties b/Essentials/src/main/resources/messages_sk.properties index 615db7207d0..4aecd7f2162 100644 --- a/Essentials/src/main/resources/messages_sk.properties +++ b/Essentials/src/main/resources/messages_sk.properties @@ -153,6 +153,7 @@ createkitCommandUsage1=/ <časový interval> createKitFailed=§4Pri vytváraní kitu {0} nastala chyba. createKitSeparator=§m----------------------- createKitSuccess=§6Vytvorený kit\: §f{0}\n§6Časový interval\: §f{1}\n§6Odkaz\: §f{2}\n§6Skopíruj obsah z uvedeného odkazu do súboru kits.yml. +createKitUnsupported=§4Serializácia predmetov podľa NBT je zapnutá, ale tento server nebeží na Paper 1.15.2+. EssentialsX sa vracia k štandardnej serializácii. creatingConfigFromTemplate=Vytvára sa konfigurácia podľa šablóny\: {0} creatingEmptyConfig=Vytvára sa prázdna konfigurácia\: {0} creative=tvorivý @@ -163,11 +164,15 @@ customtextCommandUsage=/ - definuj v súbore bukkit.yml day=deň days=dní defaultBanReason=Súd rozhodol\! +deletedHomes=Všetky domovy boli vymazané. +deletedHomesWorld=Všetky domovy vo svete {0} boli vymazané. deleteFileError=Nebolo možné zmazať súbor\: {0} deleteHome=§6Domov§c {0} §6bol odstránený. deleteJail=§6Väzenie§c {0} §6bolo odstránené. deleteKit=§6Kit §c{0} §6bol odstránený. deleteWarp=§6Warp§c {0} §6bol odstránený. +deletingHomes=Mažú sa všetky domovy... +deletingHomesWorld=Mažú sa všetky domovy vo svete {0}... delhomeCommandDescription=Odstráni domov. delhomeCommandUsage=/ [hráč\:] delhomeCommandUsage1=/ @@ -227,6 +232,10 @@ errorCallingCommand=Chyba príkazu /{0} errorWithMessage=§cChyba\:§4 {0} essentialsCommandDescription=Opätovne načíta EssentialsX. essentialsCommandUsage=/ +essentialsCommandUsage6=/ cleanup +essentialsCommandUsage6Description=Vyčistí staré používateľské dáta +essentialsCommandUsage7=/ homes +essentialsCommandUsage7Description=Spravuje používateľské domovy essentialsHelp1=Súbor je poškodený a Essentials ho nevie otvoriť. Essentials je teraz vypnutý. Ak súbor nemáš ako opraviť, choď na http\://tiny.cc/EssentialsChat essentialsHelp2=Súbor je poškodený a Essentials ho nevie otvoriť. Essentials je teraz vypnutý. Ak súbor nemáš ako opraviť, napíš v hre /essentialshelp alebo choď na http\://tiny.cc/EssentialsChat essentialsReload=§6Essentials bol znova načítaný§c {0}. @@ -258,6 +267,8 @@ fireworkCommandDescription=Umožňuje upraviť stack ohňostrojov. fireworkCommandUsage=/ <|power [množstvo]|clear|fire [množstvo]> fireworkEffectsCleared=§6Všetky efekty boli odstránené. fireworkSyntax=§Parametre ohňostroja\:§c color\: [fade\:] [shape\:] [effect\:]\n§6Pre viac farieb/efektov oddeľ hodnoty čiarkami\: §cred,blue,pink\n§6Tvary\:§c star, ball, large, creeper, burst §6Efekty\:§c trail, twinkle. +fixedHomes=Neplatné domovy boli vymazané. +fixingHomes=Mažú sa neplatné domovy... flyCommandDescription=Vzlietni k výšinám\! flyCommandUsage=/ [hráč] [on|off] flyCommandUsage1=/ [hráč] @@ -343,6 +354,16 @@ homeConfirmation=§6Domov s názvom §c{0}§6 už máš\!\nPre prepísanie exist homeSet=§6Domov nastavený na aktuálnu polohu. hour=hodina hours=hodín +ice=§6Cítiš náhle ochladenie... +iceCommandDescription=Schladí hráča. +iceCommandUsage=/ [hráč] +iceCommandUsage1=/ +iceCommandUsage1Description=Schladí ťa +iceCommandUsage2=/ +iceCommandUsage2Description=Schladí zadaného hráča +iceCommandUsage3=/ * +iceCommandUsage3Description=Schladí všetkých online hráčov +iceOther=§6Hráč§c {0}§6 bol schladený. ignoreCommandDescription=Pridaj alebo odober hráča zo zoznamu ignorovaných. ignoreCommandUsage=/ ignoreCommandUsage1=/ @@ -456,6 +477,7 @@ kitCost=\ §7§o({0})§r kitDelay=§m{0}§r kitError=§4Neexistujú žiadne platné kity. kitError2=§4Tento kit je nesprávne nadefinovaný. Kontaktuj správcu. +kitError3=Nie je možné odovzdať predmet z kitu "{0}" hráčovi {1}, keďže predmet vyžaduje Paper 1.15.2+ na deserializáciu. kitGiveTo=§6Hráč §c{1}§6 dostáva kit §c{0}§6. kitInvFull=§4Tvoj inventár bol plný, kit bol položený na zem. kitInvFullNoDrop=§4V tvojom inventári nie je dosť miesta pre tento kit. diff --git a/Essentials/src/main/resources/messages_sv.properties b/Essentials/src/main/resources/messages_sv.properties index 25abcd5fa19..5c6b261814a 100644 --- a/Essentials/src/main/resources/messages_sv.properties +++ b/Essentials/src/main/resources/messages_sv.properties @@ -9,6 +9,9 @@ adventure=äventyr afkCommandDescription=Markerar dig som AFK. afkCommandUsage=/ [spelare/meddelande...] afkCommandUsage1=/ [meddelande] +afkCommandUsage1Description=Växla din afk status med en frivillig anledning +afkCommandUsage2=/ [meddelande] +afkCommandUsage2Description=Växlar afk status för den angivna spelaren med en valfri alertBroke=gjorde sönder\: alertFormat=§3[{0}] §r {1} §6 {2} vid\: §{3} alertPlaced=placerade\: @@ -315,6 +318,8 @@ homeConfirmation=§6Du har redan ett hem som heter §c{0}§6\\\!\nFör att skriv homeSet=§7Hem inställt. hour=timme hours=timmar +iceCommandUsage=/ [spelare] +iceCommandUsage1=/ ignoredList=§6Ignorerad\:§r {0} ignoreExempt=§4Du får inte ignorera den spelaren. ignorePlayer=Du ignorerar spelaren {0} från och med nu. diff --git a/Essentials/src/main/resources/messages_tr.properties b/Essentials/src/main/resources/messages_tr.properties index aa341aa3050..ce97ca61153 100644 --- a/Essentials/src/main/resources/messages_tr.properties +++ b/Essentials/src/main/resources/messages_tr.properties @@ -323,6 +323,9 @@ homeConfirmation=§c{0}§6 adında zaten bir evin var\!\nVarolan evinizin üstü homeSet=§6Eviniz şuanki konum olarak ayarlandı. hour=saat hours=saatler +iceCommandUsage=/ [oyuncu] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Diğer oyuncuları görmezden gel veya gelme. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_uk.properties b/Essentials/src/main/resources/messages_uk.properties index f0711a298fe..3b7edd83138 100644 --- a/Essentials/src/main/resources/messages_uk.properties +++ b/Essentials/src/main/resources/messages_uk.properties @@ -322,6 +322,9 @@ homeConfirmation=§6У вас вже є дім з назвою §c{0}§6\!\nЩо homeSet=§6Домівку встановлено на теперішню позицію. hour=година hours=годин(и) +iceCommandUsage=/ [player] +iceCommandUsage1=/ +iceCommandUsage2=/ ignoreCommandDescription=Ігнорувати або скасувати ігнорування інших гравців. ignoreCommandUsage=/ ignoreCommandUsage1=/ diff --git a/Essentials/src/main/resources/messages_vi.properties b/Essentials/src/main/resources/messages_vi.properties index fbf7832190c..46bbdc67196 100644 --- a/Essentials/src/main/resources/messages_vi.properties +++ b/Essentials/src/main/resources/messages_vi.properties @@ -9,6 +9,8 @@ adventure=phiêu lưu afkCommandDescription=Đánh dấu bạn đã rời bàn phím. afkCommandUsage=/ [player/message...] afkCommandUsage1=/ [message] +afkCommandUsage1Description=Điều chỉnh trạng thái AFK của bạn với một tuỳ chọn +afkCommandUsage2=/ [message] alertBroke=phá vỡ\: alertFormat=§3[{0}] §r {1} §6 {2} tại\: {3} alertPlaced=đặt\: @@ -44,10 +46,13 @@ balance=§aSố dư\:§c {0} balanceCommandDescription=Trạng thái tiền dư hiện tại của người chơi. balanceCommandUsage=/ [người chơi] balanceCommandUsage1=/ +balanceCommandUsage2Description=Hiển thị số dư của người chơi được chỉ định balanceOther=§aSố dư của {0}§a\:§c {1} balanceTop=§6Đứng đầu số dư ({0}) balanceTopLine={0}. {1}, {2} balancetopCommandDescription=Lấy giá trị số dư hàng đầu. +balancetopCommandUsage=/ [page] +balancetopCommandUsage1=/ [page] banCommandDescription=Cấm người chơi. banCommandUsage=/ [reason] banCommandUsage1=/ [reason] @@ -57,12 +62,14 @@ banFormat=§cBạn đã bị cấm\:\n§r{0} banIpJoin=Địa chỉ IP của bạn đã bị cấm. Lý do\: {0} banJoin=You are banned from this server. Reason\: {0} banipCommandDescription=Cấm địa chỉ IP. +banipCommandUsage=/
[reason] +banipCommandUsage1=/
[reason] bed=§ogiường§r bedMissing=§4Giường của bạn chưa được đặt, bị mất hoặc chặn. bedNull=§mgiường§r bedOffline=§4Không thể dịch chuyển đến giường của người chơi ngoại tuyến. bedSet=§6Đã đặt điểm hồi sinh tại giường\! -beezookaCommandDescription=Bắn ong nổ vào mục tiêu. +beezookaCommandDescription=Ném ong nổ vào mục tiêu. beezookaCommandUsage=/ bigTreeFailure=§4Tạo cây lớn thất bại, thử lại ở trên đất hoặc cỏ. bigTreeSuccess=§6Cây lớn đã được tạo. @@ -75,6 +82,10 @@ bookAuthorSet=§6Tác giả của quyển sách được đặt thành {0}. bookCommandDescription=Cho phép mở lại và chỉnh sửa cuốn sách đã được niêm phong. bookCommandUsage=/ [title|author [name]] bookCommandUsage1=/ +bookCommandUsage2=/ tác giả +bookCommandUsage2Description=Đặt tác giả cho quyển sách đã được ký +bookCommandUsage3=/ title +bookCommandUsage3Description=Đặt tiêu đề cho quyển sách đã được ký bookLocked=§6Quyển sách này đã bị khóa. bookTitleSet=§6Tiêu để của quyền sách được đặt thành {0}. breakCommandDescription=Phá vỡ khối nơi bạn đang nhìn. @@ -104,14 +115,22 @@ clearInventoryConfirmToggleOn=§6Bạn sẽ được nhắc xác nhận làm s clearinventoryCommandDescription=Xoá bỏ tất cả vật phẩm trong túi đồ. clearinventoryCommandUsage=/<command> [player|*] [item[\:<data>]|*|**] [amount] clearinventoryCommandUsage1=/<command> +clearinventoryCommandUsage1Description=Xoá bỏ tất cả vật phẩm trong túi đồ của bạn clearinventoryconfirmtoggleCommandUsage=/<command> +commandArgumentOptional=§7 +commandArgumentRequired=§e commandCooldown=§cBạn không thể nhập lệnh đó đó trong {0}. commandDisabled=§cLệnh§6 {0}§c đã tắt. commandFailed=Lệnh {0} thất bại\: commandHelpFailedForPlugin=Lỗi khi nhận trợ giúp cho plugin\: {0} +commandHelpLine1=§6Trợ giúp lệnh\: §f/{0} +commandHelpLine2=§6Mô tả\: §f{0} +commandHelpLine3=§6Sử dụng; +commandHelpLineUsage={0} §6- {1} commandNotLoaded=§4Lệnh {0} không chính xác. compassBearing=§6Hướng\: {0} ({1} độ). compassCommandUsage=/<command> +condenseCommandUsage=/<command> [item] condenseCommandUsage1=/<command> configFileMoveError=Thất bại khi di chuyển config.yml tới vị trí sao lưu. configFileRenameError=Thất bại khi đổi tên tệp tin tạm thời thành config.yml. @@ -140,13 +159,19 @@ customtextCommandUsage=/<alias> - Được định nghĩa trong bukkit.yml day=ngày days=ngày defaultBanReason=Bạn đã bị cấm khỏi máy chủ này\! +deletedHomes=Tất cả nhà đã được xoá. +deletedHomesWorld=Tất cả nhà trong {0} đã được xoá. deleteFileError=Không thể xóa tệp\: {0} deleteHome=§6Nhà§c {0} §6đã được xoá bỏ. deleteJail=§6Nhà tù§c {0} §6đã được xoá bỏ. deleteKit=§6Trang bị§c {0} §6đã được loại bỏ. deleteWarp=§6Vùng§c {0} §6đã được xoá bỏ. +deletingHomes=Đang xoá tất cả nhà... +deletingHomesWorld=Đang xoá tất cả nhà trong {0}... delhomeCommandDescription=Xóa bỏ nhà. delhomeCommandUsage=/<command> [player\:]<name> +delhomeCommandUsage1=/<command> <name> +delhomeCommandUsage2=/<command> <player>\:<name> deljailCommandDescription=Xoá bỏ nhà tù. deljailCommandUsage=/<command> <jailname> deljailCommandUsage1=/<command> <jailname> @@ -192,11 +217,25 @@ enderchestCommandUsage1=/<command> errorCallingCommand=Thất bại khi gọi lệnh /{0} errorWithMessage=§cLỗi\:§4 {0} essentialsCommandUsage=/<command> +essentialsCommandUsage1=/<command> reload +essentialsCommandUsage1Description=Tải lại cấu hình Essentials +essentialsCommandUsage2=/<command> version +essentialsCommandUsage2Description=Đưa thông tin về phiên bản Essentials +essentialsCommandUsage3=/<command> commands +essentialsCommandUsage4=/<command> debug +essentialsCommandUsage5=/<command> reset <player> +essentialsCommandUsage6=/<command> cleanup +essentialsCommandUsage6Description=Làm sạch dữ liệu người chơi cũ +essentialsCommandUsage7=/<command> homes essentialsHelp1=Tệp này đã bị hỏng và Essentials không thể mở nó. Essentials hiện sẽ vô hiệu hoá. Nếu bạn không thể sửa tệp này, hãy đi đến http\://tiny.cc/EssentialsChat essentialsHelp2=Tệp này đã bị hỏng và Essentials không thể mở nó. Essentials hiện sẽ vô hiệu hoá. Nếu bạn không thể sửa tệp này, hãy nhập lệnh /essentialshelp trong trò chơi hoặc đi đến http\://tiny.cc/EssentialsChat essentialsReload=§6Essentials đã được tải lại§c {0}. exp=§c{0} §6có§c {1} §6kinh nghiệm (cấp§c {2}§6) và cần§c {3} §6kinh nghiệm để lên cấp. expCommandDescription=Cho, thiết lập, khôi phục, hoặc xem kinh nghiệm của người chơi. +expCommandUsage=/<command> [reset|show|set|give] [playername [amount]] +expCommandUsage2=/<command> set <playername> <amount> +expCommandUsage3=/<command> show <playername> +expCommandUsage5=/<command> reset <playername> expSet=§c{0} §6hiện có§c {1} §6kinh nghiệm. extCommandUsage=/<command> [người chơi] extCommandUsage1=/<command> [người chơi] @@ -212,10 +251,18 @@ feedCommandUsage=/<command> [người chơi] feedCommandUsage1=/<command> [người chơi] feedOther=§6Bạn đã làm no §c{0}§6. fileRenameError=Đổi tên tệp {0} thất bại\! +fireballCommandUsage=/<command> [fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident] [speed] fireballCommandUsage1=/<command> +fireballCommandUsage2=/<command> <fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident> [speed] fireworkColor=§4Tham số được chèn nạp pháo hoa không hợp lệ, bạn phải đặt một màu trước. +fireworkCommandUsage=/<command> <<meta param>|power [amount]|clear|fire [amount]> +fireworkCommandUsage1=/<command> clear +fireworkCommandUsage2=/<command> power <amount> +fireworkCommandUsage3=/<command> fire [amount] +fireworkCommandUsage4=/<command> <meta> fireworkEffectsCleared=§6Đã loại bỏ tất cả các hiệu ứng từ đống đang giữ. fireworkSyntax=§6Thông số pháo hoa\:§c màu\:<màu> [fade\:<màu>] [shape\:<hình dạng>] [effect\:<hiệu ứng>]\n§6Để sử dụng nhiều màu/hiệu ứng, ngăn cách chúng với dấu phẩy\: §cred,blue,pink\n§6Hình dạng\:§c star, ball, large, creeper, burst §6Hiệu ứng\:§c trail, twinkle. +flyCommandUsage=/<command> [player] [on|off] flyCommandUsage1=/<command> [người chơi] flying=bay flyMode=§6Đặt chế độ bay§c {0} §6cho {1}§6. @@ -224,6 +271,8 @@ fullStack=§4Bạn đã có một đống đầy đủ rồi. gameMode=§6Đặt chế độ chơi§c {0} §6cho §c{1}§6. gameModeInvalid=§4Bạn cần chỉ định một người chơi/chế độ hợp lệ. gamemodeCommandDescription=Đổi chế độ chơi của người chơi. +gamemodeCommandUsage=/<command> <survival|creative|adventure|spectator> [player] +gamemodeCommandUsage1=/<command> <survival|creative|adventure|spectator> [player] gcCommandUsage=/<command> gcfree=§6Bộ nhớ trống\:§c {0} MB. gcmax=§6Bộ nhớ tối đa\:§c {0} MB. @@ -235,12 +284,13 @@ getposCommandUsage1=/<command> [người chơi] giveCommandDescription=Cho người chơi vật phẩm. giveCommandUsage=/<command> <player> <item|numeric> [amount [itemmeta...]] geoipCantFind=§6Người chơi §c{0} §6đến từ §ađất nước không xác định§6. -geoIpErrorOnJoin=Không thể lấy dữ liệu GeoIP cho {0}. Hãy chắc chắn rằng khoá bản quyền và các thiết lập của bạn đã chính xác. +geoIpErrorOnJoin=Không thể lấy dữ liệu GeoIP cho {0}. Hãy chắc chắn rằng khoá bản quyền và các thiết lập của bạn chính xác. geoIpLicenseMissing=Không tìm thấy khoá bản quyền\! Truy cập https\://essentialsx.net/geoip để xem hướng dẫn thiết lập cho lần đầu tiên. geoIpUrlEmpty=Địa chỉ tải xuống GeoIP rỗng. geoIpUrlInvalid=Địa chỉ tải xuống GeoIP không hợp lệ. givenSkull=§6Bạn đã nhận được đầu của §c{0}§6. godCommandDescription=Thức tỉnh sức mạnh thần thánh của bạn. +godCommandUsage=/<command> [player] [on|off] godCommandUsage1=/<command> [người chơi] giveSpawn=§6Gửi§c {0} §6của§c {1} đến§c {2}§6. giveSpawnFailure=§4Không đủ chỗ trống, §c{0} §c{1} §4đã bị mất. @@ -275,10 +325,14 @@ holdFirework=§4Bạn cần phải đang giữ pháo hoa để thêm hiệu ứn holdPotion=§4Bạn phải giữ chai thuốc để áp dụng hiệu ứng cho nó. holeInFloor=§4Hố tử thần\! homeCommandDescription=Dịch chuyển về nhà. +homeCommandUsage1=/<command> <name> +homeCommandUsage2=/<command> <player>\:<name> homes=§6Nhà\:§r {0} homeSet=§6Nhà được đặt lại vị trí hiện tại. hour=giờ hours=giờ +iceCommandUsage=/<command> [người chơi] +iceCommandUsage1=/<command> ignoredList=§6Danh sách chặn\:§r {0} ignoreExempt=§4Bạn không thể chặn người chơi này. ignorePlayer=§6Bạn đã từ chối§c {0} §6từ giờ trở đi. @@ -320,6 +374,7 @@ itemMustBeStacked=§4Vật phẩm đổi được phải đầy. Một số lư itemNames=§6Tên thu gọn\:§r {0} itemnameClear=§6Bạn đã xóa tên vật phẩm này. itemnameCommandUsage1=/<command> +itemnameCommandUsage2=/<command> <name> itemnameInvalidItem=§cBạn phải giữ vật phẩm trên tay để đổi tên. itemnameSuccess=§6Bạn đã đổi tên vật phẩm đang giữ thành "§c{0}§6". itemNotEnough1=§4Bạn không có đủ vật phẩm để bán. @@ -381,6 +436,7 @@ localFormat=[L]<{0}> {1} loomCommandUsage=/<command> mailClear=§6Để xóa thư, gõ§c /mail clear§6. mailCleared=§6Đã dọn thư\! +mailCommandUsage2=/<command> clear mailDelay=Quá nhiều thư đã được gửi trong cùng một phút. Nhiều nhất là\: {0} mailFormat=§6[§r{0}§6] §r{1} mailMessage={0} @@ -416,6 +472,7 @@ msgEnabled=§6Đã §cbật§6 chế độ nhận thư. msgEnabledFor=§6Đã §cbật §6chế độ nhận thư cho §c{0}§6. msgFormat=§6[§c{0}§6 -> §c{1}§6] §r{2} msgIgnore=§c{0} §4đã tắt trò chuyện riêng. +msgtoggleCommandUsage=/<command> [player] [on|off] msgtoggleCommandUsage1=/<command> [người chơi] multipleCharges=§4Bạn không thể thêm nhiều hơn 1 việc cho pháo hoa này. multiplePotionEffects=§4Bạn không thể đặt nhiều hơn một hiệu ứng cho thuốc này. @@ -522,6 +579,7 @@ playerUnmuted=§6Bạn đã không còn bị khóa trò chuyện. pong=Pong\! posPitch=§6Pitch\: {0} (Góc đầu) possibleWorlds=§6Những thế giới hiện có là từ §c0§6 đến §c{0}§6. +potionCommandUsage1=/<command> clear posX=§6X\: {0} (+Đông <-> -Tây) posY=§6Y\: {0} (+Lên <-> -Xuống) posYaw=§6Yaw\: {0} (Vòng xoay) @@ -594,6 +652,7 @@ resetBalAll=§6Số dư đã được làm mới thành §c{0} §6cho tất cả restCommandUsage=/<command> [người chơi] restCommandUsage1=/<command> [người chơi] returnPlayerToJailError=§4Đã có lỗi khi cố gắng đưa người chơi§c {0} §4về lại tù\: §c{1}§4\! +rtoggleCommandUsage=/<command> [player] [on|off] runningPlayerMatch=§6Đang tìm kiếm người chơi phù hợp ''§c{0}§6'' (điều này có thể mất một chút thời gian). second=giây seconds=giây @@ -608,6 +667,8 @@ serverUnsupported=Bạn đang sử dụng một phiên bản máy chủ không setBal=§aSố dư của bạn được đặt thành {0}. setBalOthers=§aBạn đa đặt số dư của {0}§a thành {1}. setSpawner=§6Chuyển loại lồng quái(Spawner) thành§c {0}§6. +sethomeCommandUsage1=/<command> <name> +sethomeCommandUsage2=/<command> <player>\:<name> setjailCommandUsage=/<command> <jailname> setjailCommandUsage1=/<command> <jailname> setwarpCommandUsage=/<command> <warp> @@ -629,6 +690,7 @@ smithingtableCommandUsage=/<command> socialSpy=§6Chế độ nghe lén cho §c{0}§6\: §c{1} socialSpyMsgFormat=§6[§c{0}§6 -> §c{1}§6] §7{2} socialSpyMutedPrefix=§f[§6SS§f] §7(bị tắt tiếng) §r +socialspyCommandUsage=/<command> [player] [on|off] socialspyCommandUsage1=/<command> [người chơi] socialSpyPrefix=§f[§6SS§f] §r soloMob=§4Con quái này muốn được ở một mình. @@ -673,8 +735,8 @@ tempbanJoin=You are banned from this server for {0}. Reason\: {1} tempBanned=§cBạn đã tạm thời bị cấm trong {0}\:\n§r{2} thunder=§6Bạn§c {0} §6sấm sét ở thế giới của mình. thunderDuration=§6Bạn§c {0} §6sấm sét ở thế giới này trong§c {1} §6giây. -timeBeforeHeal=§4Lần hồi phục tiếp theo\:§c {0} -timeBeforeTeleport=§4Lần dịch chuyển tiếp theo\:§c {0} +timeBeforeHeal=§4Thời gian đến lần hồi phục tiếp theo\:§c {0}§4. +timeBeforeTeleport=§4Thời gian đến lần dịch chuyển tiếp theo\:§c {0}§4. timeCommandUsage1=/<command> timeFormat=§c{0}§6 hay §c{1}§6 hay §c{2}§6 timeSetPermission=§4Bạn không được phép điều chỉnh thời gian. @@ -682,6 +744,7 @@ timeSetWorldPermission=§4Bạn không được phép điều chỉnh thời gia timeWorldCurrent=§6Thời gian hiện tại ở§c {0} §6là §c{1}§6. timeWorldCurrentSign=§6Thời gian hiện tại là §c{0}§6. timeWorldSet=§6Thời gian được đặt lại thành§c {0} §6ở\: §c{1}§6. +toggleshoutCommandUsage=/<command> [player] [on|off] toggleshoutCommandUsage1=/<command> [người chơi] topCommandUsage=/<command> totalSellableAll=§aTổng giá trị của tất cả các vật phẩm và khối có thể bán được là §c{1}§a. @@ -700,6 +763,7 @@ tpdenyCommandUsage1=/<command> tprCommandUsage=/<command> tprCommandUsage1=/<command> tps=§6TPS hiện tại \= {0} +tptoggleCommandUsage=/<command> [player] [on|off] tptoggleCommandUsage1=/<command> [người chơi] tradeSignEmpty=§4Cái bảng trao đổi này không có sẵn cho bạn. tradeSignEmptyOwner=§4Không có gì để thu thập từ bảng trao đổi này. @@ -742,6 +806,7 @@ userJailed=§6Bạn đã bị giam\! userUnknown=§4Cảnh báo\: Người chơi ''§c{0}§4'' chưa bao giờ vào máy chủ này. usingTempFolderForTesting=Sử dụng thư mục đệm để thử nghiệm\: vanish=§6Ẩn thân cho {0}§6\: {1} +vanishCommandUsage=/<command> [player] [on|off] vanishCommandUsage1=/<command> [người chơi] vanished=§6Giờ bạn đã hoàn toàn tàng hình với người chơi, bạn sẽ được ẩn với các lệnh trong trò chơi. versionOutputVaultMissing=§4Vault chưa được cài đặt. Trò chuyện và quyền có thể không hoạt động. @@ -754,6 +819,7 @@ versionMismatchAll=§4Phiên bản không phù hợp\! Vui lòng cập nhật t voiceSilenced=§6Giọng bạn đã bị tắt tiếng\! voiceSilencedReason=§6Giọng nói của bạn đã bị tắt tiếng\! Lý do\: §c{0} walking=Đi bộ +warpCommandUsage1=/<command> [page] warpDeleteError=§4Có vấn đề khi xóa tệp khu vực. warpinfoCommandUsage=/<command> <warp> warpinfoCommandUsage1=/<command> <warp> diff --git a/Essentials/src/main/resources/messages_zh.properties b/Essentials/src/main/resources/messages_zh.properties index b97f2ba4b21..9c3ebed0f9f 100644 --- a/Essentials/src/main/resources/messages_zh.properties +++ b/Essentials/src/main/resources/messages_zh.properties @@ -9,9 +9,9 @@ adventure=冒险模式 afkCommandDescription=将你标记为暂时离开。 afkCommandUsage=/<command> [玩家/消息…] afkCommandUsage1=/<command> [消息] -afkCommandUsage1Description=以一个可选理由进入离开状态 +afkCommandUsage1Description=以一个可选理由切换离开状态 afkCommandUsage2=/<command> <玩家> [信息] -afkCommandUsage2Description=为指定玩家以一个可选理由进入离开状态 +afkCommandUsage2Description=为指定玩家以一个可选理由切换离开状态 alertBroke=破坏: alertFormat=§3[{0}] §r{1}§6{2}于:{3} alertPlaced=放置了: @@ -36,7 +36,7 @@ backAfterDeath=§6使用§c/back§6命令回到死亡地点。 backCommandDescription=传送你至先前的位置。 backCommandUsage=/<command> [玩家] backCommandUsage1=/<command> -backCommandUsage1Description=将你传送到你先前的位置 +backCommandUsage1Description=传送到你先前的位置 backCommandUsage2=/<command> <玩家> backCommandUsage2Description=将指定玩家传送到他们先前的位置 backOther=§6已将§c{0}§6返回到先前的位置。 @@ -60,28 +60,28 @@ balanceTopLine={0}。{1},{2} balancetopCommandDescription=获取金钱排行榜。 balancetopCommandUsage=/<command> [页码] balancetopCommandUsage1=/<command> [页码] -balancetopCommandUsage1Description=展示金钱排行榜的第一页(或指定页) +balancetopCommandUsage1Description=展示金钱排行榜的第一(或指定)页 banCommandDescription=封禁一位玩家。 -banCommandUsage=/<command> <玩家> [原因] -banCommandUsage1=/<command> <玩家> [原因] -banCommandUsage1Description=以自定义原因封禁指定玩家 +banCommandUsage=/<command> <玩家> [理由] +banCommandUsage1=/<command> <玩家> [理由] +banCommandUsage1Description=以自定义理由封禁指定玩家 banExempt=§4你不能封禁那位玩家。 banExemptOffline=§4你无法封禁已离线的玩家。 banFormat=§4已封禁:\n§r{0} banIpJoin=你的IP地址已被此服务器封禁。理由:{0} banJoin=你已被此服务器封禁。理由:{0} banipCommandDescription=封禁一个IP地址。 -banipCommandUsage=/<command> <地址> [原因] -banipCommandUsage1=/<command> <地址> [原因] -banipCommandUsage1Description=以自定义原因封禁指定IP地址 +banipCommandUsage=/<command> <地址> [理由] +banipCommandUsage1=/<command> <地址> [理由] +banipCommandUsage1Description=以自定义理由封禁指定IP地址 bed=§o床§r -bedMissing=§4你的床已丢失或被阻挡。 +bedMissing=§4你的床已丢失(或被阻挡)。 bedNull=§m床§r bedOffline=§4无法传送到离线玩家的床。 bedSet=§6已设置床! beezookaCommandDescription=向你的敌人扔出一只会爆炸的蜜蜂。 beezookaCommandUsage=/<command> -bigTreeFailure=§4无法生成大树。请在泥土或者草方块上面再试一次。 +bigTreeFailure=§4无法生成大树。请在泥土(或者草方块)上面再试一次。 bigTreeSuccess=§6大树生成成功。 bigtreeCommandDescription=在你看着的地方生成一棵大树。 bigtreeCommandUsage=/<command> <tree|redwood|jungle|darkoak> @@ -93,11 +93,11 @@ bookAuthorSet=§6这本书的作者已被设置为{0}。 bookCommandDescription=允许重新打开并编辑已署名的书籍。 bookCommandUsage=/<command> [标题|作者 [名字]] bookCommandUsage1=/<command> -bookCommandUsage1Description=锁定或解锁一本书与笔或已签名的书 +bookCommandUsage1Description=锁定或解锁一本已签名的书(或书与笔) bookCommandUsage2=/<command> author <作者> bookCommandUsage2Description=设置签名书的作者 bookCommandUsage3=/<command> title <标题> -bookCommandUsage3Description=设置签名书的标题 +bookCommandUsage3Description=设置已签名书的标题 bookLocked=§6这本书现在被锁定了。 bookTitleSet=§6这本书的标题已被设置为{0}。 breakCommandDescription=破坏你光标所指向的方块。 @@ -139,7 +139,7 @@ clearinventoryCommandUsage1Description=清空你物品栏中的所有物品 clearinventoryCommandUsage2=/<command> <玩家> clearinventoryCommandUsage2Description=清空指定玩家物品栏中的所有物品 clearinventoryCommandUsage3=/<command> <玩家> <物品> [数量] -clearinventoryCommandUsage3Description=清空所有指定玩家物品栏中所有的(或给定数量的)指定物品 +clearinventoryCommandUsage3Description=清空所有指定玩家物品栏中所有(或给定数量)的指定物品 clearinventoryconfirmtoggleCommandDescription=切换是否在清除物品栏的时候显示确认提示。 clearinventoryconfirmtoggleCommandUsage=/<command> commandArgumentOptional=§7 @@ -162,7 +162,7 @@ condenseCommandUsage=/<command> [物品] condenseCommandUsage1=/<command> condenseCommandUsage1Description=压缩你物品栏中的所有物品 condenseCommandUsage2=/<command> <物品> -condenseCommandUsage2Description=压缩指定玩家物品栏中的所有物品 +condenseCommandUsage2Description=压缩你物品栏中的指定物品 configFileMoveError=移动config.yml文件到备份位置失败。 configFileRenameError=重命名缓存文件为config.yml失败。 confirmClear=§7若要§l确认§7清空物品栏,请再输一次命令:§6{0} @@ -181,6 +181,7 @@ createkitCommandUsage1Description=创建一个给定名称和冷却时间的物 createKitFailed=§4创建物品包出错 {0}。 createKitSeparator=§m----------------------- createKitSuccess=§6创建物品包:§f{0}\n§6使用次数:§f{1}\n§6信息:§f{2}\n§6复制下面的信息到kits.yml里面。 +createKitUnsupported=§4已开启NBT序列化,但由于正在使用的服务端不是Paper 1.15.2或以上版本,因此回滚到了标准的物品序列化。 creatingConfigFromTemplate=从模板创建配置:{0} creatingEmptyConfig=创建空的配置:{0} creative=创造模式 @@ -191,11 +192,15 @@ customtextCommandUsage=/<alias> - 定义于 bukkit.yml day=日 days=日 defaultBanReason=你已被此服务器封禁! +deletedHomes=已删除所有家。 +deletedHomesWorld=已删除在{0}世界里的所有家。 deleteFileError=无法删除文件:{0} deleteHome=§6家§c{0}§6已被移除。 deleteJail=§6监狱§c{0}§6已被移除。 deleteKit=§6物品包§c{0}§6已被移除。 deleteWarp=§6传送点§c{0}§6已被移除。 +deletingHomes=正在删除所有家... +deletingHomesWorld=正在删除在{0}世界里的所有家... delhomeCommandDescription=删除一个你创建的家。 delhomeCommandUsage=/<command> [玩家\:]<名字> delhomeCommandUsage1=/<command> <名字> @@ -269,70 +274,76 @@ errorWithMessage=§c错误:§4{0} essentialsCommandDescription=重载Essentials。 essentialsCommandUsage=/<command> essentialsCommandUsage1=/<command> reload -essentialsCommandUsage1Description=重置Essentials的配置文件 +essentialsCommandUsage1Description=重载Essentials的配置文件 essentialsCommandUsage2=/<command> version essentialsCommandUsage2Description=提供有关Essentials当前版本的信息 essentialsCommandUsage3=/<command> commands -essentialsCommandUsage3Description=提供有关Essentials如何转发的有关信息 +essentialsCommandUsage3Description=提供有关Essentials正在转移的命令的有关信息 essentialsCommandUsage4=/<command> debug -essentialsCommandUsage4Description=切换 Essentials'' "debug 模式" 的状态 -essentialsCommandUsage5=/<command> reset <player> +essentialsCommandUsage4Description=切换Essentials的debug模式 +essentialsCommandUsage5=/<command> reset <玩家> essentialsCommandUsage5Description=重置指定玩家的数据 +essentialsCommandUsage6=/<command> cleanup +essentialsCommandUsage6Description=清除旧的玩家数据 +essentialsCommandUsage7=/<command> homes +essentialsCommandUsage7Description=管理玩家的家 essentialsHelp1=由于此文件已损坏,Essentials无法开启。EssentialsX现在已被关闭。如果你无法自行修复此问题,请前往http\://tiny.cc/EssentialsChat寻求帮助。 -essentialsHelp2=由于此文件已损坏,Essentials无法开启。EssentialsX现在已被关闭。如果你无法自行修复此问题,请在游戏中输入/essentialshelp或前往http\://tiny.cc/EssentialsChat寻求帮助。 +essentialsHelp2=由于文件损坏且Essentials无法打开,EssentialsX现在已被关闭。如果你无法自行修复此问题,请在游戏中输入/essentialshelp(或前往http\://tiny.cc/EssentialsChat寻求帮助)。 essentialsReload=§6Essentials已重新载入§c{0}§6。 exp=§4{0}§6拥有§c{1}§6经验值(等级§c {2}§6),下一级还需要§c{3}§6经验。 expCommandDescription=给予、设置、重置或查看一个玩家的经验值。 expCommandUsage=/<command> [reset|show|set|give] [玩家名 [数量]] expCommandUsage1=/<command> give <玩家> <数量> -expCommandUsage1Description=给予指定玩家一定数量的经验 -expCommandUsage2=/<command> set <playername> <amount> -expCommandUsage2Description=设置玩家的经验设置为指定的值 -expCommandUsage3=/<command> show <playername> -expCommandUsage4Description=显示指定玩家所拥有的经验值 -expCommandUsage5=/<command> reset <playername> +expCommandUsage1Description=给予指定玩家给定数量的经验值 +expCommandUsage2=/<command> set <玩家> <数量> +expCommandUsage2Description=设置玩家的经验 +expCommandUsage3=/<command> show <玩家> +expCommandUsage4Description=显示指定玩家拥有的经验值 +expCommandUsage5=/<command> reset <玩家> expCommandUsage5Description=将指定玩家的经验值重置为零 expSet=§6你将§c{0}§6的经验设置为§c{1}§6。 extCommandDescription=为玩家灭火。 extCommandUsage=/<command> [玩家] extCommandUsage1=/<command> [玩家] -extCommandUsage1Description=为你自己或者指定玩家灭火 +extCommandUsage1Description=为你自己(或指定玩家)灭火 extinguish=§6你熄灭了你自己身上的火。 extinguishOthers=§6你熄灭了{0}§6身上的火。 failedToCloseConfig=关闭配置{0}失败。 failedToCreateConfig=创建配置{0}失败。 failedToWriteConfig=写入配置{0}失败。 false=§4否§r -feed=你已经饱了。 +feed=§6你已经饱了。 feedCommandDescription=恢复饱食度。 feedCommandUsage=/<command> [玩家] feedCommandUsage1=/<command> [玩家] -feedCommandUsage1Description=为你自己或者指定玩家恢复所有饥饿值 +feedCommandUsage1Description=为你自己(或指定玩家)恢复所有饥饿值 feedOther=§6你把玩家§c{0}§6喂饱了。 fileRenameError=重命名文件{0}失败! -fireballCommandDescription=扔出火焰弹或者其它的弹射物。 +fireballCommandDescription=扔出火焰弹(或者其它的弹射物)。 fireballCommandUsage=/<command> [fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident] [速度] fireballCommandUsage1=/<command> fireballCommandUsage1Description=从你的位置扔出一个火球 fireballCommandUsage2=/<command> <fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident> [速度] -fireballCommandUsage2Description=从你的位置扔出一个可自定义速度的弹射物 +fireballCommandUsage2Description=从你的位置扔出一个可自定义速度的投掷物 fireworkColor=§4无效的烟花参数,你必须首先设置一个颜色。 fireworkCommandDescription=修改一组烟花。 fireworkCommandUsage=/<command> <<meta param>|power [数量]|clear|fire [数量]> fireworkCommandUsage1=/<command> clear -fireworkCommandUsage1Description=清除你手持的烟花的所有效果 +fireworkCommandUsage1Description=清除你手持烟花的所有效果 fireworkCommandUsage2=/<command> power <数量> -fireworkCommandUsage2Description=设置你手持的烟花的强度 +fireworkCommandUsage2Description=设置你手持烟花的强度 fireworkCommandUsage3=/<command> fire [数量] -fireworkCommandUsage3Description=复制并发射一枚或指定数量的你手持着的烟花 +fireworkCommandUsage3Description=发射一枚(或指定数量的)你手持着的一模一样的烟花 fireworkCommandUsage4=/<command> <元数据> fireworkCommandUsage4Description=将特定的效果添加到你手持的烟花中 fireworkEffectsCleared=§6移除了你手中物品的所有效果。 fireworkSyntax=§6烟花参数:§c color\:<颜色> [fade\:<淡出颜色>] [shape\:<形态>] [effect\:<效果>]\n§6若要使用多个颜色/效果,请使用半角逗号分隔,例:§cred,blue,pink\n§6形状:§c star, ball, large, creeper, burst §6特效\:§c trail, twinkle。 +fixedHomes=已删除无效的家。 +fixingHomes=正在删除无效的家... flyCommandDescription=芜湖,起飞! flyCommandUsage=/<command> [玩家] [on|off] flyCommandUsage1=/<command> [玩家] -flyCommandUsage1Description=为你自己或者指定玩家切换飞行模式 +flyCommandUsage1Description=切换你(或指定玩家)的飞行模式 flying=飞行 flyMode=§c{1}§6的飞行模式被设置为§c{0}。 foreverAlone=§4你没有任何人可以回复。 @@ -344,7 +355,7 @@ gameModeInvalid=§4你需要指定一位有效的玩家/游戏模式。 gamemodeCommandDescription=更改玩家的游戏模式。 gamemodeCommandUsage=/<command> <survival|creative|adventure|spectator> [玩家] gamemodeCommandUsage1=/<command> <survival|creative|adventure|spectator> [玩家] -gamemodeCommandUsage1Description=为你自己或者指定玩家设置游戏模式 +gamemodeCommandUsage1Description=设置你自己(或指定玩家)的游戏模式 gcCommandDescription=报告内存、正常运行时间和刻信息。 gcCommandUsage=/<command> gcfree=§6空闲内存:§c{0}MB。 @@ -352,14 +363,14 @@ gcmax=§6最大内存:§c{0}MB。 gctotal=§6已分配内存:§c{0}MB。 gcWorld=§6{0}“§c{1}§6”:§c{2}§6区块,§c{3}§6实体,§c{4}§6方块实体。 geoipJoinFormat=§6玩家§c{0}§6来自于§c{1}§6。 -getposCommandDescription=获取你的或某一玩家的当前坐标。 +getposCommandDescription=获取你(或某一玩家)的当前坐标。 getposCommandUsage=/<command> [玩家] getposCommandUsage1=/<command> [玩家] -getposCommandUsage1Description=得到你自己或者指定玩家的位置 +getposCommandUsage1Description=得到你自己(或指定玩家)的位置 giveCommandDescription=给予一位玩家物品。 giveCommandUsage=/<command> <玩家> <item|numeric> [数量 [itemmeta...]] giveCommandUsage1=/<command> <玩家> <物品> [数量] -giveCommandUsage1Description=给目标玩家64个(或给定数量)指定物品 +giveCommandUsage1Description=给目标玩家64个(或给定数量的)指定物品 giveCommandUsage2=/<command> <玩家> <物品> <数量> <元数据> giveCommandUsage2Description=给目标玩家给定数量的带有元数据的指定物品 geoipCantFind=§6玩家§c{0}来自于§a未知的国家§6。 @@ -371,7 +382,7 @@ givenSkull=§6你获得了§c{0}§6的头颅。 godCommandDescription=启用上帝模式。 godCommandUsage=/<command> [玩家] [on|off] godCommandUsage1=/<command> [玩家] -godCommandUsage1Description=为你自己或者指定玩家切换上帝模式 +godCommandUsage1Description=切换你(或指定玩家)的上帝模式 giveSpawn=§6给予§c{2}§6{0}个§c{1}§6。 giveSpawnFailure=§4物品栏没有足够的空间,§c{0}个§c{1}§4已丢失。 godDisabledFor=§c关闭了{0}§6的上帝模式。 @@ -395,10 +406,10 @@ hatPlaced=§6你戴上了新帽子! hatRemoved=§6你的帽子已被移除。 haveBeenReleased=§6你已被释放。 heal=§6你已被治疗。 -healCommandDescription=治疗自己或你选定的玩家。 +healCommandDescription=治疗自己(或你指定的玩家)。 healCommandUsage=/<command> [玩家] healCommandUsage1=/<command> [玩家] -healCommandUsage1Description=为你自己或者指定玩家治疗 +healCommandUsage1Description=为你自己(或指定玩家)治疗 healDead=§4你不能治疗已死亡的玩家! healOther=§6已治疗§c{0}§6。 helpCommandDescription=显示可用的命令列表。 @@ -428,10 +439,20 @@ homeConfirmation=§6你已经拥有了一个名叫§c{0}§6的家!\n若要覆 homeSet=§6已在你当前的位置设置家。 hour=小时 hours=小时 -ignoreCommandDescription=屏蔽或取消屏蔽其他玩家。 +ice=§6你感觉非常冷... +iceCommandDescription=冰冻玩家。 +iceCommandUsage=/<command> [玩家] +iceCommandUsage1=/<command> +iceCommandUsage1Description=冰冻自己 +iceCommandUsage2=/<command> <玩家> +iceCommandUsage2Description=冰冻指定的玩家 +iceCommandUsage3=/<command> * +iceCommandUsage3Description=冰冻所有在线玩家 +iceOther=§6冰冻§c{0}§6。 +ignoreCommandDescription=屏蔽(或取消屏蔽)其他玩家。 ignoreCommandUsage=/<command> <玩家> ignoreCommandUsage1=/<command> <玩家> -ignoreCommandUsage1Description=屏蔽或取消屏蔽指定玩家 +ignoreCommandUsage1Description=屏蔽(或取消屏蔽)指定玩家 ignoredList=§6已屏蔽的玩家:§r{0} ignoreExempt=§4你无法屏蔽那位玩家。 ignorePlayer=§6你屏蔽了§c{0}。 @@ -466,7 +487,7 @@ inventoryClearingStack=§6你被§c{2}§6移除§c{0}§6个§c{1}§6。 invseeCommandDescription=查看其他玩家的物品栏。 invseeCommandUsage=/<command> <玩家> invseeCommandUsage1=/<command> <玩家> -invseeCommandUsage1Description=打开一个指定玩家的物品栏 +invseeCommandUsage1Description=打开指定玩家的物品栏 is=是 isIpBanned=§6IP地址§c{0}§6已被封禁。 internalError=§c尝试执行此命令时发生未知错误。 @@ -474,9 +495,9 @@ itemCannotBeSold=§4该物品无法卖给服务器。 itemCommandDescription=生成一个物品。 itemCommandUsage=/<command> <item|numeric> [数量 [itemmeta...]] itemCommandUsage1=/<command> <物品> [数量] -itemCommandUsage1Description=给你自己一组(或给定数量)指定物品 +itemCommandUsage1Description=给你自己一组(或给定数量的)指定物品 itemCommandUsage2=/<command> <物品> <数量> <元数据> -itemCommandUsage2Description=给你自己给定数量的带有元数据的指定物品 +itemCommandUsage2Description=给你自己指定数量且带有元数据的指定物品 itemId=§6ID:§c{0} itemloreClear=§6你已经清除该物品的描述。 itemloreCommandDescription=编辑一个物品的描述。 @@ -484,7 +505,7 @@ itemloreCommandUsage=/<command> <add/set/clear> [文本/行数] [文本] itemloreCommandUsage1=/<command> <add> [文本] itemloreCommandUsage1Description=将指定文本添加到手持物品的描述的末尾 itemloreCommandUsage2=/<command> <set> <行数> <文本> -itemloreCommandUsage2Description=设置手持物品的描述的指定行为给定的文本 +itemloreCommandUsage2Description=设置手持物品描述的指定行为给定的文本 itemloreCommandUsage3=/<command> <clear> itemloreCommandUsage3Description=清除手持物品的描述 itemloreInvalidItem=§4你需要拿着一个物品才能编辑它的描述。 @@ -526,6 +547,7 @@ jailReleased=§c{0}§6出狱了。 jailReleasedPlayerNotify=§6你已被释放! jailSentenceExtended=§6囚禁时间追加到§c{0}§6。 jailSet=§6监狱{0}被设置。 +jailWorldNotExist=§4该监狱位于的世界不存在。 jumpEasterDisable=§6飞行导向模式已禁用。 jumpEasterEnable=§6飞行导向模式已启用。 jailsCommandDescription=显示所有监狱列表。 @@ -533,34 +555,34 @@ jailsCommandUsage=/<command> jumpCommandDescription=跳到视线中最近的方块。 jumpCommandUsage=/<command> jumpError=§4这将会损坏你的电脑。 -kickCommandDescription=以一个原因踢出指定的玩家。 -kickCommandUsage=/<command> <玩家> [原因] -kickCommandUsage1=/<command> <玩家> [原因] -kickCommandUsage1Description=以自定义原因踢出指定玩家 +kickCommandDescription=以一个理由踢出指定的玩家。 +kickCommandUsage=/<command> <玩家> [理由] +kickCommandUsage1=/<command> <玩家> [理由] +kickCommandUsage1Description=以自定义理由踢出指定玩家 kickDefault=从服务器踢出。 kickedAll=§4已将所有玩家踢出服务器。 kickExempt=§4你无法踢出该玩家。 kickallCommandDescription=把除了发送这条命令的所有玩家踢出服务器。 kickallCommandUsage=/<command> [理由] kickallCommandUsage1=/<command> [理由] -kickallCommandUsage1Description=以自定义原因踢出所有玩家 +kickallCommandUsage1Description=以自定义理由踢出所有玩家 kill=§c{0}§6被杀死了。 killCommandDescription=杀死指定的玩家。 killCommandUsage=/<command> <玩家> killCommandUsage1=/<command> <玩家> killCommandUsage1Description=杀死指定的玩家 killExempt=§4你不能杀死§c{0}§4。 -kitCommandDescription=获取指定的物品包或查看所有可用的物品包。 +kitCommandDescription=获取指定的物品包(或查看所有可用的物品包)。 kitCommandUsage=/<command> [物品包] [玩家] kitCommandUsage1=/<command> kitCommandUsage1Description=列出可用的物品包 kitCommandUsage2=/<command> <物品包> [玩家] -kitCommandUsage2Description=给予你自己或指定玩家一个指定的物品包 +kitCommandUsage2Description=给予你自己(或选定玩家)一个指定的物品包 kitContains=§6物品包§c{0}§6包含如下物品: kitCost=\ §7§o({0})§r kitDelay=§m{0}§r kitError=§4没有有效的物品包。 -kitError2=§4该物品包的配置不正确。请联系操作员。 +kitError2=§4该物品包的配置不正确。请联系管理员。 kitGiveTo=§6给予物品包§c{0}§6给§c{1}§6。 kitInvFull=§4你的物品栏已满,物品包将扔在地上。 kitInvFullNoDrop=§4你的物品栏里没有足够的空间装下该物品包。 @@ -572,17 +594,17 @@ kitReset=§6为物品包§c{0}§6重置冷却时间。 kitresetCommandDescription=重置指定物品包的冷却时间。 kitresetCommandUsage=/<command> <物品包> [玩家] kitresetCommandUsage1=/<command> <物品包> [玩家] -kitresetCommandUsage1Description=将你自己或指定玩家一个指定的物品包的冷却时间重置 +kitresetCommandUsage1Description=将你自己(或选定玩家)一个指定的物品包的冷却时间重置 kitResetOther=§6为§c{1}§6重置物品包§c{0}§6的冷却时间。 kits=§6物品包:§r{0} kittycannonCommandDescription=向你的敌人扔出一只会爆炸的猫。 kittycannonCommandUsage=/<command> kitTimed=§4你不能再次对其他人使用此物品包§c{0}§4。 -leatherSyntax=§6皮革颜色语法:color\:<red>,<green>,<blue> 例如:color\:255,0,0;或者 color\:<rgb 整数> 例如:color\:16777011 -lightningCommandDescription=来自雷神的力量。可击中光标所指的地方或玩家。 +leatherSyntax=§6皮革颜色语法:color\:<red>,<green>,<blue> 例如:color\:255,0,0(或者 color\:<rgb 整数> 例如:color\:16777011) +lightningCommandDescription=以雷神的力量,击中光标所指的地方(或玩家)。 lightningCommandUsage=/<command> [玩家] [力量] lightningCommandUsage1=/<command> [玩家] -lightningCommandUsage1Description=使用闪电轰击你看着的地方或指定玩家 +lightningCommandUsage1Description=使用闪电轰击你看着(或指定玩家)的位置 lightningCommandUsage2=/<command> <玩家> <强度> lightningCommandUsage2Description=以指定强度的闪电轰击指定玩家 lightningSmited=§6你被雷击中了! @@ -593,7 +615,7 @@ listAmountHidden=§6当前有§c{0}§6/§c{1}§6位玩家在线,可容纳最 listCommandDescription=显示所有在线玩家。 listCommandUsage=/<command> [组名] listCommandUsage1=/<command> [组名] -listCommandUsage1Description=列出所有或指定组的玩家 +listCommandUsage1Description=列出所有(或指定组)的玩家 listGroupTag=§6{0}§r: listHiddenTag=§7[隐身]§r loadWarpError=§4加载传送点{0}失败。 @@ -647,7 +669,7 @@ months=月 moreCommandDescription=将手中的物品堆叠至指定值,如果未指定则为最大值。 moreCommandUsage=/<command> [数量] moreCommandUsage1=/<command> [数量] -moreCommandUsage1Description=将手中的物品填充至指定值,如果未指定则为最大值 +moreCommandUsage1Description=将手中的物品填充至指定值(如果未指定则为最大值) moreThanZero=§4数量必须大于0。 motdCommandDescription=查看MOTD。 motdCommandUsage=/<command> [章节] [页数] @@ -655,7 +677,7 @@ moveSpeed=§6将§c{2}§6的§c{0}§6速度设为§c{1}§6。 msgCommandDescription=发送私信给指定玩家。 msgCommandUsage=/<command> <到> <信息> msgCommandUsage1=/<command> <到> <信息> -msgCommandUsage1Description=将指定玩家发送私信 +msgCommandUsage1Description=向指定玩家发送私信 msgDisabled=§6接收消息§c关闭§6。 msgDisabledFor=§c{0}§6的接收消息现在被§c关闭§6。 msgEnabled=§6接收消息§c开启§6。 @@ -665,15 +687,15 @@ msgIgnore=§c{0}§4关闭了接受消息。 msgtoggleCommandDescription=拒绝接收所有私信。 msgtoggleCommandUsage=/<command> [玩家] [on|off] msgtoggleCommandUsage1=/<command> [玩家] -msgtoggleCommandUsage1Description=为你自己或者指定玩家切换飞行模式 +msgtoggleCommandUsage1Description=切换你(或指定玩家)的飞行模式 multipleCharges=§4你不能对这个烟花应用多种填充物。 multiplePotionEffects=§4你不能对这个药水应用多种效果。 -muteCommandDescription=禁言或取消禁言玩家。 -muteCommandUsage=/<command> <玩家> [时间] [原因] +muteCommandDescription=禁言(或取消禁言)玩家。 +muteCommandUsage=/<command> <玩家> [时间] [理由] muteCommandUsage1=/<command> <玩家> -muteCommandUsage1Description=当指定玩家已经被禁言时,将禁言时长设置为永久或解除禁言 -muteCommandUsage2=/<command> <玩家> <时长> [原因] -muteCommandUsage2Description=以自定义原因禁言指定玩家给定时间 +muteCommandUsage1Description=当指定玩家已经被禁言时,将禁言时长设置为永久(或解除)禁言 +muteCommandUsage2=/<command> <玩家> <时长> [理由] +muteCommandUsage2Description=以自定义理由禁言指定玩家给定时间 mutedPlayer=§6玩家§c{0}§6已被禁言。 mutedPlayerFor=§6玩家§c {0} §6被禁言§c {1}§6. mutedPlayerForReason=§c{0}§6被§c{1}§6禁言。理由:§c{2} @@ -683,9 +705,9 @@ muteExempt=§4你无法禁言该玩家。 muteExemptOffline=§4你无法禁言已离线玩家。 muteNotify=§c{0}§6禁言了§c{1}§6。 muteNotifyFor=§c{0}§6禁言了§c{1}§6,禁言时长:§c{2}§6。 -muteNotifyForReason=§c{0}§6禁言了§c{1}§6,禁言时长:§c{2}§6。原因:§c{3} -muteNotifyReason=§c{0}§6禁言了§c{1}§6。原因:§c{2} -nearCommandDescription=列出一位玩家附近或半径内的玩家。 +muteNotifyForReason=§c{0}§6禁言了§c{1}§6,禁言时长:§c{2}§6。理由:§c{3} +muteNotifyReason=§c{0}§6禁言了§c{1}§6。理由:§c{2} +nearCommandDescription=列出一位玩家附近(或半径内)的玩家。 nearCommandUsage=/<command> [玩家] [半径] nearCommandUsage1=/<command> nearCommandUsage1Description=列出以你为中心默认范围内的所有玩家 @@ -761,7 +783,7 @@ nuke=§5核武降落,注意隐蔽! nukeCommandDescription=降下死亡之雨。 nukeCommandUsage=/<command> [玩家] nukeCommandUsage1=/<command> [玩家...] -nukeCommandUsage1Description=将所有或指定玩家发射一枚核弹 +nukeCommandUsage1Description=向所有(或指定玩家)发射一枚核弹 numberRequired=这里得写个数字,憨批。 onlyDayNight=/time 命令只有 day/night 两个参数。 onlyPlayers=§4只有在游戏的玩家才能使用§c{0}§4。 @@ -789,7 +811,7 @@ payconfirmtoggleCommandUsage=/<command> paytoggleCommandDescription=切换是否接受付款。 paytoggleCommandUsage=/<command> [玩家] paytoggleCommandUsage1=/<command> [玩家] -paytoggleCommandUsage1Description=让你或者其它指定玩家接受他人付款 +paytoggleCommandUsage1Description=让你(或其它指定玩家)接受他人付款 pendingTeleportCancelled=§4待处理的传送请求已取消 pingCommandDescription=啪! pingCommandUsage=/<command> @@ -802,7 +824,7 @@ playerKicked=§6操作员§c{0}§6踢出了§c{1}§6,时长:§c{2}§6。 playerMuted=§6你被禁言了! playerMutedFor=§6你被禁言§c{0}§6。 playerMutedForReason=§6你被禁言§c{0}§6。理由:§c{1} -playerMutedReason=§6你已被禁言!原因:§c{0} +playerMutedReason=§6你已被禁言!理由:§c{0} playerNeverOnServer=§4玩家§c{0}§4从没在这服务器出现过。 playerNotFound=§4未找到玩家。 playerTempBanned=§6操作员§c{0}§6临时封禁了§c{1}§6 §c{2}§6,理由:§c{3}§6. @@ -847,12 +869,25 @@ powertoolCommandUsage3Description=移除你手中物品中的指定命令 powertoolCommandUsage4=/<command> <命令> powertoolCommandUsage4Description=将手持的物品绑定指定的命令 powertoolCommandUsage5=/<command> a\:<命令> -powertooltoggleCommandDescription=启用或禁用当前所有的快捷命令工具。 +powertoolCommandUsage5Description=为手持的物品绑定指令 +powertooltoggleCommandDescription=启用(或禁用)当前所有的快捷命令工具。 powertooltoggleCommandUsage=/<command> ptimeCommandDescription=更改玩家的客户端时间。添加@前缀可以固定时间。 ptimeCommandUsage=/<command> [list|reset|day|night|dawn|17\:30|4pm|4000ticks] [玩家|*] +ptimeCommandUsage1=/<command> list [玩家|*] +ptimeCommandUsage1Description=列出你(或指定玩家)的个人时间 +ptimeCommandUsage2=/<command> <time> [玩家|*] +ptimeCommandUsage2Description=设置你(或其他玩家)的个人时间 +ptimeCommandUsage3=/<command> reset [玩家|*] +ptimeCommandUsage3Description=重置你(或指定玩家)的个人时间 pweatherCommandDescription=更改一个玩家的客户端天气。 pweatherCommandUsage=/<command> [list|reset|storm|sun|clear] [玩家|*] +pweatherCommandUsage1=/<command> list [玩家|*] +pweatherCommandUsage1Description=列出你(或指定玩家)的个人天气 +pweatherCommandUsage2=/<command> <storm|sun> [玩家|*] +pweatherCommandUsage2Description=设置你(或其他玩家)的个人天气 +pweatherCommandUsage3=/<command> reset [玩家|*] +pweatherCommandUsage3Description=重置你(或指定玩家)的个人天气 pTimeCurrent=§c{0}§6的客户端时间是§c{1}§6。 pTimeCurrentFixed=§c{0}§6的客户端时间被固定在§c{1}§6。 pTimeNormal=§c{0}§6的客户端时间是与服务器同步的。 @@ -872,17 +907,21 @@ questionFormat=§2[提问]§r {0} rCommandDescription=快速回复回复你的最后一位玩家。 rCommandUsage=/<command> <消息> rCommandUsage1=/<command> <消息> +rCommandUsage1Description=回复消息给上一位玩家 radiusTooBig=§4半径太大了!最大半径为§c{0}§4。 readNextPage=§6输入§c/{0} {1}§6来阅读下一页。 realName=§f{0}§r§6是§f{1} realnameCommandDescription=显示玩家真实用户名。 realnameCommandUsage=/<command> <昵称> realnameCommandUsage1=/<command> <昵称> +realnameCommandUsage1Description=显示玩家真实的用户名 recentlyForeverAlone=§4{0}最近离线。 recipe=§c{0}§6的合成方法(§c{1}§6|§c{2}§6) recipeBadIndex=这个编号没有匹配的合成方法。 recipeCommandDescription=显示物品合成方法。 recipeCommandUsage=/<command> <物品> [数量] +recipeCommandUsage1=/<command> <物品> [页码] +recipeCommandUsage1Description=展示如何合成指定物品 recipeFurnace=§6冶炼:§c{0}§6. recipeGrid=§c{0}X §6| §{1}X §6| §{2}X recipeGridItem=§c{0}X§6是§c{1} @@ -893,12 +932,19 @@ recipeShapeless=§6组合§c{0} recipeWhere=§6哪:{0} removeCommandDescription=移除世界中的实体。 removeCommandUsage=/<command> <all|tamed|named|drops|arrows|boats|minecarts|xp|paintings|itemframes|endercrystals|monsters|animals|ambient|mobs|[生物类型]> [半径|世界] +removeCommandUsage1=/<command> <生物类型> [世界] +removeCommandUsage1Description=移除目前(或指定)世界所有指定类型的生物 +removeCommandUsage2=/<command> <生物类型> <范围> [世界] +removeCommandUsage2Description=移除目前(或指定)世界所有给定范围内指定类型的生物 removed=§6移除了§c{0}§6个实体。 repair=§6你成功地修复了§c{0}§6。 repairAlreadyFixed=§4该物品无需修复。 -repairCommandDescription=修复一个或所有物品的耐久值。 +repairCommandDescription=修复一个(或所有)物品的耐久值。 repairCommandUsage=/<command> [hand|all] repairCommandUsage1=/<command> +repairCommandUsage1Description=修复手持的物品 +repairCommandUsage2=/<command> all +repairCommandUsage2Description=修复你物品栏中的所有物品 repairEnchanted=§4你无权修复附魔物品。 repairInvalidType=§4该物品无法修复。 repairNone=§4没有需要修理的物品。 @@ -918,12 +964,13 @@ requestTimedOut=§4传送请求已超时。 resetBal=§6所有在线玩家的金钱已被重置为§c{0}§6。 resetBalAll=§6所有玩家的金钱已被重置为§c{0}§6。 rest=§6你休息好了。 -restCommandDescription=让自己或你选定的玩家休息。 +restCommandDescription=让自己(或你选定的玩家)休息。 restCommandUsage=/<command> [玩家] restCommandUsage1=/<command> [玩家] +restCommandUsage1Description=重置你(或指定玩家)距离上次睡觉的时间 restOther=§c{0}§6休息中。 returnPlayerToJailError=§4将§c{0}§4关回监狱§c{1}§4时发生错误! -rtoggleCommandDescription=更改回复接收者为最后的接收者或发送者。 +rtoggleCommandDescription=更改回复接收者为最后的接收者(或发送者)。 rtoggleCommandUsage=/<command> [玩家] [on|off] rulesCommandDescription=查看服务器的规则。 rulesCommandUsage=/<command> [章节] [页数] @@ -934,10 +981,20 @@ seenAccounts=§6这位玩家也叫:§c{0} seenCommandDescription=显示一位玩家最后一次登出的时间。 seenCommandUsage=/<command> <玩家> seenCommandUsage1=/<command> <玩家> +seenCommandUsage1Description=显示指定玩家的登出时间、封禁、禁言和UUID详细信息 seenOffline=§c{0}§6于§c{1}§4离线§6。 seenOnline=§c{0}§6于§c{1}§a后在线§6。 sellBulkPermission=§6你没有批量出售物品的权限。 sellCommandDescription=卖出手中的物品。 +sellCommandUsage=/<command> <<物品名>|<id>|hand|inventory|blocks> [数量] +sellCommandUsage1=/<command> <物品名> [数量] +sellCommandUsage1Description=出售所有(或指定数量的)于你物品栏中的指定物品 +sellCommandUsage2=/<command> hand [数量] +sellCommandUsage2Description=出售所有(或指定数量的)你目前手持的物品 +sellCommandUsage3=/<command> all +sellCommandUsage3Description=出售所有你物品栏中有价值的东西 +sellCommandUsage4=/<command> blocks [数量] +sellCommandUsage4Description=出售所有(或指定数量的)于你物品栏中的指定方块 sellHandPermission=§6你没有出售手上物品的权限。 serverFull=服务器已满! serverReloading=这可以让你的服务器立即重载。但你为什么要这样做呢?请不要指望EssentialsX团队会提供使用/reload命令后发生问题的任何支持。 @@ -945,28 +1002,42 @@ serverTotal=§6服务器总和:{0} serverUnsupported=你正在使用一个不支持的服务器版本! serverUnsupportedClass=状态决定类: {0} serverUnsupportedCleanroom=你正在运行一个不依赖Mojang内部代码的Bukkit服务器。请考虑为你的服务器使用其它能够替代Essentials的插件。 -serverUnsupportedDangerous=你正在运行一个已知极其危险且会导致数据丢失的服务器分支。强烈建议你更换如Paper或Tuinity之类的更稳定且更高性能的服务端。 +serverUnsupportedDangerous=你正在运行一个已知极其危险且会导致数据丢失的服务器分支。强烈建议你更换如Paper(或Tuinity)之类的更稳定且更高性能的服务端。 serverUnsupportedLimitedApi=你正在运行一个API功能受限的服务器。尽管如此,EssentialsX仍然会启动。某些功能可能会因此被禁用。 -serverUnsupportedMods=你正在运行的服务器无法正常支持Bukkit插件。Bukkit插件不应与Forge/Fabric mod一起使用!Forge建议使用ForgeEssentials或SpongeForge + Nucleus代替本插件。 +serverUnsupportedMods=你正在运行的服务器无法正常支持Bukkit插件。Bukkit插件不应与Forge/Fabric mod一起使用!Forge建议使用ForgeEssentials(或SpongeForge + Nucleus)代替本插件。 setBal=§a你的余额已被设置为{0}。 setBalOthers=§a你设置了{0}的余额为{1}。 setSpawner=§6已修改刷怪笼类别为§c{0}§6。 sethomeCommandDescription=在当前位置设置家。 sethomeCommandUsage=/<command> [[玩家\:]名字] sethomeCommandUsage1=/<command> <名字> +sethomeCommandUsage1Description=在你目前的位置设立一个指定名字的家 sethomeCommandUsage2=/<command> <玩家>\:<名字> +sethomeCommandUsage2Description=为指定玩家设立一个指定名字且位置处于你目前所在位置的家 setjailCommandDescription=创建一个你指名为 [jailname] 的监狱。 setjailCommandUsage=/<command> <监狱名> setjailCommandUsage1=/<command> <监狱名> +setjailCommandUsage1Description=在你目前的位置设立一个指定名字的监狱 settprCommandDescription=设置随机传送位置和参数。 settprCommandUsage=/<command> [center|minrange|maxrange] [值] +settprCommandUsage1=/<command> center +settprCommandUsage1Description=将你的位置设立为随机传送的中心 +settprCommandUsage2=/<command> minrange <半径> +settprCommandUsage2Description=设置随机传送半径最小值 +settprCommandUsage3=/<command> maxrange <半径> +settprCommandUsage3Description=设置随机传送半径最大值 settpr=§6设置随机传送中心。 settprValue=§6设置随机传送§c{0}§6到§c{1}§6。 setwarpCommandDescription=创建新的传送点。 setwarpCommandUsage=/<command> <传送点> setwarpCommandUsage1=/<command> <传送点> +setwarpCommandUsage1Description=在你目前的位置设立一个指定名字的传送点 setworthCommandDescription=设置一件物品的出售价值。 setworthCommandUsage=/<command> [物品名|id] <价值> +setworthCommandUsage1=/<command> <价格> +setworthCommandUsage1Description=为你手持的物品设置价格 +setworthCommandUsage2=/<command> <物品名> <价格> +setworthCommandUsage2Description=为指定物品设置价格 sheepMalformedColor=§4格式不正确的颜色。 shoutDisabled=§6呼喊模式§c已禁用§6。 shoutDisabledFor=§6已为§c{0}禁用§6呼喊模式。 @@ -978,6 +1049,7 @@ editsignCommandClearLine=§6已清除第§c{0}§6行。 showkitCommandDescription=显示物品包的内容。 showkitCommandUsage=/<command> <物品包名> showkitCommandUsage1=/<command> <物品包名> +showkitCommandUsage1Description=显示指定物品包中的内容 editsignCommandDescription=修改告示牌内容。 editsignCommandLimit=§4你提供的文本太长,无法写在目标告示牌上。 editsignCommandNoLine=§4你必须输入§c1-4§4之间的一个数字。 @@ -988,6 +1060,14 @@ editsignCopyLine=§6成功复制了告示牌的第§c{0}§6行文本!你现在 editsignPaste=§6告示牌已粘贴! editsignPasteLine=§6已粘贴告示牌的第§c{0}§6行文本! editsignCommandUsage=/<command> <set/clear/copy/paste> [行数] [文字] +editsignCommandUsage1=/<command> set <行数> <文本> +editsignCommandUsage1Description=设置目标告示牌的指定行为给定的文本 +editsignCommandUsage2=/<command> clear <行数> +editsignCommandUsage2Description=清空目标告示牌的指定行 +editsignCommandUsage3=/<command> copy [行数] +editsignCommandUsage3Description=复制目标告示牌的所有(或指定行)的文本到剪切板 +editsignCommandUsage4=/<command> paste [行数] +editsignCommandUsage4Description=从剪切板粘贴文本到目标告示牌全部(或指定行)的位置 signFormatFail=§4[{0}] signFormatSuccess=§1[{0}] signFormatTemplate=[{0}] @@ -1000,32 +1080,46 @@ skullChanged=§6头颅变更为§c{0}§6。 skullCommandDescription=设置玩家头颅的所有者。 skullCommandUsage=/<command> [所有者] skullCommandUsage1=/<command> +skullCommandUsage1Description=获取你的头颅 skullCommandUsage2=/<command> <玩家> +skullCommandUsage2Description=获取指定玩家的头颅 slimeMalformedSize=§4不正确的大小。 smithingtableCommandDescription=打开一个锻造台。 smithingtableCommandUsage=/<command> -socialSpy=§6已为§c{0}{1}§6聊天监视。 +socialSpy=§6已为§c{0}{1}§6聊天监听。 socialSpyMsgFormat=§6[§c{0}§7 -> §c{1}§6] §7{2} socialSpyMutedPrefix=§f[§6SS§f] §7(已禁言)§r -socialspyCommandDescription=切换是否可以在聊天中看到别人使用msg/mail命令。 +socialspyCommandDescription=切换是否可以在聊天中看到别人使用msg(或mail)命令。 socialspyCommandUsage=/<command> [玩家] [on|off] socialspyCommandUsage1=/<command> [玩家] +socialspyCommandUsage1Description=切换你(或指定玩家)的聊天监听模式 socialSpyPrefix=§f[§6SS§f] §r soloMob=§4该生物喜欢独居。 spawned=已生成 spawnerCommandDescription=更改刷怪笼里的生物类型。 spawnerCommandUsage=/<command> <生物> [延迟] spawnerCommandUsage1=/<command> <生物> [延迟] +spawnerCommandUsage1Description=更改你看着的刷怪笼里的生物类型(并可自定义刷怪延迟) spawnmobCommandDescription=生成一个生物。 spawnmobCommandUsage=/<command> <生物>[\:data][,<数量>[\:data]] [数量] [玩家] +spawnmobCommandUsage1=/<command> <生物>[\:数据] [数量] [玩家] +spawnmobCommandUsage1Description=在你(或指定玩家)的位置生成一个(或给定数量的)指定生物 +spawnmobCommandUsage2=/<command> <生物>[\:数据],<骑乘生物>[\:数据] [数量] [玩家] +spawnmobCommandUsage2Description=在你(或指定玩家)的位置生成一个(或给定数量的)骑着另一个指定生物的指定生物 spawnSet=§6已为§c{0}§6组设置出生点。 spectator=旁观模式 speedCommandDescription=更改你的速度限制。 speedCommandUsage=/<command> [类型] <速度> [玩家] +speedCommandUsage1=/<command> <速度> +speedCommandUsage1Description=设置你的飞行(或步行)的速度 +speedCommandUsage2=/<command> <类型> <速度> [玩家] +speedCommandUsage2Description=设置你(或指定玩家)的指定类型的速度 stonecutterCommandDescription=打开一个切石机。 stonecutterCommandUsage=/<command> sudoCommandDescription=让另一位玩家执行一条命令。 sudoCommandUsage=/<command> <玩家> <命令 [args]> +sudoCommandUsage1=/<command> <玩家> <命令> [参数] +sudoCommandUsage1Description=让指定玩家执行给定命令 sudoExempt=§4你无法使§c{0}执行命令。 sudoRun=§6强制§c{0}§6执行命令:§r/{1} suicideCommandDescription=自杀。 @@ -1061,21 +1155,33 @@ teleportToPlayer=§6正在传送至§c{0}§6。 teleportOffline=§6玩家§c{0}§6已离线。你可以使用/otp命令来传送到他的位置。 tempbanExempt=§4你无法临时封禁该玩家。 tempbanExemptOffline=§4你无法临时封禁已离线玩家。 -tempbanJoin=你已被此服务器临时封禁{0}。原因:{1} +tempbanJoin=你已被此服务器临时封禁{0}。理由:{1} tempBanned=§c你被§r{0}临时封禁了\n§r{2} tempbanCommandDescription=临时封禁一名用户。 -tempbanCommandUsage1=/<command> <玩家> <时长> [原因] +tempbanCommandUsage=/<command> <玩家> <时长> [原因] +tempbanCommandUsage1=/<command> <玩家> <时长> [理由] +tempbanCommandUsage1Description=以给定原因封禁指定玩家一段时间 tempbanipCommandDescription=临时封禁一个IP地址。 +tempbanipCommandUsage=/<command> <玩家> <时长> [原因] +tempbanipCommandUsage1=/<command> <玩家|ip地址> <时长> [原因] +tempbanipCommandUsage1Description=以给定原因封禁指定IP地址一段时间 thunder=§6你§c{0}§6了你的世界的闪电。 thunderCommandDescription=启用/禁用闪电。 thunderCommandUsage=/<command> <true/false> [时长] +thunderCommandUsage1=/<command> <true|false> [时长] +thunderCommandUsage1Description=开启(或关闭)雷电给定时间 thunderDuration=§6你§c{0}§6了你的世界的闪电§c{1}§6秒。 timeBeforeHeal=§6下次治疗时间:§c{0}。 timeBeforeTeleport=§4下次传送时间:§c{0}§4。 timeCommandDescription=显示/改变世界的时间。默认为当前世界。 timeCommandUsage=/<command> [set|add] [day|night|dawn|17\:30|4pm|4000ticks] [世界名|all] timeCommandUsage1=/<command> -timeFormat=§c{0}§6或§c{1}§6或§c{2}§6 +timeCommandUsage1Description=显示所有世界的时间 +timeCommandUsage2=/<command> set <时间> [world|all] +timeCommandUsage2Description=设置当前(或指定)世界的时间 +timeCommandUsage3=/<command> add <时间> [world|all] +timeCommandUsage3Description=快进当前(或指定)世界的时间 +timeFormat=§c{0}§6或§c{1}§6(或§c{2}§6) timeSetPermission=§4你没有设置时间的权限。 timeSetWorldPermission=§4你无权设置“{0}”世界的时间。 timeWorldAdd=§c{1}§6的时间已被§c{0}§6快进。 @@ -1087,6 +1193,7 @@ togglejailCommandUsage=/<command> <玩家> <监狱> [时间] toggleshoutCommandDescription=切换是否在呼喊模式下聊天 toggleshoutCommandUsage=/<command> [玩家] [on|off] toggleshoutCommandUsage1=/<command> [玩家] +toggleshoutCommandUsage1Description=切换你(或指定玩家)的喊话模式 topCommandDescription=传送至你当前位置的最高点。 topCommandUsage=/<command> totalSellableAll=§a所有可卖出的物品和方块的总价值为§c{1}§a。 @@ -1096,60 +1203,82 @@ totalWorthBlocks=§a出售所有方块,总价值{1}§a。 tpCommandDescription=传送至一名玩家。 tpCommandUsage=/<command> <玩家> [其他玩家] tpCommandUsage1=/<command> <玩家> +tpCommandUsage1Description=将你传送到指定玩家身边 +tpCommandUsage2=/<command> <玩家> <其他玩家> +tpCommandUsage2Description=将指定的玩家传送到另一个玩家处 tpaCommandDescription=请求传送到指定的玩家。 tpaCommandUsage=/<command> <玩家> tpaCommandUsage1=/<command> <玩家> +tpaCommandUsage1Description=请求传送到指定的玩家身边 tpaallCommandDescription=请求所有在线玩家传送到你的位置。 tpaallCommandUsage=/<command> <玩家> tpaallCommandUsage1=/<command> <玩家> +tpaallCommandUsage1Description=请求所有玩家传送到你身边 tpacancelCommandDescription=取消所有待处理的传送请求。指定[玩家]来取消他的请求。 tpacancelCommandUsage=/<command> [玩家] tpacancelCommandUsage1=/<command> +tpacancelCommandUsage1Description=取消你所有未完成的传送请求 tpacancelCommandUsage2=/<command> <玩家> +tpacancelCommandUsage2Description=取消与指定玩家所有未完成的传送请求 tpacceptCommandDescription=接受传送请求 tpacceptCommandUsage=/<command> [其他玩家] tpacceptCommandUsage1=/<command> +tpacceptCommandUsage1Description=接受传送请求 tpahereCommandDescription=请求指定玩家传送到你的位置。 tpahereCommandUsage=/<command> <玩家> tpahereCommandUsage1=/<command> <玩家> +tpahereCommandUsage1Description=请求指定玩家传送到你身边 tpallCommandDescription=将所有的玩家传送到指定玩家的位置。 tpallCommandUsage=/<command> [玩家] tpallCommandUsage1=/<command> [玩家] +tpallCommandUsage1Description=传送所有玩家到你(或指定玩家)的身边 tpautoCommandDescription=自动接受传送请求。 tpautoCommandUsage=/<command> [玩家] tpautoCommandUsage1=/<command> [玩家] +tpautoCommandUsage1Description=为你自己(或指定玩家)切换是否自动接受传送请求 tpdenyCommandDescription=拒绝一个传送请求。 tpdenyCommandUsage=/<command> tpdenyCommandUsage1=/<command> +tpdenyCommandUsage1Description=拒绝一个未处理的传送请求 tphereCommandDescription=传送玩家到你的位置。 tphereCommandUsage=/<command> <玩家> tphereCommandUsage1=/<command> <玩家> +tphereCommandUsage1Description=将指定玩家传送到你身边 tpoCommandDescription=覆盖Tptoggle的传送。 tpoCommandUsage=/<command> <玩家> [其他玩家] tpoCommandUsage1=/<command> <玩家> +tpoCommandUsage1Description=将指定玩家强制传送到你身边 +tpoCommandUsage2=/<command> <玩家> <其他玩家> +tpoCommandUsage2Description=将指定玩家强制传送到另一个玩家身边 tpofflineCommandDescription=传送到一位玩家最后的下线点。 tpofflineCommandUsage=/<command> <玩家> tpofflineCommandUsage1=/<command> <玩家> +tpofflineCommandUsage1Description=将你传送到指定玩家的下线位置 tpohereCommandDescription=覆盖Tptoggle的传送玩家至此。 tpohereCommandUsage=/<command> <玩家> tpohereCommandUsage1=/<command> <玩家> +tpohereCommandUsage1Description=将指定玩家强制传送到你身边 tpposCommandDescription=传送到位置。 tpposCommandUsage=/<command> <x> <y> <z> [偏转] [仰角] [世界] tpposCommandUsage1=/<command> <x> <y> <z> [偏转] [仰角] [世界] +tpposCommandUsage1Description=将你传送到指定的位置,并指定角度、仰角和(或)世界 tprCommandDescription=随机传送。 tprCommandUsage=/<command> tprCommandUsage1=/<command> +tprCommandUsage1Description=把你随机传送 tprSuccess=§6随机传送到一个位置…… tps=§6当前服务器TPS\={0} tptoggleCommandDescription=阻止所有形式的传送。 tptoggleCommandUsage=/<command> [玩家] [on|off] tptoggleCommandUsage1=/<command> [玩家] +tptoggleCommandUsageDescription=为你自己(或指定玩家)切换是否开启传送 tradeSignEmpty=§4交易牌上没有你可获得的东西。 tradeSignEmptyOwner=§4交易牌上没有你可收集的东西。 treeCommandDescription=在你看着的地方生成一棵树。 treeCommandUsage=/<command> <tree|birch|redwood|redmushroom|brownmushroom|jungle|junglebush|swamp> treeCommandUsage1=/<command> <tree|birch|redwood|redmushroom|brownmushroom|jungle|junglebush|swamp> -treeFailure=§4无法生成树。请在泥土或者草方块上面再试一次。 +treeCommandUsage1Description=在你看着的位置生成一颗指定类型的树 +treeFailure=§4无法生成树。请在泥土(或草方块)上面再试一次。 treeSpawned=§6成功生成了树。 true=§a是§r typeTpacancel=§6若要取消这个请求,请输入§c/tpacancel§6。 @@ -1161,15 +1290,23 @@ unableToSpawnMob=§4生成生物失败。 unbanCommandDescription=解封指定的玩家。 unbanCommandUsage=/<command> <玩家> unbanCommandUsage1=/<command> <玩家> +unbanCommandUsage1Description=解封指定的玩家 unbanipCommandDescription=解封指定的IP地址。 unbanipCommandUsage=/<command> <地址> unbanipCommandUsage1=/<command> <地址> +unbanipCommandUsage1Description=解封指定的IP地址 unignorePlayer=§6你已不再屏蔽{0}。 unknownItemId=§4未知的物品ID:§r{0}§4。 unknownItemInList=§4未知的{1}列表中的物品{0}。 unknownItemName=§4未知的物品名称:{0}。 unlimitedCommandDescription=允许无限放置物品。 unlimitedCommandUsage=/<command> <list|item|clear> [玩家] +unlimitedCommandUsage1=/<command> list [玩家] +unlimitedCommandUsage1Description=显示你(或其他玩家)的设为无限的物品列表 +unlimitedCommandUsage2=/<command> <物品> [玩家] +unlimitedCommandUsage2Description=为你自己(或指定玩家)切换可使用设为无限的物品的能力 +unlimitedCommandUsage3=/<command> clear [玩家] +unlimitedCommandUsage3Description=清除你(或其他玩家)的所有设为无限的物品 unlimitedItemPermission=§4你没有权限来使用无限§c{0}§4。 unlimitedItems=§6无限物品:§r unmutedPlayer=§6玩家§c{0}§6被解除禁言。 @@ -1198,6 +1335,7 @@ vanish=§6已设置{0}§6的隐身模式为:{1} vanishCommandDescription=在其他玩家的视角中隐藏自己。 vanishCommandUsage=/<command> [玩家] [on|off] vanishCommandUsage1=/<command> [玩家] +vanishCommandUsage1Description=为你自己(或指定玩家)切换隐身模式 vanished=§6你已进入隐身模式,其他普通玩家将无法看到你,且隐藏游戏输入指令提示。 versionCheckDisabled=§6更新检查已于配置文件中禁用。 versionCustom=§6无法检查你当前的版本!自己构建的?构建信息:§c{0}§6。 @@ -1221,17 +1359,21 @@ versionReleaseNew=§4已有新的EssentialsX版本可供下载:§c{0}§4。 versionReleaseNewLink=§4在此处下载:§c{0} voiceSilenced=§6你已被禁言! voiceSilencedTime=§6你已被{0}禁言! -voiceSilencedReason=§6你已被禁言!原因:§c{0} -voiceSilencedReasonTime=§6你已被{0}禁言!原因:§c{1} +voiceSilencedReason=§6你已被禁言!理由:§c{0} +voiceSilencedReasonTime=§6你已被{0}禁言!理由:§c{1} walking=行走中 -warpCommandDescription=列出所有的传送点或传送到指定的位置。 +warpCommandDescription=列出所有的传送点(或传送到指定的位置)。 warpCommandUsage=/<command> <pagenumber|warp> [玩家] warpCommandUsage1=/<command> [页码] +warpCommandUsage1Description=列出所有(或指定页码)的传送点 +warpCommandUsage2=/<command> <传送点> [玩家] +warpCommandUsage2Description=将你(或指定玩家)传送到给定的传送点 warpDeleteError=§4删除传送点文件时发生错误。 warpInfo=§6传送点§c{0}§6的信息: warpinfoCommandDescription=查询指定传送点的位置信息。 warpinfoCommandUsage=/<command> <传送点> warpinfoCommandUsage1=/<command> <传送点> +warpinfoCommandUsage1Description=提供指定传送点的信息 warpingTo=§6传送到§c{0}§6。 warpList={0} warpListPermission=§4你没有列出传送点的权限。 @@ -1241,6 +1383,8 @@ warps=§6传送点:§r{0} warpsCount=§6这里有§c{0}§6个传送点。展示第§c{1}§6页,总共§c{2}§6页。 weatherCommandDescription=设置天气。 weatherCommandUsage=/<command> <storm/sun> [时长] +weatherCommandUsage1=/<command> <storm|sun> [时长] +weatherCommandUsage1Description=设置天气状态并指定持续时间 warpSet=§6传送点§c{0}§6设置。 warpUsePermission=§4你没有使用该传送点的权限。 weatherInvalidWorld=无法找到{0}世界! @@ -1257,6 +1401,7 @@ whoisBanned=§6 - 已被封禁:§r{0} whoisCommandDescription=确认昵称下的用户名。 whoisCommandUsage=/<command> <昵称> whoisCommandUsage1=/<command> <玩家> +whoisCommandUsage1Description=查询指定玩家的基本信息 whoisExp=§6 - 经验:§r{0}(等级{1}) whoisFly=§6 - 飞行模式:§r{0}({1}) whoisSpeed=§6 - 速度:§r{0} @@ -1282,9 +1427,20 @@ workbenchCommandUsage=/<command> worldCommandDescription=切换世界。 worldCommandUsage=/<command> [世界] worldCommandUsage1=/<command> +worldCommandUsage1Description=传送你到下界(或主世界)的对应位置 +worldCommandUsage2=/<command> <世界> +worldCommandUsage2Description=传送你到指定世界的对应位置 worth=§6一组{0}价值§4{1}§6({2}单位物品,每个价值{3}) -worthCommandDescription=计算手中或指定物品的价值。 +worthCommandDescription=计算手中(或指定物品)的价值。 worthCommandUsage=/<command> <<itemname>|<id>|hand|inventory|blocks> [-][数量] +worthCommandUsage1=/<command> <物品名> [数量] +worthCommandUsage1Description=检查所有(或指定数量的)于你物品栏中的指定物品的价值 +worthCommandUsage2=/<command> hand [数量] +worthCommandUsage2Description=检查所有(或指定数量的)于你手中所持的指定物品的价值 +worthCommandUsage3=/<command> all +worthCommandUsage3Description=检查所有于你物品栏中有价值的物品 +worthCommandUsage4=/<command> blocks [数量] +worthCommandUsage4Description=检查所有(或指定数量的)于你物品栏中的指定方块的价值 worthMeta=§a一组元数据为{1}的{0}价值§c{2}§6({3}单位物品,每个价值{4}) worthSet=§6价格已设置 year=年 diff --git a/Essentials/src/main/resources/messages_zh_TW.properties b/Essentials/src/main/resources/messages_zh_TW.properties index 35b2d7539e1..d39a8ece357 100644 --- a/Essentials/src/main/resources/messages_zh_TW.properties +++ b/Essentials/src/main/resources/messages_zh_TW.properties @@ -4,7 +4,7 @@ # by: action=§5* {0} §5{1} addedToAccount=§a已將 {0} 新增至你的帳戶。 -addedToOthersAccount=§a已將 {0} 新增至 {1} §a的帳戶。目前金錢餘額 : {2}。 +addedToOthersAccount=§a已將 {0} 新增至 {1} §a的帳戶。目前金錢餘額 : {2} adventure=冒險模式 afkCommandDescription=將你標記為暫時離開。 afkCommandUsage=/<command> [player/message...] @@ -13,39 +13,39 @@ afkCommandUsage1Description=切換你的暫時離開狀態並附加自訂原因 afkCommandUsage2=/<command> <player> [message] afkCommandUsage2Description=切換指定玩家暫時離開狀態並附加自訂原因 alertBroke=破壞 : -alertFormat=§3[{0}] §r {1} §6 {2} 於 : {3}。 +alertFormat=§3[{0}] §r {1} §6 {2} 於 : {3} alertPlaced=放置 : alertUsed=使用 : alphaNames=§4玩家名稱只能由字母、數字、底線組成。 antiBuildBreak=§4你沒有破壞§c {0} §4的權限。 antiBuildCraft=§4你沒有合成§c {0}§4 的權限。 antiBuildDrop=§4你沒有丟棄§c {0}§4 的權限。 -antiBuildInteract=§4你沒有交互§c {0}§4 的權限。 +antiBuildInteract=§4你沒有與§c {0}§4 互動的權限。 antiBuildPlace=§4你沒有放置§c {0} §4的權限。 antiBuildUse=§4你沒有使用§c {0}§4 的權限。 -antiochCommandDescription=給管理員一些驚喜。 +antiochCommandDescription=給操作員一點驚喜。 antiochCommandUsage=/<command> [message] anvilCommandDescription=開啟鐵砧。 anvilCommandUsage=/<command> -autoAfkKickReason=鑑於你在 {0} 分鐘後仍未操作遊戲,伺服器已經把你踢出。 -autoTeleportDisabled=§6你不再自動接受傳送請求。 -autoTeleportDisabledFor=§c{0}§6 不再自動接受傳送請求。 -autoTeleportEnabled=§6你現在開始自動接受傳送請求。 +autoAfkKickReason=鑑於你在 {0} 分鐘後仍未操作遊戲,伺服器已經把你踢出 +autoTeleportDisabled=§6不會繼續自動接受傳送請求。 +autoTeleportDisabledFor=§c{0}§6 不會繼續自動接受傳送請求。 +autoTeleportEnabled=§6開始自動接受傳送請求。 autoTeleportEnabledFor=§c{0}§6 開始自動接受傳送請求。 backAfterDeath=§6使用§c /back§6 返回死亡位置。 -backCommandDescription=在 tp/spawn/warp 傳送前將你返回到原本的位置。 +backCommandDescription=在 tp/spawn/warp 傳送前將你傳回原先位置。 backCommandUsage=/<command> [player] backCommandUsage1=/<command> -backCommandUsage1Description=傳送你回之前的位置 +backCommandUsage1Description=傳回先前位置 backCommandUsage2=/<command> <player> -backCommandUsage2Description=將指定玩家返回先前位置 -backOther=§6已將§c {0}§6 返回上一個位置。 +backCommandUsage2Description=將指定玩家傳回先前位置 +backOther=§6已將§c {0}§6 傳回上個位置。 backupCommandDescription=如果已設定則執行備份。 backupCommandUsage=/<command> backupDisabled=§4尚未設定外部備份腳本。 backupFinished=§6備份完成。 backupStarted=§6開始備份。 -backupInProgress=§6正在執行外部備份腳本 ! 備份結束前,插件皆會停留在關閉狀態。 +backupInProgress=§6正在執行外部備份腳本 ! 備份結束前,插件將會停留在關閉狀態。 backUsageMsg=§6返回上一個位置。 balance=§a金錢 : §c{0} balanceCommandDescription=玩家目前的金錢。 @@ -54,8 +54,8 @@ balanceCommandUsage1=/<command> balanceCommandUsage1Description=顯示你目前的金錢餘額 balanceCommandUsage2=/<command> <player> balanceCommandUsage2Description=顯示指定玩家目前的金錢餘額 -balanceOther=§a{0}§a 的金錢 : §c{1}。 -balanceTop=§6金錢排行 : ( {0} ) 。 +balanceOther=§a{0}§a 的金錢 : §c{1} +balanceTop=§6金錢排行 : ({0}) balanceTopLine={0}. {1}, {2} balancetopCommandDescription=獲取金錢排行。 balancetopCommandUsage=/<command> [page] @@ -75,22 +75,22 @@ banipCommandUsage=/<command> <address> [reason] banipCommandUsage1=/<command> <address> [reason] banipCommandUsage1Description=封禁指定 IP 位址並附加自訂原因 bed=§o床§r -bedMissing=§4你的床已丟失或阻擋。 +bedMissing=§4你的床尚未設置、丟失或被阻擋。 bedNull=§m床§r bedOffline=§4無法傳送到離線玩家的床。 bedSet=§6已設定重生點 ! beezookaCommandDescription=向你的敵人投擲一隻爆炸蜜蜂。 beezookaCommandUsage=/<command> -bigTreeFailure=§4生成大樹失敗,請在草地或泥土重試一次。 +bigTreeFailure=§4無法生成大樹,請在草地或泥土重試一次。 bigTreeSuccess=§6已生成大樹。 bigtreeCommandDescription=在你的前方生成一棵大樹。 bigtreeCommandUsage=/<command> <tree|redwood|jungle|darkoak> bigtreeCommandUsage1=/<command> <tree|redwood|jungle|darkoak> bigtreeCommandUsage1Description=生成指定類型的大樹 -blockList=§6EssentialsX 將以下指令傳遞給其他插件 : -blockListEmpty=§6EssentialsX 不會將任何指令傳遞給其他插件。 +blockList=§6EssentialsX 會將以下指令傳遞給其它插件 : +blockListEmpty=§6EssentialsX 不會將任何指令傳遞給其它插件。 bookAuthorSet=§6這本書的作者已被設定為 {0}。 -bookCommandDescription=允許重新開啟及編輯已署名的書。 +bookCommandDescription=允許重新打開及編輯封存的書。 bookCommandUsage=/<command> [title|author [name]] bookCommandUsage1=/<command> bookCommandUsage1Description=鎖定或解鎖一本 書和羽毛筆 或 已署名的書 。 @@ -115,7 +115,7 @@ burnCommandDescription=使玩家著火。 burnCommandUsage=/<command> <player> <seconds> burnCommandUsage1=/<command> <player> <seconds> burnCommandUsage1Description=使指定玩家持續著火至指定秒數 -burnMsg=§6你會讓 §c{0}§6 燃燒 §c{1} 秒§6。 +burnMsg=§6你將使 §c{0}§6 燃燒 §c{1} 秒§6。 cannotSellNamedItem=§6你沒有出售命名物品的權限。 cannotSellTheseNamedItems=§6你沒有出售命名物品 §4{0} §6的權限。 cannotStackMob=§4你沒有堆疊多個生物的權限。 @@ -129,7 +129,7 @@ cartographytableCommandUsage=/<command> chatTypeLocal=[L] chatTypeSpy=[監聽] cleaned=已清除玩家資料。 -cleaning=正在清除玩家資料...... +cleaning=正在清除玩家資料…… clearInventoryConfirmToggleOff=§6你已關閉清空物品欄提示。 clearInventoryConfirmToggleOn=§6你已開啟清空物品欄提示。 clearinventoryCommandDescription=清除物品欄中的所有物品。 @@ -144,17 +144,17 @@ clearinventoryconfirmtoggleCommandDescription=切換是否提示確定清空物 clearinventoryconfirmtoggleCommandUsage=/<command> commandArgumentOptional=§7 commandArgumentRequired=§e -commandCooldown=§c你在 {0} 秒內不能輸入該指令。 +commandCooldown=§c請在 {0} 後重新輸入指令。 commandDisabled=§c已關閉 §6 {0}§c 指令。 -commandFailed=指令 {0} 執行失敗 : -commandHelpFailedForPlugin=無法取得該插件的說明 : {0}。 +commandFailed=無法執行指令 {0} : +commandHelpFailedForPlugin=無法取得該插件的說明 : {0} commandHelpLine1=§6指令說明 : §f/{0} commandHelpLine2=§6描述 : §f{0} commandHelpLine3=§6用法 : commandHelpLine4=§6別稱 : §f{0} commandHelpLineUsage={0} §6- {1} -commandNotLoaded=§4{0} 指令載入失敗。 -compassBearing=§6方位 : {0} ( {1} 度 ) +commandNotLoaded=§4無法載入指令 {0}。 +compassBearing=§6方位 : {0} ({1} 度) compassCommandDescription=描述你目前的方位。 compassCommandUsage=/<command> condenseCommandDescription=將物品合成為更緊實的方塊。 @@ -164,15 +164,15 @@ condenseCommandUsage1Description=將所有物品合成為更緊實的物品 condenseCommandUsage2=/<command> <item> condenseCommandUsage2Description=將指定物品合成為更緊實的物品 configFileMoveError=無法將 config.yml 檔案移至備份位置。 -configFileRenameError=無法將暫存檔重新命名為 config.yml。 +configFileRenameError=無法將暫存檔案重新命名為 config.yml。 confirmClear=§7若 §l確認§7 清空物品欄,請再次輸入指令 : §6{0} -confirmPayment=§7若 §l確認§7 支付 §6{0}§7,請再次輸入指令 : §6{1}。 +confirmPayment=§7若 §l確認§7 支付 §6{0}§7,請再次輸入指令 : §6{1} connectedPlayers=§6目前線上玩家§r -connectionFailed=連接失敗。 +connectionFailed=無法連接。 consoleName=控制台 -cooldownWithMessage=§4冷卻時間 : {0} 秒。 +cooldownWithMessage=§4冷卻時間 : {0} coordsKeyword={0}, {1}, {2} -couldNotFindTemplate=§4找不到 {0} 模版。 +couldNotFindTemplate=§4找不到模版 {0} createdKit=§6已建立工具包 §c{0}§6,且 §c{1}§6 使用次數為 §c{2} 次。 createkitCommandDescription=建立工具包 ! createkitCommandUsage=/<command> <kitname> <delay> @@ -181,22 +181,27 @@ createkitCommandUsage1Description=建立具有指定名稱和延遲的工具包 createKitFailed=§4建立 {0} 工具包時發生錯誤。 createKitSeparator=§m----------------------- createKitSuccess=§6建立的工具包 : §f{0}\n§6冷卻 : §f{1}\n§6連結 : §f{2}\n§6請將連結中的內容複製到 kits.yml。 +createKitUnsupported=§4已開啟 NBT 物品序列化,但此伺服器不是運行 Paper 1.15.2+,所以回到標準物品序列化。 creatingConfigFromTemplate=從模版 {0} 建立配置。 creatingEmptyConfig=建立空白配置 : {0} creative=創造模式 currency={0}{1} -currentWorld=§6目前世界 : §c{0}。 +currentWorld=§6目前世界 : §c{0} customtextCommandDescription=允許建立自訂文字指令。 customtextCommandUsage=/<alias> - 定義 bukkit.yml day=天 days=天 defaultBanReason=你的帳號已被該伺服器封禁 ! +deletedHomes=已刪除所有家。 +deletedHomesWorld=已刪除世界 {0} 的所有家。 deleteFileError=無法刪除檔案 : {0} deleteHome=§6家§c {0} §6已被移除。 -deleteJail=§6監獄§c {0} §6已被移除。 +deleteJail=§6已移除§c {0} §6監獄 。 deleteKit=§6已移除§c {0} §6工具包 。 -deleteWarp=§6已移除§c {0} §6的地標。 -delhomeCommandDescription=移除一個家。 +deleteWarp=§6已移除§c {0} §6地標。 +deletingHomes=正在刪除所有家…… +deletingHomesWorld=正在刪除世界 {0} 的所有家…… +delhomeCommandDescription=移除家。 delhomeCommandUsage=/<command> [player\:]<name> delhomeCommandUsage1=/<command> <name> delhomeCommandUsage1Description=刪除指定名稱的家 @@ -206,11 +211,11 @@ deljailCommandDescription=移除一所監獄。 deljailCommandUsage=/<command> <jailname> deljailCommandUsage1=/<command> <jailname> deljailCommandUsage1Description=刪除指定名稱的監獄 -delkitCommandDescription=刪除指定工具包。 +delkitCommandDescription=刪除指定的工具包。 delkitCommandUsage=/<command> <kit> delkitCommandUsage1=/<command> <kit> delkitCommandUsage1Description=刪除指定名稱的工具包 -delwarpCommandDescription=刪除指定地標。 +delwarpCommandDescription=刪除指定的地標。 delwarpCommandUsage=/<command> <warp> delwarpCommandUsage1=/<command> <warp> delwarpCommandUsage1Description=刪除指定名稱的地標 @@ -226,14 +231,14 @@ depthCommandUsage=/depth destinationNotSet=未設定目的地 ! disabled=關閉 disabledToSpawnMob=§4已在配置檔案中禁止該生物的生成。 -disableUnlimited=§6已關閉§c {1} §6無限放置§c {0} §6的能力。 +disableUnlimited=§c已關閉 {1} §6無限放置§c {0} §6的能力。 disposal=垃圾桶 disposalCommandDescription=開啟簡易垃圾桶選單。 disposalCommandUsage=/<command> -distance=§6距離 : {0}。 -dontMoveMessage=§6傳送將在 §c{0} 秒 §6後開始。不要移動。 -downloadingGeoIp=下載 GeoIP 資料庫中...... 這可能會花點時間。 -duplicatedUserdata=已經複製玩家數據 : {0} 和 {1}。 +distance=§6距離 : {0} +dontMoveMessage=§6傳送將在 §c{0} 秒 §6後開始,不要移動。 +downloadingGeoIp=下載 GeoIP 資料庫中…… 這可能會花點時間。 +duplicatedUserdata=已經複製玩家資料 : {0} 和 {1}。 durability=§6這個工具還有 §c{0}§6 點耐久度。 east=東 ecoCommandDescription=管理伺服器經濟。 @@ -254,10 +259,10 @@ enchantCommandUsage1=/<command> <enchantment name> [level] enchantCommandUsage1Description=附魔手中的物品並設定自訂等級 enableUnlimited=§6給予 §c{1}§6 無限的 §c{0}§6。 enchantmentApplied=§6附魔 §c{0}§6 已被套用到你手中的物品。 -enchantmentNotFound=§4無此附魔選項! +enchantmentNotFound=§4無此附魔選項 ! enchantmentPerm=§4你沒有附魔§c {0} §4的權限。 enchantmentRemoved=§6附魔 §c{0}§6 已從你手中的物品移除。 -enchantments=§6附魔 : §r{0}。 +enchantments=§6附魔 : §r{0} enderchestCommandDescription=查看終界箱物品。 enderchestCommandUsage=/<command> [player] enderchestCommandUsage1=/<command> @@ -269,7 +274,7 @@ errorWithMessage=§c錯誤 : §4{0} essentialsCommandDescription=重新載入 Essentials。 essentialsCommandUsage=/<command> essentialsCommandUsage1=/<command> reload -essentialsCommandUsage1Description=重新載入 Essentials 的配置 +essentialsCommandUsage1Description=重新載入 Essentials 的配置檔案 essentialsCommandUsage2=/<command> version essentialsCommandUsage2Description=提供有關 Essentials 的版本資訊 essentialsCommandUsage3=/<command> commands @@ -277,11 +282,15 @@ essentialsCommandUsage3Description=提供有關 Essentials 正在轉移指令的 essentialsCommandUsage4=/<command> debug essentialsCommandUsage4Description=切換 Essentials 的「除錯模式」 essentialsCommandUsage5=/<command> reset <player> -essentialsCommandUsage5Description=重設指定玩家的數據 -essentialsHelp1=檔案毀損以致 Essentials 無法開啟。現已停用 Essentials。若無法自行修正,請前往 https\://essentialsx.net/wiki/Home.html 尋求協助。 -essentialsHelp2=檔案毀損以致於 Essentials 無法將其打開。Essentials 現在已關閉。如果你無法找出問題,在遊戲中輸入 /essentialshelp 或前往 https\://essentialsx.net/wiki/Home.html 尋求協助。 -essentialsReload=§6Essentials 已重新載入§c {0}。 -exp=§c{0} §6擁有§c {1} §6點經驗值 ( 等級§c {2}§6 ) 。需要§c {3} §6點經驗才能升級。 +essentialsCommandUsage5Description=重設指定玩家的資料 +essentialsCommandUsage6=/<command> cleanup +essentialsCommandUsage6Description=清除舊的玩家資料 +essentialsCommandUsage7=/<command> homes +essentialsCommandUsage7Description=管理玩家的家 +essentialsHelp1=檔案毀損以致 Essentials 無法將其開啟,現已停用 Essentials。若無法自行修正,請前往 https\://essentialsx.net/wiki/Home.html 尋求協助。 +essentialsHelp2=檔案毀損以致 Essentials 無法將其開啟,現已停用 Essentials。若無法自行修正,在遊戲中輸入 /essentialshelp 或前往 https\://essentialsx.net/wiki/Home.html 尋求協助。 +essentialsReload=§6已重新載入 Essentials§c {0}。 +exp=§c{0} §6擁有§c {1} §6點經驗值 (等級§c {2}§6) 。需要§c {3} §6點經驗才能升級。 expCommandDescription=給予、設定、重設或查看玩家的經驗值。 expCommandUsage=/<command> [reset|show|set|give] [playername [amount]] expCommandUsage1=/<command> give <player> <amount> @@ -293,30 +302,30 @@ expCommandUsage4Description=顯示指定玩家的經驗值數量 expCommandUsage5=/<command> reset <playername> expCommandUsage5Description=重設指定玩家的經驗值為 0 expSet=§c{0} §6現在有§c {1} §6點經驗值。 -extCommandDescription=熄滅玩家的火。 +extCommandDescription=熄滅玩家身上的火。 extCommandUsage=/<command> [player] extCommandUsage1=/<command> [player] -extCommandUsage1Description=撲滅你或指定玩家身上的火 +extCommandUsage1Description=熄滅你或指定玩家身上的火 extinguish=§6你熄滅了你自己身上的火。 extinguishOthers=§6你熄滅了 {0} §6身上的火。 -failedToCloseConfig=無法關閉 {0} 配置。 -failedToCreateConfig=無法建立 {0} 配置。 -failedToWriteConfig=無法寫入 {0} 配置。 +failedToCloseConfig=無法關閉配置 {0}。 +failedToCreateConfig=無法建立配置 {0}。 +failedToWriteConfig=無法寫入配置 {0}。 false=§4否§r -feed=§6已飽和,無法再進食。 +feed=§6你已經飽了。 feedCommandDescription=填飽飢餓值。 feedCommandUsage=/<command> [player] feedCommandUsage1=/<command> [player] feedCommandUsage1Description=填飽你或指定玩家的飽食度 -feedOther=§6你餵飽了 §c{0}§6。 -fileRenameError=無法重新命名 {0} 檔案 ! +feedOther=§6你填飽了 §c{0}§6。 +fileRenameError=無法重新命名檔案 {0} ! fireballCommandDescription=發射火球或各種子彈。 fireballCommandUsage=/<command> [fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident] [speed] fireballCommandUsage1=/<command> -fireballCommandUsage1Description=從你的位置投擲出火球 +fireballCommandUsage1Description=從你的位置投擲火球 fireballCommandUsage2=/<command> <fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident> [speed] -fireballCommandUsage2Description=從你的位置投擲火球並設定自訂火球速度 -fireworkColor=§4使用了無效的煙火填充參數,必須先設定一個顏色。 +fireballCommandUsage2Description=從你的位置投擲出可自訂速度的投擲物 +fireworkColor=§4使用了無效的煙火填充參數,你必須先設定一個顏色。 fireworkCommandDescription=允許修改一組煙火。 fireworkCommandUsage=/<command> <<meta param>|power [amount]|clear|fire [amount]> fireworkCommandUsage1=/<command> clear @@ -329,17 +338,19 @@ fireworkCommandUsage4=/<command> <meta> fireworkCommandUsage4Description=對手中煙火加入指定效果 fireworkEffectsCleared=§6從手中的物品中移除了所有特效。 fireworkSyntax=§6煙火參數 : §ccolor\:<顏色> [fade\:<淡出顏色>] [shape\:<形態>] [effect\:<特效>]\n§6要使用多個顏色 / 特效,使用逗號 : §cred,blue,pink\n§6形狀 : §cstar、ball、large、creeper、burst §6特效 : §c trail、twinkle。 +fixedHomes=已刪除無效的家。 +fixingHomes=正在刪除無效的家…… flyCommandDescription=起飛,翱翔 ! flyCommandUsage=/<command> [player] [on|off] flyCommandUsage1=/<command> [player] flyCommandUsage1Description=切換你或指定玩家的飛行模式 -flying=飛行中 -flyMode=§6已為§c {1}§6 的飛行模式設定為§c {0}§6。 +flying=飛行 +flyMode=§c已{0}§c {1}§6 的飛行模式。 foreverAlone=§4你沒有可回覆的玩家。 fullStack=§4你的物品已達到最大堆疊。 fullStackDefault=§6你的堆疊已被設定為預設大小 §c{0}§6。 fullStackDefaultOversize=§6你的堆疊已被設定為最大 §c{0}§6。 -gameMode=§6已為§c {1}§6 的遊戲模式設定為§c {0}§6。 +gameMode=§6已設定 §c{1}§6 的遊戲模式為§c {0}§6。 gameModeInvalid=§4你必須指定有效的玩家或遊戲模式。 gamemodeCommandDescription=更改玩家遊戲模式。 gamemodeCommandUsage=/<command> <survival|creative|adventure|spectator> [player] @@ -363,21 +374,21 @@ giveCommandUsage1Description=給予指定玩家 64 個或指定數量的物品 giveCommandUsage2=/<command> <player> <item> <amount> <meta> giveCommandUsage2Description=給予指定玩家指定數量的元數據指定物品 geoipCantFind=§6玩家 §c{0} §6來自於 §a未知的國家§6。 -geoIpErrorOnJoin=無法獲取 {0} 的 GeoIP 數據。請確保你的許可證金鑰和配置正確。 +geoIpErrorOnJoin=無法獲取 {0} 的 GeoIP 資料。請確保你的許可證金鑰和配置正確。 geoIpLicenseMissing=找不到許可證金鑰 ! 請訪問 https\://essentialsx.net/geoip 以獲得初次設定說明。 geoIpUrlEmpty=GeoIP 下載連結空白。 -geoIpUrlInvalid=GeoIP 下載連結失效。 +geoIpUrlInvalid=GeoIP 下載連結無效。 givenSkull=§6你獲得了 §c{0}§6 的頭顱。 godCommandDescription=開啟你的上帝神力。 godCommandUsage=/<command> [player] [on|off] godCommandUsage1=/<command> [player] godCommandUsage1Description=切換你或指定玩家的上帝模式 -giveSpawn=§6給予§c {2}§6 {0} 個§c {1}§6。 +giveSpawn=§6給予§c {2}§c {0} §6個§c {1}§6。 giveSpawnFailure=§4沒有足夠的空間,§c{0} §c{1} §4已遺失。 -godDisabledFor=§c{0} §6的上帝模式設定為 §c關閉 -godEnabledFor=§c{0} §6的上帝模式設定為 §c開啟 -godMode=§c{0} §6上帝模式。 -grindstoneCommandDescription=開啟一個砂輪機。 +godDisabledFor=§c已關閉 {0} §6的 +godEnabledFor=§c已開啟 {0} §6的 +godMode=§c{0}§6上帝模式。 +grindstoneCommandDescription=開啟砂輪機。 grindstoneCommandUsage=/<command> groupDoesNotExist=§4目前組別沒有人在線 ! groupNumber=§c{0}§f 位在線,想要獲取完整列表請使用 : §c /{1} {2}。 @@ -403,12 +414,12 @@ healDead=§4你不能治療一個死人 ! healOther=§6已治療§c {0}§6。 helpCommandDescription=查看可用指令列表。 helpCommandUsage=/<command> [search term] [page] -helpConsole=若要從控制台查看幫助,請輸入 "?"。 -helpFrom=§6來自於 {0} 的指令 : +helpConsole=若要從控制台查看說明,請輸入「?」。 +helpFrom=§6來自於 {0} 的指令 : helpLine=§6/{0}§r : {1} -helpMatching=§6指令符合 "§c{0}§6" : +helpMatching=§6指令符合「§c{0}§6」 : helpOp=§4[求助管理員]§r §6{0}\: §r{1} -helpPlugin=§4{0}§r : 插件幫助 : /help {1} +helpPlugin=§4{0}§r : 插件說明 : /help {1} helpopCommandDescription=向線上管理員發送訊息。 helpopCommandUsage=/<command> <message> helpopCommandUsage1=/<command> <message> @@ -423,16 +434,26 @@ homeCommandUsage1=/<command> <name> homeCommandUsage1Description=傳送你到指定的家 homeCommandUsage2=/<command> <player>\:<name> homeCommandUsage2Description=傳送你到指定玩家的家 -homes=§6家 : §r{0}。 -homeConfirmation=§6你已有一個名為 §c{0}§6 的家 ! \n要覆蓋現有家,請再次輸入指令。 +homes=§6家 : §r{0} +homeConfirmation=§6你已有一個名為 §c{0}§6 的家 ! \n要覆蓋現有的家,請再次輸入指令。 homeSet=§6已成功設定目前位置為家。 hour=小時 hours=小時 +ice=§6你感到相當寒冷…… +iceCommandDescription=冰凍玩家。 +iceCommandUsage=/<command> [player] +iceCommandUsage1=/<command> +iceCommandUsage1Description=冰凍自己 +iceCommandUsage2=/<command> <player> +iceCommandUsage2Description=冰凍指定的玩家 +iceCommandUsage3=/<command> * +iceCommandUsage3Description=冰凍所有線上玩家 +iceOther=§6冰凍§c {0}§6。 ignoreCommandDescription=忽略或解除忽略其他玩家。 ignoreCommandUsage=/<command> <player> ignoreCommandUsage1=/<command> <player> ignoreCommandUsage1Description=忽略或取消忽略指定玩家 -ignoredList=§6忽略 : §r{0}。 +ignoredList=§6忽略 : §r{0} ignoreExempt=§4你無法忽略那個玩家。 ignorePlayer=§6你忽略了玩家§c {0}§6。 illegalDate=錯誤的日期格式。 @@ -461,7 +482,7 @@ invalidWorld=§4無效的世界名稱。 inventoryClearFail=§4玩家§c {0} §4沒有§c {2} §4個§c {1}§4。 inventoryClearingAllArmor=§6已清除§c {0}§6 的物品欄和裝備§6。 inventoryClearingAllItems=§6已清除§c {0}§6 的物品欄§6。 -inventoryClearingFromAll=§6清除所有玩家的物品欄...... +inventoryClearingFromAll=§6清除所有玩家的物品欄…… inventoryClearingStack=§6你被§c {2} §6移除§c {0} 個§c {1}§6。 invseeCommandDescription=查看其他玩家的物品欄。 invseeCommandUsage=/<command> <player> @@ -477,7 +498,7 @@ itemCommandUsage1=/<command> <item> [amount] itemCommandUsage1Description=給予你一組或指定數量的物品 itemCommandUsage2=/<command> <item> <amount> <meta> itemCommandUsage2Description=給予你指定數量帶有元數據的指定物品 -itemId=§6ID : §c {0}。 +itemId=§6ID : §c {0} itemloreClear=§6你已清除該物品的描述文字。 itemloreCommandDescription=編輯物品描述文字。 itemloreCommandUsage=/<command> <add/set/clear> [text/line] [text] @@ -490,10 +511,10 @@ itemloreCommandUsage3Description=清除手中物品的描述文字 itemloreInvalidItem=§4你需要拿著一個物品才能編輯描述文字。 itemloreNoLine=§4你拿著的物品第 §c{0}§4 行沒有描述文字。 itemloreNoLore=§4你拿著的物品沒有任何描述文字。 -itemloreSuccess=§6你已將描述文字 “§c{0}§6” 新增到你拿著的物品中。 -itemloreSuccessLore=§6你將拿著的物品描述文字第 "§c{0}§6" 行設定為 "§c{1}§6"。 -itemMustBeStacked=§4物品必須成組交易,2s的數量是2組,以此類推。 -itemNames=§6物品簡稱 : §r{0}。 +itemloreSuccess=§6你已將描述文字「§c{0}§6」新增到你拿著的物品中。 +itemloreSuccessLore=§6你將拿著的物品描述文字第 §c{0}§6 行設定為「§c{1}§6」。 +itemMustBeStacked=§4物品必須成組交易,2s 的數量是 2 組,以此類推。 +itemNames=§6物品簡稱 : §r{0} itemnameClear=§6你已清除該物品的名稱。 itemnameCommandDescription=命名物品。 itemnameCommandUsage=/<command> [name] @@ -501,54 +522,55 @@ itemnameCommandUsage1=/<command> itemnameCommandUsage1Description=清除手中物品的名稱 itemnameCommandUsage2=/<command> <name> itemnameCommandUsage2Description=設定手中物品的名稱 -itemnameInvalidItem=§c你需要持有物品才能重新命名。 -itemnameSuccess=§6你已將手中的物品重新命名為 “§c{0}§6”。 -itemNotEnough1=§4你沒有足夠的該物品可以賣出。 +itemnameInvalidItem=§c你需要拿著物品才能重新命名。 +itemnameSuccess=§6你已將手中的物品重新命名為「§c{0}§6」。 +itemNotEnough1=§4你沒有足夠的物品可以賣出。 itemNotEnough2=§6如果你想要賣出物品欄所有的物品,輸入 §c/sell itemname§6。 itemNotEnough3=§c/sell itemname -1 §6將賣出所有該物品,但剩餘 1 個物品,以此類推。 itemsConverted=§6將所有物品轉換為方塊。 itemsCsvNotLoaded=無法載入 {0} ! itemSellAir=你難道想賣空氣嗎 ? 放個東西在你手裡。 itemsNotConverted=§4你沒有可以轉換為方塊的物品。 -itemSold=§a獲得 §c {0} §a ( {1} 單位 {2},每個價值 {3} ) 。 -itemSoldConsole=§e{0} §a賣出 §e{1} §a給 §e{2} §a ( {3} 單位,每個價值 {4} ) 。 -itemSpawn=§6給予§c {0} §6個§c {1}。 +itemSold=§a獲得 §c {0} §a ({1} 單位 {2},每個價值 {3}) 。 +itemSoldConsole=§e{0} §a賣出 §e{1} §a給 §e{2} §a ({3} 單位,每個價值 {4}) 。 +itemSpawn=§6給予§c {0} §6個§c {1}§6。 itemType=§6物品 :§c {0} itemdbCommandDescription=搜尋物品。 itemdbCommandUsage=/<command> <item> itemdbCommandUsage1=/<command> <item> -itemdbCommandUsage1Description=在數據庫中搜尋指定物品 -jailAlreadyIncarcerated=§4已在監獄中的玩家 :§c {0}。 -jailList=§6監獄 : §r{0}。 +itemdbCommandUsage1Description=在資料庫中搜尋指定物品 +jailAlreadyIncarcerated=§4已在監獄中的玩家 :§c {0} +jailList=§6監獄 : §r{0} jailMessage=§4請在監獄中面壁思過。 jailNotExist=§4該監獄不存在。 jailReleased=§6玩家 §c{0}§6 出獄了。 jailReleasedPlayerNotify=§6你已被釋放 ! jailSentenceExtended=§6監禁時間增加到 : §c{0}§6。 jailSet=§6監獄 §c{0}§6 已被設定。 -jumpEasterDisable=§6飛行導向 已關閉。 -jumpEasterEnable=§6飛行導向 已開啟。 +jailWorldNotExist=§4該監獄位於的世界不存在。 +jumpEasterDisable=§c已關閉 §6飛行導向模式。 +jumpEasterEnable=§c已開啟 §6飛行導向模式。 jailsCommandDescription=列出所有監獄列表。 jailsCommandUsage=/<command> jumpCommandDescription=跳到視野中最近的方塊。 jumpCommandUsage=/<command> jumpError=§4這將會損害你的電腦。 -kickCommandDescription=以一個原因踢出指定的玩家。 +kickCommandDescription=以一個原因踢出指定玩家。 kickCommandUsage=/<command> <player> [reason] kickCommandUsage1=/<command> <player> [reason] kickCommandUsage1Description=踢出指定玩家並附加自訂原因 -kickDefault=從伺服器踢出。 +kickDefault=從伺服器踢出 kickedAll=§4已將所有玩家踢出伺服器。 kickExempt=§4你無法踢出該玩家。 -kickallCommandDescription=除了發送指令者之外的所有玩家踢出伺服器。 +kickallCommandDescription=將除了發送指令者之外的所有玩家踢出伺服器。 kickallCommandUsage=/<command> [reason] kickallCommandUsage1=/<command> [reason] kickallCommandUsage1Description=踢出所有玩家並附加自訂原因 kill=§6殺死了§c {0}§6。 -killCommandDescription=殺死指定的玩家。 +killCommandDescription=殺死指定玩家。 killCommandUsage=/<command> <player> killCommandUsage1=/<command> <player> -killCommandUsage1Description=殺死指定的玩家 +killCommandUsage1Description=殺死指定玩家 killExempt=§4你不能殺死§c {0}§4。 kitCommandDescription=獲取指定的工具包或查看所有可用的工具包。 kitCommandUsage=/<command> [kit] [player] @@ -557,10 +579,11 @@ kitCommandUsage1Description=列出所有可用工具包 kitCommandUsage2=/<command> <kit> [player] kitCommandUsage2Description=將指定工具包給予你或指定玩家 kitContains=§6工具包 §c{0} §6包含 : -kitCost=\ §7§o ( {0} ) §r +kitCost=\ §7§o ({0}) §r kitDelay=§m{0}§r kitError=§4沒有有效的工具包。 -kitError2=§4該工具包可能不存在或者被拒絕了。 +kitError2=§4該工具包可能不存在或者被拒絕了,請聯繫管理員。 +kitError3=無法給予玩家 {1} 工具包,因為工具包「{0}」需要 Paper 1.15.2+ 來反序列化。 kitGiveTo=§6給予§c {1} §6工具包§c {0}§6。 kitInvFull=§4你的物品欄已滿,工具包將放在地上。 kitInvFullNoDrop=§4沒有足夠的物品欄空間放置該工具包。 @@ -568,42 +591,41 @@ kitItem=§6- §f{0} kitNotFound=§4工具包不存在。 kitOnce=§4你不能再次使用該工具包。 kitReceive=§6收到一個§c {0} §6工具包。 -kitReset=§6將工具包 §c{0}§6 重置冷卻時間。 +kitReset=§6將工具包 §c{0}§6 重設冷卻時間。 kitresetCommandDescription=重設指定工具包的冷卻時間。 kitresetCommandUsage=/<command> <kit> [player] kitresetCommandUsage1=/<command> <kit> [player] kitresetCommandUsage1Description=重設你或指定玩家的工具包冷卻時間 -kitResetOther=§6將 §c{1}§6 重置工具包 §c{0}§6 的冷卻時間。 -kits=§6工具包 : §r{0}。 +kitResetOther=§6將 §c{1}§6 重設工具包 §c{0}§6 的冷卻時間。 +kits=§6工具包 : §r{0} kittycannonCommandDescription=向你的敵人投擲一隻爆炸貓。 kittycannonCommandUsage=/<command> kitTimed=§4你不能再次對其他人使用該工具包§c {0}§4。 -leatherSyntax=§6皮革顏色語法 : §ccolor\:\:<red>,<green>,<blue>例如 : color\:255,0,0 §6或§c color\:<rgb int> 例如 : color\:16777011 -lightningCommandDescription=雷神索爾的力量,劈向目標玩家。 +leatherSyntax=§6皮革顏色語法 : §ccolor\:<red>,<green>,<blue> 例如 : color\:255,0,0 §6或§c color\:<rgb int> 或例如 : color\:16777011 +lightningCommandDescription=以雷神索爾的力量,劈向目標玩家。 lightningCommandUsage=/<command> [player] [power] lightningCommandUsage1=/<command> [player] lightningCommandUsage1Description=雷擊你前方的位置或指定玩家 lightningCommandUsage2=/<command> <player> <power> lightningCommandUsage2Description=以指定的力量雷擊指定玩家 lightningSmited=§6你剛剛被雷擊中了 ! -lightningUse=§6雷擊中了§c {0}§6。 +lightningUse=§6雷擊中了§c {0}§6 listAfkTag=§7[暫時離開]§r -listAmount=§6現在有 §c{0}§6 個玩家在線,最大在線人數為 §c{1}§6 個玩家。 -listAmountHidden=§現在有 §c{0}§6 個玩家在線 ( 另外隱身 §c{1}§6 個 ) ,最大在線人數為 §c{2}§6 個玩家。 +listAmount=§6現在有 §c{0}§6 個玩家在線,最多在線人數為 §c{1}§6 個玩家。 +listAmountHidden=§6現在有 §c{0}§6 個玩家在線 (另外隱身 §c{1}§6 個) ,最多在線人數為 §c{2}§6 個玩家。 listCommandDescription=列出所有線上玩家列表。 listCommandUsage=/<command> [group] listCommandUsage1=/<command> [group] listCommandUsage1Description=列出伺服器上所有或指定組別的玩家 listGroupTag=§6{0}§r : listHiddenTag=§7[隱身]§r -loadWarpError=§4載入地標 {0} 失敗。 +loadWarpError=§4無法載入地標 {0}。 localFormat=[L]<{0}> {1} -localNoOne=未知 -loomCommandDescription=開啟一個織布機。 +loomCommandDescription=開啟織布機。 loomCommandUsage=/<command> mailClear=§6輸入§c /mail clear§6 將郵件清除。 mailCleared=§6郵件已清空 ! -mailCommandDescription=管理玩家伺服器內郵件。 +mailCommandDescription=管理玩家伺服器內的郵件。 mailCommandUsage=/<command> [read|clear|send [to] [message]|sendall [message]] mailCommandUsage1=/<command> read [page] mailCommandUsage1Description=閱讀第一頁或指定頁數的郵件 @@ -625,7 +647,7 @@ maxHomes=§4你無法設定超過§c {0} §4個家。 maxMoney=§4這筆交易將超出該帳戶的金錢限制。 mayNotJail=§4你無法將該玩家關進監獄 ! mayNotJailOffline=§4你無法將離線玩家關進監獄。 -meCommandDescription=描述玩家目前的動作。 +meCommandDescription=以第三人稱描述一件事。 meCommandUsage=/<command> <description> meCommandUsage1=/<command> <description> meCommandUsage1Description=描述動作 @@ -635,12 +657,12 @@ minimumBalanceError=§4玩家能夠持有的最低金錢為 {0}。 minimumPayAmount=§c你能夠支付的最小值為 {0}。 minute=分鐘 minutes=分鐘 -missingItems=§4你沒有 §c{0}x {1}§4。 -mobDataList=§6有效的生物資料 : §r{0}。 -mobsAvailable=§6生物 : §r{0}。 +missingItems=§4你沒有 {0} §4個§c {1}§4。 +mobDataList=§6有效的生物資料 : §r{0} +mobsAvailable=§6生物 : §r{0} mobSpawnError=§4更改生怪磚時發生錯誤。 -mobSpawnLimit=生物數量太多,無法生成。 -mobSpawnTarget=§4目標方塊必須是一個生怪磚。 +mobSpawnLimit=生物數量超出伺服器限制。 +mobSpawnTarget=§4目標方塊必須是生怪磚。 moneyRecievedFrom=§a{0}§6 已收到來自 §a {1}§6。 moneySentTo=§a{0} 已被發送到 {1}。 month=月 @@ -652,23 +674,23 @@ moreCommandUsage1Description=填充手中物品到指定數量,若未指定則 moreThanZero=§4數量必須大於 0。 motdCommandDescription=查看每日訊息。 motdCommandUsage=/<command> [chapter] [page] -moveSpeed=§6已為§c {2} §6的§c {0}§6 速度設定為§c {1}§6。 +moveSpeed=§6已設定 §c{2}§6 的§c {0}§6 速度為§c {1}§6。 msgCommandDescription=發送私人訊息到指定玩家。 msgCommandUsage=/<command> <to> <message> msgCommandUsage1=/<command> <to> <message> msgCommandUsage1Description=傳送私人訊息到指定玩家 -msgDisabled=§6接收訊息 §c已關閉 。 -msgDisabledFor=§c{0}§6 的接收訊息 §c已關閉。 -msgEnabled=§6接收訊息 §c已開啟。 -msgEnabledFor=§c{0}§6 的接收訊息 §c已開啟 。 +msgDisabled=§c已關閉 §6接收訊息。 +msgDisabledFor=§c已關閉 {0} §6的接收訊息 。 +msgEnabled=§c已開啟 §6接收訊息。 +msgEnabledFor=§c已開啟 {0} §6的接收訊息。 msgFormat=§6[§c{0}§6 -> §c{1}§6] §r{2} msgIgnore=§c{0} §4已關閉接收訊息。 msgtoggleCommandDescription=阻擋所有私人訊息接收。 msgtoggleCommandUsage=/<command> [player] [on|off] msgtoggleCommandUsage1=/<command> [player] msgtoggleCommandUsage1Description=切換你或指定玩家的飛行模式 -multipleCharges=§4你不能對這個煙火應用多於一個的裝料。 -multiplePotionEffects=§4你不能對這個煙火應用多於一個的效果。 +multipleCharges=§4你不能對這個煙火應用多種的填充物。 +multiplePotionEffects=§4你不能對這個煙火應用多種的效果。 muteCommandDescription=禁言或解除禁言玩家。 muteCommandUsage=/<command> <player> [datediff] [reason] muteCommandUsage1=/<command> <player> @@ -683,9 +705,9 @@ mutedUserSpeaks={0} 想要說話,但被禁言了: {1} muteExempt=§4你無法禁言該玩家。 muteExemptOffline=§4你無法將離線玩家禁言。 muteNotify=§c{0} §6將 §c{1} §6禁言。 -muteNotifyFor=§c玩家 §c{1} §6 被 §c{0} §6禁言§c {2}§6。 -muteNotifyForReason=§c玩家 §c{1} §6 被 §c{0} §6禁言§c {2}§6。原因 : §c{3} -muteNotifyReason=§6玩家§c {1} §6被§c {0} §6禁言。原因 : §c{2}§6 +muteNotifyFor=§6玩家 §c{1}§6 被 §c{0} §6禁言§c {2}§6。 +muteNotifyForReason=§6玩家 §c{1}§6 被 §c{0} §6禁言§c {2}§6。原因 : §c{3} +muteNotifyReason=§6玩家 §c{1}§6 被 §c{0} §6禁言。原因 : §c{2} nearCommandDescription=列出附近玩家或周圍玩家列表。 nearCommandUsage=/<command> [playername] [radius] nearCommandUsage1=/<command> @@ -709,7 +731,7 @@ nickCommandUsage3=/<command> <player> <nickname> nickCommandUsage3Description=更改指定玩家的暱稱 nickCommandUsage4=/<command> <player> off nickCommandUsage4Description=移除指定玩家的暱稱 -nickDisplayName=§4你需要在 Essentials 配置文件內啟用 change-displayname。 +nickDisplayName=§4你需要在 Essentials 配置檔案內啟用 change-displayname。 nickInUse=§4那個暱稱已被使用。 nickNameBlacklist=§4不允許使用這個暱稱。 nickNamesAlpha=§4暱稱必須為有效的文字。 @@ -768,20 +790,20 @@ onlyDayNight=/time 指令有 sunrise/morning/noon/sunset/midnight/day/night 七 onlyPlayers=§4只有遊戲中的玩家可以使用 §c{0}§4。 onlyPlayerSkulls=§4你只能設定玩家頭顱的擁有者。 onlySunStorm=§4/weather 指令只有 sun/storm 兩個選擇。 -openingDisposal=§6正在打開垃圾桶選單...... -orderBalances=§6正在排序§c {0} §6個玩家的金錢中,請稍候...... +openingDisposal=§6正在打開垃圾桶選單…… +orderBalances=§6正在排序§c {0} §6個玩家的金錢中,請稍候…… oversizedMute=§4你無法禁言該玩家。 -oversizedTempban=§4你可能沒有在這個時段封禁玩家。 +oversizedTempban=§4你無法在這個時段封禁玩家。 passengerTeleportFail=§4你無法在乘坐時被傳送。 payCommandDescription=從你的金錢中扣款支付給其他玩家。 payCommandUsage=/<command> <player> <amount> payCommandUsage1=/<command> <player> <amount> payCommandUsage1Description=向指定玩家以指定的金額付款 -payConfirmToggleOff=§6你關閉了付款確認提示。 -payConfirmToggleOn=§6你開啟了付款確認提示。 +payConfirmToggleOff=§6你已關閉付款確認提示。 +payConfirmToggleOn=§6你已開啟付款確認提示。 payDisabledFor=§6已拒絕來自 §c{0}§6 的付款。 payEnabledFor=§6已接受來自 §c{0}§6 的付款。 -payMustBePositive=§4付款金額必須是一個正數。 +payMustBePositive=§4付款金額必須是正數。 payOffline=§4你無法向離線玩家付款。 payToggleOff=§6你不再接受付款。 payToggleOn=§6你現在接受付款。 @@ -799,19 +821,19 @@ playerTempBanIpAddress=§6IP 位址 §c{1}§6 暫時被§c {0} §6封禁。時 playerBanned=§6玩家§c {1} §6被§c {0} §6封禁§6。原因 : §c{2}§6。 playerJailed=§6玩家 §c{0} §6被關進監獄。 playerJailedFor=§6玩家§c {0} §6被逮捕並關進監獄§c {1}§6。 -playerKicked=§6玩家§c {1}§6 被§c {0} §6踢出。原因 : §c{2}§6 +playerKicked=§6玩家§c {1}§6 被§c {0} §6踢出。原因 : §c{2}§6。 playerMuted=§6你被禁言了 ! playerMutedFor=§6你已被 §c{0}§6 禁言。 playerMutedForReason=§6你已被禁言 §c {0}§6。原因 : §c{1} playerMutedReason=§6你已被禁言 ! 原因 : §c{0} playerNeverOnServer=§4玩家 §c{0} §4從未加入伺服器。 -playerNotFound=§4玩家未在線 ( 或不存在 ) 。 +playerNotFound=§4玩家未在線 (或不存在) 。 playerTempBanned=§6玩家§c {1} §6暫時被§c {0} §6封禁 §c{2}§6。原因 : §c{3}§6。 -playerUnbanIpAddress=§6已解除玩家§c {0} §6的封禁 IP 位址 : §c{1}。 +playerUnbanIpAddress=§6玩家§c {0} §6已解除該封禁 IP 位址 : §c{1}。 playerUnbanned=§6玩家§c {1} §6被§c {0} §6解除封禁。 playerUnmuted=§6你被解除禁言了。 pong=啪 ! -posPitch=§6仰角 : {0} ( 頭部的角度 ) 。 +posPitch=§6仰角 : {0} (頭部的角度) 。 possibleWorlds=§6可使用的世界編號為 §c0§6 到 §c{0}§6。 potionCommandDescription=新增自訂義藥水效果到藥水。 potionCommandUsage=/<command> <clear|apply|effect\:<effect> power\:<power> duration\:<duration>> @@ -821,10 +843,10 @@ potionCommandUsage2=/<command> apply potionCommandUsage2Description=使你得到所持藥水的所有效果而不消耗藥水 potionCommandUsage3=/<command> effect\:<effect> power\:<power> duration\:<duration> potionCommandUsage3Description=將指定的藥水元數據增加到手持的藥水中 -posX=§6X : {0} ( +東 <-> -西 ) 。 -posY=§6Y : {0} ( +上 <-> -下 ) 。 -posYaw=§6角度 : {0} ( 旋轉 ) 。 -posZ=§6Z : {0} ( +南 <-> -北 ) 。 +posX=§6X : {0} (+東 <-> -西) +posY=§6Y : {0} (+上 <-> -下) +posYaw=§6角度 : {0} (旋轉) +posZ=§6Z : {0} (+南 <-> -北) potions=§6藥水 : §r{0}§6。 powerToolAir=§4該指令不能對著空氣使用。 powerToolAlreadySet=§4指令 §c{0}§4 已綁定給 §c{1}§4。 @@ -835,8 +857,8 @@ powerToolListEmpty=§4物品 §c{0} §4沒有被綁定到指令。 powerToolNoSuchCommandAssigned=§4指令 §c{0}§4 沒有綁定給 §c{1}§4。 powerToolRemove=§6指令 §c{0}§6 已從 §c{1}§6 移除。 powerToolRemoveAll=§6所有指令已從 §c{0}§6 移除。 -powerToolsDisabled=§6你所有的綁定指令已關閉。 -powerToolsEnabled=§6你所有的綁定指令已開啟。 +powerToolsDisabled=§6你已關閉所有綁定指令。 +powerToolsEnabled=§6你已開啟所有綁定指令。 powertoolCommandDescription=綁定指令到手中的物品。 powertoolCommandUsage=/<command> [l\:|a\:|r\:|c\:|d\:][command] [arguments] - {player} 可以點擊玩家名稱更換。 powertoolCommandUsage1=/<command> l\: @@ -851,7 +873,7 @@ powertoolCommandUsage5=/<command> a\:<cmd> powertoolCommandUsage5Description=新增綁定指令到手中物品 powertooltoggleCommandDescription=開啟或關閉目前所有的綁定指令。 powertooltoggleCommandUsage=/<command> -ptimeCommandDescription=調整玩家時間。新增 @ 前綴固定時間。 +ptimeCommandDescription=調整玩家的時間。新增 @ 前綴可以固定時間。 ptimeCommandUsage=/<command> [list|reset|day|night|dawn|17\:30|4pm|4000ticks] [player|*] ptimeCommandUsage1=/<command> list [player|*] ptimeCommandUsage1Description=列出你或指定玩家的玩家時間 @@ -866,21 +888,21 @@ pweatherCommandUsage1Description=列出你或指定玩家的天氣 pweatherCommandUsage2=/<command> <storm|sun> [player|*] pweatherCommandUsage2Description=設定你或指定玩家的天氣 pweatherCommandUsage3=/<command> reset [player|*] -pweatherCommandUsage3Description=重設你或指定玩家的時間 +pweatherCommandUsage3Description=重設你或指定玩家的天氣 pTimeCurrent=§c{0}§6 的時間是§c {1}§6。 pTimeCurrentFixed=§c{0}§6 的時間被修正到§c {1}§6。 pTimeNormal=§c{0}§6 的時間是正常的並與伺服器同步。 pTimeOthersPermission=§4你沒有設定其他玩家時間的權限。 pTimePlayers=§6這些玩家有他們自己的時間 : §r -pTimeReset=§6玩家的時間已被重置 : §c{0}。 +pTimeReset=§6玩家的時間已被重設 : §c{0} pTimeSet=§6玩家 §c{1}§6 的時間被設定為 §c{0}§6。 pTimeSetFixed=§6玩家 §c{1}§6 時間被固定為 §c{0}§6。 pWeatherCurrent=§c{0}§6 的天氣是§c {1}§6。 -pWeatherInvalidAlias=§4錯誤的天氣類型。 +pWeatherInvalidAlias=§4無效的天氣類型 pWeatherNormal=§c{0}§6 的天氣是正常的並與伺服器同步。 pWeatherOthersPermission=§4你沒有設定其他玩家天氣的權限。 pWeatherPlayers=§6這些玩家都有自己的天氣 : §r -pWeatherReset=§6該玩家的天氣已被重置 : §c{0}。 +pWeatherReset=§6該玩家的天氣已被重設 : §c{0} pWeatherSet=§6玩家 §c{1}§6 的天氣被設定為 §c{0}§6。 questionFormat=§2[提問]§r {0} rCommandDescription=快速回覆上一個玩家訊息。 @@ -889,14 +911,14 @@ rCommandUsage1=/<command> <message> rCommandUsage1Description=使用指定文字訊息回覆上一個玩家 radiusTooBig=§4半徑太大 ! 最大半徑是§c {0}§4。 readNextPage=§6輸入 §c/{0} {1} §6來閱讀下一頁。 -realName=§f{0}§r§6 是 §f{1}。 +realName=§f{0}§r§6 是 §f{1} realnameCommandDescription=顯示玩家真實名稱。 realnameCommandUsage=/<command> <nickname> realnameCommandUsage1=/<command> <nickname> -realnameCommandUsage1Description=顯示指定暱稱玩家的使用者名稱 +realnameCommandUsage1Description=顯示指定暱稱玩家的真實名稱 recentlyForeverAlone=§4{0} 剛才離線了。 -recipe=§c{0}§6 的合成配方 ( §c第 {1} 頁§6 , §c共 {2} 頁§6 ) 。 -recipeBadIndex=這個編號沒有匹配的合成公式。 +recipe=§c{0}§6 的合成方式 (§c第 {1} 頁§6,§c共 {2} 頁§6) 。 +recipeBadIndex=這個編號沒有匹配的合成方式。 recipeCommandDescription=顯示如何合成物品。 recipeCommandUsage=/<command> <item> [number] recipeCommandUsage1=/<command> <item> [page] @@ -904,10 +926,10 @@ recipeCommandUsage1Description=顯示如何合成物品 recipeFurnace=§6熔煉 : §c{0}§6。 recipeGrid=§c{0}X §6| §{1}X §6| §{2}X。 recipeGridItem=§c{0}X §6是 §c{1}。 -recipeMore=§6輸入§c /{0} {1} <數字>§6 查看所有合成 §c{2}§6。 -recipeNone={0} 沒有匹配的合成公式。 +recipeMore=§6輸入§c /{0} {1} <number>§6 查看 §c{2}§6 的其他合成方式。 +recipeNone={0} 沒有匹配的合成方式。 recipeNothing=沒有東西 -recipeShapeless=§6結合 §c{0}。 +recipeShapeless=§6結合 §c{0} recipeWhere=§6地方 : {0} removeCommandDescription=移除你所在的世界的所有實體。 removeCommandUsage=/<command> <all|tamed|named|drops|arrows|boats|minecarts|xp|paintings|itemframes|endercrystals|monsters|animals|ambient|mobs|[mobType]> [radius|world] @@ -916,9 +938,9 @@ removeCommandUsage1Description=移除目前世界的所有生物,若指定則 removeCommandUsage2=/<command> <mob type> <radius> [world] removeCommandUsage2Description=移除目前世界指定半徑中的所有生物,若指定生物則移除指定半徑中的指定生物 removed=§6移除了§c {0} §6項。 -repair=§6你成功修好了你的 : §c{0}§6。 +repair=§6你成功修好了 §c{0}§6。 repairAlreadyFixed=§4該物品無需修復。 -repairCommandDescription=修復一個或多個物品的耐久值。 +repairCommandDescription=修復一個或多個物品的耐久度。 repairCommandUsage=/<command> [hand|all] repairCommandUsage1=/<command> repairCommandUsage1Description=修復手中的物品 @@ -927,33 +949,33 @@ repairCommandUsage2Description=修復物品欄的所有物品 repairEnchanted=§4你沒有修復附魔物品的權限。 repairInvalidType=§4該物品無法修復。 repairNone=§4沒有需要被修復的物品。 -replyLastRecipientDisabled=§c已關閉 §6回覆上一則訊息 。 -replyLastRecipientDisabledFor=§c已關閉 §c {0} §6的回覆上一則訊息。 -replyLastRecipientEnabled=§c已開啟§6 回覆上一則訊息。 -replyLastRecipientEnabledFor=§c已開啟 §c {0} §6的回覆上一則訊息。 +replyLastRecipientDisabled=§c已關閉 §6回覆上一則訊息功能。 +replyLastRecipientDisabledFor=§c已關閉 {0} §6的回覆上一則訊息功能。 +replyLastRecipientEnabled=§c已開啟§6 回覆上一則訊息功能。 +replyLastRecipientEnabledFor=§c已開啟§c {0} §6的回覆上一則訊息功能。 requestAccepted=§6已接受傳送請求。 requestAcceptedAuto=§6自動接受來自 {0} 的傳送請求。 requestAcceptedFrom=§c{0} §6接受了你的傳送請求。 requestAcceptedFromAuto=§c{0} §6自動接受你的傳送請求。 requestDenied=§6已拒絕傳送請求。 requestDeniedFrom=§c{0}§6 拒絕了你的傳送請求。 -requestSent=§6請求已發送給 {0}§6。 +requestSent=§6請求已發送給§c {0}§6。 requestSentAlready=§4你已將傳送請求發送給 {0}§4。 requestTimedOut=§4傳送請求超時。 -resetBal=§6所有在線玩家的金錢已被重置為 §c{0}§6。 -resetBalAll=§6所有玩家的金錢已被重置為 §c{0}§6。 +resetBal=§6所有線上玩家的金錢已被重設為 §c{0}§6。 +resetBalAll=§6所有玩家的金錢已被重設為 §c{0}§6。 rest=§6你感到精神飽滿。 -restCommandDescription=讓你或指定的玩家休息。 +restCommandDescription=讓你或指定玩家休息。 restCommandUsage=/<command> [player] restCommandUsage1=/<command> [player] restCommandUsage1Description=重設你或指定玩家精神狀態 restOther=§c{0} §6休息中。 returnPlayerToJailError=§4嘗試將玩家§c {0} §4關回監獄時發生錯誤 : §c{1}§4 ! -rtoggleCommandDescription=更改回覆收件人為最後的收件人或發件人。 +rtoggleCommandDescription=更改回覆收件人為最後的收件人或發件人 rtoggleCommandUsage=/<command> [player] [on|off] rulesCommandDescription=查看伺服器規則。 rulesCommandUsage=/<command> [chapter] [page] -runningPlayerMatch=§6正在搜索匹配的玩家 §c{0}§6 ( 這可能會花費一些時間 ) 。 +runningPlayerMatch=§6正在搜索匹配的玩家 §c{0}§6 (這可能會花費一些時間) 。 second=秒 seconds=秒 seenAccounts=§6玩家有相同帳號記錄 : §c{0} @@ -961,9 +983,9 @@ seenCommandDescription=顯示玩家最後登出時間。 seenCommandUsage=/<command> <playername> seenCommandUsage1=/<command> <playername> seenCommandUsage1Description=顯示指定玩家的登出時間、封禁、 UUID 等資訊 -seenOffline=§6玩家§c {0} §6在 §c{1} §4已離線§6。 -seenOnline=§6玩家§c {0} §6在 §c{1} §a前上線§6。 -sellBulkPermission=§6你沒有出售大量物品的權限。 +seenOffline=§6玩家§c {0} §6在 §c{1}§6 前已§4離線§6。 +seenOnline=§6玩家§c {0} §6在 §c{1}§6 前已§a上線§6。 +sellBulkPermission=§6你沒有出售批量物品的權限。 sellCommandDescription=賣出你手中的物品。 sellCommandUsage=/<command> <<itemname>|<id>|hand|inventory|blocks> [amount] sellCommandUsage1=/<command> <itemname> [amount] @@ -976,14 +998,14 @@ sellCommandUsage4=/<command> blocks [amount] sellCommandUsage4Description=從你的物品欄中賣出所有或指定數目的方塊 sellHandPermission=§6你沒有出售手中的物品的權限。 serverFull=伺服器已滿 ! -serverReloading=你將立即重新載入伺服器。使用 /reload 時,EssentialsX 團隊可能無法提供支持。 +serverReloading=你將立即重新載入伺服器,但你為什麼要這樣做呢 ? EssentialsX 團隊不會提供使用 /reload 指令後,所發生問題的任何支援。 serverTotal=§6伺服器總和 : §c{0} serverUnsupported=你正在運行不被支援的伺服器版本 ! serverUnsupportedClass=狀態決定類 : {0} serverUnsupportedCleanroom=你正在運行一個不依賴 Mojang 內部代碼的 Bukkit 伺服器。請考慮為你的伺服器使用其它能夠替代 Essentials 的插件。 serverUnsupportedDangerous=你正在運行一個已知極其危險且會導致數據丟失的伺服器分支。強烈建議你更換如 Paper 或 Tuinity 之類的更穩定且更高性能的伺服端。 serverUnsupportedLimitedApi=你正在運行 API 功能受限的伺服器。EssentialsX 仍然可以使用,但是某些功能可能被關閉。 -serverUnsupportedMods=你正在運行的伺服器無法正常支持 Bukkit 插件。Bukkit 插件不應該與 Forge / Fabric 模組一起使用 ! Forge 建議使用 ForgeEssentials 或 SpongeForge + Nucleus 代替本插件。 +serverUnsupportedMods=你正在運行的伺服器無法正常支援 Bukkit 插件。Bukkit 插件不應該與 Forge / Fabric 模組一起使用 ! Forge 建議使用 ForgeEssentials 或 SpongeForge + Nucleus 代替本插件。 setBal=§a你的金錢已被設定為 {0}。 setBalOthers=§a成功設定 {0} §a的金錢為 {1}。 setSpawner=§6更改生怪磚類型為§c {0}§6。 @@ -1018,10 +1040,10 @@ setworthCommandUsage1Description=以指定的值設定你手中的物品價格 setworthCommandUsage2=/<command> <itemname> <price> setworthCommandUsage2Description=以指定的值設定指定物品的物品價格 sheepMalformedColor=§4無效的顏色。 -shoutDisabled=§6喊話模式 §c已關閉§6。 -shoutDisabledFor=§6已為 §c{0} 關閉§6喊話模式。 -shoutEnabled=§6喊話模式 §c已開啟§6。 -shoutEnabledFor=§6已為 §c{0} 開啟§6喊話模式。 +shoutDisabled=§c已關閉 §6喊話模式。 +shoutDisabledFor=§c已關閉 {0} §6的喊話模式。 +shoutEnabled=§c已開啟 §6喊話模式。 +shoutEnabledFor=§c已開啟 {0} §6的喊話模式。 shoutFormat=§6[喊話]§r {0} editsignCommandClear=§6告示牌已清除。 editsignCommandClearLine=§6已清除第 §c{0}§6 行。 @@ -1032,7 +1054,7 @@ showkitCommandUsage1Description=顯示指定工具包中物品的內容 editsignCommandDescription=編輯告示牌內容。 editsignCommandLimit=§4你輸入的文字過長,無法使用在告示牌上。 editsignCommandNoLine=§4你必須輸入 §c1-4§4 中的一個數字。 -editsignCommandSetSuccess=§6將第§c {0}§6 行設定為 "§c{1}§6"。 +editsignCommandSetSuccess=§6將第§c {0}§6 行設定為「§c{1}§6」。 editsignCommandTarget=§4你必須看著告示牌才能編輯文字。 editsignCopy=§6成功複製告示牌 ! 你現在可以使用 §c/{0} paste§6 指令來貼上它了。 editsignCopyLine=§6成功複製告示牌的第 §c{0}§6 行文字 ! 你現在可以使用 §c/{1} paste {0}§6 來貼上它了。 @@ -1056,18 +1078,18 @@ southEast=東南 south=南 southWest=西南 skullChanged=§6頭顱更改為 §c{0}§6。 -skullCommandDescription=設定玩家頭顱。 +skullCommandDescription=設定玩家頭顱 skullCommandUsage=/<command> [owner] skullCommandUsage1=/<command> skullCommandUsage1Description=獲取你的頭顱 skullCommandUsage2=/<command> <player> skullCommandUsage2Description=獲取指定玩家的頭顱 slimeMalformedSize=§4大小非法。 -smithingtableCommandDescription=開啟一個鍛造台。 +smithingtableCommandDescription=開啟鍛造台。 smithingtableCommandUsage=/<command> socialSpy=§6監聽 §c{0}§6 : §c{1} socialSpyMsgFormat=§6[§c{0}§7 -> §c{1}§6] §7{2} -socialSpyMutedPrefix=§f[§6監聽§f] §7 ( 已禁言 ) §r +socialSpyMutedPrefix=§f[§6監聽§f] §7 (已被禁言) §r socialspyCommandDescription=切換是否可以在聊天中看到 msg / mail 指令。 socialspyCommandUsage=/<command> [player] [on|off] socialspyCommandUsage1=/<command> [player] @@ -1084,7 +1106,7 @@ spawnmobCommandUsage=/<command> <mob>[\:data][,<mount>[\:data]] [amount] [player spawnmobCommandUsage1=/<command> <mob>[\:data] [amount] [player] spawnmobCommandUsage1Description=在你或指定玩家的所在的位置,生成一個或指定數量的生物 spawnmobCommandUsage2=/<command> <mob>[\:data],<mount>[\:data] [amount] [player] -spawnmobCommandUsage2Description=在你或指定玩家的所在的位置騎乘,生成一個或指定數量的可騎乘生物 +spawnmobCommandUsage2Description=在你 (或指定玩家) 的位置生成一個 (或指定數量的) 騎著另一個指定生物的指定生物 spawnSet=§6已設定§c {0}§6 組的重生點。 spectator=旁觀者模式 speedCommandDescription=更改你的速度限制。 @@ -1093,38 +1115,38 @@ speedCommandUsage1=/<command> <speed> speedCommandUsage1Description=設定你的飛行或走路速度 speedCommandUsage2=/<command> <type> <speed> [player] speedCommandUsage2Description=設定你或指定玩家的移動速度 -stonecutterCommandDescription=開啟一個切石機。 +stonecutterCommandDescription=開啟切石機。 stonecutterCommandUsage=/<command> sudoCommandDescription=強制使指定玩家執行指令。 sudoCommandUsage=/<command> <player> <command [args]> sudoCommandUsage1=/<command> <player> <command> [args] -sudoCommandUsage1Description=使指定玩家執行一個指令 +sudoCommandUsage1Description=使指定玩家執行指令 sudoExempt=§4無法強制使玩家執行 §c{0} §4指令。 -sudoRun=§6強制§c {0} §6執行 : §r/{1}。 -suicideCommandDescription=自我了結一生。 +sudoRun=§6強制§c {0} §6執行 : §r/{1} +suicideCommandDescription=自我了結。 suicideCommandUsage=/<command> -suicideMessage=§6永別了,殘酷的世界...... -suicideSuccess=§6玩家 §c{0} §6結束了他自己的生命。 +suicideMessage=§6永別了,殘酷的世界…… +suicideSuccess=§6玩家 §c{0} §6結束了自己的生命。 survival=生存模式 takenFromAccount=§e{0}§a 已從你的帳戶中扣除。 takenFromOthersAccount=§e{1}§a 從帳戶中扣除了 §e{0}§a。目前金錢餘額 :§e {2}。 -teleportAAll=§6向所有玩家發送傳送請求...... -teleportAll=§6正在傳送所有玩家...... -teleportationCommencing=§6準備傳送...... -teleportationDisabled=§6傳送 §c已關閉§6。 -teleportationDisabledFor=§c{0}§6 的傳送 §c已關閉§6。 +teleportAAll=§6向所有玩家發送傳送請求…… +teleportAll=§6正在傳送所有玩家…… +teleportationCommencing=§6準備傳送…… +teleportationDisabled=§c已關閉 §6傳送。 +teleportationDisabledFor=§c已關閉 {0} §6的傳送。 teleportationDisabledWarning=§6你必須先開啟傳送,其他玩家才能傳送你這裡。 -teleportationEnabled=§6傳送 §c已開啟§6。 -teleportationEnabledFor=§c{0}§6 的傳送 §c已開啟§6。 +teleportationEnabled=§c已開啟 §6傳送。 +teleportationEnabledFor=§c已開啟 {0}§6 的傳送。 teleportAtoB=§c{0}§6 將你傳送到 §c{1}§6。 teleportDisabled=§c{0} §4取消傳送。 -teleportHereRequest=§c{0}§6 請求你傳送到他那裡(請注意安全)。 +teleportHereRequest=§c{0}§6 請求你傳送到他那裡 (請注意安全)。 teleportHome=§6傳送到 §c{0}§6。 -teleporting=§6正在傳送...... -teleportInvalidLocation=座標的數值不得超過 30000000。 -teleportNewPlayerError=§4傳送新玩家失敗 ! +teleporting=§6正在傳送…… +teleportInvalidLocation=座標的數值不得超過 30000000 +teleportNewPlayerError=§4無法傳送新玩家 ! teleportNoAcceptPermission=§c{0} §4沒有接受該傳送的權限。 -teleportRequest=§c{0}§6 請求傳送到你這裡(注意陌生人)。 +teleportRequest=§c{0}§6 請求傳送到你這裡 (請注意安全)。 teleportRequestAllCancelled=§6所有傳送請求已取消。 teleportRequestCancelled=§6你的傳送請求 §c{0}§6 已取消。 teleportRequestSpecificCancelled=§c{0}§6 的傳送請求已取消。 @@ -1143,16 +1165,16 @@ tempbanCommandUsage1Description=封禁指定玩家一段時間並附加自訂原 tempbanipCommandDescription=暫時封禁玩家和封禁 IP 位址。 tempbanipCommandUsage=/<command> <playername> <datediff> [reason] tempbanipCommandUsage1=/<command> <player|ip-address> <datediff> [reason] -tempbanipCommandUsage1Description=禁言指定 IP 位址一段時間並附加自訂原因 -thunder=§6你 §c{0} §6了你的世界的閃電。 -thunderCommandDescription=開啟/關閉閃電。 +tempbanipCommandUsage1Description=封禁指定 IP 位址一段時間並附加自訂原因 +thunder=§6你 §c{0} §6了你所在世界的閃電。 +thunderCommandDescription=開啟或關閉閃電。 thunderCommandUsage=/<command> <true/false> [duration] thunderCommandUsage1=/<command> <true|false> [duration] -thunderCommandUsage1Description=開啟/關閉雷聲持續時間 -thunderDuration=§6你 §c{0} §6了你的世界的閃電§c {1} §6秒。 +thunderCommandUsage1Description=在指定持續時間內開啟或關閉閃電 +thunderDuration=§6你 §c{0} §6了你所在世界的閃電持續§c {1} §6秒。 timeBeforeHeal=§4治療冷卻 : §c{0}§4。 timeBeforeTeleport=§4傳送冷卻 : §c{0}§4。 -timeCommandDescription=顯示/更改世界時間。預設為目前世界。 +timeCommandDescription=顯示或更改世界時間,預設為目前的世界。 timeCommandUsage=/<command> [set|add] [day|night|dawn|17\:30|4pm|4000ticks] [worldname|all] timeCommandUsage1=/<command> timeCommandUsage1Description=顯示所有世界的時間 @@ -1223,17 +1245,17 @@ tphereCommandDescription=傳送玩家到你身邊。 tphereCommandUsage=/<command> <player> tphereCommandUsage1=/<command> <player> tphereCommandUsage1Description=將指定的玩家傳送到你身邊 -tpoCommandDescription=覆蓋 Tptoggle 的傳送。 +tpoCommandDescription=覆蓋 tptoggle 的傳送。 tpoCommandUsage=/<command> <player> [otherplayer] tpoCommandUsage1=/<command> <player> tpoCommandUsage1Description=覆蓋玩家傳送偏好設定,傳送指定玩家到你身邊 tpoCommandUsage2=/<command> <player> <other player> tpoCommandUsage2Description=覆蓋第一個和第二個指定的玩家傳送偏好設定,傳送第一個指定的玩家到第二個指定的玩家 -tpofflineCommandDescription=傳送到一個玩家最後登出位置。 +tpofflineCommandDescription=傳送到玩家的最後登出位置。 tpofflineCommandUsage=/<command> <player> tpofflineCommandUsage1=/<command> <player> -tpofflineCommandUsage1Description=傳送你到指定玩家的登出位置 -tpohereCommandDescription=覆蓋 Tptoggle 的傳送。 +tpofflineCommandUsage1Description=傳送你到指定玩家的登出位置。 +tpohereCommandDescription=覆蓋 tptoggle 的傳送。 tpohereCommandUsage=/<command> <player> tpohereCommandUsage1=/<command> <player> tpohereCommandUsage1Description=覆蓋玩家傳送偏好設定,傳送指定玩家到你身邊 @@ -1245,19 +1267,19 @@ tprCommandDescription=隨機傳送。 tprCommandUsage=/<command> tprCommandUsage1=/<command> tprCommandUsage1Description=傳送到隨機位置 -tprSuccess=§6正在傳送到隨機座標...... -tps=§6目前 TPS \= {0}。 +tprSuccess=§6正在傳送到隨機座標…… +tps=§6目前 TPS \= {0} tptoggleCommandDescription=阻止所有形式的傳送。 tptoggleCommandUsage=/<command> [player] [on|off] tptoggleCommandUsage1=/<command> [player] tptoggleCommandUsageDescription=切換你或指定玩家是否開啟傳送 tradeSignEmpty=§4交易告示牌上沒有你可獲得的東西。 tradeSignEmptyOwner=§4交易告示牌上沒有你可收集的東西。 -treeCommandDescription=生成一棵樹在你的前方。 +treeCommandDescription=在你的前方生成一棵樹木。 treeCommandUsage=/<command> <tree|birch|redwood|redmushroom|brownmushroom|jungle|junglebush|swamp> treeCommandUsage1=/<command> <tree|birch|redwood|redmushroom|brownmushroom|jungle|junglebush|swamp> treeCommandUsage1Description=在你的前方生成指定類型的大樹 -treeFailure=§4生成樹木失敗,在草地上或泥土上再試一次。 +treeFailure=§4無法生成樹木,請在草地或泥土重試一次。 treeSpawned=§6已生成樹木。 true=§a是§r typeTpacancel=§6若想取消傳送,輸入 §c/tpacancel§6。 @@ -1265,18 +1287,18 @@ typeTpaccept=§6若想接受傳送,輸入 §c/tpaccept§6。 typeTpdeny=§6若想拒絕傳送,輸入 §c/tpdeny§6。 typeWorldName=§6你也可以輸入指定的世界名稱。 unableToSpawnItem=§4無法生成 §c{0}§4,這不是可生成的物品。 -unableToSpawnMob=§4生成生物失敗。 -unbanCommandDescription=解除封禁指定的玩家。 +unableToSpawnMob=§4無法生成生物。 +unbanCommandDescription=解除指定玩家的封禁。 unbanCommandUsage=/<command> <player> unbanCommandUsage1=/<command> <player> -unbanCommandUsage1Description=解除封禁指定的玩家 -unbanipCommandDescription=解除封禁指定的 IP 位址。 +unbanCommandUsage1Description=解除指定玩家的封禁 +unbanipCommandDescription=解除指定 IP 位址的封禁。 unbanipCommandUsage=/<command> <address> unbanipCommandUsage1=/<command> <address> -unbanipCommandUsage1Description=解除封禁指定的 IP 位址 +unbanipCommandUsage1Description=解除指定 IP 位址的封禁 unignorePlayer=§6你已不再忽略玩家§c {0}§6。 unknownItemId=§4未知的物品 ID : §r{0}§4。 -unknownItemInList=§4未知的物品 {0} 於 {1} 列表。 +unknownItemInList=§4未知 {1} 列表中的物品 {0}。 unknownItemName=§4未知的物品名稱 : {0}。 unlimitedCommandDescription=允許放置無限物品。 unlimitedCommandUsage=/<command> <list|item|clear> [player] @@ -1290,15 +1312,15 @@ unlimitedItemPermission=§4你沒有使用無限物品 §c{0}§4 的權限。 unlimitedItems=§6無限物品 : §r unmutedPlayer=§6玩家§c {0} §6被解除禁言。 unsafeTeleportDestination=§4傳送目的地不安全,且安全傳送處於關閉狀態。 -unsupportedBrand=§4你正在運行的伺服器版本不支援附加功能。 -unsupportedFeature=§4目前伺服器版本不支持該功能。 -unvanishedReload=§4插件重載迫使你的隱身模式失效。 -upgradingFilesError=升級文件時發生錯誤。 +unsupportedBrand=§4你正在運行的伺服器版本沒有為此功能提供支援。 +unsupportedFeature=§4目前伺服器版本不支援該功能。 +unvanishedReload=§4插件重新載入迫使你的隱身模式失效。 +upgradingFilesError=更新檔案時發生錯誤。 uptime=§6運行時間 :§c {0} -userAFK=§7{0} §5現在暫時離開,可能暫時沒辦法回應。 -userAFKWithMessage=§7{0} §5現在暫時離開,可能暫時沒辦法回應 : {1}。 -userdataMoveBackError=移動 userdata/{0}.tmp 到 userdata/{1} 失敗 ! -userdataMoveError=移動 userdata/{0} 到 userdata/{1}.tmp 失敗 ! +userAFK=§7{0} §5現在暫時離開,可能沒辦法及時回應。 +userAFKWithMessage=§7{0} §5現在暫時離開,可能沒辦法及時回應 : {1} +userdataMoveBackError=無法移動 userdata/{0}.tmp 到 userdata/{1} ! +userdataMoveError=無法移動 userdata/{0} 到 userdata/{1}.tmp ! userDoesNotExist=§4玩家§c {0} §4不存在。 uuidDoesNotExist=§4不存在具有 UUID §c{0} §4的玩家。 userIsAway=§7* {0} §7暫時離開了。 @@ -1308,15 +1330,15 @@ userIsAwaySelf=§7你暫時離開了。 userIsAwaySelfWithMessage=§7你暫時離開了。 userIsNotAwaySelf=§7你回來了。 userJailed=§6你已被關進監獄 ! -userUnknown=§4警告 : 這個玩家 ''§c{0}§4'' 從來沒有加入過伺服器。 +userUnknown=§4警告 : 這個玩家「§c{0}§4」從來沒有加入過伺服器。 usingTempFolderForTesting=使用暫存資料夾來測試 : vanish=§6{1} {0} §6的隱形模式。 -vanishCommandDescription=隱藏你自己於其他玩家視線中。 +vanishCommandDescription=從其他玩家的視線中隱藏自己。 vanishCommandUsage=/<command> [player] [on|off] vanishCommandUsage1=/<command> [player] vanishCommandUsage1Description=切換你或指定玩家是否隱形 vanished=§6現在開始你將不會被一般玩家發現,而且在遊戲內的指令消失。 -versionCheckDisabled=§6更新檢查已於配置文件中關閉。 +versionCheckDisabled=§6更新檢查已於配置檔案中關閉。 versionCustom=§6無法檢查你目前的版本 ! 自己建立的 ? 建立資訊 : §c{0}§6。 versionDevBehind=§4你正在運行的 EssentialsX 已過時 §c{0} §4個開發版本 ! versionDevDiverged=§6你正在運行的實驗性 EssentialsX 開發版本 §c{0}§6 已不是最新的開發版本 ! @@ -1325,29 +1347,29 @@ versionDevDivergedLatest=§6你正在運行最新版的實驗性 EssentialsX 開 versionDevLatest=§6你正在運行最新的 EssentialsX 開發版本 ! versionError=§4獲取 EssentialsX 版本資訊時發生錯誤 ! 開發版本資訊 : §c{0}§6。 versionErrorPlayer=§6檢查 EssentialsX 版本資訊時發生錯誤 ! -versionFetching=§6正在獲取版本資訊...... +versionFetching=§6正在獲取版本資訊…… versionOutputVaultMissing=§4未安裝 Vault 插件,聊天與權限可能無法正常運作。 -versionOutputFine=§6{0} 版本 : §a{1}。 -versionOutputWarn=§6{0} 版本 : §c{1}。 -versionOutputUnsupported=§d{0} §6版本 : §d{1}。 -versionOutputUnsupportedPlugins=§6你正在運行 §d不被支援的插件§6 ! +versionOutputFine=§6{0} 版本 : §a{1} +versionOutputWarn=§6{0} 版本 : §c{1} +versionOutputUnsupported=§d{0} §6版本 : §d{1} +versionOutputUnsupportedPlugins=§6你正在運行§d不被支援的插件§6 ! versionMismatch=§4版本不匹配 ! 請升級 {0} 到相同版本。 versionMismatchAll=§4版本不匹配 ! 請升級所有 Essentials 系列的插件到相同版本。 versionReleaseLatest=§6你正在運行最新的 EssentialsX 穩定版本 ! versionReleaseNew=§4已有新的 EssentialsX 版本可供下載 : §c{0}§4。 versionReleaseNewLink=§4請在這裡下載 : §c{0} voiceSilenced=§6你已被禁言 ! -voiceSilencedTime=§6你已被 {0} 禁言 ! +voiceSilencedTime=§6你已被禁言 {0} ! voiceSilencedReason=§6你已被禁言 ! 原因 : §c{0} voiceSilencedReasonTime=§6你已被 {0} 禁言 ! 原因 : §c{1} -walking=行走中 +walking=行走 warpCommandDescription=列出所有的地標列表或傳送到指定的位置。 warpCommandUsage=/<command> <pagenumber|warp> [player] warpCommandUsage1=/<command> [page] -warpCommandUsage1Description=列出所有或指定頁數的地標 +warpCommandUsage1Description=列出所有或指定頁數的地標列表 warpCommandUsage2=/<command> <warp> [player] warpCommandUsage2Description=傳送你或指定玩家到指定的地標 -warpDeleteError=§4刪除地標文件時發生錯誤。 +warpDeleteError=§4刪除地標檔案時發生錯誤。 warpInfo=§6地標§c {0}§6資訊 : warpinfoCommandDescription=尋找指定座標的地標資訊。 warpinfoCommandUsage=/<command> <warp> @@ -1364,41 +1386,41 @@ weatherCommandDescription=設定天氣。 weatherCommandUsage=/<command> <storm/sun> [duration] weatherCommandUsage1=/<command> <storm|sun> [duration] weatherCommandUsage1Description=設定天氣狀態持續時間 -warpSet=§6地標 §c{0} §6已設定。 +warpSet=§6已設定地標 §c{0} §6。 warpUsePermission=§4你沒有使用該地標的權限。 weatherInvalidWorld=找不到名為 {0} 的世界 ! -weatherSignStorm=§6天氣 : §c暴風雨 ( 雪 ) §6。 +weatherSignStorm=§6天氣 : §c暴風雨 (雪) §6。 weatherSignSun=§6天氣 : §c晴天§6。 -weatherStorm=§6你將§c {0}§6 的天氣改為 §c暴風雨 ( 雪 ) §6。 -weatherStormFor=§6你將§c {0} §6的天氣的改為 §c暴風雨 ( 雪 ) §c {1} 秒§6。 -weatherSun=§6你將§c {0}§6 的天氣改為 §c晴天§6。 -weatherSunFor=§6你將§c {0} §6的天氣的改為 §c晴天 §c {1} 秒§6。 +weatherStorm=§6你將§c {0} §6的天氣改為 §c暴風雨 (雪) §6。 +weatherStormFor=§6你將§c {0} §6的天氣改為 §c雨雪§6,持續§c {1} 秒§6。 +weatherSun=§6你將§c {0} §6的天氣改為 §c晴天§6。 +weatherSunFor=§6你將§c {0} §6的天氣改為 §c晴天§6,持續§c {1} 秒§6。 west=西 whoisAFK=§6 - 暫時離開 :§r {0} -whoisAFKSince=§6 - 暫時離開 :§r {0} ( 自從 {1} ) +whoisAFKSince=§6 - 暫時離開 :§r {0} (自從 {1}) whoisBanned=§6 - 封禁 :§r {0} whoisCommandDescription=確認暱稱玩家真實名稱。 whoisCommandUsage=/<command> <nickname> whoisCommandUsage1=/<command> <player> whoisCommandUsage1Description=查詢指定玩家基本資訊 -whoisExp=§6 - 經驗值 :§r {0} ( 等級 {1} ) -whoisFly=§6 - 飛行模式 :§r {0} ( {1} ) +whoisExp=§6 - 經驗值 :§r {0} (等級 {1}) +whoisFly=§6 - 飛行模式 :§r {0} ({1}) whoisSpeed=§6 - 速度 :§r {0} whoisGamemode=§6 - 遊戲模式 :§r {0} whoisGeoLocation=§6 - 地理位置 :§r {0} whoisGod=§6 - 上帝模式 :§r {0} -whoisHealth=§6 - 生命 :§r {0}/20 -whoisHunger=§6 - 飢餓值 : §r{0}/20 ( +{1} 飽食度 ) +whoisHealth=§6 - 生命值 :§r {0}/20 +whoisHunger=§6 - 飢餓值 :§r {0}/20 (+{1} 飽食度) whoisIPAddress=§6 - IP 位址 :§r {0} whoisJail=§6 - 監獄 :§r {0} -whoisLocation=§6 - 座標 : §r ( {0}, {1}, {2}, {3} ) +whoisLocation=§6 - 座標 : §r ({0}, {1}, {2}, {3}) whoisMoney=§6 - 金錢 :§r {0} whoisMuted=§6 - 禁言 :§r {0} whoisMutedReason=§6 - 禁言 : §r{0} §6原因 : §c{1} whoisNick=§6 - 暱稱 :§r {0} whoisOp=§6 - OP :§r {0} whoisPlaytime=§6 - 遊玩時間 :§r {0} -whoisTempBanned=§6 - 封禁到期 : §r{0} +whoisTempBanned=§6 - 封禁到期 :§r {0} whoisTop=§6 \=\=\=\=\=\= §c {0} §6的資料\=\=\=\=\=\= whoisUuid=§6 - UUID :§r {0} workbenchCommandDescription=開啟工作台。 @@ -1406,22 +1428,22 @@ workbenchCommandUsage=/<command> worldCommandDescription=切換世界。 worldCommandUsage=/<command> [world] worldCommandUsage1=/<command> -worldCommandUsage1Description=傳送你到地獄或其它世界的對應位置 +worldCommandUsage1Description=傳送你到地獄或主世界的對應位置 worldCommandUsage2=/<command> <world> worldCommandUsage2Description=傳送你到指定世界的對應位置 -worth=§a一組 {0} 價值 §c{1}§6 ( {2} 單位物品,每個價值 {3} ) 。 +worth=§a一組 {0} 價值 §c{1}§6 ({2} 單位物品,每個價值 {3}) 。 worthCommandDescription=計算手中的物品價值。 worthCommandUsage=/<command> <<itemname>|<id>|hand|inventory|blocks> [-][amount] worthCommandUsage1=/<command> <itemname> [amount] -worthCommandUsage1Description=檢查物品欄內所有具有價值( 或者指定數量 ) 的物品 +worthCommandUsage1Description=檢查物品欄內所有具有價值或者指定數量的物品 worthCommandUsage2=/<command> hand [amount] -worthCommandUsage2Description=檢查手中所有具有價值( 或者指定數量 ) 的物品 +worthCommandUsage2Description=檢查手中所有具有價值或者指定數量的物品 worthCommandUsage3=/<command> all worthCommandUsage3Description=檢查物品欄內所有具有價值的物品 worthCommandUsage4=/<command> blocks [amount] -worthCommandUsage4Description=檢查物品欄內所有具有價值( 或者指定數量 ) 的方塊 -worthMeta=§a一組元數據為 {1} 的 {0} 價值 §c{2}§a ( {3} 單位物品,每個價值 {4} ) 。 -worthSet=§6價格已設定 +worthCommandUsage4Description=檢查物品欄內所有具有價值或者指定數量的方塊 +worthMeta=§a一組元數據為 {1} 的 {0} 價值 §c{2}§a ({3} 單位物品,每個價值 {4})。 +worthSet=§6已設定價格 year=年 years=年 youAreHealed=§6你已被治療。 From 9d3bf337e1141d4dc722ad41d6b96fd64fdacf69 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 28 Jun 2021 15:19:02 -0400 Subject: [PATCH 11/29] Improve itemlore and itemname tab completion (#4280) - Improve tab completion for itemname and itemlore - Improve air type matching - Fix incorrect /itemlore usage messages --- .../java/com/earth2me/essentials/Kit.java | 3 +- .../essentials/commands/Commanditemlore.java | 32 ++++++++++++++++++- .../essentials/commands/Commanditemname.java | 21 ++++++++++-- .../essentials/utils/MaterialUtil.java | 4 +++ .../src/main/resources/messages.properties | 6 ++-- 5 files changed, 57 insertions(+), 9 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Kit.java b/Essentials/src/main/java/com/earth2me/essentials/Kit.java index fc4d3ccad4e..0105a2e4fa7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Kit.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Kit.java @@ -9,7 +9,6 @@ import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.MaterialUtil; import com.earth2me.essentials.utils.NumberUtil; -import com.earth2me.essentials.utils.VersionUtil; import net.ess3.api.IEssentials; import net.ess3.api.events.KitClaimEvent; import org.bukkit.Bukkit; @@ -292,6 +291,6 @@ public boolean expandItems(final User user, final List<String> items) throws Exc } private boolean isEmptyStack(ItemStack stack) { - return stack == null || stack.getType() == Material.AIR || (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_14_4_R01) && stack.getType().isAir()); + return stack == null || MaterialUtil.isAir(stack.getType()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemlore.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemlore.java index 598fc8ea8b4..3ee0a4eb8b5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemlore.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemlore.java @@ -2,6 +2,7 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.utils.FormatUtil; +import com.earth2me.essentials.utils.MaterialUtil; import com.earth2me.essentials.utils.NumberUtil; import com.google.common.collect.Lists; import org.bukkit.Server; @@ -11,6 +12,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import static com.earth2me.essentials.I18n.tl; @@ -23,7 +25,7 @@ public Commanditemlore() { @Override protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { final ItemStack item = user.getBase().getItemInHand(); - if (item.getType().name().contains("AIR")) { + if (MaterialUtil.isAir(item.getType())) { throw new Exception(tl("itemloreInvalidItem")); } @@ -68,6 +70,34 @@ protected void run(final Server server, final User user, final String commandLab protected List<String> getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (args.length == 1) { return Lists.newArrayList("add", "set", "clear"); + } else if (args.length == 2) { + switch (args[0].toLowerCase(Locale.ENGLISH)) { + case "set": { + final ItemStack item = user.getBase().getItemInHand(); + if (!MaterialUtil.isAir(item.getType()) && item.hasItemMeta() && item.getItemMeta().hasLore()) { + final List<String> lineNumbers = new ArrayList<>(); + for (int i = 1; i <= item.getItemMeta().getLore().size(); i++) { + lineNumbers.add(String.valueOf(i)); + } + return lineNumbers; + } + return Collections.emptyList(); + } + case "clear": + case "add": + default: { + return Collections.emptyList(); + } + } + } else if (args.length == 3) { + if (args[0].equalsIgnoreCase("set") && NumberUtil.isInt(args[1])) { + final int i = Integer.parseInt(args[1]); + final ItemStack item = user.getBase().getItemInHand(); + if (!MaterialUtil.isAir(item.getType()) && item.hasItemMeta() && item.getItemMeta().hasLore() && item.getItemMeta().getLore().size() >= i) { + return Lists.newArrayList(FormatUtil.unformatString(user, "essentials.itemlore", item.getItemMeta().getLore().get(i - 1))); + } + } + return Collections.emptyList(); } else { return Collections.emptyList(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemname.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemname.java index cae0f9338bc..d2fd659603d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemname.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commanditemname.java @@ -1,13 +1,17 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.TriState; import com.earth2me.essentials.utils.FormatUtil; -import org.bukkit.Material; +import com.earth2me.essentials.utils.MaterialUtil; +import com.earth2me.essentials.utils.TriState; +import com.google.common.collect.Lists; import org.bukkit.Server; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import java.util.Collections; +import java.util.List; + import static com.earth2me.essentials.I18n.tl; public class Commanditemname extends EssentialsCommand { @@ -20,7 +24,7 @@ public Commanditemname() { @Override protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { final ItemStack item = user.getBase().getItemInHand(); - if (item.getType() == Material.AIR) { + if (MaterialUtil.isAir(item.getType())) { user.sendMessage(tl("itemnameInvalidItem")); return; } @@ -42,4 +46,15 @@ protected void run(final Server server, final User user, final String commandLab item.setItemMeta(im); user.sendMessage(name == null ? tl("itemnameClear") : tl("itemnameSuccess", name)); } + + @Override + protected List<String> getTabCompleteOptions(Server server, User user, String commandLabel, String[] args) { + if (args.length == 1) { + final ItemStack item = user.getBase().getItemInHand(); + if (!MaterialUtil.isAir(item.getType()) && item.hasItemMeta() && item.getItemMeta().hasDisplayName()) { + return Lists.newArrayList(FormatUtil.unformatString(user, "essentials.itemname", item.getItemMeta().getDisplayName())); + } + } + return Collections.emptyList(); + } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java index 7f1e37aeccf..b418d568bb8 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/MaterialUtil.java @@ -169,6 +169,10 @@ public static boolean isSkull(final Material material) { return isPlayerHead(material, -1) || isMobHead(material, -1); } + public static boolean isAir(final Material material) { + return material == Material.AIR || (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_14_4_R01) && material.isAir()); + } + public static Material convertFromLegacy(final int id, final byte damage) { for (final Material material : EnumSet.allOf(Material.class)) { if (material.getId() == id) { diff --git a/Essentials/src/main/resources/messages.properties b/Essentials/src/main/resources/messages.properties index 2dba33cb876..ec7159d613f 100644 --- a/Essentials/src/main/resources/messages.properties +++ b/Essentials/src/main/resources/messages.properties @@ -502,11 +502,11 @@ itemId=\u00a76ID\:\u00a7c {0} itemloreClear=\u00a76You have cleared this item''s lore. itemloreCommandDescription=Edit the lore of an item. itemloreCommandUsage=/<command> <add/set/clear> [text/line] [text] -itemloreCommandUsage1=/<command> <add> [text] +itemloreCommandUsage1=/<command> add [text] itemloreCommandUsage1Description=Adds the given text to the end of the held item's lore -itemloreCommandUsage2=/<command> <set> <line number> <text> +itemloreCommandUsage2=/<command> set <line number> <text> itemloreCommandUsage2Description=Sets the specified line of the held item's lore to the given text -itemloreCommandUsage3=/<command> <clear> +itemloreCommandUsage3=/<command> clear itemloreCommandUsage3Description=Clears the held item's lore itemloreInvalidItem=\u00a74You need to hold an item to edit its lore. itemloreNoLine=\u00a74Your held item does not have lore text on line \u00a7c{0}\u00a74. From 0861427bf3f4fc206a88f7d0e6bd8909408ef035 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 1 Jul 2021 09:43:35 -0400 Subject: [PATCH 12/29] Discord Module (#3844) Co-authored-by: MD <1917406+mdcfe@users.noreply.github.com> Co-authored-by: pop4959 <pop4959@gmail.com> Co-authored-by: Riley Park <riley.park@meino.net> Co-authored-by: Jason <11360596+jpenilla@users.noreply.github.com> --- .checkstyle/suppressions.xml | 2 +- .github/workflows/build-master.yml | 1 + .../com/earth2me/essentials/Essentials.java | 91 ++++ .../essentials/EssentialsPlayerListener.java | 12 +- .../com/earth2me/essentials/IEssentials.java | 8 + .../com/earth2me/essentials/PlayerList.java | 86 ++++ .../java/com/earth2me/essentials/User.java | 6 +- .../commands/Commandessentials.java | 4 +- .../essentials/commands/Commandlist.java | 85 +--- .../commands/EssentialsCommand.java | 85 +--- .../essentials/config/ConfigurateUtil.java | 7 + .../essentials/utils/DownsampleUtil.java | 142 ++++++ .../earth2me/essentials/utils/FormatUtil.java | 9 + .../essentials/utils/VersionUtil.java | 4 + .../api/v2/events/AsyncUserDataLoadEvent.java | 14 +- .../src/main/resources/messages.properties | 22 + EssentialsDiscord/README.md | 462 ++++++++++++++++++ EssentialsDiscord/build.gradle | 58 +++ .../discord/DiscordChatMessageEvent.java | 72 +++ .../events/discord/DiscordMessageEvent.java | 157 ++++++ .../v2/services/discord/DiscordService.java | 44 ++ .../services/discord/InteractionChannel.java | 18 + .../services/discord/InteractionCommand.java | 46 ++ .../discord/InteractionCommandArgument.java | 57 +++ .../InteractionCommandArgumentType.java | 25 + .../discord/InteractionController.java | 20 + .../v2/services/discord/InteractionEvent.java | 59 +++ .../discord/InteractionException.java | 10 + .../services/discord/InteractionMember.java | 67 +++ .../api/v2/services/discord/MessageType.java | 73 +++ .../api/v2/services/discord/Unsafe.java | 15 + .../essentialsx/discord/DiscordSettings.java | 354 ++++++++++++++ .../discord/EssentialsDiscord.java | 86 ++++ .../discord/JDADiscordService.java | 412 ++++++++++++++++ .../interactions/InteractionChannelImpl.java | 26 + .../interactions/InteractionCommandImpl.java | 54 ++ .../InteractionControllerImpl.java | 161 ++++++ .../interactions/InteractionEventImpl.java | 79 +++ .../interactions/InteractionMemberImpl.java | 72 +++ .../interactions/commands/ExecuteCommand.java | 26 + .../interactions/commands/ListCommand.java | 51 ++ .../interactions/commands/MessageCommand.java | 59 +++ .../discord/listeners/BukkitListener.java | 191 ++++++++ .../listeners/DiscordCommandDispatcher.java | 31 ++ .../discord/listeners/DiscordListener.java | 101 ++++ .../discord/util/ConsoleInjector.java | 89 ++++ .../discord/util/DiscordCommandSender.java | 46 ++ .../discord/util/DiscordMessageRecipient.java | 75 +++ .../essentialsx/discord/util/DiscordUtil.java | 168 +++++++ .../essentialsx/discord/util/MessageUtil.java | 31 ++ .../src/main/resources/config.yml | 299 ++++++++++++ .../src/main/resources/plugin.yml | 10 + .../providers/BukkitSenderProvider.java | 150 ++++++ .../providers/PaperCommandSender.java | 79 +++ settings.gradle.kts | 7 + 55 files changed, 4247 insertions(+), 171 deletions(-) create mode 100644 Essentials/src/main/java/com/earth2me/essentials/utils/DownsampleUtil.java create mode 100644 EssentialsDiscord/README.md create mode 100644 EssentialsDiscord/build.gradle create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/events/discord/DiscordChatMessageEvent.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/events/discord/DiscordMessageEvent.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/DiscordService.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionChannel.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommand.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommandArgument.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommandArgumentType.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionController.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionException.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionMember.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/Unsafe.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/EssentialsDiscord.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionChannelImpl.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionCommandImpl.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionMemberImpl.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ListCommand.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordCommandDispatcher.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordListener.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/util/ConsoleInjector.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordCommandSender.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordMessageRecipient.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/util/MessageUtil.java create mode 100644 EssentialsDiscord/src/main/resources/config.yml create mode 100644 EssentialsDiscord/src/main/resources/plugin.yml create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSenderProvider.java create mode 100644 providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperCommandSender.java diff --git a/.checkstyle/suppressions.xml b/.checkstyle/suppressions.xml index b59cd7962c2..4e3e377daf1 100644 --- a/.checkstyle/suppressions.xml +++ b/.checkstyle/suppressions.xml @@ -3,5 +3,5 @@ <suppressions> <suppress files=".*[\\/]test[\\/]java[\\/].*" checks="RequireExplicitVisibilityModifier"/> <!-- TODO: don't suppress I-prefixed API interfaces under com.earth2me.essentials --> - <suppress files="(com[\\/]earth2me[\\/]essentials[\\/]|net[\\/]ess3[\\/])(?:[^\\/]+$|(?!api)[^\\/]+[\\/])" checks="MissingJavadoc(Method|Type)"/> + <suppress files="(com[\\/]earth2me[\\/]essentials[\\/]|net[\\/]ess3[\\/]|net[\\/]essentialsx[\\/])(?:[^\\/]+$|(?!api)[^\\/]+[\\/])" checks="MissingJavadoc(Method|Type)"/> </suppressions> diff --git a/.github/workflows/build-master.yml b/.github/workflows/build-master.yml index d5b1b1309d6..e503a9763ab 100644 --- a/.github/workflows/build-master.yml +++ b/.github/workflows/build-master.yml @@ -58,6 +58,7 @@ jobs: mv Essentials/build/docs/javadoc/ javadocs/ cp -r EssentialsAntiBuild/build/docs/javadoc/ javadocs/EssentialsAntiBuild/ cp -r EssentialsChat/build/docs/javadoc/ javadocs/EssentialsChat/ + cp -r EssentialsDiscord/build/docs/javadoc/ javadocs/EssentialsDiscord/ cp -r EssentialsGeoIP/build/docs/javadoc/ javadocs/EssentialsGeoIP/ cp -r EssentialsProtect/build/docs/javadoc/ javadocs/EssentialsProtect/ cp -r EssentialsSpawn/build/docs/javadoc/ javadocs/EssentialsSpawn/ diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index d3e198051bb..d659584f8db 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -21,6 +21,7 @@ import com.earth2me.essentials.commands.IEssentialsCommand; import com.earth2me.essentials.commands.NoChargeException; import com.earth2me.essentials.commands.NotEnoughArgumentsException; +import com.earth2me.essentials.commands.PlayerNotFoundException; import com.earth2me.essentials.commands.QuietAbortException; import com.earth2me.essentials.economy.EconomyLayers; import com.earth2me.essentials.economy.vault.VaultEconomyProvider; @@ -38,6 +39,7 @@ import com.earth2me.essentials.textreader.KeywordReplacer; import com.earth2me.essentials.textreader.SimpleTextInput; import com.earth2me.essentials.updatecheck.UpdateChecker; +import com.earth2me.essentials.utils.FormatUtil; import com.earth2me.essentials.utils.VersionUtil; import io.papermc.lib.PaperLib; import net.ess3.api.Economy; @@ -118,6 +120,7 @@ import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -895,6 +898,94 @@ public User getOfflineUser(final String name) { return user; } + @Override + public User matchUser(final Server server, final User sourceUser, final String searchTerm, final Boolean getHidden, final boolean getOffline) throws PlayerNotFoundException { + final User user; + Player exPlayer; + + try { + exPlayer = server.getPlayer(UUID.fromString(searchTerm)); + } catch (final IllegalArgumentException ex) { + if (getOffline) { + exPlayer = server.getPlayerExact(searchTerm); + } else { + exPlayer = server.getPlayer(searchTerm); + } + } + + if (exPlayer != null) { + user = getUser(exPlayer); + } else { + user = getUser(searchTerm); + } + + if (user != null) { + if (!getOffline && !user.getBase().isOnline()) { + throw new PlayerNotFoundException(); + } + + if (getHidden || canInteractWith(sourceUser, user)) { + return user; + } else { // not looking for hidden and cannot interact (i.e is hidden) + if (getOffline && user.getName().equalsIgnoreCase(searchTerm)) { // if looking for offline and got an exact match + return user; + } + } + throw new PlayerNotFoundException(); + } + final List<Player> matches = server.matchPlayer(searchTerm); + + if (matches.isEmpty()) { + final String matchText = searchTerm.toLowerCase(Locale.ENGLISH); + for (final User userMatch : getOnlineUsers()) { + if (getHidden || canInteractWith(sourceUser, userMatch)) { + final String displayName = FormatUtil.stripFormat(userMatch.getDisplayName()).toLowerCase(Locale.ENGLISH); + if (displayName.contains(matchText)) { + return userMatch; + } + } + } + } else { + for (final Player player : matches) { + final User userMatch = getUser(player); + if (userMatch.getDisplayName().startsWith(searchTerm) && (getHidden || canInteractWith(sourceUser, userMatch))) { + return userMatch; + } + } + final User userMatch = getUser(matches.get(0)); + if (getHidden || canInteractWith(sourceUser, userMatch)) { + return userMatch; + } + } + throw new PlayerNotFoundException(); + } + + @Override + public boolean canInteractWith(final CommandSource interactor, final User interactee) { + if (interactor == null) { + return !interactee.isHidden(); + } + + if (interactor.isPlayer()) { + return canInteractWith(getUser(interactor.getPlayer()), interactee); + } + + return true; // console + } + + @Override + public boolean canInteractWith(final User interactor, final User interactee) { + if (interactor == null) { + return !interactee.isHidden(); + } + + if (interactor.equals(interactee)) { + return true; + } + + return interactor.getBase().canSee(interactee.getBase()); + } + //This will create a new user if there is not a match. @Override public User getUser(final Player base) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 160bc5902e3..8499f4d0faf 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -310,8 +310,6 @@ public void run() { user.setDisplayNick(); updateCompass(user); - ess.runTaskAsynchronously(() -> ess.getServer().getPluginManager().callEvent(new AsyncUserDataLoadEvent(user))); - if (!ess.getVanishedPlayersNew().isEmpty() && !user.isAuthorized("essentials.vanish.see")) { for (final String p : ess.getVanishedPlayersNew()) { final Player toVanish = ess.getServer().getPlayerExact(p); @@ -328,12 +326,14 @@ public void run() { user.getBase().setSleepingIgnored(true); } + final String effectiveMessage; if (ess.getSettings().allowSilentJoinQuit() && (user.isAuthorized("essentials.silentjoin") || user.isAuthorized("essentials.silentjoin.vanish"))) { if (user.isAuthorized("essentials.silentjoin.vanish")) { user.setVanished(true); } + effectiveMessage = null; } else if (message == null || hideJoinQuitMessages()) { - //NOOP + effectiveMessage = null; } else if (ess.getSettings().isCustomJoinMessage()) { final String msg = ess.getSettings().getCustomJoinMessage() .replace("{PLAYER}", player.getDisplayName()).replace("{USERNAME}", player.getName()) @@ -345,10 +345,16 @@ public void run() { if (!msg.isEmpty()) { ess.getServer().broadcastMessage(msg); } + effectiveMessage = msg.isEmpty() ? null : msg; } else if (ess.getSettings().allowSilentJoinQuit()) { ess.getServer().broadcastMessage(message); + effectiveMessage = message; + } else { + effectiveMessage = message; } + ess.runTaskAsynchronously(() -> ess.getServer().getPluginManager().callEvent(new AsyncUserDataLoadEvent(user, effectiveMessage))); + final int motdDelay = ess.getSettings().getMotdDelay() / 50; final DelayMotdTask motdTask = new DelayMotdTask(user); if (motdDelay > 0) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java index a2234298fc4..f4f532930cc 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.api.IJails; import com.earth2me.essentials.api.IWarps; import com.earth2me.essentials.commands.IEssentialsCommand; +import com.earth2me.essentials.commands.PlayerNotFoundException; import com.earth2me.essentials.perm.PermissionsHandler; import com.earth2me.essentials.updatecheck.UpdateChecker; import net.ess3.provider.ContainerProvider; @@ -17,6 +18,7 @@ import net.ess3.provider.SpawnerItemProvider; import net.ess3.provider.SyncCommandsProvider; import net.essentialsx.api.v2.services.BalanceTop; +import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -52,6 +54,12 @@ public interface IEssentials extends Plugin { User getUser(Player base); + User matchUser(Server server, User sourceUser, String searchTerm, Boolean getHidden, boolean getOffline) throws PlayerNotFoundException; + + boolean canInteractWith(CommandSource interactor, User interactee); + + boolean canInteractWith(User interactor, User interactee); + I18n getI18n(); User getOfflineUser(String name); diff --git a/Essentials/src/main/java/com/earth2me/essentials/PlayerList.java b/Essentials/src/main/java/com/earth2me/essentials/PlayerList.java index 91b8cc59b91..5a57a14fa03 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/PlayerList.java +++ b/Essentials/src/main/java/com/earth2me/essentials/PlayerList.java @@ -1,10 +1,12 @@ package com.earth2me.essentials; import com.earth2me.essentials.utils.FormatUtil; +import com.earth2me.essentials.utils.NumberUtil; import org.bukkit.ChatColor; import org.bukkit.Server; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -127,4 +129,88 @@ public static String outputFormat(final String group, final String message) { return tl("listGroupTag", FormatUtil.replaceFormat(group)) + message; } + + public static List<String> prepareGroupedList(final IEssentials ess, final String commandLabel, final Map<String, List<User>> playerList) { + final List<String> output = new ArrayList<>(); + + final Set<String> configGroups = ess.getSettings().getListGroupConfig().keySet(); + final List<String> asterisk = new ArrayList<>(); + + // Loop through the custom defined groups and display them + for (final String oConfigGroup : configGroups) { + final String groupValue = ess.getSettings().getListGroupConfig().get(oConfigGroup).toString().trim(); + final String configGroup = oConfigGroup.toLowerCase(); + + // If the group value is an asterisk, then skip it, and handle it later + if (groupValue.equals("*")) { + asterisk.add(oConfigGroup); + continue; + } + + // If the group value is hidden, we don't need to display it + if (groupValue.equalsIgnoreCase("hidden")) { + playerList.remove(configGroup); + continue; + } + + final List<User> outputUserList; + final List<User> matchedList = playerList.get(configGroup); + + // If the group value is an int, then we might need to truncate it + if (NumberUtil.isInt(groupValue)) { + if (matchedList != null && !matchedList.isEmpty()) { + playerList.remove(configGroup); + outputUserList = new ArrayList<>(matchedList); + final int limit = Integer.parseInt(groupValue); + if (matchedList.size() > limit) { + output.add(outputFormat(oConfigGroup, tl("groupNumber", matchedList.size(), commandLabel, FormatUtil.stripFormat(configGroup)))); + } else { + output.add(outputFormat(oConfigGroup, listUsers(ess, outputUserList, ", "))); + } + continue; + } + } + + outputUserList = getMergedList(ess, playerList, configGroup); + + // If we have no users, than we don't need to continue parsing this group + if (outputUserList.isEmpty()) { + continue; + } + + output.add(outputFormat(oConfigGroup, listUsers(ess, outputUserList, ", "))); + } + + final Set<String> var = playerList.keySet(); + String[] onlineGroups = var.toArray(new String[0]); + Arrays.sort(onlineGroups, String.CASE_INSENSITIVE_ORDER); + + // If we have an asterisk group, then merge all remaining groups + if (!asterisk.isEmpty()) { + final List<User> asteriskUsers = new ArrayList<>(); + for (final String onlineGroup : onlineGroups) { + asteriskUsers.addAll(playerList.get(onlineGroup)); + } + for (final String key : asterisk) { + playerList.put(key, asteriskUsers); + } + onlineGroups = asterisk.toArray(new String[0]); + } + + // If we have any groups remaining after the custom groups loop through and display them + for (final String onlineGroup : onlineGroups) { + final List<User> users = playerList.get(onlineGroup); + String groupName = asterisk.isEmpty() ? users.get(0).getGroup() : onlineGroup; + + if (ess.getPermissionsHandler().getName().equals("ConfigPermissions")) { + groupName = tl("connectedPlayers"); + } + if (users == null || users.isEmpty()) { + continue; + } + + output.add(outputFormat(groupName, listUsers(ess, users, ", "))); + } + return output; + } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/User.java b/Essentials/src/main/java/com/earth2me/essentials/User.java index ee59394ebe5..6242e7384ae 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/User.java +++ b/Essentials/src/main/java/com/earth2me/essentials/User.java @@ -115,7 +115,11 @@ public boolean isAuthorized(final String node) { @Override public boolean isPermissionSet(final String node) { - return isPermSetCheck(node); + final boolean result = isPermSetCheck(node); + if (ess.getSettings().isDebug()) { + ess.getLogger().log(Level.INFO, "checking if " + base.getName() + " has " + node + " (set-explicit) - " + result); + } + return result; } /** diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java index 388a852992e..c83147bf4f4 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java @@ -58,11 +58,13 @@ public class Commandessentials extends EssentialsCommand { "UltraPermissions", "PermissionsEx", // permissions (unsupported) "GroupManager", // permissions (unsupported) - "bPermissions" // permissions (unsupported) + "bPermissions", // permissions (unsupported) + "DiscordSRV" // potential for issues if EssentialsXDiscord is installed ); private static final List<String> officialPlugins = Arrays.asList( "EssentialsAntiBuild", "EssentialsChat", + "EssentialsDiscord", "EssentialsGeoIP", "EssentialsProtect", "EssentialsSpawn", diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlist.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlist.java index e997d47622f..82af11d7c2c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlist.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandlist.java @@ -3,18 +3,12 @@ import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.PlayerList; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.FormatUtil; -import com.earth2me.essentials.utils.NumberUtil; import org.bukkit.Server; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Set; - -import static com.earth2me.essentials.I18n.tl; public class Commandlist extends EssentialsCommand { public Commandlist() { @@ -41,83 +35,8 @@ public void run(final Server server, final CommandSource sender, final String co // Output the standard /list output, when no group is specified private void sendGroupedList(final CommandSource sender, final String commandLabel, final Map<String, List<User>> playerList) { - final Set<String> configGroups = ess.getSettings().getListGroupConfig().keySet(); - final List<String> asterisk = new ArrayList<>(); - - // Loop through the custom defined groups and display them - for (final String oConfigGroup : configGroups) { - final String groupValue = ess.getSettings().getListGroupConfig().get(oConfigGroup).toString().trim(); - final String configGroup = oConfigGroup.toLowerCase(); - - // If the group value is an asterisk, then skip it, and handle it later - if (groupValue.equals("*")) { - asterisk.add(oConfigGroup); - continue; - } - - // If the group value is hidden, we don't need to display it - if (groupValue.equalsIgnoreCase("hidden")) { - playerList.remove(configGroup); - continue; - } - - final List<User> outputUserList; - final List<User> matchedList = playerList.get(configGroup); - - // If the group value is an int, then we might need to truncate it - if (NumberUtil.isInt(groupValue)) { - if (matchedList != null && !matchedList.isEmpty()) { - playerList.remove(configGroup); - outputUserList = new ArrayList<>(matchedList); - final int limit = Integer.parseInt(groupValue); - if (matchedList.size() > limit) { - sender.sendMessage(PlayerList.outputFormat(oConfigGroup, tl("groupNumber", matchedList.size(), commandLabel, FormatUtil.stripFormat(configGroup)))); - } else { - sender.sendMessage(PlayerList.outputFormat(oConfigGroup, PlayerList.listUsers(ess, outputUserList, ", "))); - } - continue; - } - } - - outputUserList = PlayerList.getMergedList(ess, playerList, configGroup); - - // If we have no users, than we don't need to continue parsing this group - if (outputUserList.isEmpty()) { - continue; - } - - sender.sendMessage(PlayerList.outputFormat(oConfigGroup, PlayerList.listUsers(ess, outputUserList, ", "))); - } - - final Set<String> var = playerList.keySet(); - String[] onlineGroups = var.toArray(new String[0]); - Arrays.sort(onlineGroups, String.CASE_INSENSITIVE_ORDER); - - // If we have an asterisk group, then merge all remaining groups - if (!asterisk.isEmpty()) { - final List<User> asteriskUsers = new ArrayList<>(); - for (final String onlineGroup : onlineGroups) { - asteriskUsers.addAll(playerList.get(onlineGroup)); - } - for (final String key : asterisk) { - playerList.put(key, asteriskUsers); - } - onlineGroups = asterisk.toArray(new String[0]); - } - - // If we have any groups remaining after the custom groups loop through and display them - for (final String onlineGroup : onlineGroups) { - final List<User> users = playerList.get(onlineGroup); - String groupName = asterisk.isEmpty() ? users.get(0).getGroup() : onlineGroup; - - if (ess.getPermissionsHandler().getName().equals("ConfigPermissions")) { - groupName = tl("connectedPlayers"); - } - if (users == null || users.isEmpty()) { - continue; - } - - sender.sendMessage(PlayerList.outputFormat(groupName, PlayerList.listUsers(ess, users, ", "))); + for (final String str : PlayerList.prepareGroupedList(ess, commandLabel, playerList)) { + sender.sendMessage(str); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java index 50afb812ff7..b40dd8da6ae 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java @@ -4,7 +4,6 @@ import com.earth2me.essentials.IEssentialsModule; import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.FormatUtil; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -14,7 +13,6 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.PluginIdentifiableCommand; -import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.util.StringUtil; @@ -23,10 +21,8 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; -import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.logging.Level; import java.util.logging.Logger; @@ -94,16 +90,8 @@ public static String getFinalArg(final String[] args, final int start) { return bldr.toString(); } - private static boolean canInteractWith(final User interactor, final User interactee) { - if (interactor == null) { - return !interactee.isHidden(); - } - - if (interactor.equals(interactee)) { - return true; - } - - return interactor.getBase().canSee(interactee.getBase()); + private boolean canInteractWith(final User interactor, final User interactee) { + return ess.canInteractWith(interactor, interactee); } @Override @@ -165,64 +153,7 @@ protected User getPlayer(final Server server, final String searchTerm, final boo } private User getPlayer(final Server server, final User sourceUser, final String searchTerm, final boolean getHidden, final boolean getOffline) throws PlayerNotFoundException { - final User user; - Player exPlayer; - - try { - exPlayer = server.getPlayer(UUID.fromString(searchTerm)); - } catch (final IllegalArgumentException ex) { - if (getOffline) { - exPlayer = server.getPlayerExact(searchTerm); - } else { - exPlayer = server.getPlayer(searchTerm); - } - } - - if (exPlayer != null) { - user = ess.getUser(exPlayer); - } else { - user = ess.getUser(searchTerm); - } - - if (user != null) { - if (!getOffline && !user.getBase().isOnline()) { - throw new PlayerNotFoundException(); - } - - if (getHidden || canInteractWith(sourceUser, user)) { - return user; - } else { // not looking for hidden and cannot interact (i.e is hidden) - if (getOffline && user.getName().equalsIgnoreCase(searchTerm)) { // if looking for offline and got an exact match - return user; - } - } - throw new PlayerNotFoundException(); - } - final List<Player> matches = server.matchPlayer(searchTerm); - - if (matches.isEmpty()) { - final String matchText = searchTerm.toLowerCase(Locale.ENGLISH); - for (final User userMatch : ess.getOnlineUsers()) { - if (getHidden || canInteractWith(sourceUser, userMatch)) { - final String displayName = FormatUtil.stripFormat(userMatch.getDisplayName()).toLowerCase(Locale.ENGLISH); - if (displayName.contains(matchText)) { - return userMatch; - } - } - } - } else { - for (final Player player : matches) { - final User userMatch = ess.getUser(player); - if (userMatch.getDisplayName().startsWith(searchTerm) && (getHidden || canInteractWith(sourceUser, userMatch))) { - return userMatch; - } - } - final User userMatch = ess.getUser(matches.get(0)); - if (getHidden || canInteractWith(sourceUser, userMatch)) { - return userMatch; - } - } - throw new PlayerNotFoundException(); + return ess.matchUser(server, sourceUser, searchTerm, getHidden, getOffline); } @Override @@ -284,15 +215,7 @@ protected List<String> getTabCompleteOptions(final Server server, final CommandS } boolean canInteractWith(final CommandSource interactor, final User interactee) { - if (interactor == null) { - return !interactee.isHidden(); - } - - if (interactor.isPlayer()) { - return canInteractWith(ess.getUser(interactor.getPlayer()), interactee); - } - - return true; // console + return ess.canInteractWith(interactor, interactee); } /** diff --git a/Essentials/src/main/java/com/earth2me/essentials/config/ConfigurateUtil.java b/Essentials/src/main/java/com/earth2me/essentials/config/ConfigurateUtil.java index fccaf0ffbed..1411d8fa529 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/config/ConfigurateUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/config/ConfigurateUtil.java @@ -45,6 +45,13 @@ public static Map<String, CommentedConfigurationNode> getMap(final CommentedConf return map; } + public static Map<String, Object> getRawMap(final EssentialsConfiguration config, final String key) { + if (config == null || key == null) { + return Collections.emptyMap(); + } + return getRawMap(config.getSection(key)); + } + public static Map<String, Object> getRawMap(final CommentedConfigurationNode node) { if (node == null || !node.isMap()) { return Collections.emptyMap(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/DownsampleUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/DownsampleUtil.java new file mode 100644 index 00000000000..1e0fc2d6f64 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/DownsampleUtil.java @@ -0,0 +1,142 @@ +package com.earth2me.essentials.utils; + +/** + * Most of this code was "borrowed" from KyoriPowered/Adventure and is subject to their MIT license; + * + * MIT License + * + * Copyright (c) 2017-2020 KyoriPowered + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +public final class DownsampleUtil { + private final static NamedTextColor[] VALUES = new NamedTextColor[] {new NamedTextColor("0", 0x000000), new NamedTextColor("1", 0x0000aa), new NamedTextColor("2", 0x00aa00), new NamedTextColor("3", 0x00aaaa), new NamedTextColor("4", 0xaa0000), new NamedTextColor("5", 0xaa00aa), new NamedTextColor("6", 0xffaa00), new NamedTextColor("7", 0xaaaaaa), new NamedTextColor("8", 0x555555), new NamedTextColor("9", 0x5555ff), new NamedTextColor("a", 0x55ff55), new NamedTextColor("b", 0x55ffff), new NamedTextColor("c", 0xff5555), new NamedTextColor("d", 0xff55ff), new NamedTextColor("e", 0xffff55), new NamedTextColor("f", 0xffffff)}; + + private DownsampleUtil() { + } + + public static String nearestTo(final int rgb) { + final HSVLike any = HSVLike.fromRGB((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff); + + float matchedDistance = Float.MAX_VALUE; + NamedTextColor match = VALUES[0]; + for (final NamedTextColor potential : VALUES) { + final float distance = distance(any, potential.hsv); + if (distance < matchedDistance) { + match = potential; + matchedDistance = distance; + } + if (distance == 0) { + break; + } + } + return match.code; + } + + private static float distance(final HSVLike self, final HSVLike other) { + final float hueDistance = 3 * Math.abs(self.h() - other.h()); + final float saturationDiff = self.s() - other.s(); + final float valueDiff = self.v() - other.v(); + return hueDistance * hueDistance + saturationDiff * saturationDiff + valueDiff * valueDiff; + } + + private static final class NamedTextColor { + private final String code; + private final int value; + private final HSVLike hsv; + + private NamedTextColor(final String code, final int value) { + this.code = code; + this.value = value; + this.hsv = HSVLike.fromRGB(this.red(), this.green(), this.blue()); + } + + private int red() { + return (value >> 16) & 0xff; + } + + private int green() { + return (value >> 8) & 0xff; + } + + private int blue() { + return value & 0xff; + } + } + + private static final class HSVLike { + private final float h; + private final float s; + private final float v; + + private HSVLike(float h, float s, float v) { + this.h = h; + this.s = s; + this.v = v; + } + + public float h() { + return this.h; + } + + public float s() { + return this.s; + } + + public float v() { + return this.v; + } + + static HSVLike fromRGB(final int red, final int green, final int blue) { + final float r = red / 255.0f; + final float g = green / 255.0f; + final float b = blue / 255.0f; + + final float min = Math.min(r, Math.min(g, b)); + final float max = Math.max(r, Math.max(g, b)); // v + final float delta = max - min; + + final float s; + if(max != 0) { + s = delta / max; // s + } else { + // r = g = b = 0 + s = 0; + } + if(s == 0) { // s = 0, h is undefined + return new HSVLike(0, s, max); + } + + float h; + if(r == max) { + h = (g - b) / delta; // between yellow & magenta + } else if(g == max) { + h = 2 + (b - r) / delta; // between cyan & yellow + } else { + h = 4 + (r - g) / delta; // between magenta & cyan + } + h *= 60; // degrees + if(h < 0) { + h += 360; + } + + return new HSVLike(h / 360.0f, s, max); + } + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java index 09d7c1a8271..6ce0b7f29b2 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java @@ -25,6 +25,8 @@ public final class FormatUtil { //Used to prepare xmpp output private static final Pattern LOGCOLOR_PATTERN = Pattern.compile("\\x1B\\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]"); private static final Pattern URL_PATTERN = Pattern.compile("((?:(?:https?)://)?[\\w-_\\.]{2,})\\.([a-zA-Z]{2,3}(?:/\\S+)?)"); + //Used to strip ANSI control codes from console + private static final Pattern ANSI_CONTROL_PATTERN = Pattern.compile("\u001B(?:\\[0?m|\\[38;2(?:;\\d{1,3}){3}m|\\[([0-9]{1,2}[;m]?){3})"); private FormatUtil() { } @@ -45,6 +47,13 @@ public static String stripEssentialsFormat(final String input) { return stripColor(input, REPLACE_ALL_PATTERN); } + public static String stripAnsi(final String input) { + if (input == null) { + return null; + } + return stripColor(input, ANSI_CONTROL_PATTERN); + } + //This is the general permission sensitive message format function, checks for urls. public static String formatMessage(final IUser user, final String permBase, final String input) { if (input == null) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java index 83477f4811a..164344e9fbc 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/VersionUtil.java @@ -83,6 +83,10 @@ public final class VersionUtil { private VersionUtil() { } + public static boolean isPaper() { + return PaperLib.isPaper(); + } + public static BukkitVersion getServerBukkitVersion() { if (serverVersion == null) { serverVersion = BukkitVersion.fromString(Bukkit.getServer().getBukkitVersion()); diff --git a/Essentials/src/main/java/net/essentialsx/api/v2/events/AsyncUserDataLoadEvent.java b/Essentials/src/main/java/net/essentialsx/api/v2/events/AsyncUserDataLoadEvent.java index 727f57d974c..93882b79c35 100644 --- a/Essentials/src/main/java/net/essentialsx/api/v2/events/AsyncUserDataLoadEvent.java +++ b/Essentials/src/main/java/net/essentialsx/api/v2/events/AsyncUserDataLoadEvent.java @@ -12,16 +12,28 @@ public class AsyncUserDataLoadEvent extends Event { private static final HandlerList handlers = new HandlerList(); private final IUser user; + private final String joinMessage; - public AsyncUserDataLoadEvent(IUser user) { + public AsyncUserDataLoadEvent(IUser user, String joinMessage) { super(true); this.user = user; + this.joinMessage = joinMessage; } + /** + * @return The user whose data has been loaded. + */ public IUser getUser() { return user; } + /** + * @return The join message of this user who joined or null if none was displayed. + */ + public String getJoinMessage() { + return joinMessage; + } + @Override public HandlerList getHandlers() { return handlers; diff --git a/Essentials/src/main/resources/messages.properties b/Essentials/src/main/resources/messages.properties index ec7159d613f..86813f672bc 100644 --- a/Essentials/src/main/resources/messages.properties +++ b/Essentials/src/main/resources/messages.properties @@ -232,6 +232,27 @@ destinationNotSet=Destination not set\! disabled=disabled disabledToSpawnMob=\u00a74Spawning this mob was disabled in the config file. disableUnlimited=\u00a76Disabled unlimited placing of\u00a7c {0} \u00a76for\u00a7c {1}\u00a76. +discordCommandExecuteDescription=Executes a console command on the Minecraft server. +discordCommandExecuteArgumentCommand=The command to be executed +discordCommandExecuteReply=Executing command: "/{0}" +discordCommandListDescription=Gets a list of online players. +discordCommandListArgumentGroup=A specific group to limit your search by +discordCommandMessageDescription=Messages a player on the Minecraft server. +discordCommandMessageArgumentUsername=The player to send the message to +discordCommandMessageArgumentMessage=The message to send to the player +discordErrorCommand=You added your bot to your server incorrectly. Please follow the tutorial in the config and add your bot using https://essentialsx.net/discord.html! +discordErrorCommandDisabled=That command is disabled! +discordErrorLogin=An error occurred while logging into Discord, which has caused the plugin to disable itself: \n{0} +discordErrorLoggerInvalidChannel=Discord console logging has been disabled due to an invalid channel definition! If you intend to disable it, set the channel ID to "none"; otherwise check that your channel ID is correct. +discordErrorLoggerNoPerms=Discord console logger has been disabled due to insufficient permissions! Please make sure your bot has the "Manage Webhooks" permissions on the server. After fixing that, run "/ess reload". +discordErrorNoGuild=Invalid or missing server ID! Please follow the tutorial in the config in order to setup the plugin. +discordErrorNoGuildSize=Your bot is not in any servers! Please follow the tutorial in the config in order to setup the plugin. +discordErrorNoPerms=Your bot cannot see or talk in any channel! Please make sure your bot has read and write permissions in all channels you wish to use. +discordErrorNoToken=No token provided! Please follow the tutorial in the config in order to setup the plugin. +discordErrorWebhook=An error occurred while sending messages to your console channel\! This was likely caused by accidentally deleting your console webhook. This can usually by fixed by ensuring your bot has the "Manage Webhooks" permission and running "/ess reload". +discordLoggingIn=Attempting to login to Discord... +discordLoggingInDone=Successfully logged in as {0} +discordNoSendPermission=Cannot send message in channel: #{0} Please ensure the bot has "Send Messages" permission in that channel\! disposal=Disposal disposalCommandDescription=Opens a portable disposal menu. disposalCommandUsage=/<command> @@ -950,6 +971,7 @@ repairCommandUsage2Description=Repairs all items in your inventory repairEnchanted=\u00a74You are not allowed to repair enchanted items. repairInvalidType=\u00a74This item cannot be repaired. repairNone=\u00a74There were no items that needed repairing. +replyFromDiscord=**Reply from {0}\:** `{1}` replyLastRecipientDisabled=\u00a76Replying to last message recipient \u00a7cdisabled\u00a76. replyLastRecipientDisabledFor=\u00a76Replying to last message recipient \u00a7cdisabled \u00a76for \u00a7c{0}\u00a76. replyLastRecipientEnabled=\u00a76Replying to last message recipient \u00a7cenabled\u00a76. diff --git a/EssentialsDiscord/README.md b/EssentialsDiscord/README.md new file mode 100644 index 00000000000..528547c7694 --- /dev/null +++ b/EssentialsDiscord/README.md @@ -0,0 +1,462 @@ +# EssentialsX Discord + +EssentialsX Discord is a module that brings a simple, lightweight, easy-to-use, and bloat-free +bridge between Discord and Minecraft. + +EssentialsX Discord offers *essential* features you'd want from a Discord bridge such as: +* MC Chat -> Discord Channel +* Discord Channel -> MC Chat +* Basic MC -> Discord Event Monitoring (Join/Leave/Death/Mute) +* MC Console -> Discord Relay +* Discord Slash Commands + * /execute - Execute console commands from Discord + * /msg - Message Minecraft players from Discord + * /list - List players currently online on Minecraft +* & more... + +--- + +## Table of Contents +> * [Initial Setup](#initial-setup) +> * [Console Relay](#console-relay) +> * [Configuring Messages](#configuring-messages) +> * [Receive Discord Messages in Minecraft](#receive-discord-messages-in-minecraft) +> * [Discord Commands](#discord-commands) +> * [Misc Permissions](#misc-permissions) +> * [Developer API](#developer-api) + +--- + +## Initial Setup + +0. Before starting your server, there are a few steps you have to take. First, you must create a new +Discord bot at [discord.com/developers/applications](https://discord.com/developers/applications/). + +1. Once on that page, click on "New Application" button on the top right, give your bot a name, and +then click "Create". +> ![Creating Application](https://i.imgur.com/8ffp4R1.gif) +> `New Application` -> Give Application a Name -> `Create` + +2. Once you create the application, you'll be directed to its overview. From this screen, you'll +need to copy your "Client ID"/"Application ID" and save it for a later step. To copy your +Client ID, click the upper-left most blue "Copy" button. Make sure to save it for a later step. +> ![Copy Client ID](https://i.imgur.com/W3OMTu5.gif) +> `Copy` -> Paste into Notepad for later step + +3. Optionally, you can set an icon for your application as it will be the icon for the bot too. +> ![Avatar](https://i.imgur.com/NuFS9kT.png) + +4. The next step is actually creating a bot user for your application. From the overview screen, +this is done by going to the "Bot" tab on the left, then clicking the "Add Bot" on the right, +and finally then clicking "Yes, do it!". +> ![Create Bot](https://i.imgur.com/S14iAFS.gif) +> `Bot` -> `Add Bot` -> `Yes, do it!` + +5. Once on this screen, you'll need to uncheck the "Public Bot" setting and then click "Save Changes", +so other people can't add your bot to servers that are not your own. +> ![Disable Public Bot](https://i.imgur.com/HHqWvQ1.gif) +> Uncheck `Public Bot` -> `Save Changes` + +6. Finally, you'll need to copy your bot's token and save it for a later step. To copy your bot's token, +click the blue "Copy" button right of your bot's icon. Make sure to save it for a later step. +> ![Copy Token](https://i.imgur.com/OqpaSQH.gif) +> `Copy` -> Paste into Notepad for later step + +7. Next up is adding your bot to your Discord server. First, go to [essentialsx.net/discord.html](https://essentialsx.net/discord.html) +and paste your Client ID you copied from step 2 into the text box on that page. Once you do that, click +the "Authorize" button next to the text box. This will redirect you to Discord's authorization website +to chose which server to add the bot to. +Note for advanced users: **Please use the `essentialsx.net` link above even if you already know how +to invite bots.** EssentialsX Discord requires more than just the `bot` scope to work. +> ![OAuth Link Gen](https://i.imgur.com/u6MFJgQ.gif) +> Paste Client ID -> `Authorize` + +8. Once on the Discord authorization website, select the server from the "Select a server" dropdown +that you want to add the bot to. Then click the "Authorize" button. You may be prompted to confirm +you are not a bot, proceed with that like you would any other captcha. +> ![Authorize](https://i.imgur.com/KXkESqC.gif) +> Select Server -> `Authorize` + +9. For the next few steps, you're going to need to do some stuff in Discord, so start up your +Discord desktop/web client. + +10. Once in your Discord client, you'll need to enable Developer Mode. Do this by going into the +Settings, then go to the "Appearance" tab and check on the "Developer Mode" at the bottom of the +page. Once you've checked "Developer Mode" on, click the `X` at the top right to exit Settings. +> ![Developer Mode](https://i.imgur.com/CrW31Up.gif) +> `User Settings` -> `Appearance` -> Check `Developer Mode` -> Exit Settings + +11. Next is copying a few IDs. First up, you'll want to copy the server (aka guild) id. Do this by +finding the server you added the bot to, right click its icon, and click "Copy ID". Once you copied +it, make sure to save it for a later step. +> ![Guild ID](https://i.imgur.com/0mg2yT3.gif) +> Right click server -> `Copy ID` -> Paste into Notepad for later step + +12. The other ID you need to copy is the ID of the channel you wish to be your primary channel. +In other words, this will be the channel that, by default, receives messages for player chat/join/leave/death +messages as well as mute/kicks. To see how to further configure message types, see [Configuring Messages](#configuring-messages). +> ![Primary Channel ID](https://i.imgur.com/uMODfiQ.gif) +> Right click your 'primary' channel -> `Copy ID` -> Paste into Notepad for later step + +13. You've successfully copied all the necessary IDs needed for a basic setup. Next up is generating the +default config for EssentialsX Discord, so you can start setting it up! Do this by putting the +EssentialsX Discord jar (you can download it [here](https://essentialsx.net/downloads.html) if you do not +already have one) in your plugins folder, starting your server, and then stopping it as soon as it finishes +starting up. +> ![Start/Stop Server](https://i.imgur.com/JQX6hqM.gif) +> Drag EssentialsXDiscord jar into plugins folder -> Start Server -> Stop Server + +14. Now you can start to configure the plugin with all the stuff you copied from earlier. Open the config +for EssentialsX Discord located at `plugins/EssentialsDiscord/config.yml`. When you open the config, the +first thing to configure is your bot's token. Replace `INSERT-TOKEN-HERE` in the config with the token you +copied earlier from step 6. +> ![Paste Token](https://i.imgur.com/EnD31Wg.gif) +> Re-Copy Token from Step 6 -> Paste as token value + +15. Next is the guild ID. Replace the zeros for the guild value in the config with the guild ID you copied +from step 13. +> ![Paste Guild](https://i.imgur.com/YxkHykd.gif) + +16. Finally, you'll need to paste the primary channel ID you copied from step 14 and paste it as the +primary value in the channels section and once you've done that save the config file! +> ![Paste Primary](https://i.imgur.com/4xaHMfO.gif) + +17. Congratulations, you've completed the initial setup guide! When you start up your server, you should +notice that chat and other messages start showing up in the channel you requested they be. Now that you +completed the initial, go back up to the [Table Of Contents](#table-of-contents) to see what other cool things you can do! + +--- + +## Console Relay +The console relay is pretty self-explanatory: it relays everything on your console into a Discord channel of +your choosing. The console relay is ridiculously easy to setup and if your server is already running, you don't +need to reload it! + +0. This assumes you've already done the initial setup. + +1. Go to the Discord server that your bot is in and find the channel you wish to use for console output. +Right click on the channel and click "Copy ID". Save this ID for the next step. +> ![Copy ID](https://i.imgur.com/qvDfSLv.gif) +> Find console channel -> Right Click -> `Copy ID` + +2. Now that you have that copied, open the EssentialsX Discord config and find the `console` section. In that +section, replace the zeros for the `channel` value with the channel ID you copied from the last step. Once +you paste it, make sure you save the config. +> ![Paste ID](https://i.imgur.com/NicdpGw.gif) + +3. Finally, if your server is running, run `ess reload` from your console, otherwise start up your server. You +should notice console output being directed to that channel! That is all you need if you're okay with the default +settings. Otherwise, if you'd like to see what other options you can use to customize console output, stick around. + +4. The first thing you can customize is the format of the message sent to Discord. By default, the timestamp, +level (info/warn/error/etc), and message are shown for each console message. Let's say you wanted to make the +timestamp and level bold: since this message would be using Discord's markdown, we can just add \*\* to both sides of +level and timestamp. Then once you've done that, just do `/ess reload` and you should see your changes on Discord. +> ![Bold Format](https://i.imgur.com/jD9mH14.gif) + +5. Next, you can also configure the name you wish the to show above console messages. By default, it's "EssX Console +Relay" but can be switched to anything you want. +> ![Change Name](https://i.imgur.com/xtrt1Jt.gif) + +6. Finally, you can also choose to enable an option to treat any message by a user in the console channel as a +console command. This will mean that anyone who can send messages in your console channel **will be able to execute +commands as the console**. It is suggested that you stick to the regular `/execute` command +(see [Discord Commands](#discord-commands)) as those can be restricted to specific roles/users and are also not +restricted to the console channel. +> ![Command Relay](https://i.imgur.com/w3cfVUw.gif) + +7. That's all the options for the command relay! + +--- + +## Configuring Messages +EssentialsX Discord aims to keep its message-type system basic enough that simple things take little changes, while +giving more fine grain control to those you want it. + +To give you a general overview of the system, EssentialsX Discord allows you to define different channel IDs in the +`channels` section of the config. By default, two channels are pre-populated in the `channels` section, `primary` +and `staff`. If you only completed the initial setup, the `staff` channel definition is all zeros. This is fine in +most situations however, as the message system will always fallback to the `primary` channel if a channel ID is +invalid. + +Now on the to the types of messages you can receive themselves (which is where you're going to use these channel +definitions). In the `message-types` section of the config, you can see a list of message types (join/leave/chat/etc) +on the left (as the key), and on the right there is a channel definition. + +For the sake of example lets say we want to send all chat messages to their own channel. We can do this by creating +a new channel definition and setting the `chat` message type to said channel definition. Below are step-by-step +instructions for said example, you can follow along to get the gist of how to apply this to other use cases + +1. Find the channel on Discord you want to only send chat messages to, and then right click the channel and click +"Copy ID". +> ![Copy ID](https://i.imgur.com/ri7NZkD.gif) + +2. Next you need to create the actual channel definition, for this example we'll call it `chat`. You create a +channel definition by adding a new entry to the `channels` section with the key as its name and the ID as the one +you copied in the last step. +> ![New Def](https://i.imgur.com/dc7kIkl.gif) + +3. Finally, scroll down to the `message-types` section and change the `chat` message type to your newly created +channel definition. Once you do that, save and either run `/ess reload` if your server is running or start your +server. +> ![Move](https://i.imgur.com/qPVWkWF.gif) + +4. That's all you need to know about the basics of the message system! + +--- + +## Receive Discord Messages in Minecraft +After reading the [configuring messages section](#configuring-messages), you should now have a few Discord +channels defined in the `channels` of your config. You're probably wondering how you can let your players start +to see messages from Discord in Minecraft chat. Say I defined a channel named `chat` in the `channels` section +of your config, and I wanted to let players see Discord messages from that channel in Minecraft chat; This can +be accomplished very simply by giving players the `essentials.discord.receive.chat` permission. This would relay +all Discord messages from the `chat` channel to players with that permission. Another example: say I have a staff +channel in Discord that I want only staff members in the Minecraft server to see. Provided there is a `staff` +channel defined in the `channels` section of the config, I can give staff members the +`essentials.discord.receive.staff` permission, and they will start to see messages from that channel. + +--- + +## Discord Commands +EssentialsX Discord uses Discord's slash command system to let you type commands into Discord without it being +seen by other people in the server. With this system, you are able to execute console commands, message players, +and see the current player list. + +For example, here's what the `/execute` command looks like by default: +> ![/execute](https://i.imgur.com/yPN22bV.gif) + +As you can see, you can seamlessly run commands without people seeing the content of your commands or their +response. Additionally, you can also delete the responses once you're done looking at them, so they don't clutter +your chat. + +However, this is all configurable! In the `commands` section of the config, lies a ton of options to configure +settings on a per-command basis. Below are explanations of what all the configuration options mean and how to use +them. + +* `enabled` + * Default: `true` + * Description: `Whether or not the command should be enabled and therefore shown on Discord. Note that you + must restart your Minecraft server before this option takes effect.` +* `hide-command` + * Default: `true` + * Description: `Whether other people should not be able to see what commands you execute. Setting to false + would allow people in the same channel as you to see exactly what command you execute. In the example below, + you can see how disabling this option shows a message of the user and the command they executed.` + * Example: ![Show Command](https://i.imgur.com/Q61iP4n.gif) +* `allowed-roles` + * Description: `A list of user IDs or role names/IDs that are allowed to use the command. You can also use '*' + in order to allow everyone to use the command.` +* `admin-roles` + * `A list of user IDs or role names/IDs that have extra features in the command. For example, in the list + command, admin-roles allows people to see vanished players.` + +--- + +## Misc Permissions +EssentialsX Discord has a few other permissions that may be important to know about: + +* `essentials.discord.markdown` - Allows players to bypass the Markdown filter, so that they can +bold/underline/italic/etc their Minecraft chat messages for Discord. +* `essentials.discord.ping` - Allows players to bypass the ping filter, so that they can ping @everyone/@here +from Minecraft chat. + +--- + +## Developer API +EssentialsX Discord has a pretty extensive API which allows any third party plugin to build +their own integrations into it. Outside the specific examples below, you can also view +javadocs for EssentialsX Discord [here](https://jd-v2.essentialsx.net/EssentialsDiscord). + +### Sending Messages to Discord +EssentialsX Discord organizes the types of messages that can be sent along with their +destination on Discord under the `message-types` section of the `config.yml`. The +EssentialsX Discord API uses `message-types` to resolve the channel id you want to send your +message to. + +#### Using a built-in message channel +EssentialsX Discord defines a few built in `message-types` which you may fit your use case +already (such as sending a message to the MC->Discord chat relay channel). The list of +built-in message types can be found at [`MessageType.DefaultTypes`](https://github.com/EssentialsX/Essentials/blob/2.x/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java#L47-L67). + +Here is an example of what sending a message to the built-in chat channel would look like: +```java +// The built in channel you want to send your message to, in this case the chat channel. +final MessageType channel = MessageType.DefaultTypes.CHAT; +// Set to true if your message should be allowed to ping @everyone, @here, or roles. +// If you are sending user-generated content, you probably should keep this as false. +final boolean allowGroupMentions = false; +// Send the actual message +final DiscordService api = Bukkit.getServicesManager().load(DiscordService.class); +api.sendMessage(channel, "My Epic Message", allowGroupMentions); +``` + +#### Using your own message channel +If you want to create your own message type to allow your users to explicitly separate your +messages from our other built-in ones, you can do that also by creating a new +[`MessageType`](https://github.com/EssentialsX/Essentials/blob/2.x/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java). +The key provided in the constructor should be the key you'd like your users to use in the +`message-types` section of our config. This key should also be all lowercase and may contain +numbers or dashes. You *can* also put a Discord channel ID as the key if you'd like to +have your users define the channel id in your config rather than ours. Once you create the +`MessageType`, you will also need to register it with Essentialsx Discord by calling +[`DiscordService#registerMessageType`](https://github.com/EssentialsX/Essentials/blob/2.x/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/DiscordService.java#L24-L30). + +Here is an example of what sending a message using your own message type: +```java +public class CustomTypeExample { + private final DiscordService api; + private final MessageType type; + + public CustomTypeExample(final Plugin plugin) { + // Gets the the EssentialsX Discord API service so we can register our type and + // send a message with it later. + api = Bukkit.getServicesManager().load(DiscordService.class); + + // Create a new message type for the user to define in our config. + // Unless you're putting a discord channel id as the type key, it's probably + // a good idea to store this object so you don't create it every time. + type = new MessageType("my-awesome-channel"); + + // Registers the type we just created with EssentialsX Discord. + api.registerMessageType(plugin, type); + } + + @EventHandler() + public void onAwesomeEvent(AwesomeEvent event) { + // Set to true if your message should be allowed to ping @everyone, @here, or roles. + // If you are sending user-generated content, you probably should keep this as false. + final boolean allowGroupMentions = false; + // Send the actual message + api.sendMessage(type, "The player, " + event.getPlayer() + ", did something awesome!", allowPing); + } +} +``` + +### Prevent certain messages from being sent as chat +Depending on how your plugin sends certain types of chat messages to players, there may be +times when EssentialsX Discord accidentally broadcasts a message that was only intended for a +small group of people. In order for your plugin to stop this from happening you have to +listen to `DiscordChatMessageEvent`. + +Here is an example of how a staff chat plugin would cancel a message: +```java +public class StaffChatExample { + private final StaffChatPlugin plugin = ...; + + @EventHandler() + public void onDiscordChatMessage(DiscordChatMessageEvent event) { + // Checks if the player is in staff chat mode in this theoretical plugin. + if (plugin.isPlayerInStaffChat(event.getPlayer()) || + // or we could check if their message started with a # if we use that + // to indicate typing in a specific channel. + event.getMessage().startsWith("#")) { + event.setCanceled(true); + } + } +} +``` + +Additionally, you can also look at [TownyChat's EssentialsX Discord hook](https://github.com/TownyAdvanced/TownyChat/commit/5bee9611aa4200e3cde1a28af48c25caa4aec649). + +### Registering a Discord slash command +EssentialsX Discord also allows you to register slash commands directly with Discord itself +in order to provide your users with a way to interface with your plugins on Discord! + +To start writing slash commands, the first thing you'll need to do is create a slash command +class. For the sake of this tutorial, I'm going to use an economy plugin as the +hypothetical plugin creating this slash command. + +For this slash command, I'll create a simple command to a string (for player name) and +check their balance. +```java +public class BalanceSlashCommand extends InteractionCommand { + private final MyEconomyPlugin plugin = ...; + + @Override + public void onCommand(InteractionEvent event) { + // The name of the argument here has to be the same you used in getArguments() + final String playerName = event.getStringArgument("player"); + final Player player = Bukkit.getPlayerExact(playerName); + if (player == null) { + event.reply("A player by that name could not be found!"); + return; + } + + final int balance = plugin.getBalance(player); + + // It is important you reply to the InteractionEvent at least once as discord + // will show your bot is 'thinking' until you do so. + event.reply("The balance of " + player.getName() + " is $" + balance); + } + + @Override + public String getName() { + // This should return the name of the command as you want it to appear in discord. + // This method should never return different values. + return "balance"; + } + + @Override + public String getDescription() { + // This should return the description of the command as you want it + // to appear in discord. + // This method should never return different values. + return "Checks the balance of the given player"; + } + + @Override + public List<InteractionCommandArgument> getArguments() { + // Should return a list of arguments that will be used in your command. + // If you don't want any arguments, you can return null here. + return List.of( + new InteractionCommandArgument( + // This should be the name of the command argument. + // Keep it a single world, all lower case. + "player", + // This is the description of the argument. + "The player to check the balance of", + // This is the type of the argument you'd like to receive from + // discord. + InteractionCommandArgumentType.STRING, + // Should be set to true if the argument is required to send + // the command from discord. + true)); + } + + @Override + public boolean isEphemeral() { + // Whether or not the command and response should be hidden to other users on discord. + // Return true here in order to hide command/responses from other discord users. + return false; + } + + @Override + public boolean isDisabled() { + // Whether or not the command should be prevented from being registered/executed. + // Return true here in order to mark the command as disabled. + return false; + } +} +``` + +Once you have created your slash command, it's now time to register it. It is best +practice to register them in your plugin's `onEnable` so your commands make it in the +initial batch of commands sent to Discord. + +You can register your command with EssentialsX Discord by doing the following: +```java +... +import net.essentialsx.api.v2.services.discord.DiscordService; +... + +public class MyEconomyPlugin { + @Override + public void onEnable() { + final DiscordService api = Bukkit.getServicesManager().load(DiscordService.class); + api.getInteractionController().registerCommand(new BalanceSlashCommand()); + } +} +``` + +--- diff --git a/EssentialsDiscord/build.gradle b/EssentialsDiscord/build.gradle new file mode 100644 index 00000000000..1eabe785d60 --- /dev/null +++ b/EssentialsDiscord/build.gradle @@ -0,0 +1,58 @@ +plugins { + id("essentials.shadow-module") +} + +dependencies { + compileOnly project(':EssentialsX') + implementation('net.dv8tion:JDA:4.3.0_277') { + //noinspection GroovyAssignabilityCheck + exclude module: 'opus-java' + } + implementation 'com.vdurmont:emoji-java:5.1.1' + implementation 'club.minnced:discord-webhooks:0.5.6' + compileOnly 'org.apache.logging.log4j:log4j-core:2.0-beta9' + compileOnly 'me.clip:placeholderapi:2.10.9' +} + +shadowJar { + dependencies { + // JDA + include(dependency('net.dv8tion:JDA')) + include(dependency('com.neovisionaries:nv-websocket-client')) + include(dependency('com.squareup.okhttp3:okhttp')) + include(dependency('com.squareup.okio:okio')) + include(dependency('org.apache.commons:commons-collections4')) + include(dependency('net.sf.trove4j:trove4j')) + include(dependency('com.fasterxml.jackson.core:jackson-databind')) + include(dependency('com.fasterxml.jackson.core:jackson-core')) + include(dependency('com.fasterxml.jackson.core:jackson-annotations')) + include(dependency('org.slf4j:slf4j-api')) + + // Emoji + include(dependency('com.vdurmont:emoji-java')) + include(dependency('org.json:json')) + + // discord-webhooks + include(dependency('club.minnced:discord-webhooks')) + } + minimize() + + // JDA + relocate 'net.dv8tion.jda', 'net.essentialsx.dep.net.dv8tion.jda' + relocate 'com.neovisionaries.ws', 'net.essentialsx.dep.com.neovisionaries.ws' + relocate 'okhttp3', 'net.essentialsx.dep.okhttp3' + relocate 'okio', 'net.essentialsx.dep.okio' + relocate 'com.iwebpp.crypto', 'net.essentialsx.dep.com.iwebpp.crypto' + relocate 'org.apache.commons.collections4', 'net.essentialsx.dep.org.apache.commons.collections4' + relocate 'com.fasterxml.jackson.databind', 'net.essentialsx.dep.com.fasterxml.jackson.databind' + relocate 'com.fasterxml.jackson.core', 'net.essentialsx.dep.com.fasterxml.jackson.core' + relocate 'com.fasterxml.jackson.annotation', 'net.essentialsx.dep.com.fasterxml.jackson.annotation' + relocate 'gnu.trove', 'net.essentialsx.dep.gnu.trove' + + // Emoji + relocate 'com.vdurmont.emoji', 'net.essentialsx.dep.com.vdurmont.emoji' + relocate 'org.json', 'net.essentialsx.dep.org.json' + + // discord-webhooks + relocate 'club.minnced.discord.webhook', 'net.essentialsx.dep.club.minnced.discord.webhook' +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/events/discord/DiscordChatMessageEvent.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/events/discord/DiscordChatMessageEvent.java new file mode 100644 index 00000000000..a0a86ace018 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/events/discord/DiscordChatMessageEvent.java @@ -0,0 +1,72 @@ +package net.essentialsx.api.v2.events.discord; + +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; + +/** + * Fired before a chat message is about to be sent to a Discord channel. + * Should be used to block chat messages (such as staff channels) from appearing in Discord. + */ +public class DiscordChatMessageEvent extends Event implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + + private final Player player; + private String message; + private boolean cancelled = false; + + /** + * @param player The player which caused this event. + * @param message The message of this event. + */ + public DiscordChatMessageEvent(Player player, String message) { + this.player = player; + this.message = message; + } + + /** + * The player which which caused this chat message. + * @return the player who caused the event. + */ + public Player getPlayer() { + return player; + } + + /** + * The message being sent in this chat event. + * @return the message of this event. + */ + public String getMessage() { + return message; + } + + /** + * Sets the message of this event, and thus the chat message relayed to Discord. + * @param message the new message. + */ + public void setMessage(String message) { + this.message = message; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/events/discord/DiscordMessageEvent.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/events/discord/DiscordMessageEvent.java new file mode 100644 index 00000000000..23996efff42 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/events/discord/DiscordMessageEvent.java @@ -0,0 +1,157 @@ +package net.essentialsx.api.v2.events.discord; + +import net.essentialsx.api.v2.services.discord.MessageType; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +/** + * Fired before a message is about to be sent to a Discord channel. + */ +public class DiscordMessageEvent extends Event implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + + private boolean cancelled = false; + private MessageType type; + private String message; + private boolean allowGroupMentions; + private String avatarUrl; + private String name; + private final UUID uuid; + + /** + * @param type The message type/destination of this event. + * @param message The raw message content of this event. + * @param allowGroupMentions Whether or not the message should allow the pinging of roles, users, or emotes. + */ + public DiscordMessageEvent(final MessageType type, final String message, final boolean allowGroupMentions) { + this(type, message, allowGroupMentions, null, null, null); + } + + /** + * @param type The message type/destination of this event. + * @param message The raw message content of this event. + * @param allowGroupMentions Whether or not the message should allow the pinging of roles, users, or emotes. + * @param avatarUrl The avatar URL to use for this message (if supported) or null to use the default bot avatar. + * @param name The name to use for this message (if supported) or null to use the default bot name. + * @param uuid The UUID of the player which caused this event or null if this wasn't a player triggered event. + */ + public DiscordMessageEvent(final MessageType type, final String message, final boolean allowGroupMentions, final String avatarUrl, final String name, final UUID uuid) { + this.type = type; + this.message = message; + this.allowGroupMentions = allowGroupMentions; + this.avatarUrl = avatarUrl; + this.name = name; + this.uuid = uuid; + } + + /** + * Gets the type of this message. This also defines its destination. + * @return The message type. + */ + public MessageType getType() { + return type; + } + + /** + * Sets the message type and therefore its destination. + * @param type The new message type. + */ + public void setType(MessageType type) { + this.type = type; + } + + /** + * Gets the raw message content that is about to be sent to Discord. + * @return The raw message. + */ + public String getMessage() { + return message; + } + + /** + * Sets the raw message content to be sent to Discord. + * @param message The new message content. + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * Checks if this message allows pinging of roles/@here/@everyone. + * @return true if this message is allowed to ping of roles/@here/@everyone. + */ + public boolean isAllowGroupMentions() { + return allowGroupMentions; + } + + /** + * Sets if this message is allowed to ping roles/@here/@everyone. + * @param allowGroupMentions If pinging of roles/@here/@everyone should be allowed. + */ + public void setAllowGroupMentions(boolean allowGroupMentions) { + this.allowGroupMentions = allowGroupMentions; + } + + /** + * Gets the avatar URL to use for this message, or null if none is specified. + * @return The avatar URL or null. + */ + public String getAvatarUrl() { + return avatarUrl; + } + + /** + * Sets the avatar URL for this message, or null to use the bot's avatar. + * @param avatarUrl The avatar URL or null. + */ + public void setAvatarUrl(String avatarUrl) { + this.avatarUrl = avatarUrl; + } + + /** + * Gets the name to use for this message, or null if none is specified. + * @return The name or null. + */ + public String getName() { + return name; + } + + /** + * Sets the name for this message, or null to use the bot's name. + * @param name The name or null. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the UUID of the player which caused this event, or null if it wasn't a player triggered event. + * @return The UUID or null. + */ + public UUID getUUID() { + return uuid; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + @Override + public @NotNull HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/DiscordService.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/DiscordService.java new file mode 100644 index 00000000000..8a86994a812 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/DiscordService.java @@ -0,0 +1,44 @@ +package net.essentialsx.api.v2.services.discord; + +import org.bukkit.plugin.Plugin; + +/** + * A class which provides numerous methods to interact with EssentialsX Discord. + */ +public interface DiscordService { + /** + * Sends a message to a message type channel. + * @param type The message type/destination of this message. + * @param message The exact message to be sent. + * @param allowGroupMentions Whether or not the message should allow the pinging of roles, users, or emotes. + */ + void sendMessage(final MessageType type, final String message, final boolean allowGroupMentions); + + /** + * Checks if a {@link MessageType} by the given key is already registered. + * @param key The {@link MessageType} key to check. + * @return true if a {@link MessageType} with the provided key is registered, otherwise false. + */ + boolean isRegistered(final String key); + + /** + * Registers a message type to be used in the future. + * <p> + * In the future, this method will automatically populate the message type in the EssentialsX Discord config. + * @param type The {@link MessageType} to be registered. + */ + void registerMessageType(final Plugin plugin, final MessageType type); + + /** + * Gets the {@link InteractionController} instance. + * @return the {@link InteractionController} instance. + */ + InteractionController getInteractionController(); + + /** + * Gets unstable API that is subject to change at any time. + * @return {@link Unsafe the unsafe} instance. + * @see Unsafe + */ + Unsafe getUnsafe(); +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionChannel.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionChannel.java new file mode 100644 index 00000000000..01cbe81db1b --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionChannel.java @@ -0,0 +1,18 @@ +package net.essentialsx.api.v2.services.discord; + +/** + * Represents a interaction channel argument as a guild channel. + */ +public interface InteractionChannel { + /** + * Gets the name of this channel. + * @return this channel's name. + */ + String getName(); + + /** + * Gets the ID of this channel. + * @return this channel's ID. + */ + String getId(); +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommand.java new file mode 100644 index 00000000000..b082f9ba59e --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommand.java @@ -0,0 +1,46 @@ +package net.essentialsx.api.v2.services.discord; + +import java.util.List; + +/** + * Represents a command to be registered with the Discord client. + */ +public interface InteractionCommand { + /** + * Whether or not the command has been disabled and should not be registered at the request of the user. + * @return true if the command has been disabled. + */ + boolean isDisabled(); + + /** + * Whether or not the command is ephemeral and if its usage/replies should be private for the user on in Discord client. + * @return true if the command is ephemeral. + */ + boolean isEphemeral(); + + /** + * Gets the name of this command as it appears in Discord. + * @return the name of the command. + */ + String getName(); + + /** + * Gets the brief description of the command as it appears in Discord. + * @return the description of the command. + */ + String getDescription(); + + /** + * Gets the list of arguments registered to this command. + * <p> + * Note: Arguments can only be registered before the command itself is registered, others will be ignored. + * @return the list of arguments. + */ + List<InteractionCommandArgument> getArguments(); + + /** + * Called when an interaction command is received from Discord. + * @param event The {@link InteractionEvent} which caused this command to be executed. + */ + void onCommand(InteractionEvent event); +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommandArgument.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommandArgument.java new file mode 100644 index 00000000000..35c460f24c1 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommandArgument.java @@ -0,0 +1,57 @@ +package net.essentialsx.api.v2.services.discord; + +/** + * Represents an argument for a command to be shown to Discord users. + */ +public class InteractionCommandArgument { + private final String name; + private final String description; + private final InteractionCommandArgumentType type; + private final boolean required; + + /** + * Builds a command argument. + * @param name The name of the argument to be shown to the Discord client. + * @param description A brief description of the argument to be shown to the Discord client. + * @param type The type of argument. + * @param required Whether or not the argument is required in order to send the command in the Discord client. + */ + public InteractionCommandArgument(String name, String description, InteractionCommandArgumentType type, boolean required) { + this.name = name; + this.description = description; + this.type = type; + this.required = required; + } + + /** + * Gets the name of this argument. + * @return the name of the argument. + */ + public String getName() { + return name; + } + + /** + * Gets the description of this argument. + * @return the description of the argument. + */ + public String getDescription() { + return description; + } + + /** + * Gets the type of this argument. + * @return the argument type. + */ + public InteractionCommandArgumentType getType() { + return type; + } + + /** + * Whether or not this argument is required or not. + * @return true if the argument is required. + */ + public boolean isRequired() { + return required; + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommandArgumentType.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommandArgumentType.java new file mode 100644 index 00000000000..1e5a17f9f10 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionCommandArgumentType.java @@ -0,0 +1,25 @@ +package net.essentialsx.api.v2.services.discord; + +/** + * Represents an argument type to be shown on the Discord client. + */ +public enum InteractionCommandArgumentType { + STRING(3), + INTEGER(4), + BOOLEAN(5), + USER(6), + CHANNEL(7); + + private final int id; + InteractionCommandArgumentType(int id) { + this.id = id; + } + + /** + * Gets the internal Discord ID for this argument type. + * @return the internal Discord ID. + */ + public int getId() { + return id; + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionController.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionController.java new file mode 100644 index 00000000000..2412b032df5 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionController.java @@ -0,0 +1,20 @@ +package net.essentialsx.api.v2.services.discord; + +/** + * A class which provides numerous methods to interact with Discord slash commands. + */ +public interface InteractionController { + /** + * Gets the command with the given name or null if no command by that name exists. + * @param name The name of the command. + * @return The {@link InteractionCommand command} by the given name, or null. + */ + InteractionCommand getCommand(String name); + + /** + * Registers the given slash command with Discord. + * @param command The slash command to be registered. + * @throws InteractionException if a command with that name was already registered or if the given command was already registered. + */ + void registerCommand(InteractionCommand command) throws InteractionException; +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java new file mode 100644 index 00000000000..c4dbdbdc67f --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionEvent.java @@ -0,0 +1,59 @@ +package net.essentialsx.api.v2.services.discord; + +/** + * Represents a triggered interaction event. + */ +public interface InteractionEvent { + /** + * Appends the given string to the initial response message and creates one if it doesn't exist. + * @param message The message to append. + */ + void reply(String message); + + /** + * Gets the member which caused this event. + * @return the member which caused the event. + */ + InteractionMember getMember(); + + /** + * Get the value of the argument matching the given key represented as a String, or null if no argument by that name is present. + * @param key The key of the argument to lookup. + * @return the string value or null. + */ + String getStringArgument(String key); + + /** + * Get the Long representation of the argument by the given key or null if none by that key is present. + * @param key The key of the argument to lookup. + * @return the long value or null + */ + Long getIntegerArgument(String key); + + /** + * Helper method to get the Boolean representation of the argument by the given key or null if none by that key is present. + * @param key The key of the argument to lookup. + * @return the boolean value or null + */ + Boolean getBooleanArgument(String key); + + /** + * Helper method to get the user representation of the argument by the given key or null if none by that key is present. + * @param key The key of the argument to lookup. + * @return the user value or null + */ + InteractionMember getUserArgument(String key); + + /** + * Helper method to get the channel representation of the argument by the given key or null if none by that key is present. + * @param key The key of the argument to lookup. + * @return the channel value or null + */ + InteractionChannel getChannelArgument(String key); + + /** + * Gets the channel ID where this interaction occurred. + * @return the channel ID. + */ + String getChannelId(); +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionException.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionException.java new file mode 100644 index 00000000000..34f9d70a21a --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionException.java @@ -0,0 +1,10 @@ +package net.essentialsx.api.v2.services.discord; + +/** + * Thrown when an error occurs during an operation dealing with Discord interactions. + */ +public class InteractionException extends Exception { + public InteractionException(String message) { + super(message); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionMember.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionMember.java new file mode 100644 index 00000000000..afe7414872c --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionMember.java @@ -0,0 +1,67 @@ +package net.essentialsx.api.v2.services.discord; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + +/** + * Represents the interaction command executor as a guild member. + */ +public interface InteractionMember { + /** + * Gets the username of this member. + * @return this member's username. + */ + String getName(); + + /** + * Gets the four numbers after the {@code #} in the member's username. + * @return this member's discriminator. + */ + String getDiscriminator(); + + /** + * Gets this member's name and discriminator split by a {@code #}. + * @return this member's tag. + */ + default String getTag() { + return getName() + "#" + getDiscriminator(); + } + + /** + * Gets the nickname of this member or their username if they don't have one. + * @return this member's nickname or username if none is present. + */ + String getEffectiveName(); + + /** + * Gets the nickname of this member or null if they do not have one. + * @return this member's nickname or null. + */ + String getNickname(); + + /** + * Gets the ID of this member. + * @return this member's ID. + */ + String getId(); + + /** + * Checks if this member has the administrator permission on Discord. + * @return true if this user has administrative permissions. + */ + boolean isAdmin(); + + /** + * Returns true if the user has one of the specified roles. + * @param roleDefinitions A list of role definitions from the config. + * @return true if the member has one of the given roles. + */ + boolean hasRoles(List<String> roleDefinitions); + + /** + * Sends a private message to this member with the given content. + * @param content The message to send. + * @return A future which will complete a boolean stating the success of the message. + */ + CompletableFuture<Boolean> sendPrivateMessage(String content); +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java new file mode 100644 index 00000000000..9c17c8655ba --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java @@ -0,0 +1,73 @@ +package net.essentialsx.api.v2.services.discord; + +/** + * Indicates the type of message being sent and its literal channel name used in the config. + */ +public final class MessageType { + private final String key; + private final boolean player; + + /** + * Creates a {@link MessageType} which will send channels to the specified channel key. + * <p> + * The message type key may only contain: lowercase letters, numbers, and dashes. + * @param key The channel key defined in the {@code message-types} section of the config. + */ + public MessageType(final String key) { + this(key, false); + } + + /** + * Internal constructor used by EssentialsX Discord + */ + private MessageType(String key, boolean player) { + if (!key.matches("^[a-z0-9-]*$")) { + throw new IllegalArgumentException("Key must match \"^[a-z0-9-]*$\""); + } + this.key = key; + this.player = player; + } + + /** + * Gets the key used in {@code message-types} section of the config. + * @return The config key. + */ + public String getKey() { + return key; + } + + /** + * Checks if this message type should be beholden to player-specific config settings. + * @return true if message type should be beholden to player-specific config settings. + */ + public boolean isPlayer() { + return player; + } + + @Override + public String toString() { + return key; + } + + /** + * Default {@link MessageType MessageTypes} provided and documented by EssentialsX Discord. + */ + public static final class DefaultTypes { + public final static MessageType JOIN = new MessageType("join", true); + public final static MessageType LEAVE = new MessageType("leave", true); + public final static MessageType CHAT = new MessageType("chat", true); + public final static MessageType DEATH = new MessageType("death", true); + public final static MessageType AFK = new MessageType("afk", true); + public final static MessageType KICK = new MessageType("kick", false); + public final static MessageType MUTE = new MessageType("mute", false); + private final static MessageType[] VALUES = new MessageType[]{JOIN, LEAVE, CHAT, DEATH, AFK, KICK, MUTE}; + + /** + * Gets an array of all the default {@link MessageType MessageTypes}. + * @return An array of all the default {@link MessageType MessageTypes}. + */ + public static MessageType[] values() { + return VALUES; + } + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/Unsafe.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/Unsafe.java new file mode 100644 index 00000000000..08aba819638 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/Unsafe.java @@ -0,0 +1,15 @@ +package net.essentialsx.api.v2.services.discord; + +import net.dv8tion.jda.api.JDA; + +/** + * Unstable methods that may vary with our implementation. + * These methods have no guarantee of remaining consistent and may change at any time. + */ +public interface Unsafe { + /** + * Gets the JDA instance associated with this EssentialsX Discord instance, if available. + * @return the {@link JDA} instance or null if not ready. + */ + JDA getJDAInstance(); +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java new file mode 100644 index 00000000000..78d3ad7fe17 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java @@ -0,0 +1,354 @@ +package net.essentialsx.discord; + +import com.earth2me.essentials.IConf; +import com.earth2me.essentials.config.ConfigurateUtil; +import com.earth2me.essentials.config.EssentialsConfiguration; +import com.earth2me.essentials.utils.FormatUtil; +import net.dv8tion.jda.api.OnlineStatus; +import net.dv8tion.jda.api.entities.Activity; +import org.apache.logging.log4j.Level; +import org.bukkit.entity.Player; + +import java.io.File; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +public class DiscordSettings implements IConf { + private final EssentialsConfiguration config; + private final EssentialsDiscord plugin; + + private final Map<String, Long> nameToChannelIdMap = new HashMap<>(); + private final Map<Long, List<String>> channelIdToNamesMap = new HashMap<>(); + + private OnlineStatus status; + private Activity statusActivity; + + private Pattern discordFilter; + + private MessageFormat consoleFormat; + private Level consoleLogLevel; + + private MessageFormat discordToMcFormat; + private MessageFormat tempMuteFormat; + private MessageFormat tempMuteReasonFormat; + private MessageFormat permMuteFormat; + private MessageFormat permMuteReasonFormat; + private MessageFormat unmuteFormat; + private MessageFormat kickFormat; + + public DiscordSettings(EssentialsDiscord plugin) { + this.plugin = plugin; + this.config = new EssentialsConfiguration(new File(plugin.getDataFolder(), "config.yml"), "/config.yml", EssentialsDiscord.class); + reloadConfig(); + } + + public String getBotToken() { + return config.getString("token", ""); + } + + public long getGuildId() { + return config.getLong("guild", 0); + } + + public long getPrimaryChannelId() { + return config.getLong("channels.primary", 0); + } + + public long getChannelId(String key) { + try { + return Long.parseLong(key); + } catch (NumberFormatException ignored) { + return nameToChannelIdMap.getOrDefault(key, 0L); + } + } + + public List<String> getKeysFromChannelId(long channelId) { + return channelIdToNamesMap.get(channelId); + } + + public String getMessageChannel(String key) { + return config.getString("message-types." + key, "none"); + } + + public boolean isShowDiscordAttachments() { + return config.getBoolean("show-discord-attachments", true); + } + + public List<String> getPermittedFormattingRoles() { + return config.getList("permit-formatting-roles", String.class); + } + + public OnlineStatus getStatus() { + return status; + } + + public Activity getStatusActivity() { + return statusActivity; + } + + public boolean isAlwaysReceivePrimary() { + return config.getBoolean("always-receive-primary", false); + } + + public int getChatDiscordMaxLength() { + return config.getInt("chat.discord-max-length", 2000); + } + + public boolean isChatFilterNewlines() { + return config.getBoolean("chat.filter-newlines", true); + } + + public Pattern getDiscordFilter() { + return discordFilter; + } + + public boolean isShowWebhookMessages() { + return config.getBoolean("chat.show-webhook-messages", false); + } + + public boolean isShowBotMessages() { + return config.getBoolean("chat.show-bot-messages", false); + } + + public boolean isShowAllChat() { + return config.getBoolean("chat.show-all-chat", false); + } + + public String getConsoleChannelDef() { + return config.getString("console.channel", "none"); + } + + public MessageFormat getConsoleFormat() { + return consoleFormat; + } + + public String getConsoleWebhookName() { + return config.getString("console.webhook-name", "EssentialsX Console Relay"); + } + + public boolean isConsoleCommandRelay() { + return config.getBoolean("console.command-relay", false); + } + + public Level getConsoleLogLevel() { + return consoleLogLevel; + } + + public boolean isShowAvatar() { + return config.getBoolean("show-avatar", false); + } + + public boolean isShowName() { + return config.getBoolean("show-name", false); + } + + // General command settings + + public boolean isCommandEnabled(String command) { + return config.getBoolean("commands." + command + ".enabled", true); + } + + public boolean isCommandEphemeral(String command) { + return config.getBoolean("commands." + command + ".hide-command", true); + } + + public List<String> getCommandSnowflakes(String command) { + return config.getList("commands." + command + ".allowed-roles", String.class); + } + + public List<String> getCommandAdminSnowflakes(String command) { + return config.getList("commands." + command + ".admin-roles", String.class); + } + + // Message formats + + public MessageFormat getDiscordToMcFormat() { + return discordToMcFormat; + } + + public MessageFormat getMcToDiscordFormat(Player player) { + final String format = getFormatString("mc-to-discord"); + final String filled; + if (plugin.isPAPI() && format != null) { + filled = me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(player, format); + } else { + filled = format; + } + return generateMessageFormat(filled, "{displayname}: {message}", false, + "username", "displayname", "message", "world", "prefix", "suffix"); + } + + public MessageFormat getTempMuteFormat() { + return tempMuteFormat; + } + + public MessageFormat getTempMuteReasonFormat() { + return tempMuteReasonFormat; + } + + public MessageFormat getPermMuteFormat() { + return permMuteFormat; + } + + public MessageFormat getPermMuteReasonFormat() { + return permMuteReasonFormat; + } + + public MessageFormat getUnmuteFormat() { + return unmuteFormat; + } + + public MessageFormat getJoinFormat(Player player) { + final String format = getFormatString("join"); + final String filled; + if (plugin.isPAPI() && format != null) { + filled = me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(player, format); + } else { + filled = format; + } + return generateMessageFormat(filled, ":arrow_right: {displayname} has joined!", false, + "username", "displayname", "joinmessage"); + } + + public MessageFormat getQuitFormat(Player player) { + final String format = getFormatString("quit"); + final String filled; + if (plugin.isPAPI() && format != null) { + filled = me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(player, format); + } else { + filled = format; + } + return generateMessageFormat(filled, ":arrow_left: {displayname} has left!", false, + "username", "displayname", "quitmessage"); + } + + public MessageFormat getDeathFormat(Player player) { + final String format = getFormatString("death"); + final String filled; + if (plugin.isPAPI() && format != null) { + filled = me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(player, format); + } else { + filled = format; + } + return generateMessageFormat(filled, ":skull: {deathmessage}", false, + "username", "displayname", "deathmessage"); + } + + public MessageFormat getAfkFormat(Player player) { + final String format = getFormatString("afk"); + final String filled; + if (plugin.isPAPI() && format != null) { + filled = me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(player, format); + } else { + filled = format; + } + return generateMessageFormat(filled, ":person_walking: {displayname} is now AFK!", false, + "username", "displayname"); + } + + public MessageFormat getUnAfkFormat(Player player) { + final String format = getFormatString("un-afk"); + final String filled; + if (plugin.isPAPI() && format != null) { + filled = me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(player, format); + } else { + filled = format; + } + return generateMessageFormat(filled, ":keyboard: {displayname} is no longer AFK!", false, + "username", "displayname"); + } + + public MessageFormat getKickFormat() { + return kickFormat; + } + + private String getFormatString(String node) { + final String pathPrefix = node.startsWith(".") ? "" : "messages."; + return config.getString(pathPrefix + (pathPrefix.isEmpty() ? node.substring(1) : node), null); + } + + private MessageFormat generateMessageFormat(String content, String defaultStr, boolean format, String... arguments) { + content = content == null ? defaultStr : content; + content = format ? FormatUtil.replaceFormat(content) : FormatUtil.stripFormat(content); + for (int i = 0; i < arguments.length; i++) { + content = content.replace("{" + arguments[i] + "}", "{" + i + "}"); + } + return new MessageFormat(content); + } + + @Override + public void reloadConfig() { + config.load(); + + // Build channel maps + nameToChannelIdMap.clear(); + channelIdToNamesMap.clear(); + final Map<String, Object> section = ConfigurateUtil.getRawMap(config, "channels"); + for (Map.Entry<String, Object> entry : section.entrySet()) { + if (entry.getValue() instanceof Long) { + final long value = (long) entry.getValue(); + nameToChannelIdMap.put(entry.getKey(), value); + channelIdToNamesMap.computeIfAbsent(value, o -> new ArrayList<>()).add(entry.getKey()); + } + } + + // Presence stuff + status = OnlineStatus.fromKey(config.getString("presence.status", "online")); + if (status == OnlineStatus.UNKNOWN) { + // Default invalid status to online + status = OnlineStatus.ONLINE; + } + + final String activity = config.getString("presence.activity", "default").trim().toUpperCase().replace("CUSTOM_STATUS", "DEFAULT"); + statusActivity = null; + Activity.ActivityType activityType = null; + try { + if (!activity.equals("NONE")) { + activityType = Activity.ActivityType.valueOf(activity); + } + } catch (IllegalArgumentException e) { + activityType = Activity.ActivityType.DEFAULT; + } + if (activityType != null) { + statusActivity = Activity.of(activityType, config.getString("presence.message", "Minecraft")); + } + + final String filter = config.getString("chat.discord-filter", null); + if (filter != null) { + try { + discordFilter = Pattern.compile(filter); + } catch (PatternSyntaxException e) { + plugin.getLogger().log(java.util.logging.Level.WARNING, "Invalid pattern for \"chat.discord-filter\": " + e.getMessage()); + discordFilter = null; + } + } else { + discordFilter = null; + } + + consoleLogLevel = Level.toLevel(config.getString("console.log-level", null), Level.INFO); + + consoleFormat = generateMessageFormat(getFormatString(".console.format"), "[{timestamp} {level}] {message}", false, + "timestamp", "level", "message"); + + discordToMcFormat = generateMessageFormat(getFormatString("discord-to-mc"), "&6[#{channel}] &3{fullname}&7: &f{message}", true, + "channel", "username", "discriminator", "fullname", "nickname", "color", "message"); + unmuteFormat = generateMessageFormat(getFormatString("unmute"), "{displayname} unmuted.", false, "username", "displayname"); + tempMuteFormat = generateMessageFormat(getFormatString("temporary-mute"), "{controllerdisplayname} has muted player {displayname} for {time}.", false, + "username", "displayname", "controllername", "controllerdisplayname", "time"); + permMuteFormat = generateMessageFormat(getFormatString("permanent-mute"), "{controllerdisplayname} permanently muted {displayname}.", false, + "username", "displayname", "controllername", "controllerdisplayname"); + tempMuteReasonFormat = generateMessageFormat(getFormatString("temporary-mute-reason"), "{controllerdisplayname} has muted player {displayname} for {time}. Reason: {reason}.", false, + "username", "displayname", "controllername", "controllerdisplayname", "time", "reason"); + permMuteReasonFormat = generateMessageFormat(getFormatString("permanent-mute-reason"), "{controllerdisplayname} has muted player {displayname}. Reason: {reason}.", false, + "username", "displayname", "controllername", "controllerdisplayname", "reason"); + kickFormat = generateMessageFormat(getFormatString("kick"), "{displayname} was kicked with reason: {reason}", false, + "username", "displayname", "reason"); + + plugin.onReload(); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/EssentialsDiscord.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/EssentialsDiscord.java new file mode 100644 index 00000000000..cf803f7e0bc --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/EssentialsDiscord.java @@ -0,0 +1,86 @@ +package net.essentialsx.discord; + +import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.IEssentialsModule; +import com.earth2me.essentials.metrics.MetricsWrapper; +import net.essentialsx.discord.interactions.InteractionControllerImpl; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import static com.earth2me.essentials.I18n.tl; + +public class EssentialsDiscord extends JavaPlugin implements IEssentialsModule { + private final static Logger logger = Logger.getLogger("EssentialsDiscord"); + private transient IEssentials ess; + private transient MetricsWrapper metrics = null; + + private JDADiscordService jda; + private DiscordSettings settings; + private boolean isPAPI = false; + + @Override + public void onEnable() { + ess = (IEssentials) getServer().getPluginManager().getPlugin("Essentials"); + if (ess == null || !ess.isEnabled()) { + setEnabled(false); + return; + } + if (!getDescription().getVersion().equals(ess.getDescription().getVersion())) { + getLogger().log(Level.WARNING, tl("versionMismatchAll")); + } + + isPAPI = getServer().getPluginManager().getPlugin("PlaceholderAPI") != null; + + settings = new DiscordSettings(this); + ess.addReloadListener(settings); + + if (jda == null) { + jda = new JDADiscordService(this); + try { + jda.startup(); + ess.scheduleSyncDelayedTask(() -> ((InteractionControllerImpl) jda.getInteractionController()).processBatchRegistration()); + } catch (Exception e) { + logger.log(Level.SEVERE, tl("discordErrorLogin", e.getMessage())); + if (ess.getSettings().isDebug()) { + e.printStackTrace(); + } + setEnabled(false); + return; + } + } + + if (metrics == null) { + metrics = new MetricsWrapper(this, 9824, false); + } + } + + public void onReload() { + if (jda != null) { + jda.updatePresence(); + jda.updatePrimaryChannel(); + jda.updateConsoleRelay(); + jda.updateTypesRelay(); + } + } + + public IEssentials getEss() { + return ess; + } + + public DiscordSettings getSettings() { + return settings; + } + + public boolean isPAPI() { + return isPAPI; + } + + @Override + public void onDisable() { + if (jda != null) { + jda.shutdown(); + } + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java new file mode 100644 index 00000000000..97e0d3f8ba1 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java @@ -0,0 +1,412 @@ +package net.essentialsx.discord; + +import club.minnced.discord.webhook.WebhookClient; +import club.minnced.discord.webhook.WebhookClientBuilder; +import club.minnced.discord.webhook.send.WebhookMessage; +import club.minnced.discord.webhook.send.WebhookMessageBuilder; +import com.earth2me.essentials.utils.FormatUtil; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.JDABuilder; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.TextChannel; +import net.dv8tion.jda.api.entities.Webhook; +import net.dv8tion.jda.api.events.ShutdownEvent; +import net.dv8tion.jda.api.hooks.EventListener; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.essentialsx.api.v2.events.discord.DiscordMessageEvent; +import net.essentialsx.api.v2.services.discord.DiscordService; +import net.essentialsx.api.v2.services.discord.InteractionController; +import net.essentialsx.api.v2.services.discord.InteractionException; +import net.essentialsx.api.v2.services.discord.MessageType; +import net.essentialsx.api.v2.services.discord.Unsafe; +import net.essentialsx.discord.interactions.InteractionControllerImpl; +import net.essentialsx.discord.interactions.commands.ExecuteCommand; +import net.essentialsx.discord.interactions.commands.ListCommand; +import net.essentialsx.discord.interactions.commands.MessageCommand; +import net.essentialsx.discord.listeners.BukkitListener; +import net.essentialsx.discord.listeners.DiscordCommandDispatcher; +import net.essentialsx.discord.listeners.DiscordListener; +import net.essentialsx.discord.util.ConsoleInjector; +import net.essentialsx.discord.util.DiscordUtil; +import org.bukkit.Bukkit; +import org.bukkit.event.HandlerList; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.ServicePriority; +import org.jetbrains.annotations.NotNull; + +import javax.security.auth.login.LoginException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Matcher; + +import static com.earth2me.essentials.I18n.tl; + +public class JDADiscordService implements DiscordService { + private final static Logger logger = Logger.getLogger("EssentialsDiscord"); + private final EssentialsDiscord plugin; + private final Unsafe unsafe = this::getJda; + + private JDA jda; + private Guild guild; + private TextChannel primaryChannel; + private WebhookClient consoleWebhook; + private String lastConsoleId; + private final Map<String, MessageType> registeredTypes = new HashMap<>(); + private final Map<MessageType, String> typeToChannelId = new HashMap<>(); + private final Map<String, WebhookClient> channelIdToWebhook = new HashMap<>(); + private ConsoleInjector injector; + private DiscordCommandDispatcher commandDispatcher; + private InteractionControllerImpl interactionController; + + public JDADiscordService(EssentialsDiscord plugin) { + this.plugin = plugin; + for (final MessageType type : MessageType.DefaultTypes.values()) { + registerMessageType(plugin, type); + } + } + + public TextChannel getChannel(String key, boolean primaryFallback) { + long resolvedId; + try { + resolvedId = Long.parseLong(key); + } catch (NumberFormatException ignored) { + resolvedId = getSettings().getChannelId(getSettings().getMessageChannel(key)); + } + + if (isDebug()) { + logger.log(Level.INFO, "Channel definition " + key + " resolved as " + resolvedId); + } + TextChannel channel = guild.getTextChannelById(resolvedId); + if (channel == null && primaryFallback) { + if (isDebug()) { + logger.log(Level.WARNING, "Resolved channel id " + resolvedId + " was not found! Falling back to primary channel."); + } + channel = primaryChannel; + } + return channel; + } + + public WebhookMessage getWebhookMessage(String message) { + return getWebhookMessage(message, jda.getSelfUser().getAvatarUrl(), getSettings().getConsoleWebhookName(), false); + } + + public WebhookMessage getWebhookMessage(String message, String avatarUrl, String name, boolean groupMentions) { + return new WebhookMessageBuilder() + .setAvatarUrl(avatarUrl) + .setAllowedMentions(groupMentions ? DiscordUtil.ALL_MENTIONS_WEBHOOK : DiscordUtil.NO_GROUP_MENTIONS_WEBHOOK) + .setUsername(name) + .setContent(message) + .build(); + } + + public void sendMessage(DiscordMessageEvent event, String message, boolean groupMentions) { + final TextChannel channel = getChannel(event.getType().getKey(), true); + + final String strippedContent = FormatUtil.stripFormat(message); + + final String webhookChannelId = typeToChannelId.get(event.getType()); + if (webhookChannelId != null) { + final WebhookClient client = channelIdToWebhook.get(webhookChannelId); + if (client != null) { + final String avatarUrl = event.getAvatarUrl() != null ? event.getAvatarUrl() : jda.getSelfUser().getAvatarUrl(); + final String name = event.getName() != null ? event.getName() : guild.getSelfMember().getEffectiveName(); + client.send(getWebhookMessage(strippedContent, avatarUrl, name, groupMentions)); + return; + } + } + + if (!channel.canTalk()) { + logger.warning(tl("discordNoSendPermission", channel.getName())); + return; + } + channel.sendMessage(strippedContent) + .allowedMentions(groupMentions ? null : DiscordUtil.NO_GROUP_MENTIONS) + .queue(); + } + + public void startup() throws LoginException, InterruptedException { + shutdown(); + + logger.log(Level.INFO, tl("discordLoggingIn")); + if (plugin.getSettings().getBotToken().replace("INSERT-TOKEN-HERE", "").trim().isEmpty()) { + throw new IllegalArgumentException(tl("discordErrorNoToken")); + } + + jda = JDABuilder.createDefault(plugin.getSettings().getBotToken()) + .addEventListeners(new DiscordListener(this)) + .setContextEnabled(false) + .setRawEventsEnabled(true) + .build() + .awaitReady(); + updatePresence(); + logger.log(Level.INFO, tl("discordLoggingInDone", jda.getSelfUser().getAsTag())); + + if (jda.getGuilds().isEmpty()) { + throw new IllegalArgumentException(tl("discordErrorNoGuildSize")); + } + + guild = jda.getGuildById(plugin.getSettings().getGuildId()); + if (guild == null) { + throw new IllegalArgumentException(tl("discordErrorNoGuild")); + } + + interactionController = new InteractionControllerImpl(this); + try { + interactionController.registerCommand(new ExecuteCommand(this)); + interactionController.registerCommand(new MessageCommand(this)); + interactionController.registerCommand(new ListCommand(this)); + } catch (InteractionException ignored) { + // won't happen + } + + updatePrimaryChannel(); + + updateConsoleRelay(); + + updateTypesRelay(); + + Bukkit.getPluginManager().registerEvents(new BukkitListener(this), plugin); + + Bukkit.getServicesManager().register(DiscordService.class, this, plugin, ServicePriority.Normal); + } + + @Override + public boolean isRegistered(String key) { + return registeredTypes.containsKey(key); + } + + @Override + public void registerMessageType(Plugin plugin, MessageType type) { + if (!type.getKey().matches("^[a-z0-9-]*$")) { + throw new IllegalArgumentException("MessageType key must match \"^[a-z0-9-]*$\""); + } + + if (registeredTypes.containsKey(type.getKey())) { + throw new IllegalArgumentException("A MessageType with that key is already registered!"); + } + + registeredTypes.put(type.getKey(), type); + } + + @Override + public void sendMessage(MessageType type, String message, boolean allowGroupMentions) { + if (!registeredTypes.containsKey(type.getKey())) { + logger.warning("Sending message to channel \"" + type.getKey() + "\" which is an unregistered type! If you are a plugin author, you should be registering your MessageType before using them."); + } + final DiscordMessageEvent event = new DiscordMessageEvent(type, FormatUtil.stripFormat(message), allowGroupMentions); + if (Bukkit.getServer().isPrimaryThread()) { + Bukkit.getPluginManager().callEvent(event); + } else { + Bukkit.getScheduler().runTask(plugin, () -> Bukkit.getPluginManager().callEvent(event)); + } + } + + @Override + public InteractionController getInteractionController() { + return interactionController; + } + + public void updatePrimaryChannel() { + TextChannel channel = guild.getTextChannelById(plugin.getSettings().getPrimaryChannelId()); + if (channel == null) { + channel = guild.getDefaultChannel(); + if (channel == null || !channel.canTalk()) { + throw new RuntimeException(tl("discordErrorNoPerms")); + } + } + primaryChannel = channel; + } + + public void updatePresence() { + jda.getPresence().setPresence(plugin.getSettings().getStatus(), plugin.getSettings().getStatusActivity()); + } + + public void updateTypesRelay() { + if (!getSettings().isShowAvatar() && !getSettings().isShowName()) { + for (WebhookClient webhook : channelIdToWebhook.values()) { + webhook.close(); + } + typeToChannelId.clear(); + channelIdToWebhook.clear(); + return; + } + + for (MessageType type : MessageType.DefaultTypes.values()) { + if (!type.isPlayer()) { + continue; + } + + final TextChannel channel = getChannel(type.getKey(), true); + if (channel.getId().equals(typeToChannelId.get(type))) { + continue; + } + + final String webhookName = "EssX Advanced Relay"; + Webhook webhook = DiscordUtil.getAndCleanWebhooks(channel, webhookName).join(); + webhook = webhook == null ? DiscordUtil.createWebhook(channel, webhookName).join() : webhook; + if (webhook == null) { + final WebhookClient current = channelIdToWebhook.get(channel.getId()); + if (current != null) { + current.close(); + } + channelIdToWebhook.remove(channel.getId()); + continue; + } + typeToChannelId.put(type, channel.getId()); + channelIdToWebhook.put(channel.getId(), DiscordUtil.getWebhookClient(webhook.getIdLong(), webhook.getToken(), jda.getHttpClient())); + } + } + + public void updateConsoleRelay() { + final String consoleDef = getSettings().getConsoleChannelDef(); + final Matcher matcher = WebhookClientBuilder.WEBHOOK_PATTERN.matcher(consoleDef); + final long webhookId; + final String webhookToken; + if (matcher.matches()) { + webhookId = Long.parseUnsignedLong(matcher.group(1)); + webhookToken = matcher.group(2); + if (commandDispatcher != null) { + jda.removeEventListener(commandDispatcher); + commandDispatcher = null; + } + } else { + final TextChannel channel = getChannel(consoleDef, false); + if (channel != null) { + if (getSettings().isConsoleCommandRelay()) { + if (commandDispatcher == null) { + commandDispatcher = new DiscordCommandDispatcher(this); + jda.addEventListener(commandDispatcher); + } + commandDispatcher.setChannelId(channel.getId()); + } else if (commandDispatcher != null) { + jda.removeEventListener(commandDispatcher); + commandDispatcher = null; + } + + if (channel.getId().equals(lastConsoleId)) { + return; + } + + final String webhookName = "EssX Console Relay"; + Webhook webhook = DiscordUtil.getAndCleanWebhooks(channel, webhookName).join(); + webhook = webhook == null ? DiscordUtil.createWebhook(channel, webhookName).join() : webhook; + if (webhook == null) { + logger.info(tl("discordErrorLoggerNoPerms")); + return; + } + webhookId = webhook.getIdLong(); + webhookToken = webhook.getToken(); + lastConsoleId = channel.getId(); + } else if (!getSettings().getConsoleChannelDef().equals("none") && !getSettings().getConsoleChannelDef().startsWith("0")) { + logger.info(tl("discordErrorLoggerInvalidChannel")); + shutdownConsoleRelay(true); + return; + } else { + // It's either not configured at all or knowingly disabled. + shutdownConsoleRelay(true); + return; + } + } + + shutdownConsoleRelay(false); + consoleWebhook = DiscordUtil.getWebhookClient(webhookId, webhookToken, jda.getHttpClient()); + if (injector == null) { + injector = new ConsoleInjector(this); + injector.start(); + } + } + + private void shutdownConsoleRelay(final boolean closeInjector) { + if (consoleWebhook != null && !consoleWebhook.isShutdown()) { + consoleWebhook.close(); + } + consoleWebhook = null; + + if (closeInjector) { + if (injector != null) { + injector.remove(); + injector = null; + } + + if (commandDispatcher != null) { + jda.removeEventListener(commandDispatcher); + commandDispatcher = null; + } + } + } + + public void shutdown() { + if (interactionController != null) { + interactionController.shutdown(); + } + + if (jda != null) { + shutdownConsoleRelay(true); + + // Unregister leftover jda listeners + for (Object obj : jda.getRegisteredListeners()) { + if (!(obj instanceof EventListener)) { // Yeah bro I wish I knew too :/ + jda.removeEventListener(obj); + } + } + + // Unregister Bukkit Events + HandlerList.unregisterAll(plugin); + + // Creates a future which will be completed when JDA fully shutdowns + final CompletableFuture<Void> future = new CompletableFuture<>(); + jda.addEventListener(new ListenerAdapter() { + @Override + public void onShutdown(@NotNull ShutdownEvent event) { + future.complete(null); + } + }); + + // Tell JDA to wrap it up + jda.shutdown(); + try { + // Wait for JDA to wrap it up + future.get(5, TimeUnit.SECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + logger.warning("JDA took longer than expected to shutdown, this may have caused some problems."); + } finally { + jda = null; + } + } + } + + public JDA getJda() { + return jda; + } + + @Override + public Unsafe getUnsafe() { + return unsafe; + } + + public Guild getGuild() { + return guild; + } + + public EssentialsDiscord getPlugin() { + return plugin; + } + + public DiscordSettings getSettings() { + return plugin.getSettings(); + } + + public WebhookClient getConsoleWebhook() { + return consoleWebhook; + } + + public boolean isDebug() { + return plugin.getEss().getSettings().isDebug(); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionChannelImpl.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionChannelImpl.java new file mode 100644 index 00000000000..3963bd60f89 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionChannelImpl.java @@ -0,0 +1,26 @@ +package net.essentialsx.discord.interactions; + +import net.dv8tion.jda.api.entities.GuildChannel; +import net.essentialsx.api.v2.services.discord.InteractionChannel; + +public class InteractionChannelImpl implements InteractionChannel { + private final GuildChannel channel; + + public InteractionChannelImpl(GuildChannel channel) { + this.channel = channel; + } + + @Override + public String getName() { + return channel.getName(); + } + + public GuildChannel getJdaObject() { + return channel; + } + + @Override + public String getId() { + return channel.getId(); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionCommandImpl.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionCommandImpl.java new file mode 100644 index 00000000000..8840f739a32 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionCommandImpl.java @@ -0,0 +1,54 @@ +package net.essentialsx.discord.interactions; + +import net.essentialsx.api.v2.services.discord.InteractionCommand; +import net.essentialsx.api.v2.services.discord.InteractionCommandArgument; +import net.essentialsx.discord.JDADiscordService; + +import java.util.ArrayList; +import java.util.List; + +public abstract class InteractionCommandImpl implements InteractionCommand { + protected final JDADiscordService jda; + private final String name; + private final String description; + private final List<InteractionCommandArgument> arguments = new ArrayList<>(); + + public InteractionCommandImpl(JDADiscordService jda, String name, String description) { + this.jda = jda; + this.name = name; + this.description = description; + } + + @Override + public final boolean isDisabled() { + return !jda.getSettings().isCommandEnabled(name); + } + + @Override + public final boolean isEphemeral() { + return jda.getSettings().isCommandEphemeral(name); + } + + @Override + public String getName() { + return name; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public List<InteractionCommandArgument> getArguments() { + return arguments; + } + + public List<String> getAdminSnowflakes() { + return jda.getSettings().getCommandAdminSnowflakes(name); + } + + public void addArgument(InteractionCommandArgument argument) { + arguments.add(argument); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java new file mode 100644 index 00000000000..c5c9150bc31 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionControllerImpl.java @@ -0,0 +1,161 @@ +package net.essentialsx.discord.interactions; + +import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.exceptions.ErrorResponseException; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.dv8tion.jda.api.interactions.commands.Command; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.requests.ErrorResponse; +import net.essentialsx.api.v2.services.discord.InteractionCommand; +import net.essentialsx.api.v2.services.discord.InteractionCommandArgument; +import net.essentialsx.api.v2.services.discord.InteractionController; +import net.essentialsx.api.v2.services.discord.InteractionEvent; +import net.essentialsx.api.v2.services.discord.InteractionException; +import net.essentialsx.discord.JDADiscordService; +import net.essentialsx.discord.util.DiscordUtil; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static com.earth2me.essentials.I18n.tl; + +public class InteractionControllerImpl extends ListenerAdapter implements InteractionController { + private final static Logger logger = Logger.getLogger("EssentialsDiscord"); + + private final JDADiscordService jda; + + private final Map<String, InteractionCommand> commandMap = new ConcurrentHashMap<>(); + private final Map<String, InteractionCommand> batchRegistrationQueue = new HashMap<>(); + private boolean initialBatchRegistration = false; + + public InteractionControllerImpl(JDADiscordService jda) { + this.jda = jda; + jda.getJda().addEventListener(this); + } + + @Override + public void onSlashCommand(@NotNull SlashCommandEvent event) { + if (event.getGuild() == null || event.getMember() == null || !commandMap.containsKey(event.getName())) { + return; + } + + final InteractionCommand command = commandMap.get(event.getName()); + + if (command.isDisabled()) { + event.reply(tl("discordErrorCommandDisabled")).setEphemeral(true).queue(); + return; + } + + event.deferReply(command.isEphemeral()).queue(null, failure -> logger.log(Level.SEVERE, "Error while deferring Discord command", failure)); + + final InteractionEvent interactionEvent = new InteractionEventImpl(event); + if (!DiscordUtil.hasRoles(event.getMember(), jda.getSettings().getCommandSnowflakes(command.getName()))) { + interactionEvent.reply(tl("noAccessCommand")); + return; + } + jda.getPlugin().getEss().scheduleSyncDelayedTask(() -> command.onCommand(interactionEvent)); + } + + @Override + public InteractionCommand getCommand(String name) { + return commandMap.get(name); + } + + public void processBatchRegistration() { + if (!initialBatchRegistration && !batchRegistrationQueue.isEmpty()) { + initialBatchRegistration = true; + final List<CommandData> list = new ArrayList<>(); + for (final InteractionCommand command : batchRegistrationQueue.values()) { + final CommandData data = new CommandData(command.getName(), command.getDescription()); + if (command.getArguments() != null) { + for (final InteractionCommandArgument argument : command.getArguments()) { + data.addOption(OptionType.valueOf(argument.getType().name()), argument.getName(), argument.getDescription(), argument.isRequired()); + } + } + list.add(data); + } + + jda.getGuild().updateCommands().addCommands(list).queue(success -> { + for (final Command command : success) { + commandMap.put(command.getName(), batchRegistrationQueue.get(command.getName())); + batchRegistrationQueue.remove(command.getName()); + if (jda.isDebug()) { + logger.info("Registered guild command " + command.getName() + " with id " + command.getId()); + } + } + + if (!batchRegistrationQueue.isEmpty()) { + logger.warning(batchRegistrationQueue.size() + " Discord commands were lost during command registration!"); + if (jda.isDebug()) { + logger.warning("Lost commands: " + batchRegistrationQueue.keySet()); + } + batchRegistrationQueue.clear(); + } + }, failure -> { + if (failure instanceof ErrorResponseException && ((ErrorResponseException) failure).getErrorResponse() == ErrorResponse.MISSING_ACCESS) { + logger.severe(tl("discordErrorCommand")); + return; + } + logger.log(Level.SEVERE, "Error while registering command", failure); + }); + } + } + + @Override + public void registerCommand(InteractionCommand command) throws InteractionException { + if (command.isDisabled()) { + throw new InteractionException("The given command has been disabled!"); + } + + if (commandMap.containsKey(command.getName())) { + throw new InteractionException("A command with that name is already registered!"); + } + + if (!initialBatchRegistration) { + if (jda.isDebug()) { + logger.info("Marked guild command for batch registration: " + command.getName()); + } + batchRegistrationQueue.put(command.getName(), command); + return; + } + + final CommandData data = new CommandData(command.getName(), command.getDescription()); + if (command.getArguments() != null) { + for (final InteractionCommandArgument argument : command.getArguments()) { + data.addOption(OptionType.valueOf(argument.getType().name()), argument.getName(), argument.getDescription(), argument.isRequired()); + } + } + + jda.getGuild().upsertCommand(data).queue(success -> { + commandMap.put(command.getName(), command); + if (jda.isDebug()) { + logger.info("Registered guild command " + success.getName() + " with id " + success.getId()); + } + }, failure -> { + if (failure instanceof ErrorResponseException && ((ErrorResponseException) failure).getErrorResponse() == ErrorResponse.MISSING_ACCESS) { + logger.severe(tl("discordErrorCommand")); + return; + } + logger.log(Level.SEVERE, "Error while registering command", failure); + }); + } + + public void shutdown() { + try { + jda.getGuild().updateCommands().complete(); + } catch (Throwable e) { + logger.severe("Error while deleting commands: " + e.getMessage()); + if (jda.isDebug()) { + e.printStackTrace(); + } + } + commandMap.clear(); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java new file mode 100644 index 00000000000..f6b062227ef --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionEventImpl.java @@ -0,0 +1,79 @@ +package net.essentialsx.discord.interactions; + +import com.earth2me.essentials.utils.FormatUtil; +import com.google.common.base.Joiner; +import net.dv8tion.jda.api.MessageBuilder; +import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.interactions.commands.OptionMapping; +import net.essentialsx.api.v2.services.discord.InteractionChannel; +import net.essentialsx.api.v2.services.discord.InteractionEvent; +import net.essentialsx.api.v2.services.discord.InteractionMember; +import net.essentialsx.discord.util.DiscordUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * A class which provides information about what triggered an interaction event. + */ +public class InteractionEventImpl implements InteractionEvent { + private final static Logger logger = Logger.getLogger("EssentialsDiscord"); + private final SlashCommandEvent event; + private final InteractionMember member; + private final List<String> replyBuffer = new ArrayList<>(); + + public InteractionEventImpl(final SlashCommandEvent jdaEvent) { + this.event = jdaEvent; + this.member = new InteractionMemberImpl(jdaEvent.getMember()); + } + + @Override + public void reply(String message) { + message = FormatUtil.stripFormat(message).replace("§", ""); // Don't ask + replyBuffer.add(message); + event.getHook().editOriginal(new MessageBuilder().setContent(Joiner.on('\n').join(replyBuffer)).setAllowedMentions(DiscordUtil.NO_GROUP_MENTIONS).build()) + .queue(null, error -> logger.log(Level.SEVERE, "Error while editing command interaction response", error)); + } + + @Override + public InteractionMember getMember() { + return member; + } + + @Override + public String getStringArgument(String key) { + final OptionMapping mapping = event.getOption(key); + return mapping == null ? null : mapping.getAsString(); + } + + @Override + public Long getIntegerArgument(String key) { + final OptionMapping mapping = event.getOption(key); + return mapping == null ? null : mapping.getAsLong(); + } + + @Override + public Boolean getBooleanArgument(String key) { + final OptionMapping mapping = event.getOption(key); + return mapping == null ? null : mapping.getAsBoolean(); + } + + @Override + public InteractionMember getUserArgument(String key) { + final OptionMapping mapping = event.getOption(key); + return mapping == null ? null : new InteractionMemberImpl(mapping.getAsMember()); + } + + @Override + public InteractionChannel getChannelArgument(String key) { + final OptionMapping mapping = event.getOption(key); + return mapping == null ? null : new InteractionChannelImpl(mapping.getAsGuildChannel()); + } + + @Override + public String getChannelId() { + return event.getChannel().getId(); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionMemberImpl.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionMemberImpl.java new file mode 100644 index 00000000000..1184fdba83e --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionMemberImpl.java @@ -0,0 +1,72 @@ +package net.essentialsx.discord.interactions; + +import net.dv8tion.jda.api.Permission; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.PrivateChannel; +import net.essentialsx.api.v2.services.discord.InteractionMember; +import net.essentialsx.discord.util.DiscordUtil; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class InteractionMemberImpl implements InteractionMember { + private final Member member; + + public InteractionMemberImpl(Member member) { + this.member = member; + } + + @Override + public String getName() { + return member.getUser().getName(); + } + + @Override + public String getDiscriminator() { + return member.getUser().getDiscriminator(); + } + + @Override + public String getEffectiveName() { + return member.getEffectiveName(); + } + + @Override + public String getNickname() { + return member.getNickname(); + } + + @Override + public String getId() { + return member.getId(); + } + + @Override + public boolean isAdmin() { + return member.hasPermission(Permission.ADMINISTRATOR); + } + + @Override + public boolean hasRoles(List<String> roleDefinitions) { + return DiscordUtil.hasRoles(member, roleDefinitions); + } + + public Member getJdaObject() { + return member; + } + + @Override + public CompletableFuture<Boolean> sendPrivateMessage(String content) { + final CompletableFuture<Boolean> future = new CompletableFuture<>(); + final CompletableFuture<PrivateChannel> privateFuture = member.getUser().openPrivateChannel().submit(); + privateFuture.thenCompose(privateChannel -> privateChannel.sendMessage(content).submit()) + .whenComplete((m, error) -> { + if (error != null) { + future.complete(false); + return; + } + future.complete(true); + }); + return future; + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java new file mode 100644 index 00000000000..99b724d4dd5 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java @@ -0,0 +1,26 @@ +package net.essentialsx.discord.interactions.commands; + +import net.essentialsx.api.v2.services.discord.InteractionCommandArgument; +import net.essentialsx.api.v2.services.discord.InteractionCommandArgumentType; +import net.essentialsx.api.v2.services.discord.InteractionEvent; +import net.essentialsx.discord.JDADiscordService; +import net.essentialsx.discord.interactions.InteractionCommandImpl; +import net.essentialsx.discord.util.DiscordCommandSender; +import org.bukkit.Bukkit; + +import static com.earth2me.essentials.I18n.tl; + +public class ExecuteCommand extends InteractionCommandImpl { + public ExecuteCommand(JDADiscordService jda) { + super(jda, "execute", tl("discordCommandExecuteDescription")); + addArgument(new InteractionCommandArgument("command", tl("discordCommandExecuteArgumentCommand"), InteractionCommandArgumentType.STRING, true)); + } + + @Override + public void onCommand(InteractionEvent event) { + final String command = event.getStringArgument("command"); + event.reply(tl("discordCommandExecuteReply", command)); + Bukkit.getScheduler().runTask(jda.getPlugin(), () -> + Bukkit.dispatchCommand(new DiscordCommandSender(jda, Bukkit.getConsoleSender(), event::reply).getSender(), command)); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ListCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ListCommand.java new file mode 100644 index 00000000000..dc68a7f434a --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ListCommand.java @@ -0,0 +1,51 @@ +package net.essentialsx.discord.interactions.commands; + +import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.PlayerList; +import com.earth2me.essentials.User; +import net.essentialsx.api.v2.services.discord.InteractionCommandArgument; +import net.essentialsx.api.v2.services.discord.InteractionCommandArgumentType; +import net.essentialsx.api.v2.services.discord.InteractionEvent; +import net.essentialsx.discord.JDADiscordService; +import net.essentialsx.discord.interactions.InteractionCommandImpl; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static com.earth2me.essentials.I18n.tl; + +public class ListCommand extends InteractionCommandImpl { + + public ListCommand(JDADiscordService jda) { + super(jda, "list", tl("discordCommandListDescription")); + addArgument(new InteractionCommandArgument("group", tl("discordCommandListArgumentGroup"), InteractionCommandArgumentType.STRING, false)); + } + + @Override + public void onCommand(InteractionEvent event) { + final boolean showHidden = event.getMember().hasRoles(getAdminSnowflakes()); + final List<String> output = new ArrayList<>(); + final IEssentials ess = jda.getPlugin().getEss(); + + output.add(PlayerList.listSummary(ess, null, showHidden)); + final Map<String, List<User>> playerList = PlayerList.getPlayerLists(ess, null, showHidden); + + final String group = event.getStringArgument("group"); + if (group != null) { + try { + output.add(PlayerList.listGroupUsers(ess, playerList, group)); + } catch (Exception e) { + output.add(tl("errorWithMessage", e.getMessage())); + } + } else { + output.addAll(PlayerList.prepareGroupedList(ess, getName(), playerList)); + } + + final StringBuilder stringBuilder = new StringBuilder(); + for (final String str : output) { + stringBuilder.append(str).append("\n"); + } + event.reply(stringBuilder.substring(0, stringBuilder.length() - 2)); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java new file mode 100644 index 00000000000..5a7b8e8a3bb --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/MessageCommand.java @@ -0,0 +1,59 @@ +package net.essentialsx.discord.interactions.commands; + +import com.earth2me.essentials.User; +import com.earth2me.essentials.commands.PlayerNotFoundException; +import com.earth2me.essentials.utils.FormatUtil; +import net.essentialsx.api.v2.services.discord.InteractionCommandArgument; +import net.essentialsx.api.v2.services.discord.InteractionCommandArgumentType; +import net.essentialsx.api.v2.services.discord.InteractionEvent; +import net.essentialsx.discord.JDADiscordService; +import net.essentialsx.discord.interactions.InteractionCommandImpl; +import net.essentialsx.discord.util.DiscordMessageRecipient; +import org.bukkit.Bukkit; + +import java.util.concurrent.atomic.AtomicReference; + +import static com.earth2me.essentials.I18n.tl; + +public class MessageCommand extends InteractionCommandImpl { + public MessageCommand(JDADiscordService jda) { + super(jda, "msg", tl("discordCommandMessageDescription")); + addArgument(new InteractionCommandArgument("username", tl("discordCommandMessageArgumentUsername"), InteractionCommandArgumentType.STRING, true)); + addArgument(new InteractionCommandArgument("message", tl("discordCommandMessageArgumentMessage"), InteractionCommandArgumentType.STRING, true)); + } + + @Override + public void onCommand(InteractionEvent event) { + final boolean getHidden = event.getMember().hasRoles(getAdminSnowflakes()); + final User user; + try { + user = jda.getPlugin().getEss().matchUser(Bukkit.getServer(), null, event.getStringArgument("username"), getHidden, false); + } catch (PlayerNotFoundException e) { + event.reply(tl("errorWithMessage", e.getMessage())); + return; + } + + if (!getHidden && user.isIgnoreMsg()) { + event.reply(tl("msgIgnore", user.getDisplayName())); + return; + } + + if (user.isAfk()) { + if (user.getAfkMessage() != null) { + event.reply(tl("userAFKWithMessage", user.getDisplayName(), user.getAfkMessage())); + } else { + event.reply(tl("userAFK", user.getDisplayName())); + } + } + + final String message = event.getMember().hasRoles(jda.getSettings().getPermittedFormattingRoles()) ? + FormatUtil.replaceFormat(event.getStringArgument("message")) : FormatUtil.stripFormat(event.getStringArgument("message")); + event.reply(tl("msgFormat", tl("meSender"), user.getDisplayName(), message)); + + user.sendMessage(tl("msgFormat", event.getMember().getTag(), tl("meRecipient"), message)); + // We use an atomic reference here so that java will garbage collect the recipient + final AtomicReference<DiscordMessageRecipient> ref = new AtomicReference<>(new DiscordMessageRecipient(event.getMember())); + jda.getPlugin().getEss().runTaskLaterAsynchronously(() -> ref.set(null), 6000); // Expires after 5 minutes + user.setReplyRecipient(ref.get()); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java new file mode 100644 index 00000000000..5e6c5f66bd7 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java @@ -0,0 +1,191 @@ +package net.essentialsx.discord.listeners; + +import com.earth2me.essentials.Console; +import com.earth2me.essentials.utils.DateUtil; +import com.earth2me.essentials.utils.FormatUtil; +import net.ess3.api.events.AfkStatusChangeEvent; +import net.ess3.api.events.MuteStatusChangeEvent; +import net.essentialsx.api.v2.events.AsyncUserDataLoadEvent; +import net.essentialsx.api.v2.events.discord.DiscordChatMessageEvent; +import net.essentialsx.api.v2.events.discord.DiscordMessageEvent; +import net.essentialsx.api.v2.services.discord.MessageType; +import net.essentialsx.discord.JDADiscordService; +import net.essentialsx.discord.util.MessageUtil; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.text.MessageFormat; +import java.util.UUID; + +public class BukkitListener implements Listener { + private final static String AVATAR_URL = "https://crafthead.net/helm/{uuid}"; + private final JDADiscordService jda; + + public BukkitListener(JDADiscordService jda) { + this.jda = jda; + } + + /** + * Processes messages from all other events. + * This way it allows other plugins to modify route/message or just cancel it. + */ + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onDiscordMessage(DiscordMessageEvent event) { + jda.sendMessage(event, event.getMessage(), event.isAllowGroupMentions()); + } + + // Bukkit Events + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMute(MuteStatusChangeEvent event) { + if (!event.getValue()) { + sendDiscordMessage(MessageType.DefaultTypes.MUTE, + MessageUtil.formatMessage(jda.getSettings().getUnmuteFormat(), + MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getName()), + MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getDisplayName()))); + } else if (event.getTimestamp().isPresent()) { + final boolean console = event.getController() == null; + final MessageFormat msg = event.getReason() == null ? jda.getSettings().getTempMuteFormat() : jda.getSettings().getTempMuteReasonFormat(); + sendDiscordMessage(MessageType.DefaultTypes.MUTE, + MessageUtil.formatMessage(msg, + MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getName()), + MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getDisplayName()), + MessageUtil.sanitizeDiscordMarkdown(console ? Console.NAME : event.getController().getName()), + MessageUtil.sanitizeDiscordMarkdown(console ? Console.DISPLAY_NAME : event.getController().getDisplayName()), + DateUtil.formatDateDiff(event.getTimestamp().get()), + MessageUtil.sanitizeDiscordMarkdown(event.getReason()))); + } else { + final boolean console = event.getController() == null; + final MessageFormat msg = event.getReason() == null ? jda.getSettings().getPermMuteFormat() : jda.getSettings().getPermMuteReasonFormat(); + sendDiscordMessage(MessageType.DefaultTypes.MUTE, + MessageUtil.formatMessage(msg, + MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getName()), + MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getDisplayName()), + MessageUtil.sanitizeDiscordMarkdown(console ? Console.NAME : event.getController().getName()), + MessageUtil.sanitizeDiscordMarkdown(console ? Console.DISPLAY_NAME : event.getController().getDisplayName()), + MessageUtil.sanitizeDiscordMarkdown(event.getReason()))); + } + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onChat(AsyncPlayerChatEvent event) { + final Player player = event.getPlayer(); + Bukkit.getScheduler().runTask(jda.getPlugin(), () -> { + final DiscordChatMessageEvent chatEvent = new DiscordChatMessageEvent(event.getPlayer(), event.getMessage()); + chatEvent.setCancelled(!jda.getSettings().isShowAllChat() && !event.getRecipients().containsAll(Bukkit.getOnlinePlayers())); + Bukkit.getPluginManager().callEvent(chatEvent); + if (chatEvent.isCancelled()) { + return; + } + + sendDiscordMessage(MessageType.DefaultTypes.CHAT, + MessageUtil.formatMessage(jda.getSettings().getMcToDiscordFormat(player), + MessageUtil.sanitizeDiscordMarkdown(player.getName()), + MessageUtil.sanitizeDiscordMarkdown(player.getDisplayName()), + player.hasPermission("essentials.discord.markdown") ? chatEvent.getMessage() : MessageUtil.sanitizeDiscordMarkdown(chatEvent.getMessage()), + MessageUtil.sanitizeDiscordMarkdown(player.getWorld().getName()), + MessageUtil.sanitizeDiscordMarkdown(FormatUtil.stripEssentialsFormat(jda.getPlugin().getEss().getPermissionsHandler().getPrefix(player))), + MessageUtil.sanitizeDiscordMarkdown(FormatUtil.stripEssentialsFormat(jda.getPlugin().getEss().getPermissionsHandler().getSuffix(player)))), + player.hasPermission("essentials.discord.ping"), + jda.getSettings().isShowAvatar() ? AVATAR_URL.replace("{uuid}", player.getUniqueId().toString()) : null, + jda.getSettings().isShowName() ? player.getName() : null, + player.getUniqueId()); + }); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onJoin(AsyncUserDataLoadEvent event) { + // Delay join to let nickname load + if (event.getJoinMessage() != null) { + sendDiscordMessage(MessageType.DefaultTypes.JOIN, + MessageUtil.formatMessage(jda.getSettings().getJoinFormat(event.getUser().getBase()), + MessageUtil.sanitizeDiscordMarkdown(event.getUser().getName()), + MessageUtil.sanitizeDiscordMarkdown(event.getUser().getDisplayName()), + MessageUtil.sanitizeDiscordMarkdown(event.getJoinMessage())), + false, + jda.getSettings().isShowAvatar() ? AVATAR_URL.replace("{uuid}", event.getUser().getBase().getUniqueId().toString()) : null, + jda.getSettings().isShowName() ? event.getUser().getName() : null, + event.getUser().getBase().getUniqueId()); + } + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onQuit(PlayerQuitEvent event) { + if (event.getQuitMessage() != null) { + sendDiscordMessage(MessageType.DefaultTypes.LEAVE, + MessageUtil.formatMessage(jda.getSettings().getQuitFormat(event.getPlayer()), + MessageUtil.sanitizeDiscordMarkdown(event.getPlayer().getName()), + MessageUtil.sanitizeDiscordMarkdown(event.getPlayer().getDisplayName()), + MessageUtil.sanitizeDiscordMarkdown(event.getQuitMessage())), + false, + jda.getSettings().isShowAvatar() ? AVATAR_URL.replace("{uuid}", event.getPlayer().getUniqueId().toString()) : null, + jda.getSettings().isShowName() ? event.getPlayer().getName() : null, + event.getPlayer().getUniqueId()); + } + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onDeath(PlayerDeathEvent event) { + sendDiscordMessage(MessageType.DefaultTypes.DEATH, + MessageUtil.formatMessage(jda.getSettings().getDeathFormat(event.getEntity()), + MessageUtil.sanitizeDiscordMarkdown(event.getEntity().getName()), + MessageUtil.sanitizeDiscordMarkdown(event.getEntity().getDisplayName()), + MessageUtil.sanitizeDiscordMarkdown(event.getDeathMessage())), + false, + jda.getSettings().isShowAvatar() ? AVATAR_URL.replace("{uuid}", event.getEntity().getUniqueId().toString()) : null, + jda.getSettings().isShowName() ? event.getEntity().getName() : null, + event.getEntity().getUniqueId()); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onAfk(AfkStatusChangeEvent event) { + final MessageFormat format; + if (event.getValue()) { + format = jda.getSettings().getAfkFormat(event.getAffected().getBase()); + } else { + format = jda.getSettings().getUnAfkFormat(event.getAffected().getBase()); + } + + sendDiscordMessage(MessageType.DefaultTypes.AFK, + MessageUtil.formatMessage(format, + MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getName()), + MessageUtil.sanitizeDiscordMarkdown(event.getAffected().getDisplayName())), + false, + jda.getSettings().isShowAvatar() ? AVATAR_URL.replace("{uuid}", event.getAffected().getBase().getUniqueId().toString()) : null, + jda.getSettings().isShowName() ? event.getAffected().getName() : null, + event.getAffected().getBase().getUniqueId()); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onKick(PlayerKickEvent event) { + sendDiscordMessage(MessageType.DefaultTypes.KICK, + MessageUtil.formatMessage(jda.getSettings().getKickFormat(), + MessageUtil.sanitizeDiscordMarkdown(event.getPlayer().getName()), + MessageUtil.sanitizeDiscordMarkdown(event.getPlayer().getDisplayName()), + MessageUtil.sanitizeDiscordMarkdown(event.getReason()))); + } + + private void sendDiscordMessage(final MessageType messageType, final String message) { + sendDiscordMessage(messageType, message, false, null, null, null); + } + + private void sendDiscordMessage(final MessageType messageType, final String message, final boolean allowPing, final String avatarUrl, final String name, final UUID uuid) { + if (jda.getPlugin().getSettings().getMessageChannel(messageType.getKey()).equalsIgnoreCase("none")) { + return; + } + + final DiscordMessageEvent event = new DiscordMessageEvent(messageType, FormatUtil.stripFormat(message), allowPing, avatarUrl, name, uuid); + if (Bukkit.getServer().isPrimaryThread()) { + Bukkit.getPluginManager().callEvent(event); + } else { + Bukkit.getScheduler().runTask(jda.getPlugin(), () -> Bukkit.getPluginManager().callEvent(event)); + } + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordCommandDispatcher.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordCommandDispatcher.java new file mode 100644 index 00000000000..40757572de9 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordCommandDispatcher.java @@ -0,0 +1,31 @@ +package net.essentialsx.discord.listeners; + +import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.essentialsx.discord.JDADiscordService; +import net.essentialsx.discord.util.DiscordCommandSender; +import org.bukkit.Bukkit; +import org.jetbrains.annotations.NotNull; + +public class DiscordCommandDispatcher extends ListenerAdapter { + private final JDADiscordService jda; + private String channelId = null; + + public DiscordCommandDispatcher(JDADiscordService jda) { + this.jda = jda; + } + + @Override + public void onGuildMessageReceived(@NotNull GuildMessageReceivedEvent event) { + if (jda.getConsoleWebhook() != null && event.getChannel().getId().equals(channelId) + && !event.isWebhookMessage() && !event.getAuthor().isBot()) { + Bukkit.getScheduler().runTask(jda.getPlugin(), () -> + Bukkit.dispatchCommand(new DiscordCommandSender(jda, Bukkit.getConsoleSender(), message -> + event.getMessage().reply(message).queue()).getSender(), event.getMessage().getContentRaw())); + } + } + + public void setChannelId(String channelId) { + this.channelId = channelId; + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordListener.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordListener.java new file mode 100644 index 00000000000..e63ee62120c --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordListener.java @@ -0,0 +1,101 @@ +package net.essentialsx.discord.listeners; + +import com.earth2me.essentials.utils.FormatUtil; +import com.vdurmont.emoji.EmojiParser; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.ess3.api.IUser; +import net.essentialsx.discord.JDADiscordService; +import net.essentialsx.discord.util.DiscordUtil; +import net.essentialsx.discord.util.MessageUtil; +import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class DiscordListener extends ListenerAdapter { + private final static Logger logger = Logger.getLogger("EssentialsDiscord"); + + private final JDADiscordService plugin; + + public DiscordListener(JDADiscordService plugin) { + this.plugin = plugin; + } + + @Override + public void onGuildMessageReceived(@NotNull GuildMessageReceivedEvent event) { + if (event.getAuthor().isBot() && !event.isWebhookMessage() && (!plugin.getSettings().isShowBotMessages() || event.getAuthor().getId().equals(plugin.getJda().getSelfUser().getId()))) { + return; + } + + if (event.isWebhookMessage() && (!plugin.getSettings().isShowWebhookMessages() || DiscordUtil.ACTIVE_WEBHOOKS.contains(event.getAuthor().getId()))) { + return; + } + + // Get list of channel names that have this channel id mapped + final List<String> keys = plugin.getPlugin().getSettings().getKeysFromChannelId(event.getChannel().getIdLong()); + if (keys == null || keys.size() == 0) { + if (plugin.isDebug()) { + logger.log(Level.INFO, "Skipping message due to no channel keys for id " + event.getChannel().getIdLong() + "!"); + } + return; + } + + final User user = event.getAuthor(); + final Member member = event.getMember(); + final Message message = event.getMessage(); + + assert member != null; // Member will never be null + + if (plugin.getSettings().getDiscordFilter() != null && plugin.getSettings().getDiscordFilter().matcher(message.getContentDisplay()).find()) { + if (plugin.isDebug()) { + logger.log(Level.INFO, "Skipping message " + message.getId() + " with content, \"" + message.getContentDisplay() + "\" as it matched the filter!"); + } + return; + } + + final StringBuilder messageBuilder = new StringBuilder(message.getContentDisplay()); + if (plugin.getPlugin().getSettings().isShowDiscordAttachments()) { + for (final Message.Attachment attachment : message.getAttachments()) { + messageBuilder.append(" ").append(attachment.getUrl()); + } + } + + // Strip message + final String strippedMessage = StringUtils.abbreviate( + messageBuilder.toString() + .replace(plugin.getSettings().isChatFilterNewlines() ? '\n' : ' ', ' ') + .trim(), plugin.getSettings().getChatDiscordMaxLength()); + + // Apply or strip color formatting + final String finalMessage = DiscordUtil.hasRoles(member, plugin.getPlugin().getSettings().getPermittedFormattingRoles()) ? + FormatUtil.replaceFormat(strippedMessage) : FormatUtil.stripFormat(strippedMessage); + + // Don't send blank messages + if (finalMessage.trim().length() == 0) { + if (plugin.isDebug()) { + logger.log(Level.INFO, "Skipping finalized empty message " + message.getId()); + } + return; + } + + final String formattedMessage = EmojiParser.parseToAliases(MessageUtil.formatMessage(plugin.getPlugin().getSettings().getDiscordToMcFormat(), + event.getChannel().getName(), user.getName(), user.getDiscriminator(), user.getAsTag(), + member.getEffectiveName(), DiscordUtil.getRoleColorFormat(member), finalMessage), EmojiParser.FitzpatrickAction.REMOVE); + + for (IUser essUser : plugin.getPlugin().getEss().getOnlineUsers()) { + for (String group : keys) { + final String perm = "essentials.discord.receive." + group; + final boolean primaryOverride = plugin.getSettings().isAlwaysReceivePrimary() && group.equalsIgnoreCase("primary"); + if (primaryOverride || (essUser.isPermissionSet(perm) && essUser.isAuthorized(perm))) { + essUser.sendMessage(formattedMessage); + } + } + } + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/ConsoleInjector.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/ConsoleInjector.java new file mode 100644 index 00000000000..8b33315ab59 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/ConsoleInjector.java @@ -0,0 +1,89 @@ +package net.essentialsx.discord.util; + +import com.earth2me.essentials.utils.FormatUtil; +import com.google.common.base.Splitter; +import net.dv8tion.jda.api.entities.Message; +import net.essentialsx.discord.JDADiscordService; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.bukkit.Bukkit; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +import static com.earth2me.essentials.I18n.tl; + +@Plugin(name = "EssentialsX-ConsoleInjector", category = "Core", elementType = "appender", printObject = true) +public class ConsoleInjector extends AbstractAppender { + private final static java.util.logging.Logger logger = java.util.logging.Logger.getLogger("EssentialsDiscord"); + + private final JDADiscordService jda; + private final BlockingQueue<String> messageQueue = new LinkedBlockingQueue<>(); + private final SimpleDateFormat timestampFormat = new SimpleDateFormat("HH:mm:ss"); + private final int taskId; + + public ConsoleInjector(JDADiscordService jda) { + super("EssentialsX-ConsoleInjector", null, null, false); + this.jda = jda; + ((Logger) LogManager.getRootLogger()).addAppender(this); + taskId = Bukkit.getScheduler().runTaskTimerAsynchronously(jda.getPlugin(), () -> { + final StringBuilder buffer = new StringBuilder(); + String curLine; + while ((curLine = messageQueue.peek()) != null) { + if (buffer.length() + curLine.length() > Message.MAX_CONTENT_LENGTH - 2) { + sendMessage(buffer.toString()); + buffer.setLength(0); + continue; + } + buffer.append("\n").append(messageQueue.poll()); + } + if (buffer.length() != 0) { + sendMessage(buffer.toString()); + } + }, 20, 40).getTaskId(); + } + + private void sendMessage(String content) { + jda.getConsoleWebhook().send(jda.getWebhookMessage(content)).exceptionally(e -> { + logger.severe(tl("discordErrorWebhook")); + remove(); + return null; + }); + } + + @Override + public void append(LogEvent event) { + if (event.getLevel().intLevel() > jda.getSettings().getConsoleLogLevel().intLevel()) { + return; + } + + // Ansi strip is for normal colors, normal strip is for 1.16 hex color codes as they are not formatted correctly + String entry = FormatUtil.stripFormat(FormatUtil.stripAnsi(event.getMessage().getFormattedMessage())).trim(); + if (entry.isEmpty()) { + return; + } + + final String loggerName = event.getLoggerName(); + if (!loggerName.isEmpty() && !loggerName.contains(".")) { + entry = "[" + event.getLoggerName() + "] " + entry; + } + + //noinspection UnstableApiUsage + messageQueue.addAll(Splitter.fixedLength(Message.MAX_CONTENT_LENGTH).splitToList( + MessageUtil.formatMessage(jda.getSettings().getConsoleFormat(), + timestampFormat.format(new Date()), + event.getLevel().name(), + MessageUtil.sanitizeDiscordMarkdown(entry)))); + } + + public void remove() { + ((Logger) LogManager.getRootLogger()).removeAppender(this); + Bukkit.getScheduler().cancelTask(taskId); + messageQueue.clear(); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordCommandSender.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordCommandSender.java new file mode 100644 index 00000000000..8bf7c5decaa --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordCommandSender.java @@ -0,0 +1,46 @@ +package net.essentialsx.discord.util; + +import com.earth2me.essentials.utils.FormatUtil; +import com.earth2me.essentials.utils.VersionUtil; +import net.ess3.provider.providers.BukkitSenderProvider; +import net.ess3.provider.providers.PaperCommandSender; +import net.essentialsx.discord.JDADiscordService; +import org.bukkit.Bukkit; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.scheduler.BukkitTask; + +public class DiscordCommandSender { + private final BukkitSenderProvider sender; + private BukkitTask task; + private String responseBuffer = ""; + private long lastTime = System.currentTimeMillis(); + + public DiscordCommandSender(JDADiscordService jda, ConsoleCommandSender sender, CmdCallback callback) { + final BukkitSenderProvider.MessageHook hook = message -> { + responseBuffer = responseBuffer + (responseBuffer.isEmpty() ? "" : "\n") + MessageUtil.sanitizeDiscordMarkdown(FormatUtil.stripFormat(message)); + lastTime = System.currentTimeMillis(); + }; + this.sender = (VersionUtil.isPaper() && VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_16_5_R01)) ? new PaperCommandSender(sender, hook) : new BukkitSenderProvider(sender, hook); + + task = Bukkit.getScheduler().runTaskTimerAsynchronously(jda.getPlugin(), () -> { + if (!responseBuffer.isEmpty() && System.currentTimeMillis() - lastTime >= 1000) { + callback.onMessage(responseBuffer); + responseBuffer = ""; + lastTime = System.currentTimeMillis(); + return; + } + + if (System.currentTimeMillis() - lastTime >= 20000) { + task.cancel(); + } + }, 0, 20); + } + + public interface CmdCallback { + void onMessage(String message); + } + + public BukkitSenderProvider getSender() { + return sender; + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordMessageRecipient.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordMessageRecipient.java new file mode 100644 index 00000000000..c047917c637 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordMessageRecipient.java @@ -0,0 +1,75 @@ +package net.essentialsx.discord.util; + +import com.earth2me.essentials.messaging.IMessageRecipient; +import com.earth2me.essentials.utils.FormatUtil; +import net.essentialsx.api.v2.services.discord.InteractionMember; +import org.bukkit.entity.Player; + +import java.util.concurrent.atomic.AtomicBoolean; + +import static com.earth2me.essentials.I18n.tl; + +public class DiscordMessageRecipient implements IMessageRecipient { + private final InteractionMember member; + private final AtomicBoolean died = new AtomicBoolean(false); + + public DiscordMessageRecipient(InteractionMember member) { + this.member = member; + } + + @Override + public void sendMessage(String message) { + } + + @Override + public MessageResponse sendMessage(IMessageRecipient recipient, String message) { + return MessageResponse.UNREACHABLE; + } + + @Override + public MessageResponse onReceiveMessage(IMessageRecipient sender, String message) { + if (died.get()) { + sender.setReplyRecipient(null); + return MessageResponse.UNREACHABLE; + } + + final String cleanMessage = MessageUtil.sanitizeDiscordMarkdown(FormatUtil.stripFormat(message)); + + member.sendPrivateMessage(tl("replyFromDiscord", sender.getName(), cleanMessage)).thenAccept(success -> { + if (!success) { + died.set(true); + } + }); + return MessageResponse.SUCCESS; + } + + @Override + public String getName() { + return member.getTag(); + } + + @Override + public String getDisplayName() { + return member.getTag(); + } + + @Override + public boolean isReachable() { + return !died.get(); + } + + @Override + public IMessageRecipient getReplyRecipient() { + return null; + } + + @Override + public void setReplyRecipient(IMessageRecipient recipient) { + + } + + @Override + public boolean isHiddenFrom(Player player) { + return died.get(); + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java new file mode 100644 index 00000000000..0daa82c3e9f --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java @@ -0,0 +1,168 @@ +package net.essentialsx.discord.util; + +import club.minnced.discord.webhook.WebhookClient; +import club.minnced.discord.webhook.WebhookClientBuilder; +import club.minnced.discord.webhook.send.AllowedMentions; +import com.earth2me.essentials.utils.DownsampleUtil; +import com.earth2me.essentials.utils.FormatUtil; +import com.earth2me.essentials.utils.VersionUtil; +import com.google.common.collect.ImmutableList; +import net.dv8tion.jda.api.Permission; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.entities.TextChannel; +import net.dv8tion.jda.api.entities.Webhook; +import okhttp3.OkHttpClient; + +import java.awt.Color; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Consumer; + +public final class DiscordUtil { + public final static List<Message.MentionType> NO_GROUP_MENTIONS; + public final static AllowedMentions ALL_MENTIONS_WEBHOOK = AllowedMentions.all(); + public final static AllowedMentions NO_GROUP_MENTIONS_WEBHOOK = new AllowedMentions().withParseEveryone(false).withParseRoles(false).withParseUsers(true); + public final static CopyOnWriteArrayList<String> ACTIVE_WEBHOOKS = new CopyOnWriteArrayList<>(); + + static { + final ImmutableList.Builder<Message.MentionType> types = new ImmutableList.Builder<>(); + types.add(Message.MentionType.USER); + types.add(Message.MentionType.CHANNEL); + types.add(Message.MentionType.EMOTE); + NO_GROUP_MENTIONS = types.build(); + } + + private DiscordUtil() { + } + + /** + * Creates a {@link WebhookClient}. + * + * @param id The id of the webhook. + * @param token The token of the webhook. + * @param client The http client of the webhook. + * @return The {@link WebhookClient}. + */ + public static WebhookClient getWebhookClient(long id, String token, OkHttpClient client) { + return new WebhookClientBuilder(id, token) + .setAllowedMentions(AllowedMentions.none()) + .setHttpClient(client) + .setDaemon(true) + .build(); + } + + /** + * Gets and cleans webhooks with the given name from channels other than the specified one. + * + * @param channel The channel to search for webhooks in. + * @param webhookName The name of the webhook to validate it. + * + * @return A future which completes with the webhook by the given name in the given channel, if present, otherwise null. + */ + public static CompletableFuture<Webhook> getAndCleanWebhooks(final TextChannel channel, final String webhookName) { + final Member self = channel.getGuild().getSelfMember(); + + final CompletableFuture<Webhook> future = new CompletableFuture<>(); + final Consumer<List<Webhook>> consumer = webhooks -> { + boolean foundWebhook = false; + for (final Webhook webhook : webhooks) { + if (webhook.getName().equalsIgnoreCase(webhookName)) { + if (foundWebhook || !webhook.getChannel().equals(channel)) { + ACTIVE_WEBHOOKS.remove(webhook.getId()); + webhook.delete().reason("EssX Webhook Cleanup").queue(); + continue; + } + ACTIVE_WEBHOOKS.addIfAbsent(webhook.getId()); + future.complete(webhook); + foundWebhook = true; + } + } + + if (!foundWebhook) { + future.complete(null); + } + }; + + if (self.hasPermission(Permission.MANAGE_WEBHOOKS)) { + channel.getGuild().retrieveWebhooks().queue(consumer); + } else if (self.hasPermission(channel, Permission.MANAGE_WEBHOOKS)) { + channel.retrieveWebhooks().queue(consumer); + } else { + return CompletableFuture.completedFuture(null); + } + + return future; + } + + /** + * Creates a webhook with the given name in the given channel. + * + * @param channel The channel to search for webhooks in. + * @param webhookName The name of the webhook to look for. + * @return A future which completes with the webhook by the given name in the given channel or null if no permissions. + */ + public static CompletableFuture<Webhook> createWebhook(TextChannel channel, String webhookName) { + if (!channel.getGuild().getSelfMember().hasPermission(channel, Permission.MANAGE_WEBHOOKS)) { + return CompletableFuture.completedFuture(null); + } + + final CompletableFuture<Webhook> future = new CompletableFuture<>(); + channel.createWebhook(webhookName).queue(webhook -> { + future.complete(webhook); + ACTIVE_WEBHOOKS.addIfAbsent(webhook.getId()); + }); + return future; + } + + /** + * Gets the uppermost bukkit color code of a given member or an empty string if the server version is < 1.16. + * + * @param member The target member. + * @return The bukkit color code or blank string. + */ + public static String getRoleColorFormat(Member member) { + final Color color = member.getColor(); + + if (color == null) { + return ""; + } + + if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_16_1_R01)) { + // Essentials' FormatUtil allows us to not have to use bungee's chatcolor since bukkit's own one doesn't support rgb + return FormatUtil.replaceFormat("&#" + Integer.toHexString(color.getRGB()).substring(2)); + } + return FormatUtil.replaceFormat("&" + DownsampleUtil.nearestTo(color.getRGB())); + } + + /** + * Checks is the supplied user has at least one of the supplied roles. + * + * @param member The member to check. + * @param roleDefinitions A list with either the name or id of roles. + * @return true if member has role. + */ + public static boolean hasRoles(Member member, List<String> roleDefinitions) { + if (member.hasPermission(Permission.ADMINISTRATOR)) { + return true; + } + + final List<Role> roles = member.getRoles(); + for (String roleDefinition : roleDefinitions) { + roleDefinition = roleDefinition.trim(); + + if (roleDefinition.equals("*") || member.getId().equals(roleDefinition)) { + return true; + } + + for (final Role role : roles) { + if (role.getId().equals(roleDefinition) || role.getName().equalsIgnoreCase(roleDefinition)) { + return true; + } + } + } + return false; + } +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/MessageUtil.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/MessageUtil.java new file mode 100644 index 00000000000..e84f3f2fbc5 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/MessageUtil.java @@ -0,0 +1,31 @@ +package net.essentialsx.discord.util; + +import java.text.MessageFormat; + +public final class MessageUtil { + private MessageUtil() { + } + + /** + * Sanitizes text to be sent to Discord, escaping any Markdown syntax. + */ + public static String sanitizeDiscordMarkdown(String message) { + if (message == null) { + return null; + } + + return message.replace("*", "\\*") + .replace("~", "\\~") + .replace("_", "\\_") + .replace("`", "\\`") + .replace(">", "\\>") + .replace("|", "\\|"); + } + + /** + * Shortcut method allowing for use of varags in {@link MessageFormat} instances + */ + public static String formatMessage(MessageFormat format, Object... args) { + return format.format(args); + } +} diff --git a/EssentialsDiscord/src/main/resources/config.yml b/EssentialsDiscord/src/main/resources/config.yml new file mode 100644 index 00000000000..78d0916fe5c --- /dev/null +++ b/EssentialsDiscord/src/main/resources/config.yml @@ -0,0 +1,299 @@ +############################################################# +# +-------------------------------------------------------+ # +# | EssentialsX Discord | # +# +-------------------------------------------------------+ # +############################################################# + +# This is the config file for EssentialsX Discord. +# This config was generated for version ${full.version}. + +# You need to create a bot user in order to connect your server to Discord. +# You can find instructions on this here: https://essentialsx.net/discord-tutorial + +# The token for your bot from the Discord Developers site. +# Please make sure to use this site to add the bot to your server as it grants special permissions you may not be familiar with: https://essentialsx.net/discord.html +token: "INSERT-TOKEN-HERE" + +# The ID of your server. +guild: 000000000000000000 + +# Defined text channels +# ===================== +# +# Channels defined here can be used for two different purposes: +# +# Firstly, channels defined here can be used to give players permission to see messages from said channel. +# This can be done by give your players the permission node "essentials.discord.receive.<channel>". +# For example, if you wanted to let a player see messages from the primary channel, you'd give them "essentials.discord.receive.primary". +# +# Secondly, channels defined here can be used in the section below to specify which channel a message goes to. +# If a defined channel ID is invalid, the primary channel will be used as a fallback. +# If the primary channel is not defined or invalid, the default channel of the server will be used. +# If your server doesn't have any text channels, the plugin will be disabled. +# By default, two channels are defined: +# - primary, which will send basic join/leave/death/chat messages +# - staff, which will send kick/mute messages +# (note: you will need to replace the zeros with the actual channel ID you want to use) +channels: + primary: 000000000000000000 + staff: 000000000000000000 + +# Should all players receive Discord messages from the primary channel, regardless of their permissions? +# This is intended for use for people without permission plugins. If you have a permission plugin, please give your +# players the essentials.discord.receive.primary permission. +always-receive-primary: false + +# Chat relay settings +# General settings for chat relays between Minecraft and Discord. +# To configure the channel Minecraft chat is sent to, see the "message-types" section of the config. +chat: + # The maximum amount of characters messages from Discord should be before being truncated. + discord-max-length: 2000 + # Whether or not new lines from Discord should be filtered or not. + filter-newlines: true + # A regex pattern which will not send matching messages through to Discord. + # By default, this will ignore messages starting with '!' and '?'. + discord-filter: "^[!?]" + # Whether or not webhook messages from Discord should be shown in Minecraft. + show-webhook-messages: false + # Whether or not bot messages from Discord should be shown in Minecraft. + show-bot-messages: false + # Whether or not to show all Minecraft chat messages that are not shown to all players. + # You shouldn't need to enable this unless you're not seeing all chat messages go through to Discord. + show-all-chat: false + +# Console relay settings +# The console relay sends every message shown in the console to a Discord channel. +console: + # The channel ID (or webhook URL) to send the console output to. + # If the channel ID/webhook URL is invalid or set to 'none', the console relay will be disabled. + # Note: If you use a channel ID, the bot must have the "Manage Webhooks" permission in Discord or else the console relay will not work. + channel: 000000000000000000 + # The format of the console message. The following placeholders can be used: + # - {timestamp}: Timestamp in HH:mm:ss format + # - {level}: The console logging level + # - {message}: The actual message being logged + format: "[{timestamp} {level}] {message}" + # The name of the webhook that will be created, if a channel ID is provided. + webhook-name: "EssentialsX Console Relay" + # Set to true if all messages in the console relay channel should be treated as commands. + # Note: Enabling this means everyone who can send messages in the console channel will be able to send commands as the + # console. It's recommended you stick to the /execute command which has role permission checks (see command configuration below). + # Note 2: This option requires a channel ID and is not supported if you specify a webhook URL above. You'll need to use /execute in Discord if you use a webhook URL. + command-relay: false + # The maximum log level of messages to send to the console relay. + # The following is a list of available log levels in order of lowest to highest. + # Changing the log level will send all log levels above it to the console relay. + # For example, setting this to 'info' will display log messages with info, warn, error, and fatal levels. + # Log Levels: + # - fatal + # - error + # - warn + # - info + # - debug + # - trace + log-level: info + +# Configure which Discord channels different messages will be sent to. +# You can either use the names of the channels listed above or just the id of a channel. +# If an invalid channel is used, the primary channel will be used instead. +# +# To disable a message from showing, use 'none' as the channel name. +message-types: + # Join messages sent when a player joins the Minecraft server. + join: primary + # Leave messages sent when a player leaves the Minecraft server. + leave: primary + # Chat messages sent when a player chats on the Minecraft server. + chat: primary + # Death messages sent when a player dies on the Minecraft server. + death: primary + # AFK status change messages sent when a player's AFK status changes. + afk: primary + # Message sent when a player is kicked from the Minecraft server. + kick: staff + # Message sent when a player's mute state is changed on the Minecraft server. + mute: staff + +# Whether or not player messages should show their avatar as the profile picture in Discord. +show-avatar: false +# Whether or not player messages should show their name as the bot name in Discord. +show-name: false + +# Settings pertaining to the varies commands registered by EssentialsX on Discord. +commands: + # The execute command allows for discord users to execute MC commands from Discord. + # MC commands executed by this will be ran as the console and you should therefore be careful to who you grant this to. + execute: + # Set to false if you do not want this command to show up on the Discord command selector. + # You must restart your server after changing this. + enabled: true + # Whether or not the command should be hidden from other people in the channel. + # If set to false, members of the Discord guild will be able to see the exact command you executed as well as its response. + hide-command: true + # List of user IDs or role names/IDs allowed to use this command (or * to allow anyone to access it). + allowed-roles: + - "Admins" + - "123456789012345678" + # The msg command allows for Discord users to message MC players from Discord. + msg: + # Set to false if you do not want this command to show up on the Discord command selector. + # You must restart your server after changing this. + enabled: true + # Whether or not the command should be hidden from other people in the channel. + # If set to false, members of the Discord guild will be able to see the target and content of your message. + hide-command: true + # List of user IDs or role names/IDs allowed to use this command (or '*' to allow anyone to access it). + allowed-roles: + - "*" + # List of user IDs or role names/IDs who can message vanished players or players who disable messages. If '*' is + # used, all people on Discord would be allowed to message vanished players (and therefore expose they are actually online) + # and message players who disable messages. + admin-roles: + - "Admins" + - "123456789012345678" + # The list command allows Discord users to see a list of players currently online on Minecraft. + list: + # Set to false if you do not want this command to show up on the Discord command selector. + # You must restart your server after changing this. + enabled: true + # Whether or not the command should be hidden from other people in the channel. + # If set to false, members of the Discord guild will be able to see when you use this command as well as its response. + hide-command: true + # List of user IDs or role names/IDs allowed to use this command (or '*' to allow anyone to access it). + allowed-roles: + - "*" + # List of user IDs or role names/IDs who can see vanished players in the player list. If '*' is used, all people + # on Discord would be allowed to see vanished players (and therefore expose they are actually online). + admin-roles: + - "Admins" + - "123456789012345678" + +# Whether or not links to attachments in Discord messages should be displayed in chat or not. +# If this is set to false and a message from Discord only contains an image/file and not any text, nothing will be sent. +show-discord-attachments: true + +# A list of roles allowed to send Minecraft color/formatting codes from Discord to MC. +# This applies to all aspects such as that Discord->MC chat relay as well as commands. +# You can either use '*' (for everyone), a role name/ID, or a user ID. +permit-formatting-roles: + - "Admins" + - "Color Codes" + +# The presence of the bot, including its status, activity and status message. +presence: + # The online status of the bot. Must be one of the following: + # - "online": Shows as green circle (Online) + # - "idle": Shows as yellow half-circle (Away) + # - "dnd": Shows as red circle (Do Not Disturb) + # - "invisible": Makes the bot appear offline + status: online + # The activity of the bot to be prefixed before your message below. Must be one of the following; + # - "playing": Shows up as "Playing <message>" + # - "listening": Shows up as "Listening to <message>" + # - "watching": Shows up as "Watching <message>" + # - "competing": Shows up as "Competing in <message>" + # - "none": Don't show any activity message + activity: "playing" + # The activity status message. + message: "Minecraft" + +# The following entries allow you to customize the formatting of messages sent by the plugin. +# Each message has a description of how it is used along with placeholders that can be used. +messages: + # This is the message that is used to show discord chat to players in game. + # Color/formatting codes and the follow placeholders can be used here: + # - {channel}: The name of the discord channel the message was sent from + # - {username}: The username of the user who sent the message + # - {discriminator}: The four numbers displayed after the user's name + # - {fullname}: Equivalent to typing "{username}#{discriminator}" + # - {nickname}: The nickname of the user who sent the message. (Will return username if user has no nickname) + # - {color}: The minecraft color representative of the user's topmost role color on discord. If the user doesn't have a role color, the placeholder is empty. + # - {message}: The content of the message being sent + discord-to-mc: "&6[#{channel}] &3{fullname}&7: &f{message}" + # This is the message that is used to relay minecraft chat in discord. + # The following placeholders can be used here: + # - {username}: The username of the player sending the message + # - {displayname}: The display name of the player sending the message (This would be their nickname) + # - {message}: The content of the message being sent + # - {world}: The name of the world the player sending the message is in + # - {prefix}: The prefix of the player sending the message + # - {suffix}: The suffix of the player sending the message + # ... PlaceholderAPI placeholders are also supported here too! + mc-to-discord: "{displayname}: {message}" + # This is the message sent to discord when a player is temporarily muted in minecraft. + # The following placeholders can be used here: + # - {username}: The username of the player being muted + # - {displayname}: The display name of the player being muted + # - {controllername}: The username of the user who muted the player + # - {controllerdisplayname}: The display name of the user who muted the player + # - {time}: The amount of time the player was muted for + temporary-mute: "{controllerdisplayname} has muted player {displayname} for {time}." + # This is the message sent to discord when a player is temporarily muted (with a reason specified) in minecraft. + # The following placeholders can be used here: + # - {username}: The username of the player being muted + # - {displayname}: The display name of the player being muted + # - {controllername}: The username of the user who muted the player + # - {controllerdisplayname}: The display name of the user who muted the player + # - {time}: The amount of time the player was muted for + # - {reason}: The reason the player was muted for + temporary-mute-reason: "{controllerdisplayname} has muted player {displayname} for {time}. Reason: {reason}." + # This is the message sent to discord when a player is permanently muted in minecraft. + # The following placeholders can be used here: + # - {username}: The username of the player being muted + # - {displayname}: The display name of the player being muted + # - {controllername}: The username of the user who muted the player + # - {controllerdisplayname}: The display name of the user who muted the player + permanent-mute: "{controllerdisplayname} has muted player {displayname}." + # This is the message sent to discord when a player is permanently muted (with a reason specified) in minecraft. + # The following placeholders can be used here: + # - {username}: The username of the player being muted + # - {displayname}: The display name of the player being muted + # - {controllername}: The username of the user who muted the player + # - {controllerdisplayname}: The display name of the user who muted the player + # - {reason}: The reason the player was muted for + permanent-mute-reason: "{controllerdisplayname} has permanently muted player {displayname}. Reason: {reason}." + # This is the message sent to discord when a player is unmuted in minecraft. + # The following placeholders can be used here: + # - {username}: The username of the player being unmuted + # - {displayname}: The display name of the player being unmuted + unmute: "{displayname} unmuted." + # This is the message sent to discord when a player joins the minecraft server. + # The following placeholders can be used here: + # - {username}: The name of the user joining + # - {displayname}: The display name of the user joining + # - {joinmessage}: The full default join message used in game + # ... PlaceholderAPI placeholders are also supported here too! + join: ":arrow_right: {displayname} has joined!" + # This is the message sent to discord when a player leaves the minecraft server. + # The following placeholders can be used here: + # - {username}: The name of the user leaving + # - {displayname}: The display name of the user leaving + # - {quitmessage}: The full default leave message used in game + # ... PlaceholderAPI placeholders are also supported here too! + quit: ":arrow_left: {displayname} has left!" + # This is the message sent to discord when a player dies. + # The following placeholders can be used here: + # - {username}: The name of the user who died + # - {displayname}: The display name of the user who died + # - {deathmessage}: The full default death message used in game + # ... PlaceholderAPI placeholders are also supported here too! + death: ":skull: {deathmessage}" + # This is the message sent to discord when a player becomes afk. + # The following placeholders can be used here: + # - {username}: The name of the user who became afk + # - {displayname}: The display name of the user who became afk + # ... PlaceholderAPI placeholders are also supported here too! + afk: ":person_walking: {displayname} is now AFK!" + # This is the message sent to discord when a player is no longer afk. + # The following placeholders can be used here: + # - {username}: The name of the user who is no longer afk + # - {displayname}: The display name of the user who is no longer afk + # ... PlaceholderAPI placeholders are also supported here too! + un-afk: ":keyboard: {displayname} is no longer AFK!" + # This is the message sent to discord when a player is kicked from the server. + # The following placeholders can be used here: + # - {username}: The name of the user who got kicked + # - {displayname}: The display name of the user who got kicked + # - {reason}: The reason the player was kicked + kick: "{displayname} was kicked with reason: {reason}" diff --git a/EssentialsDiscord/src/main/resources/plugin.yml b/EssentialsDiscord/src/main/resources/plugin.yml new file mode 100644 index 00000000000..32679b7db4e --- /dev/null +++ b/EssentialsDiscord/src/main/resources/plugin.yml @@ -0,0 +1,10 @@ +name: EssentialsDiscord +main: net.essentialsx.discord.EssentialsDiscord +# Note to developers: This next line cannot change, or the automatic versioning system will break. +version: ${full.version} +website: https://essentialsx.net/ +description: Provides integration between Minecraft and Discord servers. +authors: [mdcfe, JRoy, pop4959, Glare] +depend: [Essentials] +softdepend: [EssentialsChat, PlaceholderAPI] +api-version: 1.13 diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSenderProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSenderProvider.java new file mode 100644 index 00000000000..9496f909175 --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSenderProvider.java @@ -0,0 +1,150 @@ +package net.ess3.provider.providers; + +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Server; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.plugin.Plugin; + +import java.util.Set; +import java.util.UUID; + +public class BukkitSenderProvider implements CommandSender { + private final ConsoleCommandSender base; + private final MessageHook hook; + + public BukkitSenderProvider(ConsoleCommandSender base, MessageHook hook) { + this.base = base; + this.hook = hook; + } + + public interface MessageHook { + void sendMessage(String message); + } + + @Override + public void sendMessage(String message) { + hook.sendMessage(message); + } + + @Override + public void sendMessage(String[] messages) { + for (String msg : messages) { + sendMessage(msg); + } + } + + @Override + public void sendMessage(UUID uuid, String message) { + sendMessage(message); + } + + @Override + public void sendMessage(UUID uuid, String[] messages) { + sendMessage(messages); + } + + @Override + public Server getServer() { + return base.getServer(); + } + + @Override + public String getName() { + return base.getName(); + } + + @Override + public Spigot spigot() { + return new Spigot() { + @Override + public void sendMessage(BaseComponent component) { + BukkitSenderProvider.this.sendMessage(component.toLegacyText()); + } + + @Override + public void sendMessage(BaseComponent... components) { + sendMessage(new TextComponent(components)); + } + + @Override + public void sendMessage(UUID sender, BaseComponent... components) { + sendMessage(components); + } + + @Override + public void sendMessage(UUID sender, BaseComponent component) { + sendMessage(component); + } + }; + } + + @Override + public boolean isPermissionSet(String name) { + return base.isPermissionSet(name); + } + + @Override + public boolean isPermissionSet(Permission perm) { + return base.isPermissionSet(perm); + } + + @Override + public boolean hasPermission(String name) { + return base.hasPermission(name); + } + + @Override + public boolean hasPermission(Permission perm) { + return base.hasPermission(perm); + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value) { + return base.addAttachment(plugin, name, value); + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin) { + return base.addAttachment(plugin); + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value, int ticks) { + return base.addAttachment(plugin, name, value, ticks); + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, int ticks) { + return base.addAttachment(plugin, ticks); + } + + @Override + public void removeAttachment(PermissionAttachment attachment) { + base.removeAttachment(attachment); + } + + @Override + public void recalculatePermissions() { + base.recalculatePermissions(); + } + + @Override + public Set<PermissionAttachmentInfo> getEffectivePermissions() { + return base.getEffectivePermissions(); + } + + @Override + public boolean isOp() { + return base.isOp(); + } + + @Override + public void setOp(boolean value) { + base.setOp(value); + } +} diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperCommandSender.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperCommandSender.java new file mode 100644 index 00000000000..25fba1166ae --- /dev/null +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperCommandSender.java @@ -0,0 +1,79 @@ +package net.ess3.provider.providers; + +import net.kyori.adventure.audience.MessageType; +import net.kyori.adventure.identity.Identified; +import net.kyori.adventure.identity.Identity; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; +import org.bukkit.Bukkit; +import org.bukkit.command.ConsoleCommandSender; + +public class PaperCommandSender extends BukkitSenderProvider { + public PaperCommandSender(ConsoleCommandSender base, MessageHook hook) { + super(base, hook); + } + + @Override + public void sendMessage(Identity identity, Component message, MessageType type) { + sendDumbComponent(message); + } + + @Override + public void sendMessage(ComponentLike message) { + sendDumbComponent(message.asComponent()); + } + + @Override + public void sendMessage(Identified source, ComponentLike message) { + sendDumbComponent(message.asComponent()); + } + + @Override + public void sendMessage(Identity source, ComponentLike message) { + sendDumbComponent(message.asComponent()); + } + + @Override + public void sendMessage(Component message) { + sendDumbComponent(message); + } + + @Override + public void sendMessage(Identified source, Component message) { + sendDumbComponent(message); + } + + @Override + public void sendMessage(Identity source, Component message) { + sendDumbComponent(message); + } + + @Override + public void sendMessage(ComponentLike message, MessageType type) { + sendDumbComponent(message.asComponent()); + } + + @Override + public void sendMessage(Identified source, ComponentLike message, MessageType type) { + sendDumbComponent(message.asComponent()); + } + + @Override + public void sendMessage(Identity source, ComponentLike message, MessageType type) { + sendDumbComponent(message.asComponent()); + } + + @Override + public void sendMessage(Component message, MessageType type) { + sendDumbComponent(message); + } + + @Override + public void sendMessage(Identified source, Component message, MessageType type) { + sendDumbComponent(message); + } + + public void sendDumbComponent(Component message) { + sendMessage(Bukkit.getUnsafe().legacyComponentSerializer().serialize(message)); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 16bd70739c1..bd9fa6fc189 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,6 +8,12 @@ dependencyResolutionManagement { maven("https://repo.codemc.org/repository/maven-public") { content { includeGroup("org.bstats") } } + maven("https://m2.dv8tion.net/releases/") { + content { includeGroup("net.dv8tion") } + } + maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") { + content { includeGroup("me.clip") } + } mavenCentral { content { includeGroup("net.kyori") } } @@ -26,6 +32,7 @@ sequenceOf( "", "AntiBuild", "Chat", + "Discord", "GeoIP", "Protect", "Spawn", From 55db6c247672875f54999ff1b965ed1baa8c9fe5 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 1 Jul 2021 11:15:24 -0400 Subject: [PATCH 13/29] Fix afk list NPE (#4294) --- Essentials/src/main/java/com/earth2me/essentials/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Settings.java b/Essentials/src/main/java/com/earth2me/essentials/Settings.java index ff303fde464..e0b33fbae48 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Settings.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Settings.java @@ -633,7 +633,7 @@ public void reloadConfig() { getFreezeAfkPlayers = _getFreezeAfkPlayers(); sleepIgnoresAfkPlayers = _sleepIgnoresAfkPlayers(); afkListName = _getAfkListName(); - isAfkListName = !afkListName.equalsIgnoreCase("none"); + isAfkListName = afkListName != null && !afkListName.equalsIgnoreCase("none"); broadcastAfkMessage = _broadcastAfkMessage(); itemSpawnBl = _getItemSpawnBlacklist(); loginAttackDelay = _getLoginAttackDelay(); From 9c451271e0a9d29cb689e02e34302172e063ddd6 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 1 Jul 2021 11:23:32 -0400 Subject: [PATCH 14/29] Rework Mail System (#3710) * New `/mail sendtemp <time diff> <message>` command to send mail that will self-destruct after time diff. * New `/mail clear <number>` command to clear a specific mail item. * `/mail read` now tracks which mails you read and won't nag you about them. * A bunch of other flexibility since we store actual data instead of strings --- .../java/com/earth2me/essentials/Console.java | 7 + .../com/earth2me/essentials/Essentials.java | 11 ++ .../essentials/EssentialsPlayerListener.java | 3 +- .../essentials/EssentialsUpgrade.java | 43 +++++ .../com/earth2me/essentials/IEssentials.java | 3 + .../java/com/earth2me/essentials/IUser.java | 15 ++ .../earth2me/essentials/MailServiceImpl.java | 53 ++++++ .../java/com/earth2me/essentials/User.java | 30 ++- .../com/earth2me/essentials/UserData.java | 54 +++++- .../essentials/commands/Commandmail.java | 177 ++++++++++++++---- .../config/EssentialsConfiguration.java | 12 ++ .../config/holders/UserConfigHolder.java | 7 +- .../serializers/MailMessageSerializer.java | 44 +++++ .../messaging/IMessageRecipient.java | 3 +- .../messaging/SimpleMessageRecipient.java | 6 + .../earth2me/essentials/signs/SignMail.java | 28 ++- .../textreader/KeywordReplacer.java | 2 +- .../textreader/SimpleTextInput.java | 4 + .../api/v2/services/mail/MailMessage.java | 98 ++++++++++ .../api/v2/services/mail/MailSender.java | 22 +++ .../api/v2/services/mail/MailService.java | 43 +++++ .../src/main/resources/messages.properties | 14 +- Essentials/src/main/resources/plugin.yml | 2 +- .../discord/util/DiscordMessageRecipient.java | 6 + 24 files changed, 622 insertions(+), 65 deletions(-) create mode 100644 Essentials/src/main/java/com/earth2me/essentials/MailServiceImpl.java create mode 100644 Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java create mode 100644 Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailMessage.java create mode 100644 Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailSender.java create mode 100644 Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailService.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/Console.java b/Essentials/src/main/java/com/earth2me/essentials/Console.java index 549a8517f75..dff940f3c38 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Console.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Console.java @@ -6,6 +6,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import java.util.UUID; + import static com.earth2me.essentials.I18n.tl; public final class Console implements IMessageRecipient { @@ -46,6 +48,11 @@ public String getName() { return Console.NAME; } + @Override + public UUID getUUID() { + return null; + } + @Override public String getDisplayName() { return Console.DISPLAY_NAME; diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index d659584f8db..8897f65dde4 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -82,6 +82,7 @@ import net.ess3.provider.providers.PaperSerializationProvider; import net.ess3.provider.providers.PaperServerStateProvider; import net.essentialsx.api.v2.services.BalanceTop; +import net.essentialsx.api.v2.services.mail.MailService; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.World; @@ -147,6 +148,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient UserMap userMap; private transient BalanceTopImpl balanceTop; private transient ExecuteTimer execTimer; + private transient MailService mail; private transient I18n i18n; private transient MetricsWrapper metrics; private transient EssentialsTimer timer; @@ -204,6 +206,7 @@ public void setupForTesting(final Server server) throws IOException, InvalidDesc LOGGER.log(Level.INFO, tl("usingTempFolderForTesting")); LOGGER.log(Level.INFO, dataFolder.toString()); settings = new Settings(this); + mail = new MailServiceImpl(this); userMap = new UserMap(this); balanceTop = new BalanceTopImpl(this); permissionsHandler = new PermissionsHandler(this, false); @@ -277,6 +280,9 @@ public void onEnable() { confList.add(settings); execTimer.mark("Settings"); + mail = new MailServiceImpl(this); + execTimer.mark("Init(Mail)"); + userMap = new UserMap(this); confList.add(userMap); execTimer.mark("Init(Usermap)"); @@ -1159,6 +1165,11 @@ public EssentialsTimer getTimer() { return timer; } + @Override + public MailService getMail() { + return mail; + } + @Override public List<String> getVanishedPlayers() { return Collections.unmodifiableList(new ArrayList<>(vanishedPlayers)); diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 8499f4d0faf..dad07e1fc88 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -364,8 +364,7 @@ public void run() { } if (!ess.getSettings().isCommandDisabled("mail") && user.isAuthorized("essentials.mail")) { - final List<String> mail = user.getMails(); - if (mail.isEmpty()) { + if (user.getUnreadMailAmount() == 0) { if (ess.getSettings().isNotifyNoNewMail()) { user.sendMessage(tl("noNewMail")); // Only notify if they want us to. } diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsUpgrade.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsUpgrade.java index 16fe6e9f816..9d1dce8c9f8 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsUpgrade.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsUpgrade.java @@ -7,7 +7,9 @@ import com.earth2me.essentials.utils.StringUtil; import com.google.common.base.Charsets; import com.google.common.collect.Maps; +import com.google.gson.reflect.TypeToken; import net.ess3.api.IEssentials; +import net.essentialsx.api.v2.services.mail.MailMessage; import org.bukkit.BanList; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -146,6 +148,46 @@ public static void uuidFileConvert(final IEssentials ess, final Boolean ignoreUF ess.getLogger().info("To rerun the conversion type /essentials uuidconvert"); } + public void convertMailList() { + if (doneFile.getBoolean("updateUsersMailList", false)) { + return; + } + + final File userdataFolder = new File(ess.getDataFolder(), "userdata"); + if (!userdataFolder.exists() || !userdataFolder.isDirectory()) { + return; + } + final File[] userFiles = userdataFolder.listFiles(); + for (File file : userFiles) { + if (!file.isFile() || !file.getName().endsWith(".yml")) { + continue; + } + final EssentialsConfiguration config = new EssentialsConfiguration(file); + try { + config.load(); + if (config.hasProperty("mail") && config.isList("mail")) { + final ArrayList<MailMessage> messages = new ArrayList<>(); + for (String mailStr : Collections.synchronizedList(config.getList("mail", String.class))) { + if (mailStr == null) { + continue; + } + messages.add(new MailMessage(false, true, null, null, 0L, 0L, mailStr)); + } + + config.removeProperty("mail"); + config.setExplicitList("mail", messages, new TypeToken<List<MailMessage>>() {}.getType()); + config.blockingSave(); + } + } catch (RuntimeException ex) { + LOGGER.log(Level.INFO, "File: " + file); + throw ex; + } + } + doneFile.setProperty("updateUsersMailList", true); + doneFile.save(); + LOGGER.info("Done converting mail list."); + } + public void convertStupidCamelCaseUserdataKeys() { if (doneFile.getBoolean("updateUsersLegacyPathNames", false)) { return; @@ -820,5 +862,6 @@ public void afterSettings() { repairUserMap(); convertIgnoreList(); convertStupidCamelCaseUserdataKeys(); + convertMailList(); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java index f4f532930cc..6f47fbbed57 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java @@ -18,6 +18,7 @@ import net.ess3.provider.SpawnerItemProvider; import net.ess3.provider.SyncCommandsProvider; import net.essentialsx.api.v2.services.BalanceTop; +import net.essentialsx.api.v2.services.mail.MailService; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.Command; @@ -120,6 +121,8 @@ public interface IEssentials extends Plugin { EssentialsTimer getTimer(); + MailService getMail(); + /** * Get a list of players who are vanished. * diff --git a/Essentials/src/main/java/com/earth2me/essentials/IUser.java b/Essentials/src/main/java/com/earth2me/essentials/IUser.java index 42040f93d36..c78e18407ab 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IUser.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IUser.java @@ -6,12 +6,15 @@ import net.ess3.api.ITeleport; import net.ess3.api.MaxMoneyException; import net.ess3.api.events.AfkStatusChangeEvent; +import net.essentialsx.api.v2.services.mail.MailMessage; +import net.essentialsx.api.v2.services.mail.MailSender; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; @@ -148,10 +151,22 @@ public interface IUser { String getFormattedJailTime(); + @Deprecated List<String> getMails(); + @Deprecated void addMail(String mail); + void sendMail(MailSender sender, String message); + + void sendMail(MailSender sender, String message, long expireAt); + + ArrayList<MailMessage> getMailMessages(); + + void setMailList(ArrayList<MailMessage> messages); + + int getMailAmount(); + boolean isAfk(); @Deprecated diff --git a/Essentials/src/main/java/com/earth2me/essentials/MailServiceImpl.java b/Essentials/src/main/java/com/earth2me/essentials/MailServiceImpl.java new file mode 100644 index 00000000000..a1490e64d54 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/MailServiceImpl.java @@ -0,0 +1,53 @@ +package com.earth2me.essentials; + +import net.ess3.api.IUser; +import net.essentialsx.api.v2.services.mail.MailService; +import net.essentialsx.api.v2.services.mail.MailMessage; +import net.essentialsx.api.v2.services.mail.MailSender; +import org.bukkit.plugin.ServicePriority; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +import static com.earth2me.essentials.I18n.tl; + +public class MailServiceImpl implements MailService { + private final transient ThreadLocal<SimpleDateFormat> df = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy/MM/dd HH:mm")); + + public MailServiceImpl(IEssentials ess) { + ess.getServer().getServicesManager().register(MailService.class, this, ess, ServicePriority.Normal); + } + + @Override + public void sendMail(IUser recipient, MailSender sender, String message) { + sendMail(recipient, sender, message, 0L); + } + + @Override + public void sendMail(IUser recipient, MailSender sender, String message, long expireAt) { + sendMail(recipient, new MailMessage(false, false, sender.getName(), sender.getUUID(), System.currentTimeMillis(), expireAt, message)); + } + + @Override + public void sendLegacyMail(IUser recipient, String message) { + sendMail(recipient, new MailMessage(false, true, null, null, 0L, 0L, message)); + } + + private void sendMail(IUser recipient, MailMessage message) { + final ArrayList<MailMessage> messages = recipient.getMailMessages(); + messages.add(0, message); + recipient.setMailList(messages); + } + + @Override + public String getMailLine(MailMessage mail) { + final String message = mail.getMessage(); + if (mail.isLegacy()) { + return tl("mailMessage", message); + } + + final String expire = mail.getTimeExpire() != 0 ? "Timed" : ""; + return tl((mail.isRead() ? "mailFormatNewRead" : "mailFormatNew") + expire, df.get().format(new Date(mail.getTimeSent())), mail.getSenderUsername(), message); + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/User.java b/Essentials/src/main/java/com/earth2me/essentials/User.java index 6242e7384ae..9d8140cddba 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/User.java +++ b/Essentials/src/main/java/com/earth2me/essentials/User.java @@ -5,11 +5,11 @@ import com.earth2me.essentials.economy.EconomyLayers; import com.earth2me.essentials.messaging.IMessageRecipient; import com.earth2me.essentials.messaging.SimpleMessageRecipient; -import com.earth2me.essentials.utils.TriState; import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.EnumUtil; import com.earth2me.essentials.utils.FormatUtil; import com.earth2me.essentials.utils.NumberUtil; +import com.earth2me.essentials.utils.TriState; import com.earth2me.essentials.utils.VersionUtil; import com.google.common.collect.Lists; import net.ess3.api.IEssentials; @@ -19,6 +19,7 @@ import net.ess3.api.events.MuteStatusChangeEvent; import net.ess3.api.events.UserBalanceUpdateEvent; import net.essentialsx.api.v2.events.TransactionEvent; +import net.essentialsx.api.v2.services.mail.MailSender; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Statistic; @@ -987,6 +988,11 @@ public String getName() { return this.getBase().getName(); } + @Override + public UUID getUUID() { + return getBase().getUniqueId(); + } + @Override public boolean isReachable() { return getBase().isOnline(); @@ -1054,12 +1060,28 @@ public ItemStack getItemInHand() { } } + @Override + public void sendMail(MailSender sender, String message) { + sendMail(sender, message, 0); + } + + @Override + public void sendMail(MailSender sender, String message, long expireAt) { + ess.getMail().sendMail(this, sender, message, expireAt); + } + + @Override + @Deprecated + public void addMail(String mail) { + ess.getMail().sendLegacyMail(this, mail); + } + public void notifyOfMail() { - final List<String> mails = getMails(); - if (mails != null && !mails.isEmpty()) { + final int unread = getUnreadMailAmount(); + if (unread != 0) { final int notifyPlayerOfMailCooldown = ess.getSettings().getNotifyPlayerOfMailCooldown() * 1000; if (System.currentTimeMillis() - lastNotifiedAboutMailsMs >= notifyPlayerOfMailCooldown) { - sendMessage(tl("youHaveNewMail", mails.size())); + sendMessage(tl("youHaveNewMail", unread)); lastNotifiedAboutMailsMs = System.currentTimeMillis(); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/UserData.java b/Essentials/src/main/java/com/earth2me/essentials/UserData.java index 46834a18354..6773ce0cc36 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/UserData.java +++ b/Essentials/src/main/java/com/earth2me/essentials/UserData.java @@ -10,6 +10,8 @@ import com.google.common.base.Charsets; import net.ess3.api.IEssentials; import net.ess3.api.MaxMoneyException; +import net.essentialsx.api.v2.services.mail.MailMessage; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -313,17 +315,59 @@ public void setJail(final String jail) { config.save(); } + /** + * @deprecated Mails are no longer just strings, this method is therefore misleading. + */ + @Deprecated public List<String> getMails() { - return holder.mail(); + final List<String> list = new ArrayList<>(); + if (getMailAmount() != 0) { + for (MailMessage mail : getMailMessages()) { + // I hate this code btw + list.add(mail.isLegacy() ? mail.getMessage() : ChatColor.GOLD + "[" + ChatColor.RESET + mail.getSenderUsername() + ChatColor.GOLD + "] " + ChatColor.RESET + mail.getMessage()); + } + } + return list; } + /** + * @deprecated This method does not support the new mail system and will fail at runtime. + */ + @Deprecated public void setMails(List<String> mails) { - holder.mail(mails); - config.save(); + throw new UnsupportedOperationException("UserData#setMails(List<String>) is deprecated and can no longer be used. Please tell the plugin author to update this!"); + } + + public int getMailAmount() { + return holder.mail() == null ? 0 : holder.mail().size(); + } + + public int getUnreadMailAmount() { + if (holder.mail() == null || holder.mail().isEmpty()) { + return 0; + } + + int unread = 0; + for (MailMessage element : holder.mail()) { + if (!element.isRead()) { + unread++; + } + } + return unread; + } + + /** + * @deprecated This method does not support the new mail system and should not be used. + */ + @Deprecated + abstract void addMail(final String mail); + + public ArrayList<MailMessage> getMailMessages() { + return new ArrayList<>(holder.mail()); } - public void addMail(final String mail) { - holder.mail().add(mail); + public void setMailList(ArrayList<MailMessage> messages) { + holder.mail(messages); config.save(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java index d966d91dba8..1f2595dc520 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java @@ -1,18 +1,23 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.Console; import com.earth2me.essentials.User; -import com.earth2me.essentials.textreader.IText; +import com.earth2me.essentials.messaging.IMessageRecipient; import com.earth2me.essentials.textreader.SimpleTextInput; import com.earth2me.essentials.textreader.TextPager; import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.FormatUtil; +import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.StringUtil; import com.google.common.collect.Lists; +import net.essentialsx.api.v2.services.mail.MailMessage; import org.bukkit.Server; +import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.ListIterator; import java.util.UUID; import static com.earth2me.essentials.I18n.tl; @@ -28,17 +33,35 @@ public Commandmail() { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { if (args.length >= 1 && "read".equalsIgnoreCase(args[0])) { - final List<String> mail = user.getMails(); - if (mail.isEmpty()) { + final ArrayList<MailMessage> mail = user.getMailMessages(); + if (mail == null || mail.size() == 0) { + user.sendMessage(tl("noMail")); + throw new NoChargeException(); + } + + final SimpleTextInput input = new SimpleTextInput(); + final ListIterator<MailMessage> iterator = mail.listIterator(); + while (iterator.hasNext()) { + final MailMessage mailObj = iterator.next(); + if (mailObj.isExpired()) { + iterator.remove(); + continue; + } + input.addLine(ess.getMail().getMailLine(mailObj)); + iterator.set(new MailMessage(true, mailObj.isLegacy(), mailObj.getSenderUsername(), + mailObj.getSenderUUID(), mailObj.getTimeSent(), mailObj.getTimeExpire(), mailObj.getMessage())); + } + + if (input.getLines().isEmpty()) { user.sendMessage(tl("noMail")); throw new NoChargeException(); } - final IText input = new SimpleTextInput(mail); final TextPager pager = new TextPager(input); pager.showPage(args.length > 1 ? args[1] : null, null, commandLabel + " " + args[0], user.getSource()); user.sendMessage(tl("mailClear")); + user.setMailList(mail); return; } if (args.length >= 3 && "send".equalsIgnoreCase(args[0])) { @@ -61,8 +84,8 @@ public void run(final Server server, final User user, final String commandLabel, throw new Exception(tl("playerNeverOnServer", args[1])); } - final String mail = tl("mailFormat", user.getName(), FormatUtil.formatMessage(user, "essentials.mail", StringUtil.sanitizeString(FormatUtil.stripFormat(getFinalArg(args, 2))))); - if (mail.length() > 1000) { + final String msg = FormatUtil.formatMessage(user, "essentials.mail", StringUtil.sanitizeString(FormatUtil.stripFormat(getFinalArg(args, 2)))); + if (msg.length() > 1000) { throw new Exception(tl("mailTooLong")); } @@ -75,29 +98,87 @@ public void run(final Server server, final User user, final String commandLabel, if (mailsPerMinute > ess.getSettings().getMailsPerMinute()) { throw new Exception(tl("mailDelay", ess.getSettings().getMailsPerMinute())); } - u.addMail(tl("mailMessage", mail)); + u.sendMail(user, msg); } user.sendMessage(tl("mailSentTo", u.getDisplayName(), u.getName())); - user.sendMessage(mail); + user.sendMessage(msg); + return; + } + if (args.length >= 4 && "sendtemp".equalsIgnoreCase(args[0])) { + if (!user.isAuthorized("essentials.mail.sendtemp")) { + throw new Exception(tl("noPerm", "essentials.mail.sendtemp")); + } + + if (user.isMuted()) { + final String dateDiff = user.getMuteTimeout() > 0 ? DateUtil.formatDateDiff(user.getMuteTimeout()) : null; + if (dateDiff == null) { + throw new Exception(user.hasMuteReason() ? tl("voiceSilencedReason", user.getMuteReason()) : tl("voiceSilenced")); + } + throw new Exception(user.hasMuteReason() ? tl("voiceSilencedReasonTime", dateDiff, user.getMuteReason()) : tl("voiceSilencedTime", dateDiff)); + } + + final User u; + try { + u = getPlayer(server, args[1], true, true); + } catch (final PlayerNotFoundException e) { + throw new Exception(tl("playerNeverOnServer", args[1])); + } + + final long dateDiff = DateUtil.parseDateDiff(args[2], true); + + final String msg = FormatUtil.formatMessage(user, "essentials.mail", StringUtil.sanitizeString(FormatUtil.stripFormat(getFinalArg(args, 3)))); + if (msg.length() > 1000) { + throw new Exception(tl("mailTooLong")); + } + + if (!u.isIgnoredPlayer(user)) { + if (Math.abs(System.currentTimeMillis() - timestamp) > 60000) { + timestamp = System.currentTimeMillis(); + mailsPerMinute = 0; + } + mailsPerMinute++; + if (mailsPerMinute > ess.getSettings().getMailsPerMinute()) { + throw new Exception(tl("mailDelay", ess.getSettings().getMailsPerMinute())); + } + u.sendMail(user, msg, dateDiff); + } + + user.sendMessage(tl("mailSentToExpire", u.getDisplayName(), DateUtil.formatDateDiff(dateDiff), u.getName())); + user.sendMessage(msg); return; } if (args.length > 1 && "sendall".equalsIgnoreCase(args[0])) { if (!user.isAuthorized("essentials.mail.sendall")) { throw new Exception(tl("noPerm", "essentials.mail.sendall")); } - ess.runTaskAsynchronously(new SendAll(tl("mailFormat", user.getName(), - FormatUtil.formatMessage(user, "essentials.mail", StringUtil.sanitizeString(FormatUtil.stripFormat(getFinalArg(args, 1))))))); + ess.runTaskAsynchronously(new SendAll(user, FormatUtil.formatMessage(user, "essentials.mail", StringUtil.sanitizeString(FormatUtil.stripFormat(getFinalArg(args, 1)))))); user.sendMessage(tl("mailSent")); return; } if (args.length >= 1 && "clear".equalsIgnoreCase(args[0])) { - if (user.getMails() == null || user.getMails().isEmpty()) { + final ArrayList<MailMessage> mails = user.getMailMessages(); + if (mails == null || mails.size() == 0) { user.sendMessage(tl("noMail")); throw new NoChargeException(); } - user.setMails(null); + if (args.length > 1) { + if (!NumberUtil.isPositiveInt(args[1])) { + throw new NotEnoughArgumentsException(); + } + + final int toRemove = Integer.parseInt(args[1]); + if (toRemove > mails.size()) { + user.sendMessage(tl("mailClearIndex", mails.size())); + return; + } + mails.remove(toRemove - 1); + user.setMailList(mails); + } else { + user.setMailList(null); + } + user.sendMessage(tl("mailCleared")); return; } @@ -117,11 +198,22 @@ protected void run(final Server server, final CommandSource sender, final String } catch (final PlayerNotFoundException e) { throw new Exception(tl("playerNeverOnServer", args[1])); } - u.addMail(tl("mailFormat", "Server", FormatUtil.replaceFormat(getFinalArg(args, 2)))); + u.sendMail(Console.getInstance(), FormatUtil.replaceFormat(getFinalArg(args, 2))); + sender.sendMessage(tl("mailSent")); + return; + } else if (args.length >= 4 && "sendtemp".equalsIgnoreCase(args[0])) { + final User u; + try { + u = getPlayer(server, args[1], true, true); + } catch (final PlayerNotFoundException e) { + throw new Exception(tl("playerNeverOnServer", args[1])); + } + final long dateDiff = DateUtil.parseDateDiff(args[2], true); + u.sendMail(Console.getInstance(), FormatUtil.replaceFormat(getFinalArg(args, 3)), dateDiff); sender.sendMessage(tl("mailSent")); return; } else if (args.length >= 2 && "sendall".equalsIgnoreCase(args[0])) { - ess.runTaskAsynchronously(new SendAll(tl("mailFormat", "Server", FormatUtil.replaceFormat(getFinalArg(args, 1))))); + ess.runTaskAsynchronously(new SendAll(Console.getInstance(), FormatUtil.replaceFormat(getFinalArg(args, 1)))); sender.sendMessage(tl("mailSent")); return; } else if (args.length >= 2) { @@ -132,13 +224,33 @@ protected void run(final Server server, final CommandSource sender, final String } catch (final PlayerNotFoundException e) { throw new Exception(tl("playerNeverOnServer", args[0])); } - u.addMail(tl("mailFormat", "Server", FormatUtil.replaceFormat(getFinalArg(args, 1)))); + u.sendMail(Console.getInstance(), FormatUtil.replaceFormat(getFinalArg(args, 1))); sender.sendMessage(tl("mailSent")); return; } throw new NotEnoughArgumentsException(); } + private class SendAll implements Runnable { + IMessageRecipient messageRecipient; + String message; + + SendAll(IMessageRecipient messageRecipient, String message) { + this.messageRecipient = messageRecipient; + this.message = message; + } + + @Override + public void run() { + for (UUID userid : ess.getUserMap().getAllUniqueUsers()) { + final User user = ess.getUserMap().getUser(userid); + if (user != null) { + user.sendMail(messageRecipient, message); + } + } + } + } + @Override protected List<String> getTabCompleteOptions(final Server server, final User user, final String commandLabel, final String[] args) { if (args.length == 1) { @@ -146,15 +258,18 @@ protected List<String> getTabCompleteOptions(final Server server, final User use if (user.isAuthorized("essentials.mail.send")) { options.add("send"); } + if (user.isAuthorized("essentials.mail.sendtemp")) { + options.add("sendtemp"); + } if (user.isAuthorized("essentials.mail.sendall")) { options.add("sendall"); } return options; - } else if (args.length == 2 && args[0].equalsIgnoreCase("send") && user.isAuthorized("essentials.mail.send")) { + } else if (args.length == 2 && ((args[0].equalsIgnoreCase("send") && user.isAuthorized("essentials.mail.send")) || (args[0].equalsIgnoreCase("sendtemp") && user.isAuthorized("essentials.mail.sendtemp")))) { return getPlayers(server, user); } else if (args.length == 2 && args[0].equalsIgnoreCase("read")) { - final List<String> mail = user.getMails(); - final int pages = mail.size() / 9 + (mail.size() % 9 > 0 ? 1 : 0); + final ArrayList<MailMessage> mail = user.getMailMessages(); + final int pages = mail != null ? (mail.size() / 9 + (mail.size() % 9 > 0 ? 1 : 0)) : 0; if (pages == 0) { return Lists.newArrayList("0"); } else { @@ -164,8 +279,8 @@ protected List<String> getTabCompleteOptions(final Server server, final User use } return options; } - } else if ((args.length > 2 && args[0].equalsIgnoreCase("send") && user.isAuthorized("essentials.mail.send")) || (args.length > 1 && args[0].equalsIgnoreCase("sendall") && user.isAuthorized("essentials.mail.sendall"))) { - return null; // Use vanilla handler + } else if (args.length == 3 && args[0].equalsIgnoreCase("sendtemp") && user.isAuthorized("essentials.mail.sendtemp")) { + return COMMON_DATE_DIFFS; } else { return Collections.emptyList(); } @@ -175,30 +290,14 @@ protected List<String> getTabCompleteOptions(final Server server, final User use protected List<String> getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { return Lists.newArrayList("send", "sendall"); - } else if (args.length == 2 && args[0].equalsIgnoreCase("send")) { + } else if (args.length == 2 && (args[0].equalsIgnoreCase("send") || args[0].equalsIgnoreCase("sendtemp"))) { return getPlayers(server, sender); + } else if (args.length == 3 && args[0].equalsIgnoreCase("sentemp")) { + return COMMON_DATE_DIFFS; } else if ((args.length > 2 && args[0].equalsIgnoreCase("send")) || (args.length > 1 && args[0].equalsIgnoreCase("sendall"))) { return null; // Use vanilla handler } else { return Collections.emptyList(); } } - - private class SendAll implements Runnable { - final String message; - - SendAll(final String message) { - this.message = message; - } - - @Override - public void run() { - for (final UUID userid : ess.getUserMap().getAllUniqueUsers()) { - final User user = ess.getUserMap().getUser(userid); - if (user != null) { - user.addMail(message); - } - } - } - } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/config/EssentialsConfiguration.java b/Essentials/src/main/java/com/earth2me/essentials/config/EssentialsConfiguration.java index 95c05f7acbe..1e9988a5378 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/config/EssentialsConfiguration.java +++ b/Essentials/src/main/java/com/earth2me/essentials/config/EssentialsConfiguration.java @@ -9,8 +9,10 @@ import com.earth2me.essentials.config.serializers.BigDecimalTypeSerializer; import com.earth2me.essentials.config.serializers.CommandCooldownSerializer; import com.earth2me.essentials.config.serializers.LocationTypeSerializer; +import com.earth2me.essentials.config.serializers.MailMessageSerializer; import com.earth2me.essentials.config.serializers.MaterialTypeSerializer; import net.ess3.api.InvalidWorldException; +import net.essentialsx.api.v2.services.mail.MailMessage; import org.bukkit.Location; import org.bukkit.Material; import org.spongepowered.configurate.CommentedConfigurationNode; @@ -26,6 +28,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Type; import java.math.BigDecimal; import java.nio.file.Files; import java.util.ArrayList; @@ -58,6 +61,7 @@ public class EssentialsConfiguration { .register(LazyLocation.class, new LocationTypeSerializer()) .register(Material.class, new MaterialTypeSerializer()) .register(CommandCooldown.class, new CommandCooldownSerializer()) + .register(MailMessage.class, new MailMessageSerializer()) .build(); private final AtomicInteger pendingWrites = new AtomicInteger(0); @@ -139,6 +143,14 @@ public void setProperty(final String path, final List<?> list) { setInternal(path, list); } + public <T> void setExplicitList(final String path, final List<T> list, final Type type) { + try { + toSplitRoot(path, configurationNode).set(type, list); + } catch (SerializationException e) { + LOGGER.log(Level.SEVERE, e.getMessage(), e); + } + } + public <T> List<T> getList(final String path, Class<T> type) { final CommentedConfigurationNode node = getInternal(path); if (node == null) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/config/holders/UserConfigHolder.java b/Essentials/src/main/java/com/earth2me/essentials/config/holders/UserConfigHolder.java index e7b1c36bdce..5f1de20c26f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/config/holders/UserConfigHolder.java +++ b/Essentials/src/main/java/com/earth2me/essentials/config/holders/UserConfigHolder.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.config.annotations.DeleteOnEmpty; import com.earth2me.essentials.config.entities.CommandCooldown; import com.earth2me.essentials.config.entities.LazyLocation; +import net.essentialsx.api.v2.services.mail.MailMessage; import org.bukkit.Location; import org.bukkit.Material; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @@ -113,16 +114,16 @@ public void jail(final String value) { } @DeleteOnEmpty - private @MonotonicNonNull List<String> mail; + private @MonotonicNonNull ArrayList<MailMessage> mail; - public List<String> mail() { + public ArrayList<MailMessage> mail() { if (this.mail == null) { this.mail = new ArrayList<>(); } return this.mail; } - public void mail(final List<String> value) { + public void mail(final ArrayList<MailMessage> value) { this.mail = value; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java b/Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java new file mode 100644 index 00000000000..45aec4235b5 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java @@ -0,0 +1,44 @@ +package com.earth2me.essentials.config.serializers; + +import net.essentialsx.api.v2.services.mail.MailMessage; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.configurate.ConfigurationNode; +import org.spongepowered.configurate.serialize.SerializationException; +import org.spongepowered.configurate.serialize.TypeSerializer; + +import java.lang.reflect.Type; +import java.util.Objects; +import java.util.UUID; + +public class MailMessageSerializer implements TypeSerializer<MailMessage> { + @Override + public MailMessage deserialize(Type type, ConfigurationNode node) throws SerializationException { + final boolean legacy = !node.node("legacy").isNull() && node.node("legacy").getBoolean(false); + + return new MailMessage(node.node("read").getBoolean(false), + legacy, + !legacy ? node.node("sender-name").getString() : null, + !legacy ? UUID.fromString(Objects.requireNonNull(node.node("sender-uuid").getString())) : null, + !legacy ? node.node("timestamp").getLong() : 0L, + !legacy ? node.node("expire").getLong() : 0L, + node.node("message").getString()); + } + + @Override + public void serialize(Type type, @Nullable MailMessage obj, ConfigurationNode node) throws SerializationException { + if (obj == null) { + node.raw(null); + return; + } + + node.node("legacy").set(Boolean.class, obj.isLegacy()); + node.node("read").set(Boolean.class, obj.isRead()); + node.node("message").set(String.class, obj.getMessage()); + if (!obj.isLegacy()) { + node.node("sender-name").set(String.class, obj.getSenderUsername()); + node.node("sender-uuid").set(String.class, obj.getSenderUUID().toString()); + node.node("timestamp").set(Long.class, obj.getTimeSent()); + node.node("expire").set(Long.class, obj.getTimeExpire()); + } + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/messaging/IMessageRecipient.java b/Essentials/src/main/java/com/earth2me/essentials/messaging/IMessageRecipient.java index 77a208c9734..c4f53c0c9e5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/messaging/IMessageRecipient.java +++ b/Essentials/src/main/java/com/earth2me/essentials/messaging/IMessageRecipient.java @@ -1,11 +1,12 @@ package com.earth2me.essentials.messaging; +import net.essentialsx.api.v2.services.mail.MailSender; import org.bukkit.entity.Player; /** * Represents an interface for message recipients. */ -public interface IMessageRecipient { +public interface IMessageRecipient extends MailSender { /** * Sends (prints) a message to this recipient. diff --git a/Essentials/src/main/java/com/earth2me/essentials/messaging/SimpleMessageRecipient.java b/Essentials/src/main/java/com/earth2me/essentials/messaging/SimpleMessageRecipient.java index 4ebed9f13f3..0dcd4349498 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/messaging/SimpleMessageRecipient.java +++ b/Essentials/src/main/java/com/earth2me/essentials/messaging/SimpleMessageRecipient.java @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; import java.lang.ref.WeakReference; +import java.util.UUID; import static com.earth2me.essentials.I18n.tl; @@ -60,6 +61,11 @@ public String getName() { return this.parent.getName(); } + @Override + public UUID getUUID() { + return this.parent.getUUID(); + } + @Override public String getDisplayName() { return this.parent.getDisplayName(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignMail.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignMail.java index fe0a3456099..105b9492a91 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignMail.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignMail.java @@ -2,8 +2,10 @@ import com.earth2me.essentials.User; import net.ess3.api.IEssentials; +import net.essentialsx.api.v2.services.mail.MailMessage; -import java.util.List; +import java.util.ArrayList; +import java.util.ListIterator; import static com.earth2me.essentials.I18n.tl; @@ -14,14 +16,28 @@ public SignMail() { @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException { - final List<String> mail = player.getMails(); - if (mail.isEmpty()) { + final ArrayList<MailMessage> mail = player.getMailMessages(); + + final ListIterator<MailMessage> iterator = mail.listIterator(); + boolean hadMail = false; + while (iterator.hasNext()) { + final MailMessage mailObj = iterator.next(); + if (mailObj.isExpired()) { + iterator.remove(); + continue; + } + hadMail = true; + player.sendMessage(ess.getMail().getMailLine(mailObj)); + iterator.set(new MailMessage(true, mailObj.isLegacy(), mailObj.getSenderUsername(), + mailObj.getSenderUUID(), mailObj.getTimeSent(), mailObj.getTimeExpire(), mailObj.getMessage())); + } + + if (!hadMail) { player.sendMessage(tl("noNewMail")); return false; } - for (final String s : mail) { - player.sendMessage(s); - } + player.setMailList(mail); + player.sendMessage(tl("markMailAsRead")); return true; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/textreader/KeywordReplacer.java b/Essentials/src/main/java/com/earth2me/essentials/textreader/KeywordReplacer.java index 365b0b119c7..3bc099e0812 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/textreader/KeywordReplacer.java +++ b/Essentials/src/main/java/com/earth2me/essentials/textreader/KeywordReplacer.java @@ -227,7 +227,7 @@ private String replaceLine(String line, final String fullMatch, final String[] m break; case MAILS: if (user != null) { - replacer = Integer.toString(user.getMails().size()); + replacer = Integer.toString(user.getMailAmount()); } break; case PLAYTIME: diff --git a/Essentials/src/main/java/com/earth2me/essentials/textreader/SimpleTextInput.java b/Essentials/src/main/java/com/earth2me/essentials/textreader/SimpleTextInput.java index 1627fcbcc0d..9c74c24501c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/textreader/SimpleTextInput.java +++ b/Essentials/src/main/java/com/earth2me/essentials/textreader/SimpleTextInput.java @@ -20,6 +20,10 @@ public SimpleTextInput(final List<String> input) { public SimpleTextInput() { } + public void addLine(String line) { + lines.add(line); + } + @Override public List<String> getLines() { return lines; diff --git a/Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailMessage.java b/Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailMessage.java new file mode 100644 index 00000000000..c2ad168bcf2 --- /dev/null +++ b/Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailMessage.java @@ -0,0 +1,98 @@ +package net.essentialsx.api.v2.services.mail; + +import java.util.UUID; + +/** + * An immutable representation of a message sent as mail. + */ +public class MailMessage { + private final boolean read; + private final boolean legacy; + private final String senderName; + private final UUID senderId; + private final long timestamp; + private final long expire; + private final String message; + + public MailMessage(boolean read, boolean legacy, String sender, UUID uuid, long timestamp, long expire, String message) { + this.read = read; + this.legacy = legacy; + this.senderName = sender; + this.senderId = uuid; + this.timestamp = timestamp; + this.expire = expire; + this.message = message; + } + + /** + * Checks if this message has been read by its recipient yet. + * @return true if this message has been read. + */ + public boolean isRead() { + return read; + } + + /** + * Checks if this message was created via legacy api or converted from legacy format. + * + * A legacy messages only contains data for the read state and message. + * @see #isRead() + * @see #getMessage() + * @return true if this message is a legacy message. + */ + public boolean isLegacy() { + return legacy; + } + + /** + * Gets the sender's username at the time of sending the message. + * @return The sender's username. + */ + public String getSenderUsername() { + return senderName; + } + + /** + * Gets the sender's {@link UUID} or null if the sender does not have a UUID. + * @return The sender's {@link UUID} or null. + */ + public UUID getSenderUUID() { + return senderId; + } + + /** + * Gets the millisecond epoch time when the message was sent. + * @return The epoch time when message was sent. + */ + public long getTimeSent() { + return timestamp; + } + + /** + * Gets the millisecond epoch at which this message will expire and no longer been shown to the user. + * @return The epoch time when the message will expire. + */ + public long getTimeExpire() { + return expire; + } + + /** + * Gets the message content for normal mail or the entire mail format for legacy mail. + * @see #isLegacy() + * @return The mail content or format. + */ + public String getMessage() { + return message; + } + + /** + * Helper method to check if this mail has expired and should not been shown to the recipient. + * @return true if this mail has expired. + */ + public boolean isExpired() { + if (getTimeExpire() == 0L) { + return false; + } + return System.currentTimeMillis() >= getTimeExpire(); + } +} diff --git a/Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailSender.java b/Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailSender.java new file mode 100644 index 00000000000..2c168bc4fb8 --- /dev/null +++ b/Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailSender.java @@ -0,0 +1,22 @@ +package net.essentialsx.api.v2.services.mail; + +import java.util.UUID; + +/** + * An entity which is allowed to send mail to an {@link net.ess3.api.IUser IUser}. + * + * In Essentials, IUser and Console are the entities that implement this interface. + */ +public interface MailSender { + /** + * Gets the username of this {@link MailSender}. + * @return The sender's username. + */ + String getName(); + + /** + * Gets the {@link UUID} of this {@link MailSender} or null if this sender doesn't have a UUID. + * @return The sender's {@link UUID} or null if N/A. + */ + UUID getUUID(); +} diff --git a/Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailService.java b/Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailService.java new file mode 100644 index 00000000000..26edc78bf74 --- /dev/null +++ b/Essentials/src/main/java/net/essentialsx/api/v2/services/mail/MailService.java @@ -0,0 +1,43 @@ +package net.essentialsx.api.v2.services.mail; + +import net.ess3.api.IUser; + +/** + * This interface provides access to core Essentials mailing functions, allowing API users to send messages to {@link IUser IUser's }. + */ +public interface MailService { + /** + * Sends a message from the specified {@link MailSender sender} to the specified {@link IUser recipient}. + * @param recipient The {@link IUser} which to send the message to. + * @param sender The {@link MailSender} which sent the message. + * @param message The message content. + */ + void sendMail(IUser recipient, MailSender sender, String message); + + /** + * Sends a message from the specified {@link MailSender sender} to the specified {@link IUser recipient}. + * @param recipient The {@link IUser} which to send the message to. + * @param sender The {@link MailSender} which sent the message. + * @param message The message content. + * @param expireAt The millisecond epoch at which this message expires, or 0 if the message doesn't expire. + */ + void sendMail(IUser recipient, MailSender sender, String message, long expireAt); + + /** + * Sends a legacy message to the user without any advanced features. + * @param recipient The {@link IUser} which to send the message to. + * @param message The message content. + * @see #sendMail(IUser, MailSender, String) + * @see #sendMail(IUser, MailSender, String, long) + * @deprecated This is only for maintaining backwards compatibility with old API, please use the newer {@link #sendMail(IUser, MailSender, String)} API. + */ + @Deprecated + void sendLegacyMail(IUser recipient, String message); + + /** + * Generates the message sent to the recipient of the given {@link MailMessage}. + * @param message The {@link MailMessage} to generate the message for. + * @return The formatted message to be sent to the recipient. + */ + String getMailLine(MailMessage message); +} diff --git a/Essentials/src/main/resources/messages.properties b/Essentials/src/main/resources/messages.properties index 86813f672bc..38928e65238 100644 --- a/Essentials/src/main/resources/messages.properties +++ b/Essentials/src/main/resources/messages.properties @@ -647,21 +647,29 @@ loomCommandDescription=Opens up a loom. loomCommandUsage=/<command> mailClear=\u00a76To clear your mail, type\u00a7c /mail clear\u00a76. mailCleared=\u00a76Mail cleared\! +mailClearIndex=\u00a74You must specify a number between 1-{0}. mailCommandDescription=Manages inter-player, intra-server mail. -mailCommandUsage=/<command> [read|clear|send [to] [message]|sendall [message]] +mailCommandUsage=/<command> [read|clear|clear [number]|send [to] [message]|sendtemp [to] [expire time] [message]|sendall [message]] mailCommandUsage1=/<command> read [page] mailCommandUsage1Description=Reads the first (or specified) page of your mail -mailCommandUsage2=/<command> clear -mailCommandUsage2Description=Clears your mail +mailCommandUsage2=/<command> clear [number] +mailCommandUsage2Description=Clears either all or the specified mail(s) mailCommandUsage3=/<command> send <player> <message> mailCommandUsage3Description=Sends the specified player the given message mailCommandUsage4=/<command> sendall <message> mailCommandUsage4Description=Sends all players the given message +mailCommandUsage5=/<command> sendtemp <player> <expire time> <message> +mailCommandUsage5Description=Sends the specified player the given message which will expire in the specified time mailDelay=Too many mails have been sent within the last minute. Maximum\: {0} +mailFormatNew=\u00a76[\u00a7r{0}\u00a76] \u00a76[\u00a7r{1}\u00a76] \u00a7r{2} +mailFormatNewTimed=\u00a76[\u00a7e\u26a0\u00a76] \u00a76[\u00a7r{0}\u00a76] \u00a76[\u00a7r{1}\u00a76] \u00a7r{2} +mailFormatNewRead=\u00a76[\u00a7r{0}\u00a76] \u00a76[\u00a7r{1}\u00a76] \u00a77\u00a7o{2} +mailFormatNewReadTimed=\u00a76[\u00a7e\u26a0\u00a76] \u00a76[\u00a7r{0}\u00a76] \u00a76[\u00a7r{1}\u00a76] \u00a77\u00a7o{2} mailFormat=\u00a76[\u00a7r{0}\u00a76] \u00a7r{1} mailMessage={0} mailSent=\u00a76Mail sent\! mailSentTo=\u00a7c{0}\u00a76 has been sent the following mail\: +mailSentToExpire=\u00a7c{0}\u00a76 has been sent the following mail which will expire in \u00a7c{1}\u00a76\: mailTooLong=\u00a74Mail message too long. Try to keep it below 1000 characters. markMailAsRead=\u00a76To mark your mail as read, type\u00a7c /mail clear\u00a76. matchingIPAddress=\u00a76The following players previously logged in from that IP address\: diff --git a/Essentials/src/main/resources/plugin.yml b/Essentials/src/main/resources/plugin.yml index e96ec4affa5..a80ab358fc9 100644 --- a/Essentials/src/main/resources/plugin.yml +++ b/Essentials/src/main/resources/plugin.yml @@ -286,7 +286,7 @@ commands: aliases: [eloom] mail: description: Manages inter-player, intra-server mail. - usage: /<command> [read|clear|send [to] [message]|sendall [message]] + usage: /<command> [read|clear|clear [number]|send [to] [message]|sendtemp [to] [expire time] [message]|sendall [message]] aliases: [email,eemail,memo,ememo] me: description: Describes an action in the context of the player. diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordMessageRecipient.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordMessageRecipient.java index c047917c637..87f71487819 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordMessageRecipient.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordMessageRecipient.java @@ -5,6 +5,7 @@ import net.essentialsx.api.v2.services.discord.InteractionMember; import org.bukkit.entity.Player; +import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import static com.earth2me.essentials.I18n.tl; @@ -48,6 +49,11 @@ public String getName() { return member.getTag(); } + @Override + public UUID getUUID() { + return null; + } + @Override public String getDisplayName() { return member.getTag(); From 5c08a0e72cc80e249c204d2562fb9674de934f1f Mon Sep 17 00:00:00 2001 From: triagonal <10545540+triagonal@users.noreply.github.com> Date: Fri, 2 Jul 2021 02:30:08 +1000 Subject: [PATCH 15/29] Ignore case when matching custom item aliases (#4295) Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com> --- .../essentials/items/CustomItemResolver.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/items/CustomItemResolver.java b/Essentials/src/main/java/com/earth2me/essentials/items/CustomItemResolver.java index 6e49feb1904..ac8e196dbbf 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/items/CustomItemResolver.java +++ b/Essentials/src/main/java/com/earth2me/essentials/items/CustomItemResolver.java @@ -25,7 +25,8 @@ public CustomItemResolver(final Essentials ess) { } @Override - public ItemStack apply(final String item) { + public ItemStack apply(String item) { + item = item.toLowerCase(); if (map.containsKey(item)) { try { return ess.getItemDb().get(map.get(item)); @@ -62,19 +63,21 @@ public void reloadConfig() { return; } - for (final Map.Entry<String, Object> alias : section.entrySet()) { - if (!(alias.getValue() instanceof String)) { + for (final Map.Entry<String, Object> entry : section.entrySet()) { + if (!(entry.getValue() instanceof String)) { continue; } - final String target = (String) alias.getValue(); + final String alias = entry.getKey().toLowerCase(); + final String target = (String) entry.getValue(); if (existsInItemDb(target)) { - map.put(alias.getKey(), target); + map.put(alias, target); } } } - public void setAlias(final String alias, final String target) { + public void setAlias(String alias, final String target) { + alias = alias.toLowerCase(); if (map.containsKey(alias) && map.get(alias).equalsIgnoreCase(target)) { return; } @@ -84,7 +87,7 @@ public void setAlias(final String alias, final String target) { } public void removeAlias(final String alias) { - if (map.remove(alias) != null) { + if (map.remove(alias.toLowerCase()) != null) { save(); } } From 94c509b1e28435f6b29d57f0433019fc2bcb8871 Mon Sep 17 00:00:00 2001 From: triagonal <10545540+triagonal@users.noreply.github.com> Date: Fri, 2 Jul 2021 05:18:05 +1000 Subject: [PATCH 16/29] Prevent exception when retrieving enchantments (#4297) --- .../src/main/java/com/earth2me/essentials/Enchantments.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Enchantments.java b/Essentials/src/main/java/com/earth2me/essentials/Enchantments.java index cd6cf4b609b..f44a8f4ede5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Enchantments.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Enchantments.java @@ -282,7 +282,11 @@ public static Enchantment getByName(final String name) { } Enchantment enchantment = null; if (isFlat) { // 1.13+ only - enchantment = Enchantment.getByKey(NamespacedKey.minecraft(name.toLowerCase())); + try { + enchantment = Enchantment.getByKey(NamespacedKey.minecraft(name.toLowerCase())); + } catch (IllegalArgumentException ignored) { + // NamespacedKey throws IAE if key does not match regex + } } if (enchantment == null) { From 711f701d62961b2a49ab107c4a30b29aef28195e Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 1 Jul 2021 15:22:48 -0400 Subject: [PATCH 17/29] Fix typo in mail tab complete (#4296) --- .../main/java/com/earth2me/essentials/commands/Commandmail.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java index 1f2595dc520..d50dbf261e5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandmail.java @@ -292,7 +292,7 @@ protected List<String> getTabCompleteOptions(final Server server, final CommandS return Lists.newArrayList("send", "sendall"); } else if (args.length == 2 && (args[0].equalsIgnoreCase("send") || args[0].equalsIgnoreCase("sendtemp"))) { return getPlayers(server, sender); - } else if (args.length == 3 && args[0].equalsIgnoreCase("sentemp")) { + } else if (args.length == 3 && args[0].equalsIgnoreCase("sendtemp")) { return COMMON_DATE_DIFFS; } else if ((args.length > 2 && args[0].equalsIgnoreCase("send")) || (args.length > 1 && args[0].equalsIgnoreCase("sendall"))) { return null; // Use vanilla handler From 4ce38bde36a51599678a89a34d5cfa7fdb50948d Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 1 Jul 2021 11:02:27 -0400 Subject: [PATCH 18/29] Allow uppercase variables --- .../src/main/java/net/essentialsx/discord/DiscordSettings.java | 1 + 1 file changed, 1 insertion(+) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java index 78d3ad7fe17..ee173d3fc8c 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java @@ -277,6 +277,7 @@ private MessageFormat generateMessageFormat(String content, String defaultStr, b content = format ? FormatUtil.replaceFormat(content) : FormatUtil.stripFormat(content); for (int i = 0; i < arguments.length; i++) { content = content.replace("{" + arguments[i] + "}", "{" + i + "}"); + content = content.replace("{" + arguments[i].toUpperCase() + "}", "{" + i + "}"); } return new MessageFormat(content); } From 11836e6662eabe655ccb2ea910704ff6f004d680 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:13:51 -0400 Subject: [PATCH 19/29] Ensure MessageFormat's are clean before parsing --- .../src/main/java/net/essentialsx/discord/DiscordSettings.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java index ee173d3fc8c..7e3192f5ffd 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java @@ -275,10 +275,12 @@ private String getFormatString(String node) { private MessageFormat generateMessageFormat(String content, String defaultStr, boolean format, String... arguments) { content = content == null ? defaultStr : content; content = format ? FormatUtil.replaceFormat(content) : FormatUtil.stripFormat(content); + content = content.replace("'", "''"); for (int i = 0; i < arguments.length; i++) { content = content.replace("{" + arguments[i] + "}", "{" + i + "}"); content = content.replace("{" + arguments[i].toUpperCase() + "}", "{" + i + "}"); } + content = content.replaceAll("\\{([^0-9]+)}", "'{$1}'"); return new MessageFormat(content); } From 3505b47d8ff121a79a81f1d6b90e0ceaf7c73189 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 1 Jul 2021 13:40:08 -0400 Subject: [PATCH 20/29] Fix vanilla command execution on discord --- .../interactions/commands/ExecuteCommand.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java index 99b724d4dd5..b7f6aa97dfd 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/commands/ExecuteCommand.java @@ -7,6 +7,7 @@ import net.essentialsx.discord.interactions.InteractionCommandImpl; import net.essentialsx.discord.util.DiscordCommandSender; import org.bukkit.Bukkit; +import org.bukkit.command.CommandException; import static com.earth2me.essentials.I18n.tl; @@ -20,7 +21,18 @@ public ExecuteCommand(JDADiscordService jda) { public void onCommand(InteractionEvent event) { final String command = event.getStringArgument("command"); event.reply(tl("discordCommandExecuteReply", command)); - Bukkit.getScheduler().runTask(jda.getPlugin(), () -> - Bukkit.dispatchCommand(new DiscordCommandSender(jda, Bukkit.getConsoleSender(), event::reply).getSender(), command)); + Bukkit.getScheduler().runTask(jda.getPlugin(), () -> { + try { + Bukkit.dispatchCommand(new DiscordCommandSender(jda, Bukkit.getConsoleSender(), event::reply).getSender(), command); + } catch (CommandException e) { + // Check if this is a vanilla command, in which case we have to use a vanilla command sender :( + if (e.getMessage().contains("a vanilla command listener") || (e.getCause() != null && e.getCause().getMessage().contains("a vanilla command listener"))) { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command); + return; + } + // Something unrelated, should error out here + throw e; + } + }); } } From a55289196b1d0d61b4bd4a7b682d7933b60d5ef5 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 1 Jul 2021 14:50:34 -0400 Subject: [PATCH 21/29] Add server start/stop messages --- .../api/v2/services/discord/MessageType.java | 4 ++- .../essentialsx/discord/DiscordSettings.java | 8 ++++++ .../discord/JDADiscordService.java | 4 +++ .../discord/listeners/BukkitListener.java | 12 ++------- .../essentialsx/discord/util/DiscordUtil.java | 25 +++++++++++++++++++ .../src/main/resources/config.yml | 8 ++++++ 6 files changed, 50 insertions(+), 11 deletions(-) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java index 9c17c8655ba..b821bd7c00c 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java @@ -58,9 +58,11 @@ public static final class DefaultTypes { public final static MessageType CHAT = new MessageType("chat", true); public final static MessageType DEATH = new MessageType("death", true); public final static MessageType AFK = new MessageType("afk", true); + public final static MessageType SERVER_START = new MessageType("server-start", false); + public final static MessageType SERVER_STOP = new MessageType("server-stop", false); public final static MessageType KICK = new MessageType("kick", false); public final static MessageType MUTE = new MessageType("mute", false); - private final static MessageType[] VALUES = new MessageType[]{JOIN, LEAVE, CHAT, DEATH, AFK, KICK, MUTE}; + private final static MessageType[] VALUES = new MessageType[]{JOIN, LEAVE, CHAT, DEATH, AFK, SERVER_START, SERVER_STOP, KICK, MUTE}; /** * Gets an array of all the default {@link MessageType MessageTypes}. diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java index 7e3192f5ffd..4d9bc25eec0 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java @@ -263,6 +263,14 @@ public MessageFormat getUnAfkFormat(Player player) { "username", "displayname"); } + public String getStartMessage() { + return config.getString("messages.server-start", ":white_check_mark: The server has started!"); + } + + public String getStopMessage() { + return config.getString("messages.server-stop", ":octagonal_sign: The server has stopped!"); + } + public MessageFormat getKickFormat() { return kickFormat; } diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java index 97e0d3f8ba1..1d4777640eb 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java @@ -172,6 +172,7 @@ public void startup() throws LoginException, InterruptedException { updateTypesRelay(); Bukkit.getPluginManager().registerEvents(new BukkitListener(this), plugin); + getPlugin().getEss().scheduleSyncDelayedTask(() -> DiscordUtil.dispatchDiscordMessage(JDADiscordService.this, MessageType.DefaultTypes.SERVER_START, getSettings().getStartMessage(), true, null, null, null)); Bukkit.getServicesManager().register(DiscordService.class, this, plugin, ServicePriority.Normal); } @@ -347,6 +348,9 @@ public void shutdown() { } if (jda != null) { + sendMessage(MessageType.DefaultTypes.SERVER_STOP, getSettings().getStopMessage(), true); + DiscordUtil.dispatchDiscordMessage(JDADiscordService.this, MessageType.DefaultTypes.SERVER_STOP, getSettings().getStopMessage(), true, null, null, null); + shutdownConsoleRelay(true); // Unregister leftover jda listeners diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java index 5e6c5f66bd7..9bef98cee8f 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java @@ -10,6 +10,7 @@ import net.essentialsx.api.v2.events.discord.DiscordMessageEvent; import net.essentialsx.api.v2.services.discord.MessageType; import net.essentialsx.discord.JDADiscordService; +import net.essentialsx.discord.util.DiscordUtil; import net.essentialsx.discord.util.MessageUtil; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -177,15 +178,6 @@ private void sendDiscordMessage(final MessageType messageType, final String mess } private void sendDiscordMessage(final MessageType messageType, final String message, final boolean allowPing, final String avatarUrl, final String name, final UUID uuid) { - if (jda.getPlugin().getSettings().getMessageChannel(messageType.getKey()).equalsIgnoreCase("none")) { - return; - } - - final DiscordMessageEvent event = new DiscordMessageEvent(messageType, FormatUtil.stripFormat(message), allowPing, avatarUrl, name, uuid); - if (Bukkit.getServer().isPrimaryThread()) { - Bukkit.getPluginManager().callEvent(event); - } else { - Bukkit.getScheduler().runTask(jda.getPlugin(), () -> Bukkit.getPluginManager().callEvent(event)); - } + DiscordUtil.dispatchDiscordMessage(jda, messageType, message, allowPing, avatarUrl, name, uuid); } } diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java index 0daa82c3e9f..45ccd551a03 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java @@ -13,10 +13,15 @@ import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.entities.Webhook; +import net.essentialsx.api.v2.events.discord.DiscordMessageEvent; +import net.essentialsx.api.v2.services.discord.MessageType; +import net.essentialsx.discord.JDADiscordService; import okhttp3.OkHttpClient; +import org.bukkit.Bukkit; import java.awt.Color; import java.util.List; +import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; @@ -165,4 +170,24 @@ public static boolean hasRoles(Member member, List<String> roleDefinitions) { } return false; } + + public static void dispatchDiscordMessage(final JDADiscordService jda, final MessageType messageType, final String message, final boolean allowPing, final String avatarUrl, final String name, final UUID uuid) { + if (jda.getPlugin().getSettings().getMessageChannel(messageType.getKey()).equalsIgnoreCase("none")) { + return; + } + + final DiscordMessageEvent event = new DiscordMessageEvent(messageType, FormatUtil.stripFormat(message), allowPing, avatarUrl, name, uuid); + + // If the server is stopping, we cannot dispatch events. + if (messageType == MessageType.DefaultTypes.SERVER_STOP) { + jda.sendMessage(event, event.getMessage(), event.isAllowGroupMentions()); + return; + } + + if (Bukkit.getServer().isPrimaryThread()) { + Bukkit.getPluginManager().callEvent(event); + } else { + Bukkit.getScheduler().runTask(jda.getPlugin(), () -> Bukkit.getPluginManager().callEvent(event)); + } + } } diff --git a/EssentialsDiscord/src/main/resources/config.yml b/EssentialsDiscord/src/main/resources/config.yml index 78d0916fe5c..448cb7e019e 100644 --- a/EssentialsDiscord/src/main/resources/config.yml +++ b/EssentialsDiscord/src/main/resources/config.yml @@ -110,6 +110,10 @@ message-types: death: primary # AFK status change messages sent when a player's AFK status changes. afk: primary + # Message sent when the server starts up. + server-start: primary + # Message sent when the server shuts down. + server-stop: primary # Message sent when a player is kicked from the Minecraft server. kick: staff # Message sent when a player's mute state is changed on the Minecraft server. @@ -279,6 +283,10 @@ messages: # - {deathmessage}: The full default death message used in game # ... PlaceholderAPI placeholders are also supported here too! death: ":skull: {deathmessage}" + # This is the message sent to discord when the server starts. + server-start: ":white_check_mark: The server has started!" + # This is the message sent to discord when the server stops. + server-stop: ":octagonal_sign: The server has stopped!" # This is the message sent to discord when a player becomes afk. # The following placeholders can be used here: # - {username}: The name of the user who became afk From d78729f3432cff7376e72fbe874492c403d0c5eb Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 1 Jul 2021 18:59:35 -0400 Subject: [PATCH 22/29] Disallow empty discord filters (#4298) --- .../src/main/java/net/essentialsx/discord/DiscordSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java index 4d9bc25eec0..bd1cf259d53 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java @@ -330,7 +330,7 @@ public void reloadConfig() { } final String filter = config.getString("chat.discord-filter", null); - if (filter != null) { + if (filter != null && !filter.trim().isEmpty()) { try { discordFilter = Pattern.compile(filter); } catch (PatternSyntaxException e) { From d903e40a53d7519d0b6c037fb80696900ff7e66b Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sat, 3 Jul 2021 00:52:49 -0400 Subject: [PATCH 23/29] Fix weird behavior with legacy mails (#4307) --- .../essentials/config/serializers/MailMessageSerializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java b/Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java index 45aec4235b5..4bce9867c13 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java +++ b/Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java @@ -13,7 +13,7 @@ public class MailMessageSerializer implements TypeSerializer<MailMessage> { @Override public MailMessage deserialize(Type type, ConfigurationNode node) throws SerializationException { - final boolean legacy = !node.node("legacy").isNull() && node.node("legacy").getBoolean(false); + final boolean legacy = node.node("legacy").getBoolean(true); return new MailMessage(node.node("read").getBoolean(false), legacy, From 36a070be4c50012872ca4acc05312990dedf38b7 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Fri, 2 Jul 2021 16:23:44 -0400 Subject: [PATCH 24/29] Fix Configurate conversions not saving --- .../main/java/com/earth2me/essentials/EssentialsUpgrade.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsUpgrade.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsUpgrade.java index 9d1dce8c9f8..42e18dc55d7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsUpgrade.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsUpgrade.java @@ -189,7 +189,7 @@ public void convertMailList() { } public void convertStupidCamelCaseUserdataKeys() { - if (doneFile.getBoolean("updateUsersLegacyPathNames", false)) { + if (doneFile.getBoolean("updateUsersStupidLegacyPathNames", false)) { return; } @@ -232,12 +232,13 @@ public void convertStupidCamelCaseUserdataKeys() { config.removeProperty("acceptingPay"); config.setProperty("accepting-pay", isPay); } + config.blockingSave(); } catch (final RuntimeException ex) { LOGGER.log(Level.INFO, "File: " + file.toString()); throw ex; } } - doneFile.setProperty("updateUsersLegacyPathNames", true); + doneFile.setProperty("updateUsersStupidLegacyPathNames", true); doneFile.save(); LOGGER.info("Done converting legacy userdata keys to Configurate."); } From 555a62c58203dd310ffb32bf08bbd28c6709401d Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Fri, 2 Jul 2021 16:24:09 -0400 Subject: [PATCH 25/29] Fix baltop something having a null name for offline players --- .../java/com/earth2me/essentials/BalanceTopImpl.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/BalanceTopImpl.java b/Essentials/src/main/java/com/earth2me/essentials/BalanceTopImpl.java index 812e98601d5..07787715e0f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/BalanceTopImpl.java +++ b/Essentials/src/main/java/com/earth2me/essentials/BalanceTopImpl.java @@ -39,8 +39,15 @@ private void calculateBalanceTopMap() { final BigDecimal userMoney = user.getMoney(); user.updateMoneyCache(userMoney); newTotal = newTotal.add(userMoney); - final String name = user.isHidden() ? user.getName() : user.getDisplayName(); - entries.add(new BalanceTop.Entry(user.getBase().getUniqueId(), name, userMoney)); + final String name; + if (user.getBase() instanceof OfflinePlayer) { + name = user.getLastAccountName(); + } else if (user.isHidden()) { + name = user.getName(); + } else { + name = user.getDisplayName(); + } + entries.add(new BalanceTop.Entry(user.getUUID(), name, userMoney)); } } } From 409210ccde6bc77c231441fa09ce0b0281659469 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sat, 3 Jul 2021 11:54:01 -0400 Subject: [PATCH 26/29] Fix issues with 3rd-party Vault economy providers (#4303) Turns out that when you depend on a plugin, get this, the plugin will load before you. So we need to rework how we do things here. Fixes #4075 Fixes #4304 --- .../com/earth2me/essentials/Essentials.java | 2 ++ .../essentials/EssentialsPluginListener.java | 20 ++++--------- .../commands/Commandessentials.java | 13 +++++++++ .../essentials/economy/EconomyLayers.java | 29 +++++++++++++++++-- .../essentials/economy/layers/VaultLayer.java | 2 +- .../src/main/resources/messages.properties | 1 + 6 files changed, 50 insertions(+), 17 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 8897f65dde4..edcfb8d75a2 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -331,6 +331,8 @@ public void onEnable() { confList.add(jails); execTimer.mark("Init(Jails)"); + EconomyLayers.onEnable(this); + //Spawner item provider only uses one but it's here for legacy... spawnerItemProvider = new BlockMetaSpawnerItemProvider(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPluginListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPluginListener.java index 092058f2267..38e1f9a1eb6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPluginListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPluginListener.java @@ -13,19 +13,9 @@ public class EssentialsPluginListener implements Listener, IConf { private final transient IEssentials ess; - private boolean serverLoaded = false; public EssentialsPluginListener(final IEssentials ess) { this.ess = ess; - - // Run on first server tick - ess.scheduleSyncDelayedTask(() -> { - if (EconomyLayers.getSelectedLayer() == null || serverLoaded) { - return; - } - serverLoaded = true; - EconomyLayers.onServerLoad(); - }); } @EventHandler(priority = EventPriority.MONITOR) @@ -36,9 +26,11 @@ public void onPluginEnable(final PluginEnableEvent event) { ess.getPermissionsHandler().setUseSuperperms(ess.getSettings().useBukkitPermissions()); ess.getPermissionsHandler().checkPermissions(); ess.getAlternativeCommandsHandler().addPlugin(event.getPlugin()); - final EconomyLayer layer = EconomyLayers.onPluginEnable(event.getPlugin()); - if (layer != null) { - ess.getLogger().log(Level.INFO, "Essentials found a compatible payment resolution method: " + layer.getName() + " (v" + layer.getPluginVersion() + ")!"); + if (EconomyLayers.isServerStarted()) { + final EconomyLayer layer = EconomyLayers.onPluginEnable(event.getPlugin()); + if (layer != null) { + ess.getLogger().log(Level.INFO, "Essentials found a compatible payment resolution method: " + layer.getName() + " (v" + layer.getPluginVersion() + ")!"); + } } } @@ -49,7 +41,7 @@ public void onPluginDisable(final PluginDisableEvent event) { } ess.getPermissionsHandler().checkPermissions(); ess.getAlternativeCommandsHandler().removePlugin(event.getPlugin()); - if (EconomyLayers.onPluginDisable(event.getPlugin(), serverLoaded)) { + if (EconomyLayers.onPluginDisable(event.getPlugin())) { final EconomyLayer layer = EconomyLayers.getSelectedLayer(); if (layer != null) { ess.getLogger().log(Level.INFO, "Essentials found a new compatible payment resolution method: " + layer.getName() + " (v" + layer.getPluginVersion() + ")!"); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java index c83147bf4f4..64ae147fd87 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java @@ -4,6 +4,8 @@ import com.earth2me.essentials.EssentialsUpgrade; import com.earth2me.essentials.User; import com.earth2me.essentials.UserMap; +import com.earth2me.essentials.economy.EconomyLayer; +import com.earth2me.essentials.economy.EconomyLayers; import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.EnumUtil; import com.earth2me.essentials.utils.FloatUtil; @@ -431,6 +433,17 @@ private void runVersion(final Server server, final CommandSource sender, final S if (name.equals("Vault")) isVaultInstalled = true; } + final String layer; + if (ess.getSettings().isEcoDisabled()) { + layer = "Disabled"; + } else if (EconomyLayers.isLayerSelected()) { + final EconomyLayer economyLayer = EconomyLayers.getSelectedLayer(); + layer = economyLayer.getName() + " (" + economyLayer.getBackendName() + ")"; + } else { + layer = "None"; + } + sender.sendMessage(tl("versionOutputEconLayer", layer)); + if (isMismatched) { sender.sendMessage(tl("versionMismatchAll")); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/economy/EconomyLayers.java b/Essentials/src/main/java/com/earth2me/essentials/economy/EconomyLayers.java index 79132302381..a4184e5588a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/economy/EconomyLayers.java +++ b/Essentials/src/main/java/com/earth2me/essentials/economy/EconomyLayers.java @@ -1,12 +1,15 @@ package com.earth2me.essentials.economy; +import com.earth2me.essentials.Essentials; import com.earth2me.essentials.economy.layers.VaultLayer; +import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Level; /** * Abstraction layer for economy abstraction layers. @@ -15,6 +18,7 @@ public final class EconomyLayers { private static final Map<String, EconomyLayer> registeredLayers = new HashMap<>(); private static final List<String> availableLayers = new ArrayList<>(); private static EconomyLayer selectedLayer = null; + private static boolean serverStarted = false; private EconomyLayers() { } @@ -27,6 +31,27 @@ public static void init() { registerLayer(new VaultLayer()); } + public static void onEnable(final Essentials ess) { + ess.scheduleSyncDelayedTask(() -> { + serverStarted = true; + for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) { + if (!plugin.isEnabled()) { + continue; + } + final EconomyLayer layer = onPluginEnable(plugin); + if (layer != null) { + ess.getLogger().log(Level.INFO, "Essentials found a compatible payment resolution method: " + layer.getName() + " (v" + layer.getPluginVersion() + ")!"); + } + } + + onServerLoad(); + }); + } + + public static boolean isServerStarted() { + return serverStarted; + } + public static EconomyLayer getSelectedLayer() { return selectedLayer; } @@ -52,7 +77,7 @@ public static EconomyLayer onPluginEnable(final Plugin plugin) { return selectedLayer; } - public static boolean onPluginDisable(final Plugin plugin, final boolean serverStarted) { + public static boolean onPluginDisable(final Plugin plugin) { if (!availableLayers.contains(plugin.getName())) { return false; } @@ -75,7 +100,7 @@ public static void onServerLoad() { return; } - availableLayers.remove(getSelectedLayer().getPluginVersion()); + availableLayers.remove(getSelectedLayer().getPluginName()); selectedLayer = null; if (!availableLayers.isEmpty()) { selectedLayer = registeredLayers.get(availableLayers.get(0)); diff --git a/Essentials/src/main/java/com/earth2me/essentials/economy/layers/VaultLayer.java b/Essentials/src/main/java/com/earth2me/essentials/economy/layers/VaultLayer.java index 1a7b54a0f18..c9077397be1 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/economy/layers/VaultLayer.java +++ b/Essentials/src/main/java/com/earth2me/essentials/economy/layers/VaultLayer.java @@ -34,7 +34,7 @@ public boolean deposit(OfflinePlayer player, BigDecimal amount) { @Override public boolean withdraw(OfflinePlayer player, BigDecimal amount) { - return false; + return adapter.withdrawPlayer(player, amount.doubleValue()).transactionSuccess(); } @Override diff --git a/Essentials/src/main/resources/messages.properties b/Essentials/src/main/resources/messages.properties index 38928e65238..4b94a2fd80e 100644 --- a/Essentials/src/main/resources/messages.properties +++ b/Essentials/src/main/resources/messages.properties @@ -1384,6 +1384,7 @@ versionOutputFine=\u00a76{0} version: \u00a7a{1} versionOutputWarn=\u00a76{0} version: \u00a7c{1} versionOutputUnsupported=\u00a7d{0} \u00a76version: \u00a7d{1} versionOutputUnsupportedPlugins=\u00a76You are running \u00a7dunsupported plugins\u00a76! +versionOutputEconLayer=\u00a76Economy Layer: \u00a7r{0} versionMismatch=\u00a74Version mismatch\! Please update {0} to the same version. versionMismatchAll=\u00a74Version mismatch\! Please update all Essentials jars to the same version. versionReleaseLatest=\u00a76You''re running the latest stable version of EssentialsX! From 7e255703449fcd1a3d492205edc5e89af2c74a05 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sat, 3 Jul 2021 15:46:09 -0400 Subject: [PATCH 27/29] Remove usage of java.awt.Color (#4312) This fixes issues on headless JREs which lack java.awt classes. --- .../java/com/earth2me/essentials/utils/FormatUtil.java | 6 ++++-- .../java/net/essentialsx/discord/util/DiscordUtil.java | 9 ++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java index 6ce0b7f29b2..55731454b8d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/FormatUtil.java @@ -2,8 +2,8 @@ import net.ess3.api.IUser; import org.bukkit.ChatColor; +import org.bukkit.Color; -import java.awt.Color; import java.util.EnumSet; import java.util.Locale; import java.util.Set; @@ -129,7 +129,9 @@ public static String parseHexColor(String hexColor) throws NumberFormatException if (hexColor.length() != 6) { throw new NumberFormatException("Invalid hex length"); } - Color.decode("#" + hexColor); + + //noinspection ResultOfMethodCallIgnored + Color.fromRGB(Integer.decode("#" + hexColor)); final StringBuilder assembledColorCode = new StringBuilder(); assembledColorCode.append(ChatColor.COLOR_CHAR + "x"); for (final char curChar : hexColor.toCharArray()) { diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java index 45ccd551a03..3de1e1f2130 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/DiscordUtil.java @@ -19,7 +19,6 @@ import okhttp3.OkHttpClient; import org.bukkit.Bukkit; -import java.awt.Color; import java.util.List; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -129,17 +128,17 @@ public static CompletableFuture<Webhook> createWebhook(TextChannel channel, Stri * @return The bukkit color code or blank string. */ public static String getRoleColorFormat(Member member) { - final Color color = member.getColor(); + final int rawColor = member.getColorRaw(); - if (color == null) { + if (rawColor == Role.DEFAULT_COLOR_RAW) { return ""; } if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_16_1_R01)) { // Essentials' FormatUtil allows us to not have to use bungee's chatcolor since bukkit's own one doesn't support rgb - return FormatUtil.replaceFormat("&#" + Integer.toHexString(color.getRGB()).substring(2)); + return FormatUtil.replaceFormat("&#" + Integer.toHexString(rawColor).substring(2)); } - return FormatUtil.replaceFormat("&" + DownsampleUtil.nearestTo(color.getRGB())); + return FormatUtil.replaceFormat("&" + DownsampleUtil.nearestTo(rawColor)); } /** From 6535edf4e0501936c912cde4641be105fd834909 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sat, 3 Jul 2021 19:32:34 -0400 Subject: [PATCH 28/29] Fix MailMessageSerializer not handling null UUIDs (#4314) --- .../config/serializers/MailMessageSerializer.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java b/Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java index 4bce9867c13..befa089ac42 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java +++ b/Essentials/src/main/java/com/earth2me/essentials/config/serializers/MailMessageSerializer.java @@ -7,18 +7,19 @@ import org.spongepowered.configurate.serialize.TypeSerializer; import java.lang.reflect.Type; -import java.util.Objects; import java.util.UUID; public class MailMessageSerializer implements TypeSerializer<MailMessage> { @Override public MailMessage deserialize(Type type, ConfigurationNode node) throws SerializationException { final boolean legacy = node.node("legacy").getBoolean(true); + final String rawUuid = node.node("sender-uuid").getString(); + final String uuid = (rawUuid == null || rawUuid.equals("null")) ? null : rawUuid; return new MailMessage(node.node("read").getBoolean(false), legacy, !legacy ? node.node("sender-name").getString() : null, - !legacy ? UUID.fromString(Objects.requireNonNull(node.node("sender-uuid").getString())) : null, + uuid == null ? null : UUID.fromString(uuid), !legacy ? node.node("timestamp").getLong() : 0L, !legacy ? node.node("expire").getLong() : 0L, node.node("message").getString()); @@ -36,7 +37,7 @@ public void serialize(Type type, @Nullable MailMessage obj, ConfigurationNode no node.node("message").set(String.class, obj.getMessage()); if (!obj.isLegacy()) { node.node("sender-name").set(String.class, obj.getSenderUsername()); - node.node("sender-uuid").set(String.class, obj.getSenderUUID().toString()); + node.node("sender-uuid").set(String.class, obj.getSenderUUID() == null ? "null" : obj.getSenderUUID().toString()); node.node("timestamp").set(Long.class, obj.getTimeSent()); node.node("expire").set(Long.class, obj.getTimeExpire()); } From 8c8c85d7536739aea7e51e7b4bca8b71a31432b7 Mon Sep 17 00:00:00 2001 From: triagonal <10545540+triagonal@users.noreply.github.com> Date: Tue, 6 Jul 2021 05:47:42 +1000 Subject: [PATCH 29/29] Fix server shutdown not setting logout location (#4318) --- .../src/main/java/com/earth2me/essentials/Essentials.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index edcfb8d75a2..230505e39cc 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -513,7 +513,7 @@ public void onDisable() { user.sendMessage(tl("unvanishedReload")); } if (stopping) { - user.setLastLocation(); + user.setLogoutLocation(); if (!user.isHidden()) { user.setLastLogout(System.currentTimeMillis()); }