Реализация сладких идей

Версия Minecraft
1.12.2
2,932
44
598
Доброго времени суток Земляне и Чужие!
Сегодня у меня появилась идея: У меня есть несколько пушек которые могут стрелять блоками (выставлять их в мире).
Вот так вот выглядит реализация стрельбы пушки:
Java:
public class BlockGunBasic extends Item {
    
    public BlockGunBasic(String name) {
        
        super();
        setRegistryName(name);
        setFull3D();
        setUnlocalizedName("block_gun");
        setMaxDamage(320);
        setCreativeTab(CreativeTabs.COMBAT);
        setMaxStackSize(1);

    }
    
    @Override
    public ActionResult<ItemStack> onItemRightClick(World World, final EntityPlayer EntityPlayer, EnumHand hand) {

        ItemStack ItemStack = EntityPlayer.getHeldItem(hand);
        
        EntityBlockBullet EntityBlockBullet = new EntityBlockBullet(World, EntityPlayer); //New bullet
        
            EntityBlockBullet.shoot(EntityPlayer.getLookVec().x, EntityPlayer.getLookVec().y, EntityPlayer.getLookVec().z, 4, 0);
            EntityBlockBullet.setKnockbackStrength(1); EntityBlockBullet.setDamage(3.5); //Bullet knockback and damage

            ItemStack.damageItem(1, EntityPlayer); //Damage item
            
            World.spawnEntity(EntityBlockBullet);  //Spawn bullet
            
            World.playSound(null, EntityPlayer.getPosition(), SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.3F, 0.8F); //Sound
            
            return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, ItemStack);
    }

}

А вот так вот выглядит снаряд который ставит блоки в мире:
Java:
public class EntityBlockBullet extends EntityTippedArrow {
    
    public EntityBlockBullet(World a) {
        
        super(a);
        
        
    }

    public EntityBlockBullet(World worldIn, double x, double y, double z) {
        
        super(worldIn, x, y, z);
        
    }

    public EntityBlockBullet(World worldIn, EntityLivingBase shooter) {
        
        super(worldIn, shooter);
        
    }

    @Override
    public void onCollideWithPlayer(EntityPlayer entity) {
        
        super.onCollideWithPlayer(entity);
        
        MathHelper.floor(this.getEntityBoundingBox().minX + 0D);
        MathHelper.floor(this.getEntityBoundingBox().minY + 0D);
        MathHelper.floor(this.getEntityBoundingBox().minZ + 0D);

    }

    @Override
    public void onUpdate() {
        
        super.onUpdate();
        
        int x = MathHelper.floor(getEntityBoundingBox().minX + 0D);
        int y = MathHelper.floor(getEntityBoundingBox().minY + 0D);
        int z = MathHelper.floor(getEntityBoundingBox().minZ + 0D);

                   if (getBlock(world, x, y, z) != Blocks.AIR
                || getBlock(world, x, y - 1, z) != Blocks.AIR
                || getBlock(world, x, y + 1, z) != Blocks.AIR
                || getBlock(world, x + 1, y, z) != Blocks.AIR
                || getBlock(world, x - 1, y, z) != Blocks.AIR
                || getBlock(world, x, y, z + 1) != Blocks.AIR
                || getBlock(world, x, y, z - 1) != Blocks.AIR) {
    
                world.setBlockState(new BlockPos(x, y, z), Blocks.DIRT.getDefaultState(), 2);
                
                world.removeEntity(this);
        }
    }

    public Block getBlock(World World, int x, int y, int z) {
        
        return World.getBlockState(new BlockPos(x, y, z)).getBlock();
        
    }

}

И вот в голове у меня складывается такая картина где для каждого из блоков есть своя пушка.

И вот я думаю как сделать что бы при регистраций/созданий пушки можно было выбрать тип блока который будет выставлен в мире.

Есть у кого-то какие-то идей? (Котелок просто совсем не варит)
 

timaxa007

Модератор
5,831
409
672
Использовать NBT у ItemStack и записывать какими блоками стрелять, типа setString("FireBlock", "minecraft:stone") либо где-то, либо при выстреле переводить этот String в объект Блока. Ну пока-что у меня именно так сварил мой котелок.
 
3,005
192
592
К Block'у добавить в параметры конструктора IBlockState.
К Bullet'у добавить в параметры конструктора IBlockState.
В момент сет'а не получать из земли стейт, а использовать тот, что был в конструкторе.
 
2,932
44
598
Сделать гуи с паттерном, блок вставил в слот и всё.
В самом начале так и хотел сделать, но с моими навыками и умениями лучше туда не лезть! (-Оно тебя сожрет! (с))
К Block'у добавить в параметры конструктора IBlockState.
К Bullet'у добавить в параметры конструктора IBlockState.
В момент сет'а не получать из земли стейт, а использовать тот, что был в конструкторе.
Пойду почитаю про состояние блоков. Спасибо!
Использовать NBT у ItemStack и записывать какими блоками стрелять, типа setString("FireBlock", "minecraft:stone") либо где-то, либо при выстреле переводить этот String в объект Блока. Ну пока-что у меня именно так сварил мой котелок.
Интересная идея! Попробую!
 
Сверху