private void InitCoffee() { Color coffeeColor = new Color(111 / 255.0f, 78 / 255.0f, 55 / 255.0f, 0.95f); CoffeeEffectParameters coffeeEffect = new CoffeeEffectParameters(main.Effects["Coffee"], main.Textures["CoffeeUV"], main.Textures["CoffeeFlow"], coffeeColor); Transform3D transform3D = new Transform3D(Vector3.Zero, -Vector3.Forward, Vector3.Up); coffee = new Coffee("Coffee", ActorType.Primitive, StatusType.Update | StatusType.Drawn, transform3D, coffeeEffect, main.Models["CoffeePlane"], levelData.coffeeInfo, main.ObjectManager.ActorList.Find(actor3D => actor3D.ActorType == ActorType.Player) as PlayerTile); //Most of these constructor arguments are not used, need to refactor the entire structure. coffee.ControllerList.Add(new CoffeeMovementComponent("cmc", ControllerType.Movement, ActivationType.Activated, 0, Smoother.SmoothingMethod.Smooth, coffee)); coffee.ControllerList.Add(new ColliderComponent("cc Coffee", ControllerType.Collider, (skin0, skin1) => { if (skin1.Owner.ExternalData is Tile tile) { if (tile.TileType == ETileType.Player) { EventManager.FireEvent(new RemoveActorEvent { body = tile.Body }); EventManager.FireEvent(new SoundEventInfo() { category = SoundCategory.UI, sfxType = SfxType.Lose, soundEventType = SoundEventType.PlaySfx }); TimeManager.CallFunctionInSeconds("lose", () => { EventManager.FireEvent(new GameStateMessageEventInfo { GameState = GameState.Lost }); }, 2); } if (tile.SpawnPos.Y < ((Coffee)skin0.Owner.ExternalData).Transform3D.Translation.Y) { EventManager.FireEvent(new RemoveActorEvent { body = tile.Body }); EventManager.FireEvent(new TileEventInfo { Id = tile.ID, Type = TileEventType.Consumed }); } else { tile.Body.SetInactive(); EventManager.FireEvent(new TileEventInfo { Id = tile.ID, Type = TileEventType.Reset, IsEasy = main.IsEasy }); } return(true); } return(false); })); main.ObjectManager.Add(coffee); UiTimeController controller = main.UiManager.UIObjectList.Find(actor2D => actor2D.ID == "TimeText")?.ControllerList[0] as UiTimeController; controller?.SetCoffee(coffee); }