|  |  | @ -18,7 +18,6 @@ import engine.exception.MsgSendException; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.job.JobContainer; |  |  |  | import engine.job.JobContainer; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.job.JobScheduler; |  |  |  | import engine.job.JobScheduler; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.jobs.ChangeAltitudeJob; |  |  |  | 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; | 
			
		
	
	
		
		
			
				
					|  |  | @ -339,61 +338,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) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			PlayerCharacter.GroundPlayer(pc); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 			// 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 +475,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,17 +507,11 @@ 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)){ | 
			
		
	
	
		
		
			
				
					|  |  | @ -609,6 +522,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 +533,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 +548,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);
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |