// 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); }
// 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); } }