Cast with Caution

- Revisited every unchecked TileEntity cast
- Redstone Links can now be toggled with a wrench
- Redstong Links are now portable on contraptions
- Schematicannon no longer inserts held schematics automatically
- Saws no longer accept items when their speed is zero
This commit is contained in:
simibubi 2020-04-05 18:02:46 +02:00
parent f1057bf558
commit 810191aa89
97 changed files with 1254 additions and 932 deletions

View file

@ -1,5 +1,8 @@
package com.simibubi.create; package com.simibubi.create;
import java.util.HashSet;
import java.util.Set;
import com.simibubi.create.foundation.block.IHaveColorHandler; import com.simibubi.create.foundation.block.IHaveColorHandler;
import com.simibubi.create.foundation.block.IHaveCustomBlockItem; import com.simibubi.create.foundation.block.IHaveCustomBlockItem;
import com.simibubi.create.foundation.block.IHaveNoBlockItem; import com.simibubi.create.foundation.block.IHaveNoBlockItem;
@ -45,7 +48,6 @@ import com.simibubi.create.modules.contraptions.redstone.ContactBlock;
import com.simibubi.create.modules.contraptions.relays.advanced.SpeedControllerBlock; import com.simibubi.create.modules.contraptions.relays.advanced.SpeedControllerBlock;
import com.simibubi.create.modules.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock; import com.simibubi.create.modules.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTunnelBlock;
import com.simibubi.create.modules.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.modules.contraptions.relays.elementary.CogWheelBlock;
import com.simibubi.create.modules.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.modules.contraptions.relays.elementary.ShaftBlock;
import com.simibubi.create.modules.contraptions.relays.encased.AdjustablePulleyBlock; import com.simibubi.create.modules.contraptions.relays.encased.AdjustablePulleyBlock;
@ -62,14 +64,15 @@ import com.simibubi.create.modules.curiosities.symmetry.block.TriplePlaneSymmetr
import com.simibubi.create.modules.gardens.CocoaLogBlock; import com.simibubi.create.modules.gardens.CocoaLogBlock;
import com.simibubi.create.modules.logistics.block.RedstoneLinkBlock; import com.simibubi.create.modules.logistics.block.RedstoneLinkBlock;
import com.simibubi.create.modules.logistics.block.StockswitchBlock; import com.simibubi.create.modules.logistics.block.StockswitchBlock;
import com.simibubi.create.modules.logistics.block.belts.BeltObserverBlock; import com.simibubi.create.modules.logistics.block.belts.observer.BeltObserverBlock;
import com.simibubi.create.modules.logistics.block.belts.FunnelBlock; import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelBlock;
import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterBlock; import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterBlock;
import com.simibubi.create.modules.logistics.block.diodes.LatchBlock; import com.simibubi.create.modules.logistics.block.diodes.LatchBlock;
import com.simibubi.create.modules.logistics.block.diodes.PulseRepeaterBlock; import com.simibubi.create.modules.logistics.block.diodes.PulseRepeaterBlock;
import com.simibubi.create.modules.logistics.block.diodes.ToggleLatchBlock; import com.simibubi.create.modules.logistics.block.diodes.ToggleLatchBlock;
import com.simibubi.create.modules.logistics.block.extractor.ExtractorBlock; import com.simibubi.create.modules.logistics.block.extractor.ExtractorBlock;
import com.simibubi.create.modules.logistics.block.extractor.LinkedExtractorBlock; import com.simibubi.create.modules.logistics.block.extractor.LinkedExtractorBlock;
import com.simibubi.create.modules.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.modules.logistics.block.inventories.FlexcrateBlock; import com.simibubi.create.modules.logistics.block.inventories.FlexcrateBlock;
import com.simibubi.create.modules.logistics.block.transposer.LinkedTransposerBlock; import com.simibubi.create.modules.logistics.block.transposer.LinkedTransposerBlock;
import com.simibubi.create.modules.logistics.block.transposer.TransposerBlock; import com.simibubi.create.modules.logistics.block.transposer.TransposerBlock;
@ -107,9 +110,6 @@ import net.minecraftforge.common.ToolType;
import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistry;
import java.util.HashSet;
import java.util.Set;
public enum AllBlocks { public enum AllBlocks {
__SCHEMATICS__(), __SCHEMATICS__(),

View file

@ -55,8 +55,6 @@ public enum AllContainers {
bind(SCHEMATIC_TABLE, SchematicTableScreen::new); bind(SCHEMATIC_TABLE, SchematicTableScreen::new);
bind(SCHEMATICANNON, SchematicannonScreen::new); bind(SCHEMATICANNON, SchematicannonScreen::new);
bind(FLEXCRATE, FlexcrateScreen::new); bind(FLEXCRATE, FlexcrateScreen::new);
// bind(LOGISTICAL_INDEX, LogisticalIndexScreen::new);
// bind(LOGISTICAL_CONTROLLER, LogisticalInventoryControllerScreen::new);
bind(FILTER, FilterScreen::new); bind(FILTER, FilterScreen::new);
bind(ATTRIBUTE_FILTER, AttributeFilterScreen::new); bind(ATTRIBUTE_FILTER, AttributeFilterScreen::new);
} }

View file

@ -16,7 +16,7 @@ import com.simibubi.create.foundation.utility.data.ITaggable;
import com.simibubi.create.modules.IModule; import com.simibubi.create.modules.IModule;
import com.simibubi.create.modules.contraptions.GogglesItem; import com.simibubi.create.modules.contraptions.GogglesItem;
import com.simibubi.create.modules.contraptions.WrenchItem; import com.simibubi.create.modules.contraptions.WrenchItem;
import com.simibubi.create.modules.contraptions.relays.belt.BeltConnectorItem; import com.simibubi.create.modules.contraptions.relays.belt.item.BeltConnectorItem;
import com.simibubi.create.modules.contraptions.relays.gearbox.VerticalGearboxItem; import com.simibubi.create.modules.contraptions.relays.gearbox.VerticalGearboxItem;
import com.simibubi.create.modules.curiosities.ChromaticCompoundCubeItem; import com.simibubi.create.modules.curiosities.ChromaticCompoundCubeItem;
import com.simibubi.create.modules.curiosities.RefinedRadianceItem; import com.simibubi.create.modules.curiosities.RefinedRadianceItem;
@ -42,8 +42,8 @@ import net.minecraft.item.Item;
import net.minecraft.item.Item.Properties; import net.minecraft.item.Item.Properties;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.Rarity; import net.minecraft.item.Rarity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.item.SwordItem; import net.minecraft.item.SwordItem;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.RegistryEvent;

View file

@ -55,8 +55,6 @@ import com.simibubi.create.modules.contraptions.relays.advanced.SpeedControllerT
import com.simibubi.create.modules.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity; import com.simibubi.create.modules.contraptions.relays.advanced.sequencer.SequencedGearshiftTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntityRenderer; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntityRenderer;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTunnelTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTunnelTileEntityRenderer;
import com.simibubi.create.modules.contraptions.relays.elementary.ShaftTileEntity; import com.simibubi.create.modules.contraptions.relays.elementary.ShaftTileEntity;
import com.simibubi.create.modules.contraptions.relays.encased.AdjustablePulleyTileEntity; import com.simibubi.create.modules.contraptions.relays.encased.AdjustablePulleyTileEntity;
import com.simibubi.create.modules.contraptions.relays.encased.ClutchTileEntity; import com.simibubi.create.modules.contraptions.relays.encased.ClutchTileEntity;
@ -73,14 +71,16 @@ import com.simibubi.create.modules.contraptions.relays.gearbox.GearshiftTileEnti
import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity; import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity;
import com.simibubi.create.modules.logistics.block.RedstoneLinkTileEntity; import com.simibubi.create.modules.logistics.block.RedstoneLinkTileEntity;
import com.simibubi.create.modules.logistics.block.StockswitchTileEntity; import com.simibubi.create.modules.logistics.block.StockswitchTileEntity;
import com.simibubi.create.modules.logistics.block.belts.BeltObserverTileEntity; import com.simibubi.create.modules.logistics.block.belts.observer.BeltObserverTileEntity;
import com.simibubi.create.modules.logistics.block.belts.BeltObserverTileEntityRenderer; import com.simibubi.create.modules.logistics.block.belts.observer.BeltObserverTileEntityRenderer;
import com.simibubi.create.modules.logistics.block.belts.FunnelTileEntity; import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelTileEntity;
import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelTileEntityRenderer;
import com.simibubi.create.modules.logistics.block.diodes.FlexPulsepeaterTileEntity; import com.simibubi.create.modules.logistics.block.diodes.FlexPulsepeaterTileEntity;
import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterTileEntity; import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterTileEntity;
import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterTileEntityRenderer; import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterTileEntityRenderer;
import com.simibubi.create.modules.logistics.block.extractor.ExtractorTileEntity; import com.simibubi.create.modules.logistics.block.extractor.ExtractorTileEntity;
import com.simibubi.create.modules.logistics.block.extractor.LinkedExtractorTileEntity; import com.simibubi.create.modules.logistics.block.extractor.LinkedExtractorTileEntity;
import com.simibubi.create.modules.logistics.block.funnel.FunnelTileEntity;
import com.simibubi.create.modules.logistics.block.inventories.FlexcrateTileEntity; import com.simibubi.create.modules.logistics.block.inventories.FlexcrateTileEntity;
import com.simibubi.create.modules.logistics.block.transposer.LinkedTransposerTileEntity; import com.simibubi.create.modules.logistics.block.transposer.LinkedTransposerTileEntity;
import com.simibubi.create.modules.logistics.block.transposer.TransposerTileEntity; import com.simibubi.create.modules.logistics.block.transposer.TransposerTileEntity;

View file

@ -13,7 +13,7 @@ import com.simibubi.create.modules.contraptions.KineticDebugger;
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.modules.contraptions.components.contraptions.ChassisRangeDisplay; import com.simibubi.create.modules.contraptions.components.contraptions.ChassisRangeDisplay;
import com.simibubi.create.modules.contraptions.components.turntable.TurntableHandler; import com.simibubi.create.modules.contraptions.components.turntable.TurntableHandler;
import com.simibubi.create.modules.contraptions.relays.belt.BeltConnectorItemHandler; import com.simibubi.create.modules.contraptions.relays.belt.item.BeltConnectorHandler;
import com.simibubi.create.modules.curiosities.zapper.terrainzapper.TerrainZapperRenderHandler; import com.simibubi.create.modules.curiosities.zapper.terrainzapper.TerrainZapperRenderHandler;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@ -60,7 +60,7 @@ public class ClientEvents {
public static void onGameTick() { public static void onGameTick() {
CreateClient.gameTick(); CreateClient.gameTick();
BeltConnectorItemHandler.gameTick(); BeltConnectorHandler.gameTick();
TerrainZapperRenderHandler.tick(); TerrainZapperRenderHandler.tick();
} }

View file

@ -1,27 +1,10 @@
package com.simibubi.create; package com.simibubi.create;
import java.util.Arrays;
import com.simibubi.create.config.AllConfigs;
import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity;
import net.minecraft.block.BlockState;
import net.minecraft.block.FourWayBlock;
import net.minecraft.block.WallBlock;
import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack;
import net.minecraft.state.BooleanProperty;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.Tags;
import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.Phase;
import net.minecraftforge.event.TickEvent.ServerTickEvent; import net.minecraftforge.event.TickEvent.ServerTickEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock;
import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.Event.Result;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@ -59,60 +42,4 @@ public class Events {
Create.torquePropagator.onUnloadWorld(world); Create.torquePropagator.onUnloadWorld(world);
} }
@SubscribeEvent
public static void onRightClickBlock(RightClickBlock event) {
if (event.getUseItem() == Result.DENY)
return;
if (event.getEntityLiving().isSneaking())
return;
if (!event.getPlayer().isAllowEdit())
return;
if (!AllConfigs.SERVER.curiosities.allowGlassPanesInPartialBlocks.get())
return;
ItemStack stack = event.getItemStack();
if (stack.isEmpty())
return;
if (!(stack.getItem() instanceof BlockItem))
return;
BlockItem item = (BlockItem) stack.getItem();
if (!item.isIn(Tags.Items.GLASS_PANES)
&& (item.getBlock() == null || !item.getBlock().isIn(Tags.Blocks.GLASS_PANES)))
return;
BlockPos pos = event.getPos();
World world = event.getWorld();
BlockState blockState = world.getBlockState(pos);
if (!AllBlockTags.WINDOWABLE.matches(blockState))
return;
if (AllBlocks.WINDOW_IN_A_BLOCK.typeOf(blockState))
return;
BlockState defaultState = AllBlocks.WINDOW_IN_A_BLOCK.get().getDefaultState();
world.setBlockState(pos, defaultState);
TileEntity te = world.getTileEntity(pos);
if (te != null && te instanceof WindowInABlockTileEntity) {
WindowInABlockTileEntity wte = (WindowInABlockTileEntity) te;
wte.setWindowBlock(item.getBlock().getDefaultState());
wte.updateWindowConnections();
if (blockState.getBlock() instanceof FourWayBlock) {
for (BooleanProperty side : Arrays.asList(FourWayBlock.EAST, FourWayBlock.NORTH, FourWayBlock.SOUTH,
FourWayBlock.WEST))
blockState = blockState.with(side, false);
}
if (blockState.getBlock() instanceof WallBlock)
blockState = blockState.with(WallBlock.UP, true);
wte.setPartialBlock(blockState);
wte.requestModelDataUpdate();
if (!event.getPlayer().isCreative())
stack.shrink(1);
event.getPlayer().swingArm(event.getHand());
}
event.setCanceled(true);
}
} }

View file

