Привязка фантомного блока к основному

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.12.2
37
6
У меня есть печка 5x5x4, я сделал фантомные блоки которые ставятся вместе с ней, и обводку которая обводит всю печку целиком. Но проблема в том что эта обводка срабатывает лишь при наводке на основной блок печки, и мне нужно что бы при наводке на 1 из фантомных блоков срабатывала обводка основного блока. Как проверить смотрит ли игрок на фантомный блок и если смотрит включить обводку основного блока? просто я знаю что надо делать tileentity но кроме гайда как сделать печку рабочей на 1.12.2 я ничего не нашел касающегося tilentity.
 
Решение
Итак! Делаешь блокстейты, соответствующие положению твоих фантомных блоков в структуре печки.
Через getActualState() назначаешь блоку нужный стейт или сразу ставишь нужный в мир.
В зависимости от стейта меняешь обводку как хочешь.
Tip: Лучше сразу заготовить и сохранить нужные AABB и юзать их...
917
22
332
что сложней но менее геморно
Самый лёгкий вариант в комментарии выше, как мне кажется... Если такой подход не нравится, придётся разбираться в том что сложнее
 
  • Like
Реакции: stil
7,099
324
1,510
Разве? это же придется делать кучу экземпляров фантомных блоков т.к обводка для каждого фантомного блока нужна разная
Чекни методы класса AABB, там кажется был сдвиг(translate)
 
37
6
Вроде бы понял как сделать блок стейты но не понимаю как назначить состояние, пробовал через

world.setBlockState(pos.add(0, 1, 0), BlockInit.BLOCK_PHANTOM.getActualState("AABB, 1", world, pos));
но не вышло, буду рад помощи.

Java:
package projectARG.objects.blocks;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.event.DrawBlockHighlightEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import projectARG.Main;
import projectARG.init.BlockInit;
import projectARG.init.ItemInit;
import projectARG.util.IHasModel;

public class BlockPhantom extends Block implements IHasModel
{
   
    public static final PropertyInteger AABB = PropertyInteger.create("AABB", 0, 48);
   
    public BlockPhantom(String name)
    {
        super(BlockInit.PHANTOM);
        setUnlocalizedName(name);
        setRegistryName(name);
        setCreativeTab(Main.ARGblocksTAB);
       
        this.setBlockUnbreakable();
        this.setResistance(6000001.0F);
        this.disableStats();
        this.translucent = true;
       
        BlockInit.BLOCKS.add(this);
        ItemInit.ITEMS.add(new ItemBlock(this).setRegistryName(this.getRegistryName()));
    }
   
    public EnumBlockRenderType getRenderType(IBlockState state)
    {
        return EnumBlockRenderType.INVISIBLE;
    }
   
    public boolean isOpaqueCube(IBlockState state)
    {
        return false;
    }
   
    @SideOnly(Side.CLIENT)
    public float getAmbientOcclusionLightValue(IBlockState state)
    {
        return 1.0F;
    }
   
    @Override
    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[] {AABB});
    }
   
    @Override
    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
    {
        double x1 = 0;
        double x2 = 0;
       
        double y1 = 0;
        double y2 = 0;
       
        double z1 = 0;
        double z2 = 0;
       
        if(state == state.withProperty(AABB, 1))
        {
            x1= -4D;
            y1= -2D;
            z1= -2D;
           
            x2= 1D;
            y2= 4D;
            z2= 3D;
        }
       
        return new AxisAlignedBB(x1, y1, z1, x2, y2, z2);
    }
   
    public boolean isCollidable()
    {
        return true;
    }
   
    @Override
    public void registerModels()
    {
        Main.proxy.registerItemRenderer(Item.getItemFromBlock(this), 0, "inventory");
    }
}
 
917
22
332
В конструктор твоего блока добавь строчку:
Java:
setDefaultState(blockState.withProperty(AABB, 0))
А чтобы установить стейт, ты можешь использовать либо:
Java:
world.setBlockState(pos, BlockInit.BLOCK_PHANTOM.getDefaultState());
Либо:
Java:
world.setBlockState(pos, BlockInit.BLOCK_PHANTOM.getDefaultState().withProperty(BlockPhantom.AABB, Число-Которое-Ты-Хочешь-Установить))
 
3,005
192
592
Там нужно будет еще переопрелелить 2 метода с метой и если мета > 15, тогда мета не вариант.
 
37
6
Я явно сделал что то не так, крашится игра
Caused by: java.lang.IllegalArgumentException: Block: class projectARG.objects.blocks.BlockPhantom has invalidly named property: AABB


