📄 npc.cpp
字号:
CSyndicate * pSyn = SynManager()->QuerySyndicate(this->GetSynID());
if(pSyn)
{
const int nRepute = 500000;
pSyn->QueryModify()->AddData(SYNDATA_REPUTE, nRepute, true); //
}
SetData(SYNWARLETTER_OCCUPYTIME,(int)tCur,true);
}
}
}
//---jinggy---进行帮派每占领一周,军团声望增加50万的处理---end
if(IsSynFlag())
{
if(m_tSynEvent.ToNextTime(FIXSYNFLAG_SECS))
{
// recruit life
RecruitLife();
}
if(m_tBroadcastScore.ToNextTime(BROADCASTSCORE_SECS))
{
if(GetMap()->IsWarTime())
BroadcastScore();
// set war flag
CheckFightTime();
}
}
if(IsDynaNpc() && GetType() == _SYNTRANS_NPC)
{
time_t tCurr = time(NULL);
tm* pTm = localtime(&tCurr);
if(m_bFeeOK)
{
if(pTm->tm_hour != 00)
m_bFeeOK = false;
}
else
{
if(pTm->tm_hour == 00)
{
m_bFeeOK = true;
OBJID idSyn = GetSynID();
if(idSyn != ID_NONE)
{
CSyndicate* pSyn = SynManager()->QuerySyndicate(idSyn);
IF_OK(pSyn)
pSyn->QueryModify()->AddData(SYNDATA_MONEY, -1*TRANSNPC_FEE, true); // mast true
}
}
}
}
if(IsTaskNpc())
QueryTask()->OnTimer(tCurr);
else if(IsBetNpc())
QueryBet()->OnTimer();
}
//////////////////////////////////////////////////////////////////////
void CNpc::BroadcastRoomMsg(CNetMsg* pMsg, bool bSendSelf)
{
CRole::BroadcastRoomMsg(pMsg, bSendSelf);
CHECK(GetMap());
GetMap()->BroadcastBlockMsg(QueryMapThing(), pMsg, bSendSelf);
}
//////////////////////////////////////////////////////////////////////
void CNpc::BroadcastRoomMsg(LPCTSTR szMsg, bool bSendSelf)
{
CMsgTalk msg;
if(msg.Create(GetName(), ALLUSERS_NAME, szMsg, NULL, 0xff0000, _TXTATR_SYSTEM))
this->BroadcastRoomMsg(&msg, bSendSelf);
}
//////////////////////////////////////////////////////////////////////
void CNpc::BeKill(IRole* pTarget /*= NULL*/)
{
CHECK(IsDynaNpc());
if(IsDeleted())
return ;
// die action
if(IsDieAction())
{
OBJID idAction = m_pData->GetInt(NPCDATA_LINKID);
CHECK(idAction);
CUser* pUser=NULL;
if(pTarget)
pTarget->QueryObj(OBJ_USER, IPP_OF(pUser));
GameAction()->ProcessAction(idAction, pUser, QueryRole());
}
else
{
this->SetStatus(STATUS_DIE);
ASSERT(DelNpc());
}
}
//////////////////////////////////////////////////////////////////////
bool CNpc::DelNpc() // call this mast !IsDeleted()
{
CHECKF(IsDynaNpc() && !IsDeleted());
if(IsLinkNpc())
{
if(!QueryLinkMap()->EraseMap())
return false;
}
if(IsSceneNpc())
{
QueryScene()->DelTerrainObj();
}
m_pData->SetInt(NPCDATA_LIFE, 0); // set flag to die
// die status
m_tDie.Startup(DYNANPCDIEDELAY_SECS);
// set map syn id
if(IsSynFlag())
{
GetMap()->SetStatus(CGameMap::STATUS_WAR, false);
GetMap()->SetSynID(ID_NONE, true); // set all npc
// temporary code
OBJID idMoreMap = GetData(SYNFLAGNPC_MOREMAPID);
if(idMoreMap != ID_NONE)
{
CGameMap* pMoreMap = MapManager()->QueryMap(idMoreMap);
if(pMoreMap)
pMoreMap->SetSynID(ID_NONE, true); // true: set npc in map
}
}
SendLeaveFromBlock(); //??? show leave map now!
return true;
}
//////////////////////////////////////////////////////////////////////
bool CNpc::BeAttack(bool bMagic, IRole* pTarget, int nPower, bool bReflectEnable/*=true*/)
{
if(IsDynaNpc())
{
if(IsSynNpc())
{
CUser * pUser = NULL;
CHECKF(pTarget && pTarget->QueryObj(OBJ_USER, IPP_OF(pUser)));
CGameMap * pSynMap = this->GetMap();
if(pSynMap->IsSynMap())
{
if( pSynMap->IsWarTime() && pSynMap->GetSynID() != pUser->GetSynID())
{
int nID = GetSynID();
//在攻城战中,玩家每伤害对方建筑100点血,得到1点军团贡献度
pUser->QuerySynAttr()->AddProffer(__max(0,nPower/100));
return true;
}
else
return false;
}
}
return true;
}
return true;
}
//////////////////////////////////////////////////////////////////////
bool CNpc::AddAttrib(int idxAttr, __int64 i64Data, int nSynchro)
{
CHECKF(IsDynaNpc());
CMsgUserAttrib msg;
if(!msg.Create(GetID(), _USERATTRIB_NONE, _USERATTRIB_NONE)) // _USERATTRIB_NONE : 不添加
return false;
if(i64Data)
{
switch(idxAttr)
{
case _USERATTRIB_LIFE:
{
IF_NOT(!( IsAwardScore() && !GetMap()->IsWarTime() && i64Data < 0 ))
return false;
if ((int)this->GetLife() + i64Data <= 0)
{
// this->SetStatus(STATUS_DIE);
m_pData->SetInt(NPCDATA_LIFE, 0);
}
else
m_pData->SetInt(NPCDATA_LIFE, this->GetLife() + i64Data);
if(!msg.Append(_USERATTRIB_LIFE, GetLife()))
return false;
}
break;
case _USERATTRIB_MANA:
// if(!msg.Append(_USERATTRIB_MANA, GetMana()))
return false;
break;
case _USERATTRIB_EXP:
// if(!msg.Append(_USERATTRIB_EXP, GetExp()))
return false;
break;
case _USERATTRIB_MONEY:
// if(!msg.Append(_USERATTRIB_MONEY, GetMoney()))
return false;
break;
default:
return false;
}
}
if(nSynchro != SYNCHRO_FALSE)
{
switch(nSynchro)
{
case SYNCHRO_TRUE:
this->SendMsg(&msg);
break;
case SYNCHRO_BROADCAST:
this->BroadcastRoomMsg(&msg, INCLUDE_SELF);
break;
default:
break;
}
}
return true;
}
/////////////////////////////////////////////////////////////////////////////
void CNpc::SaveInfo()
{
if(m_pData && IsDynaNpc())
m_pData->Update();
}
/////////////////////////////////////////////////////////////////////////////
void CNpc::TransPos(int nPosX, int nPosY)
{
/*
CHECK(IsDynaNpc());
this->SendLeaveFromBlock();
GetMap()->LeaveRoom(QueryMapThing(), WITH_BLOCK);
m_nPosX = nPosX;
m_nPosY = nPosY;
m_pData->SetInt(NPCDATA_POSX, nPosX_);
m_pData->SetInt(NPCDATA_POSY, nPosY_);
if(IsDynaNpc())
SaveInfo();
GetMap()->EnterRoom(QueryMapThing(), WITH_BLOCK);
SendSelfToBlock();
*/
}
/////////////////////////////////////////////////////////////////////////////
void CNpc::SetStatus(int nStatus, bool bSynchro)
{
I64 i64OldEffect = GetEffect();
switch (nStatus)
{
case STATUS_NORMAL:
{
// m_data.m_Info.dwStatus = nStatus;
m_i64Effect = KEEPEFFECT_NORMAL;
}
break;
case STATUS_DIE:
{
// m_data.m_Info.dwStatus = nStatus;
m_i64Effect &= KEEPEFFECT_NOT_CLEAR;
m_i64Effect |= KEEPEFFECT_DIE;
// ClearAllStatus();
}
break;
case STATUS_TEAMLEADER:
{
m_i64Effect |= KEEPEFFECT_TEAMLEADER;
}
break;
case STATUS_CRIME:
{
m_i64Effect |= KEEPEFFECT_CRIME;
}
break;
case STATUS_SYNCRIME:
{
m_i64Effect |= KEEPEFFECT_SYNCRIME;
}
break;
case STATUS_POISON:
{
m_i64Effect |= KEEPEFFECT_POISON;
}
break;
case STATUS_PKVALUE:
{
}
break;
case STATUS_DEFENCE1:
{
m_i64Effect &= ~(KEEPEFFECT_DEFENCE2 | KEEPEFFECT_DEFENCE3);
m_i64Effect |= KEEPEFFECT_DEFENCE1;
}
break;
case STATUS_DEFENCE2:
{
m_i64Effect &= ~(KEEPEFFECT_DEFENCE1 | KEEPEFFECT_DEFENCE3);
m_i64Effect |= KEEPEFFECT_DEFENCE2;
}
break;
case STATUS_DEFENCE3:
{
m_i64Effect &= ~(KEEPEFFECT_DEFENCE1 | KEEPEFFECT_DEFENCE2);
m_i64Effect |= KEEPEFFECT_DEFENCE3;
}
break;
case STATUS_FREEZE:
{
m_i64Effect |= KEEPEFFECT_FREEZE;
}
break;
case STATUS_SMOKE:
{
m_i64Effect |= KEEPEFFECT_SMOKE;
}
break;
case STATUS_DARKNESS:
{
m_i64Effect |= KEEPEFFECT_DARKNESS;
}
break;
case STATUS_PALSY:
{
m_i64Effect |= KEEPEFFECT_PALSY;
}
break;
case STATUS_ATTACK:
{
m_i64Effect |= KEEPEFFECT_ATTACK;
}
break;
case STATUS_MAGICDEFENCE:
{
m_i64Effect |= KEEPEFFECT_MAGICDEFENCE;
}
break;
case STATUS_REFLECT:
{
m_i64Effect |= KEEPEFFECT_REFLECT;
}
break;
case STATUS_REFLECTMAGIC:
{
m_i64Effect |= KEEPEFFECT_REFLECTMAGIC;
}
break;
case STATUS_MAGICDAMAGE:
{
m_i64Effect |= KEEPEFFECT_MAGICDAMAGE;
}
break;
case STATUS_ATKSPEED:
{
m_i64Effect |= KEEPEFFECT_ATKSPEED;
}
break;
case STATUS_LURKER:
{
m_i64Effect |= KEEPEFFECT_LURKER;
}
break;
case STATUS_SLOWDOWN1:
{
m_i64Effect |= KEEPEFFECT_SLOWDOWN1;
}
break;
case STATUS_SLOWDOWN2:
{
m_i64Effect |= KEEPEFFECT_SLOWDOWN2;
}
break;
case STATUS_MAXLIFE:
{
m_i64Effect |= KEEPEFFECT_MAXLIFE;
}
break;
case STATUS_HIDDEN:
{
m_i64Effect |= KEEPEFFECT_HIDDEN;
}
break;
case STATUS_ADD_EXP:
{
m_i64Effect |= KEEPEFFECT_ADD_EXP;
}
break;
// 以下是结界系统相关的状态 ================
case STATUS_TEAMHEALTH:
{
m_i64Effect &= ~KEEPEFFECT_TEAM_ALL;
m_i64Effect |= KEEPEFFECT_TEAM_HEALTH;
}
break;
case STATUS_TEAMATTACK:
{
m_i64Effect &= ~KEEPEFFECT_TEAM_ALL;
m_i64Effect |= KEEPEFFECT_TEAM_ATTACK;
}
break;
case STATUS_TEAMDEFENCE:
{
m_i64Effect &= ~KEEPEFFECT_TEAM_ALL;
m_i64Effect |= KEEPEFFECT_TEAM_DEFENCE;
}
break;
case STATUS_TEAMSPEED:
{
m_i64Effect &= ~KEEPEFFECT_TEAM_ALL;
m_i64Effect |= KEEPEFFECT_TEAM_SPEED;
}
break;
case STATUS_TEAMEXP:
{
m_i64Effect &= ~KEEPEFFECT_TEAM_ALL;
m_i64Effect |= KEEPEFFECT_TEAM_EXP;
}
break;
case STATUS_TEAMSPIRIT:
{
m_i64Effect &= ~KEEPEFFECT_TEAM_ALL;
m_i64Effect |= KEEPEFFECT_TEAM_SPIRIT;
}
break;
case STATUS_TEAMCLEAN:
{
m_i64Effect &= ~KEEPEFFECT_TEAM_ALL;
m_i64Effect |= KEEPEFFECT_TEAM_CLEAN;
}
break;
// 以上是结界系统相关状态 ===============
case STATUS_HEAL:
{
m_i64Effect |= KEEPEFFECT_HEAL;
}
break;
case STATUS_FAINT:
{
m_i64Effect |= KEEPEFFECT_FAINT;
}
break;
case STATUS_TRUCULENCE:
{
m_i64Effect |= KEEPEFFECT_TRUCULENCE;
}
break;
case STATUS_DAMAGE:
{
m_i64Effect |= KEEPEFFECT_DAMAGE;
}
break;
case STATUS_ATKER_DAMAGE:
{
m_i64Effect |= KEEPEFFECT_ATKER_DAMAGE;
}
break;
case STATUS_CONFUSION:
{
m_i64Effect |= KEEPEFFECT_CONFUSION;
}
break;
default:
ASSERT(!"switch status");
}
if(bSynchro && i64OldEffect != GetEffect())
{
CMsgUserAttrib msg;
if (msg.Create(GetID(), _USERATTRIB_KEEPEFFECT, GetEffect()))
{
if (STATUS_MAXLIFE == nStatus)
{
msg.Append(_USERATTRIB_MAXLIFE, this->GetMaxLife());
msg.Append(_USERATTRIB_LIFE, this->GetLife());
}
BroadcastRoomMsg(&msg, INCLUDE_SELF);
}
}
}
/////////////////////////////////////////////////////////////////////////////
void CNpc::ClsStatus(int nStatus, bool bSynchro)
{
I64 i64OldEffect = GetEffect();
switch (nStatus)
{
case STATUS_NORMAL:
{
ASSERT(!"STATUS_NORMAL");
}
break;
case STATUS_DIE:
{
m_i64Effect &= ~KEEPEFFECT_DIE;
}
break;
case STATUS_TEAMLEADER:
{
m_i64Effect &= ~KEEPEFFECT_TEAMLEADER;
}
break;
case STATUS_CRIME:
{
m_i64Effect &= ~KEEPEFFECT_CRIME;
}
break;
case STATUS_SYNCRIME:
{
m_i64Effect &= ~KEEPEFFECT_SYNCRIME;
}
break;
case STATUS_POISON:
{
m_i64Effect &= ~KEEPEFFECT_POISON;
}
break;
case STATUS_PKVALUE:
{
}
break;
case STATUS_DEFENCE1:
{
m_i64Effect &= ~KEEPEFFECT_DEFENCE1;
}
break;
case STATUS_DEFENCE2:
{
m_i64Effect &= ~KEEPEFFECT_DEFENCE2;
}
break;
case STATUS_DEFENCE3:
{
m_i64Effect &= ~KEEPEFFECT_DEFENCE3;
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -