This commit is contained in:
VDH
2025-09-25 13:55:07 +07:00
parent 28b8857dc7
commit 82c5c721b1
4 changed files with 97 additions and 5 deletions
@@ -23,4 +23,10 @@ public class CECObject : MonoBehaviour
OCID_HOST_NAVIGATER, // 纯客户端player类,用于强制移动
OCID_NPCCLONED_MASTER, // NPC 复制的角色模型
};
}
public enum EnviromentMoveType
{
MOVEENV_GROUND = 0, // Move on ground
MOVEENV_WATER,
MOVEENV_AIR,
}
}
@@ -81,7 +81,7 @@ public class CECNPCMan : IMsgHandler
Console.WriteLine(
$"HoangDev: NPC_INFO_LIST, nid: {info.nid}, tid: {info.tid}, vis_tid: {info.vis_tid}, pos: {info.pos.x} {info.pos.y} {info.pos.z}");
//NPCEnter(info, false);
NPCEnter(info, false);
offset += iSize;
}
@@ -167,6 +167,7 @@ public class CECNPCMan : IMsgHandler
pNPC.SetBornStamp(bornStamp);
pNPC.SetBornInSight(bBornInSight);
// Init với tid + Info như C++
if (pNPC == null || !pNPC.Init(tid, Info))
{
+15 -1
View File
@@ -1,16 +1,30 @@
using BrewMonster;
using CSNetwork.GPDataType;
using ModelRenderer.Scripts.GameData;
using Unity.VisualScripting;
using UnityEngine;
public class CECMonster : CECNPC
{
MONSTER_ESSENCE m_pDBEssence;
MONSTER_ESSENCE m_pDBEssence;
int m_iCID;
public CECMonster(CECNPCMan pNPCMan)
: base(pNPCMan) // gọi constructor của CECNPC
{
m_iCID = (int)ClassID.OCID_MONSTER;
m_pDBEssence = default;
}
public override bool Init(int tid, info_npc Info)
{
base.Init(tid, Info);
var pDB = ElementDataManProvider.GetElementDataMan();
return true;
}
}
+73 -2
View File
@@ -1,4 +1,6 @@
using CSNetwork.GPDataType;
using CSNetwork.GPDataType;
using System.Text;
using System;
using UnityEditor.Rendering;
using UnityEngine;
@@ -9,12 +11,16 @@ public class CECNPC : CECObject
private uint m_dwStates2;
private A3DVECTOR3 m_vServerPos;
private int m_iRandomProp;
private int m_iMoveEnv;
int m_idMaster;
string m_strName;
int m_idOwnerFaction;
public CECNPC(CECNPCMan pNPCMan)
{
}
public bool Init(int tid, info_npc Info)
public virtual bool Init(int tid, info_npc Info)
{
m_NPCInfo.nid = Info.nid;
m_NPCInfo.tid = tid;
@@ -23,6 +29,43 @@ public class CECNPC : CECObject
m_dwStates2 = (uint)Info.state2;
m_vServerPos = Info.pos;
m_iRandomProp = (Info.state & 0x0f00) >> 8;
m_iMoveEnv = (int)((Info.state & PlayerNPCState.GP_STATE_NPC_FLY) != 0 ? EnviromentMoveType.MOVEENV_AIR
: (Info.state & PlayerNPCState.GP_STATE_NPC_SWIM) != 0 ? EnviromentMoveType.MOVEENV_WATER
: EnviromentMoveType.MOVEENV_GROUND);
// đọc phần đuôi bằng reader, KHÔNG cần đổi Info_npc
var r = new ByteReader(new ReadOnlySpan<byte>() );
var oj_ext_state_count = (int)OBJECT_EXT_STATE.OBJECT_EXT_STATE_COUNT;
uint[] ext = new uint[oj_ext_state_count];
if ((Info.state & PlayerNPCState.GP_STATE_EXTEND_PROPERTY) != 0)
r.ReadInto(ext);
//SetNewExtendStates(0, ext, oj_ext_state_count);
m_idMaster = 0;
if ((Info.state & PlayerNPCState.GP_STATE_NPC_PET) != 0)
m_idMaster = r.ReadInt32();
if ((Info.state & PlayerNPCState.GP_STATE_NPC_NAME) != 0)
{
byte len = r.ReadByte();
if (len > 0)
m_strName = Encoding.Unicode.GetString(r.ReadBytes(len));
}
/*SetSelectable((Info.state & PlayerNPCState.GP_STATE_FORBIDBESELECTED) == 0);
if ((Info.state & PlayerNPCState.GP_STATE_MULTIOBJ_EFFECT) != 0)
{
int n = r.ReadInt32();
for (int i = 0; i < n; i++) { int idT = r.ReadInt32(); char t = (char)r.ReadByte(); AddMultiObjectEffect(idT, t); }
}*/
m_idOwnerFaction = 0;
if ((Info.state & PlayerNPCState.GP_STATE_NPC_MAFIA) != 0)
m_idOwnerFaction = r.ReadInt32();
// … phần seed collider, khoảng cách tới host, v.v. y hệt như bản trước
return true;
}
struct INFO
@@ -31,4 +74,32 @@ public class CECNPC : CECObject
public int tid; // Template id
public int vis_tid;// template id for shape
};
}
public ref struct ByteReader
{
private ReadOnlySpan<byte> _span;
private int _offset;
public ByteReader(ReadOnlySpan<byte> span) { _span = span; _offset = 0; }
public bool Eof => _offset >= _span.Length;
public byte ReadByte() => _span[_offset++];
public int ReadInt32()
{
int v = BitConverter.ToInt32(_span.Slice(_offset, 4));
_offset += 4; return v;
}
public void ReadInto(uint[] dst)
{
// OBJECT_EXT_STATE_COUNT * sizeof(DWORD)
int bytes = dst.Length * 4;
var s = _span.Slice(_offset, bytes);
for (int i = 0; i < dst.Length; i++)
dst[i] = BitConverter.ToUInt32(s.Slice(i * 4, 4));
_offset += bytes;
}
public byte[] ReadBytes(int len)
{
var s = _span.Slice(_offset, len).ToArray();
_offset += len; return s;
}
}