Жидкость

Жидкость

Версия(и) Minecraft
1.12.2
Иногда появляется нужда в создании жидкости. Мы рассмотрим как это сделать.
Основа
Java:
public class FluidOil extends Fluid
{
    public FluidOil(String fluidName, ResourceLocation still, ResourceLocation flowing)
    {
        super(fluidName, still, flowing);
    }
}
Java:
public class BlockOilFluid extends BlockFluidClassic
{
    public BlockOilFluid(Fluid fluid)
    {
        super(fluid, Material.WATER);
        setRegistryName("oil");
    }
}
Разберем:
FluidOil - Собственно сама жидкость.
BlockOilFluid - Блок жидкости. Если нам надо установить жидкость в мир, то нам надо ставить именно его.
Регистрация
Создадим класс FluidRegister
Java:
public class FluidRegister
{
    public static final FluidOil OIL = (FluidOil) new FluidOil("oil",
            new ResourceLocation(Tut.MOD_ID, "fluid/oil_still"),
            new ResourceLocation(Tut.MOD_ID, "fluid/oil_flow"))
            .setDensity(1100)
            .setGaseous(false)
            .setLuminosity(5)
            .setViscosity(900)
            .setTemperature(300)
            .setUnlocalizedName("oil");

    public static void register()
    {
        registerFluid(OIL);
    }
    public static void registerFluid(Fluid fluid)
    {
        FluidRegistry.registerFluid(fluid);
        FluidRegistry.addBucketForFluid(fluid);
    }
}
Разберем:
OIL - Объект жидкости.
"oil" - Имя жидкости.
new ResourceLocation(Tut.MOD_ID, "fluid/oil_still") - Путь до текстуры жидкости в стоячем состоянии.
new ResourceLocation(Tut.MOD_ID, "fluid/oil_flow") - Путь до текстуры жидкости в текущем состоянии.
setDensity - Плотность. Влияет на скорость движения сущностей. По умолчанию 1000.
setGaseous - Если true то течет вверх. По умолчанию false.
setLuminosity - Уровень светимости. По умолчанию 0.
setViscosity - Влияет на скорость течения. Больше значение меньше скорость. По умолчанию 1000.
setTemperature - Температура. По умолчанию 300. Влияет на скорость таинья блоков поблизости.
setUnlocalizedName - Ключ локализации.
setColor - Цвет.
Все значения по умолчанию повторяют соответственные у воды.
Все что выше можно вызывать в конструкторе жидкости.
register() - Метод регистрации, вызываемый из прокси.
RegisterFluid(Fluid fluid) - Регистация жидкости(чтоб не повторять код)

Теперь осталось добавить FluidRegister.register() в preinit перед регистрацией блоков, иначе будет NPE. Теперь надо зарегистрировать блок жидкости в BlocksRegister. Не забудем добавить зарегистрировать рендер в registerRender:
Java:
public class BlocksRegister
{
    public static Block BEST_STONE = new BlockBestStone("best_stone"),
                        OIL_BLOCK = new BlockOilFluid(FluidRegister.OIL);

    public static void register()
    {
        setRegister(BEST_STONE);
        setRegister(OIL_BLOCK);
    }

    @SideOnly(Side.CLIENT)
    public static void registerRender()
    {
        setRender(BEST_STONE);
        setRender(OIL_BLOCK);
    }

    private static void setRegister(Block block)
    {
        ForgeRegistries.BLOCKS.register(block);
        ForgeRegistries.ITEMS.register(new ItemBlock(block).setRegistryName(block.getRegistryName()));
    }

    @SideOnly(Side.CLIENT)
    private static void setRender(Block block)
    {
        Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), 0, new ModelResourceLocation(block.getRegistryName(), "inventory"));
    }
}

Запускаем игру и наслаждаемся! Но увы черно-розовыми квадратами...... Давайте Это исправим! Создадим oil.json в blockstates. Заполним подобным образом:
Java:
{
    "forge_marker": 1,
    "defaults": {
        "textures": {
            "particle": "tut:fluid/oil_flow",
            "all": "tut:fluid/oil_flow"
        },
        "model": "forge:fluid",
         "custom": { "fluid": "juise" },
         "uvlock": false
    },
    "variants": {
        "normal": [{

        }],
        "inventory": [{

        }],
        "level": {
            "0": { },
            "1": { },
            "2": { },
            "3": { },
            "4": { },
            "5": { },
            "6": { },
            "7": { },
            "8": { },
            "9": { },
            "10": { },
            "11": { },
            "12": { },
            "13": { },
            "14": { },
            "15": { }
        }
    }
}
Осталось положить текстуру в assets/tut/textures/fluid и наконец насладиться результатом.
1591445123660.png

Ведерко

Чтоб добавить ведерко(сразу всем жидкостям) добавьте в главный класс мода static { FluidRegistry.enableUniversalBucket(); }.
Автор
GoogleTan
Просмотры
1,549
Первый выпуск
Обновление
Оценка
4.00 звёзд 4 оценок

Другие ресурсы пользователя GoogleTan

Последние рецензии

Спасибо огромное! За статью и blockstate!
Следует полностью расписать то, как делать свое ведерко, вплоть до onItemUse. К тому же, universalBucket во-первых не настроишь, во-вторых, разве тебя не бесит когда ты чем то пользуешься, но не знаешь как оно работает?)
GoogleTan
GoogleTan
Эм... Да этого нету... Но когда это может быть нужно? Типа когда свой переносной бак пишешь? Тогда лучше уж отдельный тотуриал. Если покажешь где это надо, то я напишу.
Полезное руководство, учитывая, что на данную версию, про создание жидкости толком ничего нет.
Полезно и просто, но суховато, оформление получше.
GoogleTan
GoogleTan
"оформление получше" чем у предыдущий моих или надо получше?
Сверху