diff options
Diffstat (limited to 'Valheim_r202102_v0.141.2/Valheim/assembly_valheim/ZNetScene.cs')
-rw-r--r-- | Valheim_r202102_v0.141.2/Valheim/assembly_valheim/ZNetScene.cs | 423 |
1 files changed, 0 insertions, 423 deletions
diff --git a/Valheim_r202102_v0.141.2/Valheim/assembly_valheim/ZNetScene.cs b/Valheim_r202102_v0.141.2/Valheim/assembly_valheim/ZNetScene.cs deleted file mode 100644 index ae853c5..0000000 --- a/Valheim_r202102_v0.141.2/Valheim/assembly_valheim/ZNetScene.cs +++ /dev/null @@ -1,423 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; - -public class ZNetScene : MonoBehaviour -{ - private static ZNetScene m_instance; - - private const int m_maxCreatedPerFrame = 10; - - private const int m_maxDestroyedPerFrame = 20; - - private const float m_createDestroyFps = 30f; - - public List<GameObject> m_prefabs = new List<GameObject>(); - - public List<GameObject> m_nonNetViewPrefabs = new List<GameObject>(); - - private Dictionary<int, GameObject> m_namedPrefabs = new Dictionary<int, GameObject>(); - - private Dictionary<ZDO, ZNetView> m_instances = new Dictionary<ZDO, ZNetView>(new ZDOComparer()); - - private GameObject m_netSceneRoot; - - private List<ZDO> m_tempCurrentObjects = new List<ZDO>(); - - private List<ZDO> m_tempCurrentObjects2 = new List<ZDO>(); - - private List<ZDO> m_tempCurrentDistantObjects = new List<ZDO>(); - - private List<ZNetView> m_tempRemoved = new List<ZNetView>(); - - private HashSet<ZDO> m_tempActiveZDOs = new HashSet<ZDO>(new ZDOComparer()); - - private float m_createDestroyTimer; - - public static ZNetScene instance => m_instance; - - private void Awake() - { - m_instance = this; - foreach (GameObject prefab in m_prefabs) - { - m_namedPrefabs.Add(prefab.name.GetStableHashCode(), prefab); - } - foreach (GameObject nonNetViewPrefab in m_nonNetViewPrefabs) - { - m_namedPrefabs.Add(nonNetViewPrefab.name.GetStableHashCode(), nonNetViewPrefab); - } - ZDOMan zDOMan = ZDOMan.instance; - zDOMan.m_onZDODestroyed = (Action<ZDO>)Delegate.Combine(zDOMan.m_onZDODestroyed, new Action<ZDO>(OnZDODestroyed)); - m_netSceneRoot = new GameObject("_NetSceneRoot"); - ZRoutedRpc.instance.Register<Vector3, Quaternion, int>("SpawnObject", RPC_SpawnObject); - } - - private void OnDestroy() - { - ZLog.Log("Net scene destroyed"); - if (m_instance == this) - { - m_instance = null; - } - } - - public void Shutdown() - { - foreach (KeyValuePair<ZDO, ZNetView> instance in m_instances) - { - if ((bool)instance.Value) - { - instance.Value.ResetZDO(); - UnityEngine.Object.Destroy(instance.Value.gameObject); - } - } - m_instances.Clear(); - base.enabled = false; - } - - public void AddInstance(ZDO zdo, ZNetView nview) - { - m_instances[zdo] = nview; - if (nview.transform.parent == null) - { - nview.transform.SetParent(m_netSceneRoot.transform); - } - } - - private bool IsPrefabZDOValid(ZDO zdo) - { - int prefab = zdo.GetPrefab(); - if (prefab == 0) - { - return false; - } - if (GetPrefab(prefab) == null) - { - return false; - } - return true; - } - - private GameObject CreateObject(ZDO zdo) - { - int prefab = zdo.GetPrefab(); - if (prefab == 0) - { - return null; - } - GameObject prefab2 = GetPrefab(prefab); - if (prefab2 == null) - { - return null; - } - Vector3 position = zdo.GetPosition(); - Quaternion rotation = zdo.GetRotation(); - ZNetView.m_initZDO = zdo; - GameObject result = UnityEngine.Object.Instantiate(prefab2, position, rotation); - ZNetView.m_initZDO = null; - return result; - } - - public void Destroy(GameObject go) - { - ZNetView component = go.GetComponent<ZNetView>(); - if ((bool)component && component.GetZDO() != null) - { - ZDO zDO = component.GetZDO(); - component.ResetZDO(); - m_instances.Remove(zDO); - if (zDO.IsOwner()) - { - ZDOMan.instance.DestroyZDO(zDO); - } - } - UnityEngine.Object.Destroy(go); - } - - public GameObject GetPrefab(int hash) - { - if (m_namedPrefabs.TryGetValue(hash, out var value)) - { - return value; - } - return null; - } - - public GameObject GetPrefab(string name) - { - int stableHashCode = name.GetStableHashCode(); - return GetPrefab(stableHashCode); - } - - public int GetPrefabHash(GameObject go) - { - return go.name.GetStableHashCode(); - } - - public bool IsAreaReady(Vector3 point) - { - Vector2i zone = ZoneSystem.instance.GetZone(point); - if (!ZoneSystem.instance.IsZoneLoaded(zone)) - { - return false; - } - m_tempCurrentObjects.Clear(); - ZDOMan.instance.FindSectorObjects(zone, 1, 0, m_tempCurrentObjects); - foreach (ZDO tempCurrentObject in m_tempCurrentObjects) - { - if (IsPrefabZDOValid(tempCurrentObject) && !FindInstance(tempCurrentObject)) - { - return false; - } - } - return true; - } - - private bool InLoadingScreen() - { - if (Player.m_localPlayer == null || Player.m_localPlayer.IsTeleporting()) - { - return true; - } - return false; - } - - private void CreateObjects(List<ZDO> currentNearObjects, List<ZDO> currentDistantObjects) - { - int maxCreatedPerFrame = 10; - if (InLoadingScreen()) - { - maxCreatedPerFrame = 100; - } - int frameCount = Time.frameCount; - foreach (ZDO key in m_instances.Keys) - { - key.m_tempCreateEarmark = frameCount; - } - int created = 0; - CreateObjectsSorted(currentNearObjects, maxCreatedPerFrame, ref created); - CreateDistantObjects(currentDistantObjects, maxCreatedPerFrame, ref created); - } - - private void CreateObjectsSorted(List<ZDO> currentNearObjects, int maxCreatedPerFrame, ref int created) - { - m_tempCurrentObjects2.Clear(); - int frameCount = Time.frameCount; - foreach (ZDO currentNearObject in currentNearObjects) - { - if (currentNearObject.m_tempCreateEarmark != frameCount && (currentNearObject.m_distant || ZoneSystem.instance.IsZoneLoaded(currentNearObject.GetSector()))) - { - m_tempCurrentObjects2.Add(currentNearObject); - } - } - foreach (ZDO item in m_tempCurrentObjects2.OrderByDescending((ZDO item) => item.m_type)) - { - if (CreateObject(item) != null) - { - created++; - if (created > maxCreatedPerFrame) - { - break; - } - } - else if (ZNet.instance.IsServer()) - { - item.SetOwner(ZDOMan.instance.GetMyID()); - ZLog.Log("Destroyed invalid predab ZDO:" + item.m_uid); - ZDOMan.instance.DestroyZDO(item); - } - } - } - - private void CreateDistantObjects(List<ZDO> objects, int maxCreatedPerFrame, ref int created) - { - if (created > maxCreatedPerFrame) - { - return; - } - int frameCount = Time.frameCount; - foreach (ZDO @object in objects) - { - if (@object.m_tempCreateEarmark == frameCount) - { - continue; - } - if (CreateObject(@object) != null) - { - created++; - if (created > maxCreatedPerFrame) - { - break; - } - } - else if (ZNet.instance.IsServer()) - { - @object.SetOwner(ZDOMan.instance.GetMyID()); - ZLog.Log(string.Concat("Destroyed invalid predab ZDO:", @object.m_uid, " prefab hash:", @object.GetPrefab())); - ZDOMan.instance.DestroyZDO(@object); - } - } - } - - private void OnZDODestroyed(ZDO zdo) - { - if (m_instances.TryGetValue(zdo, out var value)) - { - value.ResetZDO(); - UnityEngine.Object.Destroy(value.gameObject); - m_instances.Remove(zdo); - } - } - - private void RemoveObjects(List<ZDO> currentNearObjects, List<ZDO> currentDistantObjects) - { - int frameCount = Time.frameCount; - foreach (ZDO currentNearObject in currentNearObjects) - { - currentNearObject.m_tempRemoveEarmark = frameCount; - } - foreach (ZDO currentDistantObject in currentDistantObjects) - { - currentDistantObject.m_tempRemoveEarmark = frameCount; - } - m_tempRemoved.Clear(); - foreach (ZNetView value in m_instances.Values) - { - if (value.GetZDO().m_tempRemoveEarmark != frameCount) - { - m_tempRemoved.Add(value); - } - } - for (int i = 0; i < m_tempRemoved.Count; i++) - { - ZNetView zNetView = m_tempRemoved[i]; - ZDO zDO = zNetView.GetZDO(); - zNetView.ResetZDO(); - UnityEngine.Object.Destroy(zNetView.gameObject); - if (!zDO.m_persistent && zDO.IsOwner()) - { - ZDOMan.instance.DestroyZDO(zDO); - } - m_instances.Remove(zDO); - } - } - - public ZNetView FindInstance(ZDO zdo) - { - if (m_instances.TryGetValue(zdo, out var value)) - { - return value; - } - return null; - } - - public bool HaveInstance(ZDO zdo) - { - return m_instances.ContainsKey(zdo); - } - - public GameObject FindInstance(ZDOID id) - { - ZDO zDO = ZDOMan.instance.GetZDO(id); - if (zDO != null) - { - ZNetView zNetView = FindInstance(zDO); - if ((bool)zNetView) - { - return zNetView.gameObject; - } - } - return null; - } - - private void Update() - { - float deltaTime = Time.deltaTime; - m_createDestroyTimer += deltaTime; - if (m_createDestroyTimer >= 1f / 30f) - { - m_createDestroyTimer = 0f; - CreateDestroyObjects(); - } - } - - private void CreateDestroyObjects() - { - Vector2i zone = ZoneSystem.instance.GetZone(ZNet.instance.GetReferencePosition()); - m_tempCurrentObjects.Clear(); - m_tempCurrentDistantObjects.Clear(); - ZDOMan.instance.FindSectorObjects(zone, ZoneSystem.instance.m_activeArea, ZoneSystem.instance.m_activeDistantArea, m_tempCurrentObjects, m_tempCurrentDistantObjects); - CreateObjects(m_tempCurrentObjects, m_tempCurrentDistantObjects); - RemoveObjects(m_tempCurrentObjects, m_tempCurrentDistantObjects); - } - - public bool InActiveArea(Vector2i zone, Vector3 refPoint) - { - Vector2i zone2 = ZoneSystem.instance.GetZone(refPoint); - return InActiveArea(zone, zone2); - } - - public bool InActiveArea(Vector2i zone, Vector2i refCenterZone) - { - int num = ZoneSystem.instance.m_activeArea - 1; - if (zone.x >= refCenterZone.x - num && zone.x <= refCenterZone.x + num && zone.y <= refCenterZone.y + num) - { - return zone.y >= refCenterZone.y - num; - } - return false; - } - - public bool OutsideActiveArea(Vector3 point) - { - return OutsideActiveArea(point, ZNet.instance.GetReferencePosition()); - } - - public bool OutsideActiveArea(Vector3 point, Vector3 refPoint) - { - Vector2i zone = ZoneSystem.instance.GetZone(refPoint); - Vector2i zone2 = ZoneSystem.instance.GetZone(point); - if (zone2.x > zone.x - ZoneSystem.instance.m_activeArea && zone2.x < zone.x + ZoneSystem.instance.m_activeArea && zone2.y < zone.y + ZoneSystem.instance.m_activeArea) - { - return zone2.y <= zone.y - ZoneSystem.instance.m_activeArea; - } - return true; - } - - public bool HaveInstanceInSector(Vector2i sector) - { - foreach (KeyValuePair<ZDO, ZNetView> instance in m_instances) - { - if ((bool)instance.Value && !instance.Value.m_distant && ZoneSystem.instance.GetZone(instance.Value.transform.position) == sector) - { - return true; - } - } - return false; - } - - public int NrOfInstances() - { - return m_instances.Count; - } - - public void SpawnObject(Vector3 pos, Quaternion rot, GameObject prefab) - { - int prefabHash = GetPrefabHash(prefab); - ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "SpawnObject", pos, rot, prefabHash); - } - - private void RPC_SpawnObject(long spawner, Vector3 pos, Quaternion rot, int prefabHash) - { - GameObject prefab = GetPrefab(prefabHash); - if (prefab == null) - { - ZLog.Log("Missing prefab " + prefabHash); - } - else - { - UnityEngine.Object.Instantiate(prefab, pos, rot); - } - } -} |