Упрощенная регистрация блоков

Версия Minecraft
1.12.2
344
1
46
Решил попробовать сделать упрощённую регистрацию блоков без множества ненужных классов. Всё, в принципе работает хорошо, но есть несколько ньюансов:

Возможно ли принудительно добавлять методы, или изменять их? К примеру, при регистрации указать блок и дополнительный конфиг/класс, откуда будут подгружаться необходимые методы.

Каким образом во время регистрации, можно настроить AxisAlignedBB? Мне нужно, чтобы при регистрации можно было настроить это значение...

В общем, примерно что я хочу получить: public static final Block1 Block1 = new Block1("block1", tab.1, (добавить блок кода), 0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F);

И ещё, можно ли избежать этих листов регистрации и сделать банальное, автоматическое формирование списка? То-есть он берёт все Block1-over200 и заносит их в этот список?

block1 (код уже измученного мною блока):
package core.erumind.block.s;

import java.util.List;

import core.Engine;
import core.Settings;
import core.erumind.block.TileEntity.Base;
import net.minecraft.block.Block;
import net.minecraft.block.BlockHorizontal;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.Item;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.Mirror;
import net.minecraft.util.Rotation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;


public class Block1 extends Block {
       protected static final AxisAlignedBB BLOCK_TOP = new AxisAlignedBB(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F);
   
       public static final PropertyDirection FACING = BlockHorizontal.FACING;
        private static Block1 ourInstance;
       
   

   
    public Block1(String reg/[I],AxisAlignedBB points[/I]/) {
          super(Material.IRON);
          setHardness(1.5F);
          setResistance(1000.0F);
          setHarvestLevel("pickaxe", 2);
          setCreativeTab(Engine.objTab);
          setSoundType(SoundType.METAL);
          setLightOpacity(0);
          setLightLevel(0.4f);
          setTickRandomly(false);
          setUnlocalizedName(reg);
          setRegistryName(Settings.Resources, "tile." + reg);
          setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH));
         // GameRegistry.registerTileEntity(Base.class, reg);
    }
 
    @Override
    protected BlockStateContainer createBlockState() {
         return new BlockStateContainer(this, new IProperty[] { FACING});
    }

    @Override
    public IBlockState getStateForPlacement(final World world, final BlockPos pos, final EnumFacing facing, final float hitX, final float hitY, final float hitZ, final int meta, final EntityLivingBase placer, final EnumHand hand) {
        return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(FACING, placer.getHorizontalFacing().getOpposite());
    }
   
    @SuppressWarnings("deprecation")
    @Override
    public IBlockState getStateFromMeta(int meta) {
        EnumFacing enumfacing = EnumFacing.getFront(meta);
            if (enumfacing.getAxis() == EnumFacing.Axis.Y) {
                enumfacing = EnumFacing.NORTH;
            }
           return this.getDefaultState().withProperty(FACING, enumfacing);
    }

    @Override
    public int getMetaFromState(final IBlockState state) {
        return state.getValue(FACING).getHorizontalIndex();
    }

    @SuppressWarnings("deprecation")
    @Override
    public IBlockState withRotation(final IBlockState state, final Rotation rotation) {
        return state.withProperty(FACING, rotation.rotate(state.getValue(FACING)));
    }
   
    @SuppressWarnings("deprecation")
    @Override
    public IBlockState withMirror(final IBlockState state, final Mirror mirror) {
        return state.withRotation(mirror.toRotation(state.getValue(FACING)));
    }

   
    @SideOnly(Side.CLIENT)
    public void initModel() {
        ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this), 0, new ModelResourceLocation(getRegistryName(), "inventory"));
    }

    @Override
    @SideOnly(Side.CLIENT)
    public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess worldIn, BlockPos pos, EnumFacing side) {
        return false;
    }

    @Override
    public boolean isBlockNormalCube(IBlockState blockState) {
        return false;
    }

    @Override
    public boolean isOpaqueCube(IBlockState blockState) {return false;}
    @Override
    public boolean isFullCube(IBlockState state) {return false;}
    @Override
    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return BLOCK_TOP; }
    @Override
    public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox,
            List<AxisAlignedBB> collidingBoxes, Entity entityIn, boolean p_185477_7_) { addCollisionBoxToList(pos, entityBox, collidingBoxes, BLOCK_TOP);}
}


Blocks (Или мой велосипед с регистрацией этих блоков):
@Mod.EventBusSubscriber(modid = MODID)
public class Blocks {
    private static Blocks INSTANCE;

   
   
