forked from MagicBane/Server
				
			
				 2 changed files with 187 additions and 0 deletions
			
			
		| @ -0,0 +1,170 @@ | |||||||
|  | package engine.mobileAI.Behaviours; | ||||||
|  | 
 | ||||||
|  | import engine.Enum; | ||||||
|  | import engine.InterestManagement.WorldGrid; | ||||||
|  | import engine.math.Vector3fImmutable; | ||||||
|  | import engine.mobileAI.utilities.CombatUtilities; | ||||||
|  | import engine.mobileAI.utilities.MovementUtilities; | ||||||
|  | import engine.objects.*; | ||||||
|  | import engine.server.MBServerStatics; | ||||||
|  | import java.util.HashSet; | ||||||
|  | 
 | ||||||
|  | public class StandardMob { | ||||||
|  | 
 | ||||||
|  |     public static void run(Mob mob){ | ||||||
|  |         if(!mob.isAlive()){ | ||||||
|  |             CheckForRespawn(mob); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         mob.updateLocation(); | ||||||
|  | 
 | ||||||
|  |         if(mob.combatTarget == null) { | ||||||
|  |             HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(mob.loc, MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER); | ||||||
|  |             if (!inRange.isEmpty()) { | ||||||
|  |                 CheckForAggro(mob, inRange); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         }else{ | ||||||
|  |             CheckToDropCombatTarget(mob); | ||||||
|  |             if(mob.combatTarget == null){ | ||||||
|  |                 HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(mob.loc, MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER); | ||||||
|  |                 CheckForAggro(mob, inRange); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(MovementUtilities.canMove(mob)) | ||||||
|  |             CheckForMovement(mob); | ||||||
|  | 
 | ||||||
|  |         if(mob.combatTarget != null) | ||||||
|  |             CheckForAttack(mob); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void CheckToDropCombatTarget(Mob mob){ | ||||||
|  | 
 | ||||||
|  |         if(!mob.combatTarget.isAlive()){ | ||||||
|  |             mob.setCombatTarget(null); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(mob.combatTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)){ | ||||||
|  |             PlayerCharacter pcTarget = (PlayerCharacter) mob.combatTarget; | ||||||
|  |             if (!mob.canSee(pcTarget)) { | ||||||
|  |                 mob.setCombatTarget(null); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(mob.bindLoc.distanceSquared(mob.combatTarget.loc) > 90 * 90){ | ||||||
|  |             mob.setCombatTarget(null); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void CheckForRespawn(Mob mob){ | ||||||
|  |         if (mob.deathTime == 0) { | ||||||
|  |             mob.setDeathTime(System.currentTimeMillis()); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!mob.despawned) { | ||||||
|  | 
 | ||||||
|  |             if (mob.getCharItemManager().getInventoryCount() > 0) { | ||||||
|  |                 if (System.currentTimeMillis() > mob.deathTime + MBServerStatics.DESPAWN_TIMER_WITH_LOOT) { | ||||||
|  |                     mob.despawn(); | ||||||
|  |                     mob.deathTime = System.currentTimeMillis(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 //No items in inventory.
 | ||||||
|  |             } else if (mob.isHasLoot()) { | ||||||
|  |                 if (System.currentTimeMillis() > mob.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) { | ||||||
|  |                     mob.despawn(); | ||||||
|  |                     mob.deathTime = System.currentTimeMillis(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 //Mob never had Loot.
 | ||||||
|  |             } else { | ||||||
|  |                 if (System.currentTimeMillis() > mob.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) { | ||||||
|  |                     mob.despawn(); | ||||||
|  |                     mob.deathTime = System.currentTimeMillis(); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(Mob.discDroppers.contains(mob)) | ||||||
|  |             return; | ||||||
|  | 
 | ||||||
|  |         if (System.currentTimeMillis() > (mob.deathTime + (mob.spawnTime * 1000L))) { | ||||||
|  |             Zone.respawnQue.add(mob); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void CheckForAggro(Mob mob, HashSet<AbstractWorldObject> inRange){ | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void CheckForMovement(Mob mob){ | ||||||
|  | 
 | ||||||
|  |         if(mob.combatTarget != null){ | ||||||
|  |             //chase player
 | ||||||
|  |             float rangeSquared = mob.getRange() * mob.getRange(); | ||||||
|  |             Vector3fImmutable loc2D = mob.loc; | ||||||
|  |             loc2D.setY(0); | ||||||
|  |             Vector3fImmutable tarLoc2D = mob.combatTarget.loc; | ||||||
|  |             tarLoc2D.setY(0); | ||||||
|  |             if(loc2D.distanceSquared(tarLoc2D) > rangeSquared) | ||||||
|  |                 MovementUtilities.aiMove(mob,mob.combatTarget.loc,false); | ||||||
|  | 
 | ||||||
|  |         }else{ | ||||||
|  |             //patrol
 | ||||||
|  |             if (mob.isMoving()) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             Vector3fImmutable patrolPoint = Vector3fImmutable.getRandomPointOnCircle(mob.bindLoc,40f); | ||||||
|  |             MovementUtilities.aiMove(mob,patrolPoint,true); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static void CheckForAttack(Mob mob){ | ||||||
|  |         float rangeSquared = mob.getRange() * mob.getRange(); | ||||||
|  |         Vector3fImmutable loc2D = mob.loc; | ||||||
|  |         loc2D.setY(0); | ||||||
|  |         Vector3fImmutable tarLoc2D = mob.combatTarget.loc; | ||||||
|  |         tarLoc2D.setY(0); | ||||||
|  |         if(loc2D.distanceSquared(tarLoc2D) > rangeSquared) | ||||||
|  |             return; | ||||||
|  | 
 | ||||||
|  |         if (mob.BehaviourType.callsForHelp) | ||||||
|  |             MobCallForHelp(mob); | ||||||
|  | 
 | ||||||
|  |         ItemBase mainHand = mob.getWeaponItemBase(true); | ||||||
|  |         ItemBase offHand = mob.getWeaponItemBase(false); | ||||||
|  | 
 | ||||||
|  |         if (mainHand == null && offHand == null) { | ||||||
|  |             CombatUtilities.combatCycle(mob, mob.combatTarget, true, null); | ||||||
|  |             int delay = 3000; | ||||||
|  |             mob.setLastAttackTime(System.currentTimeMillis() + delay); | ||||||
|  |         } else if (mob.getWeaponItemBase(true) != null) { | ||||||
|  |             int delay = 3000; | ||||||
|  |             CombatUtilities.combatCycle(mob, mob.combatTarget, true, mob.getWeaponItemBase(true)); | ||||||
|  |             mob.setLastAttackTime(System.currentTimeMillis() + delay); | ||||||
|  |         } else if (mob.getWeaponItemBase(false) != null) { | ||||||
|  |             int attackDelay = 3000; | ||||||
|  |             CombatUtilities.combatCycle(mob, mob.combatTarget, false, mob.getWeaponItemBase(false)); | ||||||
|  |             mob.setLastAttackTime(System.currentTimeMillis() + attackDelay); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     public static void MobCallForHelp(Mob mob){ | ||||||
|  |         HashSet<AbstractWorldObject> mobs = WorldGrid.getObjectsInRangePartial(mob.loc,60f, MBServerStatics.MASK_MOB); | ||||||
|  |         for(AbstractWorldObject awo : mobs){ | ||||||
|  |             Mob responder = (Mob)awo; | ||||||
|  |             if(responder.combatTarget == null) | ||||||
|  |                 if(MovementUtilities.canMove(responder)) | ||||||
|  |                     MovementUtilities.aiMove(responder,mob.loc,false); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in new issue