Merge remote-tracking branch 'origin/develop' into feature/skill-data

# Conflicts:
#	Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs
#	Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs
#	Assets/Scenes/NPCRender.unity
#	Assets/Scenes/a61.unity
#	Assets/Scripts/CECHostPlayer.cs
This commit is contained in:
VDH
2025-11-11 13:44:45 +07:00
5413 changed files with 107444 additions and 205248 deletions
+53 -20
View File
@@ -33,8 +33,9 @@ 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;
using BrewMonster.Scripts;
public class CECHostPlayer : CECPlayer
public partial class CECHostPlayer : CECPlayer
{
[SerializeField] private CharacterController controller;
@@ -401,6 +402,8 @@ public class CECHostPlayer : CECPlayer
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;
case int value when value == EC_MsgDef.MSG_HST_DIED: OnMsgHstDied(Msg); break;
case int value when value == EC_MsgDef.MSG_HST_GOTO: OnMsgHstGoto(Msg); break;
}
}
@@ -446,11 +449,11 @@ public class CECHostPlayer : CECPlayer
}
}*/
m_aPtSkills.Clear();
// Release passive skills
m_aPsSkills.Clear();
}
}
}
// Load skill data from command
// C++: GNET::ElementSkill::LoadSkillData(pCmd);
@@ -500,6 +503,15 @@ public class CECHostPlayer : CECPlayer
}*/
}
public bool HostIsReady() { return true /*m_bEnterGame*/; }
private void OnMsgHstDied(in ECMSG msg)
{
EventBus.PublishChannel(GetCharacterID(), new CECPlayer.CleearComActFlagAllRankNodesEvent(true));
PlayAction((int)PLAYER_ACTION_TYPE.ACT_GROUNDDIE);
if (PopupManager.Instance != null)
{
PopupManager.Instance.OnPlayerDied();
}
}
private void OnMsgHstInfo00(in ECMSG Msg)
{
cmd_self_info_00 pCmd = GPDataTypeHelper.FromBytes<cmd_self_info_00>((byte[])Msg.dwParam1);
@@ -680,14 +692,14 @@ public class CECHostPlayer : CECPlayer
byte where = data[16]; // Package index
byte index = data[17]; // Slot index in that package
// Create new inventory item data
var newItem = new InventoryItemData
var newItem = new EC_IvtrItem
{
Package = where,
Slot = index,
TemplateId = type,
ExpireDate = expire_date,
m_tid = type,
m_expire_date = expire_date,
State = 0,
Count = (int)amount,
m_iCount = (int)amount,
Crc = 0,
Content = null
};
@@ -731,14 +743,14 @@ public class CECHostPlayer : CECPlayer
}
// Create new inventory item data
var newItem = new InventoryItemData
var newItem = new EC_IvtrItem
{
Package = byPackage,
Slot = bySlot,
TemplateId = tid,
ExpireDate = expire_date,
m_tid = tid,
m_expire_date = expire_date,
State = 0,
Count = (int)iAmount,
m_iCount = (int)iAmount,
Crc = 0,
Content = null
};
@@ -815,20 +827,20 @@ public class CECHostPlayer : CECPlayer
byte index_inv = data[0];
byte index_equip = data[1];
// Update client-side data: move item between PACK_INVENTORY and PACK_EQUIPMENT
var invItem = EC_Inventory.GetItem(EC_Inventory.PACK_INVENTORY, index_inv, true);
var equipItem = EC_Inventory.GetItem(EC_Inventory.PACK_EQUIPMENT, index_equip, true);
var invItem = EC_Inventory.GetItem(EC_Inventory.IVTRTYPE_PACK, index_inv, true);
var equipItem = EC_Inventory.GetItem(EC_Inventory.IVTRTYPE_EQUIPPACK, index_equip, true);
if (invItem != null)
{
invItem.Package = EC_Inventory.PACK_EQUIPMENT;
invItem.Package = EC_Inventory.IVTRTYPE_EQUIPPACK;
invItem.Slot = index_equip;
EC_Inventory.SetItem(EC_Inventory.PACK_EQUIPMENT, index_equip, invItem);
EC_Inventory.SetItem(EC_Inventory.IVTRTYPE_EQUIPPACK, index_equip, invItem);
}
if (equipItem != null)
{
equipItem.Package = EC_Inventory.PACK_INVENTORY;
equipItem.Package = EC_Inventory.IVTRTYPE_PACK;
equipItem.Slot = index_inv;
EC_Inventory.SetItem(EC_Inventory.PACK_INVENTORY, index_inv, equipItem);
EC_Inventory.SetItem(EC_Inventory.IVTRTYPE_PACK, index_inv, equipItem);
}
// Trigger UI refresh if an EC_InventoryUI is present in scene
@@ -874,17 +886,23 @@ public class CECHostPlayer : CECPlayer
}
case CommandID.OWN_IVTR_DETAIL_DATA:
{
EC_Inventory.LogInventoryPacket("OWN_IVTR_DETAIL_DATA", data, hostId);
// EC_Inventory.LogInventoryPacket("OWN_IVTR_DETAIL_DATA", data, hostId);
// Parse and store
if (data != null && data.Length >= 6)
{
byte byPackage = data[0];
byte ivtrSize = data[1];
if (EC_IvtrItem.TryParseInventoryDetail(data, out var pkg,
if (EC_IvtrItemUtils.TryParseInventoryDetail(data, out var pkg,
out var size, out var items))
{
EC_Inventory.UpdatePack(pkg, size, items);
}
// check if we got the item from the Equipment Pack. If so, we have to load the equipment items
if (byPackage == EC_Inventory.IVTRTYPE_EQUIPPACK)
{
UpdateEquipSkins();
}
}
break;
@@ -988,10 +1006,25 @@ public class CECHostPlayer : CECPlayer
SetPos(pCmd.pos);
}
public void HandleRevive(short sReviveType, A3DVECTOR3 pos)
{
// Move to revive position and play revive animation
PlayAction((int)PLAYER_ACTION_TYPE.ACT_REVIVE);
// Clear any running dead work if exists
m_pWorkMan?.FinishRunningWork(CECHPWork.Host_work_ID.WORK_DEAD);
// Clear corpse state so player is alive again
m_dwStates &= ~(uint)PlayerNPCState.GP_STATE_CORPSE;
}
public void OnMsgHstGoto(in ECMSG Msg)
{
Debug.Log("HoangDev :OnMsgHstGoto");
cmd_notify_hostpos pCmd = (cmd_notify_hostpos)Msg.dwParam1;
PopupManager.Instance.OnPlayerRevived();
// p1 is a byte[] buffer; parse into cmd_notify_hostpos then set position
byte[] buf = (byte[])Msg.dwParam1;
cmd_notify_hostpos pCmd = GPDataTypeHelper.FromBytes<cmd_notify_hostpos>(buf);
SetPos(new Vector3(pCmd.vPos.x, pCmd.vPos.y, pCmd.vPos.z));
}
// Message MSG_HST_SELTARGET handler