Merge remote-tracking branch 'origin/mc1.15/dev' into mc1.15/dev

This commit is contained in:
grimmauld 2021-02-19 16:39:11 +01:00
commit a3f2fbe788
25 changed files with 2322 additions and 108 deletions

View file

@ -851,6 +851,7 @@
"create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distance",
"create.gui.sequenced_gearshift.instruction.wait": "Wait",
"create.gui.sequenced_gearshift.instruction.wait.duration": "Duration",
"create.gui.sequenced_gearshift.instruction.paused": "Paused",
"create.gui.sequenced_gearshift.instruction.end": "End",
"create.gui.sequenced_gearshift.speed": "Speed, Direction",
"create.gui.sequenced_gearshift.speed.forward": "Input speed, Forwards",

View file

@ -107,7 +107,10 @@ public class AllShapes {
.forHorizontal(Direction.SOUTH),
PUMP = shape(2, 0, 2, 14, 5, 14).add(4, 0, 4, 12, 16, 12)
.add(3, 12, 3, 13, 16, 13)
.forDirectional(Direction.UP)
.forDirectional(Direction.UP),
CRUSHING_WHEEL_CONTROLLER_COLLISION = shape(0, 0, 0, 16, 13, 16)
.forDirectional(Direction.DOWN)
;
@ -145,7 +148,8 @@ public class AllShapes {
HEATER_BLOCK_SHAPE = shape(2, 0, 2, 14, 14, 14).add(0, 0, 0, 16, 4, 16)
.build(),
HEATER_BLOCK_SPECIAL_COLLISION_SHAPE = shape(0, 0, 0, 16, 4, 16).build(),
CRUSHING_WHEEL_COLLISION_SHAPE = cuboid(0, 0, 0, 16, 22, 16), SEAT = cuboid(0, 0, 0, 16, 8, 16),
CRUSHING_WHEEL_COLLISION_SHAPE = cuboid(0, 0, 0, 16, 16, 16),
SEAT = cuboid(0, 0, 0, 16, 8, 16),
SEAT_COLLISION = cuboid(0, 0, 0, 16, 6, 16),
MECHANICAL_PROCESSOR_SHAPE = shape(VoxelShapes.fullCube()).erase(4, 0, 4, 12, 16, 12)
.build(),

View file

@ -37,6 +37,7 @@ public class PortableFluidInterfaceTileEntity extends PortableStorageInterfaceTi
LazyOptional<IFluidHandler> oldcap = capability;
capability = createEmptyHandler();
oldcap.invalidate();
super.stopTransferring();
}
private LazyOptional<IFluidHandler> createEmptyHandler() {
@ -90,7 +91,7 @@ public class PortableFluidInterfaceTileEntity extends PortableStorageInterfaceTi
@Override
public FluidStack drain(FluidStack resource, FluidAction action) {
if (!isConnected())
if (!canTransfer())
return FluidStack.EMPTY;
FluidStack drain = wrapped.drain(resource, action);
if (!drain.isEmpty() && action.execute())
@ -100,7 +101,7 @@ public class PortableFluidInterfaceTileEntity extends PortableStorageInterfaceTi
@Override
public FluidStack drain(int maxDrain, FluidAction action) {
if (!isConnected())
if (!canTransfer())
return FluidStack.EMPTY;
FluidStack drain = wrapped.drain(maxDrain, action);
if (!drain.isEmpty() && (action.execute() || drain.getAmount() == 1))

View file

@ -33,6 +33,7 @@ public class PortableItemInterfaceTileEntity extends PortableStorageInterfaceTil
LazyOptional<IItemHandlerModifiable> oldCap = capability;
capability = LazyOptional.of(() -> new InterfaceItemHandler(new ItemStackHandler(0)));
oldCap.invalidate();
super.stopTransferring();
}
@Override
@ -55,7 +56,7 @@ public class PortableItemInterfaceTileEntity extends PortableStorageInterfaceTil
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate) {
if (!isConnected())
if (!canTransfer())
return ItemStack.EMPTY;
ItemStack extractItem = super.extractItem(slot, amount, simulate);
if (!simulate && !extractItem.isEmpty())
@ -65,7 +66,7 @@ public class PortableItemInterfaceTileEntity extends PortableStorageInterfaceTil
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
if (!isConnected())
if (!canTransfer())
return stack;
ItemStack insertItem = super.insertItem(slot, stack, simulate);
if (!simulate && !insertItem.equals(stack, false))

View file

@ -8,6 +8,7 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.LerpedFloat;
import net.minecraft.entity.Entity;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.AxisAlignedBB;
@ -21,6 +22,7 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity
protected float distance;
protected LerpedFloat connectionAnimation;
protected boolean powered;
protected Entity connectedEntity;
public PortableStorageInterfaceTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
@ -32,11 +34,20 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity
public void startTransferringTo(Contraption contraption, float distance) {
this.distance = distance;
connectedEntity = contraption.entity;
startConnecting();
notifyUpdate();
}
protected abstract void stopTransferring();
protected void stopTransferring() {
connectedEntity = null;
}
public boolean canTransfer() {
if (connectedEntity != null && !connectedEntity.isAlive())
stopTransferring();
return connectedEntity != null && isConnected();
}
protected abstract void invalidateCapability();

View file

@ -1,6 +1,7 @@
package com.simibubi.create.content.contraptions.components.crusher;
import static com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerBlock.VALID;
import static com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerBlock.FACING;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
@ -17,6 +18,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.Vec3d;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
@ -53,7 +55,7 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
for (Direction d : Iterate.horizontalDirections) {
for (Direction d : Iterate.directions) {
if (d.getAxis() == state.get(AXIS))
continue;
if (AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(worldIn.getBlockState(pos.offset(d))))
@ -65,21 +67,26 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE
}
}
public void updateControllers(BlockState state, World world, BlockPos pos, Direction facing) {
if (facing.getAxis() == state.get(AXIS) || facing.getAxis()
.isVertical())
public void updateControllers(BlockState state, World world, BlockPos pos, Direction side) {
if (side.getAxis() == state.get(AXIS))
return;
if (world == null)
return;
BlockPos controllerPos = pos.offset(facing);
BlockPos otherWheelPos = pos.offset(facing, 2);
BlockPos controllerPos = pos.offset(side);
BlockPos otherWheelPos = pos.offset(side, 2);
boolean controllerExists = AllBlocks.CRUSHING_WHEEL_CONTROLLER.has(world.getBlockState(controllerPos));
boolean controllerIsValid = controllerExists && world.getBlockState(controllerPos)
.get(VALID);
.get(VALID);
Direction controllerOldDirection = controllerExists
? world.getBlockState(controllerPos)
.get(FACING)
: null;
boolean controllerShouldExist = false;
boolean controllerShouldBeValid = false;
Direction controllerNewDirection = Direction.DOWN;
BlockState otherState = world.getBlockState(otherWheelPos);
if (AllBlocks.CRUSHING_WHEEL.has(otherState)) {
@ -90,10 +97,22 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE
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);
controllerShouldBeValid = facing.getAxisDirection()
.getOffset() != signum;
&& te.getSpeed() != 0) {
Axis wheelAxis = state.get(AXIS);
Axis sideAxis = side.getAxis();
int controllerADO = Math.round(Math.signum(te.getSpeed())) * side.getAxisDirection().getOffset();
Vec3d controllerDirVec = new Vec3d(wheelAxis == Axis.X ? 1 : 0
, wheelAxis == Axis.Y ? 1 : 0
, wheelAxis == Axis.Z ? 1 : 0)
.crossProduct(new Vec3d(sideAxis == Axis.X ? 1 : 0
, sideAxis == Axis.Y ? 1 : 0
, sideAxis == Axis.Z ? 1 : 0));
controllerNewDirection = Direction.getFacingFromVector(controllerDirVec.x * controllerADO
, controllerDirVec.y * controllerADO
, controllerDirVec.z * controllerADO);
controllerShouldBeValid = true;
}
if (otherState.get(AXIS) != state.get(AXIS))
controllerShouldExist = false;
@ -111,18 +130,20 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock implements ITE
if (!controllerExists) {
if (!world.getBlockState(controllerPos)
.getMaterial()
.isReplaceable())
.getMaterial()
.isReplaceable())
return;
world.setBlockState(controllerPos, AllBlocks.CRUSHING_WHEEL_CONTROLLER.getDefaultState()
.with(VALID, controllerShouldBeValid));
} else if (controllerIsValid != controllerShouldBeValid) {
.with(VALID, controllerShouldBeValid)
.with(FACING, controllerNewDirection));
} else if (controllerIsValid != controllerShouldBeValid || controllerOldDirection != controllerNewDirection) {
world.setBlockState(controllerPos, world.getBlockState(controllerPos)
.with(VALID, controllerShouldBeValid));
.with(VALID, controllerShouldBeValid)
.with(FACING, controllerNewDirection));
}
((CrushingWheelControllerBlock) AllBlocks.CRUSHING_WHEEL_CONTROLLER.get())
.updateSpeed(world.getBlockState(controllerPos), world, controllerPos);
.updateSpeed(world.getBlockState(controllerPos), world, controllerPos);
}

