bool MonsterAI::RandomRun() { CMonster *monster = static_cast<CMonster*>(GetOwner()); if (monster == NULL) { LogError(AI_MODULE, "MosterAI has no owner object..."); } assert(monster); if(random(10000) < monster->GetMoveRandomValue()) { long dir = 0; long curX = monster->GetTileX(); long curY = monster->GetTileY(); long dis = monster->Distance(curX, curY, m_BornPos.x, m_BornPos.y); if(dis > monster->GetPeaceMoveRange()) { dir = GetLineDir(curX, curY, m_BornPos.x, m_BornPos.y); long gdir = (8 - dir) % 8; if(gdir >= 2 || gdir <= 6) { dir = (dir + random(3) - 1 + 8) % 8; } } else { dir = random(8); } long maxRunTimes = monster->GetMaxRunTimes(); long minRunTimes = monster->GetMinRunTimes(); AI_EVENT_SENDER(this).MoveByStep(dir, random(maxRunTimes - minRunTimes) + minRunTimes); // drive the ai Resume(0); } else { Stand(monster->GetStopFrame()); } return true; }
//1表示增益 //2表示减益 BOOL CPKSys::JudgeAttackRelation(CMoveShape *pAttacker,CMoveShape *pBeenAttacker,int nAddSub) { if (pBeenAttacker->IsGod()) { //((CPlayer*)pAttacker)->SendNotifyMessage(AppFrame::GetText("STR_WS_SKILL_FIFTEENTH"),0xffff0000,0,eNOTIFYPOS_CENTER); return FALSE; } if (!IsAttackAble(pAttacker,pBeenAttacker)) { return FALSE; } CServerRegion* pRegion = dynamic_cast<CServerRegion*>( pAttacker->GetFather() ); if( !pRegion ) return FALSE; //PVP if (pAttacker->GetType()==TYPE_PLAYER && pBeenAttacker->GetType()==TYPE_PLAYER && nAddSub==2) { CPlayer* pPlayerAttacker = dynamic_cast<CPlayer*>( pAttacker ); CPlayer* pPlayerBeenAttacker = dynamic_cast<CPlayer*>( pBeenAttacker ); // 如果在nopk场景,玩家不能PK的 if(0 == pRegion->IsNoPk()) return FALSE; CRegion::eSecurity eBSecurityType = pRegion->GetSecurity(pPlayerBeenAttacker->GetTileX(),pPlayerBeenAttacker->GetTileY()); CRegion::eSecurity eSecurityType = pRegion->GetSecurity(pPlayerAttacker->GetTileX(),pPlayerAttacker->GetTileY()); if (eSecurityType == CRegion::SECURTIY_SAFE || eBSecurityType == CRegion::SECURTIY_SAFE) { return FALSE; } //组队 if (pPlayerAttacker->IsPk_Team()) { if (pPlayerAttacker->GetTeamID()!=NULL_GUID && pPlayerAttacker->GetTeamID()==pPlayerBeenAttacker->GetTeamID()) { return FALSE; } } //帮会 if (pPlayerAttacker->IsPk_Union()) { if (pPlayerAttacker->GetFactionID()!=NULL_GUID && pPlayerAttacker->GetFactionID()==pPlayerBeenAttacker->GetFactionID()) { return FALSE; } } //本国 if (pPlayerAttacker->IsPk_Country()) { // [9/7/2009 chenxianj] //只保护本国白名玩家 if (pPlayerAttacker->GetCountry()==pPlayerBeenAttacker->GetCountry() && pPlayerBeenAttacker->GetPkValue()==0) { return FALSE; } } //阵营 if (pPlayerAttacker->IsPk_Camp()) { // [9/7/2009 chenxianj] //只保护本阵营白名玩家 if (IsSameCamp(pPlayerAttacker,pPlayerBeenAttacker) && pPlayerBeenAttacker->GetPkValue()==0) { return FALSE; } } //全体 if (pPlayerAttacker->IsPk_Normal()) { if(!IsSameCamp(pPlayerAttacker,pPlayerBeenAttacker) && pPlayerBeenAttacker->GetPkValue()==0 && pPlayerBeenAttacker->GetPVPValue()==0) { return FALSE; } } //红名 if (pPlayerAttacker->IsPk_Badman()) { if (pPlayerBeenAttacker->GetPkValue()>0) { return FALSE; } } //海盗 if ( pPlayerAttacker->IsPk_Pirate()) { if (pPlayerBeenAttacker->GetPVPValue()>0) { return FALSE; } } } //PVM if (pAttacker->GetType()==TYPE_PLAYER && pBeenAttacker->GetType()==TYPE_MONSTER) { CPlayer* pPlayerAttacker = dynamic_cast<CPlayer*>( pAttacker ); CMonster* pPlayerBeenAttacker = dynamic_cast<CMonster*>( pBeenAttacker ); CRegion::eSecurity SecurityType = pRegion->GetSecurity(pPlayerBeenAttacker->GetTileX(),pPlayerBeenAttacker->GetTileY()); if (SecurityType == CRegion::SECURTIY_SAFE && nAddSub==1) { //人对怪在安全区不能使用增益技能 return FALSE; } if (((CMonster*)pBeenAttacker)->GetNpcType()==NT_Guard) { //国家 if (pPlayerAttacker->IsPk_Country()) { if (pAttacker->GetCountry()==pBeenAttacker->GetCountry()) { return FALSE; } } //阵营 if (pPlayerAttacker->IsPk_Camp()) { if (IsSameCamp(pPlayerAttacker,pPlayerBeenAttacker)) { return FALSE; } } //全体 if (pPlayerAttacker->IsPk_Normal()) { return FALSE; } } } //MVP if (pAttacker->GetType()==TYPE_MONSTER && pBeenAttacker->GetType()==TYPE_PLAYER) { CMonster* pPlayerAttacker = dynamic_cast<CMonster*>( pAttacker ); CPlayer* pPlayerBeenAttacker = dynamic_cast<CPlayer*>( pBeenAttacker ); CRegion::eSecurity SecurityType = pRegion->GetSecurity(pPlayerBeenAttacker->GetTileX(),pPlayerBeenAttacker->GetTileY()); if (SecurityType == CRegion::SECURTIY_SAFE && nAddSub==1) { //怪对人在安全区不能使用增益技能 return FALSE; } } return TRUE; }