mirror of
https://github.com/Creators-of-Create/Create.git
synced 2025-01-23 11:28:10 +01:00
Merge remote-tracking branch 'origin/mc1.14-v0.2.3' into mc1.15-v0.2.2
# Conflicts: # build.gradle # src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java # src/main/java/com/simibubi/create/foundation/world/AllWorldFeatures.java # src/main/java/com/simibubi/create/modules/contraptions/components/crusher/CrushingWheelBlock.java # src/main/java/com/simibubi/create/modules/contraptions/components/fan/EncasedFanBlock.java # src/main/java/com/simibubi/create/modules/contraptions/components/millstone/MillstoneBlock.java # src/main/java/com/simibubi/create/modules/contraptions/components/turntable/TurntableBlock.java # src/main/java/com/simibubi/create/modules/contraptions/processing/BasinBlock.java # src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverBlock.java # src/main/java/com/simibubi/create/modules/contraptions/relays/advanced/sequencer/SequencedGearshiftBlock.java # src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltBlock.java # src/main/java/com/simibubi/create/modules/contraptions/relays/belt/BeltTileEntityRenderer.java # src/main/java/com/simibubi/create/modules/curiosities/partialWindows/WindowInABlockModel.java # src/main/java/com/simibubi/create/modules/logistics/block/RedstoneLinkBlock.java # src/main/java/com/simibubi/create/modules/logistics/block/StockswitchBlock.java # src/main/java/com/simibubi/create/modules/palettes/CTGlassPaneBlock.java # src/main/java/com/simibubi/create/modules/schematics/block/SchematicTableBlock.java # src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonBlock.java # src/main/resources/META-INF/mods.toml
This commit is contained in:
commit
a1605af46a
138 changed files with 3025 additions and 1226 deletions
38
README.md
Normal file
38
README.md
Normal file
|
@ -0,0 +1,38 @@
|
|||
# Create
|
||||
Welcome to Create, a mod offering a variety of tools and blocks for Building, Decoration and Aesthetic Automation.
|
||||
|
||||
The added elements of tech are designed to leave as many design choices to the player as possible, where item processing doesn't happen inside a single block with funny textures, it requires a set of actors working together in many possible arrangements.
|
||||
|
||||
Check out the wiki and in-game Tool-tips for further info on how to use these features, and stay tuned for an ever-growing selection of possibilities for Creative and Survival Minecraft.
|
||||
|
||||
## Links
|
||||
[<img src="https://i.imgur.com/0lLX9Oy.jpg" width="320">](https://github.com/simibubi/Create/issues "Report Issues")
|
||||
[<img src="https://i.imgur.com/bjEZraY.jpg" width="320">](https://www.youtube.com/playlist?list=PLyADkcfPLU8ywCXZPaDbQ_JZJL0CGDN5Z "Watch Videos")
|
||||
[<img src="https://i.imgur.com/aWrjfKJ.jpg" width="320">](https://discord.gg/hmaD7Se "Feedback & Help")
|
||||
[<img src="https://i.imgur.com/xj8o2xC.jpg" width="320">](https://www.patreon.com/simibubi "Support Us")
|
||||
|
||||
## Current Progress
|
||||
- Create 0.2.2 is coming soon with more bug-fixes. Thank you for testing Create with us!
|
||||
- Support for Minecraft 1.12: Not planned
|
||||
- Support for Minecraft 1.15: Porting work is in Progress!
|
||||
- Support for Fabric: Not planned
|
||||
|
||||
## The Creators of Create
|
||||
- evanthebruce - Resident Nitwit
|
||||
- fuzzyweapon - Contributor
|
||||
- LeastReality - Artist
|
||||
- Zelophed - Developer
|
||||
- simibubi - Developer & Artist
|
||||
- tterrag - Developer & Port-Meister
|
||||
|
||||
## Localization
|
||||
|
||||
| Code | Version | Language | Author |
|
||||
|-------|---------|------------|--------------------------|
|
||||
| en_us | 0.2.2 | English US | |
|
||||
| de_de | 0.1 | German | Vexatos & Azratosh |
|
||||
| nl_nl | 0.1 | Dutch | Prusias |
|
||||
| fr_fr | 0.2.1 | French | Kiro |
|
||||
| zh_cn | 0.2.1 | Chinese | noptia & spider_stranger |
|
||||
| ru_ru | 0.1 | Russian | sirabein |
|
||||
| pt_br | 0.1 | Brazilian | lucassabreu |
|
|
@ -13,7 +13,7 @@ apply plugin: 'net.minecraftforge.gradle'
|
|||
apply plugin: 'eclipse'
|
||||
apply plugin: 'maven-publish'
|
||||
|
||||
version = 'mc1.15.2_v0.2.2'
|
||||
version = 'mc1.15.2_v0.2.3'
|
||||
group = 'com.simibubi.create'
|
||||
archivesBaseName = 'create'
|
||||
|
||||
|
@ -21,6 +21,7 @@ sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = co
|
|||
|
||||
minecraft {
|
||||
mappings channel: 'snapshot', version: '20200301-mixed-1.15.2'
|
||||
accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
|
||||
|
||||
runs {
|
||||
client {
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
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.IHaveCustomBlockItem;
|
||||
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.sequencer.SequencedGearshiftBlock;
|
||||
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.ShaftBlock;
|
||||
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.logistics.block.RedstoneLinkBlock;
|
||||
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.FunnelBlock;
|
||||
import com.simibubi.create.modules.logistics.block.belts.observer.BeltObserverBlock;
|
||||
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.LatchBlock;
|
||||
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.extractor.ExtractorBlock;
|
||||
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.transposer.LinkedTransposerBlock;
|
||||
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.registries.IForgeRegistry;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public enum AllBlocks {
|
||||
|
||||
__SCHEMATICS__(),
|
||||
|
|
|
@ -55,8 +55,6 @@ public enum AllContainers {
|
|||
bind(SCHEMATIC_TABLE, SchematicTableScreen::new);
|
||||
bind(SCHEMATICANNON, SchematicannonScreen::new);
|
||||
bind(FLEXCRATE, FlexcrateScreen::new);
|
||||
// bind(LOGISTICAL_INDEX, LogisticalIndexScreen::new);
|
||||
// bind(LOGISTICAL_CONTROLLER, LogisticalInventoryControllerScreen::new);
|
||||
bind(FILTER, FilterScreen::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.contraptions.GogglesItem;
|
||||
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.curiosities.ChromaticCompoundCubeItem;
|
||||
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.ItemStack;
|
||||
import net.minecraft.item.Rarity;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.item.SwordItem;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.event.RegistryEvent;
|
||||
|
|
|
@ -56,8 +56,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.belt.BeltTileEntity;
|
||||
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.encased.AdjustablePulleyTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.relays.encased.ClutchTileEntity;
|
||||
|
@ -74,14 +72,16 @@ import com.simibubi.create.modules.contraptions.relays.gearbox.GearshiftTileEnti
|
|||
import com.simibubi.create.modules.curiosities.partialWindows.WindowInABlockTileEntity;
|
||||
import com.simibubi.create.modules.logistics.block.RedstoneLinkTileEntity;
|
||||
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.BeltObserverTileEntityRenderer;
|
||||
import com.simibubi.create.modules.logistics.block.belts.FunnelTileEntity;
|
||||
import com.simibubi.create.modules.logistics.block.belts.observer.BeltObserverTileEntity;
|
||||
import com.simibubi.create.modules.logistics.block.belts.observer.BeltObserverTileEntityRenderer;
|
||||
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.FlexpeaterTileEntity;
|
||||
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.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.transposer.LinkedTransposerTileEntity;
|
||||
import com.simibubi.create.modules.logistics.block.transposer.TransposerTileEntity;
|
||||
|
|
|
@ -14,7 +14,7 @@ import com.simibubi.create.modules.contraptions.KineticDebugger;
|
|||
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.ChassisRangeDisplay;
|
||||
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 net.minecraft.client.Minecraft;
|
||||
|
@ -65,7 +65,7 @@ public class ClientEvents {
|
|||
|
||||
public static void onGameTick() {
|
||||
CreateClient.gameTick();
|
||||
BeltConnectorItemHandler.gameTick();
|
||||
BeltConnectorHandler.gameTick();
|
||||
TerrainZapperRenderHandler.tick();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,27 +1,10 @@
|
|||
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.World;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.common.Tags;
|
||||
import net.minecraftforge.event.TickEvent.Phase;
|
||||
import net.minecraftforge.event.TickEvent.ServerTickEvent;
|
||||
import net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock;
|
||||
import net.minecraftforge.event.world.WorldEvent;
|
||||
import net.minecraftforge.eventbus.api.Event.Result;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
||||
|
@ -59,60 +42,4 @@ public class Events {
|
|||
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 CWorldGen worldGen = nested(0, CWorldGen::new, Comments.worldGen);
|
||||
public ConfigBool logTeErrors = b(false, "logTeErrors", Comments.logTeErrors);
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
|
@ -11,6 +12,7 @@ public class CCommon extends ConfigBase {
|
|||
|
||||
private static class Comments {
|
||||
static String worldGen = "Modify Create's impact on your terrain";
|
||||
static String logTeErrors = "Forward caught TileEntityExceptions to the log at debug level.";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -11,7 +11,6 @@ public class CCuriosities extends ConfigBase {
|
|||
public ConfigBool enableRefinedRadianceRecipe = b(true, "enableRefinedRadianceRecipe",
|
||||
Comments.refinedRadianceRecipe);
|
||||
public ConfigBool enableShadowSteelRecipe = b(true, "enableShadowSteelRecipe", Comments.shadowSteelRecipe);
|
||||
public ConfigBool enableSandPaperToolPolishing = b(true, "enableSandPaperToolPolishing", Comments.sandPaperOnTools);
|
||||
public ConfigFloat cocoaLogGrowthSpeed = f(20, 0, 100, "cocoaLogGrowthSpeed", Comments.cocoa);
|
||||
|
||||
@Override
|
||||
|
@ -24,7 +23,6 @@ public class CCuriosities extends ConfigBase {
|
|||
static String refinedRadiance = "The amount of Light sources destroyed before Chromatic Compound turns into Refined Radiance.";
|
||||
static String refinedRadianceRecipe = "Allow the standard Refined Radiance recipes.";
|
||||
static String shadowSteelRecipe = "Allow the standard Shadow Steel recipe.";
|
||||
static String sandPaperOnTools = "Enable the tool repairing mechanic involving sand paper.";
|
||||
static String windowsInBlocks = "Allow Glass Panes to be put inside Blocks like Stairs, Slabs, Fences etc.";
|
||||
static String cocoa = "% of random Ticks causing a Cocoa log to grow.";
|
||||
static String zapperUndoLogLength = "The maximum amount of operations, a blockzapper can remember for undoing. (0 to disable undo)";
|
||||
|
|
|
@ -28,7 +28,7 @@ public class CWorldGen extends ConfigBase {
|
|||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "world";
|
||||
return "worldgen.v" + AllWorldFeatures.forcedUpdateVersion;
|
||||
}
|
||||
|
||||
private static class Comments {
|
||||
|
|
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.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) {
|
||||
T te = getTileEntity(world, pos);
|
||||
if (te == null || world.isRemote())
|
||||
if (world.isRemote())
|
||||
return;
|
||||
try {
|
||||
T te = getTileEntity(world, pos);
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
|
@ -9,6 +9,7 @@ import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour.
|
|||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.PaneBlock;
|
||||
import net.minecraft.client.renderer.model.BakedQuad;
|
||||
import net.minecraft.client.renderer.model.IBakedModel;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
|
@ -56,7 +57,7 @@ public class CTModel extends BakedModelWrapper<IBakedModel> {
|
|||
CTData data = new CTData();
|
||||
|
||||
for (Direction face : Direction.values()) {
|
||||
if (!Block.shouldSideBeRendered(state, world, pos, face))
|
||||
if (!Block.shouldSideBeRendered(state, world, pos, face) && !(state.getBlock() instanceof PaneBlock))
|
||||
continue;
|
||||
CTSpriteShiftEntry spriteShift = behaviour.get(state, face);
|
||||
if (spriteShift == null)
|
||||
|
@ -86,9 +87,6 @@ public class CTModel extends BakedModelWrapper<IBakedModel> {
|
|||
if (index == -1)
|
||||
continue;
|
||||
|
||||
float uShift = spriteShift.getUShift(index);
|
||||
float vShift = spriteShift.getVShift(index);
|
||||
|
||||
BakedQuad newQuad =
|
||||
new BakedQuad(Arrays.copyOf(quad.getVertexData(), quad.getVertexData().length), quad.getTintIndex(),
|
||||
quad.getFace(), quad.getSprite(), quad.shouldApplyDiffuseLighting());
|
||||
|
@ -101,10 +99,8 @@ public class CTModel extends BakedModelWrapper<IBakedModel> {
|
|||
int vIndex = vertex + uvOffset + 1;
|
||||
float u = Float.intBitsToFloat(vertexData[uIndex]);
|
||||
float v = Float.intBitsToFloat(vertexData[vIndex]);
|
||||
u += uShift;
|
||||
v += vShift;
|
||||
vertexData[uIndex] = Float.floatToIntBits(u);
|
||||
vertexData[vIndex] = Float.floatToIntBits(v);
|
||||
vertexData[uIndex] = Float.floatToRawIntBits(spriteShift.getTargetU(u, index));
|
||||
vertexData[vIndex] = Float.floatToRawIntBits(spriteShift.getTargetV(v, index));
|
||||
}
|
||||
quads.set(i, newQuad);
|
||||
}
|
||||
|
|
|
@ -11,14 +11,16 @@ public abstract class CTSpriteShiftEntry extends SpriteShiftEntry {
|
|||
this.textureSheetSize = sheetSize;
|
||||
}
|
||||
|
||||
public float getUShift(int index) {
|
||||
return getTarget().getInterpolatedU((index % textureSheetSize) * (16 / textureSheetSize))
|
||||
- getOriginal().getMinU();
|
||||
public float getTargetU(float localU, int index) {
|
||||
float uOffset = (index % textureSheetSize);
|
||||
return getTarget().getInterpolatedU(
|
||||
(getOriginal().getUnInterpolatedU(localU) + (uOffset * 16)) / ((float) textureSheetSize));
|
||||
}
|
||||
|
||||
public float getVShift(int index) {
|
||||
return getTarget().getInterpolatedV((index / textureSheetSize) * (16 / textureSheetSize))
|
||||
- getOriginal().getMinV();
|
||||
public float getTargetV(float localV, int index) {
|
||||
float vOffset = (index / textureSheetSize);
|
||||
return getTarget().getInterpolatedV(
|
||||
(getOriginal().getUnInterpolatedV(localV) + (vOffset * 16)) / ((float) textureSheetSize));
|
||||
}
|
||||
|
||||
public abstract int getTextureIndex(CTContext context);
|
||||
|
|
|
@ -12,15 +12,23 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||
|
||||
import com.simibubi.create.config.AllConfigs;
|
||||
|
||||
import net.minecraft.inventory.InventoryHelper;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.Ingredient;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
|
||||
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) {
|
||||
List<ItemStack> stacks = new ArrayList<>();
|
||||
ItemStack result = out.copy();
|
||||
|
|
|
@ -15,14 +15,16 @@ import com.simibubi.create.modules.IModule;
|
|||
import com.simibubi.create.modules.contraptions.base.IRotate;
|
||||
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.SandPaperItem;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.player.ClientPlayerEntity;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.inventory.EquipmentSlotType;
|
||||
import net.minecraft.item.BlockItem;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.TieredItem;
|
||||
import net.minecraft.util.text.TextFormatting;
|
||||
|
||||
public class TooltipHelper {
|
||||
|
@ -169,11 +171,11 @@ public class TooltipHelper {
|
|||
}
|
||||
|
||||
public static String getTooltipTranslationKey(ItemStack stack) {
|
||||
|
||||
if (stack.getItem() instanceof AbstractToolItem) {
|
||||
AbstractToolItem abstractToolItem = (AbstractToolItem) stack.getItem();
|
||||
if (abstractToolItem.getTier() instanceof AllToolTiers) {
|
||||
AllToolTiers allToolTiers = (AllToolTiers) abstractToolItem.getTier();
|
||||
Item item = stack.getItem();
|
||||
if (item instanceof TieredItem) {
|
||||
TieredItem tieredItem = (TieredItem) stack.getItem();
|
||||
if (tieredItem.getTier() instanceof AllToolTiers) {
|
||||
AllToolTiers allToolTiers = (AllToolTiers) tieredItem.getTier();
|
||||
return "tool.create." + Lang.asId(allToolTiers.name()) + ".tooltip";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,11 @@
|
|||
package com.simibubi.create.foundation.utility;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
public class Iterate {
|
||||
|
||||
|
@ -18,4 +22,9 @@ public class Iterate {
|
|||
return directions;
|
||||
}
|
||||
|
||||
public static List<BlockPos> hereAndBelow(BlockPos pos) {
|
||||
return Arrays.asList(pos, pos.down());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -6,13 +6,13 @@ import java.nio.ByteOrder;
|
|||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.mojang.blaze3d.vertex.IVertexBuilder;
|
||||
import com.mojang.datafixers.util.Pair;
|
||||
import com.simibubi.create.foundation.block.render.SpriteShiftEntry;
|
||||
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
import net.minecraft.client.renderer.BufferBuilder.DrawState;
|
||||
import net.minecraft.client.renderer.GLAllocation;
|
||||
import net.minecraft.client.renderer.Matrix4f;
|
||||
import net.minecraft.client.renderer.Vector4f;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
|
@ -33,7 +33,9 @@ public class SuperByteBuffer {
|
|||
|
||||
// Vertex Texture Coords
|
||||
private boolean shouldShiftUV;
|
||||
private float uShift, vShift;
|
||||
private boolean resetUV;
|
||||
private SpriteShiftEntry spriteShift;
|
||||
private float uTarget, vTarget;
|
||||
|
||||
// Vertex Lighting
|
||||
private boolean shouldLight;
|
||||
|
@ -44,6 +46,7 @@ public class SuperByteBuffer {
|
|||
// Vertex Coloring
|
||||
private boolean shouldColor;
|
||||
private int r, g, b, a;
|
||||
private float sheetSize;
|
||||
|
||||
public SuperByteBuffer(BufferBuilder buf) {
|
||||
Pair<DrawState, ByteBuffer> state = buf.popData();
|
||||
|
@ -81,8 +84,18 @@ public class SuperByteBuffer {
|
|||
putColor(mutable, vertex, (byte) r2, (byte) g2, (byte) b2, (byte) a);
|
||||
}
|
||||
|
||||
if (shouldShiftUV)
|
||||
putUV(mutable, vertex, getU(original, vertex) + uShift, getV(original, vertex) + vShift);
|
||||
if (shouldShiftUV) {
|
||||
float u = getU(original, vertex);
|
||||
float v = getV(original, vertex);
|
||||
float targetU = spriteShift.getTarget()
|
||||
.getInterpolatedU((spriteShift.getOriginal().getUnInterpolatedU(u) / sheetSize) + uTarget * 16);
|
||||
float targetV = spriteShift.getTarget()
|
||||
.getInterpolatedV((spriteShift.getOriginal().getUnInterpolatedV(v) / sheetSize) + vTarget * 16);
|
||||
putUV(mutable, vertex, targetU, targetV);
|
||||
}
|
||||
|
||||
if (resetUV)
|
||||
putUV(mutable, vertex, getU(original, vertex), getV(original, vertex));
|
||||
|
||||
if (shouldLight) {
|
||||
if (vertexLighter != null)
|
||||
|
@ -141,24 +154,29 @@ public class SuperByteBuffer {
|
|||
return translate(.5f, .5f, .5f).rotate(axis, radians).translate(-.5f, -.5f, -.5f);
|
||||
}
|
||||
|
||||
public SuperByteBuffer shiftUV(TextureAtlasSprite from, TextureAtlasSprite to) {
|
||||
public SuperByteBuffer shiftUV(SpriteShiftEntry entry) {
|
||||
shouldShiftUV = true;
|
||||
uShift = to.getMinU() - from.getMinU();
|
||||
vShift = to.getMinV() - from.getMinV();
|
||||
resetUV = false;
|
||||
spriteShift = entry;
|
||||
uTarget = 0;
|
||||
vTarget = 0;
|
||||
sheetSize = 1;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SuperByteBuffer shiftUVtoSheet(TextureAtlasSprite from, TextureAtlasSprite to, int sheetX, int sheetY) {
|
||||
public SuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) {
|
||||
shouldShiftUV = true;
|
||||
uShift = to.getInterpolatedU(sheetX * 16f / to.getWidth()) - from.getMinU();
|
||||
vShift = to.getInterpolatedV(sheetY * 16f / to.getHeight()) - from.getMinV();
|
||||
resetUV = false;
|
||||
spriteShift = entry;
|
||||
this.uTarget = uTarget;
|
||||
this.vTarget = vTarget;
|
||||
this.sheetSize = sheetSize;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SuperByteBuffer dontShiftUV() {
|
||||
shouldShiftUV = false;
|
||||
uShift = 0;
|
||||
vShift = 0;
|
||||
resetUV = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
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 net.minecraft.block.Block;
|
||||
import net.minecraft.data.BlockTagsProvider;
|
||||
import net.minecraft.data.DataGenerator;
|
||||
|
@ -8,10 +13,6 @@ import net.minecraft.tags.BlockTags;
|
|||
import net.minecraft.tags.Tag;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class AllBlocksTagProvider extends BlockTagsProvider {
|
||||
|
||||
static Map<ResourceLocation, BlockTags.Wrapper> createdTags;
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
package com.simibubi.create.foundation.world;
|
||||
|
||||
import static net.minecraft.world.biome.Biome.Category.DESERT;
|
||||
import static net.minecraft.world.biome.Biome.Category.OCEAN;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
@ -9,19 +12,18 @@ import com.simibubi.create.AllBlocks;
|
|||
import com.simibubi.create.foundation.utility.Lang;
|
||||
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.biome.Biomes;
|
||||
import net.minecraft.world.gen.feature.ConfiguredFeature;
|
||||
import net.minecraftforge.common.ForgeConfigSpec;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
|
||||
public enum AllWorldFeatures {
|
||||
|
||||
COPPER_ORE(new CountedOreFeature(AllBlocks.COPPER_ORE.get(), 21, 1).between(40, 96)),
|
||||
COPPER_ORE_OCEAN(
|
||||
new CountedOreFeature(AllBlocks.COPPER_ORE.get(), 15, 4).between(20, 55).inBiomes(Biome.Category.OCEAN)),
|
||||
COPPER_ORE(new CountedOreFeature(AllBlocks.COPPER_ORE.get(), 18, 2).between(40, 86)),
|
||||
COPPER_ORE_OCEAN(new CountedOreFeature(AllBlocks.COPPER_ORE.get(), 15, 4).between(20, 55).inBiomes(OCEAN)),
|
||||
|
||||
ZINC_ORE(new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 8, 1).between(55, 80)),
|
||||
ZINC_ORE_DESERT(
|
||||
new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 10, 5).between(50, 85).inBiomes(Biome.Category.DESERT)),
|
||||
ZINC_ORE(new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 14, 4).between(15, 70)),
|
||||
ZINC_ORE_DESERT(new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 17, 5).between(10, 85).inBiomes(DESERT)),
|
||||
|
||||
LIMESTONE(new ChanceOreFeature(AllBlocks.LIMESTONE.get(), 128, 1 / 32f).between(30, 70)),
|
||||
WEATHERED_LIMESTONE(new ChanceOreFeature(AllBlocks.WEATHERED_LIMESTONE.get(), 128, 1 / 32f).between(10, 30)),
|
||||
|
@ -31,6 +33,13 @@ public enum AllWorldFeatures {
|
|||
|
||||
;
|
||||
|
||||
/**
|
||||
* Increment this number if all worldgen entries should be overwritten in this
|
||||
* update. Worlds from the previous version will overwrite potentially changed
|
||||
* values with the new defaults.
|
||||
*/
|
||||
public static final int forcedUpdateVersion = 1;
|
||||
|
||||
public IFeature feature;
|
||||
private Map<Biome, ConfiguredFeature<?, ?>> featureInstances;
|
||||
|
||||
|
@ -44,9 +53,13 @@ public enum AllWorldFeatures {
|
|||
for (AllWorldFeatures entry : AllWorldFeatures.values()) {
|
||||
for (Biome biome : ForgeRegistries.BIOMES) {
|
||||
|
||||
if (biome == Biomes.THE_VOID)
|
||||
continue;
|
||||
if (biome == Biomes.NETHER)
|
||||
continue;
|
||||
|
||||
if (entry.featureInstances.containsKey(biome))
|
||||
biome.getFeatures(entry.feature.getGenerationStage()).remove(entry.featureInstances.remove(biome));
|
||||
|
||||
Optional<ConfiguredFeature<?, ?>> createFeature = entry.feature.createFeature(biome);
|
||||
if (!createFeature.isPresent())
|
||||
continue;
|
||||
|
|
|
@ -1,13 +1,70 @@
|
|||
package com.simibubi.create.modules.contraptions;
|
||||
|
||||
import com.simibubi.create.foundation.utility.VoxelShaper;
|
||||
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.item.ItemUseContext;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public interface IWrenchable {
|
||||
|
||||
public default ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
default ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
World world = context.getWorld();
|
||||
BlockState rotated = getRotatedBlockState(state, context.getFace());
|
||||
if (!rotated.isValidPosition(world, context.getPos()))
|
||||
return ActionResultType.PASS;
|
||||
|
||||
KineticTileEntity.switchToBlockState(world, context.getPos(), updateAfterWrenched(rotated, context));
|
||||
|
||||
TileEntity te = context.getWorld().getTileEntity(context.getPos());
|
||||
if (te instanceof GeneratingKineticTileEntity) {
|
||||
((GeneratingKineticTileEntity) te).updateGeneratedRotation();
|
||||
}
|
||||
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
default BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) {
|
||||
return newState;
|
||||
}
|
||||
|
||||
static BlockState getRotatedBlockState(BlockState originalState, Direction targetedFace){
|
||||
BlockState newState = originalState;
|
||||
|
||||
if (targetedFace.getAxis() == Direction.Axis.Y) {
|
||||
if (originalState.has(HorizontalAxisKineticBlock.HORIZONTAL_AXIS))
|
||||
return originalState.with(HorizontalAxisKineticBlock.HORIZONTAL_AXIS, VoxelShaper.axisAsFace(originalState.get(HorizontalAxisKineticBlock.HORIZONTAL_AXIS)).rotateAround(targetedFace.getAxis()).getAxis());
|
||||
if (originalState.has(HorizontalKineticBlock.HORIZONTAL_FACING))
|
||||
return originalState.with(HorizontalKineticBlock.HORIZONTAL_FACING, originalState.get(HorizontalKineticBlock.HORIZONTAL_FACING).rotateAround(targetedFace.getAxis()));
|
||||
}
|
||||
|
||||
if (originalState.has(RotatedPillarKineticBlock.AXIS))
|
||||
return originalState.with(RotatedPillarKineticBlock.AXIS, VoxelShaper.axisAsFace(originalState.get(RotatedPillarKineticBlock.AXIS)).rotateAround(targetedFace.getAxis()).getAxis());
|
||||
|
||||
if (!originalState.has(DirectionalKineticBlock.FACING)) return originalState;
|
||||
|
||||
Direction stateFacing = originalState.get(DirectionalKineticBlock.FACING);
|
||||
|
||||
if (stateFacing.getAxis().equals(targetedFace.getAxis())) {
|
||||
if (originalState.has(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE)) return originalState.cycle(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE);
|
||||
else return originalState;
|
||||
} else {
|
||||
do {
|
||||
newState = newState.with(DirectionalKineticBlock.FACING, newState.get(DirectionalKineticBlock.FACING).rotateAround(targetedFace.getAxis()));
|
||||
if (targetedFace.getAxis() == Direction.Axis.Y && newState.has(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE)) newState = newState.cycle(DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE);
|
||||
} while (newState.get(DirectionalKineticBlock.FACING).getAxis().equals(targetedFace.getAxis()));
|
||||
}
|
||||
return newState;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -84,7 +84,7 @@ public class KineticDebugger {
|
|||
|
||||
BlockRayTraceResult ray = (BlockRayTraceResult) obj;
|
||||
TileEntity te = world.getTileEntity(ray.getPos());
|
||||
if (te == null || !(te instanceof KineticTileEntity))
|
||||
if (!(te instanceof KineticTileEntity))
|
||||
return null;
|
||||
|
||||
return (KineticTileEntity) te;
|
||||
|
|
|
@ -38,12 +38,12 @@ public class KineticNetwork {
|
|||
return;
|
||||
if (te.isSource()) {
|
||||
unloadedCapacity -= lastCapacity * getStressMultiplierForSpeed(te.getGeneratedSpeed());
|
||||
float addedStressCapacity = te.getAddedStressCapacity();
|
||||
float addedStressCapacity = te.calculateAddedStressCapacity();
|
||||
sources.put(te, addedStressCapacity);
|
||||
}
|
||||
|
||||
unloadedStress -= lastStress * getStressMultiplierForSpeed(te.getTheoreticalSpeed());
|
||||
float stressApplied = te.getStressApplied();
|
||||
float stressApplied = te.calculateStressApplied();
|
||||
members.put(te, stressApplied);
|
||||
|
||||
unloadedMembers--;
|
||||
|
@ -59,8 +59,8 @@ public class KineticNetwork {
|
|||
if (members.containsKey(te))
|
||||
return;
|
||||
if (te.isSource())
|
||||
sources.put(te, te.getAddedStressCapacity());
|
||||
members.put(te, te.getStressApplied());
|
||||
sources.put(te, te.calculateAddedStressCapacity());
|
||||
members.put(te, te.calculateStressApplied());
|
||||
te.updateFromNetwork(currentCapacity, currentStress, getSize());
|
||||
te.networkDirty = true;
|
||||
}
|
||||
|
|
|
@ -327,7 +327,10 @@ public class RotationPropagator {
|
|||
|
||||
while (!frontier.isEmpty()) {
|
||||
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.sendData();
|
||||
|
|
|
@ -3,10 +3,8 @@ package com.simibubi.create.modules.contraptions.base;
|
|||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.state.BooleanProperty;
|
||||
import net.minecraft.state.StateContainer.Builder;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.Rotation;
|
||||
|
@ -86,17 +84,6 @@ public abstract class DirectionalAxisKineticBlock extends DirectionalKineticBloc
|
|||
return this.getDefaultState().with(FACING, facing).with(AXIS_ALONG_FIRST_COORDINATE, alongFirst);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
World world = context.getWorld();
|
||||
Direction face = context.getFace();
|
||||
if ((turnBackOnWrenched() ? face.getOpposite() : face) == state.get(FACING)) {
|
||||
KineticTileEntity.switchToBlockState(world, context.getPos(), state.cycle(AXIS_ALONG_FIRST_COORDINATE));
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
return super.onWrenched(state, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Axis getRotationAxis(BlockState state) {
|
||||
Axis pistonAxis = state.get(FACING).getAxis();
|
||||
|
|
|
@ -3,15 +3,12 @@ package com.simibubi.create.modules.contraptions.base;
|
|||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.state.DirectionProperty;
|
||||
import net.minecraft.state.StateContainer.Builder;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Mirror;
|
||||
import net.minecraft.util.Rotation;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public abstract class DirectionalKineticBlock extends KineticBlock {
|
||||
|
||||
|
@ -45,24 +42,6 @@ public abstract class DirectionalKineticBlock extends KineticBlock {
|
|||
return prefferedSide;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
Direction facing = turnBackOnWrenched() ? context.getFace().getOpposite() : context.getFace();
|
||||
World world = context.getWorld();
|
||||
if (facing == state.get(FACING))
|
||||
return ActionResultType.PASS;
|
||||
|
||||
BlockState with = state.with(FACING, facing);
|
||||
if (!with.isValidPosition(world, context.getPos()))
|
||||
return ActionResultType.PASS;
|
||||
KineticTileEntity.switchToBlockState(world, context.getPos(), with);
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
protected boolean turnBackOnWrenched() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||
Direction preferred = getPreferredFacing(context);
|
||||
|
|
|
@ -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.goggle.IHaveGoggleInformation;
|
||||
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.text.TextFormatting;
|
||||
|
@ -33,7 +34,10 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity {
|
|||
@Override
|
||||
public void setSource(BlockPos 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()))
|
||||
reActivateSource = false;
|
||||
}
|
||||
|
@ -51,7 +55,7 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity {
|
|||
public boolean addToGoggleTooltip(List<String> tooltip, boolean isPlayerSneaking) {
|
||||
boolean added = super.addToGoggleTooltip(tooltip, isPlayerSneaking);
|
||||
|
||||
float stressBase = getAddedStressCapacity();
|
||||
float stressBase = calculateAddedStressCapacity();
|
||||
if (stressBase != 0 && IRotate.StressImpact.isEnabled()) {
|
||||
tooltip.add(spacing + Lang.translate("gui.goggles.generator_stats"));
|
||||
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("tooltip.capacityProvided"));
|
||||
|
@ -93,8 +97,8 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity {
|
|||
|
||||
if (hasNetwork() && speed != 0) {
|
||||
KineticNetwork network = getOrCreateNetwork();
|
||||
notifyStressCapacityChange(getAddedStressCapacity());
|
||||
getOrCreateNetwork().updateStressFor(this, getStressApplied());
|
||||
notifyStressCapacityChange(calculateAddedStressCapacity());
|
||||
getOrCreateNetwork().updateStressFor(this, calculateStressApplied());
|
||||
network.updateStress();
|
||||
}
|
||||
|
||||
|
@ -108,7 +112,7 @@ public abstract class GeneratingKineticTileEntity extends KineticTileEntity {
|
|||
if (speed == 0) {
|
||||
if (hasSource()) {
|
||||
notifyStressCapacityChange(0);
|
||||
getOrCreateNetwork().updateStressFor(this, getStressApplied());
|
||||
getOrCreateNetwork().updateStressFor(this, calculateStressApplied());
|
||||
return;
|
||||
}
|
||||
detachKinetics();
|
||||
|
|
|
@ -3,11 +3,9 @@ package com.simibubi.create.modules.contraptions.base;
|
|||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.state.IProperty;
|
||||
import net.minecraft.state.StateContainer.Builder;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.Direction.AxisDirection;
|
||||
|
@ -15,7 +13,6 @@ import net.minecraft.util.Mirror;
|
|||
import net.minecraft.util.Rotation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IWorldReader;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public abstract class HorizontalAxisKineticBlock extends KineticBlock {
|
||||
|
||||
|
@ -69,18 +66,6 @@ public abstract class HorizontalAxisKineticBlock extends KineticBlock {
|
|||
return face.getAxis() == state.get(HORIZONTAL_AXIS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
Direction facing = context.getFace();
|
||||
if (facing.getAxis().isVertical())
|
||||
return ActionResultType.PASS;
|
||||
World world = context.getWorld();
|
||||
if (facing.getAxis() == state.get(HORIZONTAL_AXIS))
|
||||
return ActionResultType.PASS;
|
||||
KineticTileEntity.switchToBlockState(world, context.getPos(), state.cycle(HORIZONTAL_AXIS));
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState rotate(BlockState state, Rotation rot) {
|
||||
Axis axis = state.get(HORIZONTAL_AXIS);
|
||||
|
|
|
@ -3,15 +3,12 @@ package com.simibubi.create.modules.contraptions.base;
|
|||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.state.IProperty;
|
||||
import net.minecraft.state.StateContainer.Builder;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Mirror;
|
||||
import net.minecraft.util.Rotation;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public abstract class HorizontalKineticBlock extends KineticBlock {
|
||||
|
||||
|
@ -52,18 +49,6 @@ public abstract class HorizontalKineticBlock extends KineticBlock {
|
|||
return prefferedSide;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
Direction facing = context.getFace();
|
||||
if (facing.getAxis().isVertical())
|
||||
return ActionResultType.PASS;
|
||||
World world = context.getWorld();
|
||||
if (facing == state.get(HORIZONTAL_FACING))
|
||||
return ActionResultType.PASS;
|
||||
KineticTileEntity.switchToBlockState(world, context.getPos(), state.with(HORIZONTAL_FACING, facing));
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState rotate(BlockState state, Rotation rot) {
|
||||
return state.with(HORIZONTAL_FACING, rot.rotate(state.get(HORIZONTAL_FACING)));
|
||||
|
|
|
@ -72,30 +72,19 @@ public abstract class KineticBlock extends Block implements IRotate {
|
|||
@Override
|
||||
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")
|
||||
@Override
|
||||
public void updateNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags) {
|
||||
super.updateNeighbors(stateIn, worldIn, pos, flags);
|
||||
KineticTileEntity tileEntity = (KineticTileEntity) worldIn.getTileEntity(pos);
|
||||
if (tileEntity == null)
|
||||
return;
|
||||
if (worldIn.isRemote())
|
||||
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 // TODO 1.15 register layer
|
||||
|
@ -107,12 +96,13 @@ public abstract class KineticBlock extends Block implements IRotate {
|
|||
|
||||
@Override
|
||||
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)
|
||||
return;
|
||||
|
||||
TileEntity tileEntity = worldIn.getTileEntity(pos);
|
||||
if (!(tileEntity instanceof KineticTileEntity))
|
||||
return;
|
||||
|
||||
KineticTileEntity kte = (KineticTileEntity) tileEntity;
|
||||
kte.effects.queueRotationIndicators();
|
||||
}
|
||||
|
|
|
@ -104,7 +104,9 @@ public abstract class KineticTileEntity extends SmartTileEntity
|
|||
if (!world.isBlockPresent(source))
|
||||
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) {
|
||||
removeSource();
|
||||
detachKinetics();
|
||||
|
@ -137,20 +139,22 @@ public abstract class KineticTileEntity extends SmartTileEntity
|
|||
}
|
||||
}
|
||||
|
||||
public float getAddedStressCapacity() {
|
||||
public float calculateAddedStressCapacity() {
|
||||
Map<ResourceLocation, ConfigValue<Double>> capacityMap = AllConfigs.SERVER.kinetics.stressValues.capacities;
|
||||
ResourceLocation path = getBlockState().getBlock().getRegistryName();
|
||||
if (!capacityMap.containsKey(path))
|
||||
return 0;
|
||||
return capacityMap.get(path).get().floatValue();
|
||||
|
||||
float capacity = capacityMap.containsKey(path) ? capacityMap.get(path).get().floatValue() : 0;
|
||||
this.lastCapacityProvided = capacity;
|
||||
return capacity;
|
||||
}
|
||||
|
||||
public float getStressApplied() {
|
||||
public float calculateStressApplied() {
|
||||
Map<ResourceLocation, ConfigValue<Double>> stressEntries = AllConfigs.SERVER.kinetics.stressValues.impacts;
|
||||
ResourceLocation path = getBlockState().getBlock().getRegistryName();
|
||||
if (!stressEntries.containsKey(path))
|
||||
return 1;
|
||||
return stressEntries.get(path).get().floatValue();
|
||||
|
||||
float impact = stressEntries.containsKey(path) ? stressEntries.get(path).get().floatValue() : 1;
|
||||
this.lastStressApplied = impact;
|
||||
return impact;
|
||||
}
|
||||
|
||||
public void onSpeedChanged(float previousSpeed) {
|
||||
|
@ -185,12 +189,10 @@ public abstract class KineticTileEntity extends SmartTileEntity
|
|||
networkTag.putFloat("Capacity", capacity);
|
||||
networkTag.putInt("Size", networkSize);
|
||||
|
||||
float stressApplied = getStressApplied();
|
||||
float addedStressCapacity = getAddedStressCapacity();
|
||||
if (stressApplied != 0)
|
||||
networkTag.putFloat("AddedStress", stressApplied);
|
||||
if (addedStressCapacity != 0)
|
||||
networkTag.putFloat("AddedCapacity", addedStressCapacity);
|
||||
if (lastStressApplied != 0)
|
||||
networkTag.putFloat("AddedStress", lastStressApplied);
|
||||
if (lastCapacityProvided != 0)
|
||||
networkTag.putFloat("AddedCapacity", lastCapacityProvided);
|
||||
|
||||
compound.put("Network", networkTag);
|
||||
}
|
||||
|
@ -201,7 +203,6 @@ public abstract class KineticTileEntity extends SmartTileEntity
|
|||
@Override
|
||||
public void read(CompoundNBT compound) {
|
||||
speed = compound.getFloat("Speed");
|
||||
|
||||
source = null;
|
||||
network = null;
|
||||
overStressed = false;
|
||||
|
@ -266,12 +267,13 @@ public abstract class KineticTileEntity extends SmartTileEntity
|
|||
if (world == null || world.isRemote)
|
||||
return;
|
||||
|
||||
KineticTileEntity sourceTe = (KineticTileEntity) world.getTileEntity(source);
|
||||
if (sourceTe == null) {
|
||||
TileEntity tileEntity = world.getTileEntity(source);
|
||||
if (!(tileEntity instanceof KineticTileEntity)) {
|
||||
removeSource();
|
||||
return;
|
||||
}
|
||||
|
||||
KineticTileEntity sourceTe = (KineticTileEntity) tileEntity;
|
||||
setNetwork(sourceTe.network);
|
||||
}
|
||||
|
||||
|
@ -336,9 +338,11 @@ public abstract class KineticTileEntity extends SmartTileEntity
|
|||
public static void switchToBlockState(World world, BlockPos pos, BlockState state) {
|
||||
if (world.isRemote)
|
||||
return;
|
||||
|
||||
TileEntity tileEntityIn = world.getTileEntity(pos);
|
||||
if (!(tileEntityIn instanceof KineticTileEntity))
|
||||
return;
|
||||
|
||||
KineticTileEntity tileEntity = (KineticTileEntity) tileEntityIn;
|
||||
if (tileEntity.hasNetwork())
|
||||
tileEntity.getOrCreateNetwork().remove(tileEntity);
|
||||
|
@ -387,9 +391,9 @@ public abstract class KineticTileEntity extends SmartTileEntity
|
|||
@Override
|
||||
public boolean addToGoggleTooltip(List<String> tooltip, boolean isPlayerSneaking) {
|
||||
boolean added = false;
|
||||
float stressAtBase = getStressApplied();
|
||||
float stressAtBase = calculateStressApplied();
|
||||
|
||||
if (getStressApplied() != 0 && StressImpact.isEnabled()) {
|
||||
if (calculateStressApplied() != 0 && StressImpact.isEnabled()) {
|
||||
tooltip.add(spacing + Lang.translate("gui.goggles.kinetic_stats"));
|
||||
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("tooltip.stressImpact"));
|
||||
|
||||
|
|
|
@ -3,15 +3,12 @@ package com.simibubi.create.modules.contraptions.base;
|
|||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.state.EnumProperty;
|
||||
import net.minecraft.state.StateContainer;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.Rotation;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public abstract class RotatedPillarKineticBlock extends KineticBlock {
|
||||
|
||||
|
@ -72,14 +69,4 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock {
|
|||
: context.getNearestLookingDirection().getAxis());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
Axis axis = context.getFace().getAxis();
|
||||
World world = context.getWorld();
|
||||
if (axis == state.get(AXIS))
|
||||
return ActionResultType.PASS;
|
||||
KineticTileEntity.switchToBlockState(world, context.getPos(), state.with(AXIS, axis));
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
package com.simibubi.create.modules.contraptions.components.actors;
|
||||
|
||||
import com.simibubi.create.foundation.utility.BlockHelper;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.ContraptionEntity;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.MovementBehaviour;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.MovementContext;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.item.minecart.AbstractMinecartEntity;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.util.DamageSource;
|
||||
|
@ -37,8 +39,17 @@ public class BlockBreakingMovementBehaviour extends MovementBehaviour {
|
|||
if (damageSource == null)
|
||||
return;
|
||||
for (Entity entity : world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(pos))) {
|
||||
|
||||
if (entity instanceof ItemEntity)
|
||||
return;
|
||||
if (entity instanceof ContraptionEntity)
|
||||
return;
|
||||
if (entity instanceof AbstractMinecartEntity)
|
||||
for (Entity passenger : entity.getRecursivePassengers())
|
||||
if (passenger instanceof ContraptionEntity
|
||||
&& ((ContraptionEntity) passenger).getContraption() == context.contraption)
|
||||
return;
|
||||
|
||||
float damage = (float) MathHelper.clamp(Math.abs(context.relativeMotion.length() * 10) + 1, 5, 20);
|
||||
entity.attackEntityFrom(damageSource, damage);
|
||||
entity.setMotion(entity.getMotion().add(context.relativeMotion.scale(3)));
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
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.modules.contraptions.base.DirectionalKineticBlock;
|
||||
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.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 DamageSource damageSourceDrill = new DamageSource("create.drill").setDamageBypassesArmor();
|
||||
|
@ -93,4 +93,9 @@ public class DrillBlock extends DirectionalKineticBlock implements IPortableBloc
|
|||
return MOVEMENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<DrillTileEntity> getTileEntityClass() {
|
||||
return DrillTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -102,8 +102,8 @@ public class StorageInterfaceMovement extends MovementBehaviour {
|
|||
|
||||
extracting.withAmountThreshold(stack -> {
|
||||
ItemStack tester = stack.copy();
|
||||
tester.setCount(64);
|
||||
return 64 - ItemHandlerHelper.insertItemStacked(inv, stack, true).getCount();
|
||||
tester.setCount(tester.getMaxStackSize());
|
||||
return stack.getCount() - ItemHandlerHelper.insertItemStacked(inv, stack, true).getCount();
|
||||
});
|
||||
|
||||
extracting.setCallback(stack -> {
|
||||
|
|
|
@ -3,10 +3,19 @@ package com.simibubi.create.modules.contraptions.components.contraptions;
|
|||
import com.simibubi.create.AllBlocks;
|
||||
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.contraptions.bearing.ClockworkBearingBlock;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.bearing.ClockworkBearingTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.bearing.MechanicalBearingBlock;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.bearing.MechanicalBearingTileEntity;
|
||||
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.belts.FunnelBlock;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.piston.MechanicalPistonBlock;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.piston.MechanicalPistonBlock.PistonState;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.pulley.PulleyBlock;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.pulley.PulleyTileEntity;
|
||||
import com.simibubi.create.modules.logistics.block.AttachedLogisticalBlock;
|
||||
import com.simibubi.create.modules.logistics.block.RedstoneLinkBlock;
|
||||
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 net.minecraft.block.AbstractPressurePlateBlock;
|
||||
|
@ -27,6 +36,7 @@ import net.minecraft.block.WallTorchBlock;
|
|||
import net.minecraft.block.material.PushReaction;
|
||||
import net.minecraft.state.properties.AttachFace;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
@ -55,6 +65,26 @@ public class BlockMovementTraits {
|
|||
return false;
|
||||
if (block == Blocks.OBSIDIAN)
|
||||
return false;
|
||||
|
||||
// Move controllers only when they aren't moving
|
||||
if (block instanceof MechanicalPistonBlock && blockState.get(MechanicalPistonBlock.STATE) != PistonState.MOVING)
|
||||
return true;
|
||||
if (block instanceof MechanicalBearingBlock) {
|
||||
TileEntity te = world.getTileEntity(pos);
|
||||
if (te instanceof MechanicalBearingTileEntity)
|
||||
return !((MechanicalBearingTileEntity) te).isRunning();
|
||||
}
|
||||
if (block instanceof ClockworkBearingBlock) {
|
||||
TileEntity te = world.getTileEntity(pos);
|
||||
if (te instanceof ClockworkBearingTileEntity)
|
||||
return !((ClockworkBearingTileEntity) te).isRunning();
|
||||
}
|
||||
if (block instanceof PulleyBlock) {
|
||||
TileEntity te = world.getTileEntity(pos);
|
||||
if (te instanceof PulleyTileEntity)
|
||||
return !((PulleyTileEntity) te).running && ((PulleyTileEntity) te).offset == 0;
|
||||
}
|
||||
|
||||
if (AllBlocks.BELT.typeOf(blockState))
|
||||
return true;
|
||||
if (block instanceof ExtractorBlock)
|
||||
|
@ -94,6 +124,8 @@ public class BlockMovementTraits {
|
|||
return true;
|
||||
if (block instanceof RedstoneWireBlock)
|
||||
return true;
|
||||
if (block instanceof RedstoneLinkBlock)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -112,6 +144,8 @@ public class BlockMovementTraits {
|
|||
return direction == Direction.DOWN;
|
||||
if (block instanceof AttachedLogisticalBlock && !(block instanceof TransposerBlock))
|
||||
return direction == AttachedLogisticalBlock.getBlockFacing(state);
|
||||
if (block instanceof RedstoneLinkBlock)
|
||||
return direction.getOpposite() == state.get(RedstoneLinkBlock.FACING);
|
||||
if (block instanceof FlowerPotBlock)
|
||||
return direction == Direction.DOWN;
|
||||
if (block instanceof RedstoneDiodeBlock)
|
||||
|
@ -156,14 +190,4 @@ public class BlockMovementTraits {
|
|||
return isBrittle(state);
|
||||
}
|
||||
|
||||
public static boolean movementIgnored(BlockState state) {
|
||||
if (AllBlocks.MECHANICAL_PISTON.typeOf(state))
|
||||
return true;
|
||||
if (AllBlocks.STICKY_MECHANICAL_PISTON.typeOf(state))
|
||||
return true;
|
||||
if (AllBlocks.MECHANICAL_PISTON_HEAD.typeOf(state))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -25,17 +25,23 @@ import com.simibubi.create.foundation.utility.WrappedWorld;
|
|||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.chassis.AbstractChassisBlock;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.chassis.ChassisTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.piston.MechanicalPistonBlock;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.piston.PistonPoleBlock;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.piston.MechanicalPistonBlock.PistonState;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.piston.MechanicalPistonHeadBlock;
|
||||
import com.simibubi.create.modules.contraptions.components.saw.SawBlock;
|
||||
import com.simibubi.create.modules.contraptions.redstone.ContactBlock;
|
||||
import com.simibubi.create.modules.contraptions.relays.belt.BeltBlock;
|
||||
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
|
||||
import com.simibubi.create.modules.logistics.block.inventories.FlexcrateBlock;
|
||||
|
||||
import net.minecraft.block.AbstractButtonBlock;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.ChestBlock;
|
||||
import net.minecraft.block.DoorBlock;
|
||||
import net.minecraft.block.PressurePlateBlock;
|
||||
import net.minecraft.block.SlimeBlock;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.RenderTypeLookup;
|
||||
|
@ -159,6 +165,49 @@ public abstract class Contraption {
|
|||
if (prevPos != null && !visited.contains(prevPos))
|
||||
frontier.add(prevPos);
|
||||
}
|
||||
|
||||
if (state.getBlock() instanceof MechanicalPistonBlock) {
|
||||
int limit = AllConfigs.SERVER.kinetics.maxPistonPoles.get();
|
||||
Direction direction = state.get(MechanicalPistonBlock.FACING);
|
||||
if (state.get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) {
|
||||
BlockPos searchPos = pos;
|
||||
while (limit-- >= 0) {
|
||||
searchPos = searchPos.offset(direction);
|
||||
BlockState blockState = world.getBlockState(searchPos);
|
||||
if (AllBlocks.PISTON_POLE.typeOf(blockState)) {
|
||||
if (blockState.get(PistonPoleBlock.FACING).getAxis() != direction.getAxis())
|
||||
break;
|
||||
if (!visited.contains(searchPos))
|
||||
frontier.add(searchPos);
|
||||
continue;
|
||||
}
|
||||
if (blockState.getBlock() instanceof MechanicalPistonHeadBlock)
|
||||
if (!visited.contains(searchPos))
|
||||
frontier.add(searchPos);
|
||||
break;
|
||||
}
|
||||
if (limit <= -1)
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockPos searchPos = pos;
|
||||
while (limit-- >= 0) {
|
||||
searchPos = searchPos.offset(direction.getOpposite());
|
||||
BlockState blockState = world.getBlockState(searchPos);
|
||||
if (AllBlocks.PISTON_POLE.typeOf(blockState)) {
|
||||
if (blockState.get(PistonPoleBlock.FACING).getAxis() != direction.getAxis())
|
||||
break;
|
||||
if (!visited.contains(searchPos))
|
||||
frontier.add(searchPos);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (limit <= -1)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (state.getBlock() instanceof DoorBlock) {
|
||||
BlockPos otherPartPos = pos.up(state.get(DoorBlock.HALF) == DoubleBlockHalf.LOWER ? 1 : -1);
|
||||
if (!visited.contains(otherPartPos))
|
||||
|
@ -169,7 +218,7 @@ public abstract class Contraption {
|
|||
for (Direction offset : Direction.values()) {
|
||||
BlockPos offsetPos = pos.offset(offset);
|
||||
BlockState blockState = world.getBlockState(offsetPos);
|
||||
if (BlockMovementTraits.movementIgnored(blockState))
|
||||
if (isAnchoringBlockAt(offsetPos))
|
||||
continue;
|
||||
if (!BlockMovementTraits.movementAllowed(world, offsetPos)) {
|
||||
if (offset == forcedDirection && isSlimeBlock)
|
||||
|
@ -187,6 +236,10 @@ public abstract class Contraption {
|
|||
return true;
|
||||
}
|
||||
|
||||
protected boolean isAnchoringBlockAt(BlockPos pos) {
|
||||
return pos.equals(anchor);
|
||||
}
|
||||
|
||||
protected static boolean isChassis(BlockState state) {
|
||||
return state.getBlock() instanceof AbstractChassisBlock;
|
||||
}
|
||||
|
@ -217,6 +270,14 @@ public abstract class Contraption {
|
|||
blockstate = blockstate.with(FlexcrateBlock.DOUBLE, false);
|
||||
if (AllBlocks.CONTACT.typeOf(blockstate))
|
||||
blockstate = blockstate.with(ContactBlock.POWERED, true);
|
||||
if (blockstate.getBlock() instanceof AbstractButtonBlock) {
|
||||
blockstate = blockstate.with(AbstractButtonBlock.POWERED, false);
|
||||
world.getPendingBlockTicks().scheduleTick(pos, blockstate.getBlock(), -1);
|
||||
}
|
||||
if (blockstate.getBlock() instanceof PressurePlateBlock) {
|
||||
blockstate = blockstate.with(PressurePlateBlock.POWERED, false);
|
||||
world.getPendingBlockTicks().scheduleTick(pos, blockstate.getBlock(), -1);
|
||||
}
|
||||
CompoundNBT compoundnbt = getTileEntityNBT(world, pos);
|
||||
TileEntity tileentity = world.getTileEntity(pos);
|
||||
return Pair.of(new BlockInfo(pos, blockstate, compoundnbt), tileentity);
|
||||
|
|
|
@ -14,6 +14,7 @@ import net.minecraft.entity.EntityType;
|
|||
import net.minecraft.entity.IProjectile;
|
||||
import net.minecraft.entity.MoverType;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.Direction.AxisDirection;
|
||||
|
@ -73,6 +74,7 @@ public class ContraptionCollider {
|
|||
|
||||
if (allowedMovement.equals(relativeMotion))
|
||||
continue;
|
||||
|
||||
if (allowedMovement.y != relativeMotion.y) {
|
||||
entity.handleFallDamage(entity.fallDistance, 1);
|
||||
entity.fallDistance = 0;
|
||||
|
@ -80,6 +82,8 @@ public class ContraptionCollider {
|
|||
DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> checkForClientPlayerCollision(entity));
|
||||
}
|
||||
|
||||
if (entity instanceof ServerPlayerEntity)
|
||||
((ServerPlayerEntity) entity).connection.floatingTickCount = 0;
|
||||
if (entity instanceof PlayerEntity && !world.isRemote)
|
||||
return;
|
||||
|
||||
|
|
|
@ -25,11 +25,6 @@ public abstract class BearingBlock extends DirectionalKineticBlock {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean turnBackOnWrenched() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Axis getRotationAxis(BlockState state) {
|
||||
return state.get(FACING).getAxis();
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
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.entity.player.PlayerEntity;
|
||||
|
@ -12,7 +12,7 @@ import net.minecraft.util.math.BlockRayTraceResult;
|
|||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class ClockworkBearingBlock extends BearingBlock implements IWithTileEntity<ClockworkBearingTileEntity> {
|
||||
public class ClockworkBearingBlock extends BearingBlock implements ITE<ClockworkBearingTileEntity> {
|
||||
|
||||
@Override
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
|
@ -41,4 +41,9 @@ public class ClockworkBearingBlock extends BearingBlock implements IWithTileEnti
|
|||
return ActionResultType.PASS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<ClockworkBearingTileEntity> getTileEntityClass() {
|
||||
return ClockworkBearingTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -299,4 +299,8 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe
|
|||
return this.minuteHand == contraption;
|
||||
}
|
||||
|
||||
public boolean isRunning() {
|
||||
return running;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
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.BlockState;
|
||||
|
@ -13,7 +13,7 @@ import net.minecraft.util.math.BlockRayTraceResult;
|
|||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class MechanicalBearingBlock extends BearingBlock implements IWithTileEntity<MechanicalBearingTileEntity> {
|
||||
public class MechanicalBearingBlock extends BearingBlock implements ITE<MechanicalBearingTileEntity> {
|
||||
|
||||
@Override
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
|
@ -56,4 +56,9 @@ public class MechanicalBearingBlock extends BearingBlock implements IWithTileEnt
|
|||
withTileEntityDo(worldIn, pos, MechanicalBearingTileEntity::neighbourChanged);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<MechanicalBearingTileEntity> getTileEntityClass() {
|
||||
return MechanicalBearingTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -52,13 +52,13 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
|
|||
}
|
||||
|
||||
@Override
|
||||
public float getAddedStressCapacity() {
|
||||
return isWindmill ? super.getAddedStressCapacity() : 0;
|
||||
public float calculateAddedStressCapacity() {
|
||||
return isWindmill ? super.calculateAddedStressCapacity() : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getStressApplied() {
|
||||
return isWindmill ? 0 : super.getStressApplied();
|
||||
public float calculateStressApplied() {
|
||||
return isWindmill ? 0 : super.calculateStressApplied();
|
||||
}
|
||||
|
||||
public void neighbourChanged() {
|
||||
|
@ -299,4 +299,8 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
|
|||
return movedContraption == contraption;
|
||||
}
|
||||
|
||||
public boolean isRunning() {
|
||||
return running;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -130,6 +130,11 @@ public class CartAssemblerBlock extends AbstractRailBlock {
|
|||
return PushReaction.BLOCK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNormalCube(BlockState state, IBlockReader worldIn, BlockPos pos) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static class MinecartAnchorBlock extends RenderUtilityBlock {
|
||||
|
||||
@Override
|
||||
|
|
|
@ -3,7 +3,7 @@ package com.simibubi.create.modules.contraptions.components.contraptions.piston;
|
|||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.AllSoundEvents;
|
||||
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.Lang;
|
||||
import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock;
|
||||
|
@ -34,7 +34,7 @@ import net.minecraft.world.World;
|
|||
import net.minecraftforge.common.Tags;
|
||||
|
||||
public class MechanicalPistonBlock extends DirectionalAxisKineticBlock
|
||||
implements IWithTileEntity<MechanicalPistonTileEntity> {
|
||||
implements ITE<MechanicalPistonTileEntity> {
|
||||
|
||||
public static final EnumProperty<PistonState> STATE = EnumProperty.create("state", PistonState.class);
|
||||
protected boolean isSticky;
|
||||
|
@ -102,11 +102,6 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock
|
|||
return super.onWrenched(state, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean turnBackOnWrenched() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public enum PistonState implements IStringSerializable {
|
||||
RETRACTED, MOVING, EXTENDED;
|
||||
|
||||
|
@ -176,4 +171,9 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock
|
|||
return VoxelShapes.fullCube();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<MechanicalPistonTileEntity> getTileEntityClass() {
|
||||
return MechanicalPistonTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import com.simibubi.create.modules.contraptions.components.contraptions.piston.M
|
|||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.material.PushReaction;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.state.EnumProperty;
|
||||
|
@ -37,6 +38,11 @@ public class MechanicalPistonHeadBlock extends ProperDirectionalBlock implements
|
|||
super.fillStateContainer(builder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PushReaction getPushReaction(BlockState state) {
|
||||
return PushReaction.NORMAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos,
|
||||
PlayerEntity player) {
|
||||
|
|
|
@ -7,6 +7,7 @@ import com.simibubi.create.modules.contraptions.components.contraptions.piston.M
|
|||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.material.PushReaction;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
|
@ -26,6 +27,11 @@ public class PistonPoleBlock extends ProperDirectionalBlock {
|
|||
setDefaultState(getDefaultState().with(FACING, Direction.UP));
|
||||
}
|
||||
|
||||
@Override
|
||||
public PushReaction getPushReaction(BlockState state) {
|
||||
return PushReaction.NORMAL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) {
|
||||
Axis axis = state.get(FACING).getAxis();
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.contraptions.pulley;
|
|||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
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.modules.contraptions.base.HorizontalAxisKineticBlock;
|
||||
|
||||
|
@ -24,7 +24,7 @@ import net.minecraft.util.math.shapes.VoxelShape;
|
|||
import net.minecraft.world.IBlockReader;
|
||||
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;
|
||||
|
||||
|
@ -131,4 +131,9 @@ public class PulleyBlock extends HorizontalAxisKineticBlock implements IWithTile
|
|||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<PulleyTileEntity> getTileEntityClass() {
|
||||
return PulleyTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -30,6 +30,11 @@ public class PulleyTileEntity extends LinearActuatorTileEntity {
|
|||
return super.getRenderBoundingBox().expand(0, -offset, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getMaxRenderDistanceSquared() {
|
||||
return super.getMaxRenderDistanceSquared() + offset * offset;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void assemble() {
|
||||
if (speed == 0)
|
||||
|
@ -151,7 +156,7 @@ public class PulleyTileEntity extends LinearActuatorTileEntity {
|
|||
|
||||
@Override
|
||||
protected int getExtensionRange() {
|
||||
return Math.min(AllConfigs.SERVER.kinetics.maxRopeLength.get(), pos.getY() - 1);
|
||||
return Math.max(0, Math.min(AllConfigs.SERVER.kinetics.maxRopeLength.get(), pos.getY() - 1));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.crafter;
|
|||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
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.IHaveConnectedTextures;
|
||||
import com.simibubi.create.foundation.utility.AngleHelper;
|
||||
|
@ -41,7 +41,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
|
|||
import net.minecraftforge.items.ItemStackHandler;
|
||||
|
||||
public class MechanicalCrafterBlock extends HorizontalKineticBlock
|
||||
implements IWithTileEntity<MechanicalCrafterTileEntity>, IHaveConnectedTextures {
|
||||
implements ITE<MechanicalCrafterTileEntity>, IHaveConnectedTextures {
|
||||
|
||||
public static final EnumProperty<Pointing> POINTING = EnumProperty.create("pointing", Pointing.class);
|
||||
|
||||
|
@ -290,4 +290,9 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock
|
|||
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)))
|
||||
return false;
|
||||
TileEntity te = world.getTileEntity(targetPos);
|
||||
if (te == null || !(te instanceof BeltTileEntity))
|
||||
if (!(te instanceof BeltTileEntity))
|
||||
return false;
|
||||
return ((KineticTileEntity) te).getSpeed() != 0;
|
||||
}
|
||||
|
|
|
@ -163,10 +163,9 @@ public class MechanicalCrafterTileEntityRenderer extends SafeTileEntityRenderer<
|
|||
|
||||
if (te.phase == Phase.EXPORTING) {
|
||||
int textureIndex = (int) ((te.getCountDownSpeed() / 128f * AnimationTickHolder.ticks));
|
||||
beltBuffer.shiftUVtoSheet(animatedTexture.getOriginal(), animatedTexture.getTarget(),
|
||||
(textureIndex % 4) * 4, 0);
|
||||
beltBuffer.shiftUVtoSheet(animatedTexture, (textureIndex % 4) / 4f, 0, 1);
|
||||
} else {
|
||||
beltBuffer.shiftUVtoSheet(animatedTexture.getOriginal(), animatedTexture.getTarget(), 0, 0);
|
||||
beltBuffer.dontShiftUV();
|
||||
}
|
||||
|
||||
beltBuffer.renderInto(ms, vb);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package com.simibubi.create.modules.contraptions.components.crank;
|
||||
|
||||
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.modules.contraptions.base.DirectionalKineticBlock;
|
||||
|
||||
|
@ -22,7 +22,7 @@ import net.minecraft.world.IBlockReader;
|
|||
import net.minecraft.world.IWorldReader;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class HandCrankBlock extends DirectionalKineticBlock implements IWithTileEntity<HandCrankTileEntity> {
|
||||
public class HandCrankBlock extends DirectionalKineticBlock implements ITE<HandCrankTileEntity> {
|
||||
|
||||
public HandCrankBlock() {
|
||||
super(Properties.from(AllBlocks.COGWHEEL.get()));
|
||||
|
@ -96,4 +96,9 @@ public class HandCrankBlock extends DirectionalKineticBlock implements IWithTile
|
|||
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 com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
import com.simibubi.create.foundation.utility.AllShapes;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
|
@ -20,7 +20,7 @@ import net.minecraft.world.IBlockReader;
|
|||
import net.minecraft.world.IWorldReader;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class CrushingWheelBlock extends RotatedPillarKineticBlock {
|
||||
public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE<CrushingWheelTileEntity> {
|
||||
|
||||
public CrushingWheelBlock() {
|
||||
super(Properties.from(Blocks.DIORITE));
|
||||
|
@ -74,8 +74,11 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
|
|||
BlockState otherState = world.getBlockState(otherWheelPos);
|
||||
if (AllBlocks.CRUSHING_WHEEL.typeOf(otherState)) {
|
||||
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)
|
||||
&& te.getSpeed() != 0) {
|
||||
float signum = Math.signum(te.getSpeed()) * (state.get(AXIS) == Axis.X ? -1 : 1);
|
||||
|
@ -83,6 +86,10 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
|
|||
}
|
||||
if (otherState.get(AXIS) != state.get(AXIS))
|
||||
controllerShouldExist = false;
|
||||
|
||||
} catch (TileEntityException e) {
|
||||
controllerShouldExist = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!controllerShouldExist) {
|
||||
|
@ -107,9 +114,8 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
|
|||
|
||||
@Override
|
||||
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) {
|
||||
KineticTileEntity te = (KineticTileEntity) worldIn.getTileEntity(pos);
|
||||
if (te == null)
|
||||
return;
|
||||
try {
|
||||
CrushingWheelTileEntity te = getTileEntity(worldIn, pos);
|
||||
if (entityIn.getY() < pos.getY() + 1.25f || !entityIn.onGround)
|
||||
return;
|
||||
|
||||
|
@ -125,6 +131,8 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
|
|||
z += (pos.getZ() + .5f - entityIn.getZ()) * .1f;
|
||||
}
|
||||
entityIn.setMotion(entityIn.getMotion().add(x, 0, z));
|
||||
|
||||
} catch (TileEntityException e) {}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -169,4 +177,9 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
|
|||
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.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 net.minecraft.block.Block;
|
||||
|
@ -12,7 +14,6 @@ import net.minecraft.block.Blocks;
|
|||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.inventory.InventoryHelper;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
|
@ -33,7 +34,8 @@ import net.minecraft.world.IBlockReader;
|
|||
import net.minecraft.world.IWorld;
|
||||
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");
|
||||
|
||||
|
@ -51,6 +53,11 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addRunningEffects(BlockState state, World world, BlockPos pos, Entity entity) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
|
||||
return new CrushingWheelControllerTileEntity();
|
||||
|
@ -65,11 +72,10 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
|
|||
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) {
|
||||
if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen())
|
||||
return;
|
||||
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn.getTileEntity(pos);
|
||||
if (te == null)
|
||||
return;
|
||||
withTileEntityDo(worldIn, pos, te -> {
|
||||
if (te.processingEntity == entityIn)
|
||||
entityIn.setMotionMultiplier(state, new Vec3d(0.25D, (double) 0.05F, 0.25D));
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -77,12 +83,9 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
|
|||
super.onLanded(worldIn, entityIn);
|
||||
if (CrushingWheelControllerTileEntity.isFrozen())
|
||||
return;
|
||||
TileEntity tileEntity = worldIn.getTileEntity(entityIn.getPosition().down());
|
||||
if (tileEntity == null)
|
||||
return;
|
||||
if (!(tileEntity instanceof CrushingWheelControllerTileEntity))
|
||||
return;
|
||||
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) tileEntity;
|
||||
|
||||
try {
|
||||
CrushingWheelControllerTileEntity te = getTileEntity(worldIn, entityIn.getPosition().down());
|
||||
if (te.crushingspeed == 0)
|
||||
return;
|
||||
if (entityIn instanceof ItemEntity)
|
||||
|
@ -96,6 +99,7 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
|
|||
return;
|
||||
|
||||
te.startCrushing(entityIn);
|
||||
} catch (TileEntityException e) {}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -118,11 +122,7 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
|
|||
}
|
||||
|
||||
public void updateSpeed(BlockState state, World world, BlockPos pos) {
|
||||
TileEntity tileEntity = world.getTileEntity(pos);
|
||||
if (tileEntity == null || !(tileEntity instanceof CrushingWheelControllerTileEntity))
|
||||
return;
|
||||
|
||||
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) tileEntity;
|
||||
withTileEntityDo(world, pos, te -> {
|
||||
if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen()) {
|
||||
if (te.crushingspeed != 0) {
|
||||
te.crushingspeed = 0;
|
||||
|
@ -144,6 +144,7 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
|
|||
te.sendData();
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -165,29 +166,27 @@ public class CrushingWheelControllerBlock extends Block implements IHaveNoBlockI
|
|||
if (new AxisAlignedBB(pos).contains(entity.getPositionVec()))
|
||||
return VoxelShapes.empty();
|
||||
|
||||
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) worldIn.getTileEntity(pos);
|
||||
if (te == null)
|
||||
return VoxelShapes.fullCube();
|
||||
try {
|
||||
CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos);
|
||||
if (te.processingEntity == entity)
|
||||
return VoxelShapes.empty();
|
||||
} catch (TileEntityException e) {}
|
||||
}
|
||||
return VoxelShapes.fullCube();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) {
|
||||
if (worldIn.getTileEntity(pos) == null)
|
||||
if (!state.hasTileEntity() || state.getBlock() == newState.getBlock())
|
||||
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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<CrushingWheelControllerTileEntity> getTileEntityClass() {
|
||||
return CrushingWheelControllerTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -204,7 +204,7 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
|
|||
|
||||
@Override
|
||||
public CompoundNBT write(CompoundNBT compound) {
|
||||
if (hasEntity() && !isFrozen())
|
||||
if (hasEntity())
|
||||
compound.put("Entity", NBTUtil.writeUniqueId(entityUUID));
|
||||
compound.put("Inventory", inventory.serializeNBT());
|
||||
compound.putFloat("Speed", crushingspeed);
|
||||
|
|
|
@ -3,7 +3,7 @@ package com.simibubi.create.modules.contraptions.components.deployer;
|
|||
import com.simibubi.create.AllItems;
|
||||
import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour;
|
||||
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.modules.contraptions.base.DirectionalAxisKineticBlock;
|
||||
import com.simibubi.create.modules.contraptions.components.contraptions.IPortableBlock;
|
||||
|
@ -26,7 +26,7 @@ import net.minecraft.world.IBlockReader;
|
|||
import net.minecraft.world.World;
|
||||
|
||||
public class DeployerBlock extends DirectionalAxisKineticBlock
|
||||
implements IWithTileEntity<DeployerTileEntity>, IPortableBlock {
|
||||
implements ITE<DeployerTileEntity>, IPortableBlock {
|
||||
|
||||
public static MovementBehaviour MOVEMENT = new DeployerMovementBehaviour();
|
||||
|
||||
|
@ -111,4 +111,9 @@ public class DeployerBlock extends DirectionalAxisKineticBlock
|
|||
return MOVEMENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<DeployerTileEntity> getTileEntityClass() {
|
||||
return DeployerTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,104 @@
|
|||
package com.simibubi.create.modules.contraptions.components.deployer;
|
||||
|
||||
import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour;
|
||||
import com.simibubi.create.foundation.behaviour.filtering.FilteringBehaviour;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
|
||||
public class DeployerItemHandler implements IItemHandlerModifiable {
|
||||
|
||||
private DeployerTileEntity te;
|
||||
private DeployerFakePlayer player;
|
||||
|
||||
public DeployerItemHandler(DeployerTileEntity te) {
|
||||
this.te = te;
|
||||
this.player = te.player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSlots() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getStackInSlot(int slot) {
|
||||
return getHeld();
|
||||
}
|
||||
|
||||
public ItemStack getHeld() {
|
||||
if (player == null)
|
||||
return ItemStack.EMPTY;
|
||||
return player.getHeldItemMainhand();
|
||||
}
|
||||
|
||||
public void set(ItemStack stack) {
|
||||
if (player == null)
|
||||
return;
|
||||
if (te.getWorld().isRemote)
|
||||
return;
|
||||
player.setHeldItem(Hand.MAIN_HAND, stack);
|
||||
te.markDirty();
|
||||
te.sendData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
|
||||
ItemStack held = getHeld();
|
||||
if (!isItemValid(slot, stack))
|
||||
return stack;
|
||||
if (held.isEmpty()) {
|
||||
if (!simulate)
|
||||
set(stack);
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
if (!ItemHandlerHelper.canItemStacksStack(held, stack))
|
||||
return stack;
|
||||
|
||||
int space = held.getMaxStackSize() - held.getCount();
|
||||
ItemStack split = stack.copy().split(space);
|
||||
|
||||
if (space == 0)
|
||||
return stack;
|
||||
if (!simulate) {
|
||||
held = held.copy();
|
||||
held.setCount(held.getCount() + split.getCount());
|
||||
set(held);
|
||||
}
|
||||
|
||||
return split;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack extractItem(int slot, int amount, boolean simulate) {
|
||||
ItemStack held = getHeld();
|
||||
if (amount == 0 || held.isEmpty())
|
||||
return ItemStack.EMPTY;
|
||||
if (simulate)
|
||||
return held.copy().split(amount);
|
||||
|
||||
ItemStack toReturn = held.split(amount);
|
||||
te.markDirty();
|
||||
te.sendData();
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSlotLimit(int slot) {
|
||||
return Math.min(getHeld().getMaxStackSize(), 64);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isItemValid(int slot, ItemStack stack) {
|
||||
FilteringBehaviour filteringBehaviour = TileEntityBehaviour.get(te, FilteringBehaviour.TYPE);
|
||||
return filteringBehaviour == null || filteringBehaviour.test(stack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStackInSlot(int slot, ItemStack stack) {
|
||||
set(stack);
|
||||
}
|
||||
|
||||
}
|
|
@ -41,8 +41,12 @@ import net.minecraft.util.math.RayTraceContext.BlockMode;
|
|||
import net.minecraft.util.math.RayTraceContext.FluidMode;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.common.util.Constants.NBT;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
|
||||
public class DeployerTileEntity extends KineticTileEntity {
|
||||
|
@ -61,6 +65,7 @@ public class DeployerTileEntity extends KineticTileEntity {
|
|||
protected boolean boop = false;
|
||||
protected List<ItemStack> overflowItems = new ArrayList<>();
|
||||
private ListNBT deferredInventoryList;
|
||||
private LazyOptional<IItemHandlerModifiable> invHandler;
|
||||
|
||||
enum State {
|
||||
WAITING, EXPANDING, RETRACTING, DUMPING;
|
||||
|
@ -98,7 +103,10 @@ public class DeployerTileEntity extends KineticTileEntity {
|
|||
heldItem = player.getHeldItemMainhand();
|
||||
sendData();
|
||||
}
|
||||
Vec3d initialPos = VecHelper.getCenterOf(pos.offset(getBlockState().get(FACING)));
|
||||
player.setPosition(initialPos.x, initialPos.y, initialPos.z);
|
||||
}
|
||||
invHandler = LazyOptional.of(this::createHandler);
|
||||
}
|
||||
|
||||
protected void onExtract(ItemStack stack) {
|
||||
|
@ -372,6 +380,10 @@ public class DeployerTileEntity extends KineticTileEntity {
|
|||
super.readClientUpdate(tag);
|
||||
}
|
||||
|
||||
private IItemHandlerModifiable createHandler() {
|
||||
return new DeployerItemHandler(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFastRenderer() {
|
||||
return false;
|
||||
|
@ -387,15 +399,24 @@ public class DeployerTileEntity extends KineticTileEntity {
|
|||
return super.getRenderBoundingBox().grow(3);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
super.remove();
|
||||
invHandler.invalidate();
|
||||
}
|
||||
|
||||
public void changeMode() {
|
||||
eject();
|
||||
mode = mode == Mode.PUNCH ? Mode.USE : Mode.PUNCH;
|
||||
markDirty();
|
||||
sendData();
|
||||
}
|
||||
|
||||
protected void eject() {
|
||||
|
||||
@Override
|
||||
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
|
||||
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY && invHandler != null) {
|
||||
return invHandler.cast();
|
||||
}
|
||||
return super.getCapability(cap, side);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||
import com.simibubi.create.config.AllConfigs;
|
||||
import com.simibubi.create.foundation.utility.VecHelper;
|
||||
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.logistics.InWorldProcessing;
|
||||
import com.simibubi.create.modules.logistics.InWorldProcessing.Type;
|
||||
|
@ -17,6 +18,7 @@ import net.minecraft.block.BlockState;
|
|||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.player.ServerPlayerEntity;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
@ -94,6 +96,9 @@ public class AirCurrent {
|
|||
entity.setMotion(previousMotion.add(new Vec3d(xIn, yIn, zIn).scale(1 / 8f)));
|
||||
entity.fallDistance = 0;
|
||||
|
||||
if (entity instanceof ServerPlayerEntity)
|
||||
((ServerPlayerEntity) entity).connection.floatingTickCount = 0;
|
||||
|
||||
if (InWorldProcessing.isFrozen())
|
||||
return;
|
||||
|
||||
|
@ -267,15 +272,16 @@ public class AirCurrent {
|
|||
public void tickBelts() {
|
||||
for (Pair<BeltTileEntity, Type> pair : affectedBelts) {
|
||||
BeltTileEntity belt = pair.getKey();
|
||||
World world = belt.getWorld();
|
||||
InWorldProcessing.Type processingType = pair.getRight();
|
||||
|
||||
BeltTileEntity controller = belt.getControllerTE();
|
||||
if (controller == null)
|
||||
continue;
|
||||
World world = belt.getWorld();
|
||||
|
||||
controller.getInventory().forEachWithin(belt.index + .5f, .51f, (transported) -> {
|
||||
InWorldProcessing.spawnParticlesForProcessing(world,
|
||||
controller.getInventory().getVectorForOffset(transported.beltPosition), processingType);
|
||||
BeltHelper.getVectorForOffset(controller, transported.beltPosition), processingType);
|
||||
if (world.isRemote)
|
||||
return null;
|
||||
return InWorldProcessing.applyProcessing(transported, belt, processingType);
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
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 net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
|
@ -16,7 +17,7 @@ import net.minecraft.world.IWorld;
|
|||
import net.minecraft.world.IWorldReader;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class EncasedFanBlock extends DirectionalKineticBlock implements IWithTileEntity<EncasedFanTileEntity> {
|
||||
public class EncasedFanBlock extends DirectionalKineticBlock implements ITE<EncasedFanTileEntity> {
|
||||
|
||||
public EncasedFanBlock() {
|
||||
super(Properties.from(Blocks.ANDESITE));
|
||||
|
@ -49,15 +50,21 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements IWithTil
|
|||
|
||||
protected void blockUpdate(BlockState state, World worldIn, BlockPos pos) {
|
||||
notifyFanTile(worldIn, pos);
|
||||
if (worldIn.isRemote || state.get(FACING) != Direction.DOWN)
|
||||
if (worldIn.isRemote)
|
||||
return;
|
||||
withTileEntityDo(worldIn, pos, EncasedFanTileEntity::updateGenerator);
|
||||
withTileEntityDo(worldIn, pos, te -> te.updateGenerator(state.get(FACING)));
|
||||
}
|
||||
|
||||
protected void notifyFanTile(IWorld world, BlockPos pos) {
|
||||
withTileEntityDo(world, pos, EncasedFanTileEntity::blockInFrontChanged);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) {
|
||||
blockUpdate(newState, context.getWorld(), context.getPos());
|
||||
return newState;
|
||||
}
|
||||
|
||||
// @Override // TODO 1.15 register layer
|
||||
// public BlockRenderLayer getRenderLayer() {
|
||||
// return BlockRenderLayer.CUTOUT;
|
||||
|
@ -83,4 +90,9 @@ public class EncasedFanBlock extends DirectionalKineticBlock implements IWithTil
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<EncasedFanTileEntity> getTileEntityClass() {
|
||||
return EncasedFanTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -45,13 +45,13 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public float getAddedStressCapacity() {
|
||||
return isGenerator ? super.getAddedStressCapacity() : 0;
|
||||
public float calculateAddedStressCapacity() {
|
||||
return isGenerator ? super.calculateAddedStressCapacity() : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getStressApplied() {
|
||||
return isGenerator ? 0 : super.getStressApplied();
|
||||
public float calculateStressApplied() {
|
||||
return isGenerator ? 0 : super.calculateStressApplied();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -59,8 +59,8 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity {
|
|||
return isGenerator ? AllConfigs.SERVER.kinetics.generatingFanSpeed.get() : 0;
|
||||
}
|
||||
|
||||
public void updateGenerator() {
|
||||
boolean shouldGenerate = world.isBlockPowered(pos) && world.isBlockPresent(pos.down()) && blockBelowIsHot();
|
||||
public void updateGenerator(Direction facing) {
|
||||
boolean shouldGenerate = world.isBlockPowered(pos) && facing == Direction.DOWN && world.isBlockPresent(pos.down()) && blockBelowIsHot();
|
||||
if (shouldGenerate == isGenerator)
|
||||
return;
|
||||
|
||||
|
|
|
@ -158,8 +158,21 @@ public class NozzleTileEntity extends SmartTileEntity {
|
|||
pushingEntities.add(entity);
|
||||
}
|
||||
|
||||
if (!pushing && pushingEntities.size() > 512 && !world.isRemote)
|
||||
world.createExplosion(null, center.x, center.y, center.z, 6, Mode.BREAK);
|
||||
for (Iterator<Entity> iterator = pushingEntities.iterator(); iterator.hasNext();) {
|
||||
Entity entity = iterator.next();
|
||||
if (entity.isAlive())
|
||||
continue;
|
||||
iterator.remove();
|
||||
}
|
||||
|
||||
if (!pushing && pushingEntities.size() > 256 && !world.isRemote) {
|
||||
world.createExplosion(null, center.x, center.y, center.z, 2, Mode.NONE);
|
||||
for (Iterator<Entity> iterator = pushingEntities.iterator(); iterator.hasNext();) {
|
||||
Entity entity = iterator.next();
|
||||
entity.remove();
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public float getAddedStressCapacity() {
|
||||
public float calculateAddedStressCapacity() {
|
||||
return generatedCapacity;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.flywheel.engine;
|
|||
|
||||
import com.simibubi.create.AllBlockPartials;
|
||||
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 net.minecraft.block.AbstractFurnaceBlock;
|
||||
|
@ -23,7 +23,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
|
|||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
||||
|
||||
@EventBusSubscriber
|
||||
public class FurnaceEngineBlock extends EngineBlock implements IWithTileEntity<FurnaceEngineTileEntity> {
|
||||
public class FurnaceEngineBlock extends EngineBlock implements ITE<FurnaceEngineTileEntity> {
|
||||
|
||||
public FurnaceEngineBlock() {
|
||||
super(Properties.from(Blocks.GOLD_BLOCK));
|
||||
|
@ -76,4 +76,9 @@ public class FurnaceEngineBlock extends EngineBlock implements IWithTileEntity<F
|
|||
event.setUseBlock(Result.DENY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<FurnaceEngineTileEntity> getTileEntityClass() {
|
||||
return FurnaceEngineTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
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.Iterate;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticBlock;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
|
@ -8,7 +11,6 @@ import net.minecraft.block.Blocks;
|
|||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.inventory.InventoryHelper;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
|
@ -28,7 +30,7 @@ import net.minecraftforge.items.IItemHandler;
|
|||
import net.minecraftforge.items.IItemHandlerModifiable;
|
||||
import net.minecraftforge.items.ItemStackHandler;
|
||||
|
||||
public class MillstoneBlock extends KineticBlock {
|
||||
public class MillstoneBlock extends KineticBlock implements ITE<MillstoneTileEntity> {
|
||||
|
||||
public MillstoneBlock() {
|
||||
super(Properties.from(Blocks.ANDESITE));
|
||||
|
@ -59,23 +61,32 @@ public class MillstoneBlock extends KineticBlock {
|
|||
BlockRayTraceResult hit) {
|
||||
if (!player.getHeldItem(handIn).isEmpty())
|
||||
return ActionResultType.PASS;
|
||||
if (worldIn.getTileEntity(pos) == null)
|
||||
return ActionResultType.PASS;
|
||||
if (worldIn.isRemote)
|
||||
return ActionResultType.SUCCESS;
|
||||
|
||||
TileEntity tileEntity = worldIn.getTileEntity(pos);
|
||||
if (!(tileEntity instanceof MillstoneTileEntity))
|
||||
return ActionResultType.PASS;
|
||||
MillstoneTileEntity millstone = (MillstoneTileEntity) tileEntity;
|
||||
|
||||
withTileEntityDo(worldIn, pos, millstone -> {
|
||||
boolean emptyOutput = true;
|
||||
IItemHandlerModifiable inv = millstone.outputInv;
|
||||
for (int slot = 0; slot < inv.getSlots(); slot++) {
|
||||
ItemStack stackInSlot = inv.getStackInSlot(slot);
|
||||
if (!stackInSlot.isEmpty())
|
||||
emptyOutput = false;
|
||||
player.inventory.placeItemBackInInventory(worldIn, stackInSlot);
|
||||
inv.setStackInSlot(slot, ItemStack.EMPTY);
|
||||
}
|
||||
|
||||
if (emptyOutput) {
|
||||
inv = millstone.inputInv;
|
||||
for (int slot = 0; slot < inv.getSlots(); slot++) {
|
||||
player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot));
|
||||
inv.setStackInSlot(slot, ItemStack.EMPTY);
|
||||
}
|
||||
}
|
||||
|
||||
millstone.markDirty();
|
||||
millstone.sendData();
|
||||
});
|
||||
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -88,15 +99,17 @@ public class MillstoneBlock extends KineticBlock {
|
|||
if (!(entityIn instanceof ItemEntity))
|
||||
return;
|
||||
|
||||
BlockPos pos = entityIn.getPosition();
|
||||
TileEntity tileEntity = worldIn.getTileEntity(pos);
|
||||
if (!(tileEntity instanceof MillstoneTileEntity)) {
|
||||
tileEntity = worldIn.getTileEntity(pos.down());
|
||||
if (!(tileEntity instanceof MillstoneTileEntity))
|
||||
return;
|
||||
MillstoneTileEntity millstone = null;
|
||||
for (BlockPos pos : Iterate.hereAndBelow(entityIn.getPosition())) {
|
||||
try {
|
||||
millstone = getTileEntity(worldIn, pos);
|
||||
} catch (TileEntityException e) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (millstone == null)
|
||||
return;
|
||||
|
||||
MillstoneTileEntity millstone = (MillstoneTileEntity) tileEntity;
|
||||
ItemEntity itemEntity = (ItemEntity) entityIn;
|
||||
LazyOptional<IItemHandler> capability = millstone.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
|
||||
if (!capability.isPresent())
|
||||
|
@ -112,18 +125,10 @@ public class MillstoneBlock extends KineticBlock {
|
|||
@Override
|
||||
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) {
|
||||
TileEntity tileEntity = worldIn.getTileEntity(pos);
|
||||
if (!(tileEntity instanceof MillstoneTileEntity))
|
||||
return;
|
||||
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));
|
||||
}
|
||||
withTileEntityDo(worldIn, pos, te -> {
|
||||
ItemHelper.dropContents(worldIn, pos, te.inputInv);
|
||||
ItemHelper.dropContents(worldIn, pos, te.outputInv);
|
||||
});
|
||||
|
||||
worldIn.removeTileEntity(pos);
|
||||
}
|
||||
|
@ -139,4 +144,9 @@ public class MillstoneBlock extends KineticBlock {
|
|||
return Axis.Y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<MillstoneTileEntity> getTileEntityClass() {
|
||||
return MillstoneTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -142,6 +142,16 @@ public class MillstoneTileEntity extends KineticTileEntity {
|
|||
return super.getCapability(cap, side);
|
||||
}
|
||||
|
||||
private boolean canProcess(ItemStack stack) {
|
||||
ItemStackHandler tester = new ItemStackHandler(1);
|
||||
tester.setStackInSlot(0, stack);
|
||||
RecipeWrapper inventoryIn = new RecipeWrapper(tester);
|
||||
|
||||
if (lastRecipe != null && lastRecipe.matches(inventoryIn, world))
|
||||
return true;
|
||||
return world.getRecipeManager().getRecipe(AllRecipes.MILLING.getType(), inventoryIn, world).isPresent();
|
||||
}
|
||||
|
||||
private class MillstoneInventoryHandler extends CombinedInvWrapper {
|
||||
|
||||
public MillstoneInventoryHandler() {
|
||||
|
@ -152,13 +162,15 @@ public class MillstoneTileEntity extends KineticTileEntity {
|
|||
public boolean isItemValid(int slot, ItemStack stack) {
|
||||
if (outputInv == getHandlerFromIndex(getIndexForSlot(slot)))
|
||||
return false;
|
||||
return super.isItemValid(slot, stack);
|
||||
return canProcess(stack) && super.isItemValid(slot, stack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
|
||||
if (outputInv == getHandlerFromIndex(getIndexForSlot(slot)))
|
||||
return stack;
|
||||
if (!isItemValid(slot, stack))
|
||||
return stack;
|
||||
return super.insertItem(slot, stack, simulate);
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ package com.simibubi.create.modules.contraptions.components.mixer;
|
|||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
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.modules.contraptions.base.KineticBlock;
|
||||
|
||||
|
@ -20,7 +20,7 @@ import net.minecraft.world.IBlockReader;
|
|||
import net.minecraft.world.IWorldReader;
|
||||
|
||||
public class MechanicalMixerBlock extends KineticBlock
|
||||
implements IWithTileEntity<MechanicalMixerTileEntity>, IHaveCustomBlockItem {
|
||||
implements ITE<MechanicalMixerTileEntity>, IHaveCustomBlockItem {
|
||||
|
||||
public MechanicalMixerBlock() {
|
||||
super(Properties.from(Blocks.ANDESITE));
|
||||
|
@ -89,4 +89,9 @@ public class MechanicalMixerBlock extends KineticBlock
|
|||
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.foundation.block.IHaveCustomBlockItem;
|
||||
import com.simibubi.create.foundation.block.IWithTileEntity;
|
||||
import com.simibubi.create.foundation.block.SyncedTileEntity;
|
||||
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.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.Slope;
|
||||
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.BlockState;
|
||||
|
@ -39,7 +38,7 @@ import net.minecraft.world.IWorldReader;
|
|||
import net.minecraft.world.World;
|
||||
|
||||
public class MechanicalPressBlock extends HorizontalKineticBlock
|
||||
implements IWithTileEntity<MechanicalPressTileEntity>, IBeltAttachment, IHaveCustomBlockItem {
|
||||
implements ITE<MechanicalPressTileEntity>, IBeltAttachment, IHaveCustomBlockItem {
|
||||
|
||||
public MechanicalPressBlock() {
|
||||
super(Properties.from(Blocks.PISTON));
|
||||
|
@ -63,17 +62,15 @@ public class MechanicalPressBlock extends HorizontalKineticBlock
|
|||
boolean isMoving) {
|
||||
if (worldIn.isRemote)
|
||||
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)
|
||||
te.start(Mode.WORLD);
|
||||
} else {
|
||||
te.finished = false;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -134,11 +131,11 @@ public class MechanicalPressBlock extends HorizontalKineticBlock
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean startProcessingItem(BeltTileEntity te, TransportedItemStack transported, BeltAttachmentState state) {
|
||||
MechanicalPressTileEntity pressTe = (MechanicalPressTileEntity) te.getWorld()
|
||||
.getTileEntity(state.attachmentPos);
|
||||
|
||||
if (pressTe == null || pressTe.getSpeed() == 0)
|
||||
public boolean startProcessingItem(BeltTileEntity belt, TransportedItemStack transported,
|
||||
BeltAttachmentState state) {
|
||||
try {
|
||||
MechanicalPressTileEntity pressTe = getTileEntity(belt.getWorld(), state.attachmentPos);
|
||||
if (pressTe.getSpeed() == 0)
|
||||
return false;
|
||||
if (pressTe.running)
|
||||
return false;
|
||||
|
@ -148,20 +145,26 @@ public class MechanicalPressBlock extends HorizontalKineticBlock
|
|||
state.processingDuration = 1;
|
||||
pressTe.start(Mode.BELT);
|
||||
return true;
|
||||
|
||||
} catch (TileEntityException e) {}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean processItem(BeltTileEntity te, TransportedItemStack transportedStack, BeltAttachmentState state) {
|
||||
MechanicalPressTileEntity pressTe = (MechanicalPressTileEntity) te.getWorld()
|
||||
.getTileEntity(state.attachmentPos);
|
||||
public boolean processItem(BeltTileEntity belt, TransportedItemStack transportedStack, BeltAttachmentState state) {
|
||||
try {
|
||||
MechanicalPressTileEntity pressTe = getTileEntity(belt.getWorld(), state.attachmentPos);
|
||||
|
||||
// Not powered
|
||||
if (pressTe == null || pressTe.getSpeed() == 0)
|
||||
if (pressTe.getSpeed() == 0)
|
||||
return false;
|
||||
|
||||
// Running
|
||||
if (pressTe.running) {
|
||||
if (pressTe.runningTicks == 30) {
|
||||
if (!pressTe.running)
|
||||
return false;
|
||||
if (pressTe.runningTicks != 30)
|
||||
return true;
|
||||
|
||||
Optional<PressingRecipe> recipe = pressTe.getRecipe(transportedStack.stack);
|
||||
|
||||
pressTe.pressedItems.clear();
|
||||
|
@ -169,19 +172,20 @@ public class MechanicalPressBlock extends HorizontalKineticBlock
|
|||
|
||||
if (!recipe.isPresent())
|
||||
return false;
|
||||
|
||||
ItemStack out = recipe.get().getRecipeOutput().copy();
|
||||
List<ItemStack> multipliedOutput = ItemHelper.multipliedOutput(transportedStack.stack, out);
|
||||
if (multipliedOutput.isEmpty())
|
||||
transportedStack.stack = ItemStack.EMPTY;
|
||||
transportedStack.stack = multipliedOutput.get(0);
|
||||
|
||||
TileEntity controllerTE = te.getWorld().getTileEntity(te.getController());
|
||||
if (controllerTE != null && controllerTE instanceof BeltTileEntity)
|
||||
((SyncedTileEntity) controllerTE).sendData();
|
||||
BeltTileEntity controllerTE = belt.getControllerTE();
|
||||
if (controllerTE != null)
|
||||
controllerTE.sendData();
|
||||
pressTe.sendData();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
} catch (TileEntityException e) {}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -191,4 +195,9 @@ public class MechanicalPressBlock extends HorizontalKineticBlock
|
|||
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.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.modules.contraptions.base.DirectionalAxisKineticBlock;
|
||||
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.entity.Entity;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.inventory.InventoryHelper;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
import net.minecraft.state.BooleanProperty;
|
||||
import net.minecraft.state.StateContainer.Builder;
|
||||
|
@ -32,7 +32,7 @@ import net.minecraft.world.IBlockReader;
|
|||
import net.minecraft.world.IWorldReader;
|
||||
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 DamageSource damageSourceSaw = new DamageSource("create.saw").setDamageBypassesArmor();
|
||||
|
@ -96,12 +96,13 @@ public class SawBlock extends DirectionalAxisKineticBlock implements IWithTileEn
|
|||
super.onLanded(worldIn, entityIn);
|
||||
if (!(entityIn instanceof ItemEntity))
|
||||
return;
|
||||
BlockPos pos = entityIn.getPosition();
|
||||
if (!(worldIn.getTileEntity(pos) instanceof SawTileEntity))
|
||||
return;
|
||||
if (entityIn.world.isRemote)
|
||||
return;
|
||||
|
||||
BlockPos pos = entityIn.getPosition();
|
||||
withTileEntityDo(entityIn.world, pos, te -> {
|
||||
if (te.getSpeed() == 0)
|
||||
return;
|
||||
te.insertItem((ItemEntity) entityIn);
|
||||
});
|
||||
}
|
||||
|
@ -128,24 +129,22 @@ public class SawBlock extends DirectionalAxisKineticBlock implements IWithTileEn
|
|||
|
||||
@Override
|
||||
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;
|
||||
|
||||
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) {
|
||||
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));
|
||||
}
|
||||
});
|
||||
withTileEntityDo(worldIn, pos, te -> ItemHelper.dropContents(worldIn, pos, te.inventory));
|
||||
TileEntityBehaviour.destroy(worldIn, pos, FilteringBehaviour.TYPE);
|
||||
worldIn.removeTileEntity(pos);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MovementBehaviour getMovementBehaviour() {
|
||||
return MOVEMENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<SawTileEntity> getTileEntityClass() {
|
||||
return SawTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -55,6 +55,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
|
|||
private int recipeIndex;
|
||||
private LazyOptional<IItemHandler> invProvider = LazyOptional.empty();
|
||||
private FilteringBehaviour filtering;
|
||||
private boolean destroyed;
|
||||
|
||||
public SawTileEntity() {
|
||||
super(AllTileEntities.SAW.type);
|
||||
|
@ -81,7 +82,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
|
|||
super.onSpeedChanged(prevSpeed);
|
||||
boolean shouldRun = Math.abs(getSpeed()) > 1 / 64f;
|
||||
boolean running = getBlockState().get(RUNNING);
|
||||
if (shouldRun != running)
|
||||
if (shouldRun != running && !destroyed)
|
||||
world.setBlockState(pos, getBlockState().with(RUNNING, shouldRun), 2 | 16);
|
||||
}
|
||||
|
||||
|
@ -148,8 +149,6 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
|
|||
if (stack.isEmpty())
|
||||
continue;
|
||||
|
||||
// if (itemMovementFacing.getAxis() == Axis.Z)
|
||||
// itemMovementFacing = itemMovementFacing.getOpposite();
|
||||
if (((BeltTileEntity) te).tryInsertingFromSide(itemMovementFacing, stack, false))
|
||||
inventory.setStackInSlot(slot, ItemStack.EMPTY);
|
||||
else {
|
||||
|
@ -214,8 +213,9 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
|
|||
|
||||
@Override
|
||||
public void remove() {
|
||||
super.remove();
|
||||
invProvider.invalidate();
|
||||
destroyed = true;
|
||||
super.remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
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.VecHelper;
|
||||
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.World;
|
||||
|
||||
public class TurntableBlock extends KineticBlock {
|
||||
public class TurntableBlock extends KineticBlock implements ITE<TurntableTileEntity> {
|
||||
|
||||
public TurntableBlock() {
|
||||
super(Properties.from(Blocks.STRIPPED_SPRUCE_LOG));
|
||||
|
@ -40,22 +41,19 @@ public class TurntableBlock extends KineticBlock {
|
|||
|
||||
@Override
|
||||
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity e) {
|
||||
TileEntity te = worldIn.getTileEntity(pos);
|
||||
if (!(te instanceof KineticTileEntity))
|
||||
return;
|
||||
if (!e.onGround)
|
||||
return;
|
||||
if (e.getMotion().y > 0)
|
||||
return;
|
||||
|
||||
float speed = ((KineticTileEntity) te).getSpeed() * 3/10;
|
||||
World world = e.getEntityWorld();
|
||||
|
||||
if (speed == 0)
|
||||
return;
|
||||
if (e.getY() < pos.getY() + .5f)
|
||||
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 (worldIn.getBlockState(e.getPosition()) != state) {
|
||||
Vec3d origin = VecHelper.getCenterOf(pos);
|
||||
|
@ -71,6 +69,7 @@ public class TurntableBlock extends KineticBlock {
|
|||
return;
|
||||
if (world.isRemote)
|
||||
return;
|
||||
|
||||
if ((e instanceof LivingEntity)) {
|
||||
float diff = e.getRotationYawHead() - speed;
|
||||
((LivingEntity) e).setIdleTime(20);
|
||||
|
@ -79,12 +78,11 @@ public class TurntableBlock extends KineticBlock {
|
|||
e.onGround = false;
|
||||
e.velocityChanged = true;
|
||||
}
|
||||
|
||||
e.rotationYaw -= speed;
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
// IRotate:
|
||||
|
||||
@Override
|
||||
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
|
||||
return face == Direction.DOWN;
|
||||
|
@ -100,4 +98,9 @@ public class TurntableBlock extends KineticBlock {
|
|||
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.foundation.utility.VecHelper;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
@ -22,8 +22,12 @@ public class TurntableHandler {
|
|||
if (mc.isGamePaused())
|
||||
return;
|
||||
|
||||
KineticTileEntity te = (KineticTileEntity) mc.world.getTileEntity(pos);
|
||||
float speed = te.getSpeed() * 3/10;
|
||||
TileEntity tileEntity = mc.world.getTileEntity(pos);
|
||||
if (!(tileEntity instanceof TurntableTileEntity))
|
||||
return;
|
||||
|
||||
TurntableTileEntity turnTable = (TurntableTileEntity) tileEntity;
|
||||
float speed = turnTable.getSpeed() * 3/10;
|
||||
|
||||
if (speed == 0)
|
||||
return;
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.simibubi.create.modules.contraptions.components.waterwheel;
|
|||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.config.AllConfigs;
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
import com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
|
@ -19,7 +20,7 @@ import net.minecraft.world.IWorld;
|
|||
import net.minecraft.world.IWorldReader;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class WaterWheelBlock extends HorizontalKineticBlock {
|
||||
public class WaterWheelBlock extends HorizontalKineticBlock implements ITE<WaterWheelTileEntity> {
|
||||
|
||||
public WaterWheelBlock() {
|
||||
super(Properties.from(Blocks.STRIPPED_SPRUCE_WOOD));
|
||||
|
@ -78,46 +79,42 @@ public class WaterWheelBlock extends HorizontalKineticBlock {
|
|||
}
|
||||
|
||||
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())
|
||||
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;
|
||||
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 (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)
|
||||
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 (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)
|
||||
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) {
|
||||
if (world.isRemote())
|
||||
return;
|
||||
TileEntity tileEntity = world.getTileEntity(pos);
|
||||
if (!(tileEntity instanceof WaterWheelTileEntity))
|
||||
return;
|
||||
WaterWheelTileEntity te = (WaterWheelTileEntity) tileEntity;
|
||||
te.updateGeneratedRotation();
|
||||
withTileEntityDo(world, pos, WaterWheelTileEntity::updateGeneratedRotation);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -158,4 +155,9 @@ public class WaterWheelBlock extends HorizontalKineticBlock {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<WaterWheelTileEntity> getTileEntityClass() {
|
||||
return WaterWheelTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package com.simibubi.create.modules.contraptions.processing;
|
||||
|
||||
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.utility.AllShapes;
|
||||
|
||||
|
@ -12,7 +12,6 @@ import net.minecraft.block.material.PushReaction;
|
|||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.inventory.InventoryHelper;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
|
@ -27,7 +26,7 @@ import net.minecraftforge.items.IItemHandlerModifiable;
|
|||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
import net.minecraftforge.items.ItemStackHandler;
|
||||
|
||||
public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity> {
|
||||
public class BasinBlock extends Block implements ITE<BasinTileEntity> {
|
||||
|
||||
public BasinBlock() {
|
||||
super(Properties.from(Blocks.ANDESITE));
|
||||
|
@ -53,16 +52,16 @@ public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity
|
|||
BlockRayTraceResult hit) {
|
||||
if (!player.getHeldItem(handIn).isEmpty())
|
||||
return ActionResultType.PASS;
|
||||
if (worldIn.getTileEntity(pos) == null)
|
||||
return ActionResultType.PASS;
|
||||
|
||||
BasinTileEntity te = (BasinTileEntity) worldIn.getTileEntity(pos);
|
||||
try {
|
||||
BasinTileEntity te = getTileEntity(worldIn, pos);
|
||||
IItemHandlerModifiable inv = te.inventory.orElse(new ItemStackHandler(1));
|
||||
for (int slot = 0; slot < inv.getSlots(); slot++) {
|
||||
player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot));
|
||||
inv.setStackInSlot(slot, ItemStack.EMPTY);
|
||||
}
|
||||
te.onEmptied();
|
||||
} catch (TileEntityException e) {}
|
||||
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
@ -76,9 +75,8 @@ public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity
|
|||
return;
|
||||
if (!entityIn.isAlive())
|
||||
return;
|
||||
|
||||
BasinTileEntity te = (BasinTileEntity) worldIn.getTileEntity(entityIn.getPosition());
|
||||
ItemEntity itemEntity = (ItemEntity) entityIn;
|
||||
withTileEntityDo(worldIn, entityIn.getPosition(), te -> {
|
||||
ItemStack insertItem = ItemHandlerHelper.insertItem(te.inputInventory, itemEntity.getItem().copy(), false);
|
||||
|
||||
if (insertItem.isEmpty()) {
|
||||
|
@ -87,7 +85,7 @@ public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity
|
|||
}
|
||||
|
||||
itemEntity.setItem(insertItem);
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -97,21 +95,17 @@ public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity
|
|||
|
||||
@Override
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasComparatorInputOverride(BlockState state) {
|
||||
return true;
|
||||
|
@ -119,12 +113,15 @@ public class BasinBlock extends Block implements IWithTileEntity<BasinTileEntity
|
|||
|
||||
@Override
|
||||
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
|
||||
TileEntity te = worldIn.getTileEntity(pos);
|
||||
if (te instanceof BasinTileEntity) {
|
||||
BasinTileEntity basinTileEntity = (BasinTileEntity) te;
|
||||
return ItemHelper.calcRedstoneFromInventory(basinTileEntity.inputInventory);
|
||||
}
|
||||
try {
|
||||
return ItemHelper.calcRedstoneFromInventory(getTileEntity(worldIn, pos).inputInventory);
|
||||
} catch (TileEntityException e) {}
|
||||
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.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour;
|
||||
|
@ -84,11 +85,11 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
|
|||
if (isRunning())
|
||||
return false;
|
||||
|
||||
TileEntity basinTE = world.getTileEntity(pos.down(2));
|
||||
if (basinTE == null || !(basinTE instanceof BasinTileEntity))
|
||||
Optional<BasinTileEntity> basinTe = getBasin();
|
||||
if (!basinTe.isPresent())
|
||||
return true;
|
||||
if (!basinInv.isPresent())
|
||||
basinInv = basinTE.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
|
||||
basinInv = basinTe.get().getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
|
||||
if (!basinInv.isPresent())
|
||||
return true;
|
||||
|
||||
|
@ -160,9 +161,7 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
|
|||
sendData();
|
||||
}
|
||||
|
||||
TileEntity basinTE = world.getTileEntity(pos.down(2));
|
||||
if (basinTE instanceof BasinTileEntity)
|
||||
((BasinTileEntity) basinTE).contentsChanged = false;
|
||||
getBasin().ifPresent(te -> te.contentsChanged = true);
|
||||
}
|
||||
|
||||
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 matchBasinRecipe(IRecipe<C> recipe);
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package com.simibubi.create.modules.contraptions.processing;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import com.simibubi.create.AllTileEntities;
|
||||
import com.simibubi.create.foundation.block.SyncedTileEntity;
|
||||
|
||||
|
@ -111,11 +113,7 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn
|
|||
}
|
||||
|
||||
public void onEmptied() {
|
||||
TileEntity te = world.getTileEntity(pos.up(2));
|
||||
if (te == null)
|
||||
return;
|
||||
if (te instanceof BasinOperatingTileEntity)
|
||||
((BasinOperatingTileEntity) te).basinRemoved = true;
|
||||
getOperator().ifPresent(te -> te.basinRemoved = true);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -137,13 +135,14 @@ public class BasinTileEntity extends SyncedTileEntity implements ITickableTileEn
|
|||
if (!contentsChanged)
|
||||
return;
|
||||
contentsChanged = false;
|
||||
getOperator().ifPresent(te -> te.basinChecker.scheduleUpdate());
|
||||
}
|
||||
|
||||
private Optional<BasinOperatingTileEntity> getOperator() {
|
||||
TileEntity te = world.getTileEntity(pos.up(2));
|
||||
if (te == null)
|
||||
return;
|
||||
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 com.simibubi.create.foundation.block.IWithTileEntity;
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
|
@ -27,7 +27,7 @@ import net.minecraft.world.World;
|
|||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEntity<AnalogLeverTileEntity> {
|
||||
public class AnalogLeverBlock extends HorizontalFaceBlock implements ITE<AnalogLeverTileEntity> {
|
||||
|
||||
public AnalogLeverBlock() {
|
||||
super(Properties.from(Blocks.LEVER));
|
||||
|
@ -51,23 +51,24 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEn
|
|||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
try {
|
||||
boolean sneak = player.isSneaking();
|
||||
AnalogLeverTileEntity te = getTileEntity(worldIn, pos);
|
||||
if (te == null)
|
||||
return ActionResultType.SUCCESS;
|
||||
|
||||
te.changeState(sneak);
|
||||
float f = .25f + ((te.state + 5) / 15f) * .5f;
|
||||
worldIn.playSound(null, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f);
|
||||
} catch (TileEntityException e) {}
|
||||
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWeakPower(BlockState blockState, IBlockReader blockAccess, BlockPos pos, Direction side) {
|
||||
AnalogLeverTileEntity tileEntity = getTileEntity(blockAccess, pos);
|
||||
if (tileEntity == null)
|
||||
try {
|
||||
return getTileEntity(blockAccess, pos).state;
|
||||
} catch (TileEntityException e) {
|
||||
return 0;
|
||||
return tileEntity.state;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -83,21 +84,23 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEn
|
|||
@Override
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
|
||||
try {
|
||||
AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos);
|
||||
if (tileEntity == null)
|
||||
return;
|
||||
if (tileEntity.state != 0 && rand.nextFloat() < 0.25F)
|
||||
addParticles(stateIn, worldIn, pos, 0.5F);
|
||||
} catch (TileEntityException e) {}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||
try {
|
||||
AnalogLeverTileEntity tileEntity = getTileEntity(worldIn, pos);
|
||||
if (tileEntity != null && !isMoving && state.getBlock() != newState.getBlock()) {
|
||||
if (!isMoving && state.getBlock() != newState.getBlock()) {
|
||||
if (tileEntity.state != 0)
|
||||
updateNeighbors(state, worldIn, pos);
|
||||
worldIn.removeTileEntity(pos);
|
||||
}
|
||||
} catch (TileEntityException e) {}
|
||||
}
|
||||
|
||||
private static void addParticles(BlockState state, IWorld worldIn, BlockPos pos, float alpha) {
|
||||
|
@ -128,4 +131,9 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEn
|
|||
super.fillStateContainer(builder.add(HORIZONTAL_FACING, FACE));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<AnalogLeverTileEntity> getTileEntityClass() {
|
||||
return AnalogLeverTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
package com.simibubi.create.modules.contraptions.relays.advanced.sequencer;
|
||||
|
||||
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.modules.contraptions.base.HorizontalAxisKineticBlock;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticBlock;
|
||||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.base.RotatedPillarKineticBlock;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.client.entity.player.ClientPlayerEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.BlockItem;
|
||||
import net.minecraft.item.BlockItemUseContext;
|
||||
|
@ -33,8 +33,7 @@ import net.minecraftforge.api.distmarker.Dist;
|
|||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.fml.DistExecutor;
|
||||
|
||||
public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock
|
||||
implements IWithTileEntity<SequencedGearshiftTileEntity> {
|
||||
public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implements ITE<SequencedGearshiftTileEntity> {
|
||||
|
||||
public static final BooleanProperty VERTICAL = BooleanProperty.create("vertical");
|
||||
public static final IntegerProperty STATE = IntegerProperty.create("state", 0, 5);
|
||||
|
@ -88,9 +87,8 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock
|
|||
return ActionResultType.PASS;
|
||||
}
|
||||
|
||||
DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> {
|
||||
displayScreen((SequencedGearshiftTileEntity) worldIn.getTileEntity(pos));
|
||||
});
|
||||
if (player instanceof ClientPlayerEntity)
|
||||
DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> withTileEntityDo(worldIn, pos, this::displayScreen));
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -109,12 +107,13 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock
|
|||
|
||||
@Override
|
||||
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
Direction facing = context.getFace();
|
||||
if (facing.getAxis().isVertical() && !state.get(VERTICAL)) {
|
||||
KineticTileEntity.switchToBlockState(context.getWorld(), context.getPos(), state.cycle(VERTICAL));
|
||||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
return super.onWrenched(state, context);
|
||||
BlockState newState = state;
|
||||
|
||||
if (context.getFace().getAxis() != Axis.Y)
|
||||
if (newState.get(HORIZONTAL_AXIS) != context.getFace().getAxis())
|
||||
newState = newState.cycle(VERTICAL);
|
||||
|
||||
return super.onWrenched(newState, context);
|
||||
}
|
||||
|
||||
private BlockState withAxis(Axis axis, BlockItemUseContext context) {
|
||||
|
@ -136,4 +135,9 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock
|
|||
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.Create;
|
||||
import com.simibubi.create.modules.contraptions.relays.belt.transport.TransportedItemStack;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.Entity;
|
||||
|
@ -13,7 +14,6 @@ import net.minecraft.nbt.CompoundNBT;
|
|||
import net.minecraft.nbt.INBT;
|
||||
import net.minecraft.nbt.ListNBT;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.IWorld;
|
||||
import net.minecraft.world.World;
|
||||
|
@ -59,12 +59,13 @@ public enum AllBeltAttachments {
|
|||
|
||||
default void onAttachmentPlaced(IWorld world, BlockPos pos, BlockState state) {
|
||||
BlockPos beltPos = getBeltPositionForAttachment(world, pos, state);
|
||||
TileEntity te = world.getTileEntity(beltPos);
|
||||
if (te == null || !(te instanceof BeltTileEntity))
|
||||
BeltTileEntity belt = BeltHelper.getSegmentTE(world, beltPos);
|
||||
|
||||
if (belt == null)
|
||||
return;
|
||||
BeltTileEntity belt = (BeltTileEntity) te;
|
||||
if (!isAttachedCorrectly(world, pos, belt.getPos(), state, belt.getBlockState()))
|
||||
if (!isAttachedCorrectly(world, pos, beltPos, state, world.getBlockState(beltPos)))
|
||||
return;
|
||||
|
||||
belt.attachmentTracker.addAttachment(world, pos);
|
||||
belt.markDirty();
|
||||
belt.sendData();
|
||||
|
@ -72,16 +73,18 @@ public enum AllBeltAttachments {
|
|||
|
||||
default void onAttachmentRemoved(IWorld world, BlockPos pos, BlockState state) {
|
||||
BlockPos beltPos = getBeltPositionForAttachment(world, pos, state);
|
||||
TileEntity te = world.getTileEntity(beltPos);
|
||||
if (te == null || !(te instanceof BeltTileEntity))
|
||||
BeltTileEntity belt = BeltHelper.getSegmentTE(world, beltPos);
|
||||
|
||||
if (belt == null)
|
||||
return;
|
||||
BeltTileEntity belt = (BeltTileEntity) te;
|
||||
if (!isAttachedCorrectly(world, pos, belt.getPos(), state, belt.getBlockState()))
|
||||
if (!isAttachedCorrectly(world, pos, beltPos, state, world.getBlockState(beltPos)))
|
||||
return;
|
||||
|
||||
belt.attachmentTracker.removeAttachment(pos);
|
||||
belt.markDirty();
|
||||
belt.sendData();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class BeltAttachmentState {
|
||||
|
@ -112,8 +115,8 @@ public enum AllBeltAttachments {
|
|||
World world = belt.getWorld();
|
||||
BlockPos beltPos = belt.getPos();
|
||||
BlockState beltState = belt.getBlockState();
|
||||
List<BlockPos> attachmentPositions = ba.attachment.getPotentialAttachmentPositions(world, beltPos,
|
||||
beltState);
|
||||
List<BlockPos> attachmentPositions =
|
||||
ba.attachment.getPotentialAttachmentPositions(world, beltPos, beltState);
|
||||
|
||||
for (BlockPos potentialPos : attachmentPositions) {
|
||||
if (!world.isBlockPresent(potentialPos))
|
||||
|
|
|
@ -10,11 +10,12 @@ import com.simibubi.create.AllBlocks;
|
|||
import com.simibubi.create.AllItems;
|
||||
import com.simibubi.create.foundation.block.IHaveColorHandler;
|
||||
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.Lang;
|
||||
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.BlockRenderType;
|
||||
|
@ -61,7 +62,7 @@ import net.minecraftforge.items.CapabilityItemHandler;
|
|||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
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<Part> PART = EnumProperty.create("part", Part.class);
|
||||
|
@ -76,8 +77,10 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
|
||||
if (face.getAxis() != getRotationAxis(state))
|
||||
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
|
||||
|
@ -110,15 +113,9 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
|
||||
@Override
|
||||
public void spawnAdditionalDrops(BlockState state, World worldIn, BlockPos pos, ItemStack stack) {
|
||||
withTileEntityDo(worldIn, pos, te -> {
|
||||
if (worldIn.isRemote)
|
||||
return;
|
||||
if (te.isController()) {
|
||||
BeltInventory inv = te.getInventory();
|
||||
for (TransportedItemStack s : inv.items)
|
||||
inv.eject(s);
|
||||
}
|
||||
});
|
||||
BeltTileEntity controllerTE = BeltHelper.getControllerTE(worldIn, pos);
|
||||
if (controllerTE != null)
|
||||
controllerTE.getInventory().ejectAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -146,9 +143,6 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
|
||||
@Override
|
||||
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)
|
||||
return;
|
||||
if (entityIn instanceof PlayerEntity) {
|
||||
|
@ -158,6 +152,8 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
if (player.abilities.isFlying)
|
||||
return;
|
||||
}
|
||||
|
||||
BeltTileEntity belt = BeltHelper.getSegmentTE(worldIn, pos);
|
||||
if (belt == null || belt.getSpeed() == 0)
|
||||
return;
|
||||
if (entityIn instanceof ItemEntity && entityIn.isAlive()) {
|
||||
|
@ -177,12 +173,12 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
return;
|
||||
}
|
||||
|
||||
BeltTileEntity controller = (BeltTileEntity) worldIn.getTileEntity(belt.getController());
|
||||
BeltTileEntity controller = BeltHelper.getControllerTE(worldIn, pos);
|
||||
if (controller == null || controller.passengers == null)
|
||||
return;
|
||||
if (controller.passengers.containsKey(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);
|
||||
} else {
|
||||
controller.passengers.put(entityIn, new TransportedEntityInfo(pos, state));
|
||||
|
@ -223,10 +219,9 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
return ActionResultType.SUCCESS;
|
||||
}
|
||||
|
||||
TileEntity te = worldIn.getTileEntity(pos);
|
||||
if (te == null || !(te instanceof BeltTileEntity))
|
||||
BeltTileEntity belt = BeltHelper.getSegmentTE(worldIn, pos);
|
||||
if (belt == null)
|
||||
return ActionResultType.PASS;
|
||||
BeltTileEntity belt = (BeltTileEntity) te;
|
||||
|
||||
if (isHand) {
|
||||
BeltTileEntity controllerBelt = belt.getControllerTE();
|
||||
|
@ -269,10 +264,6 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
@Override
|
||||
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
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();
|
||||
|
||||
if (state.get(CASING)) {
|
||||
|
@ -288,8 +279,11 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
if (world.isRemote)
|
||||
return ActionResultType.SUCCESS;
|
||||
world.setBlockState(context.getPos(), state.with(PART, Part.MIDDLE), 2);
|
||||
BeltTileEntity belt = BeltHelper.getSegmentTE(world, context.getPos());
|
||||
if (belt != null) {
|
||||
belt.detachKinetics();
|
||||
belt.attachKinetics();
|
||||
}
|
||||
if (!player.isCreative())
|
||||
player.inventory.placeItemBackInInventory(world, new ItemStack(AllBlocks.SHAFT.get()));
|
||||
return ActionResultType.SUCCESS;
|
||||
|
@ -364,16 +358,20 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos,
|
||||
ISelectionContext 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;
|
||||
BeltTileEntity controller = (BeltTileEntity) worldIn.getTileEntity(belt.getController());
|
||||
|
||||
BeltTileEntity belt = getTileEntity(worldIn, pos);
|
||||
BeltTileEntity controller = belt.getControllerTE();
|
||||
|
||||
if (controller == null)
|
||||
return shape;
|
||||
if (controller.passengers == null || !controller.passengers.containsKey(context.getEntity())) {
|
||||
return BeltShapes.getCollisionShape(state);
|
||||
}
|
||||
|
||||
} catch (TileEntityException e) {}
|
||||
return shape;
|
||||
}
|
||||
|
||||
|
@ -444,12 +442,8 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
world.setBlockState(beltPos, currentState.with(CASING, false), 2);
|
||||
}
|
||||
|
||||
if (te.isController() && isVertical) {
|
||||
BeltInventory inventory = te.getInventory();
|
||||
for (TransportedItemStack s : inventory.items)
|
||||
inventory.eject(s);
|
||||
inventory.items.clear();
|
||||
}
|
||||
if (te.isController() && isVertical)
|
||||
te.getInventory().ejectAll();
|
||||
} else {
|
||||
world.destroyBlock(pos, true);
|
||||
return;
|
||||
|
@ -489,11 +483,8 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
TileEntity tileEntity = world.getTileEntity(currentPos);
|
||||
if (tileEntity instanceof BeltTileEntity) {
|
||||
BeltTileEntity te = (BeltTileEntity) tileEntity;
|
||||
if (te.isController()) {
|
||||
BeltInventory inv = te.getInventory();
|
||||
for (TransportedItemStack stack : inv.items)
|
||||
inv.eject(stack);
|
||||
}
|
||||
if (te.isController())
|
||||
te.getInventory().ejectAll();
|
||||
|
||||
te.remove();
|
||||
hasPulley = te.hasPulley();
|
||||
|
@ -607,4 +598,9 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
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.BeltBlock.Part;
|
||||
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.entity.Entity;
|
||||
|
@ -53,7 +56,7 @@ public class BeltTileEntity extends KineticTileEntity {
|
|||
protected BeltInventory inventory;
|
||||
protected LazyOptional<IItemHandler> itemHandler;
|
||||
|
||||
private CompoundNBT trackerUpdateTag;
|
||||
public CompoundNBT trackerUpdateTag;
|
||||
|
||||
public BeltTileEntity() {
|
||||
super(AllTileEntities.BELT.type);
|
||||
|
@ -99,7 +102,7 @@ public class BeltTileEntity extends KineticTileEntity {
|
|||
passengers.forEach((entity, info) -> {
|
||||
boolean canBeTransported = BeltMovementHandler.canBeTransported(entity);
|
||||
boolean leftTheBelt =
|
||||
info.ticksSinceLastCollision > ((getBlockState().get(BeltBlock.SLOPE) != HORIZONTAL) ? 3 : 1);
|
||||
info.getTicksSinceLastCollision() > ((getBlockState().get(BeltBlock.SLOPE) != HORIZONTAL) ? 3 : 1);
|
||||
if (!canBeTransported || leftTheBelt) {
|
||||
toRemove.add(entity);
|
||||
return;
|
||||
|
@ -112,10 +115,10 @@ public class BeltTileEntity extends KineticTileEntity {
|
|||
}
|
||||
|
||||
@Override
|
||||
public float getStressApplied() {
|
||||
public float calculateStressApplied() {
|
||||
if (!isController())
|
||||
return 0;
|
||||
return super.getStressApplied();
|
||||
return super.calculateStressApplied();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -193,7 +196,7 @@ public class BeltTileEntity extends KineticTileEntity {
|
|||
public void applyColor(DyeColor colorIn) {
|
||||
int colorValue = colorIn.getMapColor().colorValue;
|
||||
for (BlockPos blockPos : BeltBlock.getBeltChain(world, getController())) {
|
||||
BeltTileEntity belt = (BeltTileEntity) world.getTileEntity(blockPos);
|
||||
BeltTileEntity belt = BeltHelper.getSegmentTE(world, blockPos);
|
||||
if (belt == null)
|
||||
continue;
|
||||
belt.color = belt.color == -1 ? colorValue : ColorHelper.mixColors(belt.color, colorValue, .5f);
|
||||
|
|
|
@ -19,6 +19,7 @@ import com.simibubi.create.foundation.utility.TessellatorHelper;
|
|||
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
|
||||
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.transport.TransportedItemStack;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
@ -72,10 +73,9 @@ public class BeltTileEntityRenderer extends SafeTileEntityRenderer<BeltTileEntit
|
|||
if (textureIndex < 0)
|
||||
textureIndex += 16;
|
||||
|
||||
beltBuffer.shiftUVtoSheet(animatedTexture.getOriginal(), animatedTexture.getTarget(),
|
||||
(textureIndex % 4) * 16, (textureIndex / 4) * 16);
|
||||
beltBuffer.shiftUVtoSheet(animatedTexture, (textureIndex % 4) / 4f, (textureIndex / 4) / 4f, 4);
|
||||
} else {
|
||||
beltBuffer.shiftUVtoSheet(animatedTexture.getOriginal(), animatedTexture.getTarget(), 0, 0);
|
||||
beltBuffer.dontShiftUV();
|
||||
}
|
||||
|
||||
IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid());
|
||||
|
@ -115,7 +115,7 @@ public class BeltTileEntityRenderer extends SafeTileEntityRenderer<BeltTileEntit
|
|||
int verticality = slope == Slope.DOWNWARD ? -1 : slope == Slope.UPWARD ? 1 : 0;
|
||||
boolean slopeAlongX = te.getBeltFacing().getAxis() == Axis.X;
|
||||
|
||||
for (TransportedItemStack transported : te.getInventory().items) {
|
||||
for (TransportedItemStack transported : te.getInventory().getItems()) {
|
||||
ms.push();
|
||||
TessellatorHelper.fightZFighting(transported.angle, ms);
|
||||
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.List;
|
||||
|
@ -23,7 +23,7 @@ import net.minecraft.util.math.RayTraceResult;
|
|||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class BeltConnectorItemHandler {
|
||||
public class BeltConnectorHandler {
|
||||
|
||||
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.List;
|
||||
|
@ -7,6 +7,7 @@ import com.simibubi.create.AllBlocks;
|
|||
import com.simibubi.create.config.AllConfigs;
|
||||
import com.simibubi.create.foundation.item.IAddedByOther;
|
||||
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.Slope;
|
||||
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.NBTUtil;
|
||||
import net.minecraft.state.properties.BlockStateProperties;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
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))
|
||||
return false;
|
||||
|
||||
float speed1 = ((KineticTileEntity) world.getTileEntity(first)).getTheoreticalSpeed();
|
||||
float speed2 = ((KineticTileEntity) world.getTileEntity(second)).getTheoreticalSpeed();
|
||||
TileEntity tileEntity = world.getTileEntity(first);
|
||||
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)
|
||||
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.Collections;
|
||||
|
@ -9,9 +9,13 @@ import java.util.function.Function;
|
|||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
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.BeltBlock;
|
||||
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.BlockState;
|
||||
|
@ -23,9 +27,7 @@ import net.minecraft.tileentity.TileEntity;
|
|||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
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.World;
|
||||
import net.minecraftforge.common.util.Constants.NBT;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
|
@ -36,7 +38,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
|
|||
public class BeltInventory {
|
||||
|
||||
final BeltTileEntity belt;
|
||||
final List<TransportedItemStack> items;
|
||||
private final List<TransportedItemStack> items;
|
||||
final List<TransportedItemStack> toInsert;
|
||||
boolean beltMovementPositive;
|
||||
final float SEGMENT_WINDOW = .75f;
|
||||
|
@ -52,7 +54,7 @@ public class BeltInventory {
|
|||
// Reverse item collection if belt just reversed
|
||||
if (beltMovementPositive != movingPositive()) {
|
||||
beltMovementPositive = movingPositive();
|
||||
Collections.reverse(items);
|
||||
Collections.reverse(getItems());
|
||||
belt.markDirty();
|
||||
belt.sendData();
|
||||
}
|
||||
|
@ -68,7 +70,7 @@ public class BeltInventory {
|
|||
// Assuming the first entry is furthest on the belt
|
||||
TransportedItemStack stackInFront = null;
|
||||
TransportedItemStack current = null;
|
||||
Iterator<TransportedItemStack> iterator = items.iterator();
|
||||
Iterator<TransportedItemStack> iterator = getItems().iterator();
|
||||
|
||||
float beltSpeed = belt.getDirectionAwareBeltMovementSpeed();
|
||||
Direction movementFacing = belt.getMovementFacing();
|
||||
|
@ -121,9 +123,13 @@ public class BeltInventory {
|
|||
if (!onClient) {
|
||||
// Don't move if belt attachments want to continue processing
|
||||
if (segmentBefore != -1 && current.locked) {
|
||||
BeltTileEntity beltSegment = getBeltSegment(segmentBefore);
|
||||
BeltTileEntity beltSegment = BeltHelper.getBeltAtSegment(belt, segmentBefore);
|
||||
if (beltSegment != null) {
|
||||
|
||||
// wait in case belt isnt initialized yet
|
||||
if (current.locked && beltSegment.trackerUpdateTag != null)
|
||||
continue;
|
||||
|
||||
current.locked = false;
|
||||
List<BeltAttachmentState> attachments = beltSegment.attachmentTracker.attachments;
|
||||
for (BeltAttachmentState attachmentState : attachments) {
|
||||
|
@ -143,7 +149,7 @@ public class BeltInventory {
|
|||
int upcomingSegment = (int) (current.beltPosition + (beltMovementPositive ? .5f : -.5f));
|
||||
for (int segment = upcomingSegment; beltMovementPositive ? segment + .5f <= nextOffset
|
||||
: segment + .5f >= nextOffset; segment += beltMovementPositive ? 1 : -1) {
|
||||
BeltTileEntity beltSegment = getBeltSegment(segmentBefore);
|
||||
BeltTileEntity beltSegment = BeltHelper.getBeltAtSegment(belt, segmentBefore);
|
||||
if (beltSegment == null)
|
||||
break;
|
||||
for (BeltAttachmentState attachmentState : beltSegment.attachmentTracker.attachments) {
|
||||
|
@ -196,7 +202,7 @@ public class BeltInventory {
|
|||
if (segment == -1)
|
||||
continue;
|
||||
if (!world.isRemote)
|
||||
world.updateComparatorOutputLevel(getPositionForOffset(segment),
|
||||
world.updateComparatorOutputLevel(BeltHelper.getPositionForOffset(belt, segment),
|
||||
belt.getBlockState().getBlock());
|
||||
}
|
||||
}
|
||||
|
@ -207,7 +213,8 @@ public class BeltInventory {
|
|||
continue;
|
||||
|
||||
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);
|
||||
|
||||
// next block is a basin or a saw
|
||||
|
@ -238,7 +245,7 @@ public class BeltInventory {
|
|||
}
|
||||
|
||||
// next block is not a belt
|
||||
if (!AllBlocks.BELT.typeOf(state)) {
|
||||
if (!AllBlocks.BELT.typeOf(state) || state.get(BeltBlock.SLOPE) == Slope.VERTICAL) {
|
||||
if (!Block.hasSolidSide(state, world, nextPosition, movementFacing.getOpposite())) {
|
||||
eject(current);
|
||||
iterator.remove();
|
||||
|
@ -275,7 +282,7 @@ public class BeltInventory {
|
|||
}
|
||||
|
||||
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)))
|
||||
return false;
|
||||
TileEntity te = belt.getWorld().getTileEntity(pos);
|
||||
|
@ -313,7 +320,7 @@ public class BeltInventory {
|
|||
private void flapTunnel(int offset, Direction side, boolean inward) {
|
||||
if (belt.getBlockState().get(BeltBlock.SLOPE) != Slope.HORIZONTAL)
|
||||
return;
|
||||
BlockPos pos = getPositionForOffset(offset).up();
|
||||
BlockPos pos = BeltHelper.getPositionForOffset(belt, offset).up();
|
||||
if (!AllBlocks.BELT_TUNNEL.typeOf(belt.getWorld().getBlockState(pos)))
|
||||
return;
|
||||
TileEntity te = belt.getWorld().getTileEntity(pos);
|
||||
|
@ -335,7 +342,7 @@ public class BeltInventory {
|
|||
else if (!beltMovementPositive)
|
||||
segmentPos += 1f;
|
||||
|
||||
for (TransportedItemStack stack : items)
|
||||
for (TransportedItemStack stack : getItems())
|
||||
if (isBlocking(segment, side, segmentPos, stack))
|
||||
return false;
|
||||
for (TransportedItemStack stack : toInsert)
|
||||
|
@ -358,25 +365,25 @@ public class BeltInventory {
|
|||
}
|
||||
|
||||
private void insert(TransportedItemStack newStack) {
|
||||
if (items.isEmpty())
|
||||
items.add(newStack);
|
||||
if (getItems().isEmpty())
|
||||
getItems().add(newStack);
|
||||
else {
|
||||
int index = 0;
|
||||
for (TransportedItemStack stack : items) {
|
||||
for (TransportedItemStack stack : getItems()) {
|
||||
if (stack.compareTo(newStack) > 0 == beltMovementPositive)
|
||||
break;
|
||||
index++;
|
||||
}
|
||||
items.add(index, newStack);
|
||||
getItems().add(index, newStack);
|
||||
}
|
||||
}
|
||||
|
||||
public TransportedItemStack getStackAtOffset(int offset) {
|
||||
float min = offset + .5f - (SEGMENT_WINDOW / 2);
|
||||
float max = offset + .5f + (SEGMENT_WINDOW / 2);
|
||||
for (TransportedItemStack stack : items) {
|
||||
for (TransportedItemStack stack : getItems()) {
|
||||
if (stack.beltPosition > max)
|
||||
break;
|
||||
continue;
|
||||
if (stack.beltPosition > min)
|
||||
return stack;
|
||||
}
|
||||
|
@ -384,16 +391,16 @@ public class BeltInventory {
|
|||
}
|
||||
|
||||
public void read(CompoundNBT nbt) {
|
||||
items.clear();
|
||||
getItems().clear();
|
||||
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");
|
||||
}
|
||||
|
||||
public CompoundNBT write() {
|
||||
CompoundNBT nbt = new CompoundNBT();
|
||||
ListNBT itemsNBT = new ListNBT();
|
||||
items.forEach(stack -> itemsNBT.add(stack.serializeNBT()));
|
||||
getItems().forEach(stack -> itemsNBT.add(stack.serializeNBT()));
|
||||
nbt.put("Items", itemsNBT);
|
||||
nbt.putBoolean("PositiveOrder", beltMovementPositive);
|
||||
return nbt;
|
||||
|
@ -401,7 +408,7 @@ public class BeltInventory {
|
|||
|
||||
public void eject(TransportedItemStack 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);
|
||||
Vec3d outMotion = new Vec3d(belt.getBeltChainDirection()).scale(movementSpeed).add(0, 1 / 8f, 0);
|
||||
outPos.add(outMotion.normalize());
|
||||
|
@ -412,40 +419,9 @@ public class BeltInventory {
|
|||
belt.getWorld().addEntity(entity);
|
||||
}
|
||||
|
||||
public Vec3d getVectorForOffset(float offset) {
|
||||
Slope slope = belt.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, 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());
|
||||
public void ejectAll() {
|
||||
getItems().forEach(this::eject);
|
||||
getItems().clear();
|
||||
}
|
||||
|
||||
private boolean movingPositive() {
|
||||
|
@ -460,7 +436,7 @@ public class BeltInventory {
|
|||
Function<TransportedItemStack, List<TransportedItemStack>> callback) {
|
||||
List<TransportedItemStack> toBeAdded = new ArrayList<>();
|
||||
boolean dirty = false;
|
||||
for (Iterator<TransportedItemStack> iterator = items.iterator(); iterator.hasNext();) {
|
||||
for (Iterator<TransportedItemStack> iterator = getItems().iterator(); iterator.hasNext();) {
|
||||
TransportedItemStack transportedItemStack = iterator.next();
|
||||
if (Math.abs(position - transportedItemStack.beltPosition) < distance) {
|
||||
List<TransportedItemStack> apply = callback.apply(transportedItemStack);
|
||||
|
@ -478,4 +454,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.util.Direction.AxisDirection.NEGATIVE;
|
||||
|
@ -9,8 +9,10 @@ import java.util.List;
|
|||
import com.simibubi.create.AllBlocks;
|
||||
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.BeltBlock;
|
||||
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.BeltTileEntity;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.Entity;
|
||||
|
@ -50,6 +52,10 @@ public class BeltMovementHandler {
|
|||
ticksSinceLastCollision++;
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getTicksSinceLastCollision() {
|
||||
return ticksSinceLastCollision;
|
||||
}
|
||||
}
|
||||
|
||||
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.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;
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
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.BlockState;
|
||||
|
@ -14,7 +14,7 @@ import net.minecraft.world.IBlockReader;
|
|||
import net.minecraft.world.IWorld;
|
||||
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;
|
||||
|
||||
|
@ -34,7 +34,8 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements IWithTile
|
|||
|
||||
@Override
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -61,4 +62,9 @@ public class AdjustablePulleyBlock extends EncasedBeltBlock implements IWithTile
|
|||
worldIn.setBlockState(pos, state.cycle(POWERED), 18);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<AdjustablePulleyTileEntity> getTileEntityClass() {
|
||||
return AdjustablePulleyTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@ import net.minecraft.state.EnumProperty;
|
|||
import net.minecraft.state.IProperty;
|
||||
import net.minecraft.state.StateContainer.Builder;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ActionResultType;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Direction.Axis;
|
||||
import net.minecraft.util.Direction.AxisDirection;
|
||||
|
@ -120,6 +119,22 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock {
|
|||
return stateIn.with(PART, part).with(CONNECTED_ALONG_FIRST_COORDINATE, connectionAlongFirst);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockState updateAfterWrenched(BlockState newState, ItemUseContext context) {
|
||||
Blocks.AIR.getDefaultState().updateNeighbors(context.getWorld(), context.getPos(), 1);
|
||||
Axis axis = newState.get(AXIS);
|
||||
newState = getDefaultState().with(AXIS, axis);
|
||||
for (Direction facing : Direction.values()) {
|
||||
if (facing.getAxis() == axis)
|
||||
continue;
|
||||
BlockPos pos = context.getPos();
|
||||
BlockPos offset = pos.offset(facing);
|
||||
newState = updatePostPlacement(newState, facing, context.getWorld().getBlockState(offset), context.getWorld(),
|
||||
pos, offset); }
|
||||
newState.updateNeighbors(context.getWorld(), context.getPos(), 1 | 2);
|
||||
return newState;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
|
||||
return face.getAxis() == state.get(AXIS);
|
||||
|
@ -169,19 +184,6 @@ public class EncasedBeltBlock extends RotatedPillarKineticBlock {
|
|||
return new EncasedShaftTileEntity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResultType onWrenched(BlockState state, ItemUseContext context) {
|
||||
Axis axis = state.get(AXIS);
|
||||
boolean connectionAlongFirst = state.get(CONNECTED_ALONG_FIRST_COORDINATE);
|
||||
Axis connectionAxis = connectionAlongFirst ? (axis == Axis.X ? Axis.Y : Axis.X)
|
||||
: (axis == Axis.Z ? Axis.Y : Axis.Z);
|
||||
|
||||
if (context.getFace().getAxis() == connectionAxis)
|
||||
return ActionResultType.PASS;
|
||||
|
||||
return super.onWrenched(state, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasStaticPart() {
|
||||
return true;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
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.base.KineticTileEntity;
|
||||
import com.simibubi.create.modules.contraptions.relays.gearbox.GearshiftTileEntity;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
|
@ -17,7 +17,7 @@ import net.minecraft.world.IBlockReader;
|
|||
import net.minecraft.world.IWorldReader;
|
||||
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;
|
||||
|
||||
|
@ -51,7 +51,7 @@ public class GearshiftBlock extends EncasedShaftBlock {
|
|||
|
||||
boolean previouslyPowered = state.get(POWERED);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -60,4 +60,9 @@ public class GearshiftBlock extends EncasedShaftBlock {
|
|||
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.IHaveNoBlockItem;
|
||||
import com.simibubi.create.foundation.block.IWithTileEntity;
|
||||
import com.simibubi.create.foundation.block.ITE;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.block.FourWayBlock;
|
||||
import net.minecraft.block.PaneBlock;
|
||||
import net.minecraft.block.material.Material;
|
||||
|
@ -45,7 +46,7 @@ import net.minecraftforge.api.distmarker.Dist;
|
|||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
|
||||
public class WindowInABlockBlock extends PaneBlock
|
||||
implements IWithTileEntity<WindowInABlockTileEntity>, IHaveNoBlockItem, IHaveCustomBlockModel {
|
||||
implements ITE<WindowInABlockTileEntity>, IHaveNoBlockItem, IHaveCustomBlockModel {
|
||||
|
||||
public WindowInABlockBlock() {
|
||||
super(Properties.create(Material.ROCK));
|
||||
|
@ -69,14 +70,13 @@ public class WindowInABlockBlock extends PaneBlock
|
|||
|
||||
Vec3d start = player.getEyePosition(1);
|
||||
Vec3d end = start.add(player.getLookVec().scale(player.getAttribute(PlayerEntity.REACH_DISTANCE).getValue()));
|
||||
BlockRayTraceResult target = world
|
||||
.rayTraceBlocks(new RayTraceContext(start, end, BlockMode.OUTLINE, FluidMode.NONE, player));
|
||||
BlockRayTraceResult target =
|
||||
world.rayTraceBlocks(new RayTraceContext(start, end, BlockMode.OUTLINE, FluidMode.NONE, player));
|
||||
if (target == null || target.getHitVec() == null)
|
||||
return super.removedByPlayer(state, world, pos, player, willHarvest, fluid);
|
||||
|
||||
try {
|
||||
WindowInABlockTileEntity tileEntity = getTileEntity(world, pos);
|
||||
if (tileEntity == null)
|
||||
return super.removedByPlayer(state, world, pos, player, willHarvest, fluid);
|
||||
BlockState windowBlock = tileEntity.getWindowBlock();
|
||||
for (AxisAlignedBB bb : windowBlock.getShape(world, pos).toBoundingBoxList()) {
|
||||
if (bb.grow(.1d).contains(target.getHitVec().subtract(new Vec3d(pos)))) {
|
||||
|
@ -95,6 +95,7 @@ public class WindowInABlockBlock extends PaneBlock
|
|||
return false;
|
||||
}
|
||||
}
|
||||
} catch (TileEntityException e) {}
|
||||
|
||||
return super.removedByPlayer(state, world, pos, player, willHarvest, fluid);
|
||||
}
|
||||
|
@ -111,49 +112,36 @@ public class WindowInABlockBlock extends PaneBlock
|
|||
|
||||
@Override
|
||||
public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) {
|
||||
WindowInABlockTileEntity tileEntity = getTileEntity(reader, pos);
|
||||
if (tileEntity == null)
|
||||
return super.propagatesSkylightDown(state, reader, pos);
|
||||
return tileEntity.getPartialBlock().propagatesSkylightDown(reader, pos);
|
||||
return getSurroundingBlockState(reader, pos).propagatesSkylightDown(reader, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean collisionExtendsVertically(BlockState state, IBlockReader world, BlockPos pos,
|
||||
Entity collidingEntity) {
|
||||
WindowInABlockTileEntity tileEntity = getTileEntity(world, pos);
|
||||
if (tileEntity == null)
|
||||
return false;
|
||||
return tileEntity.getPartialBlock().collisionExtendsVertically(world, pos, collidingEntity);
|
||||
return getSurroundingBlockState(world, pos).collisionExtendsVertically(world, pos, collidingEntity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getBlockHardness(BlockState blockState, IBlockReader worldIn, BlockPos pos) {
|
||||
WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos);
|
||||
if (tileEntity == null)
|
||||
return 0;
|
||||
return tileEntity.getPartialBlock().getBlockHardness(worldIn, pos);
|
||||
return getSurroundingBlockState(worldIn, pos).getBlockHardness(worldIn, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getExplosionResistance(BlockState state, IWorldReader world, BlockPos pos, Entity exploder,
|
||||
Explosion explosion) {
|
||||
WindowInABlockTileEntity tileEntity = getTileEntity(world, pos);
|
||||
if (tileEntity == null)
|
||||
return 0;
|
||||
return tileEntity.getPartialBlock().getExplosionResistance(world, pos, exploder, explosion);
|
||||
return getSurroundingBlockState(world, pos).getExplosionResistance(world, pos, exploder, explosion);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos,
|
||||
PlayerEntity player) {
|
||||
WindowInABlockTileEntity tileEntity = getTileEntity(world, pos);
|
||||
if (tileEntity == null)
|
||||
return ItemStack.EMPTY;
|
||||
for (AxisAlignedBB bb : tileEntity.getWindowBlock().getShape(world, pos).toBoundingBoxList()) {
|
||||
BlockState window = getWindowBlockState(world, pos);
|
||||
for (AxisAlignedBB bb : window.getShape(world, pos).toBoundingBoxList()) {
|
||||
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
|
||||
|
@ -170,11 +158,8 @@ public class WindowInABlockBlock extends PaneBlock
|
|||
|
||||
@Override
|
||||
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
|
||||
WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos);
|
||||
if (tileEntity == null)
|
||||
return makeCuboidShape(7, 0, 7, 9, 16, 9);
|
||||
VoxelShape shape1 = tileEntity.getPartialBlock().getShape(worldIn, pos, context);
|
||||
VoxelShape shape2 = tileEntity.getWindowBlock().getShape(worldIn, pos, context);
|
||||
VoxelShape shape1 = getSurroundingBlockState(worldIn, pos).getShape(worldIn, pos, context);
|
||||
VoxelShape shape2 = getWindowBlockState(worldIn, pos).getShape(worldIn, pos, context);
|
||||
return VoxelShapes.or(shape1, shape2);
|
||||
}
|
||||
|
||||
|
@ -187,10 +172,7 @@ public class WindowInABlockBlock extends PaneBlock
|
|||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public MaterialColor getMaterialColor(BlockState state, IBlockReader worldIn, BlockPos pos) {
|
||||
WindowInABlockTileEntity tileEntity = getTileEntity(worldIn, pos);
|
||||
if (tileEntity == null)
|
||||
return MaterialColor.AIR;
|
||||
return tileEntity.getPartialBlock().getMaterialColor(worldIn, pos);
|
||||
return getSurroundingBlockState(worldIn, pos).getMaterialColor(worldIn, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -199,8 +181,8 @@ public class WindowInABlockBlock extends PaneBlock
|
|||
withTileEntityDo(worldIn, currentPos, te -> {
|
||||
te.setWindowBlock(
|
||||
te.getWindowBlock().updatePostPlacement(facing, facingState, worldIn, currentPos, facingPos));
|
||||
BlockState blockState = te.getPartialBlock().updatePostPlacement(facing, facingState, worldIn, currentPos,
|
||||
facingPos);
|
||||
BlockState blockState =
|
||||
te.getPartialBlock().updatePostPlacement(facing, facingState, worldIn, currentPos, facingPos);
|
||||
if (blockState.getBlock() instanceof FourWayBlock) {
|
||||
for (BooleanProperty side : Arrays.asList(FourWayBlock.EAST, FourWayBlock.NORTH, FourWayBlock.SOUTH,
|
||||
FourWayBlock.WEST))
|
||||
|
@ -213,6 +195,20 @@ public class WindowInABlockBlock extends PaneBlock
|
|||
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)
|
||||
public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) {
|
||||
return false;
|
||||
|
@ -224,4 +220,9 @@ public class WindowInABlockBlock extends PaneBlock
|
|||
return new WindowInABlockModel(original);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<WindowInABlockTileEntity> getTileEntityClass() {
|
||||
return WindowInABlockTileEntity.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ import net.minecraft.util.Direction;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3i;
|
||||
import net.minecraftforge.client.MinecraftForgeClient;
|
||||
import net.minecraftforge.client.model.data.EmptyModelData;
|
||||
import net.minecraftforge.client.model.data.IModelData;
|
||||
|
||||
public class WindowInABlockModel extends WrappedBakedModel {
|
||||
|
@ -50,13 +51,20 @@ public class WindowInABlockModel extends WrappedBakedModel {
|
|||
|
||||
RenderType renderLayer = MinecraftForgeClient.getRenderLayer();
|
||||
if (RenderTypeLookup.canRenderInLayer(partialState, renderLayer) && partialState != null) {
|
||||
quads.addAll(dispatcher.getModelForState(partialState).getQuads(partialState, side, rand, data));
|
||||
IBakedModel partialModel = dispatcher.getModelForState(partialState);
|
||||
IModelData modelData = partialModel.getModelData(Minecraft.getInstance().world, position, partialState,
|
||||
EmptyModelData.INSTANCE);
|
||||
quads.addAll(partialModel.getQuads(partialState, side, rand, modelData));
|
||||
}
|
||||
if (RenderTypeLookup.canRenderInLayer(windowState, renderLayer) && windowState != null) {
|
||||
quads.addAll(dispatcher.getModelForState(windowState).getQuads(windowState, side, rand, data).stream()
|
||||
IBakedModel windowModel = dispatcher.getModelForState(windowState);
|
||||
IModelData modelData =
|
||||
windowModel.getModelData(Minecraft.getInstance().world, position, windowState, EmptyModelData.INSTANCE);
|
||||
quads.addAll(dispatcher.getModelForState(windowState).getQuads(windowState, side, rand, modelData).stream()
|
||||
.filter(q -> {
|
||||
Direction face = q.getFace();
|
||||
if (face != null && windowState.isSideInvisible(world.getBlockState(position), face))
|
||||
if (face != null
|
||||
&& world.getBlockState(position.offset(face)).isSideInvisible(windowState, face))
|
||||
return false;
|
||||
if (face != null && Block.hasSolidSide(partialState, world, position, face))
|
||||
return false;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -9,7 +9,6 @@ import com.simibubi.create.modules.curiosities.tools.SandPaperItemRenderer.SandP
|
|||
|
||||
import net.minecraft.client.renderer.model.IBakedModel;
|
||||
import net.minecraft.enchantment.Enchantment;
|
||||
import net.minecraft.enchantment.Enchantments;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
|
@ -111,7 +110,7 @@ public class SandPaperItem extends Item implements IHaveCustomItemModel {
|
|||
|
||||
@Override
|
||||
public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) {
|
||||
return enchantment == Enchantments.FORTUNE || super.canApplyAtEnchantingTable(stack, enchantment);
|
||||
return super.canApplyAtEnchantingTable(stack, enchantment);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,25 +1,18 @@
|
|||
package com.simibubi.create.modules.curiosities.tools;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.simibubi.create.AllRecipes;
|
||||
import com.simibubi.create.config.AllConfigs;
|
||||
import com.simibubi.create.modules.contraptions.processing.ProcessingIngredient;
|
||||
import com.simibubi.create.modules.contraptions.processing.ProcessingOutput;
|
||||
import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe;
|
||||
import com.simibubi.create.modules.curiosities.tools.SandPaperPolishingRecipe.SandPaperInv;
|
||||
|
||||
import net.minecraft.enchantment.Enchantment;
|
||||
import net.minecraft.enchantment.EnchantmentHelper;
|
||||
import net.minecraft.enchantment.Enchantments;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.IRecipe;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.Explosion.Mode;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.items.ItemStackHandler;
|
||||
import net.minecraftforge.items.wrapper.RecipeWrapper;
|
||||
|
@ -34,46 +27,13 @@ public class SandPaperPolishingRecipe extends ProcessingRecipe<SandPaperInv> {
|
|||
}
|
||||
|
||||
public static boolean canPolish(World world, ItemStack stack) {
|
||||
return (stack.isDamageable() && isPolishingEnabled()) || !getMatchingRecipes(world, stack).isEmpty();
|
||||
}
|
||||
|
||||
public static Boolean isPolishingEnabled() {
|
||||
return AllConfigs.SERVER.curiosities.enableSandPaperToolPolishing.get();
|
||||
return !getMatchingRecipes(world, stack).isEmpty();
|
||||
}
|
||||
|
||||
public static ItemStack applyPolish(World world, Vec3d position, ItemStack stack, ItemStack sandPaperStack) {
|
||||
List<IRecipe<SandPaperInv>> matchingRecipes = getMatchingRecipes(world, stack);
|
||||
if (!matchingRecipes.isEmpty())
|
||||
return matchingRecipes.get(0).getCraftingResult(new SandPaperInv(stack)).copy();
|
||||
if (stack.isDamageable() && isPolishingEnabled()) {
|
||||
|
||||
stack.setDamage(stack.getDamage() / 2);
|
||||
|
||||
int fortuneLevel = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, sandPaperStack);
|
||||
float chanceToPunish = (float) (1 / Math.pow(2, fortuneLevel + 1));
|
||||
|
||||
if (world.rand.nextFloat() > chanceToPunish)
|
||||
return stack;
|
||||
|
||||
if (stack.isEnchanted()) {
|
||||
Map<Enchantment, Integer> enchantments = EnchantmentHelper.getEnchantments(stack);
|
||||
ArrayList<Enchantment> list = new ArrayList<>(enchantments.keySet());
|
||||
Enchantment randomKey = list.get(world.rand.nextInt(list.size()));
|
||||
int level = enchantments.get(randomKey);
|
||||
if (level <= 1)
|
||||
enchantments.remove(randomKey);
|
||||
else
|
||||
enchantments.put(randomKey, level - 1);
|
||||
EnchantmentHelper.setEnchantments(enchantments, stack);
|
||||
if (randomKey.isCurse())
|
||||
if (!world.isRemote)
|
||||
world.createExplosion(null, CURSED_POLISHING, position.x, position.y, position.z, 2, true,
|
||||
Mode.DESTROY);
|
||||
} else {
|
||||
stack = ItemStack.EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
return stack;
|
||||
}
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue