Zinych

A shotgun with different cartridges for the MCreator

Oct 4th, 2025
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.61 KB | Gaming | 0 0
  1. package net.mcreator.arboromancy.item; // arboromancy is the name of my mod, replace it with your own.
  2. import net.minecraft.world.phys.Vec3;
  3. import net.minecraft.world.level.Level;
  4. import net.minecraft.world.item.UseAnim;
  5. import net.minecraft.world.item.Rarity;
  6. import net.minecraft.world.item.ProjectileWeaponItem;
  7. import net.minecraft.world.item.ItemStack;
  8. import net.minecraft.world.item.Items;
  9. import net.minecraft.world.item.Item;
  10. import net.minecraft.world.item.BowItem;
  11. import net.minecraft.world.entity.projectile.AbstractArrow;
  12. import net.minecraft.world.entity.player.Player;
  13. import net.minecraft.world.entity.LivingEntity;
  14. import net.minecraft.world.InteractionResultHolder;
  15. import net.minecraft.world.InteractionHand;
  16. import net.minecraft.server.level.ServerPlayer;
  17. import net.minecraft.server.level.ServerLevel;
  18. import net.mcreator.arboromancy.entity.FlamethrowerFireEntity;                // These are my custom shells, replace them with your own.
  19. import net.mcreator.arboromancy.entity.FlamethrowerFireBlueEntity;         // These are my custom shells, replace them with your own.
  20. import net.mcreator.arboromancy.entity.FlamethrowerFireGreenEntity;      // These are my custom shells, replace them with your own.
  21. import java.util.List;
  22. public class FlamethrowerGunItem extends Item {
  23.    
  24.    // Projectile types
  25.    private enum ProjectileType {
  26.        ORANGE,  // Default orange fire
  27.        BLUE,    // Blue fire
  28.        GREEN,   // You can add green
  29.        // PURPLE // And so on
  30.    }
  31.    
  32.    // List of allowed ammunition
  33.    private static final List<Item> AMMO_ITEMS = List.of(
  34.        Items.BLAZE_POWDER,           // Blaze powder
  35.        Items.FIRE_CHARGE,            // Fire charge
  36.        FlamethrowerFireEntity.PROJECTILE_ITEM.getItem() // Custom ammo
  37.    );
  38.    public FlamethrowerGunItem() {
  39.        super(new Item.Properties().rarity(Rarity.UNCOMMON));
  40.    }
  41.    @Override
  42.    public UseAnim getUseAnimation(ItemStack itemstack) {
  43.        return UseAnim.BOW;
  44.    }
  45.    @Override
  46.    public int getUseDuration(ItemStack itemstack, LivingEntity livingEntity) {
  47.        return 72000;
  48.    }
  49.    @Override
  50.    public InteractionResultHolder<ItemStack> use(Level world, Player entity, InteractionHand hand) {
  51.        InteractionResultHolder<ItemStack> ar = InteractionResultHolder.fail(entity.getItemInHand(hand));
  52.        if (entity.getAbilities().instabuild || findAmmo(entity) != ItemStack.EMPTY) {
  53.            ar = InteractionResultHolder.success(entity.getItemInHand(hand));
  54.            entity.startUsingItem(hand);
  55.        }
  56.        return ar;
  57.    }
  58.    @Override
  59.    public void onUseTick(Level world, LivingEntity entity, ItemStack stack, int remainingTicks) {
  60.        if (!world.isClientSide() && entity instanceof ServerPlayer player) {
  61.            int ticksUsed = getUseDuration(stack, entity) - remainingTicks;
  62.            
  63.            ItemStack ammo = findAmmo(player);
  64.            if (player.getAbilities().instabuild || ammo != ItemStack.EMPTY) {
  65.                
  66.                // Determine parameters based on ammo type
  67.                int projectileCount = 8;
  68.                double spread = 0.5;
  69.                float power = 1.5f;
  70.                ProjectileType projectileType = ProjectileType.GREEN;
  71.                int fireRate = 1;  // Fire every N tick (1 = every tick)
  72.                
  73.                if (ammo.getItem() == Items.FIRE_CHARGE) {
  74.                    projectileCount = 10;  // More projectiles
  75.                    spread = 0.6;          // Wider spread
  76.                    power = 2.0f;          // Faster projectiles
  77.                    projectileType = ProjectileType.ORANGE;  // Default fire
  78.                    fireRate = 2;          // Fire every 2 ticks (slower)
  79.                } else if (ammo.getItem() == Items.BLAZE_POWDER) {
  80.                    projectileCount = 5;   // Fewer projectiles
  81.                    spread = 0.3;          // Tighter spread
  82.                    power = 1.2f;          // Slower projectiles
  83.                    projectileType = ProjectileType.BLUE;  // BLUE fire
  84.                    fireRate = 1;          // Fire every tick (fast)
  85.                }
  86.                
  87.                // Check if it's time to fire
  88.                if (ticksUsed % fireRate != 0) {
  89.                    return;
  90.                }
  91.                
  92.                // Fire with configured parameters
  93.                for (int i = 0; i < projectileCount; i++) {
  94.                    AbstractArrow projectile = createProjectile(world, entity, power, projectileType);
  95.                    
  96.                    // Add random spread
  97.                    Vec3 motion = projectile.getDeltaMovement();
  98.                    projectile.setDeltaMovement(
  99.                        motion.x + (world.getRandom().nextDouble() - 0.5) * spread,
  100.                        motion.y + (world.getRandom().nextDouble() - 0.5) * spread,
  101.                        motion.z + (world.getRandom().nextDouble() - 0.5) * spread
  102.                    );
  103.                }
  104.                
  105.                // Consume ammo
  106.                if (!player.getAbilities().instabuild) {
  107.                    if (ammo.isDamageableItem()) {
  108.                        ammo.hurtAndBreak(1, (ServerLevel)world, player, _stkprov -> {});
  109.                    } else {
  110.                        ammo.shrink(1);
  111.                    }
  112.                }
  113.            } else {
  114.                // No ammo — stop using
  115.                entity.stopUsingItem();
  116.            }
  117.        }
  118.    }
  119.    
  120.    // Create projectile of specified type
  121.    private AbstractArrow createProjectile(Level world, LivingEntity entity, float power, ProjectileType type) {
  122.        switch (type) {
  123.            case BLUE:
  124.                return FlamethrowerFireBlueEntity.shoot(world, entity, world.getRandom(), power);
  125.            case GREEN:
  126.                 return FlamethrowerFireGreenEntity.shoot(world, entity, world.getRandom(), power);
  127.            case ORANGE:
  128.            default:
  129.                return FlamethrowerFireEntity.shoot(world, entity, world.getRandom(), power);
  130.        }
  131.    }
  132.    private ItemStack findAmmo(Player player) {
  133.        // First check offhand and main hand
  134.        ItemStack stack = ProjectileWeaponItem.getHeldProjectile(player, e -> AMMO_ITEMS.contains(e.getItem()));
  135.        
  136.        if (stack == ItemStack.EMPTY) {
  137.            // Then search inventory
  138.            for (int i = 0; i < player.getInventory().items.size(); i++) {
  139.                ItemStack teststack = player.getInventory().items.get(i);
  140.                if (teststack != null && AMMO_ITEMS.contains(teststack.getItem())) {
  141.                    stack = teststack;
  142.                    break;
  143.                }
  144.            }
  145.        }
  146.        return stack;
  147.    }
  148. }
Tags: MCreator
Advertisement
Add Comment
Please, Sign In to add comment