示例#1
0
        private static void ProcessSleepers(Prefab prefab, WorldBase world, Chunk chunk, Vector3i dest)
        {
            var chunkPosMin = Vector3i.zero;
            var chunkPosMax = Vector3i.zero;

            if (chunk != null)
            {
                chunkPosMin = chunk.GetWorldPos();
                chunkPosMax = chunkPosMin + new Vector3i(16, 256, 16);
            }
            for (var index = 0; index < prefab.SleeperVolumesStart.Count; ++index)
            {
                if (!prefab.SleeperVolumeUsed[index])
                {
                    continue;
                }

                var volStart     = prefab.SleeperVolumesStart[index];
                var volSize      = prefab.SleeperVolumesSize[index];
                var volMax       = volStart + volSize;
                var volStartDest = volStart + dest;
                var volMaxDest   = volMax + dest;
                if (chunk != null)
                {
                    if ((volStartDest.x >= chunkPosMax.x || volMaxDest.x <= chunkPosMin.x || volStartDest.y >= chunkPosMax.y || volMaxDest.y <= chunkPosMin.y ||
                         volStartDest.z >= chunkPosMax.z ? 1 : (volMaxDest.z <= chunkPosMin.z ? 1 : 0)) != 0)
                    {
                        continue;
                    }

                    var volKey = world.FindSleeperVolume(volStartDest, volMaxDest);
                    if (volKey == -1)
                    {
                        var volume = SleeperVolume.Create(prefab.SleeperVolumesGroup[index], volStartDest, volMaxDest, dest, prefab.SleeperVolumeGameStageAdjust[index]);
                        volKey = world.AddSleeperVolume(volume);
                        AddSleeperSpawns(prefab, index, dest, volume, volStart, volMax);
                    }
                    chunk.GetSleeperVolumes().Add(volKey);
                }
                else
                {
                    var chunkXz1 = World.toChunkXZ(volStartDest.x);
                    var chunkXz2 = World.toChunkXZ(volMaxDest.x);
                    var chunkXz3 = World.toChunkXZ(volStartDest.z);
                    var chunkXz4 = World.toChunkXZ(volMaxDest.z);
                    var volume   = SleeperVolume.Create(prefab.SleeperVolumesGroup[index], volStartDest, volMaxDest, dest, prefab.SleeperVolumeGameStageAdjust[index]);
                    var volKey   = world.AddSleeperVolume(volume);
                    AddSleeperSpawns(prefab, index, dest, volume, volStart, volMax);
                    for (var chunkX = chunkXz1; chunkX <= chunkXz2; ++chunkX)
                    {
                        for (var chunkZ = chunkXz3; chunkZ <= chunkXz4; ++chunkZ)
                        {
                            ((Chunk)world.GetChunkSync(chunkX, 0, chunkZ))?.GetSleeperVolumes().Add(volKey);
                        }
                    }
                }
            }
        }