npcAttack

This commit is contained in:
VDH
2025-10-08 18:05:19 +07:00
parent 33f5a62fa4
commit f0dca5bbdb
8 changed files with 98 additions and 9 deletions
Binary file not shown.
@@ -1,3 +1,4 @@
using CSNetwork.GPDataType;
using UnityEngine;
public class CECObject : MonoBehaviour
@@ -39,4 +40,10 @@ public class CECObject : MonoBehaviour
MOVEENV_WATER,
MOVEENV_AIR,
}
protected void TurnFaceTo(int idTarget, float dwTime)
{
// Face to target
A3DVECTOR3 vTarget;
}
}
@@ -32,11 +32,34 @@ public class CECNPCMan : CECObject, IMsgHandler
case long value when value == EC_MsgDef.MSG_NM_NPCINFO: OnMsgNPCInfo(Msg); break;
case long value when value == EC_MsgDef.MSG_NM_NPCMOVE: OnMsgNPCMove(Msg); break;
case long value when value == EC_MsgDef.MSG_NM_NPCSTOPMOVE: OnMsgNPCStopMove(Msg); break;
case long value when value == EC_MsgDef. MSG_NM_NPCATKRESULT : TransmitMessage(Msg); break;
}
}
return true;
}
private bool TransmitMessage(ECMSG msg)
{
int nid = 0;
switch (msg.dwMsg)
{
case long value when value == EC_MsgDef.MSG_NM_NPCATKRESULT:
nid = ((cmd_object_atk_result )msg.dwParam1).attacker_id;
break;
default:
return false;
}
CECNPC pNPC = SeekOutNPC(nid);
if (pNPC)
pNPC.ProcessMessage(msg);
else
{
}
return true;
}
private bool OnMsgNPCStopMove(ECMSG msg)
{
cmd_object_stop_move pCmd = EC_Utility.ByteArrayToStructure<cmd_object_stop_move>((byte[])msg.dwParam1);
@@ -48,4 +48,5 @@ public class CECMonster : CECNPC
StartWork((int)WorkType.WT_NOTHING, (int)WorkID.WORK_STAND);
return true;
}
public MONSTER_ESSENCE GetDBEssence() { return m_pDBEssence; }
}
+64 -8
View File
@@ -1,12 +1,13 @@
using CSNetwork.GPDataType;
using System.Text;
using BrewMonster;
using CSNetwork;
using CSNetwork.GPDataType;
using ModelRenderer.Scripts.Common;
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using UnityEditor.Rendering;
using UnityEngine;
using BrewMonster;
using CSNetwork;
using ModelRenderer.Scripts.Common;
using System.IO;
public class CECNPC : CECObject
{
@@ -32,7 +33,9 @@ public class CECNPC : CECObject
protected int m_iAction;
protected int m_idSelTarget;
protected int m_iCurWorkType;
protected int m_nFightTimeLeft;
protected int m_iCurWork;
protected int m_idAttackTarget;
protected int m_DisappearCnt;
protected bool m_bAboutToDie;
protected Vector3 m_vStopDir;
@@ -145,6 +148,54 @@ public class CECNPC : CECObject
return true;
}
public bool ProcessMessage(ECMSG Msg)
{
switch (Msg.dwMsg)
{
case long value when value == EC_MsgDef.MSG_NM_NPCATKRESULT: OnMsgNPCAtkResult(Msg); break;
}
return true;
}
private void OnMsgNPCAtkResult(ECMSG msg)
{
cmd_object_atk_result pCmd = MemoryMarshal.Read<cmd_object_atk_result>(
((byte[])msg.dwParam1).AsSpan());
if (true)
{
// Face to target
NPCTurnFaceTo(pCmd.target_id, Time.deltaTime);
m_idAttackTarget = pCmd.target_id;
// now start a fight work
if (IsMonsterNPC())
{
CECMonster pMonster = (CECMonster)this;
MONSTER_ESSENCE pMonsterEssence = pMonster.GetDBEssence();
StartWork((int)WorkType.WT_NORMAL, (int)WorkID.WORK_FIGHT, (uint)(pMonsterEssence.attack_speed * 1000));
}
}
//TODO: Hiệu ứng đánh
//PlayAttackEffect(pCmd->target_id, 0, 0, iDamage, pCmd->attack_flag, pCmd->speed * 50);
}
void NPCTurnFaceTo(int idTarget, float dwTime)
{
if (IsDirFixed())
{
return;
}
// tower in war can not turn face to.
if (IsMonsterNPC())
{
int role_in_war = (int)((CECMonster)this).GetDBEssence().role_in_war;
if (role_in_war == 2 || role_in_war == 5)
return;
}
TurnFaceTo(idTarget, dwTime);
}
private void Update()
{
switch (m_iCurWork)
@@ -268,7 +319,7 @@ public class CECNPC : CECObject
{
// Note: below judge can prevent many problems when we attempt to
// finish a work but don't assure we are doing this work
BrewMonster.BMLogger.Log("HoangDev : WorkFinished :"+ iWorkID);
BrewMonster.BMLogger.Log("HoangDev : WorkFinished :" + iWorkID);
if (m_iCurWork != iWorkID)
return;
@@ -581,7 +632,7 @@ public class CECNPC : CECObject
public bool IsDirFixed() { return (m_dwStates & PlayerNPCState.GP_STATE_NPC_FIXDIR) != 0 ? true : false; }
public void ReleaseWork(int iWorkType)
{
BrewMonster.BMLogger.LogError("HoangDev : ReleaseWorkl :"+ iWorkType);
BrewMonster.BMLogger.LogError("HoangDev : ReleaseWorkl :" + iWorkType);
Debug.Assert(iWorkType >= 0 && iWorkType < (int)WorkType.NUM_WORKTYPE);
switch (m_aWorks[iWorkType])
@@ -724,9 +775,14 @@ public class CECNPC : CECObject
public void StartWork_Fight(uint dwParam)
{
m_nFightTimeLeft = (int)dwParam;
BMLogger.LogError("HoangDev: StartWork_Fight");
// dwParam được dùng như “thời gian chiến đấu còn lại”
//m_nFightTimeLeft = (int)dwParam;
// Không play animation ở đây vì animation được điều khiển bởi message tấn công
}
public void StartWork_Spell(uint dwParam)
@@ -91,6 +91,7 @@ namespace BrewMonster.Network
public void c2s_CmdPlayerMove(in Vector3 vCurPos, in Vector3 vDest,
int iTime, float fSpeed, int iMoveMode, ushort wStamp)
{
BMLogger.LogError($"SendMoveCmd:");
Instance._gameSession.c2s_CmdPlayerMove(EC_Utility.ToNumerics(vCurPos), EC_Utility.ToNumerics(vDest), iTime, fSpeed, iMoveMode, wStamp);
}
protected override void Initialize()
@@ -49,7 +49,7 @@ namespace BrewMonster.UI
#if UNITY_EDITOR
if (Input.GetKeyUp(KeyCode.LeftAlt))
{
_usernameInputField.text = "test004";
_usernameInputField.text = "test002";
_passwordInputField.text = "123456";
}
#endif
+1
View File
@@ -8,6 +8,7 @@ using System.Text;
using UnityEngine;
using CSNetwork.Protocols;
using CSNetwork;
using BrewMonster;
public class CECHostMove
{