[SPIGOT-7675] FoodComponent config deserialization Created: 30/May/24  Updated: 25/Dec/24  Resolved: 30/May/24

Status: Resolved
Project: Spigot
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Minor
Reporter: blablubbabc Assignee: blablubbabc
Resolution: Fixed Votes: 0
Labels: Configuration, item, serialization

Version:  This server is running CraftBukkit version dev-Spigot-342f493-87d0a33 (MC: 1.20.6) (Implementing API version 1.20.6-R0.1-SNAPSHOT)
Guidelines Read: Yes

 Description   

Give command:

/give @p paper[food={nutrition:1,saturation:1f,can_always_eat:true,eat_seconds:5f}] 1

Serialized item data in config:

        ==: org.bukkit.inventory.ItemStack
        v: 3839
        type: PAPER
        meta:
          ==: ItemMeta
          meta-type: UNSPECIFIC
          food:
            ==: Food
            nutrition: 1
            saturation: 1.0
            can-always-eat: true
            eat-seconds: 5.0
            effects: []

Error during deserialization:

Caused by: org.bukkit.configuration.InvalidConfigurationException: Could not call constructor 'public org.bukkit.craftbukkit.v1_20_R4.inventory.components.CraftFoodComponent(java.util.Map)' of class org.bukkit.craftbukkit.v1_20_R4.inventory.components.CraftFoodComponent for deserialization
        at com.nisovin.shopkeepers.util.bukkit.ConfigUtils.loadConfigSafely(ConfigUtils.java:246) ~[?:?]
        at com.nisovin.shopkeepers.util.data.persistence.bukkit.BukkitConfigDataStore.loadFromString(BukkitConfigDataStore.java:61) ~[?:?]
        ... 20 more
Caused by: java.lang.IllegalArgumentException: saturation(1.0) is not a valid class java.lang.Float
        at org.bukkit.craftbukkit.v1_20_R4.inventory.SerializableMeta.getObject(SerializableMeta.java:111) ~[spigot-1.20.6-R0.1-SNAPSHOT.jar:dev-Spigot-342f493-87d0a33]
        at org.bukkit.craftbukkit.v1_20_R4.inventory.components.CraftFoodComponent.<init>(CraftFoodComponent.java:33) ~[spigot-1.20.6-R0.1-SNAPSHOT.jar:dev-Spigot-342f493-87d0a33]
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) ~[?:?]
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502) ~[?:?]
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486) ~[?:?]
        at org.bukkit.configuration.serialization.ConfigurationSerialization.deserializeViaCtor(ConfigurationSerialization.java:107) ~[spigot-api-1.20.6-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.configuration.serialization.ConfigurationSerialization.deserialize(ConfigurationSerialization.java:145) ~[spigot-api-1.20.6-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.configuration.serialization.ConfigurationSerialization.deserializeObject(ConfigurationSerialization.java:209) ~[spigot-api-1.20.6-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:58) ~[spigot-api-1.20.6-R0.1-SNAPSHOT.jar:?]

Snakeyaml probably loads this as double. There might also be cases in which the value is loaded as integer if users edit the value manually inside configs and omit the ".0" suffix on the number. In CraftFoodComponent we currently try to load these values as Float, without converting from other number types currently.



 Comments   
Comment by blablubbabc [ 30/May/24 ]

I will prepare a PR

Generated at Fri Mar 21 10:52:12 UTC 2025 using Jira 10.3.3#10030003-sha1:d220e3fefc8dfc6d47f522d3b9a20c1455e12b7b.