Дерево, а так же всё с ним связанное!

13
0
Нде, как-то я рано начал заниматься моддингом, ну что поделать, от меня многие ждут продолжения и я не хотел бы их огорчать! Проблема сейчас в том что я совершенно не могу понять как делаются блоки связанные с деревом и его генерация(листва, древесина и саплинг). Кто нибудь работал с этим? Можете помочь, пожалуйста! Буду премного благодарен этому форуму, в особенности тем кто поможет! Работаю на версии 1.9 но она от 1.8 почти не отличается.​

P.S туториалы и читал и смотрел, и переводил но совсем не понимаю, а те кто их делали сейчас не могут мне ответить =\​
[merge_posts_bbcode]Добавлено: 6th Apr 2016 16:52[/merge_posts_bbcode]

Кстати, сразу отмахнусь от возможного вопроса =)
Вот на русском портале.
Вот на Curse.
 
Смотри пример из саженца.
При генерации дерева из саженца, строиться структура из WorldGen дерева.
Генерируется структура дерева из саженца, при нужном освещении и рандома или с помощью костной муки (можно использовать эвент костной муки). Так же можно сунуть в генератор наш WorldGen дерева, и тоже с какой-то периода времени или рандома генерировать дерево через наш WorldGen дерева.
Не знаю что ещё добавить, я не так долго этим занимался.
 
Ну, я попробовал что-то понять, все таки это до меня дошло. С блоком дерева я решил пока не мучатся и сделал его чисто мултитекстурным блоком, а вот с листвой я так и не разобрался =\ Во первых у блока нет текстуры, во вторых он два раза добавляется в вкладку, то есть один блок два раза в одной вкладке создаётся. А также хочется понять как сделать так чтобы от моего блока дерева она не исчезала. С выпадением саженца разберусь =\
 
Настрой getSubBlocks, чтобы он выводил твой блок.
В блок древесины использовать методы canSustainLeaves и isWood возвращение true. А в листья использовать метод isLeaves возвращение true.
 
Желательно, хоть и не обязательно, просто чтобы ты понял что ты заменил метод родителя.
 
timaxa007 написал(а):
Настрой getSubBlocks, чтобы он выводил твой блок.
В блок древесины использовать методы canSustainLeaves и isWood возвращение true. А в листья использовать метод isLeaves возвращение true.
Вот, я дурак =\ Только сейчас дошло что вы имели ввиду под гетСабБлокс. Вы имеете ввиду, что на самом деле блока листвы 2 - один у которого пошло время исчезновения и один обыкновенный =\ То есть мне надо добавлять в креатив вкладку так, я правильно вас понял?
 
Эм... Нет. Как-бы я сейчас не понимаю о чём ты. Ты написал:
CheshirX написал(а):
он два раза добавляется в вкладку, то есть один блок два раза в одной вкладке создаётся
Ты про креативную вкладку? Если ты наследуешь или используешь от блока листвы/древесины, от наследства или использования метода getSubBlocks могло добавиться во креативную вкладку этот блок, но с разными метадатой.
 
Нде, решил полностью доработать, может вы знаете как это решить, могу предоставить классы блоков, а пока краш-репорт:
Код:
    at net.minecraft.block.state.BlockStateContainer.validateProperty(BlockStateContainer.java:99)
    at net.minecraft.block.state.BlockStateContainer.<init>(BlockStateContainer.java:73)
    at net.minecraft.block.state.BlockStateContainer.<init>(BlockStateContainer.java:58)
    at cheshirX.highEnergetics.blocks.block.BlockRubberTree.createBlockState(BlockRubberTree.java:31)
    at net.minecraft.block.Block.<init>(Block.java:263)
    at net.minecraft.block.BlockRotatedPillar.<init>(BlockRotatedPillar.java:23)
    at net.minecraft.block.BlockLog.<init>(BlockLog.java:20)
    at cheshirX.highEnergetics.blocks.block.BlockRubberTree.<init>(BlockRubberTree.java:16)
    at cheshirX.highEnergetics.blocks.HEBlocks.createBlocks(HEBlocks.java:44)
    at cheshirX.highEnergetics.CommonProxy.preInit(CommonProxy.java:15)
    at cheshirX.highEnergetics.ClientProxy.preInit(ClientProxy.java:13)
    at cheshirX.highEnergetics.HighEnergetics.preInit(HighEnergetics.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:560)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)
    at com.google.common.eventbus.EventBus.post(EventBus.java:275)
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:211)
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:189)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)
    at com.google.common.eventbus.EventBus.post(EventBus.java:275)
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:118)
    at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:556)
    at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:245)
    at net.minecraft.client.Minecraft.startGame(Minecraft.java:472)
[merge_posts_bbcode]Добавлено: 6th Apr 2016 18:50[/merge_posts_bbcode]

Пытаюсь сделать древесину =\
 
Извини, но я пока-что работаю только на 1.7.10, так что мне трудно будет предположить где может быть проблема.
 
Ты почву подготовил ?
 
Если ты новичёк - делай всё проще :D
Берёшь обычный ворлдген через .setBlock, "строишь" деревья в мире; то же самое с саженцем. Просто UpdateTick и случайно выстраиваешь дерево. Выпадение саженца - getItemDroped. Ну и проверку на высыхание листьев ты уже знаешь. Если хочешь, можно заморочиться с бонмилом и в onBlockActivated проверять player.inventory.getCurrentItem (или как-то так) и отнимать по одному; или просто сказать "не баг, а фича, дерево не любит удобрения" ;)
 
Drovosek написал(а):
Ты почву подготовил ?
Эмм, какую?
[merge_posts_bbcode]Добавлено: 6th Apr 2016 19:43[/merge_posts_bbcode]

AlexSocol написал(а):
Если ты новичёк - делай всё проще :D
Берёшь обычный ворлдген через .setBlock, "строишь" деревья в мире; то же самое с саженцем. Просто UpdateTick и случайно выстраиваешь дерево. Выпадение саженца - getItemDroped. Ну и проверку на высыхание листьев ты уже знаешь. Если хочешь, можно заморочиться с бонмилом и в onBlockActivated проверять player.inventory.getCurrentItem (или как-то так) и отнимать по одному; или просто сказать "не баг, а фича, дерево не любит удобрения" ;)




Лол, сетблок есть и в прогаммировании? =)
Как только всё сделаю отпишусь, вам а также добавлю вас в благодарности =)
 
Drovosek написал(а):
CheshirX написал(а):
Drovosek написал(а):
Ты почву подготовил ?
Эмм, какую?
Земляную, ты же дерево сажать собрался...
А, вы про это =) Да, гумус, моё деревце будет расти на заднем дворе нашей 10-этажки =)
 
Дровосеку предупреждение за оффтоп, автору за неумение пользоваться поиском.
 
Dragon2488 написал(а):
Дровосеку предупреждение за оффтоп, автору за неумение пользоваться поиском.
Здравствуйте, я рад что нашёлся тот кто знает где есть гайд по созданию деревьев в игре на версии 1.8 и 1.9
Можете пожалуйста дать ссылки на данные гайды! Очень рад вам! :)
 
Ещё раз. Отличий с самой генерацией от той же 1.7 почти нет, а тем на неё раскидано по форуму достаточно много.
 
