diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java index e6e95bae4..4334b606e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.fan; import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; +import com.simibubi.create.content.contraptions.processing.HeaterBlock; import com.simibubi.create.content.contraptions.processing.HeaterTileEntity; import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; import com.simibubi.create.foundation.config.AllConfigs; @@ -74,11 +75,12 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity { } public boolean blockBelowIsHot() { + if (world == null) + return false; BlockState checkState = world.getBlockState(pos.down()); - TileEntity te = world.getTileEntity(pos.down()); return checkState.getBlock() .isIn(AllBlockTags.FAN_HEATERS.tag) - || (te instanceof HeaterTileEntity && ((HeaterTileEntity) te).getHeatLevel() >= 2); + || (checkState.has(HeaterBlock.BLAZE_LEVEL) && checkState.get(HeaterBlock.BLAZE_LEVEL) >= 1); } public float getMaxDistance() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java index 9c566b870..a5de28be4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java @@ -11,13 +11,14 @@ import com.simibubi.create.content.contraptions.fluids.CombinedFluidHandler; import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity; import com.simibubi.create.content.contraptions.processing.BasinTileEntity.BasinInventory; import com.simibubi.create.content.contraptions.processing.CombinedItemFluidList; -import com.simibubi.create.content.contraptions.processing.HeaterTileEntity; +import com.simibubi.create.content.contraptions.processing.HeaterBlock; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.BlockState; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; @@ -26,7 +27,6 @@ import net.minecraft.item.crafting.Ingredient; import net.minecraft.nbt.CompoundNBT; import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; -import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction.Axis; import net.minecraft.util.NonNullList; @@ -35,6 +35,8 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraftforge.items.IItemHandler; +import static com.simibubi.create.content.contraptions.processing.HeaterBlock.getHeaterLevel; + public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { private static final Object shapelessOrMixingRecipesKey = new Object(); @@ -270,10 +272,9 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { private int getHeatLevelApplied() { if (world == null) return 0; - TileEntity te = world.getTileEntity(pos.down(3)); - if (!(te instanceof HeaterTileEntity)) - return AllTags.AllBlockTags.FAN_HEATERS.matches(world.getBlockState(pos.down(3))) ? 1 : 0; - return ((HeaterTileEntity) te).getHeatLevel(); + BlockState state = world.getBlockState(pos.down(3)); + if (state.has(HeaterBlock.BLAZE_LEVEL)) + return state.get(HeaterBlock.BLAZE_LEVEL); + return AllTags.AllBlockTags.FAN_HEATERS.matches(state) ? 1 : 0; } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterBlock.java index 2e49a92f0..9013dabcf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterBlock.java @@ -13,14 +13,15 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; -import net.minecraft.state.BooleanProperty; import net.minecraft.state.IProperty; +import net.minecraft.state.IntegerProperty; import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; @@ -30,22 +31,22 @@ import net.minecraft.world.World; @ParametersAreNonnullByDefault public class HeaterBlock extends Block implements ITE { - public static IProperty HAS_BLAZE = BooleanProperty.create("has_blaze"); + public static IProperty BLAZE_LEVEL = IntegerProperty.create("blaze_level", 0, 4); public HeaterBlock(Properties properties) { super(properties); - setDefaultState(super.getDefaultState().with(HAS_BLAZE, false)); + setDefaultState(super.getDefaultState().with(BLAZE_LEVEL, 0)); } @Override protected void fillStateContainer(Builder builder) { super.fillStateContainer(builder); - builder.add(HAS_BLAZE); + builder.add(BLAZE_LEVEL); } @Override public boolean hasTileEntity(BlockState state) { - return state.get(HAS_BLAZE); + return state.get(BLAZE_LEVEL) >= 1; } @Nullable @@ -78,10 +79,10 @@ public class HeaterBlock extends Block implements ITE { public BlockState getStateForPlacement(BlockItemUseContext context) { ItemStack item = context.getItem(); BlockState state = super.getStateForPlacement(context); - return (state != null ? state : getDefaultState()).with(HAS_BLAZE, - item.hasTag() && item.getTag() != null && item.getTag() + return (state != null ? state : getDefaultState()).with(BLAZE_LEVEL, + (item.hasTag() && item.getTag() != null && item.getTag() .contains("has_blaze") && item.getTag() - .getBoolean("has_blaze")); + .getBoolean("has_blaze")) ? 1 : 0); } @Override @@ -91,12 +92,15 @@ public class HeaterBlock extends Block implements ITE { @Override public int getLightValue(BlockState state, IBlockReader world, BlockPos pos) { - // System.out.println("light " + pos); - // return 15; - try { - return getTileEntity(world, pos).getHeatLevel() * 4 - 1; - } catch (TileEntityException e) { - return 0; - } + return MathHelper.clamp(state.get(BLAZE_LEVEL) * 4 - 1, 0, 15); + } + + static void setBlazeLevel(@Nullable World world, BlockPos pos, int blazeLevel) { + if (world != null) + world.setBlockState(pos, world.getBlockState(pos).with(BLAZE_LEVEL, blazeLevel)); + } + + public static int getHeaterLevel(BlockState blockState) { + return blockState.has(HeaterBlock.BLAZE_LEVEL) ? blockState.get(HeaterBlock.BLAZE_LEVEL) : 0; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterTileEntity.java index 3c645b56a..e427a52a1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/HeaterTileEntity.java @@ -18,14 +18,12 @@ import net.minecraftforge.common.ForgeHooks; public class HeaterTileEntity extends SmartTileEntity { private int fuelLevel; private int burnTimeRemaining; - private int bufferedHeatLevel; private static final int maxHeatCapacity = 5000; public HeaterTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); fuelLevel = 0; burnTimeRemaining = 0; - bufferedHeatLevel = 1; setLazyTickRate(40); } @@ -89,17 +87,10 @@ public class HeaterTileEntity extends SmartTileEntity { } public int getHeatLevel() { - return bufferedHeatLevel; + return HeaterBlock.getHeaterLevel(getBlockState()); } private void updateHeatLevel() { - int newHeatLevel = 1 + fuelLevel; - if (newHeatLevel != bufferedHeatLevel) { - bufferedHeatLevel = newHeatLevel; - markDirty(); - if (world != null) { - sendData(); - } - } + HeaterBlock.setBlazeLevel(world, pos, 1 + fuelLevel); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java b/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java index 2a26cb3c0..b5abab707 100644 --- a/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java +++ b/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java @@ -7,7 +7,6 @@ import java.util.Optional; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe; -import com.simibubi.create.content.contraptions.processing.HeaterTileEntity; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.config.AllConfigs; @@ -32,7 +31,6 @@ import net.minecraft.particles.RedstoneParticleData; import net.minecraft.tileentity.BlastFurnaceTileEntity; import net.minecraft.tileentity.FurnaceTileEntity; import net.minecraft.tileentity.SmokerTileEntity; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockReader; @@ -41,6 +39,8 @@ import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RecipeWrapper; +import static com.simibubi.create.content.contraptions.processing.HeaterBlock.getHeaterLevel; + public class InWorldProcessing { public static class SplashingInv extends RecipeWrapper { @@ -62,17 +62,12 @@ public class InWorldProcessing { if (fluidState.getFluid() == Fluids.WATER || fluidState.getFluid() == Fluids.FLOWING_WATER) return Type.SPLASHING; if (blockState.getBlock() == Blocks.FIRE - || (blockState.getBlock() == Blocks.CAMPFIRE && blockState.get(CampfireBlock.LIT)) || getHeaterLevel(reader, pos) == 1) + || (blockState.getBlock() == Blocks.CAMPFIRE && blockState.get(CampfireBlock.LIT)) || getHeaterLevel(blockState) == 1) return Type.SMOKING; - if (blockState.getBlock() == Blocks.LAVA || getHeaterLevel(reader, pos) >= 2) + if (blockState.getBlock() == Blocks.LAVA || getHeaterLevel(blockState) >= 2) return Type.BLASTING; return null; } - - private static int getHeaterLevel(IBlockReader reader, BlockPos pos) { - TileEntity te = reader.getTileEntity(pos); - return te instanceof HeaterTileEntity ? ((HeaterTileEntity) te).getHeatLevel() : 0; - } } public static boolean canProcess(ItemEntity entity, Type type) {