diff --git a/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll b/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll index 851f70a125..4abbdeac35 100644 Binary files a/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll and b/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll differ diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs b/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs index af17da428e..6d02a782a1 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs @@ -94,7 +94,7 @@ namespace PerfectWorld.Scripts.Managers EC_ElsePlayer pPlayer = SeekOutElsePlayer(pCmd.id); if (pPlayer) { - //pPlayer->MoveTo(*pCmd); + pPlayer.MoveTo(pCmd); } } } @@ -158,7 +158,10 @@ namespace PerfectWorld.Scripts.Managers } lock (m_csPlayerTab) { - m_PlayerTab.Add(info.cid, pPlayer); + if (m_PlayerTab.ContainsKey(info.cid)) + { + m_PlayerTab[info.cid] = pPlayer; + } } return pPlayer; } @@ -189,7 +192,14 @@ namespace PerfectWorld.Scripts.Managers private EC_ElsePlayer SeekOutElsePlayer(int cid) { - return null; + if (!m_PlayerTab.TryGetValue(cid, out var player)) + { + // Couldn't find this else player, put it into unknown player table + m_UkPlayerTab[cid] = cid; + return null; + } + + return player; } //private cmd_object_move ConvertToStruct(byte[] bytes) diff --git a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs index 04c77f5739..7b68a146c5 100644 --- a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs +++ b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs @@ -1,20 +1,60 @@ +using CSNetwork.GPDataType; using UnityEngine; namespace PerfectWorld.Scripts.Player { public class EC_ElsePlayer : MonoBehaviour { - // Start is called once before the first execution of Update after the MonoBehaviour is created - void Start() + A3DVECTOR3 m_vMoveDir; // Player's velocity + A3DVECTOR3 m_vServerPos; // Player's real position on server + // 是否是依附者 = Is it a dependent/attacher? + bool m_bHangerOn; + // 依附者或被依附者id = The ID of the attacher (dependent) or the attached target. + int m_iBuddyId; + bool m_bStopMove; // Stop move flag + public const float MAX_LAGDIST = 10.0f; // Maximum lag distance + + public void MoveTo(cmd_object_move Cmd) { - + if (Cmd.use_time == 0) + return; + SetServerPos(Cmd.dest); + m_vMoveDir = Cmd.dest - GetPos(); + float fDist = m_vMoveDir.Normalize(); + m_bStopMove = false; + + // If destination position is too far to us, forcely pull player + // to that position. + if (fDist >= MAX_LAGDIST) + { + SetPos(Cmd.dest); + m_pEPWorkMan->FinishWork(CECEPWork::WORK_MOVE); + return; + } } - // Update is called once per frame - void Update() + // Set server position + public void SetServerPos(A3DVECTOR3 vPos) { - + m_vServerPos = vPos; + // If this player is a mule, change it's rider's server pos too. + //if (m_iBuddyId != 0 && !m_bHangerOn) + //{ + // var pPlayer = m_pPlayerMan.GetElsePlayer(m_iBuddyId); + // if (pPlayer) + + // pPlayer.SetServerPos(vPos); + // } } + + private A3DVECTOR3 GetPos() + { + A3DVECTOR3 result = new A3DVECTOR3(); + result.x = transform.position.x; + result.y = transform.position.y; + result.z = transform.position.z; + return result; + } } // Player appear flag