Merge branch 'develop' of https://git.pthub.vn/Unity/perfect-world-unity into feature/fix-ui
This commit is contained in:
@@ -15,7 +15,7 @@ MonoBehaviour:
|
||||
m_DefaultGroup: 712e3991f28e549e7a56ee582a977810
|
||||
m_currentHash:
|
||||
serializedVersion: 2
|
||||
Hash: 00000000000000000000000000000000
|
||||
Hash: 353eadd7935f3aef66b29515596e784e
|
||||
m_OptimizeCatalogSize: 0
|
||||
m_BuildRemoteCatalog: 0
|
||||
m_CatalogRequestsTimeout: 0
|
||||
|
||||
@@ -36,9 +36,9 @@ RectTransform:
|
||||
m_Father: {fileID: 8222630393730529017}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 1}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: -10, y: 0}
|
||||
m_AnchorMax: {x: 0, y: 1}
|
||||
m_AnchoredPosition: {x: 272, y: 0}
|
||||
m_SizeDelta: {x: 544, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 1}
|
||||
--- !u!222 &9154858122360570458
|
||||
CanvasRenderer:
|
||||
@@ -68,7 +68,21 @@ MonoBehaviour:
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_text:
|
||||
m_text: 'asfasf
|
||||
|
||||
asfasf
|
||||
|
||||
asfasf
|
||||
|
||||
asfasf
|
||||
|
||||
asfasf
|
||||
|
||||
asfasf
|
||||
|
||||
asfasf
|
||||
|
||||
'
|
||||
m_isRightToLeft: 0
|
||||
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
|
||||
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
|
||||
@@ -180,7 +194,7 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier:
|
||||
m_IgnoreLayout: 0
|
||||
m_MinWidth: -1
|
||||
m_MinHeight: 370
|
||||
m_MinHeight: 300
|
||||
m_PreferredWidth: -1
|
||||
m_PreferredHeight: -1
|
||||
m_FlexibleWidth: -1
|
||||
@@ -1261,6 +1275,7 @@ GameObject:
|
||||
m_Component:
|
||||
- component: {fileID: 8222630393730529017}
|
||||
- component: {fileID: 2639351263650743997}
|
||||
- component: {fileID: 4142611820152313966}
|
||||
m_Layer: 5
|
||||
m_Name: Content
|
||||
m_TagString: Untagged
|
||||
@@ -1302,6 +1317,32 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier:
|
||||
m_HorizontalFit: 0
|
||||
m_VerticalFit: 1
|
||||
--- !u!114 &4142611820152313966
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5003895622590170670}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Padding:
|
||||
m_Left: 0
|
||||
m_Right: 0
|
||||
m_Top: 0
|
||||
m_Bottom: 0
|
||||
m_ChildAlignment: 0
|
||||
m_Spacing: 0
|
||||
m_ChildForceExpandWidth: 1
|
||||
m_ChildForceExpandHeight: 1
|
||||
m_ChildControlWidth: 1
|
||||
m_ChildControlHeight: 0
|
||||
m_ChildScaleWidth: 0
|
||||
m_ChildScaleHeight: 0
|
||||
m_ReverseArrangement: 0
|
||||
--- !u!1 &6318768709065201913
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1394,7 +1435,7 @@ MonoBehaviour:
|
||||
m_Content: {fileID: 8222630393730529017}
|
||||
m_Horizontal: 0
|
||||
m_Vertical: 1
|
||||
m_MovementType: 2
|
||||
m_MovementType: 1
|
||||
m_Elasticity: 0.1
|
||||
m_Inertia: 1
|
||||
m_DecelerationRate: 0.135
|
||||
|
||||
@@ -95,6 +95,7 @@ MonoBehaviour:
|
||||
borderImage: {fileID: 0}
|
||||
cooldownTime: 0
|
||||
m_ClockCounter: {fileID: 0}
|
||||
isNotCastSkill: 1
|
||||
learnedSkillbutton: {fileID: 4352052582615766499}
|
||||
wButton: {fileID: 0}
|
||||
--- !u!114 &4352052582615766499
|
||||
|
||||
@@ -214,4 +214,6 @@ MonoBehaviour:
|
||||
borderImage: {fileID: 0}
|
||||
cooldownTime: 0
|
||||
m_ClockCounter: {fileID: 0}
|
||||
isNotCastSkill: 1
|
||||
learnedSkillbutton: {fileID: 4789154704751094606}
|
||||
wButton: {fileID: 0}
|
||||
|
||||
@@ -4342,7 +4342,7 @@ RectTransform:
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 1, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 0}
|
||||
m_AnchoredPosition: {x: -319, y: 72.9}
|
||||
m_AnchoredPosition: {x: -319, y: 72.8999}
|
||||
m_SizeDelta: {x: 84, y: 98}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!222 &5968563249516142148
|
||||
@@ -10617,7 +10617,7 @@ PrefabInstance:
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7601428160728630082, guid: 7130d91d43d72c145a379b373c8c27b0, type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: -44.444458
|
||||
value: -44.444336
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7601428160728630082, guid: 7130d91d43d72c145a379b373c8c27b0, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
@@ -11670,11 +11670,11 @@ PrefabInstance:
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7640072662976260491, guid: 4b2c2bde3e2945e4ba4516d08d755aeb, type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 1
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 8819184454638197523, guid: 4b2c2bde3e2945e4ba4516d08d755aeb, type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 1
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
@@ -12044,6 +12044,10 @@ PrefabInstance:
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4150652358465390995, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
|
||||
propertyPath: isNotCastSkill
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5330897987501731450, guid: b78469eadfa272c4f8fee4c8cae4b26f, type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
@@ -13162,7 +13166,7 @@ PrefabInstance:
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3614609677134483648, guid: 647d1810bb3e6e34e98b52167adec474, type: 3}
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: -31.886353
|
||||
value: -31.88623
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4055144938777527514, guid: 647d1810bb3e6e34e98b52167adec474, type: 3}
|
||||
propertyPath: m_Name
|
||||
|
||||
@@ -47,6 +47,8 @@ MonoBehaviour:
|
||||
prefab: {fileID: 6830833846243993097, guid: 97dd1de3aba08a04980849e40d5c1ea4, type: 3}
|
||||
- id: MagicProgress1
|
||||
prefab: {fileID: 1126053271199039253, guid: 526d462bd8c87b74c9e461e80d028cb2, type: 3}
|
||||
- id: DlgPetList
|
||||
prefab: {fileID: 4055144938777527514, guid: 647d1810bb3e6e34e98b52167adec474, type: 3}
|
||||
- id: DlgPlayerOptions
|
||||
prefab: {fileID: 1813565726936289741, guid: a0e02be030755ab4a917523764fe4eef, type: 3}
|
||||
- id: DlgPetHatch
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:60c9fc32910746f134c7ade2390c674afb51eae2d258e8292b0bb9e817d02732
|
||||
size 282839
|
||||
oid sha256:84e412b6f5e36bb93f0b17ced95c929c8773b7ed9d513f792a0f4664d78b7014
|
||||
size 282581
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:486a1814b7c89098f245397c87a04b43c8b9d7b906d4a7de20930badea5292fb
|
||||
size 107133
|
||||
oid sha256:8c97935b0995b6688065daf1645d0f26e8b964dd5bf92b6cd66c37c5f97b5586
|
||||
size 104077
|
||||
|
||||
@@ -1,37 +1,74 @@
|
||||
#define ENALBE_LOGGING
|
||||
using UnityEngine;
|
||||
|
||||
namespace BrewMonster
|
||||
{
|
||||
public class BMLogger
|
||||
{
|
||||
public static void Log(string message)
|
||||
{
|
||||
#if ENALBE_LOGGING
|
||||
Debug.Log(message);
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void LogError(string message)
|
||||
{
|
||||
#if ENALBE_LOGGING
|
||||
Debug.LogError(message);
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void LogWarning(string message)
|
||||
{
|
||||
#if ENALBE_LOGGING
|
||||
Debug.LogWarning(message);
|
||||
#endif
|
||||
}
|
||||
public static void LogMono(object source, string message)
|
||||
{
|
||||
#if ENALBE_LOGGING && UNITY_EDITOR
|
||||
if (DebugRegistry.IsEnabled(source))
|
||||
UnityEngine.Debug.LogError($"[{source}] {message}");
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
#define ENALBE_LOGGING
|
||||
using System;
|
||||
using System.IO;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BrewMonster
|
||||
{
|
||||
public class BMLogger
|
||||
{
|
||||
// File logging callback - set by SessionFileLogger
|
||||
private static Action<string> s_FileLogCallback = null;
|
||||
|
||||
public static void SetFileLogCallback(Action<string> callback)
|
||||
{
|
||||
s_FileLogCallback = callback;
|
||||
}
|
||||
|
||||
public static void ClearFileLogCallback()
|
||||
{
|
||||
s_FileLogCallback = null;
|
||||
}
|
||||
|
||||
private static void WriteToFile(string message)
|
||||
{
|
||||
if (s_FileLogCallback != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
s_FileLogCallback(message);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"BMLogger: Failed to write to file: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void Log(string message)
|
||||
{
|
||||
#if ENALBE_LOGGING
|
||||
Debug.Log(message);
|
||||
WriteToFile(message);
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void LogError(string message)
|
||||
{
|
||||
#if ENALBE_LOGGING
|
||||
Debug.LogError(message);
|
||||
WriteToFile(message);
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void LogWarning(string message)
|
||||
{
|
||||
#if ENALBE_LOGGING
|
||||
Debug.LogWarning(message);
|
||||
WriteToFile(message);
|
||||
#endif
|
||||
}
|
||||
public static void LogMono(object source, string message)
|
||||
{
|
||||
#if ENALBE_LOGGING && UNITY_EDITOR
|
||||
if (DebugRegistry.IsEnabled(source))
|
||||
{
|
||||
string fullMessage = $"[{source}] {message}";
|
||||
UnityEngine.Debug.LogError(fullMessage);
|
||||
WriteToFile(fullMessage);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,10 @@ namespace BrewMonster
|
||||
_instance = this as T;
|
||||
Initialize();
|
||||
}
|
||||
|
||||
protected virtual void OnDestroy()
|
||||
{
|
||||
_instance = null;
|
||||
}
|
||||
/// <summary>Override this method to initialize the singleton</summary>
|
||||
protected virtual void Initialize()
|
||||
{
|
||||
|
||||
@@ -0,0 +1,226 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BrewMonster
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles file logging for each Unity play session.
|
||||
/// Overwrites the same log file when play mode starts, with timestamp in filename to detect updates.
|
||||
/// Intercepts BMLogger calls and writes them to the session log file.
|
||||
///
|
||||
/// Usage:
|
||||
/// - Automatically initializes when play mode starts
|
||||
/// - Call BMLogger.LogError("HIHIHIHI") and it will appear in the log file
|
||||
/// - Each play session overwrites the log file (old files are cleaned up)
|
||||
/// - Filename includes timestamp so you can see when it was last updated
|
||||
/// - Log files are saved in the "Logs" directory in your project root
|
||||
/// </summary>
|
||||
public class SessionFileLogger : MonoBehaviour
|
||||
{
|
||||
private static SessionFileLogger s_Instance = null;
|
||||
private string m_LogFilePath = null;
|
||||
private StreamWriter m_LogWriter = null;
|
||||
private readonly object m_LockObject = new object();
|
||||
|
||||
[Header("Log Settings")]
|
||||
[Tooltip("Directory where log files will be saved (relative to project root)")]
|
||||
public string logDirectory = "Logs";
|
||||
|
||||
[Tooltip("Log file name prefix")]
|
||||
public string logFileNamePrefix = "SessionLog";
|
||||
|
||||
/// <summary>
|
||||
/// Auto-initializes when play mode starts.
|
||||
/// Creates the SessionFileLogger GameObject automatically.
|
||||
/// This ensures a fresh log file is created for each play session.
|
||||
/// </summary>
|
||||
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
|
||||
private static void AutoInitialize()
|
||||
{
|
||||
// Clean up any existing instance (in case of play mode restart)
|
||||
if (s_Instance != null)
|
||||
{
|
||||
if (s_Instance.m_LogWriter != null)
|
||||
{
|
||||
s_Instance.Cleanup();
|
||||
}
|
||||
if (s_Instance.gameObject != null)
|
||||
{
|
||||
DestroyImmediate(s_Instance.gameObject);
|
||||
}
|
||||
s_Instance = null;
|
||||
}
|
||||
|
||||
// Create new instance for this play session
|
||||
GameObject loggerObj = new GameObject("SessionFileLogger");
|
||||
s_Instance = loggerObj.AddComponent<SessionFileLogger>();
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
// Ensure only one instance exists
|
||||
if (s_Instance != null && s_Instance != this)
|
||||
{
|
||||
Destroy(this);
|
||||
return;
|
||||
}
|
||||
|
||||
s_Instance = this;
|
||||
DontDestroyOnLoad(gameObject);
|
||||
InitializeLogFile();
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (s_Instance == this)
|
||||
{
|
||||
Cleanup();
|
||||
s_Instance = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnApplicationQuit()
|
||||
{
|
||||
Cleanup();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new log file for the current play session.
|
||||
/// Overwrites old log files and creates a new one with timestamp in filename.
|
||||
/// </summary>
|
||||
private void InitializeLogFile()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Get project root directory
|
||||
string projectRoot = Application.dataPath.Replace("/Assets", "").Replace("\\Assets", "");
|
||||
string logDir = Path.Combine(projectRoot, logDirectory);
|
||||
|
||||
// Ensure directory exists
|
||||
if (!Directory.Exists(logDir))
|
||||
{
|
||||
Directory.CreateDirectory(logDir);
|
||||
}
|
||||
|
||||
// Clean up old log files with the same prefix (keep only the latest)
|
||||
CleanupOldLogFiles(logDir);
|
||||
|
||||
// Generate log file path with timestamp (so you can see when it was updated)
|
||||
string timestamp = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
|
||||
string fileName = $"{logFileNamePrefix}_{timestamp}.txt";
|
||||
m_LogFilePath = Path.Combine(logDir, fileName);
|
||||
|
||||
// Create/overwrite the log file
|
||||
m_LogWriter = new StreamWriter(m_LogFilePath, false);
|
||||
m_LogWriter.WriteLine($"=== Play Session Log ===");
|
||||
m_LogWriter.WriteLine($"Started: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
|
||||
m_LogWriter.WriteLine($"Project: {Application.productName}");
|
||||
m_LogWriter.WriteLine($"Unity Version: {Application.unityVersion}");
|
||||
m_LogWriter.WriteLine($"==========================================");
|
||||
m_LogWriter.WriteLine();
|
||||
m_LogWriter.Flush();
|
||||
|
||||
// Set up BMLogger callback
|
||||
BMLogger.SetFileLogCallback(WriteLogMessage);
|
||||
|
||||
Debug.Log($"[SessionFileLogger] Log file initialized: {m_LogFilePath}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"[SessionFileLogger] Failed to initialize log file: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deletes old log files with the same prefix to keep only the current session file.
|
||||
/// </summary>
|
||||
private void CleanupOldLogFiles(string logDir)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!Directory.Exists(logDir))
|
||||
return;
|
||||
|
||||
string searchPattern = $"{logFileNamePrefix}_*.txt";
|
||||
string[] oldFiles = Directory.GetFiles(logDir, searchPattern);
|
||||
|
||||
foreach (string oldFile in oldFiles)
|
||||
{
|
||||
try
|
||||
{
|
||||
File.Delete(oldFile);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogWarning($"[SessionFileLogger] Failed to delete old log file {oldFile}: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogWarning($"[SessionFileLogger] Error cleaning up old log files: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes a log message to the file.
|
||||
/// Called by BMLogger when Log, LogError, or LogWarning is called.
|
||||
/// </summary>
|
||||
private void WriteLogMessage(string message)
|
||||
{
|
||||
if (m_LogWriter == null || string.IsNullOrEmpty(m_LogFilePath))
|
||||
return;
|
||||
|
||||
lock (m_LockObject)
|
||||
{
|
||||
try
|
||||
{
|
||||
string timestamp = DateTime.Now.ToString("HH:mm:ss.fff");
|
||||
m_LogWriter.WriteLine($"[{timestamp}] {message}");
|
||||
m_LogWriter.Flush();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"[SessionFileLogger] Failed to write log message: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Cleans up the log file and removes BMLogger callback.
|
||||
/// </summary>
|
||||
private void Cleanup()
|
||||
{
|
||||
lock (m_LockObject)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (m_LogWriter != null)
|
||||
{
|
||||
m_LogWriter.WriteLine();
|
||||
m_LogWriter.WriteLine($"==========================================");
|
||||
m_LogWriter.WriteLine($"Session ended: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
|
||||
m_LogWriter.Flush();
|
||||
m_LogWriter.Close();
|
||||
m_LogWriter = null;
|
||||
}
|
||||
|
||||
BMLogger.ClearFileLogCallback();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"[SessionFileLogger] Error during cleanup: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current log file path (for debugging/inspection).
|
||||
/// </summary>
|
||||
public static string GetLogFilePath()
|
||||
{
|
||||
return s_Instance != null ? s_Instance.m_LogFilePath : null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9118777afdffebc47861ed63bbb15c9a
|
||||
@@ -2907,7 +2907,7 @@ namespace BrewMonster
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_icon; // icon file
|
||||
public string FileIcon => ByteToStringUtils.ByteArrayToUnicodeString(file_icon );
|
||||
public string FileIcon => ByteToStringUtils.ByteArrayToCP936String(file_icon);
|
||||
|
||||
public uint character_combo_id; // character combo id
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using static Unity.Cinemachine.CinemachineFreeLookModifier;
|
||||
|
||||
@@ -46,31 +45,21 @@ namespace BrewMonster
|
||||
A3DSkillGfxComposer pComposer,
|
||||
long nHostID,
|
||||
long nTargetID,
|
||||
|
||||
string szFlyGfx,
|
||||
|
||||
string szHitGfx,
|
||||
uint dwFlyTimeSpan,
|
||||
bool bTraceTarget,
|
||||
GfxMoveMode FlyMode,
|
||||
int nFlyGfxCount,
|
||||
uint dwInterval,
|
||||
GFX_SKILL_PARAM param,
|
||||
|
||||
float fFlyGfxScale,
|
||||
|
||||
float fHitGfxScale,
|
||||
GFX_SKILL_PARAM param,
|
||||
uint dwModifier,
|
||||
bool bOnlyOneHit,
|
||||
|
||||
bool bFadeOut,
|
||||
|
||||
bool bIsGoblinSkill,
|
||||
|
||||
bool bReverse
|
||||
)
|
||||
{
|
||||
|
||||
bool bRet = true, bCluster;
|
||||
uint dwDelayTime;
|
||||
|
||||
@@ -84,9 +73,11 @@ namespace BrewMonster
|
||||
dwDelayTime = 0;
|
||||
bCluster = true;
|
||||
}
|
||||
|
||||
for (int i = 0; i < nFlyGfxCount; i++)
|
||||
{
|
||||
string value = bOnlyOneHit && i != nFlyGfxCount - 1 ? "" : szHitGfx;
|
||||
|
||||
if (!AddOneSkillGfxEvent(
|
||||
pComposer,
|
||||
nHostID,
|
||||
@@ -95,63 +86,65 @@ namespace BrewMonster
|
||||
FlyMode,
|
||||
dwDelayTime,
|
||||
dwFlyTimeSpan,
|
||||
value,
|
||||
value,
|
||||
param,
|
||||
bTraceTarget,
|
||||
fFlyGfxScale,
|
||||
fHitGfxScale,
|
||||
dwModifier,
|
||||
bCluster,
|
||||
bFadeOut,
|
||||
bIsGoblinSkill,
|
||||
bReverse
|
||||
))
|
||||
{
|
||||
bRet = false;
|
||||
}
|
||||
|
||||
dwDelayTime += dwInterval;
|
||||
}
|
||||
|
||||
return bRet;
|
||||
|
||||
}
|
||||
public bool AddOneSkillGfxEvent(
|
||||
A3DSkillGfxComposer pComposer,
|
||||
long nHostID,
|
||||
long nTargetID,
|
||||
|
||||
string szFlyGfx,
|
||||
GfxMoveMode mode,
|
||||
uint dwDelayTime,
|
||||
uint dwFlyTimeSpan,
|
||||
string szHitGfx,
|
||||
|
||||
GFX_SKILL_PARAM param,
|
||||
|
||||
GFX_SKILL_PARAM param,
|
||||
bool bTraceTarget,
|
||||
|
||||
float fFlyGfxScale,
|
||||
|
||||
float fHitGfxScale,
|
||||
uint dwModifier,
|
||||
bool bCluster,
|
||||
|
||||
bool bFadeOut,
|
||||
|
||||
bool bIsGoblinSkill,
|
||||
|
||||
bool bReverse)
|
||||
{
|
||||
|
||||
// Validate host ID
|
||||
// 验证施法者ID
|
||||
if (nHostID == 0)
|
||||
{
|
||||
BMLogger.LogError($"[SKILL_GFX_DEBUG] AddOneSkillGfxEvent: WARNING - Invalid host ID (0), skipping event creation");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Validate target ID - allow 0 for area skills, but warn about suspiciously large negative values
|
||||
// 验证目标ID - 允许0用于区域技能,但对可疑的大负值发出警告
|
||||
|
||||
A3DSkillGfxEvent pEvent = SkillGfxMan.InstanceSub.GetEmptyEvent(mode);
|
||||
|
||||
pEvent.SetComposer(pComposer);
|
||||
pEvent.SetHostID(nHostID);
|
||||
pEvent.SetTargetID(nTargetID);
|
||||
pEvent.SetFlyTimeSpan(dwFlyTimeSpan);
|
||||
pEvent.SetDelay(dwDelayTime);
|
||||
//pEvent.SetReverse(bReverse);
|
||||
//if (param.value.fVal != float.MinValue) pEvent.SetParam(param);
|
||||
pEvent.SetReverse(bReverse);
|
||||
pEvent.SetParam(param);
|
||||
pEvent.SetTraceTarget(bTraceTarget);
|
||||
pEvent.SetModifier(dwModifier);
|
||||
//pEvent.SetIsCluster(bCluster);
|
||||
pEvent.SetIsCluster(bCluster);
|
||||
pEvent.SetFadeOut(bFadeOut);
|
||||
pEvent.SetGoblinSkill(bIsGoblinSkill);
|
||||
|
||||
@@ -163,34 +156,16 @@ namespace BrewMonster
|
||||
pEvent.SetHostModelCreatedByGfx(Prop.bHostECMCreatedByGfx);
|
||||
}
|
||||
|
||||
/* if (szFlyGfx != 0)
|
||||
{
|
||||
A3DGFXEx pGfx = pEvent.LoadFlyGfx(m_pDevice, szFlyGfx.ToString());
|
||||
if (pGfx != null)
|
||||
{
|
||||
pGfx.SetScale(fFlyGfxScale);
|
||||
pGfx.SetDisableCamShake(pEvent.GetDisableCamShake());
|
||||
pGfx.SetCreatedByGFXECM(pEvent.GetHostModelCreatedByGfx());
|
||||
pGfx.SetUseLOD(pEvent.GetGfxUseLod());
|
||||
pGfx.SetId(pEvent.GetHostID());
|
||||
pEvent.SetFlyGfx(pGfx);
|
||||
}
|
||||
}*/
|
||||
// NOTE: In Unity, GFX are Particle Systems — scaling is handled by the particle system itself,
|
||||
// not by code. The C++ pGfx.SetScale() calls are not needed.
|
||||
// 注意:在Unity中,GFX是粒子系统 — 缩放由粒子系统自身处理,不需要代码设置。
|
||||
|
||||
if (string.IsNullOrEmpty(szHitGfx))
|
||||
{
|
||||
/*game pGfx = pEvent.LoadHitGfx(m_pDevice, szHitGfx.ToString());
|
||||
if (pGfx != null)
|
||||
{
|
||||
pGfx.SetScale(fHitGfxScale);
|
||||
pEvent.SetHitGfx(pGfx);
|
||||
}*/
|
||||
}
|
||||
// Fly GFX instantiation is handled by CECSkillGfxEvent.SpawnFlyGfx()
|
||||
// Hit GFX instantiation is handled by CECSkillGfxEvent.SpawnHitGfx()
|
||||
|
||||
#if !_SKILLGFXCOMPOSER
|
||||
pEvent.Tick(0);
|
||||
#endif
|
||||
pComposer.SpawnGFX(nTargetID);
|
||||
PushEvent(pEvent);
|
||||
return true;
|
||||
}
|
||||
@@ -202,7 +177,7 @@ namespace BrewMonster
|
||||
public class A3DSkillGfxEvent
|
||||
{
|
||||
protected A3DSkillGfxComposer m_pComposer;
|
||||
//protected CGfxMoveBase m_pMoveMethod;
|
||||
protected CGfxMoveBase m_pMoveMethod;
|
||||
//protected A3DGFXEx m_pFlyGfx; // 飞行特效 / Fly effect
|
||||
//protected A3DGFXEx m_pHitGfx; // 命中特效 / Hit effect
|
||||
protected uint m_dwFlyTimeSpan; // 飞行时间 / Flight time
|
||||
@@ -248,7 +223,7 @@ namespace BrewMonster
|
||||
m_bGfxDisableCamShake = false;
|
||||
m_bHostECMCreatedByGfx = false;
|
||||
|
||||
//m_pMoveMethod = CGfxMoveBase.CreateMoveMethod(mode);
|
||||
m_pMoveMethod = CGfxMoveBase.CreateMoveMethod(mode);
|
||||
}
|
||||
|
||||
~A3DSkillGfxEvent()
|
||||
@@ -333,16 +308,16 @@ namespace BrewMonster
|
||||
public void SetHostModelCreatedByGfx(bool b) { m_bHostECMCreatedByGfx = b; }
|
||||
public bool GetHostModelCreatedByGfx() { return m_bHostECMCreatedByGfx; }
|
||||
public void SetComposer(A3DSkillGfxComposer pComposer) { m_pComposer = pComposer; }
|
||||
//public CGfxMoveBase GetMoveMethod() { return m_pMoveMethod; }
|
||||
//public GfxMoveMode GetMode() { return m_pMoveMethod.GetMode(); }
|
||||
//public GfxHitPos GetHitPos() { return m_pMoveMethod.GetHitPos(); }
|
||||
public CGfxMoveBase GetMoveMethod() { return m_pMoveMethod; }
|
||||
public GfxMoveMode GetMode() { return m_pMoveMethod.GetMode(); }
|
||||
public GfxHitPos GetHitPos() { return m_pMoveMethod.GetHitPos(); }
|
||||
/* public A3DGFXEx GetFlyGfx() { return m_pFlyGfx; }
|
||||
public A3DGFXEx GetHitGfx() { return m_pHitGfx; }*/
|
||||
public void SetFlyTimeSpan(uint dwSpan) { m_dwFlyTimeSpan = dwSpan; }
|
||||
public void SetDelay(uint dwDelay) { m_dwDelayTime = dwDelay; }
|
||||
//public void SetReverse(bool bReverse) { m_pMoveMethod.SetReverse(bReverse); }
|
||||
//public void SetParam(GFX_SKILL_PARAM param) { m_pMoveMethod.SetParam(param); }
|
||||
//public void SetIsCluster(bool bCluster) { m_pMoveMethod.SetIsCluster(bCluster); }
|
||||
public void SetReverse(bool bReverse) { m_pMoveMethod.SetReverse(bReverse); }
|
||||
public void SetParam(GFX_SKILL_PARAM param) { m_pMoveMethod.SetParam(param); }
|
||||
public void SetIsCluster(bool bCluster) { m_pMoveMethod.SetIsCluster(bCluster); }
|
||||
public void SetTraceTarget(bool bTrace) { m_bTraceTarget = bTrace; }
|
||||
public void SetFadeOut(bool bFadeOut) { m_bFadeOut = bFadeOut; }
|
||||
public bool IsFinished() { return m_enumState == GfxSkillEventState.enumFinished; }
|
||||
@@ -393,78 +368,78 @@ namespace BrewMonster
|
||||
if (m_enumState == GfxSkillEventState.enumFinished) return; // 结束 / Finished
|
||||
else if (m_enumState == GfxSkillEventState.enumHit) // 命中 / Hit
|
||||
{
|
||||
/* if (m_pHitGfx == null || m_pHitGfx.GetState() == ST_STOP)
|
||||
m_enumState = GfxSkillEventState.enumFinished;
|
||||
else
|
||||
{
|
||||
if (!m_bTargetExist || (m_bHitGfxInfinite && m_pHitGfx.GetTimeElapse() > 5000)) // HIT_GFX_MAX_TIMESPAN = 5000
|
||||
m_enumState = GfxSkillEventState.enumFinished;
|
||||
else
|
||||
{
|
||||
if (m_bTraceTarget)
|
||||
{
|
||||
Matrix4x4 matTran = Matrix4x4.identity;
|
||||
Vector3 targetCenter = GetTargetCenter();
|
||||
matTran.SetColumn(3, new Vector4(targetCenter.x, targetCenter.y, targetCenter.z, 1));
|
||||
//m_pHitGfx.SetParentTM(matTran);
|
||||
}
|
||||
|
||||
//m_pHitGfx.TickAnimation(dwDeltaTime);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
else if (m_dwCurSpan > m_dwFlyTimeSpan) // 飞行超时 / Flight timeout
|
||||
{
|
||||
if (!m_bTargetExist)
|
||||
m_enumState = GfxSkillEventState.enumFinished;
|
||||
/* else
|
||||
HitTarget(GetTargetCenter());*/
|
||||
}
|
||||
else if (!m_bTargetExist)
|
||||
// In Unity, hit GFX is auto-destroyed via Destroy(obj, 3f) in CECSkillGfxEvent.
|
||||
// Transition to Finished immediately — the hit GFX cleanup is handled by Unity's timer.
|
||||
// 在Unity中,命中特效通过Destroy(obj, 3f)自动销毁。立即转为Finished状态。
|
||||
m_enumState = GfxSkillEventState.enumFinished;
|
||||
}
|
||||
else if (m_enumState == GfxSkillEventState.enumWait)
|
||||
{
|
||||
if (m_dwCurSpan < m_dwDelayTime) return;
|
||||
|
||||
// Check host existence before transitioning to Flying
|
||||
// 在转换到Flying之前检查施法者是否存在
|
||||
if (!m_bHostExist)
|
||||
{
|
||||
m_enumState = GfxSkillEventState.enumFinished;
|
||||
return;
|
||||
}
|
||||
|
||||
// For skills that require a target, check target existence before starting flight
|
||||
// For area skills or skills without specific targets, allow flight even if target doesn't exist
|
||||
// 对于需要目标的技能,在开始飞行前检查目标是否存在
|
||||
// 对于区域技能或没有特定目标的技能,即使目标不存在也允许飞行
|
||||
if (!m_bTargetExist && m_nTargetID != 0)
|
||||
{
|
||||
// Target is required but doesn't exist - finish the event
|
||||
// 需要目标但目标不存在 - 结束事件
|
||||
m_enumState = GfxSkillEventState.enumFinished;
|
||||
return;
|
||||
}
|
||||
|
||||
// Transition to Flying state
|
||||
// 转换到飞行状态
|
||||
m_enumState = GfxSkillEventState.enumFlying;
|
||||
m_pMoveMethod.SetMaxFlyTime(m_dwFlyTimeSpan);
|
||||
|
||||
// Use target position if available, otherwise use host position (for area skills)
|
||||
// 如果目标位置可用则使用,否则使用施法者位置(用于区域技能)
|
||||
Vector3 targetPos = m_bTargetExist ? m_vTargetPos : m_vHostPos;
|
||||
m_pMoveMethod.StartMove(m_vHostPos, targetPos);
|
||||
|
||||
// Fly GFX spawning is handled by CECSkillGfxEvent.Tick() when it detects Wait→Flying transition
|
||||
// 飞行特效的生成由CECSkillGfxEvent.Tick()在检测到Wait→Flying转换时处理
|
||||
}
|
||||
else if (m_dwCurSpan > m_dwFlyTimeSpan) // 飞行超时 / Flight timeout
|
||||
{
|
||||
if (!m_bTargetExist && m_nTargetID != 0)
|
||||
m_enumState = GfxSkillEventState.enumFinished;
|
||||
else
|
||||
{
|
||||
m_enumState = GfxSkillEventState.enumFlying;
|
||||
/* m_pMoveMethod.SetMaxFlyTime(m_dwFlyTimeSpan);
|
||||
m_pMoveMethod.StartMove(m_vHostPos, m_vTargetPos);*/
|
||||
|
||||
/* if (m_pFlyGfx != null)
|
||||
{
|
||||
Vector3 vDir, vUp;
|
||||
|
||||
if (m_pMoveMethod.GetMode() == GfxMoveMode.enumOnTarget && m_pMoveMethod.IsReverse() && GetTargetDirAndUp(out vDir, out vUp))
|
||||
m_pFlyGfx.SetParentTM(a3d_TransformMatrix(vDir, vUp, m_pMoveMethod.GetPos()));
|
||||
else
|
||||
m_pFlyGfx.SetParentTM(_build_matrix(m_pMoveMethod.GetMoveDir(), m_pMoveMethod.GetPos()));
|
||||
|
||||
m_pFlyGfx.Start(true);
|
||||
m_pMoveMethod.UpdateGfxParam(m_pFlyGfx, m_vHostPos, m_vTargetPos);
|
||||
m_pFlyGfx.TickAnimation(0);
|
||||
}*/
|
||||
Vector3 hitPos = m_bTargetExist ? GetTargetCenter() : m_pMoveMethod.GetPos();
|
||||
HitTarget(hitPos);
|
||||
}
|
||||
}
|
||||
else
|
||||
else // enumFlying state / 飞行状态
|
||||
{
|
||||
/* if (m_pMoveMethod.TickMove(dwDeltaTime, m_vHostPos, m_vTargetPos)) // 目标被命中 / Target hit
|
||||
HitTarget(GetTargetCenter());*/
|
||||
/*else if (m_pFlyGfx != null)
|
||||
{
|
||||
Vector3 vDir, vUp;
|
||||
if (m_pMoveMethod.TickMove(dwDeltaTime, m_vHostPos, m_vTargetPos)) // 目标被命中 / Target hit
|
||||
{
|
||||
// Only call GetTargetCenter if target exists and is not destroyed
|
||||
// 仅在目标存在且未销毁时调用GetTargetCenter
|
||||
if (m_bTargetExist && m_nTargetID != 0)
|
||||
{
|
||||
HitTarget(GetTargetCenter());
|
||||
}
|
||||
else
|
||||
{
|
||||
// Target destroyed, hit at last known position or current position
|
||||
// 目标已销毁,在最后已知位置或当前位置命中
|
||||
HitTarget(m_bTargetExist ? m_vTargetPos : m_pMoveMethod.GetPos());
|
||||
}
|
||||
}
|
||||
|
||||
if (m_pMoveMethod.GetMode() == GfxMoveMode.enumOnTarget && m_pMoveMethod.IsReverse() && GetTargetDirAndUp(out vDir, out vUp))
|
||||
m_pFlyGfx.SetParentTM(a3d_TransformMatrix(vDir, vUp, m_pMoveMethod.GetPos()));
|
||||
else
|
||||
m_pFlyGfx.SetParentTM(_build_matrix(m_pMoveMethod.GetMoveDir(), m_pMoveMethod.GetPos()));
|
||||
|
||||
m_pMoveMethod.UpdateGfxParam(m_pFlyGfx, m_vHostPos, m_vTargetPos);
|
||||
m_pFlyGfx.TickAnimation(dwDeltaTime);
|
||||
}*/
|
||||
// Fly GFX transform update is handled by CECSkillGfxEvent.Tick()
|
||||
// 飞行特效的变换更新由CECSkillGfxEvent.Tick()处理
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,52 +11,124 @@ using System.Text;
|
||||
using ModelRenderer.Scripts.Common;
|
||||
using BrewMonster.Scripts;
|
||||
using UnityEngine;
|
||||
using System.Threading.Tasks;
|
||||
using Cysharp.Threading.Tasks;
|
||||
|
||||
namespace BrewMonster
|
||||
{
|
||||
public class CECAttacksMan : MonoSingleton<CECAttacksMan>
|
||||
{
|
||||
private readonly LinkedList<CECAttackEvent> m_targets = new LinkedList<CECAttackEvent>();
|
||||
private LinkedList<CECAttackEvent> m_targets = new LinkedList<CECAttackEvent>();
|
||||
public CECMultiSectionSkillMan m_pMultiSkillGfxComposerMan;
|
||||
protected A3DSkillGfxComposerMan m_pSkillGfxComposerMan;
|
||||
#if UNITY_EDITOR
|
||||
public List<CECAttackEvent> m_AttackList = new List<CECAttackEvent>();
|
||||
#endif
|
||||
protected override void Awake()
|
||||
{
|
||||
base.Awake();
|
||||
}
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
m_targets = null;
|
||||
SkillGfxMan.InstanceSub = null;
|
||||
base.OnDestroy();
|
||||
}
|
||||
private void Start()
|
||||
{
|
||||
StartLoad();
|
||||
}
|
||||
private async Task StartLoad()
|
||||
private async void StartLoad()
|
||||
{
|
||||
SetupAttacksMan();
|
||||
|
||||
uint idSkill = 0;
|
||||
|
||||
//int count = 0;
|
||||
while (true/*count >=200*/)
|
||||
// Get the skill map to check if it's populated
|
||||
var skillMap = SkillStub.GetMap();
|
||||
if (skillMap == null || skillMap.Count == 0)
|
||||
{
|
||||
BMLogger.LogWarning("CECAttacksMan::Start() - Skill map is empty, skipping GFX loading");
|
||||
return;
|
||||
}
|
||||
|
||||
LoadAllSkillGfxAsync();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load GFX for a specific skill on-demand (async, non-blocking)
|
||||
/// Call this when a skill is about to be used for the first time
|
||||
/// </summary>
|
||||
public async void LoadSkillGfxOnDemand(uint skillId)
|
||||
{
|
||||
// Check if already loaded
|
||||
if (m_pSkillGfxComposerMan.GetSkillGfxComposer((int)skillId) != null)
|
||||
return; // Already loaded
|
||||
|
||||
// Get SkillStub instance / 获取技能存根实例
|
||||
SkillStub skillStub = SkillStub.GetStub(skillId);
|
||||
if (skillStub == null)
|
||||
{
|
||||
BMLogger.LogWarning($"CECAttacksMan::LoadSkillGfxOnDemand() - SkillStub not found for skill {skillId}");
|
||||
return;
|
||||
}
|
||||
|
||||
(string flyGFXPath, string hitGrdGFXPath, string hitGFXPath) = ElementSkill.GetAllGFX(skillId);
|
||||
|
||||
// Pass skillStub to LoadOneComposerAsync / 将技能存根传递给LoadOneComposerAsync
|
||||
bool loaded = await m_pSkillGfxComposerMan.LoadOneComposerAsync((int)skillId, skillStub, flyGFXPath, hitGrdGFXPath, hitGFXPath);
|
||||
if (!loaded)
|
||||
{
|
||||
BMLogger.LogWarning($"CECAttacksMan::LoadSkillGfxOnDemand() - Failed to load GFX for skill {skillId}");
|
||||
}
|
||||
}
|
||||
|
||||
public async void LoadAllSkillGfxAsync()
|
||||
{
|
||||
uint idSkill = 0;
|
||||
|
||||
var skillMap = SkillStub.GetMap();
|
||||
if (skillMap == null || skillMap.Count == 0)
|
||||
{
|
||||
BMLogger.LogWarning("CECAttacksMan::LoadAllSkillGfxAsync() - Skill map is empty");
|
||||
return;
|
||||
}
|
||||
|
||||
BMLogger.Log($"CECAttacksMan::LoadAllSkillGfxAsync() - Loading GFX for {skillMap.Count} skills...");
|
||||
int loadedCount = 0;
|
||||
int failedCount = 0;
|
||||
|
||||
while (true)
|
||||
{
|
||||
//count++;
|
||||
idSkill = ElementSkill.NextSkill(idSkill);
|
||||
if (idSkill == 0)
|
||||
break;
|
||||
|
||||
// Get SkillStub instance / 获取技能存根实例
|
||||
SkillStub skillStub = SkillStub.GetStub(idSkill);
|
||||
if (skillStub == null)
|
||||
{
|
||||
BMLogger.LogWarning($"CECAttacksMan::LoadAllSkillGfxAsync() - SkillStub not found for skill {idSkill}");
|
||||
failedCount++;
|
||||
continue;
|
||||
}
|
||||
|
||||
(string flyGFXPath, string hitGrdGFXPath, string hitGFXPath) = ElementSkill.GetAllGFX(idSkill);
|
||||
|
||||
/*while (pszSGCFile.StartsWith("\\"))
|
||||
pszSGCFile = pszSGCFile.Substring(1);
|
||||
|
||||
string szSGCFile;
|
||||
if (string.IsNullOrEmpty(pszSGCFile))
|
||||
szSGCFile = "nosuchthing";
|
||||
// Use await instead of blocking .Result to prevent freezing
|
||||
// Pass skillStub to LoadOneComposerAsync / 将技能存根传递给LoadOneComposerAsync
|
||||
bool loaded = await m_pSkillGfxComposerMan.LoadOneComposerAsync((int)idSkill, skillStub, flyGFXPath, hitGrdGFXPath, hitGFXPath);
|
||||
if (loaded)
|
||||
loadedCount++;
|
||||
else
|
||||
szSGCFile = $"{pszSGCFile}";*/
|
||||
var isLoaded = await m_pSkillGfxComposerMan.LoadOneComposer((int)idSkill, flyGFXPath, hitGrdGFXPath, hitGFXPath);
|
||||
if (!isLoaded)
|
||||
failedCount++;
|
||||
|
||||
// Yield every 10 skills to keep Unity responsive
|
||||
if ((loadedCount + failedCount) % 10 == 0)
|
||||
{
|
||||
// a_LogOutput(1, "CECAttacksMan::CECAttacksMan(), failed to load skill [%d]'s gfx composer [%s]", idSkill, szSGCFile);
|
||||
await UniTask.Yield();
|
||||
}
|
||||
}
|
||||
|
||||
BMLogger.Log($"CECAttacksMan::LoadAllSkillGfxAsync() - Complete. Loaded: {loadedCount}, Failed: {failedCount}");
|
||||
//TODO: convert this part
|
||||
/* char szMultiSectionFile[MAX_PATH] = { 0 };
|
||||
strcpy(szMultiSectionFile, "configs\\multi_section_skill.txt");
|
||||
@@ -79,6 +151,8 @@ namespace BrewMonster
|
||||
|
||||
private void Update()
|
||||
{
|
||||
uint dwDeltaTime = (uint)(Time.deltaTime * 1000);
|
||||
|
||||
#if UNITY_EDITOR
|
||||
if (m_AttackList.Count == 0)
|
||||
m_AttackList = m_targets.ToList();
|
||||
@@ -90,10 +164,61 @@ namespace BrewMonster
|
||||
//BMLogger.LogError("HoangDev: Update CECAttackEvent node.Value.m_bFinished: " + node.Value.m_bFinished);
|
||||
if (node.Value.m_bFinished)
|
||||
m_targets.Remove(node);
|
||||
else node.Value.Tick((uint)(Time.deltaTime * 1000));
|
||||
else {
|
||||
node.Value.Tick(dwDeltaTime);
|
||||
}
|
||||
node = next;
|
||||
}
|
||||
|
||||
// Tick skill GFX events (fly/hit GFX state machine)
|
||||
// 更新技能特效事件(飞行/命中特效状态机)
|
||||
SkillGfxMan.InstanceSub.Tick(dwDeltaTime);
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
/// <summary>
|
||||
/// Draw gizmos for skill projectiles in Unity Editor
|
||||
/// 在Unity编辑器中绘制技能弹道辅助线
|
||||
/// </summary>
|
||||
private void OnDrawGizmos()
|
||||
{
|
||||
// Always draw gizmos (not just when selected)
|
||||
// 始终绘制辅助线(不仅在选择时)
|
||||
int gizmoCount = SkillGfxGizmoDrawer.GetGizmoCount();
|
||||
|
||||
// Draw test gizmo at origin to verify OnDrawGizmos is working
|
||||
// 在原点绘制测试辅助线以验证OnDrawGizmos是否工作
|
||||
if (gizmoCount == 0 && Time.frameCount % 120 == 0) // Log every 2 seconds when no gizmos
|
||||
{
|
||||
// Draw a small test sphere at origin to verify gizmos work
|
||||
// 在原点绘制小测试球体以验证辅助线是否工作
|
||||
Gizmos.color = Color.magenta;
|
||||
Gizmos.DrawWireSphere(Vector3.zero, 1.0f);
|
||||
}
|
||||
|
||||
if (gizmoCount > 0)
|
||||
{
|
||||
// Only log occasionally to avoid spam
|
||||
// 仅偶尔记录以避免刷屏
|
||||
if (Time.frameCount % 60 == 0)
|
||||
{
|
||||
BMLogger.LogError($"[SKILL_GFX_DEBUG] OnDrawGizmos: Drawing {gizmoCount} gizmo(s)");
|
||||
}
|
||||
}
|
||||
SkillGfxGizmoDrawer.DrawGizmos();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw gizmos when selected (for debugging)
|
||||
/// 选择时绘制辅助线(用于调试)
|
||||
/// </summary>
|
||||
private void OnDrawGizmosSelected()
|
||||
{
|
||||
// Also draw when selected for extra visibility
|
||||
// 选择时也绘制以增加可见性
|
||||
SkillGfxGizmoDrawer.DrawGizmos();
|
||||
}
|
||||
#endif
|
||||
bool FileExists(string relativePath)
|
||||
{
|
||||
string fullPath = Path.Combine(Application.streamingAssetsPath, relativePath);
|
||||
@@ -378,6 +503,8 @@ namespace BrewMonster
|
||||
private GfxAttackMode m_AttHitMode;
|
||||
|
||||
private bool m_bRelScl;
|
||||
private float m_fDefTarScl = 1.8f;
|
||||
private GfxCluster m_HitCluster = new GfxCluster { m_ulCount = 1, m_dwInterv = 0 };
|
||||
|
||||
|
||||
public A3DSkillGfxComposer()
|
||||
@@ -390,6 +517,36 @@ namespace BrewMonster
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load SkillStub GFX parameters onto this composer.
|
||||
/// 将SkillStub的GFX参数加载到此组合器上。
|
||||
/// </summary>
|
||||
public void LoadFromSkillStub(BrewMonster.Scripts.Skills.SkillStub stub)
|
||||
{
|
||||
if (stub == null) return;
|
||||
m_MoveMode = stub.m_MoveMode;
|
||||
m_TargetMode = stub.m_TargetMode;
|
||||
m_AttFlyMode = stub.m_AttFlyMode;
|
||||
m_AttHitMode = stub.m_AttHitMode;
|
||||
m_dwFlyTime = stub.m_dwFlyTime;
|
||||
m_bTraceTarget = stub.m_bTraceTarget;
|
||||
m_FlyCluster = new GfxCluster
|
||||
{
|
||||
m_ulCount = stub.m_FlyClusterCount,
|
||||
m_dwInterv = stub.m_FlyClusterInterval
|
||||
};
|
||||
m_bOneHit = stub.m_bOneHit;
|
||||
m_bFadeOut = stub.m_bFadeOut;
|
||||
m_bRelScl = stub.m_bRelScl;
|
||||
m_fDefTarScl = stub.m_fDefTarScl;
|
||||
//m_param = stub.m_param;
|
||||
}
|
||||
|
||||
// GFX prefab accessors / GFX预制体访问器
|
||||
public GameObject GetFlyGFX() => flyGFX;
|
||||
public GameObject GetHitGFX() => hitGFX;
|
||||
public GameObject GetHitGrdGFX() => hitGrdGFX;
|
||||
|
||||
/// <summary>
|
||||
/// Load composer from file
|
||||
/// 从文件加载组合器
|
||||
@@ -399,57 +556,76 @@ namespace BrewMonster
|
||||
string flyGfxName;
|
||||
string hitGrdGfxName;
|
||||
#endif
|
||||
public async Task<bool> Load(string flyGFXPath, string hitGrdGFXPath, string hitGFXPath)
|
||||
public async UniTask<bool> Load(SkillStub skillStub, string flyGFXPath, string hitGrdGFXPath, string hitGFXPath)
|
||||
{
|
||||
#if !UNITY_EDITOR
|
||||
string flyGfxName = flyGFXPath;
|
||||
string hitGfxName = hitGFXPath;
|
||||
string hitGrdGfxName = hitGrdGFXPath;
|
||||
#else
|
||||
flyGfxName = flyGFXPath;
|
||||
hitGfxName = hitGFXPath;
|
||||
hitGrdGfxName = hitGrdGFXPath;
|
||||
#endif
|
||||
if (flyGfxName != string.Empty)
|
||||
{
|
||||
flyGFX = await AddressableManager.Instance.LoadPrefabAsync("gfx/" + flyGfxName);
|
||||
}
|
||||
if (hitGfxName != string.Empty)
|
||||
{
|
||||
hitGFX = await AddressableManager.Instance.LoadPrefabAsync("gfx/" + hitGfxName);
|
||||
}
|
||||
if (hitGrdGfxName != string.Empty)
|
||||
{
|
||||
hitGrdGFX = await AddressableManager.Instance.LoadPrefabAsync("gfx/" + hitGrdGfxName);
|
||||
}
|
||||
|
||||
// Load GFX prefabs / 加载GFX预制体
|
||||
flyGFX = string.IsNullOrEmpty(flyGfxName) ? null : await AddressableManager.Instance.LoadPrefabAsync("gfx/" + flyGfxName);
|
||||
hitGFX = string.IsNullOrEmpty(hitGfxName) ? null : await AddressableManager.Instance.LoadPrefabAsync("gfx/" + hitGfxName);
|
||||
hitGrdGFX = string.IsNullOrEmpty(hitGrdGfxName) ? null : await AddressableManager.Instance.LoadPrefabAsync("gfx/" + hitGrdGfxName);
|
||||
|
||||
//BMLogger.LogError("HoangDev: Load A3DSkillGfxComposer GFX name: " + name);
|
||||
if (flyGFX == null)
|
||||
if (flyGFX == null && !string.IsNullOrEmpty(flyGfxName))
|
||||
{
|
||||
flyGFX = Resources.Load<GameObject>("GFX/" + "PlaceHolder");
|
||||
}
|
||||
if (hitGFX == null)
|
||||
|
||||
// Read parameters from SkillStub / 从技能存根读取参数
|
||||
if (skillStub != null)
|
||||
{
|
||||
hitGFX = Resources.Load<GameObject>("GFX/" + "PlaceHolder");
|
||||
m_MoveMode = skillStub.m_MoveMode;
|
||||
m_TargetMode = skillStub.m_TargetMode;
|
||||
m_AttFlyMode = skillStub.m_AttFlyMode;
|
||||
m_AttHitMode = skillStub.m_AttHitMode;
|
||||
m_dwFlyTime = skillStub.m_dwFlyTime;
|
||||
m_bTraceTarget = skillStub.m_bTraceTarget;
|
||||
|
||||
// Clustering / 集群
|
||||
m_FlyCluster.m_ulCount = skillStub.m_FlyClusterCount;
|
||||
m_FlyCluster.m_dwInterv = skillStub.m_FlyClusterInterval;
|
||||
m_HitCluster.m_ulCount = skillStub.m_HitClusterCount;
|
||||
m_HitCluster.m_dwInterv = skillStub.m_HitClusterInterval;
|
||||
|
||||
// Behavior / 行为
|
||||
m_bOneHit = skillStub.m_bOneHit;
|
||||
m_bFadeOut = skillStub.m_bFadeOut;
|
||||
m_bRelScl = skillStub.m_bRelScl;
|
||||
m_fDefTarScl = skillStub.m_fDefTarScl;
|
||||
|
||||
// Area / 区域
|
||||
/* m_param.m_bArea = skillStub.m_bArea;
|
||||
m_param.m_Shape = skillStub.m_Shape;
|
||||
m_param.m_vSize = skillStub.m_vSize;
|
||||
|
||||
// Param value / 参数值
|
||||
m_param.value = skillStub.m_param.value;*/
|
||||
}
|
||||
if (hitGrdGFX == null)
|
||||
else
|
||||
{
|
||||
hitGrdGFX = Resources.Load<GameObject>("GFX/" + "PlaceHolder");
|
||||
// Set defaults if no skillStub provided / 如果没有提供技能存根则设置默认值
|
||||
m_MoveMode = GfxMoveMode.enumLinearMove;
|
||||
m_TargetMode = GfxTargetMode.enumHostToTarget;
|
||||
m_AttFlyMode = GfxAttackMode.enumAttPoint;
|
||||
m_AttHitMode = GfxAttackMode.enumAttPoint;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyCluster.m_ulCount = 1;
|
||||
m_FlyCluster.m_dwInterv = 0;
|
||||
m_HitCluster.m_ulCount = 1;
|
||||
m_HitCluster.m_dwInterv = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
public void SpawnGFX(long IDTarget)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
BMLogger.LogError("HoangDev: Load A3DSkillGfxComposer GFX name: " + flyGfxName);
|
||||
BMLogger.LogError("HoangDev: Load A3DSkillGfxComposer GFX name: " + hitGfxName);
|
||||
BMLogger.LogError("HoangDev: Load A3DSkillGfxComposer GFX name: " + hitGrdGfxName);
|
||||
#endif
|
||||
var obj = EC_ManMessageMono.Instance.GetObject(IDTarget, 0);
|
||||
if (obj != null && flyGFX != null)
|
||||
{
|
||||
GameObject.Instantiate(flyGFX, obj.transform.position, flyGFX.gameObject.transform.rotation, obj.transform);
|
||||
}
|
||||
}
|
||||
// SpawnGFX temp hack REMOVED — GFX spawning now handled by CECSkillGfxEvent state machine
|
||||
// SpawnGFX临时代码已删除 — GFX生成现在由CECSkillGfxEvent状态机处理
|
||||
/// <summary>
|
||||
/// Initialize composer
|
||||
/// 初始化组合器
|
||||
@@ -467,48 +643,107 @@ namespace BrewMonster
|
||||
{
|
||||
bool bCastInTargets = false;
|
||||
|
||||
/* char szFly = m_szFlyGfx[0] ? m_szFlyGfx : NULL;
|
||||
char szHit = m_szHitGfx[0] ? m_szHitGfx : NULL;*/
|
||||
// Determine GFX names from loaded prefabs / 从已加载的预制体确定GFX名称
|
||||
string szFly = flyGFX != null ? flyGfxName : null;
|
||||
string szHit = hitGFX != null ? hitGfxName : null;
|
||||
|
||||
/*# ifndef _SKILLGFXCOMPOSER
|
||||
if (!CECOptimize::Instance().GetGFX().CanShowFly(nHostID))
|
||||
{
|
||||
a_LogOutput(1, "[SKILL_GFX_FLOW] ====> Fly GFX hidden by optimization");
|
||||
szFly = NULL;
|
||||
}
|
||||
if (!CECOptimize::Instance().GetGFX().CanShowHit(nHostID))
|
||||
{
|
||||
a_LogOutput(1, "[SKILL_GFX_FLOW] ====> Hit GFX hidden by optimization");
|
||||
szHit = NULL;
|
||||
}
|
||||
#endif*/
|
||||
// TODO Phase 2: Optimization checks / 第二阶段:优化检查
|
||||
// if (!CECOptimize.Instance.GetGFX().CanShowFly(nHostID)) szFly = null;
|
||||
// if (!CECOptimize.Instance.GetGFX().CanShowHit(nHostID)) szHit = null;
|
||||
|
||||
// Log target details
|
||||
// Validate targets exist before processing (filter out destroyed targets)
|
||||
// 在处理前验证目标是否存在(过滤已销毁的目标)
|
||||
if (targets != null && targets.Count > 0)
|
||||
{
|
||||
var validTargets = new List<TARGET_DATA>();
|
||||
foreach (var tar in targets)
|
||||
{
|
||||
if (ValidateTargetExists(tar.idTarget))
|
||||
{
|
||||
validTargets.Add(tar);
|
||||
}
|
||||
else
|
||||
{
|
||||
BMLogger.LogWarning($"[SKILL_GFX_DEBUG] Composer.Play: Target {tar.idTarget} is destroyed, skipping");
|
||||
}
|
||||
}
|
||||
|
||||
if (validTargets.Count == 0)
|
||||
{
|
||||
BMLogger.LogWarning($"[SKILL_GFX_DEBUG] Composer.Play: All targets destroyed, skipping GFX");
|
||||
return;
|
||||
}
|
||||
|
||||
int originalCount = targets.Count;
|
||||
targets = validTargets;
|
||||
|
||||
for (int i = 0; i < targets.Count; i++)
|
||||
{
|
||||
var tar = targets[i];
|
||||
|
||||
|
||||
if (nCastTargetID == tar.idTarget)
|
||||
bCastInTargets = true;
|
||||
AddOneTarget(nCastTargetID, nHostID, "" /*szFly*/, ""/*szHit*/, tar, i == 0, bIsGoblinSkill);
|
||||
AddOneTarget(nCastTargetID, nHostID, szFly, szHit, tar, i == 0, bIsGoblinSkill);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
|
||||
if (nCastTargetID != 0 && !bCastInTargets)
|
||||
{
|
||||
// Validate cast target exists before adding
|
||||
// 在添加前验证施法目标是否存在
|
||||
if (!ValidateTargetExists(nCastTargetID))
|
||||
{
|
||||
BMLogger.LogWarning($"[SKILL_GFX_DEBUG] Composer.Play: Cast target {nCastTargetID} is destroyed, skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
TARGET_DATA tar = default;
|
||||
tar.idTarget = nCastTargetID;
|
||||
tar.dwModifier = 0;
|
||||
|
||||
AddOneTarget(nCastTargetID, nHostID, ""/*szFly*/, ""/*szHit*/, tar, false, bIsGoblinSkill);
|
||||
AddOneTarget(nCastTargetID, nHostID, szFly, szHit, tar, false, bIsGoblinSkill);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validate that a target exists and its GameObject is not destroyed
|
||||
/// 验证目标存在且其GameObject未销毁
|
||||
/// </summary>
|
||||
private bool ValidateTargetExists(int idTarget)
|
||||
{
|
||||
if (GPDataTypeHelper.ISNPCID(idTarget))
|
||||
{
|
||||
var npc = EC_ManMessageMono.Instance?.CECNPCMan?.GetNPCFromAll(idTarget);
|
||||
// Use Unity's == null check which properly handles destroyed objects
|
||||
// Unity destroyed objects pass != null but throw exceptions when accessed
|
||||
if (npc == null) return false;
|
||||
try
|
||||
{
|
||||
return npc.gameObject != null;
|
||||
}
|
||||
catch (System.Exception)
|
||||
{
|
||||
// Object was destroyed - return false
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (GPDataTypeHelper.ISPLAYERID(idTarget))
|
||||
{
|
||||
var player = EC_ManMessageMono.Instance?.GetECManPlayer?.GetPlayer(idTarget);
|
||||
if (player == null) return false;
|
||||
try
|
||||
{
|
||||
return player.gameObject != null;
|
||||
}
|
||||
catch (System.Exception)
|
||||
{
|
||||
// Object was destroyed - return false
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public void AddOneTarget(
|
||||
int nCastTargetID,
|
||||
int nHostID,
|
||||
@@ -522,7 +757,6 @@ namespace BrewMonster
|
||||
float fScale;
|
||||
bool bReverse;
|
||||
|
||||
// 根据目标模式决定Host和Target的映射 / Determine Host and Target mapping based on target mode
|
||||
switch (m_TargetMode)
|
||||
{
|
||||
case GfxTargetMode.enumTargetToHost:
|
||||
@@ -542,10 +776,10 @@ namespace BrewMonster
|
||||
}
|
||||
|
||||
// 计算缩放 / Calculate scale
|
||||
/* if (m_bRelScl)
|
||||
fScale = m_pSkillGfxMan.GetTargetScale(_Target) / m_fDefTarScl * m_fHitGfxScale;
|
||||
else
|
||||
fScale = m_fHitGfxScale;*/
|
||||
/* if (m_bRelScl)
|
||||
fScale = SkillGfxMan.InstanceSub.GetTargetScale(_Target) / m_fDefTarScl * m_fHitGfxScale;
|
||||
else
|
||||
fScale = m_fHitGfxScale;*/
|
||||
|
||||
// 根据目标类型决定是否显示特效 / Determine whether to show effects based on target type
|
||||
if ((nCastTargetID != 0 && tar.idTarget != nCastTargetID)
|
||||
@@ -561,6 +795,11 @@ namespace BrewMonster
|
||||
}
|
||||
}
|
||||
|
||||
if (m_pSkillGfxMan == null)
|
||||
{
|
||||
BMLogger.LogError($"[SKILL_GFX_DEBUG] AddOneTarget: m_pSkillGfxMan is NULL - cannot add event!");
|
||||
return;
|
||||
}
|
||||
|
||||
// 调用GFX管理器添加技能特效事件 / Call GFX manager to add skill GFX event
|
||||
m_pSkillGfxMan.AddSkillGfxEvent(
|
||||
@@ -575,8 +814,6 @@ namespace BrewMonster
|
||||
(int)m_FlyCluster.m_ulCount,
|
||||
m_FlyCluster.m_dwInterv,
|
||||
m_param,
|
||||
0/*m_fFlyGfxScale*/,
|
||||
0/*fScale*/,
|
||||
tar.dwModifier,
|
||||
m_bOneHit,
|
||||
m_bFadeOut,
|
||||
@@ -610,6 +847,9 @@ public class CECAttackEvent
|
||||
public int m_nSkillLevel;
|
||||
public int m_nSkillSection;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
int debugCounter = 0; // Debug counter to track Tick calls
|
||||
#endif
|
||||
public CECAttackEvent() { }
|
||||
|
||||
public CECAttackEvent(CECAttacksMan? pManager, int idHost, int idCastTarget, int idTarget,
|
||||
@@ -625,6 +865,7 @@ public class CECAttackEvent
|
||||
m_timeToBeFired = (uint)nTimeToBeFired;
|
||||
m_timeToDoDamage = (uint)nTimeToDoDamage;
|
||||
m_bFinished = false;
|
||||
debugCounter = UnityEngine.Random.Range(0, 1000);
|
||||
|
||||
AddTarget(idTarget, dwModifier, nDamage);
|
||||
}
|
||||
@@ -676,9 +917,6 @@ public class CECAttackEvent
|
||||
public void SetSkillSection(int nSection) { m_nSkillSection = nSection; }
|
||||
bool DoFire()
|
||||
{
|
||||
float vFlyScale = 1.0f;
|
||||
float vHitScale = 1.0f;
|
||||
|
||||
m_bDoFired = true;
|
||||
|
||||
if (GPDataTypeHelper.ISPLAYERID(m_idHost))
|
||||
@@ -700,6 +938,7 @@ public class CECAttackEvent
|
||||
}
|
||||
else
|
||||
{
|
||||
BMLogger.LogError($"[SKILL_GFX_DEBUG] DoFire: Multi-section pMan is NULL!");
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -720,6 +959,7 @@ public class CECAttackEvent
|
||||
}
|
||||
else
|
||||
{
|
||||
BMLogger.LogError($"[SKILL_GFX_DEBUG] DoFire: composerMan is NULL - cannot play skill GFX!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -881,9 +1121,13 @@ public class CECAttackEvent
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: Implement SkillGfxComposerMan
|
||||
// m_pManager.GetSkillGfxComposerMan().Play(m_idSkill, m_idHost, m_idCastTarget, m_targets);
|
||||
// pComposer = m_pManager.GetSkillGfxComposerMan().GetSkillGfxComposer(m_idSkill);
|
||||
// NPC regular skill GFX / NPC常规技能特效
|
||||
var composerMan = m_pManager?.GetSkillGfxComposerMan();
|
||||
if (composerMan != null)
|
||||
{
|
||||
composerMan.Play(m_idSkill, m_idHost, m_idCastTarget, m_targets);
|
||||
pComposer = composerMan.GetSkillGfxComposer(m_idSkill);
|
||||
}
|
||||
}
|
||||
|
||||
if (pComposer != null && pComposer.m_dwFlyTime == 0) // 技能没有飞行时间,则直接头顶冒字 / Skill has no fly time, show damage immediately
|
||||
@@ -1244,4 +1488,12 @@ public enum EmitShape
|
||||
enumSphere,
|
||||
enumCylinder,
|
||||
enumShapeNum
|
||||
};
|
||||
};
|
||||
|
||||
public enum GfxSkillValType
|
||||
{
|
||||
enumGfxSkillBool = 0,
|
||||
enumGfxSkillInt,
|
||||
enumGfxSkillFloat,
|
||||
enumGfxSkillValTypeNum
|
||||
};
|
||||
|
||||
@@ -14,12 +14,14 @@ using UnityEngine;
|
||||
|
||||
public class CECNPCMan : IMsgHandler
|
||||
{
|
||||
private Dictionary<int, CECNPC> m_NPCTab = new Dictionary<int, CECNPC>(512);
|
||||
private Dictionary<int, int> m_UkNPCTab = new Dictionary<int, int>(32);
|
||||
private Dictionary<int, CECNPC> m_NPCTab ;
|
||||
private Dictionary<int, int> m_UkNPCTab ;
|
||||
|
||||
List<CECNPC> m_aDisappearNPCs = new List<CECNPC>(32);
|
||||
List<CECNPC> m_aDisappearNPCs ;
|
||||
public int HandlerId => (int)MANAGER_INDEX.MAN_NPC;
|
||||
|
||||
// Static counter to track calls - resets to 0 when new instance is created (play mode starts)
|
||||
|
||||
// List of NPCs to remove. It's needed in every tick.
|
||||
// Having this as a global variable is more efficient than creating a new list every tick.
|
||||
CECNPC[] aRemove = new CECNPC[64];
|
||||
@@ -29,6 +31,187 @@ public class CECNPCMan : IMsgHandler
|
||||
|
||||
public CECNPCMan()
|
||||
{
|
||||
//
|
||||
m_NPCTab = new Dictionary<int, CECNPC>(512);
|
||||
m_UkNPCTab = new Dictionary<int, int>(32);
|
||||
m_aDisappearNPCs = new List<CECNPC>(32);
|
||||
// Reset debug counter when new instance is created (play mode starts)
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds or updates an NPC in the m_NPCTab dictionary with comprehensive logging.
|
||||
/// </summary>
|
||||
/// <param name="nid">NPC ID</param>
|
||||
/// <param name="npc">NPC object to add</param>
|
||||
/// <param name="reason">Reason for adding (for logging purposes)</param>
|
||||
/// <returns>True if added successfully, false if npc is null or invalid</returns>
|
||||
private bool AddNPCToTable(int nid, CECNPC npc, string reason = "Unknown")
|
||||
{
|
||||
string stackTrace = System.Environment.StackTrace.Split('\n')[1].Trim();
|
||||
int countBefore = m_NPCTab.Count;
|
||||
bool keyExists = m_NPCTab.ContainsKey(nid);
|
||||
CECNPC oldValue = keyExists ? m_NPCTab[nid] : null;
|
||||
|
||||
|
||||
// Validate input
|
||||
if (npc == null)
|
||||
{
|
||||
BMLogger.LogError($"[DICT_TRACE] AddNPCToTable: FAILED - npc is NULL for nid={nid}, reason={reason}");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if old value exists and is different
|
||||
if (keyExists && oldValue != null)
|
||||
{
|
||||
bool oldIsDestroyed = false;
|
||||
try
|
||||
{
|
||||
oldIsDestroyed = oldValue.gameObject == null;
|
||||
}
|
||||
catch (System.Exception)
|
||||
{
|
||||
oldIsDestroyed = true;
|
||||
}
|
||||
|
||||
if (oldValue != npc)
|
||||
{
|
||||
BMLogger.LogError($"[DICT_TRACE] AddNPCToTable: REPLACING existing NPC - nid={nid}, oldValue={(oldValue != null ? oldValue.name : "NULL")}, oldIsDestroyed={oldIsDestroyed}, newValue={npc.name}");
|
||||
}
|
||||
}
|
||||
|
||||
// Check new value state
|
||||
bool newIsNull = npc == null;
|
||||
bool newGameObjectIsNull = false;
|
||||
string newNPCName = "NULL";
|
||||
try
|
||||
{
|
||||
newGameObjectIsNull = npc.gameObject == null;
|
||||
newNPCName = npc.name;
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
newGameObjectIsNull = true;
|
||||
BMLogger.LogError($"[DICT_TRACE] AddNPCToTable: Exception checking new npc.gameObject for nid={nid}: {ex.Message}");
|
||||
}
|
||||
|
||||
// Add to dictionary
|
||||
m_NPCTab[nid] = npc;
|
||||
int countAfter = m_NPCTab.Count;
|
||||
|
||||
// Verify the value was set correctly
|
||||
bool verifySuccess = m_NPCTab.TryGetValue(nid, out var verifyNPC);
|
||||
bool verifyIsNull = verifyNPC == null;
|
||||
bool verifyGameObjectIsNull = false;
|
||||
try
|
||||
{
|
||||
if (verifyNPC != null)
|
||||
verifyGameObjectIsNull = verifyNPC.gameObject == null;
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
verifyGameObjectIsNull = true;
|
||||
BMLogger.LogError($"[DICT_TRACE] AddNPCToTable: Exception verifying npc.gameObject for nid={nid}: {ex.Message}");
|
||||
}
|
||||
|
||||
if (verifyIsNull || verifyGameObjectIsNull)
|
||||
{
|
||||
BMLogger.LogError($"[DICT_TRACE] AddNPCToTable: WARNING - Value is NULL or destroyed immediately after setting! nid={nid}, reason={reason}");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes an NPC from the m_NPCTab dictionary with comprehensive logging.
|
||||
/// </summary>
|
||||
/// <param name="nid">NPC ID to remove</param>
|
||||
/// <param name="reason">Reason for removal (for logging purposes)</param>
|
||||
/// <returns>True if removed successfully, false if key didn't exist</returns>
|
||||
private bool RemoveNPCFromTable(int nid, string reason = "Unknown")
|
||||
{
|
||||
string stackTrace = System.Environment.StackTrace.Split('\n')[1].Trim();
|
||||
int countBefore = m_NPCTab.Count;
|
||||
bool keyExists = m_NPCTab.ContainsKey(nid);
|
||||
CECNPC valueBeforeRemove = null;
|
||||
bool valueIsNull = false;
|
||||
bool gameObjectIsNull = false;
|
||||
string npcName = "NULL";
|
||||
|
||||
if (!keyExists)
|
||||
{
|
||||
BMLogger.LogError($"[DICT_TRACE] RemoveNPCFromTable: KEY NOT FOUND - nid={nid}, reason={reason}");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check value state before removal
|
||||
valueBeforeRemove = m_NPCTab[nid];
|
||||
valueIsNull = valueBeforeRemove == null;
|
||||
|
||||
if (!valueIsNull)
|
||||
{
|
||||
try
|
||||
{
|
||||
gameObjectIsNull = valueBeforeRemove.gameObject == null;
|
||||
npcName = valueBeforeRemove.name;
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
gameObjectIsNull = true;
|
||||
BMLogger.LogError($"[DICT_TRACE] RemoveNPCFromTable: Exception accessing value before remove for nid={nid}: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Remove from dictionary
|
||||
bool removed = m_NPCTab.Remove(nid);
|
||||
int countAfter = m_NPCTab.Count;
|
||||
|
||||
// Verify removal
|
||||
bool keyStillExists = m_NPCTab.ContainsKey(nid);
|
||||
|
||||
|
||||
if (keyStillExists)
|
||||
{
|
||||
BMLogger.LogError($"[DICT_TRACE] RemoveNPCFromTable: ERROR - Key still exists after removal! nid={nid}, reason={reason}");
|
||||
}
|
||||
|
||||
if (valueIsNull || gameObjectIsNull)
|
||||
{
|
||||
BMLogger.LogError($"[DICT_TRACE] RemoveNPCFromTable: REMOVED NULL/DESTROYED VALUE - nid={nid}, valueIsNull={valueIsNull}, gameObjectIsNull={gameObjectIsNull}, reason={reason}. This explains why key existed but value was null!");
|
||||
}
|
||||
|
||||
return removed;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clean up destroyed objects from dictionaries. Call this when play mode starts to remove stale references.
|
||||
/// </summary>
|
||||
public void CleanupDestroyedObjects()
|
||||
{
|
||||
// Clean up destroyed NPCs from main table
|
||||
var keysToRemove = new List<int>();
|
||||
int nullCount = 0;
|
||||
foreach (var kvp in m_NPCTab)
|
||||
{
|
||||
if (kvp.Value == null)
|
||||
{
|
||||
nullCount++;
|
||||
keysToRemove.Add(kvp.Key);
|
||||
}
|
||||
else if (kvp.Value.gameObject == null)
|
||||
{
|
||||
nullCount++;
|
||||
keysToRemove.Add(kvp.Key);
|
||||
}
|
||||
}
|
||||
foreach (var key in keysToRemove)
|
||||
{
|
||||
RemoveNPCFromTable(key, "CleanupDestroyedObjects - null/destroyed entry");
|
||||
}
|
||||
|
||||
// Clean up destroyed NPCs from disappear table
|
||||
int beforeDisappearCount = m_aDisappearNPCs.Count;
|
||||
m_aDisappearNPCs.RemoveAll(npc => npc == null || npc.gameObject == null);
|
||||
}
|
||||
public bool ProcessMessage(ECMSG Msg)
|
||||
{
|
||||
@@ -94,9 +277,14 @@ public class CECNPCMan : IMsgHandler
|
||||
public void Tick()
|
||||
{
|
||||
iRemoveCnt = 0;
|
||||
|
||||
|
||||
// Tick all NPCs
|
||||
foreach (var pNPC in m_NPCTab.Values)
|
||||
{
|
||||
if (pNPC == null || pNPC.gameObject == null)
|
||||
continue; // Skip destroyed objects
|
||||
|
||||
if (pNPC.ShouldDisappear())
|
||||
{
|
||||
if (iRemoveCnt < SIZE_REMOVETAB)
|
||||
@@ -109,7 +297,13 @@ public class CECNPCMan : IMsgHandler
|
||||
}
|
||||
|
||||
for (int i = 0; i < iRemoveCnt; i++)
|
||||
NPCLeave(aRemove[i].GetNPCID());
|
||||
{
|
||||
if (aRemove[i] != null)
|
||||
{
|
||||
int nid = aRemove[i].GetNPCID();
|
||||
NPCLeave(nid);
|
||||
}
|
||||
}
|
||||
|
||||
// Tick all NPCs who are in disappear table
|
||||
iRemoveCnt = 0;
|
||||
@@ -136,7 +330,11 @@ public class CECNPCMan : IMsgHandler
|
||||
|
||||
for (int i = 0; i < iRemoveCnt; i++)
|
||||
{
|
||||
ReleaseNPC(aRemove[i]);
|
||||
if (aRemove[i] != null)
|
||||
{
|
||||
int nid = aRemove[i].GetNPCID();
|
||||
ReleaseNPC(aRemove[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// Update NPCs in various ranges (Active, visible, mini-map etc.)
|
||||
@@ -148,7 +346,6 @@ public class CECNPCMan : IMsgHandler
|
||||
}
|
||||
private void OnMsgNPCDisappear(ECMSG Msg)
|
||||
{
|
||||
BMLogger.Log("HoangDev : OnMsgNPCDisappear ");
|
||||
|
||||
var pCmd = GPDataTypeHelper.FromBytes<cmd_object_disappear>((byte[])Msg.dwParam1);
|
||||
NPCDisappear(pCmd.id);
|
||||
@@ -173,13 +370,20 @@ public class CECNPCMan : IMsgHandler
|
||||
NPCLeave(nid, true, false);
|
||||
m_aDisappearNPCs.Add(pNPC);
|
||||
}
|
||||
else
|
||||
{
|
||||
BMLogger.LogError($"[NPC_REMOVAL_TRACE] NPCDisappear: NPC {nid} NOT FOUND in table");
|
||||
}
|
||||
}
|
||||
void NPCLeave(int nid, bool bUpdateMMArray = true, bool bRelease = true)
|
||||
{
|
||||
// Release NPC
|
||||
CECNPC pNPC = GetNPC(nid);
|
||||
if (!pNPC)
|
||||
{
|
||||
BMLogger.LogError($"[NPC_REMOVAL_TRACE] NPCLeave: NPC {nid} NOT FOUND in table, cannot remove");
|
||||
return;
|
||||
}
|
||||
|
||||
/*if (bUpdateMMArray)
|
||||
RemoveNPCFromMiniMap(pNPC);*/
|
||||
@@ -191,14 +395,16 @@ public class CECNPCMan : IMsgHandler
|
||||
hostplayer.SelectTarget(0);
|
||||
|
||||
// Remove it from active NPC table
|
||||
m_NPCTab.Remove(nid);
|
||||
bool removed = RemoveNPCFromTable(nid, $"NPCLeave - bRelease={bRelease}");
|
||||
|
||||
// Forbid reloading npc's resources
|
||||
//QueueNPCUndoLoad(nid, pNPC->GetBornStamp());
|
||||
|
||||
// Release NPC resource
|
||||
if (bRelease)
|
||||
{
|
||||
ReleaseNPC(pNPC);
|
||||
}
|
||||
else
|
||||
{
|
||||
CECHostPlayer pHost = hostplayer;
|
||||
@@ -213,13 +419,21 @@ public class CECNPCMan : IMsgHandler
|
||||
{
|
||||
if (pNPC)
|
||||
{
|
||||
int nid = pNPC.GetNPCID();
|
||||
|
||||
// Remove tab-selected array
|
||||
CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer();
|
||||
if (pHost)
|
||||
pHost.RemoveObjectFromTabSels(pNPC);
|
||||
|
||||
pNPC.Release();
|
||||
|
||||
pNPC.DestroySelf();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
BMLogger.LogError($"[NPC_REMOVAL_TRACE] ReleaseNPC: pNPC is NULL, cannot release");
|
||||
}
|
||||
}
|
||||
private bool TransmitMessage(ECMSG Msg)
|
||||
@@ -321,16 +535,19 @@ public class CECNPCMan : IMsgHandler
|
||||
// if (!bDelay)
|
||||
// NPCDisappear(nid);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pNPC == null)
|
||||
BMLogger.LogError($"[NPC_REMOVAL_TRACE] OnMsgNPCDied: NPC {nid} NOT FOUND in table");
|
||||
else if (pNPC.IsAboutToDie())
|
||||
BMLogger.LogError($"[NPC_REMOVAL_TRACE] OnMsgNPCDied: NPC {nid} already about to die, skipping");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool OnMsgNPCStopMove(ECMSG msg)
|
||||
{
|
||||
cmd_object_stop_move pCmd = EC_Utility.ByteArrayToStructure<cmd_object_stop_move>((byte[])msg.dwParam1);
|
||||
if (-2041571143 == pCmd.id)
|
||||
{
|
||||
BMLogger.Log("HoangDev: OnMsgNPCStopMove NPCID: " + pCmd.id);
|
||||
}
|
||||
CECNPC pNPC = SeekOutNPC(pCmd.id);
|
||||
if (pNPC)
|
||||
pNPC.StopMoveTo(pCmd);
|
||||
@@ -374,13 +591,16 @@ public class CECNPCMan : IMsgHandler
|
||||
}
|
||||
private bool OnMsgNPCInfo(ECMSG msg)
|
||||
{
|
||||
switch (Convert.ToInt32(msg.dwParam2))
|
||||
int commandId = Convert.ToInt32(msg.dwParam2);
|
||||
|
||||
switch (commandId)
|
||||
{
|
||||
case CommandID.NPC_INFO_LIST:
|
||||
{
|
||||
// msg.dwParam1 chính là buffer chứa placeholder data (không có header cmd_npc_info_list)
|
||||
cmd_npc_info_list pCmd = MemoryMarshal.Read<cmd_npc_info_list>(((byte[])msg.dwParam1).AsSpan());
|
||||
|
||||
|
||||
int offset = Marshal.OffsetOf<cmd_npc_info_list>("placeholder").ToInt32();
|
||||
byte[] buffer = (byte[])msg.dwParam1;
|
||||
Span<byte> pDataBuf = buffer.AsSpan(offset);
|
||||
@@ -390,6 +610,7 @@ public class CECNPCMan : IMsgHandler
|
||||
// giống const info_npc& Info = *(const info_npc*)pDataBuf;
|
||||
info_npc info = MemoryMarshal.Read<info_npc>(pDataBuf);
|
||||
|
||||
|
||||
int iSize = info_npc.HEADER_SIZE;
|
||||
if ((info.state & PlayerNPCState.GP_STATE_EXTEND_PROPERTY) != 0)
|
||||
iSize += sizeof(uint) * NumberDWORDsPlayerNPC.OBJECT_EXT_STATE_COUNT;
|
||||
@@ -469,7 +690,7 @@ public class CECNPCMan : IMsgHandler
|
||||
var npc = GetNPC(Info.nid);
|
||||
if (npc != null)
|
||||
{
|
||||
m_NPCTab.Remove(Info.nid);
|
||||
RemoveNPCFromTable(Info.nid, "NPCEnter - replacing existing NPC");
|
||||
GameObject.Destroy(npc.gameObject);
|
||||
}
|
||||
|
||||
@@ -492,7 +713,7 @@ public class CECNPCMan : IMsgHandler
|
||||
}
|
||||
|
||||
// Thêm NPC vào bảng
|
||||
m_NPCTab[Info.nid] = npc;
|
||||
AddNPCToTable(Info.nid, npc, $"NPCEnter - nid={Info.nid}, tid={Info.tid}, bBornInSight={bBornInSight}");
|
||||
return true;
|
||||
}
|
||||
// Get NPC by id and optional bornStamp
|
||||
@@ -501,6 +722,30 @@ public class CECNPCMan : IMsgHandler
|
||||
if (!m_NPCTab.TryGetValue(nid, out var npc))
|
||||
return null;
|
||||
|
||||
// Validate that the NPC object is not destroyed (Unity destroyed objects pass != null but throw on access)
|
||||
if (npc == null)
|
||||
{
|
||||
// Clean up destroyed object from dictionary
|
||||
RemoveNPCFromTable(nid, "GetNPC - null value detected");
|
||||
return null;
|
||||
}
|
||||
try
|
||||
{
|
||||
if (npc.gameObject == null)
|
||||
{
|
||||
// Clean up destroyed object from dictionary
|
||||
RemoveNPCFromTable(nid, "GetNPC - destroyed GameObject detected");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
BMLogger.LogError($"[DICT_TRACE] GetNPC: Exception accessing npc.gameObject for nid={nid}: {ex.Message}, removing from dictionary");
|
||||
// Clean up destroyed object from dictionary
|
||||
RemoveNPCFromTable(nid, $"GetNPC - exception accessing GameObject: {ex.Message}");
|
||||
return null;
|
||||
}
|
||||
|
||||
return npc;
|
||||
}
|
||||
|
||||
@@ -524,17 +769,34 @@ public class CECNPCMan : IMsgHandler
|
||||
}
|
||||
public CECNPC GetNPCFromAll(int nid)
|
||||
{
|
||||
// Get stack trace to see who's calling this method
|
||||
CECNPC pNPC = GetNPC(nid);
|
||||
if (pNPC)
|
||||
return pNPC;
|
||||
|
||||
// Search from disappear array ?
|
||||
/*for (int i = 0; i < m_aDisappearNPCs.GetSize(); i++)
|
||||
// Check for null/destroyed object BEFORE accessing properties (Unity destroyed objects pass != null but throw on access)
|
||||
if (pNPC != null && pNPC.gameObject != null)
|
||||
{
|
||||
CECNPC* pNPC = m_aDisappearNPCs[i];
|
||||
if (pNPC->GetNPCID() == nid)
|
||||
return pNPC;
|
||||
}*/
|
||||
return pNPC;
|
||||
}
|
||||
|
||||
for (int i = 0; i < m_aDisappearNPCs.Count; i++)
|
||||
{
|
||||
CECNPC pDisappearNPC = m_aDisappearNPCs[i];
|
||||
// Use Unity's == null check which properly handles destroyed objects
|
||||
if (pDisappearNPC == null) continue;
|
||||
if (pDisappearNPC.gameObject == null) continue;
|
||||
|
||||
try
|
||||
{
|
||||
if (pDisappearNPC.GetNPCID() == nid)
|
||||
{
|
||||
return pDisappearNPC;
|
||||
}
|
||||
}
|
||||
catch (System.Exception)
|
||||
{
|
||||
// Object was destroyed between null check and access - skip it
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,9 @@ namespace BrewMonster
|
||||
protected EC_ManPlayer m_pPlayerMan; // 玩家管理器 / Player manager
|
||||
protected CECNPCMan m_pNPCMan; // NPC管理器 / NPC manager
|
||||
|
||||
private GameObject m_flyGfxInstance; // 飞行特效实例 / Fly GFX instance
|
||||
private GameObject m_hitGfxInstance; // 命中特效实例 / Hit GFX instance
|
||||
|
||||
public CECSkillGfxEvent(GfxMoveMode mode) : base(mode)
|
||||
{
|
||||
m_pPlayerMan = EC_ManMessageMono.Instance?.GetECManPlayer;
|
||||
@@ -34,7 +37,7 @@ namespace BrewMonster
|
||||
/// Get the original host ID (considering reverse mode)
|
||||
/// 获取原始施法者ID(考虑反向模式)
|
||||
/// </summary>
|
||||
/* public long GetOriginalHost()
|
||||
public long GetOriginalHost()
|
||||
{
|
||||
// GFX 特效显示,技能的原始的攻击者和目标被位置,提供了方法,查询原始攻击者
|
||||
// GFX effects display, original attacker and target positions swapped, provides method to query original attacker
|
||||
@@ -50,7 +53,7 @@ namespace BrewMonster
|
||||
// GFX 特效显示,技能的原始的攻击者和目标被位置,提供了方法,查询原始目标
|
||||
// GFX effects display, original attacker and target positions swapped, provides method to query original target
|
||||
return m_pMoveMethod.IsReverse() ? m_nHostID : m_nTargetID;
|
||||
}*/
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get target direction and up vector
|
||||
@@ -78,39 +81,63 @@ namespace BrewMonster
|
||||
{
|
||||
Vector3 vTargetCenter = Vector3.zero;
|
||||
|
||||
// if composer has been set
|
||||
// use the composer's parameter to make the hook information affect.
|
||||
// 如果已设置组合器,使用组合器的参数来影响挂点信息
|
||||
if (GetComposer() != null)
|
||||
try
|
||||
{
|
||||
A3DSkillGfxComposer pComposer = GetComposer();
|
||||
_get_pos_by_id(
|
||||
m_pPlayerMan,
|
||||
m_pNPCMan,
|
||||
(int)m_nTargetID,
|
||||
out vTargetCenter,
|
||||
pComposer.m_HitPos.HitPos,
|
||||
false,
|
||||
pComposer.m_HitPos.szHook,
|
||||
pComposer.m_HitPos.bRelHook,
|
||||
pComposer.m_HitPos.vOffset,
|
||||
pComposer.m_HitPos.szHanger,
|
||||
pComposer.m_HitPos.bChildHook);
|
||||
// if composer has been set
|
||||
// use the composer's parameter to make the hook information affect.
|
||||
// 如果已设置组合器,使用组合器的参数来影响挂点信息
|
||||
if (GetComposer() != null)
|
||||
{
|
||||
A3DSkillGfxComposer pComposer = GetComposer();
|
||||
bool success = get_pos_by_id(
|
||||
m_pPlayerMan,
|
||||
m_pNPCMan,
|
||||
(int)m_nTargetID,
|
||||
out vTargetCenter,
|
||||
pComposer.m_HitPos.HitPos,
|
||||
false,
|
||||
pComposer.m_HitPos.szHook,
|
||||
pComposer.m_HitPos.bRelHook,
|
||||
pComposer.m_HitPos.vOffset,
|
||||
pComposer.m_HitPos.szHanger,
|
||||
pComposer.m_HitPos.bChildHook);
|
||||
|
||||
if (!success)
|
||||
{
|
||||
// Return last known position or zero if target is destroyed
|
||||
// 如果目标已销毁,返回最后已知位置或零
|
||||
return m_vTargetPos != Vector3.zero ? m_vTargetPos : Vector3.zero;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bool success = get_pos_by_id(
|
||||
m_pPlayerMan,
|
||||
m_pNPCMan,
|
||||
(int)m_nTargetID,
|
||||
out vTargetCenter,
|
||||
GfxHitPos.enumHitCenter,
|
||||
false,
|
||||
null,
|
||||
false,
|
||||
Vector3.zero,
|
||||
null,
|
||||
false);
|
||||
|
||||
if (!success)
|
||||
{
|
||||
// Return last known position or zero if target is destroyed
|
||||
// 如果目标已销毁,返回最后已知位置或零
|
||||
return m_vTargetPos != Vector3.zero ? m_vTargetPos : Vector3.zero;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
_get_pos_by_id(
|
||||
m_pPlayerMan,
|
||||
m_pNPCMan,
|
||||
(int)m_nTargetID,
|
||||
out vTargetCenter,
|
||||
GfxHitPos.enumHitCenter,
|
||||
false,
|
||||
null,
|
||||
false,
|
||||
Vector3.zero,
|
||||
null,
|
||||
false);
|
||||
BMLogger.LogError($"[SKILL_GFX_DEBUG] GetTargetCenter: Exception accessing target {m_nTargetID} - {ex.Message}");
|
||||
// Return last known position or zero
|
||||
// 返回最后已知位置或零
|
||||
return m_vTargetPos != Vector3.zero ? m_vTargetPos : Vector3.zero;
|
||||
}
|
||||
|
||||
return vTargetCenter;
|
||||
@@ -122,7 +149,11 @@ namespace BrewMonster
|
||||
/// </summary>
|
||||
public override void Tick(uint dwDeltaTime)
|
||||
{
|
||||
/*if (GetComposer() != null)
|
||||
// Track state before base.Tick() to detect transitions / 在base.Tick()前记录状态以检测转换
|
||||
GfxSkillEventState prevState = m_enumState;
|
||||
|
||||
// Update host and target positions / 更新施法者和目标位置
|
||||
if (GetComposer() != null)
|
||||
{
|
||||
SGC_POS_INFO pHostPos, pTargetPos;
|
||||
|
||||
@@ -137,7 +168,7 @@ namespace BrewMonster
|
||||
pTargetPos = m_pComposer.m_FlyEndPos;
|
||||
}
|
||||
|
||||
m_bHostExist = _get_pos_by_id(
|
||||
m_bHostExist = get_pos_by_id(
|
||||
m_pPlayerMan,
|
||||
m_pNPCMan,
|
||||
(int)m_nHostID,
|
||||
@@ -150,7 +181,7 @@ namespace BrewMonster
|
||||
pHostPos.szHanger,
|
||||
pHostPos.bChildHook);
|
||||
|
||||
m_bTargetExist = _get_pos_by_id(
|
||||
m_bTargetExist = get_pos_by_id(
|
||||
m_pPlayerMan,
|
||||
m_pNPCMan,
|
||||
(int)m_nTargetID,
|
||||
@@ -167,7 +198,7 @@ namespace BrewMonster
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bHostExist = _get_pos_by_id(
|
||||
m_bHostExist = get_pos_by_id(
|
||||
m_pPlayerMan,
|
||||
m_pNPCMan,
|
||||
(int)m_nHostID,
|
||||
@@ -180,7 +211,7 @@ namespace BrewMonster
|
||||
null,
|
||||
false);
|
||||
|
||||
m_bTargetExist = _get_pos_by_id(
|
||||
m_bTargetExist = get_pos_by_id(
|
||||
m_pPlayerMan,
|
||||
m_pNPCMan,
|
||||
(int)m_nTargetID,
|
||||
@@ -192,51 +223,173 @@ namespace BrewMonster
|
||||
Vector3.zero,
|
||||
null,
|
||||
false);
|
||||
}*/
|
||||
}
|
||||
|
||||
// Log target existence issues with more detail
|
||||
// 记录目标存在问题的更多详细信息
|
||||
|
||||
base.Tick(dwDeltaTime);
|
||||
|
||||
|
||||
// Spawn fly GFX when entering Flying state / 进入飞行状态时生成飞行特效
|
||||
if (prevState == GfxSkillEventState.enumWait && m_enumState == GfxSkillEventState.enumFlying)
|
||||
{
|
||||
|
||||
#if UNITY_EDITOR
|
||||
Vector3 currentPos = m_pMoveMethod.GetPos();
|
||||
BMLogger.LogError($"[SKILL_GFX_DEBUG] Event.Tick: Registering gizmo - hostPos={m_vHostPos}, targetPos={m_vTargetPos}, currentPos={currentPos}, hostExist={m_bHostExist}, targetExist={m_bTargetExist}");
|
||||
|
||||
if (m_vHostPos.sqrMagnitude > 0.01f && m_vTargetPos.sqrMagnitude > 0.01f)
|
||||
{
|
||||
SkillGfxGizmoDrawer.RegisterProjectile(m_nHostID, m_nTargetID, m_vHostPos, m_vTargetPos, m_pMoveMethod.GetMode());
|
||||
}
|
||||
#endif
|
||||
|
||||
SpawnFlyGfx();
|
||||
}
|
||||
|
||||
// Update fly GFX transform during Flying / 飞行期间更新飞行特效变换
|
||||
if (m_enumState == GfxSkillEventState.enumFlying)
|
||||
{
|
||||
UpdateFlyGfxTransform();
|
||||
|
||||
// Update gizmo position / 更新辅助线位置
|
||||
#if UNITY_EDITOR
|
||||
Vector3 currentPos = m_pMoveMethod.GetPos();
|
||||
// Only update if position is valid
|
||||
// 仅在位置有效时更新
|
||||
if (currentPos.sqrMagnitude > 0.01f)
|
||||
{
|
||||
SkillGfxGizmoDrawer.UpdateProjectile(m_nHostID, m_nTargetID, currentPos, m_vTargetPos);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Remove gizmo when hit or finished / 命中或完成时移除辅助线
|
||||
if (m_enumState == GfxSkillEventState.enumHit || m_enumState == GfxSkillEventState.enumFinished)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
SkillGfxGizmoDrawer.RemoveProjectile(m_nHostID, m_nTargetID);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handle target hit event
|
||||
/// 处理命中目标事件
|
||||
/// Handle target hit event - destroy fly GFX and spawn hit GFX
|
||||
/// 处理命中目标事件 - 销毁飞行特效并生成命中特效
|
||||
/// </summary>
|
||||
protected override void HitTarget(Vector3 vTarget)
|
||||
{
|
||||
base.HitTarget(vTarget);
|
||||
DestroyFlyGfx();
|
||||
SpawnHitGfx(vTarget);
|
||||
|
||||
// now show some special hit gfx
|
||||
// 现在显示一些特殊的命中特效
|
||||
/* if (CECOptimize.Instance.GetGFX().CanShowHit(GetOriginalHost()))
|
||||
// TODO Phase 2: Special hit effects (rune, critical, nullity)
|
||||
// TODO 第二阶段:特殊命中效果(符石、暴击、无效)
|
||||
}
|
||||
|
||||
// ===== GFX Instance Management =====
|
||||
// GFX实例管理
|
||||
|
||||
/// <summary>
|
||||
/// Spawn fly GFX at movement position
|
||||
/// 在移动位置生成飞行特效
|
||||
/// </summary>
|
||||
private void SpawnFlyGfx()
|
||||
{
|
||||
|
||||
if (m_pComposer == null)
|
||||
{
|
||||
if ((m_dwModifier & CECAttackEvent.MOD_PHYSIC_ATTACK_RUNE) != 0)
|
||||
{
|
||||
// 程序联入\\符石\\物攻符石特效.gfx
|
||||
// Program integration\\Rune\\Physical attack rune effect.gfx
|
||||
// TODO: Play GFX - g_pGame->GetGFXCaster()->PlayAutoGFXEx(...)
|
||||
}
|
||||
BMLogger.LogError($"[SKILL_GFX_DEBUG] SpawnFlyGfx: m_pComposer is NULL - cannot spawn fly GFX!");
|
||||
return;
|
||||
}
|
||||
|
||||
GameObject prefab = m_pComposer.GetFlyGFX();
|
||||
if (prefab == null)
|
||||
{
|
||||
BMLogger.LogError($"[SKILL_GFX_DEBUG] SpawnFlyGfx: Fly GFX prefab is NULL - cannot spawn!");
|
||||
return;
|
||||
}
|
||||
|
||||
if ((m_dwModifier & CECAttackEvent.MOD_MAGIC_ATTACK_RUNE) != 0)
|
||||
{
|
||||
// 程序联入\\符石\\法攻符石特效.gfx
|
||||
// Program integration\\Rune\\Magic attack rune effect.gfx
|
||||
// TODO: Play GFX
|
||||
}
|
||||
Vector3 pos = m_pMoveMethod.GetPos();
|
||||
Vector3 dir = m_pMoveMethod.GetMoveDir();
|
||||
Quaternion rot = dir.sqrMagnitude > 1e-4f ? Quaternion.LookRotation(dir) : Quaternion.identity;
|
||||
|
||||
m_flyGfxInstance = GameObject.Instantiate(prefab, pos, rot);
|
||||
|
||||
}
|
||||
|
||||
if ((m_dwModifier & CECAttackEvent.MOD_PHYSIC_DEFENCE_RUNE) != 0)
|
||||
{
|
||||
// 程序联入\\符石\\物防符石特效.gfx
|
||||
// Program integration\\Rune\\Physical defense rune effect.gfx
|
||||
// TODO: Play GFX
|
||||
}
|
||||
/// <summary>
|
||||
/// Update fly GFX transform to follow movement
|
||||
/// 更新飞行特效变换以跟随移动
|
||||
/// </summary>
|
||||
private void UpdateFlyGfxTransform()
|
||||
{
|
||||
if (m_flyGfxInstance == null) return;
|
||||
m_flyGfxInstance.transform.position = m_pMoveMethod.GetPos();
|
||||
Vector3 dir = m_pMoveMethod.GetMoveDir();
|
||||
if (dir.sqrMagnitude > 1e-4f)
|
||||
m_flyGfxInstance.transform.rotation = Quaternion.LookRotation(dir);
|
||||
}
|
||||
|
||||
if ((m_dwModifier & CECAttackEvent.MOD_MAGIC_DEFENCE_RUNE) != 0)
|
||||
{
|
||||
// 程序联入\\符石\\法防符石特效.gfx
|
||||
// Program integration\\Rune\\Magic defense rune effect.gfx
|
||||
// TODO: Play GFX
|
||||
}
|
||||
}*/
|
||||
/// <summary>
|
||||
/// Destroy fly GFX instance
|
||||
/// 销毁飞行特效实例
|
||||
/// </summary>
|
||||
private void DestroyFlyGfx()
|
||||
{
|
||||
if (m_flyGfxInstance != null)
|
||||
{
|
||||
GameObject.Destroy(m_flyGfxInstance);
|
||||
m_flyGfxInstance = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Spawn hit GFX at target position
|
||||
/// 在目标位置生成命中特效
|
||||
/// </summary>
|
||||
private void SpawnHitGfx(Vector3 vTarget)
|
||||
{
|
||||
|
||||
if (m_pComposer == null)
|
||||
{
|
||||
BMLogger.LogError($"[SKILL_GFX_DEBUG] SpawnHitGfx: m_pComposer is NULL - cannot spawn hit GFX!");
|
||||
return;
|
||||
}
|
||||
|
||||
GameObject prefab = m_pComposer.GetHitGFX();
|
||||
if (prefab == null)
|
||||
{
|
||||
BMLogger.LogError($"[SKILL_GFX_DEBUG] SpawnHitGfx: Hit GFX prefab is NULL - cannot spawn!");
|
||||
return;
|
||||
}
|
||||
|
||||
Quaternion rot = Quaternion.identity;
|
||||
if (m_bHostExist)
|
||||
{
|
||||
Vector3 dir = vTarget - m_vHostPos;
|
||||
dir.y = 0;
|
||||
if (dir.sqrMagnitude > 1e-6f) rot = Quaternion.LookRotation(dir);
|
||||
}
|
||||
|
||||
m_hitGfxInstance = GameObject.Instantiate(prefab, vTarget, rot);
|
||||
|
||||
|
||||
GameObject.Destroy(m_hitGfxInstance, 3.0f); // auto-cleanup / 自动清理
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clean up GFX instances on Resume (return to pool)
|
||||
/// 在Resume时清理GFX实例(返回池)
|
||||
/// </summary>
|
||||
public new void Resume()
|
||||
{
|
||||
DestroyFlyGfx();
|
||||
// Hit GFX is auto-destroyed by Unity's Destroy timer, don't null it here
|
||||
// 命中特效由Unity的Destroy计时器自动销毁,不在此处置null
|
||||
m_hitGfxInstance = null;
|
||||
base.Resume();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -274,7 +427,7 @@ namespace BrewMonster
|
||||
/// Get position by ID (player or NPC)
|
||||
/// 根据ID获取位置(玩家或NPC)
|
||||
/// </summary>
|
||||
private static bool _get_pos_by_id(
|
||||
private static bool get_pos_by_id(
|
||||
EC_ManPlayer pPlayerMan,
|
||||
CECNPCMan pNPCMan,
|
||||
int nID,
|
||||
@@ -289,47 +442,97 @@ namespace BrewMonster
|
||||
{
|
||||
vPos = Vector3.zero;
|
||||
|
||||
|
||||
if (GPDataTypeHelper.ISPLAYERID(nID))
|
||||
{
|
||||
CECPlayer pPlayer = pPlayerMan?.GetPlayer(nID);
|
||||
|
||||
if (pPlayer != null)
|
||||
// Check if player exists AND GameObject is not destroyed (Unity's "fake null" handling)
|
||||
if (pPlayer != null && pPlayer.gameObject != null)
|
||||
{
|
||||
if (bIsGoblinSkill)
|
||||
{
|
||||
// TODO: Handle goblin skill position
|
||||
// if (pPlayer->GetGoblinModel())
|
||||
// vPos = pPlayer->GetGoblinModel()->GetModel()->GetModelAABB().Center;
|
||||
// else
|
||||
// return false;
|
||||
return false;
|
||||
if (bIsGoblinSkill)
|
||||
{
|
||||
// TODO: Handle goblin skill position
|
||||
// if (pPlayer->GetGoblinModel())
|
||||
// vPos = pPlayer->GetGoblinModel()->GetModel()->GetModelAABB().Center;
|
||||
// else
|
||||
// return false;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// currently hook does not affect the Goblin Skill
|
||||
// 目前挂点不影响小精灵技能
|
||||
while (true)
|
||||
{
|
||||
if (string.IsNullOrEmpty(szHook))
|
||||
break;
|
||||
|
||||
// TODO: Get player model and hook position
|
||||
/*CECModel pModel = pPlayer->GetPlayerModel();
|
||||
if (!pModel)
|
||||
break;
|
||||
|
||||
if (szHanger && bChildHook)
|
||||
pModel = pModel->GetChildModel(szHanger);
|
||||
|
||||
if (!pModel)
|
||||
break;
|
||||
|
||||
A3DSkinModel* pSkin = pModel->GetA3DSkinModel();
|
||||
A3DSkeletonHook* pHook = pSkin->GetSkeletonHook(szHook, true);
|
||||
|
||||
if (!pHook)
|
||||
break;
|
||||
|
||||
if (bRelHook)
|
||||
vPos = pHook->GetAbsoluteTM() * pOffset;
|
||||
else
|
||||
{
|
||||
vPos = pSkin->GetAbsoluteTM() * pOffset;
|
||||
vPos = vPos - pSkin->GetAbsoluteTM().GetRow(3) + pHook->GetAbsoluteTM().GetRow(3);
|
||||
}
|
||||
|
||||
return true;*/
|
||||
break;
|
||||
}
|
||||
|
||||
if (HitPos == GfxHitPos.enumHitBottom)
|
||||
{
|
||||
vPos = pPlayer.GetPosVector3();
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: Get player AABB
|
||||
// const A3DAABB& aabb = pPlayer->GetPlayerAABB();
|
||||
// vPos = aabb.Center;
|
||||
// vPos.y += aabb.Extents.y * .5f;
|
||||
vPos = pPlayer.GetPosVector3();
|
||||
vPos.y += 1.0f; // Default height offset / 默认高度偏移
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
}
|
||||
}
|
||||
else if (GPDataTypeHelper.ISNPCID(nID))
|
||||
{
|
||||
CECNPC pNPC = pNPCMan?.GetNPCFromAll(nID);
|
||||
|
||||
// Check if NPC exists AND GameObject is not destroyed (Unity's "fake null" handling)
|
||||
if (pNPC != null && pNPC.gameObject != null)
|
||||
{
|
||||
{
|
||||
// currently hook does not affect the Goblin Skill
|
||||
// 目前挂点不影响小精灵技能
|
||||
while (true)
|
||||
{
|
||||
if (string.IsNullOrEmpty(szHook))
|
||||
break;
|
||||
|
||||
// TODO: Get player model and hook position
|
||||
/*CECModel pModel = pPlayer->GetPlayerModel();
|
||||
if (!pModel)
|
||||
break;
|
||||
|
||||
if (szHanger && bChildHook)
|
||||
pModel = pModel->GetChildModel(szHanger);
|
||||
|
||||
if (!pModel)
|
||||
break;
|
||||
|
||||
A3DSkinModel* pSkin = pModel->GetA3DSkinModel();
|
||||
A3DSkeletonHook* pHook = pSkin->GetSkeletonHook(szHook, true);
|
||||
|
||||
// TODO: Get NPC hook position
|
||||
/*A3DSkeletonHook* pHook = pNPC->GetSgcHook(szHanger, bChildHook, szHook);
|
||||
if (!pHook)
|
||||
break;
|
||||
|
||||
A3DSkinModel *pSkin = pNPC->GetSgcSkinModel(szHanger, bChildHook, szHook);
|
||||
if (bRelHook)
|
||||
vPos = pHook->GetAbsoluteTM() * pOffset;
|
||||
else
|
||||
@@ -344,63 +547,20 @@ namespace BrewMonster
|
||||
|
||||
if (HitPos == GfxHitPos.enumHitBottom)
|
||||
{
|
||||
vPos = pPlayer.GetPosVector3();
|
||||
vPos = pNPC.GetPosVector3();
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: Get player AABB
|
||||
// const A3DAABB& aabb = pPlayer->GetPlayerAABB();
|
||||
// TODO: Get NPC AABB
|
||||
// const A3DAABB& aabb = pNPC->GetPickAABB();
|
||||
// vPos = aabb.Center;
|
||||
// vPos.y += aabb.Extents.y * .5f;
|
||||
vPos = pPlayer.GetPosVector3();
|
||||
vPos = pNPC.GetPosVector3();
|
||||
vPos.y += 1.0f; // Default height offset / 默认高度偏移
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (GPDataTypeHelper.ISNPCID(nID))
|
||||
{
|
||||
CECNPC pNPC = pNPCMan?.GetNPCFromAll(nID);
|
||||
|
||||
if (pNPC != null)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
// TODO: Get NPC hook position
|
||||
/*A3DSkeletonHook* pHook = pNPC->GetSgcHook(szHanger, bChildHook, szHook);
|
||||
if (!pHook)
|
||||
break;
|
||||
|
||||
A3DSkinModel *pSkin = pNPC->GetSgcSkinModel(szHanger, bChildHook, szHook);
|
||||
if (bRelHook)
|
||||
vPos = pHook->GetAbsoluteTM() * pOffset;
|
||||
else
|
||||
{
|
||||
vPos = pSkin->GetAbsoluteTM() * pOffset;
|
||||
vPos = vPos - pSkin->GetAbsoluteTM().GetRow(3) + pHook->GetAbsoluteTM().GetRow(3);
|
||||
}
|
||||
|
||||
return true;*/
|
||||
break;
|
||||
}
|
||||
|
||||
if (HitPos == GfxHitPos.enumHitBottom)
|
||||
{
|
||||
vPos = pNPC.GetPosVector3();
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: Get NPC AABB
|
||||
// const A3DAABB& aabb = pNPC->GetPickAABB();
|
||||
// vPos = aabb.Center;
|
||||
// vPos.y += aabb.Extents.y * .5f;
|
||||
vPos = pNPC.GetPosVector3();
|
||||
vPos.y += 1.0f; // Default height offset / 默认高度偏移
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -425,7 +585,8 @@ namespace BrewMonster
|
||||
{
|
||||
CECPlayer pPlayer = pPlayerMan?.GetPlayer(nId);
|
||||
|
||||
if (pPlayer != null)
|
||||
// Check if player exists AND GameObject is not destroyed (Unity's "fake null" handling)
|
||||
if (pPlayer != null && pPlayer.gameObject != null)
|
||||
{
|
||||
// TODO: Get player direction and up
|
||||
// vDir = pPlayer->GetDir();
|
||||
@@ -439,7 +600,8 @@ namespace BrewMonster
|
||||
{
|
||||
CECNPC pNPC = pNPCMan?.GetNPCFromAll(nId);
|
||||
|
||||
if (pNPC != null)
|
||||
// Check if NPC exists AND GameObject is not destroyed (Unity's "fake null" handling)
|
||||
if (pNPC != null && pNPC.gameObject != null)
|
||||
{
|
||||
// TODO: Get NPC direction and up
|
||||
// vDir = pNPC->GetDir();
|
||||
@@ -556,10 +718,9 @@ namespace BrewMonster
|
||||
private const int DEFAULT_EVENT_BUF_SIZE = 10; // 默认事件缓冲区大小 / Default event buffer size
|
||||
|
||||
public LinkedList<CECSkillGfxEvent> m_EventLst; // 活动事件列表 / Active event list
|
||||
protected LinkedList<CECSkillGfxEvent>[] m_FreeLst; // 空闲事件列表(按移动模式分类) / Free event lists (categorized by move mode)
|
||||
|
||||
protected EC_ManPlayer m_pPlayerMan; // 玩家管理器 / Player manager
|
||||
protected CECNPCMan m_pNPCMan; // NPC管理器 / NPC manager
|
||||
protected LinkedList<CECSkillGfxEvent>[] m_FreeLst;
|
||||
protected EC_ManPlayer m_pPlayerMan;
|
||||
protected CECNPCMan m_pNPCMan;
|
||||
|
||||
public SkillGfxMan(CECGameRun pGameRun)
|
||||
{
|
||||
@@ -586,10 +747,7 @@ namespace BrewMonster
|
||||
m_pNPCMan = EC_ManMessageMono.Instance?.CECNPCMan;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get empty event from pool or create new one
|
||||
/// 从池中获取空事件或创建新事件
|
||||
/// </summary>
|
||||
|
||||
public A3DSkillGfxEvent GetEmptyEvent(GfxMoveMode mode)
|
||||
{
|
||||
int modeIndex = (int)mode;
|
||||
@@ -672,7 +830,7 @@ namespace BrewMonster
|
||||
{
|
||||
m_EventLst.Remove(node);
|
||||
pEvent.Resume();
|
||||
//m_FreeLst[(int)pEvent.GetMode()].AddLast(pEvent);
|
||||
m_FreeLst[(int)pEvent.GetMode()].AddLast(pEvent);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -757,6 +915,11 @@ namespace BrewMonster
|
||||
/// Add skill GFX event
|
||||
/// 添加技能特效事件
|
||||
/// </summary>
|
||||
/// <summary>
|
||||
/// Convenience overload for weapon/melee attacks (no composer).
|
||||
/// Scale is not needed — Unity Particle Systems handle their own scale.
|
||||
/// 武器/近战攻击的便捷重载(无组合器)。不需要缩放 — Unity粒子系统自己处理缩放。
|
||||
/// </summary>
|
||||
public bool AddSkillGfxEvent(
|
||||
int nHostID,
|
||||
int nTargetID,
|
||||
@@ -768,8 +931,6 @@ namespace BrewMonster
|
||||
int nFlyGfxCount = 1,
|
||||
uint dwInterval = 0,
|
||||
GFX_SKILL_PARAM? param = null,
|
||||
float fFlyGfxScale = 1.0f,
|
||||
float fHitGfxScale = 1.0f,
|
||||
uint dwModifier = 0)
|
||||
{
|
||||
return m_GfxMan.AddSkillGfxEvent(
|
||||
@@ -784,8 +945,6 @@ namespace BrewMonster
|
||||
nFlyGfxCount,
|
||||
dwInterval,
|
||||
param ?? default,
|
||||
fFlyGfxScale,
|
||||
fHitGfxScale,
|
||||
dwModifier,
|
||||
false, // bOnlyOneHit
|
||||
false, // bFadeOut
|
||||
|
||||
@@ -181,7 +181,7 @@ namespace BrewMonster.Scripts
|
||||
/// <summary>
|
||||
/// Get use time counter / 获取使用时间计数器
|
||||
/// </summary>
|
||||
public CECCounter GetUseTimeCnt()
|
||||
public CECCounter GetTimeCounter()
|
||||
{
|
||||
return m_UseTimeCnt;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,8 @@ namespace BrewMonster
|
||||
}
|
||||
if (Input.GetKeyDown(KeyCode.P))
|
||||
{
|
||||
OnCommandSummon(2);
|
||||
//OnCommandSummon(2);
|
||||
EC_Game.GetGameRun().GetUIManager().GetInGameUIMan().PopupPetListDialog();
|
||||
}
|
||||
if (Input.GetKeyDown(KeyCode.H))
|
||||
{
|
||||
|
||||
@@ -3,6 +3,7 @@ using BrewMonster.Common;
|
||||
using BrewMonster.Network;
|
||||
using BrewMonster.Scripts;
|
||||
using BrewMonster.Scripts.UI;
|
||||
using BrewMonster.UI;
|
||||
using CSNetwork.GPDataType;
|
||||
using ModelRenderer.Scripts.GameData;
|
||||
using PerfectWorld.Scripts.Managers;
|
||||
@@ -16,7 +17,7 @@ using UnityEngine.UI;
|
||||
|
||||
namespace BrewMonster.Scripts.Managers
|
||||
{
|
||||
public class EC_InventoryUI : MonoBehaviour
|
||||
public class EC_InventoryUI : AUIDialog
|
||||
{
|
||||
[Header("Pack Buttons (assign in Inspector)")]
|
||||
[SerializeField] private List<Button> inventoryPackButtons = new List<Button>(); // byPackage: 0
|
||||
|
||||
@@ -435,6 +435,8 @@ namespace PerfectWorld.Scripts.Managers
|
||||
return ByteToStringUtils.ByteArrayToCP936String(m_pDBEssence.file_matter);
|
||||
}
|
||||
|
||||
// Get essence data
|
||||
public IVTR_ESSENCE_PETEGG GetEssence() { return m_Essence; }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -109,6 +109,9 @@ namespace PerfectWorld.Scripts.Managers
|
||||
}
|
||||
TransmitMessage(Msg);
|
||||
break;
|
||||
case EC_MsgDef.MSG_PM_PLAYEREXIT:
|
||||
OnMsgPlayerExit(Msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -819,6 +822,13 @@ namespace PerfectWorld.Scripts.Managers
|
||||
}
|
||||
}
|
||||
}
|
||||
// Handler of MSG_PM_PLAYEREXIT
|
||||
public bool OnMsgPlayerExit(ECMSG Msg)
|
||||
{
|
||||
cmd_player_leave_world pCmd = GPDataTypeHelper.FromBytes<cmd_player_leave_world>((byte[])Msg.dwParam1);
|
||||
ElsePlayerLeave(pCmd.id, true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public struct EC_PLAYERLOADRESULT
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BrewMonster
|
||||
{
|
||||
/// <summary>
|
||||
/// Helper class to track and draw gizmos for skill GFX projectiles.
|
||||
/// Draws projectile path from host to target, auto-removes after 10 seconds.
|
||||
/// 用于跟踪和绘制技能GFX弹道辅助线的辅助类。绘制从施法者到目标的弹道路径,10秒后自动移除。
|
||||
/// </summary>
|
||||
public static class SkillGfxGizmoDrawer
|
||||
{
|
||||
/// <summary>
|
||||
/// Gizmo data for a single projectile
|
||||
/// 单个弹道的辅助线数据
|
||||
/// </summary>
|
||||
private class GizmoData
|
||||
{
|
||||
public Vector3 startPos; // Host position / 施法者位置
|
||||
public Vector3 currentPos; // Current projectile position / 当前弹道位置
|
||||
public Vector3 targetPos; // Target position / 目标位置
|
||||
public float createTime; // Time when created / 创建时间
|
||||
public long hostID; // Host ID for identification / 施法者ID
|
||||
public long targetID; // Target ID for identification / 目标ID
|
||||
public GfxMoveMode moveMode; // Movement mode / 移动模式
|
||||
}
|
||||
|
||||
private static readonly List<GizmoData> m_GizmoList = new List<GizmoData>();
|
||||
private const float GIZMO_LIFETIME = 10.0f; // 10 seconds / 10秒
|
||||
|
||||
/// <summary>
|
||||
/// Register a projectile for gizmo drawing
|
||||
/// 注册一个弹道用于辅助线绘制
|
||||
/// </summary>
|
||||
public static void RegisterProjectile(long hostID, long targetID, Vector3 startPos, Vector3 targetPos, GfxMoveMode moveMode)
|
||||
{
|
||||
|
||||
var gizmo = new GizmoData
|
||||
{
|
||||
startPos = startPos,
|
||||
currentPos = startPos,
|
||||
targetPos = targetPos,
|
||||
createTime = Time.time,
|
||||
hostID = hostID,
|
||||
targetID = targetID,
|
||||
moveMode = moveMode
|
||||
};
|
||||
m_GizmoList.Add(gizmo);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update projectile position
|
||||
/// 更新弹道位置
|
||||
/// </summary>
|
||||
public static void UpdateProjectile(long hostID, long targetID, Vector3 currentPos, Vector3 targetPos)
|
||||
{
|
||||
for (int i = m_GizmoList.Count - 1; i >= 0; i--)
|
||||
{
|
||||
var gizmo = m_GizmoList[i];
|
||||
if (gizmo.hostID == hostID && gizmo.targetID == targetID)
|
||||
{
|
||||
gizmo.currentPos = currentPos;
|
||||
gizmo.targetPos = targetPos; // Update target in case it moves
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Remove projectile gizmo
|
||||
/// 移除弹道辅助线
|
||||
/// </summary>
|
||||
public static void RemoveProjectile(long hostID, long targetID)
|
||||
{
|
||||
for (int i = m_GizmoList.Count - 1; i >= 0; i--)
|
||||
{
|
||||
var gizmo = m_GizmoList[i];
|
||||
if (gizmo.hostID == hostID && gizmo.targetID == targetID)
|
||||
{
|
||||
m_GizmoList.RemoveAt(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw all gizmos (called from OnDrawGizmos)
|
||||
/// 绘制所有辅助线(从OnDrawGizmos调用)
|
||||
/// </summary>
|
||||
public static void DrawGizmos()
|
||||
{
|
||||
if (m_GizmoList.Count == 0)
|
||||
return; // No gizmos to draw / 没有辅助线要绘制
|
||||
|
||||
float currentTime = Time.time;
|
||||
|
||||
// Remove expired gizmos and draw active ones
|
||||
// 移除过期的辅助线并绘制活动的
|
||||
for (int i = m_GizmoList.Count - 1; i >= 0; i--)
|
||||
{
|
||||
var gizmo = m_GizmoList[i];
|
||||
float age = currentTime - gizmo.createTime;
|
||||
|
||||
// Remove if expired
|
||||
// 如果过期则移除
|
||||
if (age > GIZMO_LIFETIME)
|
||||
{
|
||||
m_GizmoList.RemoveAt(i);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Calculate fade alpha (fade out in last 2 seconds)
|
||||
// 计算淡出透明度(最后2秒淡出)
|
||||
float alpha = age > (GIZMO_LIFETIME - 2.0f)
|
||||
? 1.0f - ((age - (GIZMO_LIFETIME - 2.0f)) / 2.0f)
|
||||
: 1.0f;
|
||||
|
||||
// Draw projectile path
|
||||
// 绘制弹道路径
|
||||
Gizmos.color = GetColorForMoveMode(gizmo.moveMode, alpha);
|
||||
|
||||
// Draw line from start to current position (trail)
|
||||
// 绘制从起点到当前位置的线(轨迹)
|
||||
if (Vector3.Distance(gizmo.startPos, gizmo.currentPos) > 0.01f)
|
||||
{
|
||||
Gizmos.DrawLine(gizmo.startPos, gizmo.currentPos);
|
||||
}
|
||||
|
||||
// Draw line from current position to target (remaining path)
|
||||
// 绘制从当前位置到目标的线(剩余路径)
|
||||
Gizmos.color = GetColorForMoveMode(gizmo.moveMode, alpha * 0.5f); // Lighter for remaining path
|
||||
if (Vector3.Distance(gizmo.currentPos, gizmo.targetPos) > 0.01f)
|
||||
{
|
||||
Gizmos.DrawLine(gizmo.currentPos, gizmo.targetPos);
|
||||
}
|
||||
|
||||
// Draw sphere at current position (larger for visibility)
|
||||
// 在当前位置绘制球体(更大以便可见)
|
||||
Gizmos.color = GetColorForMoveMode(gizmo.moveMode, alpha);
|
||||
Gizmos.DrawSphere(gizmo.currentPos, 0.5f); // Increased from 0.2f to 0.5f
|
||||
|
||||
// Draw wire sphere at target (larger for visibility)
|
||||
// 在目标位置绘制线框球体(更大以便可见)
|
||||
Gizmos.color = GetColorForMoveMode(gizmo.moveMode, alpha * 0.5f);
|
||||
Gizmos.DrawWireSphere(gizmo.targetPos, 0.5f); // Increased from 0.3f to 0.5f
|
||||
|
||||
// Draw wire sphere at start position
|
||||
// 在起始位置绘制线框球体
|
||||
Gizmos.color = GetColorForMoveMode(gizmo.moveMode, alpha * 0.3f);
|
||||
Gizmos.DrawWireSphere(gizmo.startPos, 0.3f);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get color for movement mode
|
||||
/// 根据移动模式获取颜色
|
||||
/// </summary>
|
||||
private static Color GetColorForMoveMode(GfxMoveMode mode, float alpha)
|
||||
{
|
||||
Color baseColor;
|
||||
switch (mode)
|
||||
{
|
||||
case GfxMoveMode.enumLinearMove:
|
||||
baseColor = Color.yellow; // Yellow for linear
|
||||
break;
|
||||
case GfxMoveMode.enumOnTarget:
|
||||
baseColor = Color.red; // Red for instant hit
|
||||
break;
|
||||
case GfxMoveMode.enumParabolicMove:
|
||||
baseColor = Color.green; // Green for parabolic
|
||||
break;
|
||||
case GfxMoveMode.enumMissileMove:
|
||||
baseColor = Color.cyan; // Cyan for missile
|
||||
break;
|
||||
default:
|
||||
baseColor = Color.white;
|
||||
break;
|
||||
}
|
||||
baseColor.a = alpha;
|
||||
return baseColor;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clear all gizmos
|
||||
/// 清除所有辅助线
|
||||
/// </summary>
|
||||
public static void ClearAll()
|
||||
{
|
||||
m_GizmoList.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get current gizmo count (for debugging)
|
||||
/// 获取当前辅助线数量(用于调试)
|
||||
/// </summary>
|
||||
public static int GetGizmoCount()
|
||||
{
|
||||
return m_GizmoList.Count;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c17eed6528c112645895f705535a0196
|
||||
@@ -178,7 +178,9 @@ namespace AutoMove
|
||||
open.Push(m_ptStart, Heuristic(m_ptStart, m_ptGoal));
|
||||
|
||||
int expands = 0;
|
||||
int maxExpand = nMaxExpand > 0 ? nMaxExpand : 200000;
|
||||
//ToDo: need use another method to caculate the value of maxExpand
|
||||
//800000 is a magic number, need to be optimized
|
||||
int maxExpand = nMaxExpand > 0 ? nMaxExpand : 800000;
|
||||
|
||||
while (open.Count > 0 && expands < maxExpand)
|
||||
{
|
||||
|
||||
@@ -794,8 +794,9 @@ public class CECNPC : CECObject
|
||||
|
||||
// No delay die, enter disappear process immediately
|
||||
if (!bDelay)
|
||||
{
|
||||
Disappear();
|
||||
|
||||
}
|
||||
|
||||
StartWork((int)WorkType.WT_NORMAL, (int)WorkID.WORK_DEAD, m_dwStates);
|
||||
|
||||
@@ -803,7 +804,6 @@ public class CECNPC : CECObject
|
||||
}
|
||||
public void Disappear()
|
||||
{
|
||||
BMLogger.Log("CECNPC::Disappear");
|
||||
FadeOut();
|
||||
m_DisappearCnt.SetCounter(1);
|
||||
PlayModelAction((int)NPCActionIndex.ACT_NPC_DISAPPEAR);
|
||||
|
||||
@@ -1618,6 +1618,13 @@ namespace CSNetwork.S2CCommand
|
||||
{
|
||||
public int[] cmdParams;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct CONTENTNPCSevHatchPet
|
||||
{
|
||||
public int iIvtrIdx;
|
||||
public int idEgg;
|
||||
};
|
||||
}
|
||||
|
||||
// Player and NPC state
|
||||
@@ -1066,5 +1066,20 @@ namespace CSNetwork.C2SCommand
|
||||
}
|
||||
return SerializeCommand(icmd, cmd, false);
|
||||
}
|
||||
|
||||
public static Octets CreateNPCSevHatchPetCmd(int i_IvtrIdx, int i_idEgg)
|
||||
{
|
||||
var cmd = new cmd_sevnpc_serve
|
||||
{
|
||||
service_type = NPC_service_type.GP_NPCSEV_HATCHPET,
|
||||
len = (uint)Marshal.SizeOf<CONTENTNPCSevHatchPet>()
|
||||
};
|
||||
CONTENTNPCSevHatchPet content = new CONTENTNPCSevHatchPet()
|
||||
{
|
||||
iIvtrIdx = i_IvtrIdx,
|
||||
idEgg = i_idEgg,
|
||||
};
|
||||
return SerializeCommand(CommandID.SEVNPC_SERVE, cmd, content);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ namespace CSNetwork
|
||||
{
|
||||
if (_instance == null)
|
||||
{
|
||||
BMLogger.LogError("EC_ManMessage instance is null, creating a new one. This should only happen once, if it happens more than once, there might be an issue with the lifecycle of EC_ManMessage");
|
||||
_instance = new EC_ManMessage();
|
||||
}
|
||||
return _instance;
|
||||
@@ -28,7 +29,8 @@ namespace CSNetwork
|
||||
|
||||
private static ECMSG _currentMsg;
|
||||
|
||||
private EC_ManMessage() { }
|
||||
private EC_ManMessage() {
|
||||
}
|
||||
|
||||
/// <summary>Post a message to the message queue</summary>
|
||||
public static void PostMessage(long dwMsg, int iManager, int iSubID, object p1 = null, object p2 = null, object p3 = null, object p4 = null, MsgDataBase[] pData = null)
|
||||
@@ -56,6 +58,11 @@ namespace CSNetwork
|
||||
/// <summary>Register a message handler, it should be called before the game starts</summary>
|
||||
public static void RegisterHandler(IMsgHandler handler)
|
||||
{
|
||||
if(Instance.m_MsgHandlerList.ContainsKey(handler.HandlerId))
|
||||
{
|
||||
BMLogger.LogError("Handler ID: " + handler.HandlerId + " is already registered");
|
||||
return;
|
||||
}
|
||||
Instance.m_MsgHandlerList.Add(handler.HandlerId, handler);
|
||||
}
|
||||
|
||||
@@ -81,6 +88,7 @@ namespace CSNetwork
|
||||
|
||||
public static void Dispose()
|
||||
{
|
||||
BMLogger.LogError("EC_ManMessage is being disposed, this should only happen when the game is exiting");
|
||||
_instance = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2589,5 +2589,12 @@ namespace CSNetwork.GPDataType
|
||||
public ushort equip_idx;
|
||||
public uint cost;
|
||||
};
|
||||
|
||||
// player leaves the world
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct cmd_player_leave_world
|
||||
{
|
||||
public int id;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -749,6 +749,7 @@ namespace CSNetwork
|
||||
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CORRECTPOS, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
|
||||
pCmdHeader, iHostID);
|
||||
break;
|
||||
case CommandID.EMPTY_ITEM_SLOT:
|
||||
case CommandID.OWN_ITEM_INFO:
|
||||
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_OWNITEMINFO, (int)MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
|
||||
pCmdHeader, iHostID);
|
||||
@@ -1140,6 +1141,15 @@ namespace CSNetwork
|
||||
case CommandID.CLEAR_TESSERA:
|
||||
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_CLEARTESSERA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
|
||||
break;
|
||||
case CommandID.PLAYER_LEAVE_WORLD:
|
||||
{
|
||||
cmd_player_leave_world pCmd = GPDataTypeHelper.FromBytes<cmd_player_leave_world>(pDataBuf);
|
||||
if (ISPLAYERID(pCmd.id))
|
||||
{
|
||||
EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYEREXIT, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
#if UNITY_EDITOR
|
||||
if (isDebug)
|
||||
@@ -1972,11 +1982,23 @@ namespace CSNetwork
|
||||
SendProtocol(gamedatasend);
|
||||
}
|
||||
|
||||
public void c2s_SendCmdPetRecall()
|
||||
{
|
||||
gamedatasend gamedatasend = new gamedatasend();
|
||||
gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(CSNetwork.C2SCommand.CommandID.RECALL_PET);
|
||||
SendProtocol(gamedatasend);
|
||||
}
|
||||
public void c2s_CmdDebug(ushort icmd, int param1 = int.MinValue)
|
||||
{
|
||||
gamedatasend gamedatasend = new gamedatasend();
|
||||
gamedatasend.Data = C2SCommandFactory.CreateDebugCmd(icmd, param1);
|
||||
SendProtocol(gamedatasend);
|
||||
}
|
||||
public void c2s_SendCmdNPCSevHatchPet(int iIvtrIdx, int idEgg)
|
||||
{
|
||||
gamedatasend gamedatasend = new gamedatasend();
|
||||
gamedatasend.Data = C2SCommandFactory.CreateNPCSevHatchPetCmd(iIvtrIdx, idEgg);
|
||||
SendProtocol(gamedatasend);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,89 +1,94 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using CSNetwork;
|
||||
using CSNetwork.GPDataType;
|
||||
using PerfectWorld.Scripts.Managers.BrewMonster.Managers;
|
||||
using PerfectWorld.Scripts.Managers;
|
||||
|
||||
namespace BrewMonster.Managers
|
||||
{
|
||||
[Serializable]
|
||||
public class EC_ManMessageMono : MonoBehaviour
|
||||
{
|
||||
private static EC_ManMessageMono instance;
|
||||
|
||||
public static EC_ManMessageMono Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (instance == null)
|
||||
{
|
||||
instance = FindAnyObjectByType<EC_ManMessageMono>();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
|
||||
public EC_ManPlayer EC_ManPlayer;
|
||||
public EC_ManMatter EC_ManMatter;
|
||||
public EC_ManPlayer GetECManPlayer { get => EC_ManPlayer;}
|
||||
public EC_ManMatter GetECManMatter { get => EC_ManMatter;}
|
||||
public CECNPCMan CECNPCMan { get; private set; }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
instance = this;
|
||||
//TODO: Remove later
|
||||
EC_ManPlayer = new EC_ManPlayer();
|
||||
CECNPCMan = new CECNPCMan();
|
||||
EC_ManMessage.RegisterHandler(EC_ManPlayer);
|
||||
EC_ManMessage.RegisterHandler(CECNPCMan);
|
||||
EC_ManMatter = new EC_ManMatter();
|
||||
EC_ManMessage.RegisterHandler(EC_ManMatter);
|
||||
Debug.Log($"EC_ManMessage RegisterHandlerRegisterHandlerRegisterHandler");
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
EC_ManMessage.Dispose();
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
EC_ManMessage.Tick();
|
||||
CECNPCMan.Tick();
|
||||
}
|
||||
|
||||
// Get object by specified ID
|
||||
// iAliveFlag: 0, both alive and dead; 1, must be alive; 2, must be dead
|
||||
public CECObject GetObject(long idObject, int iAliveFlag)
|
||||
{
|
||||
CECObject pObject = null;
|
||||
|
||||
if (GPDataTypeHelper.ISNPCID((int)idObject))
|
||||
{
|
||||
if (!(pObject = CECNPCMan.GetNPC((int)idObject)))
|
||||
return null;
|
||||
|
||||
if ((iAliveFlag == 1 && (pObject as CECNPC).IsDead()) ||
|
||||
(iAliveFlag == 2 && !(pObject as CECNPC).IsDead()))
|
||||
return null;
|
||||
}
|
||||
else if (GPDataTypeHelper.ISPLAYERID((int)idObject))
|
||||
{
|
||||
if (!(pObject = EC_ManPlayer.GetPlayer((int)idObject)))
|
||||
return null;
|
||||
|
||||
if ((iAliveFlag == 1 && (pObject as CECPlayer).IsDead()) ||
|
||||
(iAliveFlag == 2 && !(pObject as CECPlayer).IsDead()))
|
||||
return null;
|
||||
}
|
||||
else if (GPDataTypeHelper.ISMATTERID((int)idObject))
|
||||
{
|
||||
pObject = EC_ManMatter.GetMatter((int)idObject);
|
||||
}
|
||||
|
||||
return pObject;
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using CSNetwork;
|
||||
using CSNetwork.GPDataType;
|
||||
using PerfectWorld.Scripts.Managers.BrewMonster.Managers;
|
||||
using PerfectWorld.Scripts.Managers;
|
||||
|
||||
namespace BrewMonster.Managers
|
||||
{
|
||||
[Serializable]
|
||||
public class EC_ManMessageMono : MonoBehaviour
|
||||
{
|
||||
private static EC_ManMessageMono instance;
|
||||
|
||||
public static EC_ManMessageMono Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
if (instance == null)
|
||||
{
|
||||
instance = FindAnyObjectByType<EC_ManMessageMono>();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
|
||||
public EC_ManPlayer EC_ManPlayer;
|
||||
public EC_ManMatter EC_ManMatter;
|
||||
public EC_ManPlayer GetECManPlayer { get => EC_ManPlayer;}
|
||||
public EC_ManMatter GetECManMatter { get => EC_ManMatter;}
|
||||
public CECNPCMan CECNPCMan { get; private set; }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
instance = this;
|
||||
//TODO: Remove later
|
||||
EC_ManPlayer = new EC_ManPlayer();
|
||||
CECNPCMan = new CECNPCMan();
|
||||
// Clean up any destroyed objects that might persist from previous play session
|
||||
CECNPCMan.CleanupDestroyedObjects();
|
||||
EC_ManMessage.RegisterHandler(EC_ManPlayer);
|
||||
EC_ManMessage.RegisterHandler(CECNPCMan);
|
||||
EC_ManMatter = new EC_ManMatter();
|
||||
EC_ManMessage.RegisterHandler(EC_ManMatter);
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
Dispose();
|
||||
EC_ManMessage.Dispose();
|
||||
}
|
||||
private void Dispose()
|
||||
{
|
||||
instance = null;
|
||||
}
|
||||
private void Update()
|
||||
{
|
||||
EC_ManMessage.Tick();
|
||||
CECNPCMan.Tick();
|
||||
}
|
||||
|
||||
// Get object by specified ID
|
||||
// iAliveFlag: 0, both alive and dead; 1, must be alive; 2, must be dead
|
||||
public CECObject GetObject(long idObject, int iAliveFlag)
|
||||
{
|
||||
CECObject pObject = null;
|
||||
|
||||
if (GPDataTypeHelper.ISNPCID((int)idObject))
|
||||
{
|
||||
if (!(pObject = CECNPCMan.GetNPC((int)idObject)))
|
||||
return null;
|
||||
|
||||
if ((iAliveFlag == 1 && (pObject as CECNPC).IsDead()) ||
|
||||
(iAliveFlag == 2 && !(pObject as CECNPC).IsDead()))
|
||||
return null;
|
||||
}
|
||||
else if (GPDataTypeHelper.ISPLAYERID((int)idObject))
|
||||
{
|
||||
if (!(pObject = EC_ManPlayer.GetPlayer((int)idObject)))
|
||||
return null;
|
||||
|
||||
if ((iAliveFlag == 1 && (pObject as CECPlayer).IsDead()) ||
|
||||
(iAliveFlag == 2 && !(pObject as CECPlayer).IsDead()))
|
||||
return null;
|
||||
}
|
||||
else if (GPDataTypeHelper.ISMATTERID((int)idObject))
|
||||
{
|
||||
pObject = EC_ManMatter.GetMatter((int)idObject);
|
||||
}
|
||||
|
||||
return pObject;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -771,11 +771,18 @@ namespace BrewMonster.Network
|
||||
{
|
||||
Instance._gameSession.c2s_CmdNPCSevClearEmbeddedChip(iEquipIdx, tidEquip);
|
||||
}
|
||||
|
||||
public static void c2s_CmdPetRecall()
|
||||
{
|
||||
Instance._gameSession.c2s_SendCmdPetRecall();
|
||||
}
|
||||
public static void c2s_CmdDebug(ushort icmd, int param1 = int.MinValue)
|
||||
{
|
||||
Instance._gameSession.c2s_CmdDebug(icmd, param1);
|
||||
}
|
||||
public static void c2s_CmdNPCSevHatchPet(int iIvtrIdx, int idEgg)
|
||||
{
|
||||
Instance._gameSession.c2s_SendCmdNPCSevHatchPet(iIvtrIdx, idEgg);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -166,14 +166,18 @@ namespace PerfectWorld.Scripts
|
||||
// use same rotation as Prefab
|
||||
// matterObject.transform.localRotation = Quaternion.identity;
|
||||
matterObject.SetActive(true);
|
||||
|
||||
// Add a collider if it doesn't have one
|
||||
if (matterObject.GetComponent<Collider>() == null)
|
||||
{
|
||||
var collider = matterObject.AddComponent<BoxCollider>();
|
||||
collider.size = matterObject.GetComponentInChildren<Renderer>().bounds.size;
|
||||
//this is a workaround to fix the collider size issue when load prefab go wrong at some point
|
||||
//TODO: remove this workaround after the prefab load issue is fixed
|
||||
Vector3 size = matterObject.GetComponentInChildren<Renderer>().bounds.size;
|
||||
if (size.x == 0) size.x = 0.5f;
|
||||
if (size.y == 0) size.y = 0.5f;
|
||||
if (size.z == 0) size.z = 0.5f;
|
||||
collider.size = size;
|
||||
}
|
||||
|
||||
// Create text object to display item name above the cube
|
||||
// CreateItemNameText(matterObject, info.tid);
|
||||
|
||||
|
||||
@@ -924,8 +924,8 @@ namespace BrewMonster
|
||||
m_dwParam = src.m_dwParam;
|
||||
}
|
||||
public override CECShortcut Clone() => new CECSCCommand(this);
|
||||
public int GetCommandID() => 0;
|
||||
public int GetParam() => 0;
|
||||
public int GetCommandID() => m_iCommand;
|
||||
public int GetParam() => (int)m_dwParam;
|
||||
|
||||
// Set / Get command parameter
|
||||
public void SetParam(uint dwParam) { m_dwParam = dwParam; }
|
||||
|
||||
@@ -307,7 +307,7 @@ namespace BrewMonster.Scripts.Pet
|
||||
m_iPetSlotNum = iNewNum;
|
||||
}
|
||||
// Check whether corral has empty slots
|
||||
int GetEmptySlotNum()
|
||||
public int GetEmptySlotNum()
|
||||
{
|
||||
int iCount = 0;
|
||||
|
||||
|
||||
@@ -45,16 +45,16 @@ namespace BrewMonster
|
||||
EMsgActionSwitcher eMsg = (EMsgActionSwitcher)m_msgs[i];
|
||||
switch (eMsg)
|
||||
{
|
||||
/* case EMsgActionSwitcher.MSG_FLY:
|
||||
{
|
||||
OnFly();
|
||||
}
|
||||
break;
|
||||
case EMsgActionSwitcher.MSG_MOUNTPET:
|
||||
{
|
||||
OnRide();
|
||||
}
|
||||
break;*/
|
||||
case EMsgActionSwitcher.MSG_FLY:
|
||||
{
|
||||
OnFly();
|
||||
}
|
||||
break;
|
||||
case EMsgActionSwitcher.MSG_MOUNTPET:
|
||||
{
|
||||
OnRide();
|
||||
}
|
||||
break;
|
||||
case EMsgActionSwitcher.MSG_CASTSKILL:
|
||||
{
|
||||
OnCastSkill();
|
||||
@@ -64,6 +64,14 @@ namespace BrewMonster
|
||||
}
|
||||
m_msgs.Clear();
|
||||
}
|
||||
public void OnFly()
|
||||
{
|
||||
RemoveRideFlyRelatedContext();
|
||||
}
|
||||
public void OnRide()
|
||||
{
|
||||
RemoveRideFlyRelatedContext();
|
||||
}
|
||||
public void OnCastSkill()
|
||||
{
|
||||
RemoveRideFlyRelatedContext();
|
||||
|
||||
@@ -87,6 +87,426 @@ namespace BrewMonster
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void OnMsgHstPetOpt(ECMSG Msg)
|
||||
{
|
||||
CECGameRun pGameRun = EC_Game.GetGameRun();
|
||||
int header = Convert.ToInt32(Msg.dwParam2);
|
||||
switch (header)
|
||||
{
|
||||
case CommandID.GAIN_PET:
|
||||
{
|
||||
cmd_gain_pet pCmd = GPDataTypeHelper.FromBytes<cmd_gain_pet>((byte[])Msg.dwParam1);
|
||||
m_pPetCorral.AddPet(pCmd.slot_index, pCmd.data);
|
||||
|
||||
// Print a notify
|
||||
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.slot_index);
|
||||
if (pPet != null)
|
||||
{
|
||||
if (pPet.IsFollowPet() || pPet.IsCombatPet() || pPet.IsEvolutionPet())
|
||||
{
|
||||
// TO DO: fix later
|
||||
//pGameRun.AddFixedMessage(FIXMSG_PET_HATCH, pPet.GetName());
|
||||
}
|
||||
else if (pPet.IsSummonPet())
|
||||
{
|
||||
// TO DO: fix later
|
||||
//pGameRun.AddFixedMessage(FIXMSG_SUMMON_PET_APPEAR, pPet.GetName());
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case CommandID.FREE_PET:
|
||||
{
|
||||
cmd_free_pet pCmd = GPDataTypeHelper.FromBytes<cmd_free_pet>((byte[])Msg.dwParam1);
|
||||
|
||||
// Print a notify
|
||||
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.slot_index);
|
||||
if (pPet != null)
|
||||
{
|
||||
if (pPet.IsFollowPet() || pPet.IsCombatPet() || pPet.IsEvolutionPet())
|
||||
{
|
||||
// TO DO: fix later
|
||||
//pGameRun.AddFixedMessage(FIXMSG_PET_FREE, pPet.GetName());
|
||||
}
|
||||
else if (pPet.IsSummonPet())
|
||||
{
|
||||
// TO DO: fix later
|
||||
//pGameRun.AddFixedMessage(FIXMSG_SUMMON_PET_DISAPPEAR, pPet.GetName());
|
||||
}
|
||||
}
|
||||
|
||||
// Remove pet from corral
|
||||
m_pPetCorral.FreePet(pCmd.slot_index, pCmd.pet_id);
|
||||
// Update pet shortcuts
|
||||
UpdateFreedPetSC(pCmd.slot_index);
|
||||
|
||||
break;
|
||||
}
|
||||
case CommandID.SUMMON_PET:
|
||||
{
|
||||
cmd_summon_pet pCmd = GPDataTypeHelper.FromBytes<cmd_summon_pet>((byte[])Msg.dwParam1);
|
||||
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.slot_index);
|
||||
//ASSERT(pPet && pPet.GetTemplateID() == pCmd.pet_tid);
|
||||
m_pPetCorral.SetActivePetIndex(pCmd.slot_index);
|
||||
m_pPetCorral.SetActivePetNPCID(pCmd.pet_pid);
|
||||
m_pPetCorral.SetActivePetLifetime(pCmd.life_time);
|
||||
|
||||
if (EC_Game.GetConfigs().GetGameSettings().bPetAutoSkill)
|
||||
{
|
||||
for (int i = 0; i < pPet.GetSkillNum(SKILLTYPE.EM_SKILL_DEFAULT); i++)
|
||||
{
|
||||
PETSKILL? pSkill = pPet.GetSkill(SKILLTYPE.EM_SKILL_DEFAULT, i);
|
||||
if (pSkill != null && EC_Game.IsPetAutoSkill(pSkill.Value.idSkill))
|
||||
pPet.AddAutoSkill(pSkill.Value.idSkill);
|
||||
}
|
||||
}
|
||||
|
||||
// TO DO: fix later
|
||||
//OnPetSays(pCmd.pet_tid, pCmd.pet_pid, CECPetWords::TW_SUMMON);
|
||||
//if (pPet.IsCombatPet() || pPet.IsSummonPet() || pPet.IsEvolutionPet())
|
||||
// CDlgQuickBarPet::ResetAutoCastSkill();
|
||||
break;
|
||||
}
|
||||
case CommandID.RECALL_PET:
|
||||
{
|
||||
cmd_recall_pet pCmd = GPDataTypeHelper.FromBytes<cmd_recall_pet>((byte[])Msg.dwParam1);
|
||||
//ASSERT(pCmd.slot_index == m_pPetCorral.GetActivePetIndex());
|
||||
|
||||
int tid = pCmd.pet_id;
|
||||
int nid = m_pPetCorral.GetActivePetNPCID();
|
||||
|
||||
// ³èÎïÓл°Ëµ
|
||||
switch (pCmd.reason)
|
||||
{
|
||||
case (char)PET_RECALL_REASON.PET_RECALL_DEFAULT:
|
||||
//OnPetSays(tid, nid, CECPetWords::TW_RECALL);
|
||||
break;
|
||||
|
||||
case (char)PET_RECALL_REASON.PET_RECALL_DEATH:
|
||||
//OnPetSays(tid, nid, CECPetWords::TW_DEAD);
|
||||
break;
|
||||
|
||||
case (char)PET_RECALL_REASON.PET_RECALL_LIFE_EXHAUST:
|
||||
//OnPetSays(tid, nid, CECPetWords::TW_DISAPPEAR);
|
||||
break;
|
||||
|
||||
case (char)PET_RECALL_REASON.PET_RECALL_SACRIFICE:
|
||||
//OnPetSays(tid, nid, CECPetWords::TW_SACRIFICE);
|
||||
break;
|
||||
}
|
||||
|
||||
CECPetData pPet = m_pPetCorral.GetActivePet();
|
||||
if (pPet != null)
|
||||
pPet.OnPetDead();
|
||||
|
||||
m_pPetCorral.SetActivePetIndex(-1);
|
||||
m_pPetCorral.SetActivePetNPCID(0);
|
||||
m_bPetInSanctuary = false;
|
||||
break;
|
||||
}
|
||||
case CommandID.PLAYER_START_PET_OP:
|
||||
{
|
||||
cmd_player_start_pet_op pCmd = GPDataTypeHelper.FromBytes<cmd_player_start_pet_op>((byte[])Msg.dwParam1);
|
||||
int iDoWhat;
|
||||
if (pCmd.op == 0)
|
||||
iDoWhat = (int)CECHPWorkConcentrate.eDO_PET.DO_SUMMONPET;
|
||||
else if (pCmd.op == 1)
|
||||
iDoWhat = (int)CECHPWorkConcentrate.eDO_PET.DO_RECALLPET;
|
||||
else if (pCmd.op == 2)
|
||||
iDoWhat = (int)CECHPWorkConcentrate.eDO_PET.DO_BANISHPET;
|
||||
else if (pCmd.op == 3)
|
||||
iDoWhat = (int)CECHPWorkConcentrate.eDO_PET.DO_RESTOREPET;
|
||||
else
|
||||
iDoWhat = (int)CECHPWorkConcentrate.eDO_PET.DO_UNKNOWN;
|
||||
|
||||
m_PetOptCnt.SetPeriod(pCmd.delay * 50);
|
||||
m_PetOptCnt.Reset();
|
||||
|
||||
CECHPWorkConcentrate pWork = (CECHPWorkConcentrate)m_pWorkMan.CreateWork(CECHPWork.Host_work_ID.WORK_CONCENTRATE);
|
||||
pWork.SetDoWhat(iDoWhat);
|
||||
m_pWorkMan.StartWork_p1(pWork);
|
||||
break;
|
||||
}
|
||||
case CommandID.PLAYER_STOP_PET_OP:
|
||||
{
|
||||
if (IsOperatingPet() != 0)
|
||||
m_pWorkMan.FinishRunningWork(CECHPWork.Host_work_ID.WORK_CONCENTRATE);
|
||||
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_RECEIVE_EXP:
|
||||
{
|
||||
cmd_pet_receive_exp pCmd = GPDataTypeHelper.FromBytes<cmd_pet_receive_exp>((byte[])Msg.dwParam1);
|
||||
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.slot_index);
|
||||
if (pPet != null)
|
||||
{
|
||||
//ASSERT(pPet.GetTemplateID() == pCmd.pet_id);
|
||||
pPet.AddExp(pCmd.exp);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_LEVELUP:
|
||||
{
|
||||
cmd_pet_levelup pCmd = GPDataTypeHelper.FromBytes<cmd_pet_levelup>((byte[])Msg.dwParam1);
|
||||
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.slot_index);
|
||||
if (pPet != null)
|
||||
{
|
||||
//ASSERT(pPet.GetTemplateID() == pCmd.pet_id);
|
||||
pPet.LevelUp(pCmd.level, pCmd.exp);
|
||||
}
|
||||
|
||||
//pGameRun.AddFixedMessage(FIXMSG_PET_LEVELUP, pCmd.level);
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_ROOM:
|
||||
{
|
||||
cmd_pet_room pCmd = GPDataTypeHelper.FromBytes<cmd_pet_room>((byte[])Msg.dwParam1);
|
||||
m_pPetCorral.UpdatePets(pCmd, (byte[])Msg.dwParam1);
|
||||
|
||||
CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan();
|
||||
|
||||
//if (pGameUI.GetDialog("Win_Teach").IsShow())
|
||||
// {
|
||||
// //pGameUI.UpdateTeach();
|
||||
// }
|
||||
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_ROOM_CAPACITY:
|
||||
{
|
||||
cmd_pet_room_capacity pCmd = GPDataTypeHelper.FromBytes<cmd_pet_room_capacity>((byte[])Msg.dwParam1);
|
||||
m_pPetCorral.MagnifyPetSlots((int)pCmd.capacity);
|
||||
|
||||
if (m_pPetCorral.HasInit())
|
||||
{
|
||||
//pGameRun.AddFixedMessage(FIXMSG_PET_ROOM_SIZE, pCmd.capacity);
|
||||
}
|
||||
else
|
||||
m_pPetCorral.SetHasInit(true);
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_HONOR_POINT:
|
||||
{
|
||||
cmd_pet_honor_point pCmd = GPDataTypeHelper.FromBytes<cmd_pet_honor_point>((byte[])Msg.dwParam1);
|
||||
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.index);
|
||||
if (pPet != null)
|
||||
pPet.SetIntimacy(pCmd.cur_honor_point);
|
||||
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_HUNGER_GAUGE:
|
||||
{
|
||||
cmd_pet_hunger_gauge pCmd = GPDataTypeHelper.FromBytes<cmd_pet_hunger_gauge>((byte[])Msg.dwParam1);
|
||||
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.index);
|
||||
if (pPet != null)
|
||||
pPet.SetHunger(pCmd.cur_hunge_gauge);
|
||||
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_DEAD:
|
||||
{
|
||||
cmd_pet_dead pCmd = GPDataTypeHelper.FromBytes<cmd_pet_dead>((byte[])Msg.dwParam1);
|
||||
CECPetData pPet = m_pPetCorral.GetPetData((int)pCmd.pet_index);
|
||||
if (pPet != null)
|
||||
{
|
||||
pPet.SetHPFactor(0.0f);
|
||||
pPet.SetHP(0);
|
||||
pPet.OnPetDead();
|
||||
}
|
||||
|
||||
//pGameRun.AddFixedMessage(FIXMSG_PET_DEAD);
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_REVIVE:
|
||||
{
|
||||
cmd_pet_revive pCmd = GPDataTypeHelper.FromBytes<cmd_pet_revive>((byte[])Msg.dwParam1);
|
||||
CECPetData pPet = m_pPetCorral.GetPetData((int)pCmd.pet_index);
|
||||
if (pPet != null)
|
||||
pPet.SetHPFactor(pCmd.hp_factor);
|
||||
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_HP_NOTIFY:
|
||||
{
|
||||
cmd_pet_hp_notify pCmd = GPDataTypeHelper.FromBytes<cmd_pet_hp_notify>((byte[])Msg.dwParam1);
|
||||
CECPetData pPet = m_pPetCorral.GetPetData((int)pCmd.pet_index);
|
||||
if (pPet != null)
|
||||
{
|
||||
int lastHP = pPet.GetHP();
|
||||
|
||||
pPet.SetHPFactor(pCmd.hp_factor);
|
||||
pPet.SetHP(pCmd.cur_hp);
|
||||
|
||||
pPet.SetMPFactor(pCmd.mp_factor);
|
||||
pPet.SetMP(pCmd.cur_mp);
|
||||
|
||||
// If HP is too low, popup a warning on pet's head
|
||||
int iLimit = (int)(pPet.CalcMaxHP() * 0.3f);
|
||||
if (pCmd.cur_hp < lastHP && lastHP != 0 && pCmd.cur_hp < iLimit)
|
||||
{
|
||||
CECNPC pNPC = EC_Game.GetGameRun().GetWorld().GetNPCMan().GetNPC(m_pPetCorral.GetActivePetNPCID());
|
||||
if (pNPC && pNPC.GetMasterID() == GetCharacterID())
|
||||
{
|
||||
//pNPC.BubbleText(CECNPC::BUBBLE_HPWARN, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_AI_STATE:
|
||||
{
|
||||
cmd_pet_ai_state pCmd = GPDataTypeHelper.FromBytes<cmd_pet_ai_state>((byte[])Msg.dwParam1);
|
||||
|
||||
// ³èÎïÓл°Ëµ
|
||||
CECPetData pPetData = m_pPetCorral.GetActivePet();
|
||||
if (pPetData != null)
|
||||
{
|
||||
int tid = pPetData.GetTemplateID();
|
||||
int nid = m_pPetCorral.GetActivePetNPCID();
|
||||
if (m_pPetCorral.GetMoveMode() != pCmd.move)
|
||||
{
|
||||
switch (pCmd.move)
|
||||
{
|
||||
case (byte)CECPetCorral.ePet_MovingMode.MOVE_FOLLOW:
|
||||
{
|
||||
//OnPetSays(tid, nid, CECPetWords::TW_FOLLOW);
|
||||
break;
|
||||
}
|
||||
case (byte)CECPetCorral.ePet_MovingMode.MOVE_STAND:
|
||||
{
|
||||
//OnPetSays(tid, nid, CECPetWords::TW_STOP);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m_pPetCorral.GetAttackMode() != pCmd.attack)
|
||||
{
|
||||
switch (pCmd.attack)
|
||||
{
|
||||
case (byte)CECPetCorral.ePet_AttackingMode.ATK_DEFENSE:
|
||||
//OnPetSays(tid, nid, CECPetWords::TW_DEFENSIVE);
|
||||
break;
|
||||
|
||||
case (byte)CECPetCorral.ePet_AttackingMode.ATK_POSITIVE:
|
||||
//OnPetSays(tid, nid, CECPetWords::TW_OFFENSIVE);
|
||||
break;
|
||||
|
||||
case (byte)CECPetCorral.ePet_AttackingMode.ATK_PASSIVE:
|
||||
//OnPetSays(tid, nid, CECPetWords::TW_PASSIVE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_pPetCorral.SetMoveMode(pCmd.move);
|
||||
m_pPetCorral.SetAttackMode(pCmd.attack);
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_SET_COOLDOWN:
|
||||
{
|
||||
cmd_pet_set_cooldown pCmd = GPDataTypeHelper.FromBytes<cmd_pet_set_cooldown>((byte[])Msg.dwParam1);
|
||||
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.pet_index);
|
||||
if (pPet != null)
|
||||
pPet.SetSkillCoolTime(pCmd.cooldown_index, pCmd.cooldown_time);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case CommandID.SUMMON_PLANT_PET:
|
||||
{
|
||||
int size = Marshal.SizeOf<cmd_summon_plant_pet>();
|
||||
if (((byte[])Msg.dwParam1).Length >= size)
|
||||
{
|
||||
cmd_summon_plant_pet pCmd = GPDataTypeHelper.FromBytes<cmd_summon_plant_pet>((byte[])Msg.dwParam1);
|
||||
m_pPetCorral.PlantPetEnter(pCmd);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CommandID.PLANT_PET_DISAPPEAR:
|
||||
{
|
||||
int size = Marshal.SizeOf<cmd_plant_pet_disapper>();
|
||||
if (((byte[])Msg.dwParam1).Length >= size)
|
||||
{
|
||||
cmd_plant_pet_disapper pCmd = GPDataTypeHelper.FromBytes<cmd_plant_pet_disapper>((byte[])Msg.dwParam1);
|
||||
m_pPetCorral.PlantPetDisappear(pCmd);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CommandID.PLANT_PET_HP_NOTIFY:
|
||||
{
|
||||
int size = Marshal.SizeOf<cmd_plant_pet_hp_notify>();
|
||||
if (((byte[])Msg.dwParam1).Length >= size)
|
||||
{
|
||||
cmd_plant_pet_hp_notify pCmd = GPDataTypeHelper.FromBytes<cmd_plant_pet_hp_notify>((byte[])Msg.dwParam1);
|
||||
m_pPetCorral.PlantPetInfo(pCmd);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CommandID.PET_PROPERTY:
|
||||
{
|
||||
cmd_pet_property pCmd = GPDataTypeHelper.FromBytes<cmd_pet_property>((byte[])Msg.dwParam1);
|
||||
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.pet_index);
|
||||
if (pPet != null)
|
||||
{
|
||||
pPet.SetExtendProps(pCmd.prop);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CommandID.PET_REBUILD_INHERIT_START:
|
||||
case CommandID.PET_REBUILD_INHERIT_INFO:
|
||||
case CommandID.PET_REBUILD_INHERIT_END:
|
||||
case CommandID.PET_EVOLUTION_DONE:
|
||||
case CommandID.PET_REBUILD_NATURE_START:
|
||||
case CommandID.PET_REBUILD_NATURE_INFO:
|
||||
case CommandID.PET_REBUILD_NATURE_END:
|
||||
{
|
||||
CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan();
|
||||
if (pGameUI != null)
|
||||
{
|
||||
//((CDlgPreviewPetRebuild*)pGameUI.GetDialog("Win_PreviewPet")).OnServerNotify(Msg.dwParam2, (void*)Msg.dwParam1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
void OnMsgHstSetPlayerLimit(ECMSG Msg)
|
||||
{
|
||||
cmd_set_player_limit pCmd = GPDataTypeHelper.FromBytes<cmd_set_player_limit>((byte[])Msg.dwParam1);
|
||||
if (pCmd.index >= 0 && pCmd.index < (int)PLAYER_LIMIT.PLAYER_LIMIT_MAX)
|
||||
m_playerLimits[pCmd.index] = (pCmd.b != 0);
|
||||
}
|
||||
|
||||
// Get time counter of using item in pack
|
||||
public bool GetUsingItemTimeCnt(ref uint dwCurTime, ref uint dwMaxTime, ref int? piItem/* NULL */)
|
||||
{
|
||||
if(m_pWorkMan == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!m_pWorkMan.IsUsingItem())
|
||||
return false;
|
||||
|
||||
CECHPWorkUse pWork = (m_pWorkMan.GetRunningWork(CECHPWork.Host_work_ID.WORK_USEITEM)) as CECHPWorkUse;
|
||||
CECCounter cnt = pWork.GetTimeCounter();
|
||||
dwCurTime = (uint)cnt.GetCounter();
|
||||
dwMaxTime = (uint)cnt.GetPeriod();
|
||||
|
||||
if (piItem != null)
|
||||
piItem = pWork.GetItem();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -29,7 +29,9 @@ namespace BrewMonster
|
||||
|
||||
public void ShowLoadingScene(bool active)
|
||||
{
|
||||
goContent.SetActive(active);
|
||||
#if !UNITY_EDITOR
|
||||
goContent.SetActive(active);
|
||||
#endif
|
||||
}
|
||||
|
||||
async UniTaskVoid ObserveLoadingAsync(CancellationToken token)
|
||||
|
||||
@@ -8,8 +8,8 @@ namespace BrewMonster
|
||||
public static void Init()
|
||||
{
|
||||
int i = 0;
|
||||
i++;
|
||||
}
|
||||
|
||||
// Skill stub declarations
|
||||
public static Skill1Stub __stub_Skill1Stub = new Skill1Stub();
|
||||
public static Skill2Stub __stub_Skill2Stub = new Skill2Stub();
|
||||
|
||||
@@ -116,6 +116,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/虎击击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = false;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(182);
|
||||
@@ -140,9 +166,6 @@ namespace BrewMonster
|
||||
public float GetAttackdistance(Skill skill) => 0f;
|
||||
public float GetAngle(Skill skill) => (float)(1 - 0.0111111 * 0);
|
||||
public override float GetPraydistance(Skill skill) => (float)(skill.GetPlayer().GetRange());
|
||||
public override int GetRequiredLevel(Skill skill) => RequiredLevelArray[skill.GetLevel() - 1];
|
||||
public override int GetRequiredSp(Skill skill) => RequiredSpArray[skill.GetLevel() - 1];
|
||||
public override int GetRequiredMoney(Skill skill) => RequiredMoneyArray[skill.GetLevel() - 1];
|
||||
|
||||
#if SKILL_CLIENT
|
||||
public override int GetIntroduction(Skill skill, StringBuilder buffer, string format)
|
||||
|
||||
@@ -116,6 +116,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/沙陷击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = true;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(292);
|
||||
restrict_weapons.Add(0);
|
||||
range = new Range();
|
||||
|
||||
@@ -111,6 +111,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/缩地术.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = true;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -114,6 +114,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/疾风霹雳击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 200;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(23749);
|
||||
range = new Range();
|
||||
range.type = 0;
|
||||
|
||||
@@ -79,6 +79,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/凌波微步击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 1000;
|
||||
m_bTraceTarget = true;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(182);
|
||||
|
||||
@@ -79,6 +79,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/易筋经.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(182);
|
||||
|
||||
@@ -79,6 +79,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/易髓经.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(182);
|
||||
|
||||
@@ -79,6 +79,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/金刚经击中.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = string.Empty;
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)7;
|
||||
m_TargetMode = (GfxTargetMode)7;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 3000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(182);
|
||||
|
||||
@@ -114,6 +114,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/法师_法之奥义_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -115,6 +115,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/法师_静谧之术_飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/静谧之术_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 2000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(292);
|
||||
restrict_weapons.Add(0);
|
||||
range = new Range();
|
||||
|
||||
@@ -114,6 +114,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/法师_灸焰_飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/法师_灸焰_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 2000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(292);
|
||||
restrict_weapons.Add(0);
|
||||
range = new Range();
|
||||
|
||||
@@ -114,6 +114,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/法师_沙暴_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(292);
|
||||
restrict_weapons.Add(0);
|
||||
range = new Range();
|
||||
|
||||
@@ -114,6 +114,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/巫师_复仇雷霆_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(5);
|
||||
|
||||
@@ -115,6 +115,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_狂风.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(5);
|
||||
restrict_weapons.Add(9);
|
||||
|
||||
@@ -117,6 +117,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_碎颅.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(5);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(9);
|
||||
|
||||
@@ -117,6 +117,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/武侠_回旋击.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_回旋击.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)1;
|
||||
m_AttHitMode = (GfxAttackMode)1;
|
||||
m_dwFlyTime = 2000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = false;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(9);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(5);
|
||||
|
||||
@@ -114,6 +114,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/龙爪手_飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = string.Empty;
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)8;
|
||||
m_TargetMode = (GfxTargetMode)9;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 1100;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(182);
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
|
||||
@@ -116,6 +116,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/冰雹飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = string.Empty;
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)7;
|
||||
m_TargetMode = (GfxTargetMode)6;
|
||||
m_AttFlyMode = (GfxAttackMode)1;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 4000;
|
||||
m_bTraceTarget = true;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -78,6 +78,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/般若心经.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = string.Empty;
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)7;
|
||||
m_TargetMode = (GfxTargetMode)7;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 2000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(292);
|
||||
restrict_weapons.Add(0);
|
||||
range = new Range();
|
||||
|
||||
@@ -113,6 +113,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/石破天惊飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/石破天惊击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 2000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(292);
|
||||
restrict_weapons.Add(0);
|
||||
range = new Range();
|
||||
|
||||
@@ -58,6 +58,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/法师_冰晶世界_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
range = new Range();
|
||||
range.type = 0;
|
||||
pre_skills = new Dictionary<uint, int>();
|
||||
|
||||
@@ -115,6 +115,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/法师_静谧之术2_飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/静谧之术2_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 2000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(292);
|
||||
restrict_weapons.Add(0);
|
||||
range = new Range();
|
||||
|
||||
@@ -58,6 +58,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_狂风.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
range = new Range();
|
||||
range.type = 0;
|
||||
pre_skills = new Dictionary<uint, int>();
|
||||
|
||||
@@ -114,6 +114,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_狂风.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(5);
|
||||
restrict_weapons.Add(9);
|
||||
|
||||
@@ -58,6 +58,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_狂风.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
range = new Range();
|
||||
range.type = 0;
|
||||
pre_skills = new Dictionary<uint, int>();
|
||||
|
||||
@@ -114,6 +114,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/法师_静谧之术_飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/静谧之术_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 2000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(292);
|
||||
restrict_weapons.Add(0);
|
||||
range = new Range();
|
||||
|
||||
@@ -114,6 +114,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/法师_静谧之术2_飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/静谧之术2_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 2000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(292);
|
||||
restrict_weapons.Add(0);
|
||||
range = new Range();
|
||||
|
||||
@@ -116,6 +116,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/寸力击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(182);
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_凌风改_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(182);
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_凌风改_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(182);
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_横扫千军改_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(182);
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_横扫千军改_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(182);
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_凌风改_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(5);
|
||||
restrict_weapons.Add(9);
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/武侠_凌风改_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(5);
|
||||
restrict_weapons.Add(9);
|
||||
|
||||
@@ -115,6 +115,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/磐石护甲_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -115,6 +115,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/磐石护甲_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -115,6 +115,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/烈焰护甲_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -115,6 +115,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/烈焰护甲_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -115,6 +115,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/寒冰护甲_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -115,6 +115,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/寒冰护甲_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/法师_业火符_飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/法师_业火符_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 3000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/法师_业火符_飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/法师_业火符_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 3000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -115,6 +115,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/寒霜_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -115,6 +115,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/寒霜_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/法师_沙石咒_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(292);
|
||||
restrict_weapons.Add(0);
|
||||
range = new Range();
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/法师_沙石咒_击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = true;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(292);
|
||||
restrict_weapons.Add(0);
|
||||
range = new Range();
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/回马枪击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = false;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(5);
|
||||
range = new Range();
|
||||
range.type = 0;
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/回马枪击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = false;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(5);
|
||||
range = new Range();
|
||||
range.type = 0;
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/追魂诀击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(1);
|
||||
range = new Range();
|
||||
range.type = 0;
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/追魂诀击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(1);
|
||||
range = new Range();
|
||||
range.type = 0;
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/流星赶月击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 200;
|
||||
m_bTraceTarget = true;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(5);
|
||||
restrict_weapons.Add(1);
|
||||
range = new Range();
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/流星赶月击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 200;
|
||||
m_bTraceTarget = true;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(5);
|
||||
restrict_weapons.Add(1);
|
||||
range = new Range();
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/霸王断岳击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(9);
|
||||
range = new Range();
|
||||
range.type = 2;
|
||||
|
||||
@@ -118,6 +118,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/霸王断岳击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(9);
|
||||
range = new Range();
|
||||
range.type = 2;
|
||||
|
||||
@@ -119,6 +119,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/霸王龙飞击中.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = string.Empty;
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)7;
|
||||
m_TargetMode = (GfxTargetMode)6;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 2000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(9);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(5);
|
||||
|
||||
@@ -119,6 +119,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/霸王龙飞击中.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = string.Empty;
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)7;
|
||||
m_TargetMode = (GfxTargetMode)6;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 2000;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(9);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(5);
|
||||
|
||||
@@ -157,6 +157,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/凌杀飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/凌杀击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)2;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 1000;
|
||||
m_bTraceTarget = true;
|
||||
m_FlyClusterCount = 3;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = true;
|
||||
// m_Shape = (EmitShape)1;
|
||||
// m_vSize = new Vector3(1.0f, 1.0f, 1.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -157,6 +157,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = "策划联入/人物技能/飞行/凌杀飞行.gfx";
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/凌杀击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)2;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 1000;
|
||||
m_bTraceTarget = true;
|
||||
m_FlyClusterCount = 3;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = true;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = true;
|
||||
// m_Shape = (EmitShape)1;
|
||||
// m_vSize = new Vector3(1.0f, 1.0f, 1.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(292);
|
||||
range = new Range();
|
||||
|
||||
@@ -116,6 +116,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/凌风击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)7;
|
||||
m_TargetMode = (GfxTargetMode)6;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = false;
|
||||
m_fDefTarScl = 1.8f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(5);
|
||||
restrict_weapons.Add(9);
|
||||
|
||||
@@ -117,6 +117,32 @@ namespace BrewMonster
|
||||
m_szFlyGfxPath = string.Empty;
|
||||
m_szHitGrndGfxPath = string.Empty;
|
||||
m_szHitGfxPath = "策划联入/人物技能/击中/虎击击中.gfx";
|
||||
|
||||
// GFX Movement and Behavior Parameters / GFX移动和行为参数
|
||||
m_MoveMode = (GfxMoveMode)0;
|
||||
m_TargetMode = (GfxTargetMode)0;
|
||||
m_AttFlyMode = (GfxAttackMode)0;
|
||||
m_AttHitMode = (GfxAttackMode)0;
|
||||
m_dwFlyTime = 0;
|
||||
m_bTraceTarget = false;
|
||||
m_FlyClusterCount = 1;
|
||||
m_FlyClusterInterval = 0;
|
||||
m_HitClusterCount = 1;
|
||||
m_HitClusterInterval = 0;
|
||||
m_bOneHit = true;
|
||||
m_bFadeOut = false;
|
||||
m_bRelScl = false;
|
||||
m_fDefTarScl = 1.5f;
|
||||
|
||||
// Area parameters (commented out) / 区域参数(已注释)
|
||||
// m_bArea = false;
|
||||
// m_Shape = (EmitShape)0;
|
||||
// m_vSize = new Vector3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Param (commented out) / 参数(已注释)
|
||||
// m_paramType = (GfxSkillValType)1;
|
||||
// m_param = new GFX_SKILL_PARAM();
|
||||
// m_param.nVal = 0;
|
||||
restrict_weapons.Add(0);
|
||||
restrict_weapons.Add(1);
|
||||
restrict_weapons.Add(182);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user