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: