/** * @param other * @return The region that is encompassed by both this and other. If they * do not overlap then the empty region is returned */ public Region3i intersect(Region3i other) { Vector3i intersectMin = min(); intersectMin.max(other.min()); Vector3i intersectMax = max(); intersectMax.min(other.max()); return createFromMinMax(intersectMin, intersectMax); }
/** * @param pos * @return The nearest position within the region to the given pos. */ public Vector3i getNearestPointTo(BaseVector3i pos) { Vector3i result = new Vector3i(pos); result.min(max()); result.max(min); return result; }
/** * Creates a new region that is the same as this region but expanded in all directions by the given amount * * @param amount * @return A new region */ public Region3i expand(int amount) { Vector3i expandedMin = min(); expandedMin.sub(amount, amount, amount); Vector3i expandedMax = max(); expandedMax.add(amount, amount, amount); return createFromMinMax(expandedMin, expandedMax); }
public Region3i expand(BaseVector3i amount) { Vector3i expandedMin = min(); expandedMin.sub(amount); Vector3i expandedMax = max(); expandedMax.add(amount); return createFromMinMax(expandedMin, expandedMax); }
public Region3i expandToContain(BaseVector3i adjPos) { Vector3i expandedMin = min(); expandedMin.min(adjPos); Vector3i expandedMax = max(); expandedMax.max(adjPos); return createFromMinMax(expandedMin, expandedMax); }
@ReceiveEvent public void openDoor(OpenDoorEvent event, EntityRef player) { EntityRef entity = event.getDoorEntity(); DoorComponent door = entity.getComponent(DoorComponent.class); Side newSide = door.openSide; BlockRegionComponent regionComp = entity.getComponent(BlockRegionComponent.class); Block bottomBlock = door.bottomBlockFamily.getBlockForPlacement(regionComp.region.min(), newSide, Side.TOP); worldProvider.setBlock(regionComp.region.min(), bottomBlock); Block topBlock = door.topBlockFamily.getBlockForPlacement(regionComp.region.max(), newSide, Side.TOP); worldProvider.setBlock(regionComp.region.max(), topBlock); if (door.openSound != null) { entity.send(new PlaySoundEvent(door.openSound, 1f)); } door.isOpen = true; } }
@ReceiveEvent public void closeDoor(CloseDoorEvent event, EntityRef player) { EntityRef entity = event.getDoorEntity(); DoorComponent door = entity.getComponent(DoorComponent.class); Side newSide = door.closedSide; BlockRegionComponent regionComp = entity.getComponent(BlockRegionComponent.class); Block bottomBlock = door.bottomBlockFamily.getBlockForPlacement(regionComp.region.min(), newSide, Side.TOP); worldProvider.setBlock(regionComp.region.min(), bottomBlock); Block topBlock = door.topBlockFamily.getBlockForPlacement(regionComp.region.max(), newSide, Side.TOP); worldProvider.setBlock(regionComp.region.max(), topBlock); if (door.closeSound != null) { entity.send(new PlaySoundEvent(door.closeSound, 1f)); } door.isOpen = false; entity.saveComponent(door); }
Vector3i sideDir = side.getVector3i(); Vector3i min = region.min(); Vector3i max = region.max(); Vector3i edgeMin = new Vector3i(min); Vector3i edgeMax = new Vector3i(max);
@Test public void testCreateRegionWithMinMax() { List<Vector3i> mins = Arrays.asList(new Vector3i(), new Vector3i(1, 1, 1), new Vector3i(3, 4, 5)); List<Vector3i> expectedSize = Arrays.asList(new Vector3i(1, 1, 1), new Vector3i(3, 3, 3), new Vector3i(8, 5, 2)); List<Vector3i> max = Arrays.asList(new Vector3i(), new Vector3i(3, 3, 3), new Vector3i(10, 8, 6)); for (int i = 0; i < mins.size(); ++i) { Region3i region = Region3i.createFromMinMax(mins.get(i), max.get(i)); assertEquals(mins.get(i), region.min()); assertEquals(max.get(i), region.max()); assertEquals(expectedSize.get(i), region.size()); assertFalse(region.isEmpty()); } }
@Override public void setDirtyAround(Region3i region) { Vector3i minPos = new Vector3i(region.min()); minPos.sub(1, 1, 1); Vector3i maxPos = new Vector3i(region.max()); maxPos.add(1, 1, 1); Vector3i minChunk = ChunkMath.calcChunkPos(minPos, chunkPower); Vector3i maxChunk = ChunkMath.calcChunkPos(maxPos, chunkPower); for (Vector3i pos : Region3i.createFromMinMax(minChunk, maxChunk)) { chunks[pos.x + offset.x + chunkRegion.size().x * (pos.z + offset.z)].setDirty(true); } }
@Test public void testCreateRegionWithMinAndSize() { List<Vector3i> mins = Arrays.asList(new Vector3i(), new Vector3i(1, 1, 1), new Vector3i(3, 4, 5)); List<Vector3i> size = Arrays.asList(new Vector3i(1, 1, 1), new Vector3i(3, 3, 3), new Vector3i(8, 5, 2)); List<Vector3i> expectedMax = Arrays.asList(new Vector3i(), new Vector3i(3, 3, 3), new Vector3i(10, 8, 6)); for (int i = 0; i < mins.size(); ++i) { Region3i region = Region3i.createFromMinAndSize(mins.get(i), size.get(i)); assertEquals(mins.get(i), region.min()); assertEquals(size.get(i), region.size()); assertEquals(expectedMax.get(i), region.max()); assertFalse(region.isEmpty()); } }