@ -3,6 +3,7 @@ package com.simibubi.create.config;
public class CCommon extends ConfigBase { public class CCommon extends ConfigBase {
public CWorldGen worldGen = nested(0, CWorldGen::new, Comments.worldGen); public CWorldGen worldGen = nested(0, CWorldGen::new, Comments.worldGen);
public ConfigBool logTeErrors = b(false, "logTeErrors", Comments.logTeErrors);
@Override @Override
public String getName() { public String getName() {
@ -11,6 +12,7 @@ public class CCommon extends ConfigBase {
private static class Comments { private static class Comments {
static String worldGen = "Modify Create's impact on your terrain"; static String worldGen = "Modify Create's impact on your terrain";
static String logTeErrors = "Forward caught TileEntityExceptions to the log at debug level.";
} }
} }

View file

@ -0,0 +1,100 @@
package com.simibubi.create.foundation.block;
import java.util.function.Consumer;
import com.simibubi.create.Create;
import com.simibubi.create.config.AllConfigs;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.dimension.Dimension;
import net.minecraft.world.dimension.DimensionType;
public interface ITE<T extends TileEntity> {
Class<T> getTileEntityClass();
default void withTileEntityDo(IBlockReader world, BlockPos pos, Consumer<T> action) {
try {
action.accept(getTileEntity(world, pos));
} catch (TileEntityException e) {}
}
@SuppressWarnings("unchecked")
default T getTileEntity(IBlockReader worldIn, BlockPos pos) throws TileEntityException {
TileEntity tileEntity = worldIn.getTileEntity(pos);
Class<T> expectedClass = getTileEntityClass();
IWorld world = null;
if (worldIn instanceof IWorld)
world = (IWorld) worldIn;
if (tileEntity == null)
throw new MissingTileEntityException(world, pos, expectedClass);
if (!expectedClass.isInstance(tileEntity))
throw new InvalidTileEntityException(world, pos, expectedClass, tileEntity.getClass());
return (T) tileEntity;
}
static class TileEntityException extends Throwable {
private static final long serialVersionUID = 1L;
public TileEntityException(IWorld world, BlockPos pos, Class<?> teClass) {
super(makeBaseMessage(world, pos, teClass));
}
public TileEntityException(String message) {
super(message);
report(this);
}
static String makeBaseMessage(IWorld world, BlockPos pos, Class<?> expectedTeClass) {
return String.format("[%s] @(%d, %d, %d), expecting a %s", getDimensionName(world), pos.getX(), pos.getY(),
pos.getZ(), expectedTeClass.getSimpleName());
}
static String getDimensionName(IWorld world) {
String notAvailable = "Dim N/A";
if (world == null)
return notAvailable;
Dimension dimension = world.getDimension();
if (dimension == null)
return notAvailable;
DimensionType type = dimension.getType();
if (type == null)
return notAvailable;
ResourceLocation registryName = type.getRegistryName();
if (registryName == null)
return notAvailable;
return registryName.toString();
}
}
static class MissingTileEntityException extends TileEntityException {
private static final long serialVersionUID = 1L;
public MissingTileEntityException(IWorld world, BlockPos pos, Class<?> teClass) {
super("Missing TileEntity: " + makeBaseMessage(world, pos, teClass));
}
}
static class InvalidTileEntityException extends TileEntityException {
private static final long serialVersionUID = 1L;
public InvalidTileEntityException(IWorld world, BlockPos pos, Class<?> expectedTeClass, Class<?> foundTeClass) {
super("Wrong TileEntity: " + makeBaseMessage(world, pos, expectedTeClass) + ", found "
+ foundTeClass.getSimpleName());
}
}
static void report(TileEntityException e) {
if (AllConfigs.COMMON.logTeErrors.get())
Create.logger.debug("TileEntityException thrown!", e);
}
}

View file

@ -7,13 +7,15 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.fml.network.NetworkHooks;
public interface IWithContainerTileEntity<T extends TileEntity & IWithContainer<T, ?>> extends IWithTileEntity<T> { public interface IWithContainerTileEntity<T extends TileEntity & IWithContainer<T, ?>> extends ITE<T> {
default void open(IWorld world, BlockPos pos, PlayerEntity player) { default void open(IWorld world, BlockPos pos, PlayerEntity player) {
T te = getTileEntity(world, pos); if (world.isRemote())
if (te == null || world.isRemote())
return; return;
try {
T te = getTileEntity(world, pos);
NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer); NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer);
} catch (TileEntityException e) {}
} }
} }

View file

@ -1,27 +0,0 @@
package com.simibubi.create.foundation.block;
import java.util.function.Consumer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader;
public interface IWithTileEntity<T extends TileEntity> {
default void withTileEntityDo(IBlockReader world, BlockPos pos, Consumer<T> action) {
@SuppressWarnings("unchecked")
T te = (T) world.getTileEntity(pos);
if (te == null)
return;
action.accept(te);
}
default T getTileEntity(IBlockReader world, BlockPos pos) {
@SuppressWarnings("unchecked")
T te = (T) world.getTileEntity(pos);
if (te == null)
return null;
return te;
}
}

View file

@ -12,15 +12,23 @@ import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.config.AllConfigs; import com.simibubi.create.config.AllConfigs;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.NonNullList; import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
public class ItemHelper { public class ItemHelper {
public static void dropContents(World world, BlockPos pos, IItemHandler inv) {
for (int slot = 0; slot < inv.getSlots(); slot++)
InventoryHelper.spawnItemStack(world, pos.getX(), pos.getY(), pos.getZ(), inv.getStackInSlot(slot));
}
public static List<ItemStack> multipliedOutput(ItemStack in, ItemStack out) { public static List<ItemStack> multipliedOutput(ItemStack in, ItemStack out) {
List<ItemStack> stacks = new ArrayList<>(); List<ItemStack> stacks = new ArrayList<>();
ItemStack result = out.copy(); ItemStack result = out.copy();

View file

@ -15,8 +15,8 @@ import com.simibubi.create.modules.IModule;
import com.simibubi.create.modules.contraptions.base.IRotate; import com.simibubi.create.modules.contraptions.base.IRotate;
import com.simibubi.create.modules.contraptions.components.flywheel.engine.EngineBlock; import com.simibubi.create.modules.contraptions.components.flywheel.engine.EngineBlock;
import com.simibubi.create.modules.curiosities.tools.AllToolTiers; import com.simibubi.create.modules.curiosities.tools.AllToolTiers;
import com.simibubi.create.modules.curiosities.tools.SandPaperItem; import com.simibubi.create.modules.curiosities.tools.SandPaperItem;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;

View file

@ -1,7 +1,11 @@
package com.simibubi.create.foundation.utility; package com.simibubi.create.foundation.utility;
import java.util.Arrays;
import java.util.List;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
public class Iterate { public class Iterate {
@ -18,4 +22,9 @@ public class Iterate {
return directions; return directions;
} }
public static List<BlockPos> hereAndBelow(BlockPos pos) {
return Arrays.asList(pos, pos.down());
}
} }

View file

@ -1,6 +1,11 @@
package com.simibubi.create.foundation.utility.data; package com.simibubi.create.foundation.utility.data;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.data.BlockTagsProvider; import net.minecraft.data.BlockTagsProvider;
import net.minecraft.data.DataGenerator; import net.minecraft.data.DataGenerator;
@ -8,10 +13,6 @@ import net.minecraft.tags.BlockTags;
import net.minecraft.tags.Tag; import net.minecraft.tags.Tag;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class AllBlocksTagProvider extends BlockTagsProvider { public class AllBlocksTagProvider extends BlockTagsProvider {
static Map<ResourceLocation, BlockTags.Wrapper> createdTags; static Map<ResourceLocation, BlockTags.Wrapper> createdTags;

View file

@ -1,7 +1,14 @@
package com.simibubi.create.modules.contraptions; package com.simibubi.create.modules.contraptions;
import com.simibubi.create.foundation.utility.VoxelShaper; import com.simibubi.create.foundation.utility.VoxelShaper;
import com.simibubi.create.modules.contraptions.base.*; import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock;
import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock;
import com.simibubi.create.modules.contraptions.base.GeneratingKineticTileEntity;
import com.simibubi.create.modules.contraptions.base.HorizontalAxisKineticBlock;
import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.item.ItemUseContext; import net.minecraft.item.ItemUseContext;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;

View file

@ -60,7 +60,7 @@ public class KineticDebugger {
BlockRayTraceResult ray = (BlockRayTraceResult) obj; BlockRayTraceResult ray = (BlockRayTraceResult) obj;
TileEntity te = world.getTileEntity(ray.getPos()); TileEntity te = world.getTileEntity(ray.getPos());
if (te == null || !(te instanceof KineticTileEntity)) if (!(te instanceof KineticTileEntity))
return null; return null;
return (KineticTileEntity) te; return (KineticTileEntity) te;

View file

@ -327,7 +327,10 @@ public class RotationPropagator {
while (!frontier.isEmpty()) { while (!frontier.isEmpty()) {
final BlockPos pos = frontier.remove(0); final BlockPos pos = frontier.remove(0);
final KineticTileEntity currentTE = (KineticTileEntity) world.getTileEntity(pos); TileEntity tileEntity = world.getTileEntity(pos);
if (!(tileEntity instanceof KineticTileEntity))
continue;
final KineticTileEntity currentTE = (KineticTileEntity) tileEntity;
currentTE.removeSource(); currentTE.removeSource();
currentTE.sendData(); currentTE.sendData();

View file

@ -7,6 +7,7 @@ import com.simibubi.create.modules.contraptions.KineticNetwork;
import com.simibubi.create.modules.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.modules.contraptions.base.IRotate.SpeedLevel;
import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation; import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
@ -33,7 +34,10 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity {
@Override @Override
public void setSource(BlockPos source) { public void setSource(BlockPos source) {
super.setSource(source); super.setSource(source);
KineticTileEntity sourceTe = (KineticTileEntity) world.getTileEntity(source); TileEntity tileEntity = world.getTileEntity(source);
if (!(tileEntity instanceof KineticTileEntity))
return;
KineticTileEntity sourceTe = (KineticTileEntity) tileEntity;
if (reActivateSource && sourceTe != null && Math.abs(sourceTe.getSpeed()) >= Math.abs(getGeneratedSpeed())) if (reActivateSource && sourceTe != null && Math.abs(sourceTe.getSpeed()) >= Math.abs(getGeneratedSpeed()))
reActivateSource = false; reActivateSource = false;
} }

View file

@ -79,30 +79,19 @@ public abstract class KineticBlock extends Block implements IRotate {
@Override @Override
public abstract TileEntity createTileEntity(BlockState state, IBlockReader world); public abstract TileEntity createTileEntity(BlockState state, IBlockReader world);
@Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
if (isMoving) {
KineticTileEntity tileEntity = (KineticTileEntity) worldIn.getTileEntity(pos);
if (tileEntity == null)
return;
if (worldIn.isRemote())
return;
tileEntity.network = null;
tileEntity.source = null;
tileEntity.speed = 0;
}
}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override @Override
public void updateNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags) { public void updateNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags) {
super.updateNeighbors(stateIn, worldIn, pos, flags); super.updateNeighbors(stateIn, worldIn, pos, flags);
KineticTileEntity tileEntity = (KineticTileEntity) worldIn.getTileEntity(pos);
if (tileEntity == null)
return;
if (worldIn.isRemote()) if (worldIn.isRemote())
return; return;
RotationPropagator.handleAdded(worldIn.getWorld(), pos, tileEntity);
TileEntity tileEntity = worldIn.getTileEntity(pos);
if (!(tileEntity instanceof KineticTileEntity))
return;
KineticTileEntity kte = (KineticTileEntity) tileEntity;
RotationPropagator.handleAdded(worldIn.getWorld(), pos, kte);
} }
@Override @Override
@ -119,12 +108,13 @@ public abstract class KineticBlock extends Block implements IRotate {
@Override @Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { public void onBlockPlacedBy(World worldIn, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) {
TileEntity tileEntity = worldIn.getTileEntity(pos);
if (tileEntity == null || !(tileEntity instanceof KineticTileEntity))
return;
if (worldIn.isRemote) if (worldIn.isRemote)
return; return;
TileEntity tileEntity = worldIn.getTileEntity(pos);
if (!(tileEntity instanceof KineticTileEntity))
return;
KineticTileEntity kte = (KineticTileEntity) tileEntity; KineticTileEntity kte = (KineticTileEntity) tileEntity;
kte.effects.queueRotationIndicators(); kte.effects.queueRotationIndicators();
} }

View file

@ -104,7 +104,9 @@ public abstract class KineticTileEntity extends SmartTileEntity
if (!world.isBlockPresent(source)) if (!world.isBlockPresent(source))
return; return;
KineticTileEntity sourceTe = (KineticTileEntity) world.getTileEntity(source); TileEntity tileEntity = world.getTileEntity(source);
KineticTileEntity sourceTe =
tileEntity instanceof KineticTileEntity ? (KineticTileEntity) tileEntity : null;
if (sourceTe == null || sourceTe.speed == 0) { if (sourceTe == null || sourceTe.speed == 0) {
removeSource(); removeSource();
detachKinetics(); detachKinetics();
@ -266,12 +268,13 @@ public abstract class KineticTileEntity extends SmartTileEntity
if (world == null || world.isRemote) if (world == null || world.isRemote)
return; return;
KineticTileEntity sourceTe = (KineticTileEntity) world.getTileEntity(source); TileEntity tileEntity = world.getTileEntity(source);
if (sourceTe == null) { if (!(tileEntity instanceof KineticTileEntity)) {
removeSource(); removeSource();
return; return;
} }
KineticTileEntity sourceTe = (KineticTileEntity) tileEntity;
setNetwork(sourceTe.network); setNetwork(sourceTe.network);
} }
@ -336,9 +339,11 @@ public abstract class KineticTileEntity extends SmartTileEntity
public static void switchToBlockState(World world, BlockPos pos, BlockState state) { public static void switchToBlockState(World world, BlockPos pos, BlockState state) {
if (world.isRemote) if (world.isRemote)
return; return;
TileEntity tileEntityIn = world.getTileEntity(pos); TileEntity tileEntityIn = world.getTileEntity(pos);
if (!(tileEntityIn instanceof KineticTileEntity)) if (!(tileEntityIn instanceof KineticTileEntity))
return; return;
KineticTileEntity tileEntity = (KineticTileEntity) tileEntityIn; KineticTileEntity tileEntity = (KineticTileEntity) tileEntityIn;
if (tileEntity.hasNetwork()) if (tileEntity.hasNetwork())
tileEntity.getOrCreateNetwork().remove(tileEntity); tileEntity.getOrCreateNetwork().remove(tileEntity);

View file

@ -1,6 +1,6 @@
package com.simibubi.create.modules.contraptions.components.actors; package com.simibubi.create.modules.contraptions.components.actors;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock;
import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock; import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock;
@ -25,7 +25,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class DrillBlock extends DirectionalKineticBlock implements IPortableBlock, IWithTileEntity<DrillTileEntity> { public class DrillBlock extends DirectionalKineticBlock implements IPortableBlock, ITE<DrillTileEntity> {
public static MovementBehaviour MOVEMENT = new DrillMovementBehaviour(); public static MovementBehaviour MOVEMENT = new DrillMovementBehaviour();
public static DamageSource damageSourceDrill = new DamageSource("create.drill").setDamageBypassesArmor(); public static DamageSource damageSourceDrill = new DamageSource("create.drill").setDamageBypassesArmor();
@ -93,4 +93,9 @@ public class DrillBlock extends DirectionalKineticBlock implements IPortableBloc
return MOVEMENT; return MOVEMENT;
} }
@Override
public Class<DrillTileEntity> getTileEntityClass() {
return DrillTileEntity.class;
}
} }

View file

@ -4,9 +4,9 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.modules.contraptions.components.actors.HarvesterBlock; import com.simibubi.create.modules.contraptions.components.actors.HarvesterBlock;
import com.simibubi.create.modules.contraptions.components.actors.PortableStorageInterfaceBlock; import com.simibubi.create.modules.contraptions.components.actors.PortableStorageInterfaceBlock;
import com.simibubi.create.modules.contraptions.components.contraptions.chassis.AbstractChassisBlock; import com.simibubi.create.modules.contraptions.components.contraptions.chassis.AbstractChassisBlock;
import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.modules.logistics.block.belts.FunnelBlock;
import com.simibubi.create.modules.logistics.block.extractor.ExtractorBlock; import com.simibubi.create.modules.logistics.block.extractor.ExtractorBlock;
import com.simibubi.create.modules.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.modules.logistics.block.transposer.TransposerBlock; import com.simibubi.create.modules.logistics.block.transposer.TransposerBlock;
import net.minecraft.block.AbstractPressurePlateBlock; import net.minecraft.block.AbstractPressurePlateBlock;

View file

@ -1,6 +1,7 @@
package com.simibubi.create.modules.contraptions.components.contraptions.bearing; package com.simibubi.create.modules.contraptions.components.contraptions.bearing;
import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;

View file

@ -1,6 +1,6 @@
package com.simibubi.create.modules.contraptions.components.contraptions.bearing; package com.simibubi.create.modules.contraptions.components.contraptions.bearing;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
@ -11,7 +11,7 @@ import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class ClockworkBearingBlock extends BearingBlock implements IWithTileEntity<ClockworkBearingTileEntity> { public class ClockworkBearingBlock extends BearingBlock implements ITE<ClockworkBearingTileEntity> {
@Override @Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) { public TileEntity createTileEntity(BlockState state, IBlockReader world) {
@ -40,4 +40,9 @@ public class ClockworkBearingBlock extends BearingBlock implements IWithTileEnti
return false; return false;
} }
@Override
public Class<ClockworkBearingTileEntity> getTileEntityClass() {
return ClockworkBearingTileEntity.class;
}
} }

View file

@ -1,6 +1,6 @@
package com.simibubi.create.modules.contraptions.components.contraptions.bearing; package com.simibubi.create.modules.contraptions.components.contraptions.bearing;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -12,7 +12,7 @@ import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class MechanicalBearingBlock extends BearingBlock implements IWithTileEntity<MechanicalBearingTileEntity> { public class MechanicalBearingBlock extends BearingBlock implements ITE<MechanicalBearingTileEntity> {
@Override @Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) { public TileEntity createTileEntity(BlockState state, IBlockReader world) {
@ -55,4 +55,9 @@ public class MechanicalBearingBlock extends BearingBlock implements IWithTileEnt
withTileEntityDo(worldIn, pos, MechanicalBearingTileEntity::neighbourChanged); withTileEntityDo(worldIn, pos, MechanicalBearingTileEntity::neighbourChanged);
} }
@Override
public Class<MechanicalBearingTileEntity> getTileEntityClass() {
return MechanicalBearingTileEntity.class;
}
} }

View file

@ -3,10 +3,11 @@ package com.simibubi.create.modules.contraptions.components.contraptions.piston;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.config.AllConfigs; import com.simibubi.create.config.AllConfigs;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
@ -17,7 +18,11 @@ import net.minecraft.state.EnumProperty;
import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.*; import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
@ -29,7 +34,7 @@ import net.minecraft.world.World;
import net.minecraftforge.common.Tags; import net.minecraftforge.common.Tags;
public class MechanicalPistonBlock extends DirectionalAxisKineticBlock public class MechanicalPistonBlock extends DirectionalAxisKineticBlock
implements IWithTileEntity<MechanicalPistonTileEntity> { implements ITE<MechanicalPistonTileEntity> {
public static final EnumProperty<PistonState> STATE = EnumProperty.create("state", PistonState.class); public static final EnumProperty<PistonState> STATE = EnumProperty.create("state", PistonState.class);
protected boolean isSticky; protected boolean isSticky;
@ -166,4 +171,9 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock
return VoxelShapes.fullCube(); return VoxelShapes.fullCube();
} }
@Override
public Class<MechanicalPistonTileEntity> getTileEntityClass() {
return MechanicalPistonTileEntity.class;
}
} }

View file

@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.contraptions.pulley;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IHaveNoBlockItem; import com.simibubi.create.foundation.block.IHaveNoBlockItem;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.modules.contraptions.base.HorizontalAxisKineticBlock; import com.simibubi.create.modules.contraptions.base.HorizontalAxisKineticBlock;
@ -23,7 +23,7 @@ import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class PulleyBlock extends HorizontalAxisKineticBlock implements IWithTileEntity<PulleyTileEntity> { public class PulleyBlock extends HorizontalAxisKineticBlock implements ITE<PulleyTileEntity> {
public static EnumProperty<Axis> HORIZONTAL_AXIS = BlockStateProperties.HORIZONTAL_AXIS; public static EnumProperty<Axis> HORIZONTAL_AXIS = BlockStateProperties.HORIZONTAL_AXIS;
@ -130,4 +130,9 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements IWithTile
} }
@Override
public Class<PulleyTileEntity> getTileEntityClass() {
return PulleyTileEntity.class;
}
} }

View file

@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.crafter;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour;
import com.simibubi.create.foundation.block.connected.IHaveConnectedTextures; import com.simibubi.create.foundation.block.connected.IHaveConnectedTextures;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
@ -42,7 +42,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
public class MechanicalCrafterBlock extends HorizontalKineticBlock public class MechanicalCrafterBlock extends HorizontalKineticBlock
implements IWithTileEntity<MechanicalCrafterTileEntity>, IHaveConnectedTextures { implements ITE<MechanicalCrafterTileEntity>, IHaveConnectedTextures {
public static final EnumProperty<Pointing> POINTING = EnumProperty.create("pointing", Pointing.class); public static final EnumProperty<Pointing> POINTING = EnumProperty.create("pointing", Pointing.class);
@ -291,4 +291,9 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock
return new InputCTBehaviour(); return new InputCTBehaviour();
} }
@Override
public Class<MechanicalCrafterTileEntity> getTileEntityClass() {
return MechanicalCrafterTileEntity.class;
}
} }

View file

@ -309,7 +309,7 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
if (!AllBlocks.BELT.typeOf(world.getBlockState(targetPos))) if (!AllBlocks.BELT.typeOf(world.getBlockState(targetPos)))
return false; return false;
TileEntity te = world.getTileEntity(targetPos); TileEntity te = world.getTileEntity(targetPos);
if (te == null || !(te instanceof BeltTileEntity)) if (!(te instanceof BeltTileEntity))
return false; return false;
return ((KineticTileEntity) te).getSpeed() != 0; return ((KineticTileEntity) te).getSpeed() != 0;
} }

View file

@ -1,7 +1,7 @@
package com.simibubi.create.modules.contraptions.components.crank; package com.simibubi.create.modules.contraptions.components.crank;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock;
@ -21,7 +21,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class HandCrankBlock extends DirectionalKineticBlock implements IWithTileEntity<HandCrankTileEntity> { public class HandCrankBlock extends DirectionalKineticBlock implements ITE<HandCrankTileEntity> {
public HandCrankBlock() { public HandCrankBlock() {
super(Properties.from(AllBlocks.COGWHEEL.get())); super(Properties.from(AllBlocks.COGWHEEL.get()));
@ -95,4 +95,9 @@ public class HandCrankBlock extends DirectionalKineticBlock implements IWithTile
return state.get(FACING).getAxis(); return state.get(FACING).getAxis();
} }
@Override
public Class<HandCrankTileEntity> getTileEntityClass() {
return HandCrankTileEntity.class;
}
} }

View file

@ -3,8 +3,8 @@ package com.simibubi.create.modules.contraptions.components.crusher;
import static com.simibubi.create.modules.contraptions.components.crusher.CrushingWheelControllerBlock.VALID; import static com.simibubi.create.modules.contraptions.components.crusher.CrushingWheelControllerBlock.VALID;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock; import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -21,7 +21,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class CrushingWheelBlock extends RotatedPillarKineticBlock { public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE<CrushingWheelTileEntity> {
public CrushingWheelBlock() { public CrushingWheelBlock() {
super(Properties.from(Blocks.DIORITE)); super(Properties.from(Blocks.DIORITE));
@ -75,8 +75,11 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
BlockState otherState = world.getBlockState(otherWheelPos); BlockState otherState = world.getBlockState(otherWheelPos);
if (AllBlocks.CRUSHING_WHEEL.typeOf(otherState)) { if (AllBlocks.CRUSHING_WHEEL.typeOf(otherState)) {
controllerShouldExist = true; controllerShouldExist = true;
KineticTileEntity te = (KineticTileEntity) world.getTileEntity(pos);
KineticTileEntity otherTe = (KineticTileEntity) world.getTileEntity(otherWheelPos); try {
CrushingWheelTileEntity te = getTileEntity(world, pos);
CrushingWheelTileEntity otherTe = getTileEntity(world, otherWheelPos);
if (te != null && otherTe != null && (te.getSpeed() > 0) != (otherTe.getSpeed() > 0) if (te != null && otherTe != null && (te.getSpeed() > 0) != (otherTe.getSpeed() > 0)
&& te.getSpeed() != 0) { && te.getSpeed() != 0) {
float signum = Math.signum(te.getSpeed()) * (state.get(AXIS) == Axis.X ? -1 : 1); float signum = Math.signum(te.getSpeed()) * (state.get(AXIS) == Axis.X ? -1 : 1);
@ -84,6 +87,10 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
} }
if (otherState.get(AXIS) != state.get(AXIS)) if (otherState.get(AXIS) != state.get(AXIS))
controllerShouldExist = false; controllerShouldExist = false;
} catch (TileEntityException e) {
controllerShouldExist = false;
}
} }
if (!controllerShouldExist) { if (!controllerShouldExist) {
@ -108,9 +115,8 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
@Override @Override
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) {
KineticTileEntity te = (KineticTileEntity) worldIn.getTileEntity(pos); try {
if (te == null) CrushingWheelTileEntity te = getTileEntity(worldIn, pos);
return;
if (entityIn.posY < pos.getY() + 1.25f || !entityIn.onGround) if (entityIn.posY < pos.getY() + 1.25f || !entityIn.onGround)
return; return;
@ -126,6 +132,8 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
z += (pos.getZ() + .5f - entityIn.posZ) * .1f; z += (pos.getZ() + .5f - entityIn.posZ) * .1f;
} }
entityIn.setMotion(entityIn.getMotion().add(x, 0, z)); entityIn.setMotion(entityIn.getMotion().add(x, 0, z));
} catch (TileEntityException e) {}
} }
@Override @Override
@ -170,4 +178,9 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
return 1f; return 1f;
} }
@Override
public Class<CrushingWheelTileEntity> getTileEntityClass() {
return CrushingWheelTileEntity.class;
}
} }

View file

@ -4,6 +4,8 @@ import java.util.Random;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IHaveNoBlockItem; import com.simibubi.create.foundation.block.IHaveNoBlockItem;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -12,7 +14,6 @@ import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.NBTUtil; import net.minecraft.nbt.NBTUtil;
@ -33,7 +34,8 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockItem { public class CrushingWheelControllerBlock extends Block
implements IHaveNoBlockItem, ITE<CrushingWheelControllerTileEntity> {
public static final BooleanProperty VALID = BooleanProperty.create("valid"); public static final BooleanProperty VALID = BooleanProperty.create("valid");
@ -65,11 +67,10 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) {
if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen()) if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen())
return; return;
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn.getTileEntity(pos); withTileEntityDo(worldIn, pos, te -> {
if (te == null)
return;
if (te.processingEntity == entityIn) if (te.processingEntity == entityIn)
entityIn.setMotionMultiplier(state, new Vec3d(0.25D, (double) 0.05F, 0.25D)); entityIn.setMotionMultiplier(state, new Vec3d(0.25D, (double) 0.05F, 0.25D));
});
} }
@Override @Override
@ -77,12 +78,9 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
super.onLanded(worldIn, entityIn); super.onLanded(worldIn, entityIn);
if (CrushingWheelControllerTileEntity.isFrozen()) if (CrushingWheelControllerTileEntity.isFrozen())
return; return;
TileEntity tileEntity = worldIn.getTileEntity(entityIn.getPosition().down());
if (tileEntity == null) try {
return; CrushingWheelControllerTileEntity te = getTileEntity(worldIn, entityIn.getPosition().down());
if (!(tileEntity instanceof CrushingWheelControllerTileEntity))
return;
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) tileEntity;
if (te.crushingspeed == 0) if (te.crushingspeed == 0)
return; return;
if (entityIn instanceof ItemEntity) if (entityIn instanceof ItemEntity)
@ -96,6 +94,7 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
return; return;
te.startCrushing(entityIn); te.startCrushing(entityIn);
} catch (TileEntityException e) {}
} }
@Override @Override
@ -118,11 +117,7 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
} }
public void updateSpeed(BlockState state, World world, BlockPos pos) { public void updateSpeed(BlockState state, World world, BlockPos pos) {
TileEntity tileEntity = world.getTileEntity(pos); withTileEntityDo(world, pos, te -> {
if (tileEntity == null || !(tileEntity instanceof CrushingWheelControllerTileEntity))
return;
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) tileEntity;
if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen()) { if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen()) {
if (te.crushingspeed != 0) { if (te.crushingspeed != 0) {
te.crushingspeed = 0; te.crushingspeed = 0;
@ -144,6 +139,7 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
te.sendData(); te.sendData();
break; break;
} }
});
} }
@Override @Override
@ -165,29 +161,27 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
if (new AxisAlignedBB(pos).contains(entity.getPositionVec())) if (new AxisAlignedBB(pos).contains(entity.getPositionVec()))
return VoxelShapes.empty(); return VoxelShapes.empty();
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn.getTileEntity(pos); try {
if (te == null) CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos);
return VoxelShapes.fullCube();
if (te.processingEntity == entity) if (te.processingEntity == entity)
return VoxelShapes.empty(); return VoxelShapes.empty();
} catch (TileEntityException e) {}
} }
return VoxelShapes.fullCube(); return VoxelShapes.fullCube();
} }
@Override @Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { if (!state.hasTileEntity() || state.getBlock() == newState.getBlock())
if (worldIn.getTileEntity(pos) == null)
return; return;
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn.getTileEntity(pos);
for (int slot = 0; slot < te.inventory.getSlots(); slot++) {
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(),
te.inventory.getStackInSlot(slot));
}
withTileEntityDo(worldIn, pos, te -> ItemHelper.dropContents(worldIn, pos, te.inventory));
worldIn.removeTileEntity(pos); worldIn.removeTileEntity(pos);
} }
@Override
public Class<CrushingWheelControllerTileEntity> getTileEntityClass() {
return CrushingWheelControllerTileEntity.class;
} }
} }

View file

@ -3,7 +3,7 @@ package com.simibubi.create.modules.contraptions.components.deployer;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour;
import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock;
import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock; import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock;
@ -26,7 +26,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class DeployerBlock extends DirectionalAxisKineticBlock public class DeployerBlock extends DirectionalAxisKineticBlock
implements IWithTileEntity<DeployerTileEntity>, IPortableBlock { implements ITE<DeployerTileEntity>, IPortableBlock {
public static MovementBehaviour MOVEMENT = new DeployerMovementBehaviour(); public static MovementBehaviour MOVEMENT = new DeployerMovementBehaviour();
@ -111,4 +111,9 @@ public class DeployerBlock extends DirectionalAxisKineticBlock
return MOVEMENT; return MOVEMENT;
} }
@Override
public Class<DeployerTileEntity> getTileEntityClass() {
return DeployerTileEntity.class;
}
} }

View file

@ -9,6 +9,7 @@ import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.config.AllConfigs; import com.simibubi.create.config.AllConfigs;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.particle.AirFlowParticleData; import com.simibubi.create.modules.contraptions.particle.AirFlowParticleData;
import com.simibubi.create.modules.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.logistics.InWorldProcessing; import com.simibubi.create.modules.logistics.InWorldProcessing;
import com.simibubi.create.modules.logistics.InWorldProcessing.Type; import com.simibubi.create.modules.logistics.InWorldProcessing.Type;
@ -267,15 +268,16 @@ public class AirCurrent {
public void tickBelts() { public void tickBelts() {
for (Pair<BeltTileEntity, Type> pair : affectedBelts) { for (Pair<BeltTileEntity, Type> pair : affectedBelts) {
BeltTileEntity belt = pair.getKey(); BeltTileEntity belt = pair.getKey();
World world = belt.getWorld();
InWorldProcessing.Type processingType = pair.getRight(); InWorldProcessing.Type processingType = pair.getRight();
BeltTileEntity controller = belt.getControllerTE(); BeltTileEntity controller = belt.getControllerTE();
if (controller == null) if (controller == null)
continue; continue;
World world = belt.getWorld();
controller.getInventory().forEachWithin(belt.index + .5f, .51f, (transported) -> { controller.getInventory().forEachWithin(belt.index + .5f, .51f, (transported) -> {
InWorldProcessing.spawnParticlesForProcessing(world, InWorldProcessing.spawnParticlesForProcessing(world,
controller.getInventory().getVectorForOffset(transported.beltPosition), processingType); BeltHelper.getVectorForOffset(controller, transported.beltPosition), processingType);
if (world.isRemote) if (world.isRemote)
return null; return null;
return InWorldProcessing.applyProcessing(transported, belt, processingType); return InWorldProcessing.applyProcessing(transported, belt, processingType);

View file

@ -1,7 +1,8 @@
package com.simibubi.create.modules.contraptions.components.fan; package com.simibubi.create.modules.contraptions.components.fan;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.modules.contraptions.base.DirectionalKineticBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
@ -17,7 +18,7 @@ import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class EncasedFanBlock extends DirectionalKineticBlock implements IWithTileEntity<EncasedFanTileEntity> { public class EncasedFanBlock extends DirectionalKineticBlock implements ITE<EncasedFanTileEntity> {
public EncasedFanBlock() { public EncasedFanBlock() {
super(Properties.from(Blocks.ANDESITE)); super(Properties.from(Blocks.ANDESITE));
@ -90,4 +91,9 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements IWithTil
return true; return true;
} }
@Override
public Class<EncasedFanTileEntity> getTileEntityClass() {
return EncasedFanTileEntity.class;
}
} }

View file

@ -5,6 +5,7 @@ import com.simibubi.create.AllTileEntities;
import com.simibubi.create.config.AllConfigs; import com.simibubi.create.config.AllConfigs;
import com.simibubi.create.config.CKinetics; import com.simibubi.create.config.CKinetics;
import com.simibubi.create.modules.contraptions.base.GeneratingKineticTileEntity; import com.simibubi.create.modules.contraptions.base.GeneratingKineticTileEntity;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;

View file

@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.flywheel.engine;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import net.minecraft.block.AbstractFurnaceBlock; import net.minecraft.block.AbstractFurnaceBlock;
@ -23,7 +23,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber @EventBusSubscriber
public class FurnaceEngineBlock extends EngineBlock implements IWithTileEntity<FurnaceEngineTileEntity> { public class FurnaceEngineBlock extends EngineBlock implements ITE<FurnaceEngineTileEntity> {
public FurnaceEngineBlock() { public FurnaceEngineBlock() {
super(Properties.from(Blocks.GOLD_BLOCK)); super(Properties.from(Blocks.GOLD_BLOCK));
@ -76,4 +76,9 @@ public class FurnaceEngineBlock extends EngineBlock implements IWithTileEntity<F
event.setUseBlock(Result.DENY); event.setUseBlock(Result.DENY);
} }
@Override
public Class<FurnaceEngineTileEntity> getTileEntityClass() {
return FurnaceEngineTileEntity.class;
}
} }

View file

@ -1,6 +1,9 @@
package com.simibubi.create.modules.contraptions.components.millstone; package com.simibubi.create.modules.contraptions.components.millstone;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.modules.contraptions.base.KineticBlock; import com.simibubi.create.modules.contraptions.base.KineticBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -8,7 +11,6 @@ import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
@ -27,7 +29,7 @@ import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
public class MillstoneBlock extends KineticBlock { public class MillstoneBlock extends KineticBlock implements ITE<MillstoneTileEntity> {
public MillstoneBlock() { public MillstoneBlock() {
super(Properties.from(Blocks.ANDESITE)); super(Properties.from(Blocks.ANDESITE));
@ -58,16 +60,10 @@ public class MillstoneBlock extends KineticBlock {
BlockRayTraceResult hit) { BlockRayTraceResult hit) {
if (!player.getHeldItem(handIn).isEmpty()) if (!player.getHeldItem(handIn).isEmpty())
return false; return false;
if (worldIn.getTileEntity(pos) == null)
return false;
if (worldIn.isRemote) if (worldIn.isRemote)
return true; return true;
TileEntity tileEntity = worldIn.getTileEntity(pos); withTileEntityDo(worldIn, pos, millstone -> {
if (!(tileEntity instanceof MillstoneTileEntity))
return false;
MillstoneTileEntity millstone = (MillstoneTileEntity) tileEntity;
IItemHandlerModifiable inv = millstone.outputInv; IItemHandlerModifiable inv = millstone.outputInv;
for (int slot = 0; slot < inv.getSlots(); slot++) { for (int slot = 0; slot < inv.getSlots(); slot++) {
player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot)); player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot));
@ -75,6 +71,8 @@ public class MillstoneBlock extends KineticBlock {
} }
millstone.markDirty(); millstone.markDirty();
millstone.sendData(); millstone.sendData();
});
return true; return true;
} }
@ -87,15 +85,17 @@ public class MillstoneBlock extends KineticBlock {
if (!(entityIn instanceof ItemEntity)) if (!(entityIn instanceof ItemEntity))
return; return;
BlockPos pos = entityIn.getPosition(); MillstoneTileEntity millstone = null;
TileEntity tileEntity = worldIn.getTileEntity(pos); for (BlockPos pos : Iterate.hereAndBelow(entityIn.getPosition())) {
if (!(tileEntity instanceof MillstoneTileEntity)) { try {
tileEntity = worldIn.getTileEntity(pos.down()); millstone = getTileEntity(worldIn, pos);
if (!(tileEntity instanceof MillstoneTileEntity)) } catch (TileEntityException e) {
return; continue;
} }
}
if (millstone == null)
return;
MillstoneTileEntity millstone = (MillstoneTileEntity) tileEntity;
ItemEntity itemEntity = (ItemEntity) entityIn; ItemEntity itemEntity = (ItemEntity) entityIn;
LazyOptional<IItemHandler> capability = millstone.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); LazyOptional<IItemHandler> capability = millstone.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
if (!capability.isPresent()) if (!capability.isPresent())
@ -111,18 +111,10 @@ public class MillstoneBlock extends KineticBlock {
@Override @Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) {
TileEntity tileEntity = worldIn.getTileEntity(pos); withTileEntityDo(worldIn, pos, te -> {
if (!(tileEntity instanceof MillstoneTileEntity)) ItemHelper.dropContents(worldIn, pos, te.inputInv);
return; ItemHelper.dropContents(worldIn, pos, te.outputInv);
MillstoneTileEntity te = (MillstoneTileEntity) tileEntity; });
for (int slot = 0; slot < te.inputInv.getSlots(); slot++) {
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(),
te.inputInv.getStackInSlot(slot));
}
for (int slot = 0; slot < te.outputInv.getSlots(); slot++) {
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(),
te.outputInv.getStackInSlot(slot));
}
worldIn.removeTileEntity(pos); worldIn.removeTileEntity(pos);
} }
@ -138,4 +130,9 @@ public class MillstoneBlock extends KineticBlock {
return Axis.Y; return Axis.Y;
} }
@Override
public Class<MillstoneTileEntity> getTileEntityClass() {
return MillstoneTileEntity.class;
}
} }

View file

@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.mixer;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IHaveCustomBlockItem; import com.simibubi.create.foundation.block.IHaveCustomBlockItem;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.modules.contraptions.base.KineticBlock; import com.simibubi.create.modules.contraptions.base.KineticBlock;
@ -21,7 +21,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
public class MechanicalMixerBlock extends KineticBlock public class MechanicalMixerBlock extends KineticBlock
implements IWithTileEntity<MechanicalMixerTileEntity>, IHaveCustomBlockItem { implements ITE<MechanicalMixerTileEntity>, IHaveCustomBlockItem {
public MechanicalMixerBlock() { public MechanicalMixerBlock() {
super(Properties.from(Blocks.ANDESITE)); super(Properties.from(Blocks.ANDESITE));
@ -90,4 +90,9 @@ public class MechanicalMixerBlock extends KineticBlock
return new BasinOperatorBlockItem(AllBlocks.MECHANICAL_MIXER, properties); return new BasinOperatorBlockItem(AllBlocks.MECHANICAL_MIXER, properties);
} }
@Override
public Class<MechanicalMixerTileEntity> getTileEntityClass() {
return MechanicalMixerTileEntity.class;
}
} }

View file

@ -6,8 +6,7 @@ import java.util.Optional;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IHaveCustomBlockItem; import com.simibubi.create.foundation.block.IHaveCustomBlockItem;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.block.SyncedTileEntity;
import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock;
@ -18,7 +17,7 @@ import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.I
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.TransportedItemStack; import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -39,7 +38,7 @@ import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class MechanicalPressBlock extends HorizontalKineticBlock public class MechanicalPressBlock extends HorizontalKineticBlock
implements IWithTileEntity<MechanicalPressTileEntity>, IBeltAttachment, IHaveCustomBlockItem { implements ITE<MechanicalPressTileEntity>, IBeltAttachment, IHaveCustomBlockItem {
public MechanicalPressBlock() { public MechanicalPressBlock() {
super(Properties.from(Blocks.PISTON)); super(Properties.from(Blocks.PISTON));
@ -63,17 +62,15 @@ public class MechanicalPressBlock extends HorizontalKineticBlock
boolean isMoving) { boolean isMoving) {
if (worldIn.isRemote) if (worldIn.isRemote)
return; return;
MechanicalPressTileEntity te = (MechanicalPressTileEntity) worldIn.getTileEntity(pos);
if (te == null)
return;
if (worldIn.isBlockPowered(pos)) { withTileEntityDo(worldIn, pos, te -> {
if (!worldIn.isBlockPowered(pos)) {
te.finished = false;
return;
}
if (!te.finished && !te.running && te.getSpeed() != 0) if (!te.finished && !te.running && te.getSpeed() != 0)
te.start(Mode.WORLD); te.start(Mode.WORLD);
} else { });
te.finished = false;
}
} }
@Override @Override
@ -134,11 +131,11 @@ public class MechanicalPressBlock extends HorizontalKineticBlock
} }
@Override @Override
public boolean startProcessingItem(BeltTileEntity te, TransportedItemStack transported, BeltAttachmentState state) { public boolean startProcessingItem(BeltTileEntity belt, TransportedItemStack transported,
MechanicalPressTileEntity pressTe = (MechanicalPressTileEntity) te.getWorld() BeltAttachmentState state) {
.getTileEntity(state.attachmentPos); try {
MechanicalPressTileEntity pressTe = getTileEntity(belt.getWorld(), state.attachmentPos);
if (pressTe == null || pressTe.getSpeed() == 0) if (pressTe.getSpeed() == 0)
return false; return false;
if (pressTe.running) if (pressTe.running)
return false; return false;
@ -148,20 +145,26 @@ public class MechanicalPressBlock extends HorizontalKineticBlock
state.processingDuration = 1; state.processingDuration = 1;
pressTe.start(Mode.BELT); pressTe.start(Mode.BELT);
return true; return true;
} catch (TileEntityException e) {}
return false;
} }
@Override @Override
public boolean processItem(BeltTileEntity te, TransportedItemStack transportedStack, BeltAttachmentState state) { public boolean processItem(BeltTileEntity belt, TransportedItemStack transportedStack, BeltAttachmentState state) {
MechanicalPressTileEntity pressTe = (MechanicalPressTileEntity) te.getWorld() try {
.getTileEntity(state.attachmentPos); MechanicalPressTileEntity pressTe = getTileEntity(belt.getWorld(), state.attachmentPos);
// Not powered // Not powered
if (pressTe == null || pressTe.getSpeed() == 0) if (pressTe.getSpeed() == 0)
return false; return false;
// Running // Running
if (pressTe.running) { if (!pressTe.running)
if (pressTe.runningTicks == 30) { return false;
if (pressTe.runningTicks != 30)
return true;
Optional<PressingRecipe> recipe = pressTe.getRecipe(transportedStack.stack); Optional<PressingRecipe> recipe = pressTe.getRecipe(transportedStack.stack);
pressTe.pressedItems.clear(); pressTe.pressedItems.clear();
@ -169,19 +172,20 @@ public class MechanicalPressBlock extends HorizontalKineticBlock
if (!recipe.isPresent()) if (!recipe.isPresent())
return false; return false;
ItemStack out = recipe.get().getRecipeOutput().copy(); ItemStack out = recipe.get().getRecipeOutput().copy();
List<ItemStack> multipliedOutput = ItemHelper.multipliedOutput(transportedStack.stack, out); List<ItemStack> multipliedOutput = ItemHelper.multipliedOutput(transportedStack.stack, out);
if (multipliedOutput.isEmpty()) if (multipliedOutput.isEmpty())
transportedStack.stack = ItemStack.EMPTY; transportedStack.stack = ItemStack.EMPTY;
transportedStack.stack = multipliedOutput.get(0); transportedStack.stack = multipliedOutput.get(0);
TileEntity controllerTE = te.getWorld().getTileEntity(te.getController()); BeltTileEntity controllerTE = belt.getControllerTE();
if (controllerTE != null && controllerTE instanceof BeltTileEntity) if (controllerTE != null)
((SyncedTileEntity) controllerTE).sendData(); controllerTE.sendData();
pressTe.sendData(); pressTe.sendData();
}
return true; return true;
}
} catch (TileEntityException e) {}
return false; return false;
} }
@ -191,4 +195,9 @@ public class MechanicalPressBlock extends HorizontalKineticBlock
return new BasinOperatorBlockItem(AllBlocks.MECHANICAL_PRESS, properties); return new BasinOperatorBlockItem(AllBlocks.MECHANICAL_PRESS, properties);
} }
@Override
public Class<MechanicalPressTileEntity> getTileEntityClass() {
return MechanicalPressTileEntity.class;
}
} }

View file

@ -2,7 +2,8 @@ package com.simibubi.create.modules.contraptions.components.saw;
import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour;
import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock;
import com.simibubi.create.modules.contraptions.components.actors.SawMovementBehaviour; import com.simibubi.create.modules.contraptions.components.actors.SawMovementBehaviour;
@ -15,7 +16,6 @@ import net.minecraft.block.Blocks;
import net.minecraft.block.material.PushReaction; import net.minecraft.block.material.PushReaction;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.state.BooleanProperty; import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.StateContainer.Builder;
@ -33,7 +33,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class SawBlock extends DirectionalAxisKineticBlock implements IWithTileEntity<SawTileEntity>, IPortableBlock { public class SawBlock extends DirectionalAxisKineticBlock implements ITE<SawTileEntity>, IPortableBlock {
public static final BooleanProperty RUNNING = BooleanProperty.create("running"); public static final BooleanProperty RUNNING = BooleanProperty.create("running");
public static DamageSource damageSourceSaw = new DamageSource("create.saw").setDamageBypassesArmor(); public static DamageSource damageSourceSaw = new DamageSource("create.saw").setDamageBypassesArmor();
@ -97,12 +97,13 @@ public class SawBlock extends DirectionalAxisKineticBlock implements IWithTileEn
super.onLanded(worldIn, entityIn); super.onLanded(worldIn, entityIn);
if (!(entityIn instanceof ItemEntity)) if (!(entityIn instanceof ItemEntity))
return; return;
BlockPos pos = entityIn.getPosition();
if (!(worldIn.getTileEntity(pos) instanceof SawTileEntity))
return;
if (entityIn.world.isRemote) if (entityIn.world.isRemote)
return; return;
BlockPos pos = entityIn.getPosition();
withTileEntityDo(entityIn.world, pos, te -> { withTileEntityDo(entityIn.world, pos, te -> {
if (te.getSpeed() == 0)
return;
te.insertItem((ItemEntity) entityIn); te.insertItem((ItemEntity) entityIn);
}); });
} }
@ -129,24 +130,22 @@ public class SawBlock extends DirectionalAxisKineticBlock implements IWithTileEn
@Override @Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (worldIn.getTileEntity(pos) == null) if (!state.hasTileEntity() || state.getBlock() == newState.getBlock())
return; return;
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { withTileEntityDo(worldIn, pos, te -> ItemHelper.dropContents(worldIn, pos, te.inventory));
withTileEntityDo(worldIn, pos, te -> {
for (int slot = 0; slot < te.inventory.getSlots(); slot++) {
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(),
te.inventory.getStackInSlot(slot));
}
});
TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE); TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE);
worldIn.removeTileEntity(pos); worldIn.removeTileEntity(pos);
} }
}
@Override @Override
public MovementBehaviour getMovementBehaviour() { public MovementBehaviour getMovementBehaviour() {
return MOVEMENT; return MOVEMENT;
} }
@Override
public Class<SawTileEntity> getTileEntityClass() {
return SawTileEntity.class;
}
} }

View file

