fix: update logic fly HP.

This commit is contained in:
Tungdv
2026-01-12 15:07:18 +07:00
parent 6a8274db30
commit e279eeb540
6 changed files with 111 additions and 39 deletions
@@ -37,6 +37,11 @@ namespace BrewMonster
{
OnClickBtnEscape();
}
if (Input.GetKeyDown(KeyCode.F4))
{
CmdFly(true);
}
}
/// <summary>
@@ -1472,6 +1472,15 @@ namespace CSNetwork.S2CCommand
this.z = z;
}
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct cmd_use_item
{
public byte where;
public byte byCount;
public ushort index;
public int item_id;
};
}
// Player and NPC state
@@ -719,7 +719,7 @@ namespace CSNetwork.C2SCommand
// BYTE* pBuf = (BYTE*)a_malloctemp(iSize);
// if(!pBuf) return;
//
// ((cmd_header*)pBuf)->cmd = C2S::AUTO_TEAM_SET_GOAL;
// ((cmd_header*)pBuf).cmd = C2S::AUTO_TEAM_SET_GOAL;
//
// cmd_auto_team_set_goal pCmd = (cmd_auto_team_set_goal*)(pBuf + sizeof(cmd_header));
cmd_auto_team_set_goal pCmd = new cmd_auto_team_set_goal()
@@ -730,7 +730,7 @@ namespace CSNetwork.C2SCommand
};
//
// g_pGame->GetGameSession()->SendGameData(pBuf, iSize);
// g_pGame.GetGameSession().SendGameData(pBuf, iSize);
//
// a_freetemp(pBuf);
// var cmd = new CMD_GetAllData
@@ -764,12 +764,12 @@ namespace CSNetwork.C2SCommand
// if (!pBuf)
// return;
// ((cmd_header*)pBuf)->cmd = C2S::GOTO;
// ((cmd_header*)pBuf).cmd = C2S::GOTO;
//
// cmd_goto* pCmd = (cmd_goto*)(pBuf + sizeof (cmd_header));
// pCmd->vDest.Set(x, y, z);
// pCmd.vDest.Set(x, y, z);
//
// g_pGame->GetGameSession()->SendGameData(pBuf, iSize);
// g_pGame.GetGameSession().SendGameData(pBuf, iSize);
//
// a_freetemp(pBuf);
@@ -778,5 +778,15 @@ namespace CSNetwork.C2SCommand
return SerializeCommand(CommandID.GOTO, cmd);
}
public static Octets CreateUseItemCmd(byte byPackage, byte bySlot, int tid, byte byCount)
{
cmd_use_item pCmd = new cmd_use_item();
pCmd.where = byPackage;
pCmd.index = bySlot;
pCmd.item_id = tid;
pCmd.byCount = byCount;
return SerializeCommand(CommandID.USE_ITEM, pCmd);
}
}
}
@@ -1390,5 +1390,11 @@ namespace CSNetwork
SendProtocol(gamedatasend);
}
public void c2s_SendCmdUseItem(byte byPackage, byte bySlot, int tid, byte byCount)
{
gamedatasend gamedatasend = new gamedatasend();
gamedatasend.Data = C2SCommandFactory.CreateUseItemCmd(byPackage, bySlot, tid, byCount);
SendProtocol(gamedatasend);
}
}
}
@@ -409,5 +409,10 @@ namespace BrewMonster.Network
{
Instance._gameSession.c2s_CmdGoto(x, y, z);
}
public static void c2s_CmdUseItem(byte byPackage, byte bySlot, int tid, byte byCount)
{
Instance._gameSession.c2s_SendCmdUseItem(byPackage, bySlot, tid, byCount);
}
}
}
+71 -34
View File
@@ -595,15 +595,15 @@ namespace BrewMonster
// 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));
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));
if (pSkill && (pSkill.GetCommonCoolDown() & (1 << (pCmd.cooldown_index - GP_CT_SKILLCOMMONCOOLDOWN0))))
pSkill.StartCooling(GetCoolTime(pCmd.cooldown_index), GetCoolTime(pCmd.cooldown_index));
}*/
}
@@ -622,7 +622,7 @@ namespace BrewMonster
std::map < unsigned int, CECSkill*>::const_iterator it;
for (it = inherentSkillMap.begin(); it != inherentSkillMap.end(); ++it)
{
it->second->StartCooling(GetCoolTime(pCmd->cooldown_index), GetCoolTime(pCmd->cooldown_index));
it.second.StartCooling(GetCoolTime(pCmd.cooldown_index), GetCoolTime(pCmd.cooldown_index));
}*/
}
}
@@ -648,7 +648,7 @@ namespace BrewMonster
}
/* else if (pSkill = CECComboSkillState::Instance().GetInherentSkillByID(idSkill))
{
pSkill->StartCooling(pCmd->cooldown_time, pCmd->cooldown_time);
pSkill.StartCooling(pCmd.cooldown_time, pCmd.cooldown_time);
}*/
else if (GetEquipSkillByID(idSkill) == null)
{
@@ -943,7 +943,7 @@ namespace BrewMonster
// Print a notify message
// 打印提示消息
// g_pGame->GetGameRun()->AddFixedMessage(FIXMSG_SKILLINTERRUPT);
// g_pGame.GetGameRun().AddFixedMessage(FIXMSG_SKILLINTERRUPT);
Debug.Log("Skill interrupted!");
//AP_ActionEvent(AP_EVENT_STOPSKILL);
@@ -1210,7 +1210,7 @@ namespace BrewMonster
// Continue combo skill
// 继续连击技能
// if (CECAutoPolicy::GetInstance().IsAutoPolicyEnabled())
// g_pGame->GetGameRun()->PostMessage(MSG_HST_CONTINUECOMBOSKILL, MAN_PLAYER, 0, 0, m_pComboSkill->GetGroupIndex());
// g_pGame.GetGameRun().PostMessage(MSG_HST_CONTINUECOMBOSKILL, MAN_PLAYER, 0, 0, m_pComboSkill.GetGroupIndex());
// else
m_pComboSkill.Continue(false);
}
@@ -3310,21 +3310,21 @@ namespace BrewMonster
}
/* else if (pSkill.GetType() == CECSkill::TYPE_BLESSPET)
{
CECPet* pPet = g_pGame->GetGameRun()->GetWorld()->GetNPCMan()->GetPetByID(idSelTarget);
if (!pPet || pPet->GetMasterID() == GetCharacterID())
CECPet* pPet = g_pGame.GetGameRun().GetWorld().GetNPCMan().GetPetByID(idSelTarget);
if (!pPet || pPet.GetMasterID() == GetCharacterID())
{
// Spell skill on host's pet
CECPetData* pPetData = m_pPetCorral->GetActivePet();
CECPetData* pPetData = m_pPetCorral.GetActivePet();
if (!pPetData ||
pPetData->GetClass() != GP_PET_CLASS_COMBAT &&
pPetData->GetClass() != GP_PET_CLASS_SUMMON &&
pPetData->GetClass() != GP_PET_CLASS_EVOLUTION)
pPetData.GetClass() != GP_PET_CLASS_COMBAT &&
pPetData.GetClass() != GP_PET_CLASS_SUMMON &&
pPetData.GetClass() != GP_PET_CLASS_EVOLUTION)
return false;
idCastTarget = m_pPetCorral->GetActivePetNPCID();
idCastTarget = m_pPetCorral.GetActivePetNPCID();
}
// Only fighting pet can be blessed.
if (pPet && !pPet->CanBeAttacked())
if (pPet && !pPet.CanBeAttacked())
return false;
}*/
else
@@ -3334,7 +3334,7 @@ namespace BrewMonster
}
// iTargetType == 4 means target must be pet. The problem is that pet will
// disappear from world after it died, so GetWorld()->GetObject() will return
// disappear from world after it died, so GetWorld().GetObject() will return
// NULL when host spells revive-pet skill on his dead pet. So, the target
// type of revive-pet skill should be 0
if (iTargetType != 0)
@@ -3396,7 +3396,7 @@ namespace BrewMonster
bool bTraceOK = false;
bool bUseAutoPF = false;
/* CECPlayerWrapper pWrapper = CECAutoPolicy::GetInstance().GetPlayerWrapper();
if (CECAutoPolicy::GetInstance().IsAutoPolicyEnabled() && pWrapper->GetAttackError() >= 2)
if (CECAutoPolicy::GetInstance().IsAutoPolicyEnabled() && pWrapper.GetAttackError() >= 2)
bUseAutoPF = true;*/
if (idCastTarget == 0)
@@ -4276,12 +4276,12 @@ namespace BrewMonster
case ActionCanDo.CANDO_FLY:
if (IsDead() || IsRooting() /*|| IsSitting() || IsTrading() || IsReviving() ||
if (IsDead() || IsRooting() || IsSitting() || IsTrading() || IsReviving() ||
IsUsingTrashBox() || IsTalkingWithNPC() || IsChangingFace() || GetBoothState() != 0 ||
IsFlashMoving() */ ||
m_pWorkMan.HasWorkRunningOnPriority(CECHPWorkMan.Work_priority.PRIORITY_2) /*||
m_bHangerOn || IsOperatingPet() || IsRebuildingPet() ||
IsUsingItem() || IsRidingOnPet() || GetShapeType() == PLAYERMODEL_DUMMYTYPE2 || IsPassiveMove() ||
//IsFlashMoving() ||
m_pWorkMan.HasWorkRunningOnPriority(CECHPWorkMan.Work_priority.PRIORITY_2) ||
m_bHangerOn || /*IsOperatingPet() || IsRebuildingPet() ||*/
IsUsingItem() || /*IsRidingOnPet() || GetShapeType() == PLAYERMODEL_DUMMYTYPE2 ||*/ IsPassiveMove() /*||
m_playerLimits.test(PLAYER_LIMIT_NOFLY) || m_BattleInfo.IsChariotWar()*/)
bRet = false;
@@ -4586,8 +4586,8 @@ namespace BrewMonster
{
if (IsDead())
{
/* CECGameUIMan pGameUI = g_pGame->GetGameRun()->GetUIManager()->GetInGameUIMan();
pGameUI->PopupReviveDialog(true);*/
/* CECGameUIMan pGameUI = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan();
pGameUI.PopupReviveDialog(true);*/
PopupManager.Instance.OnPlayerDied();
}
m_bEnterGame = true;
@@ -5654,9 +5654,9 @@ namespace BrewMonster
// if( m_iBuddyId )
// {
// CECPlayer pBuddy = m_pPlayerMan->GetPlayer(m_iBuddyId);
// CECPlayer pBuddy = m_pPlayerMan.GetPlayer(m_iBuddyId);
// if (pBuddy)
// pBuddy->DoEmote(pCmd->emotion);
// pBuddy.DoEmote(pCmd.emotion);
// }
GetTaskInterface().SetEmotion(pCmd.emotion);
@@ -5983,15 +5983,15 @@ namespace BrewMonster
{
cmd_player_gather_start pCmd = GPDataTypeHelper.FromBytes<cmd_player_gather_start>((byte[])Msg.dwParam1);
EC_ManMatter pMatterMan = EC_ManMessageMono.Instance.GetECManMatter;//g_pGame->GetGameRun()->GetWorld()->GetMatterMan();
EC_ManMatter pMatterMan = EC_ManMessageMono.Instance.GetECManMatter;//g_pGame.GetGameRun().GetWorld().GetMatterMan();
CECMatter pMatter = pMatterMan.GetMatter(pCmd.mid);
// if (pMatter && pMatter->IsMonsterSpiritMine()) {
// CECHPWorkUse* pWork = (CECHPWorkUse*)m_pWorkMan->CreateWork(CECHPWork::WORK_USEITEM);
// if (pMatter && pMatter.IsMonsterSpiritMine()) {
// CECHPWorkUse* pWork = (CECHPWorkUse*)m_pWorkMan.CreateWork(CECHPWork::WORK_USEITEM);
// if (pWork) {
// pWork->SetParams(pCmd->mid, pCmd->use_time * 1000, pCmd->mid, true);
// m_pWorkMan->StartWork_p1(pWork);
// pWork.SetParams(pCmd.mid, pCmd.use_time * 1000, pCmd.mid, true);
// m_pWorkMan.StartWork_p1(pWork);
// }
// StartMonsterSpiritConnectGfx(pCmd->mid, pMatter->GetPos());
// StartMonsterSpiritConnectGfx(pCmd.mid, pMatter.GetPos());
// } else {
EC_HPWorkPick pWork = (EC_HPWorkPick)m_pWorkMan.CreateWork(Host_work_ID.WORK_PICKUP);
if (pWork != null)
@@ -6028,7 +6028,7 @@ namespace BrewMonster
else if (cmd == CommandID.MINE_GATHERED)
{
cmd_mine_gathered pCmd = GPDataTypeHelper.FromBytes<cmd_mine_gathered>((byte[])Msg.dwParam1);
// ASSERT(pCmd && pCmd->player_id == m_PlayerInfo.cid);
// ASSERT(pCmd && pCmd.player_id == m_PlayerInfo.cid);
elementdataman pDataMan = EC_Game.GetElementDataMan();
DATA_TYPE DataType = pDataMan.get_data_type((uint)pCmd.item_type, ID_SPACE.ID_SPACE_ESSENCE);
if (DataType == DATA_TYPE.DT_MONSTER_SPIRIT_ESSENCE)
@@ -6305,5 +6305,42 @@ namespace BrewMonster
}
return false;
}
// Start / Stop flying
public bool CmdFly(bool bForceFly)
{
//if (m_pActionSwitcher)
// m_pActionSwitcher.PostMessge(CECActionSwitcherBase::MSG_FLY);
// first of all see if we need to cancel sitdown work.
if (!CanDo(ActionCanDo.CANDO_FLY))
return false;
EC_IvtrItem pItem = EquipInventory.GetItem(InventoryConst.EQUIPIVTR_FLYSWORD);
if (pItem == null)
return false;
if (((EC_IvtrEquip)pItem).IsDestroying())
return false;
if (!IsFlying())
{
// TODO: Maybe we should let server tell us whether we can fly or not
bool bCanFly = true;
if (m_iMoveEnv == (int)MoveEnvironment.MOVEENV_AIR)
bCanFly = false;
else if (m_iMoveEnv == (int)MoveEnvironment.MOVEENV_WATER && !CanTakeOffWater())
bCanFly = false;
if (!bCanFly)
return false;
}
UnityGameSession.c2s_CmdUseItem(InventoryConst.IVTRTYPE_EQUIPPACK, InventoryConst.EQUIPIVTR_FLYSWORD, pItem.GetTemplateID(), 1);
return true;
}
}
}