From c09ef37020e60cd7ad346e18fd4084e79786828b Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Fri, 11 Mar 2022 20:36:46 +0800 Subject: [PATCH] Fix NPE on item without nbt (#515) --- .../common/mixin/bukkit/CraftItemStackMixin.java | 16 +++++++++++++--- .../core/world/spawner/BaseSpawnerMixin.java | 5 +++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftItemStackMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftItemStackMixin.java index ff5bc566..af9c0ddb 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftItemStackMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftItemStackMixin.java @@ -6,6 +6,7 @@ import io.izzel.arclight.common.bridge.core.item.ItemStackBridge; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import org.bukkit.Material; +import org.bukkit.craftbukkit.v.inventory.CraftItemFactory; import org.bukkit.craftbukkit.v.inventory.CraftItemStack; import org.bukkit.craftbukkit.v.legacy.CraftLegacy; import org.bukkit.inventory.meta.ItemMeta; @@ -26,8 +27,18 @@ public abstract class CraftItemStackMixin implements CraftItemStackBridge { @Shadow public abstract Material getType(); @Shadow public abstract short getDurability(); @Shadow public abstract boolean hasItemMeta(); + @Shadow static Material getType(ItemStack item) { throw new RuntimeException(); } // @formatter:on + @Inject(method = "getItemMeta(Lnet/minecraft/world/item/ItemStack;)Lorg/bukkit/inventory/meta/ItemMeta;", cancellable = true, at = @At(value = "INVOKE", target = "Lorg/bukkit/Material;ordinal()I")) + private static void arclight$noTag(ItemStack item, CallbackInfoReturnable cir) { + if (item.getTag() == null) { + var meta = CraftItemFactory.instance().getItemMeta(getType(item)); + ((ItemMetaBridge) meta).bridge$setForgeCaps(((ItemStackBridge) (Object) item).bridge$getForgeCaps()); + cir.setReturnValue(meta); + } + } + @Inject(method = "getItemMeta(Lnet/minecraft/world/item/ItemStack;)Lorg/bukkit/inventory/meta/ItemMeta;", at = @At("RETURN")) private static void arclight$offerCaps(ItemStack item, CallbackInfoReturnable cir) { if (item == null) return; @@ -39,12 +50,11 @@ public abstract class CraftItemStackMixin implements CraftItemStackBridge { ((ItemMetaBridge) meta).bridge$setForgeCaps(((ItemStackBridge) (Object) item).bridge$getForgeCaps()); } - // check when update - @Inject(method = "setItemMeta(Lnet/minecraft/world/item/ItemStack;Lorg/bukkit/inventory/meta/ItemMeta;)Z", at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/item/ItemStack;m_41720_()Lnet/minecraft/world/item/Item;")) + @Inject(method = "setItemMeta(Lnet/minecraft/world/item/ItemStack;Lorg/bukkit/inventory/meta/ItemMeta;)Z", at = @At(value = "INVOKE", ordinal = 1, remap = true, target = "Lnet/minecraft/world/item/ItemStack;getItem()Lnet/minecraft/world/item/Item;")) private static void arclight$setCaps(ItemStack item, ItemMeta itemMeta, CallbackInfoReturnable cir) { CompoundTag forgeCaps = ((ItemMetaBridge) itemMeta).bridge$getForgeCaps(); if (forgeCaps != null) { - ((ItemStackBridge)(Object) item).bridge$setForgeCaps(forgeCaps.copy()); + ((ItemStackBridge) (Object) item).bridge$setForgeCaps(forgeCaps.copy()); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/spawner/BaseSpawnerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/spawner/BaseSpawnerMixin.java index 117a5c85..ee9a8184 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/spawner/BaseSpawnerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/spawner/BaseSpawnerMixin.java @@ -16,6 +16,7 @@ import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.SpawnPlacements; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.SpawnData; import net.minecraft.world.phys.AABB; @@ -114,13 +115,13 @@ public abstract class BaseSpawnerMixin { var res = ForgeEventFactory.canEntitySpawn(mob, level, (float) entity.getX(), (float) entity.getY(), (float) entity.getZ(), (BaseSpawner) (Object) this, MobSpawnType.SPAWNER); if (res == net.minecraftforge.eventbus.api.Event.Result.DENY) continue; if (res == net.minecraftforge.eventbus.api.Event.Result.DEFAULT) { - if (this.nextSpawnData.getCustomSpawnRules().isEmpty() && !ForgeEventFactory.canEntitySpawnSpawner(mob, level, (float) entity.getX(), (float) entity.getY(), (float) entity.getZ(), (BaseSpawner) (Object) this)) { + if (this.nextSpawnData.getCustomSpawnRules().isEmpty() && !mob.checkSpawnRules(level, MobSpawnType.SPAWNER) || !mob.checkSpawnObstruction(level)) { continue; } } if (this.nextSpawnData.getEntityToSpawn().size() == 1 && this.nextSpawnData.getEntityToSpawn().contains("id", 8)) { - if (!ForgeEventFactory.doSpecialSpawn(mob, level, (float) entity.getX(), (float) entity.getY(), (float) entity.getZ(), (BaseSpawner) (Object) this, MobSpawnType.SPAWNER)) + if (!ForgeEventFactory.doSpecialSpawn(mob, (LevelAccessor) level, (float) entity.getX(), (float) entity.getY(), (float) entity.getZ(), (BaseSpawner) (Object) this, MobSpawnType.SPAWNER)) ((Mob) entity).finalizeSpawn(level, level.getCurrentDifficultyAt(entity.blockPosition()), MobSpawnType.SPAWNER, null, null); } if (((WorldBridge) mob.level).bridge$spigotConfig().nerfSpawnerMobs) {