Browse Source

Merge remote-tracking branch 'origin/magicbox1.5' into magicbox1.5

# Conflicts:
#	src/engine/ai/MobileFSM.java
master
FatBoy-DOTC 2 years ago
parent
commit
bee3a9b376
  1. 109
      src/discord/Database.java
  2. 2
      src/discord/handlers/StatusRequestHandler.java
  3. 122
      src/engine/ai/MobileFSMManager.java
  4. 951
      src/engine/ai/utilities/CombatUtilities.java
  5. 316
      src/engine/ai/utilities/MovementUtilities.java
  6. 1
      src/engine/ai/utilities/PowerUtilities.java
  7. 37
      src/engine/db/archive/BaneRecord.java
  8. 19
      src/engine/db/archive/CharacterRecord.java
  9. 5
      src/engine/db/archive/CityRecord.java
  10. 40
      src/engine/db/archive/DataWarehouse.java
  11. 15
      src/engine/db/archive/GuildRecord.java
  12. 3
      src/engine/db/archive/MineRecord.java
  13. 31
      src/engine/db/archive/PvpRecord.java
  14. 3
      src/engine/db/archive/RealmRecord.java
  15. 395
      src/engine/db/handlers/dbAccountHandler.java
  16. 101
      src/engine/db/handlers/dbBaneHandler.java
  17. 87
      src/engine/db/handlers/dbBaseClassHandler.java
  18. 31
      src/engine/db/handlers/dbBlueprintHandler.java
  19. 36
      src/engine/db/handlers/dbBoonHandler.java
  20. 1546
      src/engine/db/handlers/dbBuildingHandler.java
  21. 41
      src/engine/db/handlers/dbBuildingLocationHandler.java
  22. 104
      src/engine/db/handlers/dbCSSessionHandler.java
  23. 236
      src/engine/db/handlers/dbCharacterPowerHandler.java
  24. 144
      src/engine/db/handlers/dbCharacterRuneHandler.java
  25. 161
      src/engine/db/handlers/dbCharacterSkillHandler.java
  26. 389
      src/engine/db/handlers/dbCityHandler.java
  27. 137
      src/engine/db/handlers/dbContractHandler.java
  28. 402
      src/engine/db/handlers/dbEffectsBaseHandler.java
  29. 33
      src/engine/db/handlers/dbEffectsResourceCostHandler.java
  30. 82
      src/engine/db/handlers/dbEnchantmentHandler.java
  31. 1099
      src/engine/db/handlers/dbGuildHandler.java
  32. 473
      src/engine/db/handlers/dbHandlerBase.java
  33. 48
      src/engine/db/handlers/dbHeightMapHandler.java
  34. 102
      src/engine/db/handlers/dbItemBaseHandler.java
  35. 881
      src/engine/db/handlers/dbItemHandler.java
  36. 39
      src/engine/db/handlers/dbKitHandler.java
  37. 203
      src/engine/db/handlers/dbLootTableHandler.java
  38. 35
      src/engine/db/handlers/dbMenuHandler.java
  39. 187
      src/engine/db/handlers/dbMineHandler.java
  40. 331
      src/engine/db/handlers/dbMobBaseHandler.java
  41. 374
      src/engine/db/handlers/dbMobHandler.java
  42. 767
      src/engine/db/handlers/dbNPCHandler.java
  43. 913
      src/engine/db/handlers/dbPlayerCharacterHandler.java
  44. 69
      src/engine/db/handlers/dbPromotionClassHandler.java
  45. 124
      src/engine/db/handlers/dbRaceHandler.java
  46. 71
      src/engine/db/handlers/dbRealmHandler.java
  47. 30
      src/engine/db/handlers/dbResistHandler.java
  48. 42
      src/engine/db/handlers/dbRuneBaseAttributeHandler.java
  49. 118
      src/engine/db/handlers/dbRuneBaseEffectHandler.java
  50. 306
      src/engine/db/handlers/dbRuneBaseHandler.java
  51. 30
      src/engine/db/handlers/dbRunegateHandler.java
  52. 170
      src/engine/db/handlers/dbShrineHandler.java
  53. 183
      src/engine/db/handlers/dbSkillBaseHandler.java
  54. 81
      src/engine/db/handlers/dbSkillReqHandler.java
  55. 45
      src/engine/db/handlers/dbVendorDialogHandler.java
  56. 659
      src/engine/db/handlers/dbWarehouseHandler.java
  57. 95
      src/engine/db/handlers/dbZoneHandler.java
  58. 105
      src/engine/devcmd/cmds/GuildListCmd.java
  59. 101
      src/engine/devcmd/cmds/RenameMobCmd.java
  60. 67
      src/engine/gameManager/DbManager.java
  61. 2
      src/engine/gameManager/DevCmdManager.java
  62. 12
      src/engine/gameManager/PowersManager.java
  63. 31
      src/engine/gameManager/SimulationManager.java
  64. 55
      src/engine/gameManager/ZoneManager.java
  65. 19
      src/engine/net/client/handlers/MinionTrainingMsgHandler.java
  66. 44
      src/engine/net/client/msg/ManageNPCMsg.java
  67. 2
      src/engine/objects/Boon.java
  68. 34
      src/engine/objects/City.java
  69. 4
      src/engine/objects/Contract.java
  70. 21
      src/engine/objects/Item.java
  71. 14
      src/engine/objects/Mob.java
  72. 14
      src/engine/objects/MobBase.java
  73. 3
      src/engine/objects/Realm.java
  74. 319
      src/engine/objects/Zone.java
  75. 92
      src/engine/powers/EffectsBase.java
  76. 53
      src/engine/powers/PowersBase.java
  77. 263
      src/engine/powers/effectmodifiers/AbstractEffectModifier.java
  78. 2
      src/engine/powers/effectmodifiers/ItemNameEffectModifier.java
  79. 2
      src/engine/server/MBServerStatics.java
  80. 54
      src/engine/server/login/LoginServer.java
  81. 4
      src/engine/server/login/LoginServerMsgHandler.java
  82. 9
      src/engine/server/world/WorldServer.java
  83. 1
      src/engine/workthreads/HourlyJobThread.java
  84. 4
      src/engine/workthreads/PurgeOprhans.java
  85. 63
      src/engine/workthreads/WarehousePushThread.java

109
src/discord/Database.java

@ -54,15 +54,13 @@ public class Database {
public boolean updateAccountPassword(String discordAccountID, String newPassword) { public boolean updateAccountPassword(String discordAccountID, String newPassword) {
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement updateStatement = connection.prepareStatement("call discordUpdatePassword(?, ?)")) {
CallableStatement updatePassword = connection.prepareCall("call discordUpdatePassword(?, ?)");
updatePassword.setString(1, discordAccountID); updateStatement.setString(1, discordAccountID);
updatePassword.setString(2, newPassword); updateStatement.setString(2, newPassword);
updatePassword.executeUpdate(); updateStatement.executeUpdate();
updatePassword.close();
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {
@ -75,15 +73,13 @@ public class Database {
public boolean updateAccountStatus(String discordAccountID, Enum.AccountStatus accountStatus) { public boolean updateAccountStatus(String discordAccountID, Enum.AccountStatus accountStatus) {
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement updateStatement = connection.prepareStatement("update obj_account set `status` = ? where `discordAccount` = ?")) {
PreparedStatement updateAccountStatus = connection.prepareCall("update obj_account set `status` = ? where `discordAccount` = ?"); updateStatement.setString(1, accountStatus.name());
updateStatement.setString(2, discordAccountID);
updateAccountStatus.setString(1, accountStatus.name()); updateStatement.executeUpdate();
updateAccountStatus.setString(2, discordAccountID);
updateAccountStatus.executeUpdate();
updateAccountStatus.close();
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {
@ -98,14 +94,13 @@ public class Database {
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue())) {
CallableStatement registerAccount = connection.prepareCall("call discordAccountRegister(?, ?, ?)"); PreparedStatement registerStatement = connection.prepareStatement("call discordAccountRegister(?, ?, ?)");
registerAccount.setString(1, discordAccountID); registerStatement.setString(1, discordAccountID);
registerAccount.setString(2, discordUserName); registerStatement.setString(2, discordUserName);
registerAccount.setString(3, discordPassword); registerStatement.setString(3, discordPassword);
registerAccount.execute(); registerStatement.execute();
registerAccount.close();
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {
@ -123,11 +118,11 @@ public class Database {
String queryString = "SELECT * FROM obj_account where discordAccount = ?"; String queryString = "SELECT * FROM obj_account where discordAccount = ?";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement accountQuery = connection.prepareStatement(queryString);) {
// Discord account name based lookup // Discord account name based lookup
PreparedStatement accountQuery = connection.prepareStatement(queryString);
accountQuery.setString(1, discordAccountID); accountQuery.setString(1, discordAccountID);
ResultSet rs = accountQuery.executeQuery(); ResultSet rs = accountQuery.executeQuery();
@ -169,11 +164,8 @@ public class Database {
String queryString = "SELECT * FROM dyn_trash_detail;"; String queryString = "SELECT * FROM dyn_trash_detail;";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement trashQuery = connection.prepareStatement(queryString)) {
// Discord account name based lookup
PreparedStatement trashQuery = connection.prepareStatement(queryString);
ResultSet rs = trashQuery.executeQuery(); ResultSet rs = trashQuery.executeQuery();
@ -195,15 +187,11 @@ public class Database {
public String getTrashList() { public String getTrashList() {
String outString = ""; String outString = "";
String queryString = "SELECT DISTINCT `characterName` FROM dyn_trash_detail;";
int counter = 0; int counter = 0;
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement trashQuery = connection.prepareStatement("SELECT DISTINCT `characterName` FROM dyn_trash_detail;")) {
// Discord account name based lookup
PreparedStatement trashQuery = connection.prepareStatement(queryString);
ResultSet rs = trashQuery.executeQuery(); ResultSet rs = trashQuery.executeQuery();
@ -234,14 +222,9 @@ public class Database {
int trashCount = 0; int trashCount = 0;
String queryString = "SELECT count(distinct characterName) FROM dyn_trash_detail;";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement trashQuery = connection.prepareStatement("SELECT count(distinct characterName) FROM dyn_trash_detail;")) {
// Discord account name based lookup
PreparedStatement trashQuery = connection.prepareStatement(queryString);
ResultSet rs = trashQuery.executeQuery(); ResultSet rs = trashQuery.executeQuery();
@ -259,23 +242,17 @@ public class Database {
public void setAdminEventAsRead(int adminEvent) { public void setAdminEventAsRead(int adminEvent) {
String queryString = "UPDATE dyn_admin_log SET `SentFlag` = 1 WHERE `entry` = ? ";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement updateAdminEvent = connection.prepareStatement("UPDATE dyn_admin_log SET `SentFlag` = 1 WHERE `entry` = ? ")) {
PreparedStatement updateAdminEvent = connection.prepareCall(queryString);
updateAdminEvent.setInt(1, adminEvent); updateAdminEvent.setInt(1, adminEvent);
updateAdminEvent.executeUpdate(); updateAdminEvent.executeUpdate();
updateAdminEvent.close();
return;
} catch (SQLException e) { } catch (SQLException e) {
Logger.error(e.toString()); Logger.error(e.toString());
online = false; online = false;
return;
} }
} }
@ -283,14 +260,11 @@ public class Database {
public HashMap<Integer, String> getAdminEvents() { public HashMap<Integer, String> getAdminEvents() {
HashMap<Integer, String> outMap = new HashMap<>(); HashMap<Integer, String> outMap = new HashMap<>();
String queryString = "SELECT * from dyn_admin_log where `SentFlag` = 0";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement adminLogQuery = connection.prepareStatement("SELECT * from dyn_admin_log where `SentFlag` = 0")) {
// Discord Admin Log lookup of unreported events
PreparedStatement adminLogQuery = connection.prepareStatement(queryString);
ResultSet rs = adminLogQuery.executeQuery(); ResultSet rs = adminLogQuery.executeQuery();
String workString; String workString;
@ -311,14 +285,10 @@ public class Database {
public String getTrashFile() { public String getTrashFile() {
String outString = "machineID : count\n"; String outString = "machineID : count\n";
String queryString = "SELECT * FROM dyn_trash;";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement trashQuery = connection.prepareStatement("SELECT * FROM dyn_trash;")) {
// Discord account name based lookup
PreparedStatement trashQuery = connection.prepareStatement(queryString);
ResultSet rs = trashQuery.executeQuery(); ResultSet rs = trashQuery.executeQuery();
@ -346,14 +316,10 @@ public class Database {
else else
searchString = accountName + "%#%"; searchString = accountName + "%#%";
queryString = "SELECT * FROM obj_account where `acct_uname` LIKE ?";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement nameQuery = connection.prepareStatement("SELECT * FROM obj_account where `acct_uname` LIKE ?")) {
// Discord account name based lookup
PreparedStatement nameQuery = connection.prepareStatement(queryString);
nameQuery.setString(1, searchString); nameQuery.setString(1, searchString);
ResultSet rs = nameQuery.executeQuery(); ResultSet rs = nameQuery.executeQuery();
@ -389,15 +355,14 @@ public class Database {
return discordAccounts; return discordAccounts;
} }
public String getPopulationSTring() { public String getPopulationString() {
String popString = ""; String popString = "";
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement getPopString = connection.prepareStatement("CALL GET_POPULATION_STRING()");) {
// Discord account name based lookup
CallableStatement getPopString = connection.prepareCall("CALL GET_POPULATION_STRING()");
ResultSet rs = getPopString.executeQuery(); ResultSet rs = getPopString.executeQuery();
if (rs.next()) if (rs.next())
@ -414,11 +379,9 @@ public class Database {
public void invalidateLoginCache(String discordAccountID) { public void invalidateLoginCache(String discordAccountID) {
try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(), try (Connection connection = DriverManager.getConnection(sqlURI, ConfigManager.MB_DATABASE_USER.getValue(),
ConfigManager.MB_DATABASE_PASS.getValue())) { ConfigManager.MB_DATABASE_PASS.getValue());
PreparedStatement invalidateAccounts = connection.prepareStatement("INSERT IGNORE INTO login_cachelist (`UID`) SELECT `UID` from `obj_account` WHERE `discordAccount` = ?")) {
String queryString = "INSERT IGNORE INTO login_cachelist (`UID`) SELECT `UID` from `obj_account` WHERE `discordAccount` = ?";
PreparedStatement invalidateAccounts = connection.prepareStatement(queryString);
invalidateAccounts.setString(1, discordAccountID); invalidateAccounts.setString(1, discordAccountID);
invalidateAccounts.executeUpdate(); invalidateAccounts.executeUpdate();

2
src/discord/handlers/StatusRequestHandler.java

@ -29,7 +29,7 @@ public class StatusRequestHandler {
outString += "OFFLINE\n"; outString += "OFFLINE\n";
if (Database.online == true) if (Database.online == true)
outString += MagicBot.database.getPopulationSTring(); outString += MagicBot.database.getPopulationString();
else else
outString += "Database offline: no population data."; outString += "Database offline: no population data.";

122
src/engine/ai/MobileFSMManager.java

@ -8,6 +8,8 @@
package engine.ai; package engine.ai;
import engine.gameManager.SessionManager;
import engine.gameManager.ZoneManager; import engine.gameManager.ZoneManager;
import engine.objects.Mob; import engine.objects.Mob;
import engine.objects.Zone; import engine.objects.Zone;
@ -21,90 +23,84 @@ import java.time.Instant;
public class MobileFSMManager { public class MobileFSMManager {
private static final MobileFSMManager INSTANCE = new MobileFSMManager(); private static final MobileFSMManager INSTANCE = new MobileFSMManager();
public static Duration executionTime = Duration.ofNanos(1);
private volatile boolean alive; public static Duration executionMax = Duration.ofNanos(1);
private long timeOfKill = -1; private volatile boolean alive;
private long timeOfKill = -1;
public static Duration executionTime = Duration.ofNanos(1);
public static Duration executionMax = Duration.ofNanos(1);
private MobileFSMManager() {
Runnable worker = new Runnable() { private MobileFSMManager() {
@Override
public void run() {
execution();
}
};
alive = true; Runnable worker = new Runnable() {
@Override
public void run() {
execution();
}
};
Thread t = new Thread(worker, "MobileFSMManager"); alive = true;
t.start();
}
public static MobileFSMManager getInstance() { Thread t = new Thread(worker, "MobileFSMManager");
return INSTANCE; t.start();
} }
/** public static MobileFSMManager getInstance() {
* Stops the MobileFSMManager return INSTANCE;
*/ }
public void shutdown() {
if (alive) {
alive = false;
timeOfKill = System.currentTimeMillis();
}
}
/**
* Stops the MobileFSMManager
*/
public void shutdown() {
if (alive) {
alive = false;
timeOfKill = System.currentTimeMillis();
}
}
public long getTimeOfKill() {
return this.timeOfKill;
}
public boolean isAlive() { public boolean isAlive() {
return this.alive; return this.alive;
} }
private void execution() { private void execution() {
//Load zone threshold once. //Load zone threshold once.
long mobPulse = System.currentTimeMillis() + MBServerStatics.AI_PULSE_MOB_THRESHOLD; long mobPulse = System.currentTimeMillis() + MBServerStatics.AI_PULSE_MOB_THRESHOLD;
Instant startTime; Instant startTime;
while (alive) { while (alive) {
ThreadUtils.sleep(1); ThreadUtils.sleep(1);
if (System.currentTimeMillis() > mobPulse) { if (System.currentTimeMillis() > mobPulse) {
startTime = Instant.now(); startTime = Instant.now();
for (Zone zone : ZoneManager.getAllZones()) { for (Zone zone : ZoneManager.getAllZones()) {
for (Mob mob : zone.zoneMobSet) { for (Mob mob : zone.zoneMobSet) {
try { try {
if (mob != null) if (mob != null && SessionManager.getActivePlayerCharacterCount() > 0)
MobileFSM.DetermineAction(mob); MobileFSM.DetermineAction(mob);
} catch (Exception e) { } catch (Exception e) {
Logger.error("Mob: " + mob.getName() + " UUID: " + mob.getObjectUUID() + " ERROR: " + e); Logger.error("Mob: " + mob.getName() + " UUID: " + mob.getObjectUUID() + " ERROR: " + e);
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
this.executionTime = Duration.between(startTime, Instant.now()); executionTime = Duration.between(startTime, Instant.now());
if (executionTime.compareTo(executionMax) > 0) if (executionTime.compareTo(executionMax) > 0)
executionMax = executionTime; executionMax = executionTime;
mobPulse = System.currentTimeMillis() + MBServerStatics.AI_PULSE_MOB_THRESHOLD; mobPulse = System.currentTimeMillis() + MBServerStatics.AI_PULSE_MOB_THRESHOLD;
} }
} }
} }
} }

951
src/engine/ai/utilities/CombatUtilities.java

@ -7,7 +7,6 @@
// www.magicbane.com // www.magicbane.com
package engine.ai.utilities; package engine.ai.utilities;
import engine.Enum.*; import engine.Enum.*;
@ -27,478 +26,482 @@ import static java.lang.Math.pow;
public class CombatUtilities { public class CombatUtilities {
public static boolean inRangeToAttack(Mob agent,AbstractWorldObject target){ public static boolean inRangeToAttack(Mob agent, AbstractWorldObject target) {
if (Float.isNaN(agent.getLoc().x)) if (Float.isNaN(agent.getLoc().x))
return false; return false;
try{ try {
Vector3fImmutable sl = agent.getLoc(); Vector3fImmutable sl = agent.getLoc();
Vector3fImmutable tl = target.getLoc(); Vector3fImmutable tl = target.getLoc();
//add Hitbox's to range.
float range = agent.getRange();
range += CombatManager.calcHitBox(target) + CombatManager.calcHitBox(agent);
return !(sl.distanceSquared(tl) > sqr(range));
} catch (Exception e) {
Logger.error(e.toString());
return false;
}
}
public static boolean inRange2D(AbstractWorldObject entity1, AbstractWorldObject entity2, double range) {
return entity1.getLoc().distance2D(entity2.getLoc()) < range;
}
public static void swingIsBlock(Mob agent, AbstractWorldObject target, int animation) {
if (!target.isAlive())
return;
TargetedActionMsg msg = new TargetedActionMsg(agent, animation, target, MBServerStatics.COMBAT_SEND_BLOCK);
if (target.getObjectType() == GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
else
DispatchMessage.sendToAllInRange(agent, msg);
}
public static void swingIsParry(Mob agent, AbstractWorldObject target, int animation) {
if (!target.isAlive())
return;
TargetedActionMsg msg = new TargetedActionMsg(agent, animation, target, MBServerStatics.COMBAT_SEND_PARRY);
if (target.getObjectType() == GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
else
DispatchMessage.sendToAllInRange(agent, msg);
}
public static void swingIsDodge(Mob agent, AbstractWorldObject target, int animation) {
if (!target.isAlive())
return;
TargetedActionMsg msg = new TargetedActionMsg(agent, animation, target, MBServerStatics.COMBAT_SEND_DODGE);
if (target.getObjectType() == GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
else
DispatchMessage.sendToAllInRange(agent, msg);
}
public static void swingIsDamage(Mob agent, AbstractWorldObject target, float damage, int animation) {
if (agent.isSiege() == true) {
damage = ThreadLocalRandom.current().nextInt(1000) + 1500;
}
float trueDamage = damage;
if (!target.isAlive())
return;
if (AbstractWorldObject.IsAbstractCharacter(target))
trueDamage = ((AbstractCharacter) target).modifyHealth(-damage, agent, false);
else if (target.getObjectType() == GameObjectType.Building)
trueDamage = ((Building) target).modifyHealth(-damage, agent);
//Don't send 0 damage kay thanx.
if (trueDamage == 0)
return;
TargetedActionMsg msg = new TargetedActionMsg(agent, target, damage, animation);
if (target.getObjectType() == GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
else
DispatchMessage.sendToAllInRange(agent, msg);
//check damage shields
if (AbstractWorldObject.IsAbstractCharacter(target) && target.isAlive() && target.getObjectType() != GameObjectType.Mob)
CombatManager.handleDamageShields(agent, (AbstractCharacter) target, damage);
}
public static boolean canSwing(Mob agent) {
return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, SourceType.None));
}
public static void swingIsMiss(Mob agent, AbstractWorldObject target, int animation) {
TargetedActionMsg msg = new TargetedActionMsg(agent, target, 0f, animation);
if (target.getObjectType() == GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
else
DispatchMessage.sendToAllInRange(agent, msg);
}
public static boolean triggerDefense(Mob agent, AbstractWorldObject target) {
int defenseScore = 0;
int attackScore = agent.getAtrHandOne();
switch (target.getObjectType()) {
case PlayerCharacter:
defenseScore = ((AbstractCharacter) target).getDefenseRating();
break;
case Mob:
Mob mob = (Mob) target;
if (mob.isSiege())
defenseScore = attackScore;
break;
case Building:
return false;
}
int hitChance;
if (attackScore > defenseScore || defenseScore == 0)
hitChance = 94;
else if (attackScore == defenseScore && target.getObjectType() == GameObjectType.Mob)
hitChance = 10;
else {
float dif = attackScore / defenseScore;
if (dif <= 0.8f)
hitChance = 4;
else
hitChance = ((int) (450 * (dif - 0.8f)) + 4);
if (target.getObjectType() == GameObjectType.Building)
hitChance = 100;
}
return ThreadLocalRandom.current().nextInt(100) > hitChance;
}
public static boolean triggerBlock(Mob agent, AbstractWorldObject ac) {
return triggerPassive(agent, ac, "Block");
}
public static boolean triggerParry(Mob agent, AbstractWorldObject ac) {
return triggerPassive(agent, ac, "Parry");
}
public static boolean triggerDodge(Mob agent, AbstractWorldObject ac) {
return triggerPassive(agent, ac, "Dodge");
}
public static boolean triggerPassive(Mob agent, AbstractWorldObject ac, String type) {
float chance = 0;
if (AbstractWorldObject.IsAbstractCharacter(ac))
chance = ((AbstractCharacter) ac).getPassiveChance(type, agent.getLevel(), true);
if (chance > 75f)
chance = 75f;
if (agent.isSiege() && AbstractWorldObject.IsAbstractCharacter(ac))
chance = 100;
return ThreadLocalRandom.current().nextInt(100) < chance;
}
public static void combatCycle(Mob agent, AbstractWorldObject target, boolean mainHand, ItemBase wb) {
if (!agent.isAlive() || !target.isAlive())
return;
if (target.getObjectType() == GameObjectType.PlayerCharacter)
if (!((PlayerCharacter) target).isActive())
return;
int anim = 75;
float speed;
if (mainHand)
speed = agent.getSpeedHandOne();
else
speed = agent.getSpeedHandTwo();
DamageType dt = DamageType.Crush;
if (agent.isSiege())
dt = DamageType.Siege;
if (wb != null) {
anim = CombatManager.getSwingAnimation(wb, null, mainHand);
dt = wb.getDamageType();
} else if (!mainHand)
return;
Resists res = null;
PlayerBonuses bonus = null;
switch (target.getObjectType()) {
case Building:
res = ((Building) target).getResists();
break;
case PlayerCharacter:
res = ((PlayerCharacter) target).getResists();
bonus = ((PlayerCharacter) target).getBonuses();
break;
case Mob:
Mob mob = (Mob) target;
res = mob.getResists();
bonus = ((Mob) target).getBonuses();
break;
}
//must not be immune to all or immune to attack
if (bonus != null && !bonus.getBool(ModType.NoMod, SourceType.ImmuneToAttack))
if (res != null && (res.immuneToAll() || res.immuneToAttacks() || res.immuneTo(dt)))
return;
int passiveAnim = CombatManager.getSwingAnimation(wb, null, mainHand);
if (canSwing(agent)) {
if (triggerDefense(agent, target)) {
swingIsMiss(agent, target, passiveAnim);
return;
} else if (triggerDodge(agent, target)) {
swingIsDodge(agent, target, passiveAnim);
return;
} else if (triggerParry(agent, target)) {
swingIsParry(agent, target, passiveAnim);
return;
} else if (triggerBlock(agent, target)) {
swingIsBlock(agent, target, passiveAnim);
return;
}
if (agent.getEquip().get(1) != null && agent.getEquip().get(2) != null && agent.getEquip().get(2).getItemBase().isShield() == false) {
//mob is duel wielding and should conduct an attack for each hand
ItemBase weapon1 = agent.getEquip().get(1).getItemBase();
double range1 = getMaxDmg(weapon1.getMinDamage(), agent, weapon1) - getMinDmg(weapon1.getMinDamage(), agent, weapon1);
double damage1 = getMinDmg(weapon1.getMinDamage(), agent, weapon1) + ((ThreadLocalRandom.current().nextFloat() * range1) + (ThreadLocalRandom.current().nextFloat() * range1)) / 2;
swingIsDamage(agent, target, (float) damage1, CombatManager.getSwingAnimation(weapon1, null, true));
ItemBase weapon2 = agent.getEquip().get(2).getItemBase();
double range2 = getMaxDmg(weapon2.getMinDamage(), agent, weapon2) - getMinDmg(weapon2.getMinDamage(), agent, weapon2);
double damage2 = getMinDmg(weapon2.getMinDamage(), agent, weapon2) + ((ThreadLocalRandom.current().nextFloat() * range2) + (ThreadLocalRandom.current().nextFloat() * range2)) / 2;
swingIsDamage(agent, target, (float) damage2, CombatManager.getSwingAnimation(weapon1, null, false));
} else {
swingIsDamage(agent, target, determineDamage(agent), anim);
}
if (agent.getWeaponPower() != null)
agent.getWeaponPower().attack(target, MBServerStatics.ONE_MINUTE);
}
if (target.getObjectType().equals(GameObjectType.PlayerCharacter)) {
PlayerCharacter player = (PlayerCharacter) target;
if (player.getDebug(64))
ChatManager.chatSayInfo(player, "Debug Combat: Mob UUID " + agent.getObjectUUID() + " || Building ID = " + agent.getBuildingID() + " || Floor = " + agent.getInFloorID() + " || Level = " + agent.getInBuilding());//combat debug
}
//SIEGE MONSTERS DO NOT ATTACK GUARDSs
if (target.getObjectType() == GameObjectType.Mob)
if (((Mob) target).isSiege())
return;
//handle the retaliate
if (AbstractWorldObject.IsAbstractCharacter(target))
CombatManager.handleRetaliate((AbstractCharacter) target, agent);
if (target.getObjectType() == GameObjectType.Mob) {
Mob targetMob = (Mob) target;
if (targetMob.isSiege())
return;
}
}
public static float determineDamage(Mob agent) {
//early exit for null
if (agent == null)
return 0;
AbstractWorldObject target = agent.getCombatTarget();
if (target == null)
return 0;
float damage = 0;
DamageType dt = getDamageType(agent);
if (agent.isSummonedPet() == true || agent.isPet() == true || agent.isNecroPet() == true) {
damage = calculatePetDamage(agent);
} else if (agent.isPlayerGuard() == true) {
//damage = calculateGuardDamage(agent);
damage = calculateMobDamage(agent);
} else if (agent.getLevel() > 80) {
damage = calculateEpicDamage(agent);
} else {
damage = calculateMobDamage(agent);
}
if (AbstractWorldObject.IsAbstractCharacter(target)) {
if (((AbstractCharacter) target).isSit()) {
damage *= 2.5f; //increase damage if sitting
}
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, damage, 0));
}
if (target.getObjectType() == GameObjectType.Building) {
Building building = (Building) target;
Resists resists = building.getResists();
return (int) ((damage * (1 - (resists.getResist(dt, 0) / 100))));
}
return damage;
}
public static DamageType getDamageType(Mob agent) {
DamageType dt = DamageType.Crush;
if (agent.getEquip().get(1) != null) {
return agent.getEquip().get(1).getItemBase().getDamageType();
}
if (agent.getEquip().get(2) != null && agent.getEquip().get(2).getItemBase().isShield() == false) {
return agent.getEquip().get(2).getItemBase().getDamageType();
}
return dt;
}
public static int calculatePetDamage(Mob agent) {
//damage calc for pet
float range;
float damage;
float min = 40;
float max = 60;
AbstractWorldObject target = agent.getCombatTarget();
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
double minDmg = getMinDmg(min, agent, null);
double maxDmg = getMaxDmg(max, agent, null);
dmgMultiplier += agent.getLevel() / 10;
range = (float) (maxDmg - minDmg);
damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
return (int) (damage * dmgMultiplier);
}
public static int calculateGuardDamage(Mob agent) {
//damage calc for guard
ItemBase weapon = agent.getEquip().get(1).getItemBase();
AbstractWorldObject target = agent.getCombatTarget();
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
double minDmg = weapon.getMinDamage();
double maxDmg = weapon.getMaxDamage();
double min = getMinDmg(minDmg, agent, weapon);
double max = getMaxDmg(maxDmg, agent, weapon);
DamageType dt = weapon.getDamageType();
double range = max - min;
double damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
if (AbstractWorldObject.IsAbstractCharacter(target))
if (((AbstractCharacter) target).isSit())
damage *= 2.5f; //increase damage if sitting
if (AbstractWorldObject.IsAbstractCharacter(target))
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, (float) damage, 0) * dmgMultiplier);
return 0;
}
public static int calculateEpicDamage(Mob agent) {
//handle r8 mob damage
DamageType dt = DamageType.Crush;
AbstractWorldObject target = agent.getCombatTarget();
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
if (agent.getEquip().get(1).getItemBase() != null) {
dt = agent.getEquip().get(1).getItemBase().getDamageType();
} else if (agent.getEquip().get(2).getItemBase() != null && agent.getEquip().get(2).getItemBase().isShield() == false) {
dt = agent.getEquip().get(2).getItemBase().getDamageType();
}
double min = agent.getMobBase().getMinDmg();
double max = agent.getMobBase().getMaxDmg();
double range = max - min;
double damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, (float) damage, 0) * dmgMultiplier);
}
public static int calculateMobDamage(Mob agent) {
ItemBase weapon = null;
double minDmg;
double maxDmg;
DamageType dt;
//main hand or offhand damage
if (agent.getEquip().get(1) != null)
weapon = agent.getEquip().get(1).getItemBase();
else if (agent.getEquip().get(2) != null)
weapon = agent.getEquip().get(2).getItemBase();
if (weapon != null) {
minDmg = getMinDmg(weapon.getMinDamage(), agent, weapon);
maxDmg = getMaxDmg(weapon.getMaxDamage(), agent, weapon);
dt = weapon.getDamageType();
} else {
minDmg = agent.getMobBase().getDamageMin();
maxDmg = agent.getMobBase().getDamageMax();
dt = DamageType.Crush;
}
AbstractWorldObject target = agent.getCombatTarget();
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
double range = maxDmg - minDmg;
double damage = minDmg + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
if (AbstractWorldObject.IsAbstractCharacter(target))
if (((AbstractCharacter) target).isSit())
damage *= 2.5f; //increase damage if sitting
if (AbstractWorldObject.IsAbstractCharacter(target))
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, (float) damage, 0) * dmgMultiplier);
return 0;
}
public static double getMinDmg(double min, Mob agent, ItemBase weapon) {
int primary = agent.getStatStrCurrent();
int secondary = agent.getStatDexCurrent();
int focusLevel = 0;
int masteryLevel = 0;
if (weapon != null) {
if (weapon.isStrBased() == true) {
primary = agent.getStatStrCurrent();
secondary = agent.getStatDexCurrent();
} else {
primary = agent.getStatDexCurrent();
secondary = agent.getStatStrCurrent();
if (agent.getSkills().containsKey(weapon.getSkillRequired())) {
focusLevel = (int) agent.getSkills().get(weapon.getSkillRequired()).getModifiedAmount();
}
if (agent.getSkills().containsKey(weapon.getMastery())) {
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
}
}
}
return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel));
}
public static double getMaxDmg(double max, Mob agent, ItemBase weapon) {
int primary = agent.getStatStrCurrent();
int secondary = agent.getStatDexCurrent();
int focusLevel = 0;
int masteryLevel = 0;
if (weapon != null) {
if (weapon.isStrBased() == true) {
primary = agent.getStatStrCurrent();
secondary = agent.getStatDexCurrent();
} else {
primary = agent.getStatDexCurrent();
secondary = agent.getStatStrCurrent();
}
if (agent.getSkills().containsKey(weapon.getSkillRequired()))
focusLevel = (int) agent.getSkills().get(weapon.getSkillRequired()).getModifiedAmount();
if (agent.getSkills().containsKey(weapon.getSkillRequired()))
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
}
return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel));
}
//add Hitbox's to range.
float range = agent.getRange();
range += CombatManager.calcHitBox(target) + CombatManager.calcHitBox(agent);
//if (target instanceof AbstractCharacter)
// if (((AbstractCharacter)target).isMoving())
// range+= 5;
return !(sl.distanceSquared(tl) > sqr(range));
}catch(Exception e){
Logger.error( e.toString());
return false;
}
}
public static boolean inRangeToAttack2D(Mob agent,AbstractWorldObject target){
if (Float.isNaN(agent.getLoc().x))
return false;
try{
Vector3fImmutable sl = agent.getLoc();
Vector3fImmutable tl = target.getLoc();
//add Hitbox's to range.
float range = agent.getRange();
range += CombatManager.calcHitBox(target) + CombatManager.calcHitBox(agent);
//if (target instanceof AbstractCharacter)
// if (((AbstractCharacter)target).isMoving())
// range+= 5;
return !(sl.distanceSquared2D(tl) > sqr(range));
}catch(Exception e){
Logger.error( e.toString());
return false;
}
}
public static boolean inRange2D(AbstractWorldObject entity1, AbstractWorldObject entity2, double range){
return entity1.getLoc().distance2D(entity2.getLoc()) < range;
}
public static void swingIsBlock(Mob agent,AbstractWorldObject target, int animation) {
if (!target.isAlive())
return;
TargetedActionMsg msg = new TargetedActionMsg(agent,animation, target, MBServerStatics.COMBAT_SEND_BLOCK);
if (target.getObjectType() == GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true,false);
else
DispatchMessage.sendToAllInRange(agent,msg);
}
public static void swingIsParry(Mob agent,AbstractWorldObject target, int animation) {
if (!target.isAlive())
return;
TargetedActionMsg msg = new TargetedActionMsg(agent,animation, target, MBServerStatics.COMBAT_SEND_PARRY);
if (target.getObjectType() == GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true,false);
else
DispatchMessage.sendToAllInRange(agent,msg);
}
public static void swingIsDodge(Mob agent,AbstractWorldObject target, int animation) {
if (!target.isAlive())
return;
TargetedActionMsg msg = new TargetedActionMsg(agent,animation, target, MBServerStatics.COMBAT_SEND_DODGE);
if (target.getObjectType() == GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true,false);
else
DispatchMessage.sendToAllInRange(agent,msg);
}
public static void swingIsDamage(Mob agent, AbstractWorldObject target, float damage, int animation){
if(agent.isSiege() == true){
damage = ThreadLocalRandom.current().nextInt(1000) + 1500;
}
float trueDamage = damage;
//target = agent.getCombatTarget();
if (!target.isAlive())
return;
if (AbstractWorldObject.IsAbstractCharacter(target))
trueDamage = ((AbstractCharacter) target).modifyHealth(-damage, agent, false);
else if (target.getObjectType() == GameObjectType.Building)
trueDamage = ((Building) target).modifyHealth(-damage, agent);
//Don't send 0 damage kay thanx.
if (trueDamage == 0)
return;
TargetedActionMsg msg = new TargetedActionMsg(agent,target, damage, animation);
if (target.getObjectType() == GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true,false);
else
DispatchMessage.sendToAllInRange(agent,msg);
//check damage shields
if(AbstractWorldObject.IsAbstractCharacter(target) && target.isAlive() && target.getObjectType() != GameObjectType.Mob)
CombatManager.handleDamageShields(agent,(AbstractCharacter)target, damage);
}
public static boolean canSwing(Mob agent) {
return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, SourceType.None));
}
public static void swingIsMiss(Mob agent,AbstractWorldObject target, int animation) {
TargetedActionMsg msg = new TargetedActionMsg(agent,target, 0f, animation);
if (target.getObjectType() == GameObjectType.PlayerCharacter)
DispatchMessage.dispatchMsgToInterestArea(target, msg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true,false);
else
DispatchMessage.sendToAllInRange(agent,msg);
}
public static boolean triggerDefense(Mob agent, AbstractWorldObject target) {
int defenseScore = 0;
int attackScore = agent.getAtrHandOne();
switch (target.getObjectType()) {
case PlayerCharacter:
defenseScore = ((AbstractCharacter) target).getDefenseRating();
break;
case Mob:
Mob mob = (Mob)target;
if (mob.isSiege())
defenseScore = attackScore;
break;
case Building:
return false;
}
int hitChance;
if (attackScore > defenseScore || defenseScore == 0)
hitChance = 94;
else if (attackScore == defenseScore && target.getObjectType() == GameObjectType.Mob)
hitChance = 10;
else {
float dif = attackScore / defenseScore;
if (dif <= 0.8f)
hitChance = 4;
else
hitChance = ((int)(450 * (dif - 0.8f)) + 4);
if (target.getObjectType() == GameObjectType.Building)
hitChance = 100;
}
return ThreadLocalRandom.current().nextInt(100) > hitChance;
}
public static boolean triggerBlock(Mob agent,AbstractWorldObject ac) {
return triggerPassive(agent,ac, "Block");
}
public static boolean triggerParry(Mob agent,AbstractWorldObject ac) {
return triggerPassive(agent,ac, "Parry");
}
public static boolean triggerDodge(Mob agent,AbstractWorldObject ac) {
return triggerPassive(agent,ac, "Dodge");
}
public static boolean triggerPassive(Mob agent,AbstractWorldObject ac, String type) {
float chance = 0;
if (AbstractWorldObject.IsAbstractCharacter(ac))
chance = ((AbstractCharacter)ac).getPassiveChance(type, agent.getLevel(), true);
if (chance > 75f)
chance = 75f;
if (agent.isSiege() && AbstractWorldObject.IsAbstractCharacter(ac))
chance = 100;
return ThreadLocalRandom.current().nextInt(100) < chance;
}
public static void combatCycle(Mob agent,AbstractWorldObject target, boolean mainHand, ItemBase wb) {
if (!agent.isAlive() || !target.isAlive()) return;
if (target.getObjectType() == GameObjectType.PlayerCharacter)
if (!((PlayerCharacter)target).isActive())
return;
int anim = 75;
float speed = 30f;
if (mainHand)
speed = agent.getSpeedHandOne();
else
speed = agent.getSpeedHandTwo();
DamageType dt = DamageType.Crush;
if (agent.isSiege())
dt = DamageType.Siege;
if (wb != null) {
anim = CombatManager.getSwingAnimation(wb, null,mainHand);
dt = wb.getDamageType();
} else if (!mainHand)
return;
Resists res = null;
PlayerBonuses bonus = null;
switch(target.getObjectType()){
case Building:
res = ((Building)target).getResists();
break;
case PlayerCharacter:
res = ((PlayerCharacter)target).getResists();
bonus = ((PlayerCharacter)target).getBonuses();
break;
case Mob:
Mob mob = (Mob)target;
res = mob.getResists();
bonus = ((Mob)target).getBonuses();
break;
}
//must not be immune to all or immune to attack
if (bonus != null && !bonus.getBool(ModType.NoMod, SourceType.ImmuneToAttack))
if (res != null &&(res.immuneToAll() || res.immuneToAttacks() || res.immuneTo(dt)))
return;
int passiveAnim = CombatManager.getSwingAnimation(wb, null,mainHand);
if(canSwing(agent)) {
if(triggerDefense(agent,target)) {
swingIsMiss(agent, target, passiveAnim);
return;
}
else if(triggerDodge(agent,target)) {
swingIsDodge(agent, target, passiveAnim);
return;
}
else if (triggerParry(agent, target)){
swingIsParry(agent, target, passiveAnim);
return;
}
else if(triggerBlock(agent,target)) {
swingIsBlock(agent, target, passiveAnim);
return;
}
if(agent.getEquip().get(1) != null && agent.getEquip().get(2) != null && agent.getEquip().get(2).getItemBase().isShield() == false){
//mob is duel wielding and should conduct an attack for each hand
ItemBase weapon1 = agent.getEquip().get(1).getItemBase();
double range1 = getMaxDmg(weapon1.getMinDamage(),agent,weapon1) - getMinDmg(weapon1.getMinDamage(),agent,weapon1);
double damage1 = getMinDmg(weapon1.getMinDamage(),agent,weapon1) + ((ThreadLocalRandom.current().nextFloat() * range1) + (ThreadLocalRandom.current().nextFloat() * range1)) / 2;
swingIsDamage(agent,target, (float) damage1, CombatManager.getSwingAnimation(weapon1, null,true));
ItemBase weapon2 = agent.getEquip().get(2).getItemBase();
double range2 = getMaxDmg(weapon2.getMinDamage(),agent,weapon2) - getMinDmg(weapon2.getMinDamage(),agent,weapon2);
double damage2 = getMinDmg(weapon2.getMinDamage(),agent,weapon2) + ((ThreadLocalRandom.current().nextFloat() * range2) + (ThreadLocalRandom.current().nextFloat() * range2)) / 2;
swingIsDamage(agent,target, (float) damage2, CombatManager.getSwingAnimation(weapon1, null,false));
} else{
swingIsDamage(agent,target, determineDamage(agent), anim);
}
if (agent.getWeaponPower() != null)
agent.getWeaponPower().attack(target, MBServerStatics.ONE_MINUTE);
}
if (target.getObjectType().equals(GameObjectType.PlayerCharacter)){
PlayerCharacter player = (PlayerCharacter)target;
if (player.getDebug(64)){
ChatManager.chatSayInfo(player, "Debug Combat: Mob UUID " + agent.getObjectUUID() + " || Building ID = " + agent.getBuildingID() + " || Floor = " + agent.getInFloorID() + " || Level = " + agent.getInBuilding() );//combat debug
}
}
//SIEGE MONSTERS DO NOT ATTACK GUARDSs
if (target.getObjectType() == GameObjectType.Mob)
if (((Mob)target).isSiege())
return;
//handle the retaliate
if (AbstractWorldObject.IsAbstractCharacter(target))
CombatManager.handleRetaliate((AbstractCharacter)target, agent);
if (target.getObjectType() == GameObjectType.Mob){
Mob targetMob = (Mob)target;
if (targetMob.isSiege())
return;
}
}
public static float determineDamage(Mob agent) {
if(agent == null){
//early exit for null
return 0;
}
AbstractWorldObject target = agent.getCombatTarget();
if(target == null){
//early exit for null target
return 0;
}
float damage = 0;
DamageType dt = getDamageType(agent);
if(agent.isSummonedPet() == true || agent.isPet() == true || agent.isNecroPet() == true) {
damage = calculatePetDamage(agent);
}else if(agent.isPlayerGuard() == true){
damage = calculateGuardDamage(agent);
}else if (agent.getLevel() > 80) {
damage = calculateEpicDamage(agent);
} else{
damage = calculateMobDamage(agent);
}
if (AbstractWorldObject.IsAbstractCharacter(target)) {
if (((AbstractCharacter) target).isSit()) {
damage *= 2.5f; //increase damage if sitting
}
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, damage, 0));
}
if (target.getObjectType() == GameObjectType.Building) {
Building building = (Building) target;
Resists resists = building.getResists();
return (int) ((damage * (1 - (resists.getResist(dt, 0) / 100))));
}
return damage;
}
public static DamageType getDamageType(Mob agent){
DamageType dt = DamageType.Crush;
if(agent.getEquip().get(1) != null ){
return agent.getEquip().get(1).getItemBase().getDamageType();
}
if(agent.getEquip().get(2) != null && agent.getEquip().get(2).getItemBase().isShield() == false){
return agent.getEquip().get(2).getItemBase().getDamageType();
}
return dt;
}
public static int calculatePetDamage(Mob agent) {
//damage calc for pet
float range;
float damage;
float min = 40;
float max = 60;
AbstractWorldObject target = agent.getCombatTarget();
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
float str = agent.getStatStrCurrent();
float dex = agent.getStatDexCurrent();
double minDmg = getMinDmg(min,agent, null);
double maxDmg = getMaxDmg(max,agent, null);
dmgMultiplier += agent.getLevel() / 10;
range = (float) (maxDmg - minDmg);
damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
return (int) (damage * dmgMultiplier);
}
public static int calculateGuardDamage(Mob agent){
//damage calc for guard
ItemBase weapon = agent.getEquip().get(1).getItemBase();
AbstractWorldObject target = agent.getCombatTarget();
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
double minDmg = weapon.getMinDamage();
double maxDmg = weapon.getMaxDamage();
float str = agent.getStatStrCurrent();
float dex = agent.getStatDexCurrent();
double min = getMinDmg(minDmg,agent, weapon);
double max = getMaxDmg(maxDmg,agent, weapon);
DamageType dt = weapon.getDamageType();
double range = max - min;
double damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
if (AbstractWorldObject.IsAbstractCharacter(target))
if (((AbstractCharacter) target).isSit())
damage *= 2.5f; //increase damage if sitting
if (AbstractWorldObject.IsAbstractCharacter(target))
return (int) (((AbstractCharacter) target).getResists().getResistedDamage((AbstractCharacter) agent, (AbstractCharacter) target, dt, (float) damage, 0) * dmgMultiplier);
return 0;
}
public static int calculateEpicDamage(Mob agent){
//handle r8 mob damage
DamageType dt = DamageType.Crush;
AbstractWorldObject target = agent.getCombatTarget();
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
if (agent.getEquip().get(1).getItemBase() != null) {
dt = agent.getEquip().get(1).getItemBase().getDamageType();
} else if(agent.getEquip().get(2).getItemBase() != null && agent.getEquip().get(2).getItemBase().isShield() == false){
dt = agent.getEquip().get(2).getItemBase().getDamageType();
}
double min = agent.getMobBase().getMinDmg();
double max = agent.getMobBase().getMaxDmg();
double range = max - min;
double damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
return (int) (((AbstractCharacter) target).getResists().getResistedDamage((AbstractCharacter) agent, (AbstractCharacter) target, dt, (float) damage, 0) * dmgMultiplier);
}
public static int calculateMobDamage(Mob agent){
ItemBase weapon = null;
double minDmg;
double maxDmg;
DamageType dt;
if(agent.getEquip().get(1) != null){
//mainhand damage
weapon = agent.getEquip().get(1).getItemBase();
} else if(agent.getEquip().get(2) != null){
//offhand damage
weapon = agent.getEquip().get(2).getItemBase();
}
if(weapon != null){
minDmg = getMinDmg(weapon.getMinDamage(),agent,weapon);
maxDmg = getMaxDmg(weapon.getMaxDamage(),agent, weapon);
dt = weapon.getDamageType();
}else{
minDmg = agent.getMobBase().getDamageMin();
maxDmg = agent.getMobBase().getDamageMax();
dt = DamageType.Crush;
}
AbstractWorldObject target = agent.getCombatTarget();
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
double range = maxDmg - minDmg;
double damage = minDmg + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
if (AbstractWorldObject.IsAbstractCharacter(target))
if (((AbstractCharacter) target).isSit())
damage *= 2.5f; //increase damage if sitting
if (AbstractWorldObject.IsAbstractCharacter(target))
return (int) (((AbstractCharacter) target).getResists().getResistedDamage((AbstractCharacter) agent, (AbstractCharacter) target, dt, (float) damage, 0) * dmgMultiplier);
return 0;
}
public static double getMinDmg(double min, Mob agent, ItemBase weapon){
int primary = agent.getStatStrCurrent();
int secondary = agent.getStatDexCurrent();
int focusLevel = 0;
int masteryLevel = 0;
if(weapon != null) {
if (weapon.isStrBased() == true) {
primary = agent.getStatStrCurrent();
secondary = agent.getStatDexCurrent();
} else {
primary = agent.getStatDexCurrent();
secondary = agent.getStatStrCurrent();
if (agent.getSkills().containsKey(weapon.getSkillRequired())) {
focusLevel = (int) agent.getSkills().get(weapon.getSkillRequired()).getModifiedAmount();
}
if (agent.getSkills().containsKey(weapon.getMastery())) {
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
}
}
}
return min * (pow(0.0048*primary +.049*(primary-0.75),0.5) + pow(0.0066*secondary + 0.064*(secondary-0.75),0.5) + + 0.01*(focusLevel + masteryLevel));
}
public static double getMaxDmg(double max, Mob agent, ItemBase weapon){
int primary = agent.getStatStrCurrent();
int secondary = agent.getStatDexCurrent();
int focusLevel = 0;
int masteryLevel = 0;
if (weapon != null) {
if(weapon.isStrBased() == true){
primary = agent.getStatStrCurrent();
secondary = agent.getStatDexCurrent();
}
else{
primary = agent.getStatDexCurrent();
secondary = agent.getStatStrCurrent();
}
if(agent.getSkills().containsKey(weapon.getSkillRequired())) {
focusLevel = (int) agent.getSkills().get(weapon.getSkillRequired()).getModifiedAmount();
}
if(agent.getSkills().containsKey(weapon.getSkillRequired())) {
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
}
}
return max * (pow(0.0124*primary + 0.118*(primary -0.75),0.5) + pow(0.0022*secondary + 0.028*(secondary-0.75),0.5) + 0.0075*(focusLevel + masteryLevel));
}
public static boolean RunAIRandom(){
int random = ThreadLocalRandom.current().nextInt(4);
return random == 0;
}
} }

316
src/engine/ai/utilities/MovementUtilities.java

@ -7,7 +7,6 @@
// www.magicbane.com // www.magicbane.com
package engine.ai.utilities; package engine.ai.utilities;
import engine.Enum; import engine.Enum;
@ -30,179 +29,176 @@ import static engine.math.FastMath.sqrt;
public class MovementUtilities { public class MovementUtilities {
public static boolean inRangeOfBindLocation(Mob agent){ public static boolean inRangeOfBindLocation(Mob agent) {
if (agent.isPlayerGuard()){ if (agent.isPlayerGuard()) {
Mob guardCaptain = null; Mob guardCaptain = null;
if (agent.getContract() != null) if (agent.getContract() != null)
guardCaptain = agent; guardCaptain = agent;
else else
guardCaptain = (Mob) agent.npcOwner; guardCaptain = (Mob) agent.npcOwner;
if (guardCaptain != null){ if (guardCaptain != null) {
Building barracks = guardCaptain.building; Building barracks = guardCaptain.building;
if (barracks != null){ if (barracks != null) {
City city = barracks.getCity(); City city = barracks.getCity();
if (city != null){ if (city != null) {
Building tol = city.getTOL(); Building tol = city.getTOL();
//Guards recall distance = 814. //Guards recall distance = 814.
if (tol != null){ if (tol != null) {
if (agent.getLoc().distanceSquared2D(tol.getLoc()) > sqr(Enum.CityBoundsType.ZONE.extents)) { return !(agent.getLoc().distanceSquared2D(tol.getLoc()) > sqr(Enum.CityBoundsType.ZONE.extents));
return false; }
}
}
} }
} }
} }
return true; return true;
} }
Vector3fImmutable sl = new Vector3fImmutable(agent.getLoc().getX(), 0, agent.getLoc().getZ()); Vector3fImmutable sl = new Vector3fImmutable(agent.getLoc().getX(), 0, agent.getLoc().getZ());
Vector3fImmutable tl = new Vector3fImmutable(agent.getTrueBindLoc().x,0,agent.getTrueBindLoc().z); Vector3fImmutable tl = new Vector3fImmutable(agent.getTrueBindLoc().x, 0, agent.getTrueBindLoc().z);
float distanceSquaredToTarget = sl.distanceSquared2D(tl); //distance to center of target float distanceSquaredToTarget = sl.distanceSquared2D(tl); //distance to center of target
float zoneRange = 250; float zoneRange = 250;
if (agent.getParentZone() != null){ if (agent.getParentZone() != null) {
if (agent.getParentZone().getBounds() != null) if (agent.getParentZone().getBounds() != null)
zoneRange = agent.getParentZone().getBounds().getHalfExtents().x * 2; zoneRange = agent.getParentZone().getBounds().getHalfExtents().x * 2;
} }
if (zoneRange > 300) if (zoneRange > 300)
zoneRange = 300; zoneRange = 300;
if (agent.getSpawnRadius() > zoneRange) if (agent.getSpawnRadius() > zoneRange)
zoneRange = agent.getSpawnRadius(); zoneRange = agent.getSpawnRadius();
return distanceSquaredToTarget < sqr(MBServerStatics.AI_DROP_AGGRO_RANGE + zoneRange); return distanceSquaredToTarget < sqr(MBServerStatics.AI_DROP_AGGRO_RANGE + zoneRange);
} }
public static boolean inRangeToAggro(Mob agent,PlayerCharacter target){ public static boolean inRangeToAggro(Mob agent, PlayerCharacter target) {
Vector3fImmutable sl = agent.getLoc(); Vector3fImmutable sl = agent.getLoc();
Vector3fImmutable tl =target.getLoc(); Vector3fImmutable tl = target.getLoc();
float distanceSquaredToTarget = sl.distanceSquared2D(tl) - sqr(agent.calcHitBox() + target.calcHitBox()); //distance to center of target float distanceSquaredToTarget = sl.distanceSquared2D(tl) - sqr(agent.calcHitBox() + target.calcHitBox()); //distance to center of target
float range = MBServerStatics.AI_BASE_AGGRO_RANGE; float range = MBServerStatics.AI_BASE_AGGRO_RANGE;
if (agent.isPlayerGuard()) if (agent.isPlayerGuard())
range = 150; range = 150;
return distanceSquaredToTarget < sqr(range); return distanceSquaredToTarget < sqr(range);
} }
public static boolean inRangeDropAggro(Mob agent,PlayerCharacter target){ public static boolean inRangeDropAggro(Mob agent, PlayerCharacter target) {
Vector3fImmutable sl = agent.getLoc(); Vector3fImmutable sl = agent.getLoc();
Vector3fImmutable tl = target.getLoc(); Vector3fImmutable tl = target.getLoc();
float distanceSquaredToTarget = sl.distanceSquared2D(tl) - sqr(agent.calcHitBox() + target.calcHitBox()); //distance to center of target float distanceSquaredToTarget = sl.distanceSquared2D(tl) - sqr(agent.calcHitBox() + target.calcHitBox()); //distance to center of target
float range = agent.getRange() + 150; float range = agent.getRange() + 150;
if (range > 200) if (range > 200)
range = 200; range = 200;
return distanceSquaredToTarget < sqr(range); return distanceSquaredToTarget < sqr(range);
} }
public static Vector3fImmutable GetMoveLocation(Mob aiAgent, AbstractCharacter aggroTarget){ public static Vector3fImmutable GetMoveLocation(Mob aiAgent, AbstractCharacter aggroTarget) {
// Player isnt moving and neither is mob. Just return // Player isnt moving and neither is mob. Just return
// the mobile's current location. Ain't goin nowhere! // the mobile's current location. Ain't goin nowhere!
// *** Refactor: Check to ensure methods calling us // *** Refactor: Check to ensure methods calling us
// all don't sent move messages when not moving. // all don't sent move messages when not moving.
if ((aggroTarget.isMoving() == false)) if ((aggroTarget.isMoving() == false))
return aggroTarget.getLoc(); return aggroTarget.getLoc();
if (aggroTarget.getEndLoc().x != 0){ if (aggroTarget.getEndLoc().x != 0) {
float aggroTargetDistanceSquared = aggroTarget.getLoc().distanceSquared2D(aggroTarget.getEndLoc()); float aggroTargetDistanceSquared = aggroTarget.getLoc().distanceSquared2D(aggroTarget.getEndLoc());
float aiAgentDistanceSquared = aiAgent.getLoc().distanceSquared2D(aggroTarget.getEndLoc()); float aiAgentDistanceSquared = aiAgent.getLoc().distanceSquared2D(aggroTarget.getEndLoc());
if (aiAgentDistanceSquared >= aggroTargetDistanceSquared) if (aiAgentDistanceSquared >= aggroTargetDistanceSquared)
return aggroTarget.getEndLoc(); return aggroTarget.getEndLoc();
else{ else {
float distanceToMove = sqrt(aggroTargetDistanceSquared + aiAgentDistanceSquared) *.5f; float distanceToMove = sqrt(aggroTargetDistanceSquared + aiAgentDistanceSquared) * .5f;
return aggroTarget.getFaceDir().scaleAdd(distanceToMove, aggroTarget.getLoc()); return aggroTarget.getFaceDir().scaleAdd(distanceToMove, aggroTarget.getLoc());
} }
} }
// One of us is moving so let's calculate our destination loc for this // One of us is moving so let's calculate our destination loc for this
// simulation frame. We will simply project our position onto the // simulation frame. We will simply project our position onto the
// character's movement vector and return the closest point. // character's movement vector and return the closest point.
return aiAgent.getLoc().ClosestPointOnLine(aggroTarget.getLoc(), aggroTarget.getEndLoc()); return aiAgent.getLoc().ClosestPointOnLine(aggroTarget.getLoc(), aggroTarget.getEndLoc());
} }
public static void moveToLocation(Mob agent,Vector3fImmutable newLocation, float offset){ public static void moveToLocation(Mob agent, Vector3fImmutable newLocation, float offset) {
try { try {
//don't move farther than 30 units from player. //don't move farther than 30 units from player.
if (offset > 30) if (offset > 30)
offset = 30; offset = 30;
Vector3fImmutable newLoc = Vector3fImmutable.getRandomPointInCircle(newLocation, offset); Vector3fImmutable newLoc = Vector3fImmutable.getRandomPointInCircle(newLocation, offset);
agent.setFaceDir(newLoc.subtract2D(agent.getLoc()).normalize()); agent.setFaceDir(newLoc.subtract2D(agent.getLoc()).normalize());
aiMove(agent,newLoc,false); aiMove(agent, newLoc, false);
} catch (Exception e) { } catch (Exception e) {
Logger.error( e.toString()); Logger.error(e.toString());
} }
} }
public static boolean canMove(Mob agent) {
if (agent.getMobBase() != null && Enum.MobFlagType.SENTINEL.elementOf(agent.getMobBase().getFlags()))
return false;
public static boolean canMove(Mob agent) { return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, SourceType.None) && !agent.getBonuses().getBool(ModType.CannotMove, SourceType.None));
if (agent.getMobBase() != null && Enum.MobFlagType.SENTINEL.elementOf(agent.getMobBase().getFlags())) }
return false;
return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned,SourceType.None) && !agent.getBonuses().getBool(ModType.CannotMove, SourceType.None)); public static Vector3fImmutable randomPatrolLocation(Mob agent, Vector3fImmutable center, float radius) {
}
public static Vector3fImmutable randomPatrolLocation(Mob agent,Vector3fImmutable center, float radius){ //Determing where I want to move.
return new Vector3fImmutable((center.x - radius) + ((ThreadLocalRandom.current().nextFloat() + .1f * 2) * radius),
center.y,
(center.z - radius) + ((ThreadLocalRandom.current().nextFloat() + .1f * 2) * radius));
}
//Determing where I want to move. public static Long estimateMovementTime(Mob agent) {
return new Vector3fImmutable((center.x - radius) + ((ThreadLocalRandom.current().nextFloat()+.1f*2)*radius), if (agent.getEndLoc().x == 0 && agent.getEndLoc().y == 0)
center.y, return 0L;
(center.z - radius) + ((ThreadLocalRandom.current().nextFloat()+.1f *2)*radius));
}
public static Long estimateMovementTime(Mob agent) {
if(agent.getEndLoc().x == 0 && agent.getEndLoc().y == 0)
return 0L;
return (long) ((agent.getLoc().distance2D(agent.getEndLoc())*1000)/agent.getSpeed()); return (long) ((agent.getLoc().distance2D(agent.getEndLoc()) * 1000) / agent.getSpeed());
} }
public static void aiMove(Mob agent,Vector3fImmutable vect, boolean isWalking) { public static void aiMove(Mob agent, Vector3fImmutable vect, boolean isWalking) {
//update our walk/run state. //update our walk/run state.
if (isWalking && !agent.isWalk()){ if (isWalking && !agent.isWalk()) {
agent.setWalkMode(true); agent.setWalkMode(true);
MovementManager.sendRWSSMsg(agent); MovementManager.sendRWSSMsg(agent);
}else if(!isWalking && agent.isWalk()){ } else if (!isWalking && agent.isWalk()) {
agent.setWalkMode(false); agent.setWalkMode(false);
MovementManager.sendRWSSMsg(agent); MovementManager.sendRWSSMsg(agent);
} }
MoveToPointMsg msg = new MoveToPointMsg(); MoveToPointMsg msg = new MoveToPointMsg();
// Regions currentRegion = Mob.InsideBuildingRegion(agent); // Regions currentRegion = Mob.InsideBuildingRegion(agent);
@ -225,9 +221,8 @@ public class MovementUtilities {
// agent.setLastRegion(currentRegion); // agent.setLastRegion(currentRegion);
Vector3fImmutable startLoc = null;
Vector3fImmutable startLoc = null; Vector3fImmutable endLoc = null;
Vector3fImmutable endLoc = null;
// if (agent.getLastRegion() != null){ // if (agent.getLastRegion() != null){
// Building inBuilding = Building.getBuildingFromCache(agent.getInBuildingID()); // Building inBuilding = Building.getBuildingFromCache(agent.getInBuildingID());
@ -242,62 +237,59 @@ public class MovementUtilities {
// endLoc = vect; // endLoc = vect;
// } // }
startLoc = agent.getLoc(); startLoc = agent.getLoc();
endLoc = vect; endLoc = vect;
msg.setSourceType(GameObjectType.Mob.ordinal());
msg.setSourceID(agent.getObjectUUID());
msg.setStartCoord(startLoc);
msg.setEndCoord(endLoc);
msg.setUnknown01(-1);
msg.setInBuilding(-1);
msg.setTargetType(0);
msg.setTargetID(0);
try { msg.setSourceType(GameObjectType.Mob.ordinal());
MovementManager.movement(msg, agent); msg.setSourceID(agent.getObjectUUID());
} catch (MsgSendException e) { msg.setStartCoord(startLoc);
// TODO Figure out how we want to handle the msg send exception msg.setEndCoord(endLoc);
e.printStackTrace(); msg.setUnknown01(-1);
} msg.setInBuilding(-1);
} msg.setTargetType(0);
msg.setTargetID(0);
public static Vector3fImmutable GetDestinationToCharacter(Mob aiAgent, AbstractCharacter character){
if (!character.isMoving()) try {
return character.getLoc(); MovementManager.movement(msg, agent);
} catch (MsgSendException e) {
// TODO Figure out how we want to handle the msg send exception
e.printStackTrace();
}
}
public static Vector3fImmutable GetDestinationToCharacter(Mob aiAgent, AbstractCharacter character) {
float agentDistanceEndLoc = aiAgent.getLoc().distanceSquared2D(character.getEndLoc()); if (!character.isMoving())
float characterDistanceEndLoc = character.getLoc().distanceSquared2D(character.getEndLoc()); return character.getLoc();
if (agentDistanceEndLoc > characterDistanceEndLoc)
return character.getEndLoc();
return character.getLoc(); float agentDistanceEndLoc = aiAgent.getLoc().distanceSquared2D(character.getEndLoc());
} float characterDistanceEndLoc = character.getLoc().distanceSquared2D(character.getEndLoc());
public static boolean updateMovementToCharacter(Mob aiAgent, AbstractCharacter aggroTarget){ if (agentDistanceEndLoc > characterDistanceEndLoc)
return character.getEndLoc();
if (aiAgent.destination.equals(Vector3fImmutable.ZERO)) return character.getLoc();
return true; }
if (!aiAgent.isMoving()) public static boolean updateMovementToCharacter(Mob aiAgent, AbstractCharacter aggroTarget) {
return true;
if (aiAgent.destination.equals(Vector3fImmutable.ZERO))
return true;
if (!aiAgent.isMoving())
return true;
if (aggroTarget.isMoving()){ if (aggroTarget.isMoving()) {
if (!aiAgent.destination.equals(aggroTarget.getEndLoc()) && !aiAgent.destination.equals(aggroTarget.getLoc())) return !aiAgent.destination.equals(aggroTarget.getEndLoc()) && !aiAgent.destination.equals(aggroTarget.getLoc());
return true; } else {
}else{ if (aiAgent.destination.equals(aggroTarget.getLoc()))
if (aiAgent.destination.equals(aggroTarget.getLoc())) return false;
return false; }
}
return false; return false;
} }
} }

1
src/engine/ai/utilities/PowerUtilities.java

@ -7,7 +7,6 @@
// www.magicbane.com // www.magicbane.com
package engine.ai.utilities; package engine.ai.utilities;
public class PowerUtilities { public class PowerUtilities {

37
src/engine/db/archive/BaneRecord.java

@ -10,6 +10,7 @@
package engine.db.archive; package engine.db.archive;
import engine.Enum; import engine.Enum;
import engine.gameManager.DbManager;
import engine.objects.Bane; import engine.objects.Bane;
import engine.objects.City; import engine.objects.City;
import engine.workthreads.WarehousePushThread; import engine.workthreads.WarehousePushThread;
@ -134,9 +135,9 @@ public class BaneRecord extends DataRecord {
DateTime outDateTime = null; DateTime outDateTime = null;
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildDateTimeQueryStatement(connection, city); PreparedStatement statement = buildDateTimeQueryStatement(connection, city);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
@ -145,7 +146,7 @@ public class BaneRecord extends DataRecord {
} }
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e.toString());
} }
return outDateTime; return outDateTime;
@ -166,13 +167,13 @@ public class BaneRecord extends DataRecord {
if (bane == null) if (bane == null)
return; return;
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildUpdateLiveDateStatement(connection, bane, dateTime)) { PreparedStatement statement = buildUpdateLiveDateStatement(connection, bane, dateTime)) {
statement.execute(); statement.execute();
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e.toString());
} }
} }
@ -203,8 +204,8 @@ public class BaneRecord extends DataRecord {
public static void updateResolution(Bane bane, RecordEventType eventType) { public static void updateResolution(Bane bane, RecordEventType eventType) {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildUpdateResolutionStatement(connection, bane, eventType)) { PreparedStatement statement = buildUpdateResolutionStatement(connection, bane, eventType)) {
statement.execute(); statement.execute();
@ -223,9 +224,9 @@ public class BaneRecord extends DataRecord {
dividerString = "--------------------------------" + newLine; dividerString = "--------------------------------" + newLine;
queryString = "CALL `baneHistory`()"; queryString = "CALL `baneHistory`()";
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = connection.prepareCall(queryString); PreparedStatement statement = connection.prepareCall(queryString);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
@ -253,9 +254,9 @@ public class BaneRecord extends DataRecord {
WarehousePushThread.baneDelta = 0; WarehousePushThread.baneDelta = 0;
try (Connection localConnection = DataWarehouse.connectionPool.getConnection(); try (Connection localConnection = DbManager.getConnection();
PreparedStatement statement = localConnection.prepareStatement(queryString, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); // Make this an updatable result set as we'll reset the dirty flag as we go along PreparedStatement statement = localConnection.prepareStatement(queryString, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); // Make this an updatable result set as we'll reset the dirty flag as we go along
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
@ -338,13 +339,13 @@ public class BaneRecord extends DataRecord {
public void write() { public void write() {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildBaneInsertStatement(connection)) { PreparedStatement statement = buildBaneInsertStatement(connection)) {
statement.execute(); statement.execute();
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e.toString());
} }
} }

19
src/engine/db/archive/CharacterRecord.java

@ -10,6 +10,7 @@
package engine.db.archive; package engine.db.archive;
import engine.Enum; import engine.Enum;
import engine.gameManager.DbManager;
import engine.objects.Guild; import engine.objects.Guild;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
import engine.workthreads.WarehousePushThread; import engine.workthreads.WarehousePushThread;
@ -109,13 +110,13 @@ public class CharacterRecord extends DataRecord {
public static void advanceKillCounter(PlayerCharacter player) { public static void advanceKillCounter(PlayerCharacter player) {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildKillCounterStatement(connection, player)) { PreparedStatement statement = buildKillCounterStatement(connection, player)) {
statement.execute(); statement.execute();
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e.toString());
} }
} }
@ -136,13 +137,13 @@ public class CharacterRecord extends DataRecord {
public static void advanceDeathCounter(PlayerCharacter player) { public static void advanceDeathCounter(PlayerCharacter player) {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildDeathCounterStatement(connection, player)) { PreparedStatement statement = buildDeathCounterStatement(connection, player)) {
statement.execute(); statement.execute();
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e.toString());
} }
} }
@ -163,13 +164,13 @@ public class CharacterRecord extends DataRecord {
public static void updatePromotionClass(PlayerCharacter player) { public static void updatePromotionClass(PlayerCharacter player) {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildUpdatePromotionStatement(connection, player)) { PreparedStatement statement = buildUpdatePromotionStatement(connection, player)) {
statement.execute(); statement.execute();
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e.toString());
} }
} }
@ -197,7 +198,7 @@ public class CharacterRecord extends DataRecord {
WarehousePushThread.charDelta = 0; WarehousePushThread.charDelta = 0;
try (Connection localConnection = DataWarehouse.connectionPool.getConnection(); try (Connection localConnection = DbManager.getConnection();
PreparedStatement statement = localConnection.prepareStatement(queryString, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); // Make this an updatable result set as we'll reset the dirty flag as we go along PreparedStatement statement = localConnection.prepareStatement(queryString, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); // Make this an updatable result set as we'll reset the dirty flag as we go along
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
@ -263,13 +264,13 @@ public class CharacterRecord extends DataRecord {
public void write() { public void write() {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildCharacterInsertStatement(connection, this.player)) { PreparedStatement statement = buildCharacterInsertStatement(connection, this.player)) {
statement.execute(); statement.execute();
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( "Error writing character record " + e.toString()); Logger.error("Error writing character record " + e.toString());
} }
} }

5
src/engine/db/archive/CityRecord.java

@ -10,6 +10,7 @@
package engine.db.archive; package engine.db.archive;
import engine.Enum; import engine.Enum;
import engine.gameManager.DbManager;
import engine.objects.City; import engine.objects.City;
import engine.workthreads.WarehousePushThread; import engine.workthreads.WarehousePushThread;
@ -126,8 +127,8 @@ public class CityRecord extends DataRecord {
public void write() { public void write() {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = this.buildCityInsertStatement(connection)) { PreparedStatement statement = this.buildCityInsertStatement(connection)) {
statement.execute(); statement.execute();

40
src/engine/db/archive/DataWarehouse.java

@ -12,6 +12,7 @@ package engine.db.archive;
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import engine.gameManager.ConfigManager; import engine.gameManager.ConfigManager;
import engine.gameManager.DbManager;
import engine.util.Hasher; import engine.util.Hasher;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@ -27,15 +28,10 @@ public class DataWarehouse implements Runnable {
public static final Hasher hasher = new Hasher("Cthulhu Owns Joo"); public static final Hasher hasher = new Hasher("Cthulhu Owns Joo");
private static final LinkedBlockingQueue<DataRecord> recordQueue = new LinkedBlockingQueue<>(); private static final LinkedBlockingQueue<DataRecord> recordQueue = new LinkedBlockingQueue<>();
public static HikariDataSource connectionPool = null;
public static HikariDataSource remoteConnectionPool = null; public static HikariDataSource remoteConnectionPool = null;
public DataWarehouse() { public DataWarehouse() {
Logger.info("Configuring local Database Connection Pool...");
configureConnectionPool();
// If WarehousePush is disabled // If WarehousePush is disabled
// then early exit // then early exit
@ -46,7 +42,6 @@ public class DataWarehouse implements Runnable {
Logger.info( "Configuring remote Database Connection Pool..."); Logger.info( "Configuring remote Database Connection Pool...");
configureRemoteConnectionPool(); configureRemoteConnectionPool();
} }
public static void bootStrap() { public static void bootStrap() {
@ -72,11 +67,7 @@ public class DataWarehouse implements Runnable {
String queryString; String queryString;
String hashString; String hashString;
try { connection = DbManager.getConnection();
connection = DataWarehouse.connectionPool.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
if (connection == null) { if (connection == null) {
Logger.error("Null connection when writing zone hash."); Logger.error("Null connection when writing zone hash.");
@ -140,11 +131,7 @@ public class DataWarehouse implements Runnable {
String queryString; String queryString;
ResultSet resultSet; ResultSet resultSet;
try { connection = DbManager.getConnection();
connection = DataWarehouse.connectionPool.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
if (connection == null) { if (connection == null) {
Logger.error("Null connection during char record lookup"); Logger.error("Null connection during char record lookup");
@ -282,27 +269,6 @@ public class DataWarehouse implements Runnable {
} }
} }
private static void configureConnectionPool() {
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(10);
config.setJdbcUrl("jdbc:mysql://" + ConfigManager.MB_DATABASE_ADDRESS.getValue() +
":" + ConfigManager.MB_DATABASE_PORT.getValue() + "/" +
ConfigManager.MB_DATABASE_NAME.getValue());
config.setUsername(ConfigManager.MB_DATABASE_USER.getValue());
config.setPassword( ConfigManager.MB_DATABASE_PASS.getValue());
config.addDataSourceProperty("characterEncoding", "utf8");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
connectionPool = new HikariDataSource(config); // setup the connection pool
Logger.info("Local warehouse database connection configured");
}
private static void configureRemoteConnectionPool() { private static void configureRemoteConnectionPool() {
HikariConfig config = new HikariConfig(); HikariConfig config = new HikariConfig();

15
src/engine/db/archive/GuildRecord.java

@ -11,6 +11,7 @@ package engine.db.archive;
import engine.Enum; import engine.Enum;
import engine.Enum.RecordEventType; import engine.Enum.RecordEventType;
import engine.gameManager.DbManager;
import engine.objects.Guild; import engine.objects.Guild;
import engine.workthreads.WarehousePushThread; import engine.workthreads.WarehousePushThread;
@ -164,16 +165,16 @@ public class GuildRecord extends DataRecord {
public void write() { public void write() {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = this.buildGuildInsertStatement(connection)) { PreparedStatement statement = this.buildGuildInsertStatement(connection)) {
statement.execute(); statement.execute();
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
private PreparedStatement buildGuildInsertStatement(Connection connection) throws SQLException { private PreparedStatement buildGuildInsertStatement(Connection connection) throws SQLException {

3
src/engine/db/archive/MineRecord.java

@ -10,6 +10,7 @@
package engine.db.archive; package engine.db.archive;
import engine.Enum; import engine.Enum;
import engine.gameManager.DbManager;
import engine.objects.AbstractCharacter; import engine.objects.AbstractCharacter;
import engine.objects.Mine; import engine.objects.Mine;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@ -131,7 +132,7 @@ public class MineRecord extends DataRecord {
public void write() { public void write() {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = this.buildMineInsertStatement(connection)) { PreparedStatement statement = this.buildMineInsertStatement(connection)) {
statement.execute(); statement.execute();

31
src/engine/db/archive/PvpRecord.java

@ -9,6 +9,7 @@
package engine.db.archive; package engine.db.archive;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager; import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.Guild; import engine.objects.Guild;
@ -90,19 +91,19 @@ public class PvpRecord extends DataRecord {
LinkedList<Integer> outList = new LinkedList<>(); LinkedList<Integer> outList = new LinkedList<>();
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildHistoryStatement(connection, charUUID, historyType); PreparedStatement statement = buildHistoryStatement(connection, charUUID, historyType);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
switch (historyType) { switch (historyType) {
case KILLS: case KILLS:
outList.add((int) DataWarehouse.hasher.decrypt(rs.getString("victim_id"))[0]); outList.add((int) DataWarehouse.hasher.decrypt(rs.getString("victim_id"))[0]);
break; break;
case DEATHS: case DEATHS:
outList.add((int) DataWarehouse.hasher.decrypt(rs.getString("char_id"))[0]); outList.add((int) DataWarehouse.hasher.decrypt(rs.getString("char_id"))[0]);
break; break;
} }
} }
} catch (SQLException e) { } catch (SQLException e) {
@ -132,9 +133,9 @@ public class PvpRecord extends DataRecord {
outString = "[LUA_PVP() DATA WAREHOUSE]" + newLine; outString = "[LUA_PVP() DATA WAREHOUSE]" + newLine;
dividerString = "--------------------------------" + newLine; dividerString = "--------------------------------" + newLine;
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildLuaHistoryQueryStatement(connection, charUUID); PreparedStatement statement = buildLuaHistoryQueryStatement(connection, charUUID);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
@ -293,13 +294,13 @@ public class PvpRecord extends DataRecord {
public void write() { public void write() {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildPvPInsertStatement(connection)) { PreparedStatement statement = buildPvPInsertStatement(connection)) {
statement.execute(); statement.execute();
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e.toString());
} }
// Warehouse record for this pvp event written if code path reaches here. // Warehouse record for this pvp event written if code path reaches here.

3
src/engine/db/archive/RealmRecord.java

@ -10,6 +10,7 @@
package engine.db.archive; package engine.db.archive;
import engine.Enum; import engine.Enum;
import engine.gameManager.DbManager;
import engine.objects.Realm; import engine.objects.Realm;
import engine.workthreads.WarehousePushThread; import engine.workthreads.WarehousePushThread;
@ -128,7 +129,7 @@ public class RealmRecord extends DataRecord {
public void write() { public void write() {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = this.buildRealmInsertStatement(connection)) { PreparedStatement statement = this.buildRealmInsertStatement(connection)) {
statement.execute(); statement.execute();

395
src/engine/db/handlers/dbAccountHandler.java

@ -17,206 +17,257 @@ import engine.objects.Account;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
public class dbAccountHandler extends dbHandlerBase { public class dbAccountHandler extends dbHandlerBase {
public dbAccountHandler() { public dbAccountHandler() {
this.localClass = Account.class; this.localClass = Account.class;
this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public Account GET_ACCOUNT(int id) { public Account GET_ACCOUNT(int accountID) {
if (id == 0)
return null;
Account account = (Account) DbManager.getFromCache(GameObjectType.Account, id);
if (account != null)
return account;
prepareCallable("SELECT * FROM `obj_account` WHERE `UID`=?"); Account account;
setLong(1, (long) id);
Account ac = null; if (accountID == 0)
ac = (Account) getObjectSingle(id); return null;
if (ac != null) account = (Account) DbManager.getFromCache(GameObjectType.Account, accountID);
ac.runAfterLoad();
return ac; if (account != null)
} return account;
public void WRITE_ADMIN_LOG(String adminName, String logEntry) { try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `obj_account` WHERE `UID`=?")) {
prepareCallable("INSERT INTO dyn_admin_log(`dateTime`, `charName`, `eventString`)" preparedStatement.setLong(1, accountID);
+ " VALUES (?, ?, ?)");
setTimeStamp(1, System.currentTimeMillis());
setString(2, adminName);
setString(3, logEntry);
executeUpdate();
} ResultSet rs = preparedStatement.executeQuery();
account = (Account) getObjectFromRs(rs);
public void SET_TRASH(String machineID) { } catch (SQLException e) {
Logger.error(e);
}
prepareCallable("INSERT INTO dyn_trash(`machineID`, `count`)" if (account != null)
+ " VALUES (?, 1) ON DUPLICATE KEY UPDATE `count` = `count` + 1;"); account.runAfterLoad();
setTimeStamp(4, System.currentTimeMillis()); return account;
setString(1, machineID); }
executeUpdate();
} public void WRITE_ADMIN_LOG(String adminName, String logEntry) {
public ArrayList<String> GET_TRASH_LIST() { try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO dyn_admin_log(`dateTime`, `charName`, `eventString`)"
+ " VALUES (?, ?, ?)")) {
ArrayList<String> machineList = new ArrayList<>(); preparedStatement.setTimestamp(1, new java.sql.Timestamp(System.currentTimeMillis()));
preparedStatement.setString(2, adminName);
preparedStatement.setString(3, logEntry);
prepareCallable("select `machineID` from `dyn_trash`"); preparedStatement.execute();
try { } catch (SQLException e) {
ResultSet rs = executeQuery(); Logger.error(e);
while (rs.next()) { }
machineList.add(rs.getString(1)); }
}
} catch (SQLException e) {
Logger.error( e);
} finally {
closeCallable();
}
return machineList; public void SET_TRASH(String machineID) {
}
public boolean DELETE_VAULT_FOR_ACCOUNT(final int accountID) { try (Connection connection = DbManager.getConnection();
prepareCallable("DELETE FROM `object` WHERE `parent`=? && `type`='item'"); PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO dyn_trash(`machineID`, `count`)"
setLong(1, (long) accountID); + " VALUES (?, 1) ON DUPLICATE KEY UPDATE `count` = `count` + 1;")) {
return (executeUpdate() > 0);
}
public ArrayList<PlayerCharacter> GET_ALL_CHARS_FOR_MACHINE(String machineID) { preparedStatement.setString(1, machineID);
preparedStatement.execute();
ArrayList<PlayerCharacter> trashList = new ArrayList<>(); } catch (SQLException e) {
Logger.error(e);
}
}
prepareCallable("select DISTINCT UID from object \n" + public ArrayList<String> GET_TRASH_LIST() {
"where parent IN (select AccountID from dyn_login_history " +
" WHERE`machineID`=?)");
setString(1, machineID);
try { ArrayList<String> machineList = new ArrayList<>();
ResultSet rs = executeQuery();
while (rs.next()) {
PlayerCharacter trashPlayer; try (Connection connection = DbManager.getConnection();
int playerID; PreparedStatement preparedStatement = connection.prepareStatement("select `machineID` from `dyn_trash`")) {
playerID = rs.getInt(1); ResultSet rs = preparedStatement.executeQuery();
trashPlayer = PlayerCharacter.getPlayerCharacter(playerID);
while (rs.next())
if (trashPlayer == null) machineList.add(rs.getString(1));
continue;;
} catch (SQLException e) {
if (trashPlayer.isDeleted() == false) Logger.error(e);
trashList.add(trashPlayer); }
} return machineList;
} catch (SQLException e) { }
Logger.error( e);
} finally { public void DELETE_VAULT_FOR_ACCOUNT(final int accountID) {
closeCallable();
} try (Connection connection = DbManager.getConnection();
return trashList; PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `object` WHERE `parent`=? && `type`='item'")) {
}
preparedStatement.setLong(1, accountID);
public void CLEAR_TRASH_TABLE() { preparedStatement.execute();
prepareCallable("DELETE FROM dyn_trash");
executeUpdate(); } catch (SQLException e) {
} Logger.error(e);
}
public void CREATE_SINGLE(String accountName, String password) { }
prepareCallable("CALL singleAccountCreate(?,?)"); public ArrayList<PlayerCharacter> GET_ALL_CHARS_FOR_MACHINE(String machineID) {
setString(1, accountName);
setString(2, password); ArrayList<PlayerCharacter> trashList = new ArrayList<>();
executeUpdate();
} try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("select DISTINCT UID from object \n" +
public Account GET_ACCOUNT(String uname) { "where parent IN (select AccountID from dyn_login_history " +
" WHERE`machineID`=?)")) {
if (Account.AccountsMap.get(uname) != null)
return this.GET_ACCOUNT(Account.AccountsMap.get(uname)); preparedStatement.setString(1, machineID);
ResultSet rs = preparedStatement.executeQuery();
prepareCallable("SELECT * FROM `obj_account` WHERE `acct_uname`=?");
setString(1, uname); while (rs.next()) {
ArrayList<Account> temp = getObjectList();
PlayerCharacter trashPlayer;
if (temp.isEmpty()) int playerID;
return null;
playerID = rs.getInt(1);
if (temp.get(0) != null){ trashPlayer = PlayerCharacter.getPlayerCharacter(playerID);
temp.get(0).runAfterLoad();
if (trashPlayer == null)
if (ConfigManager.serverType.equals(Enum.ServerType.LOGINSERVER)) continue;
Account.AccountsMap.put(uname, temp.get(0).getObjectUUID());
if (trashPlayer.isDeleted() == false)
} trashList.add(trashPlayer);
return temp.get(0); }
}
} catch (SQLException e) {
public void SET_ACCOUNT_LOGIN(final Account acc, String playerName, final String ip, final String machineID) { Logger.error(e);
}
if (acc.getObjectUUID() == 0 || ip == null || ip.length() == 0) return trashList;
return; }
prepareCallable("INSERT INTO dyn_login_history(`AccountID`, `accountName`, `characterName`, `ip`, `machineID`, `timeStamp`)" public void CLEAR_TRASH_TABLE() {
+ " VALUES (?, ?, ?, ?, ?, ?)");
try (Connection connection = DbManager.getConnection();
setInt(1, acc.getObjectUUID()); PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM dyn_trash")) {
setString(2, acc.getUname());
setString(3, playerName); preparedStatement.execute();
setString(4, ip);
setString(5, machineID); } catch (SQLException e) {
setTimeStamp(6, System.currentTimeMillis()); Logger.error(e);
executeUpdate(); }
} }
public String SET_PROPERTY(final Account a, String name, Object new_value) { public void CREATE_SINGLE(String accountName, String password) {
prepareCallable("CALL account_SETPROP(?,?,?)");
setLong(1, (long) a.getObjectUUID()); try (Connection connection = DbManager.getConnection();
setString(2, name); PreparedStatement preparedStatement = connection.prepareStatement("CALL singleAccountCreate(?,?)")) {
setString(3, String.valueOf(new_value));
return getResult(); preparedStatement.setString(1, accountName);
} preparedStatement.setString(2, password);
public String SET_PROPERTY(final Account a, String name, Object new_value, Object old_value) { preparedStatement.execute();
prepareCallable("CALL account_GETSETPROP(?,?,?,?)");
setLong(1, (long) a.getObjectUUID()); } catch (SQLException e) {
setString(2, name); Logger.error(e);
setString(3, String.valueOf(new_value)); }
setString(4, String.valueOf(old_value)); }
return getResult();
} public Account GET_ACCOUNT(String uname) {
Account account = null;
public void updateDatabase(final Account acc) {
prepareCallable("UPDATE `obj_account` SET `acct_passwd`=?, " if (Account.AccountsMap.get(uname) != null)
+ " `acct_lastCharUID`=?, `acct_salt`=?, `discordAccount`=?, " + return this.GET_ACCOUNT(Account.AccountsMap.get(uname));
" status = ? WHERE `UID`=?");
try (Connection connection = DbManager.getConnection();
setString(1, acc.getPasswd()); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `obj_account` WHERE `acct_uname`=?")) {
setInt(2, acc.getLastCharIDUsed());
setString(3, acc.getSalt()); preparedStatement.setString(1, uname);
setString(4, acc.discordAccount);
setString(5, acc.status.name()); ResultSet rs = preparedStatement.executeQuery();
setInt(6, acc.getObjectUUID()); account = (Account) getObjectFromRs(rs);
executeUpdate();
} } catch (SQLException e) {
Logger.error(e);
public void INVALIDATE_LOGIN_CACHE(long accountUID, String objectType) { }
prepareCallable("INSERT IGNORE INTO login_cachelist (`UID`, `type`) VALUES(?,?);");
setLong(1, accountUID); if (account != null) {
setString(2, objectType); account.runAfterLoad();
executeUpdate();
} if (ConfigManager.serverType.equals(Enum.ServerType.LOGINSERVER))
Account.AccountsMap.put(uname, account.getObjectUUID());
}
return account;
}
public void SET_ACCOUNT_LOGIN(final Account acc, String playerName, final String ip, final String machineID) {
if (acc.getObjectUUID() == 0 || ip == null || ip.length() == 0)
return;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO dyn_login_history(`AccountID`, `accountName`, `characterName`, `ip`, `machineID`, `timeStamp`)"
+ " VALUES (?, ?, ?, ?, ?, ?)")) {
preparedStatement.setInt(1, acc.getObjectUUID());
preparedStatement.setString(2, acc.getUname());
preparedStatement.setString(3, playerName);
preparedStatement.setString(4, ip);
preparedStatement.setString(5, machineID);
preparedStatement.setTimestamp(6, new java.sql.Timestamp(System.currentTimeMillis()));
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
}
}
public void updateDatabase(final Account acc) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_account` SET `acct_passwd`=?, "
+ " `acct_lastCharUID`=?, `acct_salt`=?, `discordAccount`=?, " +
" status = ? WHERE `UID`=?")) {
preparedStatement.setString(1, acc.getPasswd());
preparedStatement.setInt(2, acc.getLastCharIDUsed());
preparedStatement.setString(3, acc.getSalt());
preparedStatement.setString(4, acc.discordAccount);
preparedStatement.setString(5, acc.status.name());
preparedStatement.setInt(6, acc.getObjectUUID());
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
}
}
public void INVALIDATE_LOGIN_CACHE(long accountUID, String objectType) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT IGNORE INTO login_cachelist (`UID`, `type`) VALUES(?,?);")) {
preparedStatement.setLong(1, accountUID);
preparedStatement.setString(2, objectType);
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
}
}
} }

101
src/engine/db/handlers/dbBaneHandler.java

@ -9,6 +9,7 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.Bane; import engine.objects.Bane;
import engine.objects.Building; import engine.objects.Building;
import engine.objects.City; import engine.objects.City;
@ -16,10 +17,10 @@ import engine.objects.PlayerCharacter;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
public class dbBaneHandler extends dbHandlerBase { public class dbBaneHandler extends dbHandlerBase {
@ -29,78 +30,63 @@ public class dbBaneHandler extends dbHandlerBase {
public boolean CREATE_BANE(City city, PlayerCharacter owner, Building stone) { public boolean CREATE_BANE(City city, PlayerCharacter owner, Building stone) {
prepareCallable("INSERT INTO `dyn_banes` (`cityUUID`, `ownerUUID`, `stoneUUID`, `placementDate`) VALUES(?,?,?,?)"); try (Connection connection = DbManager.getConnection();
setLong(1, (long) city.getObjectUUID()); PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_banes` (`cityUUID`, `ownerUUID`, `stoneUUID`, `placementDate`) VALUES(?,?,?,?)")) {
setLong(2, (long) owner.getObjectUUID());
setLong(3, (long) stone.getObjectUUID());
setTimeStamp(4, System.currentTimeMillis());
return (executeUpdate() > 0); preparedStatement.setLong(1, city.getObjectUUID());
preparedStatement.setLong(2, owner.getObjectUUID());
preparedStatement.setLong(3, stone.getObjectUUID());
preparedStatement.setTimestamp(4, new java.sql.Timestamp(System.currentTimeMillis()));
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
return false;
}
return true;
} }
public Bane LOAD_BANE(int cityUUID) { public Bane LOAD_BANE(int cityUUID) {
Bane newBane = null; Bane bane = null;
try {
prepareCallable("SELECT * from dyn_banes WHERE `dyn_banes`.`cityUUID` = ?"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * from dyn_banes WHERE `dyn_banes`.`cityUUID` = ?")) {
setLong(1, (long) cityUUID); preparedStatement.setLong(1, cityUUID);
ResultSet rs = executeQuery(); ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) { if (rs.next()) {
newBane = new Bane(rs); bane = new Bane(rs);
Bane.addBane(newBane); Bane.addBane(bane);
} }
} catch (SQLException ex) { } catch (SQLException e) {
java.util.logging.Logger.getLogger(dbBaneHandler.class.getName()).log(Level.SEVERE, null, ex); Logger.error(e);
} finally {
closeCallable();
} }
return newBane;
return bane;
} }
public ConcurrentHashMap<Integer, Bane> LOAD_ALL_BANES() {
ConcurrentHashMap<Integer, Bane> baneList;
Bane thisBane;
baneList = new ConcurrentHashMap<>();
int recordsRead = 0;
prepareCallable("SELECT * FROM dyn_banes");
try {
ResultSet rs = executeQuery();
while (rs.next()) { public boolean SET_BANE_TIME(DateTime toSet, int cityUUID) {
recordsRead++; try (Connection connection = DbManager.getConnection();
thisBane = new Bane(rs); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `liveDate`=? WHERE `cityUUID`=?")) {
baneList.put(thisBane.getCityUUID(), thisBane);
} preparedStatement.setTimestamp(1, new java.sql.Timestamp(toSet.getMillis()));
preparedStatement.setLong(2, cityUUID);
Logger.info("read: " + recordsRead + " cached: " + baneList.size()); preparedStatement.execute();
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e);
} finally { return false;
closeCallable();
} }
return baneList;
}
public boolean SET_BANE_TIME(DateTime toSet, int cityUUID) { return true;
prepareCallable("UPDATE `dyn_banes` SET `liveDate`=? WHERE `cityUUID`=?");
setTimeStamp(1, toSet.getMillis());
setLong(2, cityUUID);
return (executeUpdate() > 0);
} }
public boolean REMOVE_BANE(Bane bane) { public boolean REMOVE_BANE(Bane bane) {
@ -108,8 +94,17 @@ public class dbBaneHandler extends dbHandlerBase {
if (bane == null) if (bane == null)
return false; return false;
prepareCallable("DELETE FROM `dyn_banes` WHERE `cityUUID` = ?"); try (Connection connection = DbManager.getConnection();
setLong(1, (long) bane.getCity().getObjectUUID()); PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `dyn_banes` WHERE `cityUUID` = ?")) {
return (executeUpdate() > 0);
preparedStatement.setLong(1, bane.getCity().getObjectUUID());
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
return false;
}
return true;
} }
} }

87
src/engine/db/handlers/dbBaseClassHandler.java

@ -13,38 +13,79 @@ import engine.Enum;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.objects.BaseClass; import engine.objects.BaseClass;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
public class dbBaseClassHandler extends dbHandlerBase { public class dbBaseClassHandler extends dbHandlerBase {
public dbBaseClassHandler() { public dbBaseClassHandler() {
this.localClass = BaseClass.class; this.localClass = BaseClass.class;
this.localObjectType = Enum.GameObjectType.BaseClass; this.localObjectType = Enum.GameObjectType.BaseClass;
} }
public BaseClass GET_BASE_CLASS(final int id) { public BaseClass GET_BASE_CLASS(final int id) {
if (id == 0) if (id == 0)
return null; return null;
BaseClass baseClass = (BaseClass) DbManager.getFromCache(GameObjectType.BaseClass, id);
if (baseClass != null)
return baseClass;
BaseClass baseClass = (BaseClass) DbManager.getFromCache(GameObjectType.BaseClass, id);
prepareCallable("SELECT * FROM `static_rune_baseclass` WHERE `ID` = ?;"); if (baseClass != null)
setInt(1, id); return baseClass;
return (BaseClass) getObjectSingle(id);
}
public ArrayList<BaseClass> GET_BASECLASS_FOR_RACE(final int id) { try (Connection connection = DbManager.getConnection();
prepareCallable("SELECT b.* FROM `static_rune_baseclass` b, `static_rune_racebaseclass` r WHERE b.`ID` = r.`BaseClassID` && r.`RaceID` = ?"); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `obj_account` WHERE `UID`=?")) {
setInt(1, id);
return getObjectList();
}
public ArrayList<BaseClass> GET_ALL_BASE_CLASSES(){ preparedStatement.setLong(1, id);
prepareCallable("SELECT * FROM `static_rune_baseclass`;");
return getObjectList(); ResultSet rs = preparedStatement.executeQuery();
} baseClass = (BaseClass) getObjectFromRs(rs);
} catch (SQLException e) {
Logger.error(e);
}
return baseClass;
}
public ArrayList<BaseClass> GET_BASECLASS_FOR_RACE(final int id) {
ArrayList<BaseClass> baseClasses = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT b.* FROM `static_rune_baseclass` b, `static_rune_racebaseclass` r WHERE b.`ID` = r.`BaseClassID` && r.`RaceID` = ?")) {
preparedStatement.setInt(1, id);
ResultSet rs = preparedStatement.executeQuery();
baseClasses = getObjectsFromRs(rs, 20);
} catch (SQLException e) {
Logger.error(e);
}
return baseClasses;
}
public ArrayList<BaseClass> GET_ALL_BASE_CLASSES() {
ArrayList<BaseClass> baseClasses = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_baseclass`;")) {
ResultSet rs = preparedStatement.executeQuery();
baseClasses = getObjectsFromRs(rs, 20);
} catch (SQLException e) {
Logger.error(e);
}
return baseClasses;
}
} }

31
src/engine/db/handlers/dbBlueprintHandler.java

@ -1,8 +1,11 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.Blueprint; import engine.objects.Blueprint;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.HashMap; import java.util.HashMap;
@ -22,10 +25,10 @@ public class dbBlueprintHandler extends dbHandlerBase {
int doorNum; int doorNum;
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT * FROM static_building_doors ORDER BY doorMeshUUID ASC"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_building_doors ORDER BY doorMeshUUID ASC")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
@ -35,13 +38,11 @@ public class dbBlueprintHandler extends dbHandlerBase {
doorInfo.put(doorUUID, doorNum); doorInfo.put(doorUUID, doorNum);
} }
Logger.info( "read: " + recordsRead + " cached: " + doorInfo.size());
} catch (SQLException e) { } catch (SQLException e) {
Logger.error("LoadAllDoorNumbers: " + e.getErrorCode() + ' ' + e.getMessage(), e); Logger.error(e);
} finally {
closeCallable();
} }
Logger.info("read: " + recordsRead + " cached: " + doorInfo.size());
return doorInfo; return doorInfo;
} }
@ -53,10 +54,10 @@ public class dbBlueprintHandler extends dbHandlerBase {
blueprints = new HashMap<>(); blueprints = new HashMap<>();
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT * FROM static_building_blueprint"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_building_blueprint")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
@ -74,13 +75,11 @@ public class dbBlueprintHandler extends dbHandlerBase {
} }
Logger.info( "read: " + recordsRead + " cached: " + blueprints.size());
} catch (SQLException e) { } catch (SQLException e) {
Logger.error("LoadAllBlueprints: " + e.getErrorCode() + ' ' + e.getMessage(), e); Logger.error(e);
} finally {
closeCallable();
} }
Logger.info("read: " + recordsRead + " cached: " + blueprints.size());
return blueprints; return blueprints;
} }
} }

36
src/engine/db/handlers/dbBoonHandler.java

@ -9,9 +9,12 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.Boon; import engine.objects.Boon;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -22,30 +25,27 @@ public class dbBoonHandler extends dbHandlerBase {
} }
public ArrayList<Boon> GET_BOON_AMOUNTS_FOR_ITEMBASEUUID(int itemBaseUUID){ public ArrayList<Boon> GET_BOON_AMOUNTS_FOR_ITEMBASE(int itemBaseUUID) {
ArrayList<Boon>boons = new ArrayList<>(); ArrayList<Boon> boons = new ArrayList<>();
Boon thisBoon; Boon thisBoon;
prepareCallable("SELECT * FROM `static_item_boons` WHERE `itemBaseID` = ?");
setInt(1, itemBaseUUID);
try { try (Connection connection = DbManager.getConnection();
ResultSet rs = executeQuery(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_boons` WHERE `itemBaseID` = ?")) {
while (rs.next()) { preparedStatement.setInt(1, itemBaseUUID);
ResultSet rs = preparedStatement.executeQuery();
thisBoon = new Boon(rs); while (rs.next()) {
boons.add(thisBoon); thisBoon = new Boon(rs);
} boons.add(thisBoon);
}
} catch (SQLException e) {
Logger.error(e);
}
} catch (SQLException e) { return boons;
Logger.error("GetBoonAmountsForItembaseUUID: " + e.getErrorCode() + ' ' + e.getMessage(), e);
} finally {
closeCallable();
} }
return boons;
}
} }

1546
src/engine/db/handlers/dbBuildingHandler.java

File diff suppressed because it is too large Load Diff

41
src/engine/db/handlers/dbBuildingLocationHandler.java

@ -9,28 +9,41 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.BuildingLocation; import engine.objects.BuildingLocation;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
public class dbBuildingLocationHandler extends dbHandlerBase { public class dbBuildingLocationHandler extends dbHandlerBase {
public dbBuildingLocationHandler() { public dbBuildingLocationHandler() {
this.localClass = BuildingLocation.class; this.localClass = BuildingLocation.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public ArrayList<BuildingLocation> LOAD_BUILDING_LOCATIONS() { public ArrayList<BuildingLocation> LOAD_BUILDING_LOCATIONS() {
prepareCallable("select * from static_building_location " +
"where type = 6 or type = 8 " +
"GROUP BY buildingID, slot " +
"ORDER BY buildingID, slot ASC;");
return getObjectList();
}
public ArrayList<BuildingLocation> LOAD_ALL_BUILDING_LOCATIONS() { ArrayList<BuildingLocation> buildingLocations = new ArrayList<>();
prepareCallable("SELECT * FROM `static_building_location`;");
return getObjectList();
}
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("select * from static_building_location " +
"where type = 6 or type = 8 " +
"GROUP BY buildingID, slot " +
"ORDER BY buildingID, slot ASC;")) {
ResultSet rs = preparedStatement.executeQuery();
buildingLocations = getObjectsFromRs(rs, 20);
} catch (SQLException e) {
Logger.error(e);
return buildingLocations;
}
return buildingLocations;
}
} }

104
src/engine/db/handlers/dbCSSessionHandler.java

@ -17,6 +17,8 @@ import engine.util.StringUtils;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.net.InetAddress; import java.net.InetAddress;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -28,73 +30,85 @@ public class dbCSSessionHandler extends dbHandlerBase {
} }
public boolean ADD_CSSESSION(String secKey, Account acc, InetAddress inet, String machineID) { public boolean ADD_CSSESSION(String secKey, Account acc, InetAddress inet, String machineID) {
prepareCallable("INSERT INTO `dyn_session` (`secretKey`, `accountID`, `discordAccount`, `sessionIP`, machineID) VALUES (?,?,?,INET_ATON(?),?)");
setString(1, secKey);
setLong(2, acc.getObjectUUID());
setString(3, acc.discordAccount);
setString(4, StringUtils.InetAddressToClientString(inet));
setString(5, machineID);
return (executeUpdate() != 0);
}
// This method returns population metrics from the database
public String GET_POPULATION_STRING() { try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_session` (`secretKey`, `accountID`, `discordAccount`, `sessionIP`, machineID) VALUES (?,?,?,INET_ATON(?),?)")) {
String outString = null; preparedStatement.setString(1, secKey);
preparedStatement.setLong(2, acc.getObjectUUID());
preparedStatement.setString(3, acc.discordAccount);
preparedStatement.setString(4, StringUtils.InetAddressToClientString(inet));
preparedStatement.setString(5, machineID);
// Set up call to stored procedure return (preparedStatement.executeUpdate() > 0);
prepareCallable("CALL GET_POPULATION_STRING()");
try { } catch (SQLException e) {
Logger.error(e);
// Evaluate database ordinal and return enum
outString = getString("popstring");
} catch (Exception e) {
Logger.error( "Failure in stored procedure:" + e.getMessage());
} finally {
closeCallable();
} }
return outString; return false;
} }
public boolean DELETE_UNUSED_CSSESSION(String secKey) { public boolean DELETE_UNUSED_CSSESSION(String secKey) {
prepareCallable("DELETE FROM `dyn_session` WHERE `secretKey`=? && `characterID` IS NULL");
setString(1, secKey); try (Connection connection = DbManager.getConnection();
return (executeUpdate() != 0); PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `dyn_session` WHERE `secretKey`=? && `characterID` IS NULL")) {
preparedStatement.setString(1, secKey);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean DELETE_CSSESSION(String secKey) { public boolean DELETE_CSSESSION(String secKey) {
prepareCallable("DELETE FROM `dyn_session` WHERE `secretKey`=?");
setString(1, secKey); try (Connection connection = DbManager.getConnection();
return (executeUpdate() != 0); PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `dyn_session` WHERE `secretKey`=?")) {
preparedStatement.setString(1, secKey);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean UPDATE_CSSESSION(String secKey, int charID) { public boolean UPDATE_CSSESSION(String secKey, int charID) {
prepareCallable("UPDATE `dyn_session` SET `characterID`=? WHERE `secretKey`=?");
setInt(1, charID); try (Connection connection = DbManager.getConnection();
setString(2, secKey); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_session` SET `characterID`=? WHERE `secretKey`=?")) {
return (executeUpdate() != 0);
preparedStatement.setInt(1, charID);
preparedStatement.setString(2, secKey);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public CSSession GET_CSSESSION(String secKey) { public CSSession GET_CSSESSION(String secKey) {
CSSession css = null; CSSession css = null;
prepareCallable("SELECT `accountID`, `characterID`, `machineID` FROM `dyn_session` WHERE `secretKey`=?");
setString(1, secKey);
try {
ResultSet rs = executeQuery(); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `accountID`, `characterID`, `machineID` FROM `dyn_session` WHERE `secretKey`=?")) {
preparedStatement.setString(1, secKey);
ResultSet rs = preparedStatement.executeQuery();
if (rs.next())
css = new CSSession(secKey, DbManager.AccountQueries.GET_ACCOUNT(rs.getInt("accountID")), PlayerCharacter.getPlayerCharacter(rs.getInt("characterID")), rs.getString("machineID"));
if (rs.next()) {
css = new CSSession(secKey, DbManager.AccountQueries.GET_ACCOUNT(rs.getInt("accountID")), PlayerCharacter.getPlayerCharacter(rs
.getInt("characterID")), getString("machineID"));
}
rs.close();
} catch (SQLException e) { } catch (SQLException e) {
Logger.error("Error with seckey: " + secKey); Logger.error(e);
} finally {
closeCallable();
} }
return css; return css;
} }
} }

236
src/engine/db/handlers/dbCharacterPowerHandler.java

@ -16,98 +16,154 @@ import engine.objects.PlayerCharacter;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.ResultSet; import java.sql.*;
import java.sql.SQLException;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class dbCharacterPowerHandler extends dbHandlerBase { public class dbCharacterPowerHandler extends dbHandlerBase {
public dbCharacterPowerHandler() { public dbCharacterPowerHandler() {
this.localClass = CharacterPower.class; this.localClass = CharacterPower.class;
this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public CharacterPower ADD_CHARACTER_POWER(CharacterPower toAdd) { public CharacterPower ADD_CHARACTER_POWER(CharacterPower toAdd) {
if (CharacterPower.getOwner(toAdd) == null || toAdd.getPower() == null) {
Logger.error("dbCharacterSkillHandler.ADD_Power", toAdd.getObjectUUID() + " missing owner or powersBase"); CharacterPower characterPower = null;
return null;
} if (CharacterPower.getOwner(toAdd) == null || toAdd.getPower() == null) {
Logger.error("dbCharacterSkillHandler.ADD_Power", toAdd.getObjectUUID() + " missing owner or powersBase");
prepareCallable("INSERT INTO `dyn_character_power` (`CharacterID`, `powersBaseToken`, `trains`) VALUES (?, ?, ?);"); return null;
setLong(1, (long)CharacterPower.getOwner(toAdd).getObjectUUID()); }
setInt(2, toAdd.getPower().getToken());
setInt(3, toAdd.getTrains()); try (Connection connection = DbManager.getConnection();
int powerID = insertGetUUID(); PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_character_power` (`CharacterID`, `powersBaseToken`, `trains`) VALUES (?, ?, ?);", Statement.RETURN_GENERATED_KEYS)) {
return GET_CHARACTER_POWER(powerID);
preparedStatement.setLong(1, CharacterPower.getOwner(toAdd).getObjectUUID());
} preparedStatement.setInt(2, toAdd.getPower().getToken());
preparedStatement.setInt(3, toAdd.getTrains());
public int DELETE_CHARACTER_POWER(final int objectUUID) {
prepareCallable("DELETE FROM `dyn_character_power` WHERE `UID` = ?"); preparedStatement.executeUpdate();
setLong(1, (long)objectUUID); ResultSet rs = preparedStatement.getGeneratedKeys();
return executeUpdate();
} if (rs.next())
characterPower = GET_CHARACTER_POWER(rs.getInt(1));
public CharacterPower GET_CHARACTER_POWER(int objectUUID) {
} catch (SQLException e) {
CharacterPower cp = (CharacterPower) DbManager.getFromCache(Enum.GameObjectType.CharacterPower, objectUUID); Logger.error(e);
if (cp != null) return null;
return cp; }
prepareCallable("SELECT * FROM `dyn_character_power` WHERE `UID` = ?"); return characterPower;
setLong(1, (long)objectUUID); }
return (CharacterPower) getObjectSingle(objectUUID);
} public int DELETE_CHARACTER_POWER(final int objectUUID) {
public ConcurrentHashMap<Integer, CharacterPower> GET_POWERS_FOR_CHARACTER(PlayerCharacter pc) { int rowCount = 0;
ConcurrentHashMap<Integer, CharacterPower> powers = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
int objectUUID = pc.getObjectUUID(); try (Connection connection = DbManager.getConnection();
prepareCallable("SELECT * FROM `dyn_character_power` WHERE CharacterID = ?"); PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `dyn_character_power` WHERE `UID` = ?")) {
setLong(1, (long)objectUUID);
ResultSet rs = executeQuery(); preparedStatement.setLong(1, objectUUID);
try { rowCount = preparedStatement.executeUpdate();
while (rs.next()) {
CharacterPower cp = new CharacterPower(rs, pc); } catch (SQLException e) {
if (cp.getPower() != null) Logger.error(e);
powers.put(cp.getPower().getToken(), cp); }
}
rs.close(); return rowCount;
} catch (SQLException e) { }
Logger.error("CharacterPower.getCharacterPowerForCharacter", "Exception:" + e.getMessage());
} finally { public CharacterPower GET_CHARACTER_POWER(int objectUUID) {
closeCallable();
} CharacterPower characterPower = (CharacterPower) DbManager.getFromCache(Enum.GameObjectType.CharacterPower, objectUUID);
return powers;
} if (characterPower != null)
return characterPower;
public void UPDATE_TRAINS(final CharacterPower pow) {
//skip update if nothing changed try (Connection connection = DbManager.getConnection();
if (!pow.isTrained()) PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_character_power` WHERE `UID` = ?")) {
return;
preparedStatement.setLong(1, objectUUID);
prepareCallable("UPDATE `dyn_character_power` SET `trains`=? WHERE `UID`=?"); ResultSet rs = preparedStatement.executeQuery();
setShort(1, (short)pow.getTrains()); characterPower = (CharacterPower) getObjectFromRs(rs);
setInt(2, pow.getObjectUUID());
executeUpdate(); } catch (SQLException e) {
pow.setTrained(false); Logger.error(e);
} }
public void updateDatabase(final CharacterPower pow) { return characterPower;
if (pow.getPower() == null) { }
Logger.error( "Failed to find powersBase for Power " + pow.getObjectUUID());
return; public ConcurrentHashMap<Integer, CharacterPower> GET_POWERS_FOR_CHARACTER(PlayerCharacter pc) {
}
if (CharacterPower.getOwner(pow) == null) { ConcurrentHashMap<Integer, CharacterPower> powers = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
Logger.error( "Failed to find owner for Power " + pow.getObjectUUID()); int objectUUID = pc.getObjectUUID();
return;
} try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_character_power` WHERE CharacterID = ?")) {
prepareCallable("UPDATE `dyn_character_power` SET `PowersBaseToken`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?"); preparedStatement.setLong(1, objectUUID);
setInt(1, pow.getPower().getToken()); ResultSet rs = preparedStatement.executeQuery();
setInt(2, CharacterPower.getOwner(pow).getObjectUUID());
setShort(3, (short)pow.getTrains()); while (rs.next()) {
setInt(4, pow.getObjectUUID()); CharacterPower cp = new CharacterPower(rs, pc);
executeUpdate(); if (cp.getPower() != null)
pow.setTrained(false); powers.put(cp.getPower().getToken(), cp);
} }
} catch (SQLException e) {
Logger.error(e);
}
return powers;
}
public void UPDATE_TRAINS(final CharacterPower characterPower) {
//skip update if nothing changed
if (!characterPower.isTrained())
return;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_character_power` SET `trains`=? WHERE `UID`=?")) {
preparedStatement.setShort(1, (short) characterPower.getTrains());
preparedStatement.setInt(2, characterPower.getObjectUUID());
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
}
characterPower.setTrained(false);
}
public void updateDatabase(final CharacterPower pow) {
if (pow.getPower() == null) {
Logger.error("Failed to find powersBase for Power " + pow.getObjectUUID());
return;
}
if (CharacterPower.getOwner(pow) == null) {
Logger.error("Failed to find owner for Power " + pow.getObjectUUID());
return;
}
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_character_power` SET `PowersBaseToken`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?")) {
preparedStatement.setInt(1, pow.getPower().getToken());
preparedStatement.setInt(2, CharacterPower.getOwner(pow).getObjectUUID());
preparedStatement.setShort(3, (short) pow.getTrains());
preparedStatement.setInt(4, pow.getObjectUUID());
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
}
pow.setTrained(false);
}
} }

144
src/engine/db/handlers/dbCharacterRuneHandler.java

@ -12,52 +12,110 @@ package engine.db.handlers;
import engine.Enum; import engine.Enum;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.objects.CharacterRune; import engine.objects.CharacterRune;
import org.pmw.tinylog.Logger;
import java.sql.*;
import java.util.ArrayList; import java.util.ArrayList;
public class dbCharacterRuneHandler extends dbHandlerBase { public class dbCharacterRuneHandler extends dbHandlerBase {
public dbCharacterRuneHandler() { public dbCharacterRuneHandler() {
this.localClass = CharacterRune.class; this.localClass = CharacterRune.class;
this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public CharacterRune ADD_CHARACTER_RUNE(final CharacterRune toAdd) { public CharacterRune ADD_CHARACTER_RUNE(final CharacterRune toAdd) {
prepareCallable("INSERT INTO `dyn_character_rune` (`CharacterID`, `RuneBaseID`) VALUES (?, ?);");
setLong(1, (long)toAdd.getPlayerID()); CharacterRune characterRune = null;
setInt(2, toAdd.getRuneBaseID());
int runeID = insertGetUUID(); try (Connection connection = DbManager.getConnection();
return GET_CHARACTER_RUNE(runeID); PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_character_rune` (`CharacterID`, `RuneBaseID`) VALUES (?, ?);", Statement.RETURN_GENERATED_KEYS)) {
}
preparedStatement.setLong(1, toAdd.getPlayerID());
public CharacterRune GET_CHARACTER_RUNE(int runeID) { preparedStatement.setInt(2, toAdd.getRuneBaseID());
CharacterRune charRune = (CharacterRune) DbManager.getFromCache(Enum.GameObjectType.CharacterRune, runeID); preparedStatement.executeUpdate();
if (charRune != null) ResultSet rs = preparedStatement.getGeneratedKeys();
return charRune;
prepareCallable("SELECT * FROM `dyn_character_rune` WHERE `UID`=?"); if (rs.next())
setInt(1, runeID); characterRune = GET_CHARACTER_RUNE(rs.getInt(1));
return (CharacterRune) getObjectSingle(runeID);
} } catch (SQLException e) {
Logger.error(e);
}
public boolean DELETE_CHARACTER_RUNE(final CharacterRune cr) {
prepareCallable("DELETE FROM `dyn_character_rune` WHERE `UID`=?;"); return characterRune;
setLong(1, (long)cr.getObjectUUID()); }
return (executeUpdate() != 0);
} public CharacterRune GET_CHARACTER_RUNE(int runeID) {
public ArrayList<CharacterRune> GET_RUNES_FOR_CHARACTER(final int characterId) { CharacterRune characterRune = (CharacterRune) DbManager.getFromCache(Enum.GameObjectType.CharacterRune, runeID);
prepareCallable("SELECT * FROM `dyn_character_rune` WHERE `CharacterID` = ?");
setInt(1, characterId); if (characterRune != null)
return getObjectList(); return characterRune;
}
try (Connection connection = DbManager.getConnection();
public void updateDatabase(final CharacterRune cr) { PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_character_rune` WHERE `UID`=?")) {
prepareCallable("UPDATE `dyn_character_rune` SET `CharacterID`=?, `RuneBaseID`=? WHERE `UID` = ?");
setInt(1, cr.getPlayerID()); preparedStatement.setInt(1, runeID);
setInt(2, cr.getRuneBaseID()); ResultSet rs = preparedStatement.executeQuery();
setLong(3, (long) cr.getObjectUUID());
executeUpdate(); characterRune = (CharacterRune) getObjectFromRs(rs);
}
} catch (SQLException e) {
Logger.error(e);
}
return characterRune;
}
public boolean DELETE_CHARACTER_RUNE(final CharacterRune characterRune) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `dyn_character_rune` WHERE `UID`=?;")) {
preparedStatement.setLong(1, characterRune.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public ArrayList<CharacterRune> GET_RUNES_FOR_CHARACTER(final int characterId) {
ArrayList<CharacterRune> characterRunes = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_character_rune` WHERE `CharacterID` = ?")) {
preparedStatement.setInt(1, characterId);
ResultSet rs = preparedStatement.executeQuery();
characterRunes = getObjectsFromRs(rs, 10);
} catch (SQLException e) {
Logger.error(e);
}
return characterRunes;
}
public void updateDatabase(final CharacterRune characterRune) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_character_rune` SET `CharacterID`=?, `RuneBaseID`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, characterRune.getPlayerID());
preparedStatement.setInt(2, characterRune.getRuneBaseID());
preparedStatement.setLong(3, characterRune.getObjectUUID());
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
}
}
} }

161
src/engine/db/handlers/dbCharacterSkillHandler.java

@ -17,8 +17,7 @@ import engine.objects.PlayerCharacter;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.ResultSet; import java.sql.*;
import java.sql.SQLException;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class dbCharacterSkillHandler extends dbHandlerBase { public class dbCharacterSkillHandler extends dbHandlerBase {
@ -29,88 +28,146 @@ public class dbCharacterSkillHandler extends dbHandlerBase {
} }
public CharacterSkill ADD_SKILL(CharacterSkill toAdd) { public CharacterSkill ADD_SKILL(CharacterSkill toAdd) {
CharacterSkill characterSkill = null;
if (CharacterSkill.GetOwner(toAdd) == null || toAdd.getSkillsBase() == null) { if (CharacterSkill.GetOwner(toAdd) == null || toAdd.getSkillsBase() == null) {
Logger.error("dbCharacterSkillHandler.ADD_SKILL", toAdd.getObjectUUID() + " missing owner or skillsBase"); Logger.error("dbCharacterSkillHandler.ADD_SKILL", toAdd.getObjectUUID() + " missing owner or skillsBase");
return null; return null;
} }
prepareCallable("INSERT INTO `dyn_character_skill` (`CharacterID`, `skillsBaseID`, `trains`) VALUES (?, ?, ?);"); try (Connection connection = DbManager.getConnection();
setLong(1, (long)CharacterSkill.GetOwner(toAdd).getObjectUUID()); PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_character_skill` (`CharacterID`, `skillsBaseID`, `trains`) VALUES (?, ?, ?);", Statement.RETURN_GENERATED_KEYS)) {
setInt(2, toAdd.getSkillsBase().getObjectUUID());
setInt(3, toAdd.getNumTrains()); preparedStatement.setLong(1, CharacterSkill.GetOwner(toAdd).getObjectUUID());
int skillID = insertGetUUID(); preparedStatement.setInt(2, toAdd.getSkillsBase().getObjectUUID());
return GET_SKILL(skillID); preparedStatement.setInt(3, toAdd.getNumTrains());
preparedStatement.executeUpdate();
ResultSet rs = preparedStatement.getGeneratedKeys();
if (rs.next())
characterSkill = GET_SKILL(rs.getInt(1));
} catch (SQLException e) {
Logger.error(e);
}
return characterSkill;
} }
public boolean DELETE_SKILL(final int objectUUID) { public boolean DELETE_SKILL(final int objectUUID) {
prepareCallable("DELETE FROM `dyn_character_skill` WHERE `UID` = ?");
setLong(1, (long)objectUUID); try (Connection connection = DbManager.getConnection();
return (executeUpdate() != 0); PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `dyn_character_skill` WHERE `UID` = ?")) {
preparedStatement.setLong(1, objectUUID);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public CharacterSkill GET_SKILL(final int objectUUID) { public CharacterSkill GET_SKILL(final int objectUUID) {
CharacterSkill skill = (CharacterSkill) DbManager.getFromCache(Enum.GameObjectType.CharacterSkill, objectUUID);
if (skill != null) CharacterSkill characterSkill = (CharacterSkill) DbManager.getFromCache(Enum.GameObjectType.CharacterSkill, objectUUID);
return skill;
prepareCallable("SELECT * FROM `dyn_character_skill` WHERE `UID` = ?"); if (characterSkill != null)
setInt(1, objectUUID); return characterSkill;
return (CharacterSkill) getObjectSingle(objectUUID);
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_character_skill` WHERE `UID` = ?")) {
preparedStatement.setInt(1, objectUUID);
ResultSet rs = preparedStatement.executeQuery();
characterSkill = (CharacterSkill) getObjectFromRs(rs);
} catch (SQLException e) {
Logger.error(e);
}
return characterSkill;
} }
public ConcurrentHashMap<String, CharacterSkill> GET_SKILLS_FOR_CHARACTER(final AbstractCharacter ac) { public ConcurrentHashMap<String, CharacterSkill> GET_SKILLS_FOR_CHARACTER(final AbstractCharacter ac) {
ConcurrentHashMap<String, CharacterSkill> skills = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
ConcurrentHashMap<String, CharacterSkill> characterSkills = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
if (ac == null || (!(ac.getObjectType().equals(Enum.GameObjectType.PlayerCharacter)))) if (ac == null || (!(ac.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))))
return skills; return characterSkills;
PlayerCharacter pc = (PlayerCharacter) ac;
int objectUUID = pc.getObjectUUID(); PlayerCharacter playerCharacter = (PlayerCharacter) ac;
int characterId = playerCharacter.getObjectUUID();
prepareCallable("SELECT * FROM `dyn_character_skill` WHERE `CharacterID` = ?");
setInt(1, objectUUID); try (Connection connection = DbManager.getConnection();
try { PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_character_skill` WHERE `CharacterID` = ?")) {
ResultSet rs = executeQuery();
preparedStatement.setInt(1, characterId);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) { while (rs.next()) {
CharacterSkill cs = new CharacterSkill(rs, pc); CharacterSkill cs = new CharacterSkill(rs, playerCharacter);
if (cs.getSkillsBase() != null) if (cs.getSkillsBase() != null)
skills.put(cs.getSkillsBase().getName(), cs); characterSkills.put(cs.getSkillsBase().getName(), cs);
} }
rs.close();
} catch (SQLException e) { } catch (SQLException e) {
Logger.error("CharacterSkill.getCharacterSkillForCharacter", e); Logger.error(e);
} finally {
closeCallable();
} }
return skills;
return characterSkills;
} }
public void UPDATE_TRAINS(final CharacterSkill cs) { public void UPDATE_TRAINS(final CharacterSkill characterSkill) {
if (!cs.isTrained())
if (!characterSkill.isTrained())
return; return;
prepareCallable("UPDATE `dyn_character_skill` SET `trains`=? WHERE `UID` = ?"); try (Connection connection = DbManager.getConnection();
setShort(1, (short)cs.getNumTrains()); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_character_skill` SET `trains`=? WHERE `UID` = ?")) {
setLong(2, (long)cs.getObjectUUID());
if (executeUpdate() != 0) preparedStatement.setShort(1, (short) characterSkill.getNumTrains());
cs.syncTrains(); preparedStatement.setLong(2, characterSkill.getObjectUUID());
if (preparedStatement.executeUpdate() != 0)
characterSkill.syncTrains();
} catch (SQLException e) {
Logger.error(e);
}
} }
public void updateDatabase(final CharacterSkill cs) { public void updateDatabase(final CharacterSkill characterSkill) {
if (cs.getSkillsBase() == null) {
Logger.error("Failed to find skillsBase for Skill " + cs.getObjectUUID()); if (characterSkill.getSkillsBase() == null) {
Logger.error("Failed to find skillsBase for Skill " + characterSkill.getObjectUUID());
return; return;
} }
if (CharacterSkill.GetOwner(cs) == null) {
Logger.error("Failed to find owner for Skill " + cs.getObjectUUID()); if (CharacterSkill.GetOwner(characterSkill) == null) {
Logger.error("Failed to find owner for Skill " + characterSkill.getObjectUUID());
return; return;
} }
prepareCallable("UPDATE `dyn_character_skill` SET `skillsBaseID`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?"); try (Connection connection = DbManager.getConnection();
setInt(1, cs.getSkillsBase().getObjectUUID()); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_character_skill` SET `skillsBaseID`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?")) {
setInt(2, CharacterSkill.GetOwner(cs).getObjectUUID());
setShort(3, (short)cs.getNumTrains()); preparedStatement.setInt(1, characterSkill.getSkillsBase().getObjectUUID());
setLong(4, (long)cs.getObjectUUID()); preparedStatement.setInt(2, CharacterSkill.GetOwner(characterSkill).getObjectUUID());
if (executeUpdate() != 0) preparedStatement.setShort(3, (short) characterSkill.getNumTrains());
cs.syncTrains(); preparedStatement.setLong(4, characterSkill.getObjectUUID());
if (preparedStatement.executeUpdate() != 0)
characterSkill.syncTrains();
} catch (SQLException e) {
Logger.error(e);
}
} }
} }

389
src/engine/db/handlers/dbCityHandler.java

@ -17,180 +17,229 @@ import engine.objects.City;
import engine.objects.Zone; import engine.objects.Zone;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.net.UnknownHostException; import java.sql.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
public class dbCityHandler extends dbHandlerBase { public class dbCityHandler extends dbHandlerBase {
public dbCityHandler() { public dbCityHandler() {
this.localClass = City.class; this.localClass = City.class;
this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public ArrayList<AbstractGameObject> CREATE_CITY(int ownerID, int parentZoneID, int realmID, float xCoord, float yCoord, float zCoord, float rotation, float W, String name, LocalDateTime established) { public static void addObject(ArrayList<AbstractGameObject> list, ResultSet rs) throws SQLException {
prepareCallable("CALL `city_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)"); String type = rs.getString("type");
LocalDateTime upgradeTime = LocalDateTime.now().plusHours(2); switch (type) {
setLong(1, (long) ownerID); //objectUUID of owning player case "zone":
setLong(2, (long) parentZoneID); //objectUUID of parent (continent) zone Zone zone = new Zone(rs);
setLong(3, (long) realmID); //objectUUID of realm city belongs in DbManager.addToCache(zone);
setFloat(4, xCoord); //xOffset from parentZone center list.add(zone);
setFloat(5, yCoord); //yOffset from parentZone center break;
setFloat(6, zCoord); //zOffset from parentZone center case "building":
setString(7, name); //city name Building building = new Building(rs);
setLocalDateTime(8, established); DbManager.addToCache(building);
setFloat(9, rotation); list.add(building);
setFloat(10, W); break;
setLocalDateTime(11, upgradeTime); case "city":
ArrayList<AbstractGameObject> list = new ArrayList<>(); City city = new City(rs);
DbManager.addToCache(city);
try { list.add(city);
boolean work = execute(); break;
if (work) { }
ResultSet rs = this.cs.get().getResultSet(); }
while (rs.next()) {
addObject(list, rs); public ArrayList<AbstractGameObject> CREATE_CITY(int ownerID, int parentZoneID, int realmID, float xCoord, float yCoord, float zCoord, float rotation, float W, String name, LocalDateTime established) {
}
rs.close(); LocalDateTime upgradeTime = LocalDateTime.now().plusHours(2);
} else { ArrayList<AbstractGameObject> objectList = new ArrayList<>();
Logger.info("City Placement Failed: " + this.cs.get().toString());
return list; //city creation failure try (Connection connection = DbManager.getConnection();
} PreparedStatement preparedStatement = connection.prepareStatement("CALL `city_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)")) {
while (this.cs.get().getMoreResults()) {
ResultSet rs = this.cs.get().getResultSet(); preparedStatement.setLong(1, ownerID); //objectUUID of owning player
while (rs.next()) { preparedStatement.setLong(2, parentZoneID); //objectUUID of parent (continent) zone
addObject(list, rs); preparedStatement.setLong(3, realmID); //objectUUID of realm city belongs in
} preparedStatement.setFloat(4, xCoord); //xOffset from parentZone center
rs.close(); preparedStatement.setFloat(5, yCoord); //yOffset from parentZone center
} preparedStatement.setFloat(6, zCoord); //zOffset from parentZone center
} catch (SQLException e) { preparedStatement.setString(7, name); //city name
Logger.info("City Placement Failed, SQLException: " + this.cs.get().toString() + e.toString()); preparedStatement.setTimestamp(8, Timestamp.valueOf(established));
return list; //city creation failure preparedStatement.setFloat(9, rotation);
} catch (UnknownHostException e) { preparedStatement.setFloat(10, W);
Logger.info("City Placement Failed, UnknownHostException: " + this.cs.get().toString()); preparedStatement.setTimestamp(11, Timestamp.valueOf(upgradeTime));
return list; //city creation failure
} finally { boolean work = preparedStatement.execute();
closeCallable();
} if (work) {
return list;
} ResultSet rs = preparedStatement.getResultSet();
public static void addObject(ArrayList<AbstractGameObject> list, ResultSet rs) throws SQLException, UnknownHostException { while (rs.next())
String type = rs.getString("type"); addObject(objectList, rs);
switch (type) { rs.close();
case "zone": } else {
Zone zone = new Zone(rs); Logger.info("City Placement Failed: " + preparedStatement);
DbManager.addToCache(zone); return objectList; //city creation failure
list.add(zone); }
break; while (preparedStatement.getMoreResults()) {
case "building": ResultSet rs = preparedStatement.getResultSet();
Building building = new Building(rs); while (rs.next()) {
DbManager.addToCache(building); addObject(objectList, rs);
list.add(building); }
break; rs.close();
case "city": }
City city = new City(rs); } catch (SQLException e) {
DbManager.addToCache(city); Logger.error(e);
list.add(city); }
break;
} return objectList;
} }
public ArrayList<City> GET_CITIES_BY_ZONE(final int objectUUID) { public ArrayList<City> GET_CITIES_BY_ZONE(final int objectUUID) {
prepareCallable("SELECT `obj_city`.*, `object`.`parent` FROM `obj_city` INNER JOIN `object` ON `object`.`UID` = `obj_city`.`UID` WHERE `object`.`parent`=?;");
setLong(1, (long) objectUUID); ArrayList<City> cityList = new ArrayList<>();
return getObjectList(); try (Connection connection = DbManager.getConnection();
} PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_city`.*, `object`.`parent` FROM `obj_city` INNER JOIN `object` ON `object`.`UID` = `obj_city`.`UID` WHERE `object`.`parent`=?;")) {
public City GET_CITY(final int cityId) { preparedStatement.setLong(1, objectUUID);
City city = (City) DbManager.getFromCache(Enum.GameObjectType.City, cityId);
if (city != null) ResultSet rs = preparedStatement.executeQuery();
return city; cityList = getObjectsFromRs(rs, 100);
prepareCallable("SELECT `obj_city`.*, `object`.`parent` FROM `obj_city` INNER JOIN `object` ON `object`.`UID` = `obj_city`.`UID` WHERE `object`.`UID`=?;");
setLong(1, (long) cityId); } catch (SQLException e) {
city = (City) getObjectSingle(cityId); Logger.error(e);
return city; }
}
return cityList;
public String SET_PROPERTY(final City c, String name, Object new_value) { }
prepareCallable("CALL city_SETPROP(?,?,?)");
setLong(1, (long) c.getObjectUUID()); public City GET_CITY(final int cityId) {
setString(2, name);
setString(3, String.valueOf(new_value)); City city = (City) DbManager.getFromCache(Enum.GameObjectType.City, cityId);
return getResult();
} if (city != null)
return city;
public String SET_PROPERTY(final City c, String name, Object new_value, Object old_value) {
prepareCallable("CALL city_GETSETPROP(?,?,?,?)"); try (Connection connection = DbManager.getConnection();
setLong(1, (long) c.getObjectUUID()); PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_city`.*, `object`.`parent` FROM `obj_city` INNER JOIN `object` ON `object`.`UID` = `obj_city`.`UID` WHERE `object`.`UID`=?;")) {
setString(2, name);
setString(3, String.valueOf(new_value)); preparedStatement.setLong(1, cityId);
setString(4, String.valueOf(old_value));
return getResult(); ResultSet rs = preparedStatement.executeQuery();
} city = (City) getObjectFromRs(rs);
public boolean updateforceRename(City city, boolean value) { } catch (SQLException e) {
Logger.error(e);
prepareCallable("UPDATE `obj_city` SET `forceRename`=?" }
+ " WHERE `UID` = ?");
setByte(1, (value == true) ? (byte) 1 : (byte) 0); return city;
setInt(2, city.getObjectUUID()); }
return (executeUpdate() > 0);
} public boolean updateforceRename(City city, boolean value) {
public boolean updateOpenCity(City city, boolean value) { try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_city` SET `forceRename`=?"
prepareCallable("UPDATE `obj_city` SET `open`=?" + " WHERE `UID` = ?")) {
+ " WHERE `UID` = ?");
setByte(1, (value == true) ? (byte) 1 : (byte) 0); preparedStatement.setByte(1, (value == true) ? (byte) 1 : (byte) 0);
setInt(2, city.getObjectUUID()); preparedStatement.setInt(2, city.getObjectUUID());
return (executeUpdate() > 0);
} return (preparedStatement.executeUpdate() > 0);
public boolean updateTOL(City city, int tolID) { } catch (SQLException e) {
Logger.error(e);
prepareCallable("UPDATE `obj_city` SET `treeOfLifeUUID`=?" return false;
+ " WHERE `UID` = ?"); }
setInt(1,tolID); }
setInt(2, city.getObjectUUID());
return (executeUpdate() > 0); public boolean updateOpenCity(City city, boolean value) {
}
try (Connection connection = DbManager.getConnection();
public boolean renameCity(City city, String name) { PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_city` SET `open`=?"
+ " WHERE `UID` = ?")) {
prepareCallable("UPDATE `obj_city` SET `name`=?"
+ " WHERE `UID` = ?"); preparedStatement.setByte(1, (value == true) ? (byte) 1 : (byte) 0);
setString(1, name); preparedStatement.setInt(2, city.getObjectUUID());
setInt(2, city.getObjectUUID());
return (executeUpdate() > 0); return (preparedStatement.executeUpdate() > 0);
}
} catch (SQLException e) {
public boolean updateSiegesWithstood(City city, int value) { Logger.error(e);
return false;
prepareCallable("UPDATE `obj_city` SET `siegesWithstood`=?" }
+ " WHERE `UID` = ?"); }
setInt(1, value);
setInt(2, city.getObjectUUID()); public boolean updateTOL(City city, int tolID) {
return (executeUpdate() > 0);
} try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_city` SET `treeOfLifeUUID`=?"
public boolean updateRealmTaxDate(City city, LocalDateTime localDateTime) { + " WHERE `UID` = ?")) {
prepareCallable("UPDATE `obj_city` SET `realmTaxDate` =?" preparedStatement.setInt(1, tolID);
+ " WHERE `UID` = ?"); preparedStatement.setInt(2, city.getObjectUUID());
setLocalDateTime(1, localDateTime);
setInt(2,city.getObjectUUID()); return (preparedStatement.executeUpdate() > 0);
return (executeUpdate() > 0);
} } catch (SQLException e) {
Logger.error(e);
public boolean DELETE_CITY(final City city) { return false;
}
prepareCallable("DELETE FROM `object` WHERE `UID` = ? AND `type` = 'city'");
setInt(1, city.getObjectUUID()); }
return (executeUpdate() != 0);
} public boolean renameCity(City city, String name) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_city` SET `name`=?"
+ " WHERE `UID` = ?")) {
preparedStatement.setString(1, name);
preparedStatement.setInt(2, city.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean updateSiegesWithstood(City city, int value) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_city` SET `name`=?"
+ " WHERE `UID` = ?")) {
preparedStatement.setInt(1, value);
preparedStatement.setInt(2, city.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean updateRealmTaxDate(City city, LocalDateTime localDateTime) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_city` SET `realmTaxDate` =?"
+ " WHERE `UID` = ?")) {
preparedStatement.setTimestamp(1, Timestamp.valueOf(localDateTime));
preparedStatement.setInt(2, city.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
} }

137
src/engine/db/handlers/dbContractHandler.java

@ -16,9 +16,10 @@ import engine.objects.ItemBase;
import engine.objects.MobEquipment; import engine.objects.MobEquipment;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
public class dbContractHandler extends dbHandlerBase { public class dbContractHandler extends dbHandlerBase {
@ -28,48 +29,37 @@ public class dbContractHandler extends dbHandlerBase {
} }
public Contract GET_CONTRACT(final int objectUUID) { public Contract GET_CONTRACT(final int objectUUID) {
Contract contract = (Contract) DbManager.getFromCache(Enum.GameObjectType.Contract, objectUUID); Contract contract = (Contract) DbManager.getFromCache(Enum.GameObjectType.Contract, objectUUID);
if (contract != null) if (contract != null)
return contract; return contract;
if (objectUUID == 0) if (objectUUID == 0)
return null; return null;
prepareCallable("SELECT * FROM `static_npc_contract` WHERE `ID` = ?");
setInt(1, objectUUID);
return (Contract) getObjectSingle(objectUUID);
}
public ArrayList<Contract> GET_CONTRACT_BY_RACE(final int objectUUID) { try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract` WHERE `ID` = ?")) {
ArrayList<Contract> contracts = new ArrayList<>(); preparedStatement.setInt(1, objectUUID);
prepareCallable("SELECT * FROM static_npc_contract WHERE `mobbaseID` =?;"); ResultSet rs = preparedStatement.executeQuery();
setLong(1, objectUUID); contract = (Contract) getObjectFromRs(rs);
try {
ResultSet rs = executeQuery();
//shrines cached in rs for easy cache on creation.
while (rs.next()) {
Contract contract = new Contract(rs);
if (contract != null)
contracts.add(contract);
}
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.getErrorCode() + ' ' + e.getMessage(), e); Logger.error(e);
} finally {
closeCallable();
} }
return contracts; return contract;
} }
public void GET_GENERIC_INVENTORY(final Contract contract) { public void LOAD_CONTRACT_INVENTORY(final Contract contract) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_inventoryset` WHERE `inventorySet` = ?;")) {
prepareCallable("SELECT * FROM `static_npc_inventoryset` WHERE `inventorySet` = ?;"); preparedStatement.setInt(1, contract.inventorySet);
setInt(1, contract.inventorySet);
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
@ -102,56 +92,77 @@ public class dbContractHandler extends dbHandlerBase {
} }
} }
} catch (SQLException e) { } catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode() + ' ' + e.getMessage()); Logger.error(e);
} finally {
closeCallable();
} }
} }
public void GET_SELL_LISTS(final Contract con) { public void LOAD_SELL_LIST_FOR_CONTRACT(final Contract contract) {
prepareCallable("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;");
setInt(1, con.getObjectUUID()); try (Connection connection = DbManager.getConnection();
try { PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
ResultSet rs = executeQuery();
ArrayList<Integer> item = con.getBuyItemType(); preparedStatement.setInt(1, contract.getObjectUUID());
ArrayList<Integer> skill = con.getBuySkillToken();
ArrayList<Integer> unknown = con.getBuyUnknownToken(); ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) { while (rs.next()) {
int type = rs.getInt("type"); int type = rs.getInt("type");
int value = rs.getInt("value"); int value = rs.getInt("value");
if (type == 1) {
item.add(value); switch (type) {
} else if (type == 2) { case 1:
skill.add(value); contract.getBuyItemType().add(value);
} else if (type == 3) { break;
unknown.add(value); case 2:
contract.getBuySkillToken().add(value);
break;
case 3:
contract.getBuyUnknownToken().add(value);
break;
} }
} }
} catch (SQLException e) { } catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode() + ' ' + e.getMessage()); Logger.error(e);
} finally {
closeCallable();
} }
} }
public boolean updateAllowedBuildings(final Contract con, final long slotbitvalue) { public boolean updateAllowedBuildings(final Contract con, final long slotbitvalue) {
prepareCallable("UPDATE `static_npc_contract` SET `allowedBuildingTypeID`=? WHERE `contractID`=?");
setLong(1, slotbitvalue); try (Connection connection = DbManager.getConnection();
setInt(2, con.getContractID()); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `static_npc_contract` SET `allowedBuildingTypeID`=? WHERE `contractID`=?")) {
return (executeUpdate() > 0);
preparedStatement.setLong(1, slotbitvalue);
preparedStatement.setInt(2, con.getContractID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateDatabase(final Contract con) { public boolean updateDatabase(final Contract con) {
prepareCallable("UPDATE `static_npc_contract` SET `contractID`=?, `name`=?, "
+ "`mobbaseID`=?, `classID`=?, vendorDialog=?, iconID=?, allowedBuildingTypeID=? WHERE `ID`=?"); try (Connection connection = DbManager.getConnection();
setInt(1, con.getContractID()); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `static_npc_contract` SET `contractID`=?, `name`=?, "
setString(2, con.getName()); + "`mobbaseID`=?, `classID`=?, vendorDialog=?, iconID=?, allowedBuildingTypeID=? WHERE `ID`=?")) {
setInt(3, con.getMobbaseID());
setInt(4, con.getClassID()); preparedStatement.setInt(1, con.getContractID());
setInt(5, (con.getVendorDialog() != null) ? con.getVendorDialog().getObjectUUID() : 0); preparedStatement.setString(2, con.getName());
setInt(6, con.getIconID()); preparedStatement.setInt(3, con.getMobbaseID());
setInt(8, con.getObjectUUID()); preparedStatement.setInt(4, con.getClassID());
setLong(7, con.getAllowedBuildings().toLong()); preparedStatement.setInt(5, (con.getVendorDialog() != null) ? con.getVendorDialog().getObjectUUID() : 0);
return (executeUpdate() > 0); preparedStatement.setInt(6, con.getIconID());
preparedStatement.setInt(8, con.getObjectUUID());
preparedStatement.setLong(7, con.getAllowedBuildings().toLong());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
} }

402
src/engine/db/handlers/dbEffectsBaseHandler.java

@ -9,173 +9,295 @@
package engine.db.handlers; package engine.db.handlers;
import engine.Enum;
import engine.gameManager.DbManager;
import engine.gameManager.PowersManager;
import engine.powers.EffectsBase;
import engine.powers.effectmodifiers.*;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
public class dbEffectsBaseHandler extends dbHandlerBase { public class dbEffectsBaseHandler extends dbHandlerBase {
public dbEffectsBaseHandler() { public dbEffectsBaseHandler() {
} }
public static ArrayList<EffectsBase> getAllEffectsBase() {
ArrayList<EffectsBase> effectList = new ArrayList<>();
public boolean CreateEffectBase(int token, String IDString,String name,int flags){ try (Connection connection = DbManager.getConnection();
prepareCallable("INSERT INTO `wpak_static_power_effectbase` (`token`,`IDString`,`name`,`flags`) VALUES (?,?,?,?)"); PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM static_power_effectbase ORDER BY `IDString` DESC")) {
setInt(1,token);
setString(2,IDString);
setString(3,name);
setInt(4,flags);
return (executeUpdate() > 0); ResultSet rs = prepareStatement.executeQuery();
}
public boolean CreateEffectBaseRAW(String IDString,String type,String detail){ while (rs.next()) {
prepareCallable("INSERT INTO `wpak_effect_effectbase_raw` (`token`,`IDString`,`name`,`flags`) VALUES (?,?,?,?)"); EffectsBase effectBase = new EffectsBase(rs);
setString(1,IDString); effectList.add(effectBase);
setString(2,type); }
setString(3,detail); } catch (SQLException e) {
Logger.error(e.toString());
}
return (executeUpdate() > 0); return effectList;
} }
public boolean CreateEffectSource(String IDString,String source){ public static void cacheAllEffectModifiers() {
prepareCallable("INSERT INTO `wpak_static_power_sourcetype` (`IDString`,`source`) VALUES (?,?)");
setString(1,IDString);
setString(2,source);
return (executeUpdate() > 0); String IDString;
} AbstractEffectModifier abstractEffectModifier = null;
public boolean CreateEffectSourceRAW(String IDString,String type,String detail){ try (Connection connection = DbManager.getConnection();
prepareCallable("INSERT INTO `wpak_effect_source_raw` (`effectID`,`type`, `text`) VALUES (?,?,?)"); PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM static_power_effectmod")) {
setString(1,IDString); ResultSet rs = prepareStatement.executeQuery();
setString(2,type);
setString(3,detail);
return (executeUpdate() > 0); while (rs.next()) {
}
public boolean CreateEffectCondition(String IDString,String powerOrEffect,String type,float amount,float ramp,byte useAddFormula,String damageType1,String damageType2,String damageType3){ IDString = rs.getString("IDString");
prepareCallable("INSERT INTO `wpak_static_power_failcondition` (`IDString`,`powerOrEffect`,`type`,`amount`,`ramp`,`useAddFormula`,`damageType1`,`damageType2`,`damageType3`) VALUES (?,?,?,?,?,?,?,?,?)"); EffectsBase effectBase = PowersManager.getEffectByIDString(IDString);
setString(1,IDString); Enum.ModType modifier = Enum.ModType.GetModType(rs.getString("modType"));
setString(2,powerOrEffect);
setString(3,type);
setFloat(4,amount);
setFloat(5,ramp);
setByte(6,useAddFormula);
setString(7,damageType1);
setString(8,damageType2);
setString(9,damageType3);
return (executeUpdate() > 0);
}
public boolean CreateEffectConditionRAW(String IDString,String type,String detail){ //combine item prefix and suffix effect modifiers
prepareCallable("INSERT INTO `wpak_effect_condition_raw` (`effectID`,`type`, `text`) VALUES (?,?,?)");
setString(1,IDString);
setString(2,type);
setString(3,detail);
return (executeUpdate() > 0);
}
public boolean CreateEffectMod(String IDString,String modType,float minMod,float maxMod,float percentMod,float ramp,byte useRampAdd,String type,String string1,String string2){ abstractEffectModifier = getCombinedModifiers(abstractEffectModifier, rs, effectBase, modifier);
prepareCallable("INSERT INTO `wpak_static_power_effectmod` (`IDString`,`modType`,`minMod`,`maxMod`,`percentMod`,`ramp`,`useRampAdd`,`type`,`string1`,`string2`) VALUES (?,?,?,?,?,?,?,?,?,?)");
setString(1, IDString);
setString(2, modType);
setFloat(3, minMod);
setFloat(4, maxMod);
setFloat(5, percentMod);
setFloat(6, ramp);
setByte(7, useRampAdd);
setString(8, type);
setString(9, string1);
setString(10, string2);
return (executeUpdate() > 0);
}
public boolean CreateEffectModRAW(String IDString,String type,String detail){ if (abstractEffectModifier != null) {
prepareCallable("INSERT INTO `wpak_effect_mod_raw` (`effectID`,`type`, `text`) VALUES (?,?,?)");
setString(1,IDString);
setString(2,type);
setString(3,detail);
return (executeUpdate() > 0); if (EffectsBase.modifiersMap.containsKey(effectBase.getIDString()) == false)
} EffectsBase.modifiersMap.put(effectBase.getIDString(), new HashSet<>());
EffectsBase.modifiersMap.get(effectBase.getIDString()).add(abstractEffectModifier);
public boolean CreatePowerPowerAction(String IDString,String type,String effectID,String effectID2,String deferredPowerID,float levelCap,float levelCapRamp,String damageType,int numIterations,String effectSourceToRemove,String trackFilter,int maxTrack,int mobID,int mobLevel,int simpleDamage,String transferFromType,String transferToType,float transferAmount,float transferRamp,float transferEfficiency,float transferEfficiencyRamp,int flags){ }
prepareCallable("INSERT INTO `wpak_static_power_poweraction` (`IDString`,`type`,`effectID`,`effectID2`,`deferredPowerID`,`levelCap`,`levelCapRamp`,`damageType`,`numIterations`,`effectSourceToRemove`,`trackFilter`,`maxTrack`,`mobID`,`mobLevel`,`simpleDamage`,`transferFromType`,`transferToType`,`transferAmount`,`transferRamp`,`transferEfficiency`,`transferEfficiencyRamp`,`flags`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
setString(1,IDString);
setString(2,type);
setString(3,effectID);
setString(4,effectID2);
setString(5,deferredPowerID);
setFloat(6,levelCap);
setFloat(7,levelCapRamp);
setString(8,damageType);
setInt(9,numIterations);
setString(10,effectSourceToRemove);
setString(11,trackFilter);
setInt(12,maxTrack);
setInt(13,mobID);
setInt(14,mobLevel);
setInt(15,simpleDamage);
setString(16,transferFromType);
setString(17,transferToType);
setFloat(18,transferAmount);
setFloat(19,transferRamp);
setFloat(20,transferEfficiency);
setFloat(21,transferEfficiencyRamp);
setInt(22,flags);
return (executeUpdate() > 0);
}
public boolean CreatePowerPowerActionRAW(String IDString,String type,String detail){ }
prepareCallable("INSERT INTO `wpak_effect_poweraction_raw` (`effectID`,`type`, `text`) VALUES (?,?,?)");
setString(1,IDString); } catch (Exception e) {
setString(2,type); Logger.error(e);
setString(3,detail); }
return (executeUpdate() > 0);
} }
public boolean ClearAllEffectBase(){ private static AbstractEffectModifier getCombinedModifiers(AbstractEffectModifier abstractEffectModifier, ResultSet rs, EffectsBase effectBase, Enum.ModType modifier) throws SQLException {
prepareCallable("DELETE from `wpak_static_power_effectbase`"); switch (modifier) {
executeUpdate(); case AdjustAboveDmgCap:
abstractEffectModifier = new AdjustAboveDmgCapEffectModifier(rs);
prepareCallable(" DELETE from `wpak_static_power_sourcetype` "); break;
executeUpdate(); case Ambidexterity:
abstractEffectModifier = new AmbidexterityEffectModifier(rs);
prepareCallable(" DELETE from `wpak_static_power_failcondition` WHERE `powerOrEffect` = ?"); break;
setString(1,"Effect"); case AnimOverride:
executeUpdate(); break;
case ArmorPiercing:
prepareCallable(" DELETE from `wpak_static_power_effectmod` "); abstractEffectModifier = new ArmorPiercingEffectModifier(rs);
executeUpdate(); break;
case AttackDelay:
return true; abstractEffectModifier = new AttackDelayEffectModifier(rs);
break;
case Attr:
abstractEffectModifier = new AttributeEffectModifier(rs);
break;
case BlackMantle:
abstractEffectModifier = new BlackMantleEffectModifier(rs);
break;
case BladeTrails:
abstractEffectModifier = new BladeTrailsEffectModifier(rs);
break;
case Block:
abstractEffectModifier = new BlockEffectModifier(rs);
break;
case BlockedPowerType:
abstractEffectModifier = new BlockedPowerTypeEffectModifier(rs);
break;
case CannotAttack:
abstractEffectModifier = new CannotAttackEffectModifier(rs);
break;
case CannotCast:
abstractEffectModifier = new CannotCastEffectModifier(rs);
break;
case CannotMove:
abstractEffectModifier = new CannotMoveEffectModifier(rs);
break;
case CannotTrack:
abstractEffectModifier = new CannotTrackEffectModifier(rs);
break;
case Charmed:
abstractEffectModifier = new CharmedEffectModifier(rs);
break;
case ConstrainedAmbidexterity:
abstractEffectModifier = new ConstrainedAmbidexterityEffectModifier(rs);
break;
case DamageCap:
abstractEffectModifier = new DamageCapEffectModifier(rs);
break;
case DamageShield:
abstractEffectModifier = new DamageShieldEffectModifier(rs);
break;
case DCV:
abstractEffectModifier = new DCVEffectModifier(rs);
break;
case Dodge:
abstractEffectModifier = new DodgeEffectModifier(rs);
break;
case DR:
abstractEffectModifier = new DREffectModifier(rs);
break;
case Durability:
abstractEffectModifier = new DurabilityEffectModifier(rs);
break;
case ExclusiveDamageCap:
abstractEffectModifier = new ExclusiveDamageCapEffectModifier(rs);
break;
case Fade:
abstractEffectModifier = new FadeEffectModifier(rs);
break;
case Fly:
abstractEffectModifier = new FlyEffectModifier(rs);
break;
case Health:
abstractEffectModifier = new HealthEffectModifier(rs);
break;
case HealthFull:
abstractEffectModifier = new HealthFullEffectModifier(rs);
break;
case HealthRecoverRate:
abstractEffectModifier = new HealthRecoverRateEffectModifier(rs);
break;
case IgnoreDamageCap:
abstractEffectModifier = new IgnoreDamageCapEffectModifier(rs);
break;
case IgnorePassiveDefense:
abstractEffectModifier = new IgnorePassiveDefenseEffectModifier(rs);
break;
case ImmuneTo:
abstractEffectModifier = new ImmuneToEffectModifier(rs);
break;
case ImmuneToAttack:
abstractEffectModifier = new ImmuneToAttackEffectModifier(rs);
break;
case ImmuneToPowers:
abstractEffectModifier = new ImmuneToPowersEffectModifier(rs);
break;
case Invisible:
abstractEffectModifier = new InvisibleEffectModifier(rs);
break;
case ItemName:
abstractEffectModifier = new ItemNameEffectModifier(rs);
if (((ItemNameEffectModifier) abstractEffectModifier).name.isEmpty())
break;
if (effectBase != null)
effectBase.setName((((ItemNameEffectModifier) abstractEffectModifier).name));
break;
case Mana:
abstractEffectModifier = new ManaEffectModifier(rs);
break;
case ManaFull:
abstractEffectModifier = new ManaFullEffectModifier(rs);
break;
case ManaRecoverRate:
abstractEffectModifier = new ManaRecoverRateEffectModifier(rs);
break;
case MaxDamage:
abstractEffectModifier = new MaxDamageEffectModifier(rs);
break;
case MeleeDamageModifier:
abstractEffectModifier = new MeleeDamageEffectModifier(rs);
break;
case MinDamage:
abstractEffectModifier = new MinDamageEffectModifier(rs);
break;
case NoMod:
abstractEffectModifier = new NoModEffectModifier(rs);
break;
case OCV:
abstractEffectModifier = new OCVEffectModifier(rs);
break;
case Parry:
abstractEffectModifier = new ParryEffectModifier(rs);
break;
case PassiveDefense:
abstractEffectModifier = new PassiveDefenseEffectModifier(rs);
break;
case PowerCost:
abstractEffectModifier = new PowerCostEffectModifier(rs);
break;
case PowerCostHealth:
abstractEffectModifier = new PowerCostHealthEffectModifier(rs);
break;
case PowerDamageModifier:
abstractEffectModifier = new PowerDamageEffectModifier(rs);
break;
case ProtectionFrom:
abstractEffectModifier = new ProtectionFromEffectModifier(rs);
break;
case Resistance:
abstractEffectModifier = new ResistanceEffectModifier(rs);
break;
case ScaleHeight:
abstractEffectModifier = new ScaleHeightEffectModifier(rs);
break;
case ScaleWidth:
abstractEffectModifier = new ScaleWidthEffectModifier(rs);
break;
case ScanRange:
abstractEffectModifier = new ScanRangeEffectModifier(rs);
break;
case SeeInvisible:
abstractEffectModifier = new SeeInvisibleEffectModifier(rs);
break;
case Silenced:
abstractEffectModifier = new SilencedEffectModifier(rs);
break;
case Skill:
abstractEffectModifier = new SkillEffectModifier(rs);
break;
case Slay:
abstractEffectModifier = new SlayEffectModifier(rs);
break;
case Speed:
abstractEffectModifier = new SpeedEffectModifier(rs);
break;
case SpireBlock:
abstractEffectModifier = new SpireBlockEffectModifier(rs);
break;
case Stamina:
abstractEffectModifier = new StaminaEffectModifier(rs);
break;
case StaminaFull:
abstractEffectModifier = new StaminaFullEffectModifier(rs);
break;
case StaminaRecoverRate:
abstractEffectModifier = new StaminaRecoverRateEffectModifier(rs);
break;
case Stunned:
abstractEffectModifier = new StunnedEffectModifier(rs);
break;
case Value:
abstractEffectModifier = new ValueEffectModifier(rs);
if (effectBase != null) {
ValueEffectModifier valueEffect = (ValueEffectModifier) abstractEffectModifier;
effectBase.setValue(valueEffect.minMod);
}
break;
case WeaponProc:
abstractEffectModifier = new WeaponProcEffectModifier(rs);
break;
case WeaponRange:
abstractEffectModifier = new WeaponRangeEffectModifier(rs);
break;
case WeaponSpeed:
abstractEffectModifier = new WeaponSpeedEffectModifier(rs);
break;
}
return abstractEffectModifier;
} }
public boolean ResetIncrement(){
prepareCallable("ALTER TABLE `wpak_static_power_effectbase` AUTO_INCREMENT = 1");
executeUpdate();
prepareCallable("ALTER TABLE `wpak_static_power_sourcetype` AUTO_INCREMENT = 1");
executeUpdate();
prepareCallable("ALTER TABLE `wpak_static_power_failcondition` AUTO_INCREMENT = 1");
executeUpdate();
prepareCallable("ALTER TABLE `wpak_static_power_effectmod` AUTO_INCREMENT = 1");
executeUpdate();
return true;
}
} }

33
src/engine/db/handlers/dbEffectsResourceCostHandler.java

@ -9,22 +9,39 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.EffectsResourceCosts; import engine.objects.EffectsResourceCosts;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
public class dbEffectsResourceCostHandler extends dbHandlerBase { public class dbEffectsResourceCostHandler extends dbHandlerBase {
public dbEffectsResourceCostHandler() { public dbEffectsResourceCostHandler() {
this.localClass = EffectsResourceCosts.class; this.localClass = EffectsResourceCosts.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public ArrayList<EffectsResourceCosts> GET_ALL_EFFECT_RESOURCES(String idString) {
ArrayList<EffectsResourceCosts> effectsResourceCosts = new ArrayList<>();
public ArrayList<EffectsResourceCosts> GET_ALL_EFFECT_RESOURCES(String idString) { try (Connection connection = DbManager.getConnection();
prepareCallable("SELECT * FROM `static_power_effectcost` WHERE `IDString` = ?"); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_power_effectcost` WHERE `IDString` = ?")) {
setString(1, idString);
return getObjectList(); preparedStatement.setString(1, idString);
}
ResultSet rs = preparedStatement.executeQuery();
effectsResourceCosts = getObjectsFromRs(rs, 1000);
} catch (SQLException e) {
Logger.error(e);
}
return effectsResourceCosts;
}
} }

82
src/engine/db/handlers/dbEnchantmentHandler.java

@ -9,43 +9,67 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class dbEnchantmentHandler extends dbHandlerBase { public class dbEnchantmentHandler extends dbHandlerBase {
public ConcurrentHashMap<String, Integer> GET_ENCHANTMENTS_FOR_ITEM(final int id) { public ConcurrentHashMap<String, Integer> GET_ENCHANTMENTS_FOR_ITEM(final int id) {
ConcurrentHashMap<String, Integer> enchants = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
prepareCallable("SELECT * FROM `dyn_item_enchantment` WHERE `ItemID`=?;");
setLong(1, (long)id);
try {
ResultSet resultSet = executeQuery();
while (resultSet.next())
enchants.put(resultSet.getString("powerAction"), resultSet.getInt("rank"));
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
} finally {
closeCallable();
}
return enchants;
}
public boolean CREATE_ENCHANTMENT_FOR_ITEM(long itemID, String powerAction, int rank) {
prepareCallable("INSERT INTO `dyn_item_enchantment` (`itemID`, `powerAction`, `rank`) VALUES (?, ?, ?);");
setLong(1, itemID);
setString(2, powerAction);
setInt(3, rank);
return (executeUpdate() != 0);
}
public boolean CLEAR_ENCHANTMENTS(long itemID) {
prepareCallable("DELETE FROM `dyn_item_enchantment` WHERE `itemID`=?;");
setLong(1, itemID);
return (executeUpdate() != 0);
}
ConcurrentHashMap<String, Integer> enchants = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_item_enchantment` WHERE `ItemID`=?;")) {
preparedStatement.setLong(1, id);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
enchants.put(rs.getString("powerAction"), rs.getInt("rank"));
} catch (SQLException e) {
Logger.error(e);
}
return enchants;
}
public boolean CREATE_ENCHANTMENT_FOR_ITEM(long itemID, String powerAction, int rank) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_item_enchantment` (`itemID`, `powerAction`, `rank`) VALUES (?, ?, ?);")) {
preparedStatement.setLong(1, itemID);
preparedStatement.setString(2, powerAction);
preparedStatement.setInt(3, rank);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean CLEAR_ENCHANTMENTS(long itemID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `dyn_item_enchantment` WHERE `itemID`=?;")) {
preparedStatement.setLong(1, itemID);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
} }

1099
src/engine/db/handlers/dbGuildHandler.java

File diff suppressed because it is too large Load Diff

473
src/engine/db/handlers/dbHandlerBase.java

@ -15,456 +15,63 @@ import engine.gameManager.ConfigManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.AbstractWorldObject; import engine.objects.AbstractWorldObject;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.*; import java.sql.ResultSet;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
public abstract class dbHandlerBase { public abstract class dbHandlerBase {
/* protected Class<? extends AbstractGameObject> localClass = null;
* CallableStatements handled below this line! protected GameObjectType localObjectType;
*/
protected Class<? extends AbstractGameObject> localClass = null;
protected GameObjectType localObjectType;
protected final ThreadLocal<CallableStatement> cs = new ThreadLocal<>();
protected final void prepareCallable(final String sql) { protected <T extends AbstractGameObject> AbstractGameObject getObjectFromRs(ResultSet rs) {
try {
this.cs.set((CallableStatement) DbManager.getConn().prepareCall(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY));
} catch (SQLException e) {
Logger.error("DbManager.getConn", e);
Logger.error("SQL Error number: " + e.getErrorCode());
}
}
protected final void setDate(int parameterIndex, Date value) { AbstractGameObject abstractGameObject = null;
try {
this.cs.get().setDate(parameterIndex, value);
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
}
}
protected final void setInt(int parameterIndex, int value) { try {
try { if (rs.next()) {
this.cs.get().setInt(parameterIndex, value); abstractGameObject = localClass.getConstructor(ResultSet.class).newInstance(rs);
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
}
}
protected final void setLong(int parameterIndex, long value) { DbManager.addToCache(abstractGameObject);
try { }
this.cs.get().setLong(parameterIndex, value); } catch (Exception e) {
} catch (SQLException e) { Logger.error(e);
Logger.error("SQL Error number: " + e.getErrorCode()); }
}
}
protected final void setFloat(int parameterIndex, float value) { // Only call runAfterLoad() for objects instanced on the world server
try {
this.cs.get().setFloat(parameterIndex, value);
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
}
}
protected final void setShort(int parameterIndex, short value) { if ((abstractGameObject != null && abstractGameObject instanceof AbstractWorldObject) &&
try { (ConfigManager.serverType.equals(Enum.ServerType.WORLDSERVER) ||
this.cs.get().setShort(parameterIndex, value); (abstractGameObject.getObjectType() == GameObjectType.Guild)))
} catch (SQLException e) { ((AbstractWorldObject) abstractGameObject).runAfterLoad();
Logger.error("SQL Error number: " + e.getErrorCode());
}
}
protected final void setString(int parameterIndex, String value) { return abstractGameObject;
try { }
this.cs.get().setString(parameterIndex, value);
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
}
}
protected final void setBytes(int parameterIndex, byte[] value) { protected <T extends AbstractGameObject> ArrayList<T> getObjectsFromRs(ResultSet rs, int listSize) {
try {
this.cs.get().setBytes(parameterIndex, value);
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
}
}
protected final void setByte(int parameterIndex, byte value) { ArrayList<T> objectList = new ArrayList<>(listSize);
try {
this.cs.get().setByte(parameterIndex, value);
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
}
}
protected final void setBoolean(int parameterIndex, boolean value) { try {
try { while (rs.next()) {
this.cs.get().setBoolean(parameterIndex, value);
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
}
}
protected final void setNULL(int parameterIndex, int type) { int id = rs.getInt(1);
try {
this.cs.get().setNull(parameterIndex, type);
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
}
}
protected final void setLocalDateTime(int parameterIndex, LocalDateTime localDateTime) { if (DbManager.inCache(localObjectType, id)) {
objectList.add((T) DbManager.getFromCache(localObjectType, id));
} else {
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
DbManager.addToCache(toAdd);
objectList.add((T) toAdd);
try { if (toAdd != null && toAdd instanceof AbstractWorldObject)
this.cs.get().setTimestamp(parameterIndex, Timestamp.valueOf(localDateTime)); ((AbstractWorldObject) toAdd).runAfterLoad();
} catch (SQLException e) { }
Logger.error("SQL Error number: " + e.getErrorCode()); }
} } catch (Exception e) {
} Logger.error(e);
}
protected final void setTimeStamp(int parameterIndex, long time) { return objectList;
try { }
this.cs.get().setTimestamp(parameterIndex, new java.sql.Timestamp(time));
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
}
}
protected final boolean execute() {
try {
return this.cs.get().execute();
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
logSQLCommand();
}
return false;
}
protected final ResultSet executeQuery() {
try {
return this.cs.get().executeQuery();
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
logSQLCommand();
}
return null;
}
protected final int executeUpdate() {
return executeUpdate(true);
}
protected final int executeUpdate(boolean close) {
try {
return this.cs.get().executeUpdate();
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
logSQLCommand();
} finally {
if (close)
closeCallable();
}
return 0;
}
protected final void logSQLCommand() {
try {
Logger.error("Failed SQL Command: " + this.cs.get().toString());
} catch (Exception e) {
}
}
// Common return values from the database when calling stored procedures, abstracted to this layer
protected final String getResult(){
try {
ResultSet rs = this.executeQuery();
if (rs.next() && !isError(rs))
return rs.getString("result");
} catch (SQLException e) {
Logger.error(e);
logSQLCommand();
} finally {
closeCallable();
}
return null;
}
// Used for Stored procedures that return true when they succeed.
protected final boolean worked() {
try {
ResultSet rs = this.executeQuery();
if (rs.next() && !isError(rs))
return rs.getBoolean("result");
} catch (SQLException e) {
Logger.error(e);
logSQLCommand();
} finally {
closeCallable();
}
return false;
}
// Common return values from the database when calling stored procedures, abstracted to this layer
protected final long getUUID(){
try {
ResultSet rs = this.executeQuery();
if (rs.next() && !isError(rs))
return rs.getLong("UID");
} catch (SQLException e) {
Logger.error(e);
logSQLCommand();
} finally {
closeCallable();
}
return -1;
}
protected final String getString(String field) {
try {
ResultSet rs = this.executeQuery();
if (rs.next())
return rs.getString(field);
} catch (SQLException e) {
Logger.error(e);
logSQLCommand();
} finally {
closeCallable();
}
return "";
}
protected final long getLong(String field) {
try {
ResultSet rs = this.executeQuery();
if (rs.next())
return rs.getLong(field);
} catch (SQLException e) {
Logger.error(e);
logSQLCommand();
} finally {
closeCallable();
}
return 0L;
}
protected final int getInt(String field) {
try {
ResultSet rs = this.executeQuery();
if (rs.next())
return rs.getInt(field);
} catch (SQLException e) {
Logger.error(e);
logSQLCommand();
} finally {
closeCallable();
}
return 0;
}
protected final int insertGetUUID() {
int key = 0;
try {
this.cs.get().executeUpdate();
ResultSet rs = this.cs.get().getGeneratedKeys();
if (rs.next())
key = rs.getInt(1);
} catch (SQLException e) {
Logger.error(e);
logSQLCommand();
} finally {
closeCallable();
}
return key;
}
protected final boolean isError(ResultSet rs) throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
if (rsmd.getColumnCount() > 0 && !rsmd.getColumnName(1).equals("errorno"))
return false;
printError(rs);
return true;
}
protected final void printError(ResultSet rs) {
try {
int errorNum = rs.getInt("errorno");
String errorMsg = rs.getString("errormsg");
Logger.error("SQLError: errorNum: " + errorNum + ", errorMsg: " + errorMsg);
logSQLCommand();
} catch (SQLException e) {}
}
protected final void getColumNames(ResultSet rs) throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
int numColumns = rsmd.getColumnCount();
String out = "Column names for resultSet: ";
for (int i=1; i<numColumns+1; i++)
out += i + ": " + rsmd.getColumnName(i) + ", ";
Logger.info(out);
}
// Default actions to the objects table, generic to all objects
protected final long SET_PARENT(long objUID, long new_value, long old_value) {
prepareCallable("CALL object_GETSETPARENT(?,?,?)");
setLong(1, objUID);
setLong(2, new_value);
setLong(3, old_value);
return getUUID();
}
// NOTE: CALLING THIS FUNCTION CASCADE DELETES OBJECTS FROM THE DATABASE
protected final long REMOVE(long objUID) {
prepareCallable("CALL object_PURGECASCADE(?)");
setLong(1, objUID);
return getUUID();
}
protected <T extends AbstractGameObject> AbstractGameObject getObjectSingle(int id) {
return getObjectSingle(id, false, true);
}
protected <T extends AbstractGameObject> AbstractGameObject getObjectSingle(int id, boolean forceFromDB, boolean storeInCache) {
if (cs.get() == null){
return null;
}
if (!forceFromDB) {
if (DbManager.inCache(localObjectType, id)) {
closeCallable();
return DbManager.getFromCache(localObjectType, id);
}
}
AbstractGameObject out = null;
try {
if (MBServerStatics.DB_ENABLE_QUERY_OUTPUT)
Logger.info( "[GetObjectList] Executing query:" + cs.get().toString());
ResultSet rs = cs.get().executeQuery();
if (rs.next()) {
out = localClass.getConstructor(ResultSet.class).newInstance(rs);
if (storeInCache)
DbManager.addToCache(out);
}
rs.close();
} catch (Exception e) {
Logger.error("AbstractGameObject", e);
out = null;
} finally {
closeCallable();
}
// Only call runAfterLoad() for objects instanced on the world server
if ((out != null && out instanceof AbstractWorldObject) &&
(ConfigManager.serverType.equals(Enum.ServerType.WORLDSERVER) ||
(out.getObjectType() == GameObjectType.Guild)))
((AbstractWorldObject)out).runAfterLoad();
return out;
}
protected void closeCallable() {
try {
if (this.cs.get() != null)
this.cs.get().close();
} catch (SQLException e) {}
}
protected <T extends AbstractGameObject> ArrayList<T> getObjectList() {
return getObjectList(20, false);
}
protected <T extends AbstractGameObject> ArrayList<T> getLargeObjectList() {
return getObjectList(2000, false);
}
@SuppressWarnings("unchecked")
protected <T extends AbstractGameObject> ArrayList<T> getObjectList(int listSize, boolean forceFromDB) {
String query = "No Callable Statement accessable.";
ArrayList<T> out = new ArrayList<>(listSize);
if (this.cs.get() == null)
return out;
try {
CallableStatement css = this.cs.get();
if (css != null)
query = this.cs.get().toString();
if (MBServerStatics.DB_ENABLE_QUERY_OUTPUT)
Logger.info( "[GetObjectList] Executing query:" + query);
ResultSet rs = this.cs.get().executeQuery();
while (rs.next()) {
int id = rs.getInt(1);
if (!forceFromDB && DbManager.inCache(localObjectType, id)) {
out.add((T) DbManager.getFromCache(localObjectType, id));
} else {
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
DbManager.addToCache(toAdd);
out.add((T) toAdd);
if (toAdd != null && toAdd instanceof AbstractWorldObject)
((AbstractWorldObject)toAdd).runAfterLoad();
}
}
rs.close();
} catch (Exception e) {
Logger.error(localClass.getCanonicalName(), "List Failure: " + query, e);
e.printStackTrace();
return new ArrayList<>(); // Do we want a null return on error?
} finally {
closeCallable();
}
return out;
}
/* Prepared Statements handled below this line */
protected HashSet<Integer> getIntegerList(final int columnNumber) {
if (MBServerStatics.DB_ENABLE_QUERY_OUTPUT)
Logger.info("[GetIntegerList] Executing query:" + this.cs.toString());
HashSet<Integer> out = new HashSet<>();
try {
ResultSet rs = executeQuery();
while (rs.next()) {
out.add(rs.getInt(columnNumber));
}
rs.close();
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
} finally {
closeCallable();
}
return out;
}
} }

48
src/engine/db/handlers/dbHeightMapHandler.java

@ -1,47 +1,43 @@
package engine.db.handlers; package engine.db.handlers;
import engine.InterestManagement.HeightMap; import engine.InterestManagement.HeightMap;
import engine.gameManager.DbManager;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
public class dbHeightMapHandler extends dbHandlerBase { public class dbHeightMapHandler extends dbHandlerBase {
public dbHeightMapHandler() { public dbHeightMapHandler() {
} }
public void LOAD_ALL_HEIGHTMAPS() { public void LOAD_ALL_HEIGHTMAPS() {
HeightMap thisHeightmap; HeightMap thisHeightmap;
HeightMap.heightMapsCreated = 0;
int recordsRead = 0; try (Connection connection = DbManager.getConnection();
int worthlessDupes = 0; PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_zone_heightmap INNER JOIN static_zone_size ON static_zone_size.loadNum = static_zone_heightmap.zoneLoadID")) {
HeightMap.heightMapsCreated = 0; ResultSet rs = preparedStatement.executeQuery();
prepareCallable("SELECT * FROM static_zone_heightmap INNER JOIN static_zone_size ON static_zone_size.loadNum = static_zone_heightmap.zoneLoadID"); while (rs.next()) {
thisHeightmap = new HeightMap(rs);
try { if (thisHeightmap.getHeightmapImage() == null) {
ResultSet rs = executeQuery(); Logger.info("Imagemap for " + thisHeightmap.getHeightMapID() + " was null");
continue;
}
}
while (rs.next()) { } catch (SQLException e) {
Logger.error(e);
recordsRead++; }
thisHeightmap = new HeightMap(rs); }
if (thisHeightmap.getHeightmapImage() == null) {
Logger.info( "Imagemap for " + thisHeightmap.getHeightMapID() + " was null");
continue;
}
}
} catch (SQLException e) {
Logger.error("LoadAllHeightMaps: " + e.getErrorCode() + ' ' + e.getMessage(), e);
} finally {
closeCallable();
}
}
} }

102
src/engine/db/handlers/dbItemBaseHandler.java

@ -9,10 +9,13 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.BootySetEntry; import engine.objects.BootySetEntry;
import engine.objects.ItemBase; import engine.objects.ItemBase;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -20,29 +23,26 @@ import java.util.HashMap;
public class dbItemBaseHandler extends dbHandlerBase { public class dbItemBaseHandler extends dbHandlerBase {
public dbItemBaseHandler() { public dbItemBaseHandler() {
} }
public void LOAD_BAKEDINSTATS(ItemBase itemBase) { public void LOAD_BAKEDINSTATS(ItemBase itemBase) {
try { try (Connection connection = DbManager.getConnection();
prepareCallable("SELECT * FROM `static_item_bakedinstat` WHERE `itemID` = ?"); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_item_bakedinstat` WHERE `itemID` = ?")) {
setInt(1, itemBase.getUUID());
ResultSet rs = executeQuery(); preparedStatement.setInt(1, itemBase.getUUID());
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) { while (rs.next()) {
if (rs.getBoolean("fromUse")) if (rs.getBoolean("fromUse"))
itemBase.getUsedStats().put(rs.getInt("token"), rs.getInt("numTrains")); itemBase.getUsedStats().put(rs.getInt("token"), rs.getInt("numTrains"));
else else
itemBase.getBakedInStats().put(rs.getInt("token"), rs.getInt("numTrains")); itemBase.getBakedInStats().put(rs.getInt("token"), rs.getInt("numTrains"));
} }
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e);
} finally {
closeCallable();
} }
} }
@ -50,27 +50,24 @@ public class dbItemBaseHandler extends dbHandlerBase {
ArrayList<Integer> tempList = new ArrayList<>(); ArrayList<Integer> tempList = new ArrayList<>();
ArrayList<Integer> tempListOff = new ArrayList<>(); ArrayList<Integer> tempListOff = new ArrayList<>();
try {
prepareCallable("SELECT * FROM `static_itembase_animations` WHERE `itemBaseUUID` = ?");
setInt(1, itemBase.getUUID());
ResultSet rs = executeQuery(); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_itembase_animations` WHERE `itemBaseUUID` = ?")) {
preparedStatement.setInt(1, itemBase.getUUID());
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) { while (rs.next()) {
int animation = rs.getInt("animation"); int animation = rs.getInt("animation");
boolean rightHand = rs.getBoolean("rightHand"); boolean rightHand = rs.getBoolean("rightHand");
if (rightHand) if (rightHand)
tempList.add(animation); tempList.add(animation);
else else
tempListOff.add(animation); tempListOff.add(animation);
} }
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e);
} finally {
closeCallable();
} }
itemBase.setAnimations(tempList); itemBase.setAnimations(tempList);
@ -80,44 +77,37 @@ public class dbItemBaseHandler extends dbHandlerBase {
public void LOAD_ALL_ITEMBASES() { public void LOAD_ALL_ITEMBASES() {
ItemBase itemBase; ItemBase itemBase;
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT * FROM static_itembase"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_itembase")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
recordsRead++; recordsRead++;
itemBase = new ItemBase(rs); itemBase = new ItemBase(rs);
// Add ItemBase to internal cache
ItemBase.addToCache(itemBase); ItemBase.addToCache(itemBase);
} }
Logger.info( "read: " + recordsRead + "cached: " + ItemBase.getUUIDCache().size());
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e);
} finally {
closeCallable();
} }
Logger.info("read: " + recordsRead + " cached: " + ItemBase.getUUIDCache().size());
} }
public HashMap<Integer, ArrayList<Integer>> LOAD_RUNES_FOR_NPC_AND_MOBS() { public HashMap<Integer, ArrayList<Integer>> LOAD_RUNES_FOR_NPC_AND_MOBS() {
HashMap<Integer, ArrayList<Integer>> runeSets = new HashMap<>(); HashMap<Integer, ArrayList<Integer>> runeSets = new HashMap<>();
int runeSetID; int runeSetID;
int runeBaseID; int runeBaseID;
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT * FROM static_npc_runeSet"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_npc_runeSet")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
@ -126,25 +116,23 @@ public class dbItemBaseHandler extends dbHandlerBase {
runeSetID = rs.getInt("runeSet"); runeSetID = rs.getInt("runeSet");
runeBaseID = rs.getInt("runeBase"); runeBaseID = rs.getInt("runeBase");
if (runeSets.get(runeSetID) == null){ if (runeSets.get(runeSetID) == null) {
ArrayList<Integer> runeList = new ArrayList<>(); ArrayList<Integer> runeList = new ArrayList<>();
runeList.add(runeBaseID); runeList.add(runeBaseID);
runeSets.put(runeSetID, runeList); runeSets.put(runeSetID, runeList);
} } else {
else{ ArrayList<Integer> runeList = runeSets.get(runeSetID);
ArrayList<Integer>runeList = runeSets.get(runeSetID);
runeList.add(runeSetID); runeList.add(runeSetID);
runeSets.put(runeSetID, runeList); runeSets.put(runeSetID, runeList);
} }
} }
Logger.info("read: " + recordsRead + " cached: " + runeSets.size());
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e);
} finally { return runeSets;
closeCallable();
} }
Logger.info("read: " + recordsRead + " cached: " + runeSets.size());
return runeSets; return runeSets;
} }
@ -152,14 +140,13 @@ public class dbItemBaseHandler extends dbHandlerBase {
HashMap<Integer, ArrayList<BootySetEntry>> bootySets = new HashMap<>(); HashMap<Integer, ArrayList<BootySetEntry>> bootySets = new HashMap<>();
BootySetEntry bootySetEntry; BootySetEntry bootySetEntry;
int bootySetID; int bootySetID;
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT * FROM static_npc_bootySet"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_npc_bootySet")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
@ -168,25 +155,22 @@ public class dbItemBaseHandler extends dbHandlerBase {
bootySetID = rs.getInt("bootySet"); bootySetID = rs.getInt("bootySet");
bootySetEntry = new BootySetEntry(rs); bootySetEntry = new BootySetEntry(rs);
if (bootySets.get(bootySetID) == null){ if (bootySets.get(bootySetID) == null) {
ArrayList<BootySetEntry> bootyList = new ArrayList<>(); ArrayList<BootySetEntry> bootyList = new ArrayList<>();
bootyList.add(bootySetEntry); bootyList.add(bootySetEntry);
bootySets.put(bootySetID, bootyList); bootySets.put(bootySetID, bootyList);
} } else {
else{ ArrayList<BootySetEntry> bootyList = bootySets.get(bootySetID);
ArrayList<BootySetEntry>bootyList = bootySets.get(bootySetID);
bootyList.add(bootySetEntry); bootyList.add(bootySetEntry);
bootySets.put(bootySetID, bootyList); bootySets.put(bootySetID, bootyList);
} }
} }
Logger.info("read: " + recordsRead + " cached: " + bootySets.size());
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e);
} finally { return bootySets;
closeCallable();
} }
Logger.info("read: " + recordsRead + " cached: " + bootySets.size());
return bootySets; return bootySets;
} }
} }

881
src/engine/db/handlers/dbItemHandler.java

@ -11,420 +11,489 @@ package engine.db.handlers;
import engine.Enum.ItemContainerType; import engine.Enum.ItemContainerType;
import engine.Enum.ItemType; import engine.Enum.ItemType;
import engine.Enum.OwnerType; import engine.gameManager.DbManager;
import engine.objects.*; import engine.objects.AbstractCharacter;
import engine.objects.CharacterItemManager;
import engine.objects.Item;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
public class dbItemHandler extends dbHandlerBase { public class dbItemHandler extends dbHandlerBase {
public dbItemHandler() { public dbItemHandler() {
this.localClass = Item.class; this.localClass = Item.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public Item ADD_ITEM(Item toAdd) { private static String formatTradeString(HashSet<Integer> list) {
prepareCallable("CALL `item_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?,?);"); int size = list.size();
setInt(1, toAdd.getOwnerID());
setInt(2, toAdd.getItemBaseID()); String ret = "";
setInt(3, toAdd.getChargesRemaining());
setInt(4, toAdd.getDurabilityCurrent()); if (size == 0)
setInt(5, toAdd.getDurabilityMax()); return ret;
if (toAdd.getNumOfItems() < 1)
setInt(6, 1); boolean start = true;
else
setInt(6, toAdd.getNumOfItems()); for (int i : list) {
if (start) {
switch (toAdd.containerType) { ret += i;
case INVENTORY: start = false;
setString(7, "inventory"); } else
break; ret += "," + i;
case EQUIPPED: }
setString(7, "equip"); return ret;
break; }
case BANK:
setString(7, "bank"); public Item ADD_ITEM(Item toAdd) {
break;
case VAULT: try (Connection connection = DbManager.getConnection();
setString(7, "vault"); PreparedStatement preparedStatement = connection.prepareStatement("CALL `item_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?,?);")) {
break;
case FORGE: preparedStatement.setInt(1, toAdd.getOwnerID());
setString(7, "forge"); preparedStatement.setInt(2, toAdd.getItemBaseID());
break; preparedStatement.setInt(3, toAdd.getChargesRemaining());
default: preparedStatement.setInt(4, toAdd.getDurabilityCurrent());
setString(7, "none"); //Shouldn't be here preparedStatement.setInt(5, toAdd.getDurabilityMax());
break;
} if (toAdd.getNumOfItems() < 1)
preparedStatement.setInt(6, 1);
setByte(8, toAdd.getEquipSlot()); else
setInt(9, toAdd.getFlags()); preparedStatement.setInt(6, toAdd.getNumOfItems());
setString(10, toAdd.getCustomName());
int objectUUID = (int) getUUID();
if (objectUUID > 0)
return GET_ITEM(objectUUID);
return null;
}
public boolean DELETE_ITEM(final Item item) {
prepareCallable("DELETE FROM `object` WHERE `UID`=? && `type`='item' limit 1");
setLong(1, (long) item.getObjectUUID());
return (executeUpdate() > 0);
}
public boolean DELETE_ITEM(final int itemUUID) {
prepareCallable("DELETE FROM `object` WHERE `UID`=? && `type`='item' limit 1");
setLong(1, (long) itemUUID);
return (executeUpdate() > 0);
}
public String GET_OWNER(int ownerID) {
prepareCallable("SELECT `type` FROM `object` WHERE `UID`=?");
setLong(1, (long) ownerID);
return getString("type");
}
public boolean DO_TRADE(HashSet<Integer> from1, HashSet<Integer> from2,
CharacterItemManager man1, CharacterItemManager man2,
Item inventoryGold1, Item inventoryGold2, int goldFrom1, int goldFrom2) {
AbstractCharacter ac1 = man1.getOwner();
AbstractCharacter ac2 = man2.getOwner();
if (ac1 == null || ac2 == null || inventoryGold1 == null || inventoryGold2 == null)
return false;
prepareCallable("CALL `item_TRADE`(?, ?, ?, ?, ?, ?, ?, ?)");
setString(1, formatTradeString(from1));
setLong(2, (long) ac1.getObjectUUID());
setString(3, formatTradeString(from2));
setLong(4, (long) ac2.getObjectUUID());
setInt(5, goldFrom1);
setLong(6, (long) inventoryGold1.getObjectUUID());
setInt(7, goldFrom2);
setLong(8, (long) inventoryGold2.getObjectUUID());
return worked();
}
private static String formatTradeString(HashSet<Integer> list) {
int size = list.size();
String ret = "";
if (size == 0)
return ret;
boolean start = true;
for (int i : list) {
if (start){
ret += i;
start = false;
}
else
ret += "," + i;
}
return ret;
}
public ArrayList<Item> GET_EQUIPPED_ITEMS(final int targetId) {
prepareCallable("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`parent`=? && `obj_item`.`item_container`='equip';");
setLong(1, (long) targetId);
return getObjectList();
}
public Item GET_ITEM(final int id) {
prepareCallable("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`UID`=?;");
setLong(1, (long) id);
return (Item) getObjectSingle(id);
}
public Item GET_GOLD_FOR_PLAYER(final int playerID, final int goldID, int worldID) {
prepareCallable("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`parent`=? AND `obj_item`.`item_itembaseID`=?;");
setInt(1, playerID);
setInt(2, goldID);
int objectUUID = (int) getUUID();
return (Item) getObjectSingle(objectUUID);
}
public ArrayList<Item> GET_ITEMS_FOR_ACCOUNT(final int accountId) {
prepareCallable("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`parent`=?;");
setLong(1, (long) accountId);
return getObjectList();
}
public ArrayList<Item> GET_ITEMS_FOR_NPC(final int npcId) {
prepareCallable("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`parent`=?");
setLong(1, (long) npcId);
return getObjectList();
}
public ArrayList<Item> GET_ITEMS_FOR_PC(final int id) {
prepareCallable("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`parent`=?");
setLong(1, (long) id);
return getLargeObjectList();
}
public ArrayList<Item> GET_ITEMS_FOR_PLAYER_AND_ACCOUNT(final int playerID, final int accountID) {
prepareCallable("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE (`object`.`parent`=? OR `object`.`parent`=?)");
setLong(1, (long) playerID);
setLong(2, (long) accountID);
return getLargeObjectList();
}
public boolean MOVE_GOLD(final Item from, final Item to, final int amt) {
int newFromAmt = from.getNumOfItems() - amt;
int newToAmt = to.getNumOfItems() + amt;
prepareCallable("UPDATE `obj_item` SET `item_numberOfItems` = CASE WHEN `UID`=? THEN ? WHEN `UID`=? THEN ? END WHERE `UID` IN (?, ?);");
setLong(1, (long) from.getObjectUUID());
setInt(2, newFromAmt);
setLong(3, (long) to.getObjectUUID());
setInt(4, newToAmt);
setLong(5, (long) from.getObjectUUID());
setLong(6, (long) to.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean ORPHAN_INVENTORY(final HashSet<Item> inventory) {
boolean worked = true;
for (Item item : inventory) {
if (item.getItemBase().getType().equals(ItemType.GOLD))
continue;
prepareCallable("UPDATE `obj_item` LEFT JOIN `object` ON `object`.`UID` = `obj_item`.`UID` SET `object`.`parent`=NULL, `obj_item`.`item_container`='none' WHERE `object`.`UID`=?;");
setLong(1, (long) item.getObjectUUID());
if (executeUpdate() == 0)
worked = false;
else
item.zeroItem();
}
return worked;
}
public Item PURCHASE_ITEM_FROM_VENDOR(final PlayerCharacter pc, final ItemBase ib) {
Item item = null;
byte charges = 0;
charges = (byte) ib.getNumCharges();
short durability = (short) ib.getDurability();
Item temp = new Item(ib, pc.getObjectUUID(),
OwnerType.PlayerCharacter, charges, charges, durability, durability,
true, false,ItemContainerType.INVENTORY, (byte) 0,
new ArrayList<>(),"");
try {
item = this.ADD_ITEM(temp);
} catch (Exception e) {
Logger.error(e);
}
return item;
}
public HashSet<Integer> GET_ITEMS_FOR_VENDOR(final int vendorID) {
prepareCallable("SELECT ID FROM static_itembase WHERE vendorType = ?");
setInt(1, vendorID);
return getIntegerList(1);
}
public ArrayList<Item> GET_ITEMS_FOR_VENDOR_FORGING(final int npcID) {
prepareCallable("SELECT `obj_item`.*, `object`.`parent` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`parent`=? AND `obj_item`.`item_container` =?");
setLong(1, (long) npcID);
setString(2, "forge");
return getObjectList();
}
public String SET_PROPERTY(final Item i, String name, Object new_value) {
prepareCallable("CALL item_SETPROP(?,?,?)");
setLong(1, (long) i.getObjectUUID());
setString(2, name);
setString(3, String.valueOf(new_value));
return getResult();
}
public String SET_PROPERTY(final Item i, String name, Object new_value, Object old_value) {
prepareCallable("CALL item_GETSETPROP(?,?,?,?)");
setLong(1, (long) i.getObjectUUID());
setString(2, name);
setString(3, String.valueOf(new_value));
setString(4, String.valueOf(old_value));
return getResult();
}
//Used to transfer a single item between owners or equip or vault or bank or inventory
public boolean UPDATE_OWNER(final Item item, int newOwnerID, boolean ownerNPC, boolean ownerPlayer,
boolean ownerAccount, ItemContainerType containerType, int slot) {
prepareCallable("CALL `item_TRANSFER_OWNER`(?, ?, ?, ? )");
setLong(1, (long) item.getObjectUUID());
if (newOwnerID != 0)
setLong(2, (long) newOwnerID);
else
setNULL(2, java.sql.Types.BIGINT);
switch (containerType) {
case INVENTORY:
setString(3, "inventory");
break;
case EQUIPPED:
setString(3, "equip");
break;
case BANK:
setString(3, "bank");
break;
case VAULT:
setString(3, "vault");
break;
case FORGE:
setString(3, "forge");
break;
default:
setString(3, "none"); //Shouldn't be here
break;
}
setInt(4, slot);
return worked();
}
public boolean SET_DURABILITY(final Item item, int value) {
prepareCallable("UPDATE `obj_item` SET `item_durabilityCurrent`=? WHERE `UID`=? AND `item_durabilityCurrent`=?");
setInt(1, value);
setLong(2, (long) item.getObjectUUID());
setInt(3, (int) item.getDurabilityCurrent());
return (executeUpdate() != 0);
}
//Update an item except ownership
public boolean UPDATE_DATABASE(final Item item) {
prepareCallable("UPDATE `obj_item` SET `item_itembaseID`=?, `item_chargesRemaining`=?, `item_durabilityCurrent`=?, `item_durabilityMax`=?, `item_numberOfItems`=? WHERE `UID`=?");
setInt(1, item.getItemBaseID());
setInt(2, item.getChargesRemaining());
setInt(3, item.getDurabilityCurrent());
setInt(4, item.getDurabilityMax());
setInt(5, item.getNumOfItems());
setLong(6, (long) item.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean UPDATE_ROLL_COMPLETE(final Item item) {
prepareCallable("UPDATE `obj_item` SET `item_container` = ?, `item_dateToUpgrade` = ? WHERE `UID` = ?");
setString(1, "forge");
setLong(2, 0L);
setLong(3, (long) item.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean SET_DATE_TO_UPGRADE(final Item item, long date) {
prepareCallable("UPDATE `obj_item` SET `item_dateToUPGRADE` = ? WHERE `UID` = ?");
setLong(1, date);
setLong(2, (long) item.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean UPDATE_FORGE_TO_INVENTORY(final Item item) {
prepareCallable("UPDATE `obj_item` SET `item_container` = ? WHERE `UID` = ? AND `item_container` = 'forge';");
setString(1, "inventory");
setLong(2, (long) item.getObjectUUID());
return (executeUpdate() != 0);
}
/**
* Attempts to update the quantity of this gold item
*
* @param value New quantity of gold
* @return True on success
*/
public boolean UPDATE_GOLD(final Item item, int value) {
if (item == null)
return false;
return UPDATE_GOLD(item, value, item.getNumOfItems());
}
/**
* Attempts to update the quantity of this gold item using CAS
*
* @return True on success
*/
public boolean UPDATE_GOLD(final Item item, int newValue, int oldValue) {
if (item.getItemBase().getType().equals(ItemType.GOLD) == false)
return false;
prepareCallable("UPDATE `obj_item` SET `item_numberOfItems`=? WHERE `UID`=?");
setInt(1, newValue);
setLong(2, (long) item.getObjectUUID());
return (executeUpdate() != 0);
}
/**
* Attempts to update the value of two Gold items simultaneously.
*
* @param value New gold quantity for this item
* @param otherGold Other Gold item being modified
* @param valueOtherGold New quantity of gold for other item
* @return True on success
*/
public boolean UPDATE_GOLD(Item gold, int value, Item otherGold, int valueOtherGold) {
if (gold.getItemBase().getType().equals(ItemType.GOLD) == false)
return false;
if (otherGold.getItemBase().getType().equals(ItemType.GOLD) == false)
return false;
int firstOld = gold.getNumOfItems();
int secondOld = gold.getNumOfItems();
prepareCallable("UPDATE `obj_item` SET `item_numberOfItems` = CASE WHEN `UID`=? AND `item_numberOfItems`=? THEN ? WHEN `UID`=? AND `item_numberOfItems`=? THEN ? END WHERE `UID` IN (?, ?);");
setLong(1, (long) gold.getObjectUUID());
setInt(2, firstOld);
setInt(3, value);
setLong(4, (long) otherGold.getObjectUUID());
setInt(5, secondOld);
setInt(6, valueOtherGold);
setLong(7, (long) gold.getObjectUUID());
setLong(8, (long) otherGold.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean UPDATE_REMAINING_CHARGES(final Item item) {
prepareCallable("UPDATE `obj_item` SET `item_chargesRemaining` = ? WHERE `UID` = ?");
setInt(1, item.getChargesRemaining());
setLong(2, (long) item.getObjectUUID());
return (executeUpdate() != 0);
}
// This is necessary because default number of items is 1.
// When we create gold, we want it to start at 0 quantity.
public boolean ZERO_ITEM_STACK(Item item) {
prepareCallable("UPDATE `obj_item` SET `item_numberOfItems`=0 WHERE `UID` = ?");
setLong(1, (long) item.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean UPDATE_FLAGS(Item item) {
prepareCallable("UPDATE `obj_item` SET `item_flags`=? WHERE `UID` = ?");
setInt(1, item.getFlags());
setLong(2, (long) item.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean UPDATE_VALUE(Item item,int value) {
prepareCallable("UPDATE `obj_item` SET `item_value`=? WHERE `UID` = ?");
setInt(1, value);
setLong(2, (long) item.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean UPDATE_FLAGS(Item item, int flags) {
prepareCallable("UPDATE `obj_item` SET `item_flags`=? WHERE `UID` = ?");
setInt(1, flags);
setLong(2, (long) item.getObjectUUID());
return (executeUpdate() != 0);
}
switch (toAdd.containerType) {
case INVENTORY:
preparedStatement.setString(7, "inventory");
break;
case EQUIPPED:
preparedStatement.setString(7, "equip");
break;
case BANK:
preparedStatement.setString(7, "bank");
break;
case VAULT:
preparedStatement.setString(7, "vault");
break;
case FORGE:
preparedStatement.setString(7, "forge");
break;
default:
preparedStatement.setString(7, "none"); //Shouldn't be here
break;
}
preparedStatement.setByte(8, toAdd.getEquipSlot());
preparedStatement.setInt(9, toAdd.getFlags());
preparedStatement.setString(10, toAdd.getCustomName());
ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) {
int objectUUID = (int) rs.getLong("UID");
if (objectUUID > 0)
return GET_ITEM(objectUUID);
}
} catch (SQLException e) {
Logger.error(e);
}
return null;
}
public boolean DO_TRADE(HashSet<Integer> from1, HashSet<Integer> from2,
CharacterItemManager man1, CharacterItemManager man2,
Item inventoryGold1, Item inventoryGold2, int goldFrom1, int goldFrom2) {
AbstractCharacter ac1 = man1.getOwner();
AbstractCharacter ac2 = man2.getOwner();
boolean worked = false;
if (ac1 == null || ac2 == null || inventoryGold1 == null || inventoryGold2 == null)
return false;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL `item_TRADE`(?, ?, ?, ?, ?, ?, ?, ?)")) {
preparedStatement.setString(1, formatTradeString(from1));
preparedStatement.setLong(2, ac1.getObjectUUID());
preparedStatement.setString(3, formatTradeString(from2));
preparedStatement.setLong(4, ac2.getObjectUUID());
preparedStatement.setInt(5, goldFrom1);
preparedStatement.setLong(6, inventoryGold1.getObjectUUID());
preparedStatement.setInt(7, goldFrom2);
preparedStatement.setLong(8, inventoryGold2.getObjectUUID());
ResultSet rs = preparedStatement.executeQuery();
if (rs.next())
worked = rs.getBoolean("result");
} catch (SQLException e) {
Logger.error(e);
}
return worked;
}
public ArrayList<Item> GET_EQUIPPED_ITEMS(final int targetId) {
ArrayList<Item> itemList;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`parent`=? && `obj_item`.`item_container`='equip';")) {
preparedStatement.setLong(1, targetId);
ResultSet rs = preparedStatement.executeQuery();
itemList = getObjectsFromRs(rs, 10);
} catch (SQLException e) {
Logger.error(e);
return null;
}
return itemList;
}
public Item GET_ITEM(final int itemUUID) {
Item item;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`UID`=?;")) {
preparedStatement.setLong(1, itemUUID);
ResultSet rs = preparedStatement.executeQuery();
item = (Item) getObjectFromRs(rs);
} catch (SQLException e) {
Logger.error(e);
return null;
}
return item;
}
public ArrayList<Item> GET_ITEMS_FOR_ACCOUNT(final int accountId) {
ArrayList<Item> itemList;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`parent`=?;")) {
preparedStatement.setLong(1, accountId);
ResultSet rs = preparedStatement.executeQuery();
itemList = getObjectsFromRs(rs, 100);
} catch (SQLException e) {
Logger.error(e);
return null;
}
return itemList;
}
public ArrayList<Item> GET_ITEMS_FOR_NPC(final int npcId) {
ArrayList<Item> itemList;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`parent`=?;")) {
preparedStatement.setLong(1, npcId);
ResultSet rs = preparedStatement.executeQuery();
itemList = getObjectsFromRs(rs, 20);
} catch (SQLException e) {
Logger.error(e);
return null;
}
return itemList;
}
public ArrayList<Item> GET_ITEMS_FOR_PC(final int id) {
ArrayList<Item> itemList;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_item`.*, `object`.`parent`, `object`.`type` FROM `object` INNER JOIN `obj_item` ON `object`.`UID` = `obj_item`.`UID` WHERE `object`.`parent`=?")) {
preparedStatement.setLong(1, id);
ResultSet rs = preparedStatement.executeQuery();
itemList = getObjectsFromRs(rs, 100);
} catch (SQLException e) {
Logger.error(e);
return null;
}
return itemList;
}
public boolean MOVE_GOLD(final Item from, final Item to, final int amt) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_numberOfItems` = CASE WHEN `UID`=? THEN ? WHEN `UID`=? THEN ? END WHERE `UID` IN (?, ?);")) {
int newFromAmt = from.getNumOfItems() - amt;
int newToAmt = to.getNumOfItems() + amt;
preparedStatement.setLong(1, from.getObjectUUID());
preparedStatement.setInt(2, newFromAmt);
preparedStatement.setLong(3, to.getObjectUUID());
preparedStatement.setInt(4, newToAmt);
preparedStatement.setLong(5, from.getObjectUUID());
preparedStatement.setLong(6, to.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean ORPHAN_INVENTORY(final HashSet<Item> inventory) {
boolean worked = true;
for (Item item : inventory) {
if (item.getItemBase().getType().equals(ItemType.GOLD))
continue;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` LEFT JOIN `object` ON `object`.`UID` = `obj_item`.`UID` SET `object`.`parent`=NULL, `obj_item`.`item_container`='none' WHERE `object`.`UID`=?;")) {
preparedStatement.setLong(1, item.getObjectUUID());
worked = (preparedStatement.executeUpdate() > 0);
if (worked)
item.zeroItem();
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
return worked;
}
public HashSet<Integer> GET_ITEMS_FOR_VENDOR(final int vendorID) {
HashSet<Integer> itemSet = new HashSet<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT ID FROM static_itembase WHERE vendorType = ?")) {
preparedStatement.setInt(1, vendorID);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
itemSet.add(rs.getInt(1));
} catch (SQLException e) {
Logger.error(e);
return itemSet;
}
return itemSet;
}
//Used to transfer a single item between owners or equip or vault or bank or inventory
public boolean UPDATE_OWNER(final Item item, int newOwnerID, boolean ownerNPC, boolean ownerPlayer,
boolean ownerAccount, ItemContainerType containerType, int slot) {
boolean worked = false;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL `item_TRANSFER_OWNER`(?, ?, ?, ? )")) {
preparedStatement.setLong(1, item.getObjectUUID());
if (newOwnerID != 0)
preparedStatement.setLong(2, newOwnerID);
else
preparedStatement.setNull(2, java.sql.Types.BIGINT);
switch (containerType) {
case INVENTORY:
preparedStatement.setString(3, "inventory");
break;
case EQUIPPED:
preparedStatement.setString(3, "equip");
break;
case BANK:
preparedStatement.setString(3, "bank");
break;
case VAULT:
preparedStatement.setString(3, "vault");
break;
case FORGE:
preparedStatement.setString(3, "forge");
break;
default:
preparedStatement.setString(3, "none"); //Shouldn't be here
break;
}
preparedStatement.setInt(4, slot);
ResultSet rs = preparedStatement.executeQuery();
if (rs.next())
worked = rs.getBoolean("result");
} catch (SQLException e) {
Logger.error(e);
return false;
}
return worked;
}
public boolean SET_DURABILITY(final Item item, int value) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_durabilityCurrent`=? WHERE `UID`=? AND `item_durabilityCurrent`=?")) {
preparedStatement.setInt(1, value);
preparedStatement.setLong(2, item.getObjectUUID());
preparedStatement.setInt(3, item.getDurabilityCurrent());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean UPDATE_FORGE_TO_INVENTORY(final Item item) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_container` = ? WHERE `UID` = ? AND `item_container` = 'forge';")) {
preparedStatement.setString(1, "inventory");
preparedStatement.setLong(2, item.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
/**
* Attempts to update the quantity of this gold item
*
* @param value New quantity of gold
* @return True on success
*/
public boolean UPDATE_GOLD(final Item item, int value) {
if (item == null)
return false;
return UPDATE_GOLD(item, value, item.getNumOfItems());
}
/**
* Attempts to update the quantity of this gold item using CAS
*
* @return True on success
*/
public boolean UPDATE_GOLD(final Item item, int newValue, int oldValue) {
if (!item.getItemBase().getType().equals(ItemType.GOLD))
return false;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_numberOfItems`=? WHERE `UID`=?")) {
preparedStatement.setInt(1, newValue);
preparedStatement.setLong(2, item.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean UPDATE_REMAINING_CHARGES(final Item item) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_chargesRemaining` = ? WHERE `UID` = ?")) {
preparedStatement.setInt(1, item.getChargesRemaining());
preparedStatement.setLong(2, item.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
// This is necessary because default number of items is 1.
// When we create gold, we want it to start at 0 quantity.
public boolean ZERO_ITEM_STACK(Item item) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_numberOfItems`=0 WHERE `UID` = ?")) {
preparedStatement.setLong(1, item.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean UPDATE_FLAGS(Item item) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_flags`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, item.getFlags());
preparedStatement.setLong(2, item.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean UPDATE_VALUE(Item item, int value) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_item` SET `item_value`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, value);
preparedStatement.setLong(2, item.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
} }

39
src/engine/db/handlers/dbKitHandler.java

@ -9,28 +9,37 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.Kit; import engine.objects.Kit;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
public class dbKitHandler extends dbHandlerBase { public class dbKitHandler extends dbHandlerBase {
public dbKitHandler() { public dbKitHandler() {
this.localClass = Kit.class; this.localClass = Kit.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public ArrayList<Kit> GET_KITS_FOR_RACE_AND_BASECLASS(int raceID, int baseClassID) { public ArrayList<Kit> GET_ALL_KITS() {
prepareCallable("SELECT vk.* FROM `static_rune_validkit` vk, `static_rune_racebaseclass` rbc WHERE rbc.`RaceID` = ? "
+ "&& rbc.`BaseClassID` = ? && rbc.`ID` = vk.`RaceBaseClassesID`");
setInt(1, raceID);
setInt(2, baseClassID);
return getObjectList();
}
public ArrayList<Kit> GET_ALL_KITS() { ArrayList<Kit> kitList = new ArrayList<>();
prepareCallable("SELECT * FROM `static_rune_validkit`");
return getObjectList(); try (Connection connection = DbManager.getConnection();
} PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_validkit`")) {
ResultSet rs = preparedStatement.executeQuery();
kitList = getObjectsFromRs(rs, 20);
} catch (SQLException e) {
Logger.error(e);
}
return kitList;
}
} }

203
src/engine/db/handlers/dbLootTableHandler.java

@ -9,11 +9,14 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.loot.LootManager; import engine.loot.LootManager;
import engine.objects.Item; import engine.objects.Item;
import engine.objects.LootTable; import engine.objects.LootTable;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -23,206 +26,190 @@ public class dbLootTableHandler extends dbHandlerBase {
} }
public void populateLootGroups() { public void populateLootGroups() {
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT `groupID`, `minRoll`, `maxRoll`, `lootTableID`, `pModTableID`, `sModTableID` FROM `static_lootgroups`");
try (Connection connection = DbManager.getConnection();
try { PreparedStatement preparedStatement = connection.prepareStatement("SELECT `groupID`, `minRoll`, `maxRoll`, `lootTableID`, `pModTableID`, `sModTableID` FROM `static_lootgroups`")) {
ResultSet rs = executeQuery();
if (rs != null) ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
recordsRead++; while (rs.next()) {
LootTable lootTable = LootTable.getLootGroup(rs.getInt("groupID")); recordsRead++;
lootTable.addRow(rs.getFloat("minRoll"), rs.getFloat("maxRoll"), rs.getInt("lootTableID"), rs.getInt("pModTableID"), rs.getInt("sModTableID"), ""); LootTable lootTable = LootTable.getLootGroup(rs.getInt("groupID"));
} lootTable.addRow(rs.getFloat("minRoll"), rs.getFloat("maxRoll"), rs.getInt("lootTableID"), rs.getInt("pModTableID"), rs.getInt("sModTableID"), "");
}
Logger.info("read: " + recordsRead + " cached: " + LootTable.getLootGroups().size());
} catch (SQLException e) { } catch (SQLException e) {
} finally { Logger.error(e);
closeCallable();
} }
Logger.info("read: " + recordsRead + " cached: " + LootTable.getLootGroups().size());
} }
public void populateLootTables() { public void populateLootTables() {
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT `lootTable`, `minRoll`, `maxRoll`, `itemBaseUUID`, `minSpawn`, `maxSpawn` FROM `static_loottables`"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `lootTable`, `minRoll`, `maxRoll`, `itemBaseUUID`, `minSpawn`, `maxSpawn` FROM `static_loottables`")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
if (rs != null) while (rs.next()) {
while (rs.next()) { recordsRead++;
recordsRead++; LootTable lootTable = LootTable.getLootTable(rs.getInt("lootTable"));
LootTable lootTable = LootTable.getLootTable(rs.getInt("lootTable")); lootTable.addRow(rs.getFloat("minRoll"), rs.getFloat("maxRoll"), rs.getInt("itemBaseUUID"), rs.getInt("minSpawn"), rs.getInt("maxSpawn"), "");
lootTable.addRow(rs.getFloat("minRoll"), rs.getFloat("maxRoll"), rs.getInt("itemBaseUUID"), rs.getInt("minSpawn"), rs.getInt("maxSpawn"), ""); }
}
Logger.info("read: " + recordsRead + " cached: " + LootTable.getLootTables().size());
} catch (SQLException e) { } catch (SQLException e) {
} finally { Logger.error(e);
closeCallable();
} }
Logger.info("read: " + recordsRead + " cached: " + LootTable.getLootTables().size());
} }
public void populateModTables() { public void populateModTables() {
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT `modTable`,`minRoll`,`maxRoll`,`value`,`action` FROM `static_modtables`"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `modTable`,`minRoll`,`maxRoll`,`value`,`action` FROM `static_modtables`")) {
try {
ResultSet rs = executeQuery(); ResultSet rs = preparedStatement.executeQuery();
if (rs != null)
while (rs.next()) { while (rs.next()) {
recordsRead++; recordsRead++;
LootTable lootTable = LootTable.getModTable(rs.getInt("modTable")); LootTable lootTable = LootTable.getModTable(rs.getInt("modTable"));
lootTable.addRow(rs.getFloat("minRoll"), rs.getFloat("maxRoll"), rs.getInt("value"), 0, 0, rs.getString("action")); lootTable.addRow(rs.getFloat("minRoll"), rs.getFloat("maxRoll"), rs.getInt("value"), 0, 0, rs.getString("action"));
} }
Logger.info("read: " + recordsRead + " cached: " + LootTable.getModTables().size());
} catch (SQLException e) { } catch (SQLException e) {
} finally { Logger.error(e);
closeCallable();
} }
Logger.info("read: " + recordsRead + " cached: " + LootTable.getModTables().size());
} }
public void populateModGroups() { public void populateModGroups() {
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT `modGroup`,`minRoll`,`maxRoll`,`subTableID` FROM `static_modgroups`"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `modGroup`,`minRoll`,`maxRoll`,`subTableID` FROM `static_modgroups`")) {
try {
ResultSet rs = executeQuery(); ResultSet rs = preparedStatement.executeQuery();
if (rs != null)
while (rs.next()) { while (rs.next()) {
recordsRead++; recordsRead++;
LootTable lootTable = LootTable.getModGroup(rs.getInt("modGroup")); LootTable lootTable = LootTable.getModGroup(rs.getInt("modGroup"));
lootTable.addRow(rs.getFloat("minRoll"), rs.getFloat("maxRoll"), rs.getInt("subTableID"), 0, 0, ""); lootTable.addRow(rs.getFloat("minRoll"), rs.getFloat("maxRoll"), rs.getInt("subTableID"), 0, 0, "");
} }
Logger.info("read: " + recordsRead + " cached: " + LootTable.getModGroups().size());
} catch (SQLException e) { } catch (SQLException e) {
} finally { Logger.error(e);
closeCallable();
} }
Logger.info("read: " + recordsRead + " cached: " + LootTable.getModGroups().size());
} }
public void LOAD_ENCHANT_VALUES() { public void LOAD_ENCHANT_VALUES() {
prepareCallable("SELECT `IDString`, `minMod` FROM `static_power_effectmod` WHERE `modType` = ?"); try (Connection connection = DbManager.getConnection();
setString(1,"Value"); PreparedStatement preparedStatement = connection.prepareStatement("SELECT `IDString`, `minMod` FROM `static_power_effectmod` WHERE `modType` = ?")) {
try { preparedStatement.setString(1, "Value");
ResultSet rs = executeQuery(); ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
while (rs.next())
Item.addEnchantValue(rs.getString("IDString"), rs.getInt("minMod")); Item.addEnchantValue(rs.getString("IDString"), rs.getInt("minMod"));
}
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e); Logger.error(e);
} finally {
closeCallable();
} }
} }
public void LOAD_ALL_LOOTGROUPS() { public void LOAD_ALL_LOOTGROUPS() {
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT * FROM static_lootgroups"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_lootgroups")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
LootManager.GenTableRow row = new LootManager.GenTableRow(rs); LootManager.GenTableRow row = new LootManager.GenTableRow(rs);
LootManager.AddGenTableRow(rs.getInt("groupID"), row); LootManager.AddGenTableRow(rs.getInt("groupID"), row);
} }
Logger.info( "read: " + recordsRead);
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.getErrorCode() + ' ' + e.getMessage(), e); Logger.error(e);
} finally {
closeCallable();
} }
Logger.info("read: " + recordsRead);
} }
public void LOAD_ALL_LOOTTABLES() { public void LOAD_ALL_LOOTTABLES() {
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT * FROM static_loottables"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_loottables")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
recordsRead++; recordsRead++;
LootManager.ItemTableRow row = new LootManager.ItemTableRow(rs); LootManager.ItemTableRow row = new LootManager.ItemTableRow(rs);
LootManager.AddItemTableRow(rs.getInt("lootTable"),row); LootManager.AddItemTableRow(rs.getInt("lootTable"), row);
} }
Logger.info("read: " + recordsRead);
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.getErrorCode() + ' ' + e.getMessage(), e); Logger.error(e);
} finally {
closeCallable();
} }
Logger.info("read: " + recordsRead);
} }
public void LOAD_ALL_MODGROUPS() { public void LOAD_ALL_MODGROUPS() {
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT * FROM static_modgroups"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_modgroups")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
recordsRead++; recordsRead++;
LootManager.ModTypeTableRow mttr = new LootManager.ModTypeTableRow(rs);
LootManager.ModTypeTableRow mttr = new LootManager.ModTypeTableRow(rs); LootManager.AddModTypeTableRow(rs.getInt("modGroup"), mttr);
LootManager.AddModTypeTableRow(rs.getInt("modGroup"), mttr);
} }
Logger.info( "read: " + recordsRead);
} catch (SQLException e) { } catch (SQLException e) {
Logger.error(e.getErrorCode() + ' ' + e.getMessage(), e); Logger.error(e);
} finally {
closeCallable();
} }
Logger.info("read: " + recordsRead);
} }
public void LOAD_ALL_MODTABLES() { public void LOAD_ALL_MODTABLES() {
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT * FROM static_modtables"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_modtables")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
recordsRead++; recordsRead++;
try {
LootManager.ModTableRow mtr = new LootManager.ModTableRow(rs); LootManager.ModTableRow mtr = new LootManager.ModTableRow(rs);
LootManager.AddModTableRow(rs.getInt("modTable"),mtr); LootManager.AddModTableRow(rs.getInt("modTable"), mtr);
}
catch(Exception ex){
Logger.info("MOD TABLE ERROR: " + rs.getInt("modTable"));
}
} }
Logger.info( "read: " + recordsRead);
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.getErrorCode() + ' ' + e.getMessage(), e); Logger.error(e);
} finally {
closeCallable();
} }
Logger.info("read: " + recordsRead);
} }
} }

35
src/engine/db/handlers/dbMenuHandler.java

@ -9,20 +9,39 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.MenuOption; import engine.objects.MenuOption;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
public class dbMenuHandler extends dbHandlerBase { public class dbMenuHandler extends dbHandlerBase {
public dbMenuHandler() { public dbMenuHandler() {
this.localClass = MenuOption.class; this.localClass = MenuOption.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public ArrayList<MenuOption> GET_MENU_OPTIONS(final int id) { public ArrayList<MenuOption> GET_MENU_OPTIONS(final int id) {
prepareCallable("SELECT * FROM `static_npc_menuoption` WHERE menuID = ?");
setInt(1, id); ArrayList<MenuOption> menuOptions = new ArrayList<>();
return getObjectList();
} try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_menuoption` WHERE menuID = ?")) {
preparedStatement.setInt(1, id);
ResultSet rs = preparedStatement.executeQuery();
menuOptions = getObjectsFromRs(rs, 1000);
} catch (SQLException e) {
Logger.error(e);
}
return menuOptions;
}
} }

187
src/engine/db/handlers/dbMineHandler.java

@ -13,84 +13,123 @@ import engine.gameManager.DbManager;
import engine.objects.Mine; import engine.objects.Mine;
import engine.objects.MineProduction; import engine.objects.MineProduction;
import engine.objects.Resource; import engine.objects.Resource;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
public class dbMineHandler extends dbHandlerBase { public class dbMineHandler extends dbHandlerBase {
public dbMineHandler() { public dbMineHandler() {
this.localClass = Mine.class; this.localClass = Mine.class;
this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public Mine GET_MINE(int id) { public Mine GET_MINE(int id) {
if (id == 0) if (id == 0)
return null; return null;
Mine mine = (Mine) DbManager.getFromCache(Enum.GameObjectType.Mine, id); Mine mine = (Mine) DbManager.getFromCache(Enum.GameObjectType.Mine, id);
if (mine != null)
return mine; if (mine != null)
return mine;
prepareCallable("SELECT `obj_building`.*, `object`.`parent` FROM `object` INNER JOIN `obj_building` ON `obj_building`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?;");
try (Connection connection = DbManager.getConnection();
setLong(1, (long) id); PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_building`.*, `object`.`parent` FROM `object` INNER JOIN `obj_building` ON `obj_building`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?;")) {
return (Mine) getObjectSingle(id);
preparedStatement.setLong(1, id);
}
ResultSet rs = preparedStatement.executeQuery();
public ArrayList<Mine> GET_ALL_MINES_FOR_SERVER() { mine = (Mine) getObjectFromRs(rs);
prepareCallable("SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`");
return getObjectList(); } catch (SQLException e) {
} Logger.error(e);
}
public boolean CHANGE_OWNER(Mine mine, int playerUID) { return mine;
prepareCallable("UPDATE `obj_mine` SET `mine_ownerUID`=? WHERE `UID`=?"); }
setInt(1, playerUID);
setLong(2, (long) mine.getObjectUUID()); public ArrayList<Mine> GET_ALL_MINES_FOR_SERVER() {
return (executeUpdate() > 0);
} ArrayList<Mine> mines = new ArrayList<>();
public boolean CHANGE_RESOURCE(Mine mine, Resource resource) { try (Connection connection = DbManager.getConnection();
prepareCallable("UPDATE `obj_mine` SET `mine_resource`=? WHERE `UID`=?"); PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_mine`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mine` ON `obj_mine`.`UID` = `object`.`UID`")) {
setString(1, resource.name());
setLong(2, (long) mine.getObjectUUID()); ResultSet rs = preparedStatement.executeQuery();
return (executeUpdate() > 0); mines = getObjectsFromRs(rs, 1000);
}
} catch (SQLException e) {
public boolean CHANGE_TYPE(Mine mine, MineProduction productionType) { Logger.error(e);
prepareCallable("UPDATE `obj_mine` SET `mine_type`=? WHERE `UID`=?"); }
setString(1, productionType.name()); return mines;
setLong(2, (long) mine.getObjectUUID()); }
return (executeUpdate() > 0);
} public boolean CHANGE_OWNER(Mine mine, int playerUID) {
public boolean SET_FLAGS(Mine mine, int newFlags) { try (Connection connection = DbManager.getConnection();
prepareCallable("UPDATE `obj_mine` SET `flags`=? WHERE `UID`=?"); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_mine` SET `mine_ownerUID`=? WHERE `UID`=?")) {
setInt(1, newFlags);
setLong(2, (long) mine.getObjectUUID()); preparedStatement.setInt(1, playerUID);
return (executeUpdate() > 0); preparedStatement.setLong(2, mine.getObjectUUID());
}
return (preparedStatement.executeUpdate() > 0);
public String SET_PROPERTY(final Mine m, String name, Object new_value) {
prepareCallable("CALL mine_SETPROP(?,?,?)"); } catch (SQLException e) {
setLong(1, (long) m.getObjectUUID()); Logger.error(e);
setString(2, name); }
setString(3, String.valueOf(new_value)); return false;
return getResult(); }
}
public boolean CHANGE_RESOURCE(Mine mine, Resource resource) {
// Advance all the mine windows respective to the current day
// at boot time. This ensures that mines always go live try (Connection connection = DbManager.getConnection();
// no matter what date in the database PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_mine` SET `mine_resource`=? WHERE `UID`=?")) {
public String SET_PROPERTY(final Mine m, String name, Object new_value, Object old_value) { preparedStatement.setString(1, resource.name());
prepareCallable("CALL mine_GETSETPROP(?,?,?,?)"); preparedStatement.setLong(2, mine.getObjectUUID());
setLong(1, (long) m.getObjectUUID());
setString(2, name); return (preparedStatement.executeUpdate() > 0);
setString(3, String.valueOf(new_value));
setString(4, String.valueOf(old_value)); } catch (SQLException e) {
return getResult(); Logger.error(e);
} }
return false;
}
public boolean CHANGE_TYPE(Mine mine, MineProduction productionType) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_mine` SET `mine_type`=? WHERE `UID`=?")) {
preparedStatement.setString(1, productionType.name());
preparedStatement.setLong(2, mine.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_FLAGS(Mine mine, int newFlags) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_mine` SET `flags`=? WHERE `UID`=?")) {
preparedStatement.setInt(1, newFlags);
preparedStatement.setLong(2, mine.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
} }

331
src/engine/db/handlers/dbMobBaseHandler.java

@ -11,10 +11,14 @@ package engine.db.handlers;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.objects.*; import engine.objects.MobBase;
import engine.objects.MobBaseEffects;
import engine.objects.MobBaseStats;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -22,160 +26,173 @@ import java.util.HashMap;
public class dbMobBaseHandler extends dbHandlerBase { public class dbMobBaseHandler extends dbHandlerBase {
public dbMobBaseHandler() { public dbMobBaseHandler() {
this.localClass = MobBase.class; this.localClass = MobBase.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public MobBase GET_MOBBASE(int id, boolean forceDB) { public MobBase GET_MOBBASE(int id) {
if (id == 0)
if (id == 0) return null;
return null;
MobBase mobBase = (MobBase) DbManager.getFromCache(GameObjectType.MobBase, id);
MobBase mobBase = (MobBase) DbManager.getFromCache(GameObjectType.MobBase, id);
if (mobBase != null)
if ( mobBase != null) return mobBase;
return mobBase;
try (Connection connection = DbManager.getConnection();
prepareCallable("SELECT * FROM `static_npc_mobbase` WHERE `ID`=?"); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase` WHERE `ID`=?")) {
setInt(1, id);
return (MobBase) getObjectSingle(id, forceDB, true); preparedStatement.setInt(1, id);
}
ResultSet rs = preparedStatement.executeQuery();
public ArrayList<MobBase> GET_ALL_MOBBASES() { mobBase = (MobBase) getObjectFromRs(rs);
prepareCallable("SELECT * FROM `static_npc_mobbase`;");
return getObjectList(); } catch (SQLException e) {
} Logger.error(e);
}
public void SET_AI_DEFAULTS() {
prepareCallable("SELECT * FROM `static_ai_defaults`"); return mobBase;
try { }
ResultSet rs = executeQuery();
while (rs.next()) {
MBServerStatics.AI_BASE_AGGRO_RANGE = rs.getInt("aggro_range"); public ArrayList<MobBase> GET_ALL_MOBBASES() {
MBServerStatics.AI_PATROL_DIVISOR = rs.getInt("patrol_chance");
MBServerStatics.AI_DROP_AGGRO_RANGE = rs.getInt("drop_aggro_range"); ArrayList<MobBase> mobbaseList = new ArrayList<>();
MBServerStatics.AI_POWER_DIVISOR = rs.getInt("cast_chance");
MBServerStatics.AI_RECALL_RANGE = rs.getInt("recall_range"); try (Connection connection = DbManager.getConnection();
MBServerStatics.AI_PET_HEEL_DISTANCE = rs.getInt("pet_heel_distance"); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase`;")) {
}
rs.close(); ResultSet rs = preparedStatement.executeQuery();
} catch (SQLException e) { mobbaseList = getObjectsFromRs(rs, 1000);
Logger.error( e.getMessage());
} finally { } catch (SQLException e) {
closeCallable(); Logger.error(e);
} }
return mobbaseList;
} }
public boolean UPDATE_AI_DEFAULTS() { public void SET_AI_DEFAULTS() {
prepareCallable("UPDATE `static_ai_defaults` SET `aggro_range` = ?,`patrol_chance`= ?,`drop_aggro_range`= ?,`cast_chance`= ?,`recall_range`= ? WHERE `ID` = 1");
setInt(1, MBServerStatics.AI_BASE_AGGRO_RANGE); try (Connection connection = DbManager.getConnection();
setInt(2, MBServerStatics.AI_PATROL_DIVISOR); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_ai_defaults`")) {
setInt(3, MBServerStatics.AI_DROP_AGGRO_RANGE);
setInt(4, MBServerStatics.AI_POWER_DIVISOR); ResultSet rs = preparedStatement.executeQuery();
setInt(5, MBServerStatics.AI_RECALL_RANGE);
return (executeUpdate() > 0); while (rs.next()) {
MBServerStatics.AI_BASE_AGGRO_RANGE = rs.getInt("aggro_range");
} MBServerStatics.AI_PATROL_DIVISOR = rs.getInt("patrol_chance");
MBServerStatics.AI_DROP_AGGRO_RANGE = rs.getInt("drop_aggro_range");
public HashMap<Integer, Integer> LOAD_STATIC_POWERS(int mobBaseUUID) { MBServerStatics.AI_POWER_DIVISOR = rs.getInt("cast_chance");
HashMap<Integer, Integer> powersList = new HashMap<>(); MBServerStatics.AI_RECALL_RANGE = rs.getInt("recall_range");
prepareCallable("SELECT * FROM `static_npc_mobbase_powers` WHERE `mobbaseUUID`=?"); MBServerStatics.AI_PET_HEEL_DISTANCE = rs.getInt("pet_heel_distance");
setInt(1, mobBaseUUID); }
try { } catch (SQLException e) {
ResultSet rs = executeQuery(); Logger.error(e);
while (rs.next()) { }
}
powersList.put(rs.getInt("token"), rs.getInt("rank"));
} public boolean UPDATE_AI_DEFAULTS() {
rs.close();
} catch (SQLException e) { try (Connection connection = DbManager.getConnection();
Logger.error( e.getMessage()); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `static_ai_defaults` SET `aggro_range` = ?,`patrol_chance`= ?,`drop_aggro_range`= ?,`cast_chance`= ?,`recall_range`= ? WHERE `ID` = 1")) {
} finally {
closeCallable(); preparedStatement.setInt(1, MBServerStatics.AI_BASE_AGGRO_RANGE);
} preparedStatement.setInt(2, MBServerStatics.AI_PATROL_DIVISOR);
return powersList; preparedStatement.setInt(3, MBServerStatics.AI_DROP_AGGRO_RANGE);
preparedStatement.setInt(4, MBServerStatics.AI_POWER_DIVISOR);
} preparedStatement.setInt(5, MBServerStatics.AI_RECALL_RANGE);
public ArrayList<MobBaseEffects> GET_RUNEBASE_EFFECTS(int runeID) { return (preparedStatement.executeUpdate() > 0);
ArrayList<MobBaseEffects> effectsList = new ArrayList<>();
prepareCallable("SELECT * FROM `static_npc_mobbase_effects` WHERE `mobbaseUUID` = ?"); } catch (SQLException e) {
setInt(1, runeID); Logger.error(e);
}
try { return false;
ResultSet rs = executeQuery(); }
while (rs.next()) {
public HashMap<Integer, Integer> LOAD_STATIC_POWERS(int mobBaseUUID) {
MobBaseEffects mbs = new MobBaseEffects(rs);
effectsList.add(mbs); HashMap<Integer, Integer> powersList = new HashMap<>();
}
rs.close(); try (Connection connection = DbManager.getConnection();
} catch (SQLException e) { PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase_powers` WHERE `mobbaseUUID`=?")) {
Logger.error (e.getMessage());
} finally { preparedStatement.setInt(1, mobBaseUUID);
closeCallable(); ResultSet rs = preparedStatement.executeQuery();
}
while (rs.next())
return effectsList; powersList.put(rs.getInt("token"), rs.getInt("rank"));
} } catch (SQLException e) {
Logger.error(e);
public MobBaseStats LOAD_STATS(int mobBaseUUID) { }
MobBaseStats mbs = MobBaseStats.GetGenericStats(); return powersList;
}
prepareCallable("SELECT * FROM `static_npc_mobbase_stats` WHERE `mobbaseUUID` = ?");
setInt(1, mobBaseUUID); public ArrayList<MobBaseEffects> GET_RUNEBASE_EFFECTS(int runeID) {
try {
ResultSet rs = executeQuery(); ArrayList<MobBaseEffects> effectsList = new ArrayList<>();
while (rs.next()) {
try (Connection connection = DbManager.getConnection();
mbs = new MobBaseStats(rs); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase_effects` WHERE `mobbaseUUID` = ?")) {
}
preparedStatement.setInt(1, runeID);
} catch (SQLException e) { ResultSet rs = preparedStatement.executeQuery();
Logger.error(e.getErrorCode() + ' ' + e.getMessage(), e);
} finally { while (rs.next()) {
closeCallable(); MobBaseEffects mbs = new MobBaseEffects(rs);
} effectsList.add(mbs);
return mbs; }
} } catch (SQLException e) {
Logger.error(e);
public boolean RENAME_MOBBASE(int ID, String newName) { }
prepareCallable("UPDATE `static_npc_mobbase` SET `name`=? WHERE `ID`=?;");
setString(1, newName); return effectsList;
setInt(2, ID); }
return (executeUpdate() > 0);
} public MobBaseStats LOAD_STATS(int mobBaseUUID) {
public void LOAD_ALL_MOBBASE_SPEEDS(MobBase mobBase) { MobBaseStats mobBaseStats = MobBaseStats.GetGenericStats();
if (mobBase.getLoadID() == 0) try (Connection connection = DbManager.getConnection();
return; PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase_stats` WHERE `mobbaseUUID` = ?")) {
ArrayList<MobLootBase> mobLootList = new ArrayList<>();
prepareCallable("SELECT * FROM `static_npc_mobbase_race` WHERE `mobbaseID` = ?"); preparedStatement.setInt(1, mobBaseUUID);
setInt(1, mobBase.getLoadID()); ResultSet rs = preparedStatement.executeQuery();
try { while (rs.next())
ResultSet rs = executeQuery(); mobBaseStats = new MobBaseStats(rs);
//shrines cached in rs for easy cache on creation. } catch (SQLException e) {
while (rs.next()) { Logger.error(e);
float walk = rs.getFloat("walkStandard"); }
float walkCombat = rs.getFloat("walkCombat"); return mobBaseStats;
float run = rs.getFloat("runStandard"); }
float runCombat = rs.getFloat("runCombat");
mobBase.updateSpeeds(walk, walkCombat, run, runCombat); public void LOAD_ALL_MOBBASE_SPEEDS(MobBase mobBase) {
}
if (mobBase.getLoadID() == 0)
return;
} catch (SQLException e) {
Logger.error(e.getErrorCode() + ' ' + e.getMessage(), e); try (Connection connection = DbManager.getConnection();
} finally { PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase_race` WHERE `mobbaseID` = ?")) {
closeCallable();
} preparedStatement.setInt(1, mobBase.getLoadID());
} ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
float walk = rs.getFloat("walkStandard");
float walkCombat = rs.getFloat("walkCombat");
float run = rs.getFloat("runStandard");
float runCombat = rs.getFloat("runCombat");
mobBase.updateSpeeds(walk, walkCombat, run, runCombat);
}
} catch (SQLException e) {
Logger.error(e);
}
}
} }

374
src/engine/db/handlers/dbMobHandler.java

@ -9,168 +9,244 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.Mob; import engine.objects.Mob;
import engine.objects.Zone; import engine.objects.Zone;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
public class dbMobHandler extends dbHandlerBase { public class dbMobHandler extends dbHandlerBase {
public dbMobHandler() { public dbMobHandler() {
this.localClass = Mob.class; this.localClass = Mob.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public Mob ADD_MOB(Mob toAdd)
{
prepareCallable("CALL `mob_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
setLong(1, toAdd.getParentZoneID());
setInt(2, toAdd.getMobBaseID());
setInt(3, toAdd.getGuildUUID());
setFloat(4, toAdd.getSpawnX());
setFloat(5, toAdd.getSpawnY());
setFloat(6, toAdd.getSpawnZ());
setInt(7, 0);
setFloat(8, toAdd.getSpawnRadius());
setInt(9, toAdd.getTrueSpawnTime());
if (toAdd.getContract() != null)
setInt(10, toAdd.getContract().getContractID());
else
setInt(10, 0);
setInt(11, toAdd.getBuildingID());
setInt(12, toAdd.getLevel());
setString(13, toAdd.getFirstName());
int objectUUID = (int) getUUID();
if (objectUUID > 0)
return GET_MOB(objectUUID);
return null;
}
public boolean updateUpgradeTime(Mob mob, DateTime upgradeDateTime) {
try {
prepareCallable("UPDATE obj_mob SET upgradeDate=? "
+ "WHERE UID = ?");
if (upgradeDateTime == null)
setNULL(1, java.sql.Types.DATE);
else
setTimeStamp(1, upgradeDateTime.getMillis());
setInt(2, mob.getObjectUUID());
executeUpdate();
} catch (Exception e) {
Logger.error("Mob.updateUpgradeTime", "UUID: " + mob.getObjectUUID());
return false;
}
return true;
}
public int DELETE_MOB(final Mob mob) {
prepareCallable("DELETE FROM `object` WHERE `UID` = ?");
setLong(1, mob.getDBID());
return executeUpdate();
}
public void LOAD_PATROL_POINTS(Mob captain) {
prepareCallable("SELECT * FROM `dyn_guards` WHERE `captainUID` = ?");
setInt(1,captain.getObjectUUID());
try {
ResultSet rs = executeQuery();
//shrines cached in rs for easy cache on creation.
while (rs.next()) {
int mobBaseID = rs.getInt("mobBaseID");
String name = rs.getString("name");
Mob toCreate = Mob.createGuardMob(captain, captain.getGuild(), captain.getParentZone(), captain.building.getLoc(), captain.getLevel(),name);
if (toCreate == null)
return;
// toCreate.despawn();
if (toCreate != null) {
toCreate.setTimeToSpawnSiege(System.currentTimeMillis() + MBServerStatics.FIFTEEN_MINUTES);
toCreate.setDeathTime(System.currentTimeMillis());
public Mob ADD_MOB(Mob toAdd) {
Mob mobile = null;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL `mob_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")) {
preparedStatement.setLong(1, toAdd.getParentZoneID());
preparedStatement.setInt(2, toAdd.getMobBaseID());
preparedStatement.setInt(3, toAdd.getGuildUUID());
preparedStatement.setFloat(4, toAdd.getSpawnX());
preparedStatement.setFloat(5, toAdd.getSpawnY());
preparedStatement.setFloat(6, toAdd.getSpawnZ());
preparedStatement.setInt(7, 0);
preparedStatement.setFloat(8, toAdd.getSpawnRadius());
preparedStatement.setInt(9, toAdd.getTrueSpawnTime());
if (toAdd.getContract() != null)
preparedStatement.setInt(10, toAdd.getContract().getContractID());
else
preparedStatement.setInt(10, 0);
preparedStatement.setInt(11, toAdd.getBuildingID());
preparedStatement.setInt(12, toAdd.getLevel());
preparedStatement.setString(13, toAdd.getFirstName());
ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) {
int objectUUID = (int) rs.getLong("UID");
if (objectUUID > 0)
mobile = GET_MOB(objectUUID);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return mobile;
}
public boolean updateUpgradeTime(Mob mob, DateTime upgradeDateTime) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE obj_mob SET upgradeDate=? "
+ "WHERE UID = ?")) {
if (upgradeDateTime == null)
preparedStatement.setNull(1, java.sql.Types.DATE);
else
preparedStatement.setTimestamp(1, new java.sql.Timestamp(upgradeDateTime.getMillis()));
preparedStatement.setInt(2, mob.getObjectUUID());
preparedStatement.execute();
return true;
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public int DELETE_MOB(final Mob mob) {
int row_count = 0;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `object` WHERE `UID` = ?")) {
preparedStatement.setLong(1, mob.getDBID());
row_count = preparedStatement.executeUpdate();
} catch (SQLException e) {
Logger.error(e);
}
return row_count;
}
public void LOAD_PATROL_POINTS(Mob captain) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_guards` WHERE `captainUID` = ?")) {
preparedStatement.setInt(1, captain.getObjectUUID());
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
String name = rs.getString("name");
Mob toCreate = Mob.createGuardMob(captain, captain.getGuild(), captain.getParentZone(), captain.building.getLoc(), captain.getLevel(), name);
if (toCreate == null)
return;
if (toCreate != null) {
toCreate.setTimeToSpawnSiege(System.currentTimeMillis() + MBServerStatics.FIFTEEN_MINUTES);
toCreate.setDeathTime(System.currentTimeMillis());
} }
} }
} catch (SQLException e) {
} catch (SQLException e) { Logger.error(e);
Logger.error( e.toString()); }
} finally { }
closeCallable();
} public boolean ADD_TO_GUARDS(final long captainUID, final int mobBaseID, final String name, final int slot) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_guards` (`captainUID`, `mobBaseID`,`name`, `slot`) VALUES (?,?,?,?)")) {
}
preparedStatement.setLong(1, captainUID);
public boolean ADD_TO_GUARDS(final long captainUID, final int mobBaseID, final String name, final int slot) { preparedStatement.setInt(2, mobBaseID);
prepareCallable("INSERT INTO `dyn_guards` (`captainUID`, `mobBaseID`,`name`, `slot`) VALUES (?,?,?,?)"); preparedStatement.setString(3, name);
setLong(1, captainUID); preparedStatement.setInt(4, slot);
setInt(2, mobBaseID);
setString(3, name); return (preparedStatement.executeUpdate() > 0);
setInt(4, slot);
return (executeUpdate() > 0); } catch (SQLException e) {
} Logger.error(e);
return false;
public boolean REMOVE_FROM_GUARDS(final long captainUID, final int mobBaseID, final int slot) { }
prepareCallable("DELETE FROM `dyn_guards` WHERE `captainUID`=? AND `mobBaseID`=? AND `slot` =?"); }
setLong(1, captainUID);
setInt(2, mobBaseID); public boolean REMOVE_FROM_GUARDS(final long captainUID, final int mobBaseID, final int slot) {
setInt(3,slot);
return (executeUpdate() > 0); try (Connection connection = DbManager.getConnection();
} PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `dyn_guards` WHERE `captainUID`=? AND `mobBaseID`=? AND `slot` =?")) {
preparedStatement.setLong(1, captainUID);
public ArrayList<Mob> GET_ALL_MOBS_FOR_ZONE(Zone zone) { preparedStatement.setInt(2, mobBaseID);
prepareCallable("SELECT `obj_mob`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mob` ON `obj_mob`.`UID` = `object`.`UID` WHERE `object`.`parent` = ?;"); preparedStatement.setInt(3, slot);
setLong(1, zone.getObjectUUID());
return getLargeObjectList(); return (preparedStatement.executeUpdate() > 0);
}
} catch (SQLException e) {
public Mob GET_MOB(final int objectUUID) { Logger.error(e);
prepareCallable("SELECT `obj_mob`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mob` ON `obj_mob`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?;"); return false;
setLong(1, objectUUID); }
return (Mob) getObjectSingle(objectUUID); }
}
public int MOVE_MOB(long mobID, long parentID, float locX, float locY, float locZ) { public ArrayList<Mob> GET_ALL_MOBS_FOR_ZONE(Zone zone) {
prepareCallable("UPDATE `object` INNER JOIN `obj_mob` On `object`.`UID` = `obj_mob`.`UID` SET `object`.`parent`=?, `obj_mob`.`mob_spawnX`=?, `obj_mob`.`mob_spawnY`=?, `obj_mob`.`mob_spawnZ`=? WHERE `obj_mob`.`UID`=?;");
setLong(1, parentID); ArrayList<Mob> mobileList = new ArrayList<>();
setFloat(2, locX);
setFloat(3, locY); try (Connection connection = DbManager.getConnection();
setFloat(4, locZ); PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_mob`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mob` ON `obj_mob`.`UID` = `object`.`UID` WHERE `object`.`parent` = ?;")) {
setLong(5, mobID);
return executeUpdate(); preparedStatement.setLong(1, zone.getObjectUUID());
}
ResultSet rs = preparedStatement.executeQuery();
public String SET_PROPERTY(final Mob m, String name, Object new_value) { mobileList = getObjectsFromRs(rs, 1000);
prepareCallable("CALL mob_SETPROP(?,?,?)");
setLong(1, m.getObjectUUID()); } catch (SQLException e) {
setString(2, name); Logger.error(e);
setString(3, String.valueOf(new_value)); }
return getResult();
} return mobileList;
}
public String SET_PROPERTY(final Mob m, String name, Object new_value, Object old_value) {
prepareCallable("CALL mob_GETSETPROP(?,?,?,?)"); public Mob GET_MOB(final int objectUUID) {
setLong(1, m.getObjectUUID());
setString(2, name); Mob mobile = null;
setString(3, String.valueOf(new_value));
setString(4, String.valueOf(old_value)); try (Connection connection = DbManager.getConnection();
return getResult(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_mob`.*, `object`.`parent` FROM `object` INNER JOIN `obj_mob` ON `obj_mob`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?;")) {
}
preparedStatement.setLong(1, objectUUID);
ResultSet rs = preparedStatement.executeQuery();
mobile = (Mob) getObjectFromRs(rs);
} catch (SQLException e) {
Logger.error(e);
}
return mobile;
}
public int MOVE_MOB(long mobID, long parentID, float locX, float locY, float locZ) {
int row_count = 0;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `object` INNER JOIN `obj_mob` On `object`.`UID` = `obj_mob`.`UID` SET `object`.`parent`=?, `obj_mob`.`mob_spawnX`=?, `obj_mob`.`mob_spawnY`=?, `obj_mob`.`mob_spawnZ`=? WHERE `obj_mob`.`UID`=?;")) {
preparedStatement.setLong(1, parentID);
preparedStatement.setFloat(2, locX);
preparedStatement.setFloat(3, locY);
preparedStatement.setFloat(4, locZ);
preparedStatement.setLong(5, mobID);
ResultSet rs = preparedStatement.executeQuery();
row_count = preparedStatement.executeUpdate();
} catch (SQLException e) {
Logger.error(e);
}
return row_count;
}
public String SET_PROPERTY(final Mob m, String name, Object new_value) {
String result = "";
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL mob_SETPROP(?,?,?)")) {
preparedStatement.setLong(1, m.getObjectUUID());
preparedStatement.setString(2, name);
preparedStatement.setString(3, String.valueOf(new_value));
ResultSet rs = preparedStatement.executeQuery();
if (rs.next())
result = rs.getString("result");
} catch (SQLException e) {
Logger.error(e);
}
return result;
}
} }

767
src/engine/db/handlers/dbNPCHandler.java

@ -10,347 +10,456 @@
package engine.db.handlers; package engine.db.handlers;
import engine.Enum.ProfitType; import engine.Enum.ProfitType;
import engine.objects.*; import engine.gameManager.DbManager;
import engine.objects.NPC;
import engine.objects.NPCProfits;
import engine.objects.ProducedItem;
import engine.objects.Zone;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
public class dbNPCHandler extends dbHandlerBase { public class dbNPCHandler extends dbHandlerBase {
public dbNPCHandler() { public dbNPCHandler() {
this.localClass = NPC.class; this.localClass = NPC.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public NPC ADD_NPC(NPC toAdd, boolean isMob) {
prepareCallable("CALL `npc_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
setLong(1, toAdd.getParentZoneID());
setString(2, toAdd.getName());
setInt(3, toAdd.getContractID());
setInt(4, toAdd.getGuildUUID());
setFloat(5, toAdd.getSpawnX());
setFloat(6, toAdd.getSpawnY());
setFloat(7, toAdd.getSpawnZ());
setInt(8, toAdd.getLevel());
setFloat(9, toAdd.getBuyPercent());
setFloat(10, toAdd.getSellPercent());
if (toAdd.getBuilding() != null) {
setInt(11, toAdd.getBuilding().getObjectUUID());
} else {
setInt(11, 0);
}
int objectUUID = (int) getUUID();
if (objectUUID > 0) {
return GET_NPC(objectUUID);
}
return null;
}
public int DELETE_NPC(final NPC npc) {
if (npc.isStatic()) {
return DELETE_STATIC_NPC(npc);
}
npc.removeFromZone();
prepareCallable("DELETE FROM `object` WHERE `UID` = ?");
setLong(1, (long) npc.getDBID());
return executeUpdate();
}
private int DELETE_STATIC_NPC(final NPC npc) {
npc.removeFromZone();
prepareCallable("DELETE FROM `_init_npc` WHERE `ID` = ?");
setInt(1, npc.getDBID());
return executeUpdate();
}
public ArrayList<NPC> GET_ALL_NPCS_FOR_ZONE(Zone zone) {
prepareCallable("SELECT `obj_npc`.*, `object`.`parent` FROM `object` INNER JOIN `obj_npc` ON `obj_npc`.`UID` = `object`.`UID` WHERE `object`.`parent` = ?;");
setLong(1, (long) zone.getObjectUUID());
return getLargeObjectList();
}
public ArrayList<NPC> GET_ALL_NPCS() {
prepareCallable("SELECT `obj_npc`.*, `object`.`parent` FROM `object` INNER JOIN `obj_npc` ON `obj_npc`.`UID` = `object`.`UID`;");
return getObjectList();
}
public ArrayList<NPC> GET_NPCS_BY_BUILDING(final int buildingID) {
prepareCallable("SELECT `obj_npc`.*, `object`.`parent` FROM `obj_npc` INNER JOIN `object` ON `obj_npc`.`UID` = `object`.`UID` WHERE `npc_buildingID` = ? LIMIT 3");
setInt(1, buildingID);
return getObjectList();
}
public NPC GET_NPC(final int objectUUID) {
prepareCallable("SELECT `obj_npc`.*, `object`.`parent` FROM `object` INNER JOIN `obj_npc` ON `obj_npc`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?;");
setLong(1, (long) objectUUID);
return (NPC) getObjectSingle(objectUUID);
}
public int MOVE_NPC(long npcID, long parentID, float locX, float locY, float locZ) {
prepareCallable("UPDATE `object` INNER JOIN `obj_npc` On `object`.`UID` = `obj_npc`.`UID` SET `object`.`parent`=?, `obj_npc`.`npc_spawnX`=?, `obj_npc`.`npc_spawnY`=?, `obj_npc`.`npc_spawnZ`=? WHERE `obj_npc`.`UID`=?;");
setLong(1, parentID);
setFloat(2, locX);
setFloat(3, locY);
setFloat(4, locZ);
setLong(5, npcID);
return executeUpdate();
}
public String SET_PROPERTY(final NPC n, String name, Object new_value) {
prepareCallable("CALL npc_SETPROP(?,?,?)");
setLong(1, (long) n.getDBID());
setString(2, name);
setString(3, String.valueOf(new_value));
return getResult();
}
public String SET_PROPERTY(final NPC n, String name, Object new_value, Object old_value) {
prepareCallable("CALL npc_GETSETPROP(?,?,?,?)");
setLong(1, (long) n.getDBID());
setString(2, name);
setString(3, String.valueOf(new_value));
setString(4, String.valueOf(old_value));
return getResult();
}
public void updateDatabase(final NPC npc) {
prepareCallable("UPDATE obj_npc SET npc_name=?, npc_contractID=?, npc_typeID=?, npc_guildID=?,"
+ " npc_spawnX=?, npc_spawnY=?, npc_spawnZ=?, npc_level=? ,"
+ " npc_buyPercent=?, npc_sellPercent=?, npc_buildingID=? WHERE UID = ?");
setString(1, npc.getName());
setInt(2, (npc.getContract() != null) ? npc.getContract().getObjectUUID() : 0);
setInt(3, 0);
setInt(4, (npc.getGuild() != null) ? npc.getGuild().getObjectUUID() : 0);
setFloat(5, npc.getBindLoc().x);
setFloat(6, npc.getBindLoc().y);
setFloat(7, npc.getBindLoc().z);
setShort(8, npc.getLevel());
setFloat(9, npc.getBuyPercent());
setFloat(10, npc.getSellPercent());
setInt(11, (npc.getBuilding() != null) ? npc.getBuilding().getObjectUUID() : 0);
setInt(12, npc.getDBID());
executeUpdate();
}
public boolean updateUpgradeTime(NPC npc, DateTime upgradeDateTime) {
try {
prepareCallable("UPDATE obj_npc SET upgradeDate=? "
+ "WHERE UID = ?");
if (upgradeDateTime == null)
setNULL(1, java.sql.Types.DATE);
else
setTimeStamp(1, upgradeDateTime.getMillis());
setInt(2, npc.getObjectUUID());
executeUpdate();
} catch (Exception e) {
Logger.error("UUID: " + npc.getObjectUUID());
return false;
}
return true;
}
public boolean UPDATE_BUY_PROFIT(NPC npc,float percent) {
prepareCallable("UPDATE `obj_npc` SET `npc_buyPercent`=? WHERE `UID`=?");
setFloat(1, percent);
setLong(2, npc.getObjectUUID());
return (executeUpdate() > 0);
}
public boolean UPDATE_SELL_PROFIT(NPC npc,float percent) {
prepareCallable("UPDATE `obj_npc` SET `npc_sellPercent`=? WHERE `UID`=?");
setFloat(1, percent);
setLong(2, npc.getObjectUUID());
return (executeUpdate() > 0);
}
public boolean UPDATE_SLOT(NPC npc,int slot) {
prepareCallable("UPDATE `obj_npc` SET `npc_slot`=? WHERE `UID`=?");
setFloat(1, slot);
setLong(2, npc.getObjectUUID());
return (executeUpdate() > 0);
}
public boolean UPDATE_MOBBASE(NPC npc, int mobBaseID) {
prepareCallable("UPDATE `obj_npc` SET `npc_raceID`=? WHERE `UID`=?");
setLong(1, mobBaseID);
setLong(2, npc.getObjectUUID());
return (executeUpdate() > 0);
}
public boolean UPDATE_EQUIPSET(NPC npc, int equipSetID) {
prepareCallable("UPDATE `obj_npc` SET `equipsetID`=? WHERE `UID`=?");
setInt(1, equipSetID);
setLong(2, npc.getObjectUUID());
return (executeUpdate() > 0);
}
public boolean UPDATE_NAME(NPC npc,String name) {
prepareCallable("UPDATE `obj_npc` SET `npc_name`=? WHERE `UID`=?");
setString(1, name);
setLong(2, npc.getObjectUUID());
return (executeUpdate() > 0);
}
public void LOAD_PIRATE_NAMES() {
String pirateName;
int mobBase;
int recordsRead = 0;
prepareCallable("SELECT * FROM static_piratenames");
try {
ResultSet rs = executeQuery();
while (rs.next()) {
recordsRead++;
mobBase = rs.getInt("mobbase");
pirateName = rs.getString("first_name");
// Handle new mobbbase entries
if (NPC._pirateNames.get(mobBase) == null) {
NPC._pirateNames.putIfAbsent(mobBase, new ArrayList<>());
}
// Insert name into proper arraylist
NPC._pirateNames.get(mobBase).add(pirateName);
}
Logger.info("names read: " + recordsRead + " for "
+ NPC._pirateNames.size() + " mobBases");
} catch (SQLException e) {
Logger.error(e.getErrorCode() + ' ' + e.getMessage(), e);
} finally {
closeCallable();
}
}
public boolean ADD_TO_PRODUCTION_LIST(final long ID,final long npcUID, final long itemBaseID, DateTime dateTime, String prefix, String suffix, String name, boolean isRandom, int playerID) {
prepareCallable("INSERT INTO `dyn_npc_production` (`ID`,`npcUID`, `itemBaseID`,`dateToUpgrade`, `isRandom`, `prefix`, `suffix`, `name`,`playerID`) VALUES (?,?,?,?,?,?,?,?,?)");
setLong(1,ID);
setLong(2, npcUID);
setLong(3, itemBaseID);
setTimeStamp(4, dateTime.getMillis());
setBoolean(5, isRandom);
setString(6, prefix);
setString(7, suffix);
setString(8, name);
setInt(9,playerID);
return (executeUpdate() > 0);
}
public boolean REMOVE_FROM_PRODUCTION_LIST(final long ID,final long npcUID) {
prepareCallable("DELETE FROM `dyn_npc_production` WHERE `ID`=? AND `npcUID`=?;");
setLong(1,ID);
setLong(2, npcUID);
return (executeUpdate() > 0);
}
public boolean UPDATE_ITEM_TO_INVENTORY(final long ID,final long npcUID) {
prepareCallable("UPDATE `dyn_npc_production` SET `inForge`=? WHERE `ID`=? AND `npcUID`=?;");
setByte(1, (byte)0);
setLong(2, ID);
setLong(3, npcUID);
return (executeUpdate() > 0);
}
public boolean UPDATE_ITEM_PRICE(final long ID,final long npcUID, int value) {
prepareCallable("UPDATE `dyn_npc_production` SET `value`=? WHERE `ID`=? AND `npcUID`=?;");
setInt(1, value);
setLong(2, ID);
setLong(3, npcUID);
return (executeUpdate() > 0);
}
public boolean UPDATE_ITEM_ID(final long ID,final long npcUID,final long value) {
prepareCallable("UPDATE `dyn_npc_production` SET `ID`=? WHERE `ID`=? AND `npcUID`=? LIMIT 1;");
setLong(1, value);
setLong(2, ID);
setLong(3, npcUID);
return (executeUpdate() > 0);
}
public void LOAD_ALL_ITEMS_TO_PRODUCE(NPC npc) {
if (npc == null)
return;
prepareCallable("SELECT * FROM `dyn_npc_production` WHERE `npcUID` = ?"); public NPC ADD_NPC(NPC toAdd, boolean isMob) {
setInt(1,npc.getObjectUUID());
try { NPC npc = null;
ResultSet rs = executeQuery();
//shrines cached in rs for easy cache on creation. try (Connection connection = DbManager.getConnection();
while (rs.next()) { PreparedStatement preparedStatement = connection.prepareStatement("CALL `npc_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")) {
ProducedItem producedItem = new ProducedItem(rs);
npc.forgedItems.add(producedItem);
}
} catch (SQLException e) { preparedStatement.setLong(1, toAdd.getParentZoneID());
Logger.error(e.getErrorCode() + ' ' + e.getMessage(), e); preparedStatement.setString(2, toAdd.getName());
} finally { preparedStatement.setInt(3, toAdd.getContractID());
closeCallable(); preparedStatement.setInt(4, toAdd.getGuildUUID());
} preparedStatement.setFloat(5, toAdd.getSpawnX());
} preparedStatement.setFloat(6, toAdd.getSpawnY());
preparedStatement.setFloat(7, toAdd.getSpawnZ());
preparedStatement.setInt(8, toAdd.getLevel());
preparedStatement.setFloat(9, toAdd.getBuyPercent());
preparedStatement.setFloat(10, toAdd.getSellPercent());
public boolean UPDATE_PROFITS(NPC npc,ProfitType profitType, float value){ if (toAdd.getBuilding() != null)
prepareCallable("UPDATE `dyn_npc_profits` SET `" + profitType.dbField + "` = ? WHERE `npcUID`=?"); preparedStatement.setInt(11, toAdd.getBuilding().getObjectUUID());
setFloat(1, value); else
setInt(2, npc.getObjectUUID()); preparedStatement.setInt(11, 0);
return (executeUpdate() > 0);
} ResultSet rs = preparedStatement.executeQuery();
public void LOAD_NPC_PROFITS() { if (rs.next()) {
int objectUUID = (int) rs.getLong("UID");
HashMap<Integer, ArrayList<BuildingRegions>> regions;
NPCProfits npcProfit; if (objectUUID > 0)
npc = GET_NPC(objectUUID);
}
prepareCallable("SELECT * FROM dyn_npc_profits");
} catch (SQLException e) {
try { throw new RuntimeException(e);
ResultSet rs = executeQuery(); }
while (rs.next()) { return npc;
}
npcProfit = new NPCProfits(rs); public int DELETE_NPC(final NPC npc) {
NPCProfits.ProfitCache.put(npcProfit.npcUID, npcProfit);
} int row_count = 0;
} catch (SQLException e) { npc.removeFromZone();
Logger.error(": " + e.getErrorCode() + ' ' + e.getMessage(), e);
} finally { try (Connection connection = DbManager.getConnection();
closeCallable(); PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `object` WHERE `UID` = ?")) {
}
} preparedStatement.setLong(1, npc.getDBID());
row_count = preparedStatement.executeUpdate();
public boolean CREATE_PROFITS(NPC npc){
prepareCallable("INSERT INTO `dyn_npc_profits` (`npcUID`) VALUES (?)"); } catch (SQLException e) {
setLong(1,npc.getObjectUUID()); Logger.error(e);
return (executeUpdate() > 0);
} }
return row_count;
}
public ArrayList<NPC> GET_ALL_NPCS_FOR_ZONE(Zone zone) {
ArrayList<NPC> npcList = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_npc`.*, `object`.`parent` FROM `object` INNER JOIN `obj_npc` ON `obj_npc`.`UID` = `object`.`UID` WHERE `object`.`parent` = ?;")) {
preparedStatement.setLong(1, zone.getObjectUUID());
ResultSet rs = preparedStatement.executeQuery();
npcList = getObjectsFromRs(rs, 1000);
} catch (SQLException e) {
Logger.error(e);
}
return npcList;
}
public NPC GET_NPC(final int objectUUID) {
NPC npc = null;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_npc`.*, `object`.`parent` FROM `object` INNER JOIN `obj_npc` ON `obj_npc`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?;")) {
preparedStatement.setLong(1, objectUUID);
ResultSet rs = preparedStatement.executeQuery();
npc = (NPC) getObjectFromRs(rs);
} catch (SQLException e) {
Logger.error(e);
}
return npc;
}
public int MOVE_NPC(long npcID, long parentID, float locX, float locY, float locZ) {
int rowCount;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `object` INNER JOIN `obj_npc` On `object`.`UID` = `obj_npc`.`UID` SET `object`.`parent`=?, `obj_npc`.`npc_spawnX`=?, `obj_npc`.`npc_spawnY`=?, `obj_npc`.`npc_spawnZ`=? WHERE `obj_npc`.`UID`=?;")) {
preparedStatement.setLong(1, parentID);
preparedStatement.setFloat(2, locX);
preparedStatement.setFloat(3, locY);
preparedStatement.setFloat(4, locZ);
preparedStatement.setLong(5, npcID);
rowCount = preparedStatement.executeUpdate();
} catch (SQLException e) {
Logger.error(e);
return 0;
}
return rowCount;
}
public String SET_PROPERTY(final NPC n, String name, Object new_value) {
String result = "";
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL npc_SETPROP(?,?,?)")) {
preparedStatement.setLong(1, n.getDBID());
preparedStatement.setString(2, name);
preparedStatement.setString(3, String.valueOf(new_value));
ResultSet rs = preparedStatement.executeQuery();
if (rs.next())
result = rs.getString("result");
} catch (SQLException e) {
Logger.error(e);
}
return result;
}
public void updateDatabase(final NPC npc) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE obj_npc SET npc_name=?, npc_contractID=?, npc_typeID=?, npc_guildID=?,"
+ " npc_spawnX=?, npc_spawnY=?, npc_spawnZ=?, npc_level=? ,"
+ " npc_buyPercent=?, npc_sellPercent=?, npc_buildingID=? WHERE UID = ?")) {
preparedStatement.setString(1, npc.getName());
preparedStatement.setInt(2, (npc.getContract() != null) ? npc.getContract().getObjectUUID() : 0);
preparedStatement.setInt(3, 0);
preparedStatement.setInt(4, (npc.getGuild() != null) ? npc.getGuild().getObjectUUID() : 0);
preparedStatement.setFloat(5, npc.getBindLoc().x);
preparedStatement.setFloat(6, npc.getBindLoc().y);
preparedStatement.setFloat(7, npc.getBindLoc().z);
preparedStatement.setShort(8, npc.getLevel());
preparedStatement.setFloat(9, npc.getBuyPercent());
preparedStatement.setFloat(10, npc.getSellPercent());
preparedStatement.setInt(11, (npc.getBuilding() != null) ? npc.getBuilding().getObjectUUID() : 0);
preparedStatement.setInt(12, npc.getDBID());
preparedStatement.executeUpdate();
} catch (SQLException e) {
Logger.error(e);
}
}
public boolean updateUpgradeTime(NPC npc, DateTime upgradeDateTime) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE obj_npc SET upgradeDate=? "
+ "WHERE UID = ?")) {
if (upgradeDateTime == null)
preparedStatement.setNull(1, java.sql.Types.DATE);
else
preparedStatement.setTimestamp(1, new java.sql.Timestamp(upgradeDateTime.getMillis()));
preparedStatement.setInt(2, npc.getObjectUUID());
preparedStatement.execute();
return true;
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean UPDATE_MOBBASE(NPC npc, int mobBaseID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_npc` SET `npc_raceID`=? WHERE `UID`=?")) {
preparedStatement.setLong(1, mobBaseID);
preparedStatement.setLong(2, npc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean UPDATE_EQUIPSET(NPC npc, int equipSetID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_npc` SET `equipsetID`=? WHERE `UID`=?")) {
preparedStatement.setInt(1, equipSetID);
preparedStatement.setLong(2, npc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean UPDATE_NAME(NPC npc, String name) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_npc` SET `npc_name`=? WHERE `UID`=?")) {
preparedStatement.setString(1, name);
preparedStatement.setLong(2, npc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public void LOAD_PIRATE_NAMES() {
String pirateName;
int mobBase;
int recordsRead = 0;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_piratenames")) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
recordsRead++;
mobBase = rs.getInt("mobbase");
pirateName = rs.getString("first_name");
// Handle new mobbbase entries
if (NPC._pirateNames.get(mobBase) == null)
NPC._pirateNames.putIfAbsent(mobBase, new ArrayList<>());
// Insert name into proper arraylist
NPC._pirateNames.get(mobBase).add(pirateName);
}
} catch (SQLException e) {
Logger.error(e);
}
Logger.info("names read: " + recordsRead + " for "
+ NPC._pirateNames.size() + " mobBases");
}
public boolean ADD_TO_PRODUCTION_LIST(final long ID, final long npcUID, final long itemBaseID, DateTime dateTime, String prefix, String suffix, String name, boolean isRandom, int playerID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_npc_production` (`ID`,`npcUID`, `itemBaseID`,`dateToUpgrade`, `isRandom`, `prefix`, `suffix`, `name`,`playerID`) VALUES (?,?,?,?,?,?,?,?,?)")) {
preparedStatement.setLong(1, ID);
preparedStatement.setLong(2, npcUID);
preparedStatement.setLong(3, itemBaseID);
preparedStatement.setTimestamp(4, new java.sql.Timestamp(dateTime.getMillis()));
preparedStatement.setBoolean(5, isRandom);
preparedStatement.setString(6, prefix);
preparedStatement.setString(7, suffix);
preparedStatement.setString(8, name);
preparedStatement.setInt(9, playerID);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean REMOVE_FROM_PRODUCTION_LIST(final long ID, final long npcUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `dyn_npc_production` WHERE `ID`=? AND `npcUID`=?;")) {
preparedStatement.setLong(1, ID);
preparedStatement.setLong(2, npcUID);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean UPDATE_ITEM_TO_INVENTORY(final long ID, final long npcUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_npc_production` SET `inForge`=? WHERE `ID`=? AND `npcUID`=?;")) {
preparedStatement.setByte(1, (byte) 0);
preparedStatement.setLong(2, ID);
preparedStatement.setLong(3, npcUID);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean UPDATE_ITEM_PRICE(final long ID, final long npcUID, int value) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_npc_production` SET `value`=? WHERE `ID`=? AND `npcUID`=?;")) {
preparedStatement.setInt(1, value);
preparedStatement.setLong(2, ID);
preparedStatement.setLong(3, npcUID);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public boolean UPDATE_ITEM_ID(final long ID, final long npcUID, final long value) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_npc_production` SET `ID`=? WHERE `ID`=? AND `npcUID`=? LIMIT 1;")) {
preparedStatement.setLong(1, value);
preparedStatement.setLong(2, ID);
preparedStatement.setLong(3, npcUID);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public void LOAD_ALL_ITEMS_TO_PRODUCE(NPC npc) {
if (npc == null)
return;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_npc_production` WHERE `npcUID` = ?")) {
preparedStatement.setInt(1, npc.getObjectUUID());
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
ProducedItem producedItem = new ProducedItem(rs);
npc.forgedItems.add(producedItem);
}
} catch (SQLException e) {
Logger.error(e);
}
}
public boolean UPDATE_PROFITS(NPC npc, ProfitType profitType, float value) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_npc_profits` SET `" + profitType.dbField + "` = ? WHERE `npcUID`=?")) {
preparedStatement.setFloat(1, value);
preparedStatement.setInt(2, npc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public void LOAD_NPC_PROFITS() {
NPCProfits npcProfit;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM dyn_npc_profits")) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
npcProfit = new NPCProfits(rs);
NPCProfits.ProfitCache.put(npcProfit.npcUID, npcProfit);
}
} catch (SQLException e) {
Logger.error(e);
}
}
public boolean CREATE_PROFITS(NPC npc) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_npc_profits` (`npcUID`) VALUES (?)")) {
preparedStatement.setLong(1, npc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
} }

913
src/engine/db/handlers/dbPlayerCharacterHandler.java

@ -18,6 +18,8 @@ import engine.objects.PlayerFriends;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -25,378 +27,545 @@ import java.util.concurrent.ConcurrentHashMap;
public class dbPlayerCharacterHandler extends dbHandlerBase { public class dbPlayerCharacterHandler extends dbHandlerBase {
public dbPlayerCharacterHandler() { public dbPlayerCharacterHandler() {
this.localClass = PlayerCharacter.class; this.localClass = PlayerCharacter.class;
this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public PlayerCharacter ADD_PLAYER_CHARACTER(final PlayerCharacter toAdd) {
if (toAdd.getAccount() == null) {
return null;
}
prepareCallable("CALL `character_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
setLong(1, toAdd.getAccount().getObjectUUID());
setString(2, toAdd.getFirstName());
setString(3, toAdd.getLastName());
setInt(4, toAdd.getRace().getRaceRuneID());
setInt(5, toAdd.getBaseClass().getObjectUUID());
setInt(6, toAdd.getStrMod());
setInt(7, toAdd.getDexMod());
setInt(8, toAdd.getConMod());
setInt(9, toAdd.getIntMod());
setInt(10, toAdd.getSpiMod());
setInt(11, toAdd.getExp());
setInt(12, toAdd.getSkinColor());
setInt(13, toAdd.getHairColor());
setByte(14, toAdd.getHairStyle());
setInt(15, toAdd.getBeardColor());
setByte(16, toAdd.getBeardStyle());
int objectUUID = (int) getUUID();
if (objectUUID > 0) {
return GET_PLAYER_CHARACTER(objectUUID);
}
return null;
}
public boolean SET_IGNORE_LIST(int sourceID, int targetID, boolean toIgnore, String charName) {
if (toIgnore) {
//Add to ignore list
prepareCallable("INSERT INTO `dyn_character_ignore` (`accountUID`, `ignoringUID`, `characterName`) VALUES (?, ?, ?)");
setLong(1, (long) sourceID);
setLong(2, (long) targetID);
setString(3, charName);
return (executeUpdate() > 0);
} else {
//delete from ignore list
prepareCallable("DELETE FROM `dyn_character_ignore` WHERE `accountUID` = ? && `ignoringUID` = ?");
setLong(1, (long) sourceID);
setLong(2, (long) targetID);
return (executeUpdate() > 0);
}
}
public static boolean DELETE_CHARACTER_IGNORE(final PlayerCharacter pc, final ArrayList<Integer> toDelete) {
return false;
}
public ArrayList<PlayerCharacter> GET_ALL_PLAYERCHARACTERS() {
prepareCallable("SELECT * FROM `obj_character`");
return getObjectList();
}
public ArrayList<PlayerCharacter> GET_CHARACTERS_FOR_ACCOUNT(final int id, boolean forceFromDB) {
prepareCallable("SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `object`.`parent`=? && `obj_character`.`char_isActive`='1';");
setLong(1, (long) id);
return getObjectList(10, forceFromDB);
}
public ArrayList<PlayerCharacter> GET_CHARACTERS_FOR_ACCOUNT(final int id) {
prepareCallable("SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `object`.`parent`=? && `obj_character`.`char_isActive`='1';");
setLong(1, (long) id);
return getObjectList();
}
public ArrayList<PlayerCharacter> GET_ALL_CHARACTERS() {
prepareCallable("SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `obj_character`.`char_isActive`='1';");
return getObjectList();
}
/**
*
* <code>getFirstName</code> looks up the first name of a PlayerCharacter by
* first checking the GOM cache and then querying the database.
* PlayerCharacter objects that are not already cached won't be instantiated
* and cached.
*
*/
public String GET_FIRST_NAME(final int objectUUID) {
prepareCallable("SELECT `char_firstname` from `obj_character` WHERE `UID` = ? LIMIT 1");
setLong(1, (long) objectUUID);
String firstName = "";
try {
ResultSet rs = executeQuery();
if (rs.next()) {
firstName = rs.getString("char_firstname");
}
} catch (SQLException e) {
Logger.error( e);
} finally {
closeCallable();
}
return firstName;
}
public ConcurrentHashMap<Integer, String> GET_IGNORE_LIST(final int objectUUID, final boolean skipActiveCheck) {
ConcurrentHashMap<Integer, String> out = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
prepareCallable("SELECT * FROM `dyn_character_ignore` WHERE `accountUID` = ?;");
setLong(1, (long) objectUUID);
try {
ResultSet rs = executeQuery();
while (rs.next()) {
int ignoreCharacterID = rs.getInt("ignoringUID");
if (ignoreCharacterID == 0) {
continue;
}
String name = rs.getString("characterName");
out.put(ignoreCharacterID, name);
}
rs.close();
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
return out; // null to explicitly indicate a problem and prevent data loss
} finally {
closeCallable();
}
return out;
}
public PlayerCharacter GET_PLAYER_CHARACTER(final int objectUUID) {
if (objectUUID == 0)
return null;
PlayerCharacter pc = (PlayerCharacter) DbManager.getFromCache(Enum.GameObjectType.PlayerCharacter, objectUUID);
if (pc != null)
return pc;
prepareCallable("SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?");
setLong(1, (long) objectUUID);
return (PlayerCharacter) getObjectSingle(objectUUID);
}
public boolean INSERT_CHARACTER_IGNORE(final PlayerCharacter pc, final ArrayList<Integer> toAdd) {
boolean allWorked = true;
prepareCallable("INSERT INTO `dyn_character_ignore` (`characterUID`, `ignoringUID`) VALUES (?, ?)");
setLong(1, (long) pc.getObjectUUID());
for (int id : toAdd) {
setLong(2, (long) id);
if (executeUpdate(false) == 0) {
allWorked = false;
}
}
closeCallable();
return allWorked;
}
public boolean IS_CHARACTER_NAME_UNIQUE(final String firstName) {
boolean unique = true;
prepareCallable("SELECT `char_firstname` FROM `obj_character` WHERE `char_isActive`=1 && `char_firstname`=?");
setString(1, firstName);
try {
ResultSet rs = executeQuery();
if (rs.next()) {
unique = false;
}
rs.close();
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getMessage());
unique = false;
} finally {
closeCallable();
}
return unique;
}
public boolean UPDATE_NAME(String oldFirstName, String newFirstName, String newLastName) {
prepareCallable("UPDATE `obj_character` SET `char_firstname`=?, `char_lastname`=? WHERE `char_firstname`=? AND `char_isActive`='1'");
setString(1, newFirstName);
setString(2, newLastName);
setString(3, oldFirstName);
return (executeUpdate() != 0);
}
public boolean SET_DELETED(final PlayerCharacter pc) {
prepareCallable("UPDATE `obj_character` SET `char_isActive`=? WHERE `UID` = ?");
setBoolean(1, !pc.isDeleted());
setLong(2, (long) pc.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean SET_ACTIVE(final PlayerCharacter pc, boolean status) {
prepareCallable("UPDATE `obj_character` SET `char_isActive`=? WHERE `UID` = ?");
setBoolean(1, status);
setLong(2, (long) pc.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean SET_BIND_BUILDING(final PlayerCharacter pc, int bindBuildingID) {
prepareCallable("UPDATE `obj_character` SET `char_bindBuilding`=? WHERE `UID` = ?");
setInt(1, bindBuildingID);
setLong(2, (long) pc.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean SET_ANNIVERSERY(final PlayerCharacter pc, boolean flag) {
prepareCallable("UPDATE `obj_character` SET `anniversery`=? WHERE `UID` = ?");
setBoolean(1, flag);
setLong(2, (long) pc.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean UPDATE_CHARACTER_EXPERIENCE(final PlayerCharacter pc) {
prepareCallable("UPDATE `obj_character` SET `char_experience`=? WHERE `UID` = ?");
setInt(1, pc.getExp());
setLong(2, (long) pc.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean UPDATE_GUILD(final PlayerCharacter pc, int guildUUID) {
prepareCallable("UPDATE `obj_character` SET `guildUID`=? WHERE `UID` = ?");
setInt(1, guildUUID);
setLong(2, (long) pc.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean UPDATE_CHARACTER_STAT(final PlayerCharacter pc, String stat, short amount) {
prepareCallable("UPDATE `obj_character` SET `" + stat + "`=? WHERE `UID`=?");
setInt(1, pc.getExp());
setLong(2, (long) pc.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean UPDATE_CHARACTER_STATS(final PlayerCharacter pc) {
prepareCallable("UPDATE `obj_character` SET `char_strMod`=?, `char_dexMod`=?, `char_conMod`=?, `char_intMod`=?, `char_spiMod`=? WHERE `UID`=?");
setInt(1, pc.getStrMod());
setInt(2, pc.getDexMod());
setInt(3, pc.getConMod());
setInt(4, pc.getIntMod());
setInt(5, pc.getSpiMod());
setLong(6, (long) pc.getObjectUUID());
return (executeUpdate() != 0);
}
public String SET_PROPERTY(final PlayerCharacter c, String name, Object new_value) {
prepareCallable("CALL character_SETPROP(?,?,?)");
setLong(1, (long) c.getObjectUUID());
setString(2, name);
setString(3, String.valueOf(new_value));
return getResult();
}
public String SET_PROPERTY(final PlayerCharacter c, String name, Object new_value, Object old_value) {
prepareCallable("CALL character_GETSETPROP(?,?,?,?)");
setLong(1, (long) c.getObjectUUID());
setString(2, name);
setString(3, String.valueOf(new_value));
setString(4, String.valueOf(old_value));
return getResult();
}
public boolean SET_PROMOTION_CLASS(PlayerCharacter player, int promotionClassID) {
prepareCallable("UPDATE `obj_character` SET `char_promotionClassID`=? WHERE `UID`=?;");
setInt(1,promotionClassID);
setInt(2, player.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean SET_INNERCOUNCIL(PlayerCharacter player, boolean isInnerCouncil) {
prepareCallable("UPDATE `obj_character` SET `guild_isInnerCouncil`=? WHERE `UID`=?;");
setBoolean(1,isInnerCouncil);
setInt(2, player.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean SET_FULL_MEMBER(PlayerCharacter player, boolean isFullMember) {
prepareCallable("UPDATE `obj_character` SET `guild_isFullMember`=? WHERE `UID`=?;");
setBoolean(1,isFullMember);
setInt(2, player.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean SET_TAX_COLLECTOR(PlayerCharacter player, boolean isTaxCollector) {
prepareCallable("UPDATE `obj_character` SET `guild_isTaxCollector`=? WHERE `UID`=?;");
setBoolean(1,isTaxCollector);
setInt(2, player.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean SET_RECRUITER(PlayerCharacter player, boolean isRecruiter) {
prepareCallable("UPDATE `obj_character` SET `guild_isRecruiter`=? WHERE `UID`=?;");
setBoolean(1,isRecruiter);
setInt(2, player.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean SET_GUILD_TITLE(PlayerCharacter player, int title) {
prepareCallable("UPDATE `obj_character` SET `guild_title`=? WHERE `UID`=?;");
setInt(1,title);
setInt(2, player.getObjectUUID());
return (executeUpdate() != 0);
}
public boolean ADD_FRIEND(int source, long friend){
prepareCallable("INSERT INTO `dyn_character_friends` (`playerUID`, `friendUID`) VALUES (?, ?)");
setLong(1, (long) source);
setLong(2, (long)friend);
return (executeUpdate() != 0);
}
public boolean REMOVE_FRIEND(int source, int friend){
prepareCallable("DELETE FROM `dyn_character_friends` WHERE (`playerUID`=?) AND (`friendUID`=?)");
setLong(1, (long) source);
setLong(2, (long)friend);
return (executeUpdate() != 0);
}
public void LOAD_PLAYER_FRIENDS() {
PlayerFriends playerFriend;
prepareCallable("SELECT * FROM dyn_character_friends");
try {
ResultSet rs = executeQuery();
while (rs.next()) {
playerFriend = new PlayerFriends(rs);
}
} catch (SQLException e) {
Logger.error("LoadMeshBounds: " + e.getErrorCode() + ' ' + e.getMessage(), e);
} finally {
closeCallable();
}
}
public boolean ADD_HERALDY(int source, AbstractWorldObject character){
prepareCallable("INSERT INTO `dyn_character_heraldy` (`playerUID`, `characterUID`,`characterType`) VALUES (?, ?,?)");
setLong(1, (long) source);
setLong(2, (long)character.getObjectUUID());
setInt(3, character.getObjectType().ordinal());
return (executeUpdate() != 0);
}
public boolean REMOVE_HERALDY(int source, int characterUID){
prepareCallable("DELETE FROM `dyn_character_heraldy` WHERE (`playerUID`=?) AND (`characterUID`=?)");
setLong(1, (long) source);
setLong(2, (long)characterUID);
return (executeUpdate() != 0);
}
public void LOAD_HERALDY() {
Heraldry heraldy;
prepareCallable("SELECT * FROM dyn_character_heraldy");
try {
ResultSet rs = executeQuery();
while (rs.next()) {
heraldy = new Heraldry(rs);
}
} catch (SQLException e) { public PlayerCharacter ADD_PLAYER_CHARACTER(final PlayerCharacter toAdd) {
Logger.error("LoadHeraldy: " + e.getErrorCode() + ' ' + e.getMessage(), e);
} finally { PlayerCharacter playerCharacter = null;
closeCallable();
} if (toAdd.getAccount() == null)
} return null;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL `character_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")) {
preparedStatement.setLong(1, toAdd.getAccount().getObjectUUID());
preparedStatement.setString(2, toAdd.getFirstName());
preparedStatement.setString(3, toAdd.getLastName());
preparedStatement.setInt(4, toAdd.getRace().getRaceRuneID());
preparedStatement.setInt(5, toAdd.getBaseClass().getObjectUUID());
preparedStatement.setInt(6, toAdd.getStrMod());
preparedStatement.setInt(7, toAdd.getDexMod());
preparedStatement.setInt(8, toAdd.getConMod());
preparedStatement.setInt(9, toAdd.getIntMod());
preparedStatement.setInt(10, toAdd.getSpiMod());
preparedStatement.setInt(11, toAdd.getExp());
preparedStatement.setInt(12, toAdd.getSkinColor());
preparedStatement.setInt(13, toAdd.getHairColor());
preparedStatement.setByte(14, toAdd.getHairStyle());
preparedStatement.setInt(15, toAdd.getBeardColor());
preparedStatement.setByte(16, toAdd.getBeardStyle());
ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) {
int objectUUID = (int) rs.getLong("UID");
if (objectUUID > 0)
playerCharacter = GET_PLAYER_CHARACTER(objectUUID);
}
} catch (SQLException e) {
Logger.error(e);
}
return playerCharacter;
}
public boolean SET_IGNORE_LIST(int sourceID, int targetID, boolean toIgnore, String charName) {
String queryString = "";
if (toIgnore)
queryString = "INSERT INTO `dyn_character_ignore` (`accountUID`, `ignoringUID`, `characterName`) VALUES (?, ?, ?)";
else
queryString = "DELETE FROM `dyn_character_ignore` WHERE `accountUID` = ? && `ignoringUID` = ?";
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {
preparedStatement.setLong(1, sourceID);
preparedStatement.setLong(2, targetID);
if (toIgnore)
preparedStatement.setString(3, charName);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public ArrayList<PlayerCharacter> GET_CHARACTERS_FOR_ACCOUNT(final int id) {
ArrayList<PlayerCharacter> characterList = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `object`.`parent`=? && `obj_character`.`char_isActive`='1';")) {
preparedStatement.setLong(1, id);
ResultSet rs = preparedStatement.executeQuery();
characterList = getObjectsFromRs(rs, 10);
} catch (SQLException e) {
Logger.error(e);
}
return characterList;
}
public ArrayList<PlayerCharacter> GET_ALL_CHARACTERS() {
ArrayList<PlayerCharacter> characterList = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `obj_character`.`char_isActive`='1';")) {
ResultSet rs = preparedStatement.executeQuery();
characterList = getObjectsFromRs(rs, 2000);
} catch (SQLException e) {
Logger.error(e);
}
return characterList;
}
/**
* <code>getFirstName</code> looks up the first name of a PlayerCharacter by
* first checking the GOM cache and then querying the database.
* PlayerCharacter objects that are not already cached won't be instantiated
* and cached.
*/
public ConcurrentHashMap<Integer, String> GET_IGNORE_LIST(final int objectUUID, final boolean skipActiveCheck) {
ConcurrentHashMap<Integer, String> ignoreList = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_character_ignore` WHERE `accountUID` = ?;")) {
preparedStatement.setLong(1, objectUUID);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
int ignoreCharacterID = rs.getInt("ignoringUID");
if (ignoreCharacterID == 0)
continue;
String name = rs.getString("characterName");
ignoreList.put(ignoreCharacterID, name);
}
} catch (SQLException e) {
Logger.error(e);
}
return ignoreList;
}
public PlayerCharacter GET_PLAYER_CHARACTER(final int objectUUID) {
if (objectUUID == 0)
return null;
PlayerCharacter playerCharacter = (PlayerCharacter) DbManager.getFromCache(Enum.GameObjectType.PlayerCharacter, objectUUID);
if (playerCharacter != null)
return playerCharacter;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_character`.*, `object`.`parent` FROM `object` INNER JOIN `obj_character` ON `obj_character`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?")) {
preparedStatement.setLong(1, objectUUID);
ResultSet rs = preparedStatement.executeQuery();
playerCharacter = (PlayerCharacter) getObjectFromRs(rs);
} catch (SQLException e) {
Logger.error(e);
}
return playerCharacter;
}
public boolean IS_CHARACTER_NAME_UNIQUE(final String firstName) {
boolean unique = true;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `char_firstname` FROM `obj_character` WHERE `char_isActive`=1 && `char_firstname`=?")) {
preparedStatement.setString(1, firstName);
ResultSet rs = preparedStatement.executeQuery();
if (rs.next())
unique = false;
} catch (SQLException e) {
Logger.error(e);
}
return unique;
}
public boolean UPDATE_NAME(String oldFirstName, String newFirstName, String newLastName) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `char_firstname`=?, `char_lastname`=? WHERE `char_firstname`=? AND `char_isActive`='1'")) {
preparedStatement.setString(1, newFirstName);
preparedStatement.setString(2, newLastName);
preparedStatement.setString(3, oldFirstName);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_DELETED(final PlayerCharacter pc) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `char_isActive`=? WHERE `UID` = ?")) {
preparedStatement.setBoolean(1, !pc.isDeleted());
preparedStatement.setLong(2, pc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_ACTIVE(final PlayerCharacter pc, boolean status) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `char_isActive`=? WHERE `UID` = ?")) {
preparedStatement.setBoolean(1, status);
preparedStatement.setLong(2, pc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_BIND_BUILDING(final PlayerCharacter pc, int bindBuildingID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `char_bindBuilding`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, bindBuildingID);
preparedStatement.setLong(2, pc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_ANNIVERSERY(final PlayerCharacter pc, boolean flag) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `anniversery`=? WHERE `UID` = ?")) {
preparedStatement.setBoolean(1, flag);
preparedStatement.setLong(2, pc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean UPDATE_CHARACTER_EXPERIENCE(final PlayerCharacter pc) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `char_experience`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, pc.getExp());
preparedStatement.setLong(2, pc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean UPDATE_GUILD(final PlayerCharacter pc, int guildUUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `guildUID`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, guildUUID);
preparedStatement.setLong(2, pc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean UPDATE_CHARACTER_STATS(final PlayerCharacter pc) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `char_strMod`=?, `char_dexMod`=?, `char_conMod`=?, `char_intMod`=?, `char_spiMod`=? WHERE `UID`=?")) {
preparedStatement.setInt(1, pc.getStrMod());
preparedStatement.setInt(2, pc.getDexMod());
preparedStatement.setInt(3, pc.getConMod());
preparedStatement.setInt(4, pc.getIntMod());
preparedStatement.setInt(5, pc.getSpiMod());
preparedStatement.setLong(6, pc.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public String SET_PROPERTY(final PlayerCharacter playerCharacter, String name, Object new_value) {
String result = "";
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL character_SETPROP(?,?,?)")) {
preparedStatement.setLong(1, playerCharacter.getObjectUUID());
preparedStatement.setString(2, name);
preparedStatement.setString(3, String.valueOf(new_value));
ResultSet rs = preparedStatement.executeQuery();
if (rs.next())
result = rs.getString("result");
} catch (SQLException e) {
Logger.error(e);
}
return result;
}
public boolean SET_PROMOTION_CLASS(PlayerCharacter player, int promotionClassID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `char_promotionClassID`=? WHERE `UID`=?;")) {
preparedStatement.setInt(1, promotionClassID);
preparedStatement.setInt(2, player.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_INNERCOUNCIL(PlayerCharacter player, boolean isInnerCouncil) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `guild_isInnerCouncil`=? WHERE `UID`=?;")) {
preparedStatement.setBoolean(1, isInnerCouncil);
preparedStatement.setInt(2, player.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_FULL_MEMBER(PlayerCharacter player, boolean isFullMember) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `guild_isFullMember`=? WHERE `UID`=?;")) {
preparedStatement.setBoolean(1, isFullMember);
preparedStatement.setInt(2, player.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_TAX_COLLECTOR(PlayerCharacter player, boolean isTaxCollector) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `guild_isTaxCollector`=? WHERE `UID`=?;")) {
preparedStatement.setBoolean(1, isTaxCollector);
preparedStatement.setInt(2, player.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_RECRUITER(PlayerCharacter player, boolean isRecruiter) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `guild_isRecruiter`=? WHERE `UID`=?;")) {
preparedStatement.setBoolean(1, isRecruiter);
preparedStatement.setInt(2, player.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_GUILD_TITLE(PlayerCharacter player, int title) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_character` SET `guild_title`=? WHERE `UID`=?;")) {
preparedStatement.setInt(1, title);
preparedStatement.setInt(2, player.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean ADD_FRIEND(int source, long friend) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_character_friends` (`playerUID`, `friendUID`) VALUES (?, ?)")) {
preparedStatement.setLong(1, source);
preparedStatement.setLong(2, friend);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean REMOVE_FRIEND(int source, int friend) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `dyn_character_friends` WHERE (`playerUID`=?) AND (`friendUID`=?)")) {
preparedStatement.setLong(1, source);
preparedStatement.setLong(2, friend);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public void LOAD_PLAYER_FRIENDS() {
PlayerFriends playerFriend;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM dyn_character_friends")) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
playerFriend = new PlayerFriends(rs);
} catch (SQLException e) {
Logger.error(e);
}
}
public boolean ADD_HERALDY(int source, AbstractWorldObject character) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_character_heraldy` (`playerUID`, `characterUID`,`characterType`) VALUES (?, ?,?)")) {
preparedStatement.setLong(1, source);
preparedStatement.setLong(2, character.getObjectUUID());
preparedStatement.setInt(3, character.getObjectType().ordinal());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean REMOVE_HERALDY(int source, int characterUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `dyn_character_heraldy` WHERE (`playerUID`=?) AND (`characterUID`=?)")) {
preparedStatement.setLong(1, source);
preparedStatement.setLong(2, characterUID);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public void LOAD_HERALDY() {
Heraldry heraldy;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM dyn_character_heraldy")) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
heraldy = new Heraldry(rs);
} catch (SQLException e) {
Logger.error(e);
}
}
} }

69
src/engine/db/handlers/dbPromotionClassHandler.java

@ -9,9 +9,12 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.PromotionClass; import engine.objects.PromotionClass;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -24,31 +27,59 @@ public class dbPromotionClassHandler extends dbHandlerBase {
} }
public ArrayList<Integer> GET_ALLOWED_RUNES(final PromotionClass pc) { public ArrayList<Integer> GET_ALLOWED_RUNES(final PromotionClass pc) {
ArrayList<Integer> runes = new ArrayList<>();
prepareCallable("SELECT * FROM `static_rune_promotionrunereq` WHERE `promoID`=?"); ArrayList<Integer> runeList = new ArrayList<>();
setInt(1, pc.getObjectUUID());
try { try (Connection connection = DbManager.getConnection();
ResultSet rs = executeQuery(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_promotionrunereq` WHERE `promoID`=?")) {
while (rs.next()) {
runes.add(rs.getInt("runereqID")); preparedStatement.setInt(1, pc.getObjectUUID());
}
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
runeList.add(rs.getInt("runereqID"));
} catch (SQLException e) { } catch (SQLException e) {
Logger.error("Failed to retrieve Allowed Runes for PromotionClass " + pc.getObjectUUID() + ". Error number: " + e.getErrorCode(), e); Logger.error(e);
return null;
} finally {
closeCallable();
} }
return runes; return runeList;
} }
public PromotionClass GET_PROMOTION_CLASS(final int objectUUID) { public PromotionClass GET_PROMOTION_CLASS(final int objectUUID) {
prepareCallable("SELECT * FROM `static_rune_promotion` WHERE `ID` = ?");
setInt(1, objectUUID); PromotionClass promotionClass = null;
return (PromotionClass) getObjectSingle(objectUUID);
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_promotion` WHERE `ID` = ?")) {
preparedStatement.setInt(1, objectUUID);
ResultSet rs = preparedStatement.executeQuery();
promotionClass = (PromotionClass) getObjectFromRs(rs);
} catch (SQLException e) {
Logger.error(e);
}
return promotionClass;
} }
public ArrayList<PromotionClass> GET_ALL_PROMOTIONS() { public ArrayList<PromotionClass> GET_ALL_PROMOTIONS() {
prepareCallable("SELECT * FROM `static_rune_promotion`");
return getObjectList(); ArrayList<PromotionClass> promotionList = new ArrayList<>();
}
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_promotion`")) {
ResultSet rs = preparedStatement.executeQuery();
promotionList = getObjectsFromRs(rs, 30);
} catch (SQLException e) {
Logger.error(e);
}
return promotionList;
}
} }

124
src/engine/db/handlers/dbRaceHandler.java

@ -9,9 +9,12 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.Race; import engine.objects.Race;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.HashSet; import java.util.HashSet;
@ -23,33 +26,110 @@ public class dbRaceHandler extends dbHandlerBase {
} }
public HashSet<Integer> BEARD_COLORS_FOR_RACE(final int id) { public HashSet<Integer> BEARD_COLORS_FOR_RACE(final int id) {
prepareCallable("SELECT `color` FROM `static_rune_racebeardcolor` WHERE `RaceID` = ?");
setInt(1, id); HashSet<Integer> integerSet = new HashSet<>();
return getIntegerList(1);
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `color` FROM `static_rune_racebeardcolor` WHERE `RaceID` = ?")) {
preparedStatement.setInt(1, id);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
integerSet.add(rs.getInt(1));
} catch (SQLException e) {
Logger.error(e);
}
return integerSet;
} }
public HashSet<Integer> BEARD_STYLES_FOR_RACE(final int id) { public HashSet<Integer> BEARD_STYLES_FOR_RACE(final int id) {
prepareCallable("SELECT `beardStyle` FROM `static_rune_racebeardstyle` WHERE `RaceID` = ?");
setInt(1, id); HashSet<Integer> integerSet = new HashSet<>();
return getIntegerList(1);
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `beardStyle` FROM `static_rune_racebeardstyle` WHERE `RaceID` = ?")) {
preparedStatement.setInt(1, id);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
integerSet.add(rs.getInt(1));
} catch (SQLException e) {
Logger.error(e);
}
return integerSet;
} }
public HashSet<Integer> HAIR_COLORS_FOR_RACE(final int id) { public HashSet<Integer> HAIR_COLORS_FOR_RACE(final int id) {
prepareCallable("SELECT `color` FROM `static_rune_racehaircolor` WHERE `RaceID` = ?");
setInt(1, id); HashSet<Integer> integerSet = new HashSet<>();
return getIntegerList(1);
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `color` FROM `static_rune_racehaircolor` WHERE `RaceID` = ?")) {
preparedStatement.setInt(1, id);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
integerSet.add(rs.getInt(1));
} catch (SQLException e) {
Logger.error(e);
}
return integerSet;
} }
public HashSet<Integer> HAIR_STYLES_FOR_RACE(final int id) { public HashSet<Integer> HAIR_STYLES_FOR_RACE(final int id) {
prepareCallable("SELECT `hairStyle` FROM `static_rune_racehairstyle` WHERE `RaceID` = ?");
setInt(1, id); HashSet<Integer> integerSet = new HashSet<>();
return getIntegerList(1);
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `hairStyle` FROM `static_rune_racehairstyle` WHERE `RaceID` = ?")) {
preparedStatement.setInt(1, id);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
integerSet.add(rs.getInt(1));
} catch (SQLException e) {
Logger.error(e);
}
return integerSet;
} }
public HashSet<Integer> SKIN_COLOR_FOR_RACE(final int id) { public HashSet<Integer> SKIN_COLOR_FOR_RACE(final int id) {
prepareCallable("SELECT `color` FROM `static_rune_raceskincolor` WHERE `RaceID` = ?");
setInt(1, id); HashSet<Integer> integerSet = new HashSet<>();
return getIntegerList(1);
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `color` FROM `static_rune_raceskincolor` WHERE `RaceID` = ?")) {
preparedStatement.setInt(1, id);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
integerSet.add(rs.getInt(1));
} catch (SQLException e) {
Logger.error(e);
}
return integerSet;
} }
public ConcurrentHashMap<Integer, Race> LOAD_ALL_RACES() { public ConcurrentHashMap<Integer, Race> LOAD_ALL_RACES() {
@ -60,10 +140,10 @@ public class dbRaceHandler extends dbHandlerBase {
races = new ConcurrentHashMap<>(); races = new ConcurrentHashMap<>();
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT * FROM static_rune_race"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_rune_race")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
@ -73,13 +153,11 @@ public class dbRaceHandler extends dbHandlerBase {
races.put(thisRace.getRaceRuneID(), thisRace); races.put(thisRace.getRaceRuneID(), thisRace);
} }
Logger.info("read: " + recordsRead + " cached: " + races.size());
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e);
} finally {
closeCallable();
} }
Logger.info("read: " + recordsRead + " cached: " + races.size());
return races; return races;
} }
} }

71
src/engine/db/handlers/dbRealmHandler.java

@ -9,14 +9,12 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.Realm; import engine.objects.Realm;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.net.UnknownHostException; import java.sql.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
public class dbRealmHandler extends dbHandlerBase { public class dbRealmHandler extends dbHandlerBase {
@ -24,50 +22,51 @@ public class dbRealmHandler extends dbHandlerBase {
} }
public ConcurrentHashMap<Integer, Realm> LOAD_ALL_REALMS() { public ConcurrentHashMap<Integer, Realm> LOAD_ALL_REALMS() {
ConcurrentHashMap<Integer, Realm> realmList; ConcurrentHashMap<Integer, Realm> realmList;
Realm thisRealm; Realm thisRealm;
realmList = new ConcurrentHashMap<>(); realmList = new ConcurrentHashMap<>();
int recordsRead = 0; int recordsRead = 0;
prepareCallable("SELECT * FROM obj_realm"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM obj_realm")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
recordsRead++;
thisRealm = new Realm(rs);
realmList.put(thisRealm.getRealmID(), thisRealm);
}
recordsRead++; } catch (SQLException e) {
thisRealm = new Realm(rs); Logger.error(e);
realmList.put(thisRealm.getRealmID(), thisRealm); }
}
Logger.info( "read: " + recordsRead + " cached: " + realmList.size()); Logger.info("read: " + recordsRead + " cached: " + realmList.size());
return realmList;
} catch (SQLException e) { }
Logger.error(e.getErrorCode() + ' ' + e.getMessage(), e);
} catch (UnknownHostException ex) {
java.util.logging.Logger.getLogger(dbRealmHandler.class.getName()).log(Level.SEVERE, null, ex);
} finally {
closeCallable();
}
return realmList;
}
public void REALM_UPDATE(Realm realm) { public void REALM_UPDATE(Realm realm) {
prepareCallable("CALL realm_UPDATE(?,?,?,?)"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL realm_UPDATE(?,?,?,?)")) {
setInt(1, realm.getRealmID()); preparedStatement.setInt(1, realm.getRealmID());
setInt(2, (realm.getRulingCity() == null) ? 0 : realm.getRulingCity().getObjectUUID()); preparedStatement.setInt(2, (realm.getRulingCity() == null) ? 0 : realm.getRulingCity().getObjectUUID());
setInt(3, realm.getCharterType()); preparedStatement.setInt(3, realm.getCharterType());
if (realm.ruledSince != null)
setLocalDateTime(4, realm.ruledSince); if (realm.ruledSince != null)
preparedStatement.setTimestamp(4, Timestamp.valueOf(realm.ruledSince));
else else
setNULL(4, java.sql.Types.DATE); preparedStatement.setNull(4, java.sql.Types.DATE);
preparedStatement.execute();
executeUpdate(); } catch (SQLException e) {
Logger.error(e);
}
} }
} }

30
src/engine/db/handlers/dbResistHandler.java

@ -9,8 +9,12 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.Resists; import engine.objects.Resists;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -21,17 +25,23 @@ public class dbResistHandler extends dbHandlerBase {
} }
public Resists GET_RESISTS_FOR_MOB(int resistID) { public Resists GET_RESISTS_FOR_MOB(int resistID) {
prepareCallable("SELECT * FROM `static_npc_mob_resists` WHERE `ID` = ?;");
setInt(1, resistID); Resists resists = null;
try {
ResultSet rs = executeQuery(); try (Connection connection = DbManager.getConnection();
if (rs.next()) { PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mob_resists` WHERE `ID` = ?;")) {
return new Resists(rs);
} preparedStatement.setInt(1, resistID);
ResultSet rs = preparedStatement.executeQuery();
if (rs.next())
resists = new Resists(rs);
} catch (SQLException e) { } catch (SQLException e) {
} finally { Logger.error(e);
closeCallable();
} }
return null;
return resists;
} }
} }

42
src/engine/db/handlers/dbRuneBaseAttributeHandler.java

@ -9,27 +9,39 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.RuneBaseAttribute; import engine.objects.RuneBaseAttribute;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
public class dbRuneBaseAttributeHandler extends dbHandlerBase { public class dbRuneBaseAttributeHandler extends dbHandlerBase {
public dbRuneBaseAttributeHandler() { public dbRuneBaseAttributeHandler() {
this.localClass = RuneBaseAttribute.class; this.localClass = RuneBaseAttribute.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public ArrayList<RuneBaseAttribute> GET_ATTRIBUTES_FOR_RUNEBASE(int id) { public ArrayList<RuneBaseAttribute> GET_ATTRIBUTES_FOR_RUNEBASE() {
prepareCallable("SELECT * FROM `static_rune_runebaseattribute` WHERE `RuneBaseID`=?");
setInt(1, id); ArrayList<RuneBaseAttribute> runeBaseAttributesList = new ArrayList<>();
return getObjectList();
} try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_runebaseattribute`")) {
public ArrayList<RuneBaseAttribute> GET_ATTRIBUTES_FOR_RUNEBASE() {
prepareCallable("SELECT * FROM `static_rune_runebaseattribute`"); ResultSet rs = preparedStatement.executeQuery();
return getObjectList(); runeBaseAttributesList = getObjectsFromRs(rs, 10);
}
} catch (SQLException e) {
Logger.error(e);
}
return runeBaseAttributesList;
}
} }

118
src/engine/db/handlers/dbRuneBaseEffectHandler.java

@ -13,61 +13,79 @@ import engine.Enum.GameObjectType;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.RuneBaseEffect; import engine.objects.RuneBaseEffect;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
public class dbRuneBaseEffectHandler extends dbHandlerBase { public class dbRuneBaseEffectHandler extends dbHandlerBase {
public dbRuneBaseEffectHandler() { public dbRuneBaseEffectHandler() {
this.localClass = RuneBaseEffect.class; this.localClass = RuneBaseEffect.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public ArrayList<RuneBaseEffect> GET_EFFECTS_FOR_RUNEBASE(int id) { public ArrayList<RuneBaseEffect> GET_EFFECTS_FOR_RUNEBASE(int id) {
prepareCallable("SELECT * FROM `static_rune_baseeffect` WHERE `runeID`=?");
setInt(1, id); ArrayList<RuneBaseEffect> runeBaseEffectsList = new ArrayList<>();
return getObjectList();
} try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_baseeffect` WHERE `runeID`=?")) {
public RuneBaseEffect GET_RUNEBASE_EFFECT(int id) {
preparedStatement.setInt(1, id);
if (id == 0)
return null; ResultSet rs = preparedStatement.executeQuery();
RuneBaseEffect runeBaseEffect = (RuneBaseEffect) DbManager.getFromCache(GameObjectType.RuneBaseEffect, id); runeBaseEffectsList = getObjectsFromRs(rs, 250);
if (runeBaseEffect != null)
return runeBaseEffect; } catch (SQLException e) {
prepareCallable("SELECT * FROM `static_rune_baseeffect` WHERE `ID` = ?"); Logger.error(e);
setInt(1, id); }
return (RuneBaseEffect) getObjectSingle(id);
} return runeBaseEffectsList;
}
public ArrayList<RuneBaseEffect> GET_ALL_RUNEBASE_EFFECTS(){
prepareCallable("SELECT * FROM `static_rune_baseeffect`;"); public ArrayList<RuneBaseEffect> GET_ALL_RUNEBASE_EFFECTS() {
return getObjectList();
} ArrayList<RuneBaseEffect> runeBaseEffectsList = new ArrayList<>();
//This calls from cache only. Call this AFTER caching all runebase effects; try (Connection connection = DbManager.getConnection();
public HashMap<Integer, ArrayList<RuneBaseEffect>> LOAD_BASEEFFECTS_FOR_RUNEBASE() { PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_baseeffect`;")) {
HashMap<Integer, ArrayList<RuneBaseEffect>> runeBaseEffectSet;
runeBaseEffectSet = new HashMap<>(); ResultSet rs = preparedStatement.executeQuery();
runeBaseEffectsList = getObjectsFromRs(rs, 250);
for (AbstractGameObject runeBaseEffect:DbManager.getList(GameObjectType.RuneBaseEffect)){ } catch (SQLException e) {
Logger.error(e);
int runeBaseID = ((RuneBaseEffect)runeBaseEffect).getRuneBaseID(); }
if (runeBaseEffectSet.get(runeBaseID) == null){
ArrayList<RuneBaseEffect> runeBaseEffectList = new ArrayList<>(); return runeBaseEffectsList;
runeBaseEffectList.add((RuneBaseEffect)runeBaseEffect); }
runeBaseEffectSet.put(runeBaseID, runeBaseEffectList);
} //This calls from cache only. Call this AFTER caching all runebase effects;
else{
ArrayList<RuneBaseEffect>runeBaseEffectList = runeBaseEffectSet.get(runeBaseID); public HashMap<Integer, ArrayList<RuneBaseEffect>> LOAD_BASEEFFECTS_FOR_RUNEBASE() {
runeBaseEffectList.add((RuneBaseEffect)runeBaseEffect);
runeBaseEffectSet.put(runeBaseID, runeBaseEffectList); HashMap<Integer, ArrayList<RuneBaseEffect>> runeBaseEffectSet;
} runeBaseEffectSet = new HashMap<>();
}
return runeBaseEffectSet; for (AbstractGameObject runeBaseEffect : DbManager.getList(GameObjectType.RuneBaseEffect)) {
}
int runeBaseID = ((RuneBaseEffect) runeBaseEffect).getRuneBaseID();
if (runeBaseEffectSet.get(runeBaseID) == null) {
ArrayList<RuneBaseEffect> runeBaseEffectList = new ArrayList<>();
runeBaseEffectList.add((RuneBaseEffect) runeBaseEffect);
runeBaseEffectSet.put(runeBaseID, runeBaseEffectList);
} else {
ArrayList<RuneBaseEffect> runeBaseEffectList = runeBaseEffectSet.get(runeBaseID);
runeBaseEffectList.add((RuneBaseEffect) runeBaseEffect);
runeBaseEffectSet.put(runeBaseID, runeBaseEffectList);
}
}
return runeBaseEffectSet;
}
} }

306
src/engine/db/handlers/dbRuneBaseHandler.java

@ -9,165 +9,171 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.RuneBase; import engine.objects.RuneBase;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
public class dbRuneBaseHandler extends dbHandlerBase { public class dbRuneBaseHandler extends dbHandlerBase {
public dbRuneBaseHandler() { public dbRuneBaseHandler() {
this.localClass = RuneBase.class; this.localClass = RuneBase.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public void GET_RUNE_REQS(final RuneBase rb) {
prepareCallable("SELECT * FROM `static_rune_runereq` WHERE `runeID` = ?");
setInt(1, rb.getObjectUUID());
try {
ResultSet rs = executeQuery();
while (rs.next()) {
int type = rs.getInt("type");
switch (type) {
case 1:
rb.getRace().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed"));
break;
case 2:
rb.getBaseClass().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed"));
break;
case 3:
rb.getPromotionClass().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed"));
break;
case 4:
rb.getDiscipline().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed"));
break;
case 5:
rb.getOverwrite().add(rs.getInt("requiredRuneID"));
break;
case 6:
rb.setLevelRequired(rs.getInt("requiredRuneID"));
break;
}
}
rs.close();
} catch (SQLException e) {
Logger.error("SQL Error number: " + e.getErrorCode());
} finally {
closeCallable();
}
}
public RuneBase GET_RUNEBASE(final int id) {
prepareCallable("SELECT * FROM `static_rune_runebase` WHERE `ID` = ?");
setInt(1, id);
return (RuneBase) getObjectSingle(id);
}
public ArrayList<RuneBase> LOAD_ALL_RUNEBASES() {
prepareCallable("SELECT * FROM `static_rune_runebase`;");
return getObjectList();
}
public HashMap<Integer, ArrayList<Integer>> LOAD_ALLOWED_STARTING_RUNES_FOR_BASECLASS() {
HashMap<Integer, ArrayList<Integer>> runeSets;
runeSets = new HashMap<>();
int recordsRead = 0;
prepareCallable("SELECT * FROM static_rune_baseclassrune");
try {
ResultSet rs = executeQuery();
while (rs.next()) {
recordsRead++;
int baseClassID = rs.getInt("BaseClassesID");
int runeBaseID = rs.getInt("RuneBaseID");
if (runeSets.get(baseClassID) == null){
ArrayList<Integer> runeList = new ArrayList<>();
runeList.add(runeBaseID);
runeSets.put(baseClassID, runeList);
}
else{
ArrayList<Integer>runeList = runeSets.get(baseClassID);
runeList.add(runeBaseID);
runeSets.put(baseClassID, runeList);
}
}
Logger.info("read: " + recordsRead + " cached: " + runeSets.size());
} catch (SQLException e) {
Logger.error(e.getErrorCode() + ' ' + e.getMessage(), e);
} finally {
closeCallable();
}
return runeSets;
}
public HashMap<Integer, ArrayList<Integer>> LOAD_ALLOWED_STARTING_RUNES_FOR_RACE() {
HashMap<Integer, ArrayList<Integer>> runeSets;
runeSets = new HashMap<>();
int recordsRead = 0;
prepareCallable("SELECT * FROM static_rune_racerune");
try {
ResultSet rs = executeQuery();
while (rs.next()) {
recordsRead++;
int raceID = rs.getInt("RaceID");
int runeBaseID = rs.getInt("RuneBaseID");
if (runeSets.get(raceID) == null){
ArrayList<Integer> runeList = new ArrayList<>();
runeList.add(runeBaseID);
runeSets.put(raceID, runeList);
}
else{
ArrayList<Integer>runeList = runeSets.get(raceID);
runeList.add(runeBaseID);
runeSets.put(raceID, runeList);
}
}
Logger.info( "read: " + recordsRead + " cached: " + runeSets.size());
} catch (SQLException e) {
Logger.error(e.getErrorCode() + ' ' + e.getMessage(), e);
} finally {
closeCallable();
}
return runeSets;
}
public ArrayList<RuneBase> GET_RUNEBASE_FOR_BASECLASS(final int id) {
prepareCallable("SELECT rb.* FROM static_rune_baseclassrune bcr, static_rune_runebase rb WHERE bcr.RuneBaseID = rb.ID "
+ "&& ( bcr.BaseClassesID = 111111 || bcr.BaseClassesID = ? )");
setInt(1, id);
return getObjectList();
}
public HashSet<RuneBase> GET_RUNEBASE_FOR_RACE(final int id) { public void GET_RUNE_REQS(final RuneBase rb) {
prepareCallable("SELECT rb.* FROM static_rune_racerune rr, static_rune_runebase rb"
+ " WHERE rr.RuneBaseID = rb.ID && ( rr.RaceID = 111111 || rr.RaceID = ?)"); try (Connection connection = DbManager.getConnection();
setInt(1, id); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_runereq` WHERE `runeID` = ?")) {
return new HashSet<>(getObjectList());
} preparedStatement.setInt(1, rb.getObjectUUID());
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
int type = rs.getInt("type");
switch (type) {
case 1:
rb.getRace().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed"));
break;
case 2:
rb.getBaseClass().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed"));
break;
case 3:
rb.getPromotionClass().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed"));
break;
case 4:
rb.getDiscipline().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed"));
break;
case 5:
rb.getOverwrite().add(rs.getInt("requiredRuneID"));
break;
case 6:
rb.setLevelRequired(rs.getInt("requiredRuneID"));
break;
}
}
} catch (SQLException e) {
Logger.error(e);
}
}
public RuneBase GET_RUNEBASE(final int id) {
RuneBase runeBase = null;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_runebase` WHERE `ID` = ?")) {
preparedStatement.setInt(1, id);
ResultSet rs = preparedStatement.executeQuery();
runeBase = (RuneBase) getObjectFromRs(rs);
} catch (SQLException e) {
Logger.error(e);
}
return runeBase;
}
public ArrayList<RuneBase> LOAD_ALL_RUNEBASES() {
ArrayList<RuneBase> runeBasesList = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_runebase`;")) {
ResultSet rs = preparedStatement.executeQuery();
runeBasesList = getObjectsFromRs(rs, 1000);
} catch (SQLException e) {
Logger.error(e);
}
return runeBasesList;
}
public HashMap<Integer, ArrayList<Integer>> LOAD_ALLOWED_STARTING_RUNES_FOR_BASECLASS() {
HashMap<Integer, ArrayList<Integer>> runeSets = new HashMap<>();
int recordsRead = 0;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_rune_baseclassrune")) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
recordsRead++;
int baseClassID = rs.getInt("BaseClassesID");
int runeBaseID = rs.getInt("RuneBaseID");
if (runeSets.get(baseClassID) == null) {
ArrayList<Integer> runeList = new ArrayList<>();
runeList.add(runeBaseID);
runeSets.put(baseClassID, runeList);
} else {
ArrayList<Integer> runeList = runeSets.get(baseClassID);
runeList.add(runeBaseID);
runeSets.put(baseClassID, runeList);
}
}
} catch (SQLException e) {
Logger.error(e);
}
Logger.info("read: " + recordsRead + " cached: " + runeSets.size());
return runeSets;
}
public HashMap<Integer, ArrayList<Integer>> LOAD_ALLOWED_STARTING_RUNES_FOR_RACE() {
HashMap<Integer, ArrayList<Integer>> runeSets;
runeSets = new HashMap<>();
int recordsRead = 0;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_rune_racerune")) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
recordsRead++;
int raceID = rs.getInt("RaceID");
int runeBaseID = rs.getInt("RuneBaseID");
if (runeSets.get(raceID) == null) {
ArrayList<Integer> runeList = new ArrayList<>();
runeList.add(runeBaseID);
runeSets.put(raceID, runeList);
} else {
ArrayList<Integer> runeList = runeSets.get(raceID);
runeList.add(runeBaseID);
runeSets.put(raceID, runeList);
}
}
} catch (SQLException e) {
Logger.error(e);
}
Logger.info("read: " + recordsRead + " cached: " + runeSets.size());
return runeSets;
}
} }

30
src/engine/db/handlers/dbRunegateHandler.java

@ -13,7 +13,10 @@ import engine.Enum;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.objects.Building; import engine.objects.Building;
import engine.objects.Portal; import engine.objects.Portal;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -28,17 +31,18 @@ public class dbRunegateHandler extends dbHandlerBase {
ArrayList<Integer> gateList = new ArrayList<>(); ArrayList<Integer> gateList = new ArrayList<>();
prepareCallable("SELECT DISTINCT `sourceBuilding` FROM `static_runegate_portals`;"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT DISTINCT `sourceBuilding` FROM `static_runegate_portals`;")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next())
gateList.add(rs.getInt("sourceBuilding")); gateList.add(rs.getInt("sourceBuilding"));
}
} catch (SQLException e) { } catch (SQLException e) {
} finally { Logger.error(e);
closeCallable();
} }
return gateList; return gateList;
} }
@ -47,11 +51,12 @@ public class dbRunegateHandler extends dbHandlerBase {
ArrayList<Portal> portalList = new ArrayList<>(); ArrayList<Portal> portalList = new ArrayList<>();
Building sourceBuilding = (Building) DbManager.getObject(Enum.GameObjectType.Building, gateUID); Building sourceBuilding = (Building) DbManager.getObject(Enum.GameObjectType.Building, gateUID);
prepareCallable("SELECT * FROM `static_runegate_portals` WHERE `sourceBuilding` = ?;"); try (Connection connection = DbManager.getConnection();
setInt(1, gateUID); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_runegate_portals` WHERE `sourceBuilding` = ?;")) {
preparedStatement.setInt(1, gateUID);
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
int targetBuildingID = rs.getInt("targetBuilding"); int targetBuildingID = rs.getInt("targetBuilding");
@ -62,8 +67,7 @@ public class dbRunegateHandler extends dbHandlerBase {
} }
} catch (SQLException e) { } catch (SQLException e) {
} finally { Logger.error(e);
closeCallable();
} }
return portalList; return portalList;
} }

170
src/engine/db/handlers/dbShrineHandler.java

@ -18,7 +18,8 @@ import engine.objects.Shrine;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.net.UnknownHostException; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -30,83 +31,10 @@ public class dbShrineHandler extends dbHandlerBase {
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public ArrayList<AbstractGameObject> CREATE_SHRINE( int parentZoneID, int OwnerUUID, String name, int meshUUID, public static void addObject(ArrayList<AbstractGameObject> list, ResultSet rs) throws SQLException {
Vector3fImmutable location, float meshScale, int currentHP,
ProtectionState protectionState, int currentGold, int rank,
DateTime upgradeDate, int blueprintUUID, float w, float rotY, String shrineType) {
prepareCallable("CALL `shrine_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,? ,? ,?, ?,?);");
setInt(1, parentZoneID);
setInt(2, OwnerUUID);
setString(3, name);
setInt(4, meshUUID);
setFloat(5, location.x);
setFloat(6, location.y);
setFloat(7, location.z);
setFloat(8, meshScale);
setInt(9, currentHP);
setString(10, protectionState.name());
setInt(11, currentGold);
setInt(12, rank);
if (upgradeDate != null) {
setTimeStamp(13, upgradeDate.getMillis());
} else {
setNULL(13, java.sql.Types.DATE);
}
setInt(14, blueprintUUID);
setFloat(15, w);
setFloat(16, rotY);
setString(17, shrineType);
ArrayList<AbstractGameObject> list = new ArrayList<>();
//System.out.println(this.cs.get().toString());
try {
boolean work = execute();
if (work) {
ResultSet rs = this.cs.get().getResultSet();
while (rs.next()) {
addObject(list, rs);
}
rs.close();
} else {
Logger.info("Shrine Creation Failed: " + this.cs.get().toString());
return list; //city creation failure
}
while (this.cs.get().getMoreResults()) {
ResultSet rs = this.cs.get().getResultSet();
while (rs.next()) {
addObject(list, rs);
}
rs.close();
}
} catch (SQLException e) {
Logger.info("Shrine Creation Failed, SQLException: " + this.cs.get().toString() + e.toString());
return list; //city creation failure
} catch (UnknownHostException e) {
Logger.info("Shrine Creation Failed, UnknownHostException: " + this.cs.get().toString());
return list; //city creation failure
} finally {
closeCallable();
}
return list;
}
public boolean updateFavors(Shrine shrine, int amount, int oldAmount) {
prepareCallable("UPDATE `obj_shrine` SET `shrine_favors`=? WHERE `UID` = ? AND `shrine_favors` = ?");
setInt(1, amount);
setLong(2, (long) shrine.getObjectUUID());
setInt(3, oldAmount);
return (executeUpdate() != 0);
}
public static void addObject(ArrayList<AbstractGameObject> list, ResultSet rs) throws SQLException, UnknownHostException {
String type = rs.getString("type"); String type = rs.getString("type");
switch (type) { switch (type) {
case "building": case "building":
Building building = new Building(rs); Building building = new Building(rs);
@ -121,27 +49,95 @@ public class dbShrineHandler extends dbHandlerBase {
} }
} }
public ArrayList<AbstractGameObject> CREATE_SHRINE(int parentZoneID, int OwnerUUID, String name, int meshUUID,
Vector3fImmutable location, float meshScale, int currentHP,
ProtectionState protectionState, int currentGold, int rank,
DateTime upgradeDate, int blueprintUUID, float w, float rotY, String shrineType) {
ArrayList<AbstractGameObject> shrineList = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL `shrine_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,? ,? ,?, ?,?);")) {
preparedStatement.setInt(1, parentZoneID);
preparedStatement.setInt(2, OwnerUUID);
preparedStatement.setString(3, name);
preparedStatement.setInt(4, meshUUID);
preparedStatement.setFloat(5, location.x);
preparedStatement.setFloat(6, location.y);
preparedStatement.setFloat(7, location.z);
preparedStatement.setFloat(8, meshScale);
preparedStatement.setInt(9, currentHP);
preparedStatement.setString(10, protectionState.name());
preparedStatement.setInt(11, currentGold);
preparedStatement.setInt(12, rank);
if (upgradeDate != null)
preparedStatement.setTimestamp(13, new java.sql.Timestamp(upgradeDate.getMillis()));
else
preparedStatement.setNull(13, java.sql.Types.DATE);
preparedStatement.setInt(14, blueprintUUID);
preparedStatement.setFloat(15, w);
preparedStatement.setFloat(16, rotY);
preparedStatement.setString(17, shrineType);
preparedStatement.execute();
ResultSet rs = preparedStatement.getResultSet();
while (rs.next())
addObject(shrineList, rs);
while (preparedStatement.getMoreResults()) {
rs = preparedStatement.getResultSet();
while (rs.next())
addObject(shrineList, rs);
}
} catch (SQLException e) {
Logger.error(e);
}
return shrineList;
}
public boolean updateFavors(Shrine shrine, int amount, int oldAmount) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_shrine` SET `shrine_favors`=? WHERE `UID` = ? AND `shrine_favors` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setLong(2, shrine.getObjectUUID());
preparedStatement.setInt(3, oldAmount);
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
return false;
}
}
public void LOAD_ALL_SHRINES() { public void LOAD_ALL_SHRINES() {
Shrine thisShrine; Shrine shrine;
prepareCallable("SELECT `obj_shrine`.*, `object`.`parent`, `object`.`type` FROM `object` LEFT JOIN `obj_shrine` ON `object`.`UID` = `obj_shrine`.`UID` WHERE `object`.`type` = 'shrine';"); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_shrine`.*, `object`.`parent`, `object`.`type` FROM `object` LEFT JOIN `obj_shrine` ON `object`.`UID` = `obj_shrine`.`UID` WHERE `object`.`type` = 'shrine';")) {
try { ResultSet rs = preparedStatement.executeQuery();
ResultSet rs = executeQuery();
//shrines cached in rs for easy cache on creation.
while (rs.next()) { while (rs.next()) {
thisShrine = new Shrine(rs); shrine = new Shrine(rs);
thisShrine.getShrineType().addShrineToServerList(thisShrine); shrine.getShrineType().addShrineToServerList(shrine);
} }
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.getErrorCode() + ' ' + e.getMessage(), e); Logger.error(e);
} finally {
closeCallable();
} }
} }
} }

183
src/engine/db/handlers/dbSkillBaseHandler.java

@ -12,11 +12,12 @@ package engine.db.handlers;
import engine.Enum; import engine.Enum;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.objects.AbstractGameObject;
import engine.objects.MaxSkills; import engine.objects.MaxSkills;
import engine.objects.SkillsBase; import engine.objects.SkillsBase;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -24,120 +25,128 @@ import java.util.HashMap;
public class dbSkillBaseHandler extends dbHandlerBase { public class dbSkillBaseHandler extends dbHandlerBase {
public dbSkillBaseHandler() { public dbSkillBaseHandler() {
this.localClass = SkillsBase.class; this.localClass = SkillsBase.class;
this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public SkillsBase GET_BASE(final int objectUUID) { public SkillsBase GET_BASE(final int objectUUID) {
SkillsBase skillsBase = (SkillsBase) DbManager.getFromCache(GameObjectType.SkillsBase, objectUUID); SkillsBase skillsBase = (SkillsBase) DbManager.getFromCache(GameObjectType.SkillsBase, objectUUID);
if (skillsBase != null)
return skillsBase;
prepareCallable("SELECT * FROM static_skill_skillsbase WHERE ID = ?");
setInt(1, objectUUID);
SkillsBase sb;
sb = (SkillsBase) getObjectSingle(objectUUID);
SkillsBase.putInCache(sb);
return sb;
}
public SkillsBase GET_BASE_BY_NAME(String name) { if (skillsBase != null)
SkillsBase sb = SkillsBase.getFromCache(name); return skillsBase;
if (sb != null) {
return sb;
}
prepareCallable("SELECT * FROM static_skill_skillsbase WHERE name = ?");
setString(1, name);
ArrayList<AbstractGameObject> result = getObjectList();
if (result.size() > 0) {
sb = (SkillsBase) result.get(0);
SkillsBase.putInCache(sb);
return sb;
} else {
return null;
}
}
public SkillsBase GET_BASE_BY_TOKEN(final int token) { try (Connection connection = DbManager.getConnection();
SkillsBase sb = SkillsBase.getFromCache(token); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_skill_skillsbase WHERE ID = ?")) {
if (sb != null) {
return sb;
}
prepareCallable("SELECT * FROM static_skill_skillsbase WHERE token = ?"); preparedStatement.setInt(1, objectUUID);
setInt(1, token); ResultSet rs = preparedStatement.executeQuery();
ArrayList<AbstractGameObject> result = getObjectList();
if (result.size() > 0) {
sb = (SkillsBase) result.get(0);
SkillsBase.putInCache(sb);
return sb;
} else {
return null;
}
}
public void LOAD_ALL_MAX_SKILLS_FOR_CONTRACT() { skillsBase = (SkillsBase) getObjectFromRs(rs);
prepareCallable("SELECT * FROM `static_rune_maxskills`"); } catch (SQLException e) {
Logger.error(e);
}
SkillsBase.putInCache(skillsBase);
return skillsBase;
}
try { public SkillsBase GET_BASE_BY_NAME(String name) {
ResultSet rs = executeQuery();
//shrines cached in rs for easy cache on creation. SkillsBase skillsBase = SkillsBase.getFromCache(name);
while (rs.next()) {
MaxSkills maxSKills = new MaxSkills(rs); if (skillsBase != null)
if (MaxSkills.MaxSkillsSet.get(maxSKills.getRuneID()) == null){ return skillsBase;
ArrayList<MaxSkills> newMaxSkillsList = new ArrayList<>();
newMaxSkillsList.add(maxSKills);
MaxSkills.MaxSkillsSet.put(maxSKills.getRuneID(), newMaxSkillsList);
}else
MaxSkills.MaxSkillsSet.get(maxSKills.getRuneID()).add(maxSKills);
} try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_skill_skillsbase WHERE name = ?")) {
preparedStatement.setString(1, name);
ResultSet rs = preparedStatement.executeQuery();
skillsBase = (SkillsBase) getObjectFromRs(rs);
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.getErrorCode() + ' ' + e.getMessage(), e); Logger.error(e);
} finally { }
closeCallable();
}
} SkillsBase.putInCache(skillsBase);
return skillsBase;
}
public void LOAD_ALL_RUNE_SKILLS() { public SkillsBase GET_BASE_BY_TOKEN(final int token) {
prepareCallable("SELECT * FROM `static_skill_skillsgranted`"); SkillsBase skillsBase = SkillsBase.getFromCache(token);
if (skillsBase != null)
return skillsBase;
try { try (Connection connection = DbManager.getConnection();
ResultSet rs = executeQuery(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_skill_skillsbase WHERE token = ?")) {
//shrines cached in rs for easy cache on creation. preparedStatement.setInt(1, token);
while (rs.next()) { ResultSet rs = preparedStatement.executeQuery();
int runeID = rs.getInt("runeID"); skillsBase = (SkillsBase) getObjectFromRs(rs);
int token = rs.getInt("token");
int amount = rs.getInt("amount");
if (SkillsBase.runeSkillsCache.get(runeID) == null) } catch (SQLException e) {
SkillsBase.runeSkillsCache.put(runeID, new HashMap<>()); Logger.error(e);
}
SkillsBase.runeSkillsCache.get(runeID).put(token, amount); SkillsBase.putInCache(skillsBase);
} return skillsBase;
}
public void LOAD_ALL_MAX_SKILLS_FOR_CONTRACT() {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_maxskills`")) {
} catch (SQLException e) { ResultSet rs = preparedStatement.executeQuery();
Logger.error( e.getErrorCode() + ' ' + e.getMessage(), e);
} finally {
closeCallable();
}
} while (rs.next()) {
MaxSkills maxSKills = new MaxSkills(rs);
if (MaxSkills.MaxSkillsSet.get(maxSKills.getRuneID()) == null) {
ArrayList<MaxSkills> newMaxSkillsList = new ArrayList<>();
newMaxSkillsList.add(maxSKills);
MaxSkills.MaxSkillsSet.put(maxSKills.getRuneID(), newMaxSkillsList);
} else
MaxSkills.MaxSkillsSet.get(maxSKills.getRuneID()).add(maxSKills);
}
} catch (SQLException e) {
Logger.error(e);
}
}
public void LOAD_ALL_RUNE_SKILLS() {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_skill_skillsgranted`")) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
int runeID = rs.getInt("runeID");
int token = rs.getInt("token");
int amount = rs.getInt("amount");
if (SkillsBase.runeSkillsCache.get(runeID) == null)
SkillsBase.runeSkillsCache.put(runeID, new HashMap<>());
SkillsBase.runeSkillsCache.get(runeID).put(token, amount);
}
} catch (SQLException e) {
Logger.error(e);
}
}
} }

81
src/engine/db/handlers/dbSkillReqHandler.java

@ -9,9 +9,17 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.objects.SkillReq; import engine.objects.SkillReq;
import engine.powers.PowersBase;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
public class dbSkillReqHandler extends dbHandlerBase { public class dbSkillReqHandler extends dbHandlerBase {
@ -20,16 +28,71 @@ public class dbSkillReqHandler extends dbHandlerBase {
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public ArrayList<SkillReq> GET_REQS_FOR_RUNE(final int objectUUID) { public static ArrayList<PowersBase> getAllPowersBase() {
prepareCallable("SELECT * FROM `static_skill_skillreq` WHERE `runeID`=?");
setInt(1, objectUUID); ArrayList<PowersBase> powerBaseList = new ArrayList<>();
return getObjectList();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_power_powerbase")) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
PowersBase toAdd = new PowersBase(rs);
powerBaseList.add(toAdd);
}
} catch (SQLException e) {
Logger.error(e);
}
return powerBaseList;
} }
public SkillReq GET_REQS_BY_SKILLID(int skillID) { public static void getFailConditions(HashMap<String, PowersBase> powers) {
prepareCallable("SELECT * FROM `static_skill_skillreq` WHERE `skillID` = ?");
setInt(1,skillID); try (Connection connection = DbManager.getConnection();
int objectUUID = (int) getUUID(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT IDString, type FROM static_power_failcondition where powerOrEffect = 'Power'")) {
return (SkillReq) this.getObjectSingle(objectUUID);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
String type = rs.getString("type");
String IDString = rs.getString("IDString");
PowersBase pb = powers.get(IDString);
if (pb != null)
switch (type) {
case "CastSpell":
pb.cancelOnCastSpell = true;
break;
case "TakeDamage":
pb.cancelOnTakeDamage = true;
break;
}
}
} catch (SQLException e) {
Logger.error(e);
}
} }
public ArrayList<SkillReq> GET_REQS_FOR_RUNE(final int objectUUID) {
ArrayList<SkillReq> skillReqsList = new ArrayList<>();
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_skill_skillreq` WHERE `runeID`=?")) {
preparedStatement.setInt(1, objectUUID);
ResultSet rs = preparedStatement.executeQuery();
skillReqsList = getObjectsFromRs(rs, 5);
} catch (SQLException e) {
Logger.error(e);
}
return skillReqsList;
}
} }

45
src/engine/db/handlers/dbVendorDialogHandler.java

@ -12,20 +12,39 @@ package engine.db.handlers;
import engine.Enum; import engine.Enum;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.objects.VendorDialog; import engine.objects.VendorDialog;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class dbVendorDialogHandler extends dbHandlerBase { public class dbVendorDialogHandler extends dbHandlerBase {
public dbVendorDialogHandler() { public dbVendorDialogHandler() {
this.localClass = VendorDialog.class; this.localClass = VendorDialog.class;
this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
} }
public VendorDialog GET_VENDORDIALOG(final int objectUUID) { public VendorDialog GET_VENDORDIALOG(final int objectUUID) {
VendorDialog vd = (VendorDialog) DbManager.getFromCache(Enum.GameObjectType.VendorDialog, objectUUID);
if (vd != null) VendorDialog vendorDialog = (VendorDialog) DbManager.getFromCache(Enum.GameObjectType.VendorDialog, objectUUID);
return vd;
prepareCallable("SELECT * FROM `static_npc_vendordialog` WHERE `ID`=?"); if (vendorDialog != null)
setInt(1, objectUUID); return vendorDialog;
return (VendorDialog) getObjectSingle(objectUUID);
} try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_vendordialog` WHERE `ID`=?")) {
preparedStatement.setInt(1, objectUUID);
ResultSet rs = preparedStatement.executeQuery();
vendorDialog = (VendorDialog) getObjectFromRs(rs);
} catch (SQLException e) {
Logger.error(e);
}
return vendorDialog;
}
} }

659
src/engine/db/handlers/dbWarehouseHandler.java

@ -19,7 +19,8 @@ import engine.server.MBServerStatics;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.net.UnknownHostException; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
@ -33,417 +34,523 @@ public class dbWarehouseHandler extends dbHandlerBase {
this.localClass = Warehouse.class; this.localClass = Warehouse.class;
this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName()); this.localObjectType = engine.Enum.GameObjectType.valueOf(this.localClass.getSimpleName());
if (columns.isEmpty()) {
createColumns();
}
} }
public Warehouse CREATE_WAREHOUSE(Warehouse wh) { public static void addObject(ArrayList<AbstractGameObject> list, ResultSet rs) throws SQLException {
try { String type = rs.getString("type");
wh = this.addWarehouse(wh); switch (type) {
} catch (Exception e) { case "building":
Logger.error(e); Building building = new Building(rs);
wh = null; DbManager.addToCache(building);
list.add(building);
break;
case "warehouse":
Warehouse warehouse = new Warehouse(rs);
DbManager.addToCache(warehouse);
list.add(warehouse);
break;
} }
return wh;
} }
public ArrayList<AbstractGameObject> CREATE_WAREHOUSE( int parentZoneID, int OwnerUUID, String name, int meshUUID, public ArrayList<AbstractGameObject> CREATE_WAREHOUSE(int parentZoneID, int OwnerUUID, String name, int meshUUID,
Vector3fImmutable location, float meshScale, int currentHP, Vector3fImmutable location, float meshScale, int currentHP,
ProtectionState protectionState, int currentGold, int rank, ProtectionState protectionState, int currentGold, int rank,
DateTime upgradeDate, int blueprintUUID, float w, float rotY) { DateTime upgradeDate, int blueprintUUID, float w, float rotY) {
prepareCallable("CALL `WAREHOUSE_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,? ,? ,?, ?);");
setInt(1, parentZoneID);
setInt(2, OwnerUUID);
setString(3, name);
setInt(4, meshUUID);
setFloat(5, location.x);
setFloat(6, location.y);
setFloat(7, location.z);
setFloat(8, meshScale);
setInt(9, currentHP);
setString(10, protectionState.name());
setInt(11, currentGold);
setInt(12, rank);
if (upgradeDate != null) {
setTimeStamp(13, upgradeDate.getMillis());
} else {
setNULL(13, java.sql.Types.DATE);
}
setInt(14, blueprintUUID); ArrayList<AbstractGameObject> warehouseList = new ArrayList<>();
setFloat(15, w);
setFloat(16, rotY); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("CALL `WAREHOUSE_CREATE`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,? ,? ,?, ?);")) {
ArrayList<AbstractGameObject> list = new ArrayList<>();
//System.out.println(this.cs.get().toString()); preparedStatement.setInt(1, parentZoneID);
try { preparedStatement.setInt(2, OwnerUUID);
boolean work = execute(); preparedStatement.setString(3, name);
if (work) { preparedStatement.setInt(4, meshUUID);
ResultSet rs = this.cs.get().getResultSet(); preparedStatement.setFloat(5, location.x);
while (rs.next()) { preparedStatement.setFloat(6, location.y);
addObject(list, rs); preparedStatement.setFloat(7, location.z);
} preparedStatement.setFloat(8, meshScale);
rs.close(); preparedStatement.setInt(9, currentHP);
} else { preparedStatement.setString(10, protectionState.name());
Logger.info("Warehouse Creation Failed: " + this.cs.get().toString()); preparedStatement.setInt(11, currentGold);
return list; //city creation failure preparedStatement.setInt(12, rank);
}
while (this.cs.get().getMoreResults()) { if (upgradeDate != null)
ResultSet rs = this.cs.get().getResultSet(); preparedStatement.setTimestamp(13, new java.sql.Timestamp(upgradeDate.getMillis()));
while (rs.next()) { else
addObject(list, rs); preparedStatement.setNull(13, java.sql.Types.DATE);
}
rs.close(); preparedStatement.setInt(14, blueprintUUID);
preparedStatement.setFloat(15, w);
preparedStatement.setFloat(16, rotY);
preparedStatement.execute();
ResultSet rs = preparedStatement.getResultSet();
while (rs.next())
addObject(warehouseList, rs);
while (preparedStatement.getMoreResults()) {
rs = preparedStatement.getResultSet();
while (rs.next())
addObject(warehouseList, rs);
} }
} catch (SQLException e) { } catch (SQLException e) {
Logger.info("Warehouse Creation Failed, SQLException: " + this.cs.get().toString() + e.toString()); Logger.error(e);
return list; //city creation failure
} catch (UnknownHostException e) {
Logger.info("Warehouse Creation Failed, UnknownHostException: " + this.cs.get().toString());
return list; //city creation failure
} finally {
closeCallable();
} }
return list;
return warehouseList;
} }
//Don't call yet, not ready in DB. - public boolean updateLocks(final Warehouse wh, long locks) {
public boolean WAREHOUSE_ADD(Item item, Warehouse warehouse, ItemBase ib, int amount) {
if (item == null || warehouse == null || ib == null || !(dbWarehouseHandler.columns.containsKey(ib.getUUID()))) {
return false;
}
if ((item.getNumOfItems() - amount) < 0) {
return false;
}
if (!warehouse.getResources().containsKey(ib)) {
return false;
}
prepareCallable("CALL `warehouse_ADD`(?,?,?,?,?,?,?);"); try (Connection connection = DbManager.getConnection();
setLong(1, (long) warehouse.getObjectUUID()); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_locks`=? WHERE `UID` = ?")) {
setInt(2, warehouse.getResources().get(ib));
setLong(3, (long) item.getObjectUUID()); preparedStatement.setLong(1, locks);
setInt(4, item.getNumOfItems()); preparedStatement.setInt(2, wh.getUID());
setInt(5, amount);
setString(6, dbWarehouseHandler.columns.get(ib.getUUID())); return (preparedStatement.executeUpdate() > 0);
setInt(7, ib.getUUID());
String result = getResult();
return (result != null && result.equals("success"));
}
private Warehouse addWarehouse(Warehouse toAdd) { } catch (SQLException e) {
prepareCallable("CALL `warehouse_CREATE`(?);"); Logger.error(e);
setInt(1, toAdd.getUID());
int objectUUID = (int) getUUID();
if (objectUUID > 0) {
return GET_WAREHOUSE(objectUUID);
} }
return null; return false;
} }
public Warehouse GET_WAREHOUSE(int objectUUID) { public boolean updateGold(final Warehouse wh, int amount) {
Warehouse warehouse = (Warehouse) DbManager.getFromCache(GameObjectType.Warehouse, objectUUID);
if (warehouse != null)
return warehouse;
prepareCallable("SELECT * FROM `obj_warehouse` WHERE `UID` = ?");
setInt(1, objectUUID);
return (Warehouse) getObjectSingle(objectUUID);
}
public boolean updateLocks(final Warehouse wh, long locks) { try (Connection connection = DbManager.getConnection();
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_locks`=? WHERE `UID` = ?"); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_gold`=? WHERE `UID` = ?")) {
setLong(1, locks);
setInt(2, wh.getUID()); preparedStatement.setInt(1, amount);
return (executeUpdate() != 0); preparedStatement.setInt(2, wh.getUID());
}
public boolean updateGold(final Warehouse wh, int amount ) { return (preparedStatement.executeUpdate() > 0);
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_gold`=? WHERE `UID` = ?");
setInt(1, amount); } catch (SQLException e) {
setInt(2, wh.getUID()); Logger.error(e);
return (executeUpdate() != 0); }
return false;
} }
public boolean updateStone(final Warehouse wh, int amount) { public boolean updateStone(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_stone`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_stone`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateTruesteel(final Warehouse wh, int amount) { public boolean updateTruesteel(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_truesteel`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_truesteel`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateIron(final Warehouse wh, int amount) { public boolean updateIron(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_iron`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_iron`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateAdamant(final Warehouse wh, int amount) { public boolean updateAdamant(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_adamant`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_adamant`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateLumber(final Warehouse wh, int amount) { public boolean updateLumber(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_lumber`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_lumber`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateOak(final Warehouse wh, int amount) { public boolean updateOak(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_oak`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_oak`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateBronzewood(final Warehouse wh, int amount) { public boolean updateBronzewood(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_bronzewood`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_bronzewood`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateMandrake(final Warehouse wh, int amount) { public boolean updateMandrake(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_mandrake`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_mandrake`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateCoal(final Warehouse wh, int amount) { public boolean updateCoal(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_coal`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_coal`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateAgate(final Warehouse wh, int amount) { public boolean updateAgate(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_agate`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_agate`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateDiamond(final Warehouse wh, int amount) { public boolean updateDiamond(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_diamond`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_diamond`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateOnyx(final Warehouse wh, int amount) { public boolean updateOnyx(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_onyx`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_onyx`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateAzoth(final Warehouse wh, int amount) { public boolean updateAzoth(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_azoth`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_azoth`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateOrichalk(final Warehouse wh, int amount) { public boolean updateOrichalk(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_orichalk`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_orichalk`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateAntimony(final Warehouse wh, int amount) { public boolean updateAntimony(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_antimony`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_antimony`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateSulfur(final Warehouse wh, int amount) { public boolean updateSulfur(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_sulfur`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_sulfur`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateQuicksilver(final Warehouse wh, int amount) { public boolean updateQuicksilver(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_quicksilver`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_quicksilver`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateGalvor(final Warehouse wh, int amount) { public boolean updateGalvor(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_galvor`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_galvor`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateWormwood(final Warehouse wh, int amount ) { public boolean updateWormwood(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_wormwood`=? WHERE `UID` = ?");
setInt(1, amount); try (Connection connection = DbManager.getConnection();
setInt(2, wh.getUID()); PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_wormwood`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (executeUpdate() != 0); return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateObsidian(final Warehouse wh, int amount) { public boolean updateObsidian(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_obsidian`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_obsidian`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateBloodstone(final Warehouse wh, int amount) { public boolean updateBloodstone(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_bloodstone`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_bloodstone`=? WHERE `UID` = ?")) {
preparedStatement.setInt(1, amount);
preparedStatement.setInt(2, wh.getUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
public boolean updateMithril(final Warehouse wh, int amount) { public boolean updateMithril(final Warehouse wh, int amount) {
prepareCallable("UPDATE `obj_warehouse` SET `warehouse_mithril`=? WHERE `UID` = ?");
setInt(1, amount);
setInt(2, wh.getUID());
return (executeUpdate() != 0); try (Connection connection = DbManager.getConnection();
} PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `obj_warehouse` SET `warehouse_mithril`=? WHERE `UID` = ?")) {
private static void createColumns() { preparedStatement.setInt(1, amount);
columns.put(1580000, "warehouse_stone"); preparedStatement.setInt(2, wh.getUID());
columns.put(1580001, "warehouse_truesteel");
columns.put(1580002, "warehouse_iron"); return (preparedStatement.executeUpdate() > 0);
columns.put(1580003, "warehouse_adamant");
columns.put(1580004, "warehouse_lumber");
columns.put(1580005, "warehouse_oak");
columns.put(1580006, "warehouse_bronzewood");
columns.put(1580007, "warehouse_mandrake");
columns.put(1580008, "warehouse_coal");
columns.put(1580009, "warehouse_agate");
columns.put(1580010, "warehouse_diamond");
columns.put(1580011, "warehouse_onyx");
columns.put(1580012, "warehouse_azoth");
columns.put(1580013, "warehouse_orichalk");
columns.put(1580014, "warehouse_antimony");
columns.put(1580015, "warehouse_sulfur");
columns.put(1580016, "warehouse_quicksilver");
columns.put(1580017, "warehouse_galvor");
columns.put(1580018, "warehouse_wormwood");
columns.put(1580019, "warehouse_obsidian");
columns.put(1580020, "warehouse_bloodstone");
columns.put(1580021, "warehouse_mithril");
columns.put(7, "warehouse_gold");
}
public boolean CREATE_TRANSACTION(int warehouseBuildingID, GameObjectType targetType, int targetUUID, TransactionType transactionType,Resource resource, int amount,DateTime date){ } catch (SQLException e) {
Transaction transactions = null; Logger.error(e);
prepareCallable("INSERT INTO `dyn_warehouse_transactions` (`warehouseUID`, `targetType`,`targetUID`, `type`,`resource`,`amount`,`date` ) VALUES (?,?,?,?,?,?,?)"); }
setLong(1, warehouseBuildingID); return false;
setString(2, targetType.name());
setLong(3, targetUUID);
setString(4, transactionType.name());
setString(5, resource.name());
setInt(6,amount);
setTimeStamp(7,date.getMillis());
return (executeUpdate() != 0);
} }
public boolean CREATE_TRANSACTION(int warehouseBuildingID, GameObjectType targetType, int targetUUID, TransactionType transactionType, Resource resource, int amount, DateTime date) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO `dyn_warehouse_transactions` (`warehouseUID`, `targetType`,`targetUID`, `type`,`resource`,`amount`,`date` ) VALUES (?,?,?,?,?,?,?)")) {
public static void addObject(ArrayList<AbstractGameObject> list, ResultSet rs) throws SQLException, UnknownHostException { preparedStatement.setInt(1, amount);
String type = rs.getString("type"); preparedStatement.setLong(1, warehouseBuildingID);
switch (type) { preparedStatement.setString(2, targetType.name());
case "building": preparedStatement.setLong(3, targetUUID);
Building building = new Building(rs); preparedStatement.setString(4, transactionType.name());
DbManager.addToCache(building); preparedStatement.setString(5, resource.name());
list.add(building); preparedStatement.setInt(6, amount);
break; preparedStatement.setTimestamp(7, new java.sql.Timestamp(date.getMillis()));
case "warehouse":
Warehouse warehouse = new Warehouse(rs); return (preparedStatement.executeUpdate() > 0);
DbManager.addToCache(warehouse);
list.add(warehouse); } catch (SQLException e) {
break; Logger.error(e);
} }
return false;
} }
public ArrayList<Transaction> GET_TRANSACTIONS_FOR_WAREHOUSE(final int warehouseUUID) { public ArrayList<Transaction> GET_TRANSACTIONS_FOR_WAREHOUSE(final int warehouseUUID) {
ArrayList<Transaction> transactionsList = new ArrayList<>(); ArrayList<Transaction> transactionsList = new ArrayList<>();
prepareCallable("SELECT * FROM dyn_warehouse_transactions WHERE `warehouseUID` = ?;");
setInt(1, warehouseUUID);
try {
ResultSet rs = executeQuery();
//shrines cached in rs for easy cache on creation.
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM dyn_warehouse_transactions WHERE `warehouseUID` = ?;")) {
preparedStatement.setInt(1, warehouseUUID);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) { while (rs.next()) {
Transaction transactions = new Transaction(rs); Transaction transactions = new Transaction(rs);
transactionsList.add(transactions); transactionsList.add(transactions);
} }
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.getErrorCode() + ' ' + e.getMessage(), e); Logger.error(e);
} finally {
closeCallable();
} }
return transactionsList; return transactionsList;
} }
public void LOAD_ALL_WAREHOUSES() { public void LOAD_ALL_WAREHOUSES() {
Warehouse thisWarehouse; Warehouse warehouse;
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_warehouse`.*, `object`.`parent`, `object`.`type` FROM `object` LEFT JOIN `obj_warehouse` ON `object`.`UID` = `obj_warehouse`.`UID` WHERE `object`.`type` = 'warehouse';")) {
prepareCallable("SELECT `obj_warehouse`.*, `object`.`parent`, `object`.`type` FROM `object` LEFT JOIN `obj_warehouse` ON `object`.`UID` = `obj_warehouse`.`UID` WHERE `object`.`type` = 'warehouse';"); ResultSet rs = preparedStatement.executeQuery();
try {
ResultSet rs = executeQuery();
while (rs.next()) { while (rs.next()) {
thisWarehouse = new Warehouse(rs); warehouse = new Warehouse(rs);
thisWarehouse.runAfterLoad(); warehouse.runAfterLoad();
thisWarehouse.loadAllTransactions(); warehouse.loadAllTransactions();
} }
} catch (SQLException e) { } catch (SQLException e) {
Logger.error(e.getErrorCode() + ' ' + e.getMessage(), e); Logger.error(e);
} finally {
closeCallable();
} }
} }
} }

95
src/engine/db/handlers/dbZoneHandler.java

@ -11,9 +11,15 @@ package engine.db.handlers;
import engine.Enum; import engine.Enum;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector2f;
import engine.objects.Zone; import engine.objects.Zone;
import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
public class dbZoneHandler extends dbHandlerBase { public class dbZoneHandler extends dbHandlerBase {
@ -46,48 +52,79 @@ public class dbZoneHandler extends dbHandlerBase {
public Zone GET_BY_UID(long ID) { public Zone GET_BY_UID(long ID) {
Zone zone = (Zone) DbManager.getFromCache(Enum.GameObjectType.Zone, (int)ID); Zone zone = (Zone) DbManager.getFromCache(Enum.GameObjectType.Zone, (int) ID);
if (zone != null) if (zone != null)
return zone; return zone;
prepareCallable("SELECT `obj_zone`.*, `object`.`parent` FROM `object` INNER JOIN `obj_zone` ON `obj_zone`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?;");
setLong(1, ID); try (Connection connection = DbManager.getConnection();
return (Zone) getObjectSingle((int) ID); PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_zone`.*, `object`.`parent` FROM `object` INNER JOIN `obj_zone` ON `obj_zone`.`UID` = `object`.`UID` WHERE `object`.`UID` = ?;")) {
preparedStatement.setLong(1, ID);
ResultSet rs = preparedStatement.executeQuery();
zone = (Zone) getObjectFromRs(rs);
} catch (SQLException e) {
Logger.error(e);
}
return zone;
} }
public ArrayList<Zone> GET_MAP_NODES(final int objectUUID) { public ArrayList<Zone> GET_MAP_NODES(final int objectUUID) {
prepareCallable("SELECT `obj_zone`.*, `object`.`parent` FROM `object` INNER JOIN `obj_zone` ON `obj_zone`.`UID` = `object`.`UID` WHERE `object`.`parent` = ?;");
setLong(1, (long) objectUUID);
return getObjectList();
}
public ResultSet GET_ZONE_EXTENTS(final int loadNum) { ArrayList<Zone> zoneList = new ArrayList<>();
prepareCallable("SELECT * FROM `static_zone_size` WHERE `loadNum`=?;");
setInt(1, loadNum); try (Connection connection = DbManager.getConnection();
return executeQuery(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT `obj_zone`.*, `object`.`parent` FROM `object` INNER JOIN `obj_zone` ON `obj_zone`.`UID` = `object`.`UID` WHERE `object`.`parent` = ?;")) {
}
preparedStatement.setLong(1, objectUUID);
ResultSet rs = preparedStatement.executeQuery();
zoneList = getObjectsFromRs(rs, 2000);
public String SET_PROPERTY(final Zone z, String name, Object new_value) { } catch (SQLException e) {
prepareCallable("CALL zone_SETPROP(?,?,?)"); Logger.error(e);
setLong(1, (long) z.getObjectUUID()); }
setString(2, name);
setString(3, String.valueOf(new_value)); return zoneList;
return getResult();
} }
public String SET_PROPERTY(final Zone z, String name, Object new_value, Object old_value) { public void LOAD_ZONE_EXTENTS() {
prepareCallable("CALL zone_GETSETPROP(?,?,?,?)");
setLong(1, (long) z.getObjectUUID()); try (Connection connection = DbManager.getConnection();
setString(2, name); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_zone_size`;")) {
setString(3, String.valueOf(new_value));
setString(4, String.valueOf(old_value)); ResultSet rs = preparedStatement.executeQuery();
return getResult();
while (rs.next()) {
Vector2f zoneSize = new Vector2f();
int loadNum = rs.getInt("loadNum");
zoneSize.x = rs.getFloat("xRadius");
zoneSize.y = rs.getFloat("zRadius");
ZoneManager._zone_size_data.put(loadNum, zoneSize);
}
} catch (SQLException e) {
Logger.error(e);
}
} }
public boolean DELETE_ZONE(final Zone zone) { public boolean DELETE_ZONE(final Zone zone) {
prepareCallable("DELETE FROM `object` WHERE `UID` = ? AND `type` = 'zone'"); try (Connection connection = DbManager.getConnection();
setInt(1, zone.getObjectUUID()); PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM `object` WHERE `UID` = ? AND `type` = 'zone'")) {
return (executeUpdate() != 0);
preparedStatement.setInt(1, zone.getObjectUUID());
return (preparedStatement.executeUpdate() > 0);
} catch (SQLException e) {
Logger.error(e);
}
return false;
} }
} }

105
src/engine/devcmd/cmds/GuildListCmd.java

@ -1,105 +0,0 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager;
import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter;
/**
* @author
* Summary: Lists UID, Name and GL UID of either
* Player or NPC sovereign guilds
*/
public class GuildListCmd extends AbstractDevCmd {
// Instance variables
private int _guildType; // 0 = Player : 1 = NPC sovereign guilds
private String outputStr = null;
public GuildListCmd() {
super("guildlist");
}
// AbstractDevCmd Overridden methods
@Override
protected void _doCmd(PlayerCharacter pc, String[] args,
AbstractGameObject target) {
if(validateUserInput(args) == false) {
this.sendUsage(pc);
return;
}
parseUserInput(args);
// Execute stored procedure
outputStr = DbManager.GuildQueries.GET_GUILD_LIST(_guildType);
// Send results to user
throwbackInfo(pc, outputStr);
}
@Override
protected String _getHelpString() {
return "Lists guild info for sovereign guilds";
}
@Override
protected String _getUsageString() {
return "/guildlist npc|player";
}
// Class methods
private static boolean validateUserInput(String[] userInput) {
int stringIndex;
String commandSet = "npcplayer";
// incorrect number of arguments test
if (userInput.length != 1)
return false;
// Test of game object type argument
stringIndex = commandSet.indexOf(userInput[0].toLowerCase());
return stringIndex != -1;
}
private void parseUserInput(String[] userInput) {
// Build mask from user input
switch (userInput[0].toLowerCase()) {
case "npc":
_guildType = 1;
break;
case "player":
_guildType = 0;
break;
default:
break;
}
}
}

101
src/engine/devcmd/cmds/RenameMobCmd.java

@ -1,101 +0,0 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.ChatManager;
import engine.objects.AbstractGameObject;
import engine.objects.MobBase;
import engine.objects.NPC;
import engine.objects.PlayerCharacter;
/**
*
* @author Eighty
*
*/
public class RenameMobCmd extends AbstractDevCmd {
public RenameMobCmd() {
super("renamemob");
}
@Override
protected void _doCmd(PlayerCharacter pcSender, String[] args,
AbstractGameObject target) {
if (args.length < 1) {
this.sendUsage(pcSender);
return;
}
int loadID = 0;
String name = "";
NPC npc;
if (target != null && target instanceof NPC)
npc = (NPC) target;
else
npc = getTargetAsNPC(pcSender);
if (npc != null) {
for (int i = 0; i < args.length; i++) {
name += args[i];
if (i + 1 < args.length)
name += " ";
}
npc.setName(name);
npc.updateDatabase();
ChatManager.chatSayInfo(
pcSender,
"NPC with ID " + npc.getObjectUUID() + " renamed to "
+ npc.getFirstName());
} else {
try {
loadID = Integer.parseInt(args[0]);
if (args.length > 1) {
for (int i = 1; i < args.length; i++) {
name += args[i];
if (i + 1 < args.length)
name += " ";
}
}
} catch (Exception e) {
throwbackError(pcSender,
"Invalid renameMob Command. Need mob ID specified.");
return; // NaN
}
MobBase mob = MobBase.getMobBase(loadID);
if (mob == null) {
throwbackError(pcSender,
"Invalid renameMob Command. Mob ID specified is not valid.");
return;
}
if (!MobBase.renameMobBase(mob.getObjectUUID(), name)) {
throwbackError(pcSender,
"renameMob SQL Error. Failed to rename mob.");
return;
}
mob = MobBase.getMobBase(mob.getObjectUUID(), true); // force refresh
// from db
ChatManager.chatSayInfo(
pcSender,
"MobBase with ID " + mob.getObjectUUID() + " renamed to "
+ mob.getFirstName());
}
}
@Override
protected String _getUsageString() {
return "' /renamemob [ID] newName'";
}
@Override
protected String _getHelpString() {
return "Changes a mobs old name to a new name";
}
}

67
src/engine/gameManager/DbManager.java

@ -8,11 +8,12 @@
package engine.gameManager; package engine.gameManager;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import engine.Enum; import engine.Enum;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.db.handlers.*; import engine.db.handlers.*;
import engine.objects.*; import engine.objects.*;
import engine.pooling.ConnectionPool;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import engine.util.Hasher; import engine.util.Hasher;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@ -26,28 +27,14 @@ import java.util.concurrent.ConcurrentHashMap;
public enum DbManager { public enum DbManager {
DBMANAGER; DBMANAGER;
private static ConnectionPool connPool; private static HikariDataSource connectionPool = null;
public static Hasher hasher; public static Hasher hasher;
//Local Object Caching //Local Object Caching
private static final EnumMap<GameObjectType, ConcurrentHashMap<Integer, AbstractGameObject>> objectCache = new EnumMap<>(GameObjectType.class); private static final EnumMap<GameObjectType, ConcurrentHashMap<Integer, AbstractGameObject>> objectCache = new EnumMap<>(GameObjectType.class);
public static boolean configureDatabaseLayer() {
boolean worked = true;
try {
DbManager.connPool = new ConnectionPool();
DbManager.connPool.fill(10);
DBMANAGER.hasher = new Hasher();
} catch (Exception e ) {
e.printStackTrace();
worked = false;
}
return worked;
}
public static AbstractGameObject getObject(GameObjectType objectType, int objectUUID) { public static AbstractGameObject getObject(GameObjectType objectType, int objectUUID) {
AbstractGameObject outObject = null; AbstractGameObject outObject = null;
@ -87,9 +74,6 @@ public enum DbManager {
return outObject; return outObject;
} }
public static int getPoolSize(){
return connPool.getPoolSize();
}
public static boolean inCache(GameObjectType gameObjectType, int uuid) { public static boolean inCache(GameObjectType gameObjectType, int uuid) {
@ -227,7 +211,7 @@ public enum DbManager {
} }
public static PreparedStatement prepareStatement(String sql) throws SQLException { public static PreparedStatement prepareStatement(String sql) throws SQLException {
return getConn().prepareStatement(sql, 1); return getConnection().prepareStatement(sql, 1);
} }
// Omg refactor this out, somebody! // Omg refactor this out, somebody!
@ -259,15 +243,12 @@ public enum DbManager {
* @return the conn * @return the conn
*/ */
//XXX I think we have a severe resource leak here! No one is putting the connections back! //XXX I think we have a severe resource leak here! No one is putting the connections back!
public static Connection getConn() { public static Connection getConnection() {
Connection conn = DbManager.connPool.get();
try { try {
if (!conn.isClosed()) return DbManager.connectionPool.getConnection();
DbManager.connPool.put(conn);
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); throw new RuntimeException(e);
} }
return conn;
} }
public static final dbAccountHandler AccountQueries = new dbAccountHandler(); public static final dbAccountHandler AccountQueries = new dbAccountHandler();
@ -312,4 +293,36 @@ public enum DbManager {
public static final dbHeightMapHandler HeightMapQueries = new dbHeightMapHandler(); public static final dbHeightMapHandler HeightMapQueries = new dbHeightMapHandler();
public static final dbRunegateHandler RunegateQueries = new dbRunegateHandler(); public static final dbRunegateHandler RunegateQueries = new dbRunegateHandler();
public static void configureConnectionPool() {
HikariConfig config = new HikariConfig();
int connectionCount = (Runtime.getRuntime().availableProcessors() * 2) + 1;
config.setMaximumPoolSize(connectionCount);
config.setJdbcUrl("jdbc:mysql://" + ConfigManager.MB_DATABASE_ADDRESS.getValue() +
":" + ConfigManager.MB_DATABASE_PORT.getValue() + "/" +
ConfigManager.MB_DATABASE_NAME.getValue());
config.setUsername(ConfigManager.MB_DATABASE_USER.getValue());
config.setPassword(ConfigManager.MB_DATABASE_PASS.getValue());
// Must be set lower than SQL server connection lifetime!
config.addDataSourceProperty("maxLifetime", "3600000");
config.addDataSourceProperty("characterEncoding", "utf8");
config.addDataSourceProperty("useServerPrepStmts", "true");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "500");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
config.addDataSourceProperty("leakDetectionThreshold", "5000");
config.addDataSourceProperty("cacheServerConfiguration", "true");
connectionPool = new HikariDataSource(config); // setup the connection pool
Logger.info("Database configured with " + connectionCount + " connections");
}
} }

2
src/engine/gameManager/DevCmdManager.java

@ -93,7 +93,6 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new GetBankCmd()); DevCmdManager.registerDevCmd(new GetBankCmd());
DevCmdManager.registerDevCmd(new GetVaultCmd()); DevCmdManager.registerDevCmd(new GetVaultCmd());
DevCmdManager.registerDevCmd(new CombatMessageCmd()); DevCmdManager.registerDevCmd(new CombatMessageCmd());
DevCmdManager.registerDevCmd(new RenameMobCmd());
DevCmdManager.registerDevCmd(new RenameCmd()); DevCmdManager.registerDevCmd(new RenameCmd());
DevCmdManager.registerDevCmd(new CreateItemCmd()); DevCmdManager.registerDevCmd(new CreateItemCmd());
DevCmdManager.registerDevCmd(new GetMemoryCmd()); DevCmdManager.registerDevCmd(new GetMemoryCmd());
@ -112,7 +111,6 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new DecachePlayerCmd()); DevCmdManager.registerDevCmd(new DecachePlayerCmd());
DevCmdManager.registerDevCmd(new AuditMobsCmd()); DevCmdManager.registerDevCmd(new AuditMobsCmd());
DevCmdManager.registerDevCmd(new ChangeNameCmd()); DevCmdManager.registerDevCmd(new ChangeNameCmd());
DevCmdManager.registerDevCmd(new GuildListCmd());
DevCmdManager.registerDevCmd(new SetGuildCmd()); DevCmdManager.registerDevCmd(new SetGuildCmd());
DevCmdManager.registerDevCmd(new SetOwnerCmd()); DevCmdManager.registerDevCmd(new SetOwnerCmd());
DevCmdManager.registerDevCmd(new NetDebugCmd()); DevCmdManager.registerDevCmd(new NetDebugCmd());

12
src/engine/gameManager/PowersManager.java

@ -11,6 +11,8 @@ package engine.gameManager;
import engine.Enum.*; import engine.Enum.*;
import engine.InterestManagement.HeightMap; import engine.InterestManagement.HeightMap;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.db.handlers.dbEffectsBaseHandler;
import engine.db.handlers.dbSkillReqHandler;
import engine.job.AbstractJob; import engine.job.AbstractJob;
import engine.job.AbstractScheduleJob; import engine.job.AbstractScheduleJob;
import engine.job.JobContainer; import engine.job.JobContainer;
@ -99,7 +101,7 @@ public enum PowersManager {
public static void InitializeLoginPowers() { public static void InitializeLoginPowers() {
// get all PowersBase // get all PowersBase
ArrayList<PowersBase> pbList = PowersBase.getAllPowersBase(); ArrayList<PowersBase> pbList = dbSkillReqHandler.getAllPowersBase();
for (PowersBase pb : pbList) { for (PowersBase pb : pbList) {
if (pb.getToken() != 0) if (pb.getToken() != 0)
@ -111,7 +113,7 @@ public enum PowersManager {
public static void InitializePowers() { public static void InitializePowers() {
// Add EffectsBase // Add EffectsBase
ArrayList<EffectsBase> ebList = EffectsBase.getAllEffectsBase(); ArrayList<EffectsBase> ebList = dbEffectsBaseHandler.getAllEffectsBase();
for (EffectsBase eb : ebList) { for (EffectsBase eb : ebList) {
PowersManager.effectsBaseByToken.put(eb.getToken(), eb); PowersManager.effectsBaseByToken.put(eb.getToken(), eb);
@ -123,7 +125,7 @@ public enum PowersManager {
EffectsBase.getFailConditions(PowersManager.effectsBaseByIDString); EffectsBase.getFailConditions(PowersManager.effectsBaseByIDString);
// Add Modifiers to Effects // Add Modifiers to Effects
AbstractEffectModifier.getAllEffectModifiers(); dbEffectsBaseHandler.cacheAllEffectModifiers();
// Add Source Types to Effects // Add Source Types to Effects
PowersManager.addAllSourceTypes(); PowersManager.addAllSourceTypes();
@ -136,7 +138,7 @@ public enum PowersManager {
// AbstractPowerAction.loadValidItemFlags(PowersManager.powerActionsByIDString); // AbstractPowerAction.loadValidItemFlags(PowersManager.powerActionsByIDString);
// get all PowersBase // get all PowersBase
ArrayList<PowersBase> pbList = PowersBase.getAllPowersBase(); ArrayList<PowersBase> pbList = dbSkillReqHandler.getAllPowersBase();
for (PowersBase pb : pbList) { for (PowersBase pb : pbList) {
if (pb.getToken() != 0) { if (pb.getToken() != 0) {
PowersManager.powersBaseByIDString.put(pb.getIDString(), pb); PowersManager.powersBaseByIDString.put(pb.getIDString(), pb);
@ -147,7 +149,7 @@ public enum PowersManager {
// Add Power Prereqs // Add Power Prereqs
PowerPrereq.getAllPowerPrereqs(PowersManager.powersBaseByIDString); PowerPrereq.getAllPowerPrereqs(PowersManager.powersBaseByIDString);
// Add Fail Conditions // Add Fail Conditions
PowersBase.getFailConditions(PowersManager.powersBaseByIDString); dbSkillReqHandler.getFailConditions(PowersManager.powersBaseByIDString);
// Add Actions Base // Add Actions Base
ActionsBase.getActionsBase(PowersManager.powersBaseByIDString, ActionsBase.getActionsBase(PowersManager.powersBaseByIDString,
PowersManager.powerActionsByIDString); PowersManager.powerActionsByIDString);

31
src/engine/gameManager/SimulationManager.java

@ -16,6 +16,10 @@ import engine.objects.PlayerCharacter;
import engine.objects.Runegate; import engine.objects.Runegate;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.Duration; import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.util.Collection; import java.util.Collection;
@ -49,15 +53,26 @@ public enum SimulationManager {
// don't allow instantiation. // don't allow instantiation.
} }
public static String getPopulationString() { public static String getPopulationString() {
String outString;
String newLine = System.getProperty("line.separator");
outString = "[LUA_POPULATION()]" + newLine;
outString += DbManager.CSSessionQueries.GET_POPULATION_STRING();
return outString;
}
/* String popString = "";
try (Connection connection = DbManager.getConnection();
PreparedStatement getPopString = connection.prepareStatement("CALL GET_POPULATION_STRING()");) {
ResultSet rs = getPopString.executeQuery();
if (rs.next())
popString = rs.getString("popstring");
} catch (SQLException e) {
Logger.error(e.toString());
}
return popString;
}
/*
* Update the simulation. *** Important: Whatever you do in here, do it damn * Update the simulation. *** Important: Whatever you do in here, do it damn
* quick! * quick!
*/ */

55
src/engine/gameManager/ZoneManager.java

@ -9,6 +9,8 @@
package engine.gameManager; package engine.gameManager;
import engine.Enum; import engine.Enum;
import engine.db.archive.CityRecord;
import engine.db.archive.DataWarehouse;
import engine.math.Bounds; import engine.math.Bounds;
import engine.math.Vector2f; import engine.math.Vector2f;
import engine.math.Vector3f; import engine.math.Vector3f;
@ -22,10 +24,7 @@ import org.pmw.tinylog.Logger;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
@ -37,17 +36,18 @@ public enum ZoneManager {
ZONEMANAGER; ZONEMANAGER;
public static Instant hotZoneLastUpdate; public static final Set<Zone> macroZones = Collections.newSetFromMap(new ConcurrentHashMap<>());
/* Instance variables */
private static Zone seaFloor = null;
public static Zone hotZone = null;
public static int hotZoneCycle = 0; // Used with HOTZONE_DURATION from config.
private static final ConcurrentHashMap<Integer, Zone> zonesByID = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD); private static final ConcurrentHashMap<Integer, Zone> zonesByID = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD);
private static final ConcurrentHashMap<Integer, Zone> zonesByUUID = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD); private static final ConcurrentHashMap<Integer, Zone> zonesByUUID = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD);
private static final ConcurrentHashMap<String, Zone> zonesByName = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD); private static final ConcurrentHashMap<String, Zone> zonesByName = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD);
public static final Set<Zone> macroZones = Collections.newSetFromMap(new ConcurrentHashMap<>());
private static final Set<Zone> npcCityZones = Collections.newSetFromMap(new ConcurrentHashMap<>()); private static final Set<Zone> npcCityZones = Collections.newSetFromMap(new ConcurrentHashMap<>());
private static final Set<Zone> playerCityZones = Collections.newSetFromMap(new ConcurrentHashMap<>()); private static final Set<Zone> playerCityZones = Collections.newSetFromMap(new ConcurrentHashMap<>());
public static Instant hotZoneLastUpdate;
public static Zone hotZone = null;
public static int hotZoneCycle = 0; // Used with HOTZONE_DURATION from config.
public static HashMap<Integer, Vector2f> _zone_size_data = new HashMap<>();
/* Instance variables */
private static Zone seaFloor = null;
// Find all zones coordinates fit into, starting with Sea Floor // Find all zones coordinates fit into, starting with Sea Floor
@ -168,14 +168,14 @@ public enum ZoneManager {
return (Bounds.collide(loc, ZoneManager.hotZone.getBounds()) == true); return (Bounds.collide(loc, ZoneManager.hotZone.getBounds()) == true);
} }
public static void setSeaFloor(final Zone value) {
ZoneManager.seaFloor = value;
}
public static Zone getSeaFloor() { public static Zone getSeaFloor() {
return ZoneManager.seaFloor; return ZoneManager.seaFloor;
} }
public static void setSeaFloor(final Zone value) {
ZoneManager.seaFloor = value;
}
public static final void populateWorldZones(final Zone zone) { public static final void populateWorldZones(final Zone zone) {
int loadNum = zone.getLoadNum(); int loadNum = zone.getLoadNum();
@ -423,4 +423,31 @@ public enum ZoneManager {
treeBounds.release(); treeBounds.release();
return validLocation; return validLocation;
} }
public static void loadCities(Zone zone) {
ArrayList<City> cities = DbManager.CityQueries.GET_CITIES_BY_ZONE(zone.getObjectUUID());
for (City city : cities) {
city.setParent(zone);
city.setObjectTypeMask(MBServerStatics.MASK_CITY);
city.setLoc(city.getLoc()); // huh?
//not player city, must be npc city..
if (!zone.isPlayerCity())
zone.setNPCCity(true);
if ((ConfigManager.serverType.equals(Enum.ServerType.WORLDSERVER)) && (city.getHash() == null)) {
city.setHash();
if (DataWarehouse.recordExists(Enum.DataRecordType.CITY, city.getObjectUUID()) == false) {
CityRecord cityRecord = CityRecord.borrow(city, Enum.RecordEventType.CREATE);
DataWarehouse.pushToWarehouse(cityRecord);
}
}
}
}
} }

19
src/engine/net/client/handlers/MinionTrainingMsgHandler.java

@ -4,10 +4,8 @@ import engine.Enum;
import engine.Enum.DispatchChannel; import engine.Enum.DispatchChannel;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager; import engine.gameManager.*;
import engine.gameManager.DbManager; import engine.math.Vector3fImmutable;
import engine.gameManager.NPCManager;
import engine.gameManager.SessionManager;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage; import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
@ -156,8 +154,16 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
// toCreate.despawn(); // toCreate.despawn();
if (toCreate != null) { if (toCreate != null) {
toCreate.setSpawnTime(60 * 15); toCreate.setSpawnTime(60 * 15);
toCreate.setTimeToSpawnSiege(System.currentTimeMillis() + (60 * 15 * 1000)); Building building = BuildingManager.getBuilding(((MinionTrainingMessage) baseMsg).getBuildingID());
toCreate.setDeathTime(System.currentTimeMillis()); int slot = ((NPC)toCreate.npcOwner).getSiegeMinionMap().get(toCreate);
Vector3fImmutable slotLocation;
toCreate.building = building;
toCreate.parentZone = zone;
BuildingLocation buildingLocation = BuildingManager._slotLocations.get(building.meshUUID).get(slot);
slotLocation = building.getLoc().add(buildingLocation.getLocation());
toCreate.setBindLoc(slotLocation);
zone.zoneMobSet.add(toCreate);
MovementManager.translocate(toCreate,toCreate.getBindLoc(),toCreate.npcOwner.region);
} }
} }
@ -289,6 +295,7 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
if (toCreate != null) { if (toCreate != null) {
toCreate.setTimeToSpawnSiege(System.currentTimeMillis() + MBServerStatics.FIFTEEN_MINUTES); toCreate.setTimeToSpawnSiege(System.currentTimeMillis() + MBServerStatics.FIFTEEN_MINUTES);
toCreate.setDeathTime(System.currentTimeMillis()); toCreate.setDeathTime(System.currentTimeMillis());
toCreate.parentZone.zoneMobSet.add(toCreate);
} }
} }

44
src/engine/net/client/msg/ManageNPCMsg.java

@ -465,18 +465,42 @@ public class ManageNPCMsg extends ClientNetMsg {
writer.putInt(0); writer.putInt(0);
writer.putInt(1); writer.putInt(1);
writer.putInt(1); writer.putInt(1);
writer.put((byte) 0);
long curTime = System.currentTimeMillis() / 1000; long curTime = System.currentTimeMillis() / 1000;
long upgradeTime = mob.getTimeToSpawnSiege() / 1000; long upgradeTime = (mob.deathTime + (mob.spawnTime * 1000)) / 1000;
long timeLife = upgradeTime - curTime; long timeLife = upgradeTime - curTime;
if (upgradeTime * 1000 > System.currentTimeMillis()) {
writer.putInt(900); if(mob.npcOwner.isAlive()) {
writer.putInt(900); writer.put((byte) 0);//shows respawning timer
writer.putInt((int) timeLife); //time remaining? writer.putInt(mob.spawnTime);
writer.putInt(0); writer.putInt(mob.spawnTime);
writer.put((byte) 0); writer.putInt((int) timeLife); //time remaining for mob that is dead
writer.putString(mob.getName()); writer.putInt(0);
writer.put((byte) 0); writer.put((byte) 0);
writer.putString(mob.getNameOverride().isEmpty() ? mob.getName() : mob.getNameOverride());
writer.put((byte) 0);
}
else{
writer.put((byte) 0);//shows respawning timer
writer.putInt(0);
writer.putInt(0);
writer.putInt(0); //time remaining for mob that is dead
writer.putInt(0);
writer.put((byte) 0);
writer.putString(mob.getNameOverride().isEmpty() ? mob.getName() : mob.getNameOverride());
writer.put((byte) 0);
}
} else {
//nothing required for countdown for a mob that is alive
writer.put((byte) 1);//shows "Standing By"
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.put((byte) 0);
writer.putString(mob.getNameOverride().isEmpty() ? mob.getName() : mob.getNameOverride());
writer.put((byte) 0);
}
} }
return; return;

2
src/engine/objects/Boon.java

@ -55,7 +55,7 @@ public class Boon {
public static void HandleBoonListsForItemBase(int itemBaseID){ public static void HandleBoonListsForItemBase(int itemBaseID){
ArrayList<Boon> boons = null; ArrayList<Boon> boons = null;
boons = DbManager.BoonQueries.GET_BOON_AMOUNTS_FOR_ITEMBASEUUID(itemBaseID); boons = DbManager.BoonQueries.GET_BOON_AMOUNTS_FOR_ITEMBASE(itemBaseID);
if (boons != null) if (boons != null)
GetBoonsForItemBase.put(itemBaseID, boons); GetBoonsForItemBase.put(itemBaseID, boons);
} }

34
src/engine/objects/City.java

@ -34,7 +34,6 @@ import engine.workthreads.DestroyCityThread;
import engine.workthreads.TransferCityThread; import engine.workthreads.TransferCityThread;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.net.UnknownHostException;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -87,7 +86,7 @@ public class City extends AbstractWorldObject {
// Players who have entered the city (used for adding and removing affects) // Players who have entered the city (used for adding and removing affects)
private final HashSet<Integer> _playerMemory = new HashSet<>(); public final HashSet<Integer> _playerMemory = new HashSet<>();
public volatile boolean protectionEnforced = true; public volatile boolean protectionEnforced = true;
private String hash; private String hash;
@ -98,9 +97,9 @@ public class City extends AbstractWorldObject {
* ResultSet Constructor * ResultSet Constructor
*/ */
public City(ResultSet rs) throws SQLException, UnknownHostException { public City(ResultSet rs) throws SQLException {
super(rs); super(rs);
try{ try {
this.cityName = rs.getString("name"); this.cityName = rs.getString("name");
this.motto = rs.getString("motto"); this.motto = rs.getString("motto");
this.isNpc = rs.getByte("isNpc"); this.isNpc = rs.getByte("isNpc");
@ -746,33 +745,6 @@ public class City extends AbstractWorldObject {
return open; return open;
} }
public static void loadCities(Zone zone) {
ArrayList<City> cities = DbManager.CityQueries.GET_CITIES_BY_ZONE(zone.getObjectUUID());
for (City city : cities) {
city.setParent(zone);
city.setObjectTypeMask(MBServerStatics.MASK_CITY);
city.setLoc(city.location);
//not player city, must be npc city..
if (!zone.isPlayerCity())
zone.setNPCCity(true);
if ((ConfigManager.serverType.equals(ServerType.WORLDSERVER)) && (city.hash == null)) {
city.setHash();
if (DataWarehouse.recordExists(Enum.DataRecordType.CITY, city.getObjectUUID()) == false) {
CityRecord cityRecord = CityRecord.borrow(city, Enum.RecordEventType.CREATE);
DataWarehouse.pushToWarehouse(cityRecord);
}
}
}
}
@Override @Override
public void updateDatabase() { public void updateDatabase() {

4
src/engine/objects/Contract.java

@ -138,8 +138,8 @@ public class Contract extends AbstractGameObject {
//Specify if trainer, merchant, banker, etc via classID //Specify if trainer, merchant, banker, etc via classID
private void setBools() { private void setBools() {
DbManager.ContractQueries.GET_GENERIC_INVENTORY(this); DbManager.ContractQueries.LOAD_CONTRACT_INVENTORY(this);
DbManager.ContractQueries.GET_SELL_LISTS(this); DbManager.ContractQueries.LOAD_SELL_LIST_FOR_CONTRACT(this);
this.isTrainer = this.classID > 2499 && this.classID < 3050 || this.classID == 2028; this.isTrainer = this.classID > 2499 && this.classID < 3050 || this.classID == 2028;

21
src/engine/objects/Item.java

@ -210,14 +210,20 @@ public class Item extends AbstractWorldObject {
this.durabilityCurrent = rs.getShort("item_durabilityCurrent"); this.durabilityCurrent = rs.getShort("item_durabilityCurrent");
this.durabilityMax = rs.getShort("item_durabilityMax"); this.durabilityMax = rs.getShort("item_durabilityMax");
String ot = DbManager.ItemQueries.GET_OWNER(this.ownerID); DbObjectType ownerType;
ownerType = DbManager.BuildingQueries.GET_UID_ENUM(this.ownerID);
if (ot.equals("character")) switch (ownerType) {
this.ownerType = OwnerType.PlayerCharacter; case CHARACTER:
else if (ot.equals("npc")) this.ownerType = OwnerType.PlayerCharacter;
this.ownerType = OwnerType.Npc; break;
else if (ot.equals("account")) case NPC:
this.ownerType = OwnerType.Account; this.ownerType = OwnerType.Npc;
break;
case ACCOUNT:
this.ownerType = OwnerType.Account;
break;
}
this.canDestroy = true; this.canDestroy = true;
@ -1063,7 +1069,6 @@ public float getBonusPercent(ModType modType, SourceType sourceType) {
return; return;
} }
ConcurrentHashMap<String, Integer> enchantList = DbManager.EnchantmentQueries.GET_ENCHANTMENTS_FOR_ITEM(this.getObjectUUID()); ConcurrentHashMap<String, Integer> enchantList = DbManager.EnchantmentQueries.GET_ENCHANTMENTS_FOR_ITEM(this.getObjectUUID());
for (String enchant : enchantList.keySet()) { for (String enchant : enchantList.keySet()) {

14
src/engine/objects/Mob.java

@ -99,6 +99,7 @@ public class Mob extends AbstractIntelligenceAgent {
private DeferredPowerJob weaponPower; private DeferredPowerJob weaponPower;
private DateTime upgradeDateTime = null; private DateTime upgradeDateTime = null;
private boolean lootSync = false; private boolean lootSync = false;
public City guardedCity;
/** /**
* No Id Constructor * No Id Constructor
@ -806,6 +807,7 @@ public class Mob extends AbstractIntelligenceAgent {
mob.npcOwner = guardCaptain; mob.npcOwner = guardCaptain;
mob.spawnTime = (int)(-2.500 * guardCaptain.building.getRank() + 22.5) * 60; mob.spawnTime = (int)(-2.500 * guardCaptain.building.getRank() + 22.5) * 60;
mob.BehaviourType = Enum.MobBehaviourType.GuardMinion; mob.BehaviourType = Enum.MobBehaviourType.GuardMinion;
mob.guardedCity = guardCaptain.guardedCity;
mob.parentZone = parent; mob.parentZone = parent;
parent.zoneMobSet.add(mob); parent.zoneMobSet.add(mob);
return mob; return mob;
@ -825,7 +827,7 @@ public class Mob extends AbstractIntelligenceAgent {
return null; return null;
mob = new Mob(minionMobBase, guild, parent, level, new Vector3fImmutable(1, 1, 1), 0, false); mob = new Mob(minionMobBase, guild, parent, level, new Vector3fImmutable(1, 1, 1), 0, false);
mob.runAfterLoad(); //mob.runAfterLoad();
mob.despawned = true; mob.despawned = true;
DbManager.addToCache(mob); DbManager.addToCache(mob);
@ -843,7 +845,6 @@ public class Mob extends AbstractIntelligenceAgent {
owner.getSiegeMinionMap().put(mob, slot); owner.getSiegeMinionMap().put(mob, slot);
mob.setSpawnTime(10);
mob.setNpcOwner(owner); mob.setNpcOwner(owner);
mob.BehaviourType = MobBehaviourType.Pet1; mob.BehaviourType = MobBehaviourType.Pet1;
mob.BehaviourType.canRoam = false; mob.BehaviourType.canRoam = false;
@ -1376,7 +1377,7 @@ public class Mob extends AbstractIntelligenceAgent {
public void respawn() { public void respawn() {
//Commenting out Mob ID rotation. //Commenting out Mob ID rotation.
this.despawned = false; this.despawned = false;
this.playerAgroMap.clear(); //this.playerAgroMap.clear();
this.setCombatTarget(null); this.setCombatTarget(null);
this.setHealth(this.healthMax); this.setHealth(this.healthMax);
this.stamina.set(this.staminaMax); this.stamina.set(this.staminaMax);
@ -1392,7 +1393,11 @@ public class Mob extends AbstractIntelligenceAgent {
NPCManager.applyRuneSetEffects(this); NPCManager.applyRuneSetEffects(this);
this.recalculateStats(); this.recalculateStats();
this.setHealth(this.healthMax); this.setHealth(this.healthMax);
this.region = BuildingManager.GetRegion(this.building, bindLoc.x, bindLoc.y, bindLoc.z); if(this.building == null && ((Mob)this.npcOwner).BehaviourType.ordinal() == MobBehaviourType.GuardCaptain.ordinal()){
this.building = ((Mob)this.npcOwner).building;
} else {
this.region = BuildingManager.GetRegion(this.building, bindLoc.x, bindLoc.y, bindLoc.z);
}
MovementManager.translocate(this,this.bindLoc, this.region); MovementManager.translocate(this,this.bindLoc, this.region);
if (!this.isSiege && !this.isPlayerGuard && contract == null) if (!this.isSiege && !this.isPlayerGuard && contract == null)
loadInventory(); loadInventory();
@ -1987,6 +1992,7 @@ public class Mob extends AbstractIntelligenceAgent {
else { else {
this.BehaviourType = MobBehaviourType.GuardCaptain; this.BehaviourType = MobBehaviourType.GuardCaptain;
this.spawnTime = 900; this.spawnTime = 900;
this.guardedCity = ZoneManager.getCityAtLocation(this.bindLoc);
} }
this.deathTime = 0; this.deathTime = 0;

14
src/engine/objects/MobBase.java

@ -206,20 +206,8 @@ public class MobBase extends AbstractGameObject {
return this.spawnTime; return this.spawnTime;
} }
/*
* Database
*/
public static MobBase getMobBase(int id) { public static MobBase getMobBase(int id) {
return MobBase.getMobBase(id, false); return DbManager.MobBaseQueries.GET_MOBBASE(id);
}
public static MobBase getMobBase(int id, boolean forceDB) {
return DbManager.MobBaseQueries.GET_MOBBASE(id, forceDB);
}
public static boolean renameMobBase(int ID, String newName) {
return DbManager.MobBaseQueries.RENAME_MOBBASE(ID, newName);
} }
@Override @Override

3
src/engine/objects/Realm.java

@ -22,7 +22,6 @@ import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.awt.*; import java.awt.*;
import java.net.UnknownHostException;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -72,7 +71,7 @@ public class Realm {
/** /**
* ResultSet Constructor * ResultSet Constructor
*/ */
public Realm(ResultSet rs) throws SQLException, UnknownHostException { public Realm(ResultSet rs) throws SQLException {
this.mapColor = new Color(Integer.parseInt(rs.getString("realmColor"), 16)); this.mapColor = new Color(Integer.parseInt(rs.getString("realmColor"), 16));
this.mapR = (float) (mapColor.getRed() * 0.00392156863); this.mapR = (float) (mapColor.getRed() * 0.00392156863);

319
src/engine/objects/Zone.java

@ -30,19 +30,25 @@ import java.util.concurrent.ConcurrentHashMap;
public class Zone extends AbstractGameObject { public class Zone extends AbstractGameObject {
public final Set<Building> zoneBuildingSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
public final Set<NPC> zoneNPCSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
public final Set<Mob> zoneMobSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
private final int playerCityID; private final int playerCityID;
private final String zoneName; private final String zoneName;
private final float xCoord; private final float xCoord;
private final float zCoord; private final float zCoord;
private final float yCoord; private final float yCoord;
public float absX = 0.0f;
public float absY = 0.0f;
public float absZ = 0.0f;
private final int loadNum; private final int loadNum;
private final byte safeZone; private final byte safeZone;
private final String Icon1; private final String Icon1;
private final String Icon2; private final String Icon2;
private final String Icon3; private final String Icon3;
public float absX = 0.0f;
public float absY = 0.0f;
public float absZ = 0.0f;
public int minLvl;
public int maxLvl;
public boolean hasBeenHotzone = false;
private ArrayList<Zone> nodes = null; private ArrayList<Zone> nodes = null;
private int parentZoneID; private int parentZoneID;
private Zone parent = null; private Zone parent = null;
@ -50,16 +56,9 @@ public class Zone extends AbstractGameObject {
private boolean isNPCCity = false; private boolean isNPCCity = false;
private boolean isPlayerCity = false; private boolean isPlayerCity = false;
private String hash; private String hash;
public int minLvl;
public int maxLvl;
private float worldAltitude = 0; private float worldAltitude = 0;
private float seaLevel = 0; private float seaLevel = 0;
public final Set<Building> zoneBuildingSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
public final Set<NPC> zoneNPCSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
public final Set<Mob> zoneMobSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
public boolean hasBeenHotzone = false;
/** /**
* ResultSet Constructor * ResultSet Constructor
*/ */
@ -87,7 +86,7 @@ public class Zone extends AbstractGameObject {
this.setParent(parentZone); this.setParent(parentZone);
if (this.minLvl == 0 && parentZone != null){ if (this.minLvl == 0 && parentZone != null) {
this.minLvl = parentZone.minLvl; this.minLvl = parentZone.minLvl;
this.maxLvl = parentZone.maxLvl; this.maxLvl = parentZone.maxLvl;
} }
@ -103,6 +102,59 @@ public class Zone extends AbstractGameObject {
} }
public static void serializeForClientMsg(Zone zone, ByteBufferWriter writer) {
if (zone.loadNum == 0 && zone.playerCityID == 0)
Logger.warn("Warning! WorldServerMap with ID " + zone.getObjectUUID() + " has a loadnum of 0 (player city) and no city linked. This will probably crash the client!");
// Player City Terraform values serialized here.
if (zone.playerCityID > 0) {
writer.put((byte) 1); // Player City - True
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
} else
writer.put((byte) 0); // Player City - False
writer.putFloat(zone.xCoord);
writer.putFloat(zone.zCoord);
writer.putFloat(zone.yCoord);
writer.putInt(0);
writer.putInt(0);
writer.putInt(zone.loadNum);
if (zone.playerCityID > 0) {
City k = City.getCity(zone.playerCityID);
if (k != null) {
writer.putInt(k.getObjectType().ordinal());
writer.putInt(k.getObjectUUID());
} else
writer.putLong(0x0);
} else {
writer.putInt(zone.getObjectType().ordinal());
writer.putInt(zone.getObjectUUID());
}
writer.putInt(zone.nodes.size());
City city = City.getCity(zone.playerCityID);
if (city != null)
writer.putString(city.getCityName());
else
writer.putString(zone.zoneName);
writer.put(zone.safeZone);
writer.putString(zone.Icon1);
writer.putString(zone.Icon2);
writer.putString(zone.Icon3);
writer.put((byte) 0); // Pad
for (Zone child : zone.nodes) {
Zone.serializeForClientMsg(child, writer);
}
}
/* Method sets a default value for player cities /* Method sets a default value for player cities
* otherwise using values derived from the loadnum * otherwise using values derived from the loadnum
* field in the obj_zone database table. * field in the obj_zone database table.
@ -123,38 +175,18 @@ public class Zone extends AbstractGameObject {
return; return;
} }
// All other zones have bounding boxes loaded from database Vector2f zoneSize = ZoneManager._zone_size_data.get(this.loadNum);
ResultSet rs = DbManager.ZoneQueries.GET_ZONE_EXTENTS(this.loadNum);
boolean loaded = false;
if (rs != null)
try {
if (rs.next()) {
halfExtentX = rs.getFloat("xRadius");
halfExtentY = rs.getFloat("zRadius");
this.bounds.setBounds(new Vector2f(this.absX, this.absZ), new Vector2f(halfExtentX, halfExtentY), 0.0f);
loaded = true;
}
} catch (SQLException e) {
Logger.error("SQLException: " + e.getMessage());
}
if (!loaded) { // Default to player zone size on error? Maybe log this
// Default to Citygrid size on error
if (zoneSize != null)
this.bounds.setBounds(new Vector2f(this.absX, this.absZ), zoneSize, 0.0f);
else
bounds.setBounds(new Vector2f(this.absX, this.absZ), new Vector2f(Enum.CityBoundsType.ZONE.extents, Enum.CityBoundsType.ZONE.extents), 0.0f); bounds.setBounds(new Vector2f(this.absX, this.absZ), new Vector2f(Enum.CityBoundsType.ZONE.extents, Enum.CityBoundsType.ZONE.extents), 0.0f);
}
} }
/*
* Getters
*/
public int getPlayerCityUUID() { public int getPlayerCityUUID() {
if (this.playerCityID == 0)
return 0;
return this.playerCityID; return this.playerCityID;
} }
@ -178,10 +210,6 @@ public class Zone extends AbstractGameObject {
return loadNum; return loadNum;
} }
public int getLoadNumClient() {
return loadNum;
}
public byte getSafeZone() { public byte getSafeZone() {
return safeZone; return safeZone;
} }
@ -190,45 +218,9 @@ public class Zone extends AbstractGameObject {
return Icon1; return Icon1;
} }
public String getIcon2() { public void generateWorldAltitude() {
return Icon2;
}
public String getIcon3() {
return Icon3;
}
public void setParent(final Zone value) {
this.parent = value;
this.parentZoneID = (this.parent != null) ? this.parent.getObjectUUID() : 0;
if (this.parent != null) {
this.absX = this.xCoord + parent.absX;
this.absY = this.yCoord + parent.absY;
this.absZ = this.zCoord + parent.absZ;
if (this.minLvl == 0 || this.maxLvl == 0){
this.minLvl = this.parent.minLvl;
this.maxLvl = this.parent.maxLvl;
}
} else { //only the Sea Floor zone does not have a parent
this.absX = this.xCoord;
this.absY = MBServerStatics.SEA_FLOOR_ALTITUDE;
this.absZ = this.zCoord;
}
// Zone AABB is set here as it's coordinate space is world requiring a parent.
this.setBounds();
if (this.getHeightMap() != null && this.getHeightMap().getSeaLevel() != 0)
this.seaLevel = this.getHeightMap().getSeaLevel();
}
public void generateWorldAltitude(){
if (ZoneManager.getSeaFloor().getObjectUUID() == this.getObjectUUID()){ if (ZoneManager.getSeaFloor().getObjectUUID() == this.getObjectUUID()) {
this.worldAltitude = MBServerStatics.SEA_FLOOR_ALTITUDE; this.worldAltitude = MBServerStatics.SEA_FLOOR_ALTITUDE;
return; return;
} }
@ -240,9 +232,9 @@ public class Zone extends AbstractGameObject {
//seafloor only zone with null parent; //seafloor only zone with null parent;
while(parentZone != ZoneManager.getSeaFloor()){ while (parentZone != ZoneManager.getSeaFloor()) {
if(parentZone.getHeightMap() != null){ if (parentZone.getHeightMap() != null) {
Vector2f zoneLoc = ZoneManager.worldToZoneSpace(currentZone.getLoc(), parentZone); Vector2f zoneLoc = ZoneManager.worldToZoneSpace(currentZone.getLoc(), parentZone);
altitude += parentZone.getHeightMap().getInterpolatedTerrainHeight(zoneLoc); altitude += parentZone.getHeightMap().getInterpolatedTerrainHeight(zoneLoc);
@ -258,14 +250,14 @@ public class Zone extends AbstractGameObject {
if (ZoneManager.getSeaFloor().equals(this)) if (ZoneManager.getSeaFloor().equals(this))
this.seaLevel = 0; this.seaLevel = 0;
else if else if
(this.getHeightMap() != null && this.getHeightMap().getSeaLevel() == 0){ (this.getHeightMap() != null && this.getHeightMap().getSeaLevel() == 0) {
this.seaLevel = this.parent.seaLevel; this.seaLevel = this.parent.seaLevel;
}else if (this.getHeightMap() != null){ } else if (this.getHeightMap() != null) {
this.seaLevel = this.worldAltitude + this.getHeightMap().getSeaLevel(); this.seaLevel = this.worldAltitude + this.getHeightMap().getSeaLevel();
}else { } else {
this.seaLevel = this.parent.seaLevel; this.seaLevel = this.parent.seaLevel;
} }
} }
@ -273,6 +265,34 @@ public class Zone extends AbstractGameObject {
return this.parent; return this.parent;
} }
public void setParent(final Zone value) {
this.parent = value;
this.parentZoneID = (this.parent != null) ? this.parent.getObjectUUID() : 0;
if (this.parent != null) {
this.absX = this.xCoord + parent.absX;
this.absY = this.yCoord + parent.absY;
this.absZ = this.zCoord + parent.absZ;
if (this.minLvl == 0 || this.maxLvl == 0) {
this.minLvl = this.parent.minLvl;
this.maxLvl = this.parent.maxLvl;
}
} else { //only the Sea Floor zone does not have a parent
this.absX = this.xCoord;
this.absY = MBServerStatics.SEA_FLOOR_ALTITUDE;
this.absZ = this.zCoord;
}
// Zone AABB is set here as it's coordinate space is world requiring a parent.
this.setBounds();
if (this.getHeightMap() != null && this.getHeightMap().getSeaLevel() != 0)
this.seaLevel = this.getHeightMap().getSeaLevel();
}
public float getAbsX() { public float getAbsX() {
return this.absX; return this.absX;
} }
@ -302,14 +322,14 @@ public class Zone extends AbstractGameObject {
return this.isNPCCity; return this.isNPCCity;
} }
public boolean isPlayerCity() {
return this.isPlayerCity;
}
public void setNPCCity(boolean value) { public void setNPCCity(boolean value) {
this.isNPCCity = value; this.isNPCCity = value;
} }
public boolean isPlayerCity() {
return this.isPlayerCity;
}
public void setPlayerCity(boolean value) { public void setPlayerCity(boolean value) {
this.isPlayerCity = value; this.isPlayerCity = value;
} }
@ -336,71 +356,12 @@ public class Zone extends AbstractGameObject {
return nodes; return nodes;
} }
public void addNode(Zone child) {
this.nodes.add(child);
}
public void removeNode(Zone child) {
this.nodes.remove(child);
}
/* /*
* Serializing * Serializing
*/ */
public void addNode(Zone child) {
public static void serializeForClientMsg(Zone zone,ByteBufferWriter writer) { this.nodes.add(child);
if (zone.loadNum == 0 && zone.playerCityID == 0)
Logger.warn( "Warning! WorldServerMap with ID " + zone.getObjectUUID() + " has a loadnum of 0 (player city) and no city linked. This will probably crash the client!");
// Player City Terraform values serialized here.
if (zone.playerCityID > 0) {
writer.put((byte) 1); // Player City - True
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
} else
writer.put((byte) 0); // Player City - False
writer.putFloat(zone.xCoord);
writer.putFloat(zone.zCoord);
writer.putFloat(zone.yCoord);
writer.putInt(0);
writer.putInt(0);
writer.putInt(zone.loadNum);
if (zone.playerCityID > 0) {
City k = City.getCity(zone.playerCityID);
if (k != null) {
writer.putInt(k.getObjectType().ordinal());
writer.putInt(k.getObjectUUID());
}
else
writer.putLong(0x0);
} else {
writer.putInt(zone.getObjectType().ordinal());
writer.putInt(zone.getObjectUUID());
}
writer.putInt(zone.nodes.size());
City city = City.getCity(zone.playerCityID);
if (city != null)
writer.putString(city.getCityName());
else
writer.putString(zone.zoneName);
writer.put(zone.safeZone);
writer.putString(zone.Icon1);
writer.putString(zone.Icon2);
writer.putString(zone.Icon3);
writer.put((byte) 0); // Pad
for (Zone child : zone.nodes) {
Zone.serializeForClientMsg(child,writer);
}
} }
@Override @Override
@ -408,60 +369,6 @@ public class Zone extends AbstractGameObject {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
public Zone findRuinedCityZone(float centerX, float centerY, float centerZ){
Bounds cityBounds;
cityBounds = Bounds.borrow();
Zone RuinedZone = null;
cityBounds.setBounds(new Vector2f(centerX, centerZ), new Vector2f(Enum.CityBoundsType.ZONE.extents, Enum.CityBoundsType.ZONE.extents), 0.0f);
Zone currentZone = ZoneManager.findSmallestZone(new Vector3fImmutable(centerX, centerY, centerZ));
if (currentZone != null)
if (this.getObjectUUID() == currentZone.getObjectUUID()){
if (currentZone.getPlayerCityUUID() != 0){
//null player city? skip..
if (City.GetCityFromCache(currentZone.getPlayerCityUUID()) == null)
RuinedZone = null;
else //no tol? skip...
if (City.GetCityFromCache(currentZone.getPlayerCityUUID()).getTOL() == null)
RuinedZone = null;
else
if (City.GetCityFromCache(currentZone.getPlayerCityUUID()).getTOL().getRank() == -1)
RuinedZone = currentZone;
//Dead tree? skip.
cityBounds.release();
return RuinedZone;
}
}
for (Zone zone : this.getNodes()) {
if (zone == this)
continue;
if (zone.isContinent() && zone.getPlayerCityUUID() == 0)
continue;
if (zone.getPlayerCityUUID() != 0){
//null player city? skip..
if (City.GetCityFromCache(zone.getPlayerCityUUID()) == null)
continue;
//no tol? skip...
if (City.GetCityFromCache(zone.getPlayerCityUUID()).getTOL() == null)
continue;
//Dead tree? skip.
if (Bounds.collide(zone.bounds, cityBounds, 0.0f)){
if (City.GetCityFromCache(zone.getPlayerCityUUID()).getTOL().getRank() == -1){
RuinedZone = zone;
break;
}
}
}
}
cityBounds.release();
return RuinedZone;
}
public boolean isContinent() { public boolean isContinent() {
if (this.equals(ZoneManager.getSeaFloor())) if (this.equals(ZoneManager.getSeaFloor()))

92
src/engine/powers/EffectsBase.java

@ -183,98 +183,6 @@ public class EffectsBase {
// getFailConditions(); // getFailConditions();
} }
public static EffectsBase createNoDbEffectsBase(EffectsBase copyEffect, int newToken, String IDString){
EffectsBase cachedEffectsBase = new EffectsBase(copyEffect,newToken,IDString);
if (cachedEffectsBase == null)
return null;
//add to Lists.
PowersManager.effectsBaseByIDString.put(cachedEffectsBase.IDString, cachedEffectsBase);
PowersManager.effectsBaseByToken.put(cachedEffectsBase.token, cachedEffectsBase);
return cachedEffectsBase;
}
public static ArrayList<EffectsBase> getAllEffectsBase() {
PreparedStatementShared ps = null;
ArrayList<EffectsBase> out = new ArrayList<>();
try {
ps = new PreparedStatementShared("SELECT * FROM static_power_effectbase ORDER BY `IDString` DESC");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
EffectsBase toAdd = new EffectsBase(rs);
out.add(toAdd);
}
rs.close();
} catch (Exception e) {
Logger.error(e);
} finally {
ps.release();
}
//testHash(out);
return out;
}
public static ArrayList<EffectsBase> getAllLiveEffectsBase() {
PreparedStatementShared ps = null;
ArrayList<EffectsBase> out = new ArrayList<>();
try {
ps = new PreparedStatementShared("SELECT * FROM static_power_effectbase_24 ORDER BY `IDString` DESC");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
EffectsBase toAdd = new EffectsBase(rs);
out.add(toAdd);
}
rs.close();
} catch (Exception e) {
Logger.error(e);
} finally {
ps.release();
}
//testHash(out);
return out;
}
//private static void testHash(ArrayList<EffectsBase> effs) {
// int valid = 0, invalid = 0;
// for (EffectsBase eff : effs) {
// String ids = eff.getIDString();
// int tok = eff.getToken();
// if (ids.length() != 8 || ids.startsWith("PRE-") || ids.startsWith("SUF-") || ids.endsWith("X") || !ids.substring(3,4).equals("-"))
// continue;
//
//// if ((tok > 1 || tok < 0) && ids.length() == 8) {
// int out = Hash(ids);
// if (out != tok) {
// System.out.println(ids + ": " + Integer.toHexString(out) + "(" + out + ")");
// invalid++;
// } else
// valid++;
//// }
// }
// System.out.println("valid: " + valid + ", invalid: " + invalid);
//}
//private static int Hash(String IDString) {
// char[] val = IDString.toCharArray();
// int out = 360;
// out ^= val[0];
// out ^= (val[1] << 5);
// out ^= (val[2] << 10);
// out ^= (val[4] << 23);
// out ^= (val[5] << 19);
// out ^= (val[6] << 15);
// out ^= (val[7] << 26);
// out ^= (val[7] >> 6);
// out ^= 17;
// return out;
//}
public static void getFailConditions(HashMap<String, EffectsBase> effects) { public static void getFailConditions(HashMap<String, EffectsBase> effects) {
PreparedStatementShared ps = null; PreparedStatementShared ps = null;
try { try {

53
src/engine/powers/PowersBase.java

@ -11,13 +11,11 @@ package engine.powers;
import engine.Enum.PowerCategoryType; import engine.Enum.PowerCategoryType;
import engine.Enum.PowerTargetType; import engine.Enum.PowerTargetType;
import engine.objects.PreparedStatementShared;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
public class PowersBase { public class PowersBase {
@ -340,57 +338,6 @@ public class PowersBase {
this.monsterTypeRestrictions.add(ct); this.monsterTypeRestrictions.add(ct);
} }
public static ArrayList<PowersBase> getAllPowersBase() {
PreparedStatementShared ps = null;
ArrayList<PowersBase> out = new ArrayList<>();
try {
ps = new PreparedStatementShared("SELECT * FROM static_power_powerbase");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
PowersBase toAdd = new PowersBase(rs);
out.add(toAdd);
}
rs.close();
} catch (Exception e) {
Logger.error( e.toString());
} finally {
ps.release();
}
return out;
}
public static void getFailConditions(HashMap<String, PowersBase> powers) {
PreparedStatementShared ps = null;
try {
ps = new PreparedStatementShared("SELECT IDString, type FROM static_power_failcondition where powerOrEffect = 'Power'");
ResultSet rs = ps.executeQuery();
String type, IDString; PowersBase pb;
while (rs.next()) {
type = rs.getString("type");
IDString = rs.getString("IDString");
pb = powers.get(IDString);
if (pb != null) {
switch (type) {
case "CastSpell":
pb.cancelOnCastSpell = true;
break;
case "TakeDamage":
pb.cancelOnTakeDamage = true;
break;
}
}else{
Logger.error("null power for Grief " + IDString);
}
}
rs.close();
} catch (Exception e) {
Logger.error( e.toString());
} finally {
ps.release();
}
}
public String getName() { public String getName() {
return this.name; return this.name;

263
src/engine/powers/effectmodifiers/AbstractEffectModifier.java

@ -11,17 +11,15 @@ package engine.powers.effectmodifiers;
import engine.Enum.ModType; import engine.Enum.ModType;
import engine.Enum.SourceType; import engine.Enum.SourceType;
import engine.gameManager.DbManager;
import engine.gameManager.PowersManager;
import engine.jobs.AbstractEffectJob; import engine.jobs.AbstractEffectJob;
import engine.objects.*; import engine.objects.AbstractCharacter;
import engine.objects.AbstractWorldObject;
import engine.objects.Building;
import engine.objects.Item;
import engine.powers.EffectsBase; import engine.powers.EffectsBase;
import org.pmw.tinylog.Logger;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
public abstract class AbstractEffectModifier { public abstract class AbstractEffectModifier {
@ -30,7 +28,7 @@ public abstract class AbstractEffectModifier {
protected int UUID; protected int UUID;
protected String IDString; protected String IDString;
protected String effectType; protected String effectType;
protected float minMod; public float minMod;
protected float maxMod; protected float maxMod;
protected float percentMod; protected float percentMod;
protected float ramp; protected float ramp;
@ -60,257 +58,6 @@ public abstract class AbstractEffectModifier {
this.string2 = rs.getString("string2"); this.string2 = rs.getString("string2");
} }
public static ArrayList<AbstractEffectModifier> getAllEffectModifiers() {
PreparedStatementShared ps = null;
ArrayList<AbstractEffectModifier> out = new ArrayList<>();
try {
ps = new PreparedStatementShared("SELECT * FROM static_power_effectmod");
ResultSet rs = ps.executeQuery();
String IDString;
AbstractEffectModifier aem = null;
while (rs.next()) {
IDString = rs.getString("IDString");
int token = DbManager.hasher.SBStringHash(IDString);
EffectsBase eb = PowersManager.getEffectByIDString(IDString);
ModType modifier = ModType.GetModType(rs.getString("modType"));
//combine item prefix and suffix effect modifiers
switch (modifier){
case AdjustAboveDmgCap:
aem = new AdjustAboveDmgCapEffectModifier(rs);
break;
case Ambidexterity:
aem = new AmbidexterityEffectModifier(rs);
break;
case AnimOverride:
break;
case ArmorPiercing:
aem = new ArmorPiercingEffectModifier(rs);
break;
case AttackDelay:
aem = new AttackDelayEffectModifier(rs);
break;
case Attr:
aem = new AttributeEffectModifier(rs);
break;
case BlackMantle:
aem = new BlackMantleEffectModifier(rs);
break;
case BladeTrails:
aem = new BladeTrailsEffectModifier(rs);
break;
case Block:
aem = new BlockEffectModifier(rs);
break;
case BlockedPowerType:
aem = new BlockedPowerTypeEffectModifier(rs);
break;
case CannotAttack:
aem = new CannotAttackEffectModifier(rs);
break;
case CannotCast:
aem = new CannotCastEffectModifier(rs);
break;
case CannotMove:
aem = new CannotMoveEffectModifier(rs);
break;
case CannotTrack:
aem = new CannotTrackEffectModifier(rs);
break;
case Charmed:
aem = new CharmedEffectModifier(rs);
break;
case ConstrainedAmbidexterity:
aem = new ConstrainedAmbidexterityEffectModifier(rs);
break;
case DamageCap:
aem = new DamageCapEffectModifier(rs);
break;
case DamageShield:
aem = new DamageShieldEffectModifier(rs);
break;
case DCV:
aem = new DCVEffectModifier(rs);
break;
case Dodge:
aem = new DodgeEffectModifier(rs);
break;
case DR:
aem = new DREffectModifier(rs);
break;
case Durability:
aem = new DurabilityEffectModifier(rs);
break;
case ExclusiveDamageCap:
aem = new ExclusiveDamageCapEffectModifier(rs);
break;
case Fade:
aem = new FadeEffectModifier(rs);
break;
case Fly:
aem = new FlyEffectModifier(rs);
break;
case Health:
aem = new HealthEffectModifier(rs);
break;
case HealthFull:
aem = new HealthFullEffectModifier(rs);
break;
case HealthRecoverRate:
aem = new HealthRecoverRateEffectModifier(rs);
break;
case IgnoreDamageCap:
aem = new IgnoreDamageCapEffectModifier(rs);
break;
case IgnorePassiveDefense:
aem = new IgnorePassiveDefenseEffectModifier(rs);
break;
case ImmuneTo:
aem = new ImmuneToEffectModifier(rs);
break;
case ImmuneToAttack:
aem = new ImmuneToAttackEffectModifier(rs);
break;
case ImmuneToPowers:
aem = new ImmuneToPowersEffectModifier(rs);
break;
case Invisible:
aem = new InvisibleEffectModifier(rs);
break;
case ItemName:
aem = new ItemNameEffectModifier(rs);
if ((((ItemNameEffectModifier)aem).name.isEmpty()))
break;
if (eb != null)
eb.setName((((ItemNameEffectModifier)aem).name));
break;
case Mana:
aem = new ManaEffectModifier(rs);
break;
case ManaFull:
aem = new ManaFullEffectModifier(rs);
break;
case ManaRecoverRate:
aem = new ManaRecoverRateEffectModifier(rs);
break;
case MaxDamage:
aem = new MaxDamageEffectModifier(rs);
break;
case MeleeDamageModifier:
aem = new MeleeDamageEffectModifier(rs);
break;
case MinDamage:
aem = new MinDamageEffectModifier(rs);
break;
case NoMod:
aem = new NoModEffectModifier(rs);
break;
case OCV:
aem = new OCVEffectModifier(rs);
break;
case Parry:
aem = new ParryEffectModifier(rs);
break;
case PassiveDefense:
aem = new PassiveDefenseEffectModifier(rs);
case PowerCost:
aem = new PowerCostEffectModifier(rs);
break;
case PowerCostHealth:
aem = new PowerCostHealthEffectModifier(rs);
break;
case PowerDamageModifier:
aem = new PowerDamageEffectModifier(rs);
break;
case ProtectionFrom:
aem = new ProtectionFromEffectModifier(rs);
break;
case Resistance:
aem = new ResistanceEffectModifier(rs);
break;
case ScaleHeight:
aem = new ScaleHeightEffectModifier(rs);
break;
case ScaleWidth:
aem = new ScaleWidthEffectModifier(rs);
break;
case ScanRange:
aem = new ScanRangeEffectModifier(rs);
break;
case SeeInvisible:
aem = new SeeInvisibleEffectModifier(rs);
break;
case Silenced:
aem = new SilencedEffectModifier(rs);
break;
case Skill:
aem = new SkillEffectModifier(rs);
break;
case Slay:
aem = new SlayEffectModifier(rs);
break;
case Speed:
aem = new SpeedEffectModifier(rs);
break;
case SpireBlock:
aem = new SpireBlockEffectModifier(rs);
break;
case Stamina:
aem = new StaminaEffectModifier(rs);
break;
case StaminaFull:
aem = new StaminaFullEffectModifier(rs);
break;
case StaminaRecoverRate:
aem = new StaminaRecoverRateEffectModifier(rs);
break;
case Stunned:
aem = new StunnedEffectModifier(rs);
break;
case Value:
aem = new ValueEffectModifier(rs);
if (eb != null){
ValueEffectModifier valueEffect = (ValueEffectModifier)aem;
eb.setValue(valueEffect.minMod);
}
break;
case WeaponProc:
aem = new WeaponProcEffectModifier(rs);
break;
case WeaponRange:
aem = new WeaponRangeEffectModifier(rs);
break;
case WeaponSpeed:
aem = new WeaponSpeedEffectModifier(rs);
break;
}
if (aem != null){
if (EffectsBase.modifiersMap.containsKey(eb.getIDString()) == false)
EffectsBase.modifiersMap.put(eb.getIDString(), new HashSet<>());
EffectsBase.modifiersMap.get(eb.getIDString()).add(aem);
}
}
rs.close();
} catch (Exception e) {
Logger.error( e);
} finally {
ps.release();
}
return out;
}
public int getUUID() { public int getUUID() {
return this.UUID; return this.UUID;

2
src/engine/powers/effectmodifiers/ItemNameEffectModifier.java

@ -21,7 +21,7 @@ import java.sql.SQLException;
public class ItemNameEffectModifier extends AbstractEffectModifier { public class ItemNameEffectModifier extends AbstractEffectModifier {
String name = ""; public String name = "";
public ItemNameEffectModifier(ResultSet rs) throws SQLException { public ItemNameEffectModifier(ResultSet rs) throws SQLException {
super(rs); super(rs);

2
src/engine/server/MBServerStatics.java

@ -651,7 +651,7 @@ public class MBServerStatics {
public static int AI_RECALL_RANGE = 400; public static int AI_RECALL_RANGE = 400;
public static int AI_PULSE_MOB_THRESHOLD = 200; public static int AI_PULSE_MOB_THRESHOLD = 200;
public static int AI_THREAD_SLEEP = 1000; public static int AI_THREAD_SLEEP = 1000;
public static int AI_PATROL_DIVISOR = 10; public static int AI_PATROL_DIVISOR = 15;
public static int AI_POWER_DIVISOR = 20; public static int AI_POWER_DIVISOR = 20;
public static int AI_PET_HEEL_DISTANCE = 10; public static int AI_PET_HEEL_DISTANCE = 10;
public static int AI_PATROL_RADIUS = 60; public static int AI_PATROL_RADIUS = 60;

54
src/engine/server/login/LoginServer.java

@ -9,8 +9,6 @@
package engine.server.login; package engine.server.login;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import engine.Enum; import engine.Enum;
import engine.gameManager.*; import engine.gameManager.*;
import engine.job.JobScheduler; import engine.job.JobScheduler;
@ -52,7 +50,6 @@ public class LoginServer {
// Instance variables // Instance variables
private VersionInfoMsg versionInfoMessage; private VersionInfoMsg versionInfoMessage;
public static HikariDataSource connectionPool = null;
public static int population = 0; public static int population = 0;
public static boolean worldServerRunning = false; public static boolean worldServerRunning = false;
public static boolean loginServerRunning = false; public static boolean loginServerRunning = false;
@ -119,16 +116,20 @@ public class LoginServer {
// Invalidate cache for players driven by forum // Invalidate cache for players driven by forum
// and stored procedure forum_link_pass() // and stored procedure forum_link_pass()
try {
// Run cache routine right away if requested. // Run cache routine right away if requested.
File cacheFile = new File("cacheInvalid"); File cacheFile = new File("cacheInvalid");
if (cacheFile.exists() == true) { if (cacheFile.exists() == true) {
nextCacheTime = LocalDateTime.now(); nextCacheTime = LocalDateTime.now();
Files.deleteIfExists(Paths.get("cacheInvalid"));
try {
Files.deleteIfExists(Paths.get("cacheInvalid"));
} catch (IOException e) {
throw new RuntimeException(e);
}
} }
if (LocalDateTime.now().isAfter(nextCacheTime)) { if (LocalDateTime.now().isAfter(nextCacheTime)) {
@ -148,10 +149,7 @@ public class LoginServer {
} }
ThreadUtils.sleep(100); ThreadUtils.sleep(100);
} catch (Exception e) {
Logger.error(e);
e.printStackTrace();
}
} }
} }
@ -172,9 +170,6 @@ public class LoginServer {
this.versionInfoMessage = new VersionInfoMsg(ConfigManager.MB_MAJOR_VER.getValue(), this.versionInfoMessage = new VersionInfoMsg(ConfigManager.MB_MAJOR_VER.getValue(),
ConfigManager.MB_MINOR_VER.getValue()); ConfigManager.MB_MINOR_VER.getValue());
Logger.info("Initializing Database Pool");
initDatabasePool();
Logger.info("Initializing Database layer"); Logger.info("Initializing Database layer");
initDatabaseLayer(); initDatabaseLayer();
@ -229,12 +224,12 @@ public class LoginServer {
// Try starting a GOM <-> DB connection. // Try starting a GOM <-> DB connection.
try { try {
Logger.info("Configuring GameObjectManager to use Database: '" Logger.info("Configuring Magicbane to use Database: '"
+ ConfigManager.MB_DATABASE_NAME.getValue() + "' on " + ConfigManager.MB_DATABASE_NAME.getValue() + "' on "
+ ConfigManager.MB_DATABASE_ADDRESS.getValue() + ':' + ConfigManager.MB_DATABASE_ADDRESS.getValue() + ':'
+ ConfigManager.MB_DATABASE_PORT.getValue()); + ConfigManager.MB_DATABASE_PORT.getValue());
DbManager.configureDatabaseLayer(); DbManager.configureConnectionPool();
} catch (Exception e) { } catch (Exception e) {
Logger.error(e.getMessage()); Logger.error(e.getMessage());
@ -365,33 +360,12 @@ public class LoginServer {
} }
private void initDatabasePool() {
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(33); // (16 cores 1 spindle)
config.setJdbcUrl("jdbc:mysql://" + ConfigManager.MB_DATABASE_ADDRESS.getValue() +
":" + ConfigManager.MB_DATABASE_PORT.getValue() + "/" +
ConfigManager.MB_DATABASE_NAME.getValue());
config.setUsername(ConfigManager.MB_DATABASE_USER.getValue());
config.setPassword(ConfigManager.MB_DATABASE_PASS.getValue());
config.addDataSourceProperty("characterEncoding", "utf8");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
connectionPool = new HikariDataSource(config); // setup the connection pool
Logger.info("local database connection configured");
}
public void invalidateCacheList() { public void invalidateCacheList() {
int objectUUID; int objectUUID;
String objectType; String objectType;
try (Connection connection = connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT * FROM `login_cachelist`"); PreparedStatement statement = connection.prepareStatement("SELECT * FROM `login_cachelist`");
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
@ -400,7 +374,7 @@ public class LoginServer {
objectUUID = rs.getInt("UID"); objectUUID = rs.getInt("UID");
objectType = rs.getString("type"); objectType = rs.getString("type");
Logger.info("INVALIDATED : " + objectType + " UUID: " + objectUUID); Logger.info("INVALIDATED : " + objectType + " UUID: " + objectUUID);
switch (objectType) { switch (objectType) {
@ -424,7 +398,7 @@ public class LoginServer {
// clear the db table // clear the db table
try (Connection connection = connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = connection.prepareStatement("DELETE FROM `login_cachelist`")) { PreparedStatement statement = connection.prepareStatement("DELETE FROM `login_cachelist`")) {
statement.execute(); statement.execute();
@ -447,7 +421,7 @@ public class LoginServer {
// query data warehouse for unresolved bane with this character // query data warehouse for unresolved bane with this character
try (Connection connection = connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = buildQueryActiveBaneStatement(connection, playerCharacter); PreparedStatement statement = buildQueryActiveBaneStatement(connection, playerCharacter);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {

4
src/engine/server/login/LoginServerMsgHandler.java

@ -449,9 +449,9 @@ public class LoginServerMsgHandler implements NetMsgHandler {
Account account = session.getAccount(); Account account = session.getAccount();
account.setLastCharIDUsed(gameServerIPRequestMessage.getCharacterUUID()); account.setLastCharIDUsed(gameServerIPRequestMessage.getCharacterUUID());
GameServerIPResponseMsg gsiprm = new GameServerIPResponseMsg(); GameServerIPResponseMsg gameServerIPResponseMsg = new GameServerIPResponseMsg();
if (!conn.sendMsg(gsiprm)) { if (!conn.sendMsg(gameServerIPResponseMsg)) {
Logger.error("Failed to send message"); Logger.error("Failed to send message");
this.KickToLogin(MBServerStatics.LOGINERROR_UNABLE_TO_LOGIN, "Unable to send GameServerIPResponseMsg to client.", conn); this.KickToLogin(MBServerStatics.LOGINERROR_UNABLE_TO_LOGIN, "Unable to send GameServerIPResponseMsg to client.", conn);
} }

9
src/engine/server/world/WorldServer.java

@ -305,9 +305,12 @@ public class WorldServer {
PowersManager.LoadAllMobPowers(); PowersManager.LoadAllMobPowers();
//load item enchantment values //load item enchantment values
Logger.info("Loading item enchants");
DbManager.LootQueries.LOAD_ENCHANT_VALUES(); DbManager.LootQueries.LOAD_ENCHANT_VALUES();
//initialize realms Logger.info("Loading zone extent cache");
DbManager.ZoneQueries.LOAD_ZONE_EXTENTS();
Logger.info("Loading Realms"); Logger.info("Loading Realms");
Realm.loadAllRealms(); Realm.loadAllRealms();
@ -471,7 +474,7 @@ public class WorldServer {
+ ConfigManager.MB_DATABASE_ADDRESS.getValue() + ':' + ConfigManager.MB_DATABASE_ADDRESS.getValue() + ':'
+ ConfigManager.MB_DATABASE_PORT.getValue()); + ConfigManager.MB_DATABASE_PORT.getValue());
DbManager.configureDatabaseLayer(); DbManager.configureConnectionPool();
} catch (Exception e) { } catch (Exception e) {
Logger.error(e.getMessage()); Logger.error(e.getMessage());
@ -572,7 +575,7 @@ public class WorldServer {
//Handle cities //Handle cities
City.loadCities(zone); ZoneManager.loadCities(zone);
ZoneManager.populateWorldZones(zone); ZoneManager.populateWorldZones(zone);
} catch (Exception e) { } catch (Exception e) {

1
src/engine/workthreads/HourlyJobThread.java

@ -284,7 +284,6 @@ public class HourlyJobThread implements Runnable {
Logger.info(WorldServer.getUptimeString()); Logger.info(WorldServer.getUptimeString());
Logger.info(SimulationManager.getPopulationString()); Logger.info(SimulationManager.getPopulationString());
Logger.info(MessageDispatcher.getNetstatString()); Logger.info(MessageDispatcher.getNetstatString());
Logger.info("Connection Pool Size: " + DbManager.getPoolSize());
Logger.info(PurgeOprhans.recordsDeleted.toString() + "orphaned items deleted"); Logger.info(PurgeOprhans.recordsDeleted.toString() + "orphaned items deleted");
} }
} }

4
src/engine/workthreads/PurgeOprhans.java

@ -8,7 +8,7 @@
package engine.workthreads; package engine.workthreads;
import engine.db.archive.DataWarehouse; import engine.gameManager.DbManager;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection; import java.sql.Connection;
@ -46,7 +46,7 @@ public class PurgeOprhans implements Runnable {
// Member variable declaration // Member variable declaration
try ( try (
Connection connection = DataWarehouse.connectionPool.getConnection(); Connection connection = DbManager.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT * from `object` where `type` = 'item' AND `parent` IS NULL", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); PreparedStatement statement = connection.prepareStatement("SELECT * from `object` where `type` = 'item' AND `parent` IS NULL", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {

63
src/engine/workthreads/WarehousePushThread.java

@ -18,6 +18,7 @@ package engine.workthreads;
import engine.Enum; import engine.Enum;
import engine.db.archive.*; import engine.db.archive.*;
import engine.gameManager.ConfigManager; import engine.gameManager.ConfigManager;
import engine.gameManager.DbManager;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.*; import java.sql.*;
@ -153,9 +154,9 @@ public class WarehousePushThread implements Runnable {
public static boolean pushMineRecords() { public static boolean pushMineRecords() {
try (Connection localConnection = DataWarehouse.connectionPool.getConnection(); try (Connection localConnection = DbManager.getConnection();
PreparedStatement statement = MineRecord.buildMineQueryStatement(localConnection); PreparedStatement statement = MineRecord.buildMineQueryStatement(localConnection);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
pushMineRecord(rs); pushMineRecord(rs);
@ -164,7 +165,7 @@ public class WarehousePushThread implements Runnable {
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( "Error with local DB connection: " + e.toString()); Logger.error("Error with local DB connection: " + e.toString());
e.printStackTrace(); e.printStackTrace();
return false; return false;
} }
@ -172,9 +173,9 @@ public class WarehousePushThread implements Runnable {
public static boolean pushCharacterRecords() { public static boolean pushCharacterRecords() {
try (Connection localConnection = DataWarehouse.connectionPool.getConnection(); try (Connection localConnection = DbManager.getConnection();
PreparedStatement statement = CharacterRecord.buildCharacterQueryStatement(localConnection); PreparedStatement statement = CharacterRecord.buildCharacterQueryStatement(localConnection);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
pushCharacterRecord(rs); pushCharacterRecord(rs);
@ -183,7 +184,7 @@ public class WarehousePushThread implements Runnable {
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( "Error with local DB connection: " + e.toString()); Logger.error("Error with local DB connection: " + e.toString());
e.printStackTrace(); e.printStackTrace();
return false; return false;
} }
@ -191,9 +192,9 @@ public class WarehousePushThread implements Runnable {
private static boolean pushGuildRecords() { private static boolean pushGuildRecords() {
try (Connection localConnection = DataWarehouse.connectionPool.getConnection(); try (Connection localConnection = DbManager.getConnection();
PreparedStatement statement = GuildRecord.buildGuildQueryStatement(localConnection); PreparedStatement statement = GuildRecord.buildGuildQueryStatement(localConnection);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
pushGuildRecord(rs); pushGuildRecord(rs);
@ -238,9 +239,9 @@ public class WarehousePushThread implements Runnable {
private static boolean pushBaneRecords() { private static boolean pushBaneRecords() {
try (Connection localConnection = DataWarehouse.connectionPool.getConnection(); try (Connection localConnection = DbManager.getConnection();
PreparedStatement statement = BaneRecord.buildBaneQueryStatement(localConnection); PreparedStatement statement = BaneRecord.buildBaneQueryStatement(localConnection);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
pushBaneRecord(rs); pushBaneRecord(rs);
@ -271,9 +272,9 @@ public class WarehousePushThread implements Runnable {
private static boolean pushCityRecords() { private static boolean pushCityRecords() {
try (Connection localConnection = DataWarehouse.connectionPool.getConnection(); try (Connection localConnection = DbManager.getConnection();
PreparedStatement statement = CityRecord.buildCityQueryStatement(localConnection); PreparedStatement statement = CityRecord.buildCityQueryStatement(localConnection);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
pushCityRecord(rs); pushCityRecord(rs);
@ -282,7 +283,7 @@ public class WarehousePushThread implements Runnable {
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( "Error with local DB connection: " + e.toString()); Logger.error("Error with local DB connection: " + e.toString());
e.printStackTrace(); e.printStackTrace();
return false; return false;
} }
@ -290,9 +291,9 @@ public class WarehousePushThread implements Runnable {
private static boolean pushPvpRecords() { private static boolean pushPvpRecords() {
try (Connection localConnection = DataWarehouse.connectionPool.getConnection(); try (Connection localConnection = DbManager.getConnection();
PreparedStatement statement = PvpRecord.buildPvpQueryStatement(localConnection); PreparedStatement statement = PvpRecord.buildPvpQueryStatement(localConnection);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
@ -323,9 +324,9 @@ public class WarehousePushThread implements Runnable {
private static boolean pushRealmRecords() { private static boolean pushRealmRecords() {
try (Connection localConnection = DataWarehouse.connectionPool.getConnection(); try (Connection localConnection = DbManager.getConnection();
PreparedStatement statement = RealmRecord.buildRealmQueryStatement(localConnection); PreparedStatement statement = RealmRecord.buildRealmQueryStatement(localConnection);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
@ -335,7 +336,7 @@ public class WarehousePushThread implements Runnable {
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( "Error with local DB connection: " + e.toString()); Logger.error("Error with local DB connection: " + e.toString());
e.printStackTrace(); e.printStackTrace();
return false; return false;
} }
@ -392,9 +393,9 @@ public class WarehousePushThread implements Runnable {
queryString = "SELECT * FROM `warehouse_index`"; queryString = "SELECT * FROM `warehouse_index`";
try (Connection localConnection = DataWarehouse.connectionPool.getConnection(); try (Connection localConnection = DbManager.getConnection();
CallableStatement statement = localConnection.prepareCall(queryString); CallableStatement statement = localConnection.prepareCall(queryString);
ResultSet rs = statement.executeQuery()) { ResultSet rs = statement.executeQuery()) {
while (rs.next()) { while (rs.next()) {
charIndex = rs.getInt("charIndex"); charIndex = rs.getInt("charIndex");
@ -417,14 +418,14 @@ public class WarehousePushThread implements Runnable {
private static boolean updateWarehouseIndex() { private static boolean updateWarehouseIndex() {
try (Connection connection = DataWarehouse.connectionPool.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement statement = WarehousePushThread.buildIndexUpdateStatement(connection)) { PreparedStatement statement = WarehousePushThread.buildIndexUpdateStatement(connection)) {
statement.execute(); statement.execute();
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {
Logger.error( e.toString()); Logger.error(e.toString());
return false; return false;
} }
} }

Loading…
Cancel
Save