bug skill data not received

This commit is contained in:
VDH
2025-11-08 16:41:19 +07:00
parent d4af8e33f9
commit eed08c2b13
12 changed files with 233 additions and 72 deletions
@@ -1,25 +0,0 @@
using BrewMonster;
using BrewMonster.Scripts.World;
using CSNetwork.GPDataType;
using System;
using UnityEngine;
public partial class CECGameRun
{
private CECWorld m_pWorld;
public CECWorld GetWorld() { return m_pWorld; }
public bool StartGame(int idInst, Vector3 vHostPos)
{
if (!JumpToInstance(idInst, vHostPos))
{
BMLogger.LogError ( "CECGameRun::StartGame, Failed to create game world.");
return false;
}
return true;
}
private bool JumpToInstance(int idInst, Vector3 vHostPos, int iParallelWorldID = 0)
{
return true;
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 923b4102fc6857a4e94d7a662b2e6e1a
@@ -1197,15 +1197,31 @@ namespace CSNetwork.GPDataType
public const float MIN_MOVELEN_FOR_DETECT_VIBRATION = 0.05f;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_skill_data
{
public uint skill_count;
public struct SKILL
{
public short id_skill;
public byte level;
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;
}
@@ -613,6 +613,10 @@ namespace CSNetwork
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;
}
}
@@ -13,7 +13,12 @@ namespace BrewMonster.Assets.PerfectWorld.Scripts.Skills
public class CECSCSkill
{
CECSkill m_pSkill;
public bool Excute()
public bool Init(CECSkill pSkill)
{
m_pSkill = pSkill;
return true;
}
public bool Execute()
{
if (m_pSkill == null)
return false;
@@ -22,23 +27,23 @@ namespace BrewMonster.Assets.PerfectWorld.Scripts.Skills
if (ElementSkill.IsGoblinSkill((uint)m_pSkill.GetSkillID()))
{
/* int idSelected = pHost->GetSelectedTarget();
bool bForctAttack = glb_GetForceAttackFlag(NULL);
CECHostGoblin* pHostGoblin = (CECHostGoblin*)pHost->GetGoblinModel();
int i;
for (i = 0; i < pHostGoblin->GetSkillNum(); i++)
{
if (m_pSkill == pHostGoblin->GetSkill(i))
{
break;
}
}
if (i < pHostGoblin->GetSkillNum())
{
a_LogOutput(1, "HoangDev: Shortcut: pHostGoblin->GetSkillNum()");
/* int idSelected = pHost->GetSelectedTarget();
bool bForctAttack = glb_GetForceAttackFlag(NULL);
CECHostGoblin* pHostGoblin = (CECHostGoblin*)pHost->GetGoblinModel();
int i;
for (i = 0; i < pHostGoblin->GetSkillNum(); i++)
{
if (m_pSkill == pHostGoblin->GetSkill(i))
{
break;
}
}
if (i < pHostGoblin->GetSkillNum())
{
a_LogOutput(1, "HoangDev: Shortcut: pHostGoblin->GetSkillNum()");
pHostGoblin->CastSkill(i, idSelected, bForctAttack);
}*/
pHostGoblin->CastSkill(i, idSelected, bForctAttack);
}*/
}
else
{
@@ -52,6 +52,11 @@ namespace BrewMonster.Scripts.Skills
}
public void ProcessServiceList()
{
if (m_npcListData== null)
{
BMLogger.LogWarning("CECHostSkillModel::ProcessServiceList, m_npcListData is null.");
return;
}
if (m_npcListData.Size > 0)
{
byte[] data = m_npcListData.RawBuffer;
@@ -111,7 +116,7 @@ namespace BrewMonster.Scripts.Skills
var npcEssence = (NPC_ESSENCE)dataprt;
// Get skill service block from id_skill_service
var dataprt2 = pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref dt);
var dataprt2 = pDB.get_data_ptr(npcEssence.id_skill_service, ID_SPACE.ID_SPACE_ESSENCE, ref dt);
if (dataprt2 == null)
return;
@@ -1,3 +1,5 @@
using BrewMonster.Assets.PerfectWorld.Scripts.Skills;
using CSNetwork.GPDataType;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
@@ -171,7 +173,10 @@ namespace BrewMonster.Scripts.Skills
SkillStub s = SkillStub.GetStub(id);
return s != null && (s.GetCls() == 258);
}
//
public static void LoadSkillData(cmd_skill_data data)
{
SkillWrapper.Instance.LoadData(data);
}
public virtual int GetRank() { return 0; }
// ѧϰnҪҼ
public virtual int GetRequiredLevel() { return 0; }
@@ -0,0 +1,35 @@
using BrewMonster.Assets.PerfectWorld.Scripts.Common;
using CSNetwork.GPDataType;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BrewMonster.Assets.PerfectWorld.Scripts.Skills
{
public struct PersistentData
{
public int ability; // ÊìÁ·¶È
public int level; // ¼¶±ð
public PersistentData(int _t = 0, int _l = 1) { ability = (_t); level = (_l); }
};
public class SkillWrapper : Singleton<SkillWrapper>
{
Dictionary<uint, PersistentData> map = new Dictionary<uint, PersistentData>();
public void LoadData(cmd_skill_data pdata)
{
map.Clear();
PersistentData skill;
for (int i = 0; i < (int)pdata.skill_count; i++)
{
cmd_skill_data.SKILL item = pdata.skill_list[i];
skill.level = item.level;
skill.ability = item.ability;
map[(uint)item.id_skill] = skill;
}
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 9475bf4d7aee23340a1a7444cafb502e
+2 -2
View File
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3df77e654f3a5255269e6a12859be0c185eef6bba1246f1f593148e2112d50c5
size 533674545
oid sha256:f976127e7fdcfdfeb7255c5da4baebb416fc3f37d1697952519189cf3c9712fb
size 533675813
+18 -1
View File
@@ -1,4 +1,6 @@
using CSNetwork.GPDataType;
using BrewMonster;
using BrewMonster.Scripts.World;
using CSNetwork.GPDataType;
using CSNetwork.Protocols.RPCData;
using System.Data;
using Unity.Cinemachine;
@@ -21,7 +23,22 @@ public partial class CECGameRun : MonoBehaviour
public CinemachineFreeLook freeLookCam;
public float rotateSpeedX = 300f; // tốc độ xoay ngang
public float rotateSpeedY = 2f; // tốc độ xoay dọc
private CECWorld m_pWorld;
public CECWorld GetWorld() { return m_pWorld; }
public bool StartGame(int idInst, Vector3 vHostPos)
{
if (!JumpToInstance(idInst, vHostPos))
{
BMLogger.LogError("CECGameRun::StartGame, Failed to create game world.");
return false;
}
return true;
}
private bool JumpToInstance(int idInst, Vector3 vHostPos, int iParallelWorldID = 0)
{
return true;
}
public static CECGameRun Instance
{
+121 -22
View File
@@ -28,6 +28,7 @@ using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using static Unity.Burst.Intrinsics.X86.Avx;
using static UnityEditor.PlayerSettings;
using Scene = UnityEngine.SceneManagement.Scene;
@@ -60,9 +61,11 @@ public class CECHostPlayer : CECPlayer
private List<CECObject> m_aTabSels = new List<CECObject>();
private List<CECSkill> m_aPtSkills = new List<CECSkill>();
private List<CECSkill> m_aPsSkills = new List<CECSkill>();
private List<CECSkill> m_aEquipSkills = new List<CECSkill>();
private List<CECSkill> m_aGoblinSkills = new List<CECSkill>();
private bool m_bEnterGame;
private CECSkill m_pPrepSkill;
private float playerSpeed = 5.0f;
private float jumpHeight = 1.5f;
@@ -183,6 +186,13 @@ public class CECHostPlayer : CECPlayer
private void Update()
{
#if UNITY_EDITOR
if (Input.GetKeyDown(KeyCode.C))
{
ApplySkillShortcut(1);
}
#endif
//Debug.Log($"(ulong)Time.deltaTime * 1000 {(ulong)(Time.deltaTime * 1000)}");
m_MoveCtrl.Tick((ulong)(Time.deltaTime * 1000));
// Nếu có thay đổi runtime, có thể lấy lại mỗi vài giây/Start nếu bạn thích:
@@ -239,15 +249,15 @@ public class CECHostPlayer : CECPlayer
SelectTarget(m_idUCSelTarget);
}
if (idTraceTarget != 0)
{
if (iTraceReason == CECHPWorkTrace.Trace_reason.TRACE_ATTACK)
{
if (!CanDo(ActionCanDo.CANDO_MELEE))
return;
NormalAttackObject(idTraceTarget, bForceAttack);
}
}
/* if (idTraceTarget != 0)
{
if (iTraceReason == CECHPWorkTrace.Trace_reason.TRACE_ATTACK)
{
if (!CanDo(ActionCanDo.CANDO_MELEE))
return;
NormalAttackObject(idTraceTarget, bForceAttack);
}
}*/
}
m_pWorkMan?.Tick(Time.deltaTime);
}
@@ -388,9 +398,98 @@ public class CECHostPlayer : CECPlayer
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_INFO00: OnMsgHstInfo00(Msg); break;
case int value when value == EC_MsgDef.MSG_HST_SKILLDATA: OnMsgHstSkillData(Msg); break;
}
}
private void OnMsgHstSkillData(ECMSG Msg)
{
cmd_skill_data pCmd = GPDataTypeHelper.FromBytes<cmd_skill_data>((byte[])Msg.dwParam1);
if (pCmd.skill_list == null)
{
BMLogger.LogError("OnMsgHstSkillData: cmd is null");
return;
}
/* List<SkillShortCutConfig> skillSCConfigArray1 = new List<SkillShortCutConfig>();
List<SkillShortCutConfig> skillSCConfigArray2 = new List<SkillShortCutConfig>();
List<SkillGrpShortCutConfig> skillGrpSCConfigArray1 = new List<SkillGrpShortCutConfig>();
List<SkillGrpShortCutConfig> skillGrpSCConfigArray2 = new List<SkillGrpShortCutConfig>();*/
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_HOSTSCSETS2; i++)
{
if (hostPlayer.m_aSCSets2[i] != null)
{
hostPlayer.m_aSCSets2[i].RemoveSkillShortcuts();
}
}*/
m_aPtSkills.Clear();
// Release passive skills
m_aPsSkills.Clear();
}
// Load skill data from command
// C++: GNET::ElementSkill::LoadSkillData(pCmd);
ElementSkill.LoadSkillData(pCmd);
// Create skill objects from command data
for (int i = 0; i < pCmd.skill_count; i++)
{
cmd_skill_data.SKILL data = pCmd.skill_list[i];
CECSkill skill = new CECSkill(data.id_skill, data.level);
// Categorize skills into positive and passive
int skillType = skill.GetType();
if (skillType != (int)CECSkill.SkillType.TYPE_PASSIVE &&
skillType != (int)CECSkill.SkillType.TYPE_PRODUCE &&
skillType != (int)CECSkill.SkillType.TYPE_LIVE)
{
m_aPtSkills.Add(skill);
}
else
{
m_aPsSkills.Add(skill);
}
}
// 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())
{
// 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)
{
cmd_self_info_00 pCmd = GPDataTypeHelper.FromBytes<cmd_self_info_00>((byte[])Msg.dwParam1);
@@ -1740,24 +1839,24 @@ public class CECHostPlayer : CECPlayer
byMask |= (byte)PVPMask.GP_PVPMASK_FORCE;
else
{
/* CECConfigs pConfigs = EC_Game.GetConfigs();
/* CECConfigs pConfigs = EC_Game.GetConfigs();
if (pConfigs->GetGameSettings().bAtk_Player)
{
byMask |= GP_PVPMASK_FORCE;
if (pConfigs->GetGameSettings().bAtk_Player)
{
byMask |= GP_PVPMASK_FORCE;
if (pConfigs->GetGameSettings().bAtk_NoMafia)
byMask |= GP_PVPMASK_NOMAFIA;
if (pConfigs->GetGameSettings().bAtk_NoMafia)
byMask |= GP_PVPMASK_NOMAFIA;
if (pConfigs->GetGameSettings().bAtk_NoWhite)
byMask |= GP_PVPMASK_NOWHITE;
if (pConfigs->GetGameSettings().bAtk_NoWhite)
byMask |= GP_PVPMASK_NOWHITE;
if (pConfigs->GetGameSettings().bAtk_NoAlliance)
byMask |= GP_PVPMASK_NOALLIANCE;
if (pConfigs->GetGameSettings().bAtk_NoAlliance)
byMask |= GP_PVPMASK_NOALLIANCE;
if (pConfigs->GetGameSettings().bAtk_NoForce)
byMask |= GP_PVPMASK_NOFORCE;
}*/
if (pConfigs->GetGameSettings().bAtk_NoForce)
byMask |= GP_PVPMASK_NOFORCE;
}*/
}
return byMask;