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

112 lines
3.5 KiB
C#

using System;
using LE_LevelEditor.Core;
using LE_LevelEditor.Logic;
using LE_LevelEditor.UI;
using S_SnapTools;
using UnityEngine;
namespace LE_LevelEditor.Commands
{
public class LE_CmdSnapObjectToObject : LE_CmdBase
{
private LE_GUI3dObject m_gui3d;
private LE_CmdObjectLink m_sourceObj;
private LE_CmdObjectLink m_snappedObj = new LE_CmdObjectLink();
private int m_sourceSnapPointIndex;
private S_SnapToObjectPrefab m_snapPrefab;
public LE_CmdSnapObjectToObject(LE_GUI3dObject p_gui3d, int p_sourceObjUID, int p_sourceSnapPointIndex, S_SnapToObjectPrefab p_snapPrefab)
{
m_gui3d = p_gui3d;
m_sourceObj = new LE_CmdObjectLink(p_sourceObjUID);
m_sourceSnapPointIndex = p_sourceSnapPointIndex;
m_snapPrefab = p_snapPrefab;
}
public override long GetStoredBytes()
{
return 30L;
}
public override bool Execute()
{
if (!base.Execute())
{
return false;
}
if (m_snapPrefab == null)
{
Debug.LogError("LE_CmdSnapObjectToObject: Execute: could not execute, m_snapPrefab is null!");
return false;
}
if (m_sourceObj.Obj == null)
{
Debug.LogError("LE_CmdSnapObjectToObject: Execute: could not execute, m_sourceObj is null!");
return false;
}
if (m_sourceSnapPointIndex >= m_sourceObj.Obj.ObjectSnapPoints.Length)
{
Debug.LogError("LE_CmdSnapObjectToObject: Execute: could not execute, m_sourceSnapPointIndex('" + m_sourceSnapPointIndex + "') is not a valid[0," + (m_sourceObj.Obj.ObjectSnapPoints.Length - 1) + "] snap point index!");
return false;
}
S_SnapToObject snapSystemInstance = m_sourceObj.Obj.ObjectSnapPoints[m_sourceSnapPointIndex].SnapSystemInstance;
if (snapSystemInstance == null)
{
Debug.LogError("LE_CmdSnapObjectToObject: Execute: could not execute, m_sourceSnapPointIndex('" + m_sourceSnapPointIndex + "') leads to a null SnapSystemInstance!");
return false;
}
snapSystemInstance.OnAfterObjectSnapped = (EventHandler<S_SnapToObjectEventArgs>)Delegate.Combine(snapSystemInstance.OnAfterObjectSnapped, new EventHandler<S_SnapToObjectEventArgs>(OnAfterObjectSnapped));
snapSystemInstance.PlacePrefab(m_snapPrefab);
snapSystemInstance.OnAfterObjectSnapped = (EventHandler<S_SnapToObjectEventArgs>)Delegate.Remove(snapSystemInstance.OnAfterObjectSnapped, new EventHandler<S_SnapToObjectEventArgs>(OnAfterObjectSnapped));
return true;
}
public override bool Rollback()
{
if (!base.Rollback())
{
return false;
}
if (m_snappedObj.Obj == null)
{
Debug.LogError("LE_CmdSnapObjectToObject: Rollback: could not rollback, m_snappedObj is null!");
return false;
}
if (m_gui3d == null)
{
Debug.LogError("LE_CmdSnapObjectToObject: Rollback: could not rollback, m_gui3d is null!");
return false;
}
LE_LogicObjects.DeleteObject(m_gui3d, m_snappedObj.Obj);
return true;
}
private void OnAfterObjectSnapped(object p_sender, S_SnapToObjectEventArgs p_args)
{
if (m_gui3d == null)
{
Debug.LogError("LE_CmdSnapObjectToObject: OnAfterObjectSnapped: m_gui3d is null!");
return;
}
LE_Object component = p_args.NewInstance.GetComponent<LE_Object>();
if (component != null)
{
if (m_snappedObj.UID > 0)
{
component.UID = m_snappedObj.UID;
}
m_snappedObj.Obj = component;
LE_LogicObjects.OnNewObjectSnapped(m_gui3d, component, p_args);
}
else
{
Debug.LogError("LE_CmdSnapObjectToObject: OnAfterObjectSnapped: LE_Object is not attached to the root of the new object! This object will not be saved if it has no LE_Object attached!");
}
}
}
}