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");
}
}