diff --git a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs index 8dfc5b0c3d..37a656b5db 100644 --- a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs +++ b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs @@ -440,7 +440,7 @@ public class CECNPCMan : IMsgHandler tid = 4249; dataType = edm.get_data_type((uint)tid, ID_SPACE.ID_SPACE_ESSENCE); } - BMLogger.LogError("HoangDev: CreateNPC TID = " + tid.ToString() + " DataType= " + (DATA_TYPE)dataType + " bPet: "+ bPet); + //BMLogger.LogError("HoangDev: CreateNPC TID = " + tid.ToString() + " DataType= " + (DATA_TYPE)dataType + " bPet: "+ bPet); if (bPet) { //pNPC = new CECPet(this); diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs index f8531917e2..3f4af13bfb 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs @@ -413,7 +413,7 @@ namespace BrewMonster.Scripts { if (pWorkMove.GetAutoMove()) { - //pWorkMove.Finish(); + pWorkMove.Finish(); } else { @@ -606,6 +606,67 @@ namespace BrewMonster.Scripts StartAwaitingWorks(); } } + + public bool IsFollowing() + { + return IsWorkRunning(CECHPWork.Host_work_ID.WORK_FOLLOW); + } + + public bool IsMovingToPosition() + { + return IsWorkRunning(CECHPWork.Host_work_ID.WORK_MOVETOPOS); + } + + public bool IsTracing() + { + return IsWorkRunning(CECHPWork.Host_work_ID.WORK_TRACEOBJECT); + } + + bool IsWorkRunning(int iWorkID) + { + bool result = false; + if (ValidatePriority(m_iCurPriority)) + { + WorkList workList = m_WorkStack[m_iCurPriority]; + if(workList != null) + { + for (int i = 0; i < workList.Count; ++i) + { + if (iWorkID == workList[i].GetWorkID()) + { + result = true; + break; + } + } + } + } + return result; + } + + public void FinishRunningWork(int idWork) + { + if (!IsWorkRunning(idWork)) + { + return; + } + WorkList workList = m_WorkStack[m_iCurPriority]; + if(workList != null) + { + for (int i = 0; i < workList.Count;) + { + if (workList[i].GetWorkID() != idWork) + { + ++i; + continue; + } + KillWork(m_iCurPriority, i); + } + if (workList == null) + { + StartAwaitingWorks(); + } + } + } } public abstract class CECHPWorkPostTickCommand diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs index 14ad942f18..20a1ccd25c 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs @@ -62,7 +62,7 @@ namespace BrewMonster.Scripts m_vMoveDest = vMoveDest; m_bHaveDest = true; m_bGliding = false; - //m_pHost->SetAdjustOrient(false); // 2014-9-10 徐文彬:在 CECHPWorkMove 创建的时候都会调用此函数,会导致其它时机通过 SetDestDirAndUp 调用对人物的朝向调整失效。 + //m_pHost.SetAdjustOrient(false); // 2014-9-10 徐文彬:在 CECHPWorkMove 创建的时候都会调用此函数,会导致其它时机通过 SetDestDirAndUp 调用对人物的朝向调整失效。 // 重现方法为:月仙“望月咏”技能释放后、马上按住'A'或'D'等移动键并摁住不放,将导致人物施法方向偏离目标而朝向移动方向(需多次尝试) //清空任务信息 @@ -92,7 +92,7 @@ namespace BrewMonster.Scripts else if (IsAutoPF()) { // TO DO: fix later - //m_vCurDir = CECIntelligentRoute::Instance().GetCurDest() - m_pHost->GetPos(); + //m_vCurDir = CECIntelligentRoute::Instance().GetCurDest() - m_pHost.GetPos(); //m_vCurDir.y = 0.0f; //m_vCurDir.Normalize(); //if (m_bUseAutoMoveDialog) @@ -181,7 +181,7 @@ namespace BrewMonster.Scripts // if (m_iNPCTempleId) // { // CECNPC pNPC = g_pGame.GetGameRun().GetWorld().GetNPCMan().FindNPCByTempleID(m_iNPCTempleId); - // if (pNPC && m_pHost.SelectTarget(pNPC->GetNPCID())) + // if (pNPC && m_pHost.SelectTarget(pNPC.GetNPCID())) // { // CECHPWorkTrace pWork = m_pWorkMan.CreateNPCTraceWork(pNPC, m_iTaskId); // if (pWork) @@ -203,15 +203,15 @@ namespace BrewMonster.Scripts // if (!m_pHost.IsJumping() && !m_pHost.IsPlayingAction(CECPlayer::ACT_TRICK_RUN) && // m_pHost.m_iMoveMode != CECPlayer::MOVE_SLIDE && !m_bMeetSlide) // { - // int iAction = m_pHost->GetMoveStandAction(true); + // int iAction = m_pHost.GetMoveStandAction(true); // m_pHost.PlayAction(iAction, false); // } // Tick_Walk(fDeltaTime); //} - //else // (m_pHost->m_iMoveEnv == CECPlayer::MOVEENV_AIR || m_pHost->m_iMoveEnv == CECPlayer::MOVEENV_WATER) + //else // (m_pHost.m_iMoveEnv == CECPlayer::MOVEENV_AIR || m_pHost.m_iMoveEnv == CECPlayer::MOVEENV_WATER) //{ - // m_pHost->ResetJump(); + // m_pHost.ResetJump(); // // Play appropriate actions // if (!m_bGliding) @@ -273,9 +273,33 @@ namespace BrewMonster.Scripts bool IsAutoPF() { return m_iDestType == Types.DEST_AUTOPF; } // Finish work - void Finish() + public void Finish() { + m_bFinished = true; + Cancel(); + // Close 'Win_AutoPlay' dialog if it exists + //CECGameUIMan* pGameUI = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan(); + //pGameUI.AutoMoveShowDialog(false); + + if (m_bUseAutoMoveDialog) + { + if (m_bAutoLand) + { + m_bAutoLand = false; + //if (g_pGame.GetGameRun().GetHostPlayer().IsFlying()) + // g_pGame.GetGameRun().GetHostPlayer().CmdFly(false); + } + + m_bUseAutoMoveDialog = false; + m_fAutoHeight = -1.0f; + m_bAutoFly = false; + m_bReachedHeight = true; + } + + //清空任务追踪数据 + m_iNPCTempleId = 0; + m_iTaskId = 0; } void SetTaskNPCInfo(int tid, int taskid) @@ -288,8 +312,8 @@ namespace BrewMonster.Scripts //int tid, taskid; //tid = m_iNPCTempleId; //taskid = m_iTaskId; - //CECGameUIMan* pGameUI = g_pGame->GetGameRun()->GetUIManager()->GetInGameUIMan(); - //pGameUI->SetAutoMoveShowDialogTarget((int)m_vMoveDest.x, (int)m_vMoveDest.z); + //CECGameUIMan* pGameUI = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan(); + //pGameUI.SetAutoMoveShowDialogTarget((int)m_vMoveDest.x, (int)m_vMoveDest.z); //SetDestination(CECHPWorkMove::DEST_2D, m_vMoveDest); //SetTaskNPCInfo(tid, taskid); //SetUseAutoMoveDialog(true); @@ -346,12 +370,12 @@ namespace BrewMonster.Scripts // bool bSwitchTo2D(true); // while (true) // { - // if (m_pHost->IsFlying()) + // if (m_pHost.IsFlying()) // { // break; // } - // CECHostBrushTest brushTester(m_pHost->GetPos(), m_pHost->m_CDRInfo.vExtent, m_pHost->m_CDRInfo.fStepHeight); - // if (CECIntelligentRoute::Instance().Search(m_pHost->GetPos(), m_vMoveDest, &brushTester) != CECIntelligentRoute::enumSearchSuccess) + // CECHostBrushTest brushTester(m_pHost.GetPos(), m_pHost.m_CDRInfo.vExtent, m_pHost.m_CDRInfo.fStepHeight); + // if (CECIntelligentRoute::Instance().Search(m_pHost.GetPos(), m_vMoveDest, &brushTester) != CECIntelligentRoute::enumSearchSuccess) // { // break; // } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs index d1b38189aa..94570e1619 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs @@ -152,11 +152,11 @@ public abstract class CECTracedObject fTouchRadius = pNPC.GetTouchRadius(); return m_pHost.CanTouchTarget(vHostPos, vTargetPos, fTouchRadius, iTouchReason, fMaxCut); } - //else if (GPDataTypeHelper.ISMATTERID(m_iObjectId)) - //{ - // CECMatter pMatter = (pObject) as CECMatter; - // return pMatter.CalcDist(vHostPos, true) < pMatter.GetGatherDist(); - //} + else if (GPDataTypeHelper.ISMATTERID(m_iObjectId)) + { + //CECMatter pMatter = (pObject) as CECMatter; + //return pMatter.CalcDist(vHostPos, true) < pMatter.GetGatherDist(); + } break; } return false; @@ -601,18 +601,18 @@ public class CECHPWorkTrace : CECHPWork { if (IsGoodTimeToTouch()) { - OnTouchTarget(); - return true; - //if (m_pTraceObject.CanTouchFrom(m_pHost.GetPos())) - //{ - // OnTouchTarget(); - // return true; - //} + //OnTouchTarget(); + //return true; + if (m_pTraceObject.CanTouchFrom(m_pHost.GetPos() + new A3DVECTOR3(0f, m_pHost.m_CDRInfo.vExtent.y, 0f))) + { + OnTouchTarget(); + return true; + } } } m_bCheckTouch = true; - return true; // TO DO: remove later + //return true; // TO DO: remove later if (!m_pHost.IsRooting()) { // Continue tracing object @@ -829,6 +829,7 @@ public class CECHPWorkTrace : CECHPWork vCurPos = m_pHost.m_MoveCtrl.GroundMove(m_vCurDirH, m_pHost.GetGroundSpeed(), fDeltaTime); if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) { + Debug.LogError("SendStopMoveCmd"); m_pHost.m_MoveCtrl.SetSlideLock(true); m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), m_pHost.GetGroundSpeed(), (int)GPMoveMode.GP_MOVE_SLIDE); m_bFinished = true; @@ -840,6 +841,7 @@ public class CECHPWorkTrace : CECHPWork //{ // CECIntelligentRoute::Instance().OnPlayerPosChange(vCurPos); //} + Debug.LogError("SendMoveCmd"); m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 2, GPDataTypeHelper.g_vOrigin, EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), (int)GPMoveMode.GP_MOVE_SLIDE); } } @@ -875,7 +877,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()) //{ @@ -892,11 +894,15 @@ public class CECHPWorkTrace : CECHPWork if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) { - // m_pHost.m_MoveCtrl.SendStopMoveCmd(vCurPos, m_pHost.GetGroundSpeed(), iMoveMode); + Debug.LogError("SendStopMoveCmd"); + m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), m_pHost.GetGroundSpeed(), iMoveMode); PressCancel(); } else + { + Debug.LogError("SendMoveCmd"); m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 0, vTargetPos, EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), iMoveMode); + } } else // m_bMeetSlide == true { diff --git a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs index 1fd54cfcd3..5ce6e94875 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs @@ -947,6 +947,7 @@ public abstract class CECPlayer : CECObject public float GetGroundSpeed() { // return m_bWalkRun ? g_pGame.GetConfigs().GetHostRunSpeed() : m_ExtProps.mv.walk_speed; + return 5f; return m_bWalkRun ? m_ExtProps.mv.run_speed : m_ExtProps.mv.walk_speed; } diff --git a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs index 92e477b504..0058b57bf4 100644 --- a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs +++ b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs @@ -176,7 +176,7 @@ namespace BrewMonster.Scripts } Vector3 vVelDir = vVelocity; float fVelSpeed = vVelDir.magnitude; - vVelDir = vVelDir.normalized; + //vVelDir = vVelDir.normalized; if (fVelSpeed > 1e-6f) { vVelDir /= fVelSpeed; @@ -220,15 +220,16 @@ namespace BrewMonster.Scripts //bool hasHit = CollideWithEnv_BoxCast(vStart, vDelta, vExt, mask, // out RaycastHit hit, out float fFraction, out Vector3 hitNormal, out bool bStartSolid); Vector3 posFoot = vStart - Vector3.up * vExt.y; - bool bClear = !Physics.Raycast(posFoot, vVelocity.normalized, out RaycastHit hit, fDeltaDist, mask); + bool bClear = !Physics.Raycast(posFoot, (posFoot + vVelocity).normalized, out RaycastHit hit, fDeltaDist, mask); nTry++; if (bClear) { vFinalPos = vStart + vDelta; + Debug.DrawLine(posFoot, vFinalPos, Color.red, 10f); CDRInfo.fMoveDist += fDeltaDist; break; } - + Debug.LogError("Hit"); //if (bStartSolid) //{ // CDRInfo.fMoveDist = 0f; @@ -249,13 +250,13 @@ namespace BrewMonster.Scripts //float skin = 0.01f; posFoot = vStart - Vector3.up * vExt.y; Vector3 vStartUp = new Vector3(0f, CDRInfo.fStepHeight, 0f); - bPull = !Physics.Raycast(posFoot, vStartUp.normalized, out hit, mask); + bPull = !Physics.Raycast(posFoot, (posFoot + vStartUp).normalized, out hit, mask); if (bPull) { vStart += Vector3.up * CDRInfo.fStepHeight; posFoot = vStart - Vector3.up * vExt.y; Vector3 vDelta2 = vVelocity; - bool bMove = !Physics.Raycast(posFoot, vVelocity.normalized, out hit, mask); + bool bMove = !Physics.Raycast(posFoot, (posFoot + vVelocity).normalized, out hit, mask); if (!bMove) { //vDelta2 *= frac2; diff --git a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs index d4bef304ba..018a27c4e6 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs @@ -805,7 +805,7 @@ public class CECNPC : CECObject { tid = GetNPCInfo().tid; } - BMLogger.LogError("HoangDev: GetVisibleModel NPC TID=" + tid + ", ModelFile=" + szModelFile); + //BMLogger.LogError("HoangDev: GetVisibleModel NPC TID=" + tid + ", ModelFile=" + szModelFile); return tid > 0; } public bool GetModelFile(int tid, out string szModelFile) diff --git a/Assets/PerfectWorld/Scripts/NPC/CECNPCModelDefaultPolicy.cs b/Assets/PerfectWorld/Scripts/NPC/CECNPCModelDefaultPolicy.cs index 395bcfc499..cf65f4c6d5 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECNPCModelDefaultPolicy.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECNPCModelDefaultPolicy.cs @@ -60,7 +60,7 @@ public class CECNPCModelDefaultPolicy */ bool result = false; bool ignoreRef = false; - BMLogger.LogError("HoangDev: NPCActionIndex: " + (NPCActionIndex)iAction); + //BMLogger.LogError("HoangDev: NPCActionIndex: " + (NPCActionIndex)iAction); if (iAction == (int)NPCActionIndex.ACT_WOUNDED) { string szAct = GetActionName(iAction); diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs index 9ba6ba334f..0a8c95070f 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs @@ -1315,5 +1315,18 @@ namespace CSNetwork.GPDataType { public int idTarget; }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_host_notify_root + { + public A3DVECTOR3 pos; + public byte type; + }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_host_dispel_root + { + public byte type; + }; } diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs index 255b59ce30..b9f28dfc68 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -453,9 +453,8 @@ namespace CSNetwork if (pCmd.iMessage == 2) { - // Attack target is too far - //pGameRun->PostMessage(MSG_HST_TARGETISFAR, MAN_PLAYER, 0, (DWORD)pDataBuf, pCmdHeader->cmd); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_TARGETISFAR, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader); } else if (pCmd.iMessage == 20) { @@ -517,6 +516,10 @@ namespace CSNetwork break; } + case CommandID.HOST_NOTIFY_ROOT: + case CommandID.HOST_DISPEL_ROOT: + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_ROOTNOTIFY, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader); + break; } } diff --git a/Assets/Prefabs/MonsterPrefab.prefab b/Assets/Prefabs/MonsterPrefab.prefab index 89362a78fe..930ece6efa 100644 --- a/Assets/Prefabs/MonsterPrefab.prefab +++ b/Assets/Prefabs/MonsterPrefab.prefab @@ -47,6 +47,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2cd22b82fc76bed46ac948cef9c7119d, type: 3} m_Name: m_EditorClassIdentifier: + m_iMMIndex: 0 + m_idAttackTarget: 0 m_fMoveSpeed: 0 _characterController: {fileID: -2400324395862947468} --- !u!114 &-3520322077839857420 @@ -62,6 +64,8 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: namedAnimancer: {fileID: 0} + isDebug: 0 + animName1: --- !u!143 &-2400324395862947468 CharacterController: m_ObjectHideFlags: 0 @@ -102,7 +106,7 @@ BoxCollider: serializedVersion: 2 m_Bits: 0 m_LayerOverridePriority: 0 - m_IsTrigger: 0 + m_IsTrigger: 1 m_ProvidesContacts: 0 m_Enabled: 1 serializedVersion: 3 diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index 097a8e3f6e..474cb1c9f2 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -41,7 +41,7 @@ public class CECHostPlayer : CECPlayer public CECHostMove m_MoveCtrl; CECHPWorkMan m_pWorkMan; // Host work manager - uint m_dwLIES; // Logic-influence extend states + uint m_dwLIES = 0; // Logic-influence extend states FACTION_FORTRESS_ENTER m_fortressEnter; // 陆酶脠毛禄霉碌脴脨脜脧垄 PVPINFO m_pvp; // pvp information bool m_bInSanctuary = false; // true, player is in sanctuary @@ -95,7 +95,7 @@ public class CECHostPlayer : CECPlayer ccRadius = controller.radius; ccSkin = controller.skinWidth; } - m_CDRInfo.fStepHeight = -1610612736; + //m_CDRInfo.fStepHeight = -1610612736; } @@ -353,6 +353,7 @@ public class CECHostPlayer : CECPlayer 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; + case int value when value == EC_MsgDef.MSG_HST_ROOTNOTIFY: OnMsgHstRootNotify(Msg); break; } } void OnMsgHstAttacked(ECMSG Msg) @@ -363,10 +364,10 @@ public class CECHostPlayer : CECPlayer if (pCmd.iDamage != 0 && (pCmd.cEquipment & 0x7f) != 0x7f) { - /* char cEquip = (char)(pCmd.cEquipment & 0x7f); - CECIvtrEquip pEquip = (CECIvtrEquip)m_pEquipPack->GetItem(cEquip); - if (pEquip) - pEquip->AddCurEndurance(ARMOR_RUIN_SPEED);*/ + /* char cEquip = (char)(pCmd.cEquipment & 0x7f); + CECIvtrEquip pEquip = (CECIvtrEquip)m_pEquipPack.GetItem(cEquip); + if (pEquip) + pEquip.AddCurEndurance(ARMOR_RUIN_SPEED);*/ } // The host player is attacked, we should make an effect here @@ -381,7 +382,7 @@ public class CECHostPlayer : CECPlayer pAttacker.TurnFaceTo(GetPlayerInfo().cid); } int useless_attacktime = 0; - pAttacker.PlayAttackEffect(GetCharacterID(), 0, 0, pCmd.iDamage, (uint)pCmd.attack_flag, pCmd.speed * 50,ref useless_attacktime); + pAttacker.PlayAttackEffect(GetCharacterID(), 0, 0, pCmd.iDamage, (uint)pCmd.attack_flag, pCmd.speed * 50, ref useless_attacktime); pAttacker.EnterFightState(); } } @@ -431,7 +432,7 @@ public class CECHostPlayer : CECPlayer { cmd_be_hurt pCmd = (cmd_be_hurt)Msg.dwParam1; if (pCmd.damage != 0) - Damaged(pCmd->damage); + Damaged(pCmd.damage); } else if (cmd == CommandID.HURT_RESULT) { @@ -443,7 +444,7 @@ public class CECHostPlayer : CECPlayer { CECElsePlayer pTarget = m_pPlayerMan.GetElsePlayer(pCmd.target_id); if (pTarget) - pTarget->Damaged(pCmd->damage); + pTarget.Damaged(pCmd.damage); } else if (UnityGameSession.Instance.GameSession.ISNPCID(pCmd.target_id)) { @@ -453,6 +454,43 @@ public class CECHostPlayer : CECPlayer } }*/ } + + void OnMsgHstRootNotify(ECMSG Msg) + { + if (Convert.ToInt32(Msg.dwParam2) == CommandID.HOST_NOTIFY_ROOT) + { + cmd_host_notify_root pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); + m_dwLIES |= (1u << pCmd.type); + + if (pCmd.type != 3) + { + // Force pull host to specified position + SetPos(EC_Utility.ToVector3(pCmd.pos)); + } + + if (IsRooting()) + { + if (m_pWorkMan.IsFollowing()) + { + m_pWorkMan.FinishRunningWork(CECHPWork.Host_work_ID.WORK_FOLLOW); + } + if (m_pWorkMan.IsMovingToPosition()) + { + m_pWorkMan.FinishRunningWork(CECHPWork.Host_work_ID.WORK_MOVETOPOS); + } + if (m_pWorkMan.IsTracing()) + { + m_pWorkMan.FinishRunningWork(CECHPWork.Host_work_ID.WORK_TRACEOBJECT); + } + } + } + + else if (Convert.ToInt32(Msg.dwParam2) == CommandID.HOST_DISPEL_ROOT) + { + cmd_host_dispel_root pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); + m_dwLIES &= ~(1u << pCmd.type); + } + } public void OnMsgHstPickupItem(in ECMSG Msg) { var data = Msg.dwParam1 as byte[]; @@ -714,7 +752,14 @@ public class CECHostPlayer : CECPlayer m_aabb.Extents.Set(0.3f, 0.9f, 0.3f); m_aabbServer = m_aabb; CalcPlayerAABB(); - + // Update upper body radius using new AABB + //m_CDRInfo.vExtent = m_aabbServer.Extents; + m_CDRInfo.vTPNormal = Vector3.up; //pos.y < fHei + 0.1f ? vNormal : g_vOrigin; + //m_CDRInfo.fYVel = 0.0f; + //m_CDRInfo.fSlopeThresh = 0.5f; + m_CDRInfo.fStepHeight = 0.8f;//m_MoveConst.fStepHei; + //a_LogOutput(1, "m_CDRInfo.fStepHeight = %d", m_CDRInfo.fStepHeight); + //m_CDRInfo.vAbsVelocity = Vector3.zero; // Create work manager m_pWorkMan = new CECHPWorkMan(this); if (m_pWorkMan == null) @@ -1066,6 +1111,8 @@ public class CECHostPlayer : CECPlayer else fRange = m_ExtProps.ak.AttackRange * 0.7f; + fRange = 2.31f; + if (fDist - fTargetRad <= fRange) return true; @@ -1272,7 +1319,7 @@ public class CECHostPlayer : CECPlayer 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_pTeam || !m_pTeam.GetMemberByID(m_idSelTarget) || m_iBuddyId || IsPassiveMove() || m_playerLimits.test(PLAYER_LIMIT_NOCHANGESELECT)*/) bRet = false; @@ -1399,7 +1446,7 @@ public class CECHostPlayer : CECPlayer // if (IsDead() || IsAboutToDie() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() || // IsJumping() || IsFlashMoving() || IsFalling() || IsChangingFace() || GetBoothState() != 0 || IsTakingOff() || - // m_pWorkMan->HasWorkRunningOnPriority(CECHPWorkMan::PRIORITY_2) || + // m_pWorkMan.HasWorkRunningOnPriority(CECHPWorkMan::PRIORITY_2) || // m_iBuddyId || IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || IsPassiveMove()) // bRet = false; @@ -1411,7 +1458,7 @@ public class CECHostPlayer : CECPlayer // IsMeleeing() || IsTrading() || IsUsingTrashBox() || IsTalkingWithNPC() || // IsChangingFace() || IsReviving() || IsSpellingMagic() || IsPicking() || // IsGathering() || IsRooting() || GetBoothState() != 0 || - // !m_pWorkMan->IsStanding() || m_iBuddyId || + // !m_pWorkMan.IsStanding() || m_iBuddyId || // IsOperatingPet() || IsRebuildingPet() || IsUsingItem() || GetShapeType() == PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove() || // m_playerLimits.test(PLAYER_LIMIT_NOBIND)) // bRet = false;