Exemplo n.º 1
0
    private void LoadInSingleChunk(ChunkData data)
    {
        Debug.BeginDeepProfile("chunk_load");
        //Initiate chunk
        Vec2i chunk = new Vec2i(data.X, data.Z);

        if (LoadedChunks.ContainsKey(chunk))
        {
            return;
        }
        GameObject chunkObject = Instantiate(ResourceManager.ChunkPrefab);

        chunkObject.transform.parent = transform;
        chunkObject.name             = "Chunk " + chunk;

        //LoadedChunk loadedChunk = chunkObject.AddComponent<LoadedChunk>();
        LoadedChunk loadedChunk = chunkObject.GetComponent <LoadedChunk>();

        ChunkData[] neigh = { GetChunk(chunk.x, chunk.z + 1), GetChunk(chunk.x + 1, chunk.z + 1), GetChunk(chunk.x + 1, chunk.z) };

        //ChunkData[] neigh = { null, null, null };


        loadedChunk.SetChunkData(data, neigh);

        LoadedChunks.Add(chunk, loadedChunk);

        GameManager.EntityManager.LoadChunk(World.ChunkBases[chunk.x, chunk.z], chunk);
        Debug.EndDeepProfile("chunk_load");
    }
Exemplo n.º 2
0
 public void UnloadChunk(Vec2i chunk)
 {
     if (LoadedChunks.ContainsKey(chunk))
     {
         LoadedChunk loaded = LoadedChunks[chunk];
         LoadedChunks.Remove(chunk);
         GameManager.EntityManager.UnloadChunk(chunk);
         Destroy(loaded.gameObject);
     }
 }
Exemplo n.º 3
0
    private void LoadChunk(ChunkData c)
    {
        GameObject chunkObject = new GameObject(); //We create a new empty gameobject for the chunk

        chunkObject.transform.parent = transform;
        chunkObject.name             = "Chunk " + c;

        LoadedChunk loadedChunk = chunkObject.AddComponent <LoadedChunk>();

        loadedChunk.SetChunkData(c, new ChunkData[] { null, null, null });
    }
Exemplo n.º 4
0
    /// <summary>
    /// Loads all chunks within a square of size 2*radius centred on the player
    /// </summary>
    /// <param name="middle"></param>
    /// <param name="radius"></param>
    public void LoadChunks(Vec2i middle, int radius, bool forceLoad)
    {
        LoadedChunksCentre = middle;
        //Create lists to hold chunks to load and unload
        List <Vec2i> toLoad = new List <Vec2i>((LoadChunkRadius * 2) * (LoadChunkRadius * 2));

        toLoad.AddRange(ToLoad);
        List <Vec2i> toUnload = new List <Vec2i>(100);

        //Iterate all loaded chunks and add to to unload
        foreach (KeyValuePair <Vec2i, LoadedChunk> kvp in LoadedChunks)
        {
            toUnload.Add(kvp.Key);
        }
        for (int x = -radius; x <= radius; x++)
        {
            for (int z = -radius; z <= radius; z++)
            {
                if (x + middle.x < 0 || x + middle.x >= World.WorldSize - 1 || z + middle.z < 0 || z + middle.z >= World.WorldSize - 1)
                {
                    continue;
                }
                Vec2i pos = new Vec2i(x + middle.x, z + middle.z);
                //If it is already loaed, remove it from the to remove
                if (toUnload.Contains(pos))
                {
                    toUnload.Remove(pos);
                }
                else if (!toLoad.Contains(pos))
                {
                    toLoad.Add(pos);
                }
            }
        }
        foreach (Vec2i v in toLoad)
        {
            if (LoadChunk(v, forceLoad))
            {
                ToLoad.Remove(v);
            }
        }
        List <LoadedChunk> toUnloadChunks = new List <LoadedChunk>(20);

        foreach (Vec2i v in toUnload)
        {
            LoadedChunk lc = LoadedChunks[v];
            LoadedChunks.Remove(v);
            Destroy(lc.gameObject);
            GameManager.EntityManager.UnloadChunk(v);
        }
    }
Exemplo n.º 5
0
    public void LoadSubworldChunks(Subworld sub)
    {
        UnloadAllChunks();
        InSubworld = true;
        foreach (ChunkData c in sub.SubworldChunks)
        {
            int        x           = c.X;
            int        z           = c.Z;
            GameObject chunkObject = Instantiate(ResourceManager.ChunkPrefab);;  //We create a new empty gameobject for the chunk
            chunkObject.transform.parent = transform;
            chunkObject.name             = "sw" + sub.SubworldID + "_" + c.X + "_" + c.Z;
            LoadedChunk loadedChunk = chunkObject.AddComponent <LoadedChunk>();

            ChunkData[] neigh = { sub.GetChunkSafe(x, z + 1), sub.GetChunkSafe(x + 1, z + 1), sub.GetChunkSafe(x + 1, z) };

            loadedChunk.SetChunkData(c, neigh);
            SubworldChunks.Add(new Vec2i(x, z), loadedChunk);
        }
    }
Exemplo n.º 6
0
    /// <summary>
    /// Destroys the object at the given point
    /// TODO - make sure multi-tile objects are destroyed correctly.
    /// TODO - make sure objects with listeners (inventory that destroy on empty) have lsiteners removed correctly
    /// </summary>
    /// <param name="worldPos"></param>
    public void DestroyWorldObject(Vec2i worldPos)
    {
        Vec2i     chunkPos = World.GetChunkPosition(worldPos);
        ChunkData c        = CRManager.GetChunk(chunkPos);

        c.SetObject(worldPos.x, worldPos.z, null);
        //c.Objects[worldPos.x % World.ChunkSize, worldPos.z % World.ChunkSize] = null;
        LoadedChunk loaded = CRManager.GetLoadedChunk(chunkPos);

        Debug.Log("Destroy: " + worldPos);
        if (loaded != null)
        {
            if (loaded.LoadedWorldObjects[worldPos.x % World.ChunkSize, worldPos.z % World.ChunkSize] != null)
            {
                Destroy(loaded.LoadedWorldObjects[worldPos.x % World.ChunkSize, worldPos.z % World.ChunkSize].gameObject);
                loaded.LoadedWorldObjects[worldPos.x % World.ChunkSize, worldPos.z % World.ChunkSize] = null;
            }
        }
    }
Exemplo n.º 7
0
    /// <summary>
    /// Adds the given world object to the given world position.
    /// If the object is placed in a loaded chunk, then we load the object into the game
    /// </summary>
    /// <param name="worldPos"></param>
    /// <param name="worldObject"></param>
    public void AddNewObject(WorldObjectData worldObject)
    {
        //Get relevent chunk of object placement.
        Vec2i     chunkPos = World.GetChunkPosition(worldObject.WorldPosition);
        ChunkData c        = CRManager.GetChunk(chunkPos);

        Vec2i localPos = new Vec2i(worldObject.WorldPosition.x % World.ChunkSize, worldObject.WorldPosition.z % World.ChunkSize);

        c.SetObject(localPos.x, localPos.z, worldObject);

        //Check if the object has been added to a loaded chunk
        LoadedChunk loaded = CRManager.GetLoadedChunk(chunkPos);

        if (loaded != null)
        {
            WorldObject newObject = worldObject.CreateWorldObject(loaded.transform);

            loaded.LoadedWorldObjects[localPos.x, localPos.z] = newObject;
        }
    }