skill processing

This commit is contained in:
VDH
2025-11-11 13:33:27 +07:00
parent eed08c2b13
commit cbf626fa28
14 changed files with 550 additions and 147 deletions
@@ -26,7 +26,7 @@ public abstract class CECPlayer : CECObject
protected GameObject _pPlayerModel;
protected float rotationSpeed = 5;
internal int m_iMoveMode; // Player's move mode
internal int m_idSelTarget;
[SerializeField] internal int m_idSelTarget;
protected int m_iShape; // Ñ¡ÖÐÄ¿±êµÄID
protected uint m_dwStates; // Player's basic states
protected uint m_uAttackType;
+3 -2
View File
@@ -7,6 +7,7 @@ using CSNetwork.GPDataType;
using ModelRenderer.Scripts.Common;
using System;
using System.IO;
using System.Threading.Tasks;
using UnityEngine;
public class CECNPC : CECObject
@@ -778,7 +779,7 @@ public class CECNPC : CECObject
QueueLoadNPCModel();
}
public void QueueLoadNPCModel()
public async Task QueueLoadNPCModel()
{
/* if (ShouldUseMasterModel())
{
@@ -793,7 +794,7 @@ public class CECNPC : CECObject
{
return;
}
var model = NPCBuilder.Instance.GetModelByPath(szModelFile.ToLower());
var model = await NPCBuilder.Instance.GetModelByPath(szModelFile.ToLower());
if (model == null) {
model = GameObject.CreatePrimitive(PrimitiveType.Capsule);
@@ -10,7 +10,8 @@ using BrewMonster;
#if UNITY_EDITOR
using Animancer;
using BrewMonster.Scripts; // B?o đ?m b?n có Animancer package
using BrewMonster.Scripts;
using System.Threading.Tasks; // B?o đ?m b?n có Animancer package
#endif
public class NPCBuilder : MonoSingleton<NPCBuilder>
@@ -26,9 +27,9 @@ public class NPCBuilder : MonoSingleton<NPCBuilder>
private Dictionary<string, GameObject> modelNPCDic;
public GameObject GetModelByPath(string path)
public async Task<GameObject> GetModelByPath(string path)
{
return AddressableManager.Instance.LoadPrefabAsync(path).Result;
return await AddressableManager.Instance.LoadPrefabAsync(path);
}
#if UNITY_EDITOR
@@ -436,7 +436,6 @@ namespace CSNetwork.C2SCommand
// Serialize the command and return the serialized data
return SerializeCommand(eCommandID.TASK_VAR_DATA, cmd);
}
public static Octets CreateGetAllDataCommand(bool byPack, bool byEquip, bool byTask)
{
var cmd = new CMD_GetAllData
@@ -1200,7 +1200,7 @@ namespace CSNetwork.GPDataType
public struct cmd_skill_data
{
public uint skill_count;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SKILL
{
public short id_skill;
@@ -1208,20 +1208,18 @@ namespace CSNetwork.GPDataType
public short ability;
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
public SKILL[] skill_list;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_scene_service_npc_list
{
public uint count;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct NpcEntry
{
public int tid; // npc template id
public int nid; // npc id
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
public NpcEntry[] list;
}
@@ -390,7 +390,6 @@ namespace CSNetwork
case CommandID.PLAYER_INFO_1_LIST:
case CommandID.PLAYER_INFO_00:
case CommandID.SELF_INFO_1:
// OnMsgPlayerInfo(-1, pDataBuf, pCmdHeader);
EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERINFO, (int)MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf,
pCmdHeader, iHostID, _selectedRole);
break;
@@ -509,12 +508,10 @@ namespace CSNetwork
EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCATKRESULT, MANAGER_INDEX.MAN_NPC, 0, pDataBuf, pCmdHeader);
break;
case CommandID.HOST_ATTACKRESULT:
_logger.Info($"HOST_ATTACKRESULT: " + pCmdHeader);
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_ATKRESULT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
pCmdHeader);
break;
case CommandID.HOST_ATTACKED:
_logger.Info($"HOST_ATTACKED: " + pCmdHeader);
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_ATTACKED, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf,
pCmdHeader);
break;
@@ -609,52 +606,15 @@ namespace CSNetwork
break;
case CommandID.SCENE_SERVICE_NPC_LIST:
{
cmd_scene_service_npc_list npcList = GPDataTypeHelper.FromBytes<cmd_scene_service_npc_list>(pDataBuf);
CECHostSkillModel.Instance.RecvNPCServiceList(protocol.Data);
break;
}
case CommandID.SKILL_DATA:
BMLogger.LogError("HoangDev: SKILL_DATASKILL_DATA");
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_SKILLDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
break;
}
}
public void OnMsgPlayerInfo(int iSubID, byte[] data, ushort pCmdHeader)
{
if (iSubID == 0)
{
}
else if (iSubID < 0)
{
int iHostID = _selectedRole.roleid;
int lenghtByte = Marshal.SizeOf<int>();
byte[] byteArray = new byte[lenghtByte];
for (int i = 0; i < lenghtByte; i++)
{
byteArray[i] = data[i];
}
int cid = BitConverter.ToInt32(byteArray);
switch (pCmdHeader)
{
case CommandID.PLAYER_INFO_1:
case CommandID.PLAYER_ENTER_WORLD:
case CommandID.PLAYER_ENTER_SLICE:
{
if (cid != iHostID)
{
_logger.Info("### OnMsgPlayerInfo: ElsePlayer join");
}
break;
}
}
}
else
{
}
}
private void HandleSelectRoleResponse(SelectRole_Re protocol)
{
@@ -907,7 +867,12 @@ namespace CSNetwork
SendProtocol(gamedatasend);
}
public void c2s_CmdSendEnterPKPrecinctint()
{
gamedatasend gamedatasend = new gamedatasend();
gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.ENTER_PK_PROTECTED);
SendProtocol(gamedatasend);
}
public void SendChatData(byte cChannel, in string szMsg, int iPack, int iSlot)
{
publicchat publicChat = new publicchat();
@@ -245,7 +245,10 @@ namespace BrewMonster.Network
{
Instance._gameSession.c2s_CmdSelectTarget(idTarget);
}
public static void c2s_CmdSendEnterPKPrecinct()
{
Instance._gameSession.c2s_CmdSendEnterPKPrecinctint();
}
#region Task
public static void c2s_CmdGetAllData(bool byPack, bool byEquip, bool byTask)
{
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BrewMonster.Assets.PerfectWorld.Scripts.Players
{
public class CECPlayerWrapper
{
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: fad92b0f2869eb0459d2e0a2dc6bb74e
@@ -52,7 +52,7 @@ namespace BrewMonster.Scripts.Skills
}
public void ProcessServiceList()
{
if (m_npcListData== null)
if (m_npcListData == null)
{
BMLogger.LogWarning("CECHostSkillModel::ProcessServiceList, m_npcListData is null.");
return;
@@ -67,7 +67,17 @@ namespace BrewMonster.Scripts.Skills
byte[] bodyBytes = new byte[bodySize];
Buffer.BlockCopy(data, offset, bodyBytes, 0, bodySize);
cmd_scene_service_npc_list npcList = GPDataTypeHelper.FromBytes<cmd_scene_service_npc_list>(bodyBytes);
cmd_scene_service_npc_list npcList = default;
npcList.count = GPDataTypeHelper.FromBytes<uint>(bodyBytes);
offset = sizeof(uint);
int NpcEntrySize = Marshal.SizeOf<cmd_scene_service_npc_list.NpcEntry>();
npcList.list = new cmd_scene_service_npc_list.NpcEntry[npcList.count];
for (int z = 0; z < npcList.count; z++)
{
npcList.list[z] = GPDataTypeHelper.FromBytes<cmd_scene_service_npc_list.NpcEntry>(bodyBytes, offset);
offset += NpcEntrySize;
}
int i;
for (i = 0; i < npcList.count; i++)
@@ -131,7 +141,7 @@ namespace BrewMonster.Scripts.Skills
public void RecvNPCServiceList(Octets Data)
{
m_npcListData = Data;
BMLogger.LogError("HoangDev: m_npcListData= "+ m_npcListData.Length);
if (!m_bInitialized)
{
return;
@@ -23,6 +23,7 @@ namespace BrewMonster.Assets.PerfectWorld.Scripts.Skills
{
map.Clear();
PersistentData skill;
for (int i = 0; i < (int)pdata.skill_count; i++)
{
cmd_skill_data.SKILL item = pdata.skill_list[i];
@@ -160,7 +160,6 @@ namespace BrewMonster.UI
await Task.Delay(10000);
UnityGameSession.RequesrQueryPlayerCash();
await Task.Delay(1000);
UnityGameSession.c2s_CmdGetAllData(true, true, false);
EC_Game.Init();
}
+98 -80
View File
@@ -31,6 +31,8 @@ using UnityEngine.UI;
using static Unity.Burst.Intrinsics.X86.Avx;
using static UnityEditor.PlayerSettings;
using Scene = UnityEngine.SceneManagement.Scene;
using Trace_reason = CECHPWorkTrace.Trace_reason;
using Host_work_ID = BrewMonster.Scripts.CECHPWork.Host_work_ID;
public class CECHostPlayer : CECPlayer
{
@@ -249,15 +251,15 @@ public class CECHostPlayer : CECPlayer
SelectTarget(m_idUCSelTarget);
}
/* if (idTraceTarget != 0)
{
if (iTraceReason == CECHPWorkTrace.Trace_reason.TRACE_ATTACK)
/* if (idTraceTarget != 0)
{
if (!CanDo(ActionCanDo.CANDO_MELEE))
return;
NormalAttackObject(idTraceTarget, bForceAttack);
}
}*/
if (iTraceReason == CECHPWorkTrace.Trace_reason.TRACE_ATTACK)
{
if (!CanDo(ActionCanDo.CANDO_MELEE))
return;
NormalAttackObject(idTraceTarget, bForceAttack);
}
}*/
}
m_pWorkMan?.Tick(Time.deltaTime);
}
@@ -404,8 +406,16 @@ public class CECHostPlayer : CECPlayer
private void OnMsgHstSkillData(ECMSG Msg)
{
cmd_skill_data pCmd = GPDataTypeHelper.FromBytes<cmd_skill_data>((byte[])Msg.dwParam1);
cmd_skill_data pCmd = default;
pCmd.skill_count = GPDataTypeHelper.FromBytes<uint>((byte[])Msg.dwParam1);
int offset = sizeof(uint);
int skillSize = Marshal.SizeOf<cmd_skill_data.SKILL>();
pCmd.skill_list = new cmd_skill_data.SKILL[2];
for (int i = 0; i < pCmd.skill_count; i++)
{
pCmd.skill_list[i] = GPDataTypeHelper.FromBytes<cmd_skill_data.SKILL>((byte[])Msg.dwParam1, offset);
offset += skillSize;
}
if (pCmd.skill_list == null)
{
BMLogger.LogError("OnMsgHstSkillData: cmd is null");
@@ -419,22 +429,22 @@ public class CECHostPlayer : CECPlayer
if (HostIsReady())
{
/*
for (int i = 0; i < HostConstants.NUM_HOSTSCSETS1; i++)
{
if (hostPlayer.m_aSCSets1[i] != null)
{
hostPlayer.m_aSCSets1[i].RemoveSkillShortcuts();
}
}
/*
for (int i = 0; i < HostConstants.NUM_HOSTSCSETS1; i++)
{
if (hostPlayer.m_aSCSets1[i] != null)
{
hostPlayer.m_aSCSets1[i].RemoveSkillShortcuts();
}
}
for (int i = 0; i < HostConstants.NUM_HOSTSCSETS2; i++)
{
if (hostPlayer.m_aSCSets2[i] != null)
{
hostPlayer.m_aSCSets2[i].RemoveSkillShortcuts();
}
}*/
for (int i = 0; i < HostConstants.NUM_HOSTSCSETS2; i++)
{
if (hostPlayer.m_aSCSets2[i] != null)
{
hostPlayer.m_aSCSets2[i].RemoveSkillShortcuts();
}
}*/
m_aPtSkills.Clear();
@@ -467,27 +477,27 @@ public class CECHostPlayer : CECPlayer
}
// Restore and convert shortcuts after loading new skills
/* if (hostPlayer.HostIsReady())
{
hostPlayer.ConvertSkillShortcut(skillSCConfigArray1);
hostPlayer.AssignSkillShortcut(skillSCConfigArray1, hostPlayer.m_aSCSets1);
hostPlayer.ConvertSkillShortcut(skillSCConfigArray2);
hostPlayer.AssignSkillShortcut(skillSCConfigArray2, hostPlayer.m_aSCSets2);
hostPlayer.ConvertComboSkill();
hostPlayer.ValidateSkillGrpShortcut(skillGrpSCConfigArray1);
hostPlayer.AssignSkillGrpShortcut(skillGrpSCConfigArray1, hostPlayer.m_aSCSets1);
hostPlayer.ValidateSkillGrpShortcut(skillGrpSCConfigArray2);
hostPlayer.AssignSkillGrpShortcut(skillGrpSCConfigArray2, hostPlayer.m_aSCSets2);
}
/* if (hostPlayer.HostIsReady())
{
hostPlayer.ConvertSkillShortcut(skillSCConfigArray1);
hostPlayer.AssignSkillShortcut(skillSCConfigArray1, hostPlayer.m_aSCSets1);
hostPlayer.ConvertSkillShortcut(skillSCConfigArray2);
hostPlayer.AssignSkillShortcut(skillSCConfigArray2, hostPlayer.m_aSCSets2);
hostPlayer.ConvertComboSkill();
hostPlayer.ValidateSkillGrpShortcut(skillGrpSCConfigArray1);
hostPlayer.AssignSkillGrpShortcut(skillGrpSCConfigArray1, hostPlayer.m_aSCSets1);
hostPlayer.ValidateSkillGrpShortcut(skillGrpSCConfigArray2);
hostPlayer.AssignSkillGrpShortcut(skillGrpSCConfigArray2, hostPlayer.m_aSCSets2);
}
if (hostPlayer.HostIsReady())
{
// Update UI when profession changes, save all shortcut configurations
// to remove effects from intermediate skills (invalid pointers)
// C++: CECGameUIMan *pGameUIMan = g_pGame->GetGameRun()->GetUIManager()->GetInGameUIMan();
// pGameUIMan->UpdateSkillRelatedUI();
hostPlayer.UpdateSkillRelatedUI();
}*/
if (hostPlayer.HostIsReady())
{
// Update UI when profession changes, save all shortcut configurations
// to remove effects from intermediate skills (invalid pointers)
// C++: CECGameUIMan *pGameUIMan = g_pGame->GetGameRun()->GetUIManager()->GetInGameUIMan();
// pGameUIMan->UpdateSkillRelatedUI();
hostPlayer.UpdateSkillRelatedUI();
}*/
}
public bool HostIsReady() { return true /*m_bEnterGame*/; }
private void OnMsgHstInfo00(in ECMSG Msg)
@@ -1075,6 +1085,10 @@ public class CECHostPlayer : CECPlayer
}
else
m_pActionSwitcher = new CECActionSwitcherBase(this);
UnityGameSession.c2s_CmdGetAllData(true, true, false);
// TODO: Move this to right flow later , it's just for test now
UnityGameSession.c2s_CmdSendEnterPKPrecinct();
}
private void JoystickStartDrag(JoystickPressEvent joystickPressEvent)
@@ -1612,7 +1626,7 @@ public class CECHostPlayer : CECPlayer
//}
//// Get force attack flag
bool bForceAttack = true;
bool bForceAttack = false;
//if (iForceAtk < 0)
// bForceAttack = glb_GetForceAttackFlag(0);
//else
@@ -1635,8 +1649,8 @@ public class CECHostPlayer : CECPlayer
//}
//// Check whether target type match
//int idCastTarget = idSelTarget;
//int iTargetType = pSkill->GetTargetType();
int idCastTarget = idSelTarget;
int iTargetType = pSkill.GetTargetType();
//if (pSkill->GetType() == CECSkill::TYPE_BLESS ||
// pSkill->GetType() == CECSkill::TYPE_NEUTRALBLESS)
@@ -1767,8 +1781,8 @@ public class CECHostPlayer : CECPlayer
// return false;
// }
// m_pPrepSkill = pSkill;
CastSkill(m_PlayerInfo.cid, bForceAttack);
m_pPrepSkill = pSkill;
//CastSkill(m_idSelTarget, bForceAttack);
//}
//else if (IsSpellingMagic() && m_pCurSkill == pSkill)
//{
@@ -1789,39 +1803,40 @@ public class CECHostPlayer : CECPlayer
// }
// else
// {
// bool bTraceOK = false;
// bool bUseAutoPF = false;
// CECPlayerWrapper* pWrapper = CECAutoPolicy::GetInstance().GetPlayerWrapper();
// if (CECAutoPolicy::GetInstance().IsAutoPolicyEnabled() && pWrapper->GetAttackError() >= 2)
// bUseAutoPF = true;
bool bTraceOK = false;
bool bUseAutoPF = false;
/* CECPlayerWrapper* pWrapper = CECAutoPolicy::GetInstance().GetPlayerWrapper();
if (CECAutoPolicy::GetInstance().IsAutoPolicyEnabled() && pWrapper->GetAttackError() >= 2)
bUseAutoPF = true;*/
// if (!idCastTarget)
// {
// idCastTarget = GetCharacterID(); // ±ÜÃâË²ÒÆµÈ¼¼ÄÜʱ idCastTarget Ϊ0µ¼Ö CECWorkTrace::CreateTraceTarget ·µ»Ø¿Õ
// }
// if (CECHPWork * pWork = m_pWorkMan->GetWork(CECHPWork::WORK_TRACEOBJECT))
// {
// CECHPWorkTrace* pWorkTrace = dynamic_cast<CECHPWorkTrace*>(pWork);
// if (pWorkTrace->GetTraceReason() == CECHPWorkTrace::TRACE_SPELL &&
// pWorkTrace->GetTarget() == idCastTarget &&
// pWorkTrace->GetPrepSkill() == pSkill)
// return false; // We are just doing the same thing
if (idCastTarget == 0)
{
idCastTarget = GetCharacterID(); // ±ÜÃâË²ÒÆµÈ¼¼ÄÜʱ idCastTarget Ϊ0µ¼Ö CECWorkTrace::CreateTraceTarget ·µ»Ø¿Õ
}
CECHPWork pWork = m_pWorkMan.GetWork(Host_work_ID.WORK_TRACEOBJECT);
if (pWork != null)
{
CECHPWorkTrace pWorkTrace = (CECHPWorkTrace)(pWork);
if (pWorkTrace.GetTraceReason() == Trace_reason.TRACE_SPELL &&
pWorkTrace.GetTarget() == idCastTarget &&
pWorkTrace.GetPrepSkill() == pSkill)
return false; // We are just doing the same thing
// pWorkTrace->SetTraceTarget(pWorkTrace->CreatTraceTarget(idCastTarget, CECHPWorkTrace::TRACE_SPELL, bForceAttack), bUseAutoPF);
// pWorkTrace->SetPrepSkill(pSkill);
// bTraceOK = true;
// }
// else if (m_pWorkMan->CanStartWork(CECHPWork::WORK_TRACEOBJECT))
// {
// CECHPWorkTrace* pWork = (CECHPWorkTrace*)m_pWorkMan->CreateWork(CECHPWork::WORK_TRACEOBJECT);
// pWork->SetTraceTarget(pWork->CreatTraceTarget(idCastTarget, CECHPWorkTrace::TRACE_SPELL, bForceAttack), bUseAutoPF);
// pWork->SetPrepSkill(pSkill);
// m_pWorkMan->StartWork_p1(pWork);
// bTraceOK = true;
// }
pWorkTrace.SetTraceTarget(pWorkTrace.CreatTraceTarget(idCastTarget, Trace_reason.TRACE_SPELL, bForceAttack), bUseAutoPF);
pWorkTrace.SetPrepSkill(pSkill);
bTraceOK = true;
}
else if (m_pWorkMan.CanStartWork(Host_work_ID.WORK_TRACEOBJECT))
{
CECHPWorkTrace pWork2 = (CECHPWorkTrace)m_pWorkMan.CreateWork(Host_work_ID.WORK_TRACEOBJECT);
/* pWork2->SetTraceTarget(pWork2->CreatTraceTarget(idCastTarget, CECHPWorkTrace::TRACE_SPELL, bForceAttack), bUseAutoPF);
pWork2->SetPrepSkill(pSkill);
m_pWorkMan->StartWork_p1(pWork2);*/
bTraceOK = true;
}
// if (!bTraceOK) return false;
// }
if (!bTraceOK) return false;
// }
//}
return true;
@@ -1830,6 +1845,9 @@ public class CECHostPlayer : CECPlayer
private void CastSkill(int idTarget, bool bForceAttack, CECObject pTarget = null)
{
byte byPVPMask = glb_BuildPVPMask(bForceAttack);
BMLogger.LogError("HoangDev: HostPlayer CastSkill SkillID=" + m_pPrepSkill.GetSkillID() +
" TargetID=" + idTarget + " bForceAttack=" + bForceAttack +
" byPVPMask=" + byPVPMask);
UnityGameSession.c2s_CmdCastSkill(m_pPrepSkill.GetSkillID(), byPVPMask, 1, idTarget);
}
public byte glb_BuildPVPMask(bool bForceAttack)
File diff suppressed because one or more lines are too long