// update position void CCharacter::UpdatePosition( ) { if(IsOnBattle( ) && Battle->target!=0) { CCharacter* Target = GetCharTarget( ); if(Target!=NULL) { if(IsMonster()) { float distance = GServer->distance( Position->current, Position->source ); if(distance>50)//AI should take care of this { OnFar( ); } //else Position->destiny = Target->Position->current; } //else Position->destiny = Target->Position->current; } else ClearBattle( Battle ); } if(!IsMoving()){ /* if(IsPlayer()) */ Position->lastMoveTime = clock(); return; } float dx = Position->destiny.x - Position->current.x; float dy = Position->destiny.y - Position->current.y; float distance = sqrt( (dx*dx) + (dy*dy) ); float ntime = ( distance / (float(Stats->Move_Speed)/100.f)) * CLOCKS_PER_SEC;// * 100000; clock_t etime = clock() - Position->lastMoveTime; if (ntime<=etime || distance==0) { Position->current.x = Position->destiny.x; Position->current.y = Position->destiny.y; } else { Position->current.x = dx*(etime/ntime) + Position->current.x; Position->current.y = dy*(etime/ntime) + Position->current.y; } Position->lastMoveTime = clock(); }
// update position void CCharacter::UpdatePosition( bool monster_stay_still ) { if(IsOnBattle( ) && Battle->target!=0) { CCharacter* Target = GetCharTarget( ); if(Target!=NULL) { if(IsMonster()) { float distance = GServer->distance( Position->current, Position->source ); if(distance>30) { OnFar( ); } else { if (!monster_stay_still) Position->destiny = Target->Position->current; //MOBS ONLY else Log(MSG_INFO,"This one stays still"); } } else Position->destiny = Target->Position->current; //ONLY IF NO TARGET ON BATTLE } else ClearBattle( Battle ); } //LMA maps: special case (arrive in Game) //and he changed map (GM or scroll or teleporter or boat?) //2do: other cases too, all in fact... bool is_done=false; if (IsPlayer( )&&((last_map==-1&&last_coords==-1)||(last_map!=Position->Map))) { //updating player's grid int new_coords=0; int new_map=0; int grid_id=0; //deleting previous presence... if (last_map!=-1&&last_coords!=-1) { grid_id=GServer->allmaps[last_map].grid_id; if (grid_id!=-1&&!GServer->allmaps[last_map].always_on&&GServer->gridmaps[grid_id].coords[last_coords]>0) GServer->gridmaps[grid_id].coords[last_coords]--; } //New coordinates new_map=Position->Map; grid_id=GServer->allmaps[new_map].grid_id; new_coords=GServer->GetGridNumber(new_map,(UINT) floor(Position->current.x),(UINT) floor(Position->current.y)); last_map=new_map; last_coords=new_coords; if (grid_id!=-1||!GServer->allmaps[new_map].always_on) GServer->gridmaps[grid_id].coords[new_coords]++; is_done=true; } if(!IsMoving()) return; float dx = Position->destiny.x - Position->current.x; float dy = Position->destiny.y - Position->current.y; float distance = sqrt( (dx*dx) + (dy*dy) ); float ntime = ( distance / Stats->Move_Speed * GServer->MOVE_SPEED_MODIF ); clock_t etime = clock() - Position->lastMoveTime; if (ntime<=etime || distance<1.0 ) { // if (IsPlayer()) printf("Arrived! X: %i, Y: %i\n", (int)Position->current.x, (int)Position->current.y); Position->current.x = Position->destiny.x; Position->current.y = Position->destiny.y; } else { Position->current.x += dx*(etime/ntime); Position->current.y += dy*(etime/ntime); } Position->lastMoveTime = clock( ); //LMA: maps (for player) if(!IsPlayer()||is_done) return; //updating player's grid int new_coords=0; int new_map=0; int grid_id=0; new_map=Position->Map; grid_id=GServer->allmaps[new_map].grid_id; new_coords=GServer->GetGridNumber(new_map,(UINT) floor(Position->current.x),(UINT) floor(Position->current.y)); //changed? if (last_map==new_map&&new_coords==last_coords) return; //Let's update. if (grid_id!=-1||!GServer->allmaps[new_map].always_on) GServer->gridmaps[grid_id].coords[new_coords]++; //deleting player from his previous map grid_id=GServer->allmaps[last_map].grid_id; if (grid_id!=-1&&!GServer->allmaps[last_map].always_on&&GServer->gridmaps[grid_id].coords[last_coords]>0) GServer->gridmaps[grid_id].coords[last_coords]--; //Log(MSG_INFO,"Now[%i,%i],Was[%i,%i]",new_map,new_coords,last_map,last_coords); last_map=new_map; last_coords=new_coords; }