@ -15,16 +15,11 @@ import engine.Enum.SourceType; 
			
		
	
		
		
			
				
					
					import  engine.InterestManagement.InterestManager ; import  engine.InterestManagement.InterestManager ;  
			
		
	
		
		
			
				
					
					import  engine.InterestManagement.WorldGrid ; import  engine.InterestManagement.WorldGrid ;  
			
		
	
		
		
			
				
					
					import  engine.exception.MsgSendException ; import  engine.exception.MsgSendException ;  
			
		
	
		
		
			
				
					
					import  engine.job.JobContainer ;  
			
		
	
		
		
			
				
					
					import  engine.job.JobScheduler ;  
			
		
	
		
		
			
				
					
					import  engine.jobs.ChangeAltitudeJob ;  
			
		
	
		
		
			
				
					
					import  engine.jobs.FlightJob ;  
			
		
	
		
		
			
				
					
					import  engine.math.Bounds ; import  engine.math.Bounds ;  
			
		
	
		
		
			
				
					
					import  engine.math.Vector3f ; import  engine.math.Vector3f ;  
			
		
	
		
		
			
				
					
					import  engine.math.Vector3fImmutable ; import  engine.math.Vector3fImmutable ;  
			
		
	
		
		
			
				
					
					import  engine.net.DispatchMessage ; import  engine.net.DispatchMessage ;  
			
		
	
		
		
			
				
					
					import  engine.net.client.ClientConnection ; import  engine.net.client.ClientConnection ;  
			
		
	
		
		
			
				
					
					import  engine.net.client.msg.ChangeAltitudeMsg ;  
			
		
	
		
		
			
				
					
					import  engine.net.client.msg.MoveToPointMsg ; import  engine.net.client.msg.MoveToPointMsg ;  
			
		
	
		
		
			
				
					
					import  engine.net.client.msg.TeleportToPointMsg ; import  engine.net.client.msg.TeleportToPointMsg ;  
			
		
	
		
		
			
				
					
					import  engine.net.client.msg.UpdateStateMsg ; import  engine.net.client.msg.UpdateStateMsg ;  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -339,61 +334,7 @@ public enum MovementManager { 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						}  	}   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						//Update for when the character is in flight
   
			
		
	
		
		
			
				
					
						public  static  void  updateFlight ( PlayerCharacter  pc ,  ChangeAltitudeMsg  msg ,  int  duration )  {   
			
		
	
		
		
			
				
					
							if  ( pc  = =  null )   
			
		
	
		
		
			
				
					
								return ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							// clear flight timer job as we are about to update stuff and submit a new job
   
			
		
	
		
		
			
				
					
							pc . clearTimer ( flightTimerJobName ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							if  ( ! pc . isActive ( ) )  {   
			
		
	
		
		
			
				
					
								pc . setAltitude ( 0 ) ;   
			
		
	
		
		
			
				
					
								pc . setDesiredAltitude ( 0 ) ;   
			
		
	
		
		
			
				
					
								pc . setTakeOffTime ( 0 ) ;   
			
		
	
		
		
			
				
					
								return ;   
			
		
	
		
		
			
				
					
							}   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							// Check to see if we are mid height change
   
			
		
	
		
		
			
				
					
							JobContainer  cjc  =  pc . getTimers ( ) . get ( changeAltitudeTimerJobName ) ;   
			
		
	
		
		
			
				
					
							if  ( cjc  ! =  null )  {   
			
		
	
		
		
			
				
					
								addFlightTimer ( pc ,  msg ,  MBServerStatics . FLY_FREQUENCY_MS ) ;   
			
		
	
		
		
			
				
					
								return ;   
			
		
	
		
		
			
				
					
							}   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							// Altitude is zero, do nothing
   
			
		
	
		
		
			
				
					
							if  ( pc . getAltitude ( )  <  1 )   
			
		
	
		
		
			
				
					
								return ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							//make sure player is still allowed to fly
   
			
		
	
		
		
			
				
					
							boolean  canFly  =  false ;   
			
		
	
		
		
			
				
					
							PlayerBonuses  bonus  =  pc . getBonuses ( ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							if  ( bonus  ! =  null  & &  ! bonus . getBool ( ModType . NoMod ,  SourceType . Fly )  & &  bonus . getBool ( ModType . Fly ,  SourceType . None )  & &  pc . isAlive ( ) )   
			
		
	
		
		
			
				
					
								canFly  =  true ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							// if stam less that 2 - time to force a landing
   
			
		
	
		
		
			
				
					
							if  ( pc . getStamina ( )  <  10f  | |  ! canFly )  {   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
								// dont call stop movement here as we want to
   
			
		
	
		
		
			
				
					
								// preserve endloc
   
			
		
	
		
		
			
				
					
								//pc.stopMovement();
   
			
		
	
		
		
			
				
					
								// sync world location
   
			
		
	
		
		
			
				
					
								pc . setLoc ( pc . getLoc ( ) ) ;   
			
		
	
		
		
			
				
					
								// force a landing
   
			
		
	
		
		
			
				
					
								msg . setStartAlt ( pc . getAltitude ( ) ) ;   
			
		
	
		
		
			
				
					
								msg . setTargetAlt ( 0 ) ;   
			
		
	
		
		
			
				
					
								msg . setAmountToMove ( pc . getAltitude ( ) ) ;   
			
		
	
		
		
			
				
					
								msg . setUp ( false ) ;   
			
		
	
		
		
			
				
					
								DispatchMessage . dispatchMsgToInterestArea ( pc ,  msg ,  DispatchChannel . PRIMARY ,  MBServerStatics . CHARACTER_LOAD_RANGE ,  true ,  false ) ;   
			
		
	
		
		
			
				
					
								MovementManager . addChangeAltitudeTimer ( pc ,  msg . getStartAlt ( ) ,  msg . getTargetAlt ( ) ,  ( int )  ( MBServerStatics . HEIGHT_CHANGE_TIMER_MS  *  pc . getAltitude ( ) ) ) ;   
			
		
	
		
		
			
				
					
								pc . setAltitude ( msg . getStartAlt ( )  -  10 ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							}  else  //Add a new flight timer to check stam / force land
   
			
		
	
		
		
			
				
					
								if  ( pc . getAltitude ( )  >  0 )   
			
		
	
		
		
			
				
					
									addFlightTimer ( pc ,  msg ,  MBServerStatics . FLY_FREQUENCY_MS ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						}   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						public  static  void  finishChangeAltitude ( AbstractCharacter  ac ,  float  targetAlt )  {  	public  static  void  finishChangeAltitude ( AbstractCharacter  ac ,  float  targetAlt )  {   
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -530,43 +471,17 @@ public enum MovementManager { 
			
		
	
		
		
			
				
					
							}  		}   
			
		
	
		
		
			
				
					
						}  	}   
			
		
	
		
		
			
				
					
						 	  
			
		
	
		
		
			
				
					
						//Getting rid of flgith timer.
   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						public  static  void  addFlightTimer ( PlayerCharacter  pc ,  ChangeAltitudeMsg  msg ,  int  duration )  {   
			
		
	
		
		
			
				
					
							if  ( pc  = =  null  | |  pc . getTimers ( )  = =  null )   
			
		
	
		
		
			
				
					
								return ;   
			
		
	
		
		
			
				
					
							if  ( ! pc . getTimers ( ) . containsKey ( flightTimerJobName ) )  {   
			
		
	
		
		
			
				
					
								FlightJob  ftj  =  new  FlightJob ( pc ,  msg ,  duration ) ;   
			
		
	
		
		
			
				
					
								JobContainer  jc  =  JobScheduler . getInstance ( ) . scheduleJob ( ftj ,  duration ) ;   
			
		
	
		
		
			
				
					
								pc . getTimers ( ) . put ( flightTimerJobName ,  jc ) ;   
			
		
	
		
		
			
				
					
							}   
			
		
	
		
		
			
				
					
						}   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						public  static  void  addChangeAltitudeTimer ( PlayerCharacter  pc ,  float  startAlt ,  float  targetAlt ,  int  duration )  {   
			
		
	
		
		
			
				
					
							if  ( pc  = =  null  | |  pc . getTimers ( )  = =  null )   
			
		
	
		
		
			
				
					
								return ;   
			
		
	
		
		
			
				
					
							ChangeAltitudeJob  catj  =  new  ChangeAltitudeJob ( pc ,  startAlt ,  targetAlt ) ;   
			
		
	
		
		
			
				
					
							JobContainer  jc  =  JobScheduler . getInstance ( ) . scheduleJob ( catj ,  duration ) ;   
			
		
	
		
		
			
				
					
							pc . getTimers ( ) . put ( changeAltitudeTimerJobName ,  jc ) ;   
			
		
	
		
		
			
				
					
						}   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						  
			
		
	
		
		
			
				
					
						public  static  void  translocate ( AbstractCharacter  teleporter ,  Vector3fImmutable  targetLoc ,  Regions  region )  {  	public  static  void  translocate ( AbstractCharacter  teleporter ,  Vector3fImmutable  targetLoc ,  Regions  region )  {   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							if  ( targetLoc  = =  null )  		if  ( targetLoc  = =  null )   
			
		
	
		
		
			
				
					
								return ;  			return ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							Vector3fImmutable  oldLoc  =  new  Vector3fImmutable ( teleporter . getLoc ( ) ) ;  		Vector3fImmutable  oldLoc  =  new  Vector3fImmutable ( teleporter . getLoc ( ) ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							  
			
		
	
		
		
			
				
					
								teleporter . stopMovement ( targetLoc ) ;  			teleporter . stopMovement ( targetLoc ) ;   
			
		
	
		
		
			
				
					
								  
			
		
	
		
		
			
				
					
								teleporter . setRegion ( region ) ;  			teleporter . setRegion ( region ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
								//mobs ignore region sets for now.
  			//mobs ignore region sets for now.
   
			
		
	
		
		
			
				
					
								if  ( teleporter . getObjectType ( ) . equals ( GameObjectType . Mob ) ) {  			if  ( teleporter . getObjectType ( ) . equals ( GameObjectType . Mob ) ) {   
			
		
	
		
		
			
				
					
									teleporter . setInBuildingID ( 0 ) ;  				teleporter . setInBuildingID ( 0 ) ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -588,18 +503,12 @@ public enum MovementManager { 
			
		
	
		
		
			
				
					
						 	  
			
		
	
		
		
			
				
					
						public  static  void  translocateToObject ( AbstractCharacter  teleporter ,  AbstractWorldObject  worldObject )  {  	public  static  void  translocateToObject ( AbstractCharacter  teleporter ,  AbstractWorldObject  worldObject )  {   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							  
			
		
	
		
		
			
				
					
							Vector3fImmutable  targetLoc  =  teleporter . getLoc ( ) ;  		Vector3fImmutable  targetLoc  =  teleporter . getLoc ( ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							Vector3fImmutable  oldLoc  =  new  Vector3fImmutable ( teleporter . getLoc ( ) ) ;  		Vector3fImmutable  oldLoc  =  new  Vector3fImmutable ( teleporter . getLoc ( ) ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							teleporter . stopMovement ( teleporter . getLoc ( ) ) ;  		teleporter . stopMovement ( teleporter . getLoc ( ) ) ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							  
			
		
	
		
		
			
				
					
							  
			
		
	
		
		
			
				
					
						  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
								//mobs ignore region sets for now.
  			//mobs ignore region sets for now.
   
			
		
	
		
		
			
				
					
								if  ( teleporter . getObjectType ( ) . equals ( GameObjectType . Mob ) ) {  			if  ( teleporter . getObjectType ( ) . equals ( GameObjectType . Mob ) ) {   
			
		
	
		
		
			
				
					
									teleporter . setInBuildingID ( 0 ) ;  				teleporter . setInBuildingID ( 0 ) ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -609,6 +518,7 @@ public enum MovementManager { 
			
		
	
		
		
			
				
					
									DispatchMessage . dispatchMsgToInterestArea ( oldLoc ,  teleporter ,  msg ,  DispatchChannel . PRIMARY ,  MBServerStatics . CHARACTER_LOAD_RANGE ,  false ,  false ) ;  				DispatchMessage . dispatchMsgToInterestArea ( oldLoc ,  teleporter ,  msg ,  DispatchChannel . PRIMARY ,  MBServerStatics . CHARACTER_LOAD_RANGE ,  false ,  false ) ;   
			
		
	
		
		
			
				
					
									return ;  				return ;   
			
		
	
		
		
			
				
					
								}  			}   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							boolean  collide  =  false ;  		boolean  collide  =  false ;   
			
		
	
		
		
			
				
					
							int  maxFloor  =  - 1 ;  		int  maxFloor  =  - 1 ;   
			
		
	
		
		
			
				
					
							int  buildingID  =  0 ;  		int  buildingID  =  0 ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -619,6 +529,7 @@ public enum MovementManager { 
			
		
	
		
		
			
				
					
								if  ( collide )  			if  ( collide )   
			
		
	
		
		
			
				
					
									break ;  				break ;   
			
		
	
		
		
			
				
					
							}  		}   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							if  ( ! collide )  {  		if  ( ! collide )  {   
			
		
	
		
		
			
				
					
								teleporter . setInBuildingID ( 0 ) ;  			teleporter . setInBuildingID ( 0 ) ;   
			
		
	
		
		
			
				
					
								teleporter . setInBuilding ( - 1 ) ;  			teleporter . setInBuilding ( - 1 ) ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -633,7 +544,6 @@ public enum MovementManager { 
			
		
	
		
		
			
				
					
								}  			}   
			
		
	
		
		
			
				
					
							}  		}   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
							TeleportToPointMsg  msg  =  new  TeleportToPointMsg ( teleporter ,  targetLoc . getX ( ) ,  targetLoc . getY ( ) ,  targetLoc . getZ ( ) ,  0 ,  - 1 ,  - 1 ) ;  		TeleportToPointMsg  msg  =  new  TeleportToPointMsg ( teleporter ,  targetLoc . getX ( ) ,  targetLoc . getY ( ) ,  targetLoc . getZ ( ) ,  0 ,  - 1 ,  - 1 ) ;   
			
		
	
		
		
			
				
					
							//we shouldnt need to send teleport message to new area, as loadjob should pick it up.
  		//we shouldnt need to send teleport message to new area, as loadjob should pick it up.
   
			
		
	
		
		
			
				
					
						//	DispatchMessage.dispatchMsgToInterestArea(teleporter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
  	//	DispatchMessage.dispatchMsgToInterestArea(teleporter, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);