View file

@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.crusher;
import java.util.Random;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.foundation.block.ITE;
@ -11,6 +12,7 @@ import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.DirectionalBlock;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
@ -23,7 +25,7 @@ import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.ISelectionContext;
@ -34,7 +36,7 @@ import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.World;
public class CrushingWheelControllerBlock extends Block
public class CrushingWheelControllerBlock extends DirectionalBlock
implements ITE<CrushingWheelControllerTileEntity> {
public CrushingWheelControllerBlock(Properties p_i48440_1_) {
@ -66,27 +68,40 @@ public class CrushingWheelControllerBlock extends Block
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
builder.add(VALID);
builder.add(FACING);
super.fillStateContainer(builder);
}
public void onEntityCollision(BlockState state, World worldIn, BlockPos pos, Entity entityIn) {
if (!state.get(VALID))
return;
Direction facing = state.get(FACING);
Axis axis = facing.getAxis();
checkEntityForProcessing(worldIn, pos, entityIn);
withTileEntityDo(worldIn, pos, te -> {
if (te.processingEntity == entityIn)
entityIn.setMotionMultiplier(state, new Vec3d(0.25D, (double) 0.05F, 0.25D));
entityIn.setMotionMultiplier(state, new Vec3d(axis == Axis.X ? (double) 0.05F : 0.25D
, axis == Axis.Y ? (double) 0.05F : 0.25D
, axis == Axis.Z ? (double) 0.05F : 0.25D));
});
}
@Override
public void onLanded(IBlockReader worldIn, Entity entityIn) {
super.onLanded(worldIn, entityIn);
public void checkEntityForProcessing(World worldIn, BlockPos pos, Entity entityIn){
try {
CrushingWheelControllerTileEntity te = getTileEntity(worldIn, entityIn.getPosition().down());
CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos);
if (te.crushingspeed == 0)
return;
if (entityIn instanceof ItemEntity)
((ItemEntity) entityIn).setPickupDelay(10);
CompoundNBT data = entityIn.getPersistentData();
if (data.contains("BypassCrushingWheel")) {
if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel"))))
return;
}
if (te.isOccupied())
return;
boolean isPlayer = entityIn instanceof PlayerEntity;
@ -99,6 +114,12 @@ public class CrushingWheelControllerBlock extends Block
} catch (TileEntityException e) {}
}
@Override
public void onLanded(IBlockReader worldIn, Entity entityIn) {
super.onLanded(worldIn, entityIn);
//Moved to onEntityCollision to allow for omnidirectional input
}
@Override
public void animateTick(BlockState stateIn, World worldIn, BlockPos pos, Random rand) {
if (!stateIn.get(VALID))
@ -128,7 +149,7 @@ public class CrushingWheelControllerBlock extends Block
return;
}
for (Direction d : Iterate.horizontalDirections) {
for (Direction d : Iterate.directions) {
BlockState neighbour = world.getBlockState(pos.offset(d));
if (!AllBlocks.CRUSHING_WHEEL.has(neighbour))
continue;
@ -144,22 +165,19 @@ public class CrushingWheelControllerBlock extends Block
@Override
public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos,
ISelectionContext context) {
ISelectionContext context) {
if (!state.get(VALID))
return VoxelShapes.fullCube();
return AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.get(FACING));
Entity entity = context.getEntity();
if (entity != null) {
if (entity != null) {
CompoundNBT data = entity.getPersistentData();
if (data.contains("BypassCrushingWheel")) {
if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel"))))
return VoxelShapes.empty();
}
}
if (new AxisAlignedBB(pos).contains(entity.getPositionVec()))
return VoxelShapes.empty();
CompoundNBT data = entity.getPersistentData();
if (data.contains("BypassCrushingWheel")) {
if (pos.equals(NBTUtil.readBlockPos(data.getCompound("BypassCrushingWheel"))))
if (state.get(FACING) != Direction.UP) //Allow output items to land on top of the block rather than falling back through.
return VoxelShapes.empty();
}
try {
CrushingWheelControllerTileEntity te = getTileEntity(worldIn, pos);
@ -167,7 +185,7 @@ public class CrushingWheelControllerBlock extends Block
return VoxelShapes.empty();
} catch (TileEntityException e) {}
}
return VoxelShapes.fullCube();
return AllShapes.CRUSHING_WHEEL_CONTROLLER_COLLISION.get(state.get(FACING));
}
@Override

View file

@ -6,6 +6,8 @@ import java.util.Optional;
import java.util.Random;
import java.util.UUID;
import static com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerBlock.FACING;
import com.simibubi.create.AllRecipeTypes;
import com.simibubi.create.content.contraptions.processing.ProcessingInventory;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
@ -16,6 +18,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.item.BlockItem;
@ -28,7 +31,9 @@ import net.minecraft.particles.ItemParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.common.capabilities.Capability;
@ -63,7 +68,15 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity {
@Override
public void addBehaviours(List<TileEntityBehaviour> behaviours) {
behaviours.add(new DirectBeltInputBehaviour(this));
behaviours.add(new DirectBeltInputBehaviour(this).onlyInsertWhen(this::supportsDirectBeltInput));
}
private boolean supportsDirectBeltInput(Direction side) {
BlockState blockState = getBlockState();
if (blockState == null)
return false;
Direction direction = blockState.get(CrushingWheelControllerBlock.FACING);
return direction == Direction.DOWN || direction == side;
}
@Override
@ -72,26 +85,37 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity {
if (searchForEntity) {
searchForEntity = false;
List<Entity> search = world.getEntitiesInAABBexcluding(null, new AxisAlignedBB(getPos()),
e -> entityUUID.equals(e.getUniqueID()));
e -> entityUUID.equals(e.getUniqueID()));
if (search.isEmpty())
clear();
else
processingEntity = search.get(0);
}
if (!isOccupied())
return;
if (crushingspeed == 0)
return;
float speed = crushingspeed * 4;
Vec3d outPos = VecHelper.getCenterOf(pos);
Vec3d centerPos = VecHelper.getCenterOf(pos);
Direction facing = getBlockState().get(FACING);
int offset = facing.getAxisDirection().getOffset();
Vec3d outSpeed = new Vec3d((facing.getAxis() == Axis.X ? 0.25D : 0.0D) * offset
, offset == 1 ? (facing.getAxis() == Axis.Y ? 0.5D : 0.0D) : 0.0D //Increased upwards speed so upwards crushing wheels shoot out the item properly.
, (facing.getAxis() == Axis.Z ? 0.25D : 0.0D) * offset); //No downwards speed, so downwards crushing wheels drop the items as before.
Vec3d outPos = centerPos.add((facing.getAxis() == Axis.X ? .55f * offset : 0f)
, (facing.getAxis() == Axis.Y ? .55f * offset : 0f)
, (facing.getAxis() == Axis.Z ? .55f * offset : 0f));
if (!hasEntity()) {
float processingSpeed =
MathHelper.clamp((speed) / (!inventory.appliedRecipe ? MathHelper.log2(inventory.getStackInSlot(0)
.getCount()) : 1), .25f, 20);
MathHelper.clamp((speed) / (!inventory.appliedRecipe ? MathHelper.log2(inventory.getStackInSlot(0)
.getCount()) : 1), .25f, 20);
inventory.remainingTime -= processingSpeed;
spawnParticles(inventory.getStackInSlot(0));
@ -105,61 +129,111 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity {
return;
}
if (inventory.remainingTime <= 0) {
for (int slot = 0; slot < inventory.getSlots(); slot++) {
ItemStack stack = inventory.getStackInSlot(slot);
if (stack.isEmpty())
continue;
ItemEntity entityIn = new ItemEntity(world, outPos.x, outPos.y, outPos.z, stack);
entityIn.setMotion(Vec3d.ZERO);
entityIn.getPersistentData()
.put("BypassCrushingWheel", NBTUtil.writeBlockPos(pos));
world.addEntity(entityIn);
}
inventory.clear();
world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16);
if (inventory.remainingTime > 0) {
return;
}
inventory.remainingTime = 0;
//Output Items
if (facing.getAxis().isHorizontal() || facing == Direction.DOWN) {
BlockPos nextPos = pos.add(facing.getAxis() == Axis.X ? 1f * offset : 0f
, (-1f)
, facing.getAxis() == Axis.Z ? 1f * offset : 0f);
DirectBeltInputBehaviour behaviour = TileEntityBehaviour.get(world, nextPos, DirectBeltInputBehaviour.TYPE);
if (behaviour != null) {
boolean changed = false;
if (!behaviour.canInsertFromSide(facing))
return;
for (int slot = 0; slot < inventory.getSlots(); slot++) {
ItemStack stack = inventory.getStackInSlot(slot);
if (stack.isEmpty())
continue;
ItemStack remainder = behaviour.handleInsertion(stack, facing, false);
if (remainder.equals(stack, false))
continue;
inventory.setStackInSlot(slot, remainder);
changed = true;
}
if (changed) {
markDirty();
sendData();
}
return;
}
}
//Eject Items
for (int slot = 0; slot < inventory.getSlots(); slot++) {
ItemStack stack = inventory.getStackInSlot(slot);
if (stack.isEmpty())
continue;
ItemEntity entityIn = new ItemEntity(world, outPos.x, outPos.y, outPos.z, stack);
entityIn.setMotion(outSpeed);
entityIn.getPersistentData()
.put("BypassCrushingWheel", NBTUtil.writeBlockPos(pos));
world.addEntity(entityIn);
}
inventory.clear();
world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16);
return;
}
if (!processingEntity.isAlive() || !processingEntity.getBoundingBox()
.intersects(new AxisAlignedBB(pos).grow(.5f))) {
.intersects(new AxisAlignedBB(pos).grow(.5f))) {
clear();
return;
}
double xMotion = ((pos.getX() + .5f) - processingEntity.getX()) / 2f;
double yMotion = ((pos.getY() + .5f) - processingEntity.getY()) / 2f;
double zMotion = ((pos.getZ() + .5f) - processingEntity.getZ()) / 2f;
if (processingEntity.isSneaking())
xMotion = zMotion = 0;
processingEntity.setMotion(new Vec3d(xMotion, Math.max(-speed / 4f, -.5f), zMotion));
double movement = Math.max(-speed / 4f, -.5f) * -offset;
processingEntity.setMotion(new Vec3d(facing.getAxis() == Axis.X ? movement : xMotion
, facing.getAxis() == Axis.Y ? movement : 0f //Do not move entities upwards or downwards for horizontal crushers,
, facing.getAxis() == Axis.Z ? movement : zMotion)); //Or they'll only get their feet crushed.
if (world.isRemote)
return;
if (!(processingEntity instanceof ItemEntity)) {
processingEntity.attackEntityFrom(CrushingWheelTileEntity.damageSource,
AllConfigs.SERVER.kinetics.crushingDamage.get());
AllConfigs.SERVER.kinetics.crushingDamage.get());
if (!processingEntity.isAlive()) {
processingEntity.setPosition(outPos.x, outPos.y - .75f, outPos.z);
processingEntity.setPosition(outPos.x + (facing.getAxis() == Axis.X ? .75f * offset : 0f) //This is supposed to move the mobs to the output location
, outPos.y + (facing.getAxis() == Axis.Y ? .75f * offset : 0f) //So the item drops end up on the other end
, outPos.z + (facing.getAxis() == Axis.Z ? .75f * offset : 0f)); //This, however, does not currently work consistently for non-downwards crushers.
}
return;
}
ItemEntity itemEntity = (ItemEntity) processingEntity;
itemEntity.setPickupDelay(20);
if (processingEntity.getY() < pos.getY() + .25f) {
inventory.clear();
inventory.setStackInSlot(0, itemEntity.getItem()
.copy());
itemInserted(inventory.getStackInSlot(0));
itemEntity.remove();
world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16);
if (facing.getAxis() == Axis.Y) {
if (processingEntity.getY() * -offset < (centerPos.y - .25f) * -offset) {
intakeItem(itemEntity);
}
} else if (facing.getAxis() == Axis.Z) {
if (processingEntity.getZ() * -offset < (centerPos.z - .25f) * -offset) {
intakeItem(itemEntity);
}
} else {
if (processingEntity.getX() * -offset < (centerPos.x - .25f) * -offset) {
intakeItem(itemEntity);
}
}
}
private void intakeItem(ItemEntity itemEntity) {
inventory.clear();
inventory.setStackInSlot(0, itemEntity.getItem()
.copy());
itemInserted(inventory.getStackInSlot(0));
itemEntity.remove();
world.notifyBlockUpdate(pos, getBlockState(), getBlockState(), 2 | 16);
}
protected void spawnParticles(ItemStack stack) {
@ -169,14 +243,14 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity {
IParticleData particleData = null;
if (stack.getItem() instanceof BlockItem)
particleData = new BlockParticleData(ParticleTypes.BLOCK, ((BlockItem) stack.getItem()).getBlock()
.getDefaultState());
.getDefaultState());
else
particleData = new ItemParticleData(ParticleTypes.ITEM, stack);
Random r = world.rand;
for (int i = 0; i < 4; i++)
world.addParticle(particleData, pos.getX() + r.nextFloat(), pos.getY() + r.nextFloat(),
pos.getZ() + r.nextFloat(), 0, 0, 0);
pos.getZ() + r.nextFloat(), 0, 0, 0);
}
private void applyRecipe() {
@ -185,11 +259,11 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity {
List<ItemStack> list = new ArrayList<>();
if (recipe.isPresent()) {
int rolls = inventory.getStackInSlot(0)
.getCount();
.getCount();
inventory.clear();
for (int roll = 0; roll < rolls; roll++) {
List<ItemStack> rolledResults = recipe.get()
.rollResults();
.rollResults();
for (int i = 0; i < rolledResults.size(); i++) {
ItemStack stack = rolledResults.get(i);
ItemHelper.addToList(stack, list);
@ -238,7 +312,7 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity {
private void itemInserted(ItemStack stack) {
Optional<ProcessingRecipe<RecipeWrapper>> recipe = findRecipe();
inventory.remainingTime = recipe.isPresent() ? recipe.get()
.getProcessingDuration() : 100;
.getProcessingDuration() : 100;
inventory.appliedRecipe = false;
}

View file

@ -59,6 +59,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
protected Contraption contraption;
protected boolean initialized;
private boolean prevPosInvalid;
private boolean ticking;
public AbstractContraptionEntity(EntityType<?> entityTypeIn, World worldIn) {
super(entityTypeIn, worldIn);
@ -246,6 +247,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
if (!world.isRemote)
contraption.stalled = false;
ticking = true;
for (MutablePair<BlockInfo, MovementContext> pair : contraption.getActors()) {
MovementContext context = pair.right;
BlockInfo blockInfo = pair.left;
@ -265,13 +267,25 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
continue;
if (newPosVisited && !context.stall) {
actor.visitNewPosition(context, gridPosition);
if (!isAlive())
break;
context.firstMovement = false;
}
if (!oldMotion.equals(context.motion))
if (!oldMotion.equals(context.motion)) {
actor.onSpeedChanged(context, oldMotion, context.motion);
if (!isAlive())
break;
}
actor.tick(context);
if (!isAlive())
break;
contraption.stalled |= context.stall;
}
if (!isAlive()) {
contraption.stop(world);
return;
}
ticking = false;
for (Entity entity : getPassengers()) {
if (!(entity instanceof OrientedContraptionEntity))
@ -445,7 +459,8 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
@Override
public void remove(boolean keepData) {
if (!world.isRemote && !removed && contraption != null) {
contraption.stop(world);
if (!ticking)
contraption.stop(world);
}
super.remove(keepData);
}

View file

@ -46,6 +46,8 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity {
if (!(world.getBlockState(pos)
.getBlock() instanceof MechanicalPistonBlock))
return;
if (getMovementSpeed() == 0)
return;
Direction direction = getBlockState().get(BlockStateProperties.FACING);

View file

@ -41,6 +41,9 @@ public class Instruction {
case WAIT:
return (int) ((1 - initialProgress) * value + 1);
case PAUSED:
return -1;
case END:
default:
break;
@ -58,6 +61,7 @@ public class Instruction {
case END:
case WAIT:
case PAUSED:
default:
break;
@ -65,6 +69,15 @@ public class Instruction {
return 0;
}
OnIsPoweredResult onIsPowered() {
switch (instruction)
{
case PAUSED:
return OnIsPoweredResult.CONTINUE;
}
return OnIsPoweredResult.NOTHING;
}
public static ListNBT serializeAll(Vector<Instruction> instructions) {
ListNBT list = new ListNBT();
instructions.forEach(i -> list.add(i.serialize()));

View file

@ -0,0 +1,6 @@
package com.simibubi.create.content.contraptions.relays.advanced.sequencer;
public enum OnIsPoweredResult {
NOTHING,
CONTINUE
}

View file

@ -64,8 +64,11 @@ public class SequencedGearshiftBlock extends HorizontalAxisKineticBlock implemen
return;
boolean previouslyPowered = state.get(STATE) != 0;
if (previouslyPowered != worldIn.isBlockPowered(pos))
boolean isPowered = worldIn.isBlockPowered(pos);
if (previouslyPowered != isPowered)
withTileEntityDo(worldIn, pos, SequencedGearshiftTileEntity::onRedstoneUpdate);
else if (isPowered)
withTileEntityDo(worldIn, pos, SequencedGearshiftTileEntity::onIsPowered);
}
@Override

View file

@ -32,6 +32,8 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity {
return;
if (world.isRemote)
return;
if (currentInstructionDuration < 0)
return;
if (timer < currentInstructionDuration) {
timer++;
return;
@ -66,6 +68,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity {
public void onRedstoneUpdate() {
if (!isIdle())
return;
if (!world.isBlockPowered(pos)) {
world.setBlockState(pos, getBlockState().with(SequencedGearshiftBlock.STATE, 0), 3);
return;
@ -75,6 +78,19 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity {
run(0);
}
public void onIsPowered() {
Instruction instruction = getInstruction(currentInstruction);
if (instruction == null)
return;
switch (instruction.onIsPowered())
{
case CONTINUE:
run(currentInstruction + 1);
}
}
protected void run(int instructionIndex) {
Instruction instruction = getInstruction(instructionIndex);
if (instruction == null || instruction.instruction == SequencerInstructions.END) {

View file

@ -11,6 +11,7 @@ public enum SequencerInstructions {
TURN_ANGLE("angle", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 360, 45, 90),
TURN_DISTANCE("distance", AllGuiTextures.SEQUENCER_INSTRUCTION, true, true, 128, 5, 5),
WAIT("duration", AllGuiTextures.SEQUENCER_WAIT, true, false, 600, 20, 10),
PAUSED("", AllGuiTextures.SEQUENCER_PAUSED),
END("", AllGuiTextures.SEQUENCER_END),
;

View file

@ -0,0 +1,75 @@
package com.simibubi.create.content.contraptions.relays.belt.transport;
import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerBlock;
import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerTileEntity;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.items.ItemHandlerHelper;
public class BeltCrusherInteractionHandler {
public static boolean checkForCrushers(BeltInventory beltInventory, TransportedItemStack currentItem,
float nextOffset) {
boolean beltMovementPositive = beltInventory.beltMovementPositive;
int firstUpcomingSegment = (int) Math.floor(currentItem.beltPosition);
int step = beltMovementPositive ? 1 : -1;
firstUpcomingSegment = MathHelper.clamp(firstUpcomingSegment, 0, beltInventory.belt.beltLength - 1);
for (int segment = firstUpcomingSegment; beltMovementPositive ? segment <= nextOffset
: segment + 1 >= nextOffset; segment += step) {
BlockPos crusherPos = BeltHelper.getPositionForOffset(beltInventory.belt, segment)
.up();
World world = beltInventory.belt.getWorld();
BlockState crusherState = world.getBlockState(crusherPos);
if (!(crusherState.getBlock() instanceof CrushingWheelControllerBlock))
continue;
Direction crusherFacing = crusherState.get(CrushingWheelControllerBlock.FACING);
Direction movementFacing = beltInventory.belt.getMovementFacing();
if (crusherFacing != movementFacing)
continue;
float crusherEntry = segment + .5f;
crusherEntry += .399f * (beltMovementPositive ? -1 : 1);
float postCrusherEntry = crusherEntry + .799f * (!beltMovementPositive ? -1 : 1);
boolean hasCrossed = nextOffset > crusherEntry && nextOffset < postCrusherEntry && beltMovementPositive
|| nextOffset < crusherEntry && nextOffset > postCrusherEntry && !beltMovementPositive;
if (!hasCrossed)
return false;
currentItem.beltPosition = crusherEntry;
TileEntity te = world.getTileEntity(crusherPos);
if (!(te instanceof CrushingWheelControllerTileEntity))
return true;
CrushingWheelControllerTileEntity crusherTE = (CrushingWheelControllerTileEntity) te;
ItemStack toInsert = currentItem.stack.copy();
ItemStack remainder = ItemHandlerHelper.insertItemStacked(crusherTE.inventory, toInsert, false);
if (toInsert.equals(remainder, false))
return true;
int notFilled = currentItem.stack.getCount() - toInsert.getCount();
if (!remainder.isEmpty()) {
remainder.grow(notFilled);
} else if (notFilled > 0)
remainder = ItemHandlerHelper.copyStackWithSize(currentItem.stack, notFilled);
currentItem.stack = remainder;
beltInventory.belt.sendData();
return true;
}
return false;
}
}

View file

@ -151,6 +151,10 @@ public class BeltInventory {
if (BeltFunnelInteractionHandler.checkForFunnels(this, currentItem, nextOffset))
continue;
// Horizontal Crushing Wheels
if (BeltCrusherInteractionHandler.checkForCrushers(this, currentItem, nextOffset))
continue;
// Apply Movement
currentItem.beltPosition += limitedMovement;
currentItem.sideOffset +=

View file

@ -77,6 +77,8 @@ public class SandPaperItem extends Item {
AxisAlignedBB bb = new AxisAlignedBB(hitVec, hitVec).grow(1f);
ItemEntity pickUp = null;
for (ItemEntity itemEntity : worldIn.getEntitiesWithinAABB(ItemEntity.class, bb)) {
if (!itemEntity.isAlive())
continue;
if (itemEntity.getPositionVec()
.distanceTo(playerIn.getPositionVec()) > 3)
continue;

View file

@ -109,7 +109,7 @@ public class BlockzapperItem extends ZapperItem {
continue;
if (!selectedState.isValidPosition(world, placed))
continue;
if (!player.isCreative() && !canBreak(stack, world.getBlockState(placed), world, placed))
if (!player.isCreative() && !canBreak(stack, world.getBlockState(placed), world, placed,player))
continue;
if (!player.isCreative() && BlockHelper.findAndRemoveInInventory(selectedState, player, 1) == 0) {
player.getCooldownTracker()
@ -278,10 +278,13 @@ public class BlockzapperItem extends ZapperItem {
return list;
}
public static boolean canBreak(ItemStack stack, BlockState state, World world, BlockPos pos) {
public static boolean canBreak(ItemStack stack, BlockState state, World world, BlockPos pos,PlayerEntity player) {
ComponentTier tier = getTier(Components.Body, stack);
float blockHardness = state.getBlockHardness(world, pos);
//If we can't change the block (e.g chunk protection)
if (!isAllowedToPlace(world,pos,player)){
return false;
}
if (blockHardness == -1)
return false;
if (tier == ComponentTier.None)
@ -294,6 +297,14 @@ public class BlockzapperItem extends ZapperItem {
return false;
}
public static boolean isAllowedToPlace(World world, BlockPos pos,PlayerEntity player){
BlockSnapshot blocksnapshot = BlockSnapshot.getBlockSnapshot(world, pos);
if (ForgeEventFactory.onBlockPlace(player, blocksnapshot, Direction.UP)) {
return false;
}
return true;
}
public static int getMaxAoe(ItemStack stack) {
ComponentTier tier = getTier(Components.Amplifier, stack);
if (tier == ComponentTier.None)

View file

@ -54,6 +54,7 @@ public enum AllGuiTextures {
SEQUENCER_WAIT("sequencer.png", 0, 58, 162, 22),
SEQUENCER_END("sequencer.png", 0, 80, 162, 22),
SEQUENCER_EMPTY("sequencer.png", 0, 102, 162, 22),
SEQUENCER_PAUSED("sequencer.png", 0, 160, 162, 22),
// JEI
JEI_SLOT("jei/widgets.png", 18, 18),

View file

@ -174,7 +174,7 @@ public class ItemHelper {
if (!simulate && hasEnoughItems)
inv.extractItem(slot, stack.getCount(), false);
if (extracting.getCount() >= maxExtractionCount) {
if (extracting.getCount() >= maxExtractionCount || extracting.getCount() >= extracting.getMaxStackSize()) {
if (checkHasEnoughItems) {
hasEnoughItems = true;
checkHasEnoughItems = false;
@ -234,7 +234,7 @@ public class ItemHelper {
if (!simulate)
inv.extractItem(slot, stack.getCount(), false);
if (extracting.getCount() == maxExtractionCount)
if (extracting.getCount() >= maxExtractionCount || extracting.getCount() >= extracting.getMaxStackSize())
break;
}

View file

@ -59,7 +59,7 @@ public final class NBTProcessors {
TileEntityType<?> type = tileEntity.getType();
if (survival && survivalProcessors.containsKey(type))
compound = survivalProcessors.get(type).apply(compound);
if (processors.containsKey(type))
if (compound != null && processors.containsKey(type))
return processors.get(type).apply(compound);
if (tileEntity.onlyOpsCanSetNbt())
return null;

View file

@ -1,8 +1,8 @@
{
"_": "->------------------------] Game Elements [------------------------<-",
"block.create.acacia_window": "Akazienfenster",
"block.create.acacia_window_pane": "Akazienfensterscheibe",
"block.create.acacia_window": "Akazienholzfenster",
"block.create.acacia_window_pane": "Akazienholzfensterscheibe",
"block.create.adjustable_chain_gearshift": "Verstellbares Kettengetriebe",
"block.create.adjustable_crate": "Verstellbare Kiste",
"block.create.adjustable_pulse_repeater": "Verstellbarer Pulsverstärker",
@ -24,6 +24,8 @@
"block.create.andesite_tunnel": "Andesittunnel",
"block.create.basin": "Behälter",
"block.create.belt": "Mechanischer Riemen",
"block.create.birch_window": "Birkenholzfenster",
"block.create.birch_window_pane": "Birkenholzfensterscheibe",
"block.create.black_sail": "Schwarzes Segel",
"block.create.black_seat": "Schwarzer Sitz",
"block.create.black_valve_handle": "Schwarzer Ventilgriff",
@ -52,7 +54,7 @@
"block.create.clockwork_bearing": "Uhrwerk-Lager",
"block.create.clutch": "Kupplung",
"block.create.cogwheel": "Zahnrad",
"block.create.content_observer": "Inhalts Beobachter",
"block.create.content_observer": "Inhaltsbeobachter",
"block.create.controller_rail": "Steureungsschiene",
"block.create.copper_block": "Kupfer Block",
"block.create.copper_casing": "Kupferrahmen",
@ -113,43 +115,138 @@
"block.create.fancy_dark_scoria_bricks_slab": "Schicke dunkle Schlackenziegelstufe",
"block.create.fancy_dark_scoria_bricks_stairs": "Schicke dunkle Schlackenziegeltreppe",
"block.create.fancy_dark_scoria_bricks_wall": "Schicke dunkle Schlackenziegelmauer",
"block.create.fluid_pipe": "Wasserrohr",
"block.create.fluid_tank": "Wassertank",
"block.create.fancy_diorite_bricks": "Schöne Dioritziegel",
"block.create.fancy_diorite_bricks_slab": "Schöne Dioritziegelstufe",
"block.create.fancy_diorite_bricks_stairs": "Schöne Dioritziegeltreppe",
"block.create.fancy_diorite_bricks_wall": "Schöne Dioritziegelmauer",
"block.create.fancy_dolomite_bricks": "Schöne Dolomitziegel",
"block.create.fancy_dolomite_bricks_slab": "Schöne Dolomitziegelstufe",
"block.create.fancy_dolomite_bricks_stairs": "Schöne Dolomitziegeltreppe",
"block.create.fancy_dolomite_bricks_wall": "Schöne Dolomitziegelmauer",
"block.create.fancy_gabbro_bricks": "Schöne Gabelsteinziegel",
"block.create.fancy_gabbro_bricks_slab": "Schöne Gabelsteinziegelstufe",
"block.create.fancy_gabbro_bricks_stairs": "Schöne Gabelsteinziegeltreppe",
"block.create.fancy_gabbro_bricks_wall": "Schöne Gabelsteinziegelmauer",
"block.create.fancy_granite_bricks": "Schöne Granitziegel",
"block.create.fancy_granite_bricks_slab": "Schöne Granitziegelstufe",
"block.create.fancy_granite_bricks_stairs": "Schöne Granitziegeltreppe",
"block.create.fancy_granite_bricks_wall": "Schöne Granitziegelmauer",
"block.create.fancy_limestone_bricks": "Schöne Kalksteinziegel",
"block.create.fancy_limestone_bricks_slab": "Schöne Kalksteinziegelstufe",
"block.create.fancy_limestone_bricks_stairs": "Schöne Kalksteinziegeltreppe",
"block.create.fancy_limestone_bricks_wall": "Schöne Kalksteinziegelmauer",
"block.create.fancy_scoria_bricks": "Schöne Schlackenziegel",
"block.create.fancy_scoria_bricks_slab": "Schöne Schlackenziegelstufe",
"block.create.fancy_scoria_bricks_stairs": "Schöne Schlackenziegeltreppe",
"block.create.fancy_scoria_bricks_wall": "Schöne Schlackenziegelmauer",
"block.create.fancy_weathered_limestone_bricks": "Schöne Verwitterte Kalksteinziegel",
"block.create.fancy_weathered_limestone_bricks_slab": "Schöne Verwitterte Kalksteinziegelstufe",
"block.create.fancy_weathered_limestone_bricks_stairs": "Schöne Verwitterte Kalksteinziegeltreppe",
"block.create.fancy_weathered_limestone_bricks_wall": "Schöne Verwitterte Kalksteinziegelmauer",
"block.create.fluid_pipe": "Flüssigkeitsrohr",
"block.create.fluid_tank": "Flüssigkeitstank",
"block.create.fluid_valve": "Flüssigkeitsventil",
"block.create.flywheel": "Schwungrad",
"block.create.framed_glass": "Gerahmtes Glas",
"block.create.framed_glass_pane": "Gerahmte Glasscheibe",
"block.create.gabbro": "Gabbro",
"block.create.gabbro_bricks": "Gabbroziegel",
"block.create.gabbro_bricks_stairs": "Gabbroziegeltreppe",
"block.create.gabbro_bricks_wall": "Gabbroziegelmauer",
"block.create.gabbro_bricks_slab": "Gabbroziegelstufe",
"block.create.furnace_engine": "Ofenmotor",
"block.create.gabbro": "Gabelstein",
"block.create.gabbro_bricks": "Gabelsteinziegel",
"block.create.gabbro_bricks_slab": "Gabelsteinziegelstufe",
"block.create.gabbro_bricks_stairs": "Gabelsteinziegeltreppe",
"block.create.gabbro_bricks_wall": "Gabelsteinziegelmauer",
"block.create.gabbro_cobblestone": "Gabelsteinbruchstein",
"block.create.gabbro_cobblestone_slab": "Gabelsteinbruchstein",
"block.create.gabbro_cobblestone_stairs": "Gabelsteinbruchstein",
"block.create.gabbro_cobblestone_wall": "Gabelsteinbruchstein",
"block.create.gabbro_pillar": "Gabelsteinsäule",
"block.create.gearbox": "Getriebe",
"block.create.gearshift": "Gangschaltung",
"block.create.glass_fluid_pipe": "Glaswasserrohr",
"block.create.granite_bricks": "Granitziegel",
"block.create.granite_bricks_slab": "Granitziegelstufe",
"block.create.granite_bricks_stairs": "Granitziegeltreppe",
"block.create.granite_bricks_wall": "Granitziegelmauer",
"block.create.granite_cobblestone": "Granitbruchstein",
"block.create.granite_cobblestone_slab": "Granitbruchsteinstufe",
"block.create.granite_cobblestone_stairs": "Granitbruchtreppe",
"block.create.granite_cobblestone_wall": "Granitbruchsteinmauer",
"block.create.granite_pillar": "Granitsäule",
"block.create.gray_sail": "Graues Segel",
"block.create.gray_seat": "Grauer Sitz",
"block.create.gray_valve_handle": "Grauer Ventilgriff",
"block.create.green_sail": "Grünes Segel",
"block.create.green_seat": "Grüner Sitz",
"block.create.green_valve_handle": "Grüner Ventilgriff",
"block.create.hand_crank": "Handkurbel",
"block.create.honey": "Honig",
"block.create.horizontal_framed_glass": "Horizontal Gerahmes Glas",
"block.create.horizontal_framed_glass_pane": "Horizontal Gerahmte Glasscheibe",
"block.create.hose_pulley": "Umlenkrolle",
"block.create.item_drain": "Abfluss",
"block.create.jungle_window": "Tropenholzfenster",
"block.create.jungle_window_pane": "Tropenholzfensterscheib",
"block.create.large_cogwheel": "Großes Zahnrad",
"block.create.layered_andesite": "Geschichteter Andesit",
"block.create.layered_dark_scoria": "Geschichtete Dunkle Schlacke",
"block.create.layered_diorite": "Geschichteter Diorit",
"block.create.layered_dolomite": "Geschichteter Dolomit",
"block.create.layered_gabbro": "Geschichteter Gabelstein",
"block.create.layered_granite": "Geschichteter Granit",
"block.create.layered_limestone": "Geschichteter Kalkstein",
"block.create.layered_scoria": "Geschichtete Schlacke",
"block.create.layered_weathered_limestone": "Geschichteter Verwitterter Kalkstein",
"block.create.light_blue_sail": "Hellblaues Segel",
"block.create.light_blue_seat": "Hellblauer Sitz",
"block.create.light_blue_valve_handle": "Hellblauer Ventilgriff",
"block.create.light_gray_sail": "Hellgraues Segel",
"block.create.light_gray_seat": "Hellgrauer Sitz",
"block.create.light_gray_valve_handle": "Hellgrauer Ventilgriff",
"block.create.lime_sail": "Hellgrünes Segel",
"block.create.lime_seat": "Hellgrüner Sitz",
"block.create.lime_valve_handle": "Hellgrüner Ventilgriff",
"block.create.limesand": "Kalksand",
"block.create.limestone": "Kalkstein",
"block.create.limestone_bricks": "Kalksteinziegel",
"block.create.limestone_bricks_slab": "Kalksteinziegelstufe",
"block.create.limestone_bricks_stairs": "Kalksteinziegeltreppe",
"block.create.limestone_bricks_wall": "Kalksteinziegelmauer",
"block.create.limestone_cobblestone": "Kalkbruchstein",
"block.create.limestone_cobblestone_slab": "Kalkbruchsteinstufe",
"block.create.limestone_cobblestone_stairs": "Kalkbruchsteintreppe",
"block.create.limestone_cobblestone_wall": "Kalkbruchsteinmauer",
"block.create.limestone_pillar": "Kalksteinsäule",
"block.create.linear_chassis": "Schubgerüst",
"block.create.lit_blaze_burner": "Aktiver Lohenbrenner",
"block.create.magenta_sail": "Magenta Segel",
"block.create.magenta_seat": "Magenta Sitz",
"block.create.magenta_valve_handle": "Magenta Ventilgriff",
"block.create.mechanical_arm": "Mechanischer Arm",
"block.create.mechanical_bearing": "Mechanisches Lager",
"block.create.mechanical_crafter": "Mechanische Handwerkseinheit",
"block.create.mechanical_drill": "Mechanischer Bohrer",
"block.create.mechanical_harvester": "Mechanische Erntemaschine",
"block.create.mechanical_mixer": "Mechanischer Mixer",
"block.create.mechanical_piston": "Mechanischer Kolben",
"block.create.mechanical_piston_head": "Mechanisches Kolbenende",
"block.create.mechanical_plough": "Mechanischer Pflug",
"block.create.mechanical_press": "Mechanische Presse",
"block.create.mechanical_pump": "Mechanische Pumpe",
"block.create.mechanical_saw": "Mechanische Säge",
"block.create.metal_bracket": "Metallhalterung",
"block.create.millstone": "Mahlstein",
"block.create.pink_sail": "Rosa Segel",
"block.create.pink_seat": "Rosa Sitz",
"block.create.pink_valve_handle": "Rosa Ventilgriff",
"block.create.piston_extension_pole": "Kolben-Pleuelverlängerung",
"block.create.polished_dolomite": "Polierter Dolomit",
"block.create.polished_gabbro": "Polierter Gabbro",
"block.create.polished_gabbro": "Polierter Gabelstein",
"block.create.polished_limestone": "Polierter Kalkstein",
"block.create.polished_limestone_slab": "Polierte Kalksteinstufe",
"block.create.polished_scoria": "Polierte Schlacke",
"block.create.polished_weathered_limestone": "Polierter Verwitterter Kalkstein",
"block.create.polished_weathered_limestone_slab": "Polierte Verwitterte Kalksteinstufe",
"block.create.powered_latch": "UNLOCALIZED: Powered Latch",
"block.create.pulse_repeater": "Pulsierender Verstärker",
"block.create.radial_chassis": "Drehgerüst",
"block.create.redstone_contact": "Redstone-Kontakt",
@ -170,19 +267,30 @@
"block.create.weathered_limestone_bricks_wall": "Verwitterte Kalksteinziegelmauer",
"block.create.weathered_limestone_pillar": "Verwitterte Kalksteinsäule",
"fluid.create.milk": "Milch",
"fluid.create.potion": "Trank",
"fluid.create.tea": "Bauherrentee",
"item.create.bar_of_chocolate": "Schokoladetafel",
"item.create.belt_connector": "Mechanischer Riemen",
"item.create.deforester": "Entforster",
"item.create.dough": "Teig",
"item.create.empty_schematic": "Leerer Bauplan",
"item.create.filter": "Filter",
"item.create.handheld_blockzapper": "Blockpistole",
"item.create.handheld_worldshaper": "Geländeformer",
"item.create.honey_bucket": "Honigeimer",
"item.create.iron_sheet": "Eisenblech",
"item.create.propeller": "Propeller",
"item.create.red_sand_paper": "Rotes Schmirgelpapier",
"item.create.rose_quartz": "Rosenquarz",
"item.create.sand_paper": "Schmirgelpapier",
"item.create.schematic": "Bauplan",
"item.create.schematic_and_quill": "Bauplan und Feder",
"item.create.super_glue": "Superkleber",
"item.create.tree_fertilizer": "Baumdünger",
"item.create.wand_of_symmetry": "Symmetriestab",
"item.create.wheat_flour": "Weizenmehl",
"item.create.wrench": "Schraubenschlüssel",
"item.create.zinc_ingot": "Zinkbarren",
"item.create.zinc_nugget": "Zinkklumpen",
@ -203,19 +311,32 @@
"advancement.create.belt": "Befördere es alles",
"advancement.create.belt.desc": "Verbinde zwei Wllen mit einem Mechanischem Riemen",
"_": "->------------------------] UI & Messages [------------------------<-",
"itemGroup.create.base": "Create",
"itemGroup.create.palettes": "Create Paletten",
"death.attack.create.crush": "%1$s stolperte in ein Mahlwerk",
"death.attack.create.fan_fire": "%1$s hat heiße Luft eingeatmet",
"death.attack.create.fan_lava": "%1$s wurde von Lava verweht",
"death.attack.create.mechanical_drill": "%1$s wurde von einem Bohrer durchlöchert",
"death.attack.create.mechanical_saw": "%1$s wurde zersägt",
"death.attack.create.cuckoo_clock_explosion": "%1$s wurde durch eine falsche Kuckucksuhr gesprengt",
"create.block.deployer.damage_source_name": "einem Finger",
"create.recipe.crushing": "Mahlen",
"create.recipe.crushing": "Mahlen (Mahlwerk)",
"create.recipe.milling": "Mahlen (Mahlstein)",
"create.recipe.pressing": "Mechanische Presse",
"create.recipe.mixing": "Mixen",
"create.recipe.sawing": "Sägen",
"create.recipe.blockzapper_upgrade": "Blockpistole",
"create.recipe.sandpaper_polishing": "Schleifen",
"create.recipe.processing.chance": "Chance: %1$s%%",
"create.recipe.heat_requirement.none": "Keine Hitze benötigt",
"create.recipe.heat_requirement.heated": "Wenig Hitze benötigt",
"create.recipe.heat_requirement.superheated": "Viel Hitze benötigt",
"create.generic.range": "Reichweite",
"create.generic.radius": "Radius",
@ -224,6 +345,12 @@
"create.generic.unit.ticks": "Ticks",
"create.generic.unit.seconds": "Sekunden",
"create.generic.unit.minutes": "Minuten",
"create.generic.unit.rpm": "RPM",
"create.generic.unit.stress": "su",
"create.generic.unit.degrees": "°",
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "Uhrzeigersinn",
"create.generic.counter_clockwise": "Gegen-Uhrzeigersinn",
"create.action.scroll": "Wechseln",
"create.action.confirm": "Bestätigen",
@ -266,7 +393,6 @@
"create.gui.blockzapper.pattern.chance50": "50%-Chance",
"create.gui.blockzapper.pattern.chance75": "75%-Chance",
"create.blockzapper.usingBlock": "Auswahl: %1$s",
"create.blockzapper.componentUpgrades": "Bauteil-Upgrades:",
"create.blockzapper.component.body": "Rumpf",
@ -275,16 +401,16 @@
"create.blockzapper.component.retriever": "Empfänger",
"create.blockzapper.component.scope": "Fernrohr",
"create.blockzapper.componentTier.none": "Nichts",
"create.blockzapper.componentTier.brass": "Messing",
"create.blockzapper.leftClickToSet": "Linksklick auf einen Block zum Auswählen",
"create.blockzapper.empty": "Keine Blöcke übrig!",
"create.logistics.filter": "Filter",
"create.logistics.recipe_filter": "Rezeptfilter",
"create.logistics.fluid_filter": "Flüssigkeitsfilter",
"create.logistics.firstFrequency": "Freq. #1",
"create.logistics.secondFrequency": "Freq. #2",
"create.gui.adjustable_crate.title": "adjustable_crate",
"create.gui.adjustable_crate.storageSpace": "Lagerraum",
"create.gui.stockpile_switch.title": "Vorratssensor",
@ -293,6 +419,7 @@
"create.schematicAndQuill.secondPos": "Zweite Position festgelegt.",
"create.schematicAndQuill.noTarget": "Halte [Strg] zur Auswahl von Luft.",
"create.schematicAndQuill.abort": "Auswahl zurückgesetzt.",
"create.schematicAndQuill.title": "Bauplanname:",
"create.schematicAndQuill.fallbackName": "Mein Bauplan",
"create.schematicAndQuill.saved": "Gespeichert als %1$s",
@ -388,7 +515,7 @@
"create.tooltip.holdKey": "Halte [%1$s]",
"create.tooltip.holdKeyOrKey": "Halte [%1$s] oder [%2$s]",
"create.tooltip.keyShift": "Shift",
"create.tooltip.keyCtrl": "Strg",
"create.tooltip.keyCtrl": "Strg"
"_": "->------------------------] Item Descriptions [------------------------<-",
@ -421,12 +548,11 @@
"item.create.handheld_blockzapper.tooltip.action2": "_Platziert_ oder _Ersetzt_ den ausgewählten Block.",
"item.create.handheld_blockzapper.tooltip.control3": "R-Klick beim Schleichen",
"item.create.handheld_blockzapper.tooltip.action3": "Öffnet das _Konfigurationsmenü_",
"item.create.tree_fertilizer.tooltip": "BAUMDÜNGER",
"item.create.tree_fertilizer.tooltip.summary": "Eine Mischung aus Mineralien, die sich für weit verbreitete Baumarten eignet",
"item.create.tree_fertilizer.tooltip.condition1": "Wenn auf einen Setzling angewendet",
"item.create.tree_fertilizer.tooltip.behaviour1": "Lässt Bäume unabhängig vom Platz um sie herum wachsen",
"item.create.empty_schematic.tooltip": "LEERER BAUPLAN",
"item.create.empty_schematic.tooltip.summary": "Wird für die Herstellung und das Schreiben auf dem _Bauplantisch_ verwendet",
@ -518,6 +644,8 @@
"block.create.mechanical_press.tooltip.behaviour1": "_Fängt_ _an_, Gegenstände, die darunter liegen, zusammenzudrücken.",
"block.create.mechanical_press.tooltip.condition2": "Wenn über einem Mechanischem Riemen",
"block.create.mechanical_press.tooltip.behaviour2": "Presst _automatisch_ alle auf dem Riemen vorbeigeführten Gegenstände zusammen.",
"block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin",
"block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact items_ in the basin whenever all necessary ingredients are present.",
"block.create.mechanical_piston.tooltip": "MECHANISCHER KOLBEN",
"block.create.mechanical_piston.tooltip.summary": "Eine fortgeschrittene Version des _Kolbens,_ welcher _Rotationsenergie_ benutzt, um verbundene Strukturen präzise zu bewegen. _Kolben-Pleuelverlängerungen_ auf der Hinterseite bestimmen die _Reichweite_ des Kolbens. Ohne Verlängerungen bewegt sich dieser nicht. Verwende ein _Schubgerüst,_ um mehr als nur eine Reihe von Blöcken zu bewegen.",
@ -538,6 +666,8 @@
"block.create.linear_chassis.tooltip.summary": "Eine konfigurierbare Basis für Strukturen, die durch _Mechanische_ _Kolben_ bewegt werden sollen. Diese Blöcke müssen die erste Reihe von Blöcken vor dem Kloben bilden.",
"block.create.linear_chassis.tooltip.condition1": "Wenn durch einen Mechanischen Kolben bewegt",
"block.create.linear_chassis.tooltip.behaviour1": "_Bewegt_ alle _verbundenen_ _Gerüste_ mit der gleichen Orientierung, und angebrachte Blöcke davor. Wenn der Kolben zurückgezogen wird, werden Blöcke nur zurückgezogen, wenn die Fläche des Gerüsts _klebrig_ ist (Siehe [Strg]).",
"block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench",
"block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.",
"block.create.linear_chassis.tooltip.control1": "Wenn mit einem Schleimball R-geklickt",
"block.create.linear_chassis.tooltip.action1": "Lässt die Oberfläche _klebrig_ werden. Wenn der Kolben zurückgezogen wird, _zieht_ das Gerüst alle verbundenen Blöcke _zurück_ in seine Spalte und innerhalb der konfigurierten Reichweite.",
@ -545,6 +675,8 @@
"block.create.radial_chassis.tooltip.summary": "Wird für das Drehen von Strukturen mit dem _Mechanischem_ _Lager_ benutzt.",
"block.create.radial_chassis.tooltip.condition1": "Wenn durch ein Lager gedreht",
"block.create.radial_chassis.tooltip.behaviour1": "_Dreht_ alle an _klebrigen_ Seiten angebrachten Blöcke (Siehe [Strg]) innerhalb der konfigurierten Reichweite um sich. _Überträgt_ die Rotation zu weiter angebrachten Rotationsgerüsten.",
"block.create.radial_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench",
"block.create.radial_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.",
"block.create.radial_chassis.tooltip.control1": "Wenn mit einem Schleimball R-geklickt",
"block.create.radial_chassis.tooltip.action1": "Lässt die geklickte Fläche _klebrig_ werden. Wenn das Gerüst gedreht wird, werden alle verbundenen Blöcke an dieser Seite mit dem Gerüst mitgedreht.",
@ -588,6 +720,8 @@
"block.create.creative_crate.tooltip": "BAUPLANKANONENMACHER",
"block.create.creative_crate.tooltip.summary": "Stellt einen unendlichen Vorrat an Blöcken für benachbarte _Bauplaenkanonen_ bereit.",
"block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot",
"block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless supply_ of the item specified. Items _inserted_ into this crate will be _voided._",
"block.create.pulse_repeater.tooltip": "PULSIERENDER VERSTÄRKER",
"block.create.pulse_repeater.tooltip.summary": "Ein einfacher Schaltkreis, um durchgehende Redstone-Signale auf eine Länge von _1_ _tick_ zu reduzieren.",
@ -595,6 +729,9 @@
"block.create.adjustable_repeater.tooltip": "VERZÖGERNDER VERSTÄRKER",
"block.create.adjustable_repeater.tooltip.summary": "Ein fortgeschrittener _Redstone-Verstärker_ mit einer _konfigurierbaren_ _Verzögerung_ von bis zu 30 Minuten.",
"create.tooltip.wip": "WIP",
"create.tooltip.workInProgress": "Work in progress!",
"_": "Thank you for translating Create!"
}

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 17 KiB