This commit is contained in:
VDH
2025-10-09 14:06:12 +07:00
parent c71e943ab7
commit 7c5652ec2e
19 changed files with 255 additions and 46 deletions
@@ -1,11 +1,14 @@
using BrewMonster;
using BrewMonster.Network;
using CSNetwork;
using CSNetwork.GPDataType;
using DG.Tweening;
using PerfectWorld.Scripts.Managers.BrewMonster.Managers;
using System;
using System.Buffers.Binary;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Unity.VisualScripting;
using UnityEngine;
public class CECNPCMan : CECObject, IMsgHandler
@@ -29,7 +32,7 @@ public class CECNPCMan : CECObject, IMsgHandler
case long value when value == EC_MsgDef.MSG_NM_NPCINFO: OnMsgNPCInfo(Msg); break;
case long value when value == EC_MsgDef.MSG_NM_NPCMOVE: OnMsgNPCMove(Msg); break;
case long value when value == EC_MsgDef.MSG_NM_NPCSTOPMOVE: OnMsgNPCStopMove(Msg); break;
case long value when value == EC_MsgDef. MSG_NM_NPCATKRESULT : TransmitMessage(Msg); break;
case long value when value == EC_MsgDef.MSG_NM_NPCATKRESULT: TransmitMessage(Msg); break;
}
}
return true;
@@ -42,7 +45,7 @@ public class CECNPCMan : CECObject, IMsgHandler
{
case long value when value == EC_MsgDef.MSG_NM_NPCATKRESULT:
nid = ((cmd_object_atk_result )msg.dwParam1).attacker_id;
nid = ((cmd_object_atk_result)msg.dwParam1).attacker_id;
break;
default:
return false;
@@ -52,6 +55,101 @@ public class CECNPCMan : CECObject, IMsgHandler
pNPC.ProcessMessage(msg);
else
{
CECNPC pAttacker = GetNPCFromAll(nid);
CECHostPlayer pHost = GameController.Instance.GetHostPlayer();
EC_ManPlayer pPlayerMan = EC_ManMessageMono.Instance.GetECManPlayer;
int idTarget = (0);
int dwModifier = (0);
int nDamage = (0);
switch (msg.dwMsg)
{
case long value when value == EC_MsgDef.MSG_NM_NPCATKRESULT:
{
cmd_object_atk_result pCmd = (cmd_object_atk_result)msg.dwParam1;
idTarget = pCmd.target_id;
dwModifier = pCmd.attack_flag;
nDamage = pCmd.damage;
}
break;
case long value when value == EC_MsgDef.MSG_NM_ENCHANTRESULT:
{
cmd_enchant_result pCmd = (cmd_enchant_result)msg.dwParam1;
idTarget = pCmd.target;
dwModifier = pCmd.attack_flag;
//nDamage = (GNET::ElementSkill::GetType(pCmd.skill) == GNET::TYPE_ATTACK) ? -1 : -2;
}
break;
case long value when value == EC_MsgDef.MSG_NM_NPCSKILLRESULT:
{
cmd_object_skill_attack_result pCmd = (cmd_object_skill_attack_result)msg.dwParam1;
idTarget = pCmd.target_id;
dwModifier = pCmd.attack_flag;
nDamage = pCmd.attack_flag;
}
break;
}
while (idTarget != 0)
{
if (UnityGameSession.Instance.GameSession.ISNPCID(idTarget))
{
// Bị tấn công là NPC
var pTarget = GetNPCFromAll(idTarget);
if (pTarget == null)
{
// Không tìm thấy NPC bị tấn công → thoát
break;
}
// Nếu là pet của chính người chơi
if (pTarget.IsPetNPC() && pTarget.GetMasterID() == pHost.GetCharacterID())
{
// Pet của mình bị đánh → hiển thị damage
pTarget.Damaged(nDamage,(uint) dwModifier);
break;
}
// Nếu attacker chưa xác định
if (pAttacker == null)
{
break;
}
// Nếu attacker là pet của mình → cho phép hiển thị damage target
if (pAttacker.IsPetNPC() && pAttacker.GetMasterID() == pHost.GetCharacterID())
{
//pTarget.Damaged(nDamage, dwModifier);
}
break;
}
if (UnityGameSession.Instance.GameSession.ISPLAYERID(idTarget))
{
// Bị tấn công là người chơi khác
var pTarget = pPlayerMan.GetPlayer(idTarget);
if (pTarget == null)
{
break;
}
if (pAttacker == null)
{
break;
}
// Nếu attacker là pet của mình → xử lý damage
if (pAttacker.IsPetNPC() && pAttacker.GetMasterID() == pHost.GetCharacterID())
{
//pTarget.Damaged(nDamage, dwModifier);
}
break;
}
break;
}
}
return true;
@@ -164,8 +262,8 @@ public class CECNPCMan : CECObject, IMsgHandler
CECNPC pNPC = SeekOutNPC(pCmd.idNPC);
if (pNPC)
{
ROLEBASICPROP bp = pNPC.GetBasicProps();
ROLEEXTPROP ep = pNPC.GetExtendProps();
ROLEBASICPROP bp = pNPC.GetBasicProps();
ROLEEXTPROP ep = pNPC.GetExtendProps();
bp.iCurHP = pCmd.iHP;
ep.bs.max_hp = pCmd.iMaxHP;
@@ -288,4 +386,20 @@ public class CECNPCMan : CECObject, IMsgHandler
return pNPC;
}
public CECNPC GetNPCFromAll(int nid)
{
CECNPC pNPC = GetNPC(nid);
if (pNPC)
return pNPC;
// Search from disappear array ?
/* for (int i = 0; i < m_aDisappearNPCs.GetSize(); i++)
{
CECNPC* pNPC = m_aDisappearNPCs[i];
if (pNPC->GetNPCID() == nid)
return pNPC;
}*/
return null;
}
}
@@ -205,7 +205,6 @@ namespace PerfectWorld.Scripts.Managers
preSize += iSize;
}
Debug.LogError("PLAYER_INFO_1_LIST");
break;
}
}
@@ -343,6 +342,19 @@ namespace PerfectWorld.Scripts.Managers
return player;
}
public CECPlayer GetPlayer(int cid, uint dwBornStamp = 0/* 0 */)
{
CECHostPlayer pHost = GetHostPlayer();
if (pHost && pHost.GetCharacterID() == cid)
return pHost;
else
return GetElsePlayer(cid, dwBornStamp);
}
private CECHostPlayer GetHostPlayer()
{
return GameController.Instance.GetHostPlayer();
}
public bool OnMsgPlayerStopMove(ECMSG Msg)
{
+61 -4
View File
@@ -853,11 +853,68 @@ public class CECNPC : CECObject
return (int)NPCActionIndex.ACT_NPC_WALK;
}
}
bool IsMonsterOrPet() { return IsMonsterNPC() || IsPetNPC(); }
bool IsMonsterNPC() { return (int)Class_ID.OCID_MONSTER == m_iCID; }
bool IsPetNPC() { return (int)Class_ID.OCID_PET == m_iCID; }
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);
public bool IsDead(){ return (m_dwStates & PlayerNPCState.GP_STATE_CORPSE) != 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);
/* 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 void PlayMoveAction(int iMoveMode)
{
BrewMonster.BMLogger.LogError($"HoangDev: PlayMoveAction {iMoveMode}");
@@ -536,7 +536,28 @@ namespace CSNetwork.GPDataType
this.fWaterSurf = fWaterSurf;
}
};
[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 int attack_flag;
public byte section;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_object_skill_attack_result
{
public int attacker_id;
public int target_id;
public int skill_id;
public int damage;
public int attack_flag; //±ê¼Ç¸Ã¹¥»÷ÊÇ·ñÓй¥»÷ÓÅ»¯·ûºÍ·ÀÓùÓÅ»¯·ûºÍÖØ»÷·¢Éú
public char speed; //¹¥»÷ËÙ¶È speed * 50 ms
public byte section;
};
// Gender
public static class GENDER
{
@@ -582,7 +603,15 @@ namespace CSNetwork.GPDataType
public byte dir;
public byte move_mode;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_object_atk_result
{
public int attacker_id;
public int target_id;
public int damage;
public int attack_flag; //±ê¼Ç¸Ã¹¥»÷ÊÇ·ñÓй¥»÷ÓÅ»¯·ûºÍ·ÀÓùÓÅ»¯·ûºÍÖØ»÷·¢Éú
public char speed; //¹¥»÷ËÙ¶È speed * 50 ms
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct A3DVECTOR3
{
@@ -344,7 +344,7 @@ namespace CSNetwork
int lenghtDataType = Marshal.SizeOf<int>();
byte[] arrByteData = GetBytes(pDataBuf, lenghtDataType, 0);
int idObjMove = BitConverter.ToInt32(arrByteData);
if (IsPlayerId(idObjMove))
if (ISPLAYERID(idObjMove))
{
EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERMOVE, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader, iHostID);
}
@@ -356,12 +356,12 @@ namespace CSNetwork
break;
case CommandID.OBJECT_STOP_MOVE:
{
int id = GPDataTypeHelper.FromBytes<int>(pDataBuf);
if (IsPlayerId(id))
int id1 = GPDataTypeHelper.FromBytes<int>(pDataBuf);
if (ISPLAYERID(id1))
{
EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERSTOPMOVE, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
}
else if (ISNPCID(id))
else if (ISNPCID(id1))
{
_logger.Info("HoangDev : NPC OBJECT_MOVE");
EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCSTOPMOVE, (int)MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
@@ -414,6 +414,18 @@ namespace CSNetwork
case CommandID.TASK_VAR_DATA:
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_TASKDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize);
break;
case CommandID.BE_HURT:
case CommandID.HURT_RESULT:
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);
int id = GPDataTypeHelper.FromBytes<int>(pDataBuf);
if (ISPLAYERID(id))
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_TASKDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize);
else if (ISNPCID(id))
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_TASKDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader, dwDataSize);
break;
case CommandID.ERROR_MESSAGE:
_logger.Info($"### GameDataSend: ERROR_MESSAGE: {BitConverter.ToInt32(pDataBuf, 0)}");
break;
@@ -659,7 +671,7 @@ namespace CSNetwork
// GC.SuppressFinalize(this);
}
public bool IsPlayerId(int id)
public bool ISPLAYERID(int id)
{
return id != 0 && (id & 0x80000000) == 0;
}
@@ -28,6 +28,7 @@ namespace BrewMonster.Network
private string _username = "";
private string _password = "";
public GameSession GameSession => _gameSession;
protected override void Awake()
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
@@ -7,7 +7,7 @@ using UnityEngine;
namespace PerfectWorld.Scripts.Player
{
public class EC_ElsePlayer : EC_Player
public class EC_ElsePlayer : CECPlayer
{
A3DVECTOR3 m_vMoveDir; // Player's velocity
A3DVECTOR3 m_vServerPos; // Player's real position on server
+1 -2
View File
@@ -18,7 +18,7 @@ using UnityEngine.SceneManagement;
using UnityEngine.UI;
using Scene = UnityEngine.SceneManagement.Scene;
public class CECHostPlayer : EC_Player
public class CECHostPlayer : CECPlayer
{
[SerializeField] private TextMeshPro txtName;
[SerializeField] private CharacterController controller;
@@ -468,7 +468,6 @@ public class CECHostPlayer : EC_Player
if (txtName != null) txtName.text = roleName;
transform.position = pos;
SetModelHostPlayer();
Debug.LogError("Pos Character = " + pos);
joystick = FindAnyObjectByType<Joystick>();
EventBus.Subscribe<JoystickRealeaseEvent>(JoystickRelease);
EventBus.Subscribe<JoystickPressEvent>(JoystickStartDrag);
+1 -1
View File
@@ -4,7 +4,7 @@ using System;
using System.Collections;
using System.Runtime.InteropServices;
using UnityEngine;
using static EC_Player;
using static CECPlayer;
public static class EC_Utility
{
+1 -1
View File
@@ -54,7 +54,7 @@ public class GameController : MonoBehaviour
Debug.LogError("null prefab");
return;
}
EC_Player.InitStaticRes();
CECPlayer.InitStaticRes();
hostPlayer = Instantiate(characterPrefab, transform);
hostPlayer.InitCharacter(info);
cinemachineCamera.Follow = hostPlayer.transform;
+2 -2
View File
@@ -5,11 +5,11 @@ public class InitializePlayer /*: IAutoInitialize*/
{
public void Dispose()
{
EC_Player.Dispose();
CECPlayer.Dispose();
}
public void Initialize()
{
EC_Player.InitStaticRes();
CECPlayer.InitStaticRes();
}
}
@@ -46,6 +46,9 @@ public abstract class EC_Player : CECObject
public bool IsDead(){ return (m_dwStates & PlayerNPCState.GP_STATE_CORPSE) != 0; }
public bool IsValidAction(int iIndex) { return (iIndex >= 0 && iIndex < (int)PLAYER_ACTION_TYPE.ACT_MAX) ? true : false; }
public int GetCharacterID() { return m_PlayerInfo.cid; }
private static void BuildActionList()
{
if (_default_actions == null)
+2
View File
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 041192bec8f11c747a80df312c2df184
-2
View File
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: be4a22babee7846459b0421234a44c99
@@ -1,5 +1,5 @@
using UnityEngine;
using static EC_Player;
using static CECPlayer;
public class PlayerIdleState : PlayerState
{
@@ -1,5 +1,5 @@
using UnityEngine;
using static EC_Player;
using static CECPlayer;
public class PlayerMoveState : PlayerState
{
+1 -1
View File
@@ -23,7 +23,7 @@ public class PlayerVisual : MonoBehaviour
BrewMonster.BMLogger.LogError("animancer == null");
return;
}
var player = GetComponentInParent<EC_Player>();
var player = GetComponentInParent<CECPlayer>();
if(player == null)
{
BrewMonster.BMLogger.LogError("player == null");
-2
View File
@@ -1,7 +1,5 @@
{
"dependencies": {
"com.boxqkrtm.ide.cursor": "https://github.com/boxqkrtm/com.unity.ide.cursor.git",
"com.github-glitchenzo.nugetforunity": "https://github.com/GlitchEnzo/NuGetForUnity.git?path=/src/NuGetForUnity",
"com.unity.ai.navigation": "2.0.9",
"com.unity.cinemachine": "3.1.4",
"com.unity.collab-proxy": "2.9.3",
-16
View File
@@ -1,21 +1,5 @@
{
"dependencies": {
"com.boxqkrtm.ide.cursor": {
"version": "https://github.com/boxqkrtm/com.unity.ide.cursor.git",
"depth": 0,
"source": "git",
"dependencies": {
"com.unity.test-framework": "1.1.9"
},
"hash": "38fecf55e4fd94ccfe58a92ed8ad1a529ba1694e"
},
"com.github-glitchenzo.nugetforunity": {
"version": "https://github.com/GlitchEnzo/NuGetForUnity.git?path=/src/NuGetForUnity",
"depth": 0,
"source": "git",
"dependencies": {},
"hash": "a7c6b49a0141a5bff9b1983e38137522ef61977d"
},
"com.unity.ai.navigation": {
"version": "2.0.9",
"depth": 0,