示例#1
0
        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;
        }
示例#2
0
        /*
         * @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;
        }
示例#3
0
        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;
        }
示例#4
0
 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;
 }