Improve the path finding ai
This commit is contained in:
parent
78b10e3cb8
commit
6f48d0ee43
@ -567,4 +567,9 @@ public class Moba extends TeamGame
|
|||||||
{
|
{
|
||||||
return _capturePoint;
|
return _capturePoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BossManager getBossManager()
|
||||||
|
{
|
||||||
|
return _boss;
|
||||||
|
}
|
||||||
}
|
}
|
@ -16,6 +16,11 @@ public class MobaDirectAIMethod implements MobaAIMethod
|
|||||||
{
|
{
|
||||||
Location entityLocation = entity.getLocation();
|
Location entityLocation = entity.getLocation();
|
||||||
|
|
||||||
|
if (UtilMath.offsetSquared(entity.getLocation(), goal) < 6)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
float entityYaw = entityLocation.getYaw();
|
float entityYaw = entityLocation.getYaw();
|
||||||
|
|
||||||
// Speed is blocks per second
|
// Speed is blocks per second
|
||||||
|
@ -9,7 +9,9 @@ import nautilus.game.arcade.world.WorldData;
|
|||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class BossManager implements Listener
|
public class BossManager implements Listener
|
||||||
@ -69,4 +71,13 @@ public class BossManager implements Listener
|
|||||||
{
|
{
|
||||||
return _teamBosses.get(team);
|
return _teamBosses.get(team);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<MobaBoss> getBosses()
|
||||||
|
{
|
||||||
|
List<MobaBoss> bosses = new ArrayList<>();
|
||||||
|
|
||||||
|
bosses.addAll(_teamBosses.values());
|
||||||
|
|
||||||
|
return bosses;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -87,4 +87,9 @@ public abstract class MobaBoss implements Listener
|
|||||||
{
|
{
|
||||||
return _entity;
|
return _entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDead()
|
||||||
|
{
|
||||||
|
return _entity == null || _entity.isDead() || !_entity.isValid();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -173,4 +173,9 @@ public class WitherBoss extends MobaBoss
|
|||||||
{
|
{
|
||||||
_disguise.setName(MobaUtil.getHealthBar(_entity, 40));
|
_disguise.setName(MobaUtil.getHealthBar(_entity, 40));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public GameTeam getTeam()
|
||||||
|
{
|
||||||
|
return _team;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,11 @@ import nautilus.game.arcade.game.GameTeam;
|
|||||||
import nautilus.game.arcade.game.games.moba.Moba;
|
import nautilus.game.arcade.game.games.moba.Moba;
|
||||||
import nautilus.game.arcade.game.games.moba.ai.goal.MobaAIMethod;
|
import nautilus.game.arcade.game.games.moba.ai.goal.MobaAIMethod;
|
||||||
import nautilus.game.arcade.game.games.moba.ai.goal.MobaDirectAIMethod;
|
import nautilus.game.arcade.game.games.moba.ai.goal.MobaDirectAIMethod;
|
||||||
|
import nautilus.game.arcade.game.games.moba.boss.MobaBoss;
|
||||||
|
import nautilus.game.arcade.game.games.moba.boss.wither.WitherBoss;
|
||||||
import nautilus.game.arcade.game.games.moba.structure.tower.Tower;
|
import nautilus.game.arcade.game.games.moba.structure.tower.Tower;
|
||||||
import nautilus.game.arcade.game.games.moba.util.MobaConstants;
|
import nautilus.game.arcade.game.games.moba.util.MobaConstants;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
@ -29,7 +32,7 @@ import java.util.List;
|
|||||||
public class MinionWave implements Listener
|
public class MinionWave implements Listener
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final int MAX_MINIONS_PER_WAVE = 6;
|
private static final int MAX_MINIONS_PER_WAVE = 1;
|
||||||
private static final MobaAIMethod AI_METHOD = new MobaDirectAIMethod();
|
private static final MobaAIMethod AI_METHOD = new MobaDirectAIMethod();
|
||||||
|
|
||||||
private final Moba _host;
|
private final Moba _host;
|
||||||
@ -93,22 +96,44 @@ public class MinionWave implements Listener
|
|||||||
for (Minion minion : _minions)
|
for (Minion minion : _minions)
|
||||||
{
|
{
|
||||||
LivingEntity entity = minion.getEntity();
|
LivingEntity entity = minion.getEntity();
|
||||||
|
Location target = null;
|
||||||
|
Location towerTarget = targetTower(minion);
|
||||||
|
Location witherTarget = targetWither(minion);
|
||||||
|
|
||||||
if (targetTower(minion))
|
if (towerTarget != null)
|
||||||
{
|
{
|
||||||
|
target = towerTarget;
|
||||||
}
|
}
|
||||||
else if (!AI_METHOD.updateMovement(entity, minion.getTarget(), 0.1F))
|
else if (witherTarget != null)
|
||||||
|
{
|
||||||
|
target = witherTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target != null)
|
||||||
|
{
|
||||||
|
minion.setTarget(target);
|
||||||
|
|
||||||
|
// Too close
|
||||||
|
if (UtilMath.offsetSquared(entity.getLocation(), target) < 12)
|
||||||
|
{
|
||||||
|
Bukkit.broadcastMessage("Too close");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!AI_METHOD.updateMovement(entity, minion.getTarget(), 4F))
|
||||||
{
|
{
|
||||||
int newTarget = minion.getTargetIndex() + 1;
|
int newTarget = minion.getTargetIndex() + 1;
|
||||||
|
|
||||||
if (newTarget == _path.size())
|
if (newTarget == _path.size())
|
||||||
{
|
{
|
||||||
// TODO target wither, probably...
|
Bukkit.broadcastMessage("Done");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
minion.setTargetIndex(newTarget);
|
minion.setTargetIndex(newTarget);
|
||||||
|
minion.setTarget(_path.get(newTarget));
|
||||||
|
Bukkit.broadcastMessage("Advance target " + newTarget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,7 +146,7 @@ public class MinionWave implements Listener
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean targetTower(Minion minion)
|
private Location targetTower(Minion minion)
|
||||||
{
|
{
|
||||||
for (Tower tower : _host.getTowerManager().getTowers())
|
for (Tower tower : _host.getTowerManager().getTowers())
|
||||||
{
|
{
|
||||||
@ -130,27 +155,60 @@ public class MinionWave implements Listener
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Location location = tower.getCrystal().getLocation();
|
||||||
double distSquared = UtilMath.offsetSquared(minion.getEntity(), tower.getCrystal());
|
double distSquared = UtilMath.offsetSquared(minion.getEntity(), tower.getCrystal());
|
||||||
|
|
||||||
if (distSquared < 3)
|
if (distSquared < 3)
|
||||||
{
|
{
|
||||||
return true;
|
return location;
|
||||||
}
|
}
|
||||||
else if (distSquared > Tower.TARGET_RANGE_SQUARED)
|
else if (distSquared > Tower.TARGET_RANGE_SQUARED)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
minion.setTarget(tower.getCrystal().getLocation());
|
return location;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void targetWither(Minion minion)
|
private Location targetWither(Minion minion)
|
||||||
{
|
{
|
||||||
|
for (MobaBoss boss : _host.getBossManager().getBosses())
|
||||||
|
{
|
||||||
|
if (boss.isDead())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (boss instanceof WitherBoss)
|
||||||
|
{
|
||||||
|
WitherBoss witherBoss = (WitherBoss) boss;
|
||||||
|
|
||||||
|
if (witherBoss.getTeam().equals(_owner))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Location location = boss.getEntity().getLocation();
|
||||||
|
double distSquared = UtilMath.offsetSquared(minion.getEntity(), boss.getEntity());
|
||||||
|
|
||||||
|
if (distSquared < 3)
|
||||||
|
{
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
else if (distSquared > Tower.TARGET_RANGE_SQUARED)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
minion.setTarget(boss.getEntity().getLocation());
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST)
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
|
Loading…
Reference in New Issue
Block a user