using System; using System.Collections; using LE_LevelEditor.Core; using LE_LevelEditor.Events; using LE_LevelEditor.UI; using LS_LevelStreaming; using UnityEngine; namespace LE_LevelEditor.Logic { public class LE_LogicLevel : LE_LogicBase { private LE_ConfigLevel m_confL; private LE_GUI3dTerrain m_GUI3dTerrain; private LE_GUI3dObject m_GUI3dObject; private bool m_isObliqueFocusCentering; private Texture2D[] m_configTextures; private Texture2D[] m_configNormals; private Vector2[] m_configTextureSizes; private Vector2[] m_configTextureOffsets; private Texture2D m_levelIcon; public LE_LogicLevel(LE_ConfigLevel p_confL, LE_GUI3dTerrain p_GUI3dTerrain, LE_GUI3dObject p_GUI3dObject, bool p_isObliqueFocusCentering, Texture2D[] p_configTextures, Texture2D[] p_configNormals, Vector2[] p_configTextureSizes, Vector2[] p_configTextureOffsets) { m_confL = p_confL; m_GUI3dTerrain = p_GUI3dTerrain; m_GUI3dObject = p_GUI3dObject; m_isObliqueFocusCentering = p_isObliqueFocusCentering; m_configTextures = p_configTextures; m_configNormals = p_configNormals; m_configTextureSizes = p_configTextureSizes; m_configTextureOffsets = p_configTextureOffsets; LE_GUIInterface.EventHandlers events = LE_GUIInterface.Instance.events; events.OnLevelSaveBtn = (System.EventHandler)Delegate.Combine(events.OnLevelSaveBtn, new System.EventHandler(OnLevelSaveBtn)); LE_GUIInterface.EventHandlers events2 = LE_GUIInterface.Instance.events; events2.OnLevelLoadBtn = (System.EventHandler)Delegate.Combine(events2.OnLevelLoadBtn, new System.EventHandler(OnLevelLoadBtn)); LE_GUIInterface.EventHandlers events3 = LE_GUIInterface.Instance.events; events3.OnLevelRenderIconBtn = (System.EventHandler)Delegate.Combine(events3.OnLevelRenderIconBtn, new System.EventHandler(OnLevelRenderIconBtn)); } public override void Destroy() { if (LE_GUIInterface.Instance != null) { LE_GUIInterface.EventHandlers events = LE_GUIInterface.Instance.events; events.OnLevelSaveBtn = (System.EventHandler)Delegate.Remove(events.OnLevelSaveBtn, new System.EventHandler(OnLevelSaveBtn)); LE_GUIInterface.EventHandlers events2 = LE_GUIInterface.Instance.events; events2.OnLevelLoadBtn = (System.EventHandler)Delegate.Remove(events2.OnLevelLoadBtn, new System.EventHandler(OnLevelLoadBtn)); LE_GUIInterface.EventHandlers events3 = LE_GUIInterface.Instance.events; events3.OnLevelRenderIconBtn = (System.EventHandler)Delegate.Remove(events3.OnLevelRenderIconBtn, new System.EventHandler(OnLevelRenderIconBtn)); } if (m_levelIcon != null) { UnityEngine.Object.Destroy(m_levelIcon); } } public override void Update() { } private void OnLevelSaveBtn(object p_obj, EventArgs p_args) { SaveLevel(); } private void OnLevelLoadBtn(object p_obj, EventArgs p_args) { if (LE_EventInterface.OnLoad != null) { LE_EventInterface.OnLoad(this, GetLoadEvent()); } else { Debug.LogError("LE_LogicLevel: OnLevelLoadBtn: you have to provide an event handler for 'LE_EventInterface.OnLoad' to load a level!"); } } private void OnLevelRenderIconBtn(object p_obj, EventArgs p_args) { m_confL.StartCoroutine(DrawLevelIcon()); } public LE_LoadEvent GetLoadEvent() { return new LE_LoadEvent(delegate(byte[] p_savedLevelData) { Vector3 vector = new Vector3(99999f, -99999f, 99999f); LE_Object[] array = UnityEngine.Object.FindObjectsOfType(); for (int i = 0; i < array.Length; i++) { array[i].transform.position += vector; UnityEngine.Object.Destroy(array[i].gameObject); } LE_SaveLoadData lE_SaveLoadData = LE_SaveLoad.LoadLevelDataFromByteArray(p_savedLevelData, (m_GUI3dTerrain != null) ? m_GUI3dTerrain.TERRAIN_LAYER : 0, m_configTextures, m_configNormals, m_configTextureSizes, m_configTextureOffsets); for (int j = 0; j < lE_SaveLoadData.LevelObjects.Length; j++) { LE_SaveLoadData.ObjectData objectData = lE_SaveLoadData.LevelObjects[j]; if (objectData.Result == LE_SaveLoadData.ObjectData.EResult.INSTANCE) { if (m_GUI3dObject != null) { LE_LogicObjects.AddSnappingScripts(m_GUI3dObject, objectData.Instance); } } else if (objectData.Result == LE_SaveLoadData.ObjectData.EResult.STREAMED) { LS_ManagedObjectBase managedObject = LS_LevelStreamingSceneManager.Instance.GetManagedObject(objectData.StreamedLevelObjectID); if (managedObject != null && m_GUI3dObject != null) { managedObject.m_onShow = (System.EventHandler)Delegate.Combine(managedObject.m_onShow, (System.EventHandler)delegate(object p_object, EventArgs p_args) { if (m_GUI3dObject != null && p_object is LS_ManagedObjectInstantiateDestroy) { LE_LogicObjects.AddSnappingScripts(m_GUI3dObject, ((LS_ManagedObjectInstantiateDestroy)p_object).Instance.GetComponent()); } }); } } } if (LE_EventInterface.OnLoadedLevelInEditor != null) { LE_EventInterface.OnLoadedLevelInEditor(this, EventArgs.Empty); } }, delegate(byte[] p_savedLevelMeta) { LE_SaveLoad.LevelMetaData levelMetaData = LE_SaveLoad.LoadLevelMetaFromByteArray(p_savedLevelMeta, true); m_levelIcon = levelMetaData.Icon; if (LE_GUIInterface.Instance.delegates.SetLevelIcon != null) { LE_GUIInterface.Instance.delegates.SetLevelIcon(levelMetaData.Icon); } else if (levelMetaData.Icon != null) { Debug.LogError("LE_LogicLevel: GetLoadEvent: LE_LoadEvent: LoadLevelMetaFromBytes: you level meta seems to contain an icon, but you have not provided the LE_GUIInterface.delegates.SetLevelIcon delegate. Level icon will not be shown!"); } }); } public void SaveLevel(bool quick = false) { if (LE_EventInterface.OnSave != null) { FisheryEditor.Instance.ChangeMode(); LE_CollectMetaDataEvent lE_CollectMetaDataEvent = new LE_CollectMetaDataEvent(); if (LE_EventInterface.OnCollectMetaDataBeforeSave != null) { LE_EventInterface.OnCollectMetaDataBeforeSave(this, lE_CollectMetaDataEvent); } int p_removedDuplicatesCount = 0; if (m_confL.IsRemoveDuplicatesOnSave) { p_removedDuplicatesCount = LE_SaveLoad.RemoveDuplicatesInCurrentLevel(); } LE_SaveEvent lE_SaveEvent = new LE_SaveEvent(LE_SaveLoad.SaveCurrentLevelDataToByteArray(m_configTextures), LE_SaveLoad.SaveCurrentLevelMetaToByteArray(m_levelIcon, lE_CollectMetaDataEvent.GetCollectedMetaData()), p_removedDuplicatesCount); if (quick) { FisheryEditor.Instance.OnSaveQuick(this, lE_SaveEvent); } else { LE_EventInterface.OnSave(this, lE_SaveEvent); } } else { Debug.LogError("LE_LogicLevel: OnLevelLoadBtn: you have to provide an event handler for 'LE_EventInterface.OnSave' to save a level!"); } } private IEnumerator DrawLevelIcon() { yield return new WaitForEndOfFrame(); if (m_levelIcon == null || m_levelIcon.width != m_confL.LevelIconWidth || m_levelIcon.height != m_confL.LevelIconHeight) { UnityEngine.Object.Destroy(m_levelIcon); m_levelIcon = new Texture2D(m_confL.LevelIconWidth, m_confL.LevelIconHeight, TextureFormat.RGB24, false, true); } Rect originalPixelRect = Camera.main.pixelRect; Rect pixelRect = new Rect(0f, 0f, m_confL.LevelIconWidth, m_confL.LevelIconHeight); Camera.main.pixelRect = pixelRect; if (!Camera.main.orthographic && m_isObliqueFocusCentering) { LE_LevelEditorMain.SetObliqueFocusProjectionMatrix(false); } Camera.main.Render(); m_levelIcon.ReadPixels(pixelRect, 0, 0, false); m_levelIcon.Apply(false); Camera.main.pixelRect = originalPixelRect; if (!Camera.main.orthographic && m_isObliqueFocusCentering) { LE_LevelEditorMain.SetObliqueFocusProjectionMatrix(true); } if (LE_GUIInterface.Instance.delegates.SetLevelIcon != null) { LE_GUIInterface.Instance.delegates.SetLevelIcon(m_levelIcon); } else { Debug.LogError("LE_LogicLevel: DrawLevelIcon: you seem to have a 'Render Level Icon' button, but you have not provided the LE_GUIInterface.delegates.SetLevelIcon delegate. Level icon will not be shown!"); } if (LE_EventInterface.OnChangeLevelData != null) { LE_EventInterface.OnChangeLevelData(m_levelIcon, new LE_LevelDataChangedEvent(LE_ELevelDataChangeType.LEVEL_ICON)); } } } }