package com.atsuishio.superbwarfare.item; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.client.renderer.item.LungeMineRenderer; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModEnumExtensions; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModSounds; import net.minecraft.client.Minecraft; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; import org.jetbrains.annotations.NotNull; import software.bernie.geckolib.animatable.GeoItem; import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; import software.bernie.geckolib.animation.*; import software.bernie.geckolib.util.GeckoLibUtil; import javax.annotation.ParametersAreNonnullByDefault; @EventBusSubscriber(modid = Mod.MODID, bus = EventBusSubscriber.Bus.MOD) public class LungeMine extends Item implements GeoItem { private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); public static ItemDisplayContext transformType; public LungeMine() { super(new Properties().stacksTo(4)); } @SubscribeEvent private static void registerItemExtensions(RegisterClientExtensionsEvent event) { event.registerItem(new IClientItemExtensions() { private final BlockEntityWithoutLevelRenderer renderer = new LungeMineRenderer(); @Override public @NotNull BlockEntityWithoutLevelRenderer getCustomRenderer() { return renderer; } @Override @ParametersAreNonnullByDefault public HumanoidModel.ArmPose getArmPose(LivingEntity entityLiving, InteractionHand hand, ItemStack itemStack) { if (!itemStack.isEmpty()) { if (entityLiving.getUsedItemHand() == hand) { return ModEnumExtensions.Client.getLungeMinePose(); } } return HumanoidModel.ArmPose.EMPTY; } }, ModItems.LUNGE_MINE); } public void getTransformType(ItemDisplayContext type) { transformType = type; } private PlayState idlePredicate(AnimationState event) { LocalPlayer player = Minecraft.getInstance().player; if (player == null) return PlayState.STOP; if (ClientEventHandler.lungeSprint > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.lunge_mine.sprint")); } if (ClientEventHandler.lungeDraw > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.lunge_mine.draw")); } if (ClientEventHandler.lungeAttack > 0) { return event.setAndContinue(RawAnimation.begin().thenPlay("animation.lunge_mine.fire")); } if (player.isSprinting() && player.onGround() && ClientEventHandler.lungeDraw == 0) { return event.setAndContinue(RawAnimation.begin().thenLoop("animation.lunge_mine.run")); } return event.setAndContinue(RawAnimation.begin().thenLoop("animation.lunge_mine.idle")); } @Override public void registerControllers(AnimatableManager.ControllerRegistrar data) { var idleController = new AnimationController<>(this, "idleController", 2, this::idlePredicate); data.add(idleController); } @Override public AnimatableInstanceCache getAnimatableInstanceCache() { return this.cache; } @Override @ParametersAreNonnullByDefault public boolean onEntitySwing(ItemStack stack, LivingEntity entity, InteractionHand hand) { return false; } @Override @ParametersAreNonnullByDefault public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { return false; } @Override @ParametersAreNonnullByDefault public @NotNull InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { ItemStack stack = playerIn.getItemInHand(handIn); if (playerIn instanceof ServerPlayer serverPlayer) { serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.LUNGE_MINE_GROWL.get(), SoundSource.PLAYERS, 2, 1); } if (!playerIn.level().isClientSide()) { playerIn.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 100, (playerIn.hasEffect(MobEffects.MOVEMENT_SPEED) ? playerIn.getEffect(MobEffects.MOVEMENT_SPEED).getAmplifier() : 0) + 2)); } else { ClientEventHandler.lungeSprint = 180; } playerIn.getCooldowns().addCooldown(stack.getItem(), 300); return InteractionResultHolder.consume(stack); } @Override @ParametersAreNonnullByDefault public boolean canAttackBlock(BlockState p_41441_, Level p_41442_, BlockPos p_41443_, Player p_41444_) { return false; } }