Java:
package projectARG.objects.blocks;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.event.DrawBlockHighlightEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import projectARG.Main;
import projectARG.init.BlockInit;
import projectARG.init.ItemInit;
import projectARG.util.IHasModel;

public class BlockPhantom extends Block implements IHasModel
{
    
    public static final PropertyInteger AABB = PropertyInteger.create("AABB", 0, 48);
    
    public BlockPhantom(String name)
    {
        super(BlockInit.PHANTOM);
        setUnlocalizedName(name);
        setRegistryName(name);
        setCreativeTab(Main.ARGblocksTAB);
        
        this.setBlockUnbreakable();
        this.setResistance(6000001.0F);
        this.disableStats();
        this.translucent = true;
        
        BlockInit.BLOCKS.add(this);
        ItemInit.ITEMS.add(new ItemBlock(this).setRegistryName(this.getRegistryName()));
        
        
    }
    
    public EnumBlockRenderType getRenderType(IBlockState state)
    {
        return EnumBlockRenderType.INVISIBLE;
    }
    
    public boolean isOpaqueCube(IBlockState state)
    {
        return false;
    }
    
    @SideOnly(Side.CLIENT)
    public float getAmbientOcclusionLightValue(IBlockState state)
    {
        return 1.0F;
    }
    
    @Override
    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[] {AABB});
    }
    
    @Override
    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
    {
        double x1 = 0;
        double x2 = 0;
        
        double y1 = 0;
        double y2 = 0;
        
        double z1 = 0;
        double z2 = 0;
        
        if(state == state.withProperty(AABB, 1))
        {
            x1= -4D;
            y1= -2D;
            z1= -2D;
            
            x2= 1D;
            y2= 4D;
            z2= 3D;
        }
        
        return new AxisAlignedBB(x1, y1, z1, x2, y2, z2);
    }
    
    @Override
    public int getMetaFromState(IBlockState state)
    {
        return state.getValue(AABB);
    }
    
    @Override
    public IBlockState getStateFromMeta(int meta)
    {
        return this.getDefaultState().withProperty(AABB, meta);
    }
    
    public boolean isCollidable()
    {
        return true;
    }
    
    @Override
    public void registerModels()
    {
        Main.proxy.registerItemRenderer(Item.getItemFromBlock(this), 0, "inventory");
    }
}
 
917
22
332
С аабб у него вроде всё норм, он хочет, чтоб в зависимости от стейта аабб отличалось.
--
Проблема в том, что метадата существует только для 15 а у тебя 48. В методах getStateFromMeta, проверяй, что у тебя мета или стейт не больше пятнадцати, то что идёт после ты должен обработать в методе getActualState. И в названии iproperty используйте маленькие буквы
 
917
22
332
Там же ошибка неверного аргумента
invalidly named property - означает, что объявленный IProperty имеет неверное имя.
Проблема была действительно в регистре, изменил на маленькие буквы и все заработало
Попробуй установить стейт больше 15-ти и перезайти в мир. Скорее всего, он не сохранится...
 
3,005
192
592
Когда идет краш - ты не пиши "ВОТ, У МЕНЯ КРАШ", а скидывай сразу лог.
 
37
6
Да но.. чем в данной ситуации поможет краш лог если итак понятно что это из за того что я поставил больше 15 блокстейтов

Или так не должно было быть

Вот в таком случае краш лог
Java:
---- Minecraft Crash Report ----
// You should try our sister game, Minceraft!

Time: 10/29/19 3:45 PM
Description: Initializing game

