done fix anim npc and hostplayer attack anim

This commit is contained in:
VDH
2025-12-17 17:17:16 +07:00
parent f0c190d9f1
commit ab7051b2ca
16 changed files with 34753 additions and 99 deletions
@@ -248,7 +248,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1450290190322086200}
serializedVersion: 2
m_LocalRotation: {x: 0.000000041676675, y: 0.70710677, z: 0.000000009546054, w: -0.7071067}
m_LocalRotation: {x: 0.000000041676678, y: 0.7071068, z: 0.000000009546055, w: -0.70710677}
m_LocalPosition: {x: 0.20218171, y: -0.00000011874363, z: 0.14265004}
m_LocalScale: {x: 1, y: 0.99999994, z: 1}
m_ConstrainProportionsScale: 0
@@ -559,7 +559,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3779568298678900252}
serializedVersion: 2
m_LocalRotation: {x: -0.0000024752133, y: -0.24174231, z: 0.0000009670787, w: 0.97034043}
m_LocalRotation: {x: -0.0000024752135, y: -0.24174233, z: 0.0000009670788, w: 0.9703405}
m_LocalPosition: {x: 0.2888395, y: 0.0000000024365652, z: 0.00000007817289}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
@@ -592,7 +592,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4030888598971003578}
serializedVersion: 2
m_LocalRotation: {x: -0.6044032, y: -0.07699761, z: -0.7905391, w: 0.061774462}
m_LocalRotation: {x: -0.60440326, y: -0.07699761, z: -0.79053915, w: 0.061774462}
m_LocalPosition: {x: -0.18489406, y: 0.12445245, z: 0.05787985}
m_LocalScale: {x: 0.99999994, y: 1, z: 1}
m_ConstrainProportionsScale: 0
@@ -1012,7 +1012,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4948442401136316024}
serializedVersion: 2
m_LocalRotation: {x: -0.4488744, y: 0.51203674, z: -0.54636633, w: 0.4876617}
m_LocalRotation: {x: -0.44887444, y: 0.5120368, z: -0.5463664, w: 0.48766172}
m_LocalPosition: {x: -0.1453542, y: -0.04050339, z: -0.038502775}
m_LocalScale: {x: 1, y: 0.99999994, z: 0.99999994}
m_ConstrainProportionsScale: 0
@@ -1044,7 +1044,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4997153185552211034}
serializedVersion: 2
m_LocalRotation: {x: 0.65481967, y: 0.0053792964, z: 0.019061971, w: -0.7555255}
m_LocalRotation: {x: 0.6548197, y: 0.0053792964, z: 0.019061973, w: -0.7555255}
m_LocalPosition: {x: 0.42279825, y: -0.000000058457182, z: 0.00000035064298}
m_LocalScale: {x: 1, y: 0.99999994, z: 0.99999994}
m_ConstrainProportionsScale: 0
@@ -1350,7 +1350,7 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 8291201483499919416}
- component: {fileID: 5100284403898444692}
- component: {fileID: 884070991123099207}
m_Layer: 0
m_Name: "\u96CC\u6027\u51E4\u7FBD\u9E7F"
m_TagString: Untagged
@@ -1374,7 +1374,7 @@ Transform:
- {fileID: 8685953938703042471}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &5100284403898444692
--- !u!114 &884070991123099207
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -1390,7 +1390,7 @@ MonoBehaviour:
_ActionOnDisable: 0
_PlayAutomatically: 1
_Animations:
- {fileID: 7400000, guid: 153bbba8a7a5243a698dc273553eca2a, type: 2}
- {fileID: 7400000, guid: 90cc8644824b249a38b2379b6251ce34, type: 2}
- {fileID: 7400000, guid: 8665cc7619ce84512a3c2de61fd63c98, type: 2}
- {fileID: 7400000, guid: 8826e424623004a4b8ed903ef7744ab0, type: 2}
- {fileID: 7400000, guid: 102f1710aedd54d2dbbcca62840b9a7e, type: 2}
@@ -134,6 +134,9 @@ namespace BrewMonster.Managers
@@ -555,7 +555,6 @@ namespace BrewMonster
protected void ClearComActFlagAllRankNodes(bool v)
{
BMLogger.LogError("ClearComActFlagAllRankNodes " + gameObject.name + ": " + m_PlayerInfo.cid);
EventBus.PublishChannel(m_PlayerInfo.cid, new ClearComActFlagAllRankNodesEvent(v));
}
public bool PlayAttackAction(int nAttackSpeed, ref int attackTime, CECAttackEvent attackEvent)
@@ -697,9 +696,6 @@ namespace BrewMonster
public int GetShowingWeaponType()
{
//todo: mr Hoang should double check it
return 10;
int weapon_type = 0;
if (CanShowFashionWeapon((int)m_uAttackType, m_iFashionWeaponType) &&
m_aEquips[(int)IndexOfIteminEquipmentInventory.EQUIPIVTR_FASHION_WEAPON] != 0)
@@ -393,6 +393,10 @@ public class CECModel
EventBus.PublishChannel(iNFO.nid, new QueueNPCActionEvent(szActName));
return true;
}
public void StopChannelAction(int nChannel, bool bStopAct, bool bStopFx = false)
{
//TODO: Implement StopChannelAction
}
public struct QueueNPCActionEvent
{
public string AnimationName;
+111 -59
View File
@@ -1,15 +1,13 @@
using Animancer;
using BrewMonster;
using BrewMonster.Managers;
using BrewMonster.Scripts;
using CSNetwork;
using CSNetwork.GPDataType;
using ModelRenderer.Scripts.Common;
using System;
using System.IO;
using System.Threading.Tasks;
using Unity.VisualScripting;
using UnityEngine;
using static Unity.Burst.Intrinsics.X86.Avx;
public class CECNPC : CECObject
{
@@ -47,7 +45,10 @@ public class CECNPC : CECObject
protected CECPolicyAction m_pPolicyAction;
public int m_iMMIndex;
public int m_idAttackTarget;
public UINPC m_npcUI;
protected UINPC m_npcUI;
CECCounter m_IdleCnt = new CECCounter();
protected float m_nFightTimeLeft = 0; // Work Fight time left
[SerializeField] protected float m_fMoveSpeed;
[SerializeField] protected CharacterController _characterController;
[SerializeField] protected bool isDebug;
@@ -64,6 +65,10 @@ public class CECNPC : CECObject
base.SetUpCECObject();
m_vServerPos = new A3DVECTOR3();
m_iCID = (int)Class_ID.OCID_NPC;
m_DisappearCnt.SetPeriod(5000);
m_IdleCnt.SetPeriod(25000);
m_IdleCnt.IncCounter(UnityEngine.Random.Range(0, 6000));
m_pNPCModelPolicy = new CECNPCModelDefaultPolicy(this);
}
public string GetName()
@@ -86,7 +91,7 @@ public class CECNPC : CECObject
m_iCurWork = 0;
m_bStartFight = false;
m_bAboutToDie = false;
m_DisappearCnt.SetPeriod(5000);
m_StartDisappearCnt = 0;
m_BasicProps = new ROLEBASICPROP(true); // struct mặc định, các trường số = 0, mảng đã tạo
@@ -185,8 +190,37 @@ public class CECNPC : CECObject
switch (Msg.dwMsg)
{
case long value when value == EC_MsgDef.MSG_NM_NPCATKRESULT: OnMsgNPCAtkResult(Msg); break;
case long value when value == EC_MsgDef.MSG_NM_NPCSTARTPLAYACTION: OnMsgNPCStartPlayAction(Msg); break;
}
}
private void OnMsgNPCStartPlayAction(ECMSG Msg)
{
if (IsInPolicyAction())
CheckStopPolicyAction();
cmd_object_start_play_action cmd = GPDataTypeHelper.FromBytes<cmd_object_start_play_action>((byte[])Msg.dwParam1);
StartWork((int)WorkType.WT_INTERRUPT, (int)WorkID.WORK_POLICYACTION, 0, cmd);
}
private void CheckStopPolicyAction()
{
if (!IsInPolicyAction()) return;
WorkFinished((int)WorkID.WORK_POLICYACTION);
if (m_pPolicyAction != null)
{
m_pNPCModelPolicy.StopChannelAction();
m_pPolicyAction = null;
m_nPolicyActionIntervalTimer = 0;
}
}
private bool IsInPolicyAction()
{
return m_pPolicyAction != null;
}
public void OnMsgAttackHostResult(int idHost, int nDamage, int nFlag, int nSpeed)
{
//BMLogger.LogError("HoangDev: OnMsgAttackHostResultNPC");
@@ -423,6 +457,11 @@ public class CECNPC : CECObject
switch (m_iCurWork)
{
case (int)WorkID.WORK_MOVE: TickWork_Move(Time.deltaTime); break;
case (int)WorkID.WORK_STAND: TickWork_Stand(Time.deltaTime); break;
case (int)WorkID.WORK_FIGHT: TickWork_Fight(Time.deltaTime); break;
case (int)WorkID.WORK_SPELL: TickWork_Spell(Time.deltaTime); break;
case (int)WorkID.WORK_DEAD: TickWork_Dead(Time.deltaTime); break;
//case (int)WorkID.WORK_POLICYACTION: TickWork_PolicyAction(Time.deltaTime); break;
}
// Calculate distance to host player
@@ -448,6 +487,60 @@ public class CECNPC : CECObject
StartAdjustTransparency(-1.0f, GetTransparentLimit(), 500);
}
}
private void TickWork_Dead(float deltaTime)
{
}
private void TickWork_Spell(float deltaTime)
{
}
private void TickWork_Fight(float deltaTime)
{
m_nFightTimeLeft -= deltaTime;
if (m_nFightTimeLeft < 0)
{
m_nFightTimeLeft = 0;
WorkFinished((int)WorkID.WORK_FIGHT);
return;
}
NPCTurnFaceTo(m_idAttackTarget, 100);
A3DVECTOR3 vDir = m_vServerPos - GetPos();
float fDist = vDir.Normalize();
if (fDist > 0.0001f)
{
float fMoveDist = 10.0f * deltaTime * 0.001f;
if (fMoveDist > fDist)
fMoveDist = fDist;
SetPos(EC_Utility.ToVector3(GetPos() + vDir * fMoveDist));
}
}
private void TickWork_Stand(float deltaTime)
{
if (m_IdleCnt.IncCounter(deltaTime * 1000))
{
m_IdleCnt.Reset();
if (IsMonsterOrPet())
{
PlayModelAction((int)NPCActionIndex.ACT_IDLE);
if (IsPetNPC() && !IsDead() && !IsDisappearing())
{
//OnPetSays(CECPetWords::TW_REST);
}
}
else
PlayModelAction((int)NPCActionIndex.ACT_NPC_IDLE1 + UnityEngine.Random.Range(0, 2));
}
}
public void DestroySelf()
{
Destroy(gameObject);
@@ -500,10 +593,6 @@ public class CECNPC : CECObject
}
else if (MovingTo(dwDeltaTime))
{
if (-2041571143 == m_NPCInfo.nid)
{
BMLogger.LogError("CECNPC::TickWork_Move, MovingTo returned true, finishing WORK_MOVE naturally");
}
if (!IsDirFixed())
{
SetDestDirAndUp((m_vStopDir), g_vAxisY, 150);
@@ -579,18 +668,10 @@ public class CECNPC : CECObject
float fDist = vDir.Normalize();
A3DVECTOR3 vPos = vDir * m_fMoveSpeed * deltaTime;
float fMoveDelta = Vector3.Magnitude(EC_Utility.ToVector3(vPos) - EC_Utility.ToVector3(vCurPos));
if (-2041571143 == m_NPCInfo.nid)
{
BMLogger.LogError($"CECNPC::MovingTo, m_bStopMove=true, dist={fDist}, curPos={vCurPos}, m_vServerPos={m_vServerPos}");
}
// If already very close to destination, consider it reached
if (fMoveDelta >= fDist)
{
// Already at destination
if (-2041571143 == m_NPCInfo.nid)
{
BMLogger.LogError("CECNPC::MovingTo, dist <= 0.001f, setting reachedDestination = true");
}
_characterController.enabled = false;
transform.position = EC_Utility.ToVector3(m_vServerPos);
_characterController.enabled = true;
@@ -763,24 +844,14 @@ public class CECNPC : CECObject
{
throw new InvalidOperationException("Invalid work state in WorkFinished");
}
// Release current work
ReleaseWork(m_iCurWorkType);
if (-2041571143 == m_NPCInfo.nid && iWorkID == (int)WorkID.WORK_MOVE)
{
BMLogger.LogError("CECNPC::WorkFinished, finishing WORK_MOVE, looking for next work");
}
bool foundNextWork = false;
for (int i = m_iCurWorkType - 1; i >= 0; i--)
{
if (m_aWorks[i] != 0) // giả định m_aWorks là mảng int workIDs
{
if (-2041571143 == m_NPCInfo.nid)
{
BMLogger.LogError($"CECNPC::WorkFinished, found next work: {m_aWorks[i]} (type: {i})");
}
m_iCurWorkType = i;
StartWorkByID(m_aWorks[i], 0);
foundNextWork = true;
@@ -792,10 +863,6 @@ public class CECNPC : CECObject
// This matches C++ behavior where NPC should stand when movement finishes
if (!foundNextWork && !IsDead())
{
if (-2041571143 == m_NPCInfo.nid)
{
BMLogger.LogError("CECNPC::WorkFinished, no next work found, defaulting to WORK_STAND");
}
StartWork((int)WorkType.WT_NORMAL, (int)WorkID.WORK_STAND, 0);
}
@@ -943,12 +1010,6 @@ public class CECNPC : CECObject
(float)Math.Round(cmd.dest.z, 4)
);
m_vMoveDir = (cmd.dest) - EC_Utility.ToA3DVECTOR3(transform.position);
if (-2041571143 == m_NPCInfo.nid)
{
BMLogger.LogError($"CECNPC::StopMoveTo, MoveDir=" + m_vMoveDir);
BMLogger.LogError($"CECNPC::StopMoveTo, cmd.dest=" + cmd.dest);
BMLogger.LogError($"CECNPC::StopMoveTo, EC_Utility.ToA3DVECTOR3(transform.position)=" + EC_Utility.ToA3DVECTOR3(transform.position));
}
m_bStopMove = true;
m_fMoveSpeed = EC_Utility.FIX8TOFLOAT(cmd.sSpeed);
m_vServerPos = cmd.dest;
@@ -966,10 +1027,6 @@ public class CECNPC : CECObject
}
float fDist = m_vMoveDir.Normalize();
if (-2041571143 == m_NPCInfo.nid)
{
BMLogger.LogError("HoangDEv iMoveMode" + iMoveMode);
}
// Trong các trường hợp dưới thì kéo NPC về đích
if (iMoveMode != (int)GPMoveMode.GP_MOVE_RETURN &&
iMoveMode != (int)GPMoveMode.GP_MOVE_PUSH &&
@@ -990,10 +1047,6 @@ public class CECNPC : CECObject
vDirH.Normalize();
if (DotProduct(vDirH, (m_vStopDir)) < 0.7f)
bPull = true;
if (-2041571143 == m_NPCInfo.nid)
{
BMLogger.LogError($"vDirH={vDirH}, m_vStopDir= {m_vStopDir}, HoangDEv DotProduct =" + DotProduct(vDirH, (m_vStopDir)));
}
}
else if (iMoveMode == (int)GPMoveMode.GP_MOVE_BLINK)
{
@@ -1164,7 +1217,7 @@ public class CECNPC : CECObject
case (int)WorkID.WORK_MOVE:
{
var pos = EC_Utility.ToVector3(m_vServerPos);
var vDelta = pos -transform.position;
var vDelta = pos - transform.position;
float fDist = vDelta.magnitude; // Vector3.magnitude trong Unity
if (fDist > 0.1f)
@@ -1194,7 +1247,7 @@ public class CECNPC : CECObject
m_iCurWork = 0;
}
public void StartWork(int iWorkType, int iNewWork, uint dwParam = 0)
public void StartWork(int iWorkType, int iNewWork, uint dwParam = 0, cmd_object_start_play_action cmd_Object_Start_Play_Action = default)
{
Debug.Assert(iWorkType >= 0 && iWorkType < (int)WorkType.NUM_WORKTYPE);
@@ -1247,13 +1300,13 @@ public class CECNPC : CECObject
return;
}
StartWorkByID(iNewWork, dwParam);
StartWorkByID(iNewWork, dwParam, cmd_Object_Start_Play_Action);
}
public bool ShouldDisappear() { return m_DisappearCnt.IsFull(); }
public void StopWork(int iWorkType)
{
}
public void StartWorkByID(int iWorkID, uint dwParam)
public void StartWorkByID(int iWorkID, uint dwParam, cmd_object_start_play_action cmd_Object_Start_Play_Action = default)
{
// Ignore all message if this NPC is dead.
// if (IsDead())
@@ -1266,7 +1319,7 @@ public class CECNPC : CECObject
case (int)WorkID.WORK_SPELL: StartWork_Spell(dwParam); break;
case (int)WorkID.WORK_DEAD: StartWork_Dead(dwParam); break;
case (int)WorkID.WORK_MOVE: StartWork_Move(dwParam); break;
case (int)WorkID.WORK_POLICYACTION: StartWork_PolicyAction(dwParam); break;
case (int)WorkID.WORK_POLICYACTION: StartWork_PolicyAction(cmd_Object_Start_Play_Action); break;
}
// if (iWorkID != WORK_MOVE) m_iPassiveMove = 0;
@@ -1320,18 +1373,17 @@ public class CECNPC : CECObject
}*/
}
public void StartWork_PolicyAction(uint dwParam)
public void StartWork_PolicyAction(cmd_object_start_play_action cmd_Object_Start_Play_Action)
{
/* if (m_pPolicyAction == null)
m_pPolicyAction = new CECPolicyAction();
/* if (m_pPolicyAction == null)
m_pPolicyAction = new CECPolicyAction();
// Trong C++: m_pPolicyAction->Init((const S2C::cmd_object_start_play_action *)dwParam);
// Sang C#: dwParam không thể cast trực tiếp. Bạn sẽ cần truyền object phù hợp vào.
m_pPolicyAction.Init((S2C.cmd_object_start_play_action)dwParam);
m_pPolicyAction.Tick(0);
m_nPolicyActionIntervalTimer = 0;
CheckStartPolicyAction();*/
m_pPolicyAction.Init((cmd_object_start_play_action)cmd_Object_Start_Play_Action);
m_pPolicyAction.Tick(0);
m_nPolicyActionIntervalTimer = 0;
CheckStartPolicyAction();*/
}
public bool ShouldPlayNewActionFor(int iMoveMode)
@@ -55,6 +55,13 @@ public class CECNPCModelDefaultPolicy
}
return true;
}
public override void StopChannelAction()
{
if (m_pNPCModel != null)
{
m_pNPCModel.StopChannelAction(0, true);
}
}
public override bool GetCHAABB(ref A3DAABB aabb)
{
@@ -172,9 +179,6 @@ public class CECNPCModelDefaultPolicy
}
else
{
if (iAction == (int)NPCActionIndex.ACT_DIE || iAction == (int)NPCActionIndex.ACT_NPC_DIE)
{
}
if (_npcVisual.isDebug)
{
BMLogger.LogError("CECNPCModelDefaultPolicy::PlayModelAction iAction :" + iAction);
@@ -14,6 +14,6 @@ namespace BrewMonster
public abstract void ClearComActFlag(bool bSignalCurrent);
public abstract bool PlayAttackAction(int nAttackSpeed, CECAttackEvent attackevent);
public abstract bool GetCHAABB(ref A3DAABB ab);
public abstract void StopChannelAction();
}
}
@@ -1801,7 +1801,17 @@ namespace CSNetwork.GPDataType
}
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_object_start_play_action
{
public int id;
public int play_times;
public int action_last_time;
public int interval_time;
public uint name_length;
public char[] action_name;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_change_curr_title_re
{
@@ -1824,7 +1834,7 @@ namespace CSNetwork.GPDataType
// In C++, placeholder is byte. It used to first byte of a byte[] data
// but in C# we need to define it as byte[] to hold the whole data.
//public byte placeholder; // Task data ...
public byte[] placeholder; // Task data ...
public byte[] placeholder; // Task data ...
}
// PLAYER_EXT_PROP_BASE
@@ -1,3 +1,4 @@
using CSNetwork.GPDataType;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -8,6 +9,43 @@ namespace BrewMonster
{
public class CECPolicyAction
{
public void Init(cmd_object_start_play_action pCmd)
{
// TODO: CECPolicyAction convert
// Çå³ýÒÑÓÐÊý¾Ý
/* Reset();
// ÉèÖÃЭÒéÊý¾Ý
m_playTimes = pCmd->play_times;
m_actionTime = pCmd->action_last_time;
m_intervalTime = pCmd->interval_time;
if (pCmd->name_length && pCmd->action_name[0])
m_actionName = AString(pCmd->action_name, pCmd->name_length);
// Ñé֤ЭÒéÄÚÈÝ
ASSERT(m_actionTime >= 0); // ÔÊÐí²¥·Å¶¯×÷ʱ¼äΪ0
ASSERT(m_intervalTime >= 0); // ÔÊÐí¶¯×÷²¥·Å¼ä¸ôʱ¼äΪ0
ASSERT(m_actionTime > 0 || m_intervalTime > 0); // ²»ÔÊÐí¶¯×÷²¥·Åʱ¼äºÍ¶¯×÷²¥·Å¼ä¸ôͬʱΪ0
ASSERT(m_actionTime == 0 || m_actionTime > 0 && !m_actionName.IsEmpty()); // ²»ÔÊÐí²¥·Å¶¯×÷ʱµ«¶¯×÷Ãû³ÆÎª¿Õ
ASSERT(m_playTimes > 0); // ²»ÔÊÐí²¥·Å´ÎÊý·ÇÕý
if (m_playTimes > 0 && m_actionTime >= 0 && m_intervalTime >= 0)
m_timeLength = m_playTimes * m_actionTime + (m_playTimes - 1) * m_intervalTime;
// ³õʼ»¯×´Ì¬±äÁ¿
m_validPolicy = true;
if (m_actionTime < 0 || m_intervalTime < 0 || m_actionTime == 0 && m_intervalTime == 0 ||
m_playTimes <= 0)
{
m_validPolicy = false;
}
m_inPolicy = (m_validPolicy && m_timeLength > 0);
m_inPlay = (m_inPolicy && m_playTimes > 0 && m_actionTime > 0);
m_policyTimer = 0;
m_playedTimes = 0;
m_playTimer = 0;
m_internalTimer = 0;*/
}
}
}
@@ -167,3 +167,6 @@ namespace BrewMonster
@@ -165,3 +165,6 @@ namespace BrewMonster
@@ -104,3 +104,6 @@ namespace BrewMonster
@@ -192,7 +192,7 @@ namespace BrewMonster
{
if (pSkill != null)
{
BMLogger.Log("HoangDev: QuickBar Set Skill Icon: " + (uint)pSkill.GetSkillID() + " : " + ElementSkill.GetIcon((uint)pSkill.GetSkillID()));
//BMLogger.Log("HoangDev: QuickBar Set Skill Icon: " + (uint)pSkill.GetSkillID() + " : " + ElementSkill.GetIcon((uint)pSkill.GetSkillID()));
var nameskill = ElementSkill.GetIcon((uint)pSkill.GetSkillID());
Sprite[] sprites = Resources.LoadAll<Sprite>("iconlist_skill_multisprite");
pCell.SetSkillImage(sprites.FirstOrDefault(s => s.name == nameskill));
-1
View File
@@ -1966,7 +1966,6 @@ namespace BrewMonster
m_bMelee = false;
//
// // if there is an attack event currently, we should let it fire now.
BMLogger.LogError("HoangDev: OnMsgHstStopAttack " + gameObject.name);
ClearComActFlagAllRankNodes(true);
cmd_host_stop_attack pCmd = GPDataTypeHelper.FromBytes<cmd_host_stop_attack>((byte[])Msg.dwParam1);
File diff suppressed because one or more lines are too long