Soft-fur dragon Posted March 17, 2021 Share Posted March 17, 2021 (edited) I followed recommendations in this thread and finally got my new cauldron block in game. However, now it's missing from its default creative tab (brewing). I also added TileEntity to my block and now world stopped loading at all, if it have at least one cauldron tile entity in it ☠️ Block registry package arcanacraft.blocks; import arcanacraft.Registries; import arcanacraft.item.ItemRegistry; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; import net.minecraft.block.CauldronBlock; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.material.MaterialColor; import net.minecraftforge.common.ToolType; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ObjectHolder; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class BlockRegistry { public static final RegistryObject<ModBlock> ARCANIUM_BLOCK = Registries.BLOCKS.register("arcanium_block", () -> new ModBlock(ItemRegistry.ARCANIUM_BLOCK::get, AbstractBlock.Properties.create(Material.IRON).harvestTool(ToolType.PICKAXE).setRequiresTool().hardnessAndResistance(5.0f, 6.0f))); public static final RegistryObject<Pedestal> COBBLESTONE_PEDESTAL = Registries.BLOCKS.register("cobblestone_pedestal", () -> new Pedestal(ItemRegistry.COBBLESTONE_PEDESTAL::get, AbstractBlock.Properties.create(Material.ROCK).harvestTool(ToolType.PICKAXE).setRequiresTool().hardnessAndResistance(2.0f, 6.0f))); //public static final RegistryObject<Condenser> QUARTZ_CONDENSER = Registries.BLOCKS.register("quartz_condenser", () -> new Condenser(ItemRegistry.QUARTZ_CONDENSER::get, AbstractBlock.Properties.create(Material.WOOD).doesNotBlockMovement().zeroHardnessAndResistance())); public static final RegistryObject<Chains> CHAINS = Registries.BLOCKS.register("chains", () -> new Chains(AbstractBlock.Properties.create(Material.IRON, MaterialColor.AIR).setRequiresTool().hardnessAndResistance(5.0F, 6.0F).sound(SoundType.CHAIN).notSolid())); // Registries.BLOCKS.register("cauldron", () -> new Cauldron(AbstractBlock.Properties.create(Material.IRON, MaterialColor.STONE).setRequiresTool().hardnessAndResistance(2.0F).notSolid())); public static final RegistryObject<CauldronBlock> ADVANCED_CAULDRON = Registries.BLOCKS.register("advanced_cauldron", () -> new CauldronBlock(AbstractBlock.Properties.create(Material.IRON, MaterialColor.STONE).setRequiresTool().hardnessAndResistance(2.0F).notSolid())); @ObjectHolder("minecraft:cauldron") public static final Block CAULDRON = null; public static void Register() { } @SubscribeEvent public static void ReplaceVanilla(final RegistryEvent.Register<Block> event) { event.getRegistry().registerAll( new Cauldron(AbstractBlock.Properties.create(Material.IRON, MaterialColor.STONE).setRequiresTool().hardnessAndResistance(2.0F).notSolid()).setRegistryName("minecraft:cauldron") ); } } New cauldron class package arcanacraft.blocks; import arcanacraft.tile_entities.CauldronEntity; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.CauldronBlock; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; public class Cauldron extends CauldronBlock { public static Map<Block, Float> HEATERS = new HashMap<Block, Float>() {{ put(Blocks.LAVA, 5.0f); put(Blocks.TORCH, 1.0f); }}; public Cauldron(Properties properties) { super(properties); } @Override public void onNeighborChange(BlockState state, IWorldReader world, BlockPos pos, BlockPos neighbor) { if (!world.isRemote()) { BlockState newState = world.getBlockState(neighbor); if (neighbor == pos.add(0, -1, 0)) { TileEntity entity = world.getTileEntity(pos); if (entity instanceof CauldronEntity) { CauldronEntity cauldron = (CauldronEntity) entity; cauldron.UpdateHeat(); } } } } @Override public void setWaterLevel(World worldIn, BlockPos pos, BlockState state, int level) { super.setWaterLevel(worldIn, pos, state, level); if (!worldIn.isRemote) { TileEntity entity = worldIn.getTileEntity(pos); if (entity instanceof CauldronEntity) { CauldronEntity cauldron = (CauldronEntity) entity; cauldron.SetWaterLevel(level); } } } @Override public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return new CauldronEntity(); } } Cauldron tile entity package arcanacraft.tile_entities; import arcanacraft.blocks.Cauldron; import arcanacraft.network.INetworkable; import arcanacraft.network.PacketHandler; import arcanacraft.network.PacketProperties; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import javax.annotation.Nullable; public class CauldronEntity extends TileEntity implements ITickableTileEntity, INetworkable { public static final int SIGNAL_BOIL = 0; public static final int SIGNAL_COOL = 1; float heat = 0.0f; float waterHeat = 0.0f; float boilHeat = 0.0f; float Clamp(float v, float min, float max) { return Math.max(min, Math.min(v, max)); } public CauldronEntity() { super(TileEntityRegistry.CAULDRON.get()); } @Override public void tick() { if (!world.isRemote) { float heatBefore = waterHeat; waterHeat = Clamp(waterHeat + heat, 0, boilHeat); if (heatBefore != waterHeat) { if (waterHeat == boilHeat && boilHeat != 0.0f) { Boil(); PacketHandler.SendMessage(this, SIGNAL_BOIL, new PacketProperties().InChunkAt(world, pos)); } else if (waterHeat == 0) { Cool(); PacketHandler.SendMessage(this, SIGNAL_COOL, new PacketProperties().InChunkAt(world, pos)); } } } } @Override public void onLoad() { super.onLoad(); UpdateHeat(); SetWaterLevel(world.getBlockState(pos).get(Cauldron.LEVEL)); } public void UpdateHeat() { Block heater = world.getBlockState(pos.add(0, -1, 0)).getBlock(); heat = Cauldron.HEATERS.getOrDefault(heater, -5.0f); } public void SetWaterLevel(int waterLevel) { boilHeat = waterLevel * 100.0f; } void Boil() { } void Cool() { } @Override public void HandleMessage(int type, @Nullable CompoundNBT msg, @Nullable ServerPlayerEntity sender) { if (type == SIGNAL_BOIL) { Boil(); } else if (type == SIGNAL_COOL) { Cool(); } } @Override public CompoundNBT write(CompoundNBT compound) { super.write(compound); compound.putFloat("waterHeat", waterHeat); return compound; } @Override public void read(BlockState state, CompoundNBT nbt) { super.read(state, nbt); waterHeat = nbt.getFloat("waterHeat"); } } Edited March 22, 2021 by Soft-fur dragon Quote Link to comment Share on other sites More sharing options...
kiou.23 Posted March 17, 2021 Share Posted March 17, 2021 you need to register a BlockItem for the block, and set it's group to be the Brewing ItemGroup 1 Quote Link to comment Share on other sites More sharing options...
Soft-fur dragon Posted March 17, 2021 Author Share Posted March 17, 2021 Well, that was pretty obvious, but thanks First problem is solved. However, world is still being broken. This is what I see when I'm trying to open it. The game freezes in this state Quote Link to comment Share on other sites More sharing options...
kiou.23 Posted March 17, 2021 Share Posted March 17, 2021 could you post more of the code (maybe a git repo)? I don't see anything wrong with the code you shared Quote Link to comment Share on other sites More sharing options...
Soft-fur dragon Posted March 17, 2021 Author Share Posted March 17, 2021 Just uploaded in on GitHub Quote Link to comment Share on other sites More sharing options...
Soft-fur dragon Posted March 17, 2021 Author Share Posted March 17, 2021 Ok, I found it. Inside my cauldron TileEntity you can see onLoad function. Inside it I call UpdateHeat function, which calls world.getBlockState. I tried to debug this code and it seems like it freezes on trying to load chunk to get BlockState on that position. Bug? Or is there another way to get block data on world startup Quote Link to comment Share on other sites More sharing options...
Draco18s Posted March 17, 2021 Share Posted March 17, 2021 Don't. Because it happens during chunk load, the chunk hasn't loaded yet, so it pauses the load to fetch the chunk you're referencing, which is the chunk that contains the cauldron which is currently paused waiting for it to finish loading. Do that check in an update tick. 1 Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given. Link to comment Share on other sites More sharing options...
Soft-fur dragon Posted March 17, 2021 Author Share Posted March 17, 2021 Got it, thanks for clarification Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.