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' sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8'
minecraft { minecraft {
mappings channel: 'snapshot', version: '20190910-1.14.3' mappings channel: 'snapshot', version: '20190917-1.14.3'
runs { runs {
client { client {
@ -34,7 +34,7 @@ minecraft {
} }
server { server {
workingDirectory project.file('run') workingDirectory project.file('run/server')
property 'forge.logging.console.level', 'info' property 'forge.logging.console.level', 'info'
mods { mods {
create { create {
@ -71,7 +71,7 @@ repositories {
} }
dependencies { 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 // 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") 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()), ANDESITE_ALLOY_CUBE(ingredient()),
BLAZE_BRASS_CUBE(ingredient()), BLAZE_BRASS_CUBE(ingredient()),
CHORUS_CHROME_CUBE(ingredient(Rarity.UNCOMMON)), CHORUS_CHROME_CUBE(ingredient(Rarity.UNCOMMON)),
SHADOW_STEEL_CUBE(ingredient(Rarity.UNCOMMON)), SHADOW_STEEL_CUBE(new Item(new Properties().rarity(Rarity.UNCOMMON))),
ROSE_QUARTZ(ingredient()), ROSE_QUARTZ(new Item(new Properties())),
REFINED_ROSE_QUARTZ(ingredient()), REFINED_ROSE_QUARTZ(new Item(new Properties())),
CHROMATIC_COMPOUND_CUBE(new ChromaticCompoundCubeItem(standardItemProperties().rarity(Rarity.UNCOMMON))), CHROMATIC_COMPOUND_CUBE(new ChromaticCompoundCubeItem(new Properties().rarity(Rarity.UNCOMMON))),
REFINED_RADIANCE_CUBE(ingredient(Rarity.RARE)), REFINED_RADIANCE_CUBE(new Item(new Properties().rarity(Rarity.UNCOMMON))),
// BLAZING_PICKAXE(new BlazingToolItem(1, -2.8F, standardProperties(), PICKAXE)), // BLAZING_PICKAXE(new BlazingToolItem(1, -2.8F, standardProperties(), PICKAXE)),
// BLAZING_SHOVEL(new BlazingToolItem(1.5F, -3.0F, standardProperties(), SHOVEL)), // BLAZING_SHOVEL(new BlazingToolItem(1.5F, -3.0F, standardProperties(), SHOVEL)),

View file

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

View file

@ -39,7 +39,7 @@ public class Create {
public static ModConfig config; public static ModConfig config;
public Create() { 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); 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 org.apache.commons.lang3.tuple.Pair;
import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.common.ForgeConfigSpec.BooleanValue;
public class CreateClientConfig { public class CreateClientConfig {
@ -17,8 +18,15 @@ public class CreateClientConfig {
instance = specPair.getLeft(); instance = specPair.getLeft();
} }
public BooleanValue enableTooltips;
CreateClientConfig(final ForgeConfigSpec.Builder builder) { 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(); builder.pop();
} }

View file

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

View file

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

View file

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

View file

@ -52,11 +52,13 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
String s = buffer.readString(32767); String s = buffer.readString(32767);
List<Ingredient> ingredients = new ArrayList<>(); 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)); ingredients.add(Ingredient.read(buffer));
List<StochasticOutput> results = new ArrayList<>(); 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)); results.add(StochasticOutput.read(buffer));
int duration = buffer.readInt(); int duration = buffer.readInt();
@ -77,7 +79,8 @@ public class ProcessingRecipeSerializer<T extends ProcessingRecipe<?>>
} }
public interface IRecipeFactory<T extends ProcessingRecipe<?>> { 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 @Override
public void onScroll(BlockState state, IWorld world, BlockPos pos, double delta) { 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 @Override

View file

@ -44,7 +44,13 @@ public class MotorTileEntity extends KineticTileEntity implements ITickableTileE
public void setSpeedValueLazily(int speed) { public void setSpeedValueLazily(int speed) {
if (newSpeed == speed) if (newSpeed == speed)
return; 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; this.lastModified = 0;
} }

View file

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

View file

@ -81,6 +81,7 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
public Entity processingEntity; public Entity processingEntity;
private UUID entityUUID; private UUID entityUUID;
protected boolean searchForEntity;
private Inventory contents; private Inventory contents;
public float crushingspeed; public float crushingspeed;
@ -92,7 +93,21 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
@Override @Override
public void tick() { 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; return;
float speed = crushingspeed / 2.5f; float speed = crushingspeed / 2.5f;
@ -216,15 +231,9 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
public void read(CompoundNBT compound) { public void read(CompoundNBT compound) {
super.read(compound); super.read(compound);
if (compound.contains("Entity") && !isFrozen()) { if (compound.contains("Entity") && !isFrozen() && !isOccupied()) {
entityUUID = NBTUtil.readUniqueId(compound.getCompound("Entity")); entityUUID = NBTUtil.readUniqueId(compound.getCompound("Entity"));
this.searchForEntity = true;
List<Entity> search = world.getEntitiesInAABBexcluding(null, new AxisAlignedBB(getPos()),
e -> entityUUID.equals(e.getUniqueID()));
if (search.isEmpty())
clear();
else
processingEntity = search.get(0);
} }
crushingspeed = compound.getFloat("Speed"); crushingspeed = compound.getFloat("Speed");
contents = Inventory.read(compound); 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.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.gen.feature.template.Template.BlockInfo; 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 { public class MechanicalBearingTileEntity extends KineticTileEntity implements ITickableTileEntity {
@ -34,6 +36,12 @@ public class MechanicalBearingTileEntity extends KineticTileEntity implements IT
return INFINITE_EXTENT_AABB; return INFINITE_EXTENT_AABB;
} }
@Override
@OnlyIn(Dist.CLIENT)
public double getMaxRenderDistanceSquared() {
return super.getMaxRenderDistanceSquared() * 16;
}
@Override @Override
public boolean isSource() { public boolean isSource() {
return isWindmill; return isWindmill;
@ -177,7 +185,8 @@ public class MechanicalBearingTileEntity extends KineticTileEntity implements IT
if (!world.isRemote && assembleNextTick) { if (!world.isRemote && assembleNextTick) {
assembleNextTick = false; assembleNextTick = false;
if (running) { 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(); disassembleConstruct();
} }
return; return;

View file

@ -24,6 +24,8 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.gen.feature.template.Template.BlockInfo; 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 { public class MechanicalPistonTileEntity extends KineticTileEntity implements ITickableTileEntity {
@ -56,6 +58,12 @@ public class MechanicalPistonTileEntity extends KineticTileEntity implements ITi
return INFINITE_EXTENT_AABB; return INFINITE_EXTENT_AABB;
} }
@Override
@OnlyIn(Dist.CLIENT)
public double getMaxRenderDistanceSquared() {
return super.getMaxRenderDistanceSquared() * 16;
}
@Override @Override
public CompoundNBT write(CompoundNBT tag) { public CompoundNBT write(CompoundNBT tag) {
tag.putBoolean("Running", running); tag.putBoolean("Running", running);

View file

@ -22,6 +22,7 @@ import com.simibubi.create.modules.contraptions.receivers.constructs.MechanicalP
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.FallingBlock; import net.minecraft.block.FallingBlock;
import net.minecraft.block.PistonBlock; import net.minecraft.block.PistonBlock;
import net.minecraft.block.ShulkerBoxBlock;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.FloatNBT; import net.minecraft.nbt.FloatNBT;
import net.minecraft.nbt.ListNBT; import net.minecraft.nbt.ListNBT;
@ -184,7 +185,7 @@ public class TranslationConstruct {
if (state.getCollisionShape(world, pos.offset(direction)).isEmpty()) if (state.getCollisionShape(world, pos.offset(direction)).isEmpty())
return true; return true;
if (!canPull(world, pos.offset(direction), movementDirection)) if (!canPull(world, pos.offset(direction), movementDirection))
return false; return true;
BlockPos blockPos = pos.offset(direction).offset(direction, -offset); BlockPos blockPos = pos.offset(direction).offset(direction, -offset);
blocks.put(blockPos, new BlockInfo(blockPos, state, null)); 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()); axis == Axis.Y ? chassisCoord : pos.getY(), axis == Axis.Z ? chassisCoord : pos.getZ());
List<BlockInfo> blocks = new ArrayList<>(); List<BlockInfo> blocks = new ArrayList<>();
boolean pushing = direction == movementDirection;
while (!frontier.isEmpty()) { Search: while (!frontier.isEmpty()) {
BlockPos currentPos = frontier.remove(0); BlockPos currentPos = frontier.remove(0);
BlockState state = world.getBlockState(currentPos); BlockState state = world.getBlockState(currentPos);
@ -287,27 +289,26 @@ public class TranslationConstruct {
continue; continue;
// Too many Blocks // Too many Blocks
if (direction == movementDirection && !currentChassisPos.withinDistance(currentPos, chassisRange + 1)) if (pushing && !currentChassisPos.withinDistance(currentPos, chassisRange + 1))
return null; return null;
if (direction != movementDirection && !currentChassisPos.withinDistance(currentPos, chassisRange + 1)) if (direction != movementDirection && !currentChassisPos.withinDistance(currentPos, chassisRange + 1))
continue; continue;
// Skip if pushed column ended already (Except for Relocating Chassis) // Skip if pushed column ended already (Except for Relocating Chassis)
if (!chassisSticky && !currentPos.equals(currentChassisPos)) { if (!currentPos.equals(currentChassisPos)) {
boolean skip = false;
if (movementDirection != direction && !currentChassisPos.withinDistance(currentPos, 1))
continue;
for (BlockPos p = currentPos; !p.equals(currentChassisPos); p = p.offset(direction.getOpposite())) { for (BlockPos p = currentPos; !p.equals(currentChassisPos); p = p.offset(direction.getOpposite())) {
if (world.getBlockState(p).getMaterial().isReplaceable() BlockState blockState = world.getBlockState(p);
|| world.getBlockState(p).isAir(world, currentPos)) {
skip = true; if (!chassisSticky && (blockState.getMaterial().isReplaceable()
break; || blockState.isAir(world, currentPos))) {
continue Search;
} }
if (!pushing && chassisSticky && !canPush(world, p, movementDirection)) {
continue Search;
}
} }
if (skip)
continue;
} }
// Ignore sand and co. // Ignore sand and co.
@ -315,14 +316,17 @@ public class TranslationConstruct {
continue; continue;
// Structure is immobile // Structure is immobile
if (!canPush(world, currentPos, movementDirection)) if (pushing && !canPush(world, currentPos, movementDirection))
return null; return null;
if (!pushing && !canPull(world, currentPos, movementDirection))
continue;
CompoundNBT nbt = new CompoundNBT(); CompoundNBT nbt = new CompoundNBT();
nbt.putInt("Range", chassisRange); nbt.putInt("Range", chassisRange);
blocks.add(new BlockInfo(currentPos.offset(direction, -offset), state, blocks.add(new BlockInfo(currentPos.offset(direction, -offset), state,
AllBlocks.TRANSLATION_CHASSIS.typeOf(state) ? nbt : null)); AllBlocks.TRANSLATION_CHASSIS.typeOf(state) ? nbt : null));
// Expand search
for (Direction facing : Direction.values()) { for (Direction facing : Direction.values()) {
if (currentChassisPos.equals(currentPos) && facing == direction.getOpposite()) if (currentChassisPos.equals(currentPos) && facing == direction.getOpposite())
continue; continue;
@ -337,12 +341,16 @@ public class TranslationConstruct {
} }
private static boolean canPush(World world, BlockPos pos, Direction direction) { private static boolean canPush(World world, BlockPos pos, Direction direction) {
return PistonBlock.canPush(world.getBlockState(pos), world, pos, direction, true, direction) BlockState blockState = world.getBlockState(pos);
|| AllBlocks.TRANSLATION_CHASSIS.typeOf(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) { 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) { private static List<BlockInfo> collectChassis(World world, BlockPos pos, Direction direction, int offset2) {

View file

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

View file

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

View file

@ -63,7 +63,7 @@ public class FrequencyHandler {
} }
public List<IHaveWireless> getNetworkOf(IHaveWireless actor) { 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); Pair<Frequency, Frequency> key = getNetworkKey(actor);
if (!networksInWorld.containsKey(key)) if (!networksInWorld.containsKey(key))
networksInWorld.put(key, new ArrayList<>()); networksInWorld.put(key, new ArrayList<>());
@ -79,7 +79,7 @@ public class FrequencyHandler {
List<IHaveWireless> network = getNetworkOf(actor); List<IHaveWireless> network = getNetworkOf(actor);
network.remove(actor); network.remove(actor);
if (network.isEmpty()) { if (network.isEmpty()) {
networksIn(actor.getWorld()).remove(getNetworkKey(actor)); networksIn(actor.getWirelessWorld()).remove(getNetworkKey(actor));
return; return;
} }
updateNetworkOf(actor); updateNetworkOf(actor);
@ -109,7 +109,7 @@ public class FrequencyHandler {
} }
public static boolean withinRange(IHaveWireless from, IHaveWireless to) { 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) { 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 com.simibubi.create.modules.logistics.FrequencyHandler.Frequency;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -12,12 +13,19 @@ public interface IHaveWireless {
public Frequency getFrequencyFirst(); public Frequency getFrequencyFirst();
public Frequency getFrequencyLast(); public Frequency getFrequencyLast();
public void setFrequency(boolean first, ItemStack stack); 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() { public default boolean isLoaded() {
return getWorld().isBlockPresent(getPos()); return getWirelessWorld().isBlockPresent(getWirelessPos());
} }
default FrequencyHandler getHandler() { default FrequencyHandler getHandler() {
return Create.frequencyHandler; return Create.frequencyHandler;
} }

View file

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

View file

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

View file

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

View file

@ -84,7 +84,15 @@ public class FlexpeaterBlock extends RedstoneDiodeBlock
FlexpeaterTileEntity te = (FlexpeaterTileEntity) world.getTileEntity(pos); FlexpeaterTileEntity te = (FlexpeaterTileEntity) world.getTileEntity(pos);
if (te == null) if (te == null)
return ""; 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 @Override

View file

@ -6,7 +6,6 @@ import static net.minecraft.block.RedstoneDiodeBlock.POWERED;
import com.simibubi.create.AllPackets; import com.simibubi.create.AllPackets;
import com.simibubi.create.AllTileEntities; import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.block.SyncedTileEntity; import com.simibubi.create.foundation.block.SyncedTileEntity;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.ITickableTileEntity;
@ -85,10 +84,10 @@ public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableT
public String getUnit() { public String getUnit() {
if (newMaxState < 20) if (newMaxState < 20)
return Lang.translate("generic.unit.ticks"); return "ticks";
if (newMaxState < 20 * 60) if (newMaxState < 20 * 60)
return Lang.translate("generic.unit.seconds"); return "seconds";
return Lang.translate("generic.unit.minutes"); return "minutes";
} }
@Override @Override

View file

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

View file

@ -213,7 +213,7 @@ public class SchematicHandler {
PlacementSettings settings = cachedSettings.copy(); PlacementSettings settings = cachedSettings.copy();
settings.setBoundingBox(null); settings.setBoundingBox(null);
schematic.addBlocksToWorld(w, anchor, settings); 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.AllItems;
import com.simibubi.create.CreateConfig; import com.simibubi.create.CreateConfig;
import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.schematics.client.SchematicEditScreen; import com.simibubi.create.modules.schematics.client.SchematicEditScreen;
import net.minecraft.client.util.ITooltipFlag; import net.minecraft.client.util.ITooltipFlag;
@ -67,6 +68,8 @@ public class SchematicItem extends Item {
if (stack.hasTag()) { if (stack.hasTag()) {
if (stack.getTag().contains("File")) if (stack.getTag().contains("File"))
tooltip.add(new StringTextComponent(TextFormatting.GOLD + stack.getTag().getString("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); super.addInformation(stack, worldIn, tooltip, flagIn);
} }
@ -96,7 +99,7 @@ public class SchematicItem extends Item {
String filepath = ""; String filepath = "";
if (Thread.currentThread().getThreadGroup() == SidedThreadGroups.SERVER) if (Thread.currentThread().getThreadGroup() == SidedThreadGroups.SERVER)
filepath = CreateConfig.parameters.schematicPath + "/" + owner + "/" + schematic; filepath = CreateConfig.parameters.schematicPath.get() + "/" + owner + "/" + schematic;
else else
filepath = "schematics/" + schematic; filepath = "schematics/" + schematic;

View file

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

View file

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

View file

@ -3,9 +3,23 @@
"textures": { "textures": {
"particle": "create:block/bearing_side", "particle": "create:block/bearing_side",
"gearbox": "create:block/gearbox", "gearbox": "create:block/gearbox",
"bearing_side": "create:block/bearing_side" "bearing_side": "create:block/bearing_side",
"brass_casing": "create:block/brass_casing"
}, },
"elements": [ "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", "name": "Side",
"from": [ 0, 0, 0 ], "from": [ 0, 0, 0 ],

View file

@ -3,9 +3,23 @@
"textures": { "textures": {
"particle": "create:block/bearing_side", "particle": "create:block/bearing_side",
"bearing_top": "create:block/bearing_top", "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": [ "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", "name": "Top",
"from": [ 0, 12, 0 ], "from": [ 0, 12, 0 ],