    public static Blocks getInstance() {
        if (INSTANCE == null) synchronized (Blocks.class) {
            if (INSTANCE == null) INSTANCE = new Blocks();
        }
        return INSTANCE;
    }
   
    public static final Block1 Block1 = new Block1("block1");
   
    private Blocks() {}

   


    private static Item itemRegister(Item item, String regName, String unlocalizedName) {
        item.setUnlocalizedName(new StringBuilder(Settings.Resources).append(".").append(unlocalizedName).toString());
        item.setRegistryName(new ResourceLocation(Settings.Resources, regName));
        return item;
    }


   
   
  //====================================================================
    @Mod.EventBusSubscriber(modid = Settings.MODID)
    public static class RegistrationHandler {
        public static final Set<ItemBlock> ITEM_BLOCKS = new HashSet<>();

        @SubscribeEvent
        public static void registerBlocks(final RegistryEvent.Register<Block> event) {
            final IForgeRegistry<Block> registry = event.getRegistry();
            final Block[] blocks = {
                    Block1,
                   
            };  registry.registerAll(blocks);
          }

   

   
        @SubscribeEvent
        public static void registerItemBlocks(final RegistryEvent.Register<Item> event) {
            final ItemBlock[] items = {
                    new ItemBlock(Block1),
            };

            final IForgeRegistry<Item> registry = event.getRegistry();

            for (final ItemBlock item : items) {
                final Block block = item.getBlock();
                final ResourceLocation registryName = block.getRegistryName();
                registry.register(item.setRegistryName(registryName));
                ITEM_BLOCKS.add(item);
            }

            registerTileEntities();
        }
       
       
        private static void registerTileEntities() {
            //registerTileEntity(TileEntitySurvivalCommandBlock.class, "survival_command_block");
     }

        private static void registerTileEntity(final Class<? extends TileEntity> tileEntityClass, final String name) {
            //GameRegistry.registerTileEntity(tileEntityClass, Constants.RESOURCE_PREFIX + name);
        }
       
    }
//====================================================================

   
   
   
}

















/*  @SubscribeEvent
public static void initBlocks(RegistryEvent.Register<Block> event) {
    event.getRegistry().register(Multiblock.getInstance());

}

@SubscribeEvent
public static void initBlockItems(RegistryEvent.Register<Item> event) {
    event.getRegistry().register(OLDTB_ItemRegister.getInstance());

}*/
 
Последнее редактирование модератором:
Решение
Ты делаешь какуе-то дичь.
Делать такие общие классы стоит только если у тебя несколько одинаковых блоков, которые отличаются например текстурой или еще какими-то параметрами.
Не надо пытаться засунуть логику всех своих блоков в один класс.

Maxik

Золотой Петушок
4,949
46
720
Есть авторегистрация. Делаешь интерфейс в котором есть один метод который цепляешь в регистрацию. Потом делаешь базовый блок с имплементацией и реализацией этого интерфейса, и переопределяешь этот метод, где вписываешь имя и регу. Туда же можно впихнуть и рендер. Потом при наследовании от этого блока он автоматически будет регаться и добавляться в игру. Но как по мне, лучше создавать новые переменные, это удобней в плане чтения кода.
 

Eifel

Модератор
1,539
74
522
Если просто реализовать метод своего интерфейса, нигде его не вызвав, то такая регистрация будет равна 0. С таким успехом легче сразу в базовом блоке/предмете сделать все необходимое, без всяких доп. интерфейсов.
 
344
1
46
Есть авторегистрация. Делаешь интерфейс в котором есть один метод который цепляешь в регистрацию. Потом делаешь базовый блок с имплементацией и реализацией этого интерфейса, и переопределяешь этот метод, где вписываешь имя и регу. Туда же можно впихнуть и рендер. Потом при наследовании от этого блока он автоматически будет регаться и добавляться в игру. Но как по мне, лучше создавать новые переменные, это удобней в плане чтения кода.

Н-да? А если у меня over300 блоков? Даже если именую банально Block1-300...

К слову, остальные вопросы-то открыты
 

Maxik

Золотой Петушок
4,949
46
720
Если просто реализовать метод своего интерфейса, нигде его не вызвав, то такая регистрация будет равна 0. С таким успехом легче сразу в базовом блоке/предмете сделать все необходимое, без всяких доп. интерфейсов.
Так я вообще то написал "цепляешь за регистрацию", т. е вызываешь его

