474 lines
21 KiB
C#
474 lines
21 KiB
C#
using BrewMonster.Network;
|
|
using BrewMonster.Scripts;
|
|
using BrewMonster.Scripts.Pet;
|
|
using BrewMonster.UI;
|
|
using CSNetwork;
|
|
using CSNetwork.GPDataType;
|
|
using System.Runtime.InteropServices;
|
|
using UnityEngine;
|
|
using static BrewMonster.Scripts.Pet.CECPetData;
|
|
|
|
namespace BrewMonster
|
|
{
|
|
public partial class CECHostPlayer
|
|
{
|
|
// Update pet shortcut when pet freeed
|
|
void UpdateFreedPetSC(int iPetIndex)
|
|
{
|
|
// TO DO: fix later
|
|
//int i;
|
|
|
|
//// Update shortcut sets 1
|
|
//for (i = 0; i < (int)Shortcut.NUM_HOSTSCSETS1; i++)
|
|
//{
|
|
// if (m_aSCSets1[i] != null)
|
|
// m_aSCSets1[i].UpdateFreedPetSC(iPetIndex);
|
|
//}
|
|
|
|
//// Update shortcut sets 2
|
|
//for (i = 0; i < (int)Shortcut.NUM_HOSTSCSETS2; i++)
|
|
//{
|
|
// if (m_aSCSets2[i] != null)
|
|
// m_aSCSets2[i].UpdateFreedPetSC(iPetIndex);
|
|
//}
|
|
}
|
|
|
|
bool OnPetSays(int tid, int nid, int type)
|
|
{
|
|
bool bSaid = false;
|
|
|
|
//CECNPC pNPC = EC_Game.GetGameRun().GetWorld().GetNPCMan().GetNPCFromAll(nid);
|
|
//if (pNPC && pNPC.GetMasterID() == GetCharacterID())
|
|
//{
|
|
// const ACHAR* szWords = m_pPetWords.GetWords(tid, (CECPetWords::TYPE_WORDS)type);
|
|
// if (szWords)
|
|
// {
|
|
// pNPC.SetLastSaidWords(szWords, 5000);
|
|
// bSaid = true;
|
|
// }
|
|
//}
|
|
|
|
return bSaid;
|
|
}
|
|
|
|
/* Is host operating pet ?
|
|
return value:
|
|
|
|
0: host doesn't operating pet.
|
|
1: host is summoning pet.
|
|
2: host is recalling pet.
|
|
3: host is banishing pet.
|
|
*/
|
|
int CIsOperatingPet()
|
|
{
|
|
CECHPWorkConcentrate pWork = (m_pWorkMan.GetRunningWork(CECHPWork.Host_work_ID.WORK_CONCENTRATE)) as CECHPWorkConcentrate;
|
|
if (pWork != null)
|
|
{
|
|
if (pWork.GetDoWhat() == (int)CECHPWorkConcentrate.eDO_PET.DO_SUMMONPET)
|
|
return 1;
|
|
else if (pWork.GetDoWhat() == (int)CECHPWorkConcentrate.eDO_PET.DO_RECALLPET)
|
|
return 2;
|
|
else if (pWork.GetDoWhat() == (int)CECHPWorkConcentrate.eDO_PET.DO_BANISHPET)
|
|
return 3;
|
|
else if (pWork.GetDoWhat() == (int)CECHPWorkConcentrate.eDO_PET.DO_RESTOREPET)
|
|
return 4;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void OnMsgHstPetOpt(ECMSG Msg)
|
|
{
|
|
|
|
CECGameRun pGameRun = EC_Game.GetGameRun();
|
|
|
|
switch (Msg.dwParam2)
|
|
{
|
|
case CommandID.GAIN_PET:
|
|
{
|
|
cmd_gain_pet pCmd = GPDataTypeHelper.FromBytes<cmd_gain_pet>((byte[])Msg.dwParam1);
|
|
m_pPetCorral.AddPet(pCmd.slot_index, pCmd.data);
|
|
|
|
// Print a notify
|
|
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.slot_index);
|
|
if (pPet != null)
|
|
{
|
|
if (pPet.IsFollowPet() || pPet.IsCombatPet() || pPet.IsEvolutionPet())
|
|
{
|
|
// TO DO: fix later
|
|
//pGameRun.AddFixedMessage(FIXMSG_PET_HATCH, pPet.GetName());
|
|
}
|
|
else if (pPet.IsSummonPet())
|
|
{
|
|
// TO DO: fix later
|
|
//pGameRun.AddFixedMessage(FIXMSG_SUMMON_PET_APPEAR, pPet.GetName());
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case CommandID.FREE_PET:
|
|
{
|
|
cmd_free_pet pCmd = GPDataTypeHelper.FromBytes<cmd_free_pet>((byte[])Msg.dwParam1);
|
|
|
|
// Print a notify
|
|
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.slot_index);
|
|
if (pPet != null)
|
|
{
|
|
if (pPet.IsFollowPet() || pPet.IsCombatPet() || pPet.IsEvolutionPet())
|
|
{
|
|
// TO DO: fix later
|
|
//pGameRun.AddFixedMessage(FIXMSG_PET_FREE, pPet.GetName());
|
|
}
|
|
else if (pPet.IsSummonPet())
|
|
{
|
|
// TO DO: fix later
|
|
//pGameRun.AddFixedMessage(FIXMSG_SUMMON_PET_DISAPPEAR, pPet.GetName());
|
|
}
|
|
}
|
|
|
|
// Remove pet from corral
|
|
m_pPetCorral.FreePet(pCmd.slot_index, pCmd.pet_id);
|
|
// Update pet shortcuts
|
|
UpdateFreedPetSC(pCmd.slot_index);
|
|
|
|
break;
|
|
}
|
|
case CommandID.SUMMON_PET:
|
|
{
|
|
cmd_summon_pet pCmd = GPDataTypeHelper.FromBytes<cmd_summon_pet>((byte[])Msg.dwParam1);
|
|
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.slot_index);
|
|
//ASSERT(pPet && pPet.GetTemplateID() == pCmd.pet_tid);
|
|
m_pPetCorral.SetActivePetIndex(pCmd.slot_index);
|
|
m_pPetCorral.SetActivePetNPCID(pCmd.pet_pid);
|
|
m_pPetCorral.SetActivePetLifetime(pCmd.life_time);
|
|
|
|
if (EC_Game.GetConfigs().GetGameSettings().bPetAutoSkill)
|
|
{
|
|
for (int i = 0; i < pPet.GetSkillNum(SKILLTYPE.EM_SKILL_DEFAULT); i++)
|
|
{
|
|
PETSKILL? pSkill = pPet.GetSkill(SKILLTYPE.EM_SKILL_DEFAULT, i);
|
|
if (pSkill != null && EC_Game.IsPetAutoSkill(pSkill.Value.idSkill))
|
|
pPet.AddAutoSkill(pSkill.Value.idSkill);
|
|
}
|
|
}
|
|
|
|
// TO DO: fix later
|
|
//OnPetSays(pCmd.pet_tid, pCmd.pet_pid, CECPetWords::TW_SUMMON);
|
|
//if (pPet.IsCombatPet() || pPet.IsSummonPet() || pPet.IsEvolutionPet())
|
|
// CDlgQuickBarPet::ResetAutoCastSkill();
|
|
break;
|
|
}
|
|
case CommandID.RECALL_PET:
|
|
{
|
|
cmd_recall_pet pCmd = GPDataTypeHelper.FromBytes<cmd_recall_pet>((byte[])Msg.dwParam1);
|
|
//ASSERT(pCmd.slot_index == m_pPetCorral.GetActivePetIndex());
|
|
|
|
int tid = pCmd.pet_id;
|
|
int nid = m_pPetCorral.GetActivePetNPCID();
|
|
|
|
// ³èÎïÓл°Ëµ
|
|
switch (pCmd.reason)
|
|
{
|
|
case (char)PET_RECALL_REASON.PET_RECALL_DEFAULT:
|
|
//OnPetSays(tid, nid, CECPetWords::TW_RECALL);
|
|
break;
|
|
|
|
case (char)PET_RECALL_REASON.PET_RECALL_DEATH:
|
|
//OnPetSays(tid, nid, CECPetWords::TW_DEAD);
|
|
break;
|
|
|
|
case (char)PET_RECALL_REASON.PET_RECALL_LIFE_EXHAUST:
|
|
//OnPetSays(tid, nid, CECPetWords::TW_DISAPPEAR);
|
|
break;
|
|
|
|
case (char)PET_RECALL_REASON.PET_RECALL_SACRIFICE:
|
|
//OnPetSays(tid, nid, CECPetWords::TW_SACRIFICE);
|
|
break;
|
|
}
|
|
|
|
CECPetData pPet = m_pPetCorral.GetActivePet();
|
|
if (pPet != null)
|
|
pPet.OnPetDead();
|
|
|
|
m_pPetCorral.SetActivePetIndex(-1);
|
|
m_pPetCorral.SetActivePetNPCID(0);
|
|
m_bPetInSanctuary = false;
|
|
break;
|
|
}
|
|
case CommandID.PLAYER_START_PET_OP:
|
|
{
|
|
cmd_player_start_pet_op pCmd = GPDataTypeHelper.FromBytes<cmd_player_start_pet_op>((byte[])Msg.dwParam1);
|
|
int iDoWhat;
|
|
if (pCmd.op == 0)
|
|
iDoWhat = (int)CECHPWorkConcentrate.eDO_PET.DO_SUMMONPET;
|
|
else if (pCmd.op == 1)
|
|
iDoWhat = (int)CECHPWorkConcentrate.eDO_PET.DO_RECALLPET;
|
|
else if (pCmd.op == 2)
|
|
iDoWhat = (int)CECHPWorkConcentrate.eDO_PET.DO_BANISHPET;
|
|
else if (pCmd.op == 3)
|
|
iDoWhat = (int)CECHPWorkConcentrate.eDO_PET.DO_RESTOREPET;
|
|
else
|
|
iDoWhat = (int)CECHPWorkConcentrate.eDO_PET.DO_UNKNOWN;
|
|
|
|
m_PetOptCnt.SetPeriod(pCmd.delay * 50);
|
|
m_PetOptCnt.Reset();
|
|
|
|
CECHPWorkConcentrate pWork = (CECHPWorkConcentrate)m_pWorkMan.CreateWork(CECHPWork.Host_work_ID.WORK_CONCENTRATE);
|
|
pWork.SetDoWhat(iDoWhat);
|
|
m_pWorkMan.StartWork_p1(pWork);
|
|
break;
|
|
}
|
|
case CommandID.PLAYER_STOP_PET_OP:
|
|
{
|
|
if (IsOperatingPet() != 0)
|
|
m_pWorkMan.FinishRunningWork(CECHPWork.Host_work_ID.WORK_CONCENTRATE);
|
|
|
|
break;
|
|
}
|
|
case CommandID.PET_RECEIVE_EXP:
|
|
{
|
|
cmd_pet_receive_exp pCmd = GPDataTypeHelper.FromBytes<cmd_pet_receive_exp>((byte[])Msg.dwParam1);
|
|
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.slot_index);
|
|
if (pPet != null)
|
|
{
|
|
//ASSERT(pPet.GetTemplateID() == pCmd.pet_id);
|
|
pPet.AddExp(pCmd.exp);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case CommandID.PET_LEVELUP:
|
|
{
|
|
cmd_pet_levelup pCmd = GPDataTypeHelper.FromBytes<cmd_pet_levelup>((byte[])Msg.dwParam1);
|
|
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.slot_index);
|
|
if (pPet != null)
|
|
{
|
|
//ASSERT(pPet.GetTemplateID() == pCmd.pet_id);
|
|
pPet.LevelUp(pCmd.level, pCmd.exp);
|
|
}
|
|
|
|
//pGameRun.AddFixedMessage(FIXMSG_PET_LEVELUP, pCmd.level);
|
|
break;
|
|
}
|
|
case CommandID.PET_ROOM:
|
|
{
|
|
cmd_pet_room pCmd = GPDataTypeHelper.FromBytes<cmd_pet_room>((byte[])Msg.dwParam1);
|
|
m_pPetCorral.UpdatePets(pCmd, (byte[])Msg.dwParam1);
|
|
|
|
CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan();
|
|
|
|
//if (pGameUI.GetDialog("Win_Teach").IsShow())
|
|
// {
|
|
// //pGameUI.UpdateTeach();
|
|
// }
|
|
|
|
break;
|
|
}
|
|
case CommandID.PET_ROOM_CAPACITY:
|
|
{
|
|
cmd_pet_room_capacity pCmd = GPDataTypeHelper.FromBytes<cmd_pet_room_capacity>((byte[])Msg.dwParam1);
|
|
m_pPetCorral.MagnifyPetSlots((int)pCmd.capacity);
|
|
|
|
if (m_pPetCorral.HasInit())
|
|
{
|
|
//pGameRun.AddFixedMessage(FIXMSG_PET_ROOM_SIZE, pCmd.capacity);
|
|
}
|
|
else
|
|
m_pPetCorral.SetHasInit(true);
|
|
break;
|
|
}
|
|
case CommandID.PET_HONOR_POINT:
|
|
{
|
|
cmd_pet_honor_point pCmd = GPDataTypeHelper.FromBytes<cmd_pet_honor_point>((byte[])Msg.dwParam1);
|
|
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.index);
|
|
if (pPet != null)
|
|
pPet.SetIntimacy(pCmd.cur_honor_point);
|
|
|
|
break;
|
|
}
|
|
case CommandID.PET_HUNGER_GAUGE:
|
|
{
|
|
cmd_pet_hunger_gauge pCmd = GPDataTypeHelper.FromBytes<cmd_pet_hunger_gauge>((byte[])Msg.dwParam1);
|
|
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.index);
|
|
if (pPet != null)
|
|
pPet.SetHunger(pCmd.cur_hunge_gauge);
|
|
|
|
break;
|
|
}
|
|
case CommandID.PET_DEAD:
|
|
{
|
|
cmd_pet_dead pCmd = GPDataTypeHelper.FromBytes<cmd_pet_dead>((byte[])Msg.dwParam1);
|
|
CECPetData pPet = m_pPetCorral.GetPetData((int)pCmd.pet_index);
|
|
if (pPet != null)
|
|
{
|
|
pPet.SetHPFactor(0.0f);
|
|
pPet.SetHP(0);
|
|
pPet.OnPetDead();
|
|
}
|
|
|
|
//pGameRun.AddFixedMessage(FIXMSG_PET_DEAD);
|
|
break;
|
|
}
|
|
case CommandID.PET_REVIVE:
|
|
{
|
|
cmd_pet_revive pCmd = GPDataTypeHelper.FromBytes<cmd_pet_revive>((byte[])Msg.dwParam1);
|
|
CECPetData pPet = m_pPetCorral.GetPetData((int)pCmd.pet_index);
|
|
if (pPet != null)
|
|
pPet.SetHPFactor(pCmd.hp_factor);
|
|
|
|
break;
|
|
}
|
|
case CommandID.PET_HP_NOTIFY:
|
|
{
|
|
cmd_pet_hp_notify pCmd = GPDataTypeHelper.FromBytes<cmd_pet_hp_notify>((byte[])Msg.dwParam1);
|
|
CECPetData pPet = m_pPetCorral.GetPetData((int)pCmd.pet_index);
|
|
if (pPet != null)
|
|
{
|
|
int lastHP = pPet.GetHP();
|
|
|
|
pPet.SetHPFactor(pCmd.hp_factor);
|
|
pPet.SetHP(pCmd.cur_hp);
|
|
|
|
pPet.SetMPFactor(pCmd.mp_factor);
|
|
pPet.SetMP(pCmd.cur_mp);
|
|
|
|
// If HP is too low, popup a warning on pet's head
|
|
int iLimit = (int)(pPet.CalcMaxHP() * 0.3f);
|
|
if (pCmd.cur_hp < lastHP && lastHP != 0 && pCmd.cur_hp < iLimit)
|
|
{
|
|
CECNPC pNPC = EC_Game.GetGameRun().GetWorld().GetNPCMan().GetNPC(m_pPetCorral.GetActivePetNPCID());
|
|
if (pNPC && pNPC.GetMasterID() == GetCharacterID())
|
|
{
|
|
//pNPC.BubbleText(CECNPC::BUBBLE_HPWARN, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case CommandID.PET_AI_STATE:
|
|
{
|
|
cmd_pet_ai_state pCmd = GPDataTypeHelper.FromBytes<cmd_pet_ai_state>((byte[])Msg.dwParam1);
|
|
|
|
// ³èÎïÓл°Ëµ
|
|
CECPetData pPetData = m_pPetCorral.GetActivePet();
|
|
if (pPetData != null)
|
|
{
|
|
int tid = pPetData.GetTemplateID();
|
|
int nid = m_pPetCorral.GetActivePetNPCID();
|
|
if (m_pPetCorral.GetMoveMode() != pCmd.move)
|
|
{
|
|
switch (pCmd.move)
|
|
{
|
|
case (byte)CECPetCorral.ePet_MovingMode.MOVE_FOLLOW:
|
|
{
|
|
//OnPetSays(tid, nid, CECPetWords::TW_FOLLOW);
|
|
break;
|
|
}
|
|
case (byte)CECPetCorral.ePet_MovingMode.MOVE_STAND:
|
|
{
|
|
//OnPetSays(tid, nid, CECPetWords::TW_STOP);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (m_pPetCorral.GetAttackMode() != pCmd.attack)
|
|
{
|
|
switch (pCmd.attack)
|
|
{
|
|
case (byte)CECPetCorral.ePet_AttackingMode.ATK_DEFENSE:
|
|
//OnPetSays(tid, nid, CECPetWords::TW_DEFENSIVE);
|
|
break;
|
|
|
|
case (byte)CECPetCorral.ePet_AttackingMode.ATK_POSITIVE:
|
|
//OnPetSays(tid, nid, CECPetWords::TW_OFFENSIVE);
|
|
break;
|
|
|
|
case (byte)CECPetCorral.ePet_AttackingMode.ATK_PASSIVE:
|
|
//OnPetSays(tid, nid, CECPetWords::TW_PASSIVE);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
m_pPetCorral.SetMoveMode(pCmd.move);
|
|
m_pPetCorral.SetAttackMode(pCmd.attack);
|
|
break;
|
|
}
|
|
case CommandID.PET_SET_COOLDOWN:
|
|
{
|
|
cmd_pet_set_cooldown pCmd = GPDataTypeHelper.FromBytes<cmd_pet_set_cooldown>((byte[])Msg.dwParam1);
|
|
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.pet_index);
|
|
if (pPet != null)
|
|
pPet.SetSkillCoolTime(pCmd.cooldown_index, pCmd.cooldown_time);
|
|
|
|
break;
|
|
}
|
|
|
|
case CommandID.SUMMON_PLANT_PET:
|
|
{
|
|
int size = Marshal.SizeOf<cmd_summon_plant_pet>();
|
|
if (((byte[])Msg.dwParam1).Length >= size)
|
|
{
|
|
cmd_summon_plant_pet pCmd = GPDataTypeHelper.FromBytes<cmd_summon_plant_pet>((byte[])Msg.dwParam1);
|
|
m_pPetCorral.PlantPetEnter(pCmd);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case CommandID.PLANT_PET_DISAPPEAR:
|
|
{
|
|
int size = Marshal.SizeOf<cmd_plant_pet_disapper>();
|
|
if (((byte[])Msg.dwParam1).Length >= size)
|
|
{
|
|
cmd_plant_pet_disapper pCmd = GPDataTypeHelper.FromBytes<cmd_plant_pet_disapper>((byte[])Msg.dwParam1);
|
|
m_pPetCorral.PlantPetDisappear(pCmd);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case CommandID.PLANT_PET_HP_NOTIFY:
|
|
{
|
|
int size = Marshal.SizeOf<cmd_plant_pet_hp_notify>();
|
|
if (((byte[])Msg.dwParam1).Length >= size)
|
|
{
|
|
cmd_plant_pet_hp_notify pCmd = GPDataTypeHelper.FromBytes<cmd_plant_pet_hp_notify>((byte[])Msg.dwParam1);
|
|
m_pPetCorral.PlantPetInfo(pCmd);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case CommandID.PET_PROPERTY:
|
|
{
|
|
cmd_pet_property pCmd = GPDataTypeHelper.FromBytes<cmd_pet_property>((byte[])Msg.dwParam1);
|
|
CECPetData pPet = m_pPetCorral.GetPetData(pCmd.pet_index);
|
|
if (pPet != null)
|
|
{
|
|
pPet.SetExtendProps(pCmd.prop);
|
|
}
|
|
break;
|
|
}
|
|
case CommandID.PET_REBUILD_INHERIT_START:
|
|
case CommandID.PET_REBUILD_INHERIT_INFO:
|
|
case CommandID.PET_REBUILD_INHERIT_END:
|
|
case CommandID.PET_EVOLUTION_DONE:
|
|
case CommandID.PET_REBUILD_NATURE_START:
|
|
case CommandID.PET_REBUILD_NATURE_INFO:
|
|
case CommandID.PET_REBUILD_NATURE_END:
|
|
{
|
|
CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan();
|
|
if (pGameUI != null)
|
|
{
|
|
//((CDlgPreviewPetRebuild*)pGameUI.GetDialog("Win_PreviewPet")).OnServerNotify(Msg.dwParam2, (void*)Msg.dwParam1);
|
|
}
|
|
break;
|
|
}
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|