From 6a0125be95032b1e85d179dd4e52bf3a7c64d9c6 Mon Sep 17 00:00:00 2001 From: VDH Date: Thu, 9 Oct 2025 15:31:53 +0700 Subject: [PATCH] else player and npc --- .../Scripts/Managers/CECNPCMan.cs | 2 +- .../Scripts/Managers/DamageTextManager.cs | 88 +++++++ .../Managers/DamageTextManager.cs.meta | 2 + .../Scripts/Managers/EC_HPWorkMelee.cs | 2 +- .../Scripts/Managers/EC_HPWorkTrace.cs | 10 +- .../Scripts/Managers/EC_HostPlayer.cs | 40 ---- .../Scripts/Managers/EC_HostPlayer.cs.meta | 2 - .../Scripts/Managers/EC_ManPlayer.cs | 13 - .../Scripts/Managers/EC_Object.cs | 2 +- Assets/PerfectWorld/Scripts/NPC/CECNPC.cs | 150 ++++++------ .../Scripts/Network/CSNetwork/GPDataType.cs | 22 +- .../Scripts/Network/CSNetwork/GameSession.cs | 6 +- .../Scripts/Network/EC_ManMessageMono.cs | 4 +- .../Scripts/Players/EC_ElsePlayer.cs | 26 ++ Assets/Scenes/NPCRender.unity | 224 ++++++++++++++++++ Assets/Scripts/CECHostPlayer.cs | 30 +++ Assets/Scripts/Move/CECHostMove.cs | 2 +- Assets/Scripts/Move/CECPlayer.cs | 3 +- 18 files changed, 478 insertions(+), 150 deletions(-) create mode 100644 Assets/PerfectWorld/Scripts/Managers/DamageTextManager.cs create mode 100644 Assets/PerfectWorld/Scripts/Managers/DamageTextManager.cs.meta delete mode 100644 Assets/PerfectWorld/Scripts/Managers/EC_HostPlayer.cs delete mode 100644 Assets/PerfectWorld/Scripts/Managers/EC_HostPlayer.cs.meta diff --git a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs index 02af13c1ad..9fb394ee6c 100644 --- a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs +++ b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs @@ -108,7 +108,7 @@ public class CECNPCMan : CECObject, IMsgHandler if (pTarget.IsPetNPC() && pTarget.GetMasterID() == pHost.GetCharacterID()) { // Pet của mình bị đánh → hiển thị damage - pTarget.Damaged(nDamage,(uint) dwModifier); + //pTarget.Damaged(nDamage,(uint) dwModifier); break; } diff --git a/Assets/PerfectWorld/Scripts/Managers/DamageTextManager.cs b/Assets/PerfectWorld/Scripts/Managers/DamageTextManager.cs new file mode 100644 index 0000000000..8ac7314285 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/DamageTextManager.cs @@ -0,0 +1,88 @@ +using System.Collections.Generic; +using UnityEngine; +using TMPro; +using DG.Tweening; + +public class DamageTextPool : MonoBehaviour +{ + public static DamageTextPool Instance { get; private set; } + + [SerializeField] private GameObject textPrefab; + [SerializeField] private int poolSize = 50; + private Queue _pool = new Queue(); + + private void Awake() + { + if (Instance != null) + { + Destroy(gameObject); + return; + } + Instance = this; + InitializePool(); + } + + private void InitializePool() + { + for (int i = 0; i < poolSize; i++) + { + var obj = Instantiate(textPrefab, transform); + var tmp = obj.GetComponent(); + obj.SetActive(false); + _pool.Enqueue(tmp); + } + } + + public void Show(Vector3 worldPos, int value, DamageType type = DamageType.Normal) + { + if (_pool.Count == 0) + InitializePool(); // mở rộng nếu thiếu + + var tmp = _pool.Dequeue(); + tmp.gameObject.SetActive(true); + + tmp.text = type switch + { + DamageType.Critical => $"CRIT -{value}", + DamageType.Heal => $"+{value}", + DamageType.Miss => "MISS", + DamageType.Immune => "IMMUNE", + _ => $"-{value}" + }; + + tmp.color = type switch + { + DamageType.Critical => Color.yellow, + DamageType.Heal => Color.green, + DamageType.Miss => Color.gray, + DamageType.Immune => Color.white, + _ => Color.red + }; + + tmp.transform.position = worldPos + Vector3.up * 2f; + tmp.transform.localScale = Vector3.one; + + // Animation bay lên rồi fade ra + var seq = DOTween.Sequence(); + seq.Append(tmp.transform.DOMoveY(worldPos.y + 3f, 1f).SetEase(Ease.OutQuad)); + seq.Join(tmp.DOFade(0, 1f)); + seq.OnComplete(() => + { + tmp.alpha = 1; + tmp.gameObject.SetActive(false); + _pool.Enqueue(tmp); + }); + } +} + +/// +/// Các loại damage để đổi màu & text +/// +public enum DamageType +{ + Normal, + Critical, + Heal, + Miss, + Immune +} diff --git a/Assets/PerfectWorld/Scripts/Managers/DamageTextManager.cs.meta b/Assets/PerfectWorld/Scripts/Managers/DamageTextManager.cs.meta new file mode 100644 index 0000000000..93ea878dac --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/DamageTextManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c9f785775e0231e488e0cbe93016b31a \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMelee.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMelee.cs index 713bd01136..82d99f9764 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMelee.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMelee.cs @@ -148,7 +148,7 @@ public int GetIdleTime() { return m_iIdleTime; } protected virtual void OnFirstTick() { m_pHost.m_iMoveMode = (int)MoveMode.MOVE_STAND; - m_pHost.PlayAction((int)EC_Player.PLAYER_ACTION_TYPE.ACT_ATTACK_1 + Random.Range(0, 3), true, 200, false); + m_pHost.PlayAction((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_ATTACK_1 + Random.Range(0, 3), true, 200, false); m_idTarget = m_pHost.m_idSelTarget; } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs index d4a70c39fb..3ad2080f30 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs @@ -139,7 +139,7 @@ public abstract class CECTracedObject } else { - EC_Player pPlayer = pObject.GetComponent(); + CECPlayer pPlayer = pObject.GetComponent(); fTouchRadius = pPlayer.GetTouchRadius(); } return m_pHost.CanTouchTarget(vHostPos, vTargetPos, fTouchRadius, iTouchReason, fMaxCut); @@ -384,7 +384,7 @@ public class CECTracedPlayer : CECTracedObject { return true; } - EC_Player pPlayer = GetTargetObject() as EC_Player; + CECPlayer pPlayer = GetTargetObject() as CECPlayer; if (pPlayer.IsElsePlayer()) { if (pPlayer.IsDead()) @@ -612,10 +612,10 @@ public class CECHPWorkTrace : CECHPWork { // Continue tracing object float fDeltaTime = dwDeltaTime /** 0.001f*/; - if (m_pHost.m_iMoveEnv == EC_Player.Move_environment.MOVEENV_GROUND) + if (m_pHost.m_iMoveEnv == CECPlayer.Move_environment.MOVEENV_GROUND) { // Play appropriate actions - if (!m_pHost.IsJumping() && !m_pHost.IsPlayingAction((int)EC_Player.PLAYER_ACTION_TYPE.ACT_TRICK_RUN) && + if (!m_pHost.IsJumping() && !m_pHost.IsPlayingAction((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_TRICK_RUN) && m_pHost.m_iMoveMode != (int)MoveMode.MOVE_SLIDE) { int iAction = m_pHost.GetMoveStandAction(true); @@ -807,7 +807,7 @@ public class CECHPWorkTrace : CECHPWork if (m_pHost.m_iMoveMode == (int)MoveMode.MOVE_SLIDE) { - m_pHost.PlayAction((int)EC_Player.PLAYER_ACTION_TYPE.ACT_JUMP_LOOP, false, 200, false); + m_pHost.PlayAction((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_JUMP_LOOP, false, 200, false); // This will cause stop moming after we slide down. A3DVECTOR3 vDir = vTargetPos - vCurPos; diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HostPlayer.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HostPlayer.cs deleted file mode 100644 index edf7b5a694..0000000000 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HostPlayer.cs +++ /dev/null @@ -1,40 +0,0 @@ -using BrewMonster; -using CSNetwork; -using CSNetwork.GPDataType; -using System; -using System.Runtime.InteropServices; -using UnityEngine; - -namespace PerfectWorld.Scripts.Managers -{ - namespace BrewMonster.Managers - { - public class EC_HostPlayer : IMsgHandler - { - public int HandlerId => (int)MANAGER_INDEX.MAN_PLAYER; - public bool ProcessMessage(ECMSG Msg) - { - switch ((int)Msg.dwMsg) - { - case int value when value == EC_MsgDef.MSG_HST_IVTRINFO: - { - OnMsgHstIvtrInfo(Msg); - break; - } - } - return true; - } - public void OnMsgHstIvtrInfo(ECMSG Msg) - { - switch (Convert.ToInt32(Msg.dwParam2)) - { - case CommandID.OWN_IVTR_DATA: - { - Debug.Log("Chay OWN_IVTR_DATA"); - break; - } - } - } - } - } -} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HostPlayer.cs.meta b/Assets/PerfectWorld/Scripts/Managers/EC_HostPlayer.cs.meta deleted file mode 100644 index fd6314db24..0000000000 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HostPlayer.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: eece34ce0cfd6bc409982ce9b90b263b \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs b/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs index a4e8ab3102..3db38e0f8f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs @@ -482,19 +482,6 @@ namespace PerfectWorld.Scripts.Managers } // Get a player (may be host or else player) by id - public EC_Player GetPlayer(int cid, uint dwBornStamp = 0) - { - CECHostPlayer pHost = GetHostPlayer(); - if (pHost && pHost.GetCharacterID() == cid) - return pHost; - else - return GetElsePlayer(cid, dwBornStamp); - } - - public CECHostPlayer GetHostPlayer() - { - return GameController.Instance.GetHostPlayer(); - } } } } \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs index f6f58bbfb4..7e17d81164 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs @@ -185,7 +185,7 @@ public class CECObject : MonoBehaviour return 0; if (pObject.IsPlayer()) - return ((EC_Player)pObject).GetCharacterID(); + return ((CECPlayer)pObject).GetCharacterID(); else if (pObject.IsNPC()) return ((CECNPC)pObject).GetNPCID(); //else if (pObject.IsMatter()) diff --git a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs index b6051346eb..c2e06790d2 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs @@ -157,6 +157,63 @@ public class CECNPC : CECObject } return true; } + public void Damaged(int iDamage, uint dwModifier = 0) + { + // == Trường hợp 1: damage là -1 hoặc -2 (chỉ để hiển thị hiệu ứng) + if (iDamage == -1 || iDamage == -2) + { + // Nếu -1 thì chơi animation bị thương + if (iDamage == -1) + PlayModelAction((int)NPCActionIndex. ACT_WOUNDED); + DamageTextPool.Instance.Show(transform.position, 0); + // Xét các kiểu modifier + /* if ((dwModifier & CECAttackEvent.MOD_IMMUNE) != 0 && !IsImmuneDisable()) + BubbleText(BUBBLE_IMMUNE, 0); + else if ((dwModifier & CECAttackEvent.MOD_NULLITY) != 0) + BubbleText(BUBBLE_INVALIDHIT, 0); + else if ((dwModifier & CECAttackEvent.MOD_ENCHANT_FAILED) != 0) + BubbleText(BUBBLE_LOSE, 0); + else if ((dwModifier & CECAttackEvent.MOD_SUCCESS) != 0) + BubbleText(BUBBLE_SUCCESS, 0); + else if ((dwModifier & CECAttackEvent.MOD_DODGE_DEBUFF) != 0) + BubbleText(BUBBLE_DODGE_DEBUFF, 0);*/ + + } + else + { + // == Trường hợp 2: có damage thật + /* bool bDeadlyStrike = (dwModifier & CECAttackEvent.MOD_CRITICAL_STRIKE) != 0; + bool bRetort = (dwModifier & CECAttackEvent.MOD_RETORT) != 0;*/ + + if (iDamage > 0) + { + PlayModelAction((int)NPCActionIndex.ACT_WOUNDED); + DamageTextPool.Instance.Show(transform.position, iDamage); + /* int p1 = 0; + if (bDeadlyStrike) + p1 |= 0x0001; + else if (bRetort) + p1 |= 0x0002; + + if ((dwModifier & CECAttackEvent.MOD_REBOUND) != 0) + BubbleText(BUBBLE_REBOUND, (uint)iDamage); + else if ((dwModifier & CECAttackEvent.MOD_BEAT_BACK) != 0) + BubbleText(BUBBLE_BEAT_BACK, (uint)iDamage); + else + BubbleText(BUBBLE_DAMAGE, (uint)iDamage, p1);*/ + } + /* else if ((dwModifier & CECAttackEvent.MOD_IMMUNE) != 0 && !IsImmuneDisable()) + BubbleText(BUBBLE_IMMUNE, 0); + else if ((dwModifier & CECAttackEvent.MOD_NULLITY) != 0) + BubbleText(BUBBLE_INVALIDHIT, 0); + else if ((dwModifier & CECAttackEvent.MOD_ENCHANT_FAILED) != 0) + BubbleText(BUBBLE_LOSE, 0); + else if ((dwModifier & CECAttackEvent.MOD_SUCCESS) != 0) + BubbleText(BUBBLE_SUCCESS, 0); + else + BubbleText(BUBBLE_HITMISSED, 0);*/ + } + } private void OnMsgNPCAtkResult(ECMSG msg) { @@ -347,7 +404,10 @@ public class CECNPC : CECObject if (iWorkID == (int)WorkID.WORK_MOVE) m_iPassiveMove = 0; } - + public bool IsDead() + { + return (m_dwStates & PlayerNPCState.GP_STATE_CORPSE) != 0; + } public static bool InitStaticRes() { m_ActionNames = new CECStringTab(); @@ -853,68 +913,8 @@ public class CECNPC : CECObject return (int)NPCActionIndex.ACT_NPC_WALK; } } - public void Damaged(int iDamage, uint dwModifier = 0) - { - // == Trường hợp 1: damage là -1 hoặc -2 (chỉ để hiển thị hiệu ứng) - if (iDamage == -1 || iDamage == -2) - { - // Nếu -1 thì chơi animation bị thương - if (iDamage == -1) - PlayModelAction((int)NPCActionIndex.ACT_WOUNDED); - - // Xét các kiểu modifier - /* if ((dwModifier & CECAttackEvent.MOD_IMMUNE) != 0 && !IsImmuneDisable()) - BubbleText(BUBBLE_IMMUNE, 0); - else if ((dwModifier & CECAttackEvent.MOD_NULLITY) != 0) - BubbleText(BUBBLE_INVALIDHIT, 0); - else if ((dwModifier & CECAttackEvent.MOD_ENCHANT_FAILED) != 0) - BubbleText(BUBBLE_LOSE, 0); - else if ((dwModifier & CECAttackEvent.MOD_SUCCESS) != 0) - BubbleText(BUBBLE_SUCCESS, 0); - else if ((dwModifier & CECAttackEvent.MOD_DODGE_DEBUFF) != 0) - BubbleText(BUBBLE_DODGE_DEBUFF, 0);*/ - } - else - { - // == Trường hợp 2: có damage thật - /* bool bDeadlyStrike = (dwModifier & CECAttackEvent.MOD_CRITICAL_STRIKE) != 0; - bool bRetort = (dwModifier & CECAttackEvent.MOD_RETORT) != 0;*/ - - if (iDamage > 0) - { - PlayModelAction((int)NPCActionIndex.ACT_WOUNDED); - - /* int p1 = 0; - if (bDeadlyStrike) - p1 |= 0x0001; - else if (bRetort) - p1 |= 0x0002;*/ - - /* if ((dwModifier & CECAttackEvent.MOD_REBOUND) != 0) - BubbleText(BUBBLE_REBOUND, (uint)iDamage); - else if ((dwModifier & CECAttackEvent.MOD_BEAT_BACK) != 0) - BubbleText(BUBBLE_BEAT_BACK, (uint)iDamage); - else - BubbleText(BUBBLE_DAMAGE, (uint)iDamage, p1);*/ - } - /* else if ((dwModifier & CECAttackEvent.MOD_IMMUNE) != 0 && !IsImmuneDisable()) - BubbleText(BUBBLE_IMMUNE, 0); - else if ((dwModifier & CECAttackEvent.MOD_NULLITY) != 0) - BubbleText(BUBBLE_INVALIDHIT, 0); - else if ((dwModifier & CECAttackEvent.MOD_ENCHANT_FAILED) != 0) - BubbleText(BUBBLE_LOSE, 0); - else if ((dwModifier & CECAttackEvent.MOD_SUCCESS) != 0) - BubbleText(BUBBLE_SUCCESS, 0); - else - BubbleText(BUBBLE_HITMISSED, 0);*/ - } - } - - public int GetMasterID() { return m_idMaster; } public bool IsMonsterOrPet() { return IsMonsterNPC() || IsPetNPC(); } - public bool IsMonsterNPC() { return (int)ClassID.OCID_MONSTER == m_iCID; } - public bool IsPetNPC() { return (int)ClassID.OCID_PET == m_iCID; } - public bool IsDead() { return (m_dwStates & PlayerNPCState.GP_STATE_CORPSE) != 0; } + public bool IsPetNPC() { return (int)Class_ID.OCID_PET == m_iCID; } public void PlayMoveAction(int iMoveMode) { BrewMonster.BMLogger.LogError($"HoangDev: PlayMoveAction {iMoveMode}"); @@ -984,8 +984,8 @@ public class CECNPC : CECObject // Get NPC's real position on server public A3DVECTOR3 GetServerPos() - { - return EC_Utility.ToA3DVECTOR3(m_vServerPos); + { + return EC_Utility.ToA3DVECTOR3(m_vServerPos); } // Get master id @@ -996,22 +996,22 @@ public class CECNPC : CECObject public virtual bool IsInBattleDefenderCamp() { return false; } // Get role in battle public virtual int GetRoleInBattle() { return 0; } - public int GetOwnerFaction(){ return m_idOwnerFaction; } + public int GetOwnerFaction() { return m_idOwnerFaction; } public bool IsFactionPVPMineCar() - { - //if (const MONSTER_ESSENCE* pMonsterEssence = GetMonsterEssence()){ - // return (pMonsterEssence.faction & (1 << 19)) != 0; - //} - return false; + { + //if (const MONSTER_ESSENCE* pMonsterEssence = GetMonsterEssence()){ + // return (pMonsterEssence.faction & (1 << 19)) != 0; + //} + return false; } public bool IsFactionPVPMineBase() - { - //if (const MONSTER_ESSENCE *pMonsterEssence = GetMonsterEssence()){ - // return (pMonsterEssence->faction & (1 << 20)) != 0; - //} - return false; + { + //if (const MONSTER_ESSENCE *pMonsterEssence = GetMonsterEssence()){ + // return (pMonsterEssence->faction & (1 << 20)) != 0; + //} + return false; } // Get NPC ID diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs index cca120cf03..63b1028091 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Numerics; using System.Runtime.InteropServices; using System.Text; +using Unity.VisualScripting.Antlr3.Runtime.Tree; namespace CSNetwork.GPDataType { @@ -36,6 +37,13 @@ namespace CSNetwork.GPDataType GP_MOVE_WATER = 0x80, GP_MOVE_ENVMASK = 0xc0, }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_be_hurt + { + public int attacker_id; + public int damage; + public byte flag; // 1, attacker ±ä³ÈÃû + }; public static class CommandID // Command ID { @@ -537,13 +545,19 @@ namespace CSNetwork.GPDataType } }; [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct cmd_hurt_result + { + public int target_id; + public int damage; + }; + [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct cmd_enchant_result { public int caster; public int target; public int skill; - public char level; - public char orange_name; + public byte level; + public byte orange_name; public int attack_flag; public byte section; }; @@ -555,7 +569,7 @@ namespace CSNetwork.GPDataType public int skill_id; public int damage; public int attack_flag; //±ê¼Ç¸Ã¹¥»÷ÊÇ·ñÓй¥»÷ÓÅ»¯·ûºÍ·ÀÓùÓÅ»¯·ûºÍÖØ»÷·¢Éú - public char speed; //¹¥»÷ËÙ¶È speed * 50 ms + public byte speed; //¹¥»÷ËÙ¶È speed * 50 ms public byte section; }; // Gender @@ -610,7 +624,7 @@ namespace CSNetwork.GPDataType public int target_id; public int damage; public int attack_flag; //±ê¼Ç¸Ã¹¥»÷ÊÇ·ñÓй¥»÷ÓÅ»¯·ûºÍ·ÀÓùÓÅ»¯·ûºÍÖØ»÷·¢Éú - public char speed; //¹¥»÷ËÙ¶È speed * 50 ms + public byte speed; //¹¥»÷ËÙ¶È speed * 50 ms }; [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct A3DVECTOR3 diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs index 9cb131a381..ab022595f3 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -419,12 +419,12 @@ namespace CSNetwork EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_HURTRESULT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader); break; case CommandID.OBJECT_ATTACK_RESULT: - _logger.Info($"TASK_DATA: " + pCmdHeader); + _logger.Info($"OBJECT_ATTACK_RESULT: " + pCmdHeader); int id = GPDataTypeHelper.FromBytes(pDataBuf); if (ISPLAYERID(id)) - EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_TASKDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERATKRESULT, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader); else if (ISNPCID(id)) - EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_TASKDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize); + EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCATKRESULT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader); break; case CommandID.ERROR_MESSAGE: _logger.Info($"### GameDataSend: ERROR_MESSAGE: {BitConverter.ToInt32(pDataBuf, 0)}"); diff --git a/Assets/PerfectWorld/Scripts/Network/EC_ManMessageMono.cs b/Assets/PerfectWorld/Scripts/Network/EC_ManMessageMono.cs index 57599c37b2..76741ba3a6 100644 --- a/Assets/PerfectWorld/Scripts/Network/EC_ManMessageMono.cs +++ b/Assets/PerfectWorld/Scripts/Network/EC_ManMessageMono.cs @@ -74,8 +74,8 @@ namespace BrewMonster if (!(pObject = EC_ManPlayer.GetPlayer(idObject))) return null; - if ((iAliveFlag == 1 && (pObject as EC_Player).IsDead()) || - (iAliveFlag == 2 && !(pObject as EC_Player).IsDead())) + if ((iAliveFlag == 1 && (pObject as CECPlayer).IsDead()) || + (iAliveFlag == 2 && !(pObject as CECPlayer).IsDead())) return null; } //else if (GPDataTypeHelper.ISMATTERID(idObject)) diff --git a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs index 5d124ade08..25349a2f5c 100644 --- a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs +++ b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs @@ -128,6 +128,32 @@ namespace PerfectWorld.Scripts.Player visual.InitHostPlayerEventDoneHandler(); } } + public bool ProcessMessage(ECMSG Msg) + { + switch (Msg.dwMsg) + { + case long value when value == EC_MsgDef. MSG_PM_PLAYERATKRESULT: OnMsgPlayerAtkResult(Msg); break; + } + return true; + } + + private void OnMsgPlayerAtkResult(ECMSG Msg) + { + cmd_object_atk_result pCmd = (cmd_object_atk_result)Msg.dwParam1; + + // Face to target + TurnFaceTo(pCmd.target_id); + + /* PlayAttackEffect(pCmd.target_id, 0, 0, -1, pCmd.attack_flag, pCmd.speed * 50); + + if (!m_pEPWorkMan->FindWork(CECEPWorkMan::WT_NORMAL, CECEPWork::WORK_HACKOBJECT)) + { + m_pEPWorkMan->StartNormalWork(new CECEPWorkMelee(m_pEPWorkMan, pCmd->target_id)); + } + + // Enter fight state + EnterFightState();*/ + } void CalcPlayerAABB() { diff --git a/Assets/Scenes/NPCRender.unity b/Assets/Scenes/NPCRender.unity index 0e9c05f0b5..3321ee92e1 100644 --- a/Assets/Scenes/NPCRender.unity +++ b/Assets/Scenes/NPCRender.unity @@ -11885,6 +11885,53 @@ Transform: m_Children: [] m_Father: {fileID: 127793384} m_LocalEulerAnglesHint: {x: 22.094265, y: 53.346302, z: -7.076923} +--- !u!1 &157741349 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 157741351} + - component: {fileID: 157741350} + m_Layer: 0 + m_Name: DamageTextManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &157741350 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 157741349} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c9f785775e0231e488e0cbe93016b31a, type: 3} + m_Name: + m_EditorClassIdentifier: + textPrefab: {fileID: 1329996621} + poolSize: 50 +--- !u!4 &157741351 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 157741349} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: 2.7755576e-17, w: 1} + m_LocalPosition: {x: -769.91, y: 47.922, z: -258.54} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1329996622} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &158051892 GameObject: m_ObjectHideFlags: 0 @@ -104038,6 +104085,182 @@ Transform: - {fileID: 1116563098} m_Father: {fileID: 1492662512} m_LocalEulerAnglesHint: {x: -3.4098623, y: -32.42809, z: -6.723053} +--- !u!1 &1329996621 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1329996622} + - component: {fileID: 1329996624} + - component: {fileID: 1329996623} + m_Layer: 0 + m_Name: damageTextPrefab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1329996622 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1329996621} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 157741351} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1329996623 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1329996621} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 1 + m_fontSizeBase: 1 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 1329996624} + m_maskType: 0 +--- !u!23 &1329996624 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1329996621} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &1330341667 GameObject: m_ObjectHideFlags: 0 @@ -165578,4 +165801,5 @@ SceneRoots: - {fileID: 960760104} - {fileID: 1801883899} - {fileID: 1755699698} + - {fileID: 157741351} - {fileID: 96894795} diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index 066c3279a1..7274ed7ee9 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -238,9 +238,39 @@ 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_HURTRESULT: OnMsgHstHurtResult(Msg); break; } } + private void OnMsgHstHurtResult(ECMSG Msg) + { + BMLogger.LogError("HoangDev : OnMsgHstHurtResult"); + int cmd = Convert.ToInt32(Msg.dwParam2); + if (cmd == CommandID. BE_HURT) + { + cmd_be_hurt pCmd = (cmd_be_hurt)Msg.dwParam1; + /* if (pCmd.damage!=0) + Damaged(pCmd->damage);*/ + } + else if (cmd == CommandID. HURT_RESULT) + { + cmd_hurt_result pCmd = (cmd_hurt_result)Msg.dwParam1; + if (pCmd.target_id == m_PlayerInfo.cid) + return; // Host himself will receive BE_HURT, so ignore this. + if (UnityGameSession.Instance.GameSession. ISPLAYERID(pCmd.target_id)) + { + /*CECElsePlayer pTarget = m_pPlayerMan.GetElsePlayer(pCmd.target_id); + if (pTarget) + pTarget->Damaged(pCmd->damage);*/ + } + else if (UnityGameSession.Instance.GameSession.ISNPCID(pCmd.target_id)) + { + CECNPC pTarget = EC_ManMessageMono.Instance._CECNPCMan.GetNPC(pCmd.target_id); + if (pTarget) + pTarget.Damaged(pCmd.damage); + } + } + } public void OnMsgHstPickupItem(in ECMSG Msg) { var data = Msg.dwParam1 as byte[]; diff --git a/Assets/Scripts/Move/CECHostMove.cs b/Assets/Scripts/Move/CECHostMove.cs index 5c1803db59..0c416af190 100644 --- a/Assets/Scripts/Move/CECHostMove.cs +++ b/Assets/Scripts/Move/CECHostMove.cs @@ -88,7 +88,7 @@ public class CECHostMove float fSpeed = 0f; switch (m_pHost.GetMoveEnv()) { - case EC_Player.Move_environment.MOVEENV_AIR: + case CECPlayer.Move_environment.MOVEENV_AIR: iMoveMode |= (int)GPMoveMode.GP_MOVE_AIR; fSpeed = m_pHost.GetFlySpeed(); diff --git a/Assets/Scripts/Move/CECPlayer.cs b/Assets/Scripts/Move/CECPlayer.cs index f6fa7c2b33..49b8ddeed7 100644 --- a/Assets/Scripts/Move/CECPlayer.cs +++ b/Assets/Scripts/Move/CECPlayer.cs @@ -6,7 +6,7 @@ using System; using System.Collections.Generic; using UnityEngine; -public abstract class EC_Player : CECObject +public abstract class CECPlayer : CECObject { private static PLAYER_ACTION[] _default_actions; private static PLAYER_ACTION[] _turning_actions; @@ -383,7 +383,6 @@ public abstract class EC_Player : CECObject // Get move environment public int GetMoveEnv(){ return m_iMoveEnv; } // Get character ID - public int GetCharacterID(){ return m_PlayerInfo.cid; } } public struct PlayActionEvent {