Насчет выноса переменных в конструктор это как по мне уж совсем очевидно. Берешь, создаешь публик переменную, в конструкторе создаешь такой же параметр и затем приравниваешь публик переменную к конструкторной. А ту публик уже используешь как тебе надо.

Н-да? А если у меня over300 блоков? Даже если именую банально Block1-300...

К слову, остальные вопросы-то открыты
можно просто в цикле присваивать им регнеймы. А сами названия переменных.. Ну только листом. Тебе ведь все равно придется их писать, верно?)

Возможно ли принудительно добавлять методы, или изменять их? К примеру, при регистрации указать блок и дополнительный конфиг/класс, откуда будут подгружаться необходимые методы.
так можно делать только с переменными/либо методами, возвращающими переменные. C void так не получится, да это и не надо, ведь ты можешь просто после скобок его добавить как бы, как типо. setCreativeTab(tab);
 
344
1
46
C AxisAlignedBB пытался подружиться. Не вышло, меня послали.


Multiblock (test):
package core.erumind.block.s.listreg;

import java.time.Month;
import java.util.List;

import core.Engine;
import core.Settings;
import core.erumind.block.TileEntity.Base;
import net.minecraft.block.Block;
import net.minecraft.block.BlockHorizontal;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.Item;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.Mirror;
import net.minecraft.util.Rotation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;


public class Multiblock extends Block {
    
       //protected static final AxisAlignedBB BLOCK_TOP = new AxisAlignedBB(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F);
       public AxisAlignedBB BLOCK_TOPs;
       public static final PropertyDirection FACING = BlockHorizontal.FACING;
        private static Multiblock ourInstance;

  
  
    @SuppressWarnings("null")
    public Multiblock(String reg, float a1, float a2, float a3, float a4, float a5, float a6) {
          super(Material.IRON);
          final AxisAlignedBB BLOCK_TOPs = new AxisAlignedBB(a1, a2, a3, a4, a5, a6);
          setBlockUnbreakable();
          setSoundType(SoundType.METAL);
          setLightOpacity(0);
          setLightLevel(0.4f);
          setTickRandomly(false);
          setUnlocalizedName(reg);
          setRegistryName(Settings.Resources, "obj." + reg);
          setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH));
          setCreativeTab(Engine.objTab);
        
      
    }
  
    private void setBlockBounds(Float f, float f1, float f2, float f3, float f4, float f5) {
        // TODO Auto-generated method stub
      
    }
    @Override
    protected BlockStateContainer createBlockState() {
         return new BlockStateContainer(this, new IProperty[] { FACING});
    }

    @Override
    public IBlockState getStateForPlacement(final World world, final BlockPos pos, final EnumFacing facing, final float hitX, final float hitY, final float hitZ, final int meta, final EntityLivingBase placer, final EnumHand hand) {
        return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(FACING, placer.getHorizontalFacing().getOpposite());
    }
  
    @SuppressWarnings("deprecation")
    @Override
    public IBlockState getStateFromMeta(int meta) {
        EnumFacing enumfacing = EnumFacing.getFront(meta);
            if (enumfacing.getAxis() == EnumFacing.Axis.Y) {
                enumfacing = EnumFacing.NORTH;
            }
           return this.getDefaultState().withProperty(FACING, enumfacing);
    }

    @Override
    public int getMetaFromState(final IBlockState state) {
        return state.getValue(FACING).getHorizontalIndex();
    }

    @SuppressWarnings("deprecation")
    @Override
    public IBlockState withRotation(final IBlockState state, final Rotation rotation) {
        return state.withProperty(FACING, rotation.rotate(state.getValue(FACING)));
    }
  
    @SuppressWarnings("deprecation")
    @Override
    public IBlockState withMirror(final IBlockState state, final Mirror mirror) {
        return state.withRotation(mirror.toRotation(state.getValue(FACING)));
    }

  
    @SideOnly(Side.CLIENT)
    public void initModel() {
        ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this), 0, new ModelResourceLocation(getRegistryName(), "inventory"));
    }

    @Override
    @SideOnly(Side.CLIENT)
    public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess worldIn, BlockPos pos, EnumFacing side) {
        return false;
    }

    @Override
    public boolean isBlockNormalCube(IBlockState blockState) {
        return false;
    }

    @Override
    public boolean isOpaqueCube(IBlockState blockState) {return false;}
    @Override
    public boolean isFullCube(IBlockState state) {return false;}
    @Override
    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return BLOCK_TOPs; }
    @Override
    public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox,
            List<AxisAlignedBB> collidingBoxes, Entity entityIn, boolean p_185477_7_) { addCollisionBoxToList(pos, entityBox, collidingBoxes, BLOCK_TOPs);}
}

