public override void Construct(Blob arguments, EntityUniverseFacade entityUniverseFacade)
        {
            _despawn      = arguments.GetBool("despawn", false);
            Location      = arguments.FetchBlob("location").GetVector3I();
            Configuration = GameContext.TileDatabase.GetTileConfiguration(arguments.GetString("tile"));
            if (_logicOwner == EntityId.NullEntityId)
            {
                var blob = BlobAllocator.Blob(true);

                blob.SetString("tile", Configuration.Code);
                blob.FetchBlob("location").SetVector3I(Location);
                blob.SetBool("ignoreSpawn", _despawn);

                var entities = new Lyst <Entity>();

                entityUniverseFacade.FindAllEntitiesInRange(entities, Location.ToVector3D(), 1F, entity => {
                    if (entity.Removed)
                    {
                        return(false);
                    }

                    if (entity.Logic is GeneratorTileEntityLogic logic)
                    {
                        return(Location == logic.Location);
                    }

                    return(false);
                });

                var tileEntity = entities.FirstOrDefault();

                if (tileEntity != default(Entity))
                {
                    _logicOwner = tileEntity.Id;
                }
                else
                {
                    var components = Configuration.Components.Select <GeneratorComponent>().ToList();
                    if (components.Any())
                    {
                        var component = components.First();

                        if (component.Type == "solar")
                        {
                            _logicOwner = ChargeableTileEntityBuilder.Spawn(Location, blob, entityUniverseFacade, SolarPanelTileEntityBuilder.KindCode).Id;
                        }
                        else if (component.Type == "waterMill")
                        {
                            _logicOwner = ChargeableTileEntityBuilder.Spawn(Location, blob, entityUniverseFacade, WaterMillTileEntityBuilder.KindCode).Id;
                        }
                    }
                }
            }
        }
        public override void Construct(Blob arguments, EntityUniverseFacade entityUniverseFacade)
        {
            Location      = arguments.FetchBlob("location").GetVector3I();
            Configuration = GameContext.TileDatabase.GetTileConfiguration(arguments.GetString("tile"));
            if (_logicOwner == EntityId.NullEntityId)
            {
                if (Configuration.Components.Contains <SwitchTileComponent>())
                {
                    var components = Configuration.Components.Get <SwitchTileComponent>();

                    On  = GameContext.TileDatabase.GetTileConfiguration(components.On);
                    Off = GameContext.TileDatabase.GetTileConfiguration(components.Off);
                }

                var blob = BlobAllocator.Blob(true);

                blob.SetString("tile", Configuration.Code);
                blob.FetchBlob("location").SetVector3I(Location);

                var entities = new Lyst <Entity>();

                entityUniverseFacade.FindAllEntitiesInRange(entities, Location.ToVector3D(), 1F, entity => {
                    if (entity.Removed)
                    {
                        return(false);
                    }

                    if (entity.Logic is SwitchTileEntityLogic logic)
                    {
                        return(Location == logic.Location);
                    }

                    return(false);
                });

                var tileEntity = entities.FirstOrDefault();

                if (tileEntity != default(Entity))
                {
                    _logicOwner = tileEntity.Id;
                }
                else
                {
                    _logicOwner = SwitchTileEntityBuilder.Spawn(Location, blob, entityUniverseFacade).Id;
                }
            }
        }
        public override void Update(Timestep timestep, EntityUniverseFacade universe)
        {
            Tile tile;

            if (!universe.ReadTile(Location, TileAccessFlags.None, out tile))
            {
                return;
            }
            if ((tile.Configuration != _configuration) || (_variant != tile.Variant()))
            {
                _done = true;
                if (tile.Configuration == _configuration)
                {
                    universe.RemoveTile(Entity, Location, TileAccessFlags.None);
                }
                return;
            }

            _countPosition = tile.Configuration.TileCenterTop(Location, tile);

            Vector3F tileOffset;

            if (universe.TileOffset(Location, TileAccessFlags.None, out tileOffset))
            {
                _countPosition.Y += tileOffset.Y;
            }

            CheckIfEntityExists();

            if (!IsClaimed() || !Totem.HasGameStarted())
            {
                return;
            }

            if (SpawnFireworksStart + (long)(_goalComponent.FireworkLaunchingLength * Constants.TimestepsPerSecond) > timestep)
            {
                if (timestep - _lastSpawn > _goalComponent.FireworkTimeBetweenLaunch * Constants.TimestepsPerSecond)
                {
                    _lastSpawn = timestep;
                    SpawnFireworks(universe);
                }
                return;
            }

            if (Totem.CanStartNewGame())
            {
                return;
            }

            // get all entities inside the goal area
            var entities = universe.FindAllEntitiesInRange(tile.Configuration.TileCenter(Location, tile.Variant()), (float)_boundingShape.Radius.Length(),
                                                           FindEntityCondition);

            if (entities == null || entities.Count <= 0)
            {
                return;
            }

            // if an item has moved into the goal area increase the score
            Console.WriteLine("Checking all entities in collision.");
            foreach (var entity in entities)
            {
                var itemlogic = entity.Logic as ItemEntityLogic;
                if (itemlogic == null)
                {
                    continue;
                }
                Console.WriteLine("There is an item logic.");
                ItemStack stack = (ItemStack)GetInstanceField(typeof(ItemEntityLogic), itemlogic, "Stack"); //Use reflection to find internal stack
                if (stack.Item.Configuration.Code == "mods.Deamon.Soccer.item.SoccerBall")
                {
                    SetInstanceField(typeof(ItemEntityLogic), itemlogic, "Stack", new ItemStack());
                    Totem.IncreaseScore(Team, timestep); //Increase the score
                }
            }
        }