static int IsValidOper( CShopManager *pShopMgr, CMessage *pMsg, const CGUID &npcID, long lShopID ) { CPlayer *pPlayer = pMsg->GetPlayer(); CServerRegion *pRegion = pMsg->GetRegion(); if( pPlayer == NULL || pRegion == NULL ) { return -2; } if( pPlayer->IsDied() ) { return -1; } if( pPlayer->GetCurrentProgress() != CPlayer::PROGRESS_FBUSINESS ) { PutoutLog( LOG_FILE, LT_WARNING, "The Player [%s] is not in PROGRESS_FBUSINESS state.", pPlayer->GetName() ); return -1; } SetPlayerState( pPlayer, true ); CMonster *pNPC = (CMonster*) pRegion->FindAroundObject( pPlayer, TYPE_MONSTER, npcID ); if( pNPC == NULL ) { return -1; } CShop *pShop = pShopMgr->GetShop( lShopID ); if( pShop == NULL ) { return -1; } // NPC是否与商店对应 if( strcmp( pNPC->GetOriginName(), pShop->GetNpcOrigName() ) != 0 ) { return -1; } if( pNPC->Distance( pPlayer ) > 10 ) { return -1; } return 0; }
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; }