"Error while generating full name" when generating items that have custom item meta in 1.21
MrPowerGamerBR opened this issue · 12 comments
What is happening?
When using /iteminfo
on an item that has custom item meta ChestShop throws an error when trying to generate the item name
What did you expect to happen?
That it worked™
Plugin Version
3.12.1-SNAPSHOT (build 345)
Plugin Config
Config
# Should the plugin log some messages that are useful for debugging?
DEBUG: false
# Do you want to turn off the automatic updates of ChestShop?
TURN_OFF_UPDATES: true
# Do you want to turn off the automatic notifications for new development builds?
TURN_OFF_DEV_UPDATE_NOTIFIER: false
# Do you want to include some values of this config in the metrics? (This will not leak sensitive data but help in the development process)
INCLUDE_SETTINGS_IN_METRICS: true
# How large should the internal caches be?
CACHE_SIZE: 1000
# The default language when the client's language can't be found.
DEFAULT_LANGUAGE: "en"
# Should the plugin try to use a language file that matches the client's locale setting?
USE_CLIENT_LOCALE: true
# What containers are allowed to hold a shop? (Only blocks with inventories work!)
SHOP_CONTAINERS:
- "CHEST"
- "TRAPPED_CHEST"
# (In 1/1000th of a second) How often can a player use the shop sign?
SHOP_INTERACTION_INTERVAL: 250
# Do you want to block people in creative mode from using shops?
IGNORE_CREATIVE_MODE: true
# Do you want to block people who have access to a shop due to their permissions from using it? (owners are always ignored)
IGNORE_ACCESS_PERMS: false
# If true, people will buy with left-click and sell with right-click.
REVERSE_BUTTONS: false
# If true, people will be able to buy/sell in 64 stacks while holding the crouch button.
SHIFT_SELLS_IN_STACKS: false
# If true, people will be able to sell/buy everything available of the same type.
SHIFT_SELLS_EVERYTHING: false
# What can you do by clicking shift with SHIFT_SELLS_IN_STACKS turned on? (ALL/BUY/SELL)
SHIFT_ALLOWS: "ALL"
# Can shop's chest be opened by owner with right-clicking a shop's sign?
ALLOW_SIGN_CHEST_OPEN: false
# If true and in 1.14+, the owner of a chest shop can click with a dye / ink sac to dye the sign.
SIGN_DYING: true
# If true, when you left-click your own shop sign you won't open chest's inventory, but instead you will start destroying the sign.
ALLOW_LEFT_CLICK_DESTROYING: true
# If true, if the shop is empty, the sign is destroyed and put into the chest, so the shop isn't usable anymore.
REMOVE_EMPTY_SHOPS: false
# If true, if the REMOVE_EMPTY_SHOPS option is turned on, the chest is also destroyed.
REMOVE_EMPTY_CHESTS: false
# A list of worlds in which to remove empty shops with the previous config. Case sensitive. An empty list means all worlds.
REMOVE_EMPTY_WORLDS:
- "world1"
- "world2"
# First line of your Admin Shop's sign should look like this:
ADMIN_SHOP_NAME: "SparklyShop"
# Make all admin shops be unlimited even if they have a shop container at the sign
FORCE_UNLIMITED_ADMIN_SHOP: false
# The name of the economy account which Admin Shops should use and to which all taxes will go
SERVER_ECONOMY_ACCOUNT: ""
# The uuid of the economy account for the Admin Shop. Useful for fake accounts as normally only accounts of players work
SERVER_ECONOMY_ACCOUNT_UUID: 00000000-0000-0000-0000-000000000000
# Percent of the price that should go to the server's account. (100 = 100 percent)
TAX_AMOUNT: 0
# Percent of the price that should go to the server's account when buying from an Admin Shop.
SERVER_TAX_AMOUNT: 0
# Amount of money player must pay to create a shop
SHOP_CREATION_PRICE: 0
# How much money do you get back when destroying a sign?
SHOP_REFUND_PRICE: 0
# How many decimal places are allowed at a maximum for prices?
PRICE_PRECISION: 2
# This makes sure that the UUIDs of player shop accounts match the server's online-mode setting. Disabling this might lead to issues with offline players and is therefore unsupported!
ENSURE_CORRECT_PLAYERID: true
# This regexp validates the name of the player. If the name doesn't match, the player will neither be able to create a valid shop sign, nor buy/sell from a shop.
# Note for Bedrock support: If you have Floodgate on your server, you should set this regexp to ^\\*?\\w+$ and ENSURE_CORRECT_PLAYERID to false
# If your Floodgate prefix is not *, change the first * in the regexp (the one before the question mark) to whatever your prefix is.
VALID_PLAYERNAME_REGEXP: "^\\w+$"
# Should we block shops that sell things for more than they buy? (This prevents newbies from creating shops that would be exploited)
BLOCK_SHOPS_WITH_SELL_PRICE_HIGHER_THAN_BUY_PRICE: true
# Maximum amount of items that can be bought/sold at a shop. Default 3456 is a double chest of 64 stacks.
MAX_SHOP_AMOUNT: 3456
# Do you want to allow other players to build a shop on a block where there's one already?
ALLOW_MULTIPLE_SHOPS_AT_ONE_BLOCK: false
# Can shops be used even when the buyer/seller doesn't have enough items, space or money? (The price will be scaled adequately to the item amount)
ALLOW_PARTIAL_TRANSACTIONS: true
# Can '?' be put in place of item name in order for the sign to be auto-filled?
ALLOW_AUTO_ITEM_FILL: true
# Enable this if you use BungeeCord and want players to receive shop notifications on other servers
BUNGEECORD_MESSAGES: false
# Do you want to show "Out of stock" messages?
SHOW_MESSAGE_OUT_OF_STOCK: true
# Do you want to show "Full shop" messages?
SHOW_MESSAGE_FULL_SHOP: true
# How many seconds do you want to wait before showing notifications for the same shop to the owner again?
NOTIFICATION_MESSAGE_COOLDOWN: 10
# Can players hide the "Out of stock" messages with /cstoggle?
CSTOGGLE_TOGGLES_OUT_OF_STOCK: false
# Can players hide the "Full shop" messages with /cstoggle?
CSTOGGLE_TOGGLES_FULL_SHOP: false
# Do you want to show "You bought/sold... " messages?
SHOW_TRANSACTION_INFORMATION_CLIENT: true
# Do you want to show "Somebody bought/sold... " messages?
SHOW_TRANSACTION_INFORMATION_OWNER: true
# If true, plugin will log transactions in its own file
LOG_TO_FILE: false
# Do you want ChestShop's messages to show up in console?
LOG_TO_CONSOLE: true
# Should all shop removals be logged to the console?
LOG_ALL_SHOP_REMOVALS: true
# Do you want to stack all items up to 64 item stacks?
STACK_TO_64: false
# Do you want to use built-in protection against chest destruction?
USE_BUILT_IN_PROTECTION: true
# Do you want to have shop signs "stick" to chests?
STICK_SIGNS_TO_CHESTS: false
# EXPERIMENTAL: Do you want to turn off the default protection when another plugin is protecting the block? (Will leave the chest visually open - CraftBukkit bug!)
TURN_OFF_DEFAULT_PROTECTION_WHEN_PROTECTED_EXTERNALLY: false
# Do you want to turn off the default sign protection? Warning! Other players will be able to destroy other people's shops!
TURN_OFF_SIGN_PROTECTION: false
# Do you want to disable the hopper protection, which prevents Hopper-Minecarts from taking items out of shops?
TURN_OFF_HOPPER_PROTECTION: false
# Only allow users to buy/sell that have access to the sign's protection? (E.g. LWC protection)
CHECK_ACCESS_FOR_SHOP_USE: false
# Do you want to protect shop chests with LWC?
PROTECT_CHEST_WITH_LWC: false
# Of which type should the container protection be? Possible type: public, private, donate and on some LWC versions display
LWC_CHEST_PROTECTION_TYPE: "PRIVATE"
# Do you want to protect shop signs with LWC?
PROTECT_SIGN_WITH_LWC: false
# Of which type should the sign protection be? Possible type: public, private, donate and on some LWC versions display
LWC_SIGN_PROTECTION_TYPE: "PRIVATE"
# Should the chest's LWC protection be removed once the shop sign is destroyed?
REMOVE_LWC_PROTECTION_AUTOMATICALLY: true
# Should LWC limits block shop creations?
LWC_LIMITS_BLOCK_CREATION: true
# Do you want to only let people build inside WorldGuard regions?
WORLDGUARD_INTEGRATION: false
# Do you want to only let people build inside region flagged by doing /region regionName flag allow-shop allow?
WORLDGUARD_USE_FLAG: false
# Do you want ChestShop to respect WorldGuard's chest protection?
WORLDGUARD_USE_PROTECTION: false
# Do you want to only let people build inside GriefPrevention claims?
GRIEFPREVENTION_INTEGRATION: false
# Do you want to only let people build inside RedProtect regions?
REDPROTECT_INTEGRATION: false
# Do you want to deny shop access to unlogged users?
AUTHME_HOOK: true
# Do you want to allow shop access to unregistered users? (Example: registration is optional)
AUTHME_ALLOW_UNREGISTERED: false
# How much Heroes exp should people get for creating a ChestShop?
HEROES_EXP: 100.0
# Add icons and make item names hoverable in transaction messages when ShowItem is installed?
SHOWITEM_MESSAGE: true
# Add stock counter to quantity line?
USE_STOCK_COUNTER: false
Server Version
This server is running SparklyPaper version 1.21-DEV-ver/1.21@e1c5e17 (2024-06-18T15:26:26Z) (Implementing API version 1.21-R0.1-SNAPSHOT) (I'm using my own Paper fork, I need to test it with vanilla Paper but I'm 99,99999% sure that this issue also happens in Paper)
Server Log
Log
[15:17:44 ERROR]: [ChestShop] Error while generating full item name
java.lang.IllegalArgumentException: Cannot generate code for item ItemStack{POTION x 1, POTION_META:{meta-type=POTION, potion-type=minecraft:invisibility, custom-effects=[]}} with maximum length of 0 (code Potion#7 results in item ItemStack{POTION x 1, POTION_META:{meta-type=POTION, Damage=0, potion-type=minecraft:invisibility, custom-effects=[]}})
at ChestShop.jar/com.Acrobot.ChestShop.Utils.ItemUtil.getName(ItemUtil.java:82) ~[ChestShop.jar:?]
at ChestShop.jar/com.Acrobot.ChestShop.Utils.ItemUtil.getName(ItemUtil.java:44) ~[ChestShop.jar:?]
at ChestShop.jar/com.Acrobot.ChestShop.Commands.ItemInfo.onCommand(ItemInfo.java:52) ~[ChestShop.jar:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[paper-mojangapi-1.21-R0.1-SNAPSHOT.jar:?]
at io.papermc.paper.command.brigadier.bukkit.BukkitCommandNode$BukkitBrigCommand.run(BukkitCommandNode.java:91) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at com.mojang.brigadier.context.ContextChain.runExecutable(ContextChain.java:73) ~[brigadier-1.2.9.jar:?]
at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:31) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:19) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.UnboundEntryAction.lambda$bind$0(UnboundEntryAction.java:8) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.CommandQueueEntry.execute(CommandQueueEntry.java:5) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.ExecutionContext.runCommandQueue(ExecutionContext.java:103) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.executeCommandInContext(Commands.java:446) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.performCommand(Commands.java:353) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.performCommand(Commands.java:340) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.performCommand(Commands.java:335) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.network.ServerGamePacketListenerImpl.performUnsignedChatCommand(ServerGamePacketListenerImpl.java:2147) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleChatCommand$11(ServerGamePacketListenerImpl.java:2121) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.TickTask.run(TickTask.java:18) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:151) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:24) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1483) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:201) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:125) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1461) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1454) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.BlockableEventLoop.runAllTasks(BlockableEventLoop.java:114) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1563) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1251) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:334) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]
[15:19:46 ERROR]: [ChestShop] Error while generating full item name
java.lang.IllegalArgumentException: Cannot generate code for item ItemStack{DIRT x 1, UNSPECIFIC_META:{meta-type=UNSPECIFIC, display-name={"text":"","extra":[{"text":"Dirt","obfuscated":false,"italic":false,"underlined":false,"strikethrough":false,"color":"green","bold":true}]}}} with maximum length of 0 (code Dirt#9 results in item ItemStack{DIRT x 1, UNSPECIFIC_META:{meta-type=UNSPECIFIC, display-name={"text":"","extra":[{"text":"Dirt","obfuscated":false,"italic":false,"underlined":false,"strikethrough":false,"color":"green","bold":true}]}, Damage=0}})
at ChestShop.jar/com.Acrobot.ChestShop.Utils.ItemUtil.getName(ItemUtil.java:82) ~[ChestShop.jar:?]
at ChestShop.jar/com.Acrobot.ChestShop.Utils.ItemUtil.getName(ItemUtil.java:44) ~[ChestShop.jar:?]
at ChestShop.jar/com.Acrobot.ChestShop.Commands.ItemInfo.onCommand(ItemInfo.java:52) ~[ChestShop.jar:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[paper-mojangapi-1.21-R0.1-SNAPSHOT.jar:?]
at io.papermc.paper.command.brigadier.bukkit.BukkitCommandNode$BukkitBrigCommand.run(BukkitCommandNode.java:91) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at com.mojang.brigadier.context.ContextChain.runExecutable(ContextChain.java:73) ~[brigadier-1.2.9.jar:?]
at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:31) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:19) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.UnboundEntryAction.lambda$bind$0(UnboundEntryAction.java:8) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.CommandQueueEntry.execute(CommandQueueEntry.java:5) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.ExecutionContext.runCommandQueue(ExecutionContext.java:103) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.executeCommandInContext(Commands.java:446) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.performCommand(Commands.java:353) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.performCommand(Commands.java:340) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.performCommand(Commands.java:335) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.network.ServerGamePacketListenerImpl.performUnsignedChatCommand(ServerGamePacketListenerImpl.java:2147) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleChatCommand$11(ServerGamePacketListenerImpl.java:2121) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.TickTask.run(TickTask.java:18) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:151) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:24) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1483) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:201) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:125) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1461) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1454) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:135) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.managedBlock(MinecraftServer.java:1413) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1534) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1251) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:334) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]
What other plugins are you running?
[15:18:08 INFO]: Server Plugins (104):
[15:18:08 INFO]: Bukkit Plugins:
[15:18:08 INFO]: - ChestShop, ChunkyBorder, Citizens, CoreProtect, DreamAjuda, DreamAntiAFK, DreamArmorStandEditor, DreamAssinaturas, DreamAuth, DreamBedrockIntegrations
[15:18:08 INFO]: DreamBlockParty, DreamBlockVIPItems, DreamBrisa, DreamBroadcast, DreamBusca, DreamCaixaSecreta, DreamCasamentos, DreamCash, DreamCassino, DreamChat
[15:18:08 INFO]: DreamChatTags, DreamChestShopStuff, DreamClubes, DreamColorEmote, DreamCore, DreamCorreios, DreamCorrida, DreamCustomItems, DreamDemocracy, DreamDiscordCommandRelayer
[15:18:08 INFO]: DreamElevador, DreamEmptyWorldGenerator, DreamEnchant, DreamEnderHopper, DreamEquipCoolStuff, DreamEsponjas, DreamFight, DreamFusca, DreamHeads, DreamHome
[15:18:08 INFO]: DreamJetpack, DreamKits, DreamLabirinto, DreamLagStuffRestrictor, DreamLoja, DreamMapWatermarker, DreamMcMMOFun, DreamMinaRecheada, DreamMini, DreamMobSpawner
[15:18:08 INFO]: DreamMochilas, DreamMoverSpawners, DreamMusically, DreamPicaretaMonstra, DreamPrivada, DreamPvPTweaks,
DreamQuickHarvest, DreamQuiz, DreamRaffle, DreamRaspadinha
[15:18:08 INFO]: DreamReparar, DreamResourcePack, DreamResourceReset, DreamRestarter, DreamRoadProtector, DreamScoreboard, DreamSeamlessWorlds, DreamShopHeads, DreamSocial, DreamSonecas
[15:18:08 INFO]: DreamTerrainAdditions, DreamTNTRun, DreamTorreDaMorte, DreamTrails, DreamTreeAssist, DreamVanish, DreamVIPStuff, DreamVote, DreamWarps, DreamXizum
[15:18:08 INFO]: dynmap, GriefPrevention, GSit, HolographicDisplays, LuckPerms, mcMMO, Multiverse-Core, MyPet, NoCheatPlus, NoteBlockAPI
[15:18:08 INFO]: OldCombatMechanics, PlugManX, ProtocolLib, spark, SparklyDreamer, SparklyVoxelMaker, Vault, ViaBackwards, ViaVersion, Votifier
[15:18:08 INFO]: VoxelVert, WorldBorder, WorldEdit, WorldGuard
Agreements
- I have checked if there are already similar issues open.
- I am running the latest development version available from https://ci.minebench.de/job/ChestShop-3/.
- The version has support for this type of issue.
- I have provided all requested information and agree to the terms of the project's license
Additional context
No response
Unfortuantely I noticed this issue with damaged items while testing this more too: #598 so I would advice against running the plugin on 1.21/1.20.6 for now :S
so I would advice against running the plugin on 1.21/1.20.6 for now :S
too late 😭 (bro regrets updating his public server to 1.21 and is now facing the consequences of using experimental Paper builds in production)
Could you test that on the latest version? You used a build which is over two years old while there have been 2 releases and lots more bug fixes since then, especially in that region of the code.
Could you test that on the latest version? You used a build which is over two years old while there have been 2 releases and lots more bug fixes since then, especially in that region of the code.
Yes I had tested with latest, the version I was using on my public server is outdated (whoops) but I have tested it on my test server with the latest build (#414) and it still was borked
The difference between the two items is the Damage
value, the generated code has Damage=0
while the original does not
Removing the setDurability((short) 0)
from ItemDatabase#getItemCode
seems to fix the issue, but I haven't tried if ChestShop actually deserializes items that were generated in past ChestShop/Minecraft versions correctly after this change
[17:01:50 ERROR]: [ChestShop] Error while generating full item name
java.lang.IllegalArgumentException: Cannot generate code for item ItemStack{DIRT x 1, UNSPECIFIC_META:{meta-type=UNSPECIFIC, display-name={"text":"","extra":[{"text":"Dirt","obfuscated":false,"italic":false,"underlined":false,"strikethrough":false,"color":"green","bold":true}]}}} with maximum length of 0 (code Dirt#9 results in item ItemStack{DIRT x 1, UNSPECIFIC_META:{meta-type=UNSPECIFIC, display-name={"text":"","extra":[{"text":"Dirt","obfuscated":false,"italic":false,"underlined":false,"strikethrough":false,"color":"green","bold":true}]}, Damage=0}})
at ChestShop.jar/com.Acrobot.ChestShop.Utils.ItemUtil.getName(ItemUtil.java:82) ~[ChestShop.jar:?]
at ChestShop.jar/com.Acrobot.ChestShop.Utils.ItemUtil.getName(ItemUtil.java:44) ~[ChestShop.jar:?]
at ChestShop.jar/com.Acrobot.ChestShop.Commands.ItemInfo.sendItemName(ItemInfo.java:69) ~[ChestShop.jar:?]
at ChestShop.jar/com.Acrobot.ChestShop.Commands.ItemInfo.onCommand(ItemInfo.java:51) ~[ChestShop.jar:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[paper-mojangapi-1.21-R0.1-SNAPSHOT.jar:?]
at io.papermc.paper.command.brigadier.bukkit.BukkitCommandNode$BukkitBrigCommand.run(BukkitCommandNode.java:91) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at com.mojang.brigadier.context.ContextChain.runExecutable(ContextChain.java:73) ~[brigadier-1.2.9.jar:?]
at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:31) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:19) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.UnboundEntryAction.lambda$bind$0(UnboundEntryAction.java:8) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.CommandQueueEntry.execute(CommandQueueEntry.java:5) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.execution.ExecutionContext.runCommandQueue(ExecutionContext.java:103) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.executeCommandInContext(Commands.java:446) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.performCommand(Commands.java:353) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.performCommand(Commands.java:340) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.commands.Commands.performCommand(Commands.java:335) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.network.ServerGamePacketListenerImpl.performUnsignedChatCommand(ServerGamePacketListenerImpl.java:2147) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleChatCommand$11(ServerGamePacketListenerImpl.java:2121) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.TickTask.run(TickTask.java:18) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:151) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:24) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1483) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:201) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:125) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1461) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1454) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:135) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.managedBlock(MinecraftServer.java:1413) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:1420) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1265) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:334) ~[sparklypaper-1.21.jar:1.21-DEV-e1c5e17]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]
Hm, that's interesting. I'm not even sure why the code you mentioned is there exactly. It's over 9 years old so it might not even be necessary in recent versions anymore...
@Phoenix616 sorry for being the bearer of bad news but it seems that it isn't 100% fixed yet 😭
Using ChestShop version 3.12.3-SNAPSHOT (build 415)
[22:25:38] [Server thread/INFO]: MrPowerGamerBR issued server command: /iteminfo
[22:25:38] [Server thread/ERROR]: [ChestShop] Error while generating full item name
java.lang.IllegalArgumentException: Cannot generate code for item ItemStack{DIRT x 2, UNSPECIFIC_META:{meta-type=UNSPECIFIC, display-name={"text":"","extra":[{"text":"OwO Whats This??? teste","obfuscated":false,"italic":false,"underlined":false,"strikethrough":false,"color":"green","bold":true}]}}} with maximum length of 0 (code Dirt#23Q results in item ItemStack{DIRT x 1, UNSPECIFIC_META:{meta-type=UNSPECIFIC, display-name={"text":"","extra":[{"text":"OwO Whats This??? teste","obfuscated":false,"italic":false,"underlined":false,"strikethrough":false,"color":"green","bold":true}]}, Damage=0}})
at ChestShop.jar/com.Acrobot.ChestShop.Utils.ItemUtil.getName(ItemUtil.java:82) ~[ChestShop.jar:?]
at ChestShop.jar/com.Acrobot.ChestShop.Utils.ItemUtil.getName(ItemUtil.java:44) ~[ChestShop.jar:?]
at ChestShop.jar/com.Acrobot.ChestShop.Commands.ItemInfo.sendItemName(ItemInfo.java:69) ~[ChestShop.jar:?]
at ChestShop.jar/com.Acrobot.ChestShop.Commands.ItemInfo.onCommand(ItemInfo.java:51) ~[ChestShop.jar:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[paper-mojangapi-1.21-R0.1-SNAPSHOT.jar:?]
at io.papermc.paper.command.brigadier.bukkit.BukkitCommandNode$BukkitBrigCommand.run(BukkitCommandNode.java:91) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at com.mojang.brigadier.context.ContextChain.runExecutable(ContextChain.java:73) ~[brigadier-1.2.9.jar:?]
at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:31) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.commands.execution.tasks.ExecuteCommand.execute(ExecuteCommand.java:19) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.commands.execution.UnboundEntryAction.lambda$bind$0(UnboundEntryAction.java:8) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.commands.execution.CommandQueueEntry.execute(CommandQueueEntry.java:5) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.commands.execution.ExecutionContext.runCommandQueue(ExecutionContext.java:103) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.commands.Commands.executeCommandInContext(Commands.java:446) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.commands.Commands.performCommand(Commands.java:353) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.commands.Commands.performCommand(Commands.java:340) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.commands.Commands.performCommand(Commands.java:335) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.server.network.ServerGamePacketListenerImpl.performUnsignedChatCommand(ServerGamePacketListenerImpl.java:2147) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleChatCommand$11(ServerGamePacketListenerImpl.java:2121) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.server.TickTask.run(TickTask.java:18) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:151) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:24) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1483) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:201) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:125) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1461) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1454) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:135) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.server.MinecraftServer.managedBlock(MinecraftServer.java:1413) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:1420) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1265) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:334) ~[sparklypaper-1.21.jar:1.21-DEV-1b63d66]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]
The issue seems to lie within here:
/**
* Gives you an ItemStack from a String
*
* @param itemName Item name
* @return ItemStack
*/
public static ItemStack getItem(String itemName) {
String[] split = itemName.split("[:\\-#]");
for (int i = 0; i < split.length; i++) {
split[i] = split[i].trim();
}
int durability = getDurability(itemName);
MaterialParseEvent parseEvent = new MaterialParseEvent(split[0], (short) durability);
Bukkit.getPluginManager().callEvent(parseEvent);
Material material = parseEvent.getMaterial();
if (material == null) {
return null;
}
ItemStack itemStack = new ItemStack(material);
ItemMeta meta = getMetadata(itemName);
if (meta != null) {
if (meta instanceof Damageable) {
((Damageable) meta).setDamage(durability);
}
itemStack.setItemMeta(meta);
}
return itemStack;
}
If I only set the durability if it isn't 0, then ChestShop doesn't throw an error
/**
* Gives you an ItemStack from a String
*
* @param itemName Item name
* @return ItemStack
*/
public static ItemStack getItem(String itemName) {
String[] split = itemName.split("[:\\-#]");
for (int i = 0; i < split.length; i++) {
split[i] = split[i].trim();
}
int durability = getDurability(itemName);
MaterialParseEvent parseEvent = new MaterialParseEvent(split[0], (short) durability);
Bukkit.getPluginManager().callEvent(parseEvent);
Material material = parseEvent.getMaterial();
if (material == null) {
return null;
}
ItemStack itemStack = new ItemStack(material);
ItemMeta meta = getMetadata(itemName);
if (meta != null) {
if (meta instanceof Damageable && durability != 0) { // here
((Damageable) meta).setDamage(durability);
}
itemStack.setItemMeta(meta);
}
return itemStack;
}
Every item in 1.21 (and 1.20.6 maybe?) is Damageable due to the new item components Mojang introduced, example: /give MrPowerGamerBR dirt[minecraft:damage=5,minecraft:max_damage=10,minecraft:max_stack_size=1]
And for completeness, here's how to give a dirt block that actually takes damage when breaking blocks /give MrPowerGamerBR dirt[minecraft:damage=0,minecraft:max_damage=10,minecraft:max_stack_size=1,tool={"damage_per_block":1,"rules":[]}]
I have tested ChestShop with the durability != 0
above and it seems to work fine, even if I only give a dirt item WITHOUT damage /give MrPowerGamerBR dirt[minecraft:max_damage=10,minecraft:max_stack_size=1,tool={"damage_per_block":1,"rules":[]}]
ChestShop seems to handle that edge case correctly (it gives an item without the damage tag set, which is correct)
Good job spotting that but the issue is slightly different: All items have been Damageable since 1.13, the difference is that in 1.20.6/1.21 there is now a difference between the damage being set to 0 and the damage not being set at all so the logic needs to be adjusted so that when the durability is parsed from the string it needs to handle the case of none being specified differently from 0 now in order to not explicitly set the damage value on the item.