Compare commits

..

No commits in common. 'lakebane-optimize' and 'master' have entirely different histories.

  1. 48
      src/engine/Enum.java
  2. 30
      src/engine/InterestManagement/InterestManager.java
  3. 3
      src/engine/db/handlers/dbAccountHandler.java
  4. 166
      src/engine/db/handlers/dbBaneHandler.java
  5. 4
      src/engine/db/handlers/dbCSSessionHandler.java
  6. 14
      src/engine/db/handlers/dbCityHandler.java
  7. 56
      src/engine/db/handlers/dbContractHandler.java
  8. 3
      src/engine/db/handlers/dbGuildHandler.java
  9. 17
      src/engine/db/handlers/dbHandlerBase.java
  10. 24
      src/engine/db/handlers/dbItemHandler.java
  11. 47
      src/engine/db/handlers/dbNPCHandler.java
  12. 3
      src/engine/devcmd/AbstractDevCmd.java
  13. 49
      src/engine/devcmd/cmds/AddNPCCmd.java
  14. 6
      src/engine/devcmd/cmds/AuditFailedItemsCmd.java
  15. 5
      src/engine/devcmd/cmds/DecachePlayerCmd.java
  16. 63
      src/engine/devcmd/cmds/GimmeCmd.java
  17. 3
      src/engine/devcmd/cmds/GotoBoundsCmd.java
  18. 9
      src/engine/devcmd/cmds/GotoCmd.java
  19. 3
      src/engine/devcmd/cmds/GotoObj.java
  20. 77
      src/engine/devcmd/cmds/HotzoneCmd.java
  21. 14
      src/engine/devcmd/cmds/InfoCmd.java
  22. 5
      src/engine/devcmd/cmds/JumpCmd.java
  23. 9
      src/engine/devcmd/cmds/MakeBaneCmd.java
  24. 5
      src/engine/devcmd/cmds/MineActiveCmd.java
  25. 5
      src/engine/devcmd/cmds/PrintStatsCmd.java
  26. 7
      src/engine/devcmd/cmds/RemoveObjectCmd.java
  27. 3
      src/engine/devcmd/cmds/ResetLevelCmd.java
  28. 5
      src/engine/devcmd/cmds/RotateCmd.java
  29. 4
      src/engine/devcmd/cmds/SetLevelCmd.java
  30. 7
      src/engine/devcmd/cmds/SetNpcEquipSetCmd.java
  31. 3
      src/engine/devcmd/cmds/SetNpcMobbaseCmd.java
  32. 3
      src/engine/devcmd/cmds/SetNpcNameCmd.java
  33. 28
      src/engine/devcmd/cmds/SimulateBootyCmd.java
  34. 3
      src/engine/devcmd/cmds/SlotTestCmd.java
  35. 3
      src/engine/devcmd/cmds/SummonCmd.java
  36. 3
      src/engine/devcmd/cmds/aiInfoCmd.java
  37. 168
      src/engine/gameManager/ArenaManager.java
  38. 47
      src/engine/gameManager/BuildingManager.java
  39. 56
      src/engine/gameManager/CombatManager.java
  40. 1
      src/engine/gameManager/ConfigManager.java
  41. 4
      src/engine/gameManager/DbManager.java
  42. 21
      src/engine/gameManager/DevCmdManager.java
  43. 10
      src/engine/gameManager/GuildManager.java
  44. 656
      src/engine/gameManager/LootManager.java
  45. 123
      src/engine/gameManager/MaintenanceManager.java
  46. 8
      src/engine/gameManager/MovementManager.java
  47. 395
      src/engine/gameManager/NPCManager.java
  48. 2392
      src/engine/gameManager/PlayerManager.java
  49. 228
      src/engine/gameManager/PowersManager.java
  50. 34
      src/engine/gameManager/SimulationManager.java
  51. 347
      src/engine/gameManager/StrongholdManager.java
  52. 2
      src/engine/gameManager/TradeManager.java
  53. 195
      src/engine/gameManager/ZergManager.java
  54. 73
      src/engine/gameManager/ZoneManager.java
  55. 3
      src/engine/jobs/DatabaseUpdateJob.java
  56. 14
      src/engine/jobs/FinishSummonsJob.java
  57. 3
      src/engine/jobs/StuckJob.java
  58. 3
      src/engine/jobs/TeleportJob.java
  59. 22
      src/engine/loot/ItemTableEntry.java
  60. 10
      src/engine/loot/ModTableEntry.java
  61. 2
      src/engine/math/Bounds.java
  62. 140
      src/engine/mobileAI/MobAI.java
  63. 25
      src/engine/mobileAI/utilities/CombatUtilities.java
  64. 8
      src/engine/net/NetMsgFactory.java
  65. 267
      src/engine/net/client/ClientMessagePump.java
  66. 7
      src/engine/net/client/handlers/AcceptInviteToGuildHandler.java
  67. 2
      src/engine/net/client/handlers/ArcLoginNotifyMsgHandler.java
  68. 15
      src/engine/net/client/handlers/ArcMineChangeProductionMsgHandler.java
  69. 2
      src/engine/net/client/handlers/AssetSupportMsgHandler.java
  70. 7
      src/engine/net/client/handlers/BanishUnbanishHandler.java
  71. 14
      src/engine/net/client/handlers/ChangeAltitudeHandler.java
  72. 13
      src/engine/net/client/handlers/ChangeGuildLeaderHandler.java
  73. 15
      src/engine/net/client/handlers/ChangeRankHandler.java
  74. 2
      src/engine/net/client/handlers/CityDataHandler.java
  75. 2
      src/engine/net/client/handlers/DestroyBuildingHandler.java
  76. 5
      src/engine/net/client/handlers/DisbandGuildHandler.java
  77. 2
      src/engine/net/client/handlers/GroupInviteResponseHandler.java
  78. 3
      src/engine/net/client/handlers/GuildControlHandler.java
  79. 13
      src/engine/net/client/handlers/GuildCreationFinalizeHandler.java
  80. 3
      src/engine/net/client/handlers/GuildInfoHandler.java
  81. 5
      src/engine/net/client/handlers/HirelingServiceMsgHandler.java
  82. 5
      src/engine/net/client/handlers/ItemProductionMsgHandler.java
  83. 13
      src/engine/net/client/handlers/MOTDEditHandler.java
  84. 158
      src/engine/net/client/handlers/MerchantMsgHandler.java
  85. 2
      src/engine/net/client/handlers/MinionTrainingMsgHandler.java
  86. 33
      src/engine/net/client/handlers/ObjectActionMsgHandler.java
  87. 12
      src/engine/net/client/handlers/OpenFriendsCondemnListMsgHandler.java
  88. 12
      src/engine/net/client/handlers/OrderNPCMsgHandler.java
  89. 5
      src/engine/net/client/handlers/RequestEnterWorldHandler.java
  90. 3
      src/engine/net/client/handlers/SwearInHandler.java
  91. 3
      src/engine/net/client/handlers/TaxCityMsgHandler.java
  92. 3
      src/engine/net/client/handlers/TransferAssetMsgHandler.java
  93. 244
      src/engine/net/client/msg/ApplyRuneMsg.java
  94. 6
      src/engine/net/client/msg/ArcViewAssetTransactionsMsg.java
  95. 12
      src/engine/net/client/msg/BuyFromNPCWindowMsg.java
  96. 12
      src/engine/net/client/msg/CityDataMsg.java
  97. 7
      src/engine/net/client/msg/IgnoreMsg.java
  98. 3
      src/engine/net/client/msg/ItemProductionMsg.java
  99. 31
      src/engine/net/client/msg/ManageCityAssetsMsg.java
  100. 8
      src/engine/net/client/msg/ManageNPCMsg.java
  101. Some files were not shown because too many files have changed in this diff Show More

48
src/engine/Enum.java

@ -9,13 +9,15 @@
package engine; package engine;
import ch.claude_martin.enumbitset.EnumBitSetHelper; import ch.claude_martin.enumbitset.EnumBitSetHelper;
import engine.gameManager.BuildingManager;
import engine.gameManager.ConfigManager; import engine.gameManager.ConfigManager;
import engine.gameManager.PowersManager; import engine.gameManager.PowersManager;
import engine.gameManager.ZoneManager; import engine.gameManager.ZoneManager;
import engine.math.Vector2f; import engine.math.Vector2f;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.*; import engine.objects.AbstractCharacter;
import engine.objects.ItemBase;
import engine.objects.Shrine;
import engine.objects.Zone;
import engine.powers.EffectsBase; import engine.powers.EffectsBase;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@ -137,8 +139,8 @@ public class Enum {
HALFGIANTMALE(2010, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.MALE, 1.15f), HALFGIANTMALE(2010, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.MALE, 1.15f),
HUMANMALE(2011, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.MALE, 1), HUMANMALE(2011, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.MALE, 1),
HUMANFEMALE(2012, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.FEMALE, 1), HUMANFEMALE(2012, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.MALE, 1.1f), IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.MALE, 1.1f),
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.FEMALE, 1.1f), IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
SHADEMALE(2015, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.MALE, 1), SHADEMALE(2015, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.MALE, 1),
SHADEFEMALE(2016, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.FEMALE, 1), SHADEFEMALE(2016, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
MINOMALE(2017, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 1.3f), MINOMALE(2017, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 1.3f),
@ -170,8 +172,6 @@ public class Enum {
} }
public static RaceType getRaceTypebyRuneID(int runeID) { public static RaceType getRaceTypebyRuneID(int runeID) {
if(runeID == 1999)
return _raceTypeByID.get(2017);
return _raceTypeByID.get(runeID); return _raceTypeByID.get(runeID);
} }
@ -208,8 +208,8 @@ public class Enum {
SENTINEL(0, 0, 0, 0, 0, 0, 0), SENTINEL(0, 0, 0, 0, 0, 0, 0),
STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f), STANDARD(6.1900001f, 13.97f, 4.2199998f, 13.97f, 6.3299999f, 18.379999f, 6.5f),
CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f), CENTAUR(6.1900001f, 16.940001f, 5.5500002f, 16.940001f, 6.3299999f, 18.379999f, 6.5f),
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f), MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f);
IREKEI(6.499500105f, 14.6685f, 4.2199998f, 14.6685f, 6.3299999f, 18.379999f, 6.5f);
private float walkStandard; private float walkStandard;
private float walkCombat; private float walkCombat;
private float runStandard; private float runStandard;
@ -469,14 +469,11 @@ public class Enum {
// 14001 does not have a banestone to bind at // 14001 does not have a banestone to bind at
if (ruinZone.getLoadNum() == 14001) { if (ruinZone.getLoadNum() == 14001)
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc(), 30); spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc(), 30);
}else { else
//spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc() spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
//.add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30); .add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30);
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(27977).loc,30f);
}
} }
@ -779,7 +776,6 @@ public class Enum {
Combat, Combat,
Spires, Spires,
Snare, Snare,
Snared,
Stun, Stun,
Blind, Blind,
Root, Root,
@ -882,7 +878,6 @@ public class Enum {
Siege, Siege,
Slash, Slash,
Snare, Snare,
Snared,
Sorcery, Sorcery,
Spear, Spear,
SpearMastery, SpearMastery,
@ -962,17 +957,6 @@ public class Enum {
Wizardry; Wizardry;
public static SourceType GetSourceType(String modName) { public static SourceType GetSourceType(String modName) {
switch(modName){
case "Slashing":
modName = "Slash";
break;
case "Crushing":
modName = "Crush";
break;
case "Piercing":
modName = "Pierce";
break;
}
SourceType returnMod; SourceType returnMod;
if (modName.isEmpty()) if (modName.isEmpty())
return SourceType.None; return SourceType.None;
@ -1032,7 +1016,6 @@ public class Enum {
Silence, Silence,
Slash, Slash,
Snare, Snare,
Snared,
Stance, Stance,
Stun, Stun,
Summon, Summon,
@ -1157,7 +1140,6 @@ public class Enum {
SkillDebuff, SkillDebuff,
SlashResistanceDebuff, SlashResistanceDebuff,
Snare, Snare,
Snared,
StackableAttrCONBuff, StackableAttrCONBuff,
StackableAttrDEXBuff, StackableAttrDEXBuff,
StackableAttrSTRBuff, StackableAttrSTRBuff,
@ -2324,9 +2306,9 @@ public class Enum {
public enum CityBoundsType { public enum CityBoundsType {
GRID(544), GRID(640),
ZONE(672), ZONE(875),
PLACEMENT(673); PLACEMENT(876);
public final float extents; public final float extents;

30
src/engine/InterestManagement/InterestManager.java

@ -12,7 +12,6 @@ import engine.Enum;
import engine.Enum.DispatchChannel; import engine.Enum.DispatchChannel;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.gameManager.GroupManager; import engine.gameManager.GroupManager;
import engine.gameManager.PlayerManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.job.JobScheduler; import engine.job.JobScheduler;
import engine.jobs.RefreshGroupJob; import engine.jobs.RefreshGroupJob;
@ -20,7 +19,10 @@ import engine.net.AbstractNetMsg;
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;
import engine.net.client.msg.*; import engine.net.client.msg.LoadCharacterMsg;
import engine.net.client.msg.LoadStructureMsg;
import engine.net.client.msg.MoveToPointMsg;
import engine.net.client.msg.UnloadObjectsMsg;
import engine.objects.*; import engine.objects.*;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@ -234,7 +236,7 @@ public enum InterestManager implements Runnable {
if (distanceSquared > sqr(64)) if (distanceSquared > sqr(64))
player.setLastStaticLoc(player.getLoc()); player.setLastStaticLoc(player.getLoc());
else if (PlayerManager.isDirtyLoad(player) == false) else if (player.isDirtyLoad() == false)
return; return;
// Get Statics in range // Get Statics in range
@ -287,14 +289,14 @@ public enum InterestManager implements Runnable {
lsm.addObject((Building) awo); lsm.addObject((Building) awo);
else if (awo.getObjectType().equals(GameObjectType.Corpse)) { else if (awo.getObjectType().equals(GameObjectType.Corpse)) {
Corpse corpse = (Corpse) awo; Corpse corpse = (Corpse) awo;
lcm = new LoadCharacterMsg(corpse, PlayerManager.hideNonAscii()); lcm = new LoadCharacterMsg(corpse, PlayerCharacter.hideNonAscii());
Dispatch dispatch = Dispatch.borrow(player, lcm); Dispatch dispatch = Dispatch.borrow(player, lcm);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
} else if (awo.getObjectType().equals(GameObjectType.NPC)) { } else if (awo.getObjectType().equals(GameObjectType.NPC)) {
NPC npc = (NPC) awo; NPC npc = (NPC) awo;
lcm = new LoadCharacterMsg(npc, PlayerManager.hideNonAscii()); lcm = new LoadCharacterMsg(npc, PlayerCharacter.hideNonAscii());
lcmList.add(lcm); lcmList.add(lcm);
} }
@ -312,7 +314,7 @@ public enum InterestManager implements Runnable {
} }
loadedStaticObjects.addAll(toLoad); loadedStaticObjects.addAll(toLoad);
PlayerManager.setDirtyLoad(player, false); player.setDirtyLoad(false);
} }
private void updateMobileList(PlayerCharacter player, ClientConnection origin) { private void updateMobileList(PlayerCharacter player, ClientConnection origin) {
@ -438,7 +440,7 @@ public enum InterestManager implements Runnable {
if (player.getSeeInvis() < awopc.getHidden()) if (player.getSeeInvis() < awopc.getHidden())
continue; continue;
lcm = new LoadCharacterMsg(awopc, PlayerManager.hideNonAscii()); lcm = new LoadCharacterMsg(awopc, PlayerCharacter.hideNonAscii());
players.add(awo); players.add(awo);
// check if in a group with the person being loaded // check if in a group with the person being loaded
@ -467,11 +469,11 @@ public enum InterestManager implements Runnable {
awonpc.playerAgroMap.put(player.getObjectUUID(), false); awonpc.playerAgroMap.put(player.getObjectUUID(), false);
((Mob) awonpc).setCombatTarget(null); ((Mob) awonpc).setCombatTarget(null);
lcm = new LoadCharacterMsg(awonpc, PlayerManager.hideNonAscii()); lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii());
} else if ((awo.getObjectTypeMask() & MBServerStatics.MASK_NPC) != 0) { } else if ((awo.getObjectTypeMask() & MBServerStatics.MASK_NPC) != 0) {
NPC awonpc = (NPC) awo; NPC awonpc = (NPC) awo;
lcm = new LoadCharacterMsg(awonpc, PlayerManager.hideNonAscii()); lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii());
} else if ((awo.getObjectTypeMask() & MBServerStatics.MASK_PET) != 0) { } else if ((awo.getObjectTypeMask() & MBServerStatics.MASK_PET) != 0) {
Mob awonpc = (Mob) awo; Mob awonpc = (Mob) awo;
@ -483,7 +485,7 @@ public enum InterestManager implements Runnable {
if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE))) if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE)))
((Mob) awonpc).setCombatTarget(null); ((Mob) awonpc).setCombatTarget(null);
lcm = new LoadCharacterMsg(awonpc, PlayerManager.hideNonAscii()); lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii());
} }
addToList.add(awo); addToList.add(awo);
@ -519,10 +521,10 @@ public enum InterestManager implements Runnable {
// Update loaded upbjects lists // Update loaded upbjects lists
player.isBoxed = PlayerManager.checkIfBoxed(player); player.setDirtyLoad(true);
PlayerManager.setDirtyLoad(player, true);
updateStaticList(player, origin); updateStaticList(player, origin);
updateMobileList(player, origin); updateMobileList(player, origin);
} }
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) { public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {
@ -537,7 +539,7 @@ public enum InterestManager implements Runnable {
// Update loaded upbjects lists // Update loaded upbjects lists
PlayerManager.setDirtyLoad(playerCharacter, true); playerCharacter.setDirtyLoad(true);
updateStaticList(playerCharacter, origin); updateStaticList(playerCharacter, origin);
updateMobileList(playerCharacter, origin); updateMobileList(playerCharacter, origin);
@ -553,7 +555,7 @@ public enum InterestManager implements Runnable {
for (AbstractWorldObject playerObject : playerList) { for (AbstractWorldObject playerObject : playerList) {
PlayerCharacter playerCharacter = (PlayerCharacter) playerObject; PlayerCharacter playerCharacter = (PlayerCharacter) playerObject;
PlayerManager.setDirtyLoad(playerCharacter, true); playerCharacter.setDirtyLoad(true);
} }
} }
} }

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

@ -13,7 +13,6 @@ import engine.Enum;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.gameManager.ConfigManager; import engine.gameManager.ConfigManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
import engine.objects.Account; import engine.objects.Account;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@ -141,7 +140,7 @@ public class dbAccountHandler extends dbHandlerBase {
int playerID; int playerID;
playerID = rs.getInt(1); playerID = rs.getInt(1);
trashPlayer = PlayerManager.getPlayerCharacter(playerID); trashPlayer = PlayerCharacter.getPlayerCharacter(playerID);
if (trashPlayer == null) if (trashPlayer == null)
continue; continue;

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

@ -10,13 +10,17 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager; import engine.objects.Bane;
import engine.math.Vector3fImmutable; import engine.objects.Building;
import engine.objects.*; import engine.objects.City;
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.*; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class dbBaneHandler extends dbHandlerBase { public class dbBaneHandler extends dbHandlerBase {
@ -85,139 +89,6 @@ public class dbBaneHandler extends dbHandlerBase {
return true; return true;
} }
public boolean SET_BANE_TIME_NEW(int hour, int cityUUID) {
hour += 12; // Adjust hour
try (Connection connection = DbManager.getConnection();
PreparedStatement getStatement = connection.prepareStatement("SELECT `placementDate`, `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?");
PreparedStatement updateStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `liveDate`=?, `time_set`=? WHERE `cityUUID`=?")) {
// Retrieve placementDate and liveDate
getStatement.setInt(1, cityUUID);
try (ResultSet rs = getStatement.executeQuery()) {
if (rs.next()) {
DateTime placementDate = new DateTime(rs.getTimestamp("placementDate").getTime());
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
// Explicitly check if liveDate is null
DateTime toSet;
if (liveDateTimestamp == null) {
// If liveDate is null, default to placementDate
toSet = placementDate;
} else {
// If liveDate is not null, use it
DateTime liveDate = new DateTime(liveDateTimestamp.getTime());
toSet = liveDate;
}
// Adjust the time
toSet = toSet.withHourOfDay(hour).withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0);
// Update liveDate and time_set flag
updateStatement.setTimestamp(1, new java.sql.Timestamp(toSet.getMillis()));
updateStatement.setInt(2, 1); // time_set flag
updateStatement.setInt(3, cityUUID);
updateStatement.execute();
return true;
}
}
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_BANE_DAY_NEW(int dayOffset, int cityUUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement getStatement = connection.prepareStatement("SELECT `placementDate`, `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?");
PreparedStatement updateStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `liveDate`=?, `day_set`=? WHERE `cityUUID`=?")) {
// Retrieve placementDate and liveDate
getStatement.setInt(1, cityUUID);
try (ResultSet rs = getStatement.executeQuery()) {
if (rs.next()) {
DateTime placementDate = new DateTime(rs.getTimestamp("placementDate").getTime());
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
// Explicitly check if liveDate is null
DateTime liveDate;
if (liveDateTimestamp == null) {
// If liveDate is null, default to placementDate
liveDate = placementDate;
} else {
// If liveDate is not null, use it
liveDate = new DateTime(liveDateTimestamp.getTime());
}
// Calculate the new liveDate while preserving the time component
DateTime updatedDate = placementDate.plusDays(dayOffset)
.withHourOfDay(liveDate.getHourOfDay())
.withMinuteOfHour(liveDate.getMinuteOfHour())
.withSecondOfMinute(liveDate.getSecondOfMinute())
.withMillisOfSecond(liveDate.getMillisOfSecond());
// Update liveDate and day_set flag
updateStatement.setTimestamp(1, new java.sql.Timestamp(updatedDate.getMillis()));
updateStatement.setInt(2, 1); // day_set flag
updateStatement.setInt(3, cityUUID);
updateStatement.execute();
return true;
}
}
} catch (SQLException e) {
Logger.error(e);
}
return false;
}
public boolean SET_BANE_CAP_NEW(int count, int cityUUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_size`=? WHERE `cityUUID`=?")) {
preparedStatement.setInt(1, count);
preparedStatement.setLong(2, cityUUID);
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
return false;
}
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_set`=? WHERE `cityUUID`=?")) {
preparedStatement.setInt(1, 1);
preparedStatement.setLong(2, cityUUID);
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
return false;
}
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE `dyn_banes` SET `cap_size`=? WHERE `cityUUID`=?")) {
preparedStatement.setInt(1, count);
preparedStatement.setLong(2, cityUUID);
preparedStatement.execute();
} catch (SQLException e) {
Logger.error(e);
return false;
}
return true;
}
public boolean REMOVE_BANE(Bane bane) { public boolean REMOVE_BANE(Bane bane) {
if (bane == null) if (bane == null)
@ -236,25 +107,4 @@ public class dbBaneHandler extends dbHandlerBase {
return true; return true;
} }
public DateTime getLiveDate(int cityUUID) {
try (Connection connection = DbManager.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT `liveDate` FROM `dyn_banes` WHERE `cityUUID`=?")) {
statement.setInt(1, cityUUID);
try (ResultSet rs = statement.executeQuery()) {
if (rs.next()) {
Timestamp liveDateTimestamp = rs.getTimestamp("liveDate");
if (liveDateTimestamp != null) {
return new DateTime(liveDateTimestamp.getTime());
}
}
}
} catch (SQLException e) {
Logger.error(e);
}
return null; // Return null if liveDate is not found or an error occurs
}
} }

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

@ -10,8 +10,8 @@
package engine.db.handlers; package engine.db.handlers;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
import engine.objects.Account; import engine.objects.Account;
import engine.objects.PlayerCharacter;
import engine.session.CSSession; import engine.session.CSSession;
import engine.util.StringUtils; import engine.util.StringUtils;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@ -103,7 +103,7 @@ public class dbCSSessionHandler extends dbHandlerBase {
ResultSet rs = preparedStatement.executeQuery(); ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) if (rs.next())
css = new CSSession(secKey, DbManager.AccountQueries.GET_ACCOUNT(rs.getInt("accountID")), PlayerManager.getPlayerCharacter(rs.getInt("characterID")), rs.getString("machineID")); css = new CSSession(secKey, DbManager.AccountQueries.GET_ACCOUNT(rs.getInt("accountID")), PlayerCharacter.getPlayerCharacter(rs.getInt("characterID")), rs.getString("machineID"));
} catch (SQLException e) { } catch (SQLException e) {
Logger.error(e); Logger.error(e);

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

@ -11,7 +11,10 @@ package engine.db.handlers;
import engine.Enum; import engine.Enum;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.objects.*; import engine.objects.AbstractGameObject;
import engine.objects.Building;
import engine.objects.City;
import engine.objects.Zone;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.*; import java.sql.*;
@ -92,16 +95,7 @@ public class dbCityHandler extends dbHandlerBase {
return objectList; return objectList;
} }
public Integer GET_CAPITAL_CITY_COUNT() {
int cityCount = 0;
for(Realm realm : Realm._realms.values()){
if(realm.isRuled())
cityCount ++;
}
return cityCount;
}
public ArrayList<City> GET_CITIES_BY_ZONE(final int objectUUID) { public ArrayList<City> GET_CITIES_BY_ZONE(final int objectUUID) {
ArrayList<City> cityList = new ArrayList<>(); ArrayList<City> cityList = new ArrayList<>();

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

@ -98,54 +98,32 @@ public class dbContractHandler extends dbHandlerBase {
public void LOAD_SELL_LIST_FOR_CONTRACT(final Contract contract) { public void LOAD_SELL_LIST_FOR_CONTRACT(final Contract contract) {
if(!contract.getName().contains("Sage")) { try (Connection connection = DbManager.getConnection();
try (Connection connection = DbManager.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype` WHERE `contractID` = ?;")) {
preparedStatement.setInt(1, contract.getObjectUUID());
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
int type = rs.getInt("type"); preparedStatement.setInt(1, contract.getObjectUUID());
int value = rs.getInt("value");
switch (type) { ResultSet rs = preparedStatement.executeQuery();
case 1:
contract.getBuyItemType().add(value);
break;
case 2:
contract.getBuySkillToken().add(value);
break;
case 3:
contract.getBuyUnknownToken().add(value);
break;
}
}
} catch (SQLException e) {
Logger.error(e);
}
}else{
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_contract_selltype`;")) {
ResultSet rs = preparedStatement.executeQuery(); while (rs.next()) {
while (rs.next()) { int type = rs.getInt("type");
int value = rs.getInt("value"); int value = rs.getInt("value");
if(!contract.getBuySkillToken().contains(value))
contract.getBuySkillToken().add(value);
if(!contract.getBuyItemType().contains(value)) switch (type) {
case 1:
contract.getBuyItemType().add(value); contract.getBuyItemType().add(value);
break;
if(!contract.getBuyUnknownToken().contains(value)) case 2:
contract.getBuySkillToken().add(value);
break;
case 3:
contract.getBuyUnknownToken().add(value); contract.getBuyUnknownToken().add(value);
break;
} }
} catch (SQLException e) {
Logger.error(e);
} }
} catch (SQLException e) {
Logger.error(e);
} }
} }

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

@ -12,7 +12,6 @@ package engine.db.handlers;
import engine.Enum; import engine.Enum;
import engine.Enum.GuildHistoryType; import engine.Enum.GuildHistoryType;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
import engine.objects.*; import engine.objects.*;
import engine.server.world.WorldServer; import engine.server.world.WorldServer;
import org.joda.time.DateTime; import org.joda.time.DateTime;
@ -223,7 +222,7 @@ public class dbGuildHandler extends dbHandlerBase {
while (rs.next()) { while (rs.next()) {
int playerUUID = rs.getInt(1); int playerUUID = rs.getInt(1);
PlayerCharacter kosPlayer = PlayerManager.getPlayerCharacter(playerUUID); PlayerCharacter kosPlayer = PlayerCharacter.getPlayerCharacter(playerUUID);
if (kosPlayer != null) if (kosPlayer != null)
kosList.add(kosPlayer); kosList.add(kosPlayer);

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

@ -32,6 +32,7 @@ public abstract class dbHandlerBase {
try { try {
if (rs.next()) { if (rs.next()) {
abstractGameObject = localClass.getConstructor(ResultSet.class).newInstance(rs); abstractGameObject = localClass.getConstructor(ResultSet.class).newInstance(rs);
DbManager.addToCache(abstractGameObject); DbManager.addToCache(abstractGameObject);
} }
} catch (Exception e) { } catch (Exception e) {
@ -56,28 +57,12 @@ public abstract class dbHandlerBase {
while (rs.next()) { while (rs.next()) {
int id = rs.getInt(1); int id = rs.getInt(1);
try {
if (rs.getInt("capSize") == 0) {
continue;
}
}catch(Exception e){
//not a mine
}
if (DbManager.inCache(localObjectType, id)) { if (DbManager.inCache(localObjectType, id)) {
objectList.add((T) DbManager.getFromCache(localObjectType, id)); objectList.add((T) DbManager.getFromCache(localObjectType, id));
} else { } else {
try{
if(rs.getInt("mineLiveHour") == 1)
continue;
}catch(Exception e){
//not a mine
}
AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs); AbstractGameObject toAdd = localClass.getConstructor(ResultSet.class).newInstance(rs);
DbManager.addToCache(toAdd); DbManager.addToCache(toAdd);
if(toAdd.getObjectType().equals(GameObjectType.Zone) && rs.getInt("canLoad") == 0){
continue;
}
objectList.add((T) toAdd); objectList.add((T) toAdd);
if (toAdd != null && toAdd instanceof AbstractWorldObject) if (toAdd != null && toAdd instanceof AbstractWorldObject)

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

@ -134,13 +134,9 @@ public class dbItemHandler extends dbHandlerBase {
ResultSet rs = preparedStatement.executeQuery(); ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) { if (rs.next())
try { worked = rs.getBoolean("result");
worked = rs.getBoolean("result");
}catch(Exception e){
worked = false;
}
}
} catch (SQLException e) { } catch (SQLException e) {
Logger.error(e); Logger.error(e);
} }
@ -500,18 +496,4 @@ public class dbItemHandler extends dbHandlerBase {
return false; return false;
} }
} }
public boolean UPDATE_NUM_ITEMS(final Item item, int newValue) {
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;
}
}
} }

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

@ -11,7 +11,6 @@ package engine.db.handlers;
import engine.Enum.ProfitType; import engine.Enum.ProfitType;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.NPCManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.NPC; import engine.objects.NPC;
import engine.objects.NPCProfits; import engine.objects.NPCProfits;
@ -132,32 +131,6 @@ public class dbNPCHandler extends dbHandlerBase {
return npc; return npc;
} }
public int BANE_COMMANDER_EXISTS(final int objectUUID) {
int uid = 0;
String query = "SELECT `UID` FROM `obj_npc` WHERE `npc_buildingID` = ? LIMIT 1;";
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(query)) {
preparedStatement.setInt(1, objectUUID);
try (ResultSet rs = preparedStatement.executeQuery()) {
if (rs.next()) {
// Retrieve the UID column value
uid = rs.getInt("UID");
}
}
} catch (SQLException e) {
Logger.error(e);
}
return uid;
}
public int MOVE_NPC(long npcID, long parentID, float locX, float locY, float locZ) { public int MOVE_NPC(long npcID, long parentID, float locX, float locY, float locZ) {
int rowCount; int rowCount;
@ -203,18 +176,6 @@ public class dbNPCHandler extends dbHandlerBase {
return result; return result;
} }
public static void updateSpecialPricing(final NPC npc){
try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE obj_npc SET specialPrice=? WHERE UID = ?")) {
preparedStatement.setInt(1, npc.getSpecialPrice());
preparedStatement.setInt(2, npc.getDBID());
preparedStatement.executeUpdate();
} catch (SQLException e) {
Logger.error(e);
}
}
public void updateDatabase(final NPC npc) { public void updateDatabase(final NPC npc) {
try (Connection connection = DbManager.getConnection(); try (Connection connection = DbManager.getConnection();
@ -331,12 +292,12 @@ public class dbNPCHandler extends dbHandlerBase {
// Handle new mobbbase entries // Handle new mobbbase entries
if (NPCManager._pirateNames.get(mobBase) == null) if (NPC._pirateNames.get(mobBase) == null)
NPCManager._pirateNames.putIfAbsent(mobBase, new ArrayList<>()); NPC._pirateNames.putIfAbsent(mobBase, new ArrayList<>());
// Insert name into proper arraylist // Insert name into proper arraylist
NPCManager._pirateNames.get(mobBase).add(pirateName); NPC._pirateNames.get(mobBase).add(pirateName);
} }
} catch (SQLException e) { } catch (SQLException e) {
@ -344,7 +305,7 @@ public class dbNPCHandler extends dbHandlerBase {
} }
Logger.info("names read: " + recordsRead + " for " Logger.info("names read: " + recordsRead + " for "
+ NPCManager._pirateNames.size() + " mobBases"); + 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) { 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) {

3
src/engine/devcmd/AbstractDevCmd.java

@ -12,7 +12,6 @@ package engine.devcmd;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.NPCManager;
import engine.objects.*; import engine.objects.*;
import java.util.ArrayList; import java.util.ArrayList;
@ -72,7 +71,7 @@ public abstract class AbstractDevCmd {
int targetType = pc.getLastTargetType().ordinal(); int targetType = pc.getLastTargetType().ordinal();
int targetID = pc.getLastTargetID(); int targetID = pc.getLastTargetID();
if (targetType == GameObjectType.NPC.ordinal()) { if (targetType == GameObjectType.NPC.ordinal()) {
NPC b = NPCManager.getFromCache(targetID); NPC b = NPC.getFromCache(targetID);
if (b == null) { if (b == null) {
ChatManager.chatSystemError(pc, ChatManager.chatSystemError(pc,
"Command Failed. Could not find NPC of ID " + targetID); "Command Failed. Could not find NPC of ID " + targetID);

49
src/engine/devcmd/cmds/AddNPCCmd.java

@ -10,10 +10,11 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.*; import engine.gameManager.*;
import engine.math.Vector3fImmutable;
import engine.objects.*; import engine.objects.*;
import org.pmw.tinylog.Logger;
/** /**
* @author Eighty * @author Eighty
@ -30,6 +31,7 @@ public class AddNPCCmd extends AbstractDevCmd {
int contractID; int contractID;
String name = ""; String name = "";
int level = 0; int level = 0;
if (words.length < 2) { if (words.length < 2) {
this.sendUsage(pc); this.sendUsage(pc);
return; return;
@ -37,54 +39,59 @@ public class AddNPCCmd extends AbstractDevCmd {
try { try {
contractID = Integer.parseInt(words[0]); contractID = Integer.parseInt(words[0]);
level = Integer.parseInt(words[1]); level = Integer.parseInt(words[1]);
for (int i = 2; i < words.length; i++) { for (int i = 2; i < words.length; i++) {
name += words[i]; name += words[i];
if (i + 1 < words.length) if (i + 1 < words.length)
name += ""; name += "";
} }
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
throwbackError(pc, throwbackError(pc,
"Failed to parse supplied contractID or level to an Integer."); "Failed to parse supplied contractID or level to an Integer.");
return; // NaN return; // NaN
} }
Contract contract = DbManager.ContractQueries.GET_CONTRACT(contractID); Contract contract = DbManager.ContractQueries.GET_CONTRACT(contractID);
if (contract == null || level < 1 || level > 75) { if (contract == null || level < 1 || level > 75) {
throwbackError(pc, throwbackError(pc,
"Invalid addNPC Command. Need contract ID, and level"); "Invalid addNPC Command. Need contract ID, and level");
return; // NaN return; // NaN
} }
// Pick a random name // Pick a random name
if (name.isEmpty()) if (name.isEmpty())
name = NPCManager.getPirateName(contract.getMobbaseID()); name = NPCManager.getPirateName(contract.getMobbaseID());
Zone zone = ZoneManager.findSmallestZone(pc.getLoc()); Zone zone = ZoneManager.findSmallestZone(pc.getLoc());
if (zone == null) { if (zone == null) {
throwbackError(pc, "Failed to find zone to place npc in."); throwbackError(pc, "Failed to find zone to place npc in.");
return; return;
} }
Building building = null;
if (target != null) if (target != null)
if (target.getObjectType() == GameObjectType.Building) { if (target.getObjectType() == GameObjectType.Building) {
building = (Building)target; Building parentBuilding = (Building) target;
BuildingManager.addHirelingForWorld(parentBuilding, pc, parentBuilding.getLoc(), parentBuilding.getParentZone(), contract, level);
return;
} }
NPC created;
Guild guild = null; NPC npc = NPC.createNPC(name, contractID,
Vector3fImmutable loc; pc.getLoc(), null, zone, (short) level, null);
if(building != null){
guild = building.getGuild(); if (npc != null) {
loc = building.loc; WorldGrid.addObject(npc, pc);
} else{ ChatManager.chatSayInfo(pc,
loc = pc.loc; "NPC with ID " + npc.getDBID() + " added");
} this.setResult(String.valueOf(npc.getDBID()));
created = NPCManager.createNPC(name, contractID, loc, guild, zone, (short)level, building); } else {
created.bindLoc = loc; throwbackError(pc, "Failed to create npc of contract type "
if(building != null) { + contractID);
created.buildingUUID = building.getObjectUUID(); Logger.error(
created.building = building; "Failed to create npc of contract type " + contractID);
NPCManager.slotCharacterInBuilding(created);
} }
created.setLoc(created.bindLoc);
created.updateDatabase();
throwbackInfo(pc, "Created NPC with UUID: " + created.getObjectUUID());
} }
@Override @Override

6
src/engine/devcmd/cmds/AuditFailedItemsCmd.java

@ -11,8 +11,6 @@ package engine.devcmd.cmds;
import engine.Enum.ModType; import engine.Enum.ModType;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.NPCManager;
import engine.gameManager.PlayerManager;
import engine.gameManager.PowersManager; import engine.gameManager.PowersManager;
import engine.net.ItemProductionManager; import engine.net.ItemProductionManager;
import engine.objects.*; import engine.objects.*;
@ -48,7 +46,7 @@ public class AuditFailedItemsCmd extends AbstractDevCmd {
String prefix = ""; String prefix = "";
String suffix = ""; String suffix = "";
String itemName = ""; String itemName = "";
NPC npc = NPCManager.getFromCache(failedItem.getNpcUID()); NPC npc = NPC.getFromCache(failedItem.getNpcUID());
if (npc == null) { if (npc == null) {
npcName = "null"; npcName = "null";
@ -59,7 +57,7 @@ public class AuditFailedItemsCmd extends AbstractDevCmd {
contractName = npc.getContract().getName(); contractName = npc.getContract().getName();
} }
PlayerCharacter roller = PlayerManager.getFromCache(failedItem.getPlayerID()); PlayerCharacter roller = PlayerCharacter.getFromCache(failedItem.getPlayerID());
if (roller == null) if (roller == null)
playerName = "null"; playerName = "null";

5
src/engine/devcmd/cmds/DecachePlayerCmd.java

@ -12,7 +12,6 @@ package engine.devcmd.cmds;
import engine.Enum; import engine.Enum;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@ -35,8 +34,8 @@ public class DecachePlayerCmd extends AbstractDevCmd {
int objectUUID = Integer.parseInt(words[0]); int objectUUID = Integer.parseInt(words[0]);
if (DbManager.inCache(Enum.GameObjectType.PlayerCharacter, objectUUID)) { if (DbManager.inCache(Enum.GameObjectType.PlayerCharacter, objectUUID)) {
this.setTarget(PlayerManager.getFromCache(objectUUID)); //for logging this.setTarget(PlayerCharacter.getFromCache(objectUUID)); //for logging
PlayerManager.getFromCache(objectUUID).removeFromCache(); PlayerCharacter.getFromCache(objectUUID).removeFromCache();
} else { } else {
this.sendHelp(pc); this.sendHelp(pc);
} }

63
src/engine/devcmd/cmds/GimmeCmd.java

@ -1,63 +0,0 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.Enum.ItemContainerType;
import engine.Enum.ItemType;
import engine.Enum.OwnerType;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.objects.*;
import engine.powers.EffectsBase;
import java.util.ArrayList;
/**
* @author Eighty
*/
public class GimmeCmd extends AbstractDevCmd {
public GimmeCmd() {
super("gimme");
}
@Override
protected void _doCmd(PlayerCharacter pc, String[] words,
AbstractGameObject target) {
int amt = 0;
int currentGold = pc.getCharItemManager().getGoldInventory().getNumOfItems();
amt = 10000000 - currentGold;
if (!pc.getCharItemManager().addGoldToInventory(amt, true)) {
throwbackError(pc, "Failed to add gold to inventory");
return;
}
ChatManager.chatSayInfo(pc, amt + " gold added to inventory");
if(pc.level < 75) {
pc.setLevel((short) 75);
ChatManager.chatSayInfo(pc, "Level set to 75");
}
pc.getCharItemManager().updateInventory();
}
@Override
protected String _getHelpString() {
return "Round up current gold in inventory to 10,000,000";
}
@Override
protected String _getUsageString() {
return "'./gimme";
}
}

3
src/engine/devcmd/cmds/GotoBoundsCmd.java

@ -11,7 +11,6 @@ package engine.devcmd.cmds;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.PlayerManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.Building; import engine.objects.Building;
@ -90,7 +89,7 @@ public class GotoBoundsCmd extends AbstractDevCmd {
return; return;
} }
PlayerManager.teleport(player, targetLoc); player.teleport(targetLoc);
} }

9
src/engine/devcmd/cmds/GotoCmd.java

@ -12,7 +12,6 @@ package engine.devcmd.cmds;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.*; import engine.objects.*;
@ -36,7 +35,7 @@ public class GotoCmd extends AbstractDevCmd {
if (target != null && words[0].isEmpty()) { if (target != null && words[0].isEmpty()) {
AbstractWorldObject targetAgo = (AbstractWorldObject) target; AbstractWorldObject targetAgo = (AbstractWorldObject) target;
PlayerManager.teleport(pc, targetAgo.getLoc()); pc.teleport(targetAgo.getLoc());
return; return;
} }
@ -51,7 +50,7 @@ public class GotoCmd extends AbstractDevCmd {
} }
if (loc != null) if (loc != null)
PlayerManager.teleport(pc, loc); pc.teleport(loc);
return; return;
} }
@ -62,7 +61,7 @@ public class GotoCmd extends AbstractDevCmd {
} }
if (loc != null) if (loc != null)
PlayerManager.teleport(pc, loc); pc.teleport(loc);
return; return;
} }
@ -165,7 +164,7 @@ public class GotoCmd extends AbstractDevCmd {
} }
} }
if (loc != null) { if (loc != null) {
PlayerManager.teleport(pc, loc); pc.teleport(loc);
} }
} }

3
src/engine/devcmd/cmds/GotoObj.java

@ -12,7 +12,6 @@ package engine.devcmd.cmds;
import engine.Enum; import engine.Enum;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.*; import engine.objects.*;
@ -85,7 +84,7 @@ public class GotoObj extends AbstractDevCmd {
return; return;
} }
PlayerManager.teleport(player, targetLoc); player.teleport(targetLoc);
} }

77
src/engine/devcmd/cmds/HotzoneCmd.java

@ -0,0 +1,77 @@
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.ZoneManager;
import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter;
/**
* ./hotzone <- display the current hotzone & time remaining
* ./hotzone random <- change hotzone to random new zone
*/
public class HotzoneCmd extends AbstractDevCmd {
public HotzoneCmd() {
super("hotzone");
}
@Override
protected void _doCmd(PlayerCharacter playerCharacter, String[] words,
AbstractGameObject target) {
StringBuilder data = new StringBuilder();
String outString;
for (String s : words) {
data.append(s);
data.append(' ');
}
String input = data.toString().trim();
if (input.length() == 0) {
outString = "Current hotZone: " + ZoneManager.hotZone.getName() + "\r\n";
outString += "Available hotZones: " + ZoneManager.availableHotZones();
throwbackInfo(playerCharacter, outString);
return;
}
if (input.equalsIgnoreCase("random")) {
ZoneManager.generateAndSetRandomHotzone();
outString = "New hotZone: " + ZoneManager.hotZone.getName() + "\r\n";
outString += "Available hotZones: " + ZoneManager.availableHotZones();
throwbackInfo(playerCharacter, outString);
return;
}
if (input.equalsIgnoreCase("reset")) {
ZoneManager.resetHotZones();
throwbackInfo(playerCharacter, "Available hotZones: " + ZoneManager.availableHotZones());
return;
}
return;
}
@Override
protected String _getHelpString() {
return "Use no arguments to see the current hotzone or \"random\" to change it randomly.";
}
@Override
protected String _getUsageString() {
return "'./hotzone [random]";
}
}

14
src/engine/devcmd/cmds/InfoCmd.java

@ -15,11 +15,9 @@ import engine.Enum.GameObjectType;
import engine.Enum.TargetColor; import engine.Enum.TargetColor;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.PlayerManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.*; import engine.objects.*;
import engine.server.MBServerStatics;
import engine.util.StringUtils; import engine.util.StringUtils;
import java.text.DecimalFormat; import java.text.DecimalFormat;
@ -336,11 +334,10 @@ public class InfoCmd extends AbstractDevCmd {
output += "Altitude : " + targetPC.getLoc().y; output += "Altitude : " + targetPC.getLoc().y;
output += "Swimming : " + PlayerManager.isSwimming(targetPC); output += "Swimming : " + targetPC.isSwimming();
output += newline; output += newline;
output += "isMoving : " + targetPC.isMoving(); output += "isMoving : " + targetPC.isMoving();
output += newline;
output += "Zerg Multiplier : " + targetPC.ZergMultiplier;
break; break;
case NPC: case NPC:
@ -532,13 +529,6 @@ public class InfoCmd extends AbstractDevCmd {
} }
break; break;
case Corpse:
Corpse corpse = (Corpse)target;
Long timeLeft = MBServerStatics.CORPSE_CLEANUP_TIMER_MS - (System.currentTimeMillis() - corpse.spawnedTime);
output += "Despawn in: " + timeLeft;
output += newline;
break;
} }
throwbackInfo(pc, output); throwbackInfo(pc, output);

5
src/engine/devcmd/cmds/JumpCmd.java

