ForgeCraft Playtesting, Part II

- Fixed server dist crash in entity belt movement
- Fixed client crash when saving a schematic without giving it a name
This commit is contained in:
simibubi 2020-10-14 21:15:19 +02:00
parent 69cbfff8ed
commit db2b8dd197
3 changed files with 36 additions and 18 deletions

View File

@ -51,7 +51,7 @@ public class BeltMovementHandler {
ticksSinceLastCollision++; ticksSinceLastCollision++;
return this; return this;
} }
public int getTicksSinceLastCollision() { public int getTicksSinceLastCollision() {
return ticksSinceLastCollision; return ticksSinceLastCollision;
} }
@ -72,8 +72,8 @@ public class BeltMovementHandler {
TileEntity tileEntityBelowPassenger = world.getTileEntity(entityIn.getBlockPos()); TileEntity tileEntityBelowPassenger = world.getTileEntity(entityIn.getBlockPos());
BlockState blockState = info.lastCollidedState; BlockState blockState = info.lastCollidedState;
Direction movementFacing = Direction movementFacing =
Direction.getFacingFromAxisDirection(blockState.get(BlockStateProperties.HORIZONTAL_FACING).getAxis(), Direction.getFacingFromAxisDirection(blockState.get(BlockStateProperties.HORIZONTAL_FACING)
beltTe.getSpeed() < 0 ? POSITIVE : NEGATIVE); .getAxis(), beltTe.getSpeed() < 0 ? POSITIVE : NEGATIVE);
boolean collidedWithBelt = te instanceof BeltTileEntity; boolean collidedWithBelt = te instanceof BeltTileEntity;
boolean betweenBelts = tileEntityBelowPassenger instanceof BeltTileEntity && tileEntityBelowPassenger != te; boolean betweenBelts = tileEntityBelowPassenger instanceof BeltTileEntity && tileEntityBelowPassenger != te;
@ -84,7 +84,8 @@ public class BeltMovementHandler {
} }
// Too slow // Too slow
boolean notHorizontal = beltTe.getBlockState().get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL; boolean notHorizontal = beltTe.getBlockState()
.get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL;
if (Math.abs(beltTe.getSpeed()) < 1) if (Math.abs(beltTe.getSpeed()) < 1)
return; return;
@ -104,19 +105,23 @@ public class BeltMovementHandler {
float movementSpeed = beltTe.getBeltMovementSpeed(); float movementSpeed = beltTe.getBeltMovementSpeed();
final Direction movementDirection = Direction.getFacingFromAxis(axis == Axis.X ? NEGATIVE : POSITIVE, axis); final Direction movementDirection = Direction.getFacingFromAxis(axis == Axis.X ? NEGATIVE : POSITIVE, axis);
Vector3i centeringDirection = Vector3i centeringDirection = Direction.getFacingFromAxis(POSITIVE, beltFacing.rotateY()
Direction.getFacingFromAxis(POSITIVE, beltFacing.rotateY().getAxis()).getDirectionVec(); .getAxis())
Vector3d movement = Vector3d.of(movementDirection.getDirectionVec()).scale(movementSpeed); .getDirectionVec();
Vector3d movement = Vector3d.of(movementDirection.getDirectionVec())
.scale(movementSpeed);
double diffCenter = axis == Axis.Z ? (pos.getX() + .5f - entityIn.getX()) : (pos.getZ() + .5f - entityIn.getZ()); double diffCenter =
axis == Axis.Z ? (pos.getX() + .5f - entityIn.getX()) : (pos.getZ() + .5f - entityIn.getZ());
if (Math.abs(diffCenter) > 48 / 64f) if (Math.abs(diffCenter) > 48 / 64f)
return; return;
BeltPart part = blockState.get(BeltBlock.PART); BeltPart part = blockState.get(BeltBlock.PART);
float top = 13 / 16f; float top = 13 / 16f;
boolean onSlope = notHorizontal && (part == BeltPart.MIDDLE || part == BeltPart.PULLEY boolean onSlope = notHorizontal && (part == BeltPart.MIDDLE || part == BeltPart.PULLEY
|| part == (slope == BeltSlope.UPWARD ? BeltPart.END : BeltPart.START) && entityIn.getY() - pos.getY() < top || part == (slope == BeltSlope.UPWARD ? BeltPart.END : BeltPart.START) && entityIn.getY() - pos.getY() < top
|| part == (slope == BeltSlope.UPWARD ? BeltPart.START : BeltPart.END) && entityIn.getY() - pos.getY() > top); || part == (slope == BeltSlope.UPWARD ? BeltPart.START : BeltPart.END)
&& entityIn.getY() - pos.getY() > top);
boolean movingDown = onSlope && slope == (movementFacing == beltFacing ? BeltSlope.DOWNWARD : BeltSlope.UPWARD); boolean movingDown = onSlope && slope == (movementFacing == beltFacing ? BeltSlope.DOWNWARD : BeltSlope.UPWARD);
boolean movingUp = onSlope && slope == (movementFacing == beltFacing ? BeltSlope.UPWARD : BeltSlope.DOWNWARD); boolean movingUp = onSlope && slope == (movementFacing == beltFacing ? BeltSlope.UPWARD : BeltSlope.DOWNWARD);
@ -132,7 +137,8 @@ public class BeltMovementHandler {
if (movingDown) if (movingDown)
movement = movement.add(0, -Math.abs(axis.getCoordinate(movement.x, movement.y, movement.z)), 0); movement = movement.add(0, -Math.abs(axis.getCoordinate(movement.x, movement.y, movement.z)), 0);
Vector3d centering = Vector3d.of(centeringDirection).scale(diffCenter * Math.min(Math.abs(movementSpeed), .1f) * 4); Vector3d centering = Vector3d.of(centeringDirection)
.scale(diffCenter * Math.min(Math.abs(movementSpeed), .1f) * 4);
movement = movement.add(centering); movement = movement.add(centering);
float step = entityIn.stepHeight; float step = entityIn.stepHeight;
@ -141,11 +147,12 @@ public class BeltMovementHandler {
// Entity Collisions // Entity Collisions
if (Math.abs(movementSpeed) < .5f) { if (Math.abs(movementSpeed) < .5f) {
Vector3d checkDistance = movement.normalize().scale(0.5); Vector3d checkDistance = movement.normalize()
.scale(0.5);
AxisAlignedBB bb = entityIn.getBoundingBox(); AxisAlignedBB bb = entityIn.getBoundingBox();
AxisAlignedBB checkBB = new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); AxisAlignedBB checkBB = new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ);
checkBB = checkBB.offset(checkDistance).grow(-Math.abs(checkDistance.x), -Math.abs(checkDistance.y), checkBB = checkBB.offset(checkDistance)
-Math.abs(checkDistance.z)); .grow(-Math.abs(checkDistance.x), -Math.abs(checkDistance.y), -Math.abs(checkDistance.z));
List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(entityIn, checkBB); List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(entityIn, checkBB);
list.removeIf(e -> shouldIgnoreBlocking(entityIn, e)); list.removeIf(e -> shouldIgnoreBlocking(entityIn, e));
if (!list.isEmpty()) { if (!list.isEmpty()) {
@ -173,7 +180,8 @@ public class BeltMovementHandler {
entityIn.stepHeight = step; entityIn.stepHeight = step;
boolean movedPastEndingSlope = onSlope && (AllBlocks.BELT.has(world.getBlockState(entityIn.getBlockPos())) boolean movedPastEndingSlope = onSlope && (AllBlocks.BELT.has(world.getBlockState(entityIn.getBlockPos()))
|| AllBlocks.BELT.has(world.getBlockState(entityIn.getBlockPos().down()))); || AllBlocks.BELT.has(world.getBlockState(entityIn.getBlockPos()
.down())));
if (movedPastEndingSlope && !movingDown && Math.abs(movementSpeed) > 0) if (movedPastEndingSlope && !movingDown && Math.abs(movementSpeed) > 0)
entityIn.setPosition(entityIn.getX(), entityIn.getY() + movement.y, entityIn.getZ()); entityIn.setPosition(entityIn.getX(), entityIn.getY() + movement.y, entityIn.getZ());
@ -188,7 +196,17 @@ public class BeltMovementHandler {
return true; return true;
if (other instanceof HangingEntity) if (other instanceof HangingEntity)
return true; return true;
return me.isRidingOrBeingRiddenBy(other); return isRidingOrBeingRiddenBy(me, other);
}
public static boolean isRidingOrBeingRiddenBy(Entity me, Entity other) {
for (Entity entity : me.getPassengers()) {
if (entity.equals(other))
return true;
if (isRidingOrBeingRiddenBy(entity, other))
return true;
}
return false;
} }
} }

View File

@ -213,7 +213,7 @@ public class SchematicAndQuillHandler {
t.takeBlocksFromWorld(Minecraft.getInstance().world, origin, bounds, true, Blocks.AIR); t.takeBlocksFromWorld(Minecraft.getInstance().world, origin, bounds, true, Blocks.AIR);
if (string.isEmpty()) if (string.isEmpty())
string = Lang.translate("schematicAndQuill.fallbackName").getUnformattedComponentText(); string = Lang.translate("schematicAndQuill.fallbackName").getString();
String folderPath = "schematics"; String folderPath = "schematics";
FilesHelper.createFolderIfMissing(folderPath); FilesHelper.createFolderIfMissing(folderPath);

View File

@ -71,7 +71,7 @@ public class Label extends AbstractSimiWidget {
public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) {
if (!visible) if (!visible)
return; return;
if (text == null || text.toString().isEmpty()) if (text == null || text.getString().isEmpty())
return; return;
RenderSystem.color4f(1, 1, 1, 1); RenderSystem.color4f(1, 1, 1, 1);