public override void Initialize()
        {
            base.Initialize();

            _internalSolution           = Owner.EnsureComponent <SolutionContainerComponent>();
            _internalSolution.MaxVolume = _initialMaxVolume;
        }
示例#2
0
        public override void Initialize()
        {
            base.Initialize();
            Owner.TryGetComponent(out _appearanceComponent);

            if (!Owner.TryGetComponent(out _contents))
            {
                _contents = Owner.AddComponent <SolutionContainerComponent>();
            }

            _contents.Capabilities = SolutionContainerCaps.AddTo | SolutionContainerCaps.RemoveFrom;
            Opened = _defaultToOpened;
            UpdateAppearance();
        }
示例#3
0
        public async Task TryAllTest()
        {
            var server = StartServerDummyTicker();

            await server.WaitIdleAsync();

            var mapManager       = server.ResolveDependency <IMapManager>();
            var entityManager    = server.ResolveDependency <IEntityManager>();
            var prototypeManager = server.ResolveDependency <IPrototypeManager>();

            foreach (var reactionPrototype in prototypeManager.EnumeratePrototypes <ReactionPrototype>())
            {
                //since i have no clue how to isolate each loop assert-wise im just gonna throw this one in for good measure
                Console.WriteLine($"Testing {reactionPrototype.ID}");

                IEntity beaker;
                SolutionContainerComponent component = null;

                server.Assert(() =>
                {
                    mapManager.CreateNewMapEntity(MapId.Nullspace);

                    beaker = entityManager.SpawnEntity("BluespaceBeaker", MapCoordinates.Nullspace);
                    Assert.That(beaker.TryGetComponent(out component));
                    foreach (var(id, reactant) in reactionPrototype.Reactants)
                    {
                        Assert.That(component.TryAddReagent(id, reactant.Amount, out var quantity));
                        Assert.That(reactant.Amount, Is.EqualTo(quantity));
                    }
                });

                await server.WaitIdleAsync();

                server.Assert(() =>
                {
                    //you just got linq'd fool
                    //(i'm sorry)
                    var foundProductsMap = reactionPrototype.Products
                                           .Concat(reactionPrototype.Reactants.Where(x => x.Value.Catalyst).ToDictionary(x => x.Key, x => x.Value.Amount))
                                           .ToDictionary(x => x, x => false);
                    foreach (var reagent in component.Solution.Contents)
                    {
                        Assert.That(foundProductsMap.TryFirstOrNull(x => x.Key.Key == reagent.ReagentId && x.Key.Value == reagent.Quantity, out var foundProduct));
                        foundProductsMap[foundProduct.Value.Key] = true;
                    }

                    Assert.That(foundProductsMap.All(x => x.Value));
                });
            }
        }
示例#4
0
        private void Update(float frameTime, VaporComponent vapor, SolutionContainerComponent contents)
        {
            if (!vapor.Active)
            {
                return;
            }

            var entity = vapor.Owner;

            vapor.Timer      += frameTime;
            vapor.ReactTimer += frameTime;

            if (vapor.ReactTimer >= ReactTime && vapor.Owner.Transform.GridID.IsValid())
            {
                vapor.ReactTimer = 0;
                var mapGrid = _mapManager.GetGrid(entity.Transform.GridID);

                var tile = mapGrid.GetTileRef(entity.Transform.Coordinates.ToVector2i(EntityManager, _mapManager));
                foreach (var reagentQuantity in contents.ReagentList.ToArray())
                {
                    if (reagentQuantity.Quantity == ReagentUnit.Zero)
                    {
                        continue;
                    }
                    var reagent = _protoManager.Index <ReagentPrototype>(reagentQuantity.ReagentId);
                    contents.TryRemoveReagent(reagentQuantity.ReagentId, reagent.ReactionTile(tile, (reagentQuantity.Quantity / vapor.TransferAmount) * 0.25f));
                }
            }

            // Check if we've reached our target.
            if (!vapor.Reached && vapor.Target.TryDistance(EntityManager, entity.Transform.Coordinates, out var distance) && distance <= 0.5f)
            {
                vapor.Reached = true;
            }

            if (contents.CurrentVolume == 0 || vapor.Timer > vapor.AliveTime)
            {
                // Delete this
                entity.QueueDelete();
            }
        }