CheshirX написал(а):
Нде, решил полностью доработать, может вы знаете как это решить, могу предоставить классы блоков, а пока краш-репорт:
Код:
    at net.minecraft.block.state.BlockStateContainer.validateProperty(BlockStateContainer.java:99)
    at net.minecraft.block.state.BlockStateContainer.<init>(BlockStateContainer.java:73)
    at net.minecraft.block.state.BlockStateContainer.<init>(BlockStateContainer.java:58)
    at cheshirX.highEnergetics.blocks.block.BlockRubberTree.createBlockState(BlockRubberTree.java:31)
    at net.minecraft.block.Block.<init>(Block.java:263)
    at net.minecraft.block.BlockRotatedPillar.<init>(BlockRotatedPillar.java:23)
    at net.minecraft.block.BlockLog.<init>(BlockLog.java:20)
    at cheshirX.highEnergetics.blocks.block.BlockRubberTree.<init>(BlockRubberTree.java:16)
    at cheshirX.highEnergetics.blocks.HEBlocks.createBlocks(HEBlocks.java:44)
    at cheshirX.highEnergetics.CommonProxy.preInit(CommonProxy.java:15)
    at cheshirX.highEnergetics.ClientProxy.preInit(ClientProxy.java:13)
    at cheshirX.highEnergetics.HighEnergetics.preInit(HighEnergetics.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:560)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)
    at com.google.common.eventbus.EventBus.post(EventBus.java:275)
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:211)
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:189)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74)
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)
    at com.google.common.eventbus.EventBus.post(EventBus.java:275)
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:118)
    at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:556)
    at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:245)
    at net.minecraft.client.Minecraft.startGame(Minecraft.java:472)
[merge_posts_bbcode]Добавлено: 6th Apr 2016 18:50[/merge_posts_bbcode]

Пытаюсь сделать древесину =\
Да, кинь пожалуйста код класса BlockRubberTree.
 
Да, забыл вам сказать, дерево отлично работает, то есть его блок =\
Код блока дерева:
Код:
package cheshirX.highEnergetics.blocks.block;

import com.google.common.base.Predicate;

import net.minecraft.block.BlockLog;
import net.minecraft.block.BlockPlanks;
import net.minecraft.block.BlockRotatedPillar;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateBase;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.block.state.pattern.BlockStateMatcher;
import net.minecraft.client.renderer.block.statemap.BlockStateMapper;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.Rotation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.client.model.BlockStateLoader;

public class BlockRubberTree extends BlockRotatedPillar {

    private final String name = "rubber_log";
    public BlockRubberTree(String unlocalizedName, Material material, float hardness, float resistance) {
        super(material);
        this.setUnlocalizedName(unlocalizedName);
        this.setCreativeTab(CreativeTabs.tabBlock);
        this.setHardness(hardness);
        this.setResistance(resistance);
        this.setDefaultState(this.blockState.getBaseState().withProperty(AXIS, EnumFacing.Axis.Y));
    }

    public BlockRubberTree(String unlocalizedName, float hardness, float resistance) {
        this(unlocalizedName, Material.rock, hardness, resistance);
    }

    public BlockRubberTree(String unlocalizedName) {
        this(unlocalizedName, 2.0f, 10.0f);
    }
    public String getName()
    {
    return name;
    }

    /**
     * Convert the given metadata into a BlockState for this Block
     */
    public IBlockState getStateFromMeta(int meta)
    {
        EnumFacing.Axis axis = EnumFacing.Axis.Y;
        int j = meta & 12;

        if (j == 4)
        {
            axis = EnumFacing.Axis.X;
        }
        else if (j == 8)
        {
            axis = EnumFacing.Axis.Z;
        }

        return this.getDefaultState().withProperty(AXIS, axis);
    }

    /**
     * Convert the BlockState into the correct metadata value
     */
    public int getMetaFromState(IBlockState state)
    {
        int i = 0;
        EnumFacing.Axis axis = (EnumFacing.Axis)state.getValue(AXIS);

        if (axis == EnumFacing.Axis.X)
        {
            i |= 4;
        }
        else if (axis == EnumFacing.Axis.Z)
        {
            i |= 8;
        }

        return i;
    }

    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[] {AXIS});
    }

    protected ItemStack createStackedBlock(IBlockState state)
    {
        return new ItemStack(Item.getItemFromBlock(this), 1, 0);
    }

    public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
    {
        return super.onBlockPlaced(worldIn, pos, facing, hitX, hitY, hitZ, meta, placer).withProperty(AXIS, facing.getAxis());
    }
}


Сейчас проблема с листвой, она во 1 не прозрачна, во вторых не рендериться текстура в инвентаре.
 
Назад
Сверху