public static float getBlockOnRay(Island island, Ray ray, float distMax, float minDist, out Vector3 relBlockPos, out Block actBlock) { float distance = minDist; relBlockPos = MainWorld.AbsToRelative(ray.GetPoint(distance)); do { Vector3 prevRelBlockPos = relBlockPos; while (prevRelBlockPos == relBlockPos) { distance += 3; relBlockPos = MainWorld.AbsToRelative(ray.GetPoint(distance)); } actBlock = island.getBlock(relBlockPos, false); } while (actBlock is Air && distance < distMax); return distance; }
/* * @return wether or not the block has anyVisible faces * @return false if block b is null or b is Air */ private bool updateBlock(int absX, int absY, int absZ, Block b, Chunk c) { if (b == null || b.getName() == "Air") { return false; } bool used = false; MultiBlock val; for (int i = 0; i < 6; i++) { if (!this.mIsland.hasVisibleFaceAt(absX, absY, absZ, (BlockFace)i)) { continue; } used = true; string face = b.getFace(i); if (c.multiList.TryGetValue(face, out val)) { c.dirtyMultiListInsert(face, c.multiList[face]); c.multiList.Remove(face); } else if (!c.dirtyMultiListName.Contains(face)) { c.addBlockType(b.getMeshType(), face); c.dirtyMultiListInsert(face, c.multiList[face]); c.multiList.Remove(face); } } return used; }
public bool setVisibleFacesForPortals(Vector3 blockCoord, Block curr) { bool hasVisiblefaces = false; Dictionary<BlockFace, Vector3> coordToCheck = new Dictionary<BlockFace, Vector3>(); coordToCheck.Add(BlockFace.rightFace, new Vector3(blockCoord.x + 1, blockCoord.y, blockCoord.z)); coordToCheck.Add(BlockFace.leftFace, new Vector3(blockCoord.x - 1, blockCoord.y, blockCoord.z)); coordToCheck.Add(BlockFace.upperFace, new Vector3(blockCoord.x, blockCoord.y + 1, blockCoord.z)); coordToCheck.Add(BlockFace.underFace, new Vector3(blockCoord.x, blockCoord.y - 1, blockCoord.z)); coordToCheck.Add(BlockFace.frontFace, new Vector3(blockCoord.x, blockCoord.y, blockCoord.z + 1)); coordToCheck.Add(BlockFace.backFace, new Vector3(blockCoord.x, blockCoord.y, blockCoord.z - 1)); foreach(KeyValuePair<BlockFace, Vector3> keyVal in coordToCheck) { if(this.getBlock(keyVal.Value, false) is Air && !(this.getBlock(keyVal.Value, false) is TransparentBlock)) { this.setVisibleFaceAt(blockCoord, keyVal.Key, true); hasVisiblefaces = true; } } return hasVisiblefaces; }
public byte[] linearize(Block[, ,] a) { byte[] b = new byte[a.GetLength(0) * a.GetLength(1) * a.GetLength(2)]; int i = 0; for(int x = 0; x < 16; x++) { for(int y = 0; y < 16; y++) { for(int z = 0; z < 16; z++) { b[i] = a[x, y, z].getId(); i++; } } } return b; }