npc man
This commit is contained in:
@@ -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))
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user