@ -148,8 +148,6 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
if (stack.isEmpty()) if (stack.isEmpty())
continue; continue;
// if (itemMovementFacing.getAxis() == Axis.Z)
// itemMovementFacing = itemMovementFacing.getOpposite();
if (((BeltTileEntity) te).tryInsertingFromSide(itemMovementFacing, stack, false)) if (((BeltTileEntity) te).tryInsertingFromSide(itemMovementFacing, stack, false))
inventory.setStackInSlot(slot, ItemStack.EMPTY); inventory.setStackInSlot(slot, ItemStack.EMPTY);
else { else {

View file

@ -1,5 +1,6 @@
package com.simibubi.create.modules.contraptions.components.turntable; package com.simibubi.create.modules.contraptions.components.turntable;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.base.KineticBlock; import com.simibubi.create.modules.contraptions.base.KineticBlock;
@ -22,7 +23,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class TurntableBlock extends KineticBlock { public class TurntableBlock extends KineticBlock implements ITE<TurntableTileEntity> {
public TurntableBlock() { public TurntableBlock() {
super(Properties.from(Blocks.STRIPPED_SPRUCE_LOG)); super(Properties.from(Blocks.STRIPPED_SPRUCE_LOG));
@ -40,22 +41,19 @@ public class TurntableBlock extends KineticBlock {
@Override @Override
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity e) { public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity e) {
TileEntity te = worldIn.getTileEntity(pos);
if (!(te instanceof KineticTileEntity))
return;
if (!e.onGround) if (!e.onGround)
return; return;
if (e.getMotion().y > 0) if (e.getMotion().y > 0)
return; return;
float speed = ((KineticTileEntity) te).getSpeed() * 3/10;
World world = e.getEntityWorld();
if (speed == 0)
return;
if (e.posY < pos.getY() + .5f) if (e.posY < pos.getY() + .5f)
return; return;
withTileEntityDo(worldIn, pos, te -> {
float speed = ((KineticTileEntity) te).getSpeed() * 3 / 10;
if (speed == 0)
return;
World world = e.getEntityWorld();
if (world.isRemote && (e instanceof PlayerEntity)) { if (world.isRemote && (e instanceof PlayerEntity)) {
if (worldIn.getBlockState(e.getPosition()) != state) { if (worldIn.getBlockState(e.getPosition()) != state) {
Vec3d origin = VecHelper.getCenterOf(pos); Vec3d origin = VecHelper.getCenterOf(pos);
@ -71,6 +69,7 @@ public class TurntableBlock extends KineticBlock {
return; return;
if (world.isRemote) if (world.isRemote)
return; return;
if ((e instanceof LivingEntity)) { if ((e instanceof LivingEntity)) {
float diff = e.getRotationYawHead() - speed; float diff = e.getRotationYawHead() - speed;
((LivingEntity) e).setIdleTime(20); ((LivingEntity) e).setIdleTime(20);
@ -79,12 +78,11 @@ public class TurntableBlock extends KineticBlock {
e.onGround = false; e.onGround = false;
e.velocityChanged = true; e.velocityChanged = true;
} }
e.rotationYaw -= speed; e.rotationYaw -= speed;
});
} }
// IRotate:
@Override @Override
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return face == Direction.DOWN; return face == Direction.DOWN;
@ -100,4 +98,9 @@ public class TurntableBlock extends KineticBlock {
return false; return false;
} }
@Override
public Class<TurntableTileEntity> getTileEntityClass() {
return TurntableTileEntity.class;
}
} }

View file

@ -2,9 +2,9 @@ package com.simibubi.create.modules.contraptions.components.turntable;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
@ -22,8 +22,12 @@ public class TurntableHandler {
if (mc.isGamePaused()) if (mc.isGamePaused())
return; return;
KineticTileEntity te = (KineticTileEntity) mc.world.getTileEntity(pos); TileEntity tileEntity = mc.world.getTileEntity(pos);
float speed = te.getSpeed() * 3/10; if (!(tileEntity instanceof TurntableTileEntity))
return;
TurntableTileEntity turnTable = (TurntableTileEntity) tileEntity;
float speed = turnTable.getSpeed() * 3/10;
if (speed == 0) if (speed == 0)
return; return;

View file

@ -2,6 +2,7 @@ package com.simibubi.create.modules.contraptions.components.waterwheel;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.config.AllConfigs; import com.simibubi.create.config.AllConfigs;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -20,7 +21,7 @@ import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class WaterWheelBlock extends HorizontalKineticBlock { public class WaterWheelBlock extends HorizontalKineticBlock implements ITE<WaterWheelTileEntity> {
public WaterWheelBlock() { public WaterWheelBlock() {
super(Properties.from(Blocks.STRIPPED_SPRUCE_WOOD)); super(Properties.from(Blocks.STRIPPED_SPRUCE_WOOD));
@ -79,46 +80,42 @@ public class WaterWheelBlock extends HorizontalKineticBlock {
} }
private void updateFlowAt(BlockState state, World world, BlockPos pos, Direction f) { private void updateFlowAt(BlockState state, World world, BlockPos pos, Direction f) {
WaterWheelTileEntity te = (WaterWheelTileEntity) world.getTileEntity(pos);
if (te == null)
return;
if (f.getAxis() == state.get(HORIZONTAL_FACING).getAxis()) if (f.getAxis() == state.get(HORIZONTAL_FACING).getAxis())
return; return;
IFluidState fluid = world.getFluidState(pos.offset(f));
Vec3d flowVec = fluid.getFlow(world, pos.offset(f));
Direction wf = state.get(HORIZONTAL_FACING);
double flow = 0;
flowVec = flowVec.scale(f.getAxisDirection().getOffset()); IFluidState fluid = world.getFluidState(pos.offset(f));
Direction wf = state.get(HORIZONTAL_FACING);
boolean clockwise = wf.getAxisDirection() == AxisDirection.POSITIVE; boolean clockwise = wf.getAxisDirection() == AxisDirection.POSITIVE;
int clockwiseMultiplier = 2; int clockwiseMultiplier = 2;
flowVec = new Vec3d(Math.signum(flowVec.x), Math.signum(flowVec.y), Math.signum(flowVec.z));
Vec3d vec = fluid.getFlow(world, pos.offset(f));
vec = vec.scale(f.getAxisDirection().getOffset());
vec = new Vec3d(Math.signum(vec.x), Math.signum(vec.y), Math.signum(vec.z));
Vec3d flow = vec;
withTileEntityDo(world, pos, te -> {
double flowStrength = 0;
if (wf.getAxis() == Axis.Z) { if (wf.getAxis() == Axis.Z) {
if (f.getAxis() == Axis.Y) if (f.getAxis() == Axis.Y)
flow = flowVec.x > 0 ^ !clockwise ? -flowVec.x * clockwiseMultiplier : -flowVec.x; flowStrength = flow.x > 0 ^ !clockwise ? -flow.x * clockwiseMultiplier : -flow.x;
if (f.getAxis() == Axis.X) if (f.getAxis() == Axis.X)
flow = flowVec.y < 0 ^ !clockwise ? flowVec.y * clockwiseMultiplier : flowVec.y; flowStrength = flow.y < 0 ^ !clockwise ? flow.y * clockwiseMultiplier : flow.y;
} }
if (wf.getAxis() == Axis.X) { if (wf.getAxis() == Axis.X) {
if (f.getAxis() == Axis.Y) if (f.getAxis() == Axis.Y)
flow = flowVec.z < 0 ^ !clockwise ? flowVec.z * clockwiseMultiplier : flowVec.z; flowStrength = flow.z < 0 ^ !clockwise ? flow.z * clockwiseMultiplier : flow.z;
if (f.getAxis() == Axis.Z) if (f.getAxis() == Axis.Z)
flow = flowVec.y > 0 ^ !clockwise ? -flowVec.y * clockwiseMultiplier : -flowVec.y; flowStrength = flow.y > 0 ^ !clockwise ? -flow.y * clockwiseMultiplier : -flow.y;
} }
te.setFlow(f, (float) (flow * AllConfigs.SERVER.kinetics.waterWheelSpeed.get() / 2f)); te.setFlow(f, (float) (flowStrength * AllConfigs.SERVER.kinetics.waterWheelSpeed.get() / 2f));
});
} }
private void updateWheelSpeed(IWorld world, BlockPos pos) { private void updateWheelSpeed(IWorld world, BlockPos pos) {
if (world.isRemote()) withTileEntityDo(world, pos, WaterWheelTileEntity::updateGeneratedRotation);
return;
TileEntity tileEntity = world.getTileEntity(pos);
if (!(tileEntity instanceof WaterWheelTileEntity))
return;
WaterWheelTileEntity te = (WaterWheelTileEntity) tileEntity;
te.updateGeneratedRotation();
} }
@Override @Override
@ -159,4 +156,9 @@ public class WaterWheelBlock extends HorizontalKineticBlock {
return true; return true;
} }
@Override
public Class<WaterWheelTileEntity> getTileEntityClass() {
return WaterWheelTileEntity.class;
}
} }

View file

@ -1,7 +1,7 @@
package com.simibubi.create.modules.contraptions.processing; package com.simibubi.create.modules.contraptions.processing;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
@ -12,7 +12,6 @@ import net.minecraft.block.material.PushReaction;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
@ -26,7 +25,7 @@ import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity> { public class BasinBlock extends Block implements ITE<BasinTileEntity> {
public BasinBlock() { public BasinBlock() {
super(Properties.from(Blocks.ANDESITE)); super(Properties.from(Blocks.ANDESITE));
@ -52,16 +51,16 @@ public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity
BlockRayTraceResult hit) { BlockRayTraceResult hit) {
if (!player.getHeldItem(handIn).isEmpty()) if (!player.getHeldItem(handIn).isEmpty())
return false; return false;
if (worldIn.getTileEntity(pos) == null)
return false;
BasinTileEntity te = (BasinTileEntity) worldIn.getTileEntity(pos); try {
BasinTileEntity te = getTileEntity(worldIn, pos);
IItemHandlerModifiable inv = te.inventory.orElse(new ItemStackHandler(1)); IItemHandlerModifiable inv = te.inventory.orElse(new ItemStackHandler(1));
for (int slot = 0; slot < inv.getSlots(); slot++) { for (int slot = 0; slot < inv.getSlots(); slot++) {
player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot)); player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot));
inv.setStackInSlot(slot, ItemStack.EMPTY); inv.setStackInSlot(slot, ItemStack.EMPTY);
} }
te.onEmptied(); te.onEmptied();
} catch (TileEntityException e) {}
return true; return true;
} }
@ -75,9 +74,8 @@ public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity
return; return;
if (!entityIn.isAlive()) if (!entityIn.isAlive())
return; return;
BasinTileEntity te = (BasinTileEntity) worldIn.getTileEntity(entityIn.getPosition());
ItemEntity itemEntity = (ItemEntity) entityIn; ItemEntity itemEntity = (ItemEntity) entityIn;
withTileEntityDo(worldIn, entityIn.getPosition(), te -> {
ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputInventory, itemEntity.getItem().copy(), false); ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputInventory, itemEntity.getItem().copy(), false);
if (insertItem.isEmpty()) { if (insertItem.isEmpty()) {
@ -86,7 +84,7 @@ public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity
} }
itemEntity.setItem(insertItem); itemEntity.setItem(insertItem);
});
} }
@Override @Override
@ -96,21 +94,17 @@ public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity
@Override @Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (worldIn.getTileEntity(pos) == null) if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) {
return; return;
BasinTileEntity te = (BasinTileEntity) worldIn.getTileEntity(pos);
IItemHandlerModifiable inv = te.inventory.orElse(new ItemStackHandler(1));
for (int slot = 0; slot < inv.getSlots(); slot++) {
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), inv.getStackInSlot(slot));
} }
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) { withTileEntityDo(worldIn, pos, te -> {
ItemHelper.dropContents(worldIn, pos, te.inputInventory);
ItemHelper.dropContents(worldIn, pos, te.outputInventory);
});
worldIn.removeTileEntity(pos); worldIn.removeTileEntity(pos);
} }
}
@Override @Override
public boolean isSolid(BlockState state) { public boolean isSolid(BlockState state) {
return false; return false;
@ -123,12 +117,15 @@ public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity
@Override @Override
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
TileEntity te = worldIn.getTileEntity(pos); try {
if (te instanceof BasinTileEntity) { return ItemHelper.calcRedstoneFromInventory(getTileEntity(worldIn, pos).inputInventory);
BasinTileEntity basinTileEntity = (BasinTileEntity) te; } catch (TileEntityException e) {}
return ItemHelper.calcRedstoneFromInventory(basinTileEntity.inputInventory);
}
return 0; return 0;
} }
@Override
public Class<BasinTileEntity> getTileEntityClass() {
return BasinTileEntity.class;
}
} }

View file

@ -2,6 +2,7 @@ package com.simibubi.create.modules.contraptions.processing;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour;
@ -84,11 +85,11 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
if (isRunning()) if (isRunning())
return false; return false;
TileEntity basinTE = world.getTileEntity(pos.down(2)); Optional<BasinTileEntity> basinTe = getBasin();
if (basinTE == null || !(basinTE instanceof BasinTileEntity)) if (!basinTe.isPresent())
return true; return true;
if (!basinInv.isPresent()) if (!basinInv.isPresent())
basinInv = basinTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); basinInv = basinTe.get().getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
if (!basinInv.isPresent()) if (!basinInv.isPresent())
return true; return true;
@ -160,9 +161,7 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
sendData(); sendData();
} }
TileEntity basinTE = world.getTileEntity(pos.down(2)); getBasin().ifPresent(te -> te.contentsChanged = true);
if (basinTE instanceof BasinTileEntity)
((BasinTileEntity) basinTE).contentsChanged = false;
} }
protected List<IRecipe<?>> getMatchingRecipes() { protected List<IRecipe<?>> getMatchingRecipes() {
@ -176,6 +175,13 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
} }
protected Optional<BasinTileEntity> getBasin() {
TileEntity basinTE = world.getTileEntity(pos.down(2));
if (!(basinTE instanceof BasinTileEntity))
return Optional.empty();
return Optional.of((BasinTileEntity) basinTE);
}
protected abstract <C extends IInventory> boolean matchStaticFilters(IRecipe<C> recipe); protected abstract <C extends IInventory> boolean matchStaticFilters(IRecipe<C> recipe);
protected abstract <C extends IInventory> boolean matchBasinRecipe(IRecipe<C> recipe); protected abstract <C extends IInventory> boolean matchBasinRecipe(IRecipe<C> recipe);

View file

@ -1,5 +1,7 @@
package com.simibubi.create.modules.contraptions.processing; package com.simibubi.create.modules.contraptions.processing;
import java.util.Optional;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.block.SyncedTileEntity; import com.simibubi.create.foundation.block.SyncedTileEntity;
@ -111,11 +113,7 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn
} }
public void onEmptied() { public void onEmptied() {
TileEntity te = world.getTileEntity(pos.up(2)); getOperator().ifPresent(te -> te.basinRemoved = true);
if (te == null)
return;
if (te instanceof BasinOperatingTileEntity)
((BasinOperatingTileEntity) te).basinRemoved = true;
} }
@Override @Override
@ -137,13 +135,14 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn
if (!contentsChanged) if (!contentsChanged)
return; return;
contentsChanged = false; contentsChanged = false;
getOperator().ifPresent(te -> te.basinChecker.scheduleUpdate());
}
private Optional<BasinOperatingTileEntity> getOperator() {
TileEntity te = world.getTileEntity(pos.up(2)); TileEntity te = world.getTileEntity(pos.up(2));
if (te == null)
return;
if (te instanceof BasinOperatingTileEntity) if (te instanceof BasinOperatingTileEntity)
((BasinOperatingTileEntity) te).basinChecker.scheduleUpdate(); return Optional.of((BasinOperatingTileEntity) te);
return Optional.empty();
} }
} }

View file

@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.redstone;
import java.util.Random; import java.util.Random;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -26,7 +26,7 @@ import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEntity<AnalogLeverTileEntity> { public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE<AnalogLeverTileEntity> {
public AnalogLeverBlock() { public AnalogLeverBlock() {
super(Properties.from(Blocks.LEVER)); super(Properties.from(Blocks.LEVER));
@ -50,23 +50,24 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEn
return true; return true;
} }
try {
boolean sneak = player.isSneaking(); boolean sneak = player.isSneaking();
AnalogLeverTileEntity te = getTileEntity(worldIn, pos); AnalogLeverTileEntity te = getTileEntity(worldIn, pos);
if (te == null)
return true;
te.changeState(sneak); te.changeState(sneak);
float f = .25f + ((te.state + 5) / 15f) * .5f; float f = .25f + ((te.state + 5) / 15f) * .5f;
worldIn.playSound(null, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f); worldIn.playSound(null, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f);
} catch (TileEntityException e) {}
return true; return true;
} }
@Override @Override
public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) {
AnalogLeverTileEntity tileEntity = getTileEntity(blockAccess, pos); try {
if (tileEntity == null) return getTileEntity(blockAccess, pos).state;
} catch (TileEntityException e) {
return 0; return 0;
return tileEntity.state; }
} }
@Override @Override
@ -82,21 +83,23 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEn
@Override @Override
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) { public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
try {
AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos); AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos);
if (tileEntity == null)
return;
if (tileEntity.state != 0 && rand.nextFloat() < 0.25F) if (tileEntity.state != 0 && rand.nextFloat() < 0.25F)
addParticles(stateIn, worldIn, pos, 0.5F); addParticles(stateIn, worldIn, pos, 0.5F);
} catch (TileEntityException e) {}
} }
@Override @Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
try {
AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos); AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos);
if (tileEntity != null && !isMoving && state.getBlock() != newState.getBlock()) { if (!isMoving && state.getBlock() != newState.getBlock()) {
if (tileEntity.state != 0) if (tileEntity.state != 0)
updateNeighbors(state, worldIn, pos); updateNeighbors(state, worldIn, pos);
worldIn.removeTileEntity(pos); worldIn.removeTileEntity(pos);
} }
} catch (TileEntityException e) {}
} }
private static void addParticles(BlockState state, IWorld worldIn, BlockPos pos, float alpha) { private static void addParticles(BlockState state, IWorld worldIn, BlockPos pos, float alpha) {
@ -127,4 +130,9 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEn
super.fillStateContainer(builder.add(HORIZONTAL_FACING, FACE)); super.fillStateContainer(builder.add(HORIZONTAL_FACING, FACE));
} }
@Override
public Class<AnalogLeverTileEntity> getTileEntityClass() {
return AnalogLeverTileEntity.class;
}
} }

View file

@ -1,11 +1,12 @@
package com.simibubi.create.modules.contraptions.relays.advanced.sequencer; package com.simibubi.create.modules.contraptions.relays.advanced.sequencer;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.modules.contraptions.base.HorizontalAxisKineticBlock; import com.simibubi.create.modules.contraptions.base.HorizontalAxisKineticBlock;
import com.simibubi.create.modules.contraptions.base.KineticBlock; import com.simibubi.create.modules.contraptions.base.KineticBlock;
import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock; import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
@ -31,8 +32,7 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implements ITE<SequencedGearshiftTileEntity> {
implements IWithTileEntity<SequencedGearshiftTileEntity> {
public static final BooleanProperty VERTICAL = BooleanProperty.create("vertical"); public static final BooleanProperty VERTICAL = BooleanProperty.create("vertical");
public static final IntegerProperty STATE = IntegerProperty.create("state", 0, 5); public static final IntegerProperty STATE = IntegerProperty.create("state", 0, 5);
@ -86,9 +86,7 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock
return false; return false;
} }
DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> withTileEntityDo(worldIn, pos, this::displayScreen));
displayScreen((SequencedGearshiftTileEntity) worldIn.getTileEntity(pos));
});
return true; return true;
} }
@ -135,4 +133,9 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock
return true; return true;
} }
@Override
public Class<SequencedGearshiftTileEntity> getTileEntityClass() {
return SequencedGearshiftTileEntity.class;
}
} }

View file