@ -10,7 +10,6 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.PlayerManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@ -37,7 +36,7 @@ public class JumpCmd extends AbstractDevCmd {
try { try {
float range = Float.parseFloat(words[1]); float range = Float.parseFloat(words[1]);
Vector3fImmutable newLoc = pc.getFaceDir().scaleAdd(range, pc.getLoc()); Vector3fImmutable newLoc = pc.getFaceDir().scaleAdd(range, pc.getLoc());
PlayerManager.teleport(pc, newLoc); pc.teleport(newLoc);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
@ -69,7 +68,7 @@ public class JumpCmd extends AbstractDevCmd {
Vector3fImmutable loc = pc.getLoc(); Vector3fImmutable loc = pc.getLoc();
loc = loc.add(lat, 0f, -lon); loc = loc.add(lat, 0f, -lon);
PlayerManager.teleport(pc, loc); pc.teleport(loc);
} }
@Override @Override

9
src/engine/devcmd/cmds/MakeBaneCmd.java

@ -12,7 +12,10 @@ package engine.devcmd.cmds;
import engine.Enum.ProtectionState; import engine.Enum.ProtectionState;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.*; import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector3f; import engine.math.Vector3f;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.*; import engine.objects.*;
@ -71,7 +74,7 @@ public class MakeBaneCmd extends AbstractDevCmd {
return; return;
} }
PlayerCharacter player = PlayerManager.getPlayerCharacter(attackerID); PlayerCharacter player = PlayerCharacter.getPlayerCharacter(attackerID);
if (player.getGuild().isEmptyGuild()) { if (player.getGuild().isEmptyGuild()) {
@ -191,7 +194,7 @@ public class MakeBaneCmd extends AbstractDevCmd {
Vector3fImmutable movePlayerOutsideStone = player.getLoc(); Vector3fImmutable movePlayerOutsideStone = player.getLoc();
movePlayerOutsideStone = movePlayerOutsideStone.setX(movePlayerOutsideStone.x + 10); movePlayerOutsideStone = movePlayerOutsideStone.setX(movePlayerOutsideStone.x + 10);
movePlayerOutsideStone = movePlayerOutsideStone.setZ(movePlayerOutsideStone.z + 10); movePlayerOutsideStone = movePlayerOutsideStone.setZ(movePlayerOutsideStone.z + 10);
PlayerManager.teleport(player, movePlayerOutsideStone); player.teleport(movePlayerOutsideStone);
throwbackInfo(pc, "The city has been succesfully baned."); throwbackInfo(pc, "The city has been succesfully baned.");
} }

5
src/engine/devcmd/cmds/MineActiveCmd.java

@ -16,7 +16,6 @@ import engine.objects.AbstractGameObject;
import engine.objects.Building; import engine.objects.Building;
import engine.objects.Mine; import engine.objects.Mine;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
import engine.workthreads.HalfHourlyJobThread;
import engine.workthreads.HourlyJobThread; import engine.workthreads.HourlyJobThread;
/** /**
@ -42,10 +41,10 @@ public class MineActiveCmd extends AbstractDevCmd {
String trigger = args[0]; String trigger = args[0];
switch (trigger) { switch (trigger) {
case "true": case "true":
HalfHourlyJobThread.mineWindowOpen(mine); HourlyJobThread.mineWindowOpen(mine);
break; break;
case "false": case "false":
HalfHourlyJobThread.mineWindowClose(mine); HourlyJobThread.mineWindowClose(mine);
break; break;
default: default:
this.sendUsage(pcSender); this.sendUsage(pcSender);

5
src/engine/devcmd/cmds/PrintStatsCmd.java

@ -9,7 +9,6 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.Enum;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.objects.*; import engine.objects.*;
@ -73,10 +72,6 @@ public class PrintStatsCmd extends AbstractDevCmd {
out += "Main Hand: atr: " + tar.getAtrHandOne() + ", damage: " + tar.getMinDamageHandOne() + " to " + tar.getMaxDamageHandOne() + ", speed: " + tar.getSpeedHandOne() + newline; out += "Main Hand: atr: " + tar.getAtrHandOne() + ", damage: " + tar.getMinDamageHandOne() + " to " + tar.getMaxDamageHandOne() + ", speed: " + tar.getSpeedHandOne() + newline;
out += "Off Hand: atr: " + tar.getAtrHandTwo() + ", damage: " + tar.getMinDamageHandTwo() + " to " + tar.getMaxDamageHandTwo() + ", speed: " + tar.getSpeedHandTwo() + newline; out += "Off Hand: atr: " + tar.getAtrHandTwo() + ", damage: " + tar.getMinDamageHandTwo() + " to " + tar.getMaxDamageHandTwo() + ", speed: " + tar.getSpeedHandTwo() + newline;
out += "isAlive: " + tar.isAlive() + ", Combat: " + tar.isCombat() + newline; out += "isAlive: " + tar.isAlive() + ", Combat: " + tar.isCombat() + newline;
out += "Move Speed: " + tar.getSpeed() + newline;
out += "Health Regen: " + tar.getRegenModifier(Enum.ModType.HealthRecoverRate) + newline;
out += "Mana Regen: " + tar.getRegenModifier(Enum.ModType.ManaRecoverRate) + newline;
out += "Stamina Regen: " + tar.getRegenModifier(Enum.ModType.StaminaRecoverRate) + newline;
throwbackInfo(pc, out); throwbackInfo(pc, out);
} }

7
src/engine/devcmd/cmds/RemoveObjectCmd.java

@ -14,7 +14,10 @@ import engine.Enum.DbObjectType;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.*; import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.*; import engine.objects.*;
@ -91,7 +94,7 @@ public class RemoveObjectCmd extends AbstractDevCmd {
removeBuilding(player, targetBuilding); removeBuilding(player, targetBuilding);
break; break;
case NPC: case NPC:
targetNPC = NPCManager.getNPC(targetID); targetNPC = NPC.getNPC(targetID);
removeNPC(player, targetNPC); removeNPC(player, targetNPC);
break; break;
case MOB: case MOB:

3
src/engine/devcmd/cmds/ResetLevelCmd.java

@ -1,7 +1,6 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.PlayerManager;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@ -17,7 +16,7 @@ public class ResetLevelCmd extends AbstractDevCmd {
protected void _doCmd(PlayerCharacter player, String[] args, protected void _doCmd(PlayerCharacter player, String[] args,
AbstractGameObject target) { AbstractGameObject target) {
PlayerManager.ResetLevel(player, Short.parseShort(args[0])); player.ResetLevel(Short.parseShort(args[0]));
} }
@Override @Override

5
src/engine/devcmd/cmds/RotateCmd.java

@ -14,7 +14,6 @@ import engine.devcmd.AbstractDevCmd;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.NPCManager;
import engine.math.Vector3f; import engine.math.Vector3f;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.*; import engine.objects.*;
@ -97,7 +96,7 @@ public class RotateCmd extends AbstractDevCmd {
// building failed, try npc // building failed, try npc
NPC npc; NPC npc;
if (id != 0) if (id != 0)
npc = NPCManager.getNPC(id); npc = NPC.getNPC(id);
else else
npc = getTargetAsNPC(pc); npc = getTargetAsNPC(pc);
if (npc != null) { if (npc != null) {
@ -157,7 +156,7 @@ public class RotateCmd extends AbstractDevCmd {
// building failed, try npc // building failed, try npc
NPC npc; NPC npc;
if (id != 0) if (id != 0)
npc = NPCManager.getNPC(id); npc = NPC.getNPC(id);
else else
npc = getTargetAsNPC(pc); npc = getTargetAsNPC(pc);
if (npc != null) { if (npc != null) {

4
src/engine/devcmd/cmds/SetLevelCmd.java

@ -46,7 +46,7 @@ public class SetLevelCmd extends AbstractDevCmd {
this.sendUsage(pc); this.sendUsage(pc);
return; return;
} }
if (level < 1 || level > 80) { if (level < 1 || level > 75) {
this.sendHelp(pc); this.sendHelp(pc);
return; return;
} }
@ -62,7 +62,7 @@ public class SetLevelCmd extends AbstractDevCmd {
@Override @Override
protected String _getHelpString() { protected String _getHelpString() {
return "Sets your character's level to 'amount'. 'amount' must be between 1-80"; return "Sets your character's level to 'amount'. 'amount' must be between 1-75";
} }
@Override @Override

7
src/engine/devcmd/cmds/SetNpcEquipSetCmd.java

@ -12,7 +12,6 @@ package engine.devcmd.cmds;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.NPCManager;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.MobBase; import engine.objects.MobBase;
import engine.objects.NPC; import engine.objects.NPC;
@ -53,7 +52,7 @@ public class SetNpcEquipSetCmd extends AbstractDevCmd {
boolean complete = false; boolean complete = false;
while (complete == false) { while (complete == false) {
complete = NPCManager.UpdateEquipSetID(npc, SetNpcEquipSetCmd.lastEquipSetID); complete = NPC.UpdateEquipSetID(npc, SetNpcEquipSetCmd.lastEquipSetID);
if (!complete) { if (!complete) {
SetNpcEquipSetCmd.lastEquipSetID++; SetNpcEquipSetCmd.lastEquipSetID++;
@ -82,7 +81,7 @@ public class SetNpcEquipSetCmd extends AbstractDevCmd {
boolean complete = false; boolean complete = false;
while (complete == false) { while (complete == false) {
complete = NPCManager.UpdateEquipSetID(npc, SetNpcEquipSetCmd.lastEquipSetID); complete = NPC.UpdateEquipSetID(npc, SetNpcEquipSetCmd.lastEquipSetID);
if (!complete) { if (!complete) {
SetNpcEquipSetCmd.lastEquipSetID--; SetNpcEquipSetCmd.lastEquipSetID--;
@ -110,7 +109,7 @@ public class SetNpcEquipSetCmd extends AbstractDevCmd {
this.throwbackError(pc, e.getMessage()); this.throwbackError(pc, e.getMessage());
} }
if (!NPCManager.UpdateEquipSetID(npc, equipSetID)) { if (!NPC.UpdateEquipSetID(npc, equipSetID)) {
this.throwbackError(pc, "Unable to find Equipset for ID " + equipSetID); this.throwbackError(pc, "Unable to find Equipset for ID " + equipSetID);
return; return;
} }

3
src/engine/devcmd/cmds/SetNpcMobbaseCmd.java

@ -12,7 +12,6 @@ package engine.devcmd.cmds;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.NPCManager;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.MobBase; import engine.objects.MobBase;
import engine.objects.NPC; import engine.objects.NPC;
@ -48,7 +47,7 @@ public class SetNpcMobbaseCmd extends AbstractDevCmd {
this.throwbackError(player, "Cannot find Mobbase for ID " + mobBaseID); this.throwbackError(player, "Cannot find Mobbase for ID " + mobBaseID);
return; return;
} }
NPCManager.UpdateRaceID(npc, mobBaseID); NPC.UpdateRaceID(npc, mobBaseID);
WorldGrid.updateObject(npc); WorldGrid.updateObject(npc);

3
src/engine/devcmd/cmds/SetNpcNameCmd.java

@ -12,7 +12,6 @@ package engine.devcmd.cmds;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.NPCManager;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.NPC; import engine.objects.NPC;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@ -44,7 +43,7 @@ public class SetNpcNameCmd extends AbstractDevCmd {
String name = words[0]; String name = words[0];
NPCManager.UpdateName(npc, name); NPC.UpdateName(npc, name);
WorldGrid.updateObject(npc); WorldGrid.updateObject(npc);

28
src/engine/devcmd/cmds/SimulateBootyCmd.java

@ -10,8 +10,6 @@ import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
public class SimulateBootyCmd extends AbstractDevCmd { public class SimulateBootyCmd extends AbstractDevCmd {
public int simCount = 250;
public SimulateBootyCmd() { public SimulateBootyCmd() {
super("bootysim"); super("bootysim");
} }
@ -27,15 +25,7 @@ public class SimulateBootyCmd extends AbstractDevCmd {
String output; String output;
try output = "Booty Simulation:" + newline;
{
simCount = Integer.parseInt(words[0]);
}catch(Exception e)
{
}
output = "Booty Simulation: Rolls:" + simCount + newline;
Mob mob = (Mob) target; Mob mob = (Mob) target;
output += "Name: " + mob.getName() + newline; output += "Name: " + mob.getName() + newline;
@ -54,7 +44,6 @@ public class SimulateBootyCmd extends AbstractDevCmd {
ArrayList<Item> Resources = new ArrayList<Item>(); ArrayList<Item> Resources = new ArrayList<Item>();
ArrayList<Item> Runes = new ArrayList<Item>(); ArrayList<Item> Runes = new ArrayList<Item>();
ArrayList<Item> Contracts = new ArrayList<Item>(); ArrayList<Item> Contracts = new ArrayList<Item>();
ArrayList<Item> GuardContracts = new ArrayList<Item>();
ArrayList<Item> Offerings = new ArrayList<Item>(); ArrayList<Item> Offerings = new ArrayList<Item>();
ArrayList<Item> OtherDrops = new ArrayList<Item>(); ArrayList<Item> OtherDrops = new ArrayList<Item>();
ArrayList<Item> EquipmentDrops = new ArrayList<Item>(); ArrayList<Item> EquipmentDrops = new ArrayList<Item>();
@ -62,17 +51,14 @@ public class SimulateBootyCmd extends AbstractDevCmd {
int failures = 0; int failures = 0;
int goldAmount = 0; int goldAmount = 0;
for (int i = 0; i < simCount; ++i) { for (int i = 0; i < 100; ++i) {
try { try {
mob.loadInventory(); mob.loadInventory();
for (Item lootItem : mob.getCharItemManager().getInventory()) { for (Item lootItem : mob.getCharItemManager().getInventory()) {
switch (lootItem.getItemBase().getType()) { switch (lootItem.getItemBase().getType()) {
case CONTRACT: //CONTRACT case CONTRACT: //CONTRACT
if(lootItem.getName().contains("Captain")) Contracts.add(lootItem);
GuardContracts.add(lootItem);
else
Contracts.add(lootItem);
break; break;
case OFFERING: //OFFERING case OFFERING: //OFFERING
Offerings.add(lootItem); Offerings.add(lootItem);
@ -144,17 +130,9 @@ public class SimulateBootyCmd extends AbstractDevCmd {
} }
} }
int baseBound = 100000;
int levelPenalty = (int) (Math.max(0, Math.abs(50 - mob.level)) * 0.01 * 100000);
int totalRange = baseBound + levelPenalty;
if(mob.level >= 50){
totalRange = baseBound;
}
output += "TOTAL ROLL POTENTIAL: " + totalRange + newline;
output += "GLASS DROPS: " + GlassItems.size() + newline; output += "GLASS DROPS: " + GlassItems.size() + newline;
output += "RUNE DROPS: " + Runes.size() + newline; output += "RUNE DROPS: " + Runes.size() + newline;
output += "CONTRACTS DROPS: " + Contracts.size() + newline; output += "CONTRACTS DROPS: " + Contracts.size() + newline;
output += "GUARD CONTRACTS DROPS: " + GuardContracts.size() + newline;
output += "RESOURCE DROPS: " + Resources.size() + newline; output += "RESOURCE DROPS: " + Resources.size() + newline;
output += "OFFERINGS DROPPED: " + Offerings.size() + newline; output += "OFFERINGS DROPPED: " + Offerings.size() + newline;
output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline; output += "ENCHANTED ITEMS DROPPED: " + OtherDrops.size() + newline;

3
src/engine/devcmd/cmds/SlotTestCmd.java

@ -13,7 +13,6 @@ import engine.Enum.GameObjectType;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.PlayerManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.objects.*; import engine.objects.*;
@ -57,7 +56,7 @@ public class SlotTestCmd extends AbstractDevCmd {
BuildingLocation buildingLocation = BuildingManager._slotLocations.get(building.meshUUID).get(slot - 1); BuildingLocation buildingLocation = BuildingManager._slotLocations.get(building.meshUUID).get(slot - 1);
slotLocation = building.getLoc().add(buildingLocation.getLocation()); slotLocation = building.getLoc().add(buildingLocation.getLocation());
slotLocation = Vector3fImmutable.rotateAroundPoint(building.getLoc(), slotLocation, building.getBounds().getQuaternion().angleY); slotLocation = Vector3fImmutable.rotateAroundPoint(building.getLoc(), slotLocation, building.getBounds().getQuaternion().angleY);
PlayerManager.teleport(playerCharacter, slotLocation); playerCharacter.teleport(slotLocation);
return; return;
} }

3
src/engine/devcmd/cmds/SummonCmd.java

@ -10,7 +10,6 @@
package engine.devcmd.cmds; package engine.devcmd.cmds;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.PlayerManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.gameManager.ZoneManager; import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
@ -92,7 +91,7 @@ public class SummonCmd extends AbstractDevCmd {
this.setTarget(pcToSummon); //for logging this.setTarget(pcToSummon); //for logging
Vector3fImmutable loc = pc.getLoc(); Vector3fImmutable loc = pc.getLoc();
PlayerManager.teleport(pcToSummon, loc); pcToSummon.teleport(loc);
this.throwbackInfo(pc, "Player " + pcToSummon.getCombinedName() this.throwbackInfo(pc, "Player " + pcToSummon.getCombinedName()
+ " has been summoned to your location."); + " has been summoned to your location.");

3
src/engine/devcmd/cmds/aiInfoCmd.java

@ -11,7 +11,6 @@ package engine.devcmd.cmds;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.devcmd.AbstractDevCmd; import engine.devcmd.AbstractDevCmd;
import engine.gameManager.PlayerManager;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.Mob; import engine.objects.Mob;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@ -78,7 +77,7 @@ public class aiInfoCmd extends AbstractDevCmd {
output += "Players Loaded:" + newline; output += "Players Loaded:" + newline;
} }
for (Map.Entry<Integer, Boolean> entry : mob.playerAgroMap.entrySet()) { for (Map.Entry<Integer, Boolean> entry : mob.playerAgroMap.entrySet()) {
output += "Player ID: " + entry.getKey() + " Hate Value: " + (PlayerManager.getPlayerCharacter(entry.getKey())).getHateValue() + newline; output += "Player ID: " + entry.getKey() + " Hate Value: " + (PlayerCharacter.getPlayerCharacter(entry.getKey())).getHateValue() + newline;
} }
if (mob.getCombatTarget() != null) if (mob.getCombatTarget() != null)
output += "Current Target: " + mob.getCombatTarget().getName() + newline; output += "Current Target: " + mob.getCombatTarget().getName() + newline;

168
src/engine/gameManager/ArenaManager.java

@ -1,168 +0,0 @@
package engine.gameManager;
import engine.Enum;
import engine.InterestManagement.WorldGrid;
import engine.exception.MsgSendException;
import engine.math.Vector3f;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
public class ArenaManager {
private static final List<Arena> activeArenas = new ArrayList<>();
public static final List<PlayerCharacter> playerQueue = new ArrayList<>();
public static Long pulseDelay = 180000L;
public static Long lastExecution = 0L;
public static void pulseArenas() {
if(lastExecution == 0L){
lastExecution = System.currentTimeMillis();
}
if(activeArenas.isEmpty() && playerQueue.isEmpty())
return;
Iterator<Arena> iterator = activeArenas.iterator();
while (iterator.hasNext()) {
Arena arena = iterator.next();
if (arena.checkToComplete()) {
iterator.remove();
}
}
if(lastExecution + pulseDelay > System.currentTimeMillis())
return;
lastExecution = System.currentTimeMillis();
while (playerQueue.size() > 1) {
createArena();
}
}
public static void joinQueue(PlayerCharacter player) {
if (!playerQueue.contains(player)) {
playerQueue.add(player);
}
for(PlayerCharacter pc : playerQueue){
if(pc.equals(player))
continue;
ChatManager.chatSystemInfo(pc, player.getName() + " has joined the arena que. There are now " + playerQueue.size() + " players queued.");
}
}
public static void leaveQueue(PlayerCharacter player) {
playerQueue.remove(player);
for(PlayerCharacter pc : playerQueue){
if(pc.equals(player))
continue;
ChatManager.chatSystemInfo(pc, player.getName() + " has left the arena que. There are now " + playerQueue.size() + " players queued.");
}
}
private static void createArena() {
if (playerQueue.size() > 1) {
Collections.shuffle(playerQueue);
Arena newArena = new Arena();
//set starting time
newArena.startTime = System.currentTimeMillis();
//decide an arena location
newArena.loc = selectRandomArenaLocation();
// Assign players to the arena
newArena.player1 = playerQueue.remove(0);
newArena.player2 = playerQueue.remove(0);
// Teleport players to the arena location
Zone sdr = ZoneManager.getZoneByUUID(656);
MovementManager.translocate(newArena.player1, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null);
MovementManager.translocate(newArena.player2, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null);
// Add the new arena to the active arenas list
activeArenas.add(newArena);
}
}
public static void endArena(Arena arena, PlayerCharacter winner, PlayerCharacter loser, String condition){
if (winner != null && loser != null) {
Logger.info("[ARENA] The fight between {} and {} is concluded. Victor: {}",
arena.player1.getName(), arena.player2.getName(), winner.getName());
} else {
Logger.info("[ARENA] The fight between {} and {} is concluded. No Winner Declared.",
arena.player1.getName(), arena.player2.getName());
}
// Teleport players to the arena location
Zone sdr = ZoneManager.getZoneByUUID(656);
MovementManager.translocate(arena.player1, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null);
MovementManager.translocate(arena.player2, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null);
activeArenas.remove(arena);
if(winner != null){
ChatManager.chatPVP("[ARENA] " + winner.getName() + " has slain " + loser.getName() + " in the arena!");
//handle prize distribution
//ItemBase specialLoot = ItemBase.getItemBase(866);
//Item promoted = new MobLoot(winner, specialLoot, 1, false).promoteToItem(winner);
//promoted.setNumOfItems(21235);
//promoted.setName("Special Banker(21235)");
//DbManager.ItemQueries.UPDATE_NUM_ITEMS(promoted,21235);
//winner.getCharItemManager().addItemToInventory(promoted);
//winner.getCharItemManager().updateInventory();
}
}
public static Vector3fImmutable selectRandomArenaLocation() {
boolean locSet = false;
Vector3fImmutable loc = Vector3fImmutable.ZERO;
while (!locSet) {
try {
float x = ThreadLocalRandom.current().nextInt(114300, 123600);
float z = ThreadLocalRandom.current().nextInt(82675, 91700);
float y = 0; // Y coordinate is always 0
loc = new Vector3fImmutable(x, y, z * -1);
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(loc,500f, MBServerStatics.MASK_PLAYER);
if(inRange.isEmpty() && !isUnderWater(loc))
locSet = true;
//}
}catch(Exception e){
}
}
return loc;
}
public static boolean isUnderWater(Vector3fImmutable loc) {
try {
Zone zone = ZoneManager.findSmallestZone(loc);
if (zone.getSeaLevel() != 0) {
float localAltitude = loc.y;
if (localAltitude < zone.getSeaLevel())
return true;
} else {
if (loc.y < 0)
return true;
}
} catch (Exception e) {
}
return false;
}
}

47
src/engine/gameManager/BuildingManager.java

@ -438,18 +438,6 @@ public enum BuildingManager {
public static boolean IsPlayerHostile(Building building, PlayerCharacter player) { public static boolean IsPlayerHostile(Building building, PlayerCharacter player) {
if(building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.BANESTONE))
{
Guild playerNation = player.guild.getNation();
City banedCity = ZoneManager.getCityAtLocation(building.loc);
if(banedCity != null){
if(banedCity.getGuild().getNation().equals(playerNation)){
return false;
}else{
return true;
}
}
}
//Nation Members and Guild members are not hostile. //Nation Members and Guild members are not hostile.
// if (building.getGuild() != null){ // if (building.getGuild() != null){
// if (pc.getGuild() != null) // if (pc.getGuild() != null)
@ -513,7 +501,7 @@ public enum BuildingManager {
NPC npc = null; NPC npc = null;
npc = NPCManager.createNPC(pirateName, NpcID.getObjectUUID(), NpcLoc, null, zone, (short) rank, building); npc = NPC.createNPC(pirateName, NpcID.getObjectUUID(), NpcLoc, null, zone, (short) rank, building);
if (npc == null) if (npc == null)
return false; return false;
@ -532,30 +520,7 @@ public enum BuildingManager {
if (building.getBlueprintUUID() == 0) if (building.getBlueprintUUID() == 0)
return false; return false;
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.TOL)){ if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
if(contract.getContractID() == 850) {
boolean hasRunemaster = false;
for (AbstractCharacter npc : building.getHirelings().keySet()) {
if (npc.getObjectType() != GameObjectType.NPC)
continue;
if(npc.contractUUID == 850)
hasRunemaster = true;
}
if(hasRunemaster)
return false;
}
}
int maxSlots = building.getBlueprint().getMaxSlots();
if(building.getBlueprint().getBuildingGroup() != null) {
maxSlots = building.getBlueprint().getSlotsForRank(building.getRank());
}
if (maxSlots == building.getHirelings().size())
return false; return false;
String pirateName = NPCManager.getPirateName(contract.getMobbaseID()); String pirateName = NPCManager.getPirateName(contract.getMobbaseID());
@ -568,7 +533,7 @@ public enum BuildingManager {
Mob mob; Mob mob;
NPC npc; NPC npc;
if (NPCManager.ISWallArcher(contract)) { if (NPC.ISWallArcher(contract)) {
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank); mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
@ -580,7 +545,7 @@ public enum BuildingManager {
return true; return true;
} }
if (NPCManager.ISGuardCaptain(contract.getContractID())) { if (NPC.ISGuardCaptain(contract.getContractID())) {
mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank); mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
@ -604,7 +569,7 @@ public enum BuildingManager {
return true; return true;
} }
npc = NPCManager.createNPC(pirateName, contract.getObjectUUID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, (short) rank, building); npc = NPC.createNPC(pirateName, contract.getObjectUUID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), zone, (short) rank, building);
if (npc == null) if (npc == null)
return false; return false;
@ -810,7 +775,7 @@ public enum BuildingManager {
} }
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(); ManageCityAssetsMsg mca = new ManageCityAssetsMsg();
mca.actionType = NPCManager.SVR_CLOSE_WINDOW; mca.actionType = NPC.SVR_CLOSE_WINDOW;
mca.setTargetType(building.getObjectType().ordinal()); mca.setTargetType(building.getObjectType().ordinal());
mca.setTargetID(building.getObjectUUID()); mca.setTargetID(building.getObjectUUID());
origin.sendMsg(mca); origin.sendMsg(mca);

56
src/engine/gameManager/CombatManager.java

@ -65,7 +65,7 @@ public enum CombatManager {
targetType = msg.getTargetType(); targetType = msg.getTargetType();
if (targetType == GameObjectType.PlayerCharacter.ordinal()) { if (targetType == GameObjectType.PlayerCharacter.ordinal()) {
target = PlayerManager.getFromCache(msg.getTargetID()); target = PlayerCharacter.getFromCache(msg.getTargetID());
} else if (targetType == GameObjectType.Building.ordinal()) { } else if (targetType == GameObjectType.Building.ordinal()) {
target = BuildingManager.getBuildingFromCache(msg.getTargetID()); target = BuildingManager.getBuildingFromCache(msg.getTargetID());
} else if (targetType == GameObjectType.Mob.ordinal()) { } else if (targetType == GameObjectType.Mob.ordinal()) {
@ -171,7 +171,7 @@ public enum CombatManager {
targetType = msg.getTargetType(); targetType = msg.getTargetType();
if (targetType == GameObjectType.PlayerCharacter.ordinal()) if (targetType == GameObjectType.PlayerCharacter.ordinal())
target = PlayerManager.getFromCache(msg.getTargetID()); target = PlayerCharacter.getFromCache(msg.getTargetID());
else if (targetType == GameObjectType.Building.ordinal()) else if (targetType == GameObjectType.Building.ordinal())
target = BuildingManager.getBuildingFromCache(msg.getTargetID()); target = BuildingManager.getBuildingFromCache(msg.getTargetID());
else if (targetType == GameObjectType.Mob.ordinal()) else if (targetType == GameObjectType.Mob.ordinal())
@ -646,25 +646,24 @@ public enum CombatManager {
//Get hit chance //Get hit chance
//int chance; int chance;
float dif = atr - defense; float dif = atr - defense;
//if (dif > 100) if (dif > 100)
// chance = 94; chance = 94;
//else if (dif < -100) else if (dif < -100)
// chance = 4; chance = 4;
//else else
// chance = (int) ((0.45 * dif) + 49); chance = (int) ((0.45 * dif) + 49);
errorTrack = 5; errorTrack = 5;
//calculate hit/miss //calculate hit/miss
int roll = ThreadLocalRandom.current().nextInt(100);
DeferredPowerJob dpj = null; DeferredPowerJob dpj = null;
if (roll < chance) {
if (LandHit((int)atr,(int)defense)) {
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter)) if (ac.getObjectType().equals(GameObjectType.PlayerCharacter))
updateAttackTimers((PlayerCharacter) ac, target, true); updateAttackTimers((PlayerCharacter) ac, target, true);
@ -1055,10 +1054,6 @@ public enum CombatManager {
if (eff.getPower() != null && (eff.getPower().getToken() == 429506943 || eff.getPower().getToken() == 429408639 || eff.getPower().getToken() == 429513599 || eff.getPower().getToken() == 429415295)) if (eff.getPower() != null && (eff.getPower().getToken() == 429506943 || eff.getPower().getToken() == 429408639 || eff.getPower().getToken() == 429513599 || eff.getPower().getToken() == 429415295))
swingAnimation = 0; swingAnimation = 0;
if(source != null && source.getObjectType().equals(GameObjectType.PlayerCharacter)){
damage *= ((PlayerCharacter)source).ZergMultiplier;
} // Health modifications are modified by the ZergMechanic
TargetedActionMsg cmm = new TargetedActionMsg(source, target, damage, swingAnimation); TargetedActionMsg cmm = new TargetedActionMsg(source, target, damage, swingAnimation);
DispatchMessage.sendToAllInRange(target, cmm); DispatchMessage.sendToAllInRange(target, cmm);
} }
@ -1242,17 +1237,14 @@ public enum CombatManager {
DispatchMessage.dispatchMsgToInterestArea(pc, rwss, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false); DispatchMessage.dispatchMsgToInterestArea(pc, rwss, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
} }
public static void toggleSit(boolean toggle, ClientConnection origin) { private static void toggleSit(boolean toggle, ClientConnection origin) {
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin); PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
if (pc == null) if (pc == null)
return; return;
if(PlayerManager.isFlying(pc)) pc.setSit(toggle);
pc.setSit(false);
else
pc.setSit(toggle);
UpdateStateMsg rwss = new UpdateStateMsg(); UpdateStateMsg rwss = new UpdateStateMsg();
rwss.setPlayer(pc); rwss.setPlayer(pc);
@ -1330,13 +1322,6 @@ public enum CombatManager {
return; return;
retaliater.setCombatTarget(ac); retaliater.setCombatTarget(ac);
if(retaliater.isPlayerGuard && (retaliater.BehaviourType.equals(MobBehaviourType.GuardMinion) || retaliater.BehaviourType.equals(MobBehaviourType.GuardCaptain))){
for(Mob guard : retaliater.guardedCity.getParent().zoneMobSet){
if(guard.isPlayerGuard && guard.combatTarget == null){
guard.setCombatTarget(ac);
}
}
}
} }
} }
@ -1453,19 +1438,4 @@ public enum CombatManager {
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1); ((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
} }
public static boolean LandHit(int atr, int defense){
int roll = ThreadLocalRandom.current().nextInt(101);
float chance = (float)((atr-((atr+defense)*0.315))/((defense-((atr+defense)*0.315))+(atr-((atr+defense)*0.315))));
int connvertedChance = (int)(chance * 100);
if(connvertedChance < 5)
connvertedChance = 5;
if(connvertedChance > 95)
connvertedChance = 95;
return connvertedChance > roll;
}
} }

1
src/engine/gameManager/ConfigManager.java

@ -65,7 +65,6 @@ public enum ConfigManager {
MB_WORLD_MAINTENANCE, MB_WORLD_MAINTENANCE,
MB_WORLD_GREETING, MB_WORLD_GREETING,
MB_WORLD_KEYCLONE_MAX, MB_WORLD_KEYCLONE_MAX,
MB_WORLD_TESTMODE,
MB_USE_RUINS, MB_USE_RUINS,
// Mobile AI modifiers // Mobile AI modifiers

4
src/engine/gameManager/DbManager.java

@ -85,10 +85,10 @@ public enum DbManager {
switch (objectType) { switch (objectType) {
case PlayerCharacter: case PlayerCharacter:
outObject = PlayerManager.getPlayerCharacter(objectUUID); outObject = PlayerCharacter.getPlayerCharacter(objectUUID);
break; break;
case NPC: case NPC:
outObject = NPCManager.getNPC(objectUUID); outObject = NPC.getNPC(objectUUID);
break; break;
case Mob: case Mob:
outObject = Mob.getFromCache(objectUUID); outObject = Mob.getFromCache(objectUUID);

21
src/engine/gameManager/DevCmdManager.java

@ -79,6 +79,7 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new AddGoldCmd()); DevCmdManager.registerDevCmd(new AddGoldCmd());
DevCmdManager.registerDevCmd(new ZoneInfoCmd()); DevCmdManager.registerDevCmd(new ZoneInfoCmd());
DevCmdManager.registerDevCmd(new DebugMeleeSyncCmd()); DevCmdManager.registerDevCmd(new DebugMeleeSyncCmd());
DevCmdManager.registerDevCmd(new HotzoneCmd());
DevCmdManager.registerDevCmd(new MineActiveCmd()); DevCmdManager.registerDevCmd(new MineActiveCmd());
// Dev // Dev
DevCmdManager.registerDevCmd(new ApplyStatModCmd()); DevCmdManager.registerDevCmd(new ApplyStatModCmd());
@ -102,7 +103,6 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new SetAdminRuneCmd()); DevCmdManager.registerDevCmd(new SetAdminRuneCmd());
DevCmdManager.registerDevCmd(new SetInvulCmd()); DevCmdManager.registerDevCmd(new SetInvulCmd());
DevCmdManager.registerDevCmd(new MakeItemCmd()); DevCmdManager.registerDevCmd(new MakeItemCmd());
DevCmdManager.registerDevCmd(new GimmeCmd());
DevCmdManager.registerDevCmd(new EnchantCmd()); DevCmdManager.registerDevCmd(new EnchantCmd());
DevCmdManager.registerDevCmd(new SetSubRaceCmd()); DevCmdManager.registerDevCmd(new SetSubRaceCmd());
// Admin // Admin
@ -179,23 +179,8 @@ public enum DevCmdManager {
//kill any commands not available to everyone on production server //kill any commands not available to everyone on production server
//only admin level can run dev commands on production //only admin level can run dev commands on production
boolean playerAllowed = false;
if(ConfigManager.MB_WORLD_TESTMODE.getValue().equals("true")) { if (a.status.equals(Enum.AccountStatus.ADMIN) == false) {
switch (adc.getMainCmdString()) {
case "printresists":
case "printstats":
case "printskills":
case "printpowers":
case "gimme":
case "goto":
case "teleportmode":
playerAllowed = true;
if (!a.status.equals(Enum.AccountStatus.ADMIN))
target = pcSender;
break;
}
}
if (!playerAllowed && !a.status.equals(Enum.AccountStatus.ADMIN)) {
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd); Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
return false; return false;
} }

10
src/engine/gameManager/GuildManager.java

@ -74,16 +74,16 @@ public enum GuildManager {
} }
} }
PlayerManager.setInnerCouncil(playerCharacter, false); playerCharacter.setInnerCouncil(false);
PlayerManager.setGuildLeader(playerCharacter, false); playerCharacter.setGuildLeader(false);
playerCharacter.setGuild(guild); playerCharacter.setGuild(guild);
// Cleanup guild stuff // Cleanup guild stuff
PlayerManager.resetGuildStatuses(playerCharacter); playerCharacter.resetGuildStatuses();
// send success message to client // send success message to client
if (fromTeleportScreen && guild.isNPCGuild()) if (fromTeleportScreen && guild.isNPCGuild())
PlayerManager.setFullMember(playerCharacter, true); playerCharacter.setFullMember(true);
msg = new AcceptInviteToGuildMsg(guild.getObjectUUID(), 1, 0); msg = new AcceptInviteToGuildMsg(guild.getObjectUUID(), 1, 0);
@ -178,7 +178,7 @@ public enum GuildManager {
bindBuilding = city.getTOL(); bindBuilding = city.getTOL();
if (bindBuilding == null) if (bindBuilding == null)
bindBuilding = PlayerManager.getBindBuildingForGuild(playerCharacter); bindBuilding = PlayerCharacter.getBindBuildingForGuild(playerCharacter);
playerCharacter.setBindBuildingID(bindBuilding != null ? bindBuilding.getObjectUUID() : 0); playerCharacter.setBindBuildingID(bindBuilding != null ? bindBuilding.getObjectUUID() : 0);
} }

656
src/engine/gameManager/LootManager.java

@ -17,9 +17,7 @@ import engine.objects.*;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
/** /**
@ -36,12 +34,6 @@ public enum LootManager {
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>(); public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = new HashMap<>();
public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>(); public static HashMap<Integer, ArrayList<ModTypeTableEntry>> _modTypeTables = new HashMap<>();
public static final ArrayList<Integer> vorg_ha_uuids = new ArrayList<>(Arrays.asList(27580, 27590, 188500, 188510, 188520, 188530, 188540, 188550, 189510));
public static final ArrayList<Integer> vorg_ma_uuids = new ArrayList<>(Arrays.asList(27570,188900,188910,188920,188930,188940,188950,189500));
public static final ArrayList<Integer> vorg_la_uuids = new ArrayList<>(Arrays.asList(27550,27560,189100,189110,189120,189130,189140,189150));
public static final ArrayList<Integer> vorg_cloth_uuids = new ArrayList<>(Arrays.asList(27600,188700,188720,189550,189560));
public static final ArrayList<Integer> racial_guard_uuids = new ArrayList<>(Arrays.asList(841,951,952,1050,1052,1180,1182,1250,1252,1350,1352,1450,1452,1500,1502,1525,1527,1550,1552,1575,1577,1600,1602,1650,1652,1700,980100,980102));
// Drop Rates // Drop Rates
public static float NORMAL_DROP_RATE; public static float NORMAL_DROP_RATE;
@ -75,111 +67,41 @@ public enum LootManager {
} }
public static void GenerateMobLoot(Mob mob) { public static void GenerateMobLoot(Mob mob) {
//determine if mob is in hotzone //determine if mob is in hotzone
boolean inHotzone = false; boolean inHotzone = ZoneManager.inHotZone(mob.getLoc());
//iterate the booty sets //iterate the booty sets
if(mob.mobBase == null || mob.getMobBaseID() == 253003){ if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet) == true)
int i = 0;
}
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet))
RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob, inHotzone); RunBootySet(_bootySetMap.get(mob.getMobBase().bootySet), mob, inHotzone);
if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet)) { if (mob.bootySet != 0 && _bootySetMap.containsKey(mob.bootySet) == true)
RunBootySet(_bootySetMap.get(mob.bootySet), mob, inHotzone); RunBootySet(_bootySetMap.get(mob.bootySet), mob, inHotzone);
}else if(mob.bootySet != 0 && ItemBase.getItemBase(mob.bootySet) != null){
MobLoot specialDrop = null;
specialDrop = new MobLoot(mob,ItemBase.getItemBase(mob.bootySet),true);
if(specialDrop != null) {
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + specialDrop.getName() + ". Are you tough enough to take it?");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg);
mob.getCharItemManager().addItemToInventory(specialDrop);
mob.setResists(new Resists("Dropper"));
if(!Mob.discDroppers.contains(mob))
Mob.AddDiscDropper(mob);
}
}
//lastly, check mobs inventory for godly or disc runes to send a server announcement //lastly, check mobs inventory for godly or disc runes to send a server announcement
for (Item it : mob.getInventory()) { for (Item it : mob.getInventory()) {
ItemBase ib = it.getItemBase(); ItemBase ib = it.getItemBase();
if (ib == null) if(ib == null)
break; break;
if (ib.isDiscRune() || ib.getName().toLowerCase().contains("of the gods")) { if (ib.isDiscRune() || ib.getName().toLowerCase().contains("of the gods")) {
ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?"); ChatSystemMsg chatMsg = new ChatSystemMsg(null, mob.getName() + " in " + mob.getParentZone().getName() + " has found the " + ib.getName() + ". Are you tough enough to take it?");
chatMsg.setMessageType(10); chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID()); chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg); DispatchMessage.dispatchMsgToAll(chatMsg);
}
} }
}
} }
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob, boolean inHotzone) { private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob, boolean inHotzone) {
boolean hotzoneWasRan = false; boolean hotzoneWasRan = false;
float dropRate; float dropRate = 1.0f;
if (!mob.getSafeZone()) {
int contractLow = 1, contractHigh = 400;
int runeLow = 401, runeHigh = 800;
int resourceLow = 801, resourceHigh = 900;
int glassLow = 901, glassHigh = 910;
int guardLow = 911, guardHigh = 920;
// Pre-compute adjusted high values
int contractAdjust = 0, runeAdjust = 0, resourceAdjust = 0, glassAdjust = 0, guardAdjust = 0;
if (mob.level < 50) {
int dif = 50 - mob.level;
contractAdjust = (int)(400 * (dif * 0.02f));
runeAdjust = (int)(400 * (dif * 0.02f));
resourceAdjust = (int)(100 * (dif * 0.02f));
glassAdjust = (int)(10 * (dif * 0.02f));
guardAdjust = (int)(10 * (dif * 0.02f));
}
// Generate a single random roll
int specialCaseRoll = ThreadLocalRandom.current().nextInt(1, 100001);
// Calculate adjusted high values once
int contractHighAdjusted = contractHigh - contractAdjust;
int runeHighAdjusted = runeHigh - runeAdjust;
int resourceHighAdjusted = resourceHigh - resourceAdjust;
int glassHighAdjusted = glassHigh - glassAdjust;
int guardHighAdjusted = guardHigh - guardAdjust;
// Check the roll range and handle accordingly
if (specialCaseRoll >= contractLow && specialCaseRoll <= contractHighAdjusted) {
SpecialCaseContractDrop(mob, entries);
} else if (specialCaseRoll >= runeLow && specialCaseRoll <= runeHighAdjusted) {
SpecialCaseRuneDrop(mob, entries);
} else if (specialCaseRoll >= resourceLow && specialCaseRoll <= resourceHighAdjusted) {
SpecialCaseResourceDrop(mob, entries);
} else if (specialCaseRoll >= glassLow && specialCaseRoll <= glassHighAdjusted) {
int glassID = rollRandomItem(126);
ItemBase glassItem = ItemBase.getItemBase(glassID);
if (glassItem != null) {
MobLoot toAddGlass = new MobLoot(mob, glassItem, false);
mob.getCharItemManager().addItemToInventory(toAddGlass);
}
} else if (specialCaseRoll >= guardLow && specialCaseRoll <= guardHighAdjusted) {
int guardContractID = racial_guard_uuids.get(new java.util.Random().nextInt(racial_guard_uuids.size()));
ItemBase guardContract = ItemBase.getItemBase(guardContractID);
if (guardContract != null) {
MobLoot toAddContract = new MobLoot(mob, guardContract, false);
mob.getCharItemManager().addItemToInventory(toAddContract);
}
}
}
// Iterate all entries in this bootySet and process accordingly // Iterate all entries in this bootySet and process accordingly
for (BootySetEntry bse : entries) { for (BootySetEntry bse : entries) {
switch (bse.bootyType) { switch (bse.bootyType) {
case "GOLD": case "GOLD":
@ -187,10 +109,8 @@ public enum LootManager {
break; break;
case "LOOT": case "LOOT":
if (mob.getSafeZone()) if (mob.getSafeZone() == false)
return; // no loot to drop in safezones dropRate = LootManager.NORMAL_DROP_RATE;
dropRate = LootManager.NORMAL_DROP_RATE;
if (inHotzone == true) if (inHotzone == true)
dropRate = LootManager.HOTZONE_DROP_RATE; dropRate = LootManager.HOTZONE_DROP_RATE;
@ -215,109 +135,6 @@ public enum LootManager {
} }
} }
public static void SpecialCaseContractDrop(Mob mob,ArrayList<BootySetEntry> entries){
int lootTableID = 0;
for(BootySetEntry entry : entries){
if(entry.bootyType.equals("LOOT")){
lootTableID = entry.genTable;
break;
}
}
if(lootTableID == 0)
return;
int ContractTableID = 0;
for(GenTableEntry entry : _genTables.get(lootTableID)){
try {
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.CONTRACT)) {
ContractTableID = entry.itemTableID;
break;
}
}catch(Exception e){
}
}
if(ContractTableID == 0)
return;
ItemBase ib = ItemBase.getItemBase(rollRandomItem(ContractTableID));
if(ib != null){
MobLoot toAdd = new MobLoot(mob,ib,false);
mob.getCharItemManager().addItemToInventory(toAdd);
}
}
public static void SpecialCaseRuneDrop(Mob mob,ArrayList<BootySetEntry> entries){
int lootTableID = 0;
for(BootySetEntry entry : entries){
if(entry.bootyType.equals("LOOT")){
lootTableID = entry.genTable;
break;
}
}
if(lootTableID == 0)
return;
int RuneTableID = 0;
for(GenTableEntry entry : _genTables.get(lootTableID)){
try {
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.RUNE)) {
RuneTableID = entry.itemTableID;
break;
}
}catch(Exception e){
}
}
if(RuneTableID == 0)
return;
ItemBase ib = ItemBase.getItemBase(rollRandomItem(RuneTableID));
if(ib != null){
MobLoot toAdd = new MobLoot(mob,ib,false);
mob.getCharItemManager().addItemToInventory(toAdd);
}
}
public static void SpecialCaseResourceDrop(Mob mob,ArrayList<BootySetEntry> entries){
int lootTableID = 0;
for(BootySetEntry entry : entries){
if(entry.bootyType.equals("LOOT")){
lootTableID = entry.genTable;
break;
}
}
if(lootTableID == 0)
return;
int ResourceTableID = 0;
for(GenTableEntry entry : _genTables.get(lootTableID)){
try {
if (ItemBase.getItemBase(_itemTables.get(entry.itemTableID).get(0).cacheID).getType().equals(Enum.ItemType.RESOURCE)) {
ResourceTableID = entry.itemTableID;
break;
}
}catch(Exception e){
}
}
if(ResourceTableID == 0)
return;
ItemBase ib = ItemBase.getItemBase(rollRandomItem(ResourceTableID));
if(ib != null){
MobLoot toAdd = new MobLoot(mob,ib,false);
mob.getCharItemManager().addItemToInventory(toAdd);
}
}
public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob, Boolean inHotzone) { public static MobLoot getGenTableItem(int genTableID, AbstractCharacter mob, Boolean inHotzone) {
if (mob == null || _genTables.containsKey(genTableID) == false) if (mob == null || _genTables.containsKey(genTableID) == false)
@ -339,10 +156,11 @@ public enum LootManager {
//gets the 1-320 roll for this mob //gets the 1-320 roll for this mob
int itemTableRoll = 0; int itemTableRoll = 0;
int objectType = mob.getObjectType().ordinal();
if(mob.getObjectType().ordinal() == 52) { //52 = player character if(mob.getObjectType().ordinal() == 52) { //52 = player character
itemTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1); itemTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
} else{ } else{
itemTableRoll = TableRoll(mob.level); itemTableRoll = TableRoll(mob.level, inHotzone);
} }
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, itemTableRoll); ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, itemTableRoll);
if (tableRow == null) if (tableRow == null)
@ -354,23 +172,13 @@ public enum LootManager {
return null; return null;
if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) { if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
if(ThreadLocalRandom.current().nextInt(1,101) < 91)
return null; // cut down world drops rates of resources by 90%
int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1); int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1);
return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false); return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
} }
if(ItemBase.getItemBase(itemUUID).getType().equals(Enum.ItemType.RUNE)){
int randomRune = rollRandomItem(itemTableId);
if(randomRune != 0) {
itemUUID = randomRune;
}
} else if(ItemBase.getItemBase(itemUUID).getType().equals(Enum.ItemType.CONTRACT)){
int randomContract = rollRandomItem(itemTableId);
if(randomContract != 0) {
itemUUID = randomContract;
}
}
outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false); outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
Enum.ItemType outType = outItem.getItemBase().getType();
if(selectedRow.pModTable != 0){ if(selectedRow.pModTable != 0){
try { try {
@ -388,12 +196,6 @@ public enum LootManager {
Logger.error("Failed to GenerateSuffix for item: " + outItem.getName()); Logger.error("Failed to GenerateSuffix for item: " + outItem.getName());
} }
} }
if(outItem.getItemBase().getType().equals(Enum.ItemType.CONTRACT) || outItem.getItemBase().getType().equals(Enum.ItemType.RUNE)){
if(ThreadLocalRandom.current().nextInt(1,101) < 66)
return null; // cut down world drops rates of resources by 65%
}
return outItem; return outItem;
} }
@ -414,7 +216,7 @@ public enum LootManager {
if(mob.getObjectType().ordinal() == 52) { if(mob.getObjectType().ordinal() == 52) {
prefixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1); prefixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
} else{ } else{
prefixTableRoll = TableRoll(mob.level); prefixTableRoll = TableRoll(mob.level, inHotzone);
} }
ModTableEntry prefixMod = ModTableEntry.rollTable(prefixTable.modTableID, prefixTableRoll); ModTableEntry prefixMod = ModTableEntry.rollTable(prefixTable.modTableID, prefixTableRoll);
@ -446,7 +248,7 @@ public enum LootManager {
if(mob.getObjectType().ordinal() == 52) { if(mob.getObjectType().ordinal() == 52) {
suffixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1); suffixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
} else{ } else{
suffixTableRoll = TableRoll(mob.level); suffixTableRoll = TableRoll(mob.level, inHotzone);
} }
ModTableEntry suffixMod = ModTableEntry.rollTable(suffixTable.modTableID, suffixTableRoll); ModTableEntry suffixMod = ModTableEntry.rollTable(suffixTable.modTableID, suffixTableRoll);
@ -461,36 +263,23 @@ public enum LootManager {
return inItem; return inItem;
} }
public static int TableRoll(int mobLevel) { public static int TableRoll(int mobLevel, Boolean inHotzone) {
int rank = (int)(mobLevel * 0.1f); if (mobLevel > 65)
int min = 50; mobLevel = 65;
int max = 100;
switch(rank){ int max = (int) (4.882 * mobLevel + 127.0);
case 1:
min = 200; if (max > 319)
max = 250; max = 319;
break;
case 2: int min = (int) (4.469 * mobLevel - 3.469);
min = 210;
max = 275; if (min < 70)
break; min = 70;
case 3:
min = 220; if (inHotzone)
max = 300; min += mobLevel;
break;
case 4:
min = 230;
max = 320;
break;
case 5:
case 6:
case 7:
case 8:
min = 240;
max = 320;
break;
}
int roll = ThreadLocalRandom.current().nextInt(min, max + 1); int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
@ -510,7 +299,12 @@ public enum LootManager {
int high = bse.highGold; int high = bse.highGold;
int low = bse.lowGold; int low = bse.lowGold;
int gold = (int) (ThreadLocalRandom.current().nextInt(low, high + 1) * NORMAL_GOLD_RATE); int gold = ThreadLocalRandom.current().nextInt(low, high + 1);
if (inHotzone == true)
gold = (int) (gold * HOTZONE_GOLD_RATE);
else
gold = (int) (gold * NORMAL_GOLD_RATE);
if (gold > 0) { if (gold > 0) {
MobLoot goldAmount = new MobLoot(mob, gold); MobLoot goldAmount = new MobLoot(mob, gold);
@ -521,63 +315,45 @@ public enum LootManager {
public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) { public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) {
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone); try {
if(toAdd != null){
ItemBase ib = toAdd.getItemBase();
switch(ib.getType()){
case CONTRACT:
case RUNE:
case RESOURCE:
return;
}
toAdd.setIsID(true);
mob.getCharItemManager().addItemToInventory(toAdd);
}
}
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
public static void GenerateEquipmentDrop(Mob mob) { if (toAdd != null)
mob.getCharItemManager().addItemToInventory(toAdd);
if (mob == null || mob.getSafeZone()) } catch (Exception e) {
return; // no equipment to drop in safezones //TODO chase down loot generation error, affects roughly 2% of drops
int i = 0;
}
}
if(mob.StrongholdGuardian || mob.StrongholdCommander || mob.StrongholdEpic) public static void GenerateEquipmentDrop(Mob mob) {
return; // stronghold mobs don't drop equipment
//do equipment here //do equipment here
if (mob.getEquip() != null) { int dropCount = 0;
boolean isVorg = false; if (mob.getEquip() != null)
for (MobEquipment me : mob.getEquip().values()) { for (MobEquipment me : mob.getEquip().values()) {
if (me.getDropChance() == 0) if (me.getDropChance() == 0)
continue; continue;
String name = me.getItemBase().getName().toLowerCase();
if (name.contains("vorgrim legionnaire's") || name.contains("vorgrim auxiliary's") ||name.contains("bellugh nuathal") || name.contains("crimson circle"))
isVorg = true;
if(isVorg && !mob.isDropper){
continue;
}
float equipmentRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1); float equipmentRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
float dropChance = me.getDropChance() * 100; float dropChance = me.getDropChance() * 100;
ItemBase itemBase = me.getItemBase();
if(isVorg) {
mob.spawnTime = ThreadLocalRandom.current().nextInt(300, 2700);
dropChance = 10;
itemBase = getRandomVorg(itemBase);
}
if (equipmentRoll > dropChance) if (equipmentRoll > dropChance)
continue; continue;
MobLoot ml = new MobLoot(mob, itemBase, false); MobLoot ml = new MobLoot(mob, me.getItemBase(), false);
ml.setIsID(true); if (ml != null && dropCount < 1) {
ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1)); ml.setIsID(true);
mob.getCharItemManager().addItemToInventory(ml); ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1));
mob.getCharItemManager().addItemToInventory(ml);
dropCount = 1;
//break; // Exit on first successful roll.
}
} }
}
} }
public static void GenerateInventoryDrop(Mob mob, BootySetEntry bse) { public static void GenerateInventoryDrop(Mob mob, BootySetEntry bse) {
@ -591,11 +367,8 @@ public enum LootManager {
MobLoot lootItem = new MobLoot(mob, ItemBase.getItemBase(bse.itemBase), true); MobLoot lootItem = new MobLoot(mob, ItemBase.getItemBase(bse.itemBase), true);
if (lootItem != null) { if (lootItem != null)
mob.getCharItemManager().addItemToInventory(lootItem); mob.getCharItemManager().addItemToInventory(lootItem);
if(lootItem.getItemBase().isDiscRune() && !Mob.discDroppers.contains(mob))
Mob.AddDiscDropper(mob);
}
} }
public static void peddleFate(PlayerCharacter playerCharacter, Item gift) { public static void peddleFate(PlayerCharacter playerCharacter, Item gift) {
@ -619,12 +392,12 @@ public enum LootManager {
//check if player owns the gift he is trying to open //check if player owns the gift he is trying to open
if (!itemMan.doesCharOwnThisItem(gift.getObjectUUID())) if (itemMan.doesCharOwnThisItem(gift.getObjectUUID()) == false)
return; return;
//roll 1-100 for the gen table selection //roll 1-100 for the gen table selection
int genRoll = ThreadLocalRandom.current().nextInt(94, 100) + 1; int genRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
GenTableEntry selectedRow = GenTableEntry.rollTable(tableID, genRoll, LootManager.NORMAL_DROP_RATE); GenTableEntry selectedRow = GenTableEntry.rollTable(tableID, genRoll, LootManager.NORMAL_DROP_RATE);
if(selectedRow == null) if(selectedRow == null)
@ -640,276 +413,45 @@ public enum LootManager {
//create the item from the table, quantity is always 1 //create the item from the table, quantity is always 1
ItemBase ib = ItemBase.getItemBase(selectedItem.cacheID); MobLoot winnings = new MobLoot(playerCharacter, ItemBase.getItemBase(selectedItem.cacheID), 1, false);
if(ib.getUUID() == Warehouse.coalIB.getUUID()){
//no more coal, give gold instead
if (itemMan.getGoldInventory().getNumOfItems() + 250000 > 10000000) {
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
return;
}
itemMan.addGoldToInventory(250000,false);
itemMan.updateInventory();
}else {
MobLoot winnings = new MobLoot(playerCharacter, ib, 1, false);
if (winnings == null)
return;
//early exit if the inventory of the player will not hold the item
if (itemMan.hasRoomInventory(winnings.getItemBase().getWeight()) == false) {
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
return;
}
//determine if the winning item needs a prefix
if (selectedRow.pModTable != 0) {
int prefixRoll = ThreadLocalRandom.current().nextInt(220, 320 + 1);
ModTableEntry prefix = ModTableEntry.rollTable(selectedRow.pModTable, prefixRoll);
if (prefix != null)
winnings.addPermanentEnchantment(prefix.action, 0, prefix.level, true);
}
//determine if the winning item needs a suffix
if (selectedRow.sModTable != 0) {
int suffixRoll = ThreadLocalRandom.current().nextInt(220, 320 + 1);
ModTableEntry suffix = ModTableEntry.rollTable(selectedRow.sModTable, suffixRoll);
if (suffix != null)
winnings.addPermanentEnchantment(suffix.action, 0, suffix.level, true);
}
winnings.setIsID(true);
//remove gift from inventory
itemMan.consume(gift);
//add winnings to player inventory
Item playerWinnings = winnings.promoteToItem(playerCharacter);
itemMan.addItemToInventory(playerWinnings);
itemMan.updateInventory();
}
}
public static int rollRandomItem(int itemTable){
int returnedID = ItemTableEntry.getRandomItem(itemTable);
return returnedID;
}
public static ItemBase getRandomVorg(ItemBase itemBase){
int roll = 0;
if(vorg_ha_uuids.contains(itemBase.getUUID())) {
roll = ThreadLocalRandom.current().nextInt(0, 10);
switch (roll) {
case 1:
return ItemBase.getItemBase(vorg_ha_uuids.get(0));
case 2:
return ItemBase.getItemBase(vorg_ha_uuids.get(1));
case 3:
return ItemBase.getItemBase(vorg_ha_uuids.get(2));
case 4:
return ItemBase.getItemBase(vorg_ha_uuids.get(3));
case 5:
return ItemBase.getItemBase(vorg_ha_uuids.get(4));
case 6:
return ItemBase.getItemBase(vorg_ha_uuids.get(5));
case 7:
return ItemBase.getItemBase(vorg_ha_uuids.get(6));
case 8:
return ItemBase.getItemBase(vorg_ha_uuids.get(7));
default:
return ItemBase.getItemBase(vorg_ha_uuids.get(8));
}
}
if(vorg_ma_uuids.contains(itemBase.getUUID())) {
roll = ThreadLocalRandom.current().nextInt(0, 10);
switch (roll) {
case 1:
return ItemBase.getItemBase(vorg_ma_uuids.get(0));
case 2:
return ItemBase.getItemBase(vorg_ma_uuids.get(1));
case 3:
return ItemBase.getItemBase(vorg_ma_uuids.get(2));
case 4:
return ItemBase.getItemBase(vorg_ma_uuids.get(3));
case 5:
return ItemBase.getItemBase(vorg_ma_uuids.get(4));
case 6:
return ItemBase.getItemBase(vorg_ma_uuids.get(5));
case 7:
return ItemBase.getItemBase(vorg_ma_uuids.get(6));
default:
return ItemBase.getItemBase(vorg_ma_uuids.get(7));
}
}
if(vorg_la_uuids.contains(itemBase.getUUID())) {
roll = ThreadLocalRandom.current().nextInt(0, 10);
switch (roll) {
case 1:
return ItemBase.getItemBase(vorg_la_uuids.get(0));
case 2:
return ItemBase.getItemBase(vorg_la_uuids.get(1));
case 3:
return ItemBase.getItemBase(vorg_la_uuids.get(2));
case 4:
return ItemBase.getItemBase(vorg_la_uuids.get(3));
case 5:
return ItemBase.getItemBase(vorg_la_uuids.get(4));
case 6:
return ItemBase.getItemBase(vorg_la_uuids.get(5));
case 7:
return ItemBase.getItemBase(vorg_la_uuids.get(6));
default:
return ItemBase.getItemBase(vorg_la_uuids.get(7));
}
}
if(vorg_cloth_uuids.contains(itemBase.getUUID())) {
roll = ThreadLocalRandom.current().nextInt(0, 10);
switch (roll) {
case 1:
return ItemBase.getItemBase(vorg_cloth_uuids.get(0));
case 2:
return ItemBase.getItemBase(vorg_cloth_uuids.get(1));
case 3:
return ItemBase.getItemBase(vorg_cloth_uuids.get(2));
case 4:
return ItemBase.getItemBase(vorg_cloth_uuids.get(3));
default:
return ItemBase.getItemBase(vorg_cloth_uuids.get(4));
}
}
return null;
}
public static void DropPresent(Mob mob){
int random = 971049 + ThreadLocalRandom.current().nextInt(24);
if (random > 971071)
random = 971071;
ItemBase present = ItemBase.getItemBase(random);
if (present != null) {
MobLoot toAdd = new MobLoot(mob, present, true);
if (toAdd != null)
mob.getCharItemManager().addItemToInventory(toAdd);
}
}
public static void GenerateStrongholdLoot(Mob mob, boolean commander, boolean epic) {
mob.getCharItemManager().clearInventory();
int multiplier = 1;
if (commander)
multiplier = 2;
if(epic)
multiplier = 10;
int high = 125000;
int low = 50000;
int gold = ThreadLocalRandom.current().nextInt(low, high + 1) * multiplier;
if (gold > 0) { if (winnings == null)
MobLoot goldAmount = new MobLoot(mob, gold); return;
mob.getCharItemManager().addItemToInventory(goldAmount);
}
//present drop chance for all
if (ThreadLocalRandom.current().nextInt(100) < 35)
DropPresent(mob);
//random contract drop chance for all
if (ThreadLocalRandom.current().nextInt(100) < 40) {
int contractTableID = 250;
contractTableID += ThreadLocalRandom.current().nextInt(0, 11);
if (contractTableID > 259)
contractTableID = 659;
int id = rollRandomItem(contractTableID); //early exit if the inventory of the player will not old the item
ItemBase ib = ItemBase.getItemBase(id);
if (ib != null) {
MobLoot contract = new MobLoot(mob, ib, true);
if (contract != null) if (itemMan.hasRoomInventory(winnings.getItemBase().getWeight()) == false) {
mob.getCharItemManager().addItemToInventory(contract); ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
} return;
} }
//special commander drop chances //determine if the winning item needs a prefix
if (commander)
GenerateCommanderLoot(mob,false);
//special epic drop chances if(selectedRow.pModTable != 0){
if (epic) { int prefixRoll = ThreadLocalRandom.current().nextInt(220,320 + 1);
GenerateCommanderLoot(mob, true); ModTableEntry prefix = ModTableEntry.rollTable(selectedRow.pModTable, prefixRoll);
GenerateCommanderLoot(mob,false); if(prefix != null)
winnings.addPermanentEnchantment(prefix.action, 0, prefix.level, true);
} }
}
public static void GenerateCommanderLoot(Mob mob, boolean epic){ //determine if the winning item needs a suffix
//present chance
if (ThreadLocalRandom.current().nextInt(100) < 25)
DropPresent(mob);
//present chance if(selectedRow.sModTable != 0){
if (ThreadLocalRandom.current().nextInt(100) < 25) int suffixRoll = ThreadLocalRandom.current().nextInt(220,320 + 1);
DropPresent(mob); ModTableEntry suffix = ModTableEntry.rollTable(selectedRow.sModTable, suffixRoll);
if (suffix != null)
//chance for glass winnings.addPermanentEnchantment(suffix.action, 0, suffix.level, true);
if (ThreadLocalRandom.current().nextInt(100) < 75) {
int glassID = rollRandomItem(126);
ItemBase glassItem = ItemBase.getItemBase(glassID);
if (glassItem != null) {
MobLoot toAdd2 = new MobLoot(mob, glassItem, true);
if (toAdd2 != null)
mob.getCharItemManager().addItemToInventory(toAdd2);
}
} }
winnings.setIsID(true);
//chance for disc //remove gift from inventory
if (ThreadLocalRandom.current().nextInt(100) < 75) {
int discID = rollRandomItem(3202);
ItemBase discItem = ItemBase.getItemBase(discID);
if (discItem != null) {
MobLoot toAdd3 = new MobLoot(mob, discItem, true);
if (toAdd3 != null) itemMan.consume(gift);
mob.getCharItemManager().addItemToInventory(toAdd3);
}
}
//chance for stat rune //add winnings to player inventory
if (ThreadLocalRandom.current().nextInt(100) < 75) {
int runeID = rollRandomItem(3201);
ItemBase runeItem = ItemBase.getItemBase(runeID);
if (runeItem != null) {
MobLoot toAdd4 = new MobLoot(mob, runeItem, true);
if (toAdd4 != null) Item playerWinnings = winnings.promoteToItem(playerCharacter);
mob.getCharItemManager().addItemToInventory(toAdd4); itemMan.addItemToInventory(playerWinnings);
} itemMan.updateInventory();
}
if(epic){
int contractTableID = 250;
contractTableID += ThreadLocalRandom.current().nextInt(0, 11);
if (contractTableID > 259)
contractTableID = 659;
int id = rollRandomItem(contractTableID);
ItemBase ib = ItemBase.getItemBase(id);
if (ib != null) {
MobLoot contract = new MobLoot(mob, ib, true);
if (contract != null)
mob.getCharItemManager().addItemToInventory(contract);
}
}
} }
} }

123
src/engine/gameManager/MaintenanceManager.java

@ -24,7 +24,7 @@ public enum MaintenanceManager {
public static void setMaintDateTime(Building building, LocalDateTime maintDate) { public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
building.maintDateTime = maintDate.withHour(1).withMinute(0).withSecond(0); building.maintDateTime = maintDate;
DbManager.BuildingQueries.updateMaintDate(building); DbManager.BuildingQueries.updateMaintDate(building);
} }
@ -49,15 +49,19 @@ public enum MaintenanceManager {
if (chargeUpkeep(building) == false) if (chargeUpkeep(building) == false)
derankList.add(building); derankList.add(building);
else
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
} }
// Reset maintenance dates for these buildings
for (Building building : maintList) {
setMaintDateTime(building, LocalDateTime.now().plusDays(7));
for (Building building : derankList) {
building.destroyOrDerank(null);
if(building.getRank() > 0)
setMaintDateTime(building, LocalDateTime.now().plusDays(1));
} }
// Derak or destroy buildings that did not
// have funds available.
for (Building building : derankList)
building.destroyOrDerank(null);
Logger.info("Structures: " + buildingList.size() + " Maint: " + maintList.size() + " Derank: " + derankList.size()); Logger.info("Structures: " + buildingList.size() + " Maint: " + maintList.size() + " Derank: " + derankList.size());
} }
@ -94,10 +98,6 @@ public enum MaintenanceManager {
continue; continue;
} }
//only ToL pays maintenance
if(building.getBlueprint().getBuildingGroup() != null && !building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL))
continue;
// No maintenance on banestones omfg // No maintenance on banestones omfg
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.BANESTONE)) if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.BANESTONE))
@ -122,9 +122,9 @@ public enum MaintenanceManager {
//no maintenance if day of week doesnt match //no maintenance if day of week doesnt match
//if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) { if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
// continue; continue;
//} }
// Add building to maintenance queue // Add building to maintenance queue
maintList.add(building); maintList.add(building);
@ -186,8 +186,49 @@ public enum MaintenanceManager {
// If this is an R8 tree, validate that we can // If this is an R8 tree, validate that we can
// cover the resources required // cover the resources required
if (building.getRank() == 8) {
hasResources = true;
if (warehouse == null)
hasResources = false;
else {
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
if (resourceValue < 1500)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
if (resourceValue < 1500)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
if (resourceValue < 5)
hasResources = false;
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
if (resourceValue < 5)
hasResources = false;
}
}
// Validation completed but has failed. We can derank
// the target building and early exit
if ((hasFunds == false) ||
((building.getRank() == 8) && !hasResources)) {
// Add cash back to strongbox for lost rank if the building isn't being destroyed
// and it's not an R8 deranking
if ((building.getRank() > 1) && (building.getRank() < 8)) {
building.setStrongboxValue(building.getStrongboxValue() + building.getBlueprint().getRankCost(Math.min(building.getRank(), 7)));
}
if (hasFunds == false) {
return false; // Early exit for having failed to meet maintenance return false; // Early exit for having failed to meet maintenance
} }
@ -212,6 +253,58 @@ public enum MaintenanceManager {
} }
} }
// Early exit as we're done if we're not an R8 tree
if (building.getRank() < 8)
return true;
// Now for the resources if it's an R8 tree
// Withdraw Stone
resourceValue = warehouse.getResources().get(Warehouse.stoneIB);
if (DbManager.WarehouseQueries.updateStone(warehouse, resourceValue - 1500) == true) {
warehouse.getResources().put(Warehouse.stoneIB, resourceValue - 1500);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.STONE, 1500);
} else {
Logger.error("stone update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
}
// Withdraw Lumber
resourceValue = warehouse.getResources().get(Warehouse.lumberIB);
if (DbManager.WarehouseQueries.updateLumber(warehouse, resourceValue - 1500) == true) {
warehouse.getResources().put(Warehouse.lumberIB, resourceValue - 1500);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.LUMBER, 1500);
} else {
Logger.error("lumber update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
}
// Withdraw Galvor
resourceValue = warehouse.getResources().get(Warehouse.galvorIB);
if (DbManager.WarehouseQueries.updateGalvor(warehouse, resourceValue - 5) == true) {
warehouse.getResources().put(Warehouse.galvorIB, resourceValue - 5);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GALVOR, 5);
} else {
Logger.error("galvor update failed for warehouse of UUID:" + warehouse.getObjectUUID());
return true;
}
resourceValue = warehouse.getResources().get(Warehouse.wormwoodIB);
if (DbManager.WarehouseQueries.updateWormwood(warehouse, resourceValue - 5) == true) {
warehouse.getResources().put(Warehouse.wormwoodIB, resourceValue - 5);
warehouse.AddTransactionToWarehouse(Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.WORMWOOD, 5);
} else {
Logger.error("wyrmwood update failed for warehouse of UUID:" + warehouse.getObjectUUID());
}
return true; return true;
} }

8
src/engine/gameManager/MovementManager.java

@ -68,7 +68,7 @@ public enum MovementManager {
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) { if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
if (((PlayerCharacter) toMove).isCasting()) if (((PlayerCharacter) toMove).isCasting())
((PlayerCharacter) toMove).update(false); ((PlayerCharacter) toMove).update();
} }
@ -96,7 +96,7 @@ public enum MovementManager {
if (!toMove.isMoving()) if (!toMove.isMoving())
toMove.resetLastSetLocUpdate(); toMove.resetLastSetLocUpdate();
else else
toMove.update(false); toMove.update();
// Update movement for the player // Update movement for the player
@ -351,7 +351,7 @@ public enum MovementManager {
ChatManager.chatSystemInfo((PlayerCharacter) ac, "Finished Alt change, setting the end location to " + ac.getEndLoc().getX() + ' ' + ac.getEndLoc().getZ() + " moving=" + ac.isMoving() + " and current location is " + curLoc.getX() + ' ' + curLoc.getZ()); ChatManager.chatSystemInfo((PlayerCharacter) ac, "Finished Alt change, setting the end location to " + ac.getEndLoc().getX() + ' ' + ac.getEndLoc().getZ() + " moving=" + ac.isMoving() + " and current location is " + curLoc.getX() + ' ' + curLoc.getZ());
//Send run/walk/sit/stand to tell the client we are flying / landing etc //Send run/walk/sit/stand to tell the client we are flying / landing etc
ac.update(false); ac.update();
ac.stopMovement(ac.getLoc()); ac.stopMovement(ac.getLoc());
if (ac.isAlive()) if (ac.isAlive())
MovementManager.sendRWSSMsg(ac); MovementManager.sendRWSSMsg(ac);
@ -408,7 +408,7 @@ public enum MovementManager {
if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None)) if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None))
continue; continue;
member.update(false); member.update();
// All checks passed, let's move the player // All checks passed, let's move the player

395
src/engine/gameManager/NPCManager.java

@ -2,17 +2,14 @@ package engine.gameManager;
import engine.Enum; import engine.Enum;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.exception.SerializationException;
import engine.math.Quaternion; import engine.math.Quaternion;
import engine.math.Vector3f; import engine.math.Vector3f;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.net.ByteBufferWriter;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage; import engine.net.DispatchMessage;
import engine.net.client.msg.PetMsg; import engine.net.client.msg.PetMsg;
import engine.objects.*; import engine.objects.*;
import engine.powers.EffectsBase; import engine.powers.EffectsBase;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.util.ArrayList; import java.util.ArrayList;
@ -25,8 +22,6 @@ public enum NPCManager {
NPC_MANAGER; NPC_MANAGER;
public static HashMap<Integer, ArrayList<Integer>> _runeSetMap = new HashMap<>(); public static HashMap<Integer, ArrayList<Integer>> _runeSetMap = new HashMap<>();
public static int SVR_CLOSE_WINDOW = 4;
public static HashMap<Integer, ArrayList<String>> _pirateNames = new HashMap<>();
public static void LoadAllRuneSets() { public static void LoadAllRuneSets() {
_runeSetMap = DbManager.ItemBaseQueries.LOAD_RUNES_FOR_NPC_AND_MOBS(); _runeSetMap = DbManager.ItemBaseQueries.LOAD_RUNES_FOR_NPC_AND_MOBS();
@ -291,10 +286,10 @@ public enum NPCManager {
// If we cannot find name for this mobbase then // If we cannot find name for this mobbase then
// fallback to human male // fallback to human male
if (_pirateNames.containsKey(mobBaseID)) if (NPC._pirateNames.containsKey(mobBaseID))
nameList = _pirateNames.get(mobBaseID); nameList = NPC._pirateNames.get(mobBaseID);
else else
nameList = _pirateNames.get(2111); nameList = NPC._pirateNames.get(2111);
if (nameList == null) { if (nameList == null) {
Logger.error("Null name list for 2111!"); Logger.error("Null name list for 2111!");
@ -345,8 +340,8 @@ public enum NPCManager {
else else
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building); buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
//if (buildingSlot == -1) if (buildingSlot == -1)
//Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID()); Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot); abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);
@ -375,384 +370,4 @@ public enum NPCManager {
return buildingSlot; return buildingSlot;
} }
public static boolean ISWallArcher(Contract contract) {
if (contract == null)
return false;
//838, 950, 1051, 1181, 1251, 1351, 1451, 1501, 1526, 1551, 980101,
return contract.getAllowedBuildings().contains(Enum.BuildingGroup.WALLCORNER) ||
contract.getAllowedBuildings().contains(Enum.BuildingGroup.WALLSTRAIGHTTOWER);
}
public static NPC getFromCache(int id) {
return (NPC) DbManager.getFromCache(Enum.GameObjectType.NPC, id);
}
public static boolean UpdateName(NPC npc, String value) {
if (!DbManager.NPCQueries.UPDATE_NAME(npc, value))
return false;
npc.setName(value);
return true;
}
public static void serializeNpcForClientMsgOtherPlayer(NPC npc, ByteBufferWriter writer, boolean hideAsciiLastName)
throws SerializationException {
serializeForClientMsgOtherPlayer(npc, writer);
}
public static void serializeForClientMsgOtherPlayer(NPC npc, ByteBufferWriter writer)
throws SerializationException {
writer.putInt(0);
writer.putInt(0);
//num Runes
int cnt = 3;
boolean isVamp = false, isHealer = false, isArcher = false, isTrainer = false;
int contractID = 0, classID = 0;
int extraRune = 0;
if (npc.contract != null) {
contractID = npc.contract.getContractID();
classID = npc.contract.getClassID();
extraRune = npc.contract.getExtraRune();
if (extraRune == contractID)
extraRune = 0;
}
if ((contractID > 252642 && contractID < 252647) || contractID == 252652) {
isVamp = true;
cnt++;
}
if (contractID == 252582 || contractID == 252579 || contractID == 252581
|| contractID == 252584 || contractID == 252597 || contractID == 252598
|| contractID == 252628 || extraRune == 252582 || extraRune == 252579
|| extraRune == 252581 || extraRune == 252584 || extraRune == 252597
|| extraRune == 252598 || extraRune == 252628) {
isHealer = true;
cnt++;
}
if (contractID == 252570) {
isArcher = true;
cnt++;
}
if (classID != 0)
cnt++;
if (extraRune != 0 && extraRune != contractID)
cnt++;
writer.putInt(cnt);
//Race
writer.putInt(1);
writer.putInt(0);
if (npc.getMobBase() != null)
writer.putInt(npc.getMobBase().getLoadID());
else
writer.putInt(2011);
writer.putInt(Enum.GameObjectType.NPCRaceRune.ordinal());
writer.putInt(npc.currentID);
//Class/Trainer/Whatever
writer.putInt(5);
writer.putInt(0);
if (npc.contract != null)
writer.putInt(contractID);
else
writer.putInt(2500);
writer.putInt(Enum.GameObjectType.NPCClassRune.ordinal());
writer.putInt(npc.currentID);
//vampire trainer
cnt = 0;
if (extraRune != 0)
cnt = serializeExtraRune(npc, extraRune, cnt, writer);
if (isVamp)
cnt = serializeExtraRune(npc, 252647, cnt, writer);
//Healer trainer
if (isHealer)
cnt = serializeExtraRune(npc, 252592, cnt, writer);
if (classID != 0) {
writer.putInt(4);
writer.putInt(0);
writer.putInt(classID);
writer.putInt(Enum.GameObjectType.NPCExtraRune.ordinal());
writer.putInt(npc.currentID);
}
//Scout trainer
if (isArcher)
cnt = serializeExtraRune(npc, 252654, cnt, writer);
//Shopkeeper
writer.putInt(5);
writer.putInt(0);
writer.putInt(0x3DACC);
writer.putInt(Enum.GameObjectType.NPCShopkeeperRune.ordinal());
writer.putInt(npc.currentID);
//Send Stats
writer.putInt(5);
writer.putInt(0x8AC3C0E6); //Str
writer.putInt(0);
writer.putInt(0xACB82E33); //Dex
writer.putInt(0);
writer.putInt(0xB15DC77E); //Con
writer.putInt(0);
writer.putInt(0xE07B3336); //Int
writer.putInt(0);
writer.putInt(0xFF665EC3); //Spi
writer.putInt(0);
writer.putString(npc.getName());
writer.putString("");
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.put((byte) 0);
writer.putInt(npc.getObjectType().ordinal());
writer.putInt(npc.currentID);
writer.putFloat(1.0f);
writer.putFloat(1.0f);
writer.putFloat(1.0f);
if (npc.region != null)
writer.putVector3f(ZoneManager.convertWorldToLocal(npc.building, npc.getLoc()));
else
writer.putVector3f(npc.getLoc());
//Rotation
float radians = (float) Math.acos(npc.getRot().y) * 2;
if (npc.building != null)
if (npc.building.getBounds() != null && npc.building.getBounds().getQuaternion() != null)
radians += (npc.building.getBounds().getQuaternion()).angleY;
writer.putFloat(radians);
//Running Speed
writer.putInt(0);
// get a copy of the equipped items.
if (npc.equip != null) {
writer.putInt(npc.equip.size());
for (MobEquipment me : npc.equip.values())
MobEquipment.serializeForClientMsg(me, writer);
} else
writer.putInt(0);
writer.putInt((npc.level / 10));
writer.putInt(npc.level);
writer.putInt(npc.getIsSittingAsInt()); //Standing
writer.putInt(npc.getIsWalkingAsInt()); //Walking
writer.putInt(npc.getIsCombatAsInt()); //Combat
writer.putInt(2); //Unknown
writer.putInt(1); //Unknown - Headlights?
writer.putInt(0);
if (npc.building != null && npc.region != null) {
writer.putInt(npc.building.getObjectType().ordinal());
writer.putInt(npc.building.getObjectUUID());
} else {
writer.putInt(0); //<-Building Object Type
writer.putInt(0); //<-Building Object ID
}
writer.put((byte) 0);
writer.put((byte) 0);
writer.put((byte) 0);
//npc dialog menus from contracts
if (npc.contract != null) {
ArrayList<Integer> npcMenuOptions = npc.contract.getNPCMenuOptions();
writer.putInt(npcMenuOptions.size());
for (Integer val : npcMenuOptions) {
writer.putInt(val);
}
} else
writer.putInt(0);
writer.put((byte) 1);
if (npc.building != null) {
writer.putInt(Enum.GameObjectType.StrongBox.ordinal());
writer.putInt(npc.currentID);
writer.putInt(Enum.GameObjectType.StrongBox.ordinal());
writer.putInt(npc.building.getObjectUUID());
} else {
writer.putLong(0);
writer.putLong(0);
}
if (npc.contract != null)
writer.putInt(npc.contract.getIconID());
else
writer.putInt(0); //npc icon ID
writer.putInt(0);
writer.putShort((short) 0);
if (npc.contract != null && npc.contract.isTrainer()) {
writer.putInt(classID);
} else {
writer.putInt(0);
}
if (npc.contract != null && npc.contract.isTrainer())
writer.putInt(classID);
else
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putFloat(4);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.put((byte) 0);
//Pull guild info from building if linked to one
Guild.serializeForClientMsg(npc.guild, writer, null, true);
writer.putInt(1);
writer.putInt(0x8A2E);
writer.putInt(0);
writer.putInt(0);
//TODO Guard
writer.put((byte) 0); //Is guard..
writer.putFloat(1500f); //npc.healthMax
writer.putFloat(1500f); //npc.health
//TODO Peace Zone
writer.put((byte) 1); //0=show tags, 1=don't
writer.putInt(0);
writer.put((byte) 0);
}
private static int serializeExtraRune(NPC npc, int runeID, int cnt, ByteBufferWriter writer) {
writer.putInt(5);
writer.putInt(0);
writer.putInt(runeID);
if (cnt == 0)
writer.putInt(Enum.GameObjectType.NPCClassRuneTwo.ordinal());
else
writer.putInt(Enum.GameObjectType.NPCClassRuneThree.ordinal());
writer.putInt(npc.currentID);
return cnt + 1;
}
public static NPC createNPC(String name, int contractID, Vector3fImmutable spawn, Guild guild, Zone parent, short level, Building building) {
NPC newNPC = new NPC();
newNPC.setName(name);
newNPC.contractUUID = contractID;
if (building == null)
newNPC.bindLoc = spawn;
else
newNPC.bindLoc = Vector3fImmutable.ZERO;
newNPC.parentZoneUUID = parent.getObjectUUID();
newNPC.guildUUID = guild.getObjectUUID();
if (building == null)
newNPC.buildingUUID = 0;
else
newNPC.buildingUUID = building.getObjectUUID();
newNPC.level = level;
newNPC.buyPercent = .33f;
newNPC.sellPercent = 1;
NPC npc;
try {
npc = DbManager.NPCQueries.PERSIST(newNPC);
npc.setObjectTypeMask(MBServerStatics.MASK_NPC);
} catch (Exception e) {
Logger.error(e);
npc = null;
}
return npc;
}
public static NPC getNPC(int id) {
if (id == 0)
return null;
NPC npc = (NPC) DbManager.getFromCache(Enum.GameObjectType.NPC, id);
if (npc != null)
return npc;
return DbManager.NPCQueries.GET_NPC(id);
}
public static boolean ISGuardCaptain(int contractID) {
return Enum.MinionType.ContractToMinionMap.containsKey(contractID);
}
public static boolean UpdateEquipSetID(NPC npc, int equipSetID) {
if (!LootManager._bootySetMap.containsKey(equipSetID))
return false;
if (!DbManager.NPCQueries.UPDATE_EQUIPSET(npc, equipSetID))
return false;
npc.equipmentSetID = equipSetID;
return true;
}
public static boolean UpdateRaceID(NPC npc, int raceID) {
if (!DbManager.NPCQueries.UPDATE_MOBBASE(npc, raceID))
return false;
npc.loadID = raceID;
npc.mobBase = MobBase.getMobBase(npc.loadID);
return true;
}
public static NPCProfits GetNPCProfits(NPC npc) {
return NPCProfits.ProfitCache.get(npc.currentID);
}
} }

2392
src/engine/gameManager/PlayerManager.java

File diff suppressed because it is too large Load Diff

228
src/engine/gameManager/PowersManager.java

@ -163,14 +163,6 @@ public enum PowersManager {
public static void usePower(final PerformActionMsg msg, ClientConnection origin, public static void usePower(final PerformActionMsg msg, ClientConnection origin,
boolean sendCastToSelf) { boolean sendCastToSelf) {
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
if(!PlayerManager.isFlying(pc)) //cant be sitting if flying
CombatManager.toggleSit(false,origin);
if(pc.isMoving())
pc.stopMovement(pc.getMovementLoc());
if (usePowerA(msg, origin, sendCastToSelf)) { if (usePowerA(msg, origin, sendCastToSelf)) {
// Cast failed for some reason, reset timer // Cast failed for some reason, reset timer
@ -179,10 +171,13 @@ public enum PowersManager {
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
// Send Fail to cast message // Send Fail to cast message
PlayerCharacter pc = SessionManager
.getPlayerCharacter(origin);
if (pc != null) { if (pc != null) {
sendPowerMsg(pc, 2, msg); sendPowerMsg(pc, 2, msg);
if (pc.isCasting()) { if (pc.isCasting()) {
pc.update(false); pc.update();
} }
pc.setIsCasting(false); pc.setIsCasting(false);
@ -210,41 +205,6 @@ public enum PowersManager {
boolean CSRCast = false; boolean CSRCast = false;
if(msg.getPowerUsedID() == 430628895) {
boolean failed = false;// group teleport
City city = ZoneManager.getCityAtLocation(playerCharacter.loc);
if (city == null) {
failed = true;
}else{
Bane bane = city.getBane();
if (bane == null) {
failed = true;
}else{
if(!bane.getSiegePhase().equals(SiegePhase.WAR)){
failed = true;
}
}
}
if(failed){
//check to see if we are at an active mine
Zone zone = ZoneManager.findSmallestZone(playerCharacter.loc);
if(zone != null){
Mine mine = null;
for(Building building : zone.zoneBuildingSet){
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.MINE)){
mine = Mine.getMineFromTower(building.getObjectUUID());
}
}
if(mine != null){
failed = !mine.isActive;
}
}
}
if(failed)
return false;
}
if (MBServerStatics.POWERS_DEBUG) { if (MBServerStatics.POWERS_DEBUG) {
ChatManager.chatSayInfo( ChatManager.chatSayInfo(
@ -281,7 +241,6 @@ public enum PowersManager {
// get power // get power
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID()); PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
if (pb == null) { if (pb == null) {
ChatManager.chatSayInfo(playerCharacter, ChatManager.chatSayInfo(playerCharacter,
"This power is not implemented yet."); "This power is not implemented yet.");
@ -293,35 +252,6 @@ public enum PowersManager {
// return false; // return false;
} }
//check for movement buffs while flying
if(PlayerManager.isFlying(playerCharacter)) {
switch(pb.token){
case 429005674:
case 429505739:
case 431054700:
case 428005600:
case 431610080:
case 427935608:
case 427857146:
case 427988218:
case 431854842:
case 421074170:
case 429611355:
case 428955899:
case 1794395699:
case 429428796:
case 1514898036:
ChatManager.chatSystemInfo(playerCharacter, "You Cannot Fly While Having A MovementBuff");
//resync stamina
playerCharacter.setStamina(playerCharacter.getStamina(), playerCharacter);
// Update all surrounding clients.
TargetedActionMsg cmm = new TargetedActionMsg(playerCharacter);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, cmm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
return true;
}
}
if (playerCharacter.getLastPower() != null) if (playerCharacter.getLastPower() != null)
return true; return true;
@ -349,12 +279,6 @@ public enum PowersManager {
msg.setNumTrains(trains); msg.setNumTrains(trains);
} }
switch(pb.token){
case 429420458: // BH eyes
msg.setNumTrains(msg.getNumTrains() * 2);
break;
}
// can't go over total trains by player // can't go over total trains by player
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) { if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID()); CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
@ -446,20 +370,15 @@ public enum PowersManager {
float range = pb.getRange(); float range = pb.getRange();
// verify target is in range // verify target is in range
if(pb.token != 429396028) {
if (verifyInvalidRange(playerCharacter, target, range))
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
// TODO send message that target is out of range
return true;
// verify target is valid type
if (!validateTarget(target, playerCharacter, pb))
return true;
}else{
pb.isSpell = false;
}
if (verifyInvalidRange(playerCharacter, target, range))
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
// TODO send message that target is out of range
return true;
// verify target is valid type
if (!validateTarget(target, playerCharacter, pb))
return true;
if (AbstractWorldObject.IsAbstractCharacter(target)) if (AbstractWorldObject.IsAbstractCharacter(target))
@ -568,6 +487,7 @@ public enum PowersManager {
// Validity checks passed, move on to casting spell // Validity checks passed, move on to casting spell
//get caster's live counter //get caster's live counter
int casterLiveCounter = playerCharacter.getLiveCounter(); int casterLiveCounter = playerCharacter.getLiveCounter();
// run recycle job for when cast is available again, don't bother adding the timer for CSRs // run recycle job for when cast is available again, don't bother adding the timer for CSRs
if (time > 0) { if (time > 0) {
FinishRecycleTimeJob frtj = new FinishRecycleTimeJob(playerCharacter, msg); FinishRecycleTimeJob frtj = new FinishRecycleTimeJob(playerCharacter, msg);
@ -594,7 +514,7 @@ public enum PowersManager {
// make person casting stand up if spell (unless they're casting a chant which does not make them stand up) // make person casting stand up if spell (unless they're casting a chant which does not make them stand up)
if (pb.isSpell() && !pb.isChant() && playerCharacter.isSit()) { if (pb.isSpell() && !pb.isChant() && playerCharacter.isSit()) {
playerCharacter.update(false); playerCharacter.update();
playerCharacter.setSit(false); playerCharacter.setSit(false);
UpdateStateMsg updateStateMsg = new UpdateStateMsg(playerCharacter); UpdateStateMsg updateStateMsg = new UpdateStateMsg(playerCharacter);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, updateStateMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); DispatchMessage.dispatchMsgToInterestArea(playerCharacter, updateStateMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
@ -602,9 +522,7 @@ public enum PowersManager {
} }
// update cast (use skill) fail condition // update cast (use skill) fail condition
if(pb.token != 429396028) { playerCharacter.cancelOnCast();
playerCharacter.cancelOnCast();
}
// update castSpell (use spell) fail condition if spell // update castSpell (use spell) fail condition if spell
if (pb.isSpell()) if (pb.isSpell())
@ -617,12 +535,13 @@ public enum PowersManager {
if (time > 100) { if (time > 100) {
playerCharacter.update(false); playerCharacter.update();
playerCharacter.setIsCasting(true); playerCharacter.setIsCasting(true);
} }
playerCharacter.setLastMovementState(playerCharacter.getMovementState()); playerCharacter.setLastMovementState(playerCharacter.getMovementState());
// run timer job to end cast // run timer job to end cast
if (time < 1) // run immediately if (time < 1) // run immediately
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter); finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
@ -787,19 +706,8 @@ public enum PowersManager {
if (playerCharacter == null || msg == null) if (playerCharacter == null || msg == null)
return; return;
//if((msg.getPowerUsedID() == 429495514 || msg.getPowerUsedID() == 429407306) && playerCharacter.getRace().getName().toLowerCase().contains("shade")){
// //use sneak instead of hide
// PowersBase pb = PowersManager.getPowerByToken(429397210);
// int offsetTrains = (40 - msg.getNumTrains()) ;
// applyPower(playerCharacter,playerCharacter,playerCharacter.loc,429397210,msg.getNumTrains(),false);
// applyPower(playerCharacter,playerCharacter,playerCharacter.loc,427857146,offsetTrains,false);
//}
if(msg.getPowerUsedID() == 429494441) {//wildkins chase
playerCharacter.removeEffectBySource(EffectSourceType.Root,40,true);
playerCharacter.removeEffectBySource(EffectSourceType.Snare,40,true);
}
if (playerCharacter.isCasting()) { if (playerCharacter.isCasting()) {
playerCharacter.update(false); playerCharacter.update();
playerCharacter.updateStamRegen(-100); playerCharacter.updateStamRegen(-100);
} }
@ -901,16 +809,15 @@ public enum PowersManager {
} }
float range = pb.getRange() + speedRange; float range = pb.getRange() + speedRange;
if(pb.token != 429396028) {
if (verifyInvalidRange(playerCharacter, mainTarget, range)) { if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
sendPowerMsg(playerCharacter, 8, msg); sendPowerMsg(playerCharacter, 8, msg);
return; return;
}
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
// TODO send message that target is out of range
} }
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
// TODO send message that target is out of range
} }
@ -1326,7 +1233,7 @@ public enum PowersManager {
PlayerCharacter target = SessionManager PlayerCharacter target = SessionManager
.getPlayerCharacterByLowerCaseName(msg.getTargetName()); .getPlayerCharacterByLowerCaseName(msg.getTargetName());
if (target == null || target.equals(pc)) { if (target == null || target.equals(pc) || target.isCombat()) {
if (target == null) // Player not found. Send not found message if (target == null) // Player not found. Send not found message
ChatManager.chatInfoError(pc, ChatManager.chatInfoError(pc,
@ -1363,7 +1270,7 @@ public enum PowersManager {
if (pc == null) if (pc == null)
return; return;
PlayerCharacter source = PlayerManager.getFromCache(msg.getSourceID()); PlayerCharacter source = PlayerCharacter.getFromCache(msg.getSourceID());
if (source == null) if (source == null)
return; return;
@ -1430,16 +1337,6 @@ public enum PowersManager {
else else
duration = 45000; // Belgosh Summons, 45 seconds duration = 45000; // Belgosh Summons, 45 seconds
boolean enemiesNear = false;
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(pc.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER)){
PlayerCharacter playerCharacter = (PlayerCharacter)awo;
if(!playerCharacter.guild.getNation().equals(pc.guild.getNation())){
enemiesNear = true;
}
}
if(enemiesNear && !pc.isInSafeZone())
duration += 60000;
// Teleport to summoners location // Teleport to summoners location
FinishSummonsJob fsj = new FinishSummonsJob(source, pc); FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
@ -1565,17 +1462,8 @@ public enum PowersManager {
} }
// create list of characters // create list of characters
HashSet<AbstractCharacter> trackChars; HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
switch(msg.getPowerToken()){ allTargets, playerCharacter, maxTargets);
case 431511776:
case 429578587:
case 429503360:
trackChars = getTrackList(playerCharacter);
break;
default:
trackChars = RangeBasedAwo.getTrackList(allTargets, playerCharacter, maxTargets);
break;
}
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg); TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
@ -1588,30 +1476,6 @@ public enum PowersManager {
} }
public static HashSet<AbstractCharacter> getTrackList(PlayerCharacter tracker){
HashSet<AbstractCharacter> list = new HashSet<AbstractCharacter>();
HashSet<AbstractWorldObject> shortList = WorldGrid.getObjectsInRangePartial(tracker.loc,MBServerStatics.CHARACTER_LOAD_RANGE, MBServerStatics.MASK_PLAYER);
HashSet<AbstractWorldObject> fullList = WorldGrid.getObjectsInRangePartial(tracker.loc,1408, MBServerStatics.MASK_PLAYER);
ArrayList<Guild> guildsPresent = new ArrayList<>();
for(AbstractWorldObject awo : shortList){
PlayerCharacter pc = (PlayerCharacter)awo;
if(!guildsPresent.contains(pc.guild.getNation())){
guildsPresent.add(pc.guild.getNation());
}
}
for(AbstractWorldObject awo : fullList){
if(awo.equals(tracker))
continue;
PlayerCharacter pc = (PlayerCharacter)awo;
if(!pc.isAlive())
continue;
if(guildsPresent.contains(pc.guild.getNation()))
list.add(pc);
}
return list;
}
private static void sendRecyclePower(int token, ClientConnection origin) { private static void sendRecyclePower(int token, ClientConnection origin) {
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token); RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token);
@ -2325,7 +2189,7 @@ public enum PowersManager {
// set player is not casting for regens // set player is not casting for regens
if (pc.isCasting()) { if (pc.isCasting()) {
pc.update(false); pc.update();
} }
pc.setIsCasting(false); pc.setIsCasting(false);
@ -2377,26 +2241,28 @@ public enum PowersManager {
defense = 0f; defense = 0f;
// Get hit chance // Get hit chance
//if (pc.getDebug(16)) { if (pc.getDebug(16)) {
// String smsg = "ATR: " + atr + ", Defense: " + defense; String smsg = "ATR: " + atr + ", Defense: " + defense;
// ChatManager.chatSystemInfo(pc, smsg); ChatManager.chatSystemInfo(pc, smsg);
//} }
//int chance; int chance;
//if (atr > defense || defense == 0) if (atr > defense || defense == 0)
// chance = 94; chance = 94;
//else { else {
// float dif = atr / defense; float dif = atr / defense;
// if (dif <= 0.8f) if (dif <= 0.8f)
// chance = 4; chance = 4;
// else else
// chance = ((int) (450 * (dif - 0.8f)) + 4); chance = ((int) (450 * (dif - 0.8f)) + 4);
//} }
// calculate hit/miss // calculate hit/miss
int roll = ThreadLocalRandom.current().nextInt(100);
if (CombatManager.LandHit((int)atr,(int)defense)) { boolean disable = true;
if (roll < chance) {
// Hit, check if dodge kicked in // Hit, check if dodge kicked in
if (awo instanceof AbstractCharacter) { if (awo instanceof AbstractCharacter) {
AbstractCharacter tarAc = (AbstractCharacter) awo; AbstractCharacter tarAc = (AbstractCharacter) awo;
@ -2696,9 +2562,7 @@ public enum PowersManager {
} }
public static void cancelOnStun(AbstractCharacter ac) { public static void cancelOnStun(AbstractCharacter ac) {
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
//PlayerCharacter.GroundPlayer((PlayerCharacter)ac);
}
} }
private static PowersBase getLastPower(AbstractCharacter ac) { private static PowersBase getLastPower(AbstractCharacter ac) {

34
src/engine/gameManager/SimulationManager.java

@ -10,7 +10,10 @@ package engine.gameManager;
import engine.Enum; import engine.Enum;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.objects.*; import engine.objects.AbstractGameObject;
import engine.objects.City;
import engine.objects.PlayerCharacter;
import engine.objects.Runegate;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.sql.Connection; import java.sql.Connection;
@ -30,7 +33,7 @@ public enum SimulationManager {
SERVERHEARTBEAT; SERVERHEARTBEAT;
private static final long CITY_PULSE = 2000; private static final long CITY_PULSE = 2000;
private static final long RUNEGATE_PULSE = 1000; private static final long RUNEGATE_PULSE = 3000;
private static final long UPDATE_PULSE = 1000; private static final long UPDATE_PULSE = 1000;
private static final long FlIGHT_PULSE = 100; private static final long FlIGHT_PULSE = 100;
public static Duration executionTime = Duration.ofNanos(1); public static Duration executionTime = Duration.ofNanos(1);
@ -113,18 +116,9 @@ public enum SimulationManager {
} }
try { try {
if ((_cityPulseTime != 0) && (System.currentTimeMillis() > _cityPulseTime)) { if ((_cityPulseTime != 0)
try { && (System.currentTimeMillis() > _cityPulseTime))
pulseCities(); pulseCities();
}catch(Exception e){
}
try {
ArenaManager.pulseArenas();
}catch(Exception e){
}
}
} catch (Exception e) { } catch (Exception e) {
Logger.error( Logger.error(
"Fatal error in City Pulse: DISABLED. Error Message : " "Fatal error in City Pulse: DISABLED. Error Message : "
@ -160,7 +154,7 @@ public enum SimulationManager {
if (player == null) if (player == null)
continue; continue;
player.update(false); player.update();
} }
_updatePulseTime = System.currentTimeMillis() + 500; _updatePulseTime = System.currentTimeMillis() + 500;
@ -209,12 +203,8 @@ public enum SimulationManager {
city = (City) cityObject; city = (City) cityObject;
city.onEnter(); city.onEnter();
} }
for(Mine mine : Mine.getMines()){
if(mine != null && mine.isActive)
mine.onEnter();
}
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
_cityPulseTime = System.currentTimeMillis() + CITY_PULSE;
} }
/* /*
@ -224,10 +214,6 @@ public enum SimulationManager {
private void pulseRunegates() { private void pulseRunegates() {
for (Runegate runegate : Runegate._runegates.values()) { for (Runegate runegate : Runegate._runegates.values()) {
for(Portal portal : runegate._portals)
if(!portal.isActive())
portal.activate(false);
runegate.collidePortals(); runegate.collidePortals();
} }

347
src/engine/gameManager/StrongholdManager.java

@ -1,347 +0,0 @@
package engine.gameManager;
import engine.Enum;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.WorldGrid;
import engine.math.Vector3f;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ThreadLocalRandom;
public class StrongholdManager {
public static void processStrongholds() {
ArrayList<Mine> mines = Mine.getMines();
//process strongholds selecting 3 randomly to become active
int count = 0;
while (count < 3) {
int random = ThreadLocalRandom.current().nextInt(1, mines.size()) - 1;
Mine mine = mines.get(random);
if (mine != null) {
if (!mine.isActive && !mine.isStronghold) {
StartStronghold(mine);
count++;
}
}
}
}
public static void StartStronghold(Mine mine){
//remove buildings
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
if(tower == null)
return;
mine.isStronghold = true;
mine.strongholdMobs = new ArrayList<>();
mine.oldBuildings = new HashMap<>();
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
for(Building building : mineZone.zoneBuildingSet){
mine.oldBuildings.put(building.getObjectUUID(),building.meshUUID);
building.setMeshUUID(407650);
building.setMeshScale(new Vector3f(0,0,0));
InterestManager.setObjectDirty(building);
WorldGrid.updateObject(building);
}
//update tower to become stronghold mesh
tower.setMeshUUID(getStrongholdMeshID(mine.getParentZone()));
tower.setMeshScale(new Vector3f(1,1,1));
InterestManager.setObjectDirty(tower);
WorldGrid.updateObject(tower);
//create elite mobs
for(int i = 0; i < mine.capSize * 2; i++){
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(tower.loc,30);
MobBase guardBase = MobBase.getMobBase(getStrongholdGuardianID(tower.meshUUID));
Mob guard = Mob.createStrongholdMob(guardBase.getLoadID(), loc, Guild.getErrantGuild(),true,mineZone,null,0, guardBase.getFirstName(),65);
if(guard != null){
guard.parentZone = mine.getParentZone();
guard.bindLoc = loc;
guard.setLoc(loc);
guard.StrongholdGuardian = true;
guard.equipmentSetID = getStrongholdMobEquipSetID(guard);
guard.runAfterLoad();
guard.setLevel((short)65);
guard.setResists(new Resists("Elite"));
guard.spawnTime = 1000000000;
guard.BehaviourType = Enum.MobBehaviourType.Aggro;
mine.strongholdMobs.add(guard);
LootManager.GenerateStrongholdLoot(guard,false,false);
guard.healthMax = 12500;
guard.setHealth(guard.healthMax);
guard.maxDamageHandOne = 1550;
guard.minDamageHandOne = 750;
guard.atrHandOne = 1800;
guard.defenseRating = 2200;
guard.setFirstName("Elite Guardian");
InterestManager.setObjectDirty(guard);
WorldGrid.addObject(guard,loc.x,loc.z);
WorldGrid.updateObject(guard);
guard.stronghold = mine;
guard.mobPowers.clear();
guard.mobPowers.put(429399948,20); // find weakness
}
}
//create stronghold commander
Vector3fImmutable loc = tower.loc;
MobBase commanderBase = MobBase.getMobBase(getStrongholdCommanderID(tower.meshUUID));
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc,Guild.getErrantGuild(),true,mineZone,null,0, commanderBase.getFirstName(),75);
if(commander != null){
commander.parentZone = mine.getParentZone();
commander.bindLoc = loc;
commander.setLoc(loc);
commander.StrongholdCommander = true;
commander.equipmentSetID = getStrongholdMobEquipSetID(commander);
commander.runAfterLoad();
commander.setLevel((short)75);
commander.setResists(new Resists("Elite"));
commander.spawnTime = 1000000000;
commander.BehaviourType = Enum.MobBehaviourType.Aggro;
commander.mobPowers.clear();
commander.mobPowers.put(429032838, 40); // gravechill
commander.mobPowers.put(429757701,20); // magebolt
commander.mobPowers.put(429121388,20); // blight
commander.mobPowers.put(431566891,20); // lightning bolt
commander.mobPowers.put(428716075,20); // fire bolt
commander.mobPowers.put(429010987,20); // ice bolt
mine.strongholdMobs.add(commander);
LootManager.GenerateStrongholdLoot(commander,true, false);
commander.healthMax = 50000;
commander.setHealth(commander.healthMax);
commander.maxDamageHandOne = 3500;
commander.minDamageHandOne = 1500;
commander.atrHandOne = 3500;
commander.defenseRating = 3500;
commander.setFirstName("Guardian Commander");
InterestManager.setObjectDirty(commander);
WorldGrid.addObject(commander,loc.x,loc.z);
WorldGrid.updateObject(commander);
commander.stronghold = mine;
}
mine.isActive = true;
tower.setProtectionState(Enum.ProtectionState.PROTECTED);
tower.getBounds().setRegions(tower);
InterestManager.setObjectDirty(tower);
WorldGrid.updateObject(tower);
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Begun!");
Logger.info(mine.getZoneName() + "'s Stronghold Has Begun!");
}
public static void EndStronghold(Mine mine){
//restore the buildings
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
if(tower == null)
return;
mine.isStronghold = false;
//get rid of the mobs
for(Mob mob : mine.strongholdMobs) {
mob.despawn();
mob.removeFromCache();
DbManager.MobQueries.DELETE_MOB(mob);
}
//restore the buildings
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
for(Building building : mineZone.zoneBuildingSet){
if(mine.oldBuildings.containsKey(building.getObjectUUID())) {
building.setMeshUUID(mine.oldBuildings.get(building.getObjectUUID()));
building.setMeshScale(new Vector3f(1, 1, 1));
InterestManager.setObjectDirty(building);
WorldGrid.updateObject(building);
}
}
//update tower to become Mine Tower again
tower.setMeshUUID(1500100);
mine.isActive = false;
tower.setProtectionState(Enum.ProtectionState.NPC);
tower.getBounds().setRegions(tower);
InterestManager.setObjectDirty(tower);
WorldGrid.updateObject(tower);
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Concluded!");
Logger.info(mine.getZoneName() + "'s Stronghold Has Concluded!");
}
public static int getStrongholdMeshID(Zone parent){
while(!parent.isMacroZone()){
parent = parent.getParent();
if(parent.getName().equalsIgnoreCase("seafloor")){
return 0;
}
}
switch(parent.getObjectUUID()){
case 197:
case 234:
case 178:
case 122:
return 814000; //Frost Giant Hall (ICE)
case 968:
case 951:
case 313:
case 331:
return 5001500; // Lich Queens Keep (UNDEAD)
case 785:
case 761:
case 717:
case 737:
return 1306600; // Temple of the Dragon (DESERT)
case 353:
case 371:
case 388:
case 532:
return 564600; // Undead Lord's Keep (SWAMP)
case 550:
case 508:
case 475:
case 418:
return 1326600; // elven hall
case 437:
case 491:
case 590:
case 569:
return 602400;
case 824:
case 842:
case 632:
return 1600000; // chaos temple
}
return 456100; // small stockade
}
public static int getStrongholdGuardianID(int ID){
switch(ID){
case 814000:
return 253004; // Mountain Giant Raider Axe
case 5001500:
return 253008; // Vampire Spear Warrior
case 1306600:
return 253007; // Desert Orc Warrior
case 564600:
return 253010; // Kolthoss Warrior
case 1326600:
return 253005; //elven warrior
case 602400:
return 253009; // templar missionary
case 1600000:
return 253006; // scourger
}
return 13434; // human sword and board warrior
}
public static int getStrongholdEpicID(int ID){
switch(ID){
case 814000:
return 253023; // Mountain Giant Raider Axe
case 5001500:
return 253022; // Vampire Spear Warrior
case 1306600:
return 253021; // Desert Orc Warrior
case 564600:
return 253018; // Kolthoss Warrior
case 1326600:
return 253019; //elven warrior
case 602400:
return 253024; // templar missionary
case 1600000:
return 253020; // scourger
}
return 13434; // human sword and board warrior
}
public static int getStrongholdCommanderID(int ID){
switch(ID){
case 814000:
return 253017;
case 5001500:
return 253012;
case 1306600:
return 253016; // Desert Orc Xbow
case 564600:
return 253011; // xbow kolthoss
case 1326600:
return 253013; //elven bow warrior
case 602400:
return 253015; // dune giant with xbow
case 1600000:
return 253014; // barbator
}
return 13433;
}
public static int getStrongholdMobEquipSetID(Mob mob) {
if(mob.StrongholdGuardian){
return 6327;
}else{
return 10790;
}
}
public static void CheckToEndStronghold(Mine mine) {
boolean stillAlive = false;
for (Mob mob : mine.strongholdMobs)
if (mob.isAlive())
stillAlive = true;
if (!stillAlive) {
// Epic encounter
Building tower = BuildingManager.getBuilding(mine.getBuildingID());
if (tower == null)
return;
Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
Vector3fImmutable loc = tower.loc;
MobBase commanderBase = MobBase.getMobBase(getStrongholdEpicID(tower.meshUUID));
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc, Guild.getErrantGuild(), true, mineZone, null, 0, commanderBase.getFirstName(), 75);
if (commander != null) {
commander.parentZone = mine.getParentZone();
commander.bindLoc = loc;
commander.setLoc(loc);
commander.StrongholdEpic = true;
commander.equipmentSetID = getStrongholdMobEquipSetID(commander);
commander.runAfterLoad();
commander.setLevel((short) 85);
commander.setResists(new Resists("Elite"));
commander.spawnTime = 1000000000;
commander.BehaviourType = Enum.MobBehaviourType.Aggro;
commander.mobPowers.clear();
commander.mobPowers.put(429032838, 40); // gravechill
commander.mobPowers.put(429757701,40); // magebolt
commander.mobPowers.put(429121388,40); // blight
commander.mobPowers.put(431566891,40); // lightning bolt
commander.mobPowers.put(428716075,40); // fire bolt
commander.mobPowers.put(429010987,40); // ice bolt
mine.strongholdMobs.add(commander);
LootManager.GenerateStrongholdLoot(commander, true, true);
commander.healthMax = 250000;
commander.setHealth(commander.healthMax);
commander.maxDamageHandOne = 5000;
commander.minDamageHandOne = 2500;
commander.atrHandOne = 5000;
commander.defenseRating = 3500;
commander.setFirstName("Defender of " + mine.getParentZone().getParent().getName());
InterestManager.setObjectDirty(commander);
WorldGrid.addObject(commander,loc.x,loc.z);
WorldGrid.updateObject(commander);
commander.stronghold = mine;
}
}
}
}

2
src/engine/gameManager/TradeManager.java

@ -151,7 +151,7 @@ public enum TradeManager {
} }
public static void invalidTradeRequest(InvalidTradeRequestMsg msg) { public static void invalidTradeRequest(InvalidTradeRequestMsg msg) {
PlayerCharacter requester = PlayerManager.getFromCache(msg.getRequesterID()); PlayerCharacter requester = PlayerCharacter.getFromCache(msg.getRequesterID());
Dispatch dispatch; Dispatch dispatch;
dispatch = Dispatch.borrow(requester, msg); dispatch = Dispatch.borrow(requester, msg);

195
src/engine/gameManager/ZergManager.java

@ -1,195 +0,0 @@
package engine.gameManager;
import engine.objects.Guild;
public class ZergManager {
public static float getCurrentMultiplier(int count, int maxCount){
switch(maxCount) {
case 3: return getMultiplier3Man(count);
case 5: return getMultiplier5Man(count);
case 10: return getMultiplier10Man(count);
case 20: return getMultiplier20Man(count);
case 30: return getMultiplier30Man(count);
case 40: return getMultiplier40Man(count);
default: return 1.0f; //unlimited
}
}
public static float getMultiplier3Man(int count) {
if(count < 4)
return 1.0f;
if(count > 6)
return 0.0f;
switch(count){
case 4: return 0.63f;
case 5: return 0.40f;
case 6: return 0.25f;
default: return 1.0f;
}
}
public static float getMultiplier5Man(int count) {
if(count < 6)
return 1.0f;
if(count > 10)
return 0.0f;
switch(count){
case 6: return 0.75f;
case 7: return 0.57f;
case 8: return 0.44f;
case 9: return 0.33f;
case 10: return 0.25f;
default: return 1.0f;
}
}
public static float getMultiplier10Man(int count) {
if(count < 11)
return 1.0f;
if(count > 20)
return 0.0f;
switch(count){
case 11: return 0.86f;
case 12: return 0.75f;
case 13: return 0.65f;
case 14: return 0.57f;
case 15: return 0.50f;
case 16: return 0.44f;
case 17: return 0.38f;
case 18: return 0.33f;
case 19: return 0.29f;
case 20: return 0.25f;
default: return 1.0f;
}
}
public static float getMultiplier20Man(int count) {
if(count < 21)
return 1.0f;
if(count > 40)
return 0.0f;
switch (count)
{
case 21: return 0.93f;
case 22: return 0.86f;
case 23: return 0.80f;
case 24: return 0.75f;
case 25: return 0.70f;
case 26: return 0.65f;
case 27: return 0.61f;
case 28: return 0.57f;
case 29: return 0.53f;
case 30: return 0.50f;
case 31: return 0.47f;
case 32: return 0.44f;
case 33: return 0.41f;
case 34: return 0.38f;
case 35: return 0.36f;
case 36: return 0.33f;
case 37: return 0.31f;
case 38: return 0.29f;
case 39: return 0.27f;
case 40: return 0.25f;
default: return 1.0f;
}
}
public static float getMultiplier30Man(int count) {
if(count < 31)
return 1.0f;
if(count > 60)
return 0.0f;
switch (count)
{
case 31: return 0.95f;
case 32: return 0.91f;
case 33: return 0.86f;
case 34: return 0.82f;
case 35: return 0.79f;
case 36: return 0.75f;
case 37: return 0.72f;
case 38: return 0.68f;
case 39: return 0.65f;
case 40: return 0.63f;
case 41: return 0.60f;
case 42: return 0.57f;
case 43: return 0.55f;
case 44: return 0.52f;
case 45: return 0.50f;
case 46: return 0.48f;
case 47: return 0.46f;
case 48: return 0.44f;
case 49: return 0.42f;
case 50: return 0.40f;
case 51: return 0.38f;
case 52: return 0.37f;
case 53: return 0.35f;
case 54: return 0.33f;
case 55: return 0.32f;
case 56: return 0.30f;
case 57: return 0.29f;
case 58: return 0.28f;
case 59: return 0.26f;
case 60: return 0.25f;
default: return 1.0f;
}
}
public static float getMultiplier40Man(int count) {
if(count < 41)
return 1.0f;
if(count > 80)
return 0.0f;
switch (count)
{
case 41: return 0.96f;
case 42: return 0.93f;
case 43: return 0.90f;
case 44: return 0.86f;
case 45: return 0.83f;
case 46: return 0.80f;
case 47: return 0.78f;
case 48: return 0.75f;
case 49: return 0.72f;
case 50: return 0.70f;
case 51: return 0.68f;
case 52: return 0.65f;
case 53: return 0.63f;
case 54: return 0.61f;
case 55: return 0.59f;
case 56: return 0.57f;
case 57: return 0.55f;
case 58: return 0.53f;
case 59: return 0.52f;
case 60: return 0.50f;
case 61: return 0.48f;
case 62: return 0.47f;
case 63: return 0.45f;
case 64: return 0.44f;
case 65: return 0.42f;
case 66: return 0.41f;
case 67: return 0.40f;
case 68: return 0.38f;
case 69: return 0.37f;
case 70: return 0.36f;
case 71: return 0.35f;
case 72: return 0.33f;
case 73: return 0.32f;
case 74: return 0.31f;
case 75: return 0.30f;
case 76: return 0.29f;
case 77: return 0.28f;
case 78: return 0.27f;
case 79: return 0.26f;
case 80: return 0.25f;
default: return 1.0f;
}
}
}

73
src/engine/gameManager/ZoneManager.java

@ -19,12 +19,14 @@ import engine.objects.Building;
import engine.objects.City; import engine.objects.City;
import engine.objects.Zone; import engine.objects.Zone;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
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.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;
/* /*
* Class contains methods and structures which * Class contains methods and structures which
@ -107,6 +109,20 @@ public enum ZoneManager {
} }
// Returns the number of available hotZones
// remaining in this cycle (1am)
public static int availableHotZones() {
int count = 0;
for (Zone zone : ZoneManager.macroZones)
if (ZoneManager.validHotZone(zone))
count = count + 1;
return count;
}
// Resets the availability of hotZones // Resets the availability of hotZones
// for this cycle // for this cycle
@ -201,6 +217,63 @@ public enum ZoneManager {
ZoneManager.playerCityZones.add(zone); ZoneManager.playerCityZones.add(zone);
} }
public static final void generateAndSetRandomHotzone() {
Zone hotZone;
ArrayList<Integer> zoneArray = new ArrayList<>();
if (ZoneManager.macroZones.isEmpty())
return;
// Reset hotZone availability if none are left.
if (ZoneManager.availableHotZones() == 0)
ZoneManager.resetHotZones();
for (Zone zone : ZoneManager.macroZones)
if (validHotZone(zone))
zoneArray.add(zone.getObjectUUID());
int entryIndex = ThreadLocalRandom.current().nextInt(zoneArray.size());
hotZone = ZoneManager.getZoneByUUID(zoneArray.get(entryIndex));
if (hotZone == null) {
Logger.error("Hotzone is null");
return;
}
ZoneManager.setHotZone(hotZone);
}
public static final boolean validHotZone(Zone zone) {
if (zone.getSafeZone() == (byte) 1)
return false; // no safe zone hotzones// if (this.hotzone == null)
if (zone.getNodes().isEmpty())
return false;
if (zone.equals(ZoneManager.seaFloor))
return false;
//no duplicate hotZones
if (zone.hasBeenHotzone == true)
return false;
// Enforce min level
if (zone.minLvl < Integer.parseInt(ConfigManager.MB_HOTZONE_MIN_LEVEL.getValue()))
return false;
if (ZoneManager.hotZone != null)
return ZoneManager.hotZone.getObjectUUID() != zone.getObjectUUID();
return true;
}
// Converts world coordinates to coordinates local to a given zone. // Converts world coordinates to coordinates local to a given zone.
public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector, public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector,

3
src/engine/jobs/DatabaseUpdateJob.java

@ -11,7 +11,6 @@ package engine.jobs;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
import engine.job.AbstractScheduleJob; import engine.job.AbstractScheduleJob;
import engine.objects.AbstractGameObject; import engine.objects.AbstractGameObject;
import engine.objects.Building; import engine.objects.Building;
@ -40,7 +39,7 @@ public class DatabaseUpdateJob extends AbstractScheduleJob {
switch (this.type) { switch (this.type) {
case "Skills": case "Skills":
PlayerManager.updateSkillsAndPowersToDatabase(pc); pc.updateSkillsAndPowersToDatabase();
break; break;
case "Stats": case "Stats":
DbManager.PlayerCharacterQueries.UPDATE_CHARACTER_STATS(pc); DbManager.PlayerCharacterQueries.UPDATE_CHARACTER_STATS(pc);

14
src/engine/jobs/FinishSummonsJob.java

@ -11,7 +11,7 @@ package engine.jobs;
import engine.Enum.ModType; import engine.Enum.ModType;
import engine.Enum.SourceType; import engine.Enum.SourceType;
import engine.gameManager.PlayerManager; import engine.gameManager.PowersManager;
import engine.job.AbstractScheduleJob; import engine.job.AbstractScheduleJob;
import engine.job.JobContainer; import engine.job.JobContainer;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
@ -47,13 +47,13 @@ public class FinishSummonsJob extends AbstractScheduleJob {
return; return;
// cannot summon a player in combat // cannot summon a player in combat
//if (this.target.isCombat()) { if (this.target.isCombat()) {
// ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat."); ErrorPopupMsg.sendErrorMsg(this.source, "Cannot summon player in combat.");
// PowersManager.finishRecycleTime(428523680, this.source, false); PowersManager.finishRecycleTime(428523680, this.source, false);
// return; return;
//} }
if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) { if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) {
ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!"); ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!");
@ -64,7 +64,7 @@ public class FinishSummonsJob extends AbstractScheduleJob {
if (this.source.region != null) if (this.source.region != null)
this.target.setRegion(this.source.region); this.target.setRegion(this.source.region);
//teleport target to source //teleport target to source
PlayerManager.teleport(target, source.getLoc()); target.teleport(source.getLoc());
} }
@Override @Override

3
src/engine/jobs/StuckJob.java

@ -9,7 +9,6 @@
package engine.jobs; package engine.jobs;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.gameManager.PlayerManager;
import engine.job.AbstractScheduleJob; import engine.job.AbstractScheduleJob;
import engine.math.Bounds; import engine.math.Bounds;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
@ -70,7 +69,7 @@ public class StuckJob extends AbstractScheduleJob {
return; return;
} }
PlayerManager.teleport(player, stuckLoc); player.teleport(stuckLoc);
} }

3
src/engine/jobs/TeleportJob.java

@ -9,7 +9,6 @@
package engine.jobs; package engine.jobs;
import engine.gameManager.PlayerManager;
import engine.job.AbstractScheduleJob; import engine.job.AbstractScheduleJob;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
@ -53,7 +52,7 @@ public class TeleportJob extends AbstractScheduleJob {
return; return;
} }
PlayerManager.teleport(pc, loc); pc.teleport(loc);
if (this.setSafeMode) if (this.setSafeMode)
pc.setSafeMode(); pc.setSafeMode();

22
src/engine/loot/ItemTableEntry.java

@ -9,12 +9,10 @@
package engine.loot; package engine.loot;
import engine.gameManager.LootManager; import engine.gameManager.LootManager;
import org.pmw.tinylog.Logger;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class ItemTableEntry { public class ItemTableEntry {
public int minRoll; public int minRoll;
@ -37,23 +35,11 @@ public class ItemTableEntry {
List<ItemTableEntry> itemTableEntryList; List<ItemTableEntry> itemTableEntryList;
itemTableEntryList = LootManager._itemTables.get(itemTable); itemTableEntryList = LootManager._itemTables.get(itemTable);
if(itemTableEntryList != null) {
for (ItemTableEntry iteration : itemTableEntryList)
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
itemTableEntry = iteration;
}
return itemTableEntry;
}
public static Integer getRandomItem(int itemTable) {
int id = 0;
List<ItemTableEntry> itemTableEntryList;
itemTableEntryList = LootManager._itemTables.get(itemTable); for (ItemTableEntry iteration : itemTableEntryList)
if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
itemTableEntry = iteration;
if(itemTableEntryList != null && itemTableEntryList.size() > 1){ return itemTableEntry;
id = itemTableEntryList.get(ThreadLocalRandom.current().nextInt(0, itemTableEntryList.size())).cacheID;
}
return id;
} }
} }

10
src/engine/loot/ModTableEntry.java

@ -33,11 +33,11 @@ public class ModTableEntry {
List<ModTableEntry> itemTableEntryList; List<ModTableEntry> itemTableEntryList;
itemTableEntryList = LootManager._modTables.get(modTablwe); itemTableEntryList = LootManager._modTables.get(modTablwe);
if(itemTableEntryList != null) {
for (ModTableEntry iteration : itemTableEntryList) for (ModTableEntry iteration : itemTableEntryList)
if (roll >= iteration.minRoll && roll <= iteration.maxRoll) if (roll >= iteration.minRoll && roll <= iteration.maxRoll)
modTableEntry = iteration; modTableEntry = iteration;
}
return modTableEntry; return modTableEntry;
} }
} }

2
src/engine/math/Bounds.java

@ -220,7 +220,7 @@ public class Bounds {
//player is inside building region, skip collision check. we only do collision from the outside. //player is inside building region, skip collision check. we only do collision from the outside.
if (player.region != null && player.region.parentBuildingID == building.getObjectUUID()) if (player.region != null && player.region.parentBuildingID == building.getObjectUUID())
continue; continue;
if (building.getBounds() == null || building.getBounds().colliders == null) if (building.getBounds().colliders == null)
continue; continue;
for (Colliders collider : building.getBounds().colliders) { for (Colliders collider : building.getBounds().colliders) {

140
src/engine/mobileAI/MobAI.java

@ -9,6 +9,7 @@
package engine.mobileAI; package engine.mobileAI;
import engine.Enum; import engine.Enum;
import engine.Enum.DispatchChannel;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.gameManager.*; import engine.gameManager.*;
import engine.math.Vector3f; import engine.math.Vector3f;
@ -16,7 +17,9 @@ import engine.math.Vector3fImmutable;
import engine.mobileAI.Threads.MobAIThread; import engine.mobileAI.Threads.MobAIThread;
import engine.mobileAI.utilities.CombatUtilities; import engine.mobileAI.utilities.CombatUtilities;
import engine.mobileAI.utilities.MovementUtilities; import engine.mobileAI.utilities.MovementUtilities;
import engine.net.DispatchMessage;
import engine.net.client.msg.PerformActionMsg; import engine.net.client.msg.PerformActionMsg;
import engine.net.client.msg.PowerProjectileMsg;
import engine.objects.*; import engine.objects.*;
import engine.powers.ActionsBase; import engine.powers.ActionsBase;
import engine.powers.PowersBase; import engine.powers.PowersBase;
@ -79,16 +82,6 @@ public class MobAI {
mob.updateLocation(); mob.updateLocation();
if(mob.StrongholdGuardian || mob.StrongholdEpic){
// attempt to ground all players in attack range
for(int i : mob.playerAgroMap.keySet()){
PlayerCharacter tar = PlayerManager.getFromCache(i);
if(tar != null && tar.loc.distanceSquared(mob.loc) < 80){
PowersManager.applyPower(mob,tar,tar.loc, 111111,40,false);
}
}
}
} catch (Exception e) { } catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage());
} }
@ -163,12 +156,9 @@ public class MobAI {
try { try {
if(mob == null || target == null)
return;
if (target.getRank() == -1 || !target.isVulnerable() || BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) { if (target.getRank() == -1 || !target.isVulnerable() || BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
mob.setCombatTarget(null); mob.setCombatTarget(null);
return; return;
} }
City playercity = ZoneManager.getCityAtLocation(mob.getLoc()); City playercity = ZoneManager.getCityAtLocation(mob.getLoc());
@ -176,7 +166,7 @@ public class MobAI {
if (playercity != null) if (playercity != null)
for (Mob guard : playercity.getParent().zoneMobSet) for (Mob guard : playercity.getParent().zoneMobSet)
if (guard.BehaviourType != null && guard.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) if (guard.BehaviourType != null && guard.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal())
if (guard.getCombatTarget() == null && guard.getGuild() != null && mob.getGuild() != null && !guard.getGuild().equals(mob.getGuild())) if (guard.getCombatTarget() == null && !guard.getGuild().equals(mob.getGuild()))
guard.setCombatTarget(mob); guard.setCombatTarget(mob);
if (mob.isSiege()) if (mob.isSiege())
@ -205,11 +195,11 @@ public class MobAI {
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay); mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
} }
//if (mob.isSiege()) { if (mob.isSiege()) {
// PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target); PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target);
// ppm.setRange(50); ppm.setRange(50);
// DispatchMessage.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false); DispatchMessage.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
//} }
} catch (Exception e) { } catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage());
@ -410,7 +400,7 @@ public class MobAI {
PerformActionMsg msg; PerformActionMsg msg;
if (!mob.StrongholdCommander && !mob.StrongholdEpic && (!mobPower.isHarmful() || mobPower.targetSelf)) { if (!mobPower.isHarmful() || mobPower.targetSelf) {
PowersManager.useMobPower(mob, mob, mobPower, powerRank); PowersManager.useMobPower(mob, mob, mobPower, powerRank);
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob); msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
} else { } else {
@ -598,9 +588,6 @@ public class MobAI {
if (mob == null) if (mob == null)
return; return;
if(mob.isAlive())
if(!mob.getMovementLoc().equals(Vector3fImmutable.ZERO))
mob.setLoc(mob.getMovementLoc());
if (mob.getTimestamps().containsKey("lastExecution") == false) if (mob.getTimestamps().containsKey("lastExecution") == false)
mob.getTimestamps().put("lastExecution", System.currentTimeMillis()); mob.getTimestamps().put("lastExecution", System.currentTimeMillis());
@ -638,6 +625,9 @@ public class MobAI {
//check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting //check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
if (mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal())
CheckToSendMobHome(mob);
return; return;
} }
@ -656,7 +646,7 @@ public class MobAI {
return; return;
} }
if(mob.isPet() == false && mob.isPlayerGuard == false) if (mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal())
CheckToSendMobHome(mob); CheckToSendMobHome(mob);
if (mob.getCombatTarget() != null) { if (mob.getCombatTarget() != null) {
@ -724,7 +714,7 @@ public class MobAI {
for (Entry playerEntry : loadedPlayers.entrySet()) { for (Entry playerEntry : loadedPlayers.entrySet()) {
int playerID = (int) playerEntry.getKey(); int playerID = (int) playerEntry.getKey();
PlayerCharacter loadedPlayer = PlayerManager.getFromCache(playerID); PlayerCharacter loadedPlayer = PlayerCharacter.getFromCache(playerID);
//Player is null, let's remove them from the list. //Player is null, let's remove them from the list.
@ -867,14 +857,16 @@ public class MobAI {
return; return;
} }
//No items in inventory. //No items in inventory.
} else if (aiAgent.isHasLoot()) {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
aiAgent.despawn();
aiAgent.deathTime = System.currentTimeMillis();
return;
}
//Mob never had Loot.
} else { } else {
//Mob's Loot has been looted.
if (aiAgent.isHasLoot()) {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
aiAgent.despawn();
aiAgent.deathTime = System.currentTimeMillis();
return;
}
//Mob never had Loot.
} else {
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER) { if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER) {
aiAgent.despawn(); aiAgent.despawn();
aiAgent.deathTime = System.currentTimeMillis(); aiAgent.deathTime = System.currentTimeMillis();
@ -882,15 +874,9 @@ public class MobAI {
} }
} }
} }
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000))) {
if(Mob.discDroppers.contains(aiAgent)) if (Zone.respawnQue.contains(aiAgent) == false) {
return;
if(aiAgent.StrongholdGuardian || aiAgent.StrongholdEpic || aiAgent.StrongholdCommander)
return;
if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000L))) {
if (!Zone.respawnQue.contains(aiAgent)) {
Zone.respawnQue.add(aiAgent); Zone.respawnQue.add(aiAgent);
} }
} }
@ -925,21 +911,7 @@ public class MobAI {
private static void CheckToSendMobHome(Mob mob) { private static void CheckToSendMobHome(Mob mob) {
if(mob.isNecroPet())
return;
try { try {
//trebs dont recall
if(mob.isSiege())
return;
if(mob.BehaviourType.equals(Enum.MobBehaviourType.Pet1)){
if(mob.loc.distanceSquared(mob.getOwner().loc) > 60 * 60)
mob.teleport(mob.getOwner().loc);
return;
}
if (mob.BehaviourType.isAgressive) { if (mob.BehaviourType.isAgressive) {
if (mob.isPlayerGuard()) { if (mob.isPlayerGuard()) {
@ -950,6 +922,9 @@ public class MobAI {
} }
} }
if (mob.getCombatTarget() != null && CombatUtilities.inRange2D(mob, mob.getCombatTarget(), MobAIThread.AI_BASE_AGGRO_RANGE * 0.5f))
return;
if (mob.isPlayerGuard() && !mob.despawned) { if (mob.isPlayerGuard() && !mob.despawned) {
City current = ZoneManager.getCityAtLocation(mob.getLoc()); City current = ZoneManager.getCityAtLocation(mob.getLoc());
@ -970,15 +945,14 @@ public class MobAI {
} }
} }
} }
} else if (!MovementUtilities.inRangeOfBindLocation(mob)) { } else if (MovementUtilities.inRangeOfBindLocation(mob) == false) {
PowersBase recall = PowersManager.getPowerByToken(-1994153779); PowersBase recall = PowersManager.getPowerByToken(-1994153779);
PowersManager.useMobPower(mob, mob, recall, 40); PowersManager.useMobPower(mob, mob, recall, 40);
mob.setCombatTarget(null); mob.setCombatTarget(null);
for (Entry playerEntry : mob.playerAgroMap.entrySet()) for (Entry playerEntry : mob.playerAgroMap.entrySet())
PlayerManager.getFromCache((int) playerEntry.getKey()).setHateValue(0); PlayerCharacter.getFromCache((int) playerEntry.getKey()).setHateValue(0);
mob.setCombatTarget(null);
} }
} catch (Exception e) { } catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage());
@ -1032,7 +1006,7 @@ public class MobAI {
//dont scan self. //dont scan self.
if (mob.equals(awoMob) || (mob.agentType.equals(Enum.AIAgentType.GUARD)) || (mob.agentType.equals(Enum.AIAgentType.PET))) if (mob.equals(awoMob) || (mob.agentType.equals(Enum.AIAgentType.GUARD)) == true)
continue; continue;
Mob aggroMob = (Mob) awoMob; Mob aggroMob = (Mob) awoMob;
@ -1055,22 +1029,9 @@ public class MobAI {
} }
} }
public static void checkToDropGuardAggro(Mob mob){
City city = mob.guardedCity;
if(city == null)
return;
if(mob.combatTarget == null)
return;
if(city._playerMemory.contains(mob.combatTarget.getObjectUUID()) && mob.combatTarget.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
mob.setCombatTarget(null);
}
public static void GuardCaptainLogic(Mob mob) { public static void GuardCaptainLogic(Mob mob) {
try { try {
checkToDropGuardAggro(mob);
if (mob.getCombatTarget() == null) if (mob.getCombatTarget() == null)
CheckForPlayerGuardAggro(mob); CheckForPlayerGuardAggro(mob);
@ -1095,8 +1056,6 @@ public class MobAI {
public static void GuardMinionLogic(Mob mob) { public static void GuardMinionLogic(Mob mob) {
try { try {
checkToDropGuardAggro(mob);
boolean isComanded = mob.npcOwner.isAlive(); boolean isComanded = mob.npcOwner.isAlive();
if (!isComanded) { if (!isComanded) {
GuardCaptainLogic(mob); GuardCaptainLogic(mob);
@ -1117,8 +1076,6 @@ public class MobAI {
public static void GuardWallArcherLogic(Mob mob) { public static void GuardWallArcherLogic(Mob mob) {
try { try {
checkToDropGuardAggro(mob);
if (mob.getCombatTarget() == null) if (mob.getCombatTarget() == null)
CheckForPlayerGuardAggro(mob); CheckForPlayerGuardAggro(mob);
else else
@ -1215,7 +1172,7 @@ public class MobAI {
for (Entry playerEntry : loadedPlayers.entrySet()) { for (Entry playerEntry : loadedPlayers.entrySet()) {
int playerID = (int) playerEntry.getKey(); int playerID = (int) playerEntry.getKey();
PlayerCharacter loadedPlayer = PlayerManager.getFromCache(playerID); PlayerCharacter loadedPlayer = PlayerCharacter.getFromCache(playerID);
//Player is null, let's remove them from the list. //Player is null, let's remove them from the list.
@ -1376,7 +1333,7 @@ public class MobAI {
for (Entry playerEntry : mob.playerAgroMap.entrySet()) { for (Entry playerEntry : mob.playerAgroMap.entrySet()) {
PlayerCharacter potentialTarget = PlayerManager.getFromCache((int) playerEntry.getKey()); PlayerCharacter potentialTarget = PlayerCharacter.getFromCache((int) playerEntry.getKey());
if (potentialTarget.equals(mob.getCombatTarget())) if (potentialTarget.equals(mob.getCombatTarget()))
continue; continue;
@ -1394,24 +1351,21 @@ public class MobAI {
return null; return null;
} }
public static void RecoverHealth(Mob mob) { public static void RecoverHealth(Mob mob){
//recover health //recover health
try {
if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false)
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000) if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false)
if (mob.getHealth() < mob.getHealthMax()) { mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None)) * 0.01f); if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
mob.setHealth(mob.getHealth() + recoveredHealth); if (mob.getHealth() < mob.getHealthMax()) {
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
if (mob.getHealth() > mob.getHealthMax()) float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None)) * 0.01f);
mob.setHealth(mob.getHealthMax()); mob.setHealth(mob.getHealth() + recoveredHealth);
} mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: RecoverHealth" + " " + e.getMessage()); if (mob.getHealth() > mob.getHealthMax())
} mob.setHealth(mob.getHealthMax());
}
} }
} }

25
src/engine/mobileAI/utilities/CombatUtilities.java

@ -139,22 +139,37 @@ public class CombatUtilities {
} }
public static boolean triggerDefense(Mob agent, AbstractWorldObject target) { public static boolean triggerDefense(Mob agent, AbstractWorldObject target) {
int defense = 0; int defenseScore = 0;
int atr = agent.getAtrHandOne(); int attackScore = agent.getAtrHandOne();
switch (target.getObjectType()) { switch (target.getObjectType()) {
case PlayerCharacter: case PlayerCharacter:
defense = ((AbstractCharacter) target).getDefenseRating(); defenseScore = ((AbstractCharacter) target).getDefenseRating();
break; break;
case Mob: case Mob:
Mob mob = (Mob) target; Mob mob = (Mob) target;
if (mob.isSiege()) if (mob.isSiege())
defense = atr; defenseScore = attackScore;
break; break;
case Building: case Building:
return false; return false;
} }
return CombatManager.LandHit(atr,defense);
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) { public static boolean triggerBlock(Mob agent, AbstractWorldObject ac) {

8
src/engine/net/NetMsgFactory.java

@ -13,8 +13,6 @@ import engine.exception.FactoryBuildException;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.Protocol; import engine.net.client.Protocol;
import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.PlaceAssetMsg;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.joda.time.DateTime; import org.joda.time.DateTime;
@ -96,9 +94,11 @@ public class NetMsgFactory {
if (origin instanceof ClientConnection) { if (origin instanceof ClientConnection) {
PlayerCharacter player = ((ClientConnection) origin).getPlayerCharacter(); PlayerCharacter player = ((ClientConnection) origin).getPlayerCharacter();
if (player != null) { if (player != null) {
// if (MBServerStatics.worldServerName.equals("Grief"))
Logger.error("Invalid protocol msg for player " + player.getFirstName() + " : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode); Logger.error("Invalid protocol msg for player " + player.getFirstName() + " : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
PlaceAssetMsg.sendPlaceAssetError(player.getClientConnection(), 1, "Please Report What You Just Did. Ref Code: " + opcode); } else
} Logger.error("Invalid protocol msg : " + opcode + " lastopcode: " + origin.lastProtocol.name() + " Error Code : " + errorCode);
} }
return null; return null;

267
src/engine/net/client/ClientMessagePump.java

@ -85,7 +85,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (pc == null) if (pc == null)
return; return;
pc.update(false); pc.update();
if (msg.getSpeed() == 2) if (msg.getSpeed() == 2)
pc.setWalkMode(false); pc.setWalkMode(false);
else else
@ -114,7 +114,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (pc == null) if (pc == null)
return; return;
pc.update(false); pc.update();
pc.setSit(msg.toggleSitStand()); pc.setSit(msg.toggleSitStand());
@ -560,30 +560,12 @@ public class ClientMessagePump implements NetMsgHandler {
if (!itemManager.inventoryContains(i)) if (!itemManager.inventoryContains(i))
return; return;
//cannot delete gold if (i.isCanDestroy())
if(i.getItemBaseID() == 7) if (itemManager.delete(i) == true) {
return;
if (i.isCanDestroy()) {
int goldValue = i.getBaseValue();
if (i.getItemBase().isRune())
goldValue = 500000;
if (i.getItemBaseID() == 980066)
goldValue = 0;
if(itemManager.getGoldInventory().getNumOfItems() + goldValue > 10000000)
return;
if (itemManager.delete(i)) {
if (goldValue > 0)
itemManager.addGoldToInventory(goldValue, false);
itemManager.updateInventory();
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg); Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
} }
}
} }
private static void ackBankWindowOpened(AckBankWindowOpenedMsg msg, ClientConnection origin) { private static void ackBankWindowOpened(AckBankWindowOpenedMsg msg, ClientConnection origin) {
@ -603,19 +585,19 @@ public class ClientMessagePump implements NetMsgHandler {
switch (type) { switch (type) {
case MBServerStatics.STAT_STR_ID: case MBServerStatics.STAT_STR_ID:
PlayerManager.addStr(pc, msg.getAmount()); pc.addStr(msg.getAmount());
break; break;
case MBServerStatics.STAT_DEX_ID: case MBServerStatics.STAT_DEX_ID:
PlayerManager.addDex(pc, msg.getAmount()); pc.addDex(msg.getAmount());
break; break;
case MBServerStatics.STAT_CON_ID: case MBServerStatics.STAT_CON_ID:
PlayerManager.addCon(pc, msg.getAmount()); pc.addCon(msg.getAmount());
break; break;
case MBServerStatics.STAT_INT_ID: case MBServerStatics.STAT_INT_ID:
PlayerManager.addInt(pc, msg.getAmount()); pc.addInt(msg.getAmount());
break; break;
case MBServerStatics.STAT_SPI_ID: case MBServerStatics.STAT_SPI_ID:
PlayerManager.addSpi(pc, msg.getAmount()); pc.addSpi(msg.getAmount());
break; break;
} }
} }
@ -641,7 +623,7 @@ public class ClientMessagePump implements NetMsgHandler {
// ResetAfterDeath player // ResetAfterDeath player
sourcePlayer.respawnLock.writeLock().lock(); sourcePlayer.respawnLock.writeLock().lock();
try { try {
PlayerManager.respawn(sourcePlayer, true, false, true); sourcePlayer.respawn(true, false, true);
} catch (Exception e) { } catch (Exception e) {
Logger.error(e); Logger.error(e);
@ -672,8 +654,6 @@ public class ClientMessagePump implements NetMsgHandler {
JobScheduler.getInstance().scheduleJob(new RefreshGroupJob(sourcePlayer), MBServerStatics.LOAD_OBJECT_DELAY); JobScheduler.getInstance().scheduleJob(new RefreshGroupJob(sourcePlayer), MBServerStatics.LOAD_OBJECT_DELAY);
} }
private static void lootWindowRequest(LootWindowRequestMsg msg, ClientConnection origin) throws MsgSendException { private static void lootWindowRequest(LootWindowRequestMsg msg, ClientConnection origin) throws MsgSendException {
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin); PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
@ -705,7 +685,7 @@ public class ClientMessagePump implements NetMsgHandler {
switch (targetType) { switch (targetType) {
case PlayerCharacter: case PlayerCharacter:
characterTarget = PlayerManager.getFromCache(msg.getTargetID()); characterTarget = PlayerCharacter.getFromCache(msg.getTargetID());
if (characterTarget == null) if (characterTarget == null)
return; return;
if (characterTarget.isAlive()) if (characterTarget.isAlive())
@ -719,7 +699,7 @@ public class ClientMessagePump implements NetMsgHandler {
lwrm = new LootWindowResponseMsg(characterTarget.getObjectType().ordinal(), characterTarget.getObjectUUID(), characterTarget.getInventory(true)); lwrm = new LootWindowResponseMsg(characterTarget.getObjectType().ordinal(), characterTarget.getObjectUUID(), characterTarget.getInventory(true));
break; break;
case NPC: case NPC:
characterTarget = NPCManager.getFromCache(msg.getTargetID()); characterTarget = NPC.getFromCache(msg.getTargetID());
if (characterTarget == null) if (characterTarget == null)
return; return;
break; break;
@ -809,7 +789,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (targetType == GameObjectType.PlayerCharacter.ordinal() || targetType == GameObjectType.Mob.ordinal()) { if (targetType == GameObjectType.PlayerCharacter.ordinal() || targetType == GameObjectType.Mob.ordinal()) {
if (targetType == GameObjectType.PlayerCharacter.ordinal()) { if (targetType == GameObjectType.PlayerCharacter.ordinal()) {
tar = PlayerManager.getFromCache(targetID); tar = PlayerCharacter.getFromCache(targetID);
if (tar == null) if (tar == null)
return; return;
@ -818,7 +798,7 @@ public class ClientMessagePump implements NetMsgHandler {
return; return;
} else if (targetType == GameObjectType.NPC.ordinal()) } else if (targetType == GameObjectType.NPC.ordinal())
tar = NPCManager.getFromCache(targetID); tar = NPC.getFromCache(targetID);
else if (targetType == GameObjectType.Mob.ordinal()) else if (targetType == GameObjectType.Mob.ordinal())
tar = Mob.getFromCache(targetID); tar = Mob.getFromCache(targetID);
if (tar == null) if (tar == null)
@ -1013,9 +993,9 @@ public class ClientMessagePump implements NetMsgHandler {
AbstractCharacter tar = null; AbstractCharacter tar = null;
if (targetType == GameObjectType.PlayerCharacter.ordinal()) if (targetType == GameObjectType.PlayerCharacter.ordinal())
tar = PlayerManager.getFromCache(msg.getTargetID()); tar = PlayerCharacter.getFromCache(msg.getTargetID());
else if (targetType == GameObjectType.NPC.ordinal()) else if (targetType == GameObjectType.NPC.ordinal())
tar = NPCManager.getFromCache(msg.getTargetID()); tar = NPC.getFromCache(msg.getTargetID());
else if (targetType == GameObjectType.Mob.ordinal()) else if (targetType == GameObjectType.Mob.ordinal())
tar = Mob.getFromCache(msg.getTargetID()); tar = Mob.getFromCache(msg.getTargetID());
@ -1150,7 +1130,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (sourcePlayer == null) if (sourcePlayer == null)
return; return;
NPC npc = NPCManager.getFromCache(msg.getNPCID()); NPC npc = NPC.getFromCache(msg.getNPCID());
if (npc == null) if (npc == null)
return; return;
@ -1166,7 +1146,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (con == null) if (con == null)
return; return;
float bargain = PlayerManager.getBargain(sourcePlayer); float bargain = sourcePlayer.getBargain();
float profit = npc.getBuyPercent(sourcePlayer) + bargain; float profit = npc.getBuyPercent(sourcePlayer) + bargain;
@ -1199,7 +1179,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (itemMan == null) if (itemMan == null)
return; return;
NPC npc = NPCManager.getFromCache(msg.getNPCID()); NPC npc = NPC.getFromCache(msg.getNPCID());
if (npc == null) if (npc == null)
return; return;
@ -1263,15 +1243,13 @@ public class ClientMessagePump implements NetMsgHandler {
cost = sell.getBaseValue(); cost = sell.getBaseValue();
if(sell.getItemBaseID() == 980066)
cost = 0;
//apply damaged value reduction //apply damaged value reduction
float durabilityCurrent = sell.getDurabilityCurrent(); float durabilityCurrent = sell.getDurabilityCurrent();
float durabilityMax = sell.getDurabilityMax(); float durabilityMax = sell.getDurabilityMax();
float damagedModifier = durabilityCurrent / durabilityMax; float damagedModifier = durabilityCurrent / durabilityMax;
cost *= damagedModifier; cost *= damagedModifier;
float bargain = PlayerManager.getBargain(player); float bargain = player.getBargain();
float profit = npc.getBuyPercent(player) + bargain; float profit = npc.getBuyPercent(player) + bargain;
@ -1363,14 +1341,12 @@ public class ClientMessagePump implements NetMsgHandler {
if (sourcePlayer == null) if (sourcePlayer == null)
return; return;
NPC npc = NPCManager.getFromCache(msg.getNpcID()); NPC npc = NPC.getFromCache(msg.getNpcID());
if (npc == null) if (npc == null)
return; return;
// test within talking range // test within talking range
if(npc.isInSafeZone())
npc.sellPercent = 0;
if (sourcePlayer.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) { if (sourcePlayer.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 14); ErrorPopupMsg.sendErrorPopup(sourcePlayer, 14);
@ -1382,192 +1358,219 @@ public class ClientMessagePump implements NetMsgHandler {
} }
private static void buyFromNPC(BuyFromNPCMsg msg, ClientConnection origin) { private static void buyFromNPC(BuyFromNPCMsg msg, ClientConnection origin) {
PlayerCharacter sourcePlayer = SessionManager.getPlayerCharacter(origin); PlayerCharacter sourcePlayer = SessionManager.getPlayerCharacter(origin);
if (sourcePlayer == null) if (sourcePlayer == null)
return; return;
if (origin.buyLock.tryLock()) { if (origin.buyLock.tryLock()) {
try { try {
CharacterItemManager itemMan = sourcePlayer.getCharItemManager(); CharacterItemManager itemMan = sourcePlayer.getCharItemManager();
if (itemMan == null) {
if (itemMan == null)
return; return;
}
NPC npc = NPCManager.getFromCache(msg.getNPCID()); NPC npc = NPC.getFromCache(msg.getNPCID());
if (npc == null) {
if (npc == null)
return; return;
}
Item gold = itemMan.getGoldInventory(); Item gold = itemMan.getGoldInventory();
if (gold == null) {
if (gold == null)
return; return;
}
Item buy = null; Item buy = null;
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) { if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory(); ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
//if(npc.contract.getObjectUUID() == 890){ // default steward if (sellInventory == null)
// sellInventory = npc.getSellInventorySteward();
//}
//if(npc.contract.getObjectUUID() == 889){ // default builder
// sellInventory = npc.getSellInventoryBuilder();
//}
if (sellInventory == null) {
return; return;
}
for (MobEquipment me : sellInventory) { for (MobEquipment me : sellInventory) {
if (me.getObjectUUID() == msg.getItemID()) { if (me.getObjectUUID() == msg.getItemID()) {
ItemBase ib = me.getItemBase(); ItemBase ib = me.getItemBase();
if (ib == null) { if (ib == null)
return; return;
}
//test room available for item //test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight())) { if (!itemMan.hasRoomInventory(ib.getWeight()))
return; return;
}
int cost = me.getMagicValue(); int cost = me.getMagicValue();
float bargain = PlayerManager.getBargain(sourcePlayer);
switch(npc.getContractID()){
case 1201:
cost = ItemBase.getDiscPrice(ib.getUUID());
bargain = 0;
break;
case 1202:
cost = ItemBase.getStatPrice(ib.getUUID());
bargain = 0;
break;
case 900:
cost = Warehouse.getCostForResource(ib.getUUID()) * Warehouse.getSellStackSize(ib.getUUID());
bargain = 0;
break;
}
float profit;
if(npc.isInSafeZone()) float bargain = sourcePlayer.getBargain();
profit = 0;
else
profit = npc.getSellPercent(sourcePlayer) - bargain;
float profit = npc.getSellPercent(sourcePlayer) - bargain;
if (profit < 1)
profit = 1;
cost *= profit;
if(profit > 0)
cost *= profit;
if (gold.getNumOfItems() - cost < 0) { if (gold.getNumOfItems() - cost < 0) {
//dont' have enough goldItem exit! //dont' have enough goldItem exit!
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold."); // chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
return; return;
} }
Building b = (!npc.isStatic()) ? npc.getBuilding() : null; Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null && b.getProtectionState().equals(ProtectionState.NPC)) if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
b = null; b = null;
int buildingDeposit = cost - me.getMagicValue(); int buildingDeposit = cost - me.getMagicValue();
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) { if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206); ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
return; return;
}if(npc.getContractID() == 1502041){ }
me.fromNoob = true;
} else if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) { if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
// chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item."); // chatMan.chatSystemInfo(pc, "" + "You Failed to buy the item.");
ChatManager.chatSystemError(sourcePlayer, "Failed To Buy Item");
return; return;
} }
if(me.getItemBase().getType().equals(ItemType.RESOURCE) && npc.getContractID() == 900){
handleResourcePurchase(me,itemMan,sourcePlayer,ib); buy = Item.createItemForPlayer(sourcePlayer, ib);
}else {
buy = Item.createItemForPlayer(sourcePlayer, ib, me.fromNoob); if (buy != null) {
if (buy != null) { me.transferEnchants(buy);
me.transferEnchants(buy); itemMan.addItemToInventory(buy);
itemMan.addItemToInventory(buy); //itemMan.updateInventory();
if(npc.contractUUID == 900 && buy.getItemBaseID() == 1705032){
buy.setNumOfItems(10);
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
}
//itemMan.updateInventory();
}
} }
} }
} }
} else if (msg.getItemType() == GameObjectType.Item.ordinal()) { } else if (msg.getItemType() == GameObjectType.Item.ordinal()) {
CharacterItemManager npcCim = npc.getCharItemManager(); CharacterItemManager npcCim = npc.getCharItemManager();
if (npcCim == null) if (npcCim == null)
return; return;
buy = Item.getFromCache(msg.getItemID()); buy = Item.getFromCache(msg.getItemID());
if (buy == null) if (buy == null)
return; return;
ItemBase ib = buy.getItemBase(); ItemBase ib = buy.getItemBase();
if (ib == null) if (ib == null)
return; return;
if (!npcCim.inventoryContains(buy)) if (!npcCim.inventoryContains(buy))
return; return;
//test room available for item //test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight())) if (!itemMan.hasRoomInventory(ib.getWeight()))
return; return;
//TODO test cost and subtract goldItem //TODO test cost and subtract goldItem
//TODO CHnage this if we ever put NPc city npcs in buildings. //TODO CHnage this if we ever put NPc city npcs in buildings.
int cost = buy.getBaseValue(); int cost = buy.getBaseValue();
if (buy.isID() || buy.isCustomValue()) if (buy.isID() || buy.isCustomValue())
cost = buy.getMagicValue(); cost = buy.getMagicValue();
float bargain = PlayerManager.getBargain(sourcePlayer);
float bargain = sourcePlayer.getBargain();
float profit = npc.getSellPercent(sourcePlayer) - bargain; float profit = npc.getSellPercent(sourcePlayer) - bargain;
if (profit < 1) if (profit < 1)
profit = 1; profit = 1;
if (!buy.isCustomValue()) if (!buy.isCustomValue())
cost *= profit; cost *= profit;
else else
cost = buy.getValue(); cost = buy.getValue();
if (gold.getNumOfItems() - cost < 0) { if (gold.getNumOfItems() - cost < 0) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
return; return;
} }
Building b = (!npc.isStatic()) ? npc.getBuilding() : null; Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null) if (b != null)
if (b.getProtectionState().equals(ProtectionState.NPC)) if (b.getProtectionState().equals(ProtectionState.NPC))
b = null; b = null;
int buildingDeposit = cost; int buildingDeposit = cost;
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206); ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
return; return;
} }
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) { if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 110); ErrorPopupMsg.sendErrorPopup(sourcePlayer, 110);
return; return;
} }
if (buy != null) if (buy != null)
itemMan.buyFromNPC(buy, npc); itemMan.buyFromNPC(buy, npc);
} else if (msg.getItemType() == GameObjectType.MobLoot.ordinal()) { } else if (msg.getItemType() == GameObjectType.MobLoot.ordinal()) {
CharacterItemManager npcCim = npc.getCharItemManager(); CharacterItemManager npcCim = npc.getCharItemManager();
if (npcCim == null) if (npcCim == null)
return; return;
buy = MobLoot.getFromCache(msg.getItemID()); buy = MobLoot.getFromCache(msg.getItemID());
if (buy == null) if (buy == null)
return; return;
ItemBase ib = buy.getItemBase(); ItemBase ib = buy.getItemBase();
if (ib == null) if (ib == null)
return; return;
if (!npcCim.inventoryContains(buy)) if (!npcCim.inventoryContains(buy))
return; return;
//test room available for item //test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight())) if (!itemMan.hasRoomInventory(ib.getWeight()))
return; return;
//TODO test cost and subtract goldItem //TODO test cost and subtract goldItem
//TODO CHnage this if we ever put NPc city npcs in buildings. //TODO CHnage this if we ever put NPc city npcs in buildings.
int cost = buy.getMagicValue(); int cost = buy.getMagicValue();
cost *= npc.getSellPercent(sourcePlayer); cost *= npc.getSellPercent(sourcePlayer);
if (gold.getNumOfItems() - cost < 0) { if (gold.getNumOfItems() - cost < 0) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
return; return;
} }
Building b = (!npc.isStatic()) ? npc.getBuilding() : null; Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null && b.getProtectionState().equals(ProtectionState.NPC)) if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
b = null; b = null;
int buildingDeposit = cost; int buildingDeposit = cost;
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold() && !b.isOwnerIsNPC()) {
if (b != null && (b.getStrongboxValue() + buildingDeposit) > b.getMaxGold()) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206); ErrorPopupMsg.sendErrorPopup(sourcePlayer, 206);
return; return;
} }
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) if (!itemMan.buyFromNPC(b, cost, buildingDeposit))
return; return;
if (buy != null) if (buy != null)
itemMan.buyFromNPC(buy, npc); itemMan.buyFromNPC(buy, npc);
} else } else
return; return;
if (buy != null) { if (buy != null) {
msg.setItem(buy); msg.setItem(buy);
//send the buy message back to update player //send the buy message back to update player
// msg.setItemType(buy.getObjectType().ordinal()); // msg.setItemType(buy.getObjectType().ordinal());
@ -1576,43 +1579,14 @@ public class ClientMessagePump implements NetMsgHandler {
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
itemMan.updateInventory(); itemMan.updateInventory();
} }
} finally { } finally {
origin.buyLock.unlock(); origin.buyLock.unlock();
} }
} else { } else {
ErrorPopupMsg.sendErrorPopup(origin.getPlayerCharacter(), 12); // All production slots taken ErrorPopupMsg.sendErrorPopup(origin.getPlayerCharacter(), 12); // All production slots taken
} }
}
public static void handleResourcePurchase(MobEquipment me, CharacterItemManager itemMan, PlayerCharacter sourcePlayer, ItemBase ib){
boolean stacked = false;
int buystack = Warehouse.getSellStackSize(me.getItemBase().getUUID());
for(Item item : itemMan.getInventory()){
int itemID = item.getItemBaseID();
int meID = me.getItemBase().getUUID();
if(itemID == meID){
if(Warehouse.maxResources.isEmpty())
Warehouse.getMaxResources();
int maxStack = Warehouse.maxResources.get(itemID);
if(maxStack > item.getNumOfItems() + buystack){
item.setNumOfItems(item.getNumOfItems() + buystack);
stacked = true;
itemMan.updateInventory();
DbManager.ItemQueries.UPDATE_NUM_ITEMS(item,item.getNumOfItems());
break;
}
}
}
if(!stacked){
Item buy = Item.createItemForPlayer(sourcePlayer, ib, false);
if (buy != null) {
me.transferEnchants(buy);
itemMan.addItemToInventory(buy);
buy.setNumOfItems(buystack);
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
}
}
itemMan.updateInventory();
} }
private static void Repair(RepairMsg msg, ClientConnection origin) { private static void Repair(RepairMsg msg, ClientConnection origin) {
@ -1623,7 +1597,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (player == null) if (player == null)
return; return;
NPC npc = NPCManager.getFromCache(msg.getNPCID()); NPC npc = NPC.getFromCache(msg.getNPCID());
if (npc == null) if (npc == null)
return; return;
@ -1672,21 +1646,14 @@ public class ClientMessagePump implements NetMsgHandler {
max *= (1 + (durMod * 0.01f)); max *= (1 + (durMod * 0.01f));
if (dur >= max || dur < 1) { if (dur >= max || dur < 1) {
//redundancy message to clear item from window in client //redundancy message to clear item from window in client
if (!DbManager.ItemQueries.SET_DURABILITY(toRepair, dur))
return;
toRepair.setDurabilityCurrent(max); toRepair.setDurabilityCurrent(max);
msg.setupRepairAck(max - dur); msg.setupRepairAck(max - dur);
dispatch = Dispatch.borrow(player, msg); dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
return; return;
} }
//TODO get cost to repair
int pointsToRepair = max - dur; int cost = (int) ((max - dur) * 80.1);
double damageRatio = (double)1.0d - (toRepair.getDurabilityMax() - toRepair.getDurabilityCurrent()) / toRepair.getDurabilityMax();
int modifiedValue = (int)(damageRatio * toRepair.getMagicValue());
int costPerPoint = modifiedValue / toRepair.getDurabilityMax();
int modifiedRepairCost = (int)(pointsToRepair * costPerPoint)+ npc.getSpecialPrice();
int cost = (int)(modifiedRepairCost * 1 + npc.buyPercent) + npc.getSpecialPrice();
Building b = (!npc.isStatic()) ? npc.getBuilding() : null; Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null) if (b != null)
@ -1821,7 +1788,7 @@ public class ClientMessagePump implements NetMsgHandler {
long type = player.getTimeStamp("LastRecallType"); long type = player.getTimeStamp("LastRecallType");
if (type == 1) { //recall to bind if (type == 1) { //recall to bind
PlayerManager.teleport(player, player.getBindLoc()); player.teleport(player.getBindLoc());
player.setSafeMode(); player.setSafeMode();
} else { //recall to rg } else { //recall to rg
float dist = 9999999999f; float dist = 9999999999f;
@ -1842,7 +1809,7 @@ public class ClientMessagePump implements NetMsgHandler {
//nearest runegate found. teleport characterTarget //nearest runegate found. teleport characterTarget
if (rg != null) { if (rg != null) {
PlayerManager.teleport(player, rg.getLoc()); player.teleport(rg.getLoc());
player.setSafeMode(); player.setSafeMode();
} }
} }

7
src/engine/net/client/handlers/AcceptInviteToGuildHandler.java

@ -13,7 +13,10 @@ import engine.Enum;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.Enum.GuildHistoryType; import engine.Enum.GuildHistoryType;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.*; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.GuildManager;
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;
@ -80,7 +83,7 @@ public class AcceptInviteToGuildHandler extends AbstractClientMsgHandler {
player.setGuild(guild); player.setGuild(guild);
// Cleanup guild stuff // Cleanup guild stuff
PlayerManager.resetGuildStatuses(player); player.resetGuildStatuses();
Dispatch dispatch = Dispatch.borrow(player, msg); Dispatch dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);

2
src/engine/net/client/handlers/ArcLoginNotifyMsgHandler.java

@ -53,7 +53,7 @@ public class ArcLoginNotifyMsgHandler extends AbstractClientMsgHandler {
GroupManager.RefreshOthersGroupList(player); GroupManager.RefreshOthersGroupList(player);
} }
PlayerManager.setEnteredWorld(player, true); player.setEnteredWorld(true);
// Set player active // Set player active
player.resetRegenUpdateTime(); player.resetRegenUpdateTime();
player.setActive(true); player.setActive(true);

15
src/engine/net/client/handlers/ArcMineChangeProductionMsgHandler.java

@ -11,7 +11,6 @@ import engine.objects.GuildStatusController;
import engine.objects.Mine; import engine.objects.Mine;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
import engine.objects.Resource; import engine.objects.Resource;
import org.pmw.tinylog.Logger;
/* /*
* @Author: * @Author:
@ -36,28 +35,26 @@ public class ArcMineChangeProductionMsgHandler extends AbstractClientMsgHandler
//TODO verify this against the warehouse? //TODO verify this against the warehouse?
if (!GuildStatusController.isInnerCouncil(playerCharacter.getGuildStatus())) // is this only GL? if (GuildStatusController.isInnerCouncil(playerCharacter.getGuildStatus()) == false) // is this only GL?
return true; return true;
Mine mine = Mine.getMine(changeProductionMsg.getMineID()); Mine mine = Mine.getMine(changeProductionMsg.getMineID());
if (mine == null) { if (mine == null)
Logger.error("Player Character: " + playerCharacter.getName() + " Tried To Change Mine: " + changeProductionMsg.getMineID() + " and Mine was Null");
return true; return true;
}
//make sure mine belongs to guild //make sure mine belongs to guild
if (mine.getOwningGuild().isEmptyGuild() || mine.getOwningGuild().getObjectUUID() != playerCharacter.getGuild().getObjectUUID()) if (mine.getOwningGuild().isEmptyGuild() ||
mine.getOwningGuild().getObjectUUID() != playerCharacter.getGuild().getObjectUUID())
return true; return true;
//make sure valid resource //make sure valid resource
Resource resource = Resource.resourceByHash.get(changeProductionMsg.getResourceHash()); Resource resource = Resource.resourceByHash.get(changeProductionMsg.getResourceHash());
if (resource == null) { if (resource == null)
Logger.error("Player Character: " + playerCharacter.getName() + " Tried To Change Mine: " + changeProductionMsg.getMineID() + " and Resource was Null");
return true; return true;
}
//update resource //update resource

2
src/engine/net/client/handlers/AssetSupportMsgHandler.java

@ -144,7 +144,7 @@ public class AssetSupportMsgHandler extends AbstractClientMsgHandler {
if (player == null) if (player == null)
return true; return true;
vendor = NPCManager.getFromCache(msg.getNpcID()); vendor = NPC.getFromCache(msg.getNpcID());
if (msg.getMessageType() != 6 && msg.getMessageType() != 7) { if (msg.getMessageType() != 6 && msg.getMessageType() != 7) {
if (vendor == null) if (vendor == null)

7
src/engine/net/client/handlers/BanishUnbanishHandler.java

@ -14,7 +14,6 @@ import engine.Enum.GuildHistoryType;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage; import engine.net.DispatchMessage;
@ -56,7 +55,7 @@ public class BanishUnbanishHandler extends AbstractClientMsgHandler {
boolean success = false; boolean success = false;
Guild guild = source.getGuild(); Guild guild = source.getGuild();
PlayerCharacter realizedTarget = PlayerManager.getFromCache(target); PlayerCharacter realizedTarget = PlayerCharacter.getFromCache(target);
if (realizedTarget != null) { if (realizedTarget != null) {
// Guild leader can't leave guild. must pass GL or disband // Guild leader can't leave guild. must pass GL or disband
@ -84,7 +83,7 @@ public class BanishUnbanishHandler extends AbstractClientMsgHandler {
} }
} else { } else {
if (guild.getGuildLeaderUUID() != target) { if (guild.getGuildLeaderUUID() != target) {
PlayerCharacter toBanish = PlayerManager.getPlayerCharacter(target); PlayerCharacter toBanish = PlayerCharacter.getPlayerCharacter(target);
if (toBanish == null) if (toBanish == null)
return true; return true;
//already added previously. //already added previously.
@ -111,7 +110,7 @@ public class BanishUnbanishHandler extends AbstractClientMsgHandler {
//DbManager.GuildQueries.ADD_TO_BANISHED_FROM_GUILDLIST(guild.getobjectUUID(), target); //DbManager.GuildQueries.ADD_TO_BANISHED_FROM_GUILDLIST(guild.getobjectUUID(), target);
// Send left guild message to rest of guild // Send left guild message to rest of guild
String targetName = PlayerManager.getFirstName(target); String targetName = PlayerCharacter.getFirstName(target);
ChatManager.chatGuildInfo(guild, ChatManager.chatGuildInfo(guild,
targetName + " has been banished from " + guild.getName() + '.'); targetName + " has been banished from " + guild.getName() + '.');
GuildListMsg guildListMsg = new GuildListMsg(guild); GuildListMsg guildListMsg = new GuildListMsg(guild);

14
src/engine/net/client/handlers/ChangeAltitudeHandler.java

@ -11,7 +11,6 @@ package engine.net.client.handlers;
import engine.Enum.DispatchChannel; import engine.Enum.DispatchChannel;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.PlayerManager;
import engine.net.DispatchMessage; import engine.net.DispatchMessage;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ChangeAltitudeMsg; import engine.net.client.msg.ChangeAltitudeMsg;
@ -43,21 +42,18 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
if (!AbstractCharacter.CanFly(pc)) if (!AbstractCharacter.CanFly(pc))
return false; return false;
if (PlayerManager.isSwimming(pc)) if (pc.isSwimming())
return false; return false;
if (pc.region != null && !pc.region.isOutside()) if (pc.region != null && !pc.region.isOutside())
return false; return false;
// Find out if we already have an altitude timer running and if so // Find out if we already have an altitude timer running and if so
// do not process more alt change requests // do not process more alt change requests
pc.updateFlight();
if (pc.getTakeOffTime() != 0) if (pc.getTakeOffTime() != 0)
return false; return false;
pc.setTakeOffTime(System.currentTimeMillis());
// remove all movement timers and jobs // remove all movement timers and jobs
//TODO: test if they can fly //TODO: test if they can fly
@ -71,7 +67,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
if (pc.getAltitude() == 0 && !msg.up()) if (pc.getAltitude() == 0 && !msg.up())
return true; return true;
pc.update(false); pc.update();
pc.stopMovement(pc.getLoc()); pc.stopMovement(pc.getLoc());
msg.setStartAlt(pc.getAltitude()); msg.setStartAlt(pc.getAltitude());
if (msg.up()) { if (msg.up()) {
@ -136,7 +132,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
} }
if (msg.up()) { if (msg.up()) {
pc.update(false); pc.update();
pc.setDesiredAltitude(targetAlt); pc.setDesiredAltitude(targetAlt);
pc.setTakeOffTime(System.currentTimeMillis()); pc.setTakeOffTime(System.currentTimeMillis());
} else { } else {
@ -162,7 +158,7 @@ public class ChangeAltitudeHandler extends AbstractClientMsgHandler {
} else } else
pc.setDesiredAltitude(targetAlt); pc.setDesiredAltitude(targetAlt);
pc.update(false); pc.update();
pc.setTakeOffTime(System.currentTimeMillis()); pc.setTakeOffTime(System.currentTimeMillis());

13
src/engine/net/client/handlers/ChangeGuildLeaderHandler.java

@ -14,7 +14,6 @@ import engine.Enum.GameObjectType;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
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;
@ -98,9 +97,9 @@ public class ChangeGuildLeaderHandler extends AbstractClientMsgHandler {
} }
PlayerManager.setGuildLeader(targetPlayer, true); targetPlayer.setGuildLeader(true);
PlayerManager.setInnerCouncil(targetPlayer, true); targetPlayer.setInnerCouncil(true);
PlayerManager.setFullMember(targetPlayer, true); targetPlayer.setFullMember(true);
targetPlayer.incVer(); targetPlayer.incVer();
targetName = targetPlayer.getFirstName(); targetName = targetPlayer.getFirstName();
updateTarget = true; updateTarget = true;
@ -114,9 +113,9 @@ public class ChangeGuildLeaderHandler extends AbstractClientMsgHandler {
//updateOldGuildLeader //updateOldGuildLeader
PlayerManager.setInnerCouncil(sourcePlayer, true); sourcePlayer.setInnerCouncil(true);
PlayerManager.setFullMember(sourcePlayer, true); sourcePlayer.setFullMember(true);
PlayerManager.setGuildLeader(sourcePlayer, false); sourcePlayer.setGuildLeader(false);
sourcePlayer.incVer(); sourcePlayer.incVer();
GuildInfoMsg guildInfoMsg = new GuildInfoMsg(sourcePlayer, sourcePlayer.getGuild(), 2); GuildInfoMsg guildInfoMsg = new GuildInfoMsg(sourcePlayer, sourcePlayer.getGuild(), 2);

15
src/engine/net/client/handlers/ChangeRankHandler.java

@ -14,7 +14,6 @@ import engine.Enum.GameObjectType;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
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;
@ -64,14 +63,14 @@ public class ChangeRankHandler extends AbstractClientMsgHandler {
Enum.GuildType t = Enum.GuildType.getGuildTypeFromInt(sourcePlayer.getGuild().getCharter()); Enum.GuildType t = Enum.GuildType.getGuildTypeFromInt(sourcePlayer.getGuild().getCharter());
if (targetPlayer != null) { if (targetPlayer != null) {
PlayerManager.setGuildTitle(targetPlayer, msg.getNewRank()); targetPlayer.setGuildTitle(msg.getNewRank());
targetName = targetPlayer.getFirstName(); targetName = targetPlayer.getFirstName();
isMale = targetPlayer.getRace().getRaceType().getCharacterSex().equals(Enum.CharacterSex.MALE); isMale = targetPlayer.getRace().getRaceType().getCharacterSex().equals(Enum.CharacterSex.MALE);
} else { } else {
DbManager.GuildQueries.UPDATE_GUILD_RANK_OFFLINE(msg.getPlayerUUID(), msg.getNewRank(), sourcePlayer.getGuild().getObjectUUID()); DbManager.GuildQueries.UPDATE_GUILD_RANK_OFFLINE(msg.getPlayerUUID(), msg.getNewRank(), sourcePlayer.getGuild().getObjectUUID());
targetName = PlayerManager.getFirstName(msg.getPlayerUUID()); targetName = PlayerCharacter.getFirstName(msg.getPlayerUUID());
isMale = true; isMale = true;
} }
@ -99,7 +98,7 @@ public class ChangeRankHandler extends AbstractClientMsgHandler {
taxUpdate = (updateMask & 1) > 0; taxUpdate = (updateMask & 1) > 0;
if (targetName == null && updateMask > 0) if (targetName == null && updateMask > 0)
targetName = PlayerManager.getFirstName(msg.getPlayerUUID()); targetName = PlayerCharacter.getFirstName(msg.getPlayerUUID());
} else { } else {
icUpdate = (GuildStatusController.isInnerCouncil(targetPlayer.getGuildStatus()) != (msg.getIc() > 0)) && GuildStatusController.isGuildLeader(sourcePlayer.getGuildStatus()); icUpdate = (GuildStatusController.isInnerCouncil(targetPlayer.getGuildStatus()) != (msg.getIc() > 0)) && GuildStatusController.isGuildLeader(sourcePlayer.getGuildStatus());
recruitUpdate = (GuildStatusController.isRecruiter(targetPlayer.getGuildStatus()) != (msg.getRec() > 0)) && GuildStatusController.isGuildLeader(sourcePlayer.getGuildStatus()); recruitUpdate = (GuildStatusController.isRecruiter(targetPlayer.getGuildStatus()) != (msg.getRec() > 0)) && GuildStatusController.isGuildLeader(sourcePlayer.getGuildStatus());
@ -107,16 +106,16 @@ public class ChangeRankHandler extends AbstractClientMsgHandler {
//This logic branch only executes if targetPlayer has passed a null check... //This logic branch only executes if targetPlayer has passed a null check...
if (icUpdate) { if (icUpdate) {
PlayerManager.setInnerCouncil(targetPlayer, msg.getIc() > 0); targetPlayer.setInnerCouncil(msg.getIc() > 0);
PlayerManager.setFullMember(targetPlayer, true); targetPlayer.setFullMember(true);
targetPlayer.incVer(); targetPlayer.incVer();
} }
if (recruitUpdate) if (recruitUpdate)
PlayerManager.setRecruiter(targetPlayer, msg.getRec() > 0); targetPlayer.setRecruiter(msg.getRec() > 0);
if (taxUpdate) if (taxUpdate)
PlayerManager.setTaxCollector(targetPlayer, msg.getTax() > 0); targetPlayer.setTaxCollector(msg.getTax() > 0);
if (targetName == null) if (targetName == null)
targetName = targetPlayer.getFirstName(); targetName = targetPlayer.getFirstName();

2
src/engine/net/client/handlers/CityDataHandler.java

@ -63,7 +63,7 @@ public class CityDataHandler extends AbstractClientMsgHandler {
// If the hotZone has changed then update the client's map accordingly. // If the hotZone has changed then update the client's map accordingly.
if (playerCharacter.getTimestamps().containsKey("hotzoneupdate") && playerCharacter.getTimeStamp("hotzoneupdate") <= ZoneManager.hotZoneLastUpdate.toEpochMilli() && ZoneManager.hotZone != null) { if (playerCharacter.getTimeStamp("hotzoneupdate") <= ZoneManager.hotZoneLastUpdate.toEpochMilli() && ZoneManager.hotZone != null) {
HotzoneChangeMsg hotzoneChangeMsg = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID()); HotzoneChangeMsg hotzoneChangeMsg = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID());
dispatch = Dispatch.borrow(playerCharacter, hotzoneChangeMsg); dispatch = Dispatch.borrow(playerCharacter, hotzoneChangeMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);

2
src/engine/net/client/handlers/DestroyBuildingHandler.java

@ -62,7 +62,7 @@ public class DestroyBuildingHandler extends AbstractClientMsgHandler {
if (city != null) if (city != null)
bane = city.getBane(); bane = city.getBane();
if (bane != null){// && bane.getSiegePhase() == Enum.SiegePhase.WAR) { if (bane != null && bane.getSiegePhase() == Enum.SiegePhase.WAR) {
ErrorPopupMsg.sendErrorPopup(pc, 171); ErrorPopupMsg.sendErrorPopup(pc, 171);
return true; return true;
} }

5
src/engine/net/client/handlers/DisbandGuildHandler.java

@ -17,7 +17,6 @@ import engine.db.archive.GuildRecord;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage; import engine.net.DispatchMessage;
@ -99,8 +98,8 @@ public class DisbandGuildHandler extends AbstractClientMsgHandler {
//Save Guild data //Save Guild data
PlayerManager.setGuildLeader(player, false); player.setGuildLeader(false);
PlayerManager.setInnerCouncil(player, false); player.setInnerCouncil(false);
guild.setGuildLeaderUUID(0); guild.setGuildLeaderUUID(0);
guild.setNation(null); guild.setNation(null);

2
src/engine/net/client/handlers/GroupInviteResponseHandler.java

@ -102,7 +102,7 @@ public class GroupInviteResponseHandler extends AbstractClientMsgHandler {
// Run Keyclone Audit // Run Keyclone Audit
//KEYCLONEAUDIT.audit(player, group); KEYCLONEAUDIT.audit(player, group);
return true; return true;
} }

3
src/engine/net/client/handlers/GuildControlHandler.java

@ -11,7 +11,6 @@ package engine.net.client.handlers;
import engine.Enum; import engine.Enum;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.PlayerManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage; import engine.net.DispatchMessage;
@ -61,7 +60,7 @@ public class GuildControlHandler extends AbstractClientMsgHandler {
PlayerCharacter player = SessionManager.getPlayerCharacter(origin); PlayerCharacter player = SessionManager.getPlayerCharacter(origin);
//If we don't get a valid PC for whatever reason.. just ignore it. //If we don't get a valid PC for whatever reason.. just ignore it.
PlayerCharacter pc = PlayerManager.getFromCache(msg.getUnknown03()); PlayerCharacter pc = PlayerCharacter.getFromCache(msg.getUnknown03());
if (pc != null) { if (pc != null) {
dispatch = Dispatch.borrow(player, new GuildListMsg(pc)); dispatch = Dispatch.borrow(player, new GuildListMsg(pc));

13
src/engine/net/client/handlers/GuildCreationFinalizeHandler.java

@ -15,7 +15,10 @@ import engine.Enum.GuildHistoryType;
import engine.Enum.ItemType; import engine.Enum.ItemType;
import engine.Enum.OwnerType; import engine.Enum.OwnerType;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.*; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.GuildManager;
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;
@ -127,10 +130,10 @@ public class GuildCreationFinalizeHandler extends AbstractClientMsgHandler {
GuildManager.joinGuild(player, newGuild, GuildHistoryType.CREATE); GuildManager.joinGuild(player, newGuild, GuildHistoryType.CREATE);
newGuild.setGuildLeader(player); newGuild.setGuildLeader(player);
PlayerManager.setGuildLeader(player, true); player.setGuildLeader(true);
PlayerManager.setInnerCouncil(player, true); player.setInnerCouncil(true);
PlayerManager.setFullMember(player, true); player.setFullMember(true);
PlayerManager.setGuildTitle(player, charterType.getNumberOfRanks() - 1); player.setGuildTitle(charterType.getNumberOfRanks() - 1);
player.getCharItemManager().delete(charter); player.getCharItemManager().delete(charter);
player.getCharItemManager().updateInventory(); player.getCharItemManager().updateInventory();
player.incVer(); player.incVer();

3
src/engine/net/client/handlers/GuildInfoHandler.java

@ -11,7 +11,6 @@ package engine.net.client.handlers;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.PlayerManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage; import engine.net.DispatchMessage;
@ -44,7 +43,7 @@ public class GuildInfoHandler extends AbstractClientMsgHandler {
} else if (msg.getMsgType() == 5) { } else if (msg.getMsgType() == 5) {
if (msg.getObjectType() == GameObjectType.PlayerCharacter.ordinal()) { if (msg.getObjectType() == GameObjectType.PlayerCharacter.ordinal()) {
PlayerCharacter pc = PlayerManager.getPlayerCharacter(msg.getObjectID()); PlayerCharacter pc = PlayerCharacter.getPlayerCharacter(msg.getObjectID());
dispatch = Dispatch.borrow(sourcePlayer, new GuildInfoMsg(pc, pc.getGuild(), 5)); dispatch = Dispatch.borrow(sourcePlayer, new GuildInfoMsg(pc, pc.getGuild(), 5));
DispatchMessage.dispatchMsgDispatch(dispatch, engine.Enum.DispatchChannel.SECONDARY); DispatchMessage.dispatchMsgDispatch(dispatch, engine.Enum.DispatchChannel.SECONDARY);
} else { } else {

5
src/engine/net/client/handlers/HirelingServiceMsgHandler.java

@ -13,7 +13,6 @@ package engine.net.client.handlers;
import engine.Enum.DispatchChannel; import engine.Enum.DispatchChannel;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.NPCManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage; import engine.net.DispatchMessage;
@ -53,7 +52,7 @@ public class HirelingServiceMsgHandler extends AbstractClientMsgHandler {
if (building == null) if (building == null)
return true; return true;
NPC npc = NPCManager.getFromCache(msg.npcID); NPC npc = NPC.getFromCache(msg.npcID);
if (npc == null) if (npc == null)
return true; return true;
@ -62,7 +61,7 @@ public class HirelingServiceMsgHandler extends AbstractClientMsgHandler {
return true; return true;
npc.setSpecialPrice(msg.repairCost); npc.setRepairCost(msg.repairCost);
ManageNPCMsg outMsg = new ManageNPCMsg(npc); ManageNPCMsg outMsg = new ManageNPCMsg(npc);
Dispatch dispatch = Dispatch.borrow(player, msg); Dispatch dispatch = Dispatch.borrow(player, msg);

5
src/engine/net/client/handlers/ItemProductionMsgHandler.java

@ -360,11 +360,6 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
targetItem.recycle(vendor); targetItem.recycle(vendor);
vendor.removeItemFromForge(targetItem); vendor.removeItemFromForge(targetItem);
//refund the gold for cancelled item
if(vendor.building.getStrongboxValue() + targetItem.getItemBase().getBaseValue() < 15000000){
vendor.building.setStrongboxValue(vendor.building.getStrongboxValue() + targetItem.getItemBase().getBaseValue());
}
// Refresh vendor's inventory to client // Refresh vendor's inventory to client
outMsg = new ManageNPCMsg(vendor); outMsg = new ManageNPCMsg(vendor);

13
src/engine/net/client/handlers/MOTDEditHandler.java

@ -62,23 +62,16 @@ public class MOTDEditHandler extends AbstractClientMsgHandler {
return true; return true;
} }
if (type == 1) { // Guild MOTD if (type == 1) // Guild MOTD
msg.setMessage(guild.getMOTD()); msg.setMessage(guild.getMOTD());
guild.updateDatabase(); else if (type == 3) // IC MOTD
}else if (type == 3) { // IC MOTD
msg.setMessage(guild.getICMOTD()); msg.setMessage(guild.getICMOTD());
guild.updateDatabase(); else if (type == 0) { // Nation MOTD
}else if (type == 0) { // Nation MOTD
Guild nation = guild.getNation(); Guild nation = guild.getNation();
if (nation == null || !nation.isNation()) { if (nation == null || !nation.isNation()) {
ErrorPopupMsg.sendErrorMsg(playerCharacter, "You do not have such authority!"); ErrorPopupMsg.sendErrorMsg(playerCharacter, "You do not have such authority!");
return true; return true;
} }
nation.setNMOTD(msg.getMessage());
nation.updateDatabase();
for(Guild sub : nation.getSubGuildList()){
sub.setNMOTD(nation.getNMOTD());
}
msg.setMessage(nation.getMOTD()); msg.setMessage(nation.getMOTD());
} }
dispatch = Dispatch.borrow(playerCharacter, msg); dispatch = Dispatch.borrow(playerCharacter, msg);

158
src/engine/net/client/handlers/MerchantMsgHandler.java

@ -105,7 +105,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
// Validate player can obtain blessing // Validate player can obtain blessing
if (!GuildStatusController.isGuildLeader(player.getGuildStatus())) { if (GuildStatusController.isGuildLeader(player.getGuildStatus()) == false) {
ErrorPopupMsg.sendErrorPopup(player, 173); // You must be the leader of a guild to receive a blessing ErrorPopupMsg.sendErrorPopup(player, 173); // You must be the leader of a guild to receive a blessing
return; return;
} }
@ -126,12 +126,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
realm = RealmMap.getRealmForCity(city); realm = RealmMap.getRealmForCity(city);
if (!realm.getCanBeClaimed()) { if (realm.getCanBeClaimed() == false) {
ErrorPopupMsg.sendErrorPopup(player, 180); // This territory cannot be ruled by anyone ErrorPopupMsg.sendErrorPopup(player, 180); // This territory cannot be ruled by anyone
return; return;
} }
if (realm.isRuled()) { if (realm.isRuled() == true) {
ErrorPopupMsg.sendErrorPopup(player, 178); // This territory is already claimed ErrorPopupMsg.sendErrorPopup(player, 178); // This territory is already claimed
return; return;
} }
@ -142,12 +142,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
} }
private static void requestBoon(PlayerCharacter player, NPC npc) { private static void requestBoon(MerchantMsg msg, ClientConnection origin, PlayerCharacter player, NPC npc) {
Building shrineBuilding; Building shrineBuilding;
Shrine shrine; Shrine shrine;
if (!npc.getGuild().getNation().equals(player.getGuild().getNation())) if (npc.getGuild() != player.getGuild())
return; return;
shrineBuilding = npc.getBuilding(); shrineBuilding = npc.getBuilding();
@ -155,7 +155,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
if (shrineBuilding == null) if (shrineBuilding == null)
return; return;
if (shrineBuilding.getBlueprint() != null && !shrineBuilding.getBlueprint().getBuildingGroup().equals(engine.Enum.BuildingGroup.SHRINE)) if (shrineBuilding.getBlueprint() != null && shrineBuilding.getBlueprint().getBuildingGroup() != engine.Enum.BuildingGroup.SHRINE)
return; return;
if (shrineBuilding.getRank() == -1) if (shrineBuilding.getRank() == -1)
@ -171,9 +171,11 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
return; return;
} }
//already haz boon.
if (player.containsEffect(shrine.getShrineType().getPowerToken())) { if (player.containsEffect(shrine.getShrineType().getPowerToken())) {
//remove old boon to apply new one, allows boon refreshing ErrorPopupMsg.sendErrorPopup(player, 199);
player.effects.remove(PowersManager.getPowerByToken(shrine.getShrineType().getPowerToken()).name); return;
} }
if (!Shrine.canTakeFavor(player, shrine)) if (!Shrine.canTakeFavor(player, shrine))
@ -189,31 +191,16 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
return; return;
} }
int trains = 0; int rank = shrine.getRank();
switch(npc.getRank()){ //R8 trees always get atleast rank 2 boons. rank uses index, where 0 is first place, 1 is second, etc...
case 1: if (shrineBuilding.getCity() != null && shrineBuilding.getCity().getTOL() != null && shrineBuilding.getCity().getTOL().getRank() == 8)
trains = 10; if (rank != 0)
break; rank = 1;
case 2: int trains = 40 - (rank * 10);
trains = 15; if (trains < 0)
break; trains = 0;
case 3:
trains = 20;
break;
case 4:
trains = 25;
break;
case 5:
trains = 30;
break;
case 6:
trains = 35;
break;
case 7:
trains = 40;
break;
}
//System.out.println(trains);
PowersManager.applyPower(player, player, player.getLoc(), shrinePower.getToken(), trains, false); PowersManager.applyPower(player, player, player.getLoc(), shrinePower.getToken(), trains, false);
ChatManager.chatGuildInfo(player.getGuild(), player.getName() + " has recieved a boon costing " + 1 + " point of favor."); ChatManager.chatGuildInfo(player.getGuild(), player.getName() + " has recieved a boon costing " + 1 + " point of favor.");
shrineBuilding.addEffectBit(1000000 << 2); shrineBuilding.addEffectBit(1000000 << 2);
@ -273,85 +260,60 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
} }
} }
if (targetCity == null){ if (targetCity == null)
Mine mineTele = null; return;
for(Mine mine : Mine.getMinesToTeleportTo(player)){
if(mine.getObjectUUID() == msg.getCityID()){
mineTele = mine;
}
}
if(mineTele == null){
return;
}else {
int time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
msg.setTeleportTime(time);
Building tower = Mine.getTower(mineTele);
if (tower == null)
return;
Vector3fImmutable teleportLoc = Vector3fImmutable.getRandomPointOnCircle(tower.getLoc(), 10);
ChatManager.chatSystemInfo(player, "You Will Teleport To " + mineTele.getParentZone().getParent().getName() + "'s Mine In " + time + " Seconds.");
if (time > 0) {
//TODO add timer to teleport
TeleportJob tj = new TeleportJob(player, npc, teleportLoc, origin, true);
JobScheduler.getInstance().scheduleJob(tj, time * 1000);
}
}
}else{
//finish porting to a city
//verify level required to teleport or repledge
Guild toGuild = targetCity.getGuild(); //verify level required to teleport or repledge
if (toGuild != null) Guild toGuild = targetCity.getGuild();
if (isTeleport) {
if (player.getLevel() < toGuild.getTeleportMin() || player.getLevel() > toGuild.getTeleportMax()) if (toGuild != null)
return; if (isTeleport) {
} else if (player.getLevel() < toGuild.getRepledgeMin() || player.getLevel() > toGuild.getRepledgeMax()) if (player.getLevel() < toGuild.getTeleportMin() || player.getLevel() > toGuild.getTeleportMax())
return; return;
} else if (player.getLevel() < toGuild.getRepledgeMin() || player.getLevel() > toGuild.getRepledgeMax())
return;
boolean joinedGuild = false; boolean joinedGuild = false;
//if repledge, reguild the player //if repledge, reguild the player
if (!isTeleport) if (!isTeleport)
joinedGuild = GuildManager.joinGuild(player, targetCity.getGuild(), targetCity.getObjectUUID(), GuildHistoryType.JOIN); joinedGuild = GuildManager.joinGuild(player, targetCity.getGuild(), targetCity.getObjectUUID(), GuildHistoryType.JOIN);
int time; int time;
if (!isTeleport) //repledge if (!isTeleport) //repledge
time = MBServerStatics.REPLEDGE_TIME_IN_SECONDS; time = MBServerStatics.REPLEDGE_TIME_IN_SECONDS;
else else
time = MBServerStatics.TELEPORT_TIME_IN_SECONDS; time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
//resend message //resend message
msg.setTeleportTime(time); msg.setTeleportTime(time);
if ((!isTeleport && joinedGuild) || (isTeleport)) { if ((!isTeleport && joinedGuild) || (isTeleport)) {
dispatch = Dispatch.borrow(player, msg); dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
} }
//teleport player to city
Vector3fImmutable teleportLoc; //teleport player to city
if (targetCity.getTOL().getRank() == 8) Vector3fImmutable teleportLoc;
teleportLoc = targetCity.getTOL().getStuckLocation();
else
teleportLoc = Vector3fImmutable.getRandomPointOnCircle(targetCity.getTOL().getLoc(), MBServerStatics.TREE_TELEPORT_RADIUS);
if (time > 0) { if (targetCity.getTOL().getRank() == 8)
//TODO add timer to teleport teleportLoc = targetCity.getTOL().getStuckLocation();
TeleportJob tj = new TeleportJob(player, npc, teleportLoc, origin, true); else
JobScheduler.getInstance().scheduleJob(tj, time * 1000); teleportLoc = Vector3fImmutable.getRandomPointOnCircle(targetCity.getTOL().getLoc(), MBServerStatics.TREE_TELEPORT_RADIUS);
} else if (joinedGuild) {
PlayerManager.teleport(player, teleportLoc); if (time > 0) {
player.setSafeMode(); //TODO add timer to teleport
} TeleportJob tj = new TeleportJob(player, npc, teleportLoc, origin, true);
JobScheduler.getInstance().scheduleJob(tj, time * 1000);
} else if (joinedGuild) {
player.teleport(teleportLoc);
player.setSafeMode();
} }
} }
private static PowersBase getPowerforHermit(NPC npc) { private static PowersBase getPowerforHermit(NPC npc) {
@ -415,7 +377,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
player = SessionManager.getPlayerCharacter(origin); player = SessionManager.getPlayerCharacter(origin);
msg = (MerchantMsg) baseMsg; msg = (MerchantMsg) baseMsg;
npc = NPCManager.getNPC(msg.getNPCID()); npc = NPC.getNPC(msg.getNPCID());
// Early exit if something goes awry // Early exit if something goes awry
@ -458,7 +420,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
if (isHermit(npc)) if (isHermit(npc))
requestHermitBlessing(msg, origin, player, npc); requestHermitBlessing(msg, origin, player, npc);
else else
requestBoon(player, npc); requestBoon(msg, origin, player, npc);
break; break;
case 15: case 15:
LeaderboardMessage lbm = new LeaderboardMessage(); LeaderboardMessage lbm = new LeaderboardMessage();

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

@ -45,7 +45,7 @@ public class MinionTrainingMsgHandler extends AbstractClientMsgHandler {
if (minionMsg.getNpcType() == Enum.GameObjectType.NPC.ordinal()) { if (minionMsg.getNpcType() == Enum.GameObjectType.NPC.ordinal()) {
NPC npc = NPCManager.getFromCache(minionMsg.getNpcID()); NPC npc = NPC.getFromCache(minionMsg.getNpcID());
if (npc == null) if (npc == null)
return true; return true;

33
src/engine/net/client/handlers/ObjectActionMsgHandler.java

@ -417,16 +417,35 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
if (!toCommand.isSiege()) if (!toCommand.isSiege())
return true; return true;
if (PlayerManager.commandSiegeMinion(player, toCommand)) { if (player.commandSiegeMinion(toCommand)) {
itemMan.consume(item); itemMan.consume(item);
} }
break; break;
//ANNIVERSERY GIFT
case 31: case 31:
// *** Disabled for now: Needs bootyset created
//if (ib.getUUID() == 971012) {
// int random = ThreadLocalRandom.current().nextInt(ItemBase.AnniverseryGifts.size());
// int annyID = ItemBase.AnniverseryGifts.get(random);
// ItemBase annyIB = ItemBase.getItemBase(annyID);
// if (annyIB != null) {
// Item gift = MobLoot.createItemForPlayer(player, annyIB);
// if (gift != null) {
// itemMan.addItemToInventory(gift);
// itemMan.consume(item);
// }
// }
// break;
//}
LootManager.peddleFate(player,item); LootManager.peddleFate(player,item);
break; break;
case 30: //water bucket case 30: //water bucket
case 8: //potions, tears of saedron case 8: //potions, tears of saedron
case 5: //runes, petition, warrant, scrolls case 5: //runes, petition, warrant, scrolls
if (uuid > 3000 && uuid < 3050) { //Discipline Runes if (uuid > 3000 && uuid < 3050) { //Discipline Runes
if (ApplyRuneMsg.applyRune(uuid, origin, player)) { if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
@ -443,12 +462,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
itemMan.consume(item); itemMan.consume(item);
} }
break; break;
} else if (uuid > 252122 && uuid < 252137) { //blood runes } else if (uuid > 252122 && uuid < 252128) { //mastery runes
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
itemMan.consume(item);
}
break;
} else if (uuid > 252128 && uuid < 252128) { //mastery runes
if (ApplyRuneMsg.applyRune(uuid, origin, player)) { if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
itemMan.consume(item); itemMan.consume(item);
} }
@ -514,6 +528,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
} }
// Send piss bucket animation // Send piss bucket animation
VisualUpdateMessage vum = new VisualUpdateMessage(player, 16323); VisualUpdateMessage vum = new VisualUpdateMessage(player, 16323);
vum.configure(); vum.configure();
DispatchMessage.sendToAllInRange(player, vum); DispatchMessage.sendToAllInRange(player, vum);
@ -528,9 +543,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
dispatch = Dispatch.borrow(player, msg); dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
if(!item.getItemBase().getType().equals(ItemType.POTION)) { player.cancelOnSpell();
player.cancelOnSpell();
}
break; break;
default: //shouldn't be here, consume item default: //shouldn't be here, consume item
dispatch = Dispatch.borrow(player, msg); dispatch = Dispatch.borrow(player, msg);

12
src/engine/net/client/handlers/OpenFriendsCondemnListMsgHandler.java

@ -4,7 +4,9 @@ import engine.Enum;
import engine.Enum.DispatchChannel; import engine.Enum.DispatchChannel;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.*; import engine.gameManager.BuildingManager;
import engine.gameManager.DbManager;
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;
@ -69,9 +71,9 @@ public class OpenFriendsCondemnListMsgHandler extends AbstractClientMsgHandler {
} }
AbstractCharacter toAdd = null; AbstractCharacter toAdd = null;
if (msg.getPlayerType() == GameObjectType.PlayerCharacter.ordinal()) if (msg.getPlayerType() == GameObjectType.PlayerCharacter.ordinal())
toAdd = PlayerManager.getFromCache(msg.getPlayerID()); toAdd = PlayerCharacter.getFromCache(msg.getPlayerID());
else if (msg.getPlayerType() == GameObjectType.NPC.ordinal()) else if (msg.getPlayerType() == GameObjectType.NPC.ordinal())
toAdd = NPCManager.getFromCache(msg.getPlayerID()); toAdd = NPC.getFromCache(msg.getPlayerID());
else if (msg.getPlayerType() == GameObjectType.Mob.ordinal()) else if (msg.getPlayerType() == GameObjectType.Mob.ordinal())
toAdd = Mob.getFromCache(msg.getPlayerID()); toAdd = Mob.getFromCache(msg.getPlayerID());
else { else {
@ -212,7 +214,7 @@ public class OpenFriendsCondemnListMsgHandler extends AbstractClientMsgHandler {
if (msg.getPlayerType() != GameObjectType.PlayerCharacter.ordinal()) if (msg.getPlayerType() != GameObjectType.PlayerCharacter.ordinal())
return true; return true;
PlayerCharacter playerCharacter = PlayerManager.getFromCache(msg.getPlayerID()); PlayerCharacter playerCharacter = PlayerCharacter.getFromCache(msg.getPlayerID());
if (playerCharacter == null) if (playerCharacter == null)
return true; return true;
@ -301,7 +303,7 @@ public class OpenFriendsCondemnListMsgHandler extends AbstractClientMsgHandler {
//Check to see if the invited is already on the friends list. //Check to see if the invited is already on the friends list.
switch (msg.getInviteType()) { switch (msg.getInviteType()) {
case 7: case 7:
playerCharacter = PlayerManager.getFromCache(msg.getPlayerID()); playerCharacter = PlayerCharacter.getFromCache(msg.getPlayerID());
if (playerCharacter == null) if (playerCharacter == null)
return true; return true;
if (sourceBuilding.getFriends().containsKey(playerCharacter.getObjectUUID())) if (sourceBuilding.getFriends().containsKey(playerCharacter.getObjectUUID()))

12
src/engine/net/client/handlers/OrderNPCMsgHandler.java

@ -91,7 +91,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
} }
ManageCityAssetsMsg mca = new ManageCityAssetsMsg(); ManageCityAssetsMsg mca = new ManageCityAssetsMsg();
mca.actionType = NPCManager.SVR_CLOSE_WINDOW; mca.actionType = NPC.SVR_CLOSE_WINDOW;
mca.setTargetType(building.getObjectType().ordinal()); mca.setTargetType(building.getObjectType().ordinal());
mca.setTargetID(building.getObjectUUID()); mca.setTargetID(building.getObjectUUID());
origin.sendMsg(mca); origin.sendMsg(mca);
@ -110,7 +110,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
if (player == null) if (player == null)
return; return;
npc = NPCManager.getFromCache(msg.getNpcUUID()); npc = NPC.getFromCache(msg.getNpcUUID());
if (npc == null) if (npc == null)
return; return;
@ -120,7 +120,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
if (building == null) if (building == null)
return; return;
NPCProfits profit = NPCManager.GetNPCProfits(npc); NPCProfits profit = NPC.GetNPCProfits(npc);
if (profit == null) if (profit == null)
return; return;
@ -155,7 +155,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
if (player == null) if (player == null)
return; return;
npc = NPCManager.getFromCache(orderNPCMsg.getNpcUUID()); npc = NPC.getFromCache(orderNPCMsg.getNpcUUID());
if (npc == null) if (npc == null)
return; return;
@ -165,7 +165,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
if (building == null) if (building == null)
return; return;
NPCProfits profit = NPCManager.GetNPCProfits(npc); NPCProfits profit = NPC.GetNPCProfits(npc);
if (profit == null) if (profit == null)
return; return;
@ -428,7 +428,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
if (orderNPCMsg.getObjectType() == GameObjectType.NPC.ordinal()) { if (orderNPCMsg.getObjectType() == GameObjectType.NPC.ordinal()) {
npc = NPCManager.getFromCache(orderNPCMsg.getNpcUUID()); npc = NPC.getFromCache(orderNPCMsg.getNpcUUID());
if (npc == null) if (npc == null)
return true; return true;

5
src/engine/net/client/handlers/RequestEnterWorldHandler.java

@ -8,7 +8,6 @@ import engine.db.archive.CharacterRecord;
import engine.db.archive.DataWarehouse; import engine.db.archive.DataWarehouse;
import engine.db.archive.PvpRecord; import engine.db.archive.PvpRecord;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.PlayerManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.net.Dispatch; import engine.net.Dispatch;
@ -58,7 +57,7 @@ public class RequestEnterWorldHandler extends AbstractClientMsgHandler {
return true; return true;
} }
PlayerManager.setEnteredWorld(player, false); player.setEnteredWorld(false);
Account acc = SessionManager.getAccount(origin); Account acc = SessionManager.getAccount(origin);
@ -119,7 +118,7 @@ public class RequestEnterWorldHandler extends AbstractClientMsgHandler {
try { try {
if (!player.isAlive()) { if (!player.isAlive()) {
Logger.info("respawning player on enter world."); Logger.info("respawning player on enter world.");
PlayerManager.respawn(player, true, true, true); player.respawn(true, true, true);
} }
} catch (Exception e) { } catch (Exception e) {

3
src/engine/net/client/handlers/SwearInHandler.java

@ -12,7 +12,6 @@ package engine.net.client.handlers;
import engine.Enum; import engine.Enum;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.PlayerManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.DispatchMessage; import engine.net.DispatchMessage;
@ -64,7 +63,7 @@ public class SwearInHandler extends AbstractClientMsgHandler {
} }
// Swear target in and send message to guild // Swear target in and send message to guild
PlayerManager.setFullMember(target, true); target.setFullMember(true);
target.incVer(); target.incVer();
ChatManager.chatGuildInfo(source, target.getFirstName() + " has been sworn in as a full member!"); ChatManager.chatGuildInfo(source, target.getFirstName() + " has been sworn in as a full member!");

3
src/engine/net/client/handlers/TaxCityMsgHandler.java

@ -135,8 +135,7 @@ public class TaxCityMsgHandler extends AbstractClientMsgHandler {
msg = (TaxCityMsg) baseMsg; msg = (TaxCityMsg) baseMsg;
//realm taxing disabled ViewTaxes(msg, player);
//ViewTaxes(msg, player);
return true; return true;

3
src/engine/net/client/handlers/TransferAssetMsgHandler.java

@ -4,7 +4,6 @@ import engine.Enum;
import engine.exception.MsgSendException; import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.PlayerManager;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.ClientNetMsg; import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
@ -36,7 +35,7 @@ public class TransferAssetMsgHandler extends AbstractClientMsgHandler {
int TargetType = transferAssetMsg.getTargetType(); //ToDue later int TargetType = transferAssetMsg.getTargetType(); //ToDue later
Building building = BuildingManager.getBuildingFromCache(Buildingid); Building building = BuildingManager.getBuildingFromCache(Buildingid);
PlayerCharacter newOwner = PlayerManager.getFromCache(TargetID); PlayerCharacter newOwner = PlayerCharacter.getFromCache(TargetID);
PlayerCharacter player = origin.getPlayerCharacter(); PlayerCharacter player = origin.getPlayerCharacter();
if (player == null || building == null || newOwner == null) if (player == null || building == null || newOwner == null)

244
src/engine/net/client/msg/ApplyRuneMsg.java

@ -10,9 +10,7 @@
package engine.net.client.msg; package engine.net.client.msg;
import engine.Enum; import engine.Enum;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
import engine.net.*; import engine.net.*;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.Protocol; import engine.net.client.Protocol;
@ -72,120 +70,62 @@ public class ApplyRuneMsg extends ClientNetMsg {
} }
public static boolean applyRune(int runeID, ClientConnection origin, PlayerCharacter playerCharacter) { public static boolean applyRune(int runeID, ClientConnection origin, PlayerCharacter playerCharacter) {
RuneBase rb = RuneBase.getRuneBase(runeID); RuneBase rb = RuneBase.getRuneBase(runeID);
Dispatch dispatch; Dispatch dispatch;
if (playerCharacter == null || origin == null || rb == null) { if (playerCharacter == null || origin == null || rb == null) {
return false; return false;
} }
int raceID = playerCharacter.getRaceID();
//Check race is met //Check race is met
ConcurrentHashMap<Integer, Boolean> races = rb.getRace(); ConcurrentHashMap<Integer, Boolean> races = rb.getRace();
if(runeID != 3007 && runeID != 3014) {//bounty hunter and huntsman if (races.size() > 0) {
if (races.size() > 0) { int raceID = playerCharacter.getRaceID();
boolean valid = false; boolean valid = false;
for (int validID : races.keySet()) { for (int validID : races.keySet()) {
if (validID == raceID) { if (validID == raceID) {
valid = true;
break;
}
}
if(runeID == 3040)
valid = true;
if(runeID == 3049)
valid = true; valid = true;
break;
if(raceID == 1999){
switch(runeID){
case 2514:
case 3036:
case 3033:
case 3001:
case 3002:
case 3003:
case 3004:
case 3008:
case 3009:
case 3013:
case 3016:
case 3017:
case 3018:
case 3020:
case 3021:
case 3030:
case 3031:
case 3037:
case 3045:
case 3046:
case 3047:
case 3048:
case 3049:
valid = true;
break;
}
}
if (!valid) {
return false;
} }
} }
//Check base class is met if (!valid) {
ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass(); return false;
if (baseClasses.size() > 0) { }
int baseClassID = playerCharacter.getBaseClassID(); }
boolean valid = false;
for (int validID : baseClasses.keySet()) { //Check base class is met
if (validID == baseClassID) { ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass();
valid = true; if (baseClasses.size() > 0) {
break; int baseClassID = playerCharacter.getBaseClassID();
} boolean valid = false;
} for (int validID : baseClasses.keySet()) {
if(runeID == 3040) if (validID == baseClassID) {
valid = true;
if(runeID == 3036 && raceID == 1999)
valid = true;
if(runeID == 3033 && raceID == 1999)
valid = true;
if(runeID == 3035 && baseClassID == 2501)
valid = true;
if(runeID == 3028 && baseClassID == 2501 && playerCharacter.getRace().getName().contains("Irekei"))
valid = true; valid = true;
if (!valid) { break;
return false;
} }
} }
//Check promotion class is met if (!valid) {
ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass(); return false;
if (promotionClasses.size() > 0) { }
int promotionClassID = playerCharacter.getPromotionClassID(); }
int baseClassID = playerCharacter.getBaseClassID();
boolean valid = false; //Check promotion class is met
for (int validID : promotionClasses.keySet()) { ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass();
if (validID == promotionClassID) { if (promotionClasses.size() > 0) {
valid = true; int promotionClassID = playerCharacter.getPromotionClassID();
break; boolean valid = false;
} for (int validID : promotionClasses.keySet()) {
} if (validID == promotionClassID) {
if(runeID == 3040)
valid = true;
if(runeID == 3004 && (playerCharacter.getPromotionClassID() == 2505 || playerCharacter.getPromotionClassID() == 2510))
valid = true;
if(runeID == 3036 && raceID == 1999)
valid = true;
if(runeID == 3033 && raceID == 1999)
valid = true;
if(runeID == 3028 && (raceID == 2013 || raceID == 2014) && playerCharacter.getBaseClassID() == 2501)
valid = true;
if(runeID == 3035 && baseClassID == 2501)
valid = true; valid = true;
if (!valid) { break;
return false;
} }
} }
} else{ if (!valid) {
if(playerCharacter.getPromotionClassID() == 2519){//priest
return false; return false;
} }
} }
//Check disciplines are met //Check disciplines are met
ArrayList<CharacterRune> runes = playerCharacter.getRunes(); ArrayList<CharacterRune> runes = playerCharacter.getRunes();
ConcurrentHashMap<Integer, Boolean> disciplines = rb.getDiscipline(); ConcurrentHashMap<Integer, Boolean> disciplines = rb.getDiscipline();
@ -199,6 +139,7 @@ public class ApplyRuneMsg extends ClientNetMsg {
} }
} }
} }
int discCount = 0; int discCount = 0;
for (CharacterRune cr : runes) { for (CharacterRune cr : runes) {
int runeBaseID = cr.getRuneBaseID(); int runeBaseID = cr.getRuneBaseID();
@ -211,35 +152,28 @@ public class ApplyRuneMsg extends ClientNetMsg {
return false; return false;
} }
} }
//Check level is met //Check level is met
if (playerCharacter.getLevel() < rb.getLevelRequired()) { if (playerCharacter.getLevel() < rb.getLevelRequired()) {
return false; return false;
} }
int strTotal = 0; int strTotal = 0;
int dexTotal = 0; int dexTotal = 0;
int conTotal = 0; int conTotal = 0;
int intTotal = 0; int intTotal = 0;
int spiTotal = 0; int spiTotal = 0;
int cost = 0; int cost = 0;
//Check any attributes are met //Check any attributes are met
ArrayList<RuneBaseAttribute> attrs = rb.getAttrs(); ArrayList<RuneBaseAttribute> attrs = rb.getAttrs();
if (rb.getAttrs() != null) if (rb.getAttrs() != null)
for (RuneBaseAttribute rba : attrs) { for (RuneBaseAttribute rba : attrs) {
int attrID = rba.getAttributeID(); int attrID = rba.getAttributeID();
int mod = rba.getModValue(); int mod = rba.getModValue();
switch (attrID) { switch (attrID) {
case MBServerStatics.RUNE_COST_ATTRIBUTE_ID: case MBServerStatics.RUNE_COST_ATTRIBUTE_ID:
switch (rb.getName()) {
case "Born of the Ethyri":
case "Born of the Taripontor":
case "Born of the Gwendannen":
case "Born of the Invorri":
case "Born of the Irydnu":
case "Scion of the Dar Khelegeur":
case "Scion of the Gwaridorn":
case "Scion of the Twathedilion":
mod = 0;
}
if (mod > playerCharacter.getUnusedStatPoints()) { if (mod > playerCharacter.getUnusedStatPoints()) {
return false; return false;
} }
@ -292,64 +226,25 @@ public class ApplyRuneMsg extends ClientNetMsg {
break; break;
} }
} }
//Check if max number runes already reached //Check if max number runes already reached
if (runes.size() > 12) { if (runes.size() > 12) {
ChatManager.chatSystemInfo(playerCharacter,"You Have Too Many Runes Applied");
return false; return false;
} }
switch (rb.getName()) {
case "Born of the Ethyri":
case "Born of the Taripontor":
case "Born of the Gwendannen":
case "Born of the Invorri":
case "Born of the Irydnu":
for (CharacterRune charRune : playerCharacter.getRunes()) {
RuneBase rb2 = charRune.getRuneBase();
switch (rb2.getName()) {
case "Born of the Ethyri":
case "Born of the Taripontor":
case "Born of the Gwendannen":
case "Born of the Invorri":
case "Born of the Irydnu":
ChatManager.chatSystemError(playerCharacter, "You Have Already Applied A Blood Rune");
return false;
}
}
break;
case "Scion of the Dar Khelegeur":
case "Scion of the Gwaridorn":
case "Scion of the Twathedilion":
for (CharacterRune charRune : playerCharacter.getRunes()) {
RuneBase rb2 = charRune.getRuneBase();
switch (rb2.getName()) {
case "Scion of the Dar Khelegeur":
case "Scion of the Gwaridorn":
case "Scion of the Twathedilion":
ChatManager.chatSystemError(playerCharacter, "You Have Already Applied A Blood Rune");
return false;
}
}
break;
}
//if discipline, check number applied //if discipline, check number applied
if (isDiscipline(runeID)) { if (isDiscipline(runeID)) {
switch(playerCharacter.getRank()){ if (playerCharacter.getLevel() < 70) {
case 1: if (discCount > 2) {
case 2: return false;
case 3: }
case 4: } else {
case 5: if (discCount > 3) {
case 6: return false;
if(discCount > 3) }
return false;
break;
case 7:
case 8:
if(discCount > 5)
return false;
break;
} }
} }
//Everything succeeded. Let's apply the rune //Everything succeeded. Let's apply the rune
//Attempt add rune to database //Attempt add rune to database
CharacterRune runeWithoutID = new CharacterRune(rb, playerCharacter.getObjectUUID()); CharacterRune runeWithoutID = new CharacterRune(rb, playerCharacter.getObjectUUID());
@ -363,6 +258,7 @@ public class ApplyRuneMsg extends ClientNetMsg {
if (cr == null) { if (cr == null) {
return false; return false;
} }
//remove any overridden runes from player //remove any overridden runes from player
ArrayList<Integer> overwrite = rb.getOverwrite(); ArrayList<Integer> overwrite = rb.getOverwrite();
CharacterRune toRemove = null; CharacterRune toRemove = null;
@ -371,10 +267,13 @@ public class ApplyRuneMsg extends ClientNetMsg {
toRemove = playerCharacter.removeRune(overwriteID); toRemove = playerCharacter.removeRune(overwriteID);
} }
} }
//add rune to player //add rune to player
playerCharacter.addRune(cr); playerCharacter.addRune(cr);
// recalculate all bonuses/formulas/skills/powers // recalculate all bonuses/formulas/skills/powers
playerCharacter.recalculate(); playerCharacter.recalculate();
//if overwriting a stat rune, add any amount granted from previous rune. //if overwriting a stat rune, add any amount granted from previous rune.
if (toRemove != null) { if (toRemove != null) {
RuneBase rbs = toRemove.getRuneBase(); RuneBase rbs = toRemove.getRuneBase();
@ -382,53 +281,48 @@ public class ApplyRuneMsg extends ClientNetMsg {
//add any additional stats to match old amount //add any additional stats to match old amount
int dif = strTotal - (int) playerCharacter.statStrBase; int dif = strTotal - (int) playerCharacter.statStrBase;
if (dif > 0 && strTotal < (int) playerCharacter.statStrMax) { if (dif > 0 && strTotal < (int) playerCharacter.statStrMax) {
PlayerManager.addStr(playerCharacter, dif); playerCharacter.addStr(dif);
} }
dif = dexTotal - (int) playerCharacter.statDexBase; dif = dexTotal - (int) playerCharacter.statDexBase;
if (dif > 0 && dexTotal < (int) playerCharacter.statDexMax) { if (dif > 0 && dexTotal < (int) playerCharacter.statDexMax) {
PlayerManager.addDex(playerCharacter, dif); playerCharacter.addDex(dif);
} }
dif = conTotal - (int) playerCharacter.statConBase; dif = conTotal - (int) playerCharacter.statConBase;
if (dif > 0 && conTotal < (int) playerCharacter.statConMax) { if (dif > 0 && conTotal < (int) playerCharacter.statConMax) {
PlayerManager.addCon(playerCharacter, dif); playerCharacter.addCon(dif);
} }
dif = intTotal - (int) playerCharacter.statIntBase; dif = intTotal - (int) playerCharacter.statIntBase;
if (dif > 0 && intTotal < (int) playerCharacter.statIntMax) { if (dif > 0 && intTotal < (int) playerCharacter.statIntMax) {
PlayerManager.addInt(playerCharacter, dif); playerCharacter.addInt(dif);
} }
dif = spiTotal - (int) playerCharacter.statSpiBase; dif = spiTotal - (int) playerCharacter.statSpiBase;
if (dif > 0 && spiTotal < (int) playerCharacter.statSpiMax) { if (dif > 0 && spiTotal < (int) playerCharacter.statSpiMax) {
PlayerManager.addSpi(playerCharacter, dif); playerCharacter.addSpi(dif);
} }
// recalculate all bonuses/formulas/skills/powers // recalculate all bonuses/formulas/skills/powers
playerCharacter.recalculate(); playerCharacter.recalculate();
} }
} }
switch (rb.getName()) {
case "Born of the Ethyri":
case "Born of the Taripontor":
case "Born of the Gwendannen":
case "Born of the Invorri":
case "Born of the Irydnu":
case "Scion of the Dar Khelegeur":
case "Scion of the Gwaridorn":
case "Scion of the Twathedilion":
cost = 0;
break;
}
if (cost > 0) { if (cost > 0) {
ModifyStatMsg msm = new ModifyStatMsg((0 - cost), 0, 3); ModifyStatMsg msm = new ModifyStatMsg((0 - cost), 0, 3);
dispatch = Dispatch.borrow(playerCharacter, msm); dispatch = Dispatch.borrow(playerCharacter, msm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
} }
//send apply rune message to client //send apply rune message to client
ApplyRuneMsg arm = new ApplyRuneMsg(playerCharacter.getObjectType().ordinal(), playerCharacter.getObjectUUID(), runeID, cr.getObjectType().ordinal(), cr.getObjectUUID(), false); ApplyRuneMsg arm = new ApplyRuneMsg(playerCharacter.getObjectType().ordinal(), playerCharacter.getObjectUUID(), runeID, cr.getObjectType().ordinal(), cr.getObjectUUID(), false);
dispatch = Dispatch.borrow(playerCharacter, arm); dispatch = Dispatch.borrow(playerCharacter, arm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
//alert them of success //alert them of success
ErrorPopupMsg.sendErrorPopup(playerCharacter, 160); ErrorPopupMsg.sendErrorPopup(playerCharacter, 160);
//reapply bonuses //reapply bonuses
playerCharacter.applyBonuses(); playerCharacter.applyBonuses();
return true; return true;
} }

6
src/engine/net/client/msg/ArcViewAssetTransactionsMsg.java

@ -13,8 +13,6 @@ import engine.Enum.GameObjectType;
import engine.Enum.TransactionType; import engine.Enum.TransactionType;
import engine.exception.SerializationException; import engine.exception.SerializationException;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.NPCManager;
import engine.gameManager.PlayerManager;
import engine.net.AbstractConnection; import engine.net.AbstractConnection;
import engine.net.ByteBufferReader; import engine.net.ByteBufferReader;
import engine.net.ByteBufferWriter; import engine.net.ByteBufferWriter;
@ -104,12 +102,12 @@ public class ArcViewAssetTransactionsMsg extends ClientNetMsg {
break; break;
case PlayerCharacter: case PlayerCharacter:
PlayerCharacter pc = PlayerManager.getPlayerCharacter(transaction.getTargetUUID()); PlayerCharacter pc = PlayerCharacter.getPlayerCharacter(transaction.getTargetUUID());
if (pc != null) if (pc != null)
name = pc.getCombinedName(); name = pc.getCombinedName();
break; break;
case NPC: case NPC:
NPC npc = NPCManager.getFromCache(transaction.getTargetUUID()); NPC npc = NPC.getFromCache(transaction.getTargetUUID());
if (npc != null) { if (npc != null) {
if (npc.getBuilding() != null) if (npc.getBuilding() != null)

12
src/engine/net/client/msg/BuyFromNPCWindowMsg.java

@ -11,8 +11,6 @@ package engine.net.client.msg;
import engine.Enum.ItemType; import engine.Enum.ItemType;
import engine.exception.SerializationException; import engine.exception.SerializationException;
import engine.gameManager.NPCManager;
import engine.gameManager.PlayerManager;
import engine.net.AbstractConnection; import engine.net.AbstractConnection;
import engine.net.AbstractNetMsg; import engine.net.AbstractNetMsg;
import engine.net.ByteBufferReader; import engine.net.ByteBufferReader;
@ -93,7 +91,7 @@ public class BuyFromNPCWindowMsg extends ClientNetMsg {
float sellPercent = 1; float sellPercent = 1;
NPC npc = NPCManager.getFromCache(npcID); NPC npc = NPC.getFromCache(npcID);
CharacterItemManager man = null; CharacterItemManager man = null;
ArrayList<Item> inventory = null; ArrayList<Item> inventory = null;
ArrayList<MobEquipment> sellInventory = null; ArrayList<MobEquipment> sellInventory = null;
@ -102,7 +100,7 @@ public class BuyFromNPCWindowMsg extends ClientNetMsg {
man = npc.getCharItemManager(); man = npc.getCharItemManager();
Contract contract = npc.getContract(); Contract contract = npc.getContract();
if (player != null) { if (player != null) {
float barget = PlayerManager.getBargain(player); float barget = player.getBargain();
float profit = npc.getSellPercent(player) - barget; float profit = npc.getSellPercent(player) - barget;
if (profit < 1) if (profit < 1)
@ -114,12 +112,6 @@ public class BuyFromNPCWindowMsg extends ClientNetMsg {
if (contract != null) if (contract != null)
sellInventory = contract.getSellInventory(); sellInventory = contract.getSellInventory();
//if(npc.contract.getObjectUUID() == 890){ // default steward
// sellInventory = npc.getSellInventorySteward();
// }
//if(npc.contract.getObjectUUID() == 889){ // default builder
// sellInventory = npc.getSellInventoryBuilder();
// }
} }
if (man != null) if (man != null)

12
src/engine/net/client/msg/CityDataMsg.java

@ -104,10 +104,8 @@ public class CityDataMsg extends ClientNetMsg {
} }
temp.putInt(mineList.size()); temp.putInt(mineList.size());
for (Mine mine : mineList) { for (Mine mine : mineList)
if(mine.getParentZone() != null && !mine.getParentZone().isContinent()) Mine.serializeForClientMsg(mine, temp);
Mine.serializeForClientMsg(mine, temp);
}
temp.put((byte) 0); // PAD temp.put((byte) 0); // PAD
} }
@ -180,10 +178,8 @@ public class CityDataMsg extends ClientNetMsg {
} }
writer.putInt(mineList.size()); writer.putInt(mineList.size());
for (Mine mine : mineList) { for (Mine mine : mineList)
if(mine.getParentZone() != null && !mine.getParentZone().isContinent()) Mine.serializeForClientMsg(mine, writer);
Mine.serializeForClientMsg(mine, writer);
}
} else } else
writer.putInt(0); writer.putInt(0);
} catch (Exception e) { } catch (Exception e) {

7
src/engine/net/client/msg/IgnoreMsg.java

@ -12,7 +12,6 @@ package engine.net.client.msg;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PlayerManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.net.AbstractConnection; import engine.net.AbstractConnection;
import engine.net.ByteBufferReader; import engine.net.ByteBufferReader;
@ -82,7 +81,7 @@ public class IgnoreMsg extends ClientNetMsg {
} }
//FIX THIS, USE OUR CACHE! //FIX THIS, USE OUR CACHE!
PlayerCharacter pcToIgnore = PlayerManager.getByFirstName(nameToIgnore); PlayerCharacter pcToIgnore = PlayerCharacter.getByFirstName(nameToIgnore);
if (pcSource == null) { if (pcSource == null) {
return; return;
@ -115,11 +114,11 @@ public class IgnoreMsg extends ClientNetMsg {
pcSource.removeIgnoredPlayer(pcToIgnore.getAccount()); pcSource.removeIgnoredPlayer(pcToIgnore.getAccount());
ChatManager.chatSystemInfo(pcSource, "Character " + fn + " is no longer ignored."); ChatManager.chatSystemInfo(pcSource, "Character " + fn + " is no longer ignored.");
} else { } else {
if (!PlayerManager.isIgnorable()) { if (!PlayerCharacter.isIgnorable()) {
ChatManager.chatSystemError(pcSource, "This character cannot be ignored."); ChatManager.chatSystemError(pcSource, "This character cannot be ignored.");
return; return;
} }
if (PlayerManager.isIgnoreListFull()) { if (PlayerCharacter.isIgnoreListFull()) {
ChatManager.chatSystemError(pcSource, "Your ignore list is already full."); ChatManager.chatSystemError(pcSource, "Your ignore list is already full.");
return; return;
} }

3
src/engine/net/client/msg/ItemProductionMsg.java

@ -11,7 +11,6 @@ package engine.net.client.msg;
import engine.Enum.GameObjectType; import engine.Enum.GameObjectType;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.NPCManager;
import engine.gameManager.PowersManager; import engine.gameManager.PowersManager;
import engine.net.AbstractConnection; import engine.net.AbstractConnection;
import engine.net.AbstractNetMsg; import engine.net.AbstractNetMsg;
@ -292,7 +291,7 @@ public class ItemProductionMsg extends ClientNetMsg {
writer.putInt(0); writer.putInt(0);
} }
NPC vendor = NPCManager.getFromCache(this.npcUUID); NPC vendor = NPC.getFromCache(this.npcUUID);
if (vendor != null) { if (vendor != null) {
if (toRoll.isComplete()) { if (toRoll.isComplete()) {
writer.putInt(0); writer.putInt(0);

31
src/engine/net/client/msg/ManageCityAssetsMsg.java

@ -275,7 +275,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
writer.putString(npcHire.getName()); writer.putString(npcHire.getName());
writer.putInt(1); writer.putInt(1);
writer.putInt(0); writer.putInt(Blueprint.getNpcMaintCost(npcHire.getRank()));
if (npcHire.getObjectType() == GameObjectType.NPC) if (npcHire.getObjectType() == GameObjectType.NPC)
writer.putInt(((NPC) npcHire).getContract().getIconID()); // Was 60 writer.putInt(((NPC) npcHire).getContract().getIconID()); // Was 60
else if (npcHire.getObjectType() == GameObjectType.Mob) { else if (npcHire.getObjectType() == GameObjectType.Mob) {
@ -392,9 +392,9 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
writer.putInt(bane.getSiegePhase().ordinal()); //1 challenge //2 standoff //3 war writer.putInt(bane.getSiegePhase().ordinal()); //1 challenge //2 standoff //3 war
writer.put((byte) 0); writer.put((byte) 0);
//if (!bane.isAccepted() && this.assetManager.getGuild() == banedCity.getGuild() && GuildStatusController.isInnerCouncil(this.assetManager.getGuildStatus())) if (!bane.isAccepted() && this.assetManager.getGuild() == banedCity.getGuild() && GuildStatusController.isInnerCouncil(this.assetManager.getGuildStatus()))
// writer.put((byte) 1); //canSetTime writer.put((byte) 1); //canSetTime
//else else
writer.put((byte) 0); writer.put((byte) 0);
DateTime placedOn = bane.getLiveDate(); DateTime placedOn = bane.getLiveDate();
@ -485,19 +485,36 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
writer.putInt(building.getRank()); writer.putInt(building.getRank());
writer.putInt(1); // Gold only // Maintenance costs include resource if
// this structure is an R8 tree
if (building.getRank() == 8)
writer.putInt(5); // Resources included
else
writer.putInt(1); // Gold only
writer.putInt(2308551); //Gold writer.putInt(2308551); //Gold
if (building.getBlueprint() == null) if (building.getBlueprint() == null)
writer.putInt(0); writer.putInt(0);
else else
writer.putInt(building.getBlueprint().getMaintCost()); // maint cost writer.putInt(building.getBlueprint().getMaintCost(building.getRank())); // maint cost
if (building.getRank() == 8) {
writer.putInt(74856115); // Stone
writer.putInt(1500); // maint cost
writer.putInt(-1603256692); // Lumber
writer.putInt(1500); // maint cost
writer.putInt(-1596311545); // Galvor
writer.putInt(5); // maint cost
writer.putInt(1532478436); // Wormwood
writer.putInt(5); // maint cost
}
LocalDateTime maintDate = building.maintDateTime; LocalDateTime maintDate = building.maintDateTime;
if (maintDate == null) if (maintDate == null)
maintDate = LocalDateTime.now(); maintDate = LocalDateTime.now();
writer.putLocalDateTime(maintDate); // current time writer.putLocalDateTime(LocalDateTime.now()); // current time
// utc offset? // utc offset?
writer.putInt((int) java.time.Duration.between(LocalDateTime.now(), maintDate).getSeconds()); // Seconds to maint date writer.putInt((int) java.time.Duration.between(LocalDateTime.now(), maintDate).getSeconds()); // Seconds to maint date

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

@ -178,7 +178,7 @@ public class ManageNPCMsg extends ClientNetMsg {
if (this.targetType == GameObjectType.NPC.ordinal()) { if (this.targetType == GameObjectType.NPC.ordinal()) {
npc = NPCManager.getFromCache(this.targetID); npc = NPC.getFromCache(this.targetID);
if (npc == null) { if (npc == null) {
Logger.error("Missing NPC of ID " + this.targetID); Logger.error("Missing NPC of ID " + this.targetID);
@ -233,7 +233,7 @@ public class ManageNPCMsg extends ClientNetMsg {
writer.put((byte) 0); writer.put((byte) 0);
writer.putInt(0); writer.putInt(0);
NPCProfits profit = NPCManager.GetNPCProfits(npc); NPCProfits profit = NPC.GetNPCProfits(npc);
if (profit == null) if (profit == null)
profit = NPCProfits.defaultProfits; profit = NPCProfits.defaultProfits;
@ -503,7 +503,7 @@ public class ManageNPCMsg extends ClientNetMsg {
writer.putInt(0); writer.putInt(0);
writer.putString("Repair items"); writer.putString("Repair items");
writer.putString("percent"); writer.putString("percent");
writer.putInt(npc.getSpecialPrice()); //cost for repair writer.putInt(npc.getRepairCost()); //cost for repair
writer.putInt(0); writer.putInt(0);
ArrayList<Integer> modPrefixList = npc.getModTypeTable(); ArrayList<Integer> modPrefixList = npc.getModTypeTable();
@ -598,7 +598,7 @@ public class ManageNPCMsg extends ClientNetMsg {
} }
if (NPCManager.ISGuardCaptain(mobA.getContract().getContractID()) == false) if (NPC.ISGuardCaptain(mobA.getContract().getContractID()) == false)
maxSlots = 0; maxSlots = 0;
writer.putInt(0); //anything other than 0 seems to mess up the client writer.putInt(0); //anything other than 0 seems to mess up the client

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save