forked from MagicBane/Server
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.7 KiB
86 lines
2.7 KiB
package engine.mobileAI.BehaviourFiles; |
|
|
|
import engine.InterestManagement.WorldGrid; |
|
import engine.gameManager.PowersManager; |
|
import engine.mobileAI.enumMobState; |
|
import engine.mobileAI.utilities.CombatUtilities; |
|
import engine.mobileAI.utilities.MovementUtilities; |
|
import engine.objects.AbstractWorldObject; |
|
import engine.objects.ItemBase; |
|
import engine.objects.Mob; |
|
import engine.objects.PlayerCharacter; |
|
import engine.powers.PowersBase; |
|
import engine.server.MBServerStatics; |
|
|
|
import java.util.Map; |
|
|
|
public class PlayerPet { |
|
|
|
public static void process(Mob pet){ |
|
if(pet.getOwner() == null && !pet.isNecroPet()){ |
|
pet.killCharacter("no owner"); |
|
return; |
|
} |
|
|
|
if(!WorldGrid.getObjectsInRangePartial(pet.loc, MBServerStatics.CHARACTER_LOAD_RANGE,1).contains(pet.getOwner())){ |
|
pet.teleport(pet.getOwner().loc); |
|
return; |
|
} |
|
|
|
switch(enumMobState.getState(pet)){ |
|
case dead: |
|
pet.despawn(); |
|
return; |
|
case patrolling: |
|
if(pet.loc.distanceSquared(pet.getOwner().loc) > 90 && !pet.isMoving()){ |
|
MovementUtilities.aiMove(pet,pet.getOwner().loc,false); |
|
} |
|
return; |
|
case attacking: |
|
attack(pet); |
|
return; |
|
} |
|
} |
|
|
|
public static void attack(Mob mob){ |
|
|
|
if (mob.combatTarget == null || !mob.combatTarget.isAlive()) { |
|
mob.setCombatTarget(null); |
|
aggro(mob); |
|
return; |
|
} |
|
|
|
if(!CombatUtilities.inRangeToAttack(mob,mob.combatTarget)){ |
|
if (!MovementUtilities.canMove(mob)) |
|
return; |
|
MovementUtilities.aiMove(mob,mob.combatTarget.loc,false); |
|
return; |
|
} |
|
|
|
mob.updateLocation(); |
|
|
|
ItemBase weapon = mob.getWeaponItemBase(true); |
|
boolean mainHand = true; |
|
if(weapon == null) { |
|
weapon = mob.getWeaponItemBase(false); |
|
mainHand = false; |
|
} |
|
|
|
if (System.currentTimeMillis() > mob.getNextAttackTime()) { |
|
CombatUtilities.combatCycle(mob, mob.combatTarget, mainHand, weapon); |
|
mob.setNextAttackTime(System.currentTimeMillis() + 3000L); |
|
} |
|
} |
|
public static void aggro(Mob mob){ |
|
|
|
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(mob.loc,30, MBServerStatics.MASK_MOB)) { |
|
Mob potentialTarget = (Mob) awo; |
|
if (!potentialTarget.isAlive()) |
|
continue; |
|
if (MovementUtilities.inRangeToAggro(mob, potentialTarget)) { |
|
mob.setCombatTarget(potentialTarget); |
|
return; |
|
} |
|
} |
|
} |
|
}
|
|
|