java.lang.ArrayIndexOutOfBoundsException: 16
    at net.minecraftforge.registries.GameData$BlockCallbacks.onAdd(GameData.java:322)
    at net.minecraftforge.registries.GameData$BlockCallbacks.onAdd(GameData.java:296)
    at net.minecraftforge.registries.ForgeRegistry.add(ForgeRegistry.java:358)
    at net.minecraftforge.registries.ForgeRegistry.add(ForgeRegistry.java:289)
    at net.minecraftforge.registries.ForgeRegistry.register(ForgeRegistry.java:122)
    at net.minecraftforge.registries.ForgeRegistry.registerAll(ForgeRegistry.java:163)
    at projectARG.util.handlers.RegistryHandler.onBlockRegister(RegistryHandler.java:26)
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_5_RegistryHandler_onBlockRegister_Register.invoke(.dynamic)
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90)
    at net.minecraftforge.fml.common.eventhandler.EventBus$1.invoke(EventBus.java:144)
    at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182)
    at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:777)
    at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:628)
    at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:252)
    at net.minecraft.client.Minecraft.init(Minecraft.java:513)
    at net.minecraft.client.Minecraft.run(Minecraft.java:421)
    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.minecraftforge.registries.GameData$BlockCallbacks.onAdd(GameData.java:322)
    at net.minecraftforge.registries.GameData$BlockCallbacks.onAdd(GameData.java:296)
    at net.minecraftforge.registries.ForgeRegistry.add(ForgeRegistry.java:358)
    at net.minecraftforge.registries.ForgeRegistry.add(ForgeRegistry.java:289)
    at net.minecraftforge.registries.ForgeRegistry.register(ForgeRegistry.java:122)
    at net.minecraftforge.registries.ForgeRegistry.registerAll(ForgeRegistry.java:163)
    at projectARG.util.handlers.RegistryHandler.onBlockRegister(RegistryHandler.java:26)
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_5_RegistryHandler_onBlockRegister_Register.invoke(.dynamic)
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90)
    at net.minecraftforge.fml.common.eventhandler.EventBus$1.invoke(EventBus.java:144)
    at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182)
    at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:777)
    at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:628)
    at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:252)
    at net.minecraft.client.Minecraft.init(Minecraft.java:513)

-- Initialization --
Details:
Stacktrace:
    at net.minecraft.client.Minecraft.run(Minecraft.java:421)
    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 10 (amd64) version 10.0
    Java Version: 1.8.0_221, Oracle Corporation
    Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
    Memory: 763334608 bytes (727 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.2768 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 |
    |:----- |:--------- |:------------ |:-------------------------------- |:--------- |
    | UCH   | minecraft | 1.12.2       | minecraft.jar                    | None      |
    | UCH   | mcp       | 9.42         | minecraft.jar                    | None      |
    | UCH   | FML       | 8.0.99.99    | forgeSrc-1.12.2-14.23.5.2768.jar | None      |
    | UCH   | forge     | 14.23.5.2768 | forgeSrc-1.12.2-14.23.5.2768.jar | None      |
    | UCH   | arg       | 1.0          | bin                              | None      |

    Loaded coremods (and transformers):
    GL info: ' Vendor: 'NVIDIA Corporation' Version: '4.6.0 NVIDIA 425.31' Renderer: 'GeForce GT 750M/PCIe/SSE2'
    Launched Version: 1.12.2
    LWJGL: 2.9.4
    OpenGL: GeForce GT 750M/PCIe/SSE2 GL version 4.6.0 NVIDIA 425.31, NVIDIA Corporation
    GL Caps: Using GL 1.3 multitexturing.
Using GL 1.3 texture combiners.
Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
Shaders are available because OpenGL 2.1 is supported.
VBOs are available because OpenGL 1.5 is supported.

    Using VBOs: No
    Is Modded: Definitely; Client brand changed to 'fml,forge'
    Type: Client (map_client.txt)
    Resource Packs:
    Current Language: Русский (Россия)
    Profiler Position: N/A (disabled)
    CPU: 8x Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz
 
7,099
324
1,510
Мет нельзя, блокстейтов хоть сотню можно.
в методе getActualState обрабатывать блок, чтобы при перезаходе в мир стейты сохранялись
Стэйты не закодированные в мету не сохраняются в любом случае. Они создаются заново, когда понадобятся, и влияют на на блок только визуально
 
917
22
332
Стэйты не закодированные в мету не сохраняются в любом случае. Они создаются заново, когда понадобятся, и влияют на на блок только визуально
Ну все ведь поняли, что я имел в виду... наверно.
(Под словом сохранялись я подразумевал, что блок после перезахода в мир будет выглядеть точно также как и раньше)
В любом случае, ему нужно переопределить метод getActualState, и уже там обрабатывать свои стейты, у него ведь комплексная печка, значит он может чекнуть где какой блок и в зависимости от этого, сетнуть стейт...
 
37
6
Вернулся к созданию своего мода и решил начать с печки которую тогда так и не доделал, в общем я сделал что то типо обработки стейтов в зависимости от положения блока но aabb обновляется лишь после того как я нажимаю f3, попробовал сохранять в nbt как в коде который нашел но не понимаю как можно сделать подобное с моим блоком..
Java:
@Override
    public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos)
    {
        if(getBlockState().getBlock().getOffset(state, worldIn, pos) == BlockInit.FURNACE_COKE.getOffset(state, worldIn, pos.add(0, -1, 0)))
        {
            
            x2 = 3;
            y2 = 3;
            z2 = 3;
        }
        
        return state;
    }

вот код который нашел
Java:
package choonster.testmod3.block;

