FatBoy-DOTC
1 year ago
16 changed files with 75 additions and 218 deletions
@ -1,120 +0,0 @@ |
|||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.ai; |
|
||||||
|
|
||||||
import engine.gameManager.ConfigManager; |
|
||||||
import engine.gameManager.ZoneManager; |
|
||||||
import engine.objects.Mob; |
|
||||||
import engine.objects.Zone; |
|
||||||
import engine.util.ThreadUtils; |
|
||||||
import org.joda.time.DateTime; |
|
||||||
import org.pmw.tinylog.Logger; |
|
||||||
|
|
||||||
import java.time.Duration; |
|
||||||
import java.time.Instant; |
|
||||||
|
|
||||||
|
|
||||||
public class MobileFSMManager { |
|
||||||
|
|
||||||
private static final MobileFSMManager INSTANCE = new MobileFSMManager(); |
|
||||||
public static Duration executionTime = Duration.ofNanos(1); |
|
||||||
public static Duration executionMax = Duration.ofNanos(1); |
|
||||||
//AI variables moved form mb_server_statics
|
|
||||||
public static int AI_BASE_AGGRO_RANGE = 60; |
|
||||||
public static int AI_DROP_AGGRO_RANGE = 60; |
|
||||||
public static int AI_PULSE_MOB_THRESHOLD = 200; |
|
||||||
public static int AI_PATROL_DIVISOR = 15; |
|
||||||
public static int AI_POWER_DIVISOR = 20; |
|
||||||
private volatile boolean alive; |
|
||||||
private long timeOfKill = -1; |
|
||||||
private MobileFSMManager() { |
|
||||||
|
|
||||||
Runnable worker = new Runnable() { |
|
||||||
@Override |
|
||||||
public void run() { |
|
||||||
execution(); |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
alive = true; |
|
||||||
|
|
||||||
//assign the AI varibales base don difficulty scaling from config file:
|
|
||||||
|
|
||||||
float difficulty = Float.parseFloat(ConfigManager.MB_AI_AGGRO_RANGE.getValue()); |
|
||||||
AI_BASE_AGGRO_RANGE = (int) (100 * difficulty); // range at which aggressive mobs will attack you
|
|
||||||
|
|
||||||
difficulty = Float.parseFloat(ConfigManager.MB_AI_CAST_FREQUENCY.getValue()); |
|
||||||
AI_POWER_DIVISOR = (int) (20 * (1.5f - difficulty)); //duration between mob casts
|
|
||||||
|
|
||||||
Thread t = new Thread(worker, "MobileFSMManager"); |
|
||||||
t.start(); |
|
||||||
} |
|
||||||
|
|
||||||
public static MobileFSMManager getInstance() { |
|
||||||
return INSTANCE; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Stops the MobileFSMManager |
|
||||||
*/ |
|
||||||
public void shutdown() { |
|
||||||
if (alive) { |
|
||||||
alive = false; |
|
||||||
timeOfKill = System.currentTimeMillis(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public boolean isAlive() { |
|
||||||
return this.alive; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private void execution() { |
|
||||||
|
|
||||||
//Load zone threshold once.
|
|
||||||
|
|
||||||
long mobPulse = System.currentTimeMillis() + AI_PULSE_MOB_THRESHOLD; |
|
||||||
Instant startTime; |
|
||||||
|
|
||||||
while (alive) { |
|
||||||
|
|
||||||
ThreadUtils.sleep(1); |
|
||||||
|
|
||||||
if (System.currentTimeMillis() > mobPulse) { |
|
||||||
|
|
||||||
startTime = Instant.now(); |
|
||||||
|
|
||||||
for (Zone zone : ZoneManager.getAllZones()) { |
|
||||||
|
|
||||||
for (Mob mob : zone.zoneMobSet) { |
|
||||||
|
|
||||||
try { |
|
||||||
if (mob != null) |
|
||||||
MobileFSM.DetermineAction(mob); |
|
||||||
} catch (Exception e) { |
|
||||||
Logger.error("Mob: " + mob.getName() + " UUID: " + mob.getObjectUUID() + " ERROR: " + e); |
|
||||||
e.printStackTrace(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
executionTime = Duration.between(startTime, Instant.now()); |
|
||||||
|
|
||||||
if (executionTime.compareTo(executionMax) > 0) |
|
||||||
executionMax = executionTime; |
|
||||||
|
|
||||||
mobPulse = System.currentTimeMillis() + AI_PULSE_MOB_THRESHOLD; |
|
||||||
Logger.info("MobileFSM cycle completed: " + DateTime.now()); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,14 +0,0 @@ |
|||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.ai.utilities; |
|
||||||
|
|
||||||
public class PowerUtilities { |
|
||||||
|
|
||||||
} |
|
@ -1,46 +0,0 @@ |
|||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.devcmd.cmds; |
|
||||||
|
|
||||||
import engine.ai.MobileFSMManager; |
|
||||||
import engine.devcmd.AbstractDevCmd; |
|
||||||
import engine.gameManager.SimulationManager; |
|
||||||
import engine.objects.AbstractGameObject; |
|
||||||
import engine.objects.PlayerCharacter; |
|
||||||
|
|
||||||
public class HeartbeatCmd extends AbstractDevCmd { |
|
||||||
|
|
||||||
public HeartbeatCmd() { |
|
||||||
super("heartbeat"); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected void _doCmd(PlayerCharacter pc, String[] words, |
|
||||||
AbstractGameObject target) { |
|
||||||
|
|
||||||
this.throwbackInfo(pc, "Heartbeat : " + SimulationManager.executionTime.toMillis() + "ms"); |
|
||||||
this.throwbackInfo(pc, "Heartbeat Max: " + SimulationManager.executionMax.toMillis() + "ms"); |
|
||||||
|
|
||||||
this.throwbackInfo(pc, "FSM: " + MobileFSMManager.executionTime.toMillis() + "ms"); |
|
||||||
this.throwbackInfo(pc, "FSM max: " + MobileFSMManager.executionMax.toMillis() + "ms"); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected String _getHelpString() { |
|
||||||
return "Displays simulation metrics"; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected String _getUsageString() { |
|
||||||
return "' ./heartbeat"; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,46 @@ |
|||||||
|
package engine.mobileAI.Threads; |
||||||
|
|
||||||
|
import engine.mobileAI.MobAI; |
||||||
|
import engine.gameManager.ZoneManager; |
||||||
|
import engine.objects.Mob; |
||||||
|
import engine.objects.Zone; |
||||||
|
import org.pmw.tinylog.Logger; |
||||||
|
|
||||||
|
public class MobAIThread implements Runnable{ |
||||||
|
public static int AI_BASE_AGGRO_RANGE = 60; |
||||||
|
public static int AI_DROP_AGGRO_RANGE = 60; |
||||||
|
public static int AI_PULSE_MOB_THRESHOLD = 200; |
||||||
|
public static int AI_PATROL_DIVISOR = 15; |
||||||
|
public static int AI_POWER_DIVISOR = 20; |
||||||
|
// Thread constructor
|
||||||
|
|
||||||
|
public MobAIThread() { |
||||||
|
Logger.info(" MobAIThread thread has started!"); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
while (true) { |
||||||
|
for (Zone zone : ZoneManager.getAllZones()) { |
||||||
|
|
||||||
|
for (Mob mob : zone.zoneMobSet) { |
||||||
|
|
||||||
|
try { |
||||||
|
if (mob != null) |
||||||
|
MobAI.DetermineAction(mob); |
||||||
|
} catch (Exception e) { |
||||||
|
Logger.error("Mob: " + mob.getName() + " UUID: " + mob.getObjectUUID() + " ERROR: " + e); |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
public static void startAIThread() { |
||||||
|
Thread aiThread; |
||||||
|
aiThread = new Thread(new MobAIThread()); |
||||||
|
aiThread.setName("aiThread"); |
||||||
|
aiThread.start(); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue