diff --git a/src/engine/ai/MobileFSM.java b/src/engine/ai/MobileFSM.java index 34a357ee..77796481 100644 --- a/src/engine/ai/MobileFSM.java +++ b/src/engine/ai/MobileFSM.java @@ -225,6 +225,10 @@ public class MobileFSM { mob.setCombatTarget(null); return false; } + int castRoll = ThreadLocalRandom.current().nextInt(101); + if(castRoll <= MobileFSMManager.AI_POWER_DIVISOR){ + return false; + } if (mob.nextCastTime == 0) mob.nextCastTime = System.currentTimeMillis(); return mob.nextCastTime <= System.currentTimeMillis(); @@ -286,7 +290,8 @@ public class MobileFSM { msg.setUnknown04(2); PowersManager.finishUseMobPower(msg, mob, 0, 0); // Default minimum seconds between cast = 10 - mob.nextCastTime = System.currentTimeMillis() + mobPower.getCooldown() + (MobileFSMManager.AI_POWER_DIVISOR * 1000); + float randomCooldown = (ThreadLocalRandom.current().nextInt(150) + 100) * 0.01f; + mob.nextCastTime = System.currentTimeMillis() + (long)((mobPower.getCooldown() + (MobileFSMManager.AI_POWER_DIVISOR * 1000)) * randomCooldown); return true; } return false; diff --git a/src/engine/ai/MobileFSMManager.java b/src/engine/ai/MobileFSMManager.java index 7c94ba2f..a2ca0c3a 100644 --- a/src/engine/ai/MobileFSMManager.java +++ b/src/engine/ai/MobileFSMManager.java @@ -33,10 +33,8 @@ public class MobileFSMManager { public static int AI_DROP_AGGRO_RANGE = 60; public static int AI_RECALL_RANGE = 400; public static int AI_PULSE_MOB_THRESHOLD = 200; - public static int AI_THREAD_SLEEP = 1000; public static int AI_PATROL_DIVISOR = 15; public static int AI_POWER_DIVISOR = 20; - public static float AI_MAX_ANGLE = 10f; private MobileFSMManager() { diff --git a/src/engine/db/handlers/dbMobBaseHandler.java b/src/engine/db/handlers/dbMobBaseHandler.java index 307f4361..f59ab84f 100644 --- a/src/engine/db/handlers/dbMobBaseHandler.java +++ b/src/engine/db/handlers/dbMobBaseHandler.java @@ -72,45 +72,6 @@ public class dbMobBaseHandler extends dbHandlerBase { } return mobbaseList; } - - public void SET_AI_DEFAULTS() { - - try (Connection connection = DbManager.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_ai_defaults`")) { - - ResultSet rs = preparedStatement.executeQuery(); - - while (rs.next()) { - MobileFSMManager.AI_BASE_AGGRO_RANGE = rs.getInt("aggro_range"); - MobileFSMManager.AI_PATROL_DIVISOR = rs.getInt("patrol_chance"); - MobileFSMManager.AI_DROP_AGGRO_RANGE = rs.getInt("drop_aggro_range"); - MobileFSMManager.AI_POWER_DIVISOR = rs.getInt("cast_chance"); - MobileFSMManager.AI_RECALL_RANGE = rs.getInt("recall_range"); - } - } catch (SQLException e) { - Logger.error(e); - } - } - - public boolean UPDATE_AI_DEFAULTS() { - - try (Connection connection = DbManager.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `static_ai_defaults` SET `aggro_range` = ?,`patrol_chance`= ?,`drop_aggro_range`= ?,`cast_chance`= ?,`recall_range`= ? WHERE `ID` = 1")) { - - preparedStatement.setInt(1, MobileFSMManager.AI_BASE_AGGRO_RANGE); - preparedStatement.setInt(2, MobileFSMManager.AI_PATROL_DIVISOR); - preparedStatement.setInt(3, MobileFSMManager.AI_DROP_AGGRO_RANGE); - preparedStatement.setInt(4, MobileFSMManager.AI_POWER_DIVISOR); - preparedStatement.setInt(5, MobileFSMManager.AI_RECALL_RANGE); - - return (preparedStatement.executeUpdate() > 0); - - } catch (SQLException e) { - Logger.error(e); - } - return false; - } - public HashMap LOAD_STATIC_POWERS(int mobBaseUUID) { HashMap powersList = new HashMap<>(); diff --git a/src/engine/devcmd/cmds/SetAICmd.java b/src/engine/devcmd/cmds/SetAICmd.java deleted file mode 100644 index 603307e6..00000000 --- a/src/engine/devcmd/cmds/SetAICmd.java +++ /dev/null @@ -1,129 +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.DbManager; -import engine.objects.AbstractGameObject; -import engine.objects.PlayerCharacter; -import engine.server.MBServerStatics; - -/** - * @author Steve - * - */ -public class SetAICmd extends AbstractDevCmd { - - public SetAICmd() { - super("setAI"); - this.addCmdString("ai"); - } - - @Override - protected void _doCmd(PlayerCharacter pc, String[] words, - AbstractGameObject target) { - if (words.length < 2){ - this.sendUsage(pc); - return; - } - - int amount; - - try{ - amount = Integer.valueOf(words[1]); - }catch (NumberFormatException e) { - this.throwbackError(pc, "Failed to parse amount"); - return; - } - - switch(words[0]){ - case "angle" : - float angle = Float.parseFloat(words[1]); - - MobileFSMManager.AI_MAX_ANGLE = angle; - break; - case "aggrorange": - MobileFSMManager.AI_BASE_AGGRO_RANGE = amount; - DbManager.MobBaseQueries.UPDATE_AI_DEFAULTS(); - this.throwbackInfo(pc, "Aggro Range is now set to " + amount); - break; - case "dropaggrorange": - MobileFSMManager.AI_DROP_AGGRO_RANGE = amount; - DbManager.MobBaseQueries.UPDATE_AI_DEFAULTS(); - this.throwbackInfo(pc, "Drop Aggro Range is now set to " + amount); - break; - case "patroldivisor": - MobileFSMManager.AI_PATROL_DIVISOR = amount; - DbManager.MobBaseQueries.UPDATE_AI_DEFAULTS(); - this.throwbackInfo(pc, "Patrol Chance is now set to " + amount); - break; - case "pulse": - if (amount < 500){ - this.throwbackError(pc, "pulse amount must be greather than 500 to execute."); - return; - } - MobileFSMManager.AI_PULSE_MOB_THRESHOLD = amount; - this.throwbackInfo(pc, "Pulse is now set to " + amount); - break; - case "sleepthread": - if (amount < 500){ - this.throwbackError(pc, "sleep amount must be greather than 500 to execute."); - return; - } - MobileFSMManager.AI_THREAD_SLEEP = amount; - this.throwbackInfo(pc, "Thread Sleep is now set to " + amount); - break; - case "recallrange": - MobileFSMManager.AI_RECALL_RANGE = amount; - DbManager.MobBaseQueries.UPDATE_AI_DEFAULTS(); - this.throwbackInfo(pc, "Recall Range is now set to " + amount); - break; - case "powerdivisor": - MobileFSMManager.AI_POWER_DIVISOR = amount; - DbManager.MobBaseQueries.UPDATE_AI_DEFAULTS(); - this.throwbackInfo(pc, "Power Divisor is now set to " + amount); - break; - case "losehate": - MBServerStatics.PLAYER_HATE_DELIMITER = amount; - break; - case "hatemodcombat": - MBServerStatics.PLAYER_COMBAT_HATE_MODIFIER = amount; - default: - this.throwbackError(pc, words[0] + " is not a valid AI Command."); - break; - } - } - - @Override - protected String _getHelpString() { - String help = "Modifies Mob AI Statics. Commands:"; - help += "\n AGGRORANGE: Sets the range when a mob will aggro it's target. Aggro range is currently " + MobileFSMManager.AI_BASE_AGGRO_RANGE; - help += "\n DROPAGGRORANGE: Sets the range when a mob will drop aggro from it's target. Drop aggro range is currently " + MobileFSMManager.AI_DROP_AGGRO_RANGE; - help += "\n PATROLDIVISOR: Sets the Patrol Divisor for Mob AI. Setting this will give a 1/[amount] chance to parol the area. Patrol Chance is currently 1/" + MobileFSMManager.AI_PATROL_DIVISOR; - help += "\n PULSE: sets how often to run mob's AI. Measured in MS. Pulse is currently " + MobileFSMManager.AI_PULSE_MOB_THRESHOLD + "ms."; - help += "\n SLEEPTHREAD: Sets how long to sleep the AI for ALL mobs.Thread sleep is currently " + MobileFSMManager.AI_THREAD_SLEEP + "ms."; - help += "\n RECALLRANGE: Sets the range of a mob to recall back to it's bind location. Recall range is currently " + MobileFSMManager.AI_RECALL_RANGE; - help += "\n POWERDIVISOR: Sets the Power Divisor for Mob AI.Setting this will give a 1/[amount] chance to use power on a player. Power Divisor is currently " + MobileFSMManager.AI_POWER_DIVISOR; - help += "\n LOSEHATE: Sets the amount per second to reduce hate amount for player while they are idle. Hate Delimiter is currently " + MBServerStatics.PLAYER_HATE_DELIMITER; - help += "\n HATEMODCOMBAT: sets the modifier for Hate value for Combat. Hate Value is `Damage *[HATEMODCOMBAT]`.Hate Mod Combat is currently " + MBServerStatics.PLAYER_COMBAT_HATE_MODIFIER; - - return help; - } - - @Override - protected String _getUsageString() { - String usage = "' /setai `command` `amount` `"; - usage += '\n' + _getHelpString(); - return usage; - } - -} diff --git a/src/engine/gameManager/DevCmdManager.java b/src/engine/gameManager/DevCmdManager.java index 7c68d2f7..ff7788a5 100644 --- a/src/engine/gameManager/DevCmdManager.java +++ b/src/engine/gameManager/DevCmdManager.java @@ -119,7 +119,6 @@ public enum DevCmdManager { DevCmdManager.registerDevCmd(new PurgeObjectsCmd()); DevCmdManager.registerDevCmd(new SplatMobCmd()); DevCmdManager.registerDevCmd(new SlotNpcCmd()); - DevCmdManager.registerDevCmd(new SetAICmd()); DevCmdManager.registerDevCmd(new GateInfoCmd()); DevCmdManager.registerDevCmd(new ShowOffsetCmd()); DevCmdManager.registerDevCmd(new RealmInfoCmd()); diff --git a/src/engine/server/world/WorldServer.java b/src/engine/server/world/WorldServer.java index 17deeb1a..257a7f78 100644 --- a/src/engine/server/world/WorldServer.java +++ b/src/engine/server/world/WorldServer.java @@ -358,8 +358,6 @@ public class WorldServer { Logger.info("Starting InterestManager."); WorldGrid.startLoadJob(); - DbManager.MobBaseQueries.SET_AI_DEFAULTS(); - Logger.info("Loading blueprint data."); StaticColliders.loadAllStaticColliders(); BuildingRegions.loadAllStaticColliders();