import choonster.testmod3.TestMod3;
import choonster.testmod3.tileentity.TileEntityColoredRotatable;
import choonster.testmod3.util.OreDictUtils;
import net.minecraft.block.BlockColored;
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.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumDyeColor;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

import javax.annotation.Nullable;
import java.util.Optional;

/**
 * A block with 16 colours (stored in the metadata) and 6 facings (stored in the TileEntity).
 *
 * @author Choonster
 */
public class BlockColoredRotatable extends BlockColored {
    public static final IProperty<EnumFacing> FACING = PropertyDirection.create("facing");

    public BlockColoredRotatable(Material materialIn, String blockName) {
        super(materialIn);
        BlockTestMod3.setBlockName(this, blockName);
        setCreativeTab(TestMod3.creativeTab);
    }

    @Override
    protected BlockStateContainer createBlockState() {
        return new BlockStateContainer(this, COLOR, FACING);
    }

    @Override
    public boolean hasTileEntity(IBlockState state) {
        return true;
    }

    @Override
    public TileEntity createTileEntity(World world, IBlockState state) {
        return new TileEntityColoredRotatable();
    }

    @Nullable
    public TileEntityColoredRotatable getTileEntity(IBlockAccess world, BlockPos pos) {
        return (TileEntityColoredRotatable) world.getTileEntity(pos);
    }

    public EnumFacing getFacing(IBlockAccess world, BlockPos pos) {
        final TileEntityColoredRotatable tileEntity = getTileEntity(world, pos);
        return tileEntity != null ? tileEntity.getFacing() : EnumFacing.NORTH;
    }

    public void setFacing(IBlockAccess world, BlockPos pos, EnumFacing facing) {
        final TileEntityColoredRotatable tileEntity = getTileEntity(world, pos);
        if (tileEntity != null) {
            tileEntity.setFacing(facing);
        }
    }

    @Override
    public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) {
        setFacing(worldIn, pos, EnumFacing.getDirectionFromEntityLiving(pos, placer));
    }

    @SuppressWarnings("deprecation")
    @Override
    public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) {
        return state.withProperty(FACING, getFacing(worldIn, pos));
    }

    @Override
    public boolean rotateBlock(World world, BlockPos pos, EnumFacing axis) {
        final EnumFacing facing = getFacing(world, pos);
        setFacing(world, pos, facing.rotateAround(axis.getAxis()));

        return true;
    }

    @Override
    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) {
        final ItemStack heldItem = playerIn.getHeldItem(hand);

        if (!heldItem.isEmpty()) { // If the player is holding dye, change the colour
            final Optional<EnumDyeColor> dyeColour = OreDictUtils.INSTANCE.getDyeColour(heldItem);
            if (dyeColour.isPresent()) {
                final boolean success = recolorBlock(worldIn, pos, side, dyeColour.get());
                if (success) {
                    heldItem.shrink(1);
                    return true;
                }
            }

            return false;
        } else { // Else rotate the block
            return rotateBlock(worldIn, pos, side);
        }
    }
}
Java:
package choonster.testmod3.tileentity;

import net.minecraft.block.state.IBlockState;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

import javax.annotation.Nullable;

/**
 * A TileEntity that stores an {@link EnumFacing} value.
 *
 * @author Choonster
 */
public class TileEntityColoredRotatable extends TileEntity {
    private EnumFacing facing = EnumFacing.NORTH;

    public EnumFacing getFacing() {
        return facing;
    }

    public void setFacing(EnumFacing facing) {
        this.facing = facing;
        markDirty();
    }

    @Override
    public void readFromNBT(NBTTagCompound compound) {
        super.readFromNBT(compound);
        facing = EnumFacing.getFront(compound.getInteger("facing"));
    }

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound) {
        super.writeToNBT(compound);
        compound.setInteger("facing", facing.getIndex());
        return compound;
    }

    private void notifyBlockUpdate() {
        final IBlockState state = getWorld().getBlockState(getPos());
        getWorld().notifyBlockUpdate(getPos(), state, state, 3);
    }

    @Override
    public void markDirty() {
        super.markDirty();
        notifyBlockUpdate();
    }

    @Override
    public NBTTagCompound getUpdateTag() {
        return writeToNBT(new NBTTagCompound());
    }

    @Nullable
    @Override
    public SPacketUpdateTileEntity getUpdatePacket() {
        return new SPacketUpdateTileEntity(getPos(), 0, getUpdateTag());
    }

    @Override
    public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
        readFromNBT(pkt.getNbtCompound());
        notifyBlockUpdate();
    }

    @Override
    public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newSate) {
        return oldState.getBlock() != newSate.getBlock();
    }
}
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху