fix: update logic fly HP (Send cmd to server).

This commit is contained in:
Tungdv
2026-01-12 19:23:09 +07:00
parent e279eeb540
commit 11eb224dc0
6 changed files with 165 additions and 46 deletions
@@ -837,6 +837,11 @@ namespace BrewMonster.Scripts
}
return result;
}
public bool IsFreeFalling()
{
return IsWorkRunning(Host_work_ID.WORK_FREEFALL);
}
}
public abstract class CECHPWorkPostTickCommand
{
@@ -64,6 +64,7 @@ namespace PerfectWorld.Scripts.Managers
case int value5 when value5 == EC_MsgDef.MSG_PM_ENCHANTRESULT:
case int value6 when value6 == EC_MsgDef.MSG_PM_PLAYERDOEMOTE:
case int value7 when value7 == EC_MsgDef.MSG_PM_PLAYERGATHER:
case int value8 when value8 == EC_MsgDef.MSG_PM_PLAYERFLY:
TransmitMessage(Msg);
break;
case int value when value == EC_MsgDef.MSG_PM_PLAYERDIED:
@@ -658,6 +659,14 @@ namespace PerfectWorld.Scripts.Managers
cid = cmdMineGathered.player_id;
}
break;
case long value when value == EC_MsgDef.MSG_PM_PLAYERFLY:
if (Convert.ToInt32(Msg.dwParam2) == CommandID.OBJECT_TAKEOFF)
cid = (GPDataTypeHelper.FromBytes<cmd_object_takeoff>((byte[])Msg.dwParam1)).object_id;
else // OBJECT_LANDING
cid = (GPDataTypeHelper.FromBytes<cmd_object_landing>((byte[])Msg.dwParam1)).object_id;
break;
// ⚠️ Các case khác cũng tương tự, chỉ việc lấy ra đúng trường id / caster / user ...
// Do quá dài nên bạn có thể copy dần từng case từ C++ sang.
@@ -89,6 +89,7 @@ namespace BrewMonster
protected bool m_bHangerOn = false;
protected int m_iCurAction;
bool m_bAboutToDie = false;
public bool m_bCandHangerOn = false;
public MOVECONST m_MoveConst; // Const used when moving control
public Move_Mode m_MoveMode;
@@ -1607,6 +1608,21 @@ namespace BrewMonster
public bool IsAboutToDie() { return m_bAboutToDie; }
public void SetAboutToDie(bool bFlag) { m_bAboutToDie = bFlag; }
public bool IsHangerOn() { return m_bHangerOn; }
// Show / hide wing
public void ShowWing(bool bShow)
{
//if (m_pPlayerModel)
//{
// CECModel* pWing = m_pPlayerModel->GetChildModel(_wing);
// if (pWing) pWing->Show(bShow);
// CECModel* pWing2 = m_pPlayerModel->GetChildModel(_wing2);
// if (pWing2) pWing2->Show(bShow);
//}
}
}
public struct PlayActionEvent
@@ -2119,5 +2119,23 @@ namespace CSNetwork.GPDataType
public int player_id;
public int item_type;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_object_takeoff
{
public int object_id;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_object_landing
{
public int object_id;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_host_rush_fly
{
public byte is_active;
};
}
@@ -592,7 +592,7 @@ namespace CSNetwork
// if (string.IsNullOrEmpty(szMsg))
// BMLogger.LogError("SERVER - unknown error !");
//else if (pCmd.iMessage != 2)
//g_pGame->GetGameRun()->AddChatMessage(szMsg, GP_CHAT_MISC);
//g_pGame.GetGameRun().AddChatMessage(szMsg, GP_CHAT_MISC);
}
if (pCmd.iMessage == 2)
@@ -603,31 +603,31 @@ namespace CSNetwork
else if (pCmd.iMessage == 20)
{
// Failed to cast skill
//pGameRun->PostMessage(MSG_PM_CASTSKILL, MAN_PLAYER, 0, (DWORD)pDataBuf, pCmdHeader->cmd);
//pGameRun.PostMessage(MSG_PM_CASTSKILL, MAN_PLAYER, 0, (DWORD)pDataBuf, pCmdHeader.cmd);
}
else if (pCmd.iMessage == 133 || pCmd.iMessage == 134)
{
// deal failed
//pGameRun->PostMessage(MSG_HST_BUY_SELL_FAIL, MAN_PLAYER, 0, (DWORD)pDataBuf, pCmdHeader->cmd);
//pGameRun.PostMessage(MSG_HST_BUY_SELL_FAIL, MAN_PLAYER, 0, (DWORD)pDataBuf, pCmdHeader.cmd);
}
else if (pCmd.iMessage == 158)
{
// µ±Ç°»ãÂʲ»¶Ô£¬ÖØÐÂÈ¡»ãÂÊ
//c2s_CmdGetCashMoneyRate();
}
else if (pCmd.iMessage == 108 /*&& pGameRun->GetHostPlayer()->IsInKingService()*/)
else if (pCmd.iMessage == 108 /*&& pGameRun.GetHostPlayer().IsInKingService()*/)
{
/* CECGameUIMan* pGameUI = pGameRun->GetUIManager()->GetInGameUIMan();
/* CECGameUIMan* pGameUI = pGameRun.GetUIManager().GetInGameUIMan();
if (pGameUI)
pGameUI->EndNPCService();*/
pGameUI.EndNPCService();*/
}
else if
(pCmd.iMessage == 108 /*&& pGameRun->GetHostPlayer()->GetOfflineShopCtrl()->GetNPCSevFlag() != COfflineShopCtrl::NPCSEV_NULL*/
(pCmd.iMessage == 108 /*&& pGameRun.GetHostPlayer().GetOfflineShopCtrl().GetNPCSevFlag() != COfflineShopCtrl::NPCSEV_NULL*/
)
{
/* CECGameUIMan* pGameUI = pGameRun->GetUIManager()->GetInGameUIMan();
/* CECGameUIMan* pGameUI = pGameRun.GetUIManager().GetInGameUIMan();
if (pGameUI)
pGameUI->EndNPCService();*/
pGameUI.EndNPCService();*/
}
else if (pCmd.iMessage == 175)
{
@@ -787,6 +787,27 @@ namespace CSNetwork
case CommandID.COOLTIME_DATA:
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_COOLTIMEDATA, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
break;
case CommandID.OBJECT_TAKEOFF:
{
cmd_object_takeoff pCmdTakeOff = GPDataTypeHelper.FromBytes<cmd_object_takeoff>((byte[])pDataBuf);
if (ISPLAYERID(pCmdTakeOff.object_id))
EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERFLY, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
break;
}
case CommandID.OBJECT_LANDING:
{
cmd_object_landing pCmdLanding = GPDataTypeHelper.FromBytes<cmd_object_landing>((byte[])pDataBuf);
if (ISPLAYERID(pCmdLanding.object_id))
EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERFLY, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
break;
}
case CommandID.HOST_RUSH_FLY:
EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERFLY, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
break;
case CommandID.FLYSWORD_TIME:
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_FLYSWORDTIME, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
break;
}
}
+87 -37
View File
@@ -21,10 +21,7 @@ using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using UnityEngine;
using UnityEngine.PlayerLoop;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using static System.Net.Mime.MediaTypeNames;
using Host_work_ID = BrewMonster.Scripts.CECHPWork.Host_work_ID;
using Trace_reason = BrewMonster.CECHPWorkTrace.Trace_reason;
@@ -90,6 +87,7 @@ namespace BrewMonster
private CECSkill m_pTargetItemSkill; // Target item skill
public CECComboSkill m_pComboSkill; // Combo skill
public A3DVECTOR3 m_vAccel; // Accelerate\
public bool m_bRushFly = false; // true, in rush fly mode
private CECCounter m_IncantCnt;
private bool m_bMelee;
@@ -119,7 +117,7 @@ namespace BrewMonster
// ID of summon player skill
const int ID_SUMMONPLAYER_SKILL = 1824;
private CECAutoTeam m_pAutoTeam;
private CECAutoTeam m_pAutoTeam;
// ====== Ground cast config ======
[Header("Ground Cast")]
@@ -547,6 +545,7 @@ namespace BrewMonster
case int value when value == EC_MsgDef.MSG_HST_COOLTIMEDATA: OnMsgHstCoolTimeData(Msg); break;
case int value when value == EC_MsgDef.MSG_HST_SETCOOLTIME: OnMsgHstSetCoolTime(Msg); break;
case int value when value == EC_MsgDef.MSG_HST_PRESSCANCEL: OnMsgHstPressCancel(Msg); break;
case int value when value == EC_MsgDef.MSG_PM_PLAYERFLY: OnMsgPlayerFly(Msg); break;
}
@@ -593,30 +592,30 @@ namespace BrewMonster
{
int i;
// other goblin skills should be set public cool down, 1 second
/* for (i = 0; i < m_aGoblinSkills.GetSize(); i++)
{
if (m_aGoblinSkills[i] && m_aGoblinSkills[i].GetCoolingCnt() == 0)
m_aGoblinSkills[i].StartCooling(GetCoolTime(GP_CT_CAST_ELF_SKILL), GetCoolTime(GP_CT_CAST_ELF_SKILL));
}*/
/* for (i = 0; i < m_aGoblinSkills.GetSize(); i++)
{
if (m_aGoblinSkills[i] && m_aGoblinSkills[i].GetCoolingCnt() == 0)
m_aGoblinSkills[i].StartCooling(GetCoolTime(GP_CT_CAST_ELF_SKILL), GetCoolTime(GP_CT_CAST_ELF_SKILL));
}*/
/* for (i = 0; i < m_aPsSkills.Count; i++)
{
CECSkill pSkill = GetPassiveSkillByIndex(i);
if (pSkill && (pSkill.GetCommonCoolDown() & (1 << (pCmd.cooldown_index - GP_CT_SKILLCOMMONCOOLDOWN0))))
pSkill.StartCooling(GetCoolTime(pCmd.cooldown_index), GetCoolTime(pCmd.cooldown_index));
}*/
/* for (i = 0; i < m_aPsSkills.Count; i++)
{
CECSkill pSkill = GetPassiveSkillByIndex(i);
if (pSkill && (pSkill.GetCommonCoolDown() & (1 << (pCmd.cooldown_index - GP_CT_SKILLCOMMONCOOLDOWN0))))
pSkill.StartCooling(GetCoolTime(pCmd.cooldown_index), GetCoolTime(pCmd.cooldown_index));
}*/
}
if (pCmd.cooldown_index >= (int)CoolTimeIndex.GP_CT_SKILLCOMMONCOOLDOWN0 && pCmd.cooldown_index <= (int)CoolTimeIndex.GP_CT_SKILLCOMMONCOOLDOWN4)
{
// other player skills should be set public cool down too.
uint mask = (uint)( 1 << (pCmd.cooldown_index - (int)CoolTimeIndex.GP_CT_SKILLCOMMONCOOLDOWN0));
uint mask = (uint)(1 << (pCmd.cooldown_index - (int)CoolTimeIndex.GP_CT_SKILLCOMMONCOOLDOWN0));
for (int i = 0; i < GetPositiveSkillNum(); i++)
{
CECSkill pSkill = GetPositiveSkillByIndex(i);
int fakeRef = 0;
if (pSkill != null && (pSkill.GetCommonCoolDown() & mask) != 0)
pSkill.StartCooling(GetCoolTime(pCmd.cooldown_index,ref fakeRef), GetCoolTime(pCmd.cooldown_index, ref fakeRef));
pSkill.StartCooling(GetCoolTime(pCmd.cooldown_index, ref fakeRef), GetCoolTime(pCmd.cooldown_index, ref fakeRef));
}
/*const std::map<unsigned int, CECSkill*>&inherentSkillMap = CECComboSkillState::Instance().GetInherentSkillMap();
std::map < unsigned int, CECSkill*>::const_iterator it;
@@ -646,13 +645,13 @@ namespace BrewMonster
{
pSkill.StartCooling(pCmd.cooldown_time, pCmd.cooldown_time);
}
/* else if (pSkill = CECComboSkillState::Instance().GetInherentSkillByID(idSkill))
{
pSkill.StartCooling(pCmd.cooldown_time, pCmd.cooldown_time);
}*/
/* else if (pSkill = CECComboSkillState::Instance().GetInherentSkillByID(idSkill))
{
pSkill.StartCooling(pCmd.cooldown_time, pCmd.cooldown_time);
}*/
else if (GetEquipSkillByID(idSkill) == null)
{
BMLogger.LogError ("HoangDev: pSkill " + pSkill);
BMLogger.LogError("HoangDev: pSkill " + pSkill);
}
}
else
@@ -4466,10 +4465,7 @@ namespace BrewMonster
return false;
}
if (m_iMoveEnv == Move_environment.MOVEENV_AIR)
{
}
else if (m_iMoveEnv == Move_environment.MOVEENV_WATER)
if (m_iMoveEnv == Move_environment.MOVEENV_WATER || m_iMoveEnv == Move_environment.MOVEENV_AIR)
{
float angle = Vector2.Angle(new Vector2(joystick.Horizontal, joystick.Vertical), Vector2.up);
angle *= joystick.Horizontal < 0 ? 1 : -1;
@@ -4520,7 +4516,7 @@ namespace BrewMonster
{
h0 = hits[0].point.y;
}
if(vPos.y < h0 - m_MoveConst.fShoreDepth)
if (vPos.y < h0 - m_MoveConst.fShoreDepth)
{
return false;
}
@@ -5552,13 +5548,13 @@ namespace BrewMonster
vHitNormal = EC_Utility.ToA3DVECTOR3(Vector3.up);
}
else
{
{
if (Math.Abs(hits[0].distance - 0f) <= float.Epsilon)
{
// halfBox with y = 0.05f? I need Y box check too small.
count = Physics.BoxCastNonAlloc(vCenter, new Vector3(vExt.x, 0.05f, vExt.z), (Vector3.down).normalized,
hits, transform.rotation, DeltaY, layerMask);
if(count == 0)
if (count == 0)
{
vHitPos = vCenter;
vHitNormal = EC_Utility.ToA3DVECTOR3(Vector3.up);
@@ -6044,7 +6040,7 @@ namespace BrewMonster
{
// Get real time tick of this frame
var iRealTime = EC_Game.GetRealTickTime();
// Update flysword time
/*if (IsFlying() && GetRushFlyFlag())
{
@@ -6279,7 +6275,7 @@ namespace BrewMonster
}
// Cancel current selection
if (m_idSelTarget >0)
if (m_idSelTarget > 0)
{
SelectTarget(0);
return;
@@ -6293,13 +6289,15 @@ namespace BrewMonster
return;
}
}
// Is doing session pose ?
private bool DoingSessionPose()
{
var pCurWork = m_pWorkMan.GetRunningWork(Host_work_ID.WORK_STAND);
if (pCurWork !=null){
if (((CECHPWorkStand)pCurWork).DoingSessionPose()){
if (pCurWork != null)
{
if (((CECHPWorkStand)pCurWork).DoingSessionPose())
{
return true;
}
}
@@ -6313,7 +6311,7 @@ namespace BrewMonster
// m_pActionSwitcher.PostMessge(CECActionSwitcherBase::MSG_FLY);
// first of all see if we need to cancel sitdown work.
if (!CanDo(ActionCanDo.CANDO_FLY))
return false;
@@ -6322,8 +6320,11 @@ namespace BrewMonster
if (pItem == null)
return false;
if (((EC_IvtrEquip)pItem).IsDestroying())
return false;
if(pItem is EC_IvtrEquip)
{
if ((pItem as EC_IvtrEquip).IsDestroying())
return false;
}
if (!IsFlying())
{
@@ -6342,5 +6343,54 @@ namespace BrewMonster
UnityGameSession.c2s_CmdUseItem(InventoryConst.IVTRTYPE_EQUIPPACK, InventoryConst.EQUIPIVTR_FLYSWORD, pItem.GetTemplateID(), 1);
return true;
}
void OnMsgPlayerFly(ECMSG Msg)
{
if (Convert.ToInt32(Msg.dwParam2) == CommandID.OBJECT_TAKEOFF)
{
if ((m_dwStates & PlayerNPCState.GP_STATE_FLY) == 0)
{
m_dwStates |= PlayerNPCState.GP_STATE_FLY;
m_bRushFly = false;
CECHPWorkFly pWork = (CECHPWorkFly)m_pWorkMan.CreateWork(CECHPWork.Host_work_ID.WORK_FLYOFF);
if (m_pWorkMan.IsFreeFalling())
{
pWork.m_bContinueFly = true;
m_pWorkMan.StartWork_p1(pWork);
}
else
{
pWork.m_bContinueFly = false;
m_pWorkMan.StartWork_p2(pWork);
}
}
}
else if (Convert.ToInt32(Msg.dwParam2) == CommandID.OBJECT_LANDING)
{
if ((m_dwStates & PlayerNPCState.GP_STATE_FLY) != 0)
{
m_dwStates &= ~(uint)PlayerNPCState.GP_STATE_FLY;
if (IsDead() || m_bCandHangerOn || IsHangerOn())
ShowWing(false);
else
{
CECHPWorkFall pWork = (CECHPWorkFall)m_pWorkMan.CreateWork(CECHPWork.Host_work_ID.WORK_FREEFALL);
pWork.SetFallType(CECHPWorkFall.Fall_type.TYPE_FLYFALL);
m_pWorkMan.StartWork_p1(pWork);
}
// Below two lines will fix the "host stand in air" bug.
m_iMoveEnv = Move_environment.MOVEENV_GROUND;
m_CDRInfo.vTPNormal.Clear();
}
}
else // HOST_RUSH_FLY
{
cmd_host_rush_fly pCmd = GPDataTypeHelper.FromBytes<cmd_host_rush_fly>((byte[])Msg.dwParam1);
m_bRushFly = pCmd.is_active != 0 ? true : false;
}
}
}
}