Esempio n. 1
0
        // Get highest clear block position for the player start
        private Int3 GetPlayerStartPosition(Int3 _worldStartPos)
        {
            Int3 playerStartPos = _worldStartPos;

            for (int i = playerStartPos.y + (Chunk.ChunkSize * RenderDistanceFirstPass); i >= playerStartPos.y - (Chunk.ChunkSize * RenderDistanceFirstPass); i--)
            {
                Int3 checkPos  = new Int3(_worldStartPos.x, i, _worldStartPos.z);
                Int3 checkPos1 = checkPos;
                checkPos1.AddPos(0, 1, 0);
                Int3 checkPos2 = checkPos;
                checkPos2.AddPos(0, 2, 0);
                Int3 checkPosChunk = checkPos;
                checkPosChunk.WorldCoordsToChunkCoords();
                Int3 checkPos1Chunk = checkPos1;
                checkPos1Chunk.WorldCoordsToChunkCoords();
                Int3 checkPos2Chunk = checkPos2;
                checkPos2Chunk.WorldCoordsToChunkCoords();
                if (Instance.ChunkExists(checkPosChunk) && Instance.ChunkExists(checkPos1Chunk) && Instance.ChunkExists(checkPos2Chunk))
                {
                    if (!Instance.GetBlockFromWorldCoords(checkPos).IsTransparent&& Instance.GetBlockFromWorldCoords(checkPos1).IsTransparent&& Instance.GetBlockFromWorldCoords(checkPos2).IsTransparent)
                    {
                        playerStartPos.SetPos(playerStartPos.x, i + 1, playerStartPos.z);
                        return(playerStartPos);
                    }
                }
            }
            System.Random r = new System.Random();
            playerStartPos = this.GetPlayerStartPosition(new Int3(r.Next(-20, 20) + playerStartPos.x, _worldStartPos.y, r.Next(-20, 20) + playerStartPos.z));
            return(playerStartPos);
        }
Esempio n. 2
0
 // Checks visibility of given face
 private static bool CheckVis(int _x, int _y, int _z, Int3 _position, Block[,,] _blocks, Side _side)
 {
     if (_side == Side.Bottom)
     {
         if (_y > 0)
         {
             Block block = _blocks[_x, _y - 1, _z];
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         else if (_y == 0)
         {
             Int3 pos = _position;
             pos.AddPos(0, -1, 0);
             Block block = World.Instance.GetBlockFromWorldCoords(pos);
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         return(false);
     }
     else if (_side == Side.Top)
     {
         if (_y < Chunk.ChunkSize - 1)
         {
             Block block = _blocks[_x, _y + 1, _z];
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         else if (_y == Chunk.ChunkSize - 1)
         {
             Int3 pos = _position;
             pos.AddPos(0, 1, 0);
             Block block = World.Instance.GetBlockFromWorldCoords(pos);
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         return(false);
     }
     else if (_side == Side.Front)
     {
         if (_x > 0)
         {
             Block block = _blocks[_x - 1, _y, _z];
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         else if (_x == 0)
         {
             Int3 pos = _position;
             pos.AddPos(-1, 0, 0);
             Block block = World.Instance.GetBlockFromWorldCoords(pos);
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         return(false);
     }
     else if (_side == Side.Back)
     {
         if (_x < Chunk.ChunkSize - 1)
         {
             Block block = _blocks[_x + 1, _y, _z];
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         else if (_x == Chunk.ChunkSize - 1)
         {
             Int3 pos = _position;
             pos.AddPos(1, 0, 0);
             Block block = World.Instance.GetBlockFromWorldCoords(pos);
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         return(false);
     }
     else if (_side == Side.Left)
     {
         if (_z > 0)
         {
             Block block = _blocks[_x, _y, _z - 1];
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         else if (_z == 0)
         {
             Int3 pos = _position;
             pos.AddPos(0, 0, -1);
             Block block = World.Instance.GetBlockFromWorldCoords(pos);
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         return(false);
     }
     else // Side.Right
     {
         if (_z < Chunk.ChunkSize - 1)
         {
             Block block = _blocks[_x, _y, _z + 1];
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         else if (_z == Chunk.ChunkSize - 1)
         {
             Int3 pos = _position;
             pos.AddPos(0, 0, 1);
             Block block = World.Instance.GetBlockFromWorldCoords(pos);
             return(block.IsTransparent || block.IsSemiTransparent);
         }
         return(false);
     }
 }