|  |  | @ -1,8 +1,14 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | package engine.gameManager; |  |  |  | package engine.gameManager; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.Enum; |  |  |  | import engine.Enum; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import engine.exception.MsgSendException; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import engine.job.JobContainer; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import engine.job.JobScheduler; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import engine.jobs.AttackJob; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.jobs.DeferredPowerJob; |  |  |  | import engine.jobs.DeferredPowerJob; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.net.DispatchMessage; |  |  |  | import engine.net.DispatchMessage; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import engine.net.client.ClientConnection; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import engine.net.client.msg.AttackCmdMsg; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.net.client.msg.TargetedActionMsg; |  |  |  | import engine.net.client.msg.TargetedActionMsg; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.objects.*; |  |  |  | import engine.objects.*; | 
			
		
	
		
		
			
				
					
					|  |  |  | import engine.powers.DamageShield; |  |  |  | import engine.powers.DamageShield; | 
			
		
	
	
		
		
			
				
					|  |  | @ -64,14 +70,18 @@ public class CombatSystem { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 def = source.defenseRating; |  |  |  |                 def = source.defenseRating; | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if(!LandHit(atr,def)) |  |  |  |             if(!LandHit(atr,def)) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 createTimer(source,mainhand); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if(source.getBonuses() != null) |  |  |  |             if(source.getBonuses() != null) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if(!source.getBonuses().getBool(Enum.ModType.IgnorePassiveDefense, Enum.SourceType.None)) |  |  |  |                 if(!source.getBonuses().getBool(Enum.ModType.IgnorePassiveDefense, Enum.SourceType.None)) | 
			
		
	
		
		
			
				
					
					|  |  |  |                     if(triggerPassive(source,target)) |  |  |  |                     if(triggerPassive(source,target)) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         createTimer(source,mainhand); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         return; |  |  |  |                         return; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     } |  |  |  |                     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         //commence actual combat management
 |  |  |  |         //commence actual combat management
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -305,6 +315,7 @@ public class CombatSystem { | 
			
		
	
		
		
			
				
					
					|  |  |  |         TargetedActionMsg cmm = new TargetedActionMsg(source, swingAnimation, target, passiveType); |  |  |  |         TargetedActionMsg cmm = new TargetedActionMsg(source, swingAnimation, target, passiveType); | 
			
		
	
		
		
			
				
					
					|  |  |  |         DispatchMessage.sendToAllInRange(target, cmm); |  |  |  |         DispatchMessage.sendToAllInRange(target, cmm); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static boolean testPassive(AbstractCharacter source, AbstractCharacter target, String type) { |  |  |  |     private static boolean testPassive(AbstractCharacter source, AbstractCharacter target, String type) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(target.getBonuses() != null) |  |  |  |         if(target.getBonuses() != null) | 
			
		
	
	
		
		
			
				
					|  |  | @ -326,4 +337,94 @@ public class CombatSystem { | 
			
		
	
		
		
			
				
					
					|  |  |  |         return roll < chance; |  |  |  |         return roll < chance; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private static void createTimer(AbstractCharacter source, boolean mainhand) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         ConcurrentHashMap<String, JobContainer> timers = source.getTimers(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         int slot = 1; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if(!mainhand) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             slot = 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         int time = 3000; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if(source.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             PlayerCharacter pc = (PlayerCharacter)source; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if(mainhand){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 time = (int) pc.combatStats.attackSpeedHandOne; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             }else{ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 time = (int) pc.combatStats.attackSpeedHandTwo; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (timers != null) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             AttackJob aj = new AttackJob(source, slot, true); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             JobContainer job; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             job = JobScheduler.getInstance().scheduleJob(aj, (time * 100)); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             timers.put("Attack" + slot, job); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             Logger.error("Unable to find Timers for Character " + source.getObjectUUID()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     public static void setAttackTarget(AttackCmdMsg msg, ClientConnection origin) throws MsgSendException { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         PlayerCharacter player; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         int targetType; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         AbstractWorldObject target; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (TargetedActionMsg.un2cnt == 60 || TargetedActionMsg.un2cnt == 70) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             return; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         player = SessionManager.getPlayerCharacter(origin); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (player == null) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             return; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         //source must match player this account belongs to
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (player.getObjectUUID() != msg.getSourceID() || player.getObjectType().ordinal() != msg.getSourceType()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             Logger.error("Msg Source ID " + msg.getSourceID() + " Does not Match Player ID " + player.getObjectUUID()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             return; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         targetType = msg.getTargetType(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (targetType == Enum.GameObjectType.PlayerCharacter.ordinal()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             target = PlayerCharacter.getFromCache(msg.getTargetID()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } else if (targetType == Enum.GameObjectType.Building.ordinal()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             target = BuildingManager.getBuildingFromCache(msg.getTargetID()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } else if (targetType == Enum.GameObjectType.Mob.ordinal()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             target = Mob.getFromCache(msg.getTargetID()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             player.setCombatTarget(null); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             return; //not valid type to attack
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // quit of the combat target is already the current combat target
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // or there is no combat target
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (target == null) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             return; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         //set sources target
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         player.setCombatTarget(target); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         boolean hasMain = false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         boolean hasOff = false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if(player.getCharItemManager() != null && player.getCharItemManager().getEquipped() != null){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if(player.getCharItemManager().getEquipped(1) != null) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 hasMain = true; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if(player.getCharItemManager().getEquipped(2) != null && !player.getCharItemManager().getEquipped(2).getItemBase().isShield()) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 hasOff = true; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if(hasMain){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             createTimer(player,true); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if(hasOff){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             createTimer(player,false); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |