using System; using System.Collections.Generic; using System.Linq; using Code.D.Cleaning.CleanTools; using Code.D.Cleaning.UI; using Code.D.Player; using Code.Game.Gameplay.Player; using Code.Game.Gameplay.Player.Factory; using Code.Infrastructure.App; using Code.Infrastructure.Camera; using Code.Infrastructure.Generators; using Code.Infrastructure.Input; using Code.Infrastructure.SceneLoader; using Code.Infrastructure.UI; using Code.Infrastructure.Utils; using Cysharp.Threading.Tasks; using KinematicCharacterController; using ObservableCollections; using R3; using Reflex.Core; using UnityEngine; using UnityEngine.SceneManagement; namespace Code.Game.TestingLevel { [State(typeof(AppStates), typeof(AppStateMachineContext))] public partial class TestingState { public TestingState(AppStateMachineContext context) : base(context) { } public override AppStates MyState => AppStates.Testing; public override async UniTask EnterState() { Cursor.lockState = CursorLockMode.Locked; Context.InputService.EnableMap(ActionMappings.Cleaning); Context.AudioService.SetAudioListener(Context.Camera.Camera.GetComponent()); await Context.Camera.SwitchState(CameraMode.Cleaner); var waitForContainer = Context.SceneContainerManager.ScenesContainers .ObserveDictionaryAdd() .Where(x => x.Key == SceneId.Testing) .Take(1) .WaitAsync() .AsUniTask(); var cleaningPanel = (CleaningPanel) await Context.UIFactory.LoadPanel(UIPanelType.Cleaning,true); var factoryConfig = new SingleConfig(); var cleanToolsConfigs = new MultipleConfig(); await UniTask.WhenAll( factoryConfig.LoadConfig(), cleanToolsConfigs.LoadConfigs() ); var factory = new PlayerFactory(factoryConfig); var player = await factory.CreatePlayer(); var playerKinematicCharacterMotor = player.GetComponent(); var playerMovementController = player.GetComponent(); var playerEquipment = player.GetComponent(); CleanToolConfig[] toolsConfigs = cleanToolsConfigs.Configs.ToArray(); List cleanTools = new(); // TODO Сделать сервис снабжения игрока foreach (var toolConfig in toolsConfigs) { switch (toolConfig.ToolType) { case CleanToolType.Tryapka: cleanTools.Add(new Tryapka(toolConfig.DurabilityUsageStep, toolConfig.CleanRadius, toolConfig.BrushTexture)); break; } } void InstallExtra(Scene scene, ContainerBuilder builder) { builder.RegisterValue(factoryConfig); builder.RegisterValue(factory, new []{typeof(IPlayerFactory)}); builder.RegisterValue(playerKinematicCharacterMotor); builder.RegisterValue(playerMovementController); builder.RegisterValue(playerEquipment); builder.RegisterValue(cleanTools); builder.RegisterValue(cleaningPanel); } await UniTask.WhenAll( Context.SceneLoader .LoadSceneAsync( SceneId.Testing, LoadSceneMode.Single, true, InstallExtra), waitForContainer ); var container = Context.SceneContainerManager.ScenesContainers[SceneId.Testing]; container.Resolve() .SetPositionAndRotation( container.Resolve().playerSpawnPoint.position, container.Resolve().playerSpawnPoint.rotation); ((CleanerCameraState)Context.Camera.CurrentBaseState) .SetPlayer(container.Resolve()); } public override async UniTask ExitState() { Context.InputService.DisableMap(ActionMappings.Cleaning); await Context.SceneLoader.UnloadSceneAsync(SceneId.Testing); } } }