Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package net.mcreator.arboromancy.item; // arboromancy is the name of my mod, replace it with your own.
- import net.minecraft.world.phys.Vec3;
- import net.minecraft.world.level.Level;
- import net.minecraft.world.item.UseAnim;
- import net.minecraft.world.item.Rarity;
- import net.minecraft.world.item.ProjectileWeaponItem;
- import net.minecraft.world.item.ItemStack;
- import net.minecraft.world.item.Items;
- import net.minecraft.world.item.Item;
- import net.minecraft.world.item.BowItem;
- import net.minecraft.world.entity.projectile.AbstractArrow;
- import net.minecraft.world.entity.player.Player;
- import net.minecraft.world.entity.LivingEntity;
- import net.minecraft.world.InteractionResultHolder;
- import net.minecraft.world.InteractionHand;
- import net.minecraft.server.level.ServerPlayer;
- import net.minecraft.server.level.ServerLevel;
- import net.mcreator.arboromancy.entity.FlamethrowerFireEntity; // These are my custom shells, replace them with your own.
- import net.mcreator.arboromancy.entity.FlamethrowerFireBlueEntity; // These are my custom shells, replace them with your own.
- import net.mcreator.arboromancy.entity.FlamethrowerFireGreenEntity; // These are my custom shells, replace them with your own.
- import java.util.List;
- public class FlamethrowerGunItem extends Item {
- // Projectile types
- private enum ProjectileType {
- ORANGE, // Default orange fire
- BLUE, // Blue fire
- GREEN, // You can add green
- // PURPLE // And so on
- }
- // List of allowed ammunition
- private static final List<Item> AMMO_ITEMS = List.of(
- Items.BLAZE_POWDER, // Blaze powder
- Items.FIRE_CHARGE, // Fire charge
- FlamethrowerFireEntity.PROJECTILE_ITEM.getItem() // Custom ammo
- );
- public FlamethrowerGunItem() {
- super(new Item.Properties().rarity(Rarity.UNCOMMON));
- }
- @Override
- public UseAnim getUseAnimation(ItemStack itemstack) {
- return UseAnim.BOW;
- }
- @Override
- public int getUseDuration(ItemStack itemstack, LivingEntity livingEntity) {
- return 72000;
- }
- @Override
- public InteractionResultHolder<ItemStack> use(Level world, Player entity, InteractionHand hand) {
- InteractionResultHolder<ItemStack> ar = InteractionResultHolder.fail(entity.getItemInHand(hand));
- if (entity.getAbilities().instabuild || findAmmo(entity) != ItemStack.EMPTY) {
- ar = InteractionResultHolder.success(entity.getItemInHand(hand));
- entity.startUsingItem(hand);
- }
- return ar;
- }
- @Override
- public void onUseTick(Level world, LivingEntity entity, ItemStack stack, int remainingTicks) {
- if (!world.isClientSide() && entity instanceof ServerPlayer player) {
- int ticksUsed = getUseDuration(stack, entity) - remainingTicks;
- ItemStack ammo = findAmmo(player);
- if (player.getAbilities().instabuild || ammo != ItemStack.EMPTY) {
- // Determine parameters based on ammo type
- int projectileCount = 8;
- double spread = 0.5;
- float power = 1.5f;
- ProjectileType projectileType = ProjectileType.GREEN;
- int fireRate = 1; // Fire every N tick (1 = every tick)
- if (ammo.getItem() == Items.FIRE_CHARGE) {
- projectileCount = 10; // More projectiles
- spread = 0.6; // Wider spread
- power = 2.0f; // Faster projectiles
- projectileType = ProjectileType.ORANGE; // Default fire
- fireRate = 2; // Fire every 2 ticks (slower)
- } else if (ammo.getItem() == Items.BLAZE_POWDER) {
- projectileCount = 5; // Fewer projectiles
- spread = 0.3; // Tighter spread
- power = 1.2f; // Slower projectiles
- projectileType = ProjectileType.BLUE; // BLUE fire
- fireRate = 1; // Fire every tick (fast)
- }
- // Check if it's time to fire
- if (ticksUsed % fireRate != 0) {
- return;
- }
- // Fire with configured parameters
- for (int i = 0; i < projectileCount; i++) {
- AbstractArrow projectile = createProjectile(world, entity, power, projectileType);
- // Add random spread
- Vec3 motion = projectile.getDeltaMovement();
- projectile.setDeltaMovement(
- motion.x + (world.getRandom().nextDouble() - 0.5) * spread,
- motion.y + (world.getRandom().nextDouble() - 0.5) * spread,
- motion.z + (world.getRandom().nextDouble() - 0.5) * spread
- );
- }
- // Consume ammo
- if (!player.getAbilities().instabuild) {
- if (ammo.isDamageableItem()) {
- ammo.hurtAndBreak(1, (ServerLevel)world, player, _stkprov -> {});
- } else {
- ammo.shrink(1);
- }
- }
- } else {
- // No ammo — stop using
- entity.stopUsingItem();
- }
- }
- }
- // Create projectile of specified type
- private AbstractArrow createProjectile(Level world, LivingEntity entity, float power, ProjectileType type) {
- switch (type) {
- case BLUE:
- return FlamethrowerFireBlueEntity.shoot(world, entity, world.getRandom(), power);
- case GREEN:
- return FlamethrowerFireGreenEntity.shoot(world, entity, world.getRandom(), power);
- case ORANGE:
- default:
- return FlamethrowerFireEntity.shoot(world, entity, world.getRandom(), power);
- }
- }
- private ItemStack findAmmo(Player player) {
- // First check offhand and main hand
- ItemStack stack = ProjectileWeaponItem.getHeldProjectile(player, e -> AMMO_ITEMS.contains(e.getItem()));
- if (stack == ItemStack.EMPTY) {
- // Then search inventory
- for (int i = 0; i < player.getInventory().items.size(); i++) {
- ItemStack teststack = player.getInventory().items.get(i);
- if (teststack != null && AMMO_ITEMS.contains(teststack.getItem())) {
- stack = teststack;
- break;
- }
- }
- }
- return stack;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment