Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/LE_LevelEditor/Logic/LE_LogicLevel.cs
2026-02-21 16:45:37 +08:00

217 lines
8.2 KiB
C#

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<LE_Object>();
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<LE_Object>());
}
});
}
}
}
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));
}
}
}
}