Merge remote-tracking branch 'origin/develop' into feature/HostAttack_Hoang
# Conflicts: # Assets/PerfectWorld/Scripts/Move/CECPlayer.cs # Assets/Scripts/CECHostPlayer.cs
This commit is contained in:
@@ -0,0 +1,255 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using ModelRenderer.Scripts.Common;
|
||||
|
||||
namespace BrewMonster.Common
|
||||
{
|
||||
|
||||
public struct SCRIPTINFO
|
||||
{
|
||||
public byte[] pFileBuf; // Pointer to file data buffer
|
||||
public byte[] pStart; // Start address of buffer
|
||||
public byte[] pEnd; // End address of buffer
|
||||
public byte[] pCur; // Current pointer. Pointer size is 2 bytes
|
||||
public uint pCurIndex; // Current pointer index
|
||||
public int iLine; // Line counter
|
||||
}
|
||||
|
||||
public class AWScriptFile
|
||||
{
|
||||
private const int MAX_LINELEN = 2048;
|
||||
public ushort[] m_szToken = new ushort[MAX_LINELEN];
|
||||
|
||||
protected SCRIPTINFO m_Script = new SCRIPTINFO();
|
||||
|
||||
|
||||
|
||||
public bool Open(FileStream stream)
|
||||
{
|
||||
uint dwFilelen = (uint)stream.Length;
|
||||
if (dwFilelen <= 0)
|
||||
{
|
||||
BMLogger.LogError($"EC_StringTab::Open: {stream.Name} File length is 0");
|
||||
return false;
|
||||
}
|
||||
|
||||
byte[] pBuf = new byte[dwFilelen];
|
||||
|
||||
stream.Read(pBuf, 0, (int)dwFilelen);
|
||||
|
||||
// Check unicode file header
|
||||
ushort wChar = BitConverter.ToUInt16(new byte[] {pBuf[0], pBuf[1]});
|
||||
if (wChar != 0xfeff)
|
||||
{
|
||||
BMLogger.LogError($"EC_StringTab::Open: {stream.Name} File is not unicode");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_Script.pFileBuf = pBuf;
|
||||
m_Script.pStart = new []{m_Script.pFileBuf[2], m_Script.pFileBuf[3]}; // Skip unicode magic number
|
||||
m_Script.pCur = m_Script.pStart;
|
||||
m_Script.pEnd = new [] {m_Script.pFileBuf[pBuf.Length - 2], m_Script.pFileBuf[pBuf.Length - 1]};
|
||||
m_Script.pCurIndex = 2;
|
||||
m_Script.iLine = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool Open(string szFile)
|
||||
{
|
||||
if (!File.Exists(szFile))
|
||||
{
|
||||
BMLogger.LogError($"EC_StringTab::Open: {szFile} File not found");
|
||||
return false;
|
||||
}
|
||||
|
||||
using (FileStream stream = new FileStream(szFile, FileMode.Open, FileAccess.Read))
|
||||
{
|
||||
var bRet = Open(stream);
|
||||
if (!bRet)
|
||||
{
|
||||
BMLogger.LogError($"EC_StringTab::Open: {szFile} File open failed");
|
||||
return false;
|
||||
}
|
||||
stream.Close();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
//TODO: May be not needed
|
||||
m_Script.pFileBuf = null;
|
||||
m_Script.pStart = null;
|
||||
m_Script.pCur = null;
|
||||
m_Script.pEnd = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get next token and move file pointer forward.
|
||||
/// </summary>
|
||||
/// <param name="bCrossLine">true, search next token until it is found or all buffer has been checked;<br/> false, only search next token in current line</param>
|
||||
/// <returns>true for success, otherwise return false</returns>
|
||||
public bool GetNextToken(bool bCrossLine)
|
||||
{
|
||||
NewLine:
|
||||
while (m_Script.pCurIndex < m_Script.pFileBuf.Length)
|
||||
{
|
||||
// get the first byte because the pointer is 2 bytes. The second byte should be 0 in these cases (value < 255)
|
||||
if (m_Script.pFileBuf[m_Script.pCurIndex] > 32 && m_Script.pFileBuf[m_Script.pCurIndex] != ';' &&
|
||||
m_Script.pFileBuf[m_Script.pCurIndex] != ',')
|
||||
break;
|
||||
|
||||
m_Script.pCurIndex += 2; // move pointer forward 2 bytes because it's w_char (2 bytes)
|
||||
if (m_Script.pCurIndex >= m_Script.pFileBuf.Length)
|
||||
return false;
|
||||
m_Script.pCur[0] = m_Script.pFileBuf[m_Script.pCurIndex];
|
||||
m_Script.pCur[1] = m_Script.pFileBuf[m_Script.pCurIndex + 1];
|
||||
if (m_Script.pCur[0] == '\n')
|
||||
{
|
||||
if (!bCrossLine)
|
||||
{
|
||||
m_Script.pCurIndex -= 2; // Let search pointer still stop in this line
|
||||
return false;
|
||||
}
|
||||
|
||||
m_Script.iLine++;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_Script.pCurIndex >= m_Script.pFileBuf.Length)
|
||||
return false;
|
||||
|
||||
// Skip comment lines those begin with '//'
|
||||
if (m_Script.pFileBuf[m_Script.pCurIndex] == '/' && m_Script.pFileBuf[m_Script.pCurIndex + 2] == '/')
|
||||
{
|
||||
// This is a note line, search it's ending.
|
||||
while (!m_Script.pCur.Equals(m_Script.pEnd) && m_Script.pFileBuf[m_Script.pCurIndex] != '\n')
|
||||
{
|
||||
m_Script.pCurIndex += 2;
|
||||
}
|
||||
|
||||
if (m_Script.pCurIndex >= m_Script.pFileBuf.Length) // Found nothing
|
||||
return false;
|
||||
if (!bCrossLine) // Don't search cross line
|
||||
return false;
|
||||
|
||||
m_Script.pCurIndex += 2; // Skip '\n'
|
||||
m_Script.iLine++;
|
||||
goto NewLine;
|
||||
}
|
||||
|
||||
// Text between /* */ are also comment
|
||||
if (m_Script.pFileBuf[m_Script.pCurIndex] == '/' && m_Script.pFileBuf[m_Script.pCurIndex + 2] == '*')
|
||||
{
|
||||
bool bError = false;
|
||||
|
||||
m_Script.pCurIndex += 4; // Skip /*
|
||||
|
||||
while (m_Script.pFileBuf[m_Script.pCurIndex] != '*' || m_Script.pFileBuf[m_Script.pCurIndex + 2] != '/')
|
||||
{
|
||||
if (m_Script.pCurIndex >= m_Script.pEnd.Length) // Found nothing
|
||||
return false;
|
||||
else if (m_Script.pFileBuf[m_Script.pCurIndex] == '\n')
|
||||
{
|
||||
if (!bCrossLine)
|
||||
{
|
||||
// This is a fatal error, we should return false.
|
||||
// But we must search the '*/' so that next time our begin point
|
||||
// isn't in comment paragraph
|
||||
bError = true;
|
||||
}
|
||||
|
||||
m_Script.iLine++;
|
||||
}
|
||||
|
||||
m_Script.pCurIndex += 2;
|
||||
}
|
||||
|
||||
m_Script.pCurIndex += 4; // Skip */
|
||||
|
||||
if (bError)
|
||||
return false;
|
||||
|
||||
goto NewLine;
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
|
||||
// Copy string in "" or () pair
|
||||
if (m_Script.pFileBuf[m_Script.pCurIndex] == '"' || m_Script.pFileBuf[m_Script.pCurIndex] == '(')
|
||||
{
|
||||
char cEnd = m_Script.pFileBuf[m_Script.pCurIndex] == '"' ? '"' : ')';
|
||||
|
||||
// Quoted token
|
||||
m_Script.pCurIndex += 2; // Skip " or (
|
||||
m_Script.pCur[0] = m_Script.pFileBuf[m_Script.pCurIndex];
|
||||
m_Script.pCur[1] = m_Script.pFileBuf[m_Script.pCurIndex + 1];
|
||||
|
||||
while (!m_Script.pCur.Equals(m_Script.pEnd) && m_Script.pFileBuf[m_Script.pCurIndex] != cEnd)
|
||||
{
|
||||
if (i >= MAX_LINELEN-1)
|
||||
return false;
|
||||
|
||||
// save the text into the token array
|
||||
m_szToken[i++] = BitConverter.ToUInt16(m_Script.pCur);
|
||||
|
||||
m_Script.pCurIndex += 2;
|
||||
m_Script.pCur[0] = m_Script.pFileBuf[m_Script.pCurIndex];
|
||||
m_Script.pCur[1] = m_Script.pFileBuf[m_Script.pCurIndex + 1];
|
||||
}
|
||||
|
||||
m_Script.pCurIndex += 2; // Skip " or )
|
||||
m_Script.pCur[0] = m_Script.pFileBuf[m_Script.pCurIndex];
|
||||
m_Script.pCur[1] = m_Script.pFileBuf[m_Script.pCurIndex + 1];
|
||||
}
|
||||
else // Is a normal token
|
||||
{
|
||||
while (!m_Script.pCur.Equals(m_Script.pEnd) && BitConverter.ToInt16(m_Script.pCur) > 32 &&
|
||||
m_Script.pFileBuf[m_Script.pCurIndex] != ';' && m_Script.pFileBuf[m_Script.pCurIndex] != ',')
|
||||
{
|
||||
if (i >= MAX_LINELEN-1)
|
||||
return false;
|
||||
|
||||
m_szToken[i++] = BitConverter.ToUInt16(m_Script.pCur);
|
||||
|
||||
m_Script.pCurIndex += 2;
|
||||
m_Script.pCur[0] = m_Script.pFileBuf[m_Script.pCurIndex];
|
||||
m_Script.pCur[1] = m_Script.pFileBuf[m_Script.pCurIndex + 1];
|
||||
}
|
||||
}
|
||||
|
||||
m_szToken[i] = '\0';
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Peek next token and don't move file pointer
|
||||
/// Return true for success, otherwise return false
|
||||
/// </summary>
|
||||
/// <param name="bCrossLine">true, search next token until it is found or all buffer has been checked; false, only search next token in current line</param>
|
||||
public bool PeekNextToken(bool bCrossLine)
|
||||
{
|
||||
// Record current pointer and line
|
||||
var pCur = new [] {m_Script.pCur[0], m_Script.pCur[1]};
|
||||
var iLine = m_Script.iLine;
|
||||
var pCurIndex = m_Script.pCurIndex;
|
||||
|
||||
bool bRet = GetNextToken(bCrossLine);
|
||||
|
||||
// Restore pointer and line
|
||||
m_Script.pCur = pCur;
|
||||
m_Script.iLine = iLine;
|
||||
m_Script.pCurIndex = pCurIndex;
|
||||
|
||||
return bRet;
|
||||
}
|
||||
|
||||
public int GetNextTokenAsInt(bool bCrossLine)
|
||||
{
|
||||
GetNextToken(bCrossLine);
|
||||
return int.Parse(ByteToStringUtils.UshortArrayToUnicodeString(m_szToken));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2c2c2e6c750c64c4fb852e667a353b22
|
||||
@@ -0,0 +1,124 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using ModelRenderer.Scripts.Common;
|
||||
|
||||
namespace BrewMonster.Common
|
||||
{
|
||||
public class CECStringTab
|
||||
{
|
||||
|
||||
private Dictionary<int, string> m_AStrTab = new Dictionary<int, string>();
|
||||
private Dictionary<int, string> m_WStrTab = new Dictionary<int, string>();
|
||||
|
||||
protected bool m_bInit = false;
|
||||
protected bool m_bUnicode = false;
|
||||
|
||||
public bool IsInitialized() => m_bInit;
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
m_AStrTab.Clear();
|
||||
m_WStrTab.Clear();
|
||||
m_bInit = false;
|
||||
m_bUnicode = false;
|
||||
}
|
||||
|
||||
public bool Init(string szFile, bool bUnicode)
|
||||
{
|
||||
bool bRet = false;
|
||||
|
||||
if (bUnicode)
|
||||
{
|
||||
bRet = LoadWideStrings(szFile);
|
||||
}
|
||||
|
||||
if (!bRet)
|
||||
{
|
||||
BMLogger.LogError($"EC_StringTab::Init: {szFile} File load failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_bInit = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool LoadWideStrings(string szFile)
|
||||
{
|
||||
AWScriptFile ScriptFile = new AWScriptFile();
|
||||
if (!ScriptFile.Open(szFile)) return false;
|
||||
|
||||
bool bIndex = false;
|
||||
bool bFileEnd = true;
|
||||
|
||||
// Read configs
|
||||
while (ScriptFile.GetNextToken(true))
|
||||
{
|
||||
string tokenStr = ByteToStringUtils.UshortArrayToUnicodeString(ScriptFile.m_szToken);
|
||||
if (ByteToStringUtils.UshortArrayToUnicodeString(ScriptFile.m_szToken).StartsWith("#_index"))
|
||||
bIndex = true;
|
||||
else if (ByteToStringUtils.UshortArrayToUnicodeString(ScriptFile.m_szToken).StartsWith("#_begin"))
|
||||
{
|
||||
bFileEnd = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (bFileEnd)
|
||||
{
|
||||
ScriptFile.Close();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (bIndex)
|
||||
{
|
||||
// Every string has a preset index
|
||||
while (ScriptFile.PeekNextToken(true))
|
||||
{
|
||||
int n = ScriptFile.GetNextTokenAsInt(true);
|
||||
ScriptFile.GetNextToken(false);
|
||||
|
||||
string pstr = ByteToStringUtils.UshortArrayToUnicodeString(ScriptFile.m_szToken);
|
||||
if (string.IsNullOrEmpty(pstr))
|
||||
{
|
||||
ScriptFile.Close();
|
||||
BMLogger.LogError($"EC_StringTab::LoadWideStrings: {szFile} Not enough memory");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_WStrTab.TryAdd(n, pstr))
|
||||
{
|
||||
BMLogger.LogError($"EC_StringTab::LoadWideStrings: {szFile} Failed to add string to dictionary");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int iCnt = 0;
|
||||
|
||||
// Read strings sequently
|
||||
while (ScriptFile.GetNextToken(true))
|
||||
{
|
||||
string pstr = ByteToStringUtils.UshortArrayToUnicodeString(ScriptFile.m_szToken);
|
||||
if (string.IsNullOrEmpty(pstr))
|
||||
{
|
||||
ScriptFile.Close();
|
||||
BMLogger.LogError($"EC_StringTab::LoadWideStrings: {szFile} Not enough memory");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_WStrTab.TryAdd(iCnt++, pstr))
|
||||
{
|
||||
BMLogger.LogError($"EC_StringTab::LoadWideStrings: {szFile} Failed to add string to dictionary");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ScriptFile.Close();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b95d268e43a5da14f9cf8e1ed98bfd73
|
||||
@@ -0,0 +1,48 @@
|
||||
using System.IO;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BrewMonster.Common
|
||||
{
|
||||
public class StringTabTest : MonoBehaviour
|
||||
{
|
||||
private CECStringTab m_pStringTab;
|
||||
|
||||
[ContextMenu("Test SkillStr")]
|
||||
void TestSkillStr()
|
||||
{
|
||||
if (m_pStringTab == null)
|
||||
{
|
||||
m_pStringTab = new CECStringTab();
|
||||
}
|
||||
m_pStringTab.Clear();
|
||||
string path = Path.Combine(Application.streamingAssetsPath, "configs/skillstr.txt");
|
||||
m_pStringTab.Init(path, true);
|
||||
}
|
||||
|
||||
[ContextMenu("Test Item Desc")]
|
||||
public void TestItemDesc()
|
||||
{
|
||||
if (m_pStringTab == null)
|
||||
{
|
||||
m_pStringTab = new CECStringTab();
|
||||
}
|
||||
|
||||
m_pStringTab.Clear();
|
||||
string path = Path.Combine(Application.streamingAssetsPath, "configs/item_desc.txt");
|
||||
m_pStringTab.Init(path, true);
|
||||
}
|
||||
|
||||
[ContextMenu("Test Fixed Message")]
|
||||
public void TestFixedMessage()
|
||||
{
|
||||
if (m_pStringTab == null)
|
||||
{
|
||||
m_pStringTab = new CECStringTab();
|
||||
}
|
||||
|
||||
m_pStringTab.Clear();
|
||||
string path = Path.Combine(Application.streamingAssetsPath, "configs/fixed_msg.txt");
|
||||
m_pStringTab.Init(path, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3dee7c1499b302c43ac95e29bd235e3f
|
||||
@@ -137,7 +137,9 @@ public class CECNPCMan : CECObject, IMsgHandler
|
||||
}
|
||||
case CommandID.NPC_INFO_00:
|
||||
{
|
||||
cmd_npc_info_00 pCmd = (cmd_npc_info_00)msg.dwParam1;
|
||||
var buffer = (byte[])msg.dwParam1;
|
||||
cmd_npc_info_00 pCmd = GPDataTypeHelper.FromBytes<cmd_npc_info_00>(buffer);
|
||||
//cmd_npc_info_00 pCmd = MemoryMarshal.Read<cmd_npc_info_00>(buffer.AsSpan(0, cmd_npc_info_00.));
|
||||
CECNPC pNPC = SeekOutNPC(pCmd.idNPC);
|
||||
if (pNPC)
|
||||
{
|
||||
|
||||
@@ -5,8 +5,8 @@ using WorkList = System.Collections.Generic.List<CECHPWork>;
|
||||
|
||||
public class CECHPWork : CECObjectWork
|
||||
{
|
||||
// Host work ID
|
||||
public static class Host_work_ID
|
||||
// Host work ID
|
||||
public static class Host_work_ID
|
||||
{
|
||||
public const int WORK_INVALID = -1,
|
||||
WORK_STAND = 0, // Stand and do nothing
|
||||
@@ -67,14 +67,14 @@ public class CECHPWork : CECObjectWork
|
||||
|
||||
// Operations
|
||||
// Override from CECObjectWork
|
||||
public virtual void Cancel()
|
||||
public virtual void Cancel()
|
||||
{
|
||||
|
||||
}
|
||||
// This work is do player moving ?
|
||||
public virtual bool IsMoving()
|
||||
{
|
||||
return false;
|
||||
public virtual bool IsMoving()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// Copy work data
|
||||
public virtual bool CopyData(CECHPWork pWork)
|
||||
@@ -231,7 +231,7 @@ public class CECHPWorkMan
|
||||
for (int i = (Work_priority.NUM_PRIORITY - 1); i >= 0; --i)
|
||||
{
|
||||
WorkList workList = m_WorkStack[i];
|
||||
if(workList != null)
|
||||
if (workList != null)
|
||||
{
|
||||
for (int j = 0; j < workList.Count; ++j)
|
||||
{
|
||||
@@ -251,7 +251,7 @@ public class CECHPWorkMan
|
||||
return result;
|
||||
}
|
||||
|
||||
bool InternallyStartWork(int iPriority, CECHPWork pWork)
|
||||
bool InternallyStartWork(int iPriority, CECHPWork pWork)
|
||||
{
|
||||
bool bStarted = false;
|
||||
if (CanRunSimultaneouslyWithCurrentWork(iPriority, pWork))
|
||||
@@ -448,13 +448,13 @@ public class CECHPWorkMan
|
||||
|
||||
}
|
||||
public CECHPWork GetDelayedWork()
|
||||
{
|
||||
return m_Delayed.pWork;
|
||||
{
|
||||
return m_Delayed.pWork;
|
||||
}
|
||||
|
||||
public bool ValidatePriority(int iPriority)
|
||||
{
|
||||
return iPriority >= 0 && iPriority < Work_priority.NUM_PRIORITY;
|
||||
return iPriority >= 0 && iPriority < Work_priority.NUM_PRIORITY;
|
||||
}
|
||||
|
||||
public bool StartWork(int iPriority, CECHPWork pWork, bool bNoDelay = false)
|
||||
@@ -538,7 +538,7 @@ public class CECHPWorkMan
|
||||
return true;
|
||||
}
|
||||
WorkList workList = m_WorkStack[iPriority];
|
||||
if(workList != null)
|
||||
if (workList != null)
|
||||
{
|
||||
for (int i = 0; i < workList.Count; ++i)
|
||||
{
|
||||
@@ -553,7 +553,7 @@ public class CECHPWorkMan
|
||||
|
||||
bool HasWorkOnPriority(int iPriority)
|
||||
{
|
||||
return ValidatePriority(iPriority) && m_WorkStack[iPriority] != null && m_WorkStack[iPriority].Count != 0;
|
||||
return ValidatePriority(iPriority) && m_WorkStack[iPriority] != null && m_WorkStack[iPriority].Count != 0;
|
||||
}
|
||||
|
||||
public void SetPostTickCommand(CECHPWorkPostTickCommand command)
|
||||
@@ -561,14 +561,16 @@ public class CECHPWorkMan
|
||||
m_pPostTickCommand = command;
|
||||
}
|
||||
|
||||
bool HasWorkRunningOnPriority(int iPriority){
|
||||
return HasWorkOnPriority(iPriority);
|
||||
}
|
||||
bool IsAnyWorkRunning(){
|
||||
return HasWorkRunningOnPriority(m_iCurPriority);
|
||||
}
|
||||
public bool HasWorkRunningOnPriority(int iPriority)
|
||||
{
|
||||
return HasWorkOnPriority(iPriority);
|
||||
}
|
||||
bool IsAnyWorkRunning()
|
||||
{
|
||||
return HasWorkRunningOnPriority(m_iCurPriority);
|
||||
}
|
||||
|
||||
public void Tick(float dwDeltaTime)
|
||||
public void Tick(float dwDeltaTime)
|
||||
{
|
||||
if (!IsAnyWorkRunning())
|
||||
{
|
||||
|
||||
@@ -574,7 +574,7 @@ public class CECHPWorkTrace : CECHPWork
|
||||
}
|
||||
|
||||
// Tick routine
|
||||
public virtual bool Tick(float dwDeltaTime)
|
||||
public override bool Tick(float dwDeltaTime)
|
||||
{
|
||||
base.Tick(dwDeltaTime);
|
||||
|
||||
@@ -599,15 +599,18 @@ public class CECHPWorkTrace : CECHPWork
|
||||
{
|
||||
if (IsGoodTimeToTouch())
|
||||
{
|
||||
if (m_pTraceObject.CanTouchFrom(m_pHost.GetPos()))
|
||||
{
|
||||
OnTouchTarget();
|
||||
return true;
|
||||
}
|
||||
OnTouchTarget();
|
||||
return true;
|
||||
//if (m_pTraceObject.CanTouchFrom(m_pHost.GetPos()))
|
||||
//{
|
||||
// OnTouchTarget();
|
||||
// return true;
|
||||
//}
|
||||
}
|
||||
}
|
||||
m_bCheckTouch = true;
|
||||
|
||||
return true; // TO DO: remove later
|
||||
if (!m_pHost.IsRooting())
|
||||
{
|
||||
// Continue tracing object
|
||||
@@ -870,6 +873,7 @@ public class CECHPWorkTrace : CECHPWork
|
||||
}
|
||||
|
||||
vCurPos = m_pHost.m_MoveCtrl.GroundMove(m_vCurDirH, m_pHost.GetGroundSpeed(), fDeltaTime, m_pHost.m_fVertSpeed);
|
||||
Debug.LogError(vCurPos);
|
||||
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
|
||||
//if (GetUseAutoPF() && CECIntelligentRoute::Instance().IsMoveOn())
|
||||
//{
|
||||
@@ -950,7 +954,7 @@ public class CECHPWorkTrace : CECHPWork
|
||||
}
|
||||
public A3DVECTOR3 GetCurMovingDest()
|
||||
{
|
||||
return new A3DVECTOR3();
|
||||
return m_pTraceObject.GetTargetPos();
|
||||
}
|
||||
public void UpdateUseAutoPF()
|
||||
{
|
||||
|
||||
@@ -64,7 +64,7 @@ public class CECObject : MonoBehaviour
|
||||
{
|
||||
m_dwBornStamp = 0;
|
||||
m_bBornInSight = false;
|
||||
m_bSelectable = false;
|
||||
//m_bSelectable = false;
|
||||
m_iCID = (int)Class_ID.OCID_OBJECT;
|
||||
}
|
||||
|
||||
|
||||
@@ -286,7 +286,7 @@ public class CECHostMove
|
||||
//int idInst = g_pGame.GetGameRun().GetWorld().GetInstanceID();
|
||||
//CECInstance pInstance = g_pGame.GetGameRun().GetInstance(idInst);
|
||||
//if (pInstance.GetLimitJump())
|
||||
fGravity *= 4.0f;
|
||||
//fGravity *= 4.0f;
|
||||
|
||||
CDR_INFO cdr = m_pHost.m_CDRInfo;
|
||||
var pos = m_pHost.m_aabbServer.Center;
|
||||
|
||||
@@ -29,17 +29,81 @@ public abstract class CECPlayer : CECObject
|
||||
protected ROLEBASICPROP m_BasicProps;
|
||||
public int m_iMoveEnv = Move_environment.MOVEENV_GROUND; // Move environment
|
||||
public bool m_bWalkRun;
|
||||
public A3DAABB m_aabbServer; // Óë·þÎñÆ÷±£³ÖÒ»ÖµÄaabb£¬ ²»ÊÜËõ·ÅÓ°Ïì
|
||||
protected bool m_bFashionMode;
|
||||
protected uint m_uAttackType;
|
||||
protected int m_iFashionWeaponType;
|
||||
protected bool m_bWeaponAttached;
|
||||
public CECModel m_pPlayerModel;
|
||||
|
||||
const int NUM_WEAPON_TYPE = 15;
|
||||
const byte COMACT_FLAG_MODE_ONCE_MULTIIGNOREGFX = 3;
|
||||
public A3DAABB m_aabbServer = new A3DAABB(); // Óë·þÎñÆ÷±£³ÖÒ»ÖµÄaabb£¬ ²»ÊÜËõ·ÅÓ°Ïì
|
||||
public A3DAABB m_aabb = new A3DAABB(); // Player's aabb£¬ÓÃÓÚÏÔʾµÄaabb£¬ÊÜËõ·ÅÓ°Ïì
|
||||
public int m_iProfession; // Profession
|
||||
public float m_fScaleBySkill;
|
||||
public int m_iGender; // Gender
|
||||
public MOVECONST m_MoveConst; // Const used when moving control
|
||||
|
||||
public MOVECONST[] aMoveConsts = new MOVECONST[PROFESSION.NUM_PROFESSION * GENDER.NUM_GENDER]
|
||||
{
|
||||
// ÎäÏÀ
|
||||
// fStepHei fMinAirHei fMinWaterHei fShoreDepth fWaterSurf
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ·¨Ê¦
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// Î×ʦ
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// Ñý¾«
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ÑýÊÞ
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.8f, 0.7f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
// ´Ì¿Í
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// Óðâ
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ÓðÁé
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ½£Áé
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ÷ÈÁé
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// Ò¹Ó°
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ÔÂÏÉ
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
};
|
||||
|
||||
public A3DVECTOR3[] aExts = new A3DVECTOR3[PROFESSION.NUM_PROFESSION * GENDER.NUM_GENDER]
|
||||
{
|
||||
new A3DVECTOR3(0.4f, 0.9f, 0.4f), // ÎäÏÀ
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ·¨Ê¦
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Î×ʦ
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Ñý¾«
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.5f, 1.05f, 0.5f), // ÑýÊÞ
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ´Ì¿Í
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Óðâ
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ÓðÁé
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ½£Áé
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ÷ÈÁé
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Ò¹Ó°
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ÔÂÏÉ
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
};
|
||||
|
||||
protected void Awake()
|
||||
{
|
||||
@@ -56,6 +120,15 @@ public abstract class CECPlayer : CECObject
|
||||
return m_PlayerInfo;
|
||||
}
|
||||
|
||||
public void CalcPlayerAABB()
|
||||
{
|
||||
int iIndex = m_iProfession * GENDER.NUM_GENDER + m_iGender;
|
||||
|
||||
m_aabb.Extents = aExts[iIndex] * m_fScaleBySkill;
|
||||
m_aabbServer.Extents = aExts[iIndex];
|
||||
m_MoveConst = aMoveConsts[iIndex];
|
||||
}
|
||||
|
||||
public static void InitStaticRes()
|
||||
{
|
||||
BuildActionList();
|
||||
|
||||
@@ -37,6 +37,7 @@ public class CECNPC : CECObject
|
||||
protected Vector3 m_vStopDir;
|
||||
protected ROLEEXTPROP m_ExtProps;
|
||||
protected CECNPCModelPolicy m_pNPCModelPolicy;
|
||||
|
||||
[SerializeField] protected float m_fMoveSpeed;
|
||||
[SerializeField] protected CharacterController _characterController;
|
||||
|
||||
@@ -902,6 +903,10 @@ public class CECNPC : CECObject
|
||||
|
||||
// Get NPC ID
|
||||
public int GetNPCID() { return m_NPCInfo.nid; }
|
||||
|
||||
// Get distance to host player
|
||||
public float GetDistToHost() { return m_fDistToHost; }
|
||||
public float GetDistToHostH() { return m_fDistToHostH; }
|
||||
}
|
||||
public enum WorkType
|
||||
{
|
||||
|
||||
@@ -1333,6 +1333,11 @@ namespace CSNetwork.S2CCommand
|
||||
{
|
||||
public byte pvp_mask;
|
||||
};
|
||||
|
||||
public struct cmd_select_target
|
||||
{
|
||||
public int id;
|
||||
};
|
||||
}
|
||||
|
||||
// Player and NPC state
|
||||
@@ -1274,5 +1274,10 @@ namespace CSNetwork.GPDataType
|
||||
GP_BLSMASK_NOALLIANCE = 0x0040,
|
||||
GP_BLSMASK_NOFORCE = 0x0080 // ÊÆÁ¦ÆÁ±Î
|
||||
};
|
||||
|
||||
public struct cmd_select_target
|
||||
{
|
||||
public int idTarget;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace CSNetwork
|
||||
private string _password;
|
||||
private int _currentUserId = -1; // To store the UserID after successful login
|
||||
private int m_iCharID;
|
||||
private int m_idLastSelTarget = 0; // ID of selected item last time
|
||||
|
||||
// State management for async operations and callbacks
|
||||
private Action<bool> _loginCallback;
|
||||
@@ -439,6 +440,12 @@ namespace CSNetwork
|
||||
case CommandID.ERROR_MESSAGE:
|
||||
_logger.Info($"### GameDataSend: ERROR_MESSAGE: {BitConverter.ToInt32(pDataBuf, 0)}");
|
||||
break;
|
||||
case CommandID.SELECT_TARGET:
|
||||
case CommandID.UNSELECT:
|
||||
|
||||
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_SELTARGET, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -770,5 +777,27 @@ namespace CSNetwork
|
||||
gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(CSNetwork.C2SCommand.CommandID.CANCEL_ACTION);
|
||||
SendProtocol(gamedatasend);
|
||||
}
|
||||
|
||||
public void c2s_CmdUnselect()
|
||||
{
|
||||
gamedatasend gamedatasend = new gamedatasend();
|
||||
gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(CSNetwork.C2SCommand.CommandID.UNSELECT);
|
||||
SendProtocol(gamedatasend);
|
||||
}
|
||||
|
||||
public void c2s_CmdSelectTarget(int idTarget)
|
||||
{
|
||||
// Set selection first before server returns, so as to reduce the player waiting time.
|
||||
CECHostPlayer pHost = EC_ManMessageMono.Instance.GetECManPlayer.GetHostPlayer();
|
||||
pHost.SetSelectedTarget(idTarget);
|
||||
|
||||
if (m_idLastSelTarget != idTarget)
|
||||
{
|
||||
gamedatasend gamedatasend = new gamedatasend();
|
||||
gamedatasend.Data = C2SCommandFactory.CreateSelectTarget(idTarget);
|
||||
SendProtocol(gamedatasend);
|
||||
m_idLastSelTarget = idTarget;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,6 +194,16 @@ namespace BrewMonster.Network
|
||||
Instance._gameSession.c2s_CmdCancelAction();
|
||||
}
|
||||
|
||||
public static void c2s_CmdUnselect()
|
||||
{
|
||||
Instance._gameSession.c2s_CmdUnselect();
|
||||
}
|
||||
|
||||
public static void c2s_CmdSelectTarget(int idTarget)
|
||||
{
|
||||
Instance._gameSession.c2s_CmdSelectTarget(idTarget);
|
||||
}
|
||||
|
||||
#region Task
|
||||
public static void c2s_CmdGetAllData(bool byPack, bool byEquip, bool byTask)
|
||||
{
|
||||
|
||||
@@ -22,87 +22,20 @@ namespace PerfectWorld.Scripts.Player
|
||||
long m_dwLastMoveTime = 0; // Last move command arrived time
|
||||
float m_fMoveSpeed; // Move speed
|
||||
OtherPlayer_Move_Info m_cdr = new OtherPlayer_Move_Info();
|
||||
float m_fDistToHost = 0f; // Distance to host player
|
||||
float m_fDistToHostH = 0f; // Horizontal distance to host player
|
||||
// 和服务器提供的 aabb,无法影响朝向 = The AABB provided by the server cannot affect the facing/orientation
|
||||
A3DAABB m_aabbServer = new A3DAABB();
|
||||
A3DAABB m_aabb = new A3DAABB(); // Player's aabb£¬ÓÃÓÚÏÔʾµÄaabb£¬ÊÜËõ·ÅÓ°Ïì
|
||||
string m_strName; // Player name
|
||||
int m_iProfession; // Profession
|
||||
int m_iGender; // Gender
|
||||
float m_fScaleBySkill = 1f;
|
||||
MOVECONST m_MoveConst; // Const used when moving control
|
||||
//A3DAABB m_aabbServer = new A3DAABB();
|
||||
//A3DAABB m_aabb = new A3DAABB(); // Player's aabb£¬ÓÃÓÚÏÔʾµÄaabb£¬ÊÜËõ·ÅÓ°Ïì
|
||||
//string m_strName; // Player name
|
||||
//int m_iProfession; // Profession
|
||||
//int m_iGender; // Gender
|
||||
//float m_fScaleBySkill = 1f;
|
||||
//MOVECONST m_MoveConst; // Const used when moving control
|
||||
//int m_iMoveEnv; // Move environment
|
||||
//bool m_bWalkRun; // Walk-run switch, 0-walk, 1-run
|
||||
//int m_iMoveMode; // Player's move mode
|
||||
|
||||
public MOVECONST[] aMoveConsts = new MOVECONST[PROFESSION.NUM_PROFESSION * GENDER.NUM_GENDER]
|
||||
{
|
||||
// ÎäÏÀ
|
||||
// fStepHei fMinAirHei fMinWaterHei fShoreDepth fWaterSurf
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ·¨Ê¦
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// Î×ʦ
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// Ñý¾«
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ÑýÊÞ
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.8f, 0.7f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
// ´Ì¿Í
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// Óðâ
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ÓðÁé
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ½£Áé
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ÷ÈÁé
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// Ò¹Ó°
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
// ÔÂÏÉ
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.6f, 0.6f),
|
||||
new MOVECONST(0.8f, 1.6f, 0.3f, 1.5f, 0.55f),
|
||||
};
|
||||
|
||||
public A3DVECTOR3[] aExts = new A3DVECTOR3[PROFESSION.NUM_PROFESSION * GENDER.NUM_GENDER]
|
||||
{
|
||||
new A3DVECTOR3(0.4f, 0.9f, 0.4f), // ÎäÏÀ
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ·¨Ê¦
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Î×ʦ
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Ñý¾«
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.5f, 1.05f, 0.5f), // ÑýÊÞ
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ´Ì¿Í
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Óðâ
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ÓðÁé
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ½£Áé
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ÷ÈÁé
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // Ò¹Ó°
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
new A3DVECTOR3(0.3f, 0.9f, 0.3f), // ÔÂÏÉ
|
||||
new A3DVECTOR3(0.3f, 0.85f, 0.3f),
|
||||
};
|
||||
|
||||
public void Init(RoleInfo roleInfo, info_player_1 Info)
|
||||
{
|
||||
m_iProfession = roleInfo.occupation;
|
||||
@@ -129,15 +62,6 @@ namespace PerfectWorld.Scripts.Player
|
||||
}
|
||||
}
|
||||
|
||||
void CalcPlayerAABB()
|
||||
{
|
||||
int iIndex = m_iProfession * GENDER.NUM_GENDER + m_iGender;
|
||||
|
||||
m_aabb.Extents = aExts[iIndex] * m_fScaleBySkill;
|
||||
m_aabbServer.Extents = aExts[iIndex];
|
||||
m_MoveConst = aMoveConsts[iIndex];
|
||||
}
|
||||
|
||||
public void MoveTo(cmd_object_move Cmd)
|
||||
{
|
||||
BrewMonster.BMLogger.Log("HoangDev : MoveToMoveTo");
|
||||
@@ -329,6 +253,8 @@ namespace PerfectWorld.Scripts.Player
|
||||
PlayAction(GetMoveStandAction(true), true, 1, false);
|
||||
}
|
||||
|
||||
public float GetDistToHost() { return m_fDistToHost; }
|
||||
|
||||
// Decompress horizontal direction
|
||||
A3DVECTOR3 glb_DecompressDirH(byte byDir)
|
||||
{
|
||||
@@ -429,6 +355,12 @@ namespace PerfectWorld.Scripts.Player
|
||||
private void Update()
|
||||
{
|
||||
MovingTo(Time.deltaTime);
|
||||
CECHostPlayer pHost = EC_ManMessageMono.Instance.GetECManPlayer.GetHostPlayer();
|
||||
if (pHost != null /*&& pHost->IsSkeletonReady()*/)
|
||||
{
|
||||
m_fDistToHost = CalcDist(pHost.GetPos(), true);
|
||||
m_fDistToHostH = CalcDist(pHost.GetPos(), false);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetPos(A3DVECTOR3 vPos)
|
||||
|
||||
@@ -13,7 +13,6 @@ using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using TMPro;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEditor.Experimental.GraphView;
|
||||
using UnityEngine;
|
||||
using UnityEngine.InputSystem;
|
||||
@@ -57,6 +56,7 @@ public class CECHostPlayer : CECPlayer
|
||||
Vector3 m_vLastSevPos;
|
||||
public CDR_INFO m_CDRInfo;
|
||||
public GNDINFO m_GndInfo;
|
||||
int m_idUCSelTarget; // Uncertificately selected object's ID
|
||||
public float m_fVertSpeed = 0f;
|
||||
|
||||
// ====== Ground cast config ======
|
||||
@@ -143,9 +143,10 @@ public class CECHostPlayer : CECPlayer
|
||||
CECNPC pNPC = EC_ManMessageMono.Instance._CECNPCMan.GetNPC(idObject);
|
||||
if (pNPC != null)
|
||||
{
|
||||
if (!pNPC.IsDead())
|
||||
if (!pNPC.IsDead()/* && m_idSelTarget == idObject*/)
|
||||
{
|
||||
idTraceTarget = idObject;
|
||||
idSelTarget = idObject;
|
||||
}
|
||||
if (idTraceTarget != 0)
|
||||
{
|
||||
@@ -162,6 +163,13 @@ public class CECHostPlayer : CECPlayer
|
||||
}
|
||||
}
|
||||
|
||||
// Tell server we select a target
|
||||
if (idSelTarget != 0 && m_idSelTarget != idSelTarget)
|
||||
{
|
||||
m_idUCSelTarget = idSelTarget;
|
||||
SelectTarget(m_idUCSelTarget);
|
||||
}
|
||||
|
||||
if (idTraceTarget != 0)
|
||||
{
|
||||
//if (m_pWorkMan.IsSitting())
|
||||
@@ -172,8 +180,8 @@ public class CECHostPlayer : CECPlayer
|
||||
// Trace a object
|
||||
if (iTraceReason == CECHPWorkTrace.Trace_reason.TRACE_ATTACK)
|
||||
{
|
||||
//if (!CanDo(CANDO_MELEE))
|
||||
// return;
|
||||
if (!CanDo(ActionCanDo.CANDO_MELEE))
|
||||
return;
|
||||
Debug.LogError("Attack");
|
||||
NormalAttackObject(idTraceTarget, bForceAttack);
|
||||
}
|
||||
@@ -204,6 +212,8 @@ public class CECHostPlayer : CECPlayer
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
m_pWorkMan?.Tick(Time.deltaTime);
|
||||
}
|
||||
public void StopMovement()
|
||||
{
|
||||
@@ -331,6 +341,8 @@ public class CECHostPlayer : CECPlayer
|
||||
case int value when value == EC_MsgDef.MSG_HST_PICKUPITEM:
|
||||
OnMsgHstPickupItem(Msg);
|
||||
break;
|
||||
case int value when value == EC_MsgDef.MSG_HST_SELTARGET:
|
||||
OnMsgHstSelTarget(Msg); break;
|
||||
case int value when value == EC_MsgDef.MSG_HST_ATKRESULT: OnMsgHstAttackResult(Msg); break;
|
||||
//case int value when value == EC_MsgDef.MSG_HST_ATTACKED: OnMsgHstAttacked(Msg); break;
|
||||
case int value when value == EC_MsgDef.MSG_HST_HURTRESULT: OnMsgHstHurtResult(Msg); break;
|
||||
@@ -696,9 +708,30 @@ public class CECHostPlayer : CECPlayer
|
||||
|
||||
}
|
||||
|
||||
// Message MSG_HST_SELTARGET handler
|
||||
void OnMsgHstSelTarget(ECMSG Msg)
|
||||
{
|
||||
if (Convert.ToInt32(Msg.dwParam2) == CommandID.SELECT_TARGET)
|
||||
{
|
||||
var data = (byte[])Msg.dwParam1;
|
||||
cmd_select_target pCmd = GPDataTypeHelper.FromBytes<cmd_select_target>(data);
|
||||
m_idSelTarget = pCmd.idTarget;
|
||||
m_idUCSelTarget = 0;
|
||||
}
|
||||
else if (Convert.ToInt32(Msg.dwParam2) == CommandID.UNSELECT)
|
||||
{
|
||||
m_idSelTarget = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetPos(Vector3 pos)
|
||||
{
|
||||
transform.position = pos;
|
||||
|
||||
m_aabb.Center = EC_Utility.ToA3DVECTOR3(pos) + new A3DVECTOR3(0.0f, m_aabb.Extents.y, 0.0f);
|
||||
m_aabb.CompleteMinsMaxs();
|
||||
m_aabbServer.Center = EC_Utility.ToA3DVECTOR3(pos) + new A3DVECTOR3(0.0f, m_aabbServer.Extents.y, 0.0f);
|
||||
m_aabbServer.CompleteMinsMaxs();
|
||||
}
|
||||
public void SetStatusRun(bool value)
|
||||
{
|
||||
@@ -729,6 +762,10 @@ public class CECHostPlayer : CECPlayer
|
||||
{
|
||||
visual.InitHostPlayerEventDoneHandler();
|
||||
}
|
||||
m_aabb.Center = GPDataTypeHelper.g_vOrigin;
|
||||
m_aabb.Extents.Set(0.3f, 0.9f, 0.3f);
|
||||
m_aabbServer = m_aabb;
|
||||
CalcPlayerAABB();
|
||||
|
||||
// Create work manager
|
||||
m_pWorkMan = new CECHPWorkMan(this);
|
||||
@@ -1160,6 +1197,302 @@ public class CECHostPlayer : CECPlayer
|
||||
public float GetFlySpeed() { return m_ExtProps.mv.flight_speed; }
|
||||
public float GetSwimSpeed() { return m_ExtProps.mv.swim_speed; }
|
||||
|
||||
bool SelectTarget(int idTarget)
|
||||
{
|
||||
bool bRet = false;
|
||||
bool canDo = CanDo(ActionCanDo.CANDO_CHANGESELECT);
|
||||
bool canselect = CanSelectTarget(idTarget);
|
||||
if (canDo && canselect)
|
||||
{
|
||||
bRet = true;
|
||||
if (idTarget == 0)
|
||||
UnityGameSession.c2s_CmdUnselect();
|
||||
else
|
||||
{
|
||||
UnityGameSession.c2s_CmdSelectTarget(idTarget);
|
||||
}
|
||||
}
|
||||
return bRet;
|
||||
}
|
||||
|
||||
bool CanSelectTarget(int idTarget)
|
||||
{
|
||||
if (idTarget == 0 || idTarget == this.GetCharacterID())
|
||||
{
|
||||
// 0 means unselect
|
||||
return true;
|
||||
}
|
||||
CECObject pTarget = null;
|
||||
if (GPDataTypeHelper.ISPLAYERID(idTarget))
|
||||
{
|
||||
EC_ElsePlayer pElsePlayer = (EC_ManMessageMono.Instance.GetECManPlayer.GetPlayer(idTarget)) as EC_ElsePlayer;
|
||||
if (pElsePlayer != null)
|
||||
{
|
||||
if (CanSafelySelect(pElsePlayer))
|
||||
{
|
||||
pTarget = pElsePlayer;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (GPDataTypeHelper.ISNPCID(idTarget))
|
||||
{
|
||||
CECNPC pNPC = EC_ManMessageMono.Instance._CECNPCMan.GetNPC(idTarget);
|
||||
if (pNPC != null)
|
||||
{
|
||||
if (CanSafelySelect(pNPC) && !pNPC.IsDead())
|
||||
{
|
||||
pTarget = pNPC;
|
||||
}
|
||||
}
|
||||
}
|
||||
return pTarget ? pTarget.IsSelectable() : false;
|
||||
}
|
||||
|
||||
|
||||
float SafelySelectDistance()
|
||||
{
|
||||
// ·þÎñÆ÷¶Ô SelectTarget ÓжîÍâ¾àÀëÏÞÖÆ£¬Èýά¾àÀë 150.0¡¢Ë®Æ½¾àÀë 125.0 ÒÔÉϵ쬶¼»áÎÞ·¨Ñ¡ÖÐ
|
||||
// »ùÓÚÒÔÉÏÔÒò£¬¿Í»§¶ËÑ¡Ôñ¶ÔÏó¡¢»òÕß¶ÔÒѾѡÔñµÄ¶ÔÏ󣬶¼È·±£ÆäÔÚ´ËÏÞÖÆ·¶Î§ÄÚ£¬¼´Ñ¡ÔñʱʹÓýÏС¾àÀë¼ì²â
|
||||
return 100.0f;
|
||||
}
|
||||
|
||||
bool CanSafelySelectWith(float fDistanceToHostPlayer)
|
||||
{
|
||||
return fDistanceToHostPlayer <= SafelySelectDistance();
|
||||
}
|
||||
|
||||
bool CanSafelySelect(EC_ElsePlayer pElsePlayer)
|
||||
{
|
||||
// IsSkeletonReady() Ϊ true ʱ, GetDistToHost() ²ÅΪÓÐЧÊý¾Ý
|
||||
// !IsSkeletonReady() ʱ£¬Ò²ÔÊÐíʹÓã¬Ä¿µÄÊDZÜÃâδ¿¼Âǵ½µÄÒâÍâÇé¿ö
|
||||
// ÏÂͬ
|
||||
return pElsePlayer && (/*!IsSkeletonReady() || */CanSafelySelectWith(pElsePlayer.GetDistToHost()));
|
||||
}
|
||||
|
||||
bool CanSafelySelect(CECNPC pNPC)
|
||||
{
|
||||
return pNPC && (/*!IsSkeletonReady() ||*/ CanSafelySelectWith(pNPC.GetDistToHost()));
|
||||
}
|
||||
|
||||
// Check whether host can do a behavior
|
||||
bool CanDo(int iThing)
|
||||
{
|
||||
bool bRet = true;
|
||||
|
||||
switch (iThing)
|
||||
{
|
||||
case ActionCanDo.CANDO_SITDOWN:
|
||||
|
||||
if (IsDead() /*|| IsAboutToDie() */|| IsJumping() /*|| IsTrading() || IsUsingTrashBox()*/ ||
|
||||
IsRooting() || /*IsReviving() || IsTalkingWithNPC() || IsChangingFace() ||*/
|
||||
!m_GndInfo.bOnGround /*|| GetBoothState() != 0 || m_iBuddyId || IsOperatingPet() || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsRidingOnPet() || GetShapeType() == PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_MOVETO:
|
||||
{
|
||||
if (IsDead() /*|| IsSitting() || IsTrading() || IsUsingTrashBox()*/ || IsRooting() /*||
|
||||
IsReviving() || IsTalkingWithNPC() || IsChangingFace() || IsUsingItem() ||
|
||||
GetBoothState() != 0 || m_bHangerOn || IsOperatingPet() || IsRebuildingPet() || IsPassiveMove()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
}
|
||||
case ActionCanDo.CANDO_MELEE:
|
||||
|
||||
if (IsDead() /*|| IsSitting() */|| m_idSelTarget == 0 || m_idSelTarget == m_PlayerInfo.cid ||
|
||||
IsJumping() || GPDataTypeHelper.ISMATTERID(m_idSelTarget) /*|| IsTrading() || IsReviving() ||
|
||||
IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace()*/ || CannotAttack() /*||
|
||||
GetBoothState() != 0 || m_iBuddyId || IsRidingOnPet() || IsOperatingPet() || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsPassiveMove()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_ASSISTSEL:
|
||||
|
||||
if (IsDead() || !GPDataTypeHelper.ISPLAYERID(m_idSelTarget) || m_idSelTarget == m_PlayerInfo.cid /*||
|
||||
!m_pTeam || !m_pTeam->GetMemberByID(m_idSelTarget) || m_iBuddyId || IsPassiveMove() ||
|
||||
m_playerLimits.test(PLAYER_LIMIT_NOCHANGESELECT)*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_FLY:
|
||||
|
||||
if (IsDead() || IsRooting() /*|| IsSitting() || IsTrading() || IsReviving() ||
|
||||
IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() || GetBoothState() != 0 ||
|
||||
IsFlashMoving() */|| m_pWorkMan.HasWorkRunningOnPriority(CECHPWorkMan.Work_priority.PRIORITY_2) /*||
|
||||
m_bHangerOn || IsOperatingPet() || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsRidingOnPet() || GetShapeType() == PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove() ||
|
||||
m_playerLimits.test(PLAYER_LIMIT_NOFLY) || m_BattleInfo.IsChariotWar()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_PICKUP:
|
||||
case ActionCanDo.CANDO_GATHER:
|
||||
|
||||
if (IsDead() /*|| IsAboutToDie() || IsSitting() || IsTrading() || IsUsingTrashBox() ||
|
||||
IsReviving() || IsTalkingWithNPC() || IsChangingFace() || GetBoothState() != 0 ||
|
||||
GetBuddyState() == 1 || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_TRADE:
|
||||
|
||||
if (IsDead() /*|| IsAboutToDie() || IsSitting() */|| IsJumping() /*|| IsMeleeing() ||
|
||||
IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
IsSpellingMagic() || GetBoothState() != 0 || m_iBuddyId || IsOperatingPet() || IsRebuildingPet() ||
|
||||
IsUsingItem() || IsInvisible() || IsPassiveMove()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
case ActionCanDo.CANDO_PLAYPOSE:
|
||||
|
||||
if (IsDead() /*|| IsAboutToDie() || IsSitting()*/ || IsJumping() ||/* IsMeleeing() ||
|
||||
IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
IsSpellingMagic() || IsShapeChanged() || IsReviving() ||*/ m_iMoveEnv != (int)MoveEnvironment.MOVEENV_GROUND /*||
|
||||
GetBoothState() != 0 || m_iBuddyId || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() ||
|
||||
IsRidingOnPet() || GetShapeType() == PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove() || m_BattleInfo.IsChariotWar()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
//case ActionCanDo.CANDO_SPELLMAGIC:
|
||||
// if (IsDead() || ISMATTERID(m_idSelTarget) || IsAboutToDie() || IsSitting() ||
|
||||
// IsJumping() || IsFlashMoving() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
// IsChangingFace() || CannotAttack() || IsReviving() || GetBoothState() != 0 ||
|
||||
// m_iBuddyId || IsRidingOnPet() || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
|
||||
case ActionCanDo.CANDO_SUMMONPET:
|
||||
|
||||
if (IsDead() || GPDataTypeHelper.ISMATTERID(m_idSelTarget) || /*IsAboutToDie() || IsSitting() ||*/
|
||||
IsJumping() || /*IsFlashMoving() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace() ||*/ CannotAttack() /*|| IsReviving() || GetBoothState() != 0 ||
|
||||
IsInvisible() || IsGMInvisible() || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove()
|
||||
|| m_BattleInfo.IsChariotWar()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
case ActionCanDo.CANDO_REBUILDPET:
|
||||
|
||||
if (IsDead() || GPDataTypeHelper.ISMATTERID(m_idSelTarget) /*|| IsAboutToDie() || IsSitting() */||
|
||||
IsJumping() /*|| IsFlashMoving() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
IsChangingFace()*/ || CannotAttack() /*|| IsReviving() || GetBoothState() != 0 ||
|
||||
m_iBuddyId || IsInvisible() || IsGMInvisible() || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove() ||
|
||||
IsPlayerMoving() || m_BattleInfo.IsChariotWar()*/)
|
||||
bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
//case ActionCanDo.CANDO_USEITEM:
|
||||
|
||||
// if (IsAboutToDie() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
// IsChangingFace() || GetBoothState() != 0 || IsPassiveMove() || m_BattleInfo.IsChariotWar())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
|
||||
//case ActionCanDo.CANDO_JUMP:
|
||||
// {
|
||||
// if (IsDead() ||
|
||||
// m_iJumpCount >= MAX_JUMP_COUNT ||
|
||||
// // cannot jump more than one time if shape mode is type2
|
||||
// (IsJumping() && (GetShapeType() == PLAYERMODEL_DUMMYTYPE2)) ||
|
||||
// IsJumpInWater() || m_iMoveEnv == MOVEENV_AIR || IsSitting() ||
|
||||
// IsMeleeing() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
// IsChangingFace() || IsReviving() || IsSpellingMagic() || IsPicking() ||
|
||||
// IsGathering() || IsRooting() || GetBoothState() != 0 || m_bHangerOn || (IsJumping() && IsRidingOnPet()) ||
|
||||
// IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove() || m_BattleInfo.IsChariotWar())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
// }
|
||||
//case ActionCanDo.CANDO_FOLLOW:
|
||||
// {
|
||||
// if (IsDead() || IsAboutToDie() || IsSitting() || IsMeleeing() || IsReviving() ||
|
||||
// IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
// IsSpellingMagic() || GetBoothState() != 0 || m_bHangerOn || IsOperatingPet() || IsRebuildingPet() ||
|
||||
// IsUsingItem() || IsPassiveMove())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
// }
|
||||
//case ActionCanDo.CANDO_BOOTH:
|
||||
|
||||
// if (IsDead() || IsAboutToDie() || IsPlayerMoving() || IsSitting() || IsReviving() ||
|
||||
// IsMeleeing() || IsJumping() || IsTrading() || IsUsingTrashBox() ||
|
||||
// IsTalkingWithNPC() || IsChangingFace() || IsSpellingMagic() || IsFlying() ||
|
||||
// IsUnderWater() || m_iBuddyId || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsRidingOnPet() || IsInvisible() ||
|
||||
// IsPassiveMove())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
|
||||
//case ActionCanDo.CANDO_FLASHMOVE:
|
||||
|
||||
// if (IsDead() || IsAboutToDie() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
// IsJumping() || IsFlashMoving() || IsFalling() || IsChangingFace() || GetBoothState() != 0 || IsTakingOff() ||
|
||||
// m_pWorkMan->HasWorkRunningOnPriority(CECHPWorkMan::PRIORITY_2) ||
|
||||
// m_iBuddyId || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
|
||||
//case ActionCanDo.CANDO_BINDBUDDY:
|
||||
|
||||
// if (IsDead() || IsAboutToDie() || IsJumping() || IsSitting() ||
|
||||
// IsMeleeing() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
// IsChangingFace() || IsReviving() || IsSpellingMagic() || IsPicking() ||
|
||||
// IsGathering() || IsRooting() || GetBoothState() != 0 ||
|
||||
// !m_pWorkMan->IsStanding() || m_iBuddyId ||
|
||||
// IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || GetShapeType() == PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove() ||
|
||||
// m_playerLimits.test(PLAYER_LIMIT_NOBIND))
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
|
||||
//case ActionCanDo.CANDO_DUEL:
|
||||
|
||||
// if (IsDead() || IsAboutToDie() || IsSitting() || IsFighting() || IsTrading() ||
|
||||
// IsReviving() || IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() ||
|
||||
// GetBoothState() != 0 || m_iBuddyId || m_pvp.iDuelState != DUEL_ST_NONE ||
|
||||
// IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove())
|
||||
// bRet = false;
|
||||
|
||||
// break;
|
||||
|
||||
case ActionCanDo.CANDO_CHANGESELECT:
|
||||
|
||||
//if (m_playerLimits.test(PLAYER_LIMIT_NOCHANGESELECT))
|
||||
// bRet = false;
|
||||
|
||||
break;
|
||||
|
||||
//case ActionCanDo.CANDO_SWITCH_PARALLEL_WORLD:
|
||||
// if (IsDead() || IsAboutToDie() || IsJumping() || IsFighting() ||
|
||||
// IsMeleeing() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() ||
|
||||
// IsChangingFace() || IsReviving() || IsSpellingMagic() || IsPicking() ||
|
||||
// IsGathering() || IsRooting() || GetBoothState() != 0 ||
|
||||
// m_iBuddyId || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() ||
|
||||
// GetShapeType() == PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove())
|
||||
// bRet = false;
|
||||
// break;
|
||||
}
|
||||
|
||||
return bRet;
|
||||
}
|
||||
|
||||
public void SetSelectedTarget(int id) { m_idSelTarget = id; }
|
||||
|
||||
//public float GetSwimSpeedSev()
|
||||
//{
|
||||
// float fSpeedSev = GetSwimSpeed();
|
||||
@@ -1244,4 +1577,31 @@ public struct GNDINFO
|
||||
public float fWaterHei; // Water height
|
||||
public A3DVECTOR3 vGndNormal; // Terrain normal
|
||||
public bool bOnGround; // On ground flag
|
||||
};
|
||||
};
|
||||
|
||||
// Behavior id used by CanDo()
|
||||
public static class ActionCanDo
|
||||
|
||||
{
|
||||
public const int CANDO_SITDOWN = 0,
|
||||
CANDO_MOVETO = 1,
|
||||
CANDO_MELEE = 2,
|
||||
CANDO_ASSISTSEL = 3,
|
||||
CANDO_FLY = 4,
|
||||
CANDO_PICKUP = 5,
|
||||
CANDO_TRADE = 6,
|
||||
CANDO_PLAYPOSE = 7,
|
||||
CANDO_SPELLMAGIC = 8,
|
||||
CANDO_USEITEM = 9,
|
||||
CANDO_JUMP = 10,
|
||||
CANDO_FOLLOW = 11,
|
||||
CANDO_GATHER = 12,
|
||||
CANDO_BOOTH = 13,
|
||||
CANDO_FLASHMOVE = 14,
|
||||
CANDO_BINDBUDDY = 15,
|
||||
CANDO_DUEL = 16,
|
||||
CANDO_SUMMONPET = 17,
|
||||
CANDO_CHANGESELECT = 18,
|
||||
CANDO_REBUILDPET = 19,
|
||||
CANDO_SWITCH_PARALLEL_WORLD = 20;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e6d11b7855791e740ba22f037c41f0d9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,54 @@
|
||||
1 -3023.42 218.73 3804.07 -2315.22 251.55 4416.35
|
||||
2 -1922.07 217.27 4276.7 -1194.75 220.13 4256.25
|
||||
3 -856.27 219.49 3957.78 -355.67 237.19 3916.26
|
||||
4 897.03 219.1 4351.59 35.11 219.65 3989.86
|
||||
5 1549.96 243.59 3865.42 1243.7 219.07 4543.64
|
||||
6 2453.35 228.05 4307.06 2715.47 247.63 4105.12
|
||||
7 -2510.53 218.28 2802.99 -2402.91 218.09 3356.69
|
||||
8 -1557.7 218.62 2583.67 -1349.28 264.35 2927.5
|
||||
9 -212.46 220.38 2724.44 -654.49 222.47 3541.15
|
||||
10 197.31 248.51 3087.58 483.42 222.32 2844.72
|
||||
11 2038.49 218.29 3936.27 1578.52 229 3672.47
|
||||
12 1745.09 273.48 2860.03 1602.8 218.98 3481.97
|
||||
13 2343.84 219.9 2511.81 2266.59 221.58 1991.78
|
||||
14 -2591.45 218.19 2454.08 -2261.2 218.91 1746.06
|
||||
15 -1860.3 218.36 2139.75 -1150.03 245.14 1773.89
|
||||
16 -791.97 214.17 2471.02 -129.35 224.08 2081.36
|
||||
17 368.38 219.54 2182.4 279.82 221.15 1761.76
|
||||
18 2011.77 222.19 2400.27 1294.64 336.56 2261.45
|
||||
19 -2292.16 469.47 1185.61 -2842.81 528.89 760.08
|
||||
20 -1674.26 220.34 435.34 -1905.86 229.63 -61.49
|
||||
21 -557.8 413.98 831.01 -21.79 219.42 972.1
|
||||
22 147.18 216.57 1146.07 462.83 231.23 764.32
|
||||
23 1470.78 220.53 645.87 1079.88 221.18 1256.26
|
||||
24 2846.67 217.35 953.47 2413.6 218.71 537.18
|
||||
25 -2957.37 520.29 -272.5 -2225.5 523.78 377.31
|
||||
26 -2025.75 219.2 -375.8 -1894.25 226.35 -192.02
|
||||
27 -993.31 522.37 20.72 -521.16 522.2 489.45
|
||||
28 -285.09 234.15 465.15 -607.3 219.14 -489.76
|
||||
29 646.27 218.46 -271.57 471.1 216.63 380.43
|
||||
30 358.89 218.47 -463.42 492.2 222.58 -109.62
|
||||
31 1271.29 244.23 224.86 1048.12 238.15 -293.67
|
||||
32 2447.06 219.6 -145.47 2778.47 220.67 213.79
|
||||
33 -2149.01 525.18 -1064.02 -2852.9 524.33 -1270.3
|
||||
34 -1702.3 522.73 -1141.74 -1140.11 522.96 -868.99
|
||||
35 -127.76 218.48 -1512.58 -539.96 219.56 -870.73
|
||||
36 25.99 218.68 -833.9 543.07 218.09 -808.75
|
||||
37 1463.93 219.4 -1472.2 1737.68 218.85 -947.34
|
||||
38 2451.27 219.75 -1456.2 2584.51 221.31 -677.67
|
||||
39 -2344.41 523.96 -1576.39 -2819 524.02 -2181.16
|
||||
40 -1160.61 219.03 -2087.02 -1833.15 504.52 -2360.84
|
||||
41 -479.77 218.9 -2059.16 -828.94 216.61 -2484.79
|
||||
42 958.61 219.02 -2082.36 130.06 219.85 -2275.24
|
||||
43 1065.01 218.99 -2207.16 1594.66 220.67 -2471.93
|
||||
44 2310.6 219.28 -1578.46 2532.92 220.95 -1665.75
|
||||
45 2827.66 225.81 -3084.25 2360.43 217.55 -3279.74
|
||||
46 1579.91 245.92 -4094.02 1594.13 248.55 -3849.75
|
||||
47 2453.18 245.07 -3711.65 2865.72 217.89 -4411.53
|
||||
48 -2153.87 204.16 -3154.12 -2573.45 217.27 -3501.96
|
||||
49 -1297.92 216.52 -2908.71 -1716.92 232.57 -2805.03
|
||||
50 -642.59 216.87 -3442.9 -550.52 218.04 -2764.84
|
||||
51 226.82 241.05 -3121.08 880.44 239.78 -3066.87
|
||||
52 3337.821 230.013 3998.825 3717.706 253.014 3667.437
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bccfbf7d03830734fb6cd82a31536791
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 06d9a02a2d455104d9b49c78ed8fc6d3
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 22d591e6986fa6c4ab705ee890953236
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0b095c8d0e089f747a289d8e6c7b693e
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5429be2b686cda24e8f5ab2049a68b27
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,139 @@
|
||||
//物品id 喊话id 显示参数 喊话次数(默认为1) 喊话间隔
|
||||
//如果出现同一物品id对应不同的喊话id,程序中将只取靠后的那个喊话id
|
||||
//参数含义(3: 先显示物品名再显示玩家名,2:先显示玩家名再显示物品名,1:显示玩家名,0:都不显示);
|
||||
//0 都不显示
|
||||
//1 显示玩家名
|
||||
//2 先显示玩家名再显示物品名
|
||||
//3 先显示物品名再显示玩家名
|
||||
//4 显示顺序:服务器-玩家-道具
|
||||
//5 显示顺序:道具-服务器-玩家
|
||||
//6 显示顺序:服务器-玩家
|
||||
//7 显示顺序:服务器
|
||||
|
||||
//本服喊话ID对照
|
||||
11599 4521 2
|
||||
11600 4522 2
|
||||
12227 4523 1
|
||||
12265 4524 2
|
||||
12264 4525 2
|
||||
12266 4526 2
|
||||
12769 4527 2
|
||||
12719 4528 2
|
||||
12646 4529 2
|
||||
12647 4529 2
|
||||
12648 4529 2
|
||||
12649 4529 2
|
||||
12650 4529 2
|
||||
12651 4529 2
|
||||
13548 4648 0
|
||||
13565 4665 0
|
||||
13566 4666 0
|
||||
13567 4667 0
|
||||
13568 4668 0
|
||||
13569 4669 0
|
||||
13570 4670 0
|
||||
13571 4671 0
|
||||
13572 4672 0
|
||||
13573 4673 0
|
||||
13574 4674 0
|
||||
13575 4675 0
|
||||
13576 4676 0
|
||||
13577 4677 0
|
||||
13578 4678 0
|
||||
13579 4679 0
|
||||
13580 4680 0
|
||||
13581 4681 0
|
||||
13582 4682 0
|
||||
13583 4683 0
|
||||
13584 4684 0
|
||||
13585 4685 0
|
||||
13586 4686 0
|
||||
13587 4687 0
|
||||
13588 4688 0
|
||||
13589 4689 0
|
||||
13590 4690 0
|
||||
13591 4691 0
|
||||
13592 4692 0
|
||||
13593 4693 0
|
||||
13594 4694 0
|
||||
13595 4695 0
|
||||
13596 4696 0
|
||||
13597 4697 0
|
||||
13598 4698 0
|
||||
13599 4699 0
|
||||
13600 4700 0
|
||||
14290 4532 1
|
||||
20853 4533 3
|
||||
20255 4534 3
|
||||
20289 4535 3
|
||||
21065 4536 3
|
||||
20311 4537 3
|
||||
20852 4538 3
|
||||
20218 4539 3
|
||||
20402 4540 3
|
||||
20851 4541 3
|
||||
20394 4542 3
|
||||
20363 4543 3
|
||||
26061 4544 3
|
||||
26053 4545 3
|
||||
28607 4546 2
|
||||
29453 4547 3
|
||||
30207 4548 3
|
||||
44960 4549 3
|
||||
45043 4550 3
|
||||
48694 4551 3
|
||||
48695 4551 3
|
||||
48696 4552 3
|
||||
48697 4552 3
|
||||
50139 4554 2
|
||||
50145 4554 2
|
||||
50151 4554 2
|
||||
50157 4554 2
|
||||
50163 4554 2
|
||||
50169 4554 2
|
||||
50175 4554 2
|
||||
50181 4554 2
|
||||
50187 4554 2
|
||||
50193 4554 2
|
||||
50199 4554 2
|
||||
50205 4554 2
|
||||
50211 4554 2
|
||||
50217 4554 2
|
||||
50223 4554 2
|
||||
50229 4554 2
|
||||
50140 4555 2
|
||||
50146 4555 2
|
||||
50152 4555 2
|
||||
50158 4555 2
|
||||
50164 4555 2
|
||||
50170 4555 2
|
||||
50176 4555 2
|
||||
50182 4555 2
|
||||
50188 4555 2
|
||||
50194 4555 2
|
||||
50200 4555 2
|
||||
50206 4555 2
|
||||
50212 4555 2
|
||||
50218 4555 2
|
||||
50224 4555 2
|
||||
50230 4555 2
|
||||
|
||||
//跨服喊话ID对照
|
||||
49647 4801 4
|
||||
50702 4802 6
|
||||
50704 4803 6
|
||||
50706 4804 6
|
||||
50708 4805 6
|
||||
50710 4806 6
|
||||
50712 4807 6
|
||||
50714 4808 6
|
||||
50716 4809 6
|
||||
50718 4810 6
|
||||
50720 4811 6
|
||||
50722 4812 6
|
||||
50724 4813 6
|
||||
50726 4814 6
|
||||
50728 4815 6
|
||||
50730 4816 6
|
||||
50732 4817 6
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 76f11583e7abe3e4bbf976a45f946fe7
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6ee4a110a33412e4aa3f879764bec33b
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user