using System.Collections.Generic; using MoleMole.Config; using UnityEngine; namespace MoleMole { public class PropObjectManager { private Dictionary _propObjects; private List _propLs; private List _propsToDestroyOnStageChange; private PropObjectManager() { _propObjects = new Dictionary(); _propLs = new List(); _propsToDestroyOnStageChange = new List(); } public void InitAtAwake() { } public void InitAtStart() { } public void Core() { RemoveAllRemovables(); } public void Destroy() { for (int i = 0; i < _propLs.Count; i++) { if (_propLs[i] != null) { Object.DestroyImmediate(_propLs[i]); } } } public BaseMonoPropObject GetPropObjectByRuntimeID(uint runtimeID) { return _propObjects[runtimeID]; } public BaseMonoPropObject TryGetPropObjectByRuntimeID(uint runtimeID) { BaseMonoPropObject value; _propObjects.TryGetValue(runtimeID, out value); return value; } public List GetAllPropObjects() { List list = new List(); list.AddRange(_propObjects.Values); return list; } public uint CreatePropObject(uint ownerID, string propName, float HP, float attack, Vector3 initPos, Vector3 initDir, bool appearAnim = false) { ConfigPropObject propObjectConfig = PropObjectData.GetPropObjectConfig(propName); GameObject original = Miscs.LoadResource(propObjectConfig.PrefabPath); BaseMonoPropObject component = Object.Instantiate(original).GetComponent(); uint nextRuntimeID = Singleton.Instance.GetNextRuntimeID(7); component.transform.position = initPos; component.transform.forward = initDir; component.Init(ownerID, nextRuntimeID, propObjectConfig.Name, appearAnim); if (propName == "JokeBox" && attack <= 0f) { (component as MonoBarrelProp)._toExplode = false; } _propObjects.Add(nextRuntimeID, component); _propLs.Add(component); PropObjectActor propObjectActor = Singleton.Instance.CreateActor(component); propObjectActor.ownerID = ownerID; propObjectActor.InitProp(HP, attack); propObjectActor.PostInit(); return nextRuntimeID; } public void RemoveAllRemovables() { for (int i = 0; i < _propLs.Count; i++) { BaseMonoPropObject baseMonoPropObject = _propLs[i]; if (baseMonoPropObject.IsToBeRemove()) { RemovePropObjectByRuntimeID(baseMonoPropObject.GetRuntimeID(), i); i--; } } } public void RemoveAllPropObjects() { int num; for (num = 0; num < _propLs.Count; num++) { BaseMonoPropObject baseMonoPropObject = _propLs[num]; if (!baseMonoPropObject.IsToBeRemove()) { baseMonoPropObject.SetDied(KillEffect.KillImmediately); } RemovePropObjectByRuntimeID(baseMonoPropObject.GetRuntimeID(), num); num--; } } private void RemovePropObjectByRuntimeID(uint runtimeID, int lsIx) { Singleton.Instance.TryRemoveActor(runtimeID); if (_propObjects[runtimeID] != null) { Object.Destroy(_propObjects[runtimeID].gameObject); } _propObjects.Remove(runtimeID); _propLs.RemoveAt(lsIx); } public void CleanWhenStageChange() { RemoveAllPropObjects(); _propsToDestroyOnStageChange.Clear(); } public void RegisterDestroyOnStageChange(uint propID) { _propsToDestroyOnStageChange.Add(propID); } } }