using Cinemachine; using Items; using System; using Trive.Mono.Utils; using Tween; using Unity.Entities; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using Util; using Zenject; using Hash128 = Unity.Entities.Hash128; using Random = UnityEngine.Random; namespace DefaultNamespace.Installers { public class PlayerInstaller : MonoInstaller { [SerializeField] private PlayerMoveSystem.Settings playerMoveManagerSettings; [SerializeField] private PlayerLookSystem.Settings playerLookManagerSettings; [SerializeField] private TilemapManager.Settings tilemapManagerSettings; [SerializeField] private PlayerWeaponSystem.Settings playerWeaponManagerSettings; [SerializeField] private ProjectileCastSystem.Settings projectileSystemSettings; [SerializeField] private PlayerVitalsSystem.Settings vitalsSystemSettings; [SerializeField] private ItemPickupSystem.Settings pickupSystemSettings; [SerializeField] private DebugSpawnSystem.Settings debugSpawnSystemSettings; [SerializeField] private PlayerDeathSystem.Settings playerDeathSystemSettings; [SerializeField] private PlayerCoverSystem.Settings playerCoverSystemSettings; [SerializeField] private PlayerEmotionSystem.Settings playerEmotionSystemSettings; [SerializeField] private AudioListener audioListener; [SerializeField] private new Camera camera; [SerializeField] private EventSystem eventSystem; [SerializeField] private AssetReferenceGrenadeItem GrenadeItem; [SerializeField] private HealthItemRef HealthItem; [SerializeField] private InputActionAsset inputMap; [SerializeField] private int maxPlayerInventory; [SerializeField] private GameObject playerPrefab; [SerializeField] private AssetReferenceItemPrefab[] StartingItems; [SerializeField] private AssetReferenceRangedWeapon StartingWeapon; [SerializeField] private CinemachineVirtualCamera virtualCamera; public override void InstallBindings() { // Settings Container.Bind().FromInstance(playerEmotionSystemSettings); Container.Bind().FromInstance(playerCoverSystemSettings); Container.Bind().FromInstance(playerDeathSystemSettings); Container.Bind().FromInstance(debugSpawnSystemSettings); Container.Bind().FromInstance(pickupSystemSettings); Container.Bind().FromInstance(vitalsSystemSettings); Container.Bind().FromInstance(projectileSystemSettings); Container.Bind().FromInstance(playerWeaponManagerSettings); Container.Bind().FromInstance(playerMoveManagerSettings); Container.Bind().FromInstance(playerLookManagerSettings); Container.Bind().FromInstance(tilemapManagerSettings); // Systems Container.Bind().FromInstance(eventSystem); Container.Bind().FromInstance(inputMap); Container.Bind().AsSingle(); Container.Bind().FromInstance(audioListener); Container.Bind().FromInstance(camera); Container.Bind() .FromMethod( c => { var spawnPoints = GameObject.FindGameObjectsWithTag("SpawnPoint"); var player = c.Container.InstantiatePrefab( playerPrefab, spawnPoints[Random.Range(0, spawnPoints.Length)].transform.position, Quaternion.identity, c.Container.DefaultParent); var facade = player.GetComponent(); return facade; }) .AsSingle(); Container.Bind() .WithId("player") .FromMethod(c => BootstrapPlayer(c.Container.Resolve(), c.Container.Resolve())) .AsSingle() .NonLazy(); Container.Bind() .FromResolveGetter( f => { virtualCamera.Follow = f.transform; return virtualCamera; }) .AsSingle() .NonLazy(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.BindInterfacesTo().FromResolve(); Container.Bind().FromEcs(); Container.Bind().To().FromResolve(); Container.BindInterfacesAndSelfTo().AsSingle(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); } private Entity BootstrapPlayer(PlayerFacade playerFacade, EntityManager entityManager) { var playerEntity = playerFacade.gameObject.ConvertToEntity(entityManager.World); playerFacade.GetComponent().Entity = playerEntity; playerFacade.GetComponent().World = entityManager.World; entityManager.AddComponent(playerEntity); entityManager.AddComponent(playerEntity); entityManager.AddComponent(playerEntity); entityManager.AddComponent(playerEntity); entityManager.AddComponent(playerEntity); entityManager.AddComponent(playerEntity); entityManager.AddComponentData(playerEntity, new ActorData { Health = playerFacade.MaxHealth }); entityManager.AddComponent(playerEntity); entityManager.AddComponent(playerEntity); entityManager.AddComponent(playerEntity); entityManager.AddBuffer(playerEntity); var fixedArray = entityManager.GetBuffer(playerEntity); for (var i = 0; i < maxPlayerInventory - (int)SlotType.Health; i++) { if (i < StartingItems.Length) { fixedArray.Add(new Slot { Item = new ItemData(new Hash128(StartingItems[i].AssetGUID), 1) }); } else { fixedArray.Add(new Slot { Item = ItemData.Empty }); } } fixedArray.Add(new Slot { Type = SlotType.Health, Item = new ItemData(new Hash128(HealthItem.AssetGUID), 4) }); fixedArray.Add(new Slot { Type = SlotType.Grenade, Item = new ItemData(new Hash128(GrenadeItem.AssetGUID), 16) }); fixedArray.Add(new Slot { Type = SlotType.MeleeWeapon }); fixedArray.Add(new Slot { Type = SlotType.RangedWeapon, Item = new ItemData(new Hash128(StartingWeapon.AssetGUID), 1) }); return playerEntity; } [Serializable] public class HealthItemRef : AssetReferenceT { public HealthItemRef(string guid) : base(guid) { } } } }