diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/CustomGunModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/CustomGunModel.java index 0bd732211..60263a9e1 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/CustomGunModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/CustomGunModel.java @@ -4,8 +4,12 @@ import com.atsuishio.superbwarfare.client.molang.MolangVariable; import com.atsuishio.superbwarfare.data.gun.GunData; import com.atsuishio.superbwarfare.item.gun.GunItem; import net.minecraft.client.Minecraft; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.constant.DataTickets; import software.bernie.geckolib.loading.math.MathParser; import software.bernie.geckolib.loading.math.MolangQueries; import software.bernie.geckolib.model.GeoModel; @@ -38,10 +42,18 @@ public abstract class CustomGunModel extends var data = GunData.from(stack); + // TODO 实现正确的空判断,需要分离stack set(MolangVariable.SBW_IS_EMPTY, () -> data.isEmpty.get() ? 1 : 0); } private static void set(String key, DoubleSupplier value) { MathParser.setVariable(key, value); } + + public boolean shouldCancelRender(ItemStack stack, AnimationState animationState) { + if (!(stack.getItem() instanceof GunItem)) return true; + var item = animationState.getData(DataTickets.ITEMSTACK); + if (item == null || GeoItem.getId(item) != GeoItem.getId(stack)) return true; + return animationState.getData(DataTickets.ITEM_RENDER_PERSPECTIVE) != ItemDisplayContext.FIRST_PERSON_RIGHT_HAND; + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java index 78bb2437d..a44e555e8 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java @@ -5,7 +5,6 @@ import com.atsuishio.superbwarfare.client.AnimationHelper; import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; import com.atsuishio.superbwarfare.data.gun.GunData; import com.atsuishio.superbwarfare.event.ClientEventHandler; -import com.atsuishio.superbwarfare.item.gun.GunItem; import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; @@ -33,15 +32,15 @@ public class RpgItemModel extends CustomGunModel { } @Override - public void setCustomAnimations(RpgItem animatable, long instanceId, AnimationState animationState) { - GeoBone gun = getAnimationProcessor().getBone("bone"); - GeoBone shen = getAnimationProcessor().getBone("rpg"); - GeoBone hammer = getAnimationProcessor().getBone("hammer"); - + public void setCustomAnimations(RpgItem animatable, long instanceId, AnimationState animationState) { Player player = Minecraft.getInstance().player; if (player == null) return; ItemStack stack = player.getMainHandItem(); - if (!(stack.getItem() instanceof GunItem)) return; + if (shouldCancelRender(stack, animationState)) return; + + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("rpg"); + GeoBone hammer = getAnimationProcessor().getBone("hammer"); var data = GunData.from(stack); if (data.closeHammer.get()) { diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/RpgItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/RpgItemRenderer.java index ea62d6fd3..24b22fffd 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/RpgItemRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/gun/RpgItemRenderer.java @@ -11,6 +11,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.cache.object.GeoBone; public class RpgItemRenderer extends CustomGunRenderer { @@ -34,7 +35,7 @@ public class RpgItemRenderer extends CustomGunRenderer { var player = mc.player; if (player == null) return; ItemStack itemStack = player.getMainHandItem(); - if (itemStack.getItem() instanceof GunItem) { + if (itemStack.getItem() instanceof GunItem && GeoItem.getId(itemStack) == this.getInstanceId(animatable)) { AnimationHelper.handleShootFlare(name, stack, itemStack, bone, buffer, packedLightIn, 0, 0, 0.625, 0.7); } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java index 74e9c1bd4..a50cd799e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -24,6 +24,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.util.Mth; @@ -112,6 +113,10 @@ public abstract class GunItem extends Item implements CustomRendererItem, GeoIte public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean selected) { if (!(entity instanceof LivingEntity living) || !(stack.getItem() instanceof GunItem gunItem)) return; + if (level instanceof ServerLevel serverLevel) { + GeoItem.getOrAssignId(stack, serverLevel); + } + var data = GunData.from(stack); if (!data.initialized()) {