Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 88 additions & 34 deletions src/main/java/xyz/nucleoid/map_templates/MapTransform.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,43 +9,11 @@

public interface MapTransform {
static MapTransform translation(int x, int y, int z) {
return new MapTransform() {
@Override
public BlockPos.Mutable transformPoint(BlockPos.Mutable mutablePos) {
return mutablePos.move(x, y, z);
}

@Override
public Vec3d transformedPoint(Vec3d pos) {
return pos.add(x, y, z);
}
};
return new Translation(x, y, z);
}

static MapTransform rotationAround(BlockPos pivot, BlockRotation rotation, BlockMirror mirror) {
return new MapTransform() {
@Override
public BlockPos.Mutable transformPoint(BlockPos.Mutable mutablePos) {
var result = this.transformedPoint(mutablePos);
mutablePos.set(result);
return mutablePos;
}

@Override
public BlockPos transformedPoint(BlockPos pos) {
return StructureTemplate.transformAround(pos, mirror, rotation, pivot);
}

@Override
public Vec3d transformedPoint(Vec3d pos) {
return StructureTemplate.transformAround(pos, mirror, rotation, pivot);
}

@Override
public BlockState transformedBlock(BlockState state) {
return state.rotate(rotation).mirror(mirror);
}
};
return new Rotation(mirror, rotation, pivot);
}

BlockPos.Mutable transformPoint(BlockPos.Mutable mutablePos);
Expand All @@ -68,4 +36,90 @@ default BlockBounds transformedBounds(BlockBounds bounds) {
default BlockState transformedBlock(BlockState state) {
return state;
}

class Translation implements MapTransform {
private final int x;
private final int y;
private final int z;

public Translation(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}

@Override
public BlockPos.Mutable transformPoint(BlockPos.Mutable mutablePos) {
return mutablePos.move(x, y, z);
}

@Override
public Vec3d transformedPoint(Vec3d pos) {
return pos.add(x, y, z);
}

@Override
public final boolean equals(Object o) {
if (!(o instanceof Translation that)) return false;

return x == that.x && y == that.y && z == that.z;
}

@Override
public int hashCode() {
int result = x;
result = 31 * result + y;
result = 31 * result + z;
return result;
}
}

class Rotation implements MapTransform {
private final BlockMirror mirror;
private final BlockRotation rotation;
private final BlockPos pivot;

public Rotation(BlockMirror mirror, BlockRotation rotation, BlockPos pivot) {
this.mirror = mirror;
this.rotation = rotation;
this.pivot = pivot;
}

@Override
public BlockPos.Mutable transformPoint(BlockPos.Mutable mutablePos) {
var result = this.transformedPoint(mutablePos);
mutablePos.set(result);
return mutablePos;
}

@Override
public BlockPos transformedPoint(BlockPos pos) {
return StructureTemplate.transformAround(pos, mirror, rotation, pivot);
}

@Override
public Vec3d transformedPoint(Vec3d pos) {
return StructureTemplate.transformAround(pos, mirror, rotation, pivot);
}

@Override
public BlockState transformedBlock(BlockState state) {
return state.rotate(rotation).mirror(mirror);
}

@Override
public final boolean equals(Object o) {
if (!(o instanceof Rotation rotation1)) return false;

return mirror == rotation1.mirror && rotation == rotation1.rotation && pivot.equals(rotation1.pivot);
}

@Override
public int hashCode() {
int result = mirror.hashCode();
result = 31 * result + rotation.hashCode();
result = 31 * result + pivot.hashCode();
return result;
}
}
}