Exemplo n.º 1
0
        public static EntitySpawnPoint From(Int3 batchId, GameObject go, CellManager.CellHeader cellHeader)
        {
            // Why is this not a constructor?
            EntitySpawnPoint esp = new EntitySpawnPoint
            {
                Level   = cellHeader.level,
                ClassId = go.ClassId,
                BatchId = batchId,
                CellId  = cellHeader.cellId
            };

            EntitySlot entitySlot = go.GetComponent <EntitySlot>();

            if (!ReferenceEquals(entitySlot, null))
            {
                esp.BiomeType        = entitySlot.biomeType;
                esp.Density          = entitySlot.density;
                esp.CanSpawnCreature = entitySlot.IsCreatureSlot();
            }

            Vector3 localPosition = go.GetComponent <Transform>().Position;

            Int3.Bounds         bounds = BatchCells.GetBlockBounds(batchId, cellHeader.cellId, 0, Map.BATCH_DIMENSIONS);
            UnityEngine.Vector3 center = EntityCell.GetCenter(bounds);

            esp.Position = new UnityEngine.Vector3(center.x + localPosition.x - Map.BATCH_DIMENSION_CENTERING.x,
                                                   center.y + localPosition.y - Map.BATCH_DIMENSION_CENTERING.y,
                                                   center.z + localPosition.z - Map.BATCH_DIMENSION_CENTERING.z);
            return(esp);
        }
Exemplo n.º 2
0
 public static Array3 <EntityCell> GetCells(this BatchCells batchCells, int level)
 {
     return(GetCellsMethod.Invoke(batchCells, new object[] { level }) as Array3 <EntityCell>);
 }
 public LoadBatchCellsTask(CellManager cellManager, BatchCells batchCells)
 {
     this.cellManager = cellManager;
     this.batchCells  = batchCells;
 }
        public static IEnumerator ScanInSleepingBatchCellsNotQueuesCoroutine(this MapRoomFunctionality mapRoom, int numOfBatchRings)
        {
            var largeWorldStreamer = LargeWorldStreamer.main;
            var cellManager        = LargeWorldStreamer.main.cellManager;

            Logger.Info(string.Format("Starting scan in sleeping/unloaded BatchCells"));

            var batch2Cells = cellManager.GetBatch2Cells();

            var containingBatch = largeWorldStreamer.GetContainingBatch(mapRoom.transform.position);
            var scanBounds      = new Int3.Bounds(containingBatch - numOfBatchRings, containingBatch + numOfBatchRings);

            var orderedScanBatches = scanBounds.ToEnumerable()
                                     .OrderBy(batch => (mapRoom.transform.position - largeWorldStreamer.GetBatchCenter(batch)).sqrMagnitude);

            using (var serializerProxy = ProtobufSerializerPool.GetProxy())
            {
                foreach (var batch in orderedScanBatches)
                {
                    Logger.Debug(string.Format("Now at batch \"{0}\"", batch));

                    var batchVisible = true;
                    if (!batch2Cells.TryGetValue(batch, out var batchCells))
                    {
                        Logger.Debug(string.Format("Loading cells of batch \"{0}\"", batch));

                        batchCells = BatchCells.GetFromPool(cellManager, largeWorldStreamer, batch);

                        var loadBatchCellsTask = new LoadBatchCellsTask(cellManager, batchCells);
                        UWE.Utils.EnqueueWrap(workerThread, loadBatchCellsTask);
                        yield return(new AsyncAwaiter(loadBatchCellsTask));

                        batchVisible = false;
                    }

                    for (int level = 0; level <= 3; level++)
                    {
                        Logger.Debug(string.Format("Getting cells level {0} of batch \"{1}\"", level, batchCells.batch));

                        var cellsTier        = batchCells.GetCells(level);
                        var orderedCellsTier = cellsTier
                                               .Where(cell => cell != null)
                                               .OrderBy(cell => (mapRoom.transform.position - cell.GetCenter()).sqrMagnitude);

                        foreach (var entityCell in orderedCellsTier)
                        {
                            Logger.Debug(string.Format("Getting cell {0} of batch \"{1}\"", entityCell.CellId, batchCells.batch));

                            if (entityCell != null && !entityCell.IsProcessing())
                            {
                                SerialData serialData;
                                if (batchVisible)
                                {
                                    serialData = new SerialData();
                                    serialData.CopyFrom(entityCell.GetSerialData());
                                }
                                else
                                {
                                    serialData = entityCell.GetSerialData();
                                }

                                if (serialData.Length > 0)
                                {
                                    Logger.Debug(string.Format("Entity cell \"{0}\" is not awake and has serialData", entityCell.ToString()));

                                    UnityEngine.GameObject liveRoot;

                                    using (MemoryStream stream = new MemoryStream(serialData.Data.Array, serialData.Data.Offset, serialData.Data.Length, false))
                                    {
                                        bool headerDeserialized = serializerProxy.Value.TryDeserializeStreamHeader(stream);
                                        if (headerDeserialized)
                                        {
                                            CoroutineTask <UnityEngine.GameObject> task = serializerProxy.Value.DeserializeObjectTreeAsync(stream, true, 0);

                                            yield return(task);

                                            liveRoot = task.GetResult();
                                        }
                                        else
                                        {
                                            liveRoot = null;
                                        }
                                    }

                                    if (liveRoot)
                                    {
                                        Logger.Debug(string.Format("Entity cell \"{0}\" can have liveRoot {1}", entityCell.ToString(), liveRoot.ToString()));

                                        var resourceTrackers = liveRoot.GetComponentsInChildren <ResourceTracker>(true);
                                        foreach (var resourceTracker in resourceTrackers)
                                        {
                                            resourceTracker.Start();
                                            Logger.Debug(string.Format("Entity cell \"{0}\" invoked \"Start\" for {1}", entityCell.ToString(), resourceTracker.gameObject.ToString()));

                                            resourceTracker.OnDestroy();
                                        }

                                        UnityEngine.Object.Destroy(liveRoot);
                                    }
                                    else
                                    {
                                        Logger.Debug(string.Format("Entity cell \"{0}\" can't have liveRoot", entityCell.ToString()));
                                    }
                                }

                                SerialData waiterData;
                                if (batchVisible)
                                {
                                    waiterData = new SerialData();
                                    waiterData.CopyFrom(entityCell.GetWaiterData());
                                }
                                else
                                {
                                    waiterData = entityCell.GetWaiterData();
                                }

                                if (waiterData.Length > 0)
                                {
                                    Logger.Debug(string.Format("Entity cell \"{0}\" is not awake and has waiterData", entityCell.ToString()));

                                    UnityEngine.GameObject waiterRoot;

                                    using (MemoryStream stream = new MemoryStream(waiterData.Data.Array, waiterData.Data.Offset, waiterData.Data.Length, false))
                                    {
                                        while (stream.Position < waiterData.Length)
                                        {
                                            CoroutineTask <UnityEngine.GameObject> task = serializerProxy.Value.DeserializeObjectTreeAsync(stream, true, 0);

                                            yield return(task);

                                            waiterRoot = task.GetResult();
                                            if (waiterRoot)
                                            {
                                                Logger.Debug(string.Format("Entity cell \"{0}\" can have waiterRoot {1}", entityCell.ToString(), waiterRoot.ToString()));

                                                var resourceTrackers = waiterRoot.GetComponentsInChildren <ResourceTracker>(true);
                                                foreach (var resourceTracker in resourceTrackers)
                                                {
                                                    resourceTracker.Start();
                                                    Logger.Debug(string.Format("Entity cell \"{0}\" invoked \"Start\" for {1}", entityCell.ToString(), resourceTracker.gameObject.ToString()));

                                                    resourceTracker.OnDestroy();
                                                }

                                                UnityEngine.Object.Destroy(waiterRoot);
                                            }
                                        }
                                    }
                                }

                                SerialData legacyData;
                                if (batchVisible)
                                {
                                    legacyData = new SerialData();
                                    legacyData.CopyFrom(entityCell.GetLegacyData());
                                }
                                else
                                {
                                    legacyData = entityCell.GetLegacyData();
                                }

                                if (legacyData.Length > 0)
                                {
                                    Logger.Debug(string.Format("Entity cell \"{0}\" has legacyData", entityCell.ToString()));

                                    UnityEngine.GameObject legacyRoot;

                                    using (MemoryStream stream = new MemoryStream(legacyData.Data.Array, legacyData.Data.Offset, legacyData.Data.Length, false))
                                    {
                                        bool headerDeserialized = serializerProxy.Value.TryDeserializeStreamHeader(stream);
                                        if (headerDeserialized)
                                        {
                                            CoroutineTask <UnityEngine.GameObject> task = serializerProxy.Value.DeserializeObjectTreeAsync(stream, true, 0);

                                            yield return(task);

                                            legacyRoot = task.GetResult();
                                        }
                                        else
                                        {
                                            legacyRoot = null;
                                        }
                                    }

                                    if (legacyRoot)
                                    {
                                        Logger.Debug(string.Format("Entity cell \"{0}\" can have legacyRoot {1}", entityCell.ToString(), legacyRoot.ToString()));

                                        var resourceTrackers = legacyRoot.GetComponentsInChildren <ResourceTracker>(true);
                                        foreach (var resourceTracker in resourceTrackers)
                                        {
                                            resourceTracker.Start();
                                            Logger.Debug(string.Format("Entity cell \"{0}\" invoked \"Start\" for {1}", entityCell.ToString(), resourceTracker.gameObject.ToString()));

                                            resourceTracker.OnDestroy();
                                        }

                                        UnityEngine.Object.Destroy(legacyRoot);
                                    }
                                }
                            }
                        }
                    }

                    if (!batchVisible)
                    {
                        Logger.Debug(string.Format("Unloading cells of batch \"{0}\"", batch));
                        BatchCells.ReturnToPool(batchCells);
                    }
                    ;

                    yield return(null);
                }
            }
            Logger.Info(string.Format("Finishing scan in sleeping/unloaded BatchCells"));

            yield break;
        }