// called when a enemy is on sight bool CMonster::OnEnemyOnSight( CPlayer* Enemy ) { clock_t etime = clock() - lastSighCheck; if(etime<5000) return true; if(!IsOnBattle( )) { if(thisnpc->aggresive>1) { UINT aggro = GServer->RandNumber(2,15); if(thisnpc->aggresive>=aggro && !IsGhostSeed( )) { //osprose. /* Enemy->ClearObject( this->clientid ); SpawnMonster(Enemy, this ); */ StartAction( (CCharacter*) Enemy, NORMAL_ATTACK, 0 ); } else if(IsGhostSeed( ) || thisnpc->aggresive>5) MoveTo( Enemy->Position->current, true ); } lastSighCheck = clock(); } return true; }
// called when a monster die [give exp/give extra drop] bool CMonster::OnDie( ) { CMap* map = GServer->MapList.Index[Position->Map]; if(map->ghost!=0) { if((map->IsNight( ) || map->ghost==2) && !IsGhost( ) && !IsGhostSeed( ) && !IsSummon( )) { UINT gs = GServer->RandNumber( 0, 100 ); if(gs<30) // 30% / 70% { // spawn a ghost seed [for now will be 701 [level 1 ghost seed] ] map->AddMonster( 701, Position->current, 0, NULL, NULL, Position->respawn, true ); } } } //LMA begin //CF mode 1 //20070621-211100 UINT special_exp=0; UINT special_lvl=0; if (map->is_cf==1) { //what monster is dead? if(this->montype==map->id_def_mon) { //oh my god, they killed a j&b !! (or the monster with exp) special_exp=(UINT) map->mon_lvl; special_lvl= (UINT) map->mon_exp; } else { if (this->montype!=map->id_temp_mon) { UINT gs = GServer->RandNumber( 0, 100 ); if(gs<map->percent) { //we use the temporary monster as a decoy. fPoint position_cf = GServer->RandInCircle( Position->current, 50 ); CMonster* monster2 = map->AddMonster( map->id_temp_mon, position_cf, 0, NULL, NULL, 0, true ); } } } } GServer->GiveExp( this , special_lvl, special_exp ); //LMA End return true; }