Kobolds!

Kobolds!

13M Downloads

[1.21.1 - 3.0.25] Error message spam

SiverDX opened this issue ยท 1 comments

commented
Image

Seems to occur often for Kobold Pirate

gives the error [minecraft/ItemStack]: Tried to load invalid item: 'No key id in MapLike[{}]'
Due to:

public static Optional<ItemStack> parse(HolderLookup.Provider lookupProvider, Tag tag) {
    return CODEC.parse(lookupProvider.createSerializationContext(NbtOps.INSTANCE), tag)
        .resultOrPartial(p_330102_ -> LOGGER.error("Tried to load invalid item: '{}'", p_330102_));
}

As seen here that can happen a lot of times:
Image


Snippet from problematic kobolds:

{AbsorptionAmount:0.0f,Age:0,Air:300s,ArmorDropChances:[0.085f,0.085f,0.085f,0.085f],ArmorItems:[{},{},{},{}],Brain:{memories:{}},CD:0,CanPickUpLoot:1b,DeathTime:0s,FallDistance:0.0f,FallFlying:0b,Fire:-1s,ForcedAge:0,HandDropChances:[0.0f,0.0f],HandItems:[{count:1,id:"kobolds:kobold_iron_sword"},{}],Health:18.0f,HurtByTimestamp:0,HurtTime:0s,Invulnerable:0b,LeftHanded:0b,Motion:[0.0669096690042735d,-0.0784000015258789d,0.025442338074284213d],NeoForgeData:{},OnGround:1b,PersistenceRequired:1b,PortalCooldown:0,Pos:[5.211745069047692d,30.0d,-281.6585003366165d],Primary:{count:1,id:"kobolds:kobold_iron_sword"},Rotation:[278.27158f,0.0f],UUID:[I;193841539,1659194402,-1860442814,1660329340],attributes:[{base:0.0d,id:"minecraft:generic.oxygen_bonus"},{base:0.0d,id:"minecraft:generic.knockback_resistance"},{base:16.0d,id:"minecraft:generic.follow_range",modifiers:[{amount:0.02481260259897628d,id:"minecraft:random_spawn_bonus",operation:"add_multiplied_base"}]},{base:1.0d,id:"minecraft:generic.attack_damage"},{base:2.0d,id:"minecraft:generic.armor"},{base:0.25d,id:"minecraft:generic.movement_speed"}],id:"kobolds:kobold_pirate","neoforge:attachments":{"accessories:inventory_holder":{},"mowziesmobs:ability_data":{},"mowziesmobs:frozen_data":{freezeDecayDelay:0,freezeProgress:0.0f,frozen:0b,frozenPitch:0.0f,frozenRenderYawOffset:0.0f,frozenSwingProgress:0.0f,frozenWalkAnimPosition:0.0f,frozenWalkAnimSpeed:0.0f,frozenYaw:0.0f,frozenYawHead:0.0f,prevFrozen:0b,prevHasAI:1b},"mowziesmobs:living_data":{}},"neoforge:spawn_type":"STRUCTURE"}
{AbsorptionAmount:0.0f,Age:0,Air:300s,ArmorDropChances:[0.085f,0.085f,0.085f,0.085f],ArmorItems:[{},{},{},{}],Brain:{memories:{}},CD:0,CanPickUpLoot:1b,DeathTime:0s,FallDistance:0.0f,FallFlying:0b,Fire:-1s,ForcedAge:0,HandDropChances:[0.0f,0.0f],HandItems:[{count:1,id:"minecraft:crossbow"},{}],Health:18.0f,HurtByTimestamp:0,HurtTime:0s,Invulnerable:0b,LeftHanded:0b,Motion:[0.0d,-0.0784000015258789d,0.0d],NeoForgeData:{},OnGround:1b,PersistenceRequired:1b,PortalCooldown:0,Pos:[10.26260166495224d,41.0625d,-273.88905180108856d],Primary:{count:1,id:"minecraft:crossbow"},Rotation:[201.20486f,0.0f],UUID:[I;1616700587,1397050952,-1545009537,-300812624],attributes:[{base:0.0d,id:"minecraft:generic.oxygen_bonus"},{base:0.0d,id:"minecraft:generic.knockback_resistance"},{base:16.0d,id:"minecraft:generic.follow_range",modifiers:[{amount:-0.007678139902459646d,id:"minecraft:random_spawn_bonus",operation:"add_multiplied_base"}]},{base:1.0d,id:"minecraft:generic.attack_damage"},{base:2.0d,id:"minecraft:generic.armor"},{base:0.25d,id:"minecraft:generic.movement_speed"}],id:"kobolds:kobold_pirate","neoforge:attachments":{"accessories:inventory_holder":{},"mowziesmobs:ability_data":{},"mowziesmobs:frozen_data":{freezeDecayDelay:0,freezeProgress:0.0f,frozen:0b,frozenPitch:0.0f,frozenRenderYawOffset:0.0f,frozenSwingProgress:0.0f,frozenWalkAnimPosition:0.0f,frozenWalkAnimSpeed:0.0f,frozenYaw:0.0f,frozenYawHead:0.0f,prevFrozen:0b,prevHasAI:1b},"mowziesmobs:living_data":{}},"neoforge:spawn_type":"STRUCTURE"}

I think this is due to your first parse which you then call isPresent on

if (ItemStack.parse(this.level().registryAccess(), tag.getCompound("Primary")).isPresent()) {
    this.primary = (ItemStack)ItemStack.parse(this.level().registryAccess(), tag.getCompound("Primary")).get();
}
if (ItemStack.parse(this.level().registryAccess(), tag.getCompound("Secondary")).isPresent()) {
    this.secondary = (ItemStack)ItemStack.parse(this.level().registryAccess(), tag.getCompound("Secondary")).get();
}

If the tag does not exist getCompound will return an empty one - in the data above you can see that Secondary (my version) or Trident (github version) is missing

I recommend using this from ItemStack, it's what vanilla is doing

public static ItemStack parseOptional(HolderLookup.Provider lookupProvider, CompoundTag tag) {
    return tag.isEmpty() ? EMPTY : parse(lookupProvider, tag).orElse(EMPTY);
}