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:
@@ -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
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
using BrewMonster;
|
||||
using BrewMonster.Scripts;
|
||||
using BrewMonster.Scripts.Managers;
|
||||
using ModelRenderer.Scripts.GameData;
|
||||
|
||||
public partial class CECHostPlayer
|
||||
{
|
||||
public int[] m_aEquips = new int[InventoryConst.IVTRSIZE_EQUIPPACK];
|
||||
|
||||
public bool UpdateEquipSkins()
|
||||
{
|
||||
var equipPack = EC_Inventory.GetPack(EC_Inventory.IVTRTYPE_EQUIPPACK);
|
||||
|
||||
int[] aNewEquips = new int[InventoryConst.IVTRSIZE_EQUIPPACK];
|
||||
EC_IvtrItem pItem = null;
|
||||
for (int i = 0; i < InventoryConst.IVTRSIZE_EQUIPPACK; i++)
|
||||
{
|
||||
|
||||
if (equipPack.TryGetValue(i, out pItem))
|
||||
{
|
||||
aNewEquips[i] = pItem.m_tid;
|
||||
}
|
||||
}
|
||||
|
||||
ShowEquipments(aNewEquips, true, true);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void ShowEquipments(int[] pEquipmentID, bool bLoadAtOnce, bool bForceLoad)
|
||||
{
|
||||
var elemendataman = BrewMonster.ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = default;
|
||||
for (int i = 0; i < InventoryConst.IVTRSIZE_EQUIPPACK; i++)
|
||||
{
|
||||
if (pEquipmentID[i] != m_aEquips[i])
|
||||
{
|
||||
// new equipment. Need to load and equip to host player
|
||||
var equipData = elemendataman.get_data_ptr((uint)pEquipmentID[i], ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
switch (DataType)
|
||||
{
|
||||
case DATA_TYPE.DT_WEAPON_ESSENCE:
|
||||
var equip = (WEAPON_ESSENCE)equipData;
|
||||
BMLogger.Log($"ShowEquipments():: Weapon Essence: {equip.FileModelRight} -- {equip.FileModelLeft}");
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dc1282c835bed1b43bc32a2a09563390
|
||||
@@ -30,7 +30,6 @@ public class CECUIManager : MonoSingleton<CECUIManager>
|
||||
|
||||
private void ShowUINPC(NPCINFO obj)
|
||||
{
|
||||
BMLogger.LogError("HoangDEv: ShowUINPC");
|
||||
npsUI.gameObject.SetActive(true);
|
||||
npsUI.SetText($"{obj.CurrentHealth}/{obj.MaxHealth}",obj.Name,"");
|
||||
npsUI.SetHealthImage((float)obj.CurrentHealth / (float)obj.MaxHealth);
|
||||
|
||||
Reference in New Issue
Block a user