mirror of
https://github.com/Creators-of-Create/Create.git
synced 2025-01-23 19:38:08 +01:00
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:
parent
f1057bf558
commit
810191aa89
97 changed files with 1254 additions and 932 deletions
|
@ -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__(),
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
100
src/main/java/com/simibubi/create/foundation/block/ITE.java
Normal file
100
src/main/java/com/simibubi/create/foundation/block/ITE.java
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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) {
|
|
@ -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;
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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;
|
|
@ -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());
|
|
@ -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;
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
|
@ -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;
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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;
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue