Beispiel #1
0
    public static Chunk NewFilledChunk(World world, Position chunkPos, int blockID)
    {
        BlockDef definition     = BlockDefManager.GetBlockDef(blockID);
        Chunk    chunk          = new Chunk(world, chunkPos);
        Position globalChunkPos = chunkPos.MultAll(CHUNK_SIZE);

        int x, y, z;

        for (x = 0; x < CHUNK_SIZE; x++)
        {
            for (y = 0; y < CHUNK_SIZE; y++)
            {
                for (z = 0; z < CHUNK_SIZE; z++)
                {
                    chunk.Blocks[x, y, z] = new Block(definition, globalChunkPos.Add(x, y, z), chunk);
                }
            }
        }

        if (definition.BlockType == BlockDef.TYPE_FLUID)
        {
            for (x = 0; x < CHUNK_SIZE; x++)
            {
                for (y = 0; y < CHUNK_SIZE; y++)
                {
                    for (z = 0; z < CHUNK_SIZE; z++)
                    {
                        chunk.fluids.Add(new Fluid(chunk.Blocks[x, y, z]));
                    }
                }
            }
        }

        return(chunk);
    }
Beispiel #2
0
    /// <summary>
    /// Remplace le bloc présent aux coordonées indiquées.
    /// </summary>
    public bool SetLocalBlock(int id, Position localBlockPos)
    {
        if (!IsValid(localBlockPos))
        {
            return(false);
        }

        BlockDef definition = BlockDefManager.GetBlockDef(id);

        if (definition == null)
        {
            return(false);
        }

        Block block = Blocks[localBlockPos.X, localBlockPos.Y, localBlockPos.Z];

        if (block.Definition.BlockType == BlockDef.TYPE_FLUID)
        {
            RemoveFluid(block);
        }

        block.Definition = definition;

        if (definition.BlockType == BlockDef.TYPE_FLUID)
        {
            fluids.Add(new Fluid(block));
        }

        altered = true;
        RecalculateMesh();

        return(true);
    }
Beispiel #3
0
    private static void SetBlockOreGen(Chunk chunk)
    {
        for (int x = 0; x < CHUNK_SIZE; x++)
        {
            for (int y = 0; y < CHUNK_SIZE; y++)
            {
                for (int z = 0; z < CHUNK_SIZE; z++)
                {
                    if (chunk.Blocks[x, y, z].ID != Block.AIR_BLOCK_ID)
                    {
                        if (Utils.rand.Next(1, 100) < 35)
                        {
                            return;
                        }

                        BlockDef ore = BlockDefManager.RandomBlock(BlockDef.TYPE_ORE);
                        chunk.Blocks[x, y, z].Definition = ore;

                        int gen = 50;

                        //down
                        SetBlockWithProbability(chunk, new Position(x + 1, y - 1, z + 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x - 1, y - 1, z - 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x + 1, y - 1, z - 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x - 1, y - 1, z + 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x, y - 1, z), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x - 1, y - 1, z), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x + 1, y - 1, z), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x, y - 1, z - 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x, y - 1, z + 1), ore, gen);

                        //up
                        SetBlockWithProbability(chunk, new Position(x + 1, y + 1, z + 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x - 1, y + 1, z - 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x + 1, y + 1, z - 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x - 1, y + 1, z + 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x, y + 1, z), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x - 1, y + 1, z), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x + 1, y + 1, z), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x, y + 1, z - 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x, y + 1, z + 1), ore, gen);

                        //sides
                        SetBlockWithProbability(chunk, new Position(x + 1, y, z + 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x - 1, y, z - 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x + 1, y, z - 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x - 1, y, z + 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x - 1, y, z), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x + 1, y, z), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x, y, z - 1), ore, gen);
                        SetBlockWithProbability(chunk, new Position(x, y, z + 1), ore, gen);
                    }
                }
            }
        }
    }
Beispiel #4
0
 private static void SetBlocks3DNoise(Position globalChunkPos, Chunk chunk)
 {
     for (int x = 0; x < CHUNK_SIZE; x++)
     {
         for (int y = 0; y < CHUNK_SIZE; y++)
         {
             for (int z = 0; z < CHUNK_SIZE; z++)
             {
                 Position blockPos   = globalChunkPos.Add(x, y, z);
                 float    noiseValue = Noise.CalcPixel3D(blockPos.X, blockPos.Y, blockPos.Z, 0.015f);
                 chunk.Blocks[x, y, z] = new Block(BlockDefManager.GetBlockDef(noiseValue > 80 ? 2 : 0), blockPos, chunk);
             }
         }
     }
 }
Beispiel #5
0
    private static void SetBlocks2DNoise(Position globalChunkPos, Chunk chunk, int baseGlobalPosition)
    {
        int   raise          = globalChunkPos.Y - baseGlobalPosition + 90;
        float heightSmoother = 0.5f;

        for (int x = 0; x < CHUNK_SIZE; x++)
        {
            for (int z = 0; z < CHUNK_SIZE; z++)
            {
                Position blockPos   = globalChunkPos.Add(x, 0, z);
                float    noiseValue = Noise.CalcPixel2D(Mathf.Abs(blockPos.X), Mathf.Abs(blockPos.Z), 0.002f) * heightSmoother;
                for (int y = 0; y < CHUNK_SIZE; y++)
                {
                    chunk.Blocks[x, y, z] = new Block(BlockDefManager.GetBlockDef(noiseValue > (raise + y) ? 1 : 0), blockPos.Add(0, y, 0), chunk);
                }
            }
        }
    }
Beispiel #6
0
    // Use this for initialization
    void Start()
    {
        instance = this;
        BlockDefManager.InitBlockDefinitions();
        BlockDefManager.BakeTextureAtlas();

        Chunk.InitChunkObject();
        AsyncChunkOps.Init();

        Settings.loadDistance = loadDistance;

        Save save = new Save("testSave");
        int  seed = 179443212;

        world = save.CreateWorld(0, seed, player.transform.position);

        world.GetChunk(new Position(0, 1, 0)).SetLocalBlock(200, new Position(15, 0, 15));
        world.GetChunk(new Position(0, 1, 0)).SetLocalBlock(200, new Position(5, 5, 5));
    }
Beispiel #7
0
    /// <summary>
    /// Remplace les blocs présents entre les deux coordonées locales indiquées.
    /// </summary>
    public bool SetLocalBlockBatch(int id, Position first, Position second)
    {
        if (!IsValid(first, second))
        {
            return(false);
        }

        BlockDef newDef = BlockDefManager.GetBlockDef(id);

        if (newDef == null)
        {
            return(false);
        }

        Position.Smooth(first, second);

        for (int x = first.X; x <= second.X; x++)
        {
            for (int y = first.Y; y <= second.Y; y++)
            {
                for (int z = first.Z; z <= second.Z; z++)
                {
                    Block block = Blocks[x, y, z];
                    if (block.Definition.BlockType == BlockDef.TYPE_FLUID)
                    {
                        RemoveFluid(block);
                    }

                    block.Definition = newDef;
                    if (newDef.BlockType == BlockDef.TYPE_FLUID)
                    {
                        fluids.Add(new Fluid(block));
                    }
                }
            }
        }

        altered = true;
        RecalculateMesh();

        return(true);
    }
Beispiel #8
0
    private static Chunk NewTestChunk(World world, Position position)
    {
        Chunk    chunk          = new Chunk(world, position);
        Position globalChunkPos = position.MultAll(CHUNK_SIZE);

        int x, y, z;

        for (x = 0; x < CHUNK_SIZE; x++)
        {
            for (y = 0; y < CHUNK_SIZE; y++)
            {
                for (z = 0; z < CHUNK_SIZE; z++)
                {
                    float value = Random.value;
                    chunk.Blocks[x, y, z] = new Block(BlockDefManager.GetBlockDef(value > 0.3f ? value < 0.7f ? 1 : 2 : 102), globalChunkPos.Add(x, y, z), chunk);
                }
            }
        }

        return(chunk);
    }
Beispiel #9
0
    public static Chunk LoadChunk(World world, Position chunkPos)
    {
        if (!Directory.Exists(world.SaveDir))
        {
            return(null);
        }

        string filePath = world.SaveDir + "[" + chunkPos.X + "." + chunkPos.Y + "." + chunkPos.Z + "].chunk";

        if (!File.Exists(filePath))
        {
            return(CreateChunk(world, chunkPos));
        }

        Chunk    newChunk       = new Chunk(world, chunkPos);
        Position globalChunkPos = chunkPos.MultAll(CHUNK_SIZE);

        using (var reader = new BinaryReader(File.Open(filePath, FileMode.Open)))
        {
            int  x = 0, y = 0, z = 0, len;
            bool filled = false;
            while (!filled)
            {
                len = reader.ReadInt32();
                BlockDef definition = BlockDefManager.GetBlockDef(reader.ReadInt32());

                while (len-- > 0)
                {
                    newChunk.Blocks[x, y, z] = new Block(definition, globalChunkPos.Add(x, y, z), newChunk);

                    if (definition.BlockType == BlockDef.TYPE_FLUID)
                    {
                        newChunk.fluids.Add(new Fluid(newChunk.Blocks[x, y, z]));
                    }

                    if (z >= 15)
                    {
                        z = 0;
                        if (y >= 15)
                        {
                            y = 0;
                            if (x >= 15)
                            {
                                filled = true;
                                break;
                            }
                            ++x;
                        }
                        else
                        {
                            ++y;
                        }
                    }
                    else
                    {
                        ++z;
                    }
                }
            }
        }

        newChunk.altered = false;
        return(newChunk);
    }