@ -6,6 +6,7 @@ import java.util.function.Consumer;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@ -13,7 +14,6 @@ import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.INBT; import net.minecraft.nbt.INBT;
import net.minecraft.nbt.ListNBT; import net.minecraft.nbt.ListNBT;
import net.minecraft.nbt.NBTUtil; import net.minecraft.nbt.NBTUtil;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -59,12 +59,13 @@ public enum AllBeltAttachments {
default void onAttachmentPlaced(IWorld world, BlockPos pos, BlockState state) { default void onAttachmentPlaced(IWorld world, BlockPos pos, BlockState state) {
BlockPos beltPos = getBeltPositionForAttachment(world, pos, state); BlockPos beltPos = getBeltPositionForAttachment(world, pos, state);
TileEntity te = world.getTileEntity(beltPos); BeltTileEntity belt = BeltHelper.getSegmentTE(world, beltPos);
if (te == null || !(te instanceof BeltTileEntity))
if (belt == null)
return; return;
BeltTileEntity belt = (BeltTileEntity) te; if (!isAttachedCorrectly(world, pos, beltPos, state, world.getBlockState(beltPos)))
if (!isAttachedCorrectly(world, pos, belt.getPos(), state, belt.getBlockState()))
return; return;
belt.attachmentTracker.addAttachment(world, pos); belt.attachmentTracker.addAttachment(world, pos);
belt.markDirty(); belt.markDirty();
belt.sendData(); belt.sendData();
@ -72,16 +73,18 @@ public enum AllBeltAttachments {
default void onAttachmentRemoved(IWorld world, BlockPos pos, BlockState state) { default void onAttachmentRemoved(IWorld world, BlockPos pos, BlockState state) {
BlockPos beltPos = getBeltPositionForAttachment(world, pos, state); BlockPos beltPos = getBeltPositionForAttachment(world, pos, state);
TileEntity te = world.getTileEntity(beltPos); BeltTileEntity belt = BeltHelper.getSegmentTE(world, beltPos);
if (te == null || !(te instanceof BeltTileEntity))
if (belt == null)
return; return;
BeltTileEntity belt = (BeltTileEntity) te; if (!isAttachedCorrectly(world, pos, beltPos, state, world.getBlockState(beltPos)))
if (!isAttachedCorrectly(world, pos, belt.getPos(), state, belt.getBlockState()))
return; return;
belt.attachmentTracker.removeAttachment(pos); belt.attachmentTracker.removeAttachment(pos);
belt.markDirty(); belt.markDirty();
belt.sendData(); belt.sendData();
} }
} }
public static class BeltAttachmentState { public static class BeltAttachmentState {
@ -112,8 +115,8 @@ public enum AllBeltAttachments {
World world = belt.getWorld(); World world = belt.getWorld();
BlockPos beltPos = belt.getPos(); BlockPos beltPos = belt.getPos();
BlockState beltState = belt.getBlockState(); BlockState beltState = belt.getBlockState();
List<BlockPos> attachmentPositions = ba.attachment.getPotentialAttachmentPositions(world, beltPos, List<BlockPos> attachmentPositions =
beltState); ba.attachment.getPotentialAttachmentPositions(world, beltPos, beltState);
for (BlockPos potentialPos : attachmentPositions) { for (BlockPos potentialPos : attachmentPositions) {
if (!world.isBlockPresent(potentialPos)) if (!world.isBlockPresent(potentialPos))

View file

@ -10,11 +10,12 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.block.IHaveColorHandler; import com.simibubi.create.foundation.block.IHaveColorHandler;
import com.simibubi.create.foundation.block.IHaveNoBlockItem; import com.simibubi.create.foundation.block.IHaveNoBlockItem;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock;
import com.simibubi.create.modules.contraptions.relays.belt.BeltMovementHandler.TransportedEntityInfo; import com.simibubi.create.modules.contraptions.relays.belt.transport.BeltMovementHandler.TransportedEntityInfo;
import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockRenderType;
@ -62,7 +63,7 @@ import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
public class BeltBlock extends HorizontalKineticBlock public class BeltBlock extends HorizontalKineticBlock
implements IHaveNoBlockItem, IWithTileEntity<BeltTileEntity>, IHaveColorHandler { implements IHaveNoBlockItem, ITE<BeltTileEntity>, IHaveColorHandler {
public static final IProperty<Slope> SLOPE = EnumProperty.create("slope", Slope.class); public static final IProperty<Slope> SLOPE = EnumProperty.create("slope", Slope.class);
public static final IProperty<Part> PART = EnumProperty.create("part", Part.class); public static final IProperty<Part> PART = EnumProperty.create("part", Part.class);
@ -77,8 +78,11 @@ public class BeltBlock extends HorizontalKineticBlock
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
if (face.getAxis() != getRotationAxis(state)) if (face.getAxis() != getRotationAxis(state))
return false; return false;
BeltTileEntity beltEntity = (BeltTileEntity) world.getTileEntity(pos);
return beltEntity != null && beltEntity.hasPulley(); try {
return getTileEntity(world, pos).hasPulley();
} catch (TileEntityException e) {}
return false;
} }
@Override @Override
@ -111,15 +115,9 @@ public class BeltBlock extends HorizontalKineticBlock
@Override @Override
public void spawnAdditionalDrops(BlockState state, World worldIn, BlockPos pos, ItemStack stack) { public void spawnAdditionalDrops(BlockState state, World worldIn, BlockPos pos, ItemStack stack) {
withTileEntityDo(worldIn, pos, te -> { BeltTileEntity controllerTE = BeltHelper.getControllerTE(worldIn, pos);
if (worldIn.isRemote) if (controllerTE != null)
return; controllerTE.getInventory().ejectAll();
if (te.isController()) {
BeltInventory inv = te.getInventory();
for (TransportedItemStack s : inv.items)
inv.eject(s);
}
});
} }
@Override @Override
@ -147,9 +145,6 @@ public class BeltBlock extends HorizontalKineticBlock
@Override @Override
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) { public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) {
BeltTileEntity belt = null;
belt = (BeltTileEntity) worldIn.getTileEntity(pos);
if (state.get(SLOPE) == Slope.VERTICAL) if (state.get(SLOPE) == Slope.VERTICAL)
return; return;
if (entityIn instanceof PlayerEntity) { if (entityIn instanceof PlayerEntity) {
@ -159,6 +154,8 @@ public class BeltBlock extends HorizontalKineticBlock
if (player.abilities.isFlying) if (player.abilities.isFlying)
return; return;
} }
BeltTileEntity belt = BeltHelper.getSegmentTE(worldIn, pos);
if (belt == null || belt.getSpeed() == 0) if (belt == null || belt.getSpeed() == 0)
return; return;
if (entityIn instanceof ItemEntity && entityIn.isAlive()) { if (entityIn instanceof ItemEntity && entityIn.isAlive()) {
@ -178,12 +175,12 @@ public class BeltBlock extends HorizontalKineticBlock
return; return;
} }
BeltTileEntity controller = (BeltTileEntity) worldIn.getTileEntity(belt.getController()); BeltTileEntity controller = BeltHelper.getControllerTE(worldIn, pos);
if (controller == null || controller.passengers == null) if (controller == null || controller.passengers == null)
return; return;
if (controller.passengers.containsKey(entityIn)) { if (controller.passengers.containsKey(entityIn)) {
TransportedEntityInfo info = controller.passengers.get(entityIn); TransportedEntityInfo info = controller.passengers.get(entityIn);
if (info.ticksSinceLastCollision != 0 || pos.equals(entityIn.getPosition())) if (info.getTicksSinceLastCollision() != 0 || pos.equals(entityIn.getPosition()))
info.refresh(pos, state); info.refresh(pos, state);
} else { } else {
controller.passengers.put(entityIn, new TransportedEntityInfo(pos, state)); controller.passengers.put(entityIn, new TransportedEntityInfo(pos, state));
@ -224,10 +221,9 @@ public class BeltBlock extends HorizontalKineticBlock
return true; return true;
} }
TileEntity te = worldIn.getTileEntity(pos); BeltTileEntity belt = BeltHelper.getSegmentTE(worldIn, pos);
if (te == null || !(te instanceof BeltTileEntity)) if (belt == null)
return false; return false;
BeltTileEntity belt = (BeltTileEntity) te;
if (isHand) { if (isHand) {
BeltTileEntity controllerBelt = belt.getControllerTE(); BeltTileEntity controllerBelt = belt.getControllerTE();
@ -270,10 +266,6 @@ public class BeltBlock extends HorizontalKineticBlock
@Override @Override
public ActionResultType onWrenched(BlockState state, ItemUseContext context) { public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
World world = context.getWorld(); World world = context.getWorld();
TileEntity te = world.getTileEntity(context.getPos());
if (te == null || !(te instanceof BeltTileEntity))
return ActionResultType.PASS;
BeltTileEntity belt = (BeltTileEntity) te;
PlayerEntity player = context.getPlayer(); PlayerEntity player = context.getPlayer();
if (state.get(CASING)) { if (state.get(CASING)) {
@ -289,8 +281,11 @@ public class BeltBlock extends HorizontalKineticBlock
if (world.isRemote) if (world.isRemote)
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
world.setBlockState(context.getPos(), state.with(PART, Part.MIDDLE), 2); world.setBlockState(context.getPos(), state.with(PART, Part.MIDDLE), 2);
BeltTileEntity belt = BeltHelper.getSegmentTE(world, context.getPos());
if (belt != null) {
belt.detachKinetics(); belt.detachKinetics();
belt.attachKinetics(); belt.attachKinetics();
}
if (!player.isCreative()) if (!player.isCreative())
player.inventory.placeItemBackInInventory(world, new ItemStack(AllBlocks.SHAFT.get())); player.inventory.placeItemBackInInventory(world, new ItemStack(AllBlocks.SHAFT.get()));
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;
@ -365,16 +360,22 @@ public class BeltBlock extends HorizontalKineticBlock
public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos,
ISelectionContext context) { ISelectionContext context) {
VoxelShape shape = getShape(state, worldIn, pos, context); VoxelShape shape = getShape(state, worldIn, pos, context);
BeltTileEntity belt = (BeltTileEntity) worldIn.getTileEntity(pos);
if (belt == null || context.getEntity() == null) try {
if (context.getEntity() == null)
return shape; return shape;
BeltTileEntity controller = (BeltTileEntity) worldIn.getTileEntity(belt.getController());
BeltTileEntity belt = getTileEntity(worldIn, pos);
BeltTileEntity controller = belt.getControllerTE();
if (controller == null) if (controller == null)
return shape; return shape;
if (controller.passengers == null || !controller.passengers.containsKey(context.getEntity())) { if (controller.passengers == null || !controller.passengers.containsKey(context.getEntity())) {
return BeltShapes.getCollisionShape(state); return BeltShapes.getCollisionShape(state);
} }
} catch (TileEntityException e) {}
return shape; return shape;
} }
@ -445,12 +446,8 @@ public class BeltBlock extends HorizontalKineticBlock
world.setBlockState(beltPos, currentState.with(CASING, false), 2); world.setBlockState(beltPos, currentState.with(CASING, false), 2);
} }
if (te.isController() && isVertical) { if (te.isController() && isVertical)
BeltInventory inventory = te.getInventory(); te.getInventory().ejectAll();
for (TransportedItemStack s : inventory.items)
inventory.eject(s);
inventory.items.clear();
}
} else { } else {
world.destroyBlock(pos, true); world.destroyBlock(pos, true);
return; return;
@ -490,11 +487,8 @@ public class BeltBlock extends HorizontalKineticBlock
TileEntity tileEntity = world.getTileEntity(currentPos); TileEntity tileEntity = world.getTileEntity(currentPos);
if (tileEntity instanceof BeltTileEntity) { if (tileEntity instanceof BeltTileEntity) {
BeltTileEntity te = (BeltTileEntity) tileEntity; BeltTileEntity te = (BeltTileEntity) tileEntity;
if (te.isController()) { if (te.isController())
BeltInventory inv = te.getInventory(); te.getInventory().ejectAll();
for (TransportedItemStack stack : inv.items)
inv.eject(stack);
}
te.remove(); te.remove();
hasPulley = te.hasPulley(); hasPulley = te.hasPulley();
@ -608,4 +602,9 @@ public class BeltBlock extends HorizontalKineticBlock
return new BeltColor(); return new BeltColor();
} }
@Override
public Class<BeltTileEntity> getTileEntityClass() {
return BeltTileEntity.class;
}
} }

View file

@ -0,0 +1,70 @@
package com.simibubi.create.modules.contraptions.relays.belt;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
import net.minecraft.world.IWorld;
public class BeltHelper {
public static BeltTileEntity getSegmentTE(IWorld world, BlockPos pos) {
if (!world.isAreaLoaded(pos, 0))
return null;
TileEntity tileEntity = world.getTileEntity(pos);
if (!(tileEntity instanceof BeltTileEntity))
return null;
return (BeltTileEntity) tileEntity;
}
public static BeltTileEntity getControllerTE(IWorld world, BlockPos pos) {
BeltTileEntity segment = getSegmentTE(world, pos);
if (segment == null)
return null;
BlockPos controllerPos = segment.controller;
if (controllerPos == null)
return null;
return getSegmentTE(world, controllerPos);
}
public static BeltTileEntity getBeltAtSegment(BeltTileEntity controller, int segment) {
BlockPos pos = getPositionForOffset(controller, segment);
TileEntity te = controller.getWorld().getTileEntity(pos);
if (te == null || !(te instanceof BeltTileEntity))
return null;
return (BeltTileEntity) te;
}
public static BlockPos getPositionForOffset(BeltTileEntity controller, int offset) {
BlockPos pos = controller.getPos();
Vec3i vec = controller.getBeltFacing().getDirectionVec();
Slope slope = controller.getBlockState().get(BeltBlock.SLOPE);
int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0;
return pos.add(offset * vec.getX(), MathHelper.clamp(offset, 0, controller.beltLength - 1) * verticality,
offset * vec.getZ());
}
public static Vec3d getVectorForOffset(BeltTileEntity controller, float offset) {
Slope slope = controller.getBlockState().get(BeltBlock.SLOPE);
int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0;
float verticalMovement = verticality;
if (offset < .5)
verticalMovement = 0;
verticalMovement = verticalMovement * (Math.min(offset, controller.beltLength - .5f) - .5f);
Vec3d vec = VecHelper.getCenterOf(controller.getPos());
Vec3d horizontalMovement = new Vec3d(controller.getBeltFacing().getDirectionVec()).scale(offset - .5f);
if (slope == Slope.VERTICAL)
horizontalMovement = Vec3d.ZERO;
vec = vec.add(horizontalMovement).add(0, verticalMovement, 0);
return vec;
}
}

View file

@ -20,7 +20,10 @@ import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.Tracker; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.Tracker;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Part; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Part;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope;
import com.simibubi.create.modules.contraptions.relays.belt.BeltMovementHandler.TransportedEntityInfo; import com.simibubi.create.modules.contraptions.relays.belt.transport.BeltInventory;
import com.simibubi.create.modules.contraptions.relays.belt.transport.BeltMovementHandler;
import com.simibubi.create.modules.contraptions.relays.belt.transport.BeltMovementHandler.TransportedEntityInfo;
import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@ -99,7 +102,7 @@ public class BeltTileEntity extends KineticTileEntity {
passengers.forEach((entity, info) -> { passengers.forEach((entity, info) -> {
boolean canBeTransported = BeltMovementHandler.canBeTransported(entity); boolean canBeTransported = BeltMovementHandler.canBeTransported(entity);
boolean leftTheBelt = boolean leftTheBelt =
info.ticksSinceLastCollision > ((getBlockState().get(BeltBlock.SLOPE) != HORIZONTAL) ? 3 : 1); info.getTicksSinceLastCollision() > ((getBlockState().get(BeltBlock.SLOPE) != HORIZONTAL) ? 3 : 1);
if (!canBeTransported || leftTheBelt) { if (!canBeTransported || leftTheBelt) {
toRemove.add(entity); toRemove.add(entity);
return; return;
@ -193,7 +196,7 @@ public class BeltTileEntity extends KineticTileEntity {
public void applyColor(DyeColor colorIn) { public void applyColor(DyeColor colorIn) {
int colorValue = colorIn.getMapColor().colorValue; int colorValue = colorIn.getMapColor().colorValue;
for (BlockPos blockPos : BeltBlock.getBeltChain(world, getController())) { for (BlockPos blockPos : BeltBlock.getBeltChain(world, getController())) {
BeltTileEntity belt = (BeltTileEntity) world.getTileEntity(blockPos); BeltTileEntity belt = BeltHelper.getSegmentTE(world, blockPos);
if (belt == null) if (belt == null)
continue; continue;
belt.color = belt.color == -1 ? colorValue : ColorHelper.mixColors(belt.color, colorValue, .5f); belt.color = belt.color == -1 ? colorValue : ColorHelper.mixColors(belt.color, colorValue, .5f);

View file

@ -18,6 +18,7 @@ import com.simibubi.create.foundation.utility.TessellatorHelper;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope;
import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@ -107,7 +108,7 @@ public class BeltTileEntityRenderer extends SafeTileEntityRenderer<BeltTileEntit
int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0; int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0;
boolean slopeAlongX = te.getBeltFacing().getAxis() == Axis.X; boolean slopeAlongX = te.getBeltFacing().getAxis() == Axis.X;
for (TransportedItemStack transported : te.getInventory().items) { for (TransportedItemStack transported : te.getInventory().getItems()) {
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
TessellatorHelper.fightZFighting(transported.angle); TessellatorHelper.fightZFighting(transported.angle);
float offset = MathHelper.lerp(partialTicks, transported.prevBeltPosition, transported.beltPosition); float offset = MathHelper.lerp(partialTicks, transported.prevBeltPosition, transported.beltPosition);

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.contraptions.relays.belt; package com.simibubi.create.modules.contraptions.relays.belt.item;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -23,7 +23,7 @@ import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
public class BeltConnectorItemHandler { public class BeltConnectorHandler {
private static Random r = new Random(); private static Random r = new Random();

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.contraptions.relays.belt; package com.simibubi.create.modules.contraptions.relays.belt.item;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -7,6 +7,7 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.config.AllConfigs; import com.simibubi.create.config.AllConfigs;
import com.simibubi.create.foundation.item.IAddedByOther; import com.simibubi.create.foundation.item.IAddedByOther;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Part; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Part;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope;
import com.simibubi.create.modules.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.modules.contraptions.relays.elementary.ShaftBlock;
@ -17,6 +18,7 @@ import net.minecraft.item.ItemUseContext;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.NBTUtil; import net.minecraft.nbt.NBTUtil;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType; import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.Axis;
@ -184,8 +186,16 @@ public class BeltConnectorItem extends BlockItem implements IAddedByOther {
if (axis != world.getBlockState(second).get(BlockStateProperties.AXIS)) if (axis != world.getBlockState(second).get(BlockStateProperties.AXIS))
return false; return false;
float speed1 = ((KineticTileEntity) world.getTileEntity(first)).getTheoreticalSpeed(); TileEntity tileEntity = world.getTileEntity(first);
float speed2 = ((KineticTileEntity) world.getTileEntity(second)).getTheoreticalSpeed(); TileEntity tileEntity2 = world.getTileEntity(second);
if (!(tileEntity instanceof KineticTileEntity))
return false;
if (!(tileEntity2 instanceof KineticTileEntity))
return false;
float speed1 = ((KineticTileEntity) tileEntity).getTheoreticalSpeed();
float speed2 = ((KineticTileEntity) tileEntity2).getTheoreticalSpeed();
if (Math.signum(speed1) != Math.signum(speed2) && speed1 != 0 && speed2 != 0) if (Math.signum(speed1) != Math.signum(speed2) && speed1 != 0 && speed2 != 0)
return false; return false;

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.contraptions.relays.belt; package com.simibubi.create.modules.contraptions.relays.belt.transport;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -9,9 +9,13 @@ import java.util.function.Function;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.ServerSpeedProvider;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope;
import com.simibubi.create.modules.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelBlock;
import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelTileEntity;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -23,9 +27,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.common.util.Constants.NBT;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
@ -36,7 +38,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
public class BeltInventory { public class BeltInventory {
final BeltTileEntity belt; final BeltTileEntity belt;
final List<TransportedItemStack> items; private final List<TransportedItemStack> items;
final List<TransportedItemStack> toInsert; final List<TransportedItemStack> toInsert;
boolean beltMovementPositive; boolean beltMovementPositive;
final float SEGMENT_WINDOW = .75f; final float SEGMENT_WINDOW = .75f;
@ -52,7 +54,7 @@ public class BeltInventory {
// Reverse item collection if belt just reversed // Reverse item collection if belt just reversed
if (beltMovementPositive != movingPositive()) { if (beltMovementPositive != movingPositive()) {
beltMovementPositive = movingPositive(); beltMovementPositive = movingPositive();
Collections.reverse(items); Collections.reverse(getItems());
belt.markDirty(); belt.markDirty();
belt.sendData(); belt.sendData();
} }
@ -68,7 +70,7 @@ public class BeltInventory {
// Assuming the first entry is furthest on the belt // Assuming the first entry is furthest on the belt
TransportedItemStack stackInFront = null; TransportedItemStack stackInFront = null;
TransportedItemStack current = null; TransportedItemStack current = null;
Iterator<TransportedItemStack> iterator = items.iterator(); Iterator<TransportedItemStack> iterator = getItems().iterator();
float beltSpeed = belt.getDirectionAwareBeltMovementSpeed(); float beltSpeed = belt.getDirectionAwareBeltMovementSpeed();
Direction movementFacing = belt.getMovementFacing(); Direction movementFacing = belt.getMovementFacing();
@ -121,7 +123,7 @@ public class BeltInventory {
if (!onClient) { if (!onClient) {
// Don't move if belt attachments want to continue processing // Don't move if belt attachments want to continue processing
if (segmentBefore != -1 && current.locked) { if (segmentBefore != -1 && current.locked) {
BeltTileEntity beltSegment = getBeltSegment(segmentBefore); BeltTileEntity beltSegment = BeltHelper.getBeltAtSegment(belt, segmentBefore);
if (beltSegment != null) { if (beltSegment != null) {
current.locked = false; current.locked = false;
@ -143,7 +145,7 @@ public class BeltInventory {
int upcomingSegment = (int) (current.beltPosition + (beltMovementPositive ? .5f : -.5f)); int upcomingSegment = (int) (current.beltPosition + (beltMovementPositive ? .5f : -.5f));
for (int segment = upcomingSegment; beltMovementPositive ? segment + .5f <= nextOffset for (int segment = upcomingSegment; beltMovementPositive ? segment + .5f <= nextOffset
: segment + .5f >= nextOffset; segment += beltMovementPositive ? 1 : -1) { : segment + .5f >= nextOffset; segment += beltMovementPositive ? 1 : -1) {
BeltTileEntity beltSegment = getBeltSegment(segmentBefore); BeltTileEntity beltSegment = BeltHelper.getBeltAtSegment(belt, segmentBefore);
if (beltSegment == null) if (beltSegment == null)
break; break;
for (BeltAttachmentState attachmentState : beltSegment.attachmentTracker.attachments) { for (BeltAttachmentState attachmentState : beltSegment.attachmentTracker.attachments) {
@ -196,7 +198,7 @@ public class BeltInventory {
if (segment == -1) if (segment == -1)
continue; continue;
if (!world.isRemote) if (!world.isRemote)
world.updateComparatorOutputLevel(getPositionForOffset(segment), world.updateComparatorOutputLevel(BeltHelper.getPositionForOffset(belt, segment),
belt.getBlockState().getBlock()); belt.getBlockState().getBlock());
} }
} }
@ -207,7 +209,8 @@ public class BeltInventory {
continue; continue;
int lastOffset = beltMovementPositive ? belt.beltLength - 1 : 0; int lastOffset = beltMovementPositive ? belt.beltLength - 1 : 0;
BlockPos nextPosition = getPositionForOffset(beltMovementPositive ? belt.beltLength : -1); BlockPos nextPosition =
BeltHelper.getPositionForOffset(belt, beltMovementPositive ? belt.beltLength : -1);
BlockState state = world.getBlockState(nextPosition); BlockState state = world.getBlockState(nextPosition);
// next block is a basin or a saw // next block is a basin or a saw
@ -275,7 +278,7 @@ public class BeltInventory {
} }
private boolean stuckAtTunnel(int offset, ItemStack stack, Direction movementDirection) { private boolean stuckAtTunnel(int offset, ItemStack stack, Direction movementDirection) {
BlockPos pos = getPositionForOffset(offset).up(); BlockPos pos = BeltHelper.getPositionForOffset(belt, offset).up();
if (!AllBlocks.BELT_TUNNEL.typeOf(belt.getWorld().getBlockState(pos))) if (!AllBlocks.BELT_TUNNEL.typeOf(belt.getWorld().getBlockState(pos)))
return false; return false;
TileEntity te = belt.getWorld().getTileEntity(pos); TileEntity te = belt.getWorld().getTileEntity(pos);
@ -313,7 +316,7 @@ public class BeltInventory {
private void flapTunnel(int offset, Direction side, boolean inward) { private void flapTunnel(int offset, Direction side, boolean inward) {
if (belt.getBlockState().get(BeltBlock.SLOPE) != Slope.HORIZONTAL) if (belt.getBlockState().get(BeltBlock.SLOPE) != Slope.HORIZONTAL)
return; return;
BlockPos pos = getPositionForOffset(offset).up(); BlockPos pos = BeltHelper.getPositionForOffset(belt, offset).up();
if (!AllBlocks.BELT_TUNNEL.typeOf(belt.getWorld().getBlockState(pos))) if (!AllBlocks.BELT_TUNNEL.typeOf(belt.getWorld().getBlockState(pos)))
return; return;
TileEntity te = belt.getWorld().getTileEntity(pos); TileEntity te = belt.getWorld().getTileEntity(pos);
@ -335,7 +338,7 @@ public class BeltInventory {
else if (!beltMovementPositive) else if (!beltMovementPositive)
segmentPos += 1f; segmentPos += 1f;
for (TransportedItemStack stack : items) for (TransportedItemStack stack : getItems())
if (isBlocking(segment, side, segmentPos, stack)) if (isBlocking(segment, side, segmentPos, stack))
return false; return false;
for (TransportedItemStack stack : toInsert) for (TransportedItemStack stack : toInsert)
@ -358,23 +361,23 @@ public class BeltInventory {
} }
private void insert(TransportedItemStack newStack) { private void insert(TransportedItemStack newStack) {
if (items.isEmpty()) if (getItems().isEmpty())
items.add(newStack); getItems().add(newStack);
else { else {
int index = 0; int index = 0;
for (TransportedItemStack stack : items) { for (TransportedItemStack stack : getItems()) {
if (stack.compareTo(newStack) > 0 == beltMovementPositive) if (stack.compareTo(newStack) > 0 == beltMovementPositive)
break; break;
index++; index++;
} }
items.add(index, newStack); getItems().add(index, newStack);
} }
} }
public TransportedItemStack getStackAtOffset(int offset) { public TransportedItemStack getStackAtOffset(int offset) {
float min = offset + .5f - (SEGMENT_WINDOW / 2); float min = offset + .5f - (SEGMENT_WINDOW / 2);
float max = offset + .5f + (SEGMENT_WINDOW / 2); float max = offset + .5f + (SEGMENT_WINDOW / 2);
for (TransportedItemStack stack : items) { for (TransportedItemStack stack : getItems()) {
if (stack.beltPosition > max) if (stack.beltPosition > max)
break; break;
if (stack.beltPosition > min) if (stack.beltPosition > min)
@ -384,16 +387,16 @@ public class BeltInventory {
} }
public void read(CompoundNBT nbt) { public void read(CompoundNBT nbt) {
items.clear(); getItems().clear();
nbt.getList("Items", NBT.TAG_COMPOUND) nbt.getList("Items", NBT.TAG_COMPOUND)
.forEach(inbt -> items.add(TransportedItemStack.read((CompoundNBT) inbt))); .forEach(inbt -> getItems().add(TransportedItemStack.read((CompoundNBT) inbt)));
beltMovementPositive = nbt.getBoolean("PositiveOrder"); beltMovementPositive = nbt.getBoolean("PositiveOrder");
} }
public CompoundNBT write() { public CompoundNBT write() {
CompoundNBT nbt = new CompoundNBT(); CompoundNBT nbt = new CompoundNBT();
ListNBT itemsNBT = new ListNBT(); ListNBT itemsNBT = new ListNBT();
items.forEach(stack -> itemsNBT.add(stack.serializeNBT())); getItems().forEach(stack -> itemsNBT.add(stack.serializeNBT()));
nbt.put("Items", itemsNBT); nbt.put("Items", itemsNBT);
nbt.putBoolean("PositiveOrder", beltMovementPositive); nbt.putBoolean("PositiveOrder", beltMovementPositive);
return nbt; return nbt;
@ -401,7 +404,7 @@ public class BeltInventory {
public void eject(TransportedItemStack stack) { public void eject(TransportedItemStack stack) {
ItemStack ejected = stack.stack; ItemStack ejected = stack.stack;
Vec3d outPos = getVectorForOffset(stack.beltPosition); Vec3d outPos = BeltHelper.getVectorForOffset(belt, stack.beltPosition);
float movementSpeed = Math.max(Math.abs(belt.getBeltMovementSpeed()), 1 / 8f); float movementSpeed = Math.max(Math.abs(belt.getBeltMovementSpeed()), 1 / 8f);
Vec3d outMotion = new Vec3d(belt.getBeltChainDirection()).scale(movementSpeed).add(0, 1 / 8f, 0); Vec3d outMotion = new Vec3d(belt.getBeltChainDirection()).scale(movementSpeed).add(0, 1 / 8f, 0);
outPos.add(outMotion.normalize()); outPos.add(outMotion.normalize());
@ -412,40 +415,9 @@ public class BeltInventory {
belt.getWorld().addEntity(entity); belt.getWorld().addEntity(entity);
} }
public Vec3d getVectorForOffset(float offset) { public void ejectAll() {
Slope slope = belt.getBlockState().get(BeltBlock.SLOPE); getItems().forEach(this::eject);
int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0; getItems().clear();
float verticalMovement = verticality;
if (offset < .5)
verticalMovement = 0;
verticalMovement = verticalMovement * (Math.min(offset, belt.beltLength - .5f) - .5f);
Vec3d vec = VecHelper.getCenterOf(belt.getPos());
Vec3d horizontalMovement = new Vec3d(belt.getBeltFacing().getDirectionVec()).scale(offset - .5f);
if (slope == Slope.VERTICAL)
horizontalMovement = Vec3d.ZERO;
vec = vec.add(horizontalMovement).add(0, verticalMovement, 0);
return vec;
}
private BeltTileEntity getBeltSegment(int segment) {
BlockPos pos = getPositionForOffset(segment);
TileEntity te = belt.getWorld().getTileEntity(pos);
if (te == null || !(te instanceof BeltTileEntity))
return null;
return (BeltTileEntity) te;
}
private BlockPos getPositionForOffset(int offset) {
BlockPos pos = belt.getPos();
Vec3i vec = belt.getBeltFacing().getDirectionVec();
Slope slope = belt.getBlockState().get(BeltBlock.SLOPE);
int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0;
return pos.add(offset * vec.getX(), MathHelper.clamp(offset, 0, belt.beltLength - 1) * verticality,
offset * vec.getZ());
} }
private boolean movingPositive() { private boolean movingPositive() {
@ -460,7 +432,7 @@ public class BeltInventory {
Function<TransportedItemStack, List<TransportedItemStack>> callback) { Function<TransportedItemStack, List<TransportedItemStack>> callback) {
List<TransportedItemStack> toBeAdded = new ArrayList<>(); List<TransportedItemStack> toBeAdded = new ArrayList<>();
boolean dirty = false; boolean dirty = false;
for (Iterator<TransportedItemStack> iterator = items.iterator(); iterator.hasNext();) { for (Iterator<TransportedItemStack> iterator = getItems().iterator(); iterator.hasNext();) {
TransportedItemStack transportedItemStack = iterator.next(); TransportedItemStack transportedItemStack = iterator.next();
if (Math.abs(position - transportedItemStack.beltPosition) < distance) { if (Math.abs(position - transportedItemStack.beltPosition) < distance) {
List<TransportedItemStack> apply = callback.apply(transportedItemStack); List<TransportedItemStack> apply = callback.apply(transportedItemStack);
@ -478,4 +450,8 @@ public class BeltInventory {
} }
} }
public List<TransportedItemStack> getItems() {
return items;
}
} }

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.contraptions.relays.belt; package com.simibubi.create.modules.contraptions.relays.belt.transport;
import static net.minecraft.entity.MoverType.SELF; import static net.minecraft.entity.MoverType.SELF;
import static net.minecraft.util.Direction.AxisDirection.NEGATIVE; import static net.minecraft.util.Direction.AxisDirection.NEGATIVE;
@ -9,8 +9,10 @@ import java.util.List;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.modules.contraptions.components.contraptions.ContraptionEntity; import com.simibubi.create.modules.contraptions.components.contraptions.ContraptionEntity;
import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Part; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Part;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@ -50,6 +52,10 @@ public class BeltMovementHandler {
ticksSinceLastCollision++; ticksSinceLastCollision++;
return this; return this;
} }
public int getTicksSinceLastCollision() {
return ticksSinceLastCollision;
}
} }
public static boolean canBeTransported(Entity entity) { public static boolean canBeTransported(Entity entity) {

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.contraptions.relays.belt; package com.simibubi.create.modules.contraptions.relays.belt.transport;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.contraptions.relays.belt; package com.simibubi.create.modules.contraptions.relays.belt.transport;
import java.util.Random; import java.util.Random;

View file

@ -1,6 +1,6 @@
package com.simibubi.create.modules.contraptions.relays.encased; package com.simibubi.create.modules.contraptions.relays.encased;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -14,7 +14,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
public class AdjustablePulleyBlock extends EncasedBeltBlock implements IWithTileEntity<AdjustablePulleyTileEntity> { public class AdjustablePulleyBlock extends EncasedBeltBlock implements ITE<AdjustablePulleyTileEntity> {
public static BooleanProperty POWERED = BlockStateProperties.POWERED; public static BooleanProperty POWERED = BlockStateProperties.POWERED;
@ -34,7 +34,8 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements IWithTile
@Override @Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
if (oldState.getBlock() != state.getBlock()) if (oldState.getBlock() == state.getBlock())
return;
withTileEntityDo(worldIn, pos, AdjustablePulleyTileEntity::neighborChanged); withTileEntityDo(worldIn, pos, AdjustablePulleyTileEntity::neighborChanged);
} }
@ -61,4 +62,9 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements IWithTile
worldIn.setBlockState(pos, state.cycle(POWERED), 18); worldIn.setBlockState(pos, state.cycle(POWERED), 18);
} }
@Override
public Class<AdjustablePulleyTileEntity> getTileEntityClass() {
return AdjustablePulleyTileEntity.class;
}
} }

View file

@ -4,6 +4,7 @@ import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock; import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock; import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;

View file

@ -1,7 +1,7 @@
package com.simibubi.create.modules.contraptions.relays.encased; package com.simibubi.create.modules.contraptions.relays.encased;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.modules.contraptions.RotationPropagator; import com.simibubi.create.modules.contraptions.RotationPropagator;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.relays.gearbox.GearshiftTileEntity; import com.simibubi.create.modules.contraptions.relays.gearbox.GearshiftTileEntity;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -17,7 +17,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class GearshiftBlock extends EncasedShaftBlock { public class GearshiftBlock extends EncasedShaftBlock implements ITE<GearshiftTileEntity> {
public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
@ -51,7 +51,7 @@ public class GearshiftBlock extends EncasedShaftBlock {
boolean previouslyPowered = state.get(POWERED); boolean previouslyPowered = state.get(POWERED);
if (previouslyPowered != worldIn.isBlockPowered(pos)) { if (previouslyPowered != worldIn.isBlockPowered(pos)) {
RotationPropagator.handleRemoved(worldIn, pos, (KineticTileEntity) worldIn.getTileEntity(pos)); withTileEntityDo(worldIn, pos, te -> RotationPropagator.handleRemoved(worldIn, pos, te));
worldIn.setBlockState(pos, state.cycle(POWERED), 2); worldIn.setBlockState(pos, state.cycle(POWERED), 2);
} }
} }
@ -60,4 +60,9 @@ public class GearshiftBlock extends EncasedShaftBlock {
return super.hasShaftTowards(world, pos, state, face); return super.hasShaftTowards(world, pos, state, face);
} }
@Override
public Class<GearshiftTileEntity> getTileEntityClass() {
return GearshiftTileEntity.class;
}
} }

View file

@ -6,10 +6,11 @@ import java.util.List;
import com.simibubi.create.foundation.block.IHaveCustomBlockModel; import com.simibubi.create.foundation.block.IHaveCustomBlockModel;
import com.simibubi.create.foundation.block.IHaveNoBlockItem; import com.simibubi.create.foundation.block.IHaveNoBlockItem;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.FourWayBlock; import net.minecraft.block.FourWayBlock;
import net.minecraft.block.PaneBlock; import net.minecraft.block.PaneBlock;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@ -46,7 +47,7 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
public class WindowInABlockBlock extends PaneBlock public class WindowInABlockBlock extends PaneBlock
implements IWithTileEntity<WindowInABlockTileEntity>, IHaveNoBlockItem, IHaveCustomBlockModel { implements ITE<WindowInABlockTileEntity>, IHaveNoBlockItem, IHaveCustomBlockModel {
public WindowInABlockBlock() { public WindowInABlockBlock() {
super(Properties.create(Material.ROCK)); super(Properties.create(Material.ROCK));
@ -70,14 +71,13 @@ public class WindowInABlockBlock extends PaneBlock
Vec3d start = player.getEyePosition(1); Vec3d start = player.getEyePosition(1);
Vec3d end = start.add(player.getLookVec().scale(player.getAttribute(PlayerEntity.REACH_DISTANCE).getValue())); Vec3d end = start.add(player.getLookVec().scale(player.getAttribute(PlayerEntity.REACH_DISTANCE).getValue()));
BlockRayTraceResult target = world BlockRayTraceResult target =
.rayTraceBlocks(new RayTraceContext(start, end, BlockMode.OUTLINE, FluidMode.NONE, player)); world.rayTraceBlocks(new RayTraceContext(start, end, BlockMode.OUTLINE, FluidMode.NONE, player));
if (target == null || target.getHitVec() == null) if (target == null || target.getHitVec() == null)
return super.removedByPlayer(state, world, pos, player, willHarvest, fluid); return super.removedByPlayer(state, world, pos, player, willHarvest, fluid);
try {
WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); WindowInABlockTileEntity tileEntity = getTileEntity(world, pos);
if (tileEntity == null)
return super.removedByPlayer(state, world, pos, player, willHarvest, fluid);
BlockState windowBlock = tileEntity.getWindowBlock(); BlockState windowBlock = tileEntity.getWindowBlock();
for (AxisAlignedBB bb : windowBlock.getShape(world, pos).toBoundingBoxList()) { for (AxisAlignedBB bb : windowBlock.getShape(world, pos).toBoundingBoxList()) {
if (bb.grow(.1d).contains(target.getHitVec().subtract(new Vec3d(pos)))) { if (bb.grow(.1d).contains(target.getHitVec().subtract(new Vec3d(pos)))) {
@ -96,6 +96,7 @@ public class WindowInABlockBlock extends PaneBlock
return false; return false;
} }
} }
} catch (TileEntityException e) {}
return super.removedByPlayer(state, world, pos, player, willHarvest, fluid); return super.removedByPlayer(state, world, pos, player, willHarvest, fluid);
} }
@ -112,49 +113,36 @@ public class WindowInABlockBlock extends PaneBlock
@Override @Override
public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) {
WindowInABlockTileEntity tileEntity = getTileEntity(reader, pos); return getSurroundingBlockState(reader, pos).propagatesSkylightDown(reader, pos);
if (tileEntity == null)
return super.propagatesSkylightDown(state, reader, pos);
return tileEntity.getPartialBlock().propagatesSkylightDown(reader, pos);
} }
@Override @Override
public boolean collisionExtendsVertically(BlockState state, IBlockReader world, BlockPos pos, public boolean collisionExtendsVertically(BlockState state, IBlockReader world, BlockPos pos,
Entity collidingEntity) { Entity collidingEntity) {
WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); return getSurroundingBlockState(world, pos).collisionExtendsVertically(world, pos, collidingEntity);
if (tileEntity == null)
return false;
return tileEntity.getPartialBlock().collisionExtendsVertically(world, pos, collidingEntity);
} }
@Override @Override
public float getBlockHardness(BlockState blockState, IBlockReader worldIn, BlockPos pos) { public float getBlockHardness(BlockState blockState, IBlockReader worldIn, BlockPos pos) {
WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos); return getSurroundingBlockState(worldIn, pos).getBlockHardness(worldIn, pos);
if (tileEntity == null)
return 0;
return tileEntity.getPartialBlock().getBlockHardness(worldIn, pos);
} }
@Override @Override
public float getExplosionResistance(BlockState state, IWorldReader world, BlockPos pos, Entity exploder, public float getExplosionResistance(BlockState state, IWorldReader world, BlockPos pos, Entity exploder,
Explosion explosion) { Explosion explosion) {
WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); return getSurroundingBlockState(world, pos).getExplosionResistance(world, pos, exploder, explosion);
if (tileEntity == null)
return 0;
return tileEntity.getPartialBlock().getExplosionResistance(world, pos, exploder, explosion);
} }
@Override @Override
public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos,
PlayerEntity player) { PlayerEntity player) {
WindowInABlockTileEntity tileEntity = getTileEntity(world, pos); BlockState window = getWindowBlockState(world, pos);
if (tileEntity == null) for (AxisAlignedBB bb : window.getShape(world, pos).toBoundingBoxList()) {
return ItemStack.EMPTY;
for (AxisAlignedBB bb : tileEntity.getWindowBlock().getShape(world, pos).toBoundingBoxList()) {
if (bb.grow(.1d).contains(target.getHitVec().subtract(new Vec3d(pos)))) if (bb.grow(.1d).contains(target.getHitVec().subtract(new Vec3d(pos))))
return tileEntity.getWindowBlock().getPickBlock(target, world, pos, player); return window.getPickBlock(target, world, pos, player);
} }
return tileEntity.getPartialBlock().getPickBlock(target, world, pos, player); BlockState surrounding = getSurroundingBlockState(world, pos);
return surrounding.getPickBlock(target, world, pos, player);
} }
@Override @Override
@ -171,11 +159,8 @@ public class WindowInABlockBlock extends PaneBlock
@Override @Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos); VoxelShape shape1 = getSurroundingBlockState(worldIn, pos).getShape(worldIn, pos, context);
if (tileEntity == null) VoxelShape shape2 = getWindowBlockState(worldIn, pos).getShape(worldIn, pos, context);
return makeCuboidShape(7, 0, 7, 9, 16, 9);
VoxelShape shape1 = tileEntity.getPartialBlock().getShape(worldIn, pos, context);
VoxelShape shape2 = tileEntity.getWindowBlock().getShape(worldIn, pos, context);
return VoxelShapes.or(shape1, shape2); return VoxelShapes.or(shape1, shape2);
} }
@ -188,10 +173,7 @@ public class WindowInABlockBlock extends PaneBlock
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override @Override
public MaterialColor getMaterialColor(BlockState state, IBlockReader worldIn, BlockPos pos) { public MaterialColor getMaterialColor(BlockState state, IBlockReader worldIn, BlockPos pos) {
WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos); return getSurroundingBlockState(worldIn, pos).getMaterialColor(worldIn, pos);
if (tileEntity == null)
return MaterialColor.AIR;
return tileEntity.getPartialBlock().getMaterialColor(worldIn, pos);
} }
@Override @Override
@ -200,8 +182,8 @@ public class WindowInABlockBlock extends PaneBlock
withTileEntityDo(worldIn, currentPos, te -> { withTileEntityDo(worldIn, currentPos, te -> {
te.setWindowBlock( te.setWindowBlock(
te.getWindowBlock().updatePostPlacement(facing, facingState, worldIn, currentPos, facingPos)); te.getWindowBlock().updatePostPlacement(facing, facingState, worldIn, currentPos, facingPos));
BlockState blockState = te.getPartialBlock().updatePostPlacement(facing, facingState, worldIn, currentPos, BlockState blockState =
facingPos); te.getPartialBlock().updatePostPlacement(facing, facingState, worldIn, currentPos, facingPos);
if (blockState.getBlock() instanceof FourWayBlock) { if (blockState.getBlock() instanceof FourWayBlock) {
for (BooleanProperty side : Arrays.asList(FourWayBlock.EAST, FourWayBlock.NORTH, FourWayBlock.SOUTH, for (BooleanProperty side : Arrays.asList(FourWayBlock.EAST, FourWayBlock.NORTH, FourWayBlock.SOUTH,
FourWayBlock.WEST)) FourWayBlock.WEST))
@ -214,6 +196,20 @@ public class WindowInABlockBlock extends PaneBlock
return stateIn; return stateIn;
} }
private BlockState getSurroundingBlockState(IBlockReader reader, BlockPos pos) {
try {
return getTileEntity(reader, pos).getPartialBlock();
} catch (TileEntityException e) {}
return Blocks.AIR.getDefaultState();
}
private BlockState getWindowBlockState(IBlockReader reader, BlockPos pos) {
try {
return getTileEntity(reader, pos).getWindowBlock();
} catch (TileEntityException e) {}
return Blocks.AIR.getDefaultState();
}
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) { public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) {
return false; return false;
@ -225,4 +221,9 @@ public class WindowInABlockBlock extends PaneBlock
return new WindowInABlockModel(original); return new WindowInABlockModel(original);
} }
@Override
public Class<WindowInABlockTileEntity> getTileEntityClass() {
return WindowInABlockTileEntity.class;
}
} }

View file

@ -0,0 +1,84 @@
package com.simibubi.create.modules.curiosities.partialWindows;
import java.util.Arrays;
import com.simibubi.create.AllBlockTags;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.config.AllConfigs;
import net.minecraft.block.BlockState;
import net.minecraft.block.FourWayBlock;
import net.minecraft.block.WallBlock;
import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack;
import net.minecraft.state.BooleanProperty;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.Tags;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock;
import net.minecraftforge.eventbus.api.Event.Result;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
@EventBusSubscriber(bus = Bus.FORGE)
public class WindowLoggingHandler {
@SubscribeEvent
public static void rightClickPartialBlockWithPaneMakesItWindowLogged(RightClickBlock event) {
if (event.getUseItem() == Result.DENY)
return;
if (event.getEntityLiving().isSneaking())
return;
if (!event.getPlayer().isAllowEdit())
return;
if (!AllConfigs.SERVER.curiosities.allowGlassPanesInPartialBlocks.get())
return;
ItemStack stack = event.getItemStack();
if (stack.isEmpty())
return;
if (!(stack.getItem() instanceof BlockItem))
return;
BlockItem item = (BlockItem) stack.getItem();
if (!item.isIn(Tags.Items.GLASS_PANES)
&& (item.getBlock() == null || !item.getBlock().isIn(Tags.Blocks.GLASS_PANES)))
return;
BlockPos pos = event.getPos();
World world = event.getWorld();
BlockState blockState = world.getBlockState(pos);
if (!AllBlockTags.WINDOWABLE.matches(blockState))
return;
if (AllBlocks.WINDOW_IN_A_BLOCK.typeOf(blockState))
return;
BlockState defaultState = AllBlocks.WINDOW_IN_A_BLOCK.get().getDefaultState();
world.setBlockState(pos, defaultState);
TileEntity te = world.getTileEntity(pos);
if (te != null && te instanceof WindowInABlockTileEntity) {
WindowInABlockTileEntity wte = (WindowInABlockTileEntity) te;
wte.setWindowBlock(item.getBlock().getDefaultState());
wte.updateWindowConnections();
if (blockState.getBlock() instanceof FourWayBlock) {
for (BooleanProperty side : Arrays.asList(FourWayBlock.EAST, FourWayBlock.NORTH, FourWayBlock.SOUTH,
FourWayBlock.WEST))
blockState = blockState.with(side, false);
}
if (blockState.getBlock() instanceof WallBlock)
blockState = blockState.with(WallBlock.UP, true);
wte.setPartialBlock(blockState);
wte.requestModelDataUpdate();
if (!event.getPlayer().isCreative())
stack.shrink(1);
event.getPlayer().swingArm(event.getHand());
}
event.setCanceled(true);
}
}

View file

@ -12,7 +12,7 @@ import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.modules.contraptions.components.fan.SplashingRecipe; import com.simibubi.create.modules.contraptions.components.fan.SplashingRecipe;
import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe; import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.TransportedItemStack; import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.logistics.block.belts; package com.simibubi.create.modules.logistics.block;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IHaveNoBlockItem; import com.simibubi.create.foundation.block.IHaveNoBlockItem;

View file

@ -1,19 +1,22 @@
package com.simibubi.create.modules.logistics.block; package com.simibubi.create.modules.logistics.block;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.block.ProperDirectionalBlock; import com.simibubi.create.foundation.block.ProperDirectionalBlock;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.modules.contraptions.IWrenchable;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.material.PushReaction;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemUseContext;
import net.minecraft.state.BooleanProperty; import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
@ -25,7 +28,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class RedstoneLinkBlock extends ProperDirectionalBlock { public class RedstoneLinkBlock extends ProperDirectionalBlock implements ITE<RedstoneLinkTileEntity>, IWrenchable {
public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
public static final BooleanProperty RECEIVER = BooleanProperty.create("receiver"); public static final BooleanProperty RECEIVER = BooleanProperty.create("receiver");
@ -72,11 +75,7 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock {
if (previouslyPowered != shouldPower) { if (previouslyPowered != shouldPower) {
worldIn.setBlockState(pos, state.cycle(POWERED), 2); worldIn.setBlockState(pos, state.cycle(POWERED), 2);
withTileEntityDo(worldIn, pos, te -> te.transmit(!previouslyPowered));
RedstoneLinkTileEntity te = (RedstoneLinkTileEntity) worldIn.getTileEntity(pos);
if (te == null)
return;
te.transmit(!previouslyPowered);
} }
} }
@ -118,13 +117,16 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock {
@Override @Override
public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn,
BlockRayTraceResult hit) { BlockRayTraceResult hit) {
if (player.isSneaking())
if (player.isSneaking()) { return toggleMode(state, worldIn, pos);
RedstoneLinkTileEntity te = (RedstoneLinkTileEntity) worldIn.getTileEntity(pos);
if (te == null)
return false; return false;
}
if (!worldIn.isRemote) { public boolean toggleMode(BlockState state, World worldIn, BlockPos pos) {
if (worldIn.isRemote)
return true;
try {
RedstoneLinkTileEntity te = getTileEntity(worldIn, pos);
Boolean wasReceiver = state.get(RECEIVER); Boolean wasReceiver = state.get(RECEIVER);
boolean blockPowered = worldIn.isBlockPowered(pos); boolean blockPowered = worldIn.isBlockPowered(pos);
worldIn.setBlockState(pos, state.cycle(RECEIVER).with(POWERED, blockPowered), 3); worldIn.setBlockState(pos, state.cycle(RECEIVER).with(POWERED, blockPowered), 3);
@ -132,11 +134,16 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock {
te.transmit(worldIn.isBlockPowered(pos)); te.transmit(worldIn.isBlockPowered(pos));
} else } else
te.transmit(false); te.transmit(false);
}
return true; return true;
} catch (TileEntityException e) {}
return false;
} }
return false; @Override
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
if (toggleMode(state, context.getWorld(), context.getPos()))
return ActionResultType.SUCCESS;
return IWrenchable.super.onWrenched(state, context);
} }
@Override @Override
@ -169,8 +176,8 @@ public class RedstoneLinkBlock extends ProperDirectionalBlock {
} }
@Override @Override
public PushReaction getPushReaction(BlockState state) { public Class<RedstoneLinkTileEntity> getTileEntityClass() {
return PushReaction.BLOCK; return RedstoneLinkTileEntity.class;
} }
} }

View file

@ -1,5 +1,6 @@
package com.simibubi.create.modules.logistics.block; package com.simibubi.create.modules.logistics.block;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.ScreenOpener;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -24,7 +25,7 @@ import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
public class StockswitchBlock extends HorizontalBlock { public class StockswitchBlock extends HorizontalBlock implements ITE<StockswitchTileEntity> {
public static final IntegerProperty INDICATOR = IntegerProperty.create("indicator", 0, 6); public static final IntegerProperty INDICATOR = IntegerProperty.create("indicator", 0, 6);
@ -52,10 +53,7 @@ public class StockswitchBlock extends HorizontalBlock {
} }
private void updateObservedInventory(BlockState state, IWorldReader world, BlockPos pos) { private void updateObservedInventory(BlockState state, IWorldReader world, BlockPos pos) {
StockswitchTileEntity te = (StockswitchTileEntity) world.getTileEntity(pos); withTileEntityDo(world, pos, StockswitchTileEntity::updateCurrentLevel);
if (te == null)
return;
te.updateCurrentLevel();
} }
private boolean isObserving(BlockState state, BlockPos pos, BlockPos observing) { private boolean isObserving(BlockState state, BlockPos pos, BlockPos observing) {
@ -74,8 +72,10 @@ public class StockswitchBlock extends HorizontalBlock {
@Override @Override
public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) { public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) {
StockswitchTileEntity te = (StockswitchTileEntity) blockAccess.getTileEntity(pos); try {
return te == null || !te.powered ? 0 : 15; return getTileEntity(blockAccess, pos).powered ? 15 : 0;
} catch (TileEntityException e) {}
return 0;
} }
@Override @Override
@ -87,9 +87,7 @@ public class StockswitchBlock extends HorizontalBlock {
@Override @Override
public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn,
BlockRayTraceResult hit) { BlockRayTraceResult hit) {
DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> withTileEntityDo(worldIn, pos, this::displayScreen));
displayScreen((StockswitchTileEntity) worldIn.getTileEntity(pos));
});
return true; return true;
} }
@ -143,4 +141,9 @@ public class StockswitchBlock extends HorizontalBlock {
return PushReaction.BLOCK; return PushReaction.BLOCK;
} }
@Override
public Class<StockswitchTileEntity> getTileEntityClass() {
return StockswitchTileEntity.class;
}
} }

View file

@ -10,7 +10,8 @@ import com.simibubi.create.foundation.behaviour.inventory.SingleTargetAutoExtrac
import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState;
import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.IBeltAttachment; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.IBeltAttachment;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.TransportedItemStack; import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.logistics.block.belts; package com.simibubi.create.modules.logistics.block.belts.observer;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -7,7 +7,7 @@ import java.util.Random;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour;
import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.IWrenchable; import com.simibubi.create.modules.contraptions.IWrenchable;
@ -17,7 +17,7 @@ import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Part; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Part;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.TransportedItemStack; import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -47,7 +47,7 @@ import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
public class BeltObserverBlock extends HorizontalBlock public class BeltObserverBlock extends HorizontalBlock
implements IWithTileEntity<BeltObserverTileEntity>, IBeltAttachment, IWrenchable { implements ITE<BeltObserverTileEntity>, IBeltAttachment, IWrenchable {
public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
public static final BooleanProperty BELT = BooleanProperty.create("belt"); public static final BooleanProperty BELT = BooleanProperty.create("belt");
@ -302,4 +302,9 @@ public class BeltObserverBlock extends HorizontalBlock
} }
} }
@Override
public Class<BeltObserverTileEntity> getTileEntityClass() {
return BeltObserverTileEntity.class;
}
} }

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.logistics.block.belts; package com.simibubi.create.modules.logistics.block.belts.observer;
import com.simibubi.create.foundation.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.behaviour.ValueBoxTransform;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.logistics.block.belts; package com.simibubi.create.modules.logistics.block.belts.observer;
import java.util.List; import java.util.List;
@ -6,11 +6,12 @@ import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.behaviour.base.SmartTileEntity; import com.simibubi.create.foundation.behaviour.base.SmartTileEntity;
import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour;
import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.modules.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.logistics.block.belts.BeltObserverBlock.Mode; import com.simibubi.create.modules.logistics.block.belts.observer.BeltObserverBlock.Mode;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
public class BeltObserverTileEntity extends SmartTileEntity { public class BeltObserverTileEntity extends SmartTileEntity {
@ -43,16 +44,16 @@ public class BeltObserverTileEntity extends SmartTileEntity {
if (getBlockState().get(BeltObserverBlock.MODE) != Mode.DETECT) if (getBlockState().get(BeltObserverBlock.MODE) != Mode.DETECT)
return; return;
TileEntity tileEntity = BlockPos targetPos = pos.offset(getBlockState().get(BeltObserverBlock.HORIZONTAL_FACING));
world.getTileEntity(pos.offset(getBlockState().get(BeltObserverBlock.HORIZONTAL_FACING)));
if (!(tileEntity instanceof BeltTileEntity)) BeltTileEntity beltTE = BeltHelper.getSegmentTE(world, targetPos);
if (beltTE == null)
return; return;
BeltTileEntity belt = (BeltTileEntity) tileEntity; BeltTileEntity controllerTE = beltTE.getControllerTE();
BeltTileEntity controllerTE = belt.getControllerTE();
if (controllerTE == null) if (controllerTE == null)
return; return;
controllerTE.getInventory().forEachWithin(belt.index + .5f, .45f, stack -> { controllerTE.getInventory().forEachWithin(beltTE.index + .5f, .45f, stack -> {
if (filtering.test(stack.stack) && turnOffTicks != 6) { if (filtering.test(stack.stack) && turnOffTicks != 6) {
world.setBlockState(pos, getBlockState().with(BeltObserverBlock.POWERED, true)); world.setBlockState(pos, getBlockState().with(BeltObserverBlock.POWERED, true));
world.notifyNeighborsOfStateChange(pos, getBlockState().getBlock()); world.notifyNeighborsOfStateChange(pos, getBlockState().getBlock());

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.logistics.block.belts; package com.simibubi.create.modules.logistics.block.belts.observer;
import com.mojang.blaze3d.platform.GLX; import com.mojang.blaze3d.platform.GLX;
import com.simibubi.create.foundation.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.behaviour.filtering.FilteringRenderer;

View file

@ -1,13 +1,14 @@
package com.simibubi.create.modules.contraptions.relays.belt; package com.simibubi.create.modules.logistics.block.belts.tunnel;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.IWrenchable; import com.simibubi.create.modules.contraptions.IWrenchable;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope; import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock.Slope;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -34,7 +35,7 @@ import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
public class BeltTunnelBlock extends Block implements IWithTileEntity<BeltTunnelTileEntity>, IWrenchable { public class BeltTunnelBlock extends Block implements ITE<BeltTunnelTileEntity>, IWrenchable {
public static final IProperty<Shape> SHAPE = EnumProperty.create("shape", Shape.class); public static final IProperty<Shape> SHAPE = EnumProperty.create("shape", Shape.class);
public static final IProperty<Axis> HORIZONTAL_AXIS = BlockStateProperties.HORIZONTAL_AXIS; public static final IProperty<Axis> HORIZONTAL_AXIS = BlockStateProperties.HORIZONTAL_AXIS;
@ -245,4 +246,9 @@ public class BeltTunnelBlock extends Block implements IWithTileEntity<BeltTunnel
super.fillStateContainer(builder); super.fillStateContainer(builder);
} }
@Override
public Class<BeltTunnelTileEntity> getTileEntityClass() {
return BeltTunnelTileEntity.class;
}
} }

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.contraptions.relays.belt; package com.simibubi.create.modules.logistics.block.belts.tunnel;
import static net.minecraft.block.Block.makeCuboidShape; import static net.minecraft.block.Block.makeCuboidShape;

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.contraptions.relays.belt; package com.simibubi.create.modules.logistics.block.belts.tunnel;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
@ -10,7 +10,7 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.block.SyncedTileEntity; import com.simibubi.create.foundation.block.SyncedTileEntity;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTunnelBlock.Shape; import com.simibubi.create.modules.logistics.block.belts.tunnel.BeltTunnelBlock.Shape;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.contraptions.relays.belt; package com.simibubi.create.modules.logistics.block.belts.tunnel;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.block.SafeTileEntityRendererFast; import com.simibubi.create.foundation.block.SafeTileEntityRendererFast;

View file

@ -6,7 +6,7 @@ import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock; import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock;
import com.simibubi.create.modules.contraptions.components.contraptions.MovementBehaviour; import com.simibubi.create.modules.contraptions.components.contraptions.MovementBehaviour;
import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.modules.logistics.block.belts.BeltAttachableLogisticalBlock; import com.simibubi.create.modules.logistics.block.belts.BeltAttachableLogisticalBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;

View file

@ -4,7 +4,7 @@ import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.components.contraptions.MovementBehaviour; import com.simibubi.create.modules.contraptions.components.contraptions.MovementBehaviour;
import com.simibubi.create.modules.contraptions.components.contraptions.MovementContext; import com.simibubi.create.modules.contraptions.components.contraptions.MovementContext;
import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.modules.logistics.item.filter.FilterItem; import com.simibubi.create.modules.logistics.item.filter.FilterItem;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;

View file

@ -5,7 +5,7 @@ import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING;
import com.simibubi.create.foundation.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.behaviour.ValueBoxTransform;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.modules.logistics.block.transposer.TransposerBlock; import com.simibubi.create.modules.logistics.block.transposer.TransposerBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;

View file

@ -14,7 +14,7 @@ import com.simibubi.create.foundation.behaviour.inventory.SingleTargetAutoExtrac
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;

View file

@ -5,7 +5,7 @@ import org.apache.commons.lang3.tuple.Pair;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.logistics.block.belts; package com.simibubi.create.modules.logistics.block.funnel;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@ -7,14 +7,16 @@ import java.util.List;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour;
import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock; import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock;
import com.simibubi.create.modules.contraptions.components.contraptions.MovementBehaviour; import com.simibubi.create.modules.contraptions.components.contraptions.MovementBehaviour;
import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.BeltAttachmentState;
import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.IBeltAttachment; import com.simibubi.create.modules.contraptions.relays.belt.AllBeltAttachments.IBeltAttachment;
import com.simibubi.create.modules.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.TransportedItemStack; import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack;
import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
@ -36,7 +38,8 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
public class FunnelBlock extends AttachedLogisticalBlock implements IBeltAttachment, IWithTileEntity<FunnelTileEntity>, IPortableBlock { public class FunnelBlock extends AttachedLogisticalBlock
implements IBeltAttachment, ITE<FunnelTileEntity>, IPortableBlock {
public static final BooleanProperty BELT = BooleanProperty.create("belt"); public static final BooleanProperty BELT = BooleanProperty.create("belt");
public static final MovementBehaviour MOVEMENT = new FunnelMovementBehaviour(); public static final MovementBehaviour MOVEMENT = new FunnelMovementBehaviour();
@ -123,17 +126,18 @@ public class FunnelBlock extends AttachedLogisticalBlock implements IBeltAttachm
@Override @Override
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
onAttachmentPlaced(worldIn, pos, state); onAttachmentPlaced(worldIn, pos, state);
if (worldIn.isRemote)
return;
if (isOnBelt(worldIn, pos)) { if (isOnBelt(worldIn, pos)) {
TileEntity te = worldIn.getTileEntity(pos.down()); BeltTileEntity belt = BeltHelper.getSegmentTE(worldIn, pos.down());
if (!(te instanceof BeltTileEntity)) if (belt == null)
return; return;
BeltTileEntity belt = (BeltTileEntity) te;
BeltTileEntity controllerBelt = belt.getControllerTE(); BeltTileEntity controllerBelt = belt.getControllerTE();
if (controllerBelt == null) if (controllerBelt == null)
return; return;
if (worldIn.isRemote)
return;
controllerBelt.getInventory().forEachWithin(belt.index + .5f, .55f, (transportedItemStack) -> { controllerBelt.getInventory().forEachWithin(belt.index + .5f, .55f, (transportedItemStack) -> {
controllerBelt.getInventory().eject(transportedItemStack); controllerBelt.getInventory().eject(transportedItemStack);
return Collections.emptyList(); return Collections.emptyList();
@ -199,7 +203,7 @@ public class FunnelBlock extends AttachedLogisticalBlock implements IBeltAttachm
public boolean process(BeltTileEntity belt, TransportedItemStack transported, BeltAttachmentState state) { public boolean process(BeltTileEntity belt, TransportedItemStack transported, BeltAttachmentState state) {
TileEntity te = belt.getWorld().getTileEntity(state.attachmentPos); TileEntity te = belt.getWorld().getTileEntity(state.attachmentPos);
if (te == null || !(te instanceof FunnelTileEntity)) if (!(te instanceof FunnelTileEntity))
return false; return false;
FunnelTileEntity funnel = (FunnelTileEntity) te; FunnelTileEntity funnel = (FunnelTileEntity) te;
ItemStack stack = funnel.tryToInsert(transported.stack); ItemStack stack = funnel.tryToInsert(transported.stack);
@ -219,4 +223,9 @@ public class FunnelBlock extends AttachedLogisticalBlock implements IBeltAttachm
return MOVEMENT; return MOVEMENT;
} }
@Override
public Class<FunnelTileEntity> getTileEntityClass() {
return FunnelTileEntity.class;
}
} }

View file

@ -1,8 +1,9 @@
package com.simibubi.create.modules.logistics.block.belts; package com.simibubi.create.modules.logistics.block.funnel;
import com.simibubi.create.foundation.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.behaviour.ValueBoxTransform;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.modules.logistics.block.extractor.ExtractorBlock; import com.simibubi.create.modules.logistics.block.extractor.ExtractorBlock;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.logistics.block.belts; package com.simibubi.create.modules.logistics.block.funnel;
import java.util.List; import java.util.List;

View file

@ -1,4 +1,4 @@
package com.simibubi.create.modules.logistics.block.belts; package com.simibubi.create.modules.logistics.block.funnel;
import java.util.List; import java.util.List;
@ -11,14 +11,15 @@ import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.behaviour.inventory.InsertingBehaviour; import com.simibubi.create.foundation.behaviour.inventory.InsertingBehaviour;
import com.simibubi.create.foundation.behaviour.inventory.InventoryManagementBehaviour.Attachments; import com.simibubi.create.foundation.behaviour.inventory.InventoryManagementBehaviour.Attachments;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.relays.belt.BeltHelper;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ItemParticleData;
import net.minecraft.particles.ParticleTypes; import net.minecraft.particles.ParticleTypes;
import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -103,10 +104,7 @@ public class FunnelTileEntity extends SmartTileEntity {
BlockPos targetPos = pos.offset(AttachedLogisticalBlock.getBlockFacing(getBlockState())); BlockPos targetPos = pos.offset(AttachedLogisticalBlock.getBlockFacing(getBlockState()));
if (!AllBlocks.BELT.typeOf(world.getBlockState(targetPos))) if (!AllBlocks.BELT.typeOf(world.getBlockState(targetPos)))
return null; return null;
TileEntity te = world.getTileEntity(targetPos); return BeltHelper.getSegmentTE(world, targetPos);
if (te == null || !(te instanceof BeltTileEntity))
return null;
return (BeltTileEntity) te;
} }
public void spawnParticles(ItemStack stack) { public void spawnParticles(ItemStack stack) {

View file

@ -75,10 +75,15 @@ public class FlexcrateBlock extends ProperDirectionalBlock {
public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) {
if (oldState.getBlock() != state.getBlock() && state.hasTileEntity() && state.get(DOUBLE) if (oldState.getBlock() != state.getBlock() && state.hasTileEntity() && state.get(DOUBLE)
&& state.get(FACING).getAxisDirection() == AxisDirection.POSITIVE) { && state.get(FACING).getAxisDirection() == AxisDirection.POSITIVE) {
FlexcrateTileEntity te = (FlexcrateTileEntity) worldIn.getTileEntity(pos); TileEntity tileEntity = worldIn.getTileEntity(pos);
if (!(tileEntity instanceof FlexcrateTileEntity))
return;
FlexcrateTileEntity te = (FlexcrateTileEntity) tileEntity;
FlexcrateTileEntity other = te.getOtherCrate(); FlexcrateTileEntity other = te.getOtherCrate();
if (other == null) if (other == null)
return; return;
for (int slot = 0; slot < other.inventory.getSlots(); slot++) { for (int slot = 0; slot < other.inventory.getSlots(); slot++) {
te.inventory.setStackInSlot(slot, other.inventory.getStackInSlot(slot)); te.inventory.setStackInSlot(slot, other.inventory.getStackInSlot(slot));
other.inventory.setStackInSlot(slot, ItemStack.EMPTY); other.inventory.setStackInSlot(slot, ItemStack.EMPTY);

View file

@ -10,6 +10,7 @@ import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.Slot; import net.minecraft.inventory.container.Slot;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.SlotItemHandler;
public class FlexcrateContainer extends Container { public class FlexcrateContainer extends Container {
@ -21,11 +22,14 @@ public class FlexcrateContainer extends Container {
public FlexcrateContainer(int id, PlayerInventory inv, PacketBuffer extraData) { public FlexcrateContainer(int id, PlayerInventory inv, PacketBuffer extraData) {
super(AllContainers.FLEXCRATE.type, id); super(AllContainers.FLEXCRATE.type, id);
ClientWorld world = Minecraft.getInstance().world; ClientWorld world = Minecraft.getInstance().world;
this.te = (FlexcrateTileEntity) world.getTileEntity(extraData.readBlockPos()); TileEntity tileEntity = world.getTileEntity(extraData.readBlockPos());
this.te.handleUpdateTag(extraData.readCompoundTag());
this.playerInventory = inv; this.playerInventory = inv;
if (tileEntity instanceof FlexcrateTileEntity) {
this.te = (FlexcrateTileEntity) tileEntity;
this.te.handleUpdateTag(extraData.readCompoundTag());
init(); init();
} }
}
public FlexcrateContainer(int id, PlayerInventory inv, FlexcrateTileEntity te) { public FlexcrateContainer(int id, PlayerInventory inv, FlexcrateTileEntity te) {
super(AllContainers.FLEXCRATE.type, id); super(AllContainers.FLEXCRATE.type, id);

View file

@ -9,7 +9,7 @@ import com.simibubi.create.foundation.behaviour.inventory.InsertingBehaviour;
import com.simibubi.create.foundation.behaviour.inventory.InventoryManagementBehaviour.Attachments; import com.simibubi.create.foundation.behaviour.inventory.InventoryManagementBehaviour.Attachments;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity; import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock; import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
import com.simibubi.create.modules.logistics.block.extractor.ExtractorTileEntity; import com.simibubi.create.modules.logistics.block.extractor.ExtractorTileEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;

View file

@ -26,6 +26,7 @@ import com.simibubi.create.modules.schematics.item.SchematicItem;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
@ -105,8 +106,8 @@ public class ServerSchematicLoader {
try { try {
// Validate Referenced Block // Validate Referenced Block
BlockState blockState = dimPos.world.getBlockState(dimPos.pos); SchematicTableTileEntity table = getTable(dimPos);
if (!AllBlocks.SCHEMATIC_TABLE.typeOf(blockState)) if (table == null)
return; return;
// Delete schematic with same name // Delete schematic with same name
@ -131,8 +132,7 @@ public class ServerSchematicLoader {
activeUploads.put(playerSchematicId, new SchematicUploadEntry(writer, size, dimPos)); activeUploads.put(playerSchematicId, new SchematicUploadEntry(writer, size, dimPos));
// Notify Tile Entity // Notify Tile Entity
SchematicTableTileEntity tileEntity = (SchematicTableTileEntity) dimPos.world.getTileEntity(dimPos.pos); table.startUpload(schematic);
tileEntity.startUpload(schematic);
} catch (IOException e) { } catch (IOException e) {
Create.logger.error("Exception Thrown when starting Upload: " + playerSchematicId); Create.logger.error("Exception Thrown when starting Upload: " + playerSchematicId);
@ -167,14 +167,12 @@ public class ServerSchematicLoader {
try { try {
entry.stream.write(data); entry.stream.write(data);
entry.idleTime = 0; entry.idleTime = 0;
BlockState blockState = entry.tablePos.world.getBlockState(entry.tablePos.pos);
if (!AllBlocks.SCHEMATIC_TABLE.typeOf(blockState))
return;
SchematicTableTileEntity tileEntity = SchematicTableTileEntity table = getTable(entry.tablePos);
(SchematicTableTileEntity) entry.tablePos.world.getTileEntity(entry.tablePos.pos); if (table == null)
tileEntity.uploadingProgress = (float) ((double) entry.bytesUploaded / entry.totalBytes); return;
tileEntity.sendUpdate = true; table.uploadingProgress = (float) ((double) entry.bytesUploaded / entry.totalBytes);
table.sendUpdate = true;
} catch (IOException e) { } catch (IOException e) {
Create.logger.error("Exception Thrown when uploading Schematic: " + playerSchematicId); Create.logger.error("Exception Thrown when uploading Schematic: " + playerSchematicId);
@ -203,12 +201,17 @@ public class ServerSchematicLoader {
if (dimpos == null) if (dimpos == null)
return; return;
BlockState blockState = dimpos.world.getBlockState(dimpos.pos); SchematicTableTileEntity table = getTable(dimpos);
if (!AllBlocks.SCHEMATIC_TABLE.typeOf(blockState)) if (table != null)
return; table.finishUpload();
}
SchematicTableTileEntity tileEntity = (SchematicTableTileEntity) dimpos.world.getTileEntity(dimpos.pos); public SchematicTableTileEntity getTable(DimensionPos dimpos) {
tileEntity.finishUpload(); TileEntity te = dimpos.world.getTileEntity(dimpos.pos);
if (!(te instanceof SchematicTableTileEntity))
return null;
SchematicTableTileEntity table = (SchematicTableTileEntity) te;
return table;
} }
public void handleFinishedUpload(ServerPlayerEntity player, String schematic) { public void handleFinishedUpload(ServerPlayerEntity player, String schematic) {
@ -227,11 +230,12 @@ public class ServerSchematicLoader {
if (!AllBlocks.SCHEMATIC_TABLE.typeOf(blockState)) if (!AllBlocks.SCHEMATIC_TABLE.typeOf(blockState))
return; return;
SchematicTableTileEntity tileEntity = (SchematicTableTileEntity) dimpos.world.getTileEntity(dimpos.pos); SchematicTableTileEntity table = getTable(dimpos);
tileEntity.finishUpload(); if (table == null)
tileEntity.inventory.setStackInSlot(0, ItemStack.EMPTY); return;
tileEntity.inventory.setStackInSlot(1, table.finishUpload();
SchematicItem.create(schematic, player.getName().getFormattedText())); table.inventory.setStackInSlot(0, ItemStack.EMPTY);
table.inventory.setStackInSlot(1, SchematicItem.create(schematic, player.getName().getFormattedText()));
} catch (IOException e) { } catch (IOException e) {
Create.logger.error("Exception Thrown when finishing Upload: " + playerSchematicId); Create.logger.error("Exception Thrown when finishing Upload: " + playerSchematicId);

View file

@ -1,5 +1,7 @@
package com.simibubi.create.modules.schematics.block; package com.simibubi.create.modules.schematics.block;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -9,7 +11,6 @@ import net.minecraft.block.HorizontalBlock;
import net.minecraft.block.material.PushReaction; import net.minecraft.block.material.PushReaction;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.StateContainer.Builder;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
@ -22,7 +23,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.fml.network.NetworkHooks;
public class SchematicTableBlock extends HorizontalBlock { public class SchematicTableBlock extends HorizontalBlock implements ITE<SchematicTableTileEntity> {
public SchematicTableBlock() { public SchematicTableBlock() {
super(Properties.from(Blocks.OAK_PLANKS)); super(Properties.from(Blocks.OAK_PLANKS));
@ -50,7 +51,8 @@ public class SchematicTableBlock extends HorizontalBlock {
} }
@Override @Override
public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos,
ISelectionContext context) {
return AllShapes.TABLE_POLE_SHAPE; return AllShapes.TABLE_POLE_SHAPE;
} }
@ -67,15 +69,12 @@ public class SchematicTableBlock extends HorizontalBlock {
@Override @Override
public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn,
BlockRayTraceResult hit) { BlockRayTraceResult hit) {
if (worldIn.isRemote)
return true;
if (worldIn.isRemote) { withTileEntityDo(worldIn, pos,
te -> NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer));
return true; return true;
} else {
SchematicTableTileEntity te = (SchematicTableTileEntity) worldIn.getTileEntity(pos);
if (te != null)
NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer);
return true;
}
} }
@Override @Override
@ -85,19 +84,16 @@ public class SchematicTableBlock extends HorizontalBlock {
@Override @Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (worldIn.getTileEntity(pos) == null) if (!state.hasTileEntity() || state.getBlock() == newState.getBlock())
return; return;
SchematicTableTileEntity te = (SchematicTableTileEntity) worldIn.getTileEntity(pos); withTileEntityDo(worldIn, pos, te -> ItemHelper.dropContents(worldIn, pos, te.inventory));
for (int slot = 0; slot < te.inventory.getSlots(); slot++) {
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(),
te.inventory.getStackInSlot(slot));
}
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) {
worldIn.removeTileEntity(pos); worldIn.removeTileEntity(pos);
} }
@Override
public Class<SchematicTableTileEntity> getTileEntityClass() {
return SchematicTableTileEntity.class;
} }
} }

View file

@ -11,6 +11,7 @@ import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.Slot; import net.minecraft.inventory.container.Slot;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.SlotItemHandler;
public class SchematicTableContainer extends Container { public class SchematicTableContainer extends Container {
@ -24,10 +25,13 @@ public class SchematicTableContainer extends Container {
super(AllContainers.SCHEMATIC_TABLE.type, id); super(AllContainers.SCHEMATIC_TABLE.type, id);
player = inv.player; player = inv.player;
ClientWorld world = Minecraft.getInstance().world; ClientWorld world = Minecraft.getInstance().world;
this.te = (SchematicTableTileEntity) world.getTileEntity(extraData.readBlockPos()); TileEntity tileEntity = world.getTileEntity(extraData.readBlockPos());
if (tileEntity instanceof SchematicTableTileEntity) {
this.te = (SchematicTableTileEntity) tileEntity;
this.te.handleUpdateTag(extraData.readCompoundTag()); this.te.handleUpdateTag(extraData.readCompoundTag());
init(); init();
} }
}
public SchematicTableContainer(int id, PlayerInventory inv, SchematicTableTileEntity te) { public SchematicTableContainer(int id, PlayerInventory inv, SchematicTableTileEntity te) {
super(AllContainers.SCHEMATIC_TABLE.type, id); super(AllContainers.SCHEMATIC_TABLE.type, id);

View file

@ -1,6 +1,7 @@
package com.simibubi.create.modules.schematics.block; package com.simibubi.create.modules.schematics.block;
import com.simibubi.create.AllItems; import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.AllShapes;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -9,8 +10,6 @@ import net.minecraft.block.Blocks;
import net.minecraft.block.material.PushReaction; import net.minecraft.block.material.PushReaction;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -22,7 +21,7 @@ import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.fml.network.NetworkHooks;
public class SchematicannonBlock extends Block { public class SchematicannonBlock extends Block implements ITE<SchematicannonTileEntity> {
public SchematicannonBlock() { public SchematicannonBlock() {
super(Properties.from(Blocks.DISPENSER)); super(Properties.from(Blocks.DISPENSER));
@ -55,44 +54,32 @@ public class SchematicannonBlock extends Block {
@Override @Override
public void onNeighborChange(BlockState state, IWorldReader world, BlockPos pos, BlockPos neighbor) { public void onNeighborChange(BlockState state, IWorldReader world, BlockPos pos, BlockPos neighbor) {
((SchematicannonTileEntity) world.getTileEntity(pos)).findInventories(); withTileEntityDo(world, pos, SchematicannonTileEntity::findInventories);
super.onNeighborChange(state, world, pos, neighbor);
} }
@Override @Override
public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn,
BlockRayTraceResult hit) { BlockRayTraceResult hit) {
if (worldIn.isRemote)
return true;
if (worldIn.isRemote) { withTileEntityDo(worldIn, pos,
te -> NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer));
return true; return true;
} else {
SchematicannonTileEntity te = (SchematicannonTileEntity) worldIn.getTileEntity(pos);
if (te != null)
if (AllItems.BLUEPRINT.typeOf(player.getHeldItemMainhand())
&& te.inventory.getStackInSlot(0).isEmpty()) {
te.inventory.setStackInSlot(0, player.getHeldItemMainhand());
player.inventory.setInventorySlotContents(player.inventory.currentItem, ItemStack.EMPTY);
}
NetworkHooks.openGui((ServerPlayerEntity) player, te, te::sendToContainer);
return true;
}
} }
@Override @Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (worldIn.getTileEntity(pos) == null) if (!state.hasTileEntity() || state.getBlock() == newState.getBlock())
return; return;
SchematicannonTileEntity te = (SchematicannonTileEntity) worldIn.getTileEntity(pos); withTileEntityDo(worldIn, pos, te -> ItemHelper.dropContents(worldIn, pos, te.inventory));
for (int slot = 0; slot < te.inventory.getSlots(); slot++) {
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(),
te.inventory.getStackInSlot(slot));
}
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) {
worldIn.removeTileEntity(pos); worldIn.removeTileEntity(pos);
} }
@Override
public Class<SchematicannonTileEntity> getTileEntityClass() {
return SchematicannonTileEntity.class;
} }
} }

View file

@ -10,6 +10,7 @@ import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.Slot; import net.minecraft.inventory.container.Slot;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.SlotItemHandler;
public class SchematicannonContainer extends Container { public class SchematicannonContainer extends Container {
@ -21,10 +22,13 @@ public class SchematicannonContainer extends Container {
super(AllContainers.SCHEMATICANNON.type, id); super(AllContainers.SCHEMATICANNON.type, id);
player = inv.player; player = inv.player;
ClientWorld world = Minecraft.getInstance().world; ClientWorld world = Minecraft.getInstance().world;
this.te = (SchematicannonTileEntity) world.getTileEntity(buffer.readBlockPos()); TileEntity tileEntity = world.getTileEntity(buffer.readBlockPos());
if (tileEntity instanceof SchematicannonTileEntity) {
this.te = (SchematicannonTileEntity) tileEntity;
this.te.handleUpdateTag(buffer.readCompoundTag()); this.te.handleUpdateTag(buffer.readCompoundTag());
init(); init();
} }
}
public SchematicannonContainer(int id, PlayerInventory inv, SchematicannonTileEntity te) { public SchematicannonContainer(int id, PlayerInventory inv, SchematicannonTileEntity te) {
super(AllContainers.SCHEMATICANNON.type, id); super(AllContainers.SCHEMATICANNON.type, id);
@ -34,7 +38,6 @@ public class SchematicannonContainer extends Container {
} }
protected void init() { protected void init() {
int x = 20; int x = 20;
int y = 0; int y = 0;

View file

@ -50,11 +50,12 @@ public class ConfigureSchematicannonPacket extends SimplePacketBase {
context.get().enqueueWork(() -> { context.get().enqueueWork(() -> {
ServerPlayerEntity player = context.get().getSender(); ServerPlayerEntity player = context.get().getSender();
World world = player.world; World world = player.world;
if (world == null)
if (world == null || world.getTileEntity(pos) == null)
return; return;
TileEntity tileEntity = world.getTileEntity(pos); TileEntity tileEntity = world.getTileEntity(pos);
if (tileEntity instanceof SchematicannonTileEntity) { if (!(tileEntity instanceof SchematicannonTileEntity))
return;
SchematicannonTileEntity te = (SchematicannonTileEntity) tileEntity; SchematicannonTileEntity te = (SchematicannonTileEntity) tileEntity;
switch (option) { switch (option) {
@ -88,10 +89,6 @@ public class ConfigureSchematicannonPacket extends SimplePacketBase {
} }
te.sendUpdate = true; te.sendUpdate = true;
}
return;
}); });
context.get().setPacketHandled(true); context.get().setPacketHandled(true);
} }