diff --git a/Assets/PerfectWorld/Scripts/Common/AWScriptFile.cs b/Assets/PerfectWorld/Scripts/Common/AWScriptFile.cs new file mode 100644 index 0000000000..ad3eb9d2d9 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Common/AWScriptFile.cs @@ -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; + } + + /// + /// Get next token and move file pointer forward. + /// + /// true, search next token until it is found or all buffer has been checked;
false, only search next token in current line + /// true for success, otherwise return false + 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; + } + + /// + /// Peek next token and don't move file pointer + /// Return true for success, otherwise return false + /// + /// true, search next token until it is found or all buffer has been checked; false, only search next token in current line + 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)); + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Common/AWScriptFile.cs.meta b/Assets/PerfectWorld/Scripts/Common/AWScriptFile.cs.meta new file mode 100644 index 0000000000..4eb59f260a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Common/AWScriptFile.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2c2c2e6c750c64c4fb852e667a353b22 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Common/EC_StringTab.cs b/Assets/PerfectWorld/Scripts/Common/EC_StringTab.cs new file mode 100644 index 0000000000..985a0f79bf --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Common/EC_StringTab.cs @@ -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 m_AStrTab = new Dictionary(); + private Dictionary m_WStrTab = new Dictionary(); + + 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; + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Common/EC_StringTab.cs.meta b/Assets/PerfectWorld/Scripts/Common/EC_StringTab.cs.meta new file mode 100644 index 0000000000..672eb34c76 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Common/EC_StringTab.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b95d268e43a5da14f9cf8e1ed98bfd73 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Common/StringTabTest.cs b/Assets/PerfectWorld/Scripts/Common/StringTabTest.cs new file mode 100644 index 0000000000..3babe721d3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Common/StringTabTest.cs @@ -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); + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Common/StringTabTest.cs.meta b/Assets/PerfectWorld/Scripts/Common/StringTabTest.cs.meta new file mode 100644 index 0000000000..908c1a6476 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Common/StringTabTest.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3dee7c1499b302c43ac95e29bd235e3f \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs index 9b716a501a..941257fdb8 100644 --- a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs +++ b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs @@ -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(buffer); + //cmd_npc_info_00 pCmd = MemoryMarshal.Read(buffer.AsSpan(0, cmd_npc_info_00.)); CECNPC pNPC = SeekOutNPC(pCmd.idNPC); if (pNPC) { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs index b603c779c4..14f1895208 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs @@ -5,8 +5,8 @@ using WorkList = System.Collections.Generic.List; 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()) { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs index 3ad2080f30..31e56cc2d4 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs @@ -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() { diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs index 7e17d81164..c77b1b4136 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs @@ -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; } diff --git a/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs b/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs index 5825457d0b..3589a2b441 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs @@ -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; diff --git a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs index b931fc9ce2..82af2e2e98 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs @@ -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(); diff --git a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs index 5b57c77e9c..4ec062951a 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs @@ -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 { diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs index 1c95c8594f..d5443fdb14 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs @@ -1333,6 +1333,11 @@ namespace CSNetwork.S2CCommand { public byte pvp_mask; }; + + public struct cmd_select_target + { + public int id; + }; } // Player and NPC state \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs index 2726d54f64..1b516eac83 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs @@ -1274,5 +1274,10 @@ namespace CSNetwork.GPDataType GP_BLSMASK_NOALLIANCE = 0x0040, GP_BLSMASK_NOFORCE = 0x0080 // ÊÆÁ¦ÆÁ±Î }; + + public struct cmd_select_target + { + public int idTarget; + }; } diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs index 4efd518b34..5ea91ffe58 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -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 _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; + } + } } } diff --git a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs index 8a6928689e..07f37b5c83 100644 --- a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs @@ -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) { diff --git a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs index 5d124ade08..c784cddac4 100644 --- a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs +++ b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs @@ -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) diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index 862116220c..2047b6345b 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -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(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 -}; \ No newline at end of file +}; + +// 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; +} \ No newline at end of file diff --git a/Assets/StreamingAssets/configs.meta b/Assets/StreamingAssets/configs.meta new file mode 100644 index 0000000000..36d8547f86 --- /dev/null +++ b/Assets/StreamingAssets/configs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e6d11b7855791e740ba22f037c41f0d9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/StreamingAssets/configs/faction_pvp.txt b/Assets/StreamingAssets/configs/faction_pvp.txt new file mode 100644 index 0000000000..aecf7461ec --- /dev/null +++ b/Assets/StreamingAssets/configs/faction_pvp.txt @@ -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 + + diff --git a/Assets/StreamingAssets/configs/faction_pvp.txt.meta b/Assets/StreamingAssets/configs/faction_pvp.txt.meta new file mode 100644 index 0000000000..218f5f74fa --- /dev/null +++ b/Assets/StreamingAssets/configs/faction_pvp.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bccfbf7d03830734fb6cd82a31536791 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/StreamingAssets/configs/fixed_msg.txt b/Assets/StreamingAssets/configs/fixed_msg.txt new file mode 100644 index 0000000000..e03822c138 Binary files /dev/null and b/Assets/StreamingAssets/configs/fixed_msg.txt differ diff --git a/Assets/StreamingAssets/configs/fixed_msg.txt.meta b/Assets/StreamingAssets/configs/fixed_msg.txt.meta new file mode 100644 index 0000000000..8130370cf5 --- /dev/null +++ b/Assets/StreamingAssets/configs/fixed_msg.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 06d9a02a2d455104d9b49c78ed8fc6d3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/StreamingAssets/configs/item_desc.txt b/Assets/StreamingAssets/configs/item_desc.txt new file mode 100644 index 0000000000..325a9b7f89 Binary files /dev/null and b/Assets/StreamingAssets/configs/item_desc.txt differ diff --git a/Assets/StreamingAssets/configs/item_desc.txt.meta b/Assets/StreamingAssets/configs/item_desc.txt.meta new file mode 100644 index 0000000000..0120cfd215 --- /dev/null +++ b/Assets/StreamingAssets/configs/item_desc.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 22d591e6986fa6c4ab705ee890953236 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/StreamingAssets/configs/item_ext_desc.txt b/Assets/StreamingAssets/configs/item_ext_desc.txt new file mode 100644 index 0000000000..fca4c160ff Binary files /dev/null and b/Assets/StreamingAssets/configs/item_ext_desc.txt differ diff --git a/Assets/StreamingAssets/configs/item_ext_desc.txt.meta b/Assets/StreamingAssets/configs/item_ext_desc.txt.meta new file mode 100644 index 0000000000..55a0bfdba3 --- /dev/null +++ b/Assets/StreamingAssets/configs/item_ext_desc.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0b095c8d0e089f747a289d8e6c7b693e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/StreamingAssets/configs/item_ext_prop.txt b/Assets/StreamingAssets/configs/item_ext_prop.txt new file mode 100644 index 0000000000..4f59ca27e9 --- /dev/null +++ b/Assets/StreamingAssets/configs/item_ext_prop.txt @@ -0,0 +1,1670 @@ +/* Element Ա + +Ͷʹ byte ʾ255 Ϊδ֪ + +Ͷ壺 + + 0: + 1: + 2: (%) + 3: ħ + 4: ħ + 5: ħ(%) + 6: +-﹥ + 7: +﹥- + 8: +ħ-ħ + 9: ٶ +10: +11: ʱ + +12: +13: (%) +14: з +15: +16: (%) +17: ľ +18: ľ(%) +19: ˮ +20: ˮ(%) +21: +22: (%) +23: +24: (%) +25: +(%)-(%) +26: +ľ(%)-(%) +27: +ˮ(%)-(%) +28: +(%)-ˮ(%) +29: +(%)-ľ(%) +30: +- +31: +ľ- +32: +ˮ- +33: +-ˮ +34: +-ľ + +35: HP +36: MP +37: HP(%) +38: MP(%) +39: HPָٶ +40: MPָٶ +41: Χ +42: ݷΧ +43: Χ +44: Χ + +45: һ +46: +47: (%) +48: ƶٶ +49: ƶٶ(%) +50: +51: (%) +52: ;ö +53: ;ö(%) +54: +55: Ӽ +56: װ +57: δ֪ +58: ֵӳ +59: ȼ +60: ȼ +61: з(%) +62: ֮ +63: +64: ϵ(%) +65: ľϵ(%) +66: ˮϵ(%) +67: ϵ(%) +68: ϵ(%) +69: м(%) +70: ȼΧֵã +71: ȼΧֵã +72: һ(%)Χֵã +73: HPΧֵã +74: MPΧֵã +75: (%)Χֵã +76: Χֵã +77: зΧֵã +78: (%)Χֵã +79: м(%)Χֵã +80: ʱ(%)Χֵã +81: 뷶Χֵã +82: MPָٶȷΧֵã +83: (%)Χֵã +84: з(%)Χֵã +85: HPָٶȷΧֵã +86: Χֵã +87: ޷Χֵã +88: ħ޷Χֵã +90: ħȼ +91: ħȼ +92: ++ħ +93: ɫHP +94: ɫHPΧ +95: +96: +97: +98: +99: ɫMP +160: ǹ̶ֵ +161: ̣ +162: ħ̣ +163: ̣ +164: з̣ +165: ̣ +166: ǣ̣ +167: ̣ +168: ḷ̌ +169: ˮ̣ +170: ̣ +171: ̣ +172: У̣ +173: ȣ̣ +174: ̣ +175: ȼ̣ +176: ħȼ̣ + +װͶ壺 + +150: һ+1% +151: һ+2% +152: һ+3% +153: һ+4% +154: һ+5% +155: һ+6% +156: װ + +Ͷ壺 + +200: +201: ħ +202: +203: +204: ľ +205: ˮ +206: +207: +208: HP +209: +210: з +211: & ħ +212: & ħ + +ĥʯͶ壺 + +100: ĥʯ +101: ĥʯ +102: ĥʯħ +103: ĥʯħ +104: ĥʯ +105: ĥʯHP +106: ĥʯ +107: ĥʯ +108: ĥʯ +109: ĥʯ +110: ĥʯһ(%) +111: ĥʯȼ +112: ĥʯȼ +113: ĥʯʱ +114: ĥʯħ +115: ĥʯ˼ + +ԿͶ + +120: Կ̽ +121: Կľ +122: Կˮ +123: Կ̻ +124: Կ +125: Կ +126: Կ̶ +127: Կ +128: Կ +129: Կ +130: Կ +131: Կ +132: ԿHP +133: Կ +134: Կз +135: Կ +136: Կħ +137: Կ̽ϵ(%) +138: Կľϵ(%) +139: Կˮϵ(%) +140: Կ̻ϵ(%) +141: Կϵ(%) +142: Կм(%) +143: Կһ +144: Կ̹ȼ +145: Կ̷ȼ +146: Կ + +*/ + +// 0: +type: 0 +{ + 411, 413, 415, 476, 478, + 481, 753, 754, 756, 755, + 757, 758, 759, 760, 761, + 762, 763, 1009, 1008, 1007, + 1006, 784, 785, 786, 787, + 788, 789, 790, 791, 792, + 793, 794, 994, 995, 996, + 997, 1401, 1402, 1403, 1404, + 1405, 341, 342, 343, 586, + 848, 849, 850, 852, 857, + 858, 859, 860, 855, 1011, + 1010, 1012, 1013, 2020, 2022, + 3036, 3040, +} + +// 1: +type: 1 +{ + 412, 414, 416, 764, 765, + 766, 767, 768, 769, 770, + 771, 772, 773, 774, 1003, + 1004, 1005, 1002, 795, 796, + 797, 798, 799, 800, 801, + 802, 803, 804, 805, 1001, + 1000, 999, 998, 3026, +} + +// 2: (%) +type: 2 +{ + 417, 418, 419, 775, 344, + 2221, 2222, 2223, 2224, 2225, + 2226, 2227, 2228, 2229, 2248, + 2249, 2250, 2251, 2252, 2253, + 2254, 2255, 2256, +} + +// 3: ħ +type: 3 +{ + 422, 434, 436, 483, 485, + 488, 809, 810, 811, 813, + 814, 815, 816, 817, 818, + 820, 821, 990, 991, 992, + 993, 348, 349, 350, 588, + 885, 886, 887, 889, 890, + 891, 892, 893, 895, 1018, + 1019, 1020, 1022, 1423, 1424, + 1425, 1426, 1427, 2023, 3038, + 3042, +} + +// 4: ħ +type: 4 +{ + 423, 435, 437, 822, 823, + 824, 825, 826, 827, 828, + 829, 830, 831, 832, 989, + 988, 987, 986, 3028, +} + +// 5: ħ(%) +type: 5 +{ + 438, 439, 440, 835, 351, + 2230, 2231, 2232, 2233, 2234, + 2235, 2236, 2237, 2238, 2257, + 2258, 2259, 2260, 2261, 2262, + 2265, 2266, 2267, +} + +// 6: +-﹦ +type: 6 +{ + 316, 317, 318, 319, 320, +} + +// 7: +﹦- +type: 7 +{ + 345, 346, 347, 587, 862, + 863, 864, 865, 867, 868, + 869, 870, 871, 1014, 1015, + 1016, 1017, +} + +// 8: +ħ-ħ +type: 8 +{ + 352, 353, 354, 589, 896, + 897, 898, 899, 900, 901, + 902, 903, 905, 1026, 1025, + 1024, 1023, +} + +// 9: ٶ +type: 9 +{ + 420, 421, 331, 337, 338, + 339, 1901, 1904, 2012, 2013, + 2014, +} + +// 10: +type: 10 +{ + 471, 1422, +} + +// 11: ʱ +type: 11 +{ + 441, 442, 443, 444, 1417, + 332, 333, 334, 335, 355, + 594, 595, 1428, 1449, 1511, + 1518, 1907, 2007, 2008, 2009, + 2010, 2011, 2148, 2914, + 3111, +} + +// 12: +type: 12 +{ + 477, 479, 482, 1244, 1245, + 1246, 1247, 1248, 1249, 1250, + 1251, 1252, 1253, 1254, 1255, + 1256, 1257, 1420, 216, 217, + 218, 219, 220, 590, 598, + 599, 600, 601, 652, 653, + 654, 655, 656, 657, 658, + 659, 660, 661, 1058, 1057, + 1056, 1055, 359, 360, 361, + 909, 910, 911, 912, 913, + 914, 915, 916, 917, 918, + 919, 1027, 1028, 1029, 1030, + 3032, 3136, 3137, 3138, 3139, + 3199, +} + +// 13: (%) +type: 13 +{ + 221, 222, 223, 224, 225, + 2102, 2103, 2104, 2105, 2106, + 2107, 2108, 2167, 2168, 2169, + 2170, 2171, 2172, 2173, 2174, + 2175, +} + +// 14: з +type: 14 +{ + 484, 486, 489, 306, 307, + 308, 309, 310, 380, 381, + 382, 1565, 2109, 2110, 2111, + 2112, 2113, 2114, 2115, 2116, + 3034, 3140, 3141, 3142, 3143, + 3200, +} + +// 15: +type: 15 +{ + 226, 227, 228, 229, 230, + 365, 366, 367, 1519, 1520, + 1521, 1524, 1527, 1528, 1530, + 1531, 1534, 1535, 1537, 1539, + 1541, 1542, 1544, 1523, 1525, + 1526, 1529, 1532, 1533, 1536, + 1538, 1540, 1545, 1547, 1687, + 1551, 1554, 1557, 1560, 1563, +} + +// 16: (%) +type: 16 +{ + 231, 232, 233, 234, 235, + 2194, 2195, 2196, 2197, 2198, + 2199, 2200, 2201, 2202, +} + +// 17: ľ +type: 17 +{ + 236, 237, 238, 239, 240, + 368, 369, 370, 1546, 1549, + 1550, 1552, 1553, 1555, 1556, + 1558, 1559, 1561, 1562, 1564, + 1566, 1567, 1568, 1569, 1571, + 1574, 1576, 1579, 1582, 1584, + 1588, 1590, 1593, 1595, 1598, + 1600, 1603, 1605, 1608, 1610, + 1611, +} + +// 18: ľ(%) +type: 18 +{ + 424, 425, 426, 427, 428, + 2185, 2186, 2187, 2188, 2189, + 2190, 2191, 2192, 2193, +} + +// 19: ˮ +type: 19 +{ + 429, 430, 431, 432, 433, + 371, 372, 373, 1570, 1572, + 1573, 1575, 1577, 1578, 1580, + 1581, 1583, 1585, 1586, 1587, + 1589, 1591, 1592, 1616, 1619, + 1621, 1623, 1626, 1628, 1630, + 1633, 1634, 1635, 1636, 1637, + 1639, 1641, 1644, 1646, 1648, + 1650, +} + +// 20: ˮ(%) +type: 20 +{ + 241, 242, 243, 244, 245, + 2212, 2213, 2214, 2215, 2216, + 2217, 2218, 2219, 2220, +} + +// 21: +type: 21 +{ + 246, 247, 248, 249, 250, + 374, 375, 376, 1594, 1596, + 1597, 1599, 1601, 1602, 1604, + 1606, 1607, 1609, 1612, 1613, + 1614, 1617, 1618, 1651, 1652, + 1653, 1654, 1655, 1656, 1657, + 1658, 1659, 1660, 1661, 1662, + 1663, 1664, 1665, 1666, 1667, + 1668, +} + +// 22: (%) +type: 22 +{ + 251, 252, 253, 254, 255, + 2176, 2177, 2178, 2179, 2180, + 2181, 2182, 2183, 2184, +} + +// 23: +type: 23 +{ + 256, 257, 258, 259, 260, + 377, 378, 379, 1620, 1622, + 1624, 1625, 1627, 1629, 1631, + 1632, 1638, 1640, 1642, 1643, + 1645, 1647, 1649, 1669, 1670, + 1671, 1672, 1673, 1674, 1675, + 1676, 1677, 1678, 1679, 1680, + 1681, 1682, 1683, 1684, 1685, + 1686, + +} + +// 24: (%) +type: 24 +{ + 261, 262, 263, 264, 265, + 2203, 2204, 2205, 2206, 2207, + 2208, 2209, 2210, 2211, +} + +// 25: +(%)-(%) +type: 25 +{ + 527, 528, 529, 530, 531, +} + +// 26: +ľ(%)-(%) +type: 26 +{ + 532, 533, 534, 535, 536, +} + +// 27: +ˮ(%)-(%) +type: 27 +{ + 537, 538, 539, 540, 541, +} + +// 28: +(%)-ˮ(%) +type: 28 +{ + 542, 543, 544, 545, 546, +} + +// 29: +(%)-ľ(%) +type: 29 +{ + 547, 548, 549, 550, 551, +} + +// 30: +- +type: 30 +{ + 592, 602, 603, 604, 605, + 676, 677, 678, 679, 680, + 681, 682, 683, 684, 685, + 686, 1066, 1065, 1064, 1063, + 512, 517, 522, 931, 932, + 933, 934, 935, 936, 937, + 938, 939, 940, 941, 1038, + 1037, 1036, 1035, +} + +// 31: +ľ- +type: 31 +{ + 606, 607, 608, 609, 610, + 693, 694, 695, 696, 698, + 699, 700, 701, 707, 708, + 709, 1070, 1069, 1068, 1067, + 513, 518, 523, 942, 943, + 944, 945, 946, 947, 948, + 949, 950, 951, 952, 1042, + 1041, 1040, 1039, +} + +// 32: +ˮ- +type: 32 +{ + 611, 612, 613, 614, 615, + 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, + 720, 1074, 1073, 1072, 1071, + 514, 519, 524, 964, 965, + 966, 967, 968, 969, 970, + 971, 972, 973, 974, 1050, + 1049, 1048, 1047, +} + +// 33: +-ˮ +type: 33 +{ + 617, 616, 618, 619, 620, + 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, + 732, 1078, 1077, 1076, 1075, + 515, 520, 525, 975, 976, + 977, 978, 979, 980, 981, + 982, 983, 984, 985, 1054, + 1053, 1052, 1051, +} + +// 34: +-ľ +type: 34 +{ + 621, 622, 623, 624, 625, + 733, 734, 735, 736, 737, + 738, 739, 741, 742, 743, + 744, 1082, 1081, 1080, 1079, + 516, 521, 526, 953, 954, + 956, 955, 957, 958, 959, + 960, 961, 962, 963, 1046, + 1045, 1044, 1043, +} + +// 35: HP +type: 35 +{ + 1239, 1240, + 1241, 1242, 1243, 1335, 1336, + 1337, 1338, 1339, 1340, 1341, + 1342, 1343, 1344, 1411, 1412, + 1413, 1414, 1415, 1416, 266, + 267, 268, 269, 270, 626, + 627, 628, 629, 630, 1345, + 1346, 1347, 1348, 1349, 1370, + 1371, 1372, 1373, 1374, 1375, + 1376, 1377, 1378, 1379, 1380, + 1381, 1382, 1383, 1384, 1997, + 1998, 1999, 2000, 2001, 3019, +} + +// 36: MP +type: 36 +{ + 500, 501, 502, 1234, 1235, + 1236, 1237, 1238, 1325, 1326, + 1327, 1328, 1329, 1330, 1331, + 1332, 1333, 1334, 276, 277, + 278, 279, 280, 631, 632, + 633, 634, 635, 1350, 1351, + 1352, 1353, 1354, 1355, 1356, + 1357, 1358, 1359, 1360, 1361, + 1362, 1363, 1364, 1365, 1366, + 1367, 1368, 1369, 2002, 2003, + 2004, 2005, 2006, 2117, 2118, + 2119, 2120, 2121, 2122, 2123, + 2124, 2125, +} + +// 37: HP(%) +type: 37 +{ + 271, 272, 273, 274, 275, + 387, 1688, 2133, 2134, 2135, + 2136, 2137, 2138, 2139, 2140, + 2141, 2842, +} + +// 38: MP(%) +type: 38 +{ + 281, 282, 283, 284, 285, + 388, 1689, +} + +// 39: HPָٶ +type: 39 +{ + 321, 322, 323, 324, 325, + 383, 1690, 1987, 1988, 1989, + 1990, 1991, +} + +// 40: MPָٶ +type: 40 +{ + 326, 327, 328, 329, 330, + 384, 1691, 1992, 1993, 1994, + 1995, 1996, +} + +// 41: Χ +type: 41 +{ + 1104, 1105, 1106, 1107, 1108, + 1124, 1125, 1126, 1127, 1128, + 1098, 1084, 1085, 1086, 1087, + 1429, 1430, 1431, 1432, 1433, + 1470, 1471, 1472, 1473, 1474, + 1490, 1492, 1450, 1451, 1452, + 1453, 1454, 1513, 1895, 1912, + 1913, 1914, 1915, 1916, 1917, + 1936, 1937, 1938, 1939, 1940, + 1941, 1942, 1943, 1944, 2272, + 2718, 2745, 3055, 3072, 3232 +} + +// 42: ݷΧ +type: 42 +{ + 1109, 1110, 1111, 1112, 1113, + 1418, 1129, 1130, 1131, 1132, + 1133, 1088, 1089, 1090, 1091, + 1092, 1434, 1435, 1436, 1437, + 1438, 1475, 1476, 1477, 1478, + 1479, 1494, 1455, 1456, 1457, + 1458, 1459, 1514, 1897, 1918, + 1919, 1920, 1921, 1922, 1923, + 1945, 1946, 1947, 1948, 1949, + 1950, 1951, 1952, 1953, 2271, + 2719, 2746, 3056, 3073, 3234, +} + +// 43: Χ +type: 43 +{ + 1114, 1115, 1116, 1117, 1118, + 1419, 1134, 1135, 1136, 1137, + 1138, 1093, 1094, 1095, 1096, + 1097, 1439, 1440, 1441, 1442, + 1443, 1480, 1481, 1482, 1483, + 1484, 1495, 1460, 1461, 1462, + 1463, 1464, 1516, 1899, 1930, + 1931, 1932, 1933, 1934, 1935, + 1963, 1964, 1965, 1966, 1967, + 1968, 1969, 1970, 1971, 2270, + 2717, 2744, 3054, 3071, 3233, +} + +// 44: Χ +type: 44 +{ + 1119, 1120, 1121, 1122, 1123, + 1139, 1140, 1141, 1142, 1143, + 1099, 1100, 1101, 1102, 1103, + 1444, 1445, 1446, 1447, 1448, + 1485, 1486, 1487, 1488, 1489, + 1491, 1493, 1465, 1466, 1467, + 1468, 1469, 1515, 1902, 1905, + 1908, 1924, 1925, 1926, 1927, + 1928, 1929, 1954, 1955, 1956, + 1957, 1958, 1959, 1960, 1961, + 1962, 2146, 2273, 2720, 2747, + 3057, 3074, 3235, +} + +// 45: һ +type: 45 +{ + 473, 474, 475, 1421, 356, + 357, 358, 585, 591, 1510, + 1517, 1977, 1978, 1979, 1980, + 1981, 2021, 2024, 2025, 2027, + 2028, 2147, 2915, 3020, +} + +// 46: +type: 46 +{ + 490, 492, 494, 1311, 1312, + 1313, 1314, 1315, 1316, 1317, + 1318, 1319, 1320, 1321, 1322, + 1323, 1324, 1406, 1407, 1408, + 1385, 1386, 1387, 1388, 1389, + 1390, 1391, 1392, 1393, 1395, + 1396, 1397, 1398, 1399, 3029, +} + +// 47: (%) +type: 47 +{ + 462, 463, 464, 389, 390, + 391, 1512, +} + +// 48: ƶٶ +type: 48 +{ + 636, 637, 638, 639, 640, + 1972, 1973, 1974, 1975, 1976, +} + +// 49: ƶٶ(%) +type: 49 +{ + 286, 287, 288, 289, 290, +} + +// 50: +type: 50 +{ + 491, 493, 495, 1258, 1259, + 1260, 1261, 1262, 1263, 1264, + 1265, 1266, 1267, 1268, 1269, + 1270, 1271, 1409, 1410, 641, + 642, 643, 644, 645, 662, + 663, 664, 665, 666, 667, + 668, 669, 670, 671, 1062, + 1061, 1060, 1059, 593, 596, + 597, 920, 921, 922, 923, + 924, 925, 926, 927, 928, + 929, 930, 1031, 1032, 1033, + 1034, 3030, +} + +// 51: (%) +type: 51 +{ + 291, 292, 293, 294, 295, + 392, 393, 394, +} + +// 52: ;ö +type: 52 +{ + 646, 647, 648, 649, 650, +} + +// 53: ;ö(%) +type: 53 +{ + 465, 467, 469, 296, 297, + 298, 299, 300, 407, 408, + 409, +} + +// 54: +type: 54 +{ + 1272, 1273, 1274, 311, 312, + 313, 314, 315, 362, 363, + 364, 1896, 1898, 1900, 1982, + 1983, 1984, 1985, 1986, 2916, +} + +// 55: Ӽ +type: 55 +{ + 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, + 460, 461, 1275, 1276, 1277, + 1278, 1279, 1280, 1281, 1282, + 1283, 1284, 1285, 1286, 1287, + 1288, 1289, 1290, 1291, 1292, + 1293, 1294, 1295, 1296, 1297, + 1298, 1299, 1300, 1301, 1302, + 1303, 1304, 1305, 1306, 1307, + 1308, 1309, 1310, 2275, 2276, + 2277, 2278, 2279, 2280, 2281, + 2282, 2283, 2472, 2473, 2474, + 2475, 2477, 2479, 2482, 2710, + 2711, 2712, 2713, 2714, 2715, + 2716, 3221, 3222, 3223, 3224, + 3225, 3226, 3227, 3228, 3229, + 3239, +} + +// 56: װ +type: 56 +{ + 466, 468, 470, 301, 302, + 303, 304, 305, 2738, +} + +// 57: δ֪ +type: 57 +{ + 472, 336, 410, +} + +// 58: ֵӳ +type: 58 +{ + 404, 405, 406, 2015, 2016, + 2017, 2018, 2019, 2839, + 2840, 2841, +} + +// 59: ȼ +type: 59 +{ + 2029, 2030, 2031, 2032, 2033, + 2034, 2035, 2036, 2037, 2038, + 2065, 2066, 2067, 2068, 2069, + 2070, 2071, 2072, 2073, 2074, + 2075, 2076, 2077, 2078, 2079, + 2080, 2081, 2082, 2083, 2084, + 2098, 2099, 2100, 2101, 2142, + 2143, 2149, 2150, 2151, 2268, + 2974, 3009, 3110, 3152, 3195, + 3205, 3206, 3207, 3208, 3203, + 3230, +} + +// 60: ȼ +type: 60 +{ + 2085, 2086, 2087, 2088, 2089, + 2090, 2091, 2092, 2093, 2094, + 2095, 2096, 2097, 2039, 2040, + 2041, 2042, 2043, 2044, 2045, + 2046, 2047, 2048, 2049, 2050, + 2051, 2052, 2053, 2054, 2055, + 2056, 2057, 2058, 2059, 2060, + 2061, 2062, 2063, 2064, 2144, + 2145, 2154, 2155, 2156, 2157, + 2269, 2274, 2309, 2310, 3008, + 3153, 3204, 3231, +} + +// 61: з(%) +type: 61 +{ + 2239, 2240, 2241, 2242, 2243, + 2244, 2245, 2246, 2247, 2299, + 2300, 2301, 2302, 2303, 2304, + 2305, 2306, 2307, 2308, +} + +// 62: ֮ +type: 62 +{ + 2311, +} + +// 63: +type: 63 +{ + 2362, 2922, +} + +// 64: ϵ(%) +type: 64 +{ + 2487, 2488, 2489, 2490, +} + +// 65: ľϵ(%) +type: 65 +{ + 2491, 2492, 2493, 2494, +} + +// 66: ˮϵ(%) +type: 66 +{ + 2495, 2496, 2497, 2498, +} + +// 67: ϵ(%) +type: 67 +{ + 2483, 2484, 2485, 2486, +} + +// 68: ϵ(%) +type: 68 +{ + 2499, 2500, 2501, 2502, +} + +// 69: м(%) +type: 69 +{ + 2503, 2504, 2505, 2921, +} + +// 70: ȼΧֵã +type: 70 +{ + 2721, 2722, 2912, 3075, + 3076, +} + +// 71: ȼΧֵã +type: 71 +{ + 2723, 2724, 3077, 3078, +} + +// 72: һ(%)Χֵã +type: 72 +{ + 2725, 2726, 2754, +} + +// 73: HPΧֵã +type: 73 +{ + 2729, 2740, 2741, 3050, + 3051, 3068, 3069, 3070, + 3081, +} + +// 74: MPΧֵã +type: 74 +{ + 2730, 2742, 3052, 3082, +} + +// 75: (%)Χֵã +type: 75 +{ + 2731, 3083, +} + +// 76: Χֵã +type: 76 +{ + 2732, 2756, 3064, 3084, +} + +// 77: зΧֵã +type: 77 +{ + 2733, 2755, 3063, 3065, + 3066, 3067, 3085, +} + +// 78: (%)Χֵã +type: 78 +{ + 2734, 2757, 3086, +} + +// 79: м(%)Χֵã +type: 79 +{ + 2735, 2758, 3087, +} + +// 80: ʱ(%)Χֵã +type: 80 +{ + 2736, 2737, 2752, 2753, + 2913, 3062, 3088, +} + +// 81: 뷶Χֵã +type: 81 +{ + 2739, +} + +// 82: MPָٶȷΧֵã +type: 82 +{ + 2743, 3053, +} + +// 83: (%)Χֵã +type: 83 +{ + 2748, 3058, +} + +// 84: з(%)Χֵã +type: 84 +{ + 2749, 3059, +} + +// 85: HPָٶȷΧֵã +type: 85 +{ + 2750, 3060, +} + +// 86: Χֵã +type: 86 +{ + 2751, 3061, +} + +// 87: ޷Χֵã +type: 87 +{ + 2727, 3079, +} + +// 88: ħ޷Χֵã +type: 88 +{ + 2728, 3080, +} + +// 90: ħȼ +type: 90 +{ + 2843, 2844, 2845, 2846, + 2847, 2848, 2849, 2881, + 2889, 2890, 3007, 3021, + 3023, 3109, 3130, 3131, + 3132, +} + +// 91: ħȼ +type: 91 +{ + 2850, 2851, 2852, 2853, + 2854, 2855, 2856, 2857, + 2858, 2859, 2887, 2888, + 3022, 3024, +} + +// 92: ++ħ +type: 92 +{ +} + +// 93: ɫHP +type: 93 +{ + 497, 498, 499, 2983, +} + +// 94: ɫHPΧ +type: 94 +{ + 2126, 2127, 2128, 2129, + 2130, 2131, 2132, +} + +// 95: +type: 95 +{ + 2917, 2985, 3010, +} + +// 96: +type: 96 +{ + 2918, 2986, 3014, +} + +// 97: +type: 97 +{ + 2919, 2987, 3012, +} + +// 98: +type: 98 +{ + 2920, 3016, 3144, 3145, + 3146, 3147, 3201, +} + +// 99: ɫMP +type: 99 +{ + 2984, +} + +// 300: ǹ̶ֵ +type: 160 +{ + 3043, 3044, 3148, 3149, + 3150, 3151, 3196, 3209, + 3210, 3211, 3212, 3202, + 3236, 3237, 3238, +} + +// 161: ̣ +type: 161 +{ + 3160, 3161, 3162, +} + +// 162: ħ̣ +type: 162 +{ + 3163, +} + +// 163: ̣ +type: 163 +{ + 3164, 3165, 3166, +} + +// 164: з̣ +type: 164 +{ + 3167, 3168, 3169, +} + +// 165: ̣ +type: 165 +{ + 3170, 3171, 3172, +} + +// 166: ǣ̣ +type: 166 +{ + 3173, +} + +// 167: ̣ +type: 167 +{ + 3174, 3175, 3176, +} + +// 168: ḷ̌ +type: 168 +{ + 3177, 3178, 3179, +} + +// 169: ˮ̣ +type: 169 +{ + 3180, 3181, 3182, +} + +// 170: ̣ +type: 170 +{ + 3183, 3184, 3185, +} + +// 171: ̣ +type: 171 +{ + 3186, 3187, 3188, +} + +// 172: ׼ȷȣ̣ +type: 172 +{ + 3189, +} + +// 173: ȣ̣ +type: 173 +{ + 3190, +} + +// 174: ̣ +type: 174 +{ + 3191, 3192, +} + +// 175: ȼ̣ +type: 175 +{ + 3193, 3197, 3213, 3214, 3215, + 3216, +} + +// 176: ħȼ̣ +type: 176 +{ + 3194, 3198, 3217, 3218, 3219, + 3220, +} + +// 150: һ+1% +type: 150 +{ + 2313, 2318, 2323, 2328, 2333, + 2338, 2343, 2348, 2353, 2358, +} + +// 151: һ+2% +type: 151 +{ +} + +// 152: һ+3% +type: 152 +{ + 1903, 1906, 1909 +} + +// 153: һ+4% +type: 153 +{ +} + +// 154: һ+5% +type: 154 +{ + 2925, 2930, 2935, 2940, + 2945, 2950, 2955, 2960, + 2965, 2970, +} + +// 155: һ+6% +type: 155 +{ +} + +// 156: װ +type: 156 +{ + 2834, 3093, +} + +// 200: +type: 200 +{ + 1497, 1498, 1499, 1692, 1693, + 1694, 1695, 1696, 1697, 1698, + 1701, 1699, 1700, 1702, 1703, + 1704, 1705, 1706, 1707, 1708, + 1709, 1710, 1711, 1712, 1713, + 1714, 1715, 1716, 1717, 1718, + 1719, 1720, 1721, 1722, 1723, + 1724, 1725, 1726, 1727, 1728, + 1729, 1730, 1731, 1732, 1733, + 1734, 1735, 1736, 1737, 1738, + 1739, 1740, 1741, 1742, 1743, + 1744, 1745, 1746, 1747, 1748, + 1749, 1750, 1751, +} + +// 201: ħ +type: 201 +{ + 1496, +} + +// 202: +type: 202 +{ + 1503, 1832, 1833, 1834, 1835, + 1836, 1837, 1838, 1839, 1840, + 1841, 1842, 1843, 1844, 1845, + 1846, 1847, 1848, 1849, 1850, + 1851, +} + +// 203: +type: 203 +{ +} + +// 204: ľ +type: 204 +{ +} + +// 205: ˮ +type: 205 +{ +} + +// 206: +type: 206 +{ +} + +// 207: +type: 207 +{ +} + +// 208: HP +type: 208 +{ + 1500, 1501, 1502, 1772, 1773, + 1774, 1775, 1776, 1777, 1778, + 1779, 1780, 1781, 1782, 1783, + 1784, 1785, 1786, 1787, 1788, + 1789, 1790, 1791, 1792, 1793, + 1794, 1795, 1796, 1797, 1798, + 1799, 1800, 1801, 1802, 1803, + 1804, 1805, 1806, 1807, 1808, + 1809, 1810, 1811, 1812, 1813, + 1814, 1815, 1816, 1817, 1818, + 1819, 1820, 1821, 1822, 1823, + 1824, 1825, 1826, 1827, 1828, + 1829, 1830, 1831, +} + +// 209: +type: 209 +{ + 1505, 1872, 1873, 1874, 1875, + 1876, 1877, 1878, 1879, 1880, + 1881, 1882, 1883, 1884, 1885, + 1886, 1887, 1888, 1889, 1890, + 1891, +} + +// 210: з +type: 210 +{ + 1504, 1852, 1853, 1854, 1855, + 1856, 1857, 1858, 1859, 1860, + 1861, 1862, 1863, 1864, 1865, + 1866, 1867, 1868, 1869, 1870, + 1871, +} + +// 211: & ħ +type: 211 +{ + 1752, 1753, 1754, 1755, 1756, + 1757, 1758, 1759, 1760, 1761, + 1762, 1763, 1764, 1765, 1766, + 1767, 1768, 1769, 1770, 1771, +} + +// 212: & ħ +type: 212 +{ + 2923, +} + +// 100: ĥʯ +type: 100 +{ + 2363, 2369, 2377, 2386, + 2395, 2407, 2420, 3004, +} + +// 101: ĥʯ +type: 101 +{ + 2370, 2378, 2387, 2396, + 2408, 2421, +} + +// 102: ĥʯħ +type: 102 +{ + 2364, 2371, 2379, 2388, + 2397, 2409, 2422, 3005, +} + +// 103: ĥʯħ +type: 103 +{ + 2372, 2380, 2389, 2398, + 2410, 2423, +} + +// 104: ĥʯ +type: 104 +{ + 2382, 2390, 2400, 2412, + 2425, +} + +// 105: ĥʯHP +type: 105 +{ + 2365, 2373, 2381, 2434, + 2399, 2411, 2424, 3006, +} + +// 106: ĥʯ +type: 106 +{ + 2366, 2374, 2383, 2392, + 2433, 2417, 2430, +} + +// 107: ĥʯ +type: 107 +{ + 2367, 2375, 2384, 2393, + 2405, 2418, 2431, +} + +// 108: ĥʯ +type: 108 +{ + 2368, 2376, 2385, 2394, + 2406, 2419, 2432, +} + +// 109: ĥʯ +type: 109 +{ + 2391, 2401, 2413, 2426, +} + +// 110: ĥʯһ(%) +type: 110 +{ + 2402, 2427, +} + +// 111: ĥʯȼ +type: 111 +{ + 2403, 2415, 2428, +} + +// 112: ĥʯȼ +type: 112 +{ + 2404, 2416, 2429, +} + +// 113: ĥʯʱ +type: 113 +{ + 2414, +} + +// 114: ĥʯħ +type: 114 +{ + 3045, 3046, 3047, 3048, + 3049, +} + +// 115: ĥʯ˼ +type: 115 +{ + 3133, 3134, 3135, +} + +// 120: Կ̽ +type: 120 +{ + 2518, 2519, 2520, 2521, 2522, + 2523, +} + +// 121: Կľ +type: 121 +{ + 2506, 2507, 2508, 2509, 2510, + 2511, +} + +// 122: Կˮ +type: 122 +{ + 2512, 2513, 2514, 2515, 2516, + 2517, +} + +// 123: Կ̻ +type: 123 +{ + 2530, 2531, 2532, 2533, 2534, + 2535, +} + +// 124: Կ +type: 124 +{ + 2524, 2525, 2526, 2527, 2528, + 2529, +} + +// 125: Կ +type: 125 +{ + 2536, 2537, 2538, 2539, 2540, + 2541, 2542, +} + +// 126: Կ̶ +type: 126 +{ + 2543, 2544, 2545, 2546, 2547, + 2548, 2549, +} + +// 127: ԿMP +type: 127 +{ + 2550, 2551, 2552, 2553, 2554, + 2555, 2556, 2557, +} + +// 128: Կ +type: 128 +{ + 2558, 2559, 2560, 2561, 2562, + 2563, 2564, 2565, 2566, 2988, +} + +// 129: Կ +type: 129 +{ + 2567, 2568, 2569, 2570, 2571, + 2572, 2573, 2574, 2575, +} + +// 130: Կ +type: 130 +{ + 2576, 2577, 2578, 2579, 2580, + 2581, 2582, 2583, 2584, +} + +// 131: Կ +type: 131 +{ + 2585, 2586, 2587, 2588, 2589, + 2590, 2591, 2592, 2593, +} + +// 132: ԿHP +type: 132 +{ + 2594, 2595, 2596, 2597, 2598, + 2599, 2600, 2601, 2602, 2603, + 2604, 2605, 2606, 2607, 2608, + 2609, 2610, 2611, 2612, 2613, + 2614, 2615, 2989, 2990, 2991, +} + +// 133: Կ +type: 133 +{ + 2616, 2617, 2618, 2619, 2620, + 2621, 2622, 2623, 2624, 2625, + 2626, 2627, 2628, 2629, 2630, + 2631, 2632, 3001, 3002, 3003, +} + +// 134: Կз +type: 134 +{ + 2633, 2634, 2635, 2636, 2637, + 2638, 2639, 2640, 2641, 2642, + 2643, 2644, 2645, 2646, 2647, + 2648, 2649, 2998, 2999, 3000, +} + +// 135: Կ +type: 135 +{ + 2650, 2651, 2652, 2653, 2654, + 2655, 2656, 2657, 2658, 2659, + 2660, 2661, 2662, 2663, 2664, + 2665, 2666, 2667, 2995, 2996, + 2997, +} + +// 136: Կħ +type: 136 +{ + 2668, 2669, 2670, 2671, 2672, + 2673, 2674, 2675, 2676, 2677, + 2678, 2679, 2680, 2681, 2682, + 2683, 2684, 2685, 2992, 2993, + 2994, +} + +// 137: Կ̽ϵ(%) +type: 137 +{ + 2686, 2687, 2688, +} + +// 138: Կľϵ(%) +type: 138 +{ + 2689, 2690, 2691, +} + +// 139: Կˮϵ(%) +type: 139 +{ + 2692, 2693, 2694, +} + +// 140: Կ̻ϵ(%) +type: 140 +{ + 2695, 2696, 2697, +} + +// 141: Կϵ(%) +type: 141 +{ + 2698, 2699, 2700, +} + +// 142: Կм(%) +type: 142 +{ + 2708, 2709, +} + +// 143: Կһ +type: 143 +{ + 2701, +} + +// 144: Կ̹ȼ +type: 144 +{ + 2702, 2703, +} + +// 145: Կ̷ȼ +type: 145 +{ + 2704, 2705, +} + +// 146: Կ +type: 146 +{ + 2706, 2707, +} \ No newline at end of file diff --git a/Assets/StreamingAssets/configs/item_ext_prop.txt.meta b/Assets/StreamingAssets/configs/item_ext_prop.txt.meta new file mode 100644 index 0000000000..6cd877438a --- /dev/null +++ b/Assets/StreamingAssets/configs/item_ext_prop.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5429be2b686cda24e8f5ab2049a68b27 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/StreamingAssets/configs/item_msg_map.txt b/Assets/StreamingAssets/configs/item_msg_map.txt new file mode 100644 index 0000000000..1fc2307ad7 --- /dev/null +++ b/Assets/StreamingAssets/configs/item_msg_map.txt @@ -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 + diff --git a/Assets/StreamingAssets/configs/item_msg_map.txt.meta b/Assets/StreamingAssets/configs/item_msg_map.txt.meta new file mode 100644 index 0000000000..4fd53cb569 --- /dev/null +++ b/Assets/StreamingAssets/configs/item_msg_map.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 76f11583e7abe3e4bbf976a45f946fe7 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/StreamingAssets/configs/skillstr.txt b/Assets/StreamingAssets/configs/skillstr.txt new file mode 100644 index 0000000000..22f992185c Binary files /dev/null and b/Assets/StreamingAssets/configs/skillstr.txt differ diff --git a/Assets/StreamingAssets/configs/skillstr.txt.meta b/Assets/StreamingAssets/configs/skillstr.txt.meta new file mode 100644 index 0000000000..3b97f7f5c8 --- /dev/null +++ b/Assets/StreamingAssets/configs/skillstr.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6ee4a110a33412e4aa3f879764bec33b +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: