Files
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

273 lines
6.7 KiB
C++

#include "StdAfx.h"
#include "Pet.h"
CUpdateMask *CPet::s_pPetMask = NULL;
CPet::CPet()
:Inherited()
{
SetAttackLevel(100); //宠物都设置为100
}
//怪物暂时只下发少量的数据
VOID CPet::InitPetBroadcastmask()
{
if (!s_pPetMask)
{
s_pPetMask = new CUpdateMask();
}
s_pPetMask->SetUpdateMaskFlag(PROP_CREATURE_HP);
s_pPetMask->SetUpdateMaskFlag(PROP_CREATURE_MP);
s_pPetMask->SetUpdateMaskFlag(PROP_CREATURE_MOVEONESLOTTIME); //移动速度改变了需要广播的
s_pPetMask->SetUpdateMaskFlag(PROP_CREATURE_ATTACK_SPEED);
s_pPetMask->SetUpdateMaskFlag(PROP_CREATURE_LEVEL); //宠物的等级
s_pPetMask->SetUpdateMaskFlag(PROP_CREATURE_MAXHP);
s_pPetMask->SetUpdateMaskFlag(PROP_CREATURE_MAXMP);
s_pPetMask->SetUpdateMaskFlag(PROP_CREATURE_COLOR); //
s_pPetMask->SetUpdateMaskFlag(PROP_CREATURE_DIZZY_STATUS);
}
void CPet::OnEntityDeath()
{
Inherited::OnEntityDeath();
//int nLoyalty =GetLogicServer()->GetDataProvider()->GetGlobalConfig().nPetDeathDropLoyalty; //宠物死亡的忠诚度的降低
if(m_pMaster && m_nId >0) //是有效的宠物
{
m_pMaster->GetPetSystem().RemovePet(m_nId); //删除宠物
}
}
void CPet::LogicRun(TICKCOUNT nCurrentTime)
{
if (m_3sTimer.CheckAndSet(nCurrentTime, true))
{
m_boAlwaysMoveFlag = false;
}
Inherited::LogicRun(nCurrentTime);
}
void CPet::SetBattleStatus (int nStatus)
{
if(m_nBattleStatus == nStatus ) return; //设置怪物的状态
//if(nStatus == PET_BATTLE_STATUE_STAY )
//{
// m_moveSystem.MoveIdle(); //就在旁边呆着
//}
//else if(nStatus == PET_BATTLE_STATUE_FOLLOW)
//{
// //从站立状态到跟随状态,切换的时候,如果和主人比较远
// if(m_nBattleStatus ==PET_BATTLE_STATUE_STAY )
//// {
//
// }
//}
m_nBattleStatus =nStatus;
if (m_pMaster)
{
m_pMaster->SetProperty<unsigned int>(PROP_ACTOR_PET_STATUS,nStatus);
}
}
void CPet::SetMaster(CActor *pActor)
{
if (!pActor) return;
m_pMaster =pActor;
int nStatus = m_pMaster->GetProperty<unsigned int>(PROP_ACTOR_PET_STATUS);
if ((nStatus != PET_BATTLE_STATUE_FOLLOW) && (nStatus != PET_BATTLE_STATUE_STAY))
{
m_nBattleStatus = PET_BATTLE_STATUE_FOLLOW;
m_pMaster->SetProperty<unsigned int>(PROP_ACTOR_PET_STATUS,m_nBattleStatus);
}
else
{
m_nBattleStatus = nStatus;
}
}
void CPet::ProcessEntityMsg(const CEntityMsg &msg)
{
//switch(msg.nMsg)
//{
// /*
//case CEntityMsg::emGetQuestState:
// if (msg.nSender.GetType() == enActor)
// {
// pSender = GetEntityFromHandle(msg.nSender);
// if (pSender) ((CActor*)pSender)->GetQuestSystem()->SendNpcQuestState(this);
// }
// break;
// */
//default:
// Inherited::ProcessEntityMsg(msg);
// break;
//}
return Inherited::ProcessEntityMsg(msg);
}
//初始化ai
void CPet::InitAi( int nAiId)
{
unsigned int nID = GetProperty<unsigned int>(PROP_ENTITY_ID);
MONSTERCONFIG *pData= GetLogicServer()->GetDataProvider()->GetMonsterConfig().GetMonsterData(nID);
if(pData ==NULL)
{
OutputMsg(rmError,_T("%s,id=%d is Null "),__FUNCTION__,nID);
return;
}
m_moveSystem.SetUseAstar(true); //使用A*
m_pAI = GetGlobalLogicEngine()->GetAiMgr().CreateAi(nAiId,(CAnimal*)this);
m_attriFlag = *(pData->pflags);
//最大的掉血
SetMaxDropHp(pData->nMaxDropHp);
SetAttackInterval(pData->nAttackInterval); //设置攻击间隔
}
void CPet::OnLevelUp(int nUpdateVal)
{
// Inherited::OnLevelUp(nUpdateVal);
// static unsigned int s_nPetMaxLevel = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nPetMaxLevel; //宠物最大的等级
// unsigned int nLevel = GetProperty<unsigned int>(PROP_CREATURE_LEVEL); //等级
// if (nLevel <= s_nPetMaxLevel && nLevel > 0 && nLevel < MAX_PET_LEVEL_COUNT)
// {
// unsigned int nColor = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nPetLevels[nLevel-1];
// if (nColor != m_nColor)
// {
// SetColor(nColor);
// }
// }
}
/*
const CPetSystem::PETDATA * CPet::GetPetPtr()
{
if(m_nId ==0 || m_pMaster ==NULL) return NULL;
return NULL;
return m_pMaster->GetPetSystem().GetPetData(m_nId);
}
*/
void CPet::SetColor(unsigned int color)
{
if(m_nColor == color) return;
if(m_nColor !=0)
{
char buff[128];
CDataPacket data(buff,sizeof(buff));
data << (BYTE)enDefaultEntitySystemID << (BYTE)sUpdateActorNameClr <<(UINT64) GetHandle() << color;
m_observerSystem.BroadCast(data.getMemoryPtr(), data.getPosition());
}
m_nColor = color;
}
//增加经验
void CPet::AddExp(int nChangeExp)
{
// //宠物最大的等级
// static unsigned int s_nPetMaxLevel = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nPetMaxLevel; //宠物最大的等级
// unsigned int nLevel = GetProperty<unsigned int>(PROP_CREATURE_LEVEL); //当前的等
// if( nLevel >= s_nPetMaxLevel ) return; //已经到了最大的等级,那么就不需要升级了
// int nExp =0;
// int nNewExp = m_nExp + nChangeExp; //数值
// CPetProvider &provider = GetLogicServer()->GetDataProvider()->GetPetProvider(); //获得宠物的配置
// if(m_nMaxExp ==0)
// {
// m_nMaxExp=provider.GetMaxExp(nLevel,0); //获取本机升级需要的经验
// }
// // unsigned int nNewLevel =0;
// bool hasChange =false;
// do
// {
// unsigned int nLevel = GetProperty<unsigned int>(PROP_CREATURE_LEVEL); // 当前等级
// if (nLevel < (unsigned int)s_nPetMaxLevel) // 未到最高等级
// {
// //nExp= provider.GetMaxExp(nLevel,0); //升到下一级需要多少经验
// if (m_nMaxExp <= 0)
// break;
// if(nNewExp >= m_nMaxExp)
// {
// nNewExp -= nExp;
// nLevel ++;
// /*
// SetProperty<unsigned int>(PROP_CREATURE_LEVEL,nLevel);
// PPETCONFIG pPet = provider.GetPetData(GetProperty<int>(PROP_ENTITY_ID)); //获取宠物的指针
// if(pPet)
// {
// PPETLEVELCONFIG pLevel = pPet->GetLevelData(nLevel);
// if(pLevel )
// {
// unsigned int nColor = pLevel->color; //新的颜色
// if(nColor != m_nColor) //这里要换一个名字
// {
// SetColor(nColor);//设置颜色
// }
// }
// }
// */
// ((CEntity*)this)->SetLevel(nLevel);
// hasChange =true;
// m_nMaxExp = provider.GetMaxExp(nLevel,0); //设置为下级的经验
// }
// else
// {
// break;
// }
// }
// else // 已经满级
// {
// break;
// }
// } while (nNewExp > nExp);
// /*
// if(hasChange)
// {
// CollectOperate(CEntityOPCollector::coRefAbility); //重新刷能力
// }
// */
// m_nExp = nNewExp;
}
bool CPet::SetLiveTime( int nSecs )
{
if (nSecs == 0)
{
return true;
}
unsigned int nNow = GetGlobalLogicEngine()->getMiniDateTime();
if (m_nLiveTime == 0)
{
m_nLiveTime = nNow + nSecs;
return true;
}
return false;
}
void CPet::OnKilledByEntity( CEntity * pKillerEntity )
{
CAnimalAI * pAi = GetAI();
if(pAi)
{
pAi->KillBy(); //被杀死了
}
}