Регистрация: public static final Multiblock Block2 = new Multiblock("block2", 0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F);

Крашлог:

crashlog:
---- Minecraft Crash Report ----
// I let you down. Sorry :(

Time: 10/4/19 7:16 AM
Description: Unexpected error

java.lang.NullPointerException: Unexpected error
    at net.minecraft.block.Block.rayTrace(Block.java:804)
    at net.minecraft.block.Block.collisionRayTrace(Block.java:796)
    at net.minecraft.block.state.BlockStateContainer$StateImplementation.collisionRayTrace(BlockStateContainer.java:473)
    at net.minecraft.world.World.rayTraceBlocks(World.java:1181)
    at net.minecraft.entity.Entity.rayTrace(Entity.java:1782)
    at net.minecraft.client.renderer.EntityRenderer.getMouseOver(EntityRenderer.java:389)
    at net.minecraft.client.renderer.EntityRenderer.renderWorld(EntityRenderer.java:1294)
    at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1115)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1209)
    at net.minecraft.client.Minecraft.run(Minecraft.java:442)
    at net.minecraft.client.main.Main.main(Main.java:118)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97)
    at GradleStart.main(GradleStart.java:25)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Thread: Client thread
Stacktrace:
    at net.minecraft.block.Block.rayTrace(Block.java:804)
    at net.minecraft.block.Block.collisionRayTrace(Block.java:796)
    at net.minecraft.block.state.BlockStateContainer$StateImplementation.collisionRayTrace(BlockStateContainer.java:473)
    at net.minecraft.world.World.rayTraceBlocks(World.java:1181)
    at net.minecraft.entity.Entity.rayTrace(Entity.java:1782)
    at net.minecraft.client.renderer.EntityRenderer.getMouseOver(EntityRenderer.java:389)
    at net.minecraft.client.renderer.EntityRenderer.renderWorld(EntityRenderer.java:1294)

-- Affected level --
Details:
    Level name: MpServer
    All players: 1 total; [EntityPlayerSP['Player61'/89, l='MpServer', x=-764.40, y=4.00, z=-915.08]]
    Chunk stats: MultiplayerChunkCache: 49, 49
    Level seed: 0
    Level generator: ID 01 - flat, ver 0. Features enabled: false
    Level generator options:
    Level spawn location: World: (-759,4,-928), Chunk: (at 9,0,0 in -48,-58; contains blocks -768,0,-928 to -753,255,-913), Region: (-2,-2; contains chunks -64,-64 to -33,-33, blocks -1024,0,-1024 to -513,255,-513)
    Level time: 29904 game time, 29904 day time
    Level dimension: 0
    Level storage version: 0x00000 - Unknown?
    Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)
    Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false
    Forced entities: 7 total; [EntityCreeper['Creeper'/64, l='MpServer', x=-766.21, y=4.00, z=-914.31], EntitySlime['Slime'/52, l='MpServer', x=-777.41, y=4.00, z=-923.90], EntitySheep['Sheep'/53, l='MpServer', x=-776.81, y=4.00, z=-904.26], EntitySlime['Slime'/54, l='MpServer', x=-780.12, y=5.08, z=-912.53], EntitySlime['Slime'/71, l='MpServer', x=-753.10, y=4.00, z=-900.53], EntitySheep['Sheep'/56, l='MpServer', x=-774.13, y=4.00, z=-901.72], EntityPlayerSP['Player61'/89, l='MpServer', x=-764.40, y=4.00, z=-915.08]]
    Retry entities: 0 total; []
    Server brand: fml,forge
    Server type: Integrated singleplayer server
Stacktrace:
    at net.minecraft.client.multiplayer.WorldClient.addWorldInfoToCrashReport(WorldClient.java:461)
    at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:2889)
    at net.minecraft.client.Minecraft.run(Minecraft.java:471)
    at net.minecraft.client.main.Main.main(Main.java:118)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97)
    at GradleStart.main(GradleStart.java:25)

-- System Details --
Details:
    Minecraft Version: 1.12.2
    Operating System: Windows 8.1 (amd64) version 6.3
    Java Version: 1.8.0_191, Oracle Corporation
    Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
    Memory: 810208872 bytes (772 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB)
    JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
    IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
    FML: MCP 9.42 Powered by Forge 14.23.5.2847 5 mods loaded, 5 mods active
    States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored

    | State  | ID        | Version      | Source                           | Signature |
    |:------ |:--------- |:------------ |:-------------------------------- |:--------- |
    | LCHIJA | minecraft | 1.12.2       | minecraft.jar                    | None      |
    | LCHIJA | mcp       | 9.42         | minecraft.jar                    | None      |
    | LCHIJA | FML       | 8.0.99.99    | forgeSrc-1.12.2-14.23.5.2847.jar | None      |
    | LCHIJA | forge     | 14.23.5.2847 | forgeSrc-1.12.2-14.23.5.2847.jar | None      |
    | LCHIJA | erumind   | 1.10.0       | bin                              | None      |
 
Последнее редактирование:
344
1
46
можно просто в цикле присваивать им регнеймы. А сами названия переменных.. Ну только листом. Тебе ведь все равно придется их писать, верно?)

Ага, верно...

так можно делать только с переменными/либо методами, возвращающими переменные. C void так не получится, да это и не надо, ведь ты можешь просто после скобок его добавить как бы, как типо. setCreativeTab(tab);

Я имел ввиду, перенести некоторые методы в конфиг. Например, посыл пакета открытия определённого гуи. Добавления какого-либо метода с свойствами блока (onblockactivated) и прочее.
 
344
1
46
(исправил на просто паблик, по прежнему посылает и не хочет дружить... (AxisAlignedBB)
upd:
Java:
    public static final Multiblock Block2 = new Multiblock("block2", Engine.objTab, 0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F);
             setCreativeTab(tab);
 

Maxik

Золотой Петушок
4,949
46
720
blockbound тоже является переменной, держу в курсе
возвращается в методе getBoundingBox
 
344
1
46
На самом деле всё было проще простого, я немного намудрил с статиками... вот таким образом, всё работает. Осталось - мелочи, но в целом я частично добился результата. Под вопросом остаётся вставка метода или как можно в блоке проверить какой блок именно зарегистрирован?

К примеру, при активации блока проверить какой именно это блок по регистрации. Если блок три, то выполнить... не знаю.

Решение:
        public AxisAlignedBB BLOCK_TOP;
    
----------------------

AxisAlignedBB BLOCK_TOPs = new AxisAlignedBB(a1, a2, a3, a4, a5, a6);
          BLOCK_TOP = BLOCK_TOPs;
-------------
    public static final Multiblock Block2 = new Multiblock("block2", Engine.objTab, 0.0F, 0.0F, 0.0F, 2.0F, 1.0F, 1.0F);
    public static final Multiblock Block3 = new Multiblock("block3", Engine.objTab, 0.0F, 0.0F, 0.0F, 2.0F, 0.7F, 5.0F);
 

tox1cozZ

aka Agravaine
Модератор
7,182
457
2,173
Ты делаешь какуе-то дичь.
Делать такие общие классы стоит только если у тебя несколько одинаковых блоков, которые отличаются например текстурой или еще какими-то параметрами.
Не надо пытаться засунуть логику всех своих блоков в один класс.
 
344
1
46
И-так... только что я сказал, что проблема решена. Это так! Но, теперь появляется иной вопрос... Как быть, если модель поворачивается? И она плоская... Оно уходит в сторону. Хотя, если правильно ставить, то есть. Можно ли вообще настроить в соответствии с "лицом"?

2019-10-04_11.42.22.png

2019-10-04_11.42.44.png
 
344
1
46
Ты делаешь какуе-то дичь.
Делать такие общие классы стоит только если у тебя несколько одинаковых блоков, которые отличаются например текстурой или еще какими-то параметрами.
Не надо пытаться засунуть логику всех своих блоков в один класс.

А если большая часть из них - одинаковы? Потому и делаю. А так, конечно можно сделать много разных классов... хмыкнул
 
344
1
46
В общем, думаю вы правы, идея изначально - провальная. Но идею мультиблока можно оставить действительно на одинаковые блоки и прочее.

Тема закрыта. Решение я прикрепил, в принципе - если кому надо.
 
5,456
182
1,010
Судя по тому, что ты создал новую тему про ту же тему(лол), попробуй обратить внимание на этот пример регистрации:
Достоинства:
гибкость(можно брать инстансы для регистрации откуда угодно, в примерах - из полей класса и из списка)
легкость использования(достаточно добавить поле в класс, имя по умолчанию выводится автоматически из имени класса, всякие итемблоки тоже по дефолту сами создаются)
наверное еще какие-то есть, но я не замечал)
 
Сверху