Bug Busting 0.1 Part II

- Removed WIP Items from Creative Tab
- Added option to disable tooltips
- Moved common config values to synced serverconfig
- Numbers on Scrollable Blocks are centered
- Motors can be configured to rotate with negative speed
- Fixed Processing Recipes Serializer (severe)
- Fixed Moving constructs not rendering at a reasonable distance
- Mechanical Bearing always solidifies when empty
- Fixed some movement incosistencies with translation constructs
- Fixed Crushing Wheel Controller not stopping when Wheels do
- Fixed Crushing Wheels ejecting entities on world reload
- Fixed Movement inconsistencies with Mechanical Belts
- Added rotation propagation through large cogwheels connected at a 90 degree angle
- Fixed Client code being called server side
- Fixed Abstract Method errors regarding Extractors and FrequencyHolders
- Added a unit character to Flexpeater display
- Fixed additional washing outputs from flying all over the place
- Schematicannon now ignores Structure Void blocks
- Fixed Schematic hologram not displaying
- Added little indicators to the Mechanical Bearing to visualize curent angle
- Bumped version
This commit is contained in:
simibubi 2019-09-18 11:16:57 +02:00
parent 5c8206030c
commit 687e96135a
34 changed files with 311 additions and 130 deletions

View File

@ -20,7 +20,7 @@ archivesBaseName = 'create'
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8'
minecraft {
mappings channel: 'snapshot', version: '20190910-1.14.3'
mappings channel: 'snapshot', version: '20190917-1.14.3'
runs {
client {
@ -34,7 +34,7 @@ minecraft {
}
server {
workingDirectory project.file('run')
workingDirectory project.file('run/server')
property 'forge.logging.console.level', 'info'
mods {
create {
@ -71,7 +71,7 @@ repositories {
}
dependencies {
minecraft 'net.minecraftforge:forge:1.14.4-28.0.102'
minecraft 'net.minecraftforge:forge:1.14.4-28.1.6'
// compile against the JEI API but do not include it at runtime
compileOnly fg.deobf("mezz.jei:jei-1.14.4:6.0.0.10:api")

View File

@ -46,11 +46,11 @@ public enum AllItems {
ANDESITE_ALLOY_CUBE(ingredient()),
BLAZE_BRASS_CUBE(ingredient()),
CHORUS_CHROME_CUBE(ingredient(Rarity.UNCOMMON)),
SHADOW_STEEL_CUBE(ingredient(Rarity.UNCOMMON)),
ROSE_QUARTZ(ingredient()),
REFINED_ROSE_QUARTZ(ingredient()),
CHROMATIC_COMPOUND_CUBE(new ChromaticCompoundCubeItem(standardItemProperties().rarity(Rarity.UNCOMMON))),
REFINED_RADIANCE_CUBE(ingredient(Rarity.RARE)),
SHADOW_STEEL_CUBE(new Item(new Properties().rarity(Rarity.UNCOMMON))),
ROSE_QUARTZ(new Item(new Properties())),
REFINED_ROSE_QUARTZ(new Item(new Properties())),
CHROMATIC_COMPOUND_CUBE(new ChromaticCompoundCubeItem(new Properties().rarity(Rarity.UNCOMMON))),
REFINED_RADIANCE_CUBE(new Item(new Properties().rarity(Rarity.UNCOMMON))),
// BLAZING_PICKAXE(new BlazingToolItem(1, -2.8F, standardProperties(), PICKAXE)),
// BLAZING_SHOVEL(new BlazingToolItem(1.5F, -3.0F, standardProperties(), SHOVEL)),

View File

@ -109,6 +109,9 @@ public class ClientEvents {
@SubscribeEvent
public static void addToItemTooltip(ItemTooltipEvent event) {
if (!CreateClientConfig.instance.enableTooltips.get())
return;
ItemStack stack = event.getItemStack();
String translationKey = stack.getItem().getTranslationKey(stack);
if (!translationKey.startsWith(itemPrefix) && !translationKey.startsWith(blockPrefix))

View File

@ -39,7 +39,7 @@ public class Create {
public static ModConfig config;
public Create() {
ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, CreateConfig.specification);
ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, CreateConfig.specification);
ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, CreateClientConfig.specification);
}

View File

@ -3,6 +3,7 @@ package com.simibubi.create;
import org.apache.commons.lang3.tuple.Pair;
import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.common.ForgeConfigSpec.BooleanValue;
public class CreateClientConfig {
@ -17,8 +18,15 @@ public class CreateClientConfig {
instance = specPair.getLeft();
}
public BooleanValue enableTooltips;
CreateClientConfig(final ForgeConfigSpec.Builder builder) {
builder.comment("Client-only settings").push("client");
builder.comment("Client-only settings - If you're looking for server/common settings, look inside your worlds serverconfig folder!").push("client");
String basePath = "create.config.client.";
String name = "enableTooltips";
enableTooltips = builder.comment("", "Show item descriptions on Shift and controls on Ctrl.")
.translation(basePath + name).define(name, true);
builder.pop();
}

View File

@ -46,6 +46,10 @@ public interface IBlockWithScrollableValue {
return false;
}
public default String getValueSuffix(BlockState state, IWorld world, BlockPos pos) {
return "";
}
@SubscribeEvent
@OnlyIn(Dist.CLIENT)
public static void onDrawBlockHighlight(DrawBlockHighlightEvent event) {
@ -141,12 +145,18 @@ public interface IBlockWithScrollableValue {
GlStateManager.popMatrix();
}
String numberText = block.getCurrentValue(state, world, blockPos) + "";
String numberText = block.getCurrentValue(state, world, blockPos)
+ block.getValueSuffix(state, world, blockPos);
int stringWidth = mc.fontRenderer.getStringWidth(numberText);
float numberScale = 4 / 128f * (6f / stringWidth);
GlStateManager.translated(7 / 64f, -5 / 64f, 0);
float numberScale = 4 / 128f * ((float) mc.fontRenderer.FONT_HEIGHT / stringWidth);
boolean singleDigit = stringWidth < 10;
if (singleDigit)
numberScale = numberScale / 2;
GlStateManager.translated(4 / 64f, -5 / 64f, 0);
GlStateManager.scaled(numberScale, -numberScale, numberScale);
float verticalMargin = (stringWidth - mc.fontRenderer.FONT_HEIGHT) / 2f;
GlStateManager.translated(singleDigit ? stringWidth / 2 : 0, singleDigit ? -verticalMargin : verticalMargin, 0);
mc.fontRenderer.drawString(numberText, 0, 0, 0xFFFFFF);
GlStateManager.translated(0, 0, -1 / 4f);

View File

@ -1,9 +1,12 @@
package com.simibubi.create.foundation.item;
import net.minecraft.client.renderer.color.IItemColor;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public interface IItemWithColorHandler {
@OnlyIn(value = Dist.CLIENT)
public IItemColor getColorHandler();
}

View File

@ -44,7 +44,7 @@ public class ModuleLoadedCondition implements ICondition {
public ModuleLoadedCondition read(JsonObject json) {
return new ModuleLoadedCondition(JSONUtils.getString(json, "module"));
}
@Override
public ResourceLocation getID() {
return NAME;

View File

@ -1,6 +1,11 @@
package com.simibubi.create.modules.contraptions;
import static com.simibubi.create.AllBlocks.BELT;
import static com.simibubi.create.AllBlocks.COGWHEEL;
import static com.simibubi.create.AllBlocks.ENCASED_FAN;
import static com.simibubi.create.AllBlocks.LARGE_COGWHEEL;
import static com.simibubi.create.CreateConfig.parameters;
import static net.minecraft.state.properties.BlockStateProperties.AXIS;
import java.util.LinkedList;
import java.util.List;
@ -15,8 +20,6 @@ import com.simibubi.create.modules.contraptions.relays.SplitShaftTileEntity;
import com.simibubi.create.modules.contraptions.relays.belt.BeltTileEntity;
import net.minecraft.block.BlockState;
import net.minecraft.state.IProperty;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
@ -42,7 +45,6 @@ public class RotationPropagator {
final Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ());
final World world = from.getWorld();
IProperty<Axis> axisProperty = BlockStateProperties.AXIS;
boolean connectedByAxis = definitionFrom.hasShaftTowards(world, from.getPos(), stateFrom, direction)
&& definitionTo.hasShaftTowards(world, to.getPos(), stateTo, direction.getOpposite());
boolean connectedByGears = definitionFrom.hasCogsTowards(world, from.getPos(), stateFrom, direction)
@ -71,11 +73,21 @@ public class RotationPropagator {
}
// Attached Fans
if (AllBlocks.ENCASED_FAN.typeOf(stateFrom) && AllBlocks.ENCASED_FAN.typeOf(stateTo)) {
if (stateFrom.get(BlockStateProperties.AXIS) == stateTo.get(BlockStateProperties.AXIS))
if (ENCASED_FAN.typeOf(stateFrom) && ENCASED_FAN.typeOf(stateTo)) {
if (stateFrom.get(AXIS) == stateTo.get(AXIS))
return 1;
}
// Large Gear <-> Large Gear
if (isLargeToLargeGear(stateFrom, stateTo, diff)) {
Axis sourceAxis = stateFrom.get(AXIS);
Axis targetAxis = stateTo.get(AXIS);
int sourceAxisDiff = sourceAxis.getCoordinate(diff.getX(), diff.getY(), diff.getZ());
int targetAxisDiff = targetAxis.getCoordinate(diff.getX(), diff.getY(), diff.getZ());
return sourceAxisDiff > 0 ^ targetAxisDiff > 0 ? -1 : 1;
}
// Gear <-> Large Gear
if (isLargeToSmallGear(stateFrom, stateTo, diff))
return -2f;
@ -86,15 +98,34 @@ public class RotationPropagator {
if (connectedByGears) {
if (diff.manhattanDistance(BlockPos.ZERO) != 1)
return 0;
if (AllBlocks.LARGE_COGWHEEL.typeOf(stateTo))
if (LARGE_COGWHEEL.typeOf(stateTo))
return 0;
if (stateFrom.get(axisProperty) == stateTo.get(axisProperty))
if (stateFrom.get(AXIS) == stateTo.get(AXIS))
return -1;
}
return 0;
}
private static boolean isLargeToLargeGear(BlockState from, BlockState to, BlockPos diff) {
if (!LARGE_COGWHEEL.typeOf(from) || !LARGE_COGWHEEL.typeOf(to))
return false;
Axis fromAxis = from.get(AXIS);
Axis toAxis = to.get(AXIS);
if (fromAxis == toAxis)
return false;
for (Axis axis : Axis.values()) {
int axisDiff = axis.getCoordinate(diff.getX(), diff.getY(), diff.getZ());
if (axis == fromAxis || axis == toAxis) {
if (axisDiff == 0)
return false;
} else if (axisDiff != 0)
return false;
}
return true;
}
private static float getAxisModifier(KineticTileEntity te, Direction direction) {
if (!te.hasSource())
return 1;
@ -111,10 +142,10 @@ public class RotationPropagator {
}
private static boolean isLargeToSmallGear(BlockState from, BlockState to, final BlockPos diff) {
if (!AllBlocks.LARGE_COGWHEEL.typeOf(from) || !AllBlocks.COGWHEEL.typeOf(to))
if (!LARGE_COGWHEEL.typeOf(from) || !COGWHEEL.typeOf(to))
return false;
Axis axisFrom = from.get(BlockStateProperties.AXIS);
if (axisFrom != to.get(BlockStateProperties.AXIS))
Axis axisFrom = from.get(AXIS);
if (axisFrom != to.get(AXIS))
return false;
if (axisFrom.getCoordinate(diff.getX(), diff.getY(), diff.getZ()) != 0)
return false;
@ -309,12 +340,13 @@ public class RotationPropagator {
// Some Blocks can interface diagonally
BlockState blockState = te.getBlockState();
if (AllBlocks.COGWHEEL.typeOf(blockState) || AllBlocks.LARGE_COGWHEEL.typeOf(blockState)
|| AllBlocks.BELT.typeOf(blockState)) {
boolean isLargeWheel = LARGE_COGWHEEL.typeOf(blockState);
if (COGWHEEL.typeOf(blockState) || isLargeWheel || BELT.typeOf(blockState)) {
Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
BlockPos.getAllInBox(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1)).forEach(offset -> {
if (axis.getCoordinate(offset.getX(), offset.getY(), offset.getZ()) != 0)
if (!isLargeWheel && axis.getCoordinate(offset.getX(), offset.getY(), offset.getZ()) != 0)
return;
if (offset.distanceSq(0, 0, 0, false) != BlockPos.ZERO.distanceSq(1, 1, 0, false))
return;
@ -324,7 +356,7 @@ public class RotationPropagator {
return neighbours;
}
public static boolean isFrozen() {
return CreateConfig.parameters.freezeRotationPropagator.get();
}

View File

@ -42,7 +42,7 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
ItemStack itemstack = new ItemStack(Registry.ITEM.getOrDefault(new ResourceLocation(s1)), i);
results.add(new StochasticOutput(itemstack, chance));
}
int duration = JSONUtils.getInt(json, "processingTime");
return this.factory.create(recipeId, s, ingredients, results, duration);
@ -52,13 +52,15 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
String s = buffer.readString(32767);
List<Ingredient> ingredients = new ArrayList<>();
for (int i = 0; i < buffer.readInt(); i++)
int ingredientCount = buffer.readInt();
for (int i = 0; i < ingredientCount; i++)
ingredients.add(Ingredient.read(buffer));
List<StochasticOutput> results = new ArrayList<>();
for (int i = 0; i < buffer.readInt(); i++)
int outputCount = buffer.readInt();
for (int i = 0; i < outputCount; i++)
results.add(StochasticOutput.read(buffer));
int duration = buffer.readInt();
return this.factory.create(recipeId, s, ingredients, results, duration);
@ -72,12 +74,13 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
buffer.writeInt(recipe.getRollableResults().size());
recipe.getRollableResults().forEach(i -> i.write(buffer));
buffer.writeInt(recipe.processingDuration);
}
public interface IRecipeFactory<T extends ProcessingRecipe<?>> {
T create(ResourceLocation id, String group, List<Ingredient> ingredients, List<StochasticOutput> results, int duration);
T create(ResourceLocation id, String group, List<Ingredient> ingredients, List<StochasticOutput> results,
int duration);
}
}

View File

@ -76,7 +76,8 @@ public class MotorBlock extends HorizontalKineticBlock
@Override
public void onScroll(BlockState state, IWorld world, BlockPos pos, double delta) {
withTileEntityDo(world, pos, te -> te.setSpeedValueLazily((int) (te.getSpeedValue() * (delta > 0 ? 2 : .5f))));
withTileEntityDo(world, pos, te -> te
.setSpeedValueLazily((int) (te.getSpeedValue() * (delta > 0 ^ te.getSpeedValue() < 0 ? 2 : .5f))));
}
@Override

View File

@ -44,7 +44,13 @@ public class MotorTileEntity extends KineticTileEntity implements ITickableTileE
public void setSpeedValueLazily(int speed) {
if (newSpeed == speed)
return;
newSpeed = MathHelper.clamp(speed, 1, CreateConfig.parameters.maxMotorSpeed.get());
Integer max = CreateConfig.parameters.maxMotorSpeed.get();
if (newSpeed > 0 && speed == 0)
newSpeed = -1;
else if (newSpeed < 0 && speed == 0)
newSpeed = 1;
else
newSpeed = MathHelper.clamp(speed, -max, max);
this.lastModified = 0;
}

View File

@ -36,7 +36,7 @@ public class CrushingWheelControllerBlock extends Block implements IWithoutBlock
@Override
public boolean hasTileEntity(BlockState state) {
return state.get(VALID);
return true;
}
@Override
@ -95,11 +95,17 @@ public class CrushingWheelControllerBlock extends Block implements IWithoutBlock
}
public void updateSpeed(BlockState state, World world, BlockPos pos) {
if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen())
return;
CrushingWheelControllerTileEntity te = (CrushingWheelControllerTileEntity) world.getTileEntity(pos);
if (te == null)
return;
if (!state.get(VALID) || CrushingWheelControllerTileEntity.isFrozen()) {
if (te.crushingspeed != 0) {
te.crushingspeed = 0;
te.sendData();
}
return;
}
for (Direction d : Direction.values()) {
if (d.getAxis().isVertical())
@ -111,6 +117,7 @@ public class CrushingWheelControllerBlock extends Block implements IWithoutBlock
continue;
KineticTileEntity wheelTe = (KineticTileEntity) world.getTileEntity(pos.offset(d));
te.crushingspeed = Math.abs(wheelTe.getSpeed() / 50f);
te.sendData();
break;
}
}

View File

@ -81,6 +81,7 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
public Entity processingEntity;
private UUID entityUUID;
protected boolean searchForEntity;
private Inventory contents;
public float crushingspeed;
@ -92,9 +93,23 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
@Override
public void tick() {
if (!isOccupied() || isFrozen())
if (isFrozen())
return;
if (searchForEntity) {
searchForEntity = false;
List<Entity> search = world.getEntitiesInAABBexcluding(null, new AxisAlignedBB(getPos()),
e -> entityUUID.equals(e.getUniqueID()));
if (search.isEmpty())
clear();
else
processingEntity = search.get(0);
}
if (!isOccupied())
return;
if (crushingspeed == 0)
return;
float speed = crushingspeed / 2.5f;
if (!hasEntity()) {
@ -216,15 +231,9 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
public void read(CompoundNBT compound) {
super.read(compound);
if (compound.contains("Entity") && !isFrozen()) {
if (compound.contains("Entity") && !isFrozen() && !isOccupied()) {
entityUUID = NBTUtil.readUniqueId(compound.getCompound("Entity"));
List<Entity> search = world.getEntitiesInAABBexcluding(null, new AxisAlignedBB(getPos()),
e -> entityUUID.equals(e.getUniqueID()));
if (search.isEmpty())
clear();
else
processingEntity = search.get(0);
this.searchForEntity = true;
}
crushingspeed = compound.getFloat("Speed");
contents = Inventory.read(compound);

View File

@ -15,6 +15,8 @@ import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.gen.feature.template.Template.BlockInfo;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class MechanicalBearingTileEntity extends KineticTileEntity implements ITickableTileEntity {
@ -33,6 +35,12 @@ public class MechanicalBearingTileEntity extends KineticTileEntity implements IT
public AxisAlignedBB getRenderBoundingBox() {
return INFINITE_EXTENT_AABB;
}
@Override
@OnlyIn(Dist.CLIENT)
public double getMaxRenderDistanceSquared() {
return super.getMaxRenderDistanceSquared() * 16;
}
@Override
public boolean isSource() {
@ -47,7 +55,7 @@ public class MechanicalBearingTileEntity extends KineticTileEntity implements IT
isWindmill = shouldWindmill;
if (isWindmill)
removeSource();
if (isWindmill && !running) {
assembleNextTick = true;
}
@ -177,7 +185,8 @@ public class MechanicalBearingTileEntity extends KineticTileEntity implements IT
if (!world.isRemote && assembleNextTick) {
assembleNextTick = false;
if (running) {
if (speed == 0 && (Math.abs(angle) < Math.PI / 4f || Math.abs(angle) > 7 * Math.PI / 4f)) {
boolean canDisassemble = Math.abs(angle) < Math.PI / 4f || Math.abs(angle) > 7 * Math.PI / 4f;
if (speed == 0 && (canDisassemble || movingConstruct == null || movingConstruct.blocks.isEmpty())) {
disassembleConstruct();
}
return;

View File

@ -24,6 +24,8 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.gen.feature.template.Template.BlockInfo;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class MechanicalPistonTileEntity extends KineticTileEntity implements ITickableTileEntity {
@ -55,6 +57,12 @@ public class MechanicalPistonTileEntity extends KineticTileEntity implements ITi
public AxisAlignedBB getRenderBoundingBox() {
return INFINITE_EXTENT_AABB;
}
@Override
@OnlyIn(Dist.CLIENT)
public double getMaxRenderDistanceSquared() {
return super.getMaxRenderDistanceSquared() * 16;
}
@Override
public CompoundNBT write(CompoundNBT tag) {

View File

@ -22,6 +22,7 @@ import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalP
import net.minecraft.block.BlockState;
import net.minecraft.block.FallingBlock;
import net.minecraft.block.PistonBlock;
import net.minecraft.block.ShulkerBoxBlock;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.FloatNBT;
import net.minecraft.nbt.ListNBT;
@ -81,7 +82,7 @@ public class TranslationConstruct {
public static TranslationConstruct getAttachedForPushing(World world, BlockPos pos, Direction direction) {
if (isFrozen())
return null;
TranslationConstruct construct = new TranslationConstruct();
if (!construct.collectExtensions(world, pos, direction))
@ -96,7 +97,7 @@ public class TranslationConstruct {
public static TranslationConstruct getAttachedForPulling(World world, BlockPos pos, Direction direction) {
if (isFrozen())
return null;
TranslationConstruct construct = new TranslationConstruct();
if (!construct.collectExtensions(world, pos, direction))
@ -120,12 +121,12 @@ public class TranslationConstruct {
if (world.getBlockState(pos).get(MechanicalPistonBlock.STATE) == PistonState.EXTENDED) {
while (PISTON_POLE.typeOf(nextBlock) && nextBlock.get(FACING).getAxis() == direction.getAxis()
|| MECHANICAL_PISTON_HEAD.typeOf(nextBlock) && nextBlock.get(FACING) == direction) {
actualStart = actualStart.offset(direction);
poles.add(new BlockInfo(actualStart, nextBlock.with(FACING, direction), null));
extensionsInFront++;
nextBlock = world.getBlockState(actualStart.offset(direction));
if (extensionsInFront > parameters.maxPistonPoles.get())
return false;
}
@ -184,7 +185,7 @@ public class TranslationConstruct {
if (state.getCollisionShape(world, pos.offset(direction)).isEmpty())
return true;
if (!canPull(world, pos.offset(direction), movementDirection))
return false;
return true;
BlockPos blockPos = pos.offset(direction).offset(direction, -offset);
blocks.put(blockPos, new BlockInfo(blockPos, state, null));
@ -260,8 +261,9 @@ public class TranslationConstruct {
axis == Axis.Y ? chassisCoord : pos.getY(), axis == Axis.Z ? chassisCoord : pos.getZ());
List<BlockInfo> blocks = new ArrayList<>();
boolean pushing = direction == movementDirection;
while (!frontier.isEmpty()) {
Search: while (!frontier.isEmpty()) {
BlockPos currentPos = frontier.remove(0);
BlockState state = world.getBlockState(currentPos);
@ -287,27 +289,26 @@ public class TranslationConstruct {
continue;
// Too many Blocks
if (direction == movementDirection && !currentChassisPos.withinDistance(currentPos, chassisRange + 1))
if (pushing && !currentChassisPos.withinDistance(currentPos, chassisRange + 1))
return null;
if (direction != movementDirection && !currentChassisPos.withinDistance(currentPos, chassisRange + 1))
continue;
// Skip if pushed column ended already (Except for Relocating Chassis)
if (!chassisSticky && !currentPos.equals(currentChassisPos)) {
boolean skip = false;
if (movementDirection != direction && !currentChassisPos.withinDistance(currentPos, 1))
continue;
if (!currentPos.equals(currentChassisPos)) {
for (BlockPos p = currentPos; !p.equals(currentChassisPos); p = p.offset(direction.getOpposite())) {
if (world.getBlockState(p).getMaterial().isReplaceable()
|| world.getBlockState(p).isAir(world, currentPos)) {
skip = true;
break;
BlockState blockState = world.getBlockState(p);
if (!chassisSticky && (blockState.getMaterial().isReplaceable()
|| blockState.isAir(world, currentPos))) {
continue Search;
}
if (!pushing && chassisSticky && !canPush(world, p, movementDirection)) {
continue Search;
}
}
if (skip)
continue;
}
// Ignore sand and co.
@ -315,14 +316,17 @@ public class TranslationConstruct {
continue;
// Structure is immobile
if (!canPush(world, currentPos, movementDirection))
if (pushing && !canPush(world, currentPos, movementDirection))
return null;
if (!pushing && !canPull(world, currentPos, movementDirection))
continue;
CompoundNBT nbt = new CompoundNBT();
nbt.putInt("Range", chassisRange);
blocks.add(new BlockInfo(currentPos.offset(direction, -offset), state,
AllBlocks.TRANSLATION_CHASSIS.typeOf(state) ? nbt : null));
// Expand search
for (Direction facing : Direction.values()) {
if (currentChassisPos.equals(currentPos) && facing == direction.getOpposite())
continue;
@ -337,12 +341,16 @@ public class TranslationConstruct {
}
private static boolean canPush(World world, BlockPos pos, Direction direction) {
return PistonBlock.canPush(world.getBlockState(pos), world, pos, direction, true, direction)
|| AllBlocks.TRANSLATION_CHASSIS.typeOf(world.getBlockState(pos));
BlockState blockState = world.getBlockState(pos);
if (AllBlocks.TRANSLATION_CHASSIS.typeOf(blockState))
return true;
if (blockState.getBlock() instanceof ShulkerBoxBlock)
return false;
return PistonBlock.canPush(blockState, world, pos, direction, true, direction);
}
private static boolean canPull(World world, BlockPos pos, Direction direction) {
return PistonBlock.canPush(world.getBlockState(pos), world, pos, direction, true, direction.getOpposite());
return canPush(world, pos, direction.getOpposite());
}
private static List<BlockInfo> collectChassis(World world, BlockPos pos, Direction direction, int offset2) {
@ -454,7 +462,7 @@ public class TranslationConstruct {
return construct;
}
public static boolean isFrozen() {
return CreateConfig.parameters.freezePistonConstructs.get();
}

View File

@ -155,13 +155,13 @@ public class BeltTileEntity extends KineticTileEntity implements ITickableTileEn
passengers.forEach((entity, info) -> {
if (!canTransport(entity))
toRemove.add(entity);
if (info.ticksSinceLastCollision > 1) {
if (info.ticksSinceLastCollision > ((getBlockState().get(BeltBlock.SLOPE) != Slope.HORIZONTAL) ? 3 : 1)) {
toRemove.add(entity);
}
info.tick();
});
toRemove.forEach(e -> {
if (e instanceof ItemEntity && ((ItemEntity) e).getAge() < 0)
if (e instanceof ItemEntity)
((ItemEntity) e).setAgeToCreativeDespawnTime();
passengers.remove(e);
});
@ -187,18 +187,22 @@ public class BeltTileEntity extends KineticTileEntity implements ITickableTileEn
return;
}
if (speed == 0)
// Too slow
boolean notHorizontal = getBlockState().get(BeltBlock.SLOPE) != Slope.HORIZONTAL;
if (Math.abs(getSpeed()) < (notHorizontal ? 32 : 1))
return;
// Not on top
if (entityIn.posY - .25f < pos.getY())
return;
if (entityIn instanceof LivingEntity) {
// Not sure if this does anything
if (entityIn instanceof LivingEntity)
((LivingEntity) entityIn).setIdleTime(101);
}
BeltTileEntity belt = (BeltTileEntity) te;
// Attachment pauses movement
for (BeltAttachmentState state : belt.attachmentTracker.attachments) {
if (state.attachment.handleEntity(belt, entityIn, state)) {
info.ticksSinceLastCollision--;
@ -218,15 +222,15 @@ public class BeltTileEntity extends KineticTileEntity implements ITickableTileEn
Vec3d movement = new Vec3d(movementDirection.getDirectionVec()).scale(movementSpeed);
double diffCenter = axis == Axis.Z ? (pos.getX() + .5f - entityIn.posX) : (pos.getZ() + .5f - entityIn.posZ);
float maxDiffCenter = (entityIn instanceof ItemEntity)? 32 / 64f : 48 / 64f;
float maxDiffCenter = (entityIn instanceof ItemEntity) ? 32 / 64f : 48 / 64f;
if (Math.abs(diffCenter) > maxDiffCenter)
return;
Part part = blockState.get(BeltBlock.PART);
float top = 13 / 16f;
boolean onSlope = part == Part.MIDDLE
boolean onSlope = notHorizontal && (part == Part.MIDDLE
|| part == (slope == Slope.UPWARD ? Part.END : Part.START) && entityIn.posY - pos.getY() < top
|| part == (slope == Slope.UPWARD ? Part.START : Part.END) && entityIn.posY - pos.getY() > top;
|| part == (slope == Slope.UPWARD ? Part.START : Part.END) && entityIn.posY - pos.getY() > top);
boolean movingDown = onSlope && slope == (movementFacing == beltFacing ? Slope.DOWNWARD : Slope.UPWARD);
boolean movingUp = onSlope && slope == (movementFacing == beltFacing ? Slope.UPWARD : Slope.DOWNWARD);
@ -246,8 +250,10 @@ public class BeltTileEntity extends KineticTileEntity implements ITickableTileEn
movement = movement.add(centering);
float step = entityIn.stepHeight;
entityIn.stepHeight = 1;
if (!(entityIn instanceof PlayerEntity))
entityIn.stepHeight = 1;
// Entity Collisions
if (Math.abs(movementSpeed) < .5f) {
Vec3d checkDistance = movement.scale(2f).add(movement.normalize());
AxisAlignedBB bb = entityIn.getBoundingBox();
@ -264,7 +270,7 @@ public class BeltTileEntity extends KineticTileEntity implements ITickableTileEn
if (movingUp) {
float minVelocity = entityIn instanceof ItemEntity ? .09f : .13f;
float yMovement = (float) (Math.signum(movementSpeed) * Math.max(Math.abs(movement.y), minVelocity));
float yMovement = (float) -(Math.max(Math.abs(movement.y), minVelocity));
entityIn.move(MoverType.SELF, new Vec3d(0, yMovement, 0));
entityIn.move(MoverType.SELF, movement.mul(1, 0, 1));
} else if (movingDown) {
@ -273,15 +279,17 @@ public class BeltTileEntity extends KineticTileEntity implements ITickableTileEn
} else {
entityIn.move(MoverType.SELF, movement);
}
entityIn.stepHeight = step;
boolean movedPastEndingSlope = onSlope && AllBlocks.BELT.typeOf(world.getBlockState(entityIn.getPosition()))
|| AllBlocks.BELT.typeOf(world.getBlockState(entityIn.getPosition().down()));
if (!(entityIn instanceof PlayerEntity))
entityIn.stepHeight = step;
if (movedPastEndingSlope && !movingDown && Math.abs(movementSpeed) > .25f) {
boolean movedPastEndingSlope = onSlope && (AllBlocks.BELT.typeOf(world.getBlockState(entityIn.getPosition()))
|| AllBlocks.BELT.typeOf(world.getBlockState(entityIn.getPosition().down())));
if (movedPastEndingSlope && !movingDown && Math.abs(movementSpeed) > 0)
entityIn.setPosition(entityIn.posX, entityIn.posY + movement.y, entityIn.posZ);
if (movedPastEndingSlope)
entityIn.setMotion(movement);
}
}
public boolean canTransport(Entity entity) {

View File

@ -8,10 +8,13 @@ import net.minecraft.client.renderer.color.IItemColor;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.model.animation.Animation;
public class ChromaticCompoundCubeItem extends Item implements IItemWithColorHandler {
@OnlyIn(value = Dist.CLIENT)
public static class Color implements IItemColor {
@Override
public int getColor(ItemStack stack, int layer) {
@ -36,6 +39,7 @@ public class ChromaticCompoundCubeItem extends Item implements IItemWithColorHan
}
@Override
@OnlyIn(value = Dist.CLIENT)
public IItemColor getColorHandler() {
return new Color();
}

View File

@ -63,7 +63,7 @@ public class FrequencyHandler {
}
public List<IHaveWireless> getNetworkOf(IHaveWireless actor) {
Map<Pair<Frequency, Frequency>, List<IHaveWireless>> networksInWorld = networksIn(actor.getWorld());
Map<Pair<Frequency, Frequency>, List<IHaveWireless>> networksInWorld = networksIn(actor.getWirelessWorld());
Pair<Frequency, Frequency> key = getNetworkKey(actor);
if (!networksInWorld.containsKey(key))
networksInWorld.put(key, new ArrayList<>());
@ -79,7 +79,7 @@ public class FrequencyHandler {
List<IHaveWireless> network = getNetworkOf(actor);
network.remove(actor);
if (network.isEmpty()) {
networksIn(actor.getWorld()).remove(getNetworkKey(actor));
networksIn(actor.getWirelessWorld()).remove(getNetworkKey(actor));
return;
}
updateNetworkOf(actor);
@ -109,7 +109,7 @@ public class FrequencyHandler {
}
public static boolean withinRange(IHaveWireless from, IHaveWireless to) {
return from.getPos().withinDistance(to.getPos(), CreateConfig.parameters.linkRange.get());
return from.getWirelessPos().withinDistance(to.getWirelessPos(), CreateConfig.parameters.linkRange.get());
}
public Map<Pair<Frequency, Frequency>, List<IHaveWireless>> networksIn(IWorld world) {

View File

@ -4,6 +4,7 @@ import com.simibubi.create.Create;
import com.simibubi.create.modules.logistics.FrequencyHandler.Frequency;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
@ -12,12 +13,19 @@ public interface IHaveWireless {
public Frequency getFrequencyFirst();
public Frequency getFrequencyLast();
public void setFrequency(boolean first, ItemStack stack);
public World getWorld();
public BlockPos getPos();
public default World getWirelessWorld() {
return ((TileEntity) this).getWorld();
}
public default BlockPos getWirelessPos() {
return ((TileEntity) this).getPos();
}
public default boolean isLoaded() {
return getWorld().isBlockPresent(getPos());
return getWirelessWorld().isBlockPresent(getWirelessPos());
}
default FrequencyHandler getHandler() {
return Create.frequencyHandler;
}

View File

@ -42,8 +42,8 @@ public class InWorldProcessing {
public static boolean canProcess(ItemEntity entity, Type type) {
World world = entity.world;
if (entity.getPersistantData().contains("CreateData")
&& entity.getPersistantData().getCompound("CreateData").contains("Processing"))
if (entity.getPersistentData().contains("CreateData")
&& entity.getPersistentData().getCompound("CreateData").contains("Processing"))
return true;
if (type == Type.BLASTING) {
@ -124,7 +124,7 @@ public class InWorldProcessing {
}
private static int decrementProcessingTime(ItemEntity entity, Type type) {
CompoundNBT nbt = entity.getPersistantData();
CompoundNBT nbt = entity.getPersistentData();
if (!nbt.contains("CreateData"))
nbt.put("CreateData", new CompoundNBT());
@ -178,8 +178,11 @@ public class InWorldProcessing {
return;
}
entity.setItem(stacks.remove(0));
for (ItemStack additional : stacks)
entity.world.addEntity(new ItemEntity(entity.world, entity.posX, entity.posY, entity.posZ, additional));
for (ItemStack additional : stacks) {
ItemEntity entityIn = new ItemEntity(entity.world, entity.posX, entity.posY, entity.posZ, additional);
entityIn.setMotion(entity.getMotion());
entity.world.addEntity(entityIn);
}
}
public static boolean isFrozen() {

View File

@ -69,7 +69,7 @@ public class BeltFunnelTileEntity extends SyncedTileEntity implements ITickableT
initialize = false;
}
}
@Override
public void setInventory(LazyOptional<IItemHandler> inventory) {
this.inventory = inventory;

View File

@ -10,9 +10,13 @@ import net.minecraftforge.items.IItemHandler;
public interface IInventoryManipulator {
public World getWorld();
public BlockPos getPos();
public default World getWorld() {
return ((TileEntity) this).getWorld();
}
public default BlockPos getPos() {
return ((TileEntity) this).getPos();
}
public BlockPos getInventoryPos();

View File

@ -11,6 +11,7 @@ import net.minecraft.nbt.CompoundNBT;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.IItemHandler;
@ -37,6 +38,11 @@ public class LinkedExtractorTileEntity extends LinkedTileEntity
super.onLoad();
initialize = true;
}
@Override
public World getWirelessWorld() {
return super.getWorld();
}
@Override
public void setSignal(boolean powered) {

View File

@ -84,7 +84,15 @@ public class FlexpeaterBlock extends RedstoneDiodeBlock
FlexpeaterTileEntity te = (FlexpeaterTileEntity) world.getTileEntity(pos);
if (te == null)
return "";
return Lang.translate("generic.delay") + " (" + te.getUnit() + ")";
return Lang.translate("generic.delay") + " (" + Lang.translate("generic.unit." + te.getUnit()) + ")";
}
@Override
public String getValueSuffix(BlockState state, IWorld world, BlockPos pos) {
FlexpeaterTileEntity te = (FlexpeaterTileEntity) world.getTileEntity(pos);
if (te == null)
return "";
return "" + te.getUnit().charAt(0);
}
@Override

View File

@ -6,7 +6,6 @@ import static net.minecraft.block.RedstoneDiodeBlock.POWERED;
import com.simibubi.create.AllPackets;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.block.SyncedTileEntity;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.ITickableTileEntity;
@ -25,7 +24,7 @@ public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableT
lastModified = -1;
maxState = 1;
}
@Override
public void read(CompoundNBT compound) {
state = compound.getInt("State");
@ -34,7 +33,7 @@ public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableT
lastModified = -1;
super.read(compound);
}
@Override
public CompoundNBT write(CompoundNBT compound) {
compound.putInt("State", state);
@ -55,7 +54,7 @@ public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableT
}
lastModified = 0;
}
if (amount < 0) {
if (newMaxState <= 20) {
newMaxState += amount;
@ -69,7 +68,7 @@ public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableT
newMaxState = MathHelper.clamp(newMaxState, 1, 60 * 20 * 30);
}
@Override
public boolean hasFastRenderer() {
return true;
@ -85,12 +84,12 @@ public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableT
public String getUnit() {
if (newMaxState < 20)
return Lang.translate("generic.unit.ticks");
return "ticks";
if (newMaxState < 20 * 60)
return Lang.translate("generic.unit.seconds");
return Lang.translate("generic.unit.minutes");
return "seconds";
return "minutes";
}
@Override
public void tick() {
updateConfigurableValue();
@ -98,10 +97,10 @@ public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableT
boolean powering = getBlockState().get(POWERING);
boolean atMax = state == maxState;
boolean atMin = state == 0;
if (!charging && powered)
charging = true;
if (charging && atMax) {
if (!powering && !world.isRemote)
world.setBlockState(pos, getBlockState().with(POWERING, true));
@ -109,13 +108,13 @@ public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableT
charging = false;
return;
}
if (!charging && atMin) {
if (powering && !world.isRemote)
world.setBlockState(pos, getBlockState().with(POWERING, false));
return;
}
state += charging ? 1 : -1;
}

View File

@ -656,6 +656,8 @@ public class SchematicannonTileEntity extends SyncedTileEntity implements ITicka
protected boolean shouldIgnoreBlockState(BlockState state) {
// Block doesnt have a mapping (Water, lava, etc)
if (state.getBlock() == Blocks.STRUCTURE_VOID)
return true;
if (getItemForBlock(state).getItem() == Items.AIR && state.getBlock() != Blocks.AIR)
return true;

View File

@ -213,7 +213,7 @@ public class SchematicHandler {
PlacementSettings settings = cachedSettings.copy();
settings.setBoundingBox(null);
schematic.addBlocksToWorld(w, anchor, settings);
new SchematicHologram().startHologram(w);
CreateClient.schematicHologram.startHologram(w);
}
}

View File

@ -12,6 +12,7 @@ import org.apache.commons.io.IOUtils;
import com.simibubi.create.AllItems;
import com.simibubi.create.CreateConfig;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.schematics.client.SchematicEditScreen;
import net.minecraft.client.util.ITooltipFlag;
@ -67,6 +68,8 @@ public class SchematicItem extends Item {
if (stack.hasTag()) {
if (stack.getTag().contains("File"))
tooltip.add(new StringTextComponent(TextFormatting.GOLD + stack.getTag().getString("File")));
} else {
tooltip.add(new StringTextComponent(TextFormatting.RED + Lang.translate("schematic.invalid")));
}
super.addInformation(stack, worldIn, tooltip, flagIn);
}
@ -96,7 +99,7 @@ public class SchematicItem extends Item {
String filepath = "";
if (Thread.currentThread().getThreadGroup() == SidedThreadGroups.SERVER)
filepath = CreateConfig.parameters.schematicPath + "/" + owner + "/" + schematic;
filepath = CreateConfig.parameters.schematicPath.get() + "/" + owner + "/" + schematic;
else
filepath = "schematics/" + schematic;

View File

@ -4,7 +4,7 @@ loaderVersion="[28,)"
[[mods]]
modId="create"
version="0.0.5"
version="0.1.0"
displayName="Create"
#updateJSONURL=""
authors="simibubi"
@ -14,7 +14,7 @@ A handful of additions to aid the creative survivalist.'''
[[dependencies.create]]
modId="forge"
mandatory=true
versionRange="[28.0.45,)"
versionRange="[28.1.0,)"
ordering="NONE"
side="BOTH"

View File

@ -147,11 +147,11 @@
"create.recipe.crushing": "Crushing",
"create.recipe.splashing": "Bulk Washing",
"create.recipe.splashing.fan": "Fan behind §9Flowing Water",
"create.recipe.splashing.fan": "Fan behind Flowing Water",
"create.recipe.smokingViaFan": "Bulk Smoking",
"create.recipe.smokingViaFan.fan": "Fan behind §6Fire",
"create.recipe.smokingViaFan.fan": "Fan behind Fire",
"create.recipe.blastingViaFan": "Bulk Smelting",
"create.recipe.blastingViaFan.fan": "Fan behind §6Lava",
"create.recipe.blastingViaFan.fan": "Fan behind Lava",
"create.recipe.pressing": "Mechanical Press",
"create.recipe.blockzapperUpgrade": "Handheld Blockzapper",
"create.recipe.processing.chance": "%1$s%% Chance",
@ -241,6 +241,7 @@
"create.schematicAndQuill.fallbackName": "My Schematic",
"create.schematicAndQuill.saved": "Saved as %1$s",
"create.schematic.invalid": "[!] Invalid Item - Use the Schematic Table instead",
"create.schematic.position": "Position",
"create.schematic.rotation": "Rotation",
"create.schematic.rotation.none": "None",

View File

@ -3,9 +3,23 @@
"textures": {
"particle": "create:block/bearing_side",
"gearbox": "create:block/gearbox",
"bearing_side": "create:block/bearing_side"
"bearing_side": "create:block/bearing_side",
"brass_casing": "create:block/brass_casing"
},
"elements": [
{
"name": "Indicator",
"from": [ 6, 10, 16 ],
"to": [ 10, 12, 17 ],
"faces": {
"north": { "texture": "#brass_casing", "uv": [ 3, 0, 7, 2 ] },
"east": { "texture": "#brass_casing", "uv": [ 7, 14, 8, 16 ] },
"south": { "texture": "#brass_casing", "uv": [ 6, 14, 10, 16 ] },
"west": { "texture": "#brass_casing", "uv": [ 8, 14, 9, 16 ] },
"up": { "texture": "#brass_casing", "uv": [ 6, 1, 10, 2 ] },
"down": { "texture": "#brass_casing", "uv": [ 6, 0, 10, 1 ] }
}
},
{
"name": "Side",
"from": [ 0, 0, 0 ],

View File

@ -3,9 +3,23 @@
"textures": {
"particle": "create:block/bearing_side",
"bearing_top": "create:block/bearing_top",
"bearing_side": "create:block/bearing_side"
"bearing_side": "create:block/bearing_side",
"brass_casing": "create:block/brass_casing"
},
"elements": [
{
"name": "Cube",
"from": [ 6, 12, 16 ],
"to": [ 10, 14, 17 ],
"faces": {
"north": { "texture": "#brass_casing", "uv": [ 3, 0, 7, 2 ] },
"east": { "texture": "#brass_casing", "uv": [ 7, 0, 8, 2 ] },
"south": { "texture": "#brass_casing", "uv": [ 6, 0, 10, 2 ] },
"west": { "texture": "#brass_casing", "uv": [ 8, 0, 9, 2 ] },
"up": { "texture": "#brass_casing", "uv": [ 6, 0, 10, 1 ] },
"down": { "texture": "#brass_casing", "uv": [ 6, 1, 10, 2 ] }
}
},
{
"name": "Top",
"from": [ 0, 12, 0 ],