Compare commits

..

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

  1. 48
      src/engine/Enum.java
  2. 7
      src/engine/InterestManagement/InterestManager.java
  3. 166
      src/engine/db/handlers/dbBaneHandler.java
  4. 14
      src/engine/db/handlers/dbCityHandler.java
  5. 56
      src/engine/db/handlers/dbContractHandler.java
  6. 17
      src/engine/db/handlers/dbHandlerBase.java
  7. 24
      src/engine/db/handlers/dbItemHandler.java
  8. 38
      src/engine/db/handlers/dbNPCHandler.java
  9. 47
      src/engine/devcmd/cmds/AddNPCCmd.java
  10. 63
      src/engine/devcmd/cmds/GimmeCmd.java
  11. 77
      src/engine/devcmd/cmds/HotzoneCmd.java
  12. 29
      src/engine/devcmd/cmds/InfoCmd.java
  13. 5
      src/engine/devcmd/cmds/MineActiveCmd.java
  14. 5
      src/engine/devcmd/cmds/PrintStatsCmd.java
  15. 4
      src/engine/devcmd/cmds/SetLevelCmd.java
  16. 28
      src/engine/devcmd/cmds/SimulateBootyCmd.java
  17. 168
      src/engine/gameManager/ArenaManager.java
  18. 37
      src/engine/gameManager/BuildingManager.java
  19. 84
      src/engine/gameManager/CombatManager.java
  20. 1
      src/engine/gameManager/ConfigManager.java
  21. 21
      src/engine/gameManager/DevCmdManager.java
  22. 661
      src/engine/gameManager/LootManager.java
  23. 123
      src/engine/gameManager/MaintenanceManager.java
  24. 8
      src/engine/gameManager/MovementManager.java
  25. 4
      src/engine/gameManager/NPCManager.java
  26. 350
      src/engine/gameManager/PowersManager.java
  27. 34
      src/engine/gameManager/SimulationManager.java
  28. 347
      src/engine/gameManager/StrongholdManager.java
  29. 195
      src/engine/gameManager/ZergManager.java
  30. 73
      src/engine/gameManager/ZoneManager.java
  31. 2
      src/engine/jobs/AbstractEffectJob.java
  32. 10
      src/engine/jobs/FinishSummonsJob.java
  33. 14
      src/engine/jobs/UpgradeBuildingJob.java
  34. 22
      src/engine/loot/ItemTableEntry.java
  35. 10
      src/engine/loot/ModTableEntry.java
  36. 2
      src/engine/math/Bounds.java
  37. 156
      src/engine/mobileAI/MobAI.java
  38. 26
      src/engine/mobileAI/Threads/MobAIThread.java
  39. 50
      src/engine/mobileAI/Threads/MobRespawnThread.java
  40. 147
      src/engine/mobileAI/utilities/CombatUtilities.java
  41. 12
      src/engine/mobileAI/utilities/MovementUtilities.java
  42. 8
      src/engine/net/NetMsgFactory.java
  43. 8
      src/engine/net/client/ClientConnection.java
  44. 221
      src/engine/net/client/ClientMessagePump.java
  45. 2
      src/engine/net/client/handlers/ActivateNPCMsgHandler.java
  46. 15
      src/engine/net/client/handlers/ArcMineChangeProductionMsgHandler.java
  47. 15
      src/engine/net/client/handlers/ChangeAltitudeHandler.java
  48. 2
      src/engine/net/client/handlers/CityDataHandler.java
  49. 2
      src/engine/net/client/handlers/DestroyBuildingHandler.java
  50. 2
      src/engine/net/client/handlers/GroupInviteResponseHandler.java
  51. 2
      src/engine/net/client/handlers/HirelingServiceMsgHandler.java
  52. 5
      src/engine/net/client/handlers/ItemProductionMsgHandler.java
  53. 13
      src/engine/net/client/handlers/MOTDEditHandler.java
  54. 157
      src/engine/net/client/handlers/MerchantMsgHandler.java
  55. 31
      src/engine/net/client/handlers/ObjectActionMsgHandler.java
  56. 9
      src/engine/net/client/handlers/PlaceAssetMsgHandler.java
  57. 3
      src/engine/net/client/handlers/TaxCityMsgHandler.java
  58. 241
      src/engine/net/client/msg/ApplyRuneMsg.java
  59. 6
      src/engine/net/client/msg/BuyFromNPCWindowMsg.java
  60. 12
      src/engine/net/client/msg/CityDataMsg.java
  61. 31
      src/engine/net/client/msg/ManageCityAssetsMsg.java
  62. 2
      src/engine/net/client/msg/ManageNPCMsg.java
  63. 52
      src/engine/net/client/msg/ServerInfoMsg.java
  64. 22
      src/engine/net/client/msg/TeleportRepledgeListMsg.java
  65. 94
      src/engine/net/client/msg/VendorDialogMsg.java
  66. 3
      src/engine/net/client/msg/WhoResponseMsg.java
  67. 85
      src/engine/objects/AbstractCharacter.java
  68. 6
      src/engine/objects/AbstractWorldObject.java
  69. 82
      src/engine/objects/Arena.java
  70. 177
      src/engine/objects/Bane.java
  71. 98
      src/engine/objects/Blueprint.java
  72. 80
      src/engine/objects/Building.java
  73. 5
      src/engine/objects/CharacterItemManager.java
  74. 13
      src/engine/objects/CharacterSkill.java
  75. 78
      src/engine/objects/City.java
  76. 384
      src/engine/objects/Contract.java
  77. 2
      src/engine/objects/Corpse.java
  78. 46
      src/engine/objects/Experience.java
  79. 10
      src/engine/objects/Guild.java
  80. 52
      src/engine/objects/Item.java
  81. 149
      src/engine/objects/ItemBase.java
  82. 53
      src/engine/objects/ItemFactory.java
  83. 7
      src/engine/objects/MenuOption.java
  84. 461
      src/engine/objects/Mine.java
  85. 45
      src/engine/objects/MineProduction.java
  86. 484
      src/engine/objects/Mob.java
  87. 23
      src/engine/objects/MobBase.java
  88. 4
      src/engine/objects/MobEquipment.java
  89. 2
      src/engine/objects/MobLoot.java
  90. 137
      src/engine/objects/NPC.java
  91. 743
      src/engine/objects/PlayerCharacter.java
  92. 1
      src/engine/objects/PromotionClass.java
  93. 25
      src/engine/objects/Realm.java
  94. 108
      src/engine/objects/Resists.java
  95. 27
      src/engine/objects/Shrine.java
  96. 78
      src/engine/objects/Warehouse.java
  97. 5
      src/engine/objects/Zone.java
  98. 5
      src/engine/powers/PowersBase.java
  99. 2
      src/engine/powers/effectmodifiers/AttributeEffectModifier.java
  100. 2
      src/engine/powers/effectmodifiers/HealthRecoverRateEffectModifier.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 @@ @@ -9,13 +9,15 @@
package engine;
import ch.claude_martin.enumbitset.EnumBitSetHelper;
import engine.gameManager.BuildingManager;
import engine.gameManager.ConfigManager;
import engine.gameManager.PowersManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector2f;
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 org.pmw.tinylog.Logger;
@ -137,8 +139,8 @@ public class Enum { @@ -137,8 +139,8 @@ public class Enum {
HALFGIANTMALE(2010, MonsterType.HalfGiant, RunSpeed.STANDARD, CharacterSex.MALE, 1.15f),
HUMANMALE(2011, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.MALE, 1),
HUMANFEMALE(2012, MonsterType.Human, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.MALE, 1.1f),
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.IREKEI, CharacterSex.FEMALE, 1.1f),
IREKEIMALE(2013, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.MALE, 1.1f),
IREKEIFEMALE(2014, MonsterType.Irekei, RunSpeed.STANDARD, CharacterSex.FEMALE, 1.1f),
SHADEMALE(2015, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.MALE, 1),
SHADEFEMALE(2016, MonsterType.Shade, RunSpeed.STANDARD, CharacterSex.FEMALE, 1),
MINOMALE(2017, MonsterType.Minotaur, RunSpeed.MINOTAUR, CharacterSex.MALE, 1.3f),
@ -170,8 +172,6 @@ public class Enum { @@ -170,8 +172,6 @@ public class Enum {
}
public static RaceType getRaceTypebyRuneID(int runeID) {
if(runeID == 1999)
return _raceTypeByID.get(2017);
return _raceTypeByID.get(runeID);
}
@ -208,8 +208,8 @@ public class Enum { @@ -208,8 +208,8 @@ public class Enum {
SENTINEL(0, 0, 0, 0, 0, 0, 0),
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),
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);
MINOTAUR(6.6300001f, 15.95f, 4.2199998f, 15.95f, 6.3299999f, 18.379999f, 6.5f);
private float walkStandard;
private float walkCombat;
private float runStandard;
@ -469,14 +469,11 @@ public class Enum { @@ -469,14 +469,11 @@ public class Enum {
// 14001 does not have a banestone to bind at
if (ruinZone.getLoadNum() == 14001) {
if (ruinZone.getLoadNum() == 14001)
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc(), 30);
}else {
//spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
//.add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30);
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(27977).loc,30f);
}
else
spawnLocation = Vector3fImmutable.getRandomPointOnCircle(ruinZone.getLoc()
.add(new Vector3fImmutable(-196.016f, 2.812f, 203.621f)), 30);
}
@ -779,7 +776,6 @@ public class Enum { @@ -779,7 +776,6 @@ public class Enum {
Combat,
Spires,
Snare,
Snared,
Stun,
Blind,
Root,
@ -882,7 +878,6 @@ public class Enum { @@ -882,7 +878,6 @@ public class Enum {
Siege,
Slash,
Snare,
Snared,
Sorcery,
Spear,
SpearMastery,
@ -962,17 +957,6 @@ public class Enum { @@ -962,17 +957,6 @@ public class Enum {
Wizardry;
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;
if (modName.isEmpty())
return SourceType.None;
@ -1032,7 +1016,6 @@ public class Enum { @@ -1032,7 +1016,6 @@ public class Enum {
Silence,
Slash,
Snare,
Snared,
Stance,
Stun,
Summon,
@ -1157,7 +1140,6 @@ public class Enum { @@ -1157,7 +1140,6 @@ public class Enum {
SkillDebuff,
SlashResistanceDebuff,
Snare,
Snared,
StackableAttrCONBuff,
StackableAttrDEXBuff,
StackableAttrSTRBuff,
@ -2324,9 +2306,9 @@ public class Enum { @@ -2324,9 +2306,9 @@ public class Enum {
public enum CityBoundsType {
GRID(544),
ZONE(672),
PLACEMENT(673);
GRID(640),
ZONE(875),
PLACEMENT(876);
public final float extents;

7
src/engine/InterestManagement/InterestManager.java

@ -19,7 +19,10 @@ import engine.net.AbstractNetMsg; @@ -19,7 +19,10 @@ import engine.net.AbstractNetMsg;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
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.server.MBServerStatics;
import org.pmw.tinylog.Logger;
@ -518,10 +521,10 @@ public enum InterestManager implements Runnable { @@ -518,10 +521,10 @@ public enum InterestManager implements Runnable {
// Update loaded upbjects lists
player.isBoxed = PlayerCharacter.checkIfBoxed(player);
player.setDirtyLoad(true);
updateStaticList(player, origin);
updateMobileList(player, origin);
}
public synchronized void HandleLoadForTeleport(PlayerCharacter playerCharacter) {

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

@ -10,13 +10,17 @@ @@ -10,13 +10,17 @@
package engine.db.handlers;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import engine.objects.Bane;
import engine.objects.Building;
import engine.objects.City;
import engine.objects.PlayerCharacter;
import org.joda.time.DateTime;
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 {
@ -85,139 +89,6 @@ public class dbBaneHandler extends dbHandlerBase { @@ -85,139 +89,6 @@ public class dbBaneHandler extends dbHandlerBase {
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) {
if (bane == null)
@ -236,25 +107,4 @@ public class dbBaneHandler extends dbHandlerBase { @@ -236,25 +107,4 @@ public class dbBaneHandler extends dbHandlerBase {
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
}
}

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

@ -11,7 +11,10 @@ package engine.db.handlers; @@ -11,7 +11,10 @@ package engine.db.handlers;
import engine.Enum;
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 java.sql.*;
@ -92,16 +95,7 @@ public class dbCityHandler extends dbHandlerBase { @@ -92,16 +95,7 @@ public class dbCityHandler extends dbHandlerBase {
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) {
ArrayList<City> cityList = new ArrayList<>();

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

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

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

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

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

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

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

@ -131,32 +131,6 @@ public class dbNPCHandler extends dbHandlerBase { @@ -131,32 +131,6 @@ public class dbNPCHandler extends dbHandlerBase {
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) {
int rowCount;
@ -202,18 +176,6 @@ public class dbNPCHandler extends dbHandlerBase { @@ -202,18 +176,6 @@ public class dbNPCHandler extends dbHandlerBase {
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) {
try (Connection connection = DbManager.getConnection();

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

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

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

@ -1,63 +0,0 @@ @@ -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";
}
}

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

@ -0,0 +1,77 @@ @@ -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]";
}
}

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

@ -15,13 +15,9 @@ import engine.Enum.GameObjectType; @@ -15,13 +15,9 @@ import engine.Enum.GameObjectType;
import engine.Enum.TargetColor;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.BuildingManager;
import engine.gameManager.PowersManager;
import engine.gameManager.SessionManager;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import engine.powers.EffectsBase;
import engine.powers.PowersBase;
import engine.server.MBServerStatics;
import engine.util.StringUtils;
import java.text.DecimalFormat;
@ -341,8 +337,7 @@ public class InfoCmd extends AbstractDevCmd { @@ -341,8 +337,7 @@ public class InfoCmd extends AbstractDevCmd {
output += "Swimming : " + targetPC.isSwimming();
output += newline;
output += "isMoving : " + targetPC.isMoving();
output += newline;
output += "Zerg Multiplier : " + targetPC.ZergMultiplier;
break;
case NPC:
@ -497,16 +492,13 @@ public class InfoCmd extends AbstractDevCmd { @@ -497,16 +492,13 @@ public class InfoCmd extends AbstractDevCmd {
output += newline;
output += "No building found." + newline;
}
output += "Damage: " + targetMob.mobBase.getDamageMin() + " - " + targetMob.mobBase.getDamageMax() + newline;
output += "ATR: " + targetMob.mobBase.getAttackRating() + newline;
output += "DEF: " + targetMob.defenseRating + newline;
output += "RANGE: " + targetMob.getRange() + newline;
output += "Effects:" + newline;
for(MobBaseEffects mbe : targetMob.mobBase.mobbaseEffects){
EffectsBase eb = PowersManager.getEffectByToken(mbe.getToken());
output += eb.getName() + newline;
int max = (int)(4.882 * targetMob.level + 121.0);
if(max > 321){
max = 321;
}
int min = (int)(4.469 * targetMob.level - 3.469);
output += "Min Loot Roll = " + min;
output += "Max Loot Roll = " + max;
break;
case Item: //intentional passthrough
case MobLoot:
@ -537,13 +529,6 @@ public class InfoCmd extends AbstractDevCmd { @@ -537,13 +529,6 @@ public class InfoCmd extends AbstractDevCmd {
}
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);

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

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

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

@ -9,7 +9,6 @@ @@ -9,7 +9,6 @@
package engine.devcmd.cmds;
import engine.Enum;
import engine.devcmd.AbstractDevCmd;
import engine.objects.*;
@ -73,10 +72,6 @@ public class PrintStatsCmd extends AbstractDevCmd { @@ -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 += "Off Hand: atr: " + tar.getAtrHandTwo() + ", damage: " + tar.getMinDamageHandTwo() + " to " + tar.getMaxDamageHandTwo() + ", speed: " + tar.getSpeedHandTwo() + 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);
}

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

@ -46,7 +46,7 @@ public class SetLevelCmd extends AbstractDevCmd { @@ -46,7 +46,7 @@ public class SetLevelCmd extends AbstractDevCmd {
this.sendUsage(pc);
return;
}
if (level < 1 || level > 80) {
if (level < 1 || level > 75) {
this.sendHelp(pc);
return;
}
@ -62,7 +62,7 @@ public class SetLevelCmd extends AbstractDevCmd { @@ -62,7 +62,7 @@ public class SetLevelCmd extends AbstractDevCmd {
@Override
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

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

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

168
src/engine/gameManager/ArenaManager.java

@ -1,168 +0,0 @@ @@ -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;
}
}

37
src/engine/gameManager/BuildingManager.java

@ -438,18 +438,6 @@ public enum BuildingManager { @@ -438,18 +438,6 @@ public enum BuildingManager {
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.
// if (building.getGuild() != null){
// if (pc.getGuild() != null)
@ -532,30 +520,7 @@ public enum BuildingManager { @@ -532,30 +520,7 @@ public enum BuildingManager {
if (building.getBlueprintUUID() == 0)
return false;
if(building.getBlueprint().getBuildingGroup().equals(BuildingGroup.TOL)){
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())
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
return false;
String pirateName = NPCManager.getPirateName(contract.getMobbaseID());

84
src/engine/gameManager/CombatManager.java

@ -646,24 +646,24 @@ public enum CombatManager { @@ -646,24 +646,24 @@ public enum CombatManager {
//Get hit chance
//int chance;
int chance;
float dif = atr - defense;
//if (dif > 100)
// chance = 94;
//else if (dif < -100)
// chance = 4;
//else
// chance = (int) ((0.45 * dif) + 49);
if (dif > 100)
chance = 94;
else if (dif < -100)
chance = 4;
else
chance = (int) ((0.45 * dif) + 49);
errorTrack = 5;
//calculate hit/miss
int roll = ThreadLocalRandom.current().nextInt(100);
DeferredPowerJob dpj = null;
boolean hitLanded = LandHit((int)atr,(int)defense);
if (hitLanded) {
if (roll < chance) {
if (ac.getObjectType().equals(GameObjectType.PlayerCharacter))
updateAttackTimers((PlayerCharacter) ac, target, true);
@ -692,13 +692,7 @@ public enum CombatManager { @@ -692,13 +692,7 @@ public enum CombatManager {
PlayerBonuses bonus = ac.getBonuses();
float attackRange = getWeaponRange(wb, bonus);
if(specialCaseHitRoll(dpj.getPowerToken())) {
if(hitLanded) {
dpj.attack(target, attackRange);
}
}else{
dpj.attack(target, attackRange);
}
dpj.attack(target, attackRange);
if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518))
((PlayerCharacter) ac).setWeaponPower(dpj);
@ -713,13 +707,7 @@ public enum CombatManager { @@ -713,13 +707,7 @@ public enum CombatManager {
if (dpj != null && dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518)) {
float attackRange = getWeaponRange(wb, bonuses);
if(specialCaseHitRoll(dpj.getPowerToken())) {
if(hitLanded) {
dpj.attack(target, attackRange);
}
}else{
dpj.attack(target, attackRange);
}
dpj.attack(target, attackRange);
}
}
@ -927,13 +915,7 @@ public enum CombatManager { @@ -927,13 +915,7 @@ public enum CombatManager {
if (wp.requiresHitRoll() == false) {
PlayerBonuses bonus = ac.getBonuses();
float attackRange = getWeaponRange(wb, bonus);
if(specialCaseHitRoll(dpj.getPowerToken())) {
if(hitLanded) {
dpj.attack(target, attackRange);
}
}else{
dpj.attack(target, attackRange);
}
dpj.attack(target, attackRange);
} else
((PlayerCharacter) ac).setWeaponPower(null);
}
@ -1072,10 +1054,6 @@ public enum CombatManager { @@ -1072,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))
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);
DispatchMessage.sendToAllInRange(target, cmm);
}
@ -1259,17 +1237,14 @@ public enum CombatManager { @@ -1259,17 +1237,14 @@ public enum CombatManager {
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);
if (pc == null)
return;
if(pc.isFlying())
pc.setSit(false);
else
pc.setSit(toggle);
pc.setSit(toggle);
UpdateStateMsg rwss = new UpdateStateMsg();
rwss.setPlayer(pc);
@ -1347,13 +1322,6 @@ public enum CombatManager { @@ -1347,13 +1322,6 @@ public enum CombatManager {
return;
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);
}
}
}
}
}
@ -1470,28 +1438,4 @@ public enum CombatManager { @@ -1470,28 +1438,4 @@ public enum CombatManager {
((AbstractCharacter) awo).getCharItemManager().damageRandomArmor(1);
}
public static boolean LandHit(int C5, int D5){
float chance = (C5-((C5+D5)*.315f)) / ((D5-((C5+D5)*.315f)) + (C5-((C5+D5)*.315f)));
int convertedChance = Math.round(chance * 100);
//convertedChance = Math.max(5, Math.min(95, convertedChance));
int roll = ThreadLocalRandom.current().nextInt(101);
if(roll < 5)//always 5% chance ot miss
return false;
return roll <= convertedChance;
}
public static boolean specialCaseHitRoll(int powerID){
switch(powerID) {
case 563200808: // Naargal's Bite
case 563205337: // Naargal's Dart
case 563205930: // Sword of Saint Malorn
return true;
default:
return false;
}
}
}

1
src/engine/gameManager/ConfigManager.java

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

21
src/engine/gameManager/DevCmdManager.java

@ -79,6 +79,7 @@ public enum DevCmdManager { @@ -79,6 +79,7 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new AddGoldCmd());
DevCmdManager.registerDevCmd(new ZoneInfoCmd());
DevCmdManager.registerDevCmd(new DebugMeleeSyncCmd());
DevCmdManager.registerDevCmd(new HotzoneCmd());
DevCmdManager.registerDevCmd(new MineActiveCmd());
// Dev
DevCmdManager.registerDevCmd(new ApplyStatModCmd());
@ -102,7 +103,6 @@ public enum DevCmdManager { @@ -102,7 +103,6 @@ public enum DevCmdManager {
DevCmdManager.registerDevCmd(new SetAdminRuneCmd());
DevCmdManager.registerDevCmd(new SetInvulCmd());
DevCmdManager.registerDevCmd(new MakeItemCmd());
DevCmdManager.registerDevCmd(new GimmeCmd());
DevCmdManager.registerDevCmd(new EnchantCmd());
DevCmdManager.registerDevCmd(new SetSubRaceCmd());
// Admin
@ -179,23 +179,8 @@ public enum DevCmdManager { @@ -179,23 +179,8 @@ public enum DevCmdManager {
//kill any commands not available to everyone on production server
//only admin level can run dev commands on production
boolean playerAllowed = false;
if(ConfigManager.MB_WORLD_TESTMODE.getValue().equals("true")) {
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)) {
if (a.status.equals(Enum.AccountStatus.ADMIN) == false) {
Logger.info("Account " + a.getUname() + "attempted to use dev command " + cmd);
return false;
}

661
src/engine/gameManager/LootManager.java

@ -17,9 +17,7 @@ import engine.objects.*; @@ -17,9 +17,7 @@ import engine.objects.*;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
/**
@ -36,12 +34,6 @@ public enum LootManager { @@ -36,12 +34,6 @@ public enum LootManager {
public static HashMap<Integer, ArrayList<ModTableEntry>> _modTables = 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
public static float NORMAL_DROP_RATE;
@ -76,128 +68,49 @@ public enum LootManager { @@ -76,128 +68,49 @@ public enum LootManager {
public static void GenerateMobLoot(Mob mob) {
if(mob == null){
return;
}
//determine if mob is in hotzone
boolean inHotzone = false;
boolean inHotzone = ZoneManager.inHotZone(mob.getLoc());
//iterate the booty sets
if(mob.mobBase == null || mob.getMobBaseID() == 253003){
int i = 0;
}
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet))
if (mob.getMobBase().bootySet != 0 && _bootySetMap.containsKey(mob.getMobBase().bootySet) == true)
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);
}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
for (Item it : mob.getInventory()) {
ItemBase ib = it.getItemBase();
if (ib == null)
break;
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?");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg);
for (Item it : mob.getInventory()) {
ItemBase ib = it.getItemBase();
if(ib == null)
break;
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?");
chatMsg.setMessageType(10);
chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID());
DispatchMessage.dispatchMsgToAll(chatMsg);
}
}
}
}
private static void RunBootySet(ArrayList<BootySetEntry> entries, Mob mob, boolean inHotzone) {
boolean hotzoneWasRan = false;
float dropRate;
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);
}
}
}
float dropRate = 1.0f;
// Iterate all entries in this bootySet and process accordingly
Zone zone = ZoneManager.findSmallestZone(mob.loc);
for (BootySetEntry bse : entries) {
switch (bse.bootyType) {
case "GOLD":
if (zone != null && zone.getSafeZone() == (byte)1)
return; // no loot to drop in safezones
GenerateGoldDrop(mob, bse, inHotzone);
break;
case "LOOT":
if (zone != null && zone.getSafeZone() == (byte)1)
return; // no loot to drop in safezones
dropRate = LootManager.NORMAL_DROP_RATE;
if (mob.getSafeZone() == false)
dropRate = LootManager.NORMAL_DROP_RATE;
if (inHotzone == true)
dropRate = LootManager.HOTZONE_DROP_RATE;
@ -222,109 +135,6 @@ public enum LootManager { @@ -222,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) {
if (mob == null || _genTables.containsKey(genTableID) == false)
@ -346,10 +156,11 @@ public enum LootManager { @@ -346,10 +156,11 @@ public enum LootManager {
//gets the 1-320 roll for this mob
int itemTableRoll = 0;
int objectType = mob.getObjectType().ordinal();
if(mob.getObjectType().ordinal() == 52) { //52 = player character
itemTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
} else{
itemTableRoll = TableRoll(mob.level);
itemTableRoll = TableRoll(mob.level, inHotzone);
}
ItemTableEntry tableRow = ItemTableEntry.rollTable(itemTableId, itemTableRoll);
if (tableRow == null)
@ -361,23 +172,13 @@ public enum LootManager { @@ -361,23 +172,13 @@ public enum LootManager {
return null;
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);
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);
Enum.ItemType outType = outItem.getItemBase().getType();
if(selectedRow.pModTable != 0){
try {
@ -395,12 +196,6 @@ public enum LootManager { @@ -395,12 +196,6 @@ public enum LootManager {
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;
}
@ -421,7 +216,7 @@ public enum LootManager { @@ -421,7 +216,7 @@ public enum LootManager {
if(mob.getObjectType().ordinal() == 52) {
prefixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
} else{
prefixTableRoll = TableRoll(mob.level);
prefixTableRoll = TableRoll(mob.level, inHotzone);
}
ModTableEntry prefixMod = ModTableEntry.rollTable(prefixTable.modTableID, prefixTableRoll);
@ -453,7 +248,7 @@ public enum LootManager { @@ -453,7 +248,7 @@ public enum LootManager {
if(mob.getObjectType().ordinal() == 52) {
suffixTableRoll = ThreadLocalRandom.current().nextInt(1,320 + 1);
} else{
suffixTableRoll = TableRoll(mob.level);
suffixTableRoll = TableRoll(mob.level, inHotzone);
}
ModTableEntry suffixMod = ModTableEntry.rollTable(suffixTable.modTableID, suffixTableRoll);
@ -468,36 +263,23 @@ public enum LootManager { @@ -468,36 +263,23 @@ public enum LootManager {
return inItem;
}
public static int TableRoll(int mobLevel) {
int rank = (int)(mobLevel * 0.1f);
int min = 50;
int max = 100;
switch(rank){
case 1:
min = 200;
max = 250;
break;
case 2:
min = 210;
max = 275;
break;
case 3:
min = 220;
max = 300;
break;
case 4:
min = 230;
max = 320;
break;
case 5:
case 6:
case 7:
case 8:
min = 240;
max = 320;
break;
}
public static int TableRoll(int mobLevel, Boolean inHotzone) {
if (mobLevel > 65)
mobLevel = 65;
int max = (int) (4.882 * mobLevel + 127.0);
if (max > 319)
max = 319;
int min = (int) (4.469 * mobLevel - 3.469);
if (min < 70)
min = 70;
if (inHotzone)
min += mobLevel;
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
@ -517,7 +299,12 @@ public enum LootManager { @@ -517,7 +299,12 @@ public enum LootManager {
int high = bse.highGold;
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) {
MobLoot goldAmount = new MobLoot(mob, gold);
@ -528,63 +315,45 @@ public enum LootManager { @@ -528,63 +315,45 @@ public enum LootManager {
public static void GenerateLootDrop(Mob mob, int tableID, Boolean inHotzone) {
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
if(toAdd != null){
ItemBase ib = toAdd.getItemBase();
switch(ib.getType()){
case CONTRACT:
case RUNE:
case RESOURCE:
return;
}
toAdd.setIsID(true);
mob.getCharItemManager().addItemToInventory(toAdd);
}
}
try {
MobLoot toAdd = getGenTableItem(tableID, mob, inHotzone);
public static void GenerateEquipmentDrop(Mob mob) {
if (toAdd != null)
mob.getCharItemManager().addItemToInventory(toAdd);
if (mob == null || mob.getSafeZone())
return; // no equipment to drop in safezones
} catch (Exception e) {
//TODO chase down loot generation error, affects roughly 2% of drops
int i = 0;
}
}
if(mob.StrongholdGuardian || mob.StrongholdCommander || mob.StrongholdEpic)
return; // stronghold mobs don't drop equipment
public static void GenerateEquipmentDrop(Mob mob) {
//do equipment here
if (mob.getEquip() != null) {
boolean isVorg = false;
int dropCount = 0;
if (mob.getEquip() != null)
for (MobEquipment me : mob.getEquip().values()) {
if (me.getDropChance() == 0)
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 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)
continue;
MobLoot ml = new MobLoot(mob, itemBase, false);
MobLoot ml = new MobLoot(mob, me.getItemBase(), false);
ml.setIsID(true);
ml.setDurabilityCurrent((short) (ml.getDurabilityCurrent() - ThreadLocalRandom.current().nextInt(5) + 1));
mob.getCharItemManager().addItemToInventory(ml);
if (ml != null && dropCount < 1) {
ml.setIsID(true);
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) {
@ -598,11 +367,8 @@ public enum LootManager { @@ -598,11 +367,8 @@ public enum LootManager {
MobLoot lootItem = new MobLoot(mob, ItemBase.getItemBase(bse.itemBase), true);
if (lootItem != null) {
if (lootItem != null)
mob.getCharItemManager().addItemToInventory(lootItem);
if(lootItem.getItemBase().isDiscRune() && !Mob.discDroppers.contains(mob))
Mob.AddDiscDropper(mob);
}
}
public static void peddleFate(PlayerCharacter playerCharacter, Item gift) {
@ -626,12 +392,12 @@ public enum LootManager { @@ -626,12 +392,12 @@ public enum LootManager {
//check if player owns the gift he is trying to open
if (!itemMan.doesCharOwnThisItem(gift.getObjectUUID()))
if (itemMan.doesCharOwnThisItem(gift.getObjectUUID()) == false)
return;
//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);
if(selectedRow == null)
@ -647,276 +413,45 @@ public enum LootManager { @@ -647,276 +413,45 @@ public enum LootManager {
//create the item from the table, quantity is always 1
ItemBase ib = ItemBase.getItemBase(selectedItem.cacheID);
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));
}
}
MobLoot winnings = new MobLoot(playerCharacter, ItemBase.getItemBase(selectedItem.cacheID), 1, false);
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) {
MobLoot goldAmount = new MobLoot(mob, gold);
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;
if (winnings == null)
return;
int id = rollRandomItem(contractTableID);
ItemBase ib = ItemBase.getItemBase(id);
if (ib != null) {
MobLoot contract = new MobLoot(mob, ib, true);
//early exit if the inventory of the player will not old the item
if (contract != null)
mob.getCharItemManager().addItemToInventory(contract);
}
if (itemMan.hasRoomInventory(winnings.getItemBase().getWeight()) == false) {
ErrorPopupMsg.sendErrorPopup(playerCharacter, 21);
return;
}
//special commander drop chances
if (commander)
GenerateCommanderLoot(mob,false);
//determine if the winning item needs a prefix
//special epic drop chances
if (epic) {
GenerateCommanderLoot(mob, true);
GenerateCommanderLoot(mob,false);
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);
}
}
public static void GenerateCommanderLoot(Mob mob, boolean epic){
//present chance
if (ThreadLocalRandom.current().nextInt(100) < 25)
DropPresent(mob);
//determine if the winning item needs a suffix
//present chance
if (ThreadLocalRandom.current().nextInt(100) < 25)
DropPresent(mob);
//chance for glass
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);
}
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);
//chance for disc
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);
//remove gift from inventory
if (toAdd3 != null)
mob.getCharItemManager().addItemToInventory(toAdd3);
}
}
itemMan.consume(gift);
//chance for stat rune
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);
//add winnings to player inventory
if (toAdd4 != null)
mob.getCharItemManager().addItemToInventory(toAdd4);
}
}
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);
}
}
Item playerWinnings = winnings.promoteToItem(playerCharacter);
itemMan.addItemToInventory(playerWinnings);
itemMan.updateInventory();
}
}

123
src/engine/gameManager/MaintenanceManager.java

@ -24,7 +24,7 @@ public enum MaintenanceManager { @@ -24,7 +24,7 @@ public enum MaintenanceManager {
public static void setMaintDateTime(Building building, LocalDateTime maintDate) {
building.maintDateTime = maintDate.withHour(1).withMinute(0).withSecond(0);
building.maintDateTime = maintDate;
DbManager.BuildingQueries.updateMaintDate(building);
}
@ -49,15 +49,19 @@ public enum MaintenanceManager { @@ -49,15 +49,19 @@ public enum MaintenanceManager {
if (chargeUpkeep(building) == false)
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());
}
@ -94,10 +98,6 @@ public enum MaintenanceManager { @@ -94,10 +98,6 @@ public enum MaintenanceManager {
continue;
}
//only ToL pays maintenance
if(building.getBlueprint().getBuildingGroup() != null && !building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.TOL))
continue;
// No maintenance on banestones omfg
if (building.getBlueprint().getBuildingGroup().equals(Enum.BuildingGroup.BANESTONE))
@ -122,9 +122,9 @@ public enum MaintenanceManager { @@ -122,9 +122,9 @@ public enum MaintenanceManager {
//no maintenance if day of week doesnt match
//if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
// continue;
//}
if (LocalDateTime.now().getDayOfWeek().ordinal() != building.maintDateTime.getDayOfWeek().ordinal()) {
continue;
}
// Add building to maintenance queue
maintList.add(building);
@ -186,8 +186,49 @@ public enum MaintenanceManager { @@ -186,8 +186,49 @@ public enum MaintenanceManager {
// If this is an R8 tree, validate that we can
// 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
}
@ -212,6 +253,58 @@ public enum MaintenanceManager { @@ -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;
}

8
src/engine/gameManager/MovementManager.java

@ -68,7 +68,7 @@ public enum MovementManager { @@ -68,7 +68,7 @@ public enum MovementManager {
if (toMove.getObjectType().equals(GameObjectType.PlayerCharacter)) {
if (((PlayerCharacter) toMove).isCasting())
((PlayerCharacter) toMove).update(false);
((PlayerCharacter) toMove).update();
}
@ -96,7 +96,7 @@ public enum MovementManager { @@ -96,7 +96,7 @@ public enum MovementManager {
if (!toMove.isMoving())
toMove.resetLastSetLocUpdate();
else
toMove.update(false);
toMove.update();
// Update movement for the player
@ -351,7 +351,7 @@ public enum MovementManager { @@ -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());
//Send run/walk/sit/stand to tell the client we are flying / landing etc
ac.update(false);
ac.update();
ac.stopMovement(ac.getLoc());
if (ac.isAlive())
MovementManager.sendRWSSMsg(ac);
@ -408,7 +408,7 @@ public enum MovementManager { @@ -408,7 +408,7 @@ public enum MovementManager {
if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None))
continue;
member.update(false);
member.update();
// All checks passed, let's move the player

4
src/engine/gameManager/NPCManager.java

@ -340,8 +340,8 @@ public enum NPCManager { @@ -340,8 +340,8 @@ public enum NPCManager {
else
buildingSlot = BuildingManager.getAvailableSlot(abstractCharacter.building);
//if (buildingSlot == -1)
//Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
if (buildingSlot == -1)
Logger.error("No available slot for NPC: " + abstractCharacter.getObjectUUID());
abstractCharacter.building.getHirelings().put(abstractCharacter, buildingSlot);

350
src/engine/gameManager/PowersManager.java

@ -163,14 +163,6 @@ public enum PowersManager { @@ -163,14 +163,6 @@ public enum PowersManager {
public static void usePower(final PerformActionMsg msg, ClientConnection origin,
boolean sendCastToSelf) {
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
if(!pc.isFlying() && powersBaseByToken.get(msg.getPowerUsedID()) != null && powersBaseByToken.get(msg.getPowerUsedID()).isSpell) //cant be sitting if flying
CombatManager.toggleSit(false,origin);
if(pc.isMoving())
pc.stopMovement(pc.getMovementLoc());
if (usePowerA(msg, origin, sendCastToSelf)) {
// Cast failed for some reason, reset timer
@ -179,10 +171,13 @@ public enum PowersManager { @@ -179,10 +171,13 @@ public enum PowersManager {
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);
// Send Fail to cast message
PlayerCharacter pc = SessionManager
.getPlayerCharacter(origin);
if (pc != null) {
sendPowerMsg(pc, 2, msg);
if (pc.isCasting()) {
pc.update(false);
pc.update();
}
pc.setIsCasting(false);
@ -210,41 +205,6 @@ public enum PowersManager { @@ -210,41 +205,6 @@ public enum PowersManager {
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) {
ChatManager.chatSayInfo(
@ -281,7 +241,6 @@ public enum PowersManager { @@ -281,7 +241,6 @@ public enum PowersManager {
// get power
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
if (pb == null) {
ChatManager.chatSayInfo(playerCharacter,
"This power is not implemented yet.");
@ -293,35 +252,6 @@ public enum PowersManager { @@ -293,35 +252,6 @@ public enum PowersManager {
// return false;
}
//check for movement buffs while flying
if(playerCharacter.isFlying()) {
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)
return true;
@ -349,14 +279,6 @@ public enum PowersManager { @@ -349,14 +279,6 @@ public enum PowersManager {
msg.setNumTrains(trains);
}
//double stack point values for some useless disc spells
switch(pb.token){
case 429420458: // BH eyes
case 429601664: // huntsman skin the beast
msg.setNumTrains(msg.getNumTrains() * 2);
break;
}
// can't go over total trains by player
if (playerCharacter.getPowers() != null && playerCharacter.getPowers().containsKey(msg.getPowerUsedID())) {
CharacterPower cp = playerCharacter.getPowers().get(msg.getPowerUsedID());
@ -448,20 +370,15 @@ public enum PowersManager { @@ -448,20 +370,15 @@ public enum PowersManager {
float range = pb.getRange();
// 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))
@ -570,6 +487,7 @@ public enum PowersManager { @@ -570,6 +487,7 @@ public enum PowersManager {
// Validity checks passed, move on to casting spell
//get caster's live counter
int casterLiveCounter = playerCharacter.getLiveCounter();
// run recycle job for when cast is available again, don't bother adding the timer for CSRs
if (time > 0) {
FinishRecycleTimeJob frtj = new FinishRecycleTimeJob(playerCharacter, msg);
@ -596,7 +514,7 @@ public enum PowersManager { @@ -596,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)
if (pb.isSpell() && !pb.isChant() && playerCharacter.isSit()) {
playerCharacter.update(false);
playerCharacter.update();
playerCharacter.setSit(false);
UpdateStateMsg updateStateMsg = new UpdateStateMsg(playerCharacter);
DispatchMessage.dispatchMsgToInterestArea(playerCharacter, updateStateMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
@ -604,12 +522,10 @@ public enum PowersManager { @@ -604,12 +522,10 @@ public enum PowersManager {
}
// update cast (use skill) fail condition
if(pb.token != 429396028 && pb.breaksForm) {
playerCharacter.cancelOnCast();
}
playerCharacter.cancelOnCast();
// update castSpell (use spell) fail condition if spell
if (pb.isSpell() && pb.breaksForm)
if (pb.isSpell())
playerCharacter.cancelOnSpell();
// get cast time in ms.
@ -619,12 +535,13 @@ public enum PowersManager { @@ -619,12 +535,13 @@ public enum PowersManager {
if (time > 100) {
playerCharacter.update(false);
playerCharacter.update();
playerCharacter.setIsCasting(true);
}
playerCharacter.setLastMovementState(playerCharacter.getMovementState());
// run timer job to end cast
if (time < 1) // run immediately
finishUsePower(copyMsg, playerCharacter, casterLiveCounter, targetLiveCounter);
@ -750,11 +667,10 @@ public enum PowersManager { @@ -750,11 +667,10 @@ public enum PowersManager {
// make person casting stand up if spell (unless they're casting a chant which does not make them stand up)
// update cast (use skill) fail condition
if(pb.breaksForm)
caster.cancelOnCast();
caster.cancelOnCast();
// update castSpell (use spell) fail condition if spell
if (pb.isSpell() && pb.breaksForm)
if (pb.isSpell())
caster.cancelOnSpell();
// get cast time in ms.
@ -790,17 +706,8 @@ public enum PowersManager { @@ -790,17 +706,8 @@ public enum PowersManager {
if (playerCharacter == null || msg == null)
return;
if(msg.getPowerUsedID() == 429005674){ //bard sprint
//use sprint instead of ballad of beregund the bold
//applyPower(playerCharacter,playerCharacter,playerCharacter.loc,429611355,msg.getNumTrains(),false);
msg.setPowerUsedID(429611355);
}
if(msg.getPowerUsedID() == 429494441) {//wildkins chase
playerCharacter.removeEffectBySource(EffectSourceType.Root,40,true);
playerCharacter.removeEffectBySource(EffectSourceType.Snare,40,true);
}
if (playerCharacter.isCasting()) {
playerCharacter.update(false);
playerCharacter.update();
playerCharacter.updateStamRegen(-100);
}
@ -902,16 +809,15 @@ public enum PowersManager { @@ -902,16 +809,15 @@ public enum PowersManager {
}
float range = pb.getRange() + speedRange;
if(pb.token != 429396028) {
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
if (verifyInvalidRange(playerCharacter, mainTarget, range)) {
sendPowerMsg(playerCharacter, 8, msg);
return;
}
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
// TODO send message that target is out of range
sendPowerMsg(playerCharacter, 8, msg);
return;
}
// (pc.getLoc().distance(target.getLoc()) > pb.getRange()) {
// TODO send message that target is out of range
}
@ -1327,7 +1233,7 @@ public enum PowersManager { @@ -1327,7 +1233,7 @@ public enum PowersManager {
PlayerCharacter target = SessionManager
.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
ChatManager.chatInfoError(pc,
@ -1431,16 +1337,6 @@ public enum PowersManager { @@ -1431,16 +1337,6 @@ public enum PowersManager {
else
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
FinishSummonsJob fsj = new FinishSummonsJob(source, pc);
@ -1566,17 +1462,8 @@ public enum PowersManager { @@ -1566,17 +1462,8 @@ public enum PowersManager {
}
// create list of characters
HashSet<AbstractCharacter> trackChars;
switch(msg.getPowerToken()){
case 431511776:
case 429578587:
case 429503360:
trackChars = getTrackList(playerCharacter);
break;
default:
trackChars = RangeBasedAwo.getTrackList(allTargets, playerCharacter, maxTargets);
break;
}
HashSet<AbstractCharacter> trackChars = RangeBasedAwo.getTrackList(
allTargets, playerCharacter, maxTargets);
TrackWindowMsg trackWindowMsg = new TrackWindowMsg(msg);
@ -1589,30 +1476,6 @@ public enum PowersManager { @@ -1589,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) {
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(token);
@ -2326,7 +2189,7 @@ public enum PowersManager { @@ -2326,7 +2189,7 @@ public enum PowersManager {
// set player is not casting for regens
if (pc.isCasting()) {
pc.update(false);
pc.update();
}
pc.setIsCasting(false);
@ -2378,26 +2241,28 @@ public enum PowersManager { @@ -2378,26 +2241,28 @@ public enum PowersManager {
defense = 0f;
// Get hit chance
//if (pc.getDebug(16)) {
// String smsg = "ATR: " + atr + ", Defense: " + defense;
// ChatManager.chatSystemInfo(pc, smsg);
//}
if (pc.getDebug(16)) {
String smsg = "ATR: " + atr + ", Defense: " + defense;
ChatManager.chatSystemInfo(pc, smsg);
}
//int chance;
int chance;
//if (atr > defense || defense == 0)
// chance = 94;
//else {
// float dif = atr / defense;
// if (dif <= 0.8f)
// chance = 4;
// else
// chance = ((int) (450 * (dif - 0.8f)) + 4);
//}
if (atr > defense || defense == 0)
chance = 94;
else {
float dif = atr / defense;
if (dif <= 0.8f)
chance = 4;
else
chance = ((int) (450 * (dif - 0.8f)) + 4);
}
// 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
if (awo instanceof AbstractCharacter) {
AbstractCharacter tarAc = (AbstractCharacter) awo;
@ -2697,9 +2562,7 @@ public enum PowersManager { @@ -2697,9 +2562,7 @@ public enum PowersManager {
}
public static void cancelOnStun(AbstractCharacter ac) {
if(ac.getObjectType().equals(GameObjectType.PlayerCharacter)){
//PlayerCharacter.GroundPlayer((PlayerCharacter)ac);
}
}
private static PowersBase getLastPower(AbstractCharacter ac) {
@ -2845,123 +2708,6 @@ public enum PowersManager { @@ -2845,123 +2708,6 @@ public enum PowersManager {
}
}
public static boolean breakForm(int token) {
switch (token) {
case 429505865:
case 429407561:
case 429492073:
case 429644123:
case 429393769:
case 429545819:
case 429426537:
case 429590377:
case 429508425:
case 429541193:
case 429573961:
case 427924330:
case 429402918:
case 429545688:
case 429005674:
case 429637823:
case 429590426:
case 428066972:
case 429441862:
case 431611756:
case 431578988:
case 429502506:
case 429398191:
case 429447384:
case 428892191:
case 431579167:
case 430977067:
case 429409100:
case 429441868:
case 429594877:
case 427908971:
case 683741153:
case 429770569:
case 429452379:
case 429605055:
case 429086971:
case 429443230:
case 429505400:
case 429492122:
case 429643992:
case 550062236:
case 429498252:
case 429611224:
case 429441834:
case 428918940:
case 429633739:
case 429633579:
case 429568043:
case 429048646:
case 428392639:
case 428425407:
case 429054168:
case 429021400:
case 428955864:
case 429119704:
case 428890328:
case 428923096:
case 429218008:
case 429086936:
case 428988632:
case 428688204:
case 429514603:
case 428924959:
case 429393818:
case 429720966:
case 428982463:
case 427933887:
case 429572287:
case 429501222:
case 430694431:
case 429436131:
case 430006124:
case 429611355:
case 428005600:
case 427935608:
case 428949695:
case 427988218:
case 429414616:
case 429496495:
case 429428796:
case 563795754:
case 428988217:
case 429432716:
case 428955899:
case 429393286:
case 550062220:
case 429495557:
case 429401278:
case 428377478:
case 429409094:
case 428191947:
case 429434474:
case 429403363:
case 429512920:
case 429419611:
case 429645676:
case 429602895:
case 429605071:
case 429592428:
case 429500010:
case 429406602:
case 429426586:
case 429633898:
case 550062212:
case 429994027:
case 430813227:
case 429928491:
case 430026795:
case 429517915:
case 431854842:
case 429767544:
return false;
}
return true;
}
}

34
src/engine/gameManager/SimulationManager.java

@ -10,7 +10,10 @@ package engine.gameManager; @@ -10,7 +10,10 @@ package engine.gameManager;
import engine.Enum;
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 java.sql.Connection;
@ -30,7 +33,7 @@ public enum SimulationManager { @@ -30,7 +33,7 @@ public enum SimulationManager {
SERVERHEARTBEAT;
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 FlIGHT_PULSE = 100;
public static Duration executionTime = Duration.ofNanos(1);
@ -113,18 +116,9 @@ public enum SimulationManager { @@ -113,18 +116,9 @@ public enum SimulationManager {
}
try {
if ((_cityPulseTime != 0) && (System.currentTimeMillis() > _cityPulseTime)) {
try {
pulseCities();
}catch(Exception e){
}
try {
ArenaManager.pulseArenas();
}catch(Exception e){
}
}
if ((_cityPulseTime != 0)
&& (System.currentTimeMillis() > _cityPulseTime))
pulseCities();
} catch (Exception e) {
Logger.error(
"Fatal error in City Pulse: DISABLED. Error Message : "
@ -160,7 +154,7 @@ public enum SimulationManager { @@ -160,7 +154,7 @@ public enum SimulationManager {
if (player == null)
continue;
player.update(false);
player.update();
}
_updatePulseTime = System.currentTimeMillis() + 500;
@ -209,12 +203,8 @@ public enum SimulationManager { @@ -209,12 +203,8 @@ public enum SimulationManager {
city = (City) cityObject;
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 { @@ -224,10 +214,6 @@ public enum SimulationManager {
private void pulseRunegates() {
for (Runegate runegate : Runegate._runegates.values()) {
for(Portal portal : runegate._portals)
if(!portal.isActive())
portal.activate(false);
runegate.collidePortals();
}

347
src/engine/gameManager/StrongholdManager.java

@ -1,347 +0,0 @@ @@ -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;
}
}
}
}

195
src/engine/gameManager/ZergManager.java

@ -1,195 +0,0 @@ @@ -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; @@ -19,12 +19,14 @@ import engine.objects.Building;
import engine.objects.City;
import engine.objects.Zone;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;
/*
* Class contains methods and structures which
@ -107,6 +109,20 @@ public enum ZoneManager { @@ -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
// for this cycle
@ -201,6 +217,63 @@ public enum ZoneManager { @@ -201,6 +217,63 @@ public enum ZoneManager {
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.
public static Vector3fImmutable worldToLocal(Vector3fImmutable worldVector,

2
src/engine/jobs/AbstractEffectJob.java

@ -117,7 +117,7 @@ public abstract class AbstractEffectJob extends AbstractScheduleJob { @@ -117,7 +117,7 @@ public abstract class AbstractEffectJob extends AbstractScheduleJob {
}
public void endEffect() {
if (this.eb == null || this.power == null)
if (this.eb == null)
return;
this.eb.endEffect(this.source, this.target, this.trains, this.power, this);
}

10
src/engine/jobs/FinishSummonsJob.java

@ -47,13 +47,13 @@ public class FinishSummonsJob extends AbstractScheduleJob { @@ -47,13 +47,13 @@ public class FinishSummonsJob extends AbstractScheduleJob {
return;
// 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);
// return;
//}
PowersManager.finishRecycleTime(428523680, this.source, false);
return;
}
if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) {
ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!");

14
src/engine/jobs/UpgradeBuildingJob.java

@ -1,9 +1,7 @@ @@ -1,9 +1,7 @@
package engine.jobs;
import engine.gameManager.ZoneManager;
import engine.job.AbstractScheduleJob;
import engine.objects.Building;
import engine.objects.City;
import org.pmw.tinylog.Logger;
/*
@ -43,18 +41,6 @@ public class UpgradeBuildingJob extends AbstractScheduleJob { @@ -43,18 +41,6 @@ public class UpgradeBuildingJob extends AbstractScheduleJob {
rankingBuilding.setRank(rankingBuilding.getRank() + 1);
if(rankingBuilding.getBlueprint().isWallPiece()){
City cityObject = ZoneManager.getCityAtLocation(rankingBuilding.loc);
if(cityObject.getTOL().getRank() == 8) {
if (rankingBuilding.getBlueprint() != null && rankingBuilding.getBlueprint().getBuildingGroup() != null && rankingBuilding.getBlueprint().isWallPiece()) {
float currentHealthRatio = rankingBuilding.getCurrentHitpoints() / rankingBuilding.healthMax;
float newMax = rankingBuilding.healthMax * 1.1f;
rankingBuilding.setMaxHitPoints(newMax);
rankingBuilding.setHealth(rankingBuilding.healthMax * currentHealthRatio);
}
}
}
// Reload the object

22
src/engine/loot/ItemTableEntry.java

@ -9,12 +9,10 @@ @@ -9,12 +9,10 @@
package engine.loot;
import engine.gameManager.LootManager;
import org.pmw.tinylog.Logger;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class ItemTableEntry {
public int minRoll;
@ -37,23 +35,11 @@ public class ItemTableEntry { @@ -37,23 +35,11 @@ public class ItemTableEntry {
List<ItemTableEntry> itemTableEntryList;
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){
id = itemTableEntryList.get(ThreadLocalRandom.current().nextInt(0, itemTableEntryList.size())).cacheID;
}
return id;
return itemTableEntry;
}
}

10
src/engine/loot/ModTableEntry.java

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

2
src/engine/math/Bounds.java

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

156
src/engine/mobileAI/MobAI.java

@ -9,6 +9,7 @@ @@ -9,6 +9,7 @@
package engine.mobileAI;
import engine.Enum;
import engine.Enum.DispatchChannel;
import engine.InterestManagement.WorldGrid;
import engine.gameManager.*;
import engine.math.Vector3f;
@ -18,7 +19,7 @@ import engine.mobileAI.utilities.CombatUtilities; @@ -18,7 +19,7 @@ import engine.mobileAI.utilities.CombatUtilities;
import engine.mobileAI.utilities.MovementUtilities;
import engine.net.DispatchMessage;
import engine.net.client.msg.PerformActionMsg;
import engine.net.client.msg.UpdateStateMsg;
import engine.net.client.msg.PowerProjectileMsg;
import engine.objects.*;
import engine.powers.ActionsBase;
import engine.powers.PowersBase;
@ -81,16 +82,6 @@ public class MobAI { @@ -81,16 +82,6 @@ public class MobAI {
mob.updateLocation();
if(mob.StrongholdGuardian || mob.StrongholdEpic){
// attempt to ground all players in attack range
for(int i : mob.playerAgroMap.keySet()){
PlayerCharacter tar = PlayerCharacter.getFromCache(i);
if(tar != null && tar.loc.distanceSquared(mob.loc) < 80){
PowersManager.applyPower(mob,tar,tar.loc, 111111,40,false);
}
}
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage());
}
@ -108,7 +99,7 @@ public class MobAI { @@ -108,7 +99,7 @@ public class MobAI {
if (mob.BehaviourType.callsForHelp)
MobCallForHelp(mob);
if (MovementUtilities.outOfAggroRange(mob, target)) {
if (!MovementUtilities.inRangeDropAggro(mob, target)) {
mob.setCombatTarget(null);
return;
}
@ -165,12 +156,9 @@ public class MobAI { @@ -165,12 +156,9 @@ public class MobAI {
try {
if(mob == null || target == null)
return;
if (target.getRank() == -1 || !target.isVulnerable() || BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
mob.setCombatTarget(null);
return;
return;
}
City playercity = ZoneManager.getCityAtLocation(mob.getLoc());
@ -178,7 +166,7 @@ public class MobAI { @@ -178,7 +166,7 @@ public class MobAI {
if (playercity != null)
for (Mob guard : playercity.getParent().zoneMobSet)
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);
if (mob.isSiege())
@ -207,11 +195,11 @@ public class MobAI { @@ -207,11 +195,11 @@ public class MobAI {
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
}
//if (mob.isSiege()) {
// PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target);
// ppm.setRange(50);
// DispatchMessage.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
//}
if (mob.isSiege()) {
PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target);
ppm.setRange(50);
DispatchMessage.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage());
@ -320,20 +308,20 @@ public class MobAI { @@ -320,20 +308,20 @@ public class MobAI {
if (mob == null)
return false;
if(mob.isPlayerGuard){
if(mob.isPlayerGuard == true){
int contractID = 0;
int contractID;
if(mob.BehaviourType.equals(Enum.MobBehaviourType.GuardMinion) && mob.npcOwner != null)
if(mob.BehaviourType.equals(Enum.MobBehaviourType.GuardMinion))
contractID = mob.npcOwner.contract.getContractID();
else if(mob.contract != null)
else
contractID = mob.contract.getContractID();
if(Enum.MinionType.ContractToMinionMap.containsKey(contractID) && !Enum.MinionType.ContractToMinionMap.get(contractID).isMage())
if(Enum.MinionType.ContractToMinionMap.get(contractID).isMage() == false)
return false;
}
if (mob.mobPowers == null || mob.mobPowers.isEmpty())
if (mob.mobPowers.isEmpty())
return false;
if (!mob.canSee((PlayerCharacter) mob.getCombatTarget())) {
@ -412,7 +400,7 @@ public class MobAI { @@ -412,7 +400,7 @@ public class MobAI {
PerformActionMsg msg;
if (!mob.StrongholdCommander && !mob.StrongholdEpic && (!mobPower.isHarmful() || mobPower.targetSelf)) {
if (!mobPower.isHarmful() || mobPower.targetSelf) {
PowersManager.useMobPower(mob, mob, mobPower, powerRank);
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
} else {
@ -600,9 +588,6 @@ public class MobAI { @@ -600,9 +588,6 @@ public class MobAI {
if (mob == null)
return;
if(mob.isAlive())
if(!mob.getMovementLoc().equals(Vector3fImmutable.ZERO))
mob.setLoc(mob.getMovementLoc());
if (mob.getTimestamps().containsKey("lastExecution") == false)
mob.getTimestamps().put("lastExecution", System.currentTimeMillis());
@ -640,6 +625,9 @@ public class MobAI { @@ -640,6 +625,9 @@ public class MobAI {
//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;
}
@ -658,7 +646,7 @@ public class MobAI { @@ -658,7 +646,7 @@ public class MobAI {
return;
}
if(mob.isPet() == false && mob.isPlayerGuard == false)
if (mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal())
CheckToSendMobHome(mob);
if (mob.getCombatTarget() != null) {
@ -869,31 +857,26 @@ public class MobAI { @@ -869,31 +857,26 @@ public class MobAI {
return;
}
//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 {
//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) {
aiAgent.despawn();
aiAgent.deathTime = System.currentTimeMillis();
return;
}
}
return;
}
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000))) {
if(Mob.discDroppers.contains(aiAgent))
return;
if(aiAgent.StrongholdGuardian || aiAgent.StrongholdEpic || aiAgent.StrongholdCommander)
return;
if (aiAgent.despawned && System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000L))) {
if (!Zone.respawnQue.contains(aiAgent)) {
if (Zone.respawnQue.contains(aiAgent) == false) {
Zone.respawnQue.add(aiAgent);
}
}
@ -913,10 +896,8 @@ public class MobAI { @@ -913,10 +896,8 @@ public class MobAI {
if (mob.getCombatTarget() == null)
return;
if(!mob.isCombat())
enterCombat(mob);
if (mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter) && MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) == false && mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal()) {
if (mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter) && MovementUtilities.outOfAggroRange(mob, (PlayerCharacter) mob.getCombatTarget()) && mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal()) {
mob.setCombatTarget(null);
return;
}
@ -930,21 +911,7 @@ public class MobAI { @@ -930,21 +911,7 @@ public class MobAI {
private static void CheckToSendMobHome(Mob mob) {
if(mob.isNecroPet())
return;
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.isPlayerGuard()) {
@ -955,6 +922,9 @@ public class MobAI { @@ -955,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) {
City current = ZoneManager.getCityAtLocation(mob.getLoc());
@ -975,7 +945,7 @@ public class MobAI { @@ -975,7 +945,7 @@ public class MobAI {
}
}
}
} else if (!MovementUtilities.inRangeOfBindLocation(mob)) {
} else if (MovementUtilities.inRangeOfBindLocation(mob) == false) {
PowersBase recall = PowersManager.getPowerByToken(-1994153779);
PowersManager.useMobPower(mob, mob, recall, 40);
@ -983,7 +953,6 @@ public class MobAI { @@ -983,7 +953,6 @@ public class MobAI {
for (Entry playerEntry : mob.playerAgroMap.entrySet())
PlayerCharacter.getFromCache((int) playerEntry.getKey()).setHateValue(0);
mob.setCombatTarget(null);
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage());
@ -1037,7 +1006,7 @@ public class MobAI { @@ -1037,7 +1006,7 @@ public class MobAI {
//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;
Mob aggroMob = (Mob) awoMob;
@ -1060,22 +1029,9 @@ public class MobAI { @@ -1060,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) {
try {
checkToDropGuardAggro(mob);
if (mob.getCombatTarget() == null)
CheckForPlayerGuardAggro(mob);
@ -1100,8 +1056,6 @@ public class MobAI { @@ -1100,8 +1056,6 @@ public class MobAI {
public static void GuardMinionLogic(Mob mob) {
try {
checkToDropGuardAggro(mob);
boolean isComanded = mob.npcOwner.isAlive();
if (!isComanded) {
GuardCaptainLogic(mob);
@ -1122,8 +1076,6 @@ public class MobAI { @@ -1122,8 +1076,6 @@ public class MobAI {
public static void GuardWallArcherLogic(Mob mob) {
try {
checkToDropGuardAggro(mob);
if (mob.getCombatTarget() == null)
CheckForPlayerGuardAggro(mob);
else
@ -1399,31 +1351,21 @@ public class MobAI { @@ -1399,31 +1351,21 @@ public class MobAI {
return null;
}
public static void RecoverHealth(Mob mob) {
public static void RecoverHealth(Mob mob){
//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.getHealth() < mob.getHealthMax()) {
if (mob.getTimestamps().containsKey("HEALTHRECOVERED") == false)
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None)) * 0.01f);
mob.setHealth(mob.getHealth() + recoveredHealth);
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
if (mob.getHealth() < mob.getHealthMax()) {
if (mob.getHealth() > mob.getHealthMax())
mob.setHealth(mob.getHealthMax());
}
} catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: RecoverHealth" + " " + e.getMessage());
}
}
float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None)) * 0.01f);
mob.setHealth(mob.getHealth() + recoveredHealth);
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
public static void enterCombat(Mob mob){
mob.setCombat(true);
UpdateStateMsg rwss = new UpdateStateMsg();
rwss.setPlayer(mob);
DispatchMessage.sendToAllInRange(mob, rwss);
if (mob.getHealth() > mob.getHealthMax())
mob.setHealth(mob.getHealthMax());
}
}
}

26
src/engine/mobileAI/Threads/MobAIThread.java

@ -28,26 +28,18 @@ public class MobAIThread implements Runnable{ @@ -28,26 +28,18 @@ public class MobAIThread implements Runnable{
AI_BASE_AGGRO_RANGE = (int)(60 * Float.parseFloat(ConfigManager.MB_AI_AGGRO_RANGE.getValue()));
while (true) {
for (Zone zone : ZoneManager.getAllZones()) {
if (zone != null && zone.zoneMobSet != null) {
synchronized (zone.zoneMobSet) {
for (Mob mob : zone.zoneMobSet) {
try {
if (mob != null) {
MobAI.DetermineAction(mob);
}
} catch (Exception e) {
Logger.error("Error processing Mob [Name: {}, UUID: {}]", mob.getName(), mob.getObjectUUID(), e);
}
}
for (Mob mob : zone.zoneMobSet) {
try {
if (mob != null)
MobAI.DetermineAction(mob);
} catch (Exception e) {
Logger.error("Mob: " + mob.getName() + " UUID: " + mob.getObjectUUID() + " ERROR: " + e);
e.printStackTrace();
}
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Logger.error("AI Thread interrupted", e);
Thread.currentThread().interrupt();
}
}
}
public static void startAIThread() {

50
src/engine/mobileAI/Threads/MobRespawnThread.java

@ -13,9 +13,6 @@ import engine.objects.Mob; @@ -13,9 +13,6 @@ import engine.objects.Mob;
import engine.objects.Zone;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
import java.util.Collection;
/**
* Thread blocks until MagicBane dispatch messages are
* enqueued then processes them in FIFO order. The collection
@ -28,48 +25,41 @@ import java.util.Collection; @@ -28,48 +25,41 @@ import java.util.Collection;
public class MobRespawnThread implements Runnable {
private volatile boolean running = true;
private static final long RESPAWN_INTERVAL = 100; // Configurable interval
public MobRespawnThread() {
Logger.info("MobRespawnThread initialized.");
Logger.info(" MobRespawnThread thread has started!");
}
@Override
public void run() {
while (running) {
while (true) {
try {
Collection<Zone> zones = ZoneManager.getAllZones();
if (zones != null) {
for (Zone zone : zones) {
synchronized (zone) { // Optional: Synchronize on zone
if (!zone.respawnQue.isEmpty() &&
zone.lastRespawn + RESPAWN_INTERVAL < System.currentTimeMillis()) {
for (Zone zone : ZoneManager.getAllZones()) {
if (zone.respawnQue.isEmpty() == false && zone.lastRespawn + 100 < System.currentTimeMillis()) {
Mob respawner = zone.respawnQue.iterator().next();
Mob respawner = zone.respawnQue.iterator().next();
if (respawner != null) {
respawner.respawn();
zone.respawnQue.remove(respawner);
zone.lastRespawn = System.currentTimeMillis();
}
}
}
if (respawner == null)
continue;
respawner.respawn();
zone.respawnQue.remove(respawner);
zone.lastRespawn = System.currentTimeMillis();
}
}
Thread.sleep(100); // Prevent busy-waiting
} catch (Exception e) {
Logger.error("Error in MobRespawnThread", e);
Logger.error(e);
}
}
Logger.info("MobRespawnThread stopped.");
}
public void stop() {
running = false;
}
}
public static void startRespawnThread() {
Thread respawnThread = new Thread(new MobRespawnThread());
Thread respawnThread;
respawnThread = new Thread(new MobRespawnThread());
respawnThread.setName("respawnThread");
respawnThread.start();
}

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

@ -139,26 +139,37 @@ public class CombatUtilities { @@ -139,26 +139,37 @@ public class CombatUtilities {
}
public static boolean triggerDefense(Mob agent, AbstractWorldObject target) {
int defense = 0;
int atr = agent.mobBase.getAtr();
if(agent.getBonuses() != null){
atr += agent.getBonuses().getFloat(ModType.OCV,SourceType.None);
atr *= 1 + agent.getBonuses().getFloatPercentAll(ModType.OCV,SourceType.None);
}
int defenseScore = 0;
int attackScore = agent.getAtrHandOne();
switch (target.getObjectType()) {
case PlayerCharacter:
defense = ((AbstractCharacter) target).getDefenseRating();
defenseScore = ((AbstractCharacter) target).getDefenseRating();
break;
case Mob:
Mob mob = (Mob) target;
if (mob.isSiege())
defense = atr;
defenseScore = attackScore;
break;
case Building:
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) {
@ -256,12 +267,12 @@ public class CombatUtilities { @@ -256,12 +267,12 @@ public class CombatUtilities {
if (agent.getEquip().get(1) != null && agent.getEquip().get(2) != null && agent.getEquip().get(2).getItemBase().isShield() == false) {
//mob is duel wielding and should conduct an attack for each hand
ItemBase weapon1 = agent.getEquip().get(1).getItemBase();
double range1 = getMaxDmg(agent) - getMinDmg(agent);
double damage1 = getMinDmg(agent) + ((ThreadLocalRandom.current().nextFloat() * range1) + (ThreadLocalRandom.current().nextFloat() * range1)) / 2;
double range1 = getMaxDmg(weapon1.getMinDamage(), agent, weapon1) - getMinDmg(weapon1.getMinDamage(), agent, weapon1);
double damage1 = getMinDmg(weapon1.getMinDamage(), agent, weapon1) + ((ThreadLocalRandom.current().nextFloat() * range1) + (ThreadLocalRandom.current().nextFloat() * range1)) / 2;
swingIsDamage(agent, target, (float) damage1, CombatManager.getSwingAnimation(weapon1, null, true));
ItemBase weapon2 = agent.getEquip().get(2).getItemBase();
double range2 = getMaxDmg(agent) - getMinDmg(agent);
double damage2 = getMinDmg(agent) + ((ThreadLocalRandom.current().nextFloat() * range2) + (ThreadLocalRandom.current().nextFloat() * range2)) / 2;
double range2 = getMaxDmg(weapon2.getMinDamage(), agent, weapon2) - getMinDmg(weapon2.getMinDamage(), agent, weapon2);
double damage2 = getMinDmg(weapon2.getMinDamage(), agent, weapon2) + ((ThreadLocalRandom.current().nextFloat() * range2) + (ThreadLocalRandom.current().nextFloat() * range2)) / 2;
swingIsDamage(agent, target, (float) damage2, CombatManager.getSwingAnimation(weapon1, null, false));
} else {
swingIsDamage(agent, target, determineDamage(agent), anim);
@ -311,9 +322,9 @@ public class CombatUtilities { @@ -311,9 +322,9 @@ public class CombatUtilities {
float damage = 0;
DamageType dt = getDamageType(agent);
if (agent.BehaviourType.equals(MobBehaviourType.Pet1)) {
damage = calculateMobDamage(agent);
} else if (agent.isPlayerGuard()) {
if ((agent.agentType.equals(AIAgentType.PET)) == true || agent.isPet() == true || agent.isNecroPet() == true) {
damage = calculatePetDamage(agent);
} else if (agent.isPlayerGuard() == true) {
//damage = calculateGuardDamage(agent);
damage = calculateMobDamage(agent);
} else if (agent.getLevel() > 80) {
@ -353,8 +364,8 @@ public class CombatUtilities { @@ -353,8 +364,8 @@ public class CombatUtilities {
float min = 40;
float max = 60;
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
double minDmg = getMinDmg(agent);
double maxDmg = getMaxDmg(agent);
double minDmg = getMinDmg(min, agent, null);
double maxDmg = getMaxDmg(max, agent, null);
dmgMultiplier += agent.getLevel() * 0.1f;
range = (float) (maxDmg - minDmg);
damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
@ -370,8 +381,8 @@ public class CombatUtilities { @@ -370,8 +381,8 @@ public class CombatUtilities {
double minDmg = weapon.getMinDamage();
double maxDmg = weapon.getMaxDamage();
double min = getMinDmg(agent);
double max = getMaxDmg(agent);
double min = getMinDmg(minDmg, agent, weapon);
double max = getMaxDmg(maxDmg, agent, weapon);
DamageType dt = weapon.getDamageType();
@ -412,48 +423,92 @@ public class CombatUtilities { @@ -412,48 +423,92 @@ public class CombatUtilities {
}
public static int calculateMobDamage(Mob agent) {
double minDmg = getMinDmg(agent);
double maxDmg = getMaxDmg(agent);
DamageType dt = getDamageType(agent);
ItemBase weapon = null;
double minDmg;
double maxDmg;
DamageType dt;
//main hand or offhand damage
if (agent.getEquip().get(1) != null)
weapon = agent.getEquip().get(1).getItemBase();
else if (agent.getEquip().get(2) != null)
weapon = agent.getEquip().get(2).getItemBase();
if (weapon != null) {
minDmg = getMinDmg(weapon.getMinDamage(), agent, weapon);
maxDmg = getMaxDmg(weapon.getMaxDamage(), agent, weapon);
dt = weapon.getDamageType();
} else {
minDmg = agent.getMobBase().getDamageMin();
maxDmg = agent.getMobBase().getDamageMax();
dt = DamageType.Crush;
}
AbstractWorldObject target = agent.getCombatTarget();
double damage = ThreadLocalRandom.current().nextInt((int)minDmg,(int)maxDmg + 1);
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
double range = maxDmg - minDmg;
double damage = minDmg + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
if (AbstractWorldObject.IsAbstractCharacter(target))
if (((AbstractCharacter) target).isSit())
damage *= 2.5f; //increase damage if sitting
if (AbstractWorldObject.IsAbstractCharacter(target))
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, (float) damage, 0));
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, (float) damage, 0) * dmgMultiplier);
return 0;
}
public static double getMinDmg(Mob agent) {
if(agent.getEquip() != null){
if(agent.getEquip().get(ItemSlotType.RHELD) != null){
return agent.minDamageHandOne;
}else if(agent.getEquip().get(ItemSlotType.LHELD) != null){
return agent.getMinDamageHandTwo();
}else{
return agent.minDamageHandOne;
public static double getMinDmg(double min, Mob agent, ItemBase weapon) {
int primary = agent.getStatStrCurrent();
int secondary = agent.getStatDexCurrent();
int focusLevel = 0;
int masteryLevel = 0;
if (weapon != null) {
if (weapon.isStrBased() == true) {
primary = agent.getStatStrCurrent();
secondary = agent.getStatDexCurrent();
} else {
primary = agent.getStatDexCurrent();
secondary = agent.getStatStrCurrent();
if (agent.getSkills().containsKey(weapon.getSkillRequired())) {
focusLevel = (int) agent.getSkills().get(weapon.getSkillRequired()).getModifiedAmount();
}
if (agent.getSkills().containsKey(weapon.getMastery())) {
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
}
}else{
return agent.minDamageHandOne;
}
}
return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel));
}
public static double getMaxDmg(Mob agent) {
if(agent.getEquip() != null){
if(agent.getEquip().get(ItemSlotType.RHELD) != null){
return agent.maxDamageHandOne;
}else if(agent.getEquip().get(ItemSlotType.LHELD) != null){
return agent.getMaxDamageHandTwo();
}else{
return agent.maxDamageHandOne;
}
}else{
return agent.maxDamageHandOne;
public static double getMaxDmg(double max, Mob agent, ItemBase weapon) {
int primary = agent.getStatStrCurrent();
int secondary = agent.getStatDexCurrent();
int focusLevel = 0;
int masteryLevel = 0;
if (weapon != null) {
if (weapon.isStrBased() == true) {
primary = agent.getStatStrCurrent();
secondary = agent.getStatDexCurrent();
} else {
primary = agent.getStatDexCurrent();
secondary = agent.getStatStrCurrent();
}
if (agent.getSkills().containsKey(weapon.getSkillRequired()))
focusLevel = (int) agent.getSkills().get(weapon.getSkillRequired()).getModifiedAmount();
if (agent.getSkills().containsKey(weapon.getSkillRequired()))
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount();
}
return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel));
}
}

12
src/engine/mobileAI/utilities/MovementUtilities.java

@ -98,24 +98,20 @@ public class MovementUtilities { @@ -98,24 +98,20 @@ public class MovementUtilities {
}
public static boolean outOfAggroRange(Mob agent, AbstractCharacter target) {
public static boolean inRangeDropAggro(Mob agent, AbstractCharacter target) {
Vector3fImmutable sl = agent.getLoc();
Vector3fImmutable tl = target.getLoc();
float disSq = sl.distanceSquared(tl);
float range = agent.getRange() + 150;
//float distanceSquaredToTarget = sl.distanceSquared2D(tl) - sqr(agent.calcHitBox() + target.calcHitBox()); //distance to center of target
float distanceSquaredToTarget = sl.distanceSquared2D(tl) - sqr(agent.calcHitBox() + target.calcHitBox()); //distance to center of target
float range = agent.getRange() + 150;
if (range > 200)
range = 200;
return disSq > (range * range);
return distanceSquaredToTarget < sqr(range);
}

8
src/engine/net/NetMsgFactory.java

@ -13,8 +13,6 @@ import engine.exception.FactoryBuildException; @@ -13,8 +13,6 @@ import engine.exception.FactoryBuildException;
import engine.gameManager.ChatManager;
import engine.net.client.ClientConnection;
import engine.net.client.Protocol;
import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.PlaceAssetMsg;
import engine.objects.PlayerCharacter;
import engine.server.MBServerStatics;
import org.joda.time.DateTime;
@ -96,9 +94,11 @@ public class NetMsgFactory { @@ -96,9 +94,11 @@ public class NetMsgFactory {
if (origin instanceof ClientConnection) {
PlayerCharacter player = ((ClientConnection) origin).getPlayerCharacter();
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);
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;

8
src/engine/net/client/ClientConnection.java

@ -227,10 +227,10 @@ public class ClientConnection extends AbstractConnection { @@ -227,10 +227,10 @@ public class ClientConnection extends AbstractConnection {
SessionManager.remSession(
SessionManager.getSession(sessionID));
} catch (NullPointerException e) {
//Logger
//.error(
//"Tried to remove improperly initialized session. Skipping." +
//e);
Logger
.error(
"Tried to remove improperly initialized session. Skipping." +
e);
}
}

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

@ -85,7 +85,7 @@ public class ClientMessagePump implements NetMsgHandler { @@ -85,7 +85,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (pc == null)
return;
pc.update(false);
pc.update();
if (msg.getSpeed() == 2)
pc.setWalkMode(false);
else
@ -114,7 +114,7 @@ public class ClientMessagePump implements NetMsgHandler { @@ -114,7 +114,7 @@ public class ClientMessagePump implements NetMsgHandler {
if (pc == null)
return;
pc.update(false);
pc.update();
pc.setSit(msg.toggleSitStand());
@ -560,30 +560,12 @@ public class ClientMessagePump implements NetMsgHandler { @@ -560,30 +560,12 @@ public class ClientMessagePump implements NetMsgHandler {
if (!itemManager.inventoryContains(i))
return;
//cannot delete gold
if(i.getItemBaseID() == 7)
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();
if (i.isCanDestroy())
if (itemManager.delete(i) == true) {
Dispatch dispatch = Dispatch.borrow(sourcePlayer, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
}
}
}
private static void ackBankWindowOpened(AckBankWindowOpenedMsg msg, ClientConnection origin) {
@ -672,8 +654,6 @@ public class ClientMessagePump implements NetMsgHandler { @@ -672,8 +654,6 @@ public class ClientMessagePump implements NetMsgHandler {
JobScheduler.getInstance().scheduleJob(new RefreshGroupJob(sourcePlayer), MBServerStatics.LOAD_OBJECT_DELAY);
}
private static void lootWindowRequest(LootWindowRequestMsg msg, ClientConnection origin) throws MsgSendException {
PlayerCharacter pc = SessionManager.getPlayerCharacter(origin);
@ -1263,8 +1243,6 @@ public class ClientMessagePump implements NetMsgHandler { @@ -1263,8 +1243,6 @@ public class ClientMessagePump implements NetMsgHandler {
cost = sell.getBaseValue();
if(sell.getItemBaseID() == 980066)
cost = 0;
//apply damaged value reduction
float durabilityCurrent = sell.getDurabilityCurrent();
@ -1369,8 +1347,6 @@ public class ClientMessagePump implements NetMsgHandler { @@ -1369,8 +1347,6 @@ public class ClientMessagePump implements NetMsgHandler {
return;
// test within talking range
if(npc.isInSafeZone())
npc.sellPercent = 0;
if (sourcePlayer.getLoc().distanceSquared2D(npc.getLoc()) > MBServerStatics.NPC_TALK_RANGE * MBServerStatics.NPC_TALK_RANGE) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 14);
@ -1382,192 +1358,219 @@ public class ClientMessagePump implements NetMsgHandler { @@ -1382,192 +1358,219 @@ public class ClientMessagePump implements NetMsgHandler {
}
private static void buyFromNPC(BuyFromNPCMsg msg, ClientConnection origin) {
PlayerCharacter sourcePlayer = SessionManager.getPlayerCharacter(origin);
if (sourcePlayer == null)
return;
if (origin.buyLock.tryLock()) {
try {
CharacterItemManager itemMan = sourcePlayer.getCharItemManager();
if (itemMan == null) {
if (itemMan == null)
return;
}
NPC npc = NPC.getFromCache(msg.getNPCID());
if (npc == null) {
if (npc == null)
return;
}
Item gold = itemMan.getGoldInventory();
if (gold == null) {
if (gold == null)
return;
}
Item buy = null;
if (msg.getItemType() == GameObjectType.MobEquipment.ordinal()) {
ArrayList<MobEquipment> sellInventory = npc.getContract().getSellInventory();
//if(npc.contract.getObjectUUID() == 890){ // default steward
// sellInventory = npc.getSellInventorySteward();
//}
//if(npc.contract.getObjectUUID() == 889){ // default builder
// sellInventory = npc.getSellInventoryBuilder();
//}
if (sellInventory == null) {
if (sellInventory == null)
return;
}
for (MobEquipment me : sellInventory) {
if (me.getObjectUUID() == msg.getItemID()) {
ItemBase ib = me.getItemBase();
if (ib == null) {
if (ib == null)
return;
}
//test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight())) {
if (!itemMan.hasRoomInventory(ib.getWeight()))
return;
}
int cost = me.getMagicValue();
float bargain = sourcePlayer.getBargain();
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())
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) {
//dont' have enough goldItem exit!
// chatMan.chatSystemInfo(pc, "" + "You dont have enough gold.");
return;
}
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
b = null;
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);
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.");
ChatManager.chatSystemError(sourcePlayer, "Failed To Buy Item");
return;
}
if(me.getItemBase().getType().equals(ItemType.RESOURCE) && npc.getContractID() == 900){
handleResourcePurchase(me,itemMan,sourcePlayer,ib);
}else {
buy = Item.createItemForPlayer(sourcePlayer, ib, me.fromNoob);
if (buy != null) {
me.transferEnchants(buy);
itemMan.addItemToInventory(buy);
if(npc.contractUUID == 900 && buy.getItemBaseID() == 1705032){
buy.setNumOfItems(10);
DbManager.ItemQueries.UPDATE_NUM_ITEMS(buy,buy.getNumOfItems());
}
//itemMan.updateInventory();
}
buy = Item.createItemForPlayer(sourcePlayer, ib);
if (buy != null) {
me.transferEnchants(buy);
itemMan.addItemToInventory(buy);
//itemMan.updateInventory();
}
}
}
} else if (msg.getItemType() == GameObjectType.Item.ordinal()) {
CharacterItemManager npcCim = npc.getCharItemManager();
if (npcCim == null)
return;
buy = Item.getFromCache(msg.getItemID());
if (buy == null)
return;
ItemBase ib = buy.getItemBase();
if (ib == null)
return;
if (!npcCim.inventoryContains(buy))
return;
//test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight()))
return;
//TODO test cost and subtract goldItem
//TODO CHnage this if we ever put NPc city npcs in buildings.
int cost = buy.getBaseValue();
if (buy.isID() || buy.isCustomValue())
cost = buy.getMagicValue();
float bargain = sourcePlayer.getBargain();
float profit = npc.getSellPercent(sourcePlayer) - bargain;
if (profit < 1)
profit = 1;
if (!buy.isCustomValue())
cost *= profit;
else
cost = buy.getValue();
if (gold.getNumOfItems() - cost < 0) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
return;
}
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null)
if (b.getProtectionState().equals(ProtectionState.NPC))
b = null;
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);
return;
}
if (!itemMan.buyFromNPC(b, cost, buildingDeposit)) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 110);
return;
}
if (buy != null)
itemMan.buyFromNPC(buy, npc);
} else if (msg.getItemType() == GameObjectType.MobLoot.ordinal()) {
CharacterItemManager npcCim = npc.getCharItemManager();
if (npcCim == null)
return;
buy = MobLoot.getFromCache(msg.getItemID());
if (buy == null)
return;
ItemBase ib = buy.getItemBase();
if (ib == null)
return;
if (!npcCim.inventoryContains(buy))
return;
//test room available for item
if (!itemMan.hasRoomInventory(ib.getWeight()))
return;
//TODO test cost and subtract goldItem
//TODO CHnage this if we ever put NPc city npcs in buildings.
int cost = buy.getMagicValue();
cost *= npc.getSellPercent(sourcePlayer);
if (gold.getNumOfItems() - cost < 0) {
ErrorPopupMsg.sendErrorPopup(sourcePlayer, 128); // Insufficient Gold
return;
}
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null && b.getProtectionState().equals(ProtectionState.NPC))
b = null;
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);
return;
}
if (!itemMan.buyFromNPC(b, cost, buildingDeposit))
return;
if (buy != null)
itemMan.buyFromNPC(buy, npc);
} else
return;
if (buy != null) {
msg.setItem(buy);
//send the buy message back to update player
// msg.setItemType(buy.getObjectType().ordinal());
@ -1576,43 +1579,14 @@ public class ClientMessagePump implements NetMsgHandler { @@ -1576,43 +1579,14 @@ public class ClientMessagePump implements NetMsgHandler {
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
itemMan.updateInventory();
}
} finally {
origin.buyLock.unlock();
}
} else {
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) {
@ -1672,21 +1646,14 @@ public class ClientMessagePump implements NetMsgHandler { @@ -1672,21 +1646,14 @@ public class ClientMessagePump implements NetMsgHandler {
max *= (1 + (durMod * 0.01f));
if (dur >= max || dur < 1) {
//redundancy message to clear item from window in client
if (!DbManager.ItemQueries.SET_DURABILITY(toRepair, dur))
return;
toRepair.setDurabilityCurrent(max);
msg.setupRepairAck(max - dur);
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);
return;
}
int pointsToRepair = max - dur;
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();
//TODO get cost to repair
int cost = (int) ((max - dur) * 80.1);
Building b = (!npc.isStatic()) ? npc.getBuilding() : null;
if (b != null)

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

@ -78,7 +78,7 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler { @@ -78,7 +78,7 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
return false;
}
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size() && building.getRank() != 8)
if (building.getBlueprint().getMaxSlots() == building.getHirelings().size())
return false;
Item contractItem = Item.getFromCache(msg.getContractItem());

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

@ -11,7 +11,6 @@ import engine.objects.GuildStatusController; @@ -11,7 +11,6 @@ import engine.objects.GuildStatusController;
import engine.objects.Mine;
import engine.objects.PlayerCharacter;
import engine.objects.Resource;
import org.pmw.tinylog.Logger;
/*
* @Author:
@ -36,28 +35,26 @@ public class ArcMineChangeProductionMsgHandler extends AbstractClientMsgHandler @@ -36,28 +35,26 @@ public class ArcMineChangeProductionMsgHandler extends AbstractClientMsgHandler
//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;
Mine mine = Mine.getMine(changeProductionMsg.getMineID());
if (mine == null) {
Logger.error("Player Character: " + playerCharacter.getName() + " Tried To Change Mine: " + changeProductionMsg.getMineID() + " and Mine was Null");
if (mine == null)
return true;
}
//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;
//make sure valid resource
Resource resource = Resource.resourceByHash.get(changeProductionMsg.getResourceHash());
if (resource == null) {
Logger.error("Player Character: " + playerCharacter.getName() + " Tried To Change Mine: " + changeProductionMsg.getMineID() + " and Resource was Null");
if (resource == null)
return true;
}
//update resource

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

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

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

@ -63,7 +63,7 @@ public class CityDataHandler extends AbstractClientMsgHandler { @@ -63,7 +63,7 @@ public class CityDataHandler extends AbstractClientMsgHandler {
// 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());
dispatch = Dispatch.borrow(playerCharacter, hotzoneChangeMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);

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

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

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

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

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

@ -61,7 +61,7 @@ public class HirelingServiceMsgHandler extends AbstractClientMsgHandler { @@ -61,7 +61,7 @@ public class HirelingServiceMsgHandler extends AbstractClientMsgHandler {
return true;
npc.setSpecialPrice(msg.repairCost);
npc.setRepairCost(msg.repairCost);
ManageNPCMsg outMsg = new ManageNPCMsg(npc);
Dispatch dispatch = Dispatch.borrow(player, msg);

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

@ -360,11 +360,6 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler { @@ -360,11 +360,6 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
targetItem.recycle(vendor);
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
outMsg = new ManageNPCMsg(vendor);

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

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

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

@ -17,7 +17,6 @@ import engine.powers.PowersBase; @@ -17,7 +17,6 @@ import engine.powers.PowersBase;
import engine.server.MBServerStatics;
import java.util.ArrayList;
import java.util.Objects;
/*
* @Author:
@ -106,7 +105,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler { @@ -106,7 +105,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
// 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
return;
}
@ -127,12 +126,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler { @@ -127,12 +126,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
realm = RealmMap.getRealmForCity(city);
if (!realm.getCanBeClaimed()) {
if (realm.getCanBeClaimed() == false) {
ErrorPopupMsg.sendErrorPopup(player, 180); // This territory cannot be ruled by anyone
return;
}
if (realm.isRuled()) {
if (realm.isRuled() == true) {
ErrorPopupMsg.sendErrorPopup(player, 178); // This territory is already claimed
return;
}
@ -143,12 +142,12 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler { @@ -143,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;
Shrine shrine;
if (!npc.getGuild().getNation().equals(player.getGuild().getNation()))
if (npc.getGuild() != player.getGuild())
return;
shrineBuilding = npc.getBuilding();
@ -156,7 +155,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler { @@ -156,7 +155,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
if (shrineBuilding == null)
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;
if (shrineBuilding.getRank() == -1)
@ -172,9 +171,11 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler { @@ -172,9 +171,11 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
return;
}
//already haz boon.
if (player.containsEffect(shrine.getShrineType().getPowerToken())) {
//remove old boon to apply new one, allows boon refreshing
player.effects.remove(PowersManager.getPowerByToken(shrine.getShrineType().getPowerToken()).name);
ErrorPopupMsg.sendErrorPopup(player, 199);
return;
}
if (!Shrine.canTakeFavor(player, shrine))
@ -190,31 +191,16 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler { @@ -190,31 +191,16 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
return;
}
int trains = 0;
switch(npc.getRank()){
case 1:
trains = 10;
break;
case 2:
trains = 15;
break;
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;
}
int rank = shrine.getRank();
//R8 trees always get atleast rank 2 boons. rank uses index, where 0 is first place, 1 is second, etc...
if (shrineBuilding.getCity() != null && shrineBuilding.getCity().getTOL() != null && shrineBuilding.getCity().getTOL().getRank() == 8)
if (rank != 0)
rank = 1;
int trains = 40 - (rank * 10);
if (trains < 0)
trains = 0;
//System.out.println(trains);
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.");
shrineBuilding.addEffectBit(1000000 << 2);
@ -274,85 +260,60 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler { @@ -274,85 +260,60 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
}
}
if (targetCity == null){
Mine mineTele = null;
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
if (targetCity == null)
return;
Guild toGuild = targetCity.getGuild();
//verify level required to teleport or repledge
if (toGuild != null)
if (isTeleport) {
if (player.getLevel() < toGuild.getTeleportMin() || player.getLevel() > toGuild.getTeleportMax())
return;
} else if (player.getLevel() < toGuild.getRepledgeMin() || player.getLevel() > toGuild.getRepledgeMax())
Guild toGuild = targetCity.getGuild();
if (toGuild != null)
if (isTeleport) {
if (player.getLevel() < toGuild.getTeleportMin() || player.getLevel() > toGuild.getTeleportMax())
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)
joinedGuild = GuildManager.joinGuild(player, targetCity.getGuild(), targetCity.getObjectUUID(), GuildHistoryType.JOIN);
if (!isTeleport)
joinedGuild = GuildManager.joinGuild(player, targetCity.getGuild(), targetCity.getObjectUUID(), GuildHistoryType.JOIN);
int time;
int time;
if (!isTeleport) //repledge
time = MBServerStatics.REPLEDGE_TIME_IN_SECONDS;
else
time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
if (!isTeleport) //repledge
time = MBServerStatics.REPLEDGE_TIME_IN_SECONDS;
else
time = MBServerStatics.TELEPORT_TIME_IN_SECONDS;
//resend message
msg.setTeleportTime(time);
//resend message
msg.setTeleportTime(time);
if ((!isTeleport && joinedGuild) || (isTeleport)) {
if ((!isTeleport && joinedGuild) || (isTeleport)) {
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
//teleport player to city
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
Vector3fImmutable teleportLoc;
//teleport player to city
if (targetCity.getTOL().getRank() == 8)
teleportLoc = targetCity.getTOL().getStuckLocation();
else
teleportLoc = Vector3fImmutable.getRandomPointOnCircle(targetCity.getTOL().getLoc(), MBServerStatics.TREE_TELEPORT_RADIUS);
Vector3fImmutable teleportLoc;
if (time > 0) {
//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();
}
if (targetCity.getTOL().getRank() == 8)
teleportLoc = targetCity.getTOL().getStuckLocation();
else
teleportLoc = Vector3fImmutable.getRandomPointOnCircle(targetCity.getTOL().getLoc(), MBServerStatics.TREE_TELEPORT_RADIUS);
if (time > 0) {
//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) {
@ -459,7 +420,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler { @@ -459,7 +420,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
if (isHermit(npc))
requestHermitBlessing(msg, origin, player, npc);
else
requestBoon(player, npc);
requestBoon(msg, origin, player, npc);
break;
case 15:
LeaderboardMessage lbm = new LeaderboardMessage();

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

@ -421,12 +421,31 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler { @@ -421,12 +421,31 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
itemMan.consume(item);
}
break;
//ANNIVERSERY GIFT
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);
break;
case 30: //water bucket
case 8: //potions, tears of saedron
case 5: //runes, petition, warrant, scrolls
if (uuid > 3000 && uuid < 3050) { //Discipline Runes
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
@ -443,12 +462,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler { @@ -443,12 +462,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
itemMan.consume(item);
}
break;
} else if (uuid > 252122 && uuid < 252137) { //blood runes
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
itemMan.consume(item);
}
break;
} else if (uuid > 252128 && uuid < 252128) { //mastery runes
} else if (uuid > 252122 && uuid < 252128) { //mastery runes
if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
itemMan.consume(item);
}
@ -514,6 +528,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler { @@ -514,6 +528,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
}
// Send piss bucket animation
VisualUpdateMessage vum = new VisualUpdateMessage(player, 16323);
vum.configure();
DispatchMessage.sendToAllInRange(player, vum);
@ -528,9 +543,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler { @@ -528,9 +543,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
if(!item.getItemBase().getType().equals(ItemType.POTION)) {
player.cancelOnSpell();
}
player.cancelOnSpell();
break;
default: //shouldn't be here, consume item
dispatch = Dispatch.borrow(player, msg);

9
src/engine/net/client/handlers/PlaceAssetMsgHandler.java

@ -1148,15 +1148,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler { @@ -1148,15 +1148,6 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
wallPiece.setProtectionState(ProtectionState.PROTECTED);
PlaceAssetMsg.sendPlaceAssetConfirmWall(origin, serverZone);
//walls in R8 city are immediately granted extra HP by 10%
if(cityObject.getTOL().getRank() == 8) {
if (wallPiece.getBlueprint() != null && wallPiece.getBlueprint().getBuildingGroup() != null && wallPiece.getBlueprint().isWallPiece()) {
float currentHealthRatio = wallPiece.getCurrentHitpoints() / wallPiece.healthMax;
float newMax = wallPiece.healthMax * 1.1f;
wallPiece.setMaxHitPoints(newMax);
wallPiece.setHealth(wallPiece.healthMax * currentHealthRatio);
}
}
}
// Deduct gold from character's inventory

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

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

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

@ -10,7 +10,6 @@ @@ -10,7 +10,6 @@
package engine.net.client.msg;
import engine.Enum;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.net.*;
import engine.net.client.ClientConnection;
@ -71,120 +70,62 @@ public class ApplyRuneMsg extends ClientNetMsg { @@ -71,120 +70,62 @@ public class ApplyRuneMsg extends ClientNetMsg {
}
public static boolean applyRune(int runeID, ClientConnection origin, PlayerCharacter playerCharacter) {
RuneBase rb = RuneBase.getRuneBase(runeID);
Dispatch dispatch;
if (playerCharacter == null || origin == null || rb == null) {
return false;
}
int raceID = playerCharacter.getRaceID();
//Check race is met
ConcurrentHashMap<Integer, Boolean> races = rb.getRace();
if(runeID != 3007 && runeID != 3014) {//bounty hunter and huntsman
if (races.size() > 0) {
boolean valid = false;
for (int validID : races.keySet()) {
if (validID == raceID) {
valid = true;
break;
}
}
if(runeID == 3040)
valid = true;
if(runeID == 3049)
if (races.size() > 0) {
int raceID = playerCharacter.getRaceID();
boolean valid = false;
for (int validID : races.keySet()) {
if (validID == raceID) {
valid = true;
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;
break;
}
}
//Check base class is met
ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass();
if (baseClasses.size() > 0) {
int baseClassID = playerCharacter.getBaseClassID();
boolean valid = false;
for (int validID : baseClasses.keySet()) {
if (validID == baseClassID) {
valid = true;
break;
}
}
if(runeID == 3040)
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"))
if (!valid) {
return false;
}
}
//Check base class is met
ConcurrentHashMap<Integer, Boolean> baseClasses = rb.getBaseClass();
if (baseClasses.size() > 0) {
int baseClassID = playerCharacter.getBaseClassID();
boolean valid = false;
for (int validID : baseClasses.keySet()) {
if (validID == baseClassID) {
valid = true;
if (!valid) {
return false;
break;
}
}
//Check promotion class is met
ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass();
if (promotionClasses.size() > 0) {
int promotionClassID = playerCharacter.getPromotionClassID();
int baseClassID = playerCharacter.getBaseClassID();
boolean valid = false;
for (int validID : promotionClasses.keySet()) {
if (validID == promotionClassID) {
valid = true;
break;
}
}
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)
if (!valid) {
return false;
}
}
//Check promotion class is met
ConcurrentHashMap<Integer, Boolean> promotionClasses = rb.getPromotionClass();
if (promotionClasses.size() > 0) {
int promotionClassID = playerCharacter.getPromotionClassID();
boolean valid = false;
for (int validID : promotionClasses.keySet()) {
if (validID == promotionClassID) {
valid = true;
if (!valid) {
return false;
break;
}
}
} else{
if(playerCharacter.getPromotionClassID() == 2519){//priest
if (!valid) {
return false;
}
}
//Check disciplines are met
ArrayList<CharacterRune> runes = playerCharacter.getRunes();
ConcurrentHashMap<Integer, Boolean> disciplines = rb.getDiscipline();
@ -198,11 +139,12 @@ public class ApplyRuneMsg extends ClientNetMsg { @@ -198,11 +139,12 @@ public class ApplyRuneMsg extends ClientNetMsg {
}
}
}
int discCount = 0;
for (CharacterRune cr : runes) {
int runeBaseID = cr.getRuneBaseID();
//count number of discipline runes
if(isDiscipline(runeBaseID)){
if (runeBaseID > 3000 && runeBaseID < 3049) {
discCount++;
}
//see if rune is already applied
@ -210,35 +152,28 @@ public class ApplyRuneMsg extends ClientNetMsg { @@ -210,35 +152,28 @@ public class ApplyRuneMsg extends ClientNetMsg {
return false;
}
}
//Check level is met
if (playerCharacter.getLevel() < rb.getLevelRequired()) {
return false;
}
int strTotal = 0;
int dexTotal = 0;
int conTotal = 0;
int intTotal = 0;
int spiTotal = 0;
int cost = 0;
//Check any attributes are met
ArrayList<RuneBaseAttribute> attrs = rb.getAttrs();
if (rb.getAttrs() != null)
for (RuneBaseAttribute rba : attrs) {
int attrID = rba.getAttributeID();
int mod = rba.getModValue();
switch (attrID) {
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()) {
return false;
}
@ -291,70 +226,25 @@ public class ApplyRuneMsg extends ClientNetMsg { @@ -291,70 +226,25 @@ public class ApplyRuneMsg extends ClientNetMsg {
break;
}
}
//Check if max number runes already reached
if (runes.size() > 12) {
ChatManager.chatSystemInfo(playerCharacter,"You Have Too Many Runes Applied");
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
int discAllowed = 0;
if (isDiscipline(runeID)) {
switch(playerCharacter.getRank()){
case 1:
discAllowed = 0;
break;
case 2:
case 3:
case 4:
case 5:
case 6:
discAllowed = 3;
break;
case 7:
discAllowed = 4;
break;
case 8:
discAllowed = 5;
break;
if (playerCharacter.getLevel() < 70) {
if (discCount > 2) {
return false;
}
} else {
if (discCount > 3) {
return false;
}
}
if(discCount >= discAllowed)
return false;
}
//Everything succeeded. Let's apply the rune
//Attempt add rune to database
CharacterRune runeWithoutID = new CharacterRune(rb, playerCharacter.getObjectUUID());
@ -368,6 +258,7 @@ public class ApplyRuneMsg extends ClientNetMsg { @@ -368,6 +258,7 @@ public class ApplyRuneMsg extends ClientNetMsg {
if (cr == null) {
return false;
}
//remove any overridden runes from player
ArrayList<Integer> overwrite = rb.getOverwrite();
CharacterRune toRemove = null;
@ -376,10 +267,13 @@ public class ApplyRuneMsg extends ClientNetMsg { @@ -376,10 +267,13 @@ public class ApplyRuneMsg extends ClientNetMsg {
toRemove = playerCharacter.removeRune(overwriteID);
}
}
//add rune to player
playerCharacter.addRune(cr);
// recalculate all bonuses/formulas/skills/powers
playerCharacter.recalculate();
//if overwriting a stat rune, add any amount granted from previous rune.
if (toRemove != null) {
RuneBase rbs = toRemove.getRuneBase();
@ -405,35 +299,30 @@ public class ApplyRuneMsg extends ClientNetMsg { @@ -405,35 +299,30 @@ public class ApplyRuneMsg extends ClientNetMsg {
if (dif > 0 && spiTotal < (int) playerCharacter.statSpiMax) {
playerCharacter.addSpi(dif);
}
// recalculate all bonuses/formulas/skills/powers
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) {
ModifyStatMsg msm = new ModifyStatMsg((0 - cost), 0, 3);
dispatch = Dispatch.borrow(playerCharacter, msm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
//send apply rune message to client
ApplyRuneMsg arm = new ApplyRuneMsg(playerCharacter.getObjectType().ordinal(), playerCharacter.getObjectUUID(), runeID, cr.getObjectType().ordinal(), cr.getObjectUUID(), false);
dispatch = Dispatch.borrow(playerCharacter, arm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
//alert them of success
ErrorPopupMsg.sendErrorPopup(playerCharacter, 160);
//reapply bonuses
playerCharacter.applyBonuses();
return true;
}

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

@ -112,12 +112,6 @@ public class BuyFromNPCWindowMsg extends ClientNetMsg { @@ -112,12 +112,6 @@ public class BuyFromNPCWindowMsg extends ClientNetMsg {
if (contract != null)
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)

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

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

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

@ -275,7 +275,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg { @@ -275,7 +275,7 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
writer.putString(npcHire.getName());
writer.putInt(1);
writer.putInt(0);
writer.putInt(Blueprint.getNpcMaintCost(npcHire.getRank()));
if (npcHire.getObjectType() == GameObjectType.NPC)
writer.putInt(((NPC) npcHire).getContract().getIconID()); // Was 60
else if (npcHire.getObjectType() == GameObjectType.Mob) {
@ -392,9 +392,9 @@ public class ManageCityAssetsMsg extends ClientNetMsg { @@ -392,9 +392,9 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
writer.putInt(bane.getSiegePhase().ordinal()); //1 challenge //2 standoff //3 war
writer.put((byte) 0);
//if (!bane.isAccepted() && this.assetManager.getGuild() == banedCity.getGuild() && GuildStatusController.isInnerCouncil(this.assetManager.getGuildStatus()))
// writer.put((byte) 1); //canSetTime
//else
if (!bane.isAccepted() && this.assetManager.getGuild() == banedCity.getGuild() && GuildStatusController.isInnerCouncil(this.assetManager.getGuildStatus()))
writer.put((byte) 1); //canSetTime
else
writer.put((byte) 0);
DateTime placedOn = bane.getLiveDate();
@ -485,19 +485,36 @@ public class ManageCityAssetsMsg extends ClientNetMsg { @@ -485,19 +485,36 @@ public class ManageCityAssetsMsg extends ClientNetMsg {
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
if (building.getBlueprint() == null)
writer.putInt(0);
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;
if (maintDate == null)
maintDate = LocalDateTime.now();
writer.putLocalDateTime(maintDate); // current time
writer.putLocalDateTime(LocalDateTime.now()); // current time
// utc offset?
writer.putInt((int) java.time.Duration.between(LocalDateTime.now(), maintDate).getSeconds()); // Seconds to maint date

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

@ -503,7 +503,7 @@ public class ManageNPCMsg extends ClientNetMsg { @@ -503,7 +503,7 @@ public class ManageNPCMsg extends ClientNetMsg {
writer.putInt(0);
writer.putString("Repair items");
writer.putString("percent");
writer.putInt(npc.getSpecialPrice()); //cost for repair
writer.putInt(npc.getRepairCost()); //cost for repair
writer.putInt(0);
ArrayList<Integer> modPrefixList = npc.getModTypeTable();

52
src/engine/net/client/msg/ServerInfoMsg.java

@ -11,7 +11,6 @@ package engine.net.client.msg; @@ -11,7 +11,6 @@ package engine.net.client.msg;
import engine.gameManager.ConfigManager;
import engine.gameManager.DbManager;
import engine.net.AbstractConnection;
import engine.net.ByteBufferReader;
import engine.net.ByteBufferWriter;
@ -54,45 +53,18 @@ public class ServerInfoMsg extends ClientNetMsg { @@ -54,45 +53,18 @@ public class ServerInfoMsg extends ClientNetMsg {
writer.putInt(WorldServer.worldMapID);
writer.putString(ConfigManager.MB_WORLD_NAME.getValue());
int TotalTrees = 21;
int currentR8Trees = DbManager.CityQueries.GET_CAPITAL_CITY_COUNT();
switch(currentR8Trees){
case 0:
case 1:
case 2:
case 3:
case 4:
writer.putInt(0); //Land Rush
break;
case 5:
case 6:
case 7:
case 8:
writer.putInt(1); //Low pop
break;
case 9:
case 10:
case 11:
case 12:
writer.putInt(2); //Normal pop
break;
case 13:
case 14:
case 15:
case 16:
writer.putInt(3); //High Pop
break;
case 17:
case 18:
case 19:
case 20:
writer.putInt(4); //Very overpopulated pop
break;
default:
writer.putInt(5); //Full pop
break;
}
if (LoginServer.population < MBServerStatics.LOW_POPULATION)
writer.putInt(0); //Land Rush
else if (LoginServer.population < MBServerStatics.NORMAL_POPULATION)
writer.putInt(1); //Low pop
else if (LoginServer.population < MBServerStatics.HIGH_POPULATION)
writer.putInt(2); //Normal pop
else if (LoginServer.population < MBServerStatics.VERY_OVERPOPULATED_POPULATION)
writer.putInt(3); //High Pop
else if (LoginServer.population < MBServerStatics.FULL_POPULATION)
writer.putInt(4); //Very overpopulated pop
else
writer.putInt(5); //Full pop
}
/**

22
src/engine/net/client/msg/TeleportRepledgeListMsg.java

@ -16,9 +16,7 @@ import engine.net.ByteBufferReader; @@ -16,9 +16,7 @@ import engine.net.ByteBufferReader;
import engine.net.ByteBufferWriter;
import engine.net.client.Protocol;
import engine.objects.City;
import engine.objects.Mine;
import engine.objects.PlayerCharacter;
import org.pmw.tinylog.Logger;
import java.util.ArrayList;
@ -26,7 +24,6 @@ import java.util.ArrayList; @@ -26,7 +24,6 @@ import java.util.ArrayList;
public class TeleportRepledgeListMsg extends ClientNetMsg {
ArrayList<City> cities;
ArrayList<Mine> mines;
private PlayerCharacter player;
private boolean isTeleport;
@ -80,19 +77,10 @@ public class TeleportRepledgeListMsg extends ClientNetMsg { @@ -80,19 +77,10 @@ public class TeleportRepledgeListMsg extends ClientNetMsg {
public void configure() {
if (isTeleport) {
if (isTeleport)
cities = City.getCitiesToTeleportTo(player);
try {
mines = Mine.getMinesToTeleportTo(player);
if(mines == null)
mines = new ArrayList<>();
}catch(Exception e){
Logger.error("Unable To Load Mines For Teleport: " + e.getMessage());
}
}else {
else
cities = City.getCitiesToRepledgeTo(player);
mines = new ArrayList<>();
}
}
/**
@ -108,14 +96,10 @@ public class TeleportRepledgeListMsg extends ClientNetMsg { @@ -108,14 +96,10 @@ public class TeleportRepledgeListMsg extends ClientNetMsg {
for (int i = 0; i < 3; i++)
writer.putInt(0);
writer.putInt(cities.size() + mines.size());
writer.putInt(cities.size());
for (City city : cities)
City.serializeForClientMsg(city, writer);
for(Mine mine : mines)
Mine.serializeForClientMsgTeleport(mine, writer);
}
public PlayerCharacter getPlayer() {

94
src/engine/net/client/msg/VendorDialogMsg.java

@ -114,36 +114,26 @@ public class VendorDialogMsg extends ClientNetMsg { @@ -114,36 +114,26 @@ public class VendorDialogMsg extends ClientNetMsg {
VendorDialog vd = null;
Contract contract = npc.getContract();
if(npc.contractUUID == 1502043){
vd = Contract.HandleArenaMaster(msg.unknown03,npc,playerCharacter);
msg.updateMessage(3, vd);
}else if(npc.contractUUID == 1502040){ //enrollment officer
//PlayerCharacter.unboxPlayer(playerCharacter);
vd = Contract.HandleEnrollmentOfficer(msg.unknown03,npc,playerCharacter);
msg.updateMessage(3, vd);
}else if(contract.getContractID() == 1502042){
vd = Contract.HandleBaneCommanderOptions(msg.unknown03, npc, playerCharacter);
msg.updateMessage(3, vd);
}else {
if (contract == null)
if (contract == null)
vd = VendorDialog.getHostileVendorDialog();
else if (npc.getBuilding() != null) {
if (BuildingManager.IsPlayerHostile(npc.getBuilding(), playerCharacter))
vd = VendorDialog.getHostileVendorDialog();
else if (npc.getBuilding() != null) {
if (npc.getBuilding() != null && BuildingManager.IsPlayerHostile(npc.getBuilding(), playerCharacter))
vd = VendorDialog.getHostileVendorDialog();
else
vd = contract.getVendorDialog();
} else
else
vd = contract.getVendorDialog();
if (vd == null)
vd = VendorDialog.getHostileVendorDialog();
} else
vd = contract.getVendorDialog();
if (vd == null)
vd = VendorDialog.getHostileVendorDialog();
if (msg.messageType == 1 || msg.unknown03 == vd.getObjectUUID()) {
msg.updateMessage(3, vd);
} else {
if (VendorDialogMsg.handleSpecialCase(msg, npc, playerCharacter, vd, origin))
return;
}
//vd = VendorDialog.getVendorDialog(msg.unknown03);
vd = VendorDialog.getVendorDialog(msg.unknown03);
msg.updateMessage(3, vd);
}
@ -558,59 +548,26 @@ public class VendorDialogMsg extends ClientNetMsg { @@ -558,59 +548,26 @@ public class VendorDialogMsg extends ClientNetMsg {
// verify race valid for profession
Race race = pc.getRace();
if(race.getRaceRuneID() == 1999) {
boolean valid = false;
switch(promoID){
case 2504:
case 2505:
case 2506:
case 2507:
case 2510:
case 2511:
case 2512:
case 2514:
case 2515:
case 2517:
case 2518:
case 2519:
case 2520:
case 2521:
case 2523:
valid = true;
break;
}
if(!valid)
if (race == null || !promo.isAllowedRune(race.getToken())) {
// TODO send client promotion error
return;
}
else {
if (race == null || !promo.isAllowedRune(race.getToken())) {
// TODO send client promotion error
return;
}
}
// verify baseclass valid for profession
BaseClass bc = pc.getBaseClass();
if (bc == null) {
if (bc == null || !promo.isAllowedRune(bc.getToken())) {
// TODO send client promotion error
return;
}
if(!promo.isAllowedRune(bc.getToken())){
if(!bc.getName().equals("Rogue") && !promo.getName().equals("Druid"))
return;
}
if(race.getRaceRuneID() != 1999) {
// verify gender
if (promoID == 2511 && pc.isMale()) // Fury
return;
if (promoID == 2512 && pc.isMale()) // Huntress
return;
if (promoID == 2517 && !pc.isMale()) // Warlock
return;
}
// verify gender
if (promoID == 2511 && pc.isMale()) // Fury
return;
if (promoID == 2512 && pc.isMale()) // Huntress
return;
if (promoID == 2517 && !pc.isMale()) // Warlock
return;
// Everything valid. Let's promote
pc.setPromotionClass(promo.getObjectUUID());
@ -631,11 +588,6 @@ public class VendorDialogMsg extends ClientNetMsg { @@ -631,11 +588,6 @@ public class VendorDialogMsg extends ClientNetMsg {
.getObjectUUID(), true);
DispatchMessage.dispatchMsgToInterestArea(pc, arm, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
if(pc.getCharItemManager() != null && pc.getCharItemManager().getGoldInventory() != null && pc.getCharItemManager().getGoldInventory().getNumOfItems() < 1000) {
pc.getCharItemManager().addGoldToInventory(1000, false);
pc.getCharItemManager().addItemToInventory(new MobLoot(pc, ItemBase.getItemBase(980066), 1, false).promoteToItem(pc));
pc.getCharItemManager().updateInventory();
}
}

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

@ -63,9 +63,6 @@ public class WhoResponseMsg extends ClientNetMsg { @@ -63,9 +63,6 @@ public class WhoResponseMsg extends ClientNetMsg {
public static void HandleResponse(int set, int filterType, String filter, ClientConnection origin) {
if (filter.equals("")) {
filter = "Saetor";
}
WhoResponseMsg msg = new WhoResponseMsg();
WhoResponseMsg.setWorldPop(SessionManager.getAllActivePlayerCharacters().size());

85
src/engine/objects/AbstractCharacter.java

@ -14,7 +14,10 @@ import engine.Enum.*; @@ -14,7 +14,10 @@ import engine.Enum.*;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.WorldGrid;
import engine.exception.SerializationException;
import engine.gameManager.*;
import engine.gameManager.CombatManager;
import engine.gameManager.ConfigManager;
import engine.gameManager.MovementManager;
import engine.gameManager.PowersManager;
import engine.job.AbstractJob;
import engine.job.JobContainer;
import engine.job.JobScheduler;
@ -88,17 +91,17 @@ public abstract class AbstractCharacter extends AbstractWorldObject { @@ -88,17 +91,17 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
protected Resists resists = new Resists("Genric");
protected ConcurrentHashMap<String, JobContainer> timers;
protected ConcurrentHashMap<String, Long> timestamps;
public int atrHandOne;
protected int atrHandOne;
protected int atrHandTwo;
public int minDamageHandOne;
public int maxDamageHandOne;
protected int minDamageHandOne;
protected int maxDamageHandOne;
protected int minDamageHandTwo;
protected int maxDamageHandTwo;
protected float rangeHandOne;
protected float rangeHandTwo;
protected float speedHandOne;
protected float speedHandTwo;
public int defenseRating;
protected int defenseRating;
protected boolean isActive; // <-Do not use this for deleting character!
protected float altitude = 0; // 0=on terrain, 1=tier 1, 2=tier 2, etc.
protected ConcurrentHashMap<Integer, JobContainer> recycleTimers;
@ -493,12 +496,8 @@ public abstract class AbstractCharacter extends AbstractWorldObject { @@ -493,12 +496,8 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
boolean canFly = false;
PlayerBonuses bonus = flyer.getBonuses();
if (bonus != null && !bonus.getBool(ModType.NoMod, SourceType.Fly) && bonus.getBool(ModType.Fly, SourceType.None) && flyer.isAlive()) {
if (bonus != null && !bonus.getBool(ModType.NoMod, SourceType.Fly) && bonus.getBool(ModType.Fly, SourceType.None) && flyer.isAlive())
canFly = true;
}
if(flyer.effects.containsKey("MoveBuff")){
canFly = false;
}
return canFly;
@ -760,11 +759,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject { @@ -760,11 +759,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
public abstract Vector3fImmutable getBindLoc();
public final void setBindLoc(final Vector3fImmutable value) {
if(this.getObjectType().equals(GameObjectType.PlayerCharacter) && this.guild.getNation().equals(Guild.getErrantGuild())){
this.bindLoc = Vector3fImmutable.getRandomPointOnCircle(BuildingManager.getBuilding(27977).loc,20f);
}else {
this.bindLoc = value;
}
this.bindLoc = value;
}
public final Vector3fImmutable getFaceDir() {
@ -1101,7 +1096,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject { @@ -1101,7 +1096,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
}
public final void setCombatTarget(final AbstractWorldObject value) {
if (this.getObjectTypeMask() == 2050) {//MOB?
if(this.getObjectTypeMask() == 2050) {//MOB?
if (value == null) {
if (this.isCombat()) {
this.setCombat(false);
@ -1109,6 +1104,13 @@ public abstract class AbstractCharacter extends AbstractWorldObject { @@ -1109,6 +1104,13 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
rwss.setPlayer(this);
DispatchMessage.sendToAllInRange(this, rwss);
}
}else {
if (!this.isCombat()) {
this.setCombat(true);
UpdateStateMsg rwss = new UpdateStateMsg();
rwss.setPlayer(this);
DispatchMessage.sendToAllInRange(this, rwss);
}
}
}
this.combatTarget = value;
@ -1185,15 +1187,10 @@ public abstract class AbstractCharacter extends AbstractWorldObject { @@ -1185,15 +1187,10 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
}
}
public final float modifyHealth(float value, final AbstractCharacter attacker, final boolean fromCost) {
if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
value *= ((PlayerCharacter)attacker).ZergMultiplier;
} // Health modifications are modified by the ZergMechanic
if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
value *= ((Mob)attacker).getOwner().ZergMultiplier;
}// Health modifications from pets are modified by the owner's ZergMechanic
public final float modifyHealth(
final float value,
final AbstractCharacter attacker,
final boolean fromCost) {
try {
@ -1257,19 +1254,11 @@ public abstract class AbstractCharacter extends AbstractWorldObject { @@ -1257,19 +1254,11 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
}
public final float modifyMana(
float value,
final float value,
final AbstractCharacter attacker,
final boolean fromCost
) {
if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
value *= ((PlayerCharacter)attacker).ZergMultiplier;
} // Health modifications are modified by the ZergMechanic
if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
value *= ((Mob)attacker).getOwner().ZergMultiplier;
}// Health modifications from pets are modified by the owner's ZergMechanic
if (!this.isAlive()) {
return 0f;
}
@ -1304,19 +1293,11 @@ public abstract class AbstractCharacter extends AbstractWorldObject { @@ -1304,19 +1293,11 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
}
public final float modifyStamina(
float value,
final float value,
final AbstractCharacter attacker,
final boolean fromCost
) {
if(attacker != null && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)){
value *= ((PlayerCharacter)attacker).ZergMultiplier;
} // Health modifications are modified by the ZergMechanic
if(attacker != null && attacker.getObjectType().equals(GameObjectType.Mob) && ((Mob)attacker).getOwner() != null){
value *= ((Mob)attacker).getOwner().ZergMultiplier;
}// Health modifications from pets are modified by the owner's ZergMechanic
if (!this.isAlive()) {
return 0f;
}
@ -1551,15 +1532,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject { @@ -1551,15 +1532,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
Effect eff = this.effects.get(s);
if (eff == null)
continue;
Boolean override = false;
if(this.getObjectType().equals(GameObjectType.PlayerCharacter)) {
PlayerCharacter pc = (PlayerCharacter) this;
if (eff.getEffectsBase().getIDString().equals("INVIS-B") && s.equals("Invisible") && pc.getRace().getName().contains("Shade"))
override = true;
}
if (!override && eff.cancelOnMove() && eff.cancel()) {
if (eff.cancelOnMove() && eff.cancel()) {
//System.out.println("canceling on Move");
eff.cancelJob();
this.effects.remove(s);
@ -1841,7 +1814,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject { @@ -1841,7 +1814,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
}
//updates
public void update(Boolean newSystem) {
public void update() {
}
public void updateRegen() {
@ -1861,16 +1834,16 @@ public abstract class AbstractCharacter extends AbstractWorldObject { @@ -1861,16 +1834,16 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
try {
switch (updateType) {
case ALL:
update(false);
update();
break;
case REGEN:
updateRegen();
break;
case LOCATION:
update(false);
update();
break;
case MOVEMENTSTATE:
update(false);
update();
break;
case FLIGHT:
updateFlight();

6
src/engine/objects/AbstractWorldObject.java

@ -270,7 +270,7 @@ public abstract class AbstractWorldObject extends AbstractGameObject { @@ -270,7 +270,7 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
this.effects.remove(name);
if (this.getObjectType().equals(GameObjectType.PlayerCharacter))
if (name.equals("Flight")) {
((PlayerCharacter) this).update(false);
((PlayerCharacter) this).update();
PlayerCharacter.GroundPlayer((PlayerCharacter) this);
}
}
@ -385,7 +385,7 @@ public abstract class AbstractWorldObject extends AbstractGameObject { @@ -385,7 +385,7 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
if (source.equals("Flight")) {
//ground player
if (this.getObjectType().equals(GameObjectType.PlayerCharacter)) {
((PlayerCharacter) this).update(false);
((PlayerCharacter) this).update();
PlayerCharacter.GroundPlayer((PlayerCharacter) this);
}
}
@ -414,7 +414,7 @@ public abstract class AbstractWorldObject extends AbstractGameObject { @@ -414,7 +414,7 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
if (source.equals("Flight")) {
//ground player
if (this.getObjectType().equals(GameObjectType.PlayerCharacter)) {
((PlayerCharacter) this).update(false);
((PlayerCharacter) this).update();
PlayerCharacter.GroundPlayer((PlayerCharacter) this);
}
}

82
src/engine/objects/Arena.java

@ -1,82 +0,0 @@ @@ -1,82 +0,0 @@
package engine.objects;
import engine.InterestManagement.WorldGrid;
import engine.gameManager.ArenaManager;
import engine.gameManager.ChatManager;
import engine.gameManager.MovementManager;
import engine.math.Vector3fImmutable;
import engine.server.MBServerStatics;
import java.util.HashSet;
public class Arena {
public PlayerCharacter player1;
public PlayerCharacter player2;
public Long startTime;
public Vector3fImmutable loc;
public Arena(){
}
public Boolean disqualify() {
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(this.loc, 250f, MBServerStatics.MASK_PLAYER);
HashSet<AbstractWorldObject> warningRange = WorldGrid.getObjectsInRangePartial(this.loc, 500f, MBServerStatics.MASK_PLAYER);
for(AbstractWorldObject obj : warningRange){
PlayerCharacter pc = (PlayerCharacter)obj;
if(pc.equals(this.player1) || pc.equals(this.player2))
continue;
ChatManager.chatSystemInfo(pc, "WARNING!! You are entering an arena zone!");
}
//boot out all non competitors
for(AbstractWorldObject obj : inRange){
if(obj.equals(this.player1))
continue;
if(obj.equals(this.player2))
continue;
PlayerCharacter intruder = (PlayerCharacter)obj;
MovementManager.translocate(intruder,new Vector3fImmutable(88853,32,45079),Regions.GetRegionForTeleport(new Vector3fImmutable(88853,32,45079)));
}
if (!inRange.contains(this.player1) && inRange.contains(this.player2)) {
ArenaManager.endArena(this,this.player2,this.player1,"Player Has Left Arena");
return true;
} else if (!inRange.contains(this.player2) && inRange.contains(this.player1)) {
ArenaManager.endArena(this,this.player1,this.player2,"Player Has Left Arena");
return true;
}else if (!inRange.contains(this.player2) && !inRange.contains(this.player1)) {
ArenaManager.endArena(this,null,null,"Both Parties Have Left The Arena");
return true;
}
return false;
}
public Boolean checkToComplete(){
if(this.startTime == null)
this.startTime = System.currentTimeMillis();
if(System.currentTimeMillis() - this.startTime < 10000L)
return false;
if(this.disqualify())
return true;
if(!this.player1.isAlive() && this.player2.isAlive()){
ArenaManager.endArena(this,this.player2,this.player1,"Player Has Died");
return true;
} else if(this.player1.isAlive() && !this.player2.isAlive()){
ArenaManager.endArena(this,this.player1,this.player2,"Player Has Died");
return true;
} else if(!this.player1.isAlive() && !this.player2.isAlive()){
ArenaManager.endArena(this,null,null,"Both Players Have Died");
return true;
} else if(this.startTime + 300000L < System.currentTimeMillis()){
ArenaManager.endArena(this,null,null,"Time Has Elapsed");
return true;
}
return false;
}
}

177
src/engine/objects/Bane.java

@ -14,19 +14,19 @@ import engine.Enum.ProtectionState; @@ -14,19 +14,19 @@ import engine.Enum.ProtectionState;
import engine.Enum.SiegePhase;
import engine.Enum.SiegeResult;
import engine.InterestManagement.HeightMap;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.WorldGrid;
import engine.db.archive.BaneRecord;
import engine.db.archive.DataWarehouse;
import engine.gameManager.*;
import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.job.JobScheduler;
import engine.jobs.ActivateBaneJob;
import engine.jobs.BaneDefaultTimeJob;
import engine.math.Vector3fImmutable;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.CityDataMsg;
import engine.net.client.msg.PlaceAssetMsg;
import engine.net.client.msg.chat.ChatSystemMsg;
import engine.server.MBServerStatics;
@ -37,7 +37,6 @@ import java.sql.ResultSet; @@ -37,7 +37,6 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.concurrent.ConcurrentHashMap;
public final class Bane {
@ -49,10 +48,6 @@ public final class Bane { @@ -49,10 +48,6 @@ public final class Bane {
private DateTime placementDate = null;
private DateTime liveDate = null;
private BaneDefaultTimeJob defaultTimeJob;
public boolean timeSet = false;
public boolean daySet = false;
public boolean capSet = false;
public int capSize = 10;
// Internal cache for banes
private ActivateBaneJob activateBaneJob;
@ -69,12 +64,6 @@ public final class Bane { @@ -69,12 +64,6 @@ public final class Bane {
this.ownerUUID = rs.getInt("ownerUUID");
this.stoneUUID = rs.getInt("stoneUUID");
this.timeSet = rs.getInt("time_set") == 1;
this.daySet = rs.getInt("day_set") == 1;
this.capSet = rs.getInt("cap_set") == 1;
this.capSize = rs.getInt("cap_size");
sqlDateTime = rs.getTimestamp("placementDate");
if (sqlDateTime != null)
@ -111,11 +100,12 @@ public final class Bane { @@ -111,11 +100,12 @@ public final class Bane {
abtj = new ActivateBaneJob(cityUUID);
JobScheduler.getInstance().scheduleJob(abtj, this.liveDate.getMillis());
this.activateBaneJob = abtj;
break;
}
//add bane commander NPC
//summonBaneCommander(this);
if (this.liveDate == null)
setDefaultTime();
}
public static boolean summonBanestone(PlayerCharacter player, ClientConnection origin, int rank) {
@ -276,58 +266,9 @@ public final class Bane { @@ -276,58 +266,9 @@ public final class Bane {
BaneRecord baneRecord = BaneRecord.borrow(bane, Enum.RecordEventType.PENDING);
DataWarehouse.pushToWarehouse(baneRecord);
//add bane commander NPC
summonBaneCommander(bane);
try {
//update map for all players online
for (PlayerCharacter playerCharacter : SessionManager.getAllActivePlayerCharacters()) {
CityDataMsg cityDataMsg = new CityDataMsg(SessionManager.getSession(playerCharacter), false);
cityDataMsg.updateMines(true);
cityDataMsg.updateCities(true);
Dispatch dispatch = Dispatch.borrow(playerCharacter, cityDataMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
}catch(Exception e){
}
return true;
}
public static void summonBaneCommander(Bane bane){
Vector3fImmutable spawnLoc = Vector3fImmutable.getRandomPointOnCircle(bane.getStone().loc,6);
NPC baneCommander;
int commanderuuid = DbManager.NPCQueries.BANE_COMMANDER_EXISTS(bane.getStone().getObjectUUID());
if(commanderuuid == 0) {
//add bane commander NPC
int contractID = 1502042;
baneCommander = NPC.createNPC("Bane Commander", contractID, spawnLoc, bane.getCity().getGuild(), ZoneManager.findSmallestZone(bane.getStone().loc), (short) 70, bane.getStone());
try {
NPCManager.slotCharacterInBuilding(baneCommander);
}catch(Exception e){
}
WorldGrid.addObject(baneCommander,spawnLoc.x,spawnLoc.z);
WorldGrid.updateObject(baneCommander);
}
else
{
baneCommander = NPC.getNPC(commanderuuid);
}
//try {
// NPCManager.slotCharacterInBuilding(baneCommander);
//}catch (Exception e){
//swallow it
//}
baneCommander.runAfterLoad();
//baneCommander.setLoc(spawnLoc);
InterestManager.setObjectDirty(baneCommander);
baneCommander.updateLocation();
}
public static Bane getBane(int cityUUID) {
Bane outBane;
@ -428,24 +369,28 @@ public final class Bane { @@ -428,24 +369,28 @@ public final class Bane {
// Cache access
public void setDefaultTime() {
private void setDefaultTime() {
DateTime timeToSetDefault = new DateTime(this.placementDate);
timeToSetDefault = timeToSetDefault.plusDays(1);
if (DateTime.now().isAfter(timeToSetDefault)){
if(!this.capSet){
DbManager.BaneQueries.SET_BANE_CAP_NEW(20,this.getCityUUID());
this.capSet = true;
}
if(!this.daySet){
DbManager.BaneQueries.SET_BANE_DAY_NEW(3,this.getCityUUID());
this.daySet = true;
}
if(!this.timeSet){
DbManager.BaneQueries.SET_BANE_TIME_NEW(9,this.getCityUUID());
this.timeSet = true;
}
DateTime currentTime = DateTime.now();
DateTime defaultTime = new DateTime(this.placementDate);
defaultTime = defaultTime.plusDays(2);
defaultTime = defaultTime.hourOfDay().setCopy(22);
defaultTime = defaultTime.minuteOfHour().setCopy(0);
defaultTime = defaultTime.secondOfMinute().setCopy(0);
if (currentTime.isAfter(timeToSetDefault))
this.setLiveDate(defaultTime);
else {
if (this.defaultTimeJob != null)
this.defaultTimeJob.cancelJob();
BaneDefaultTimeJob bdtj = new BaneDefaultTimeJob(this);
JobScheduler.getInstance().scheduleJob(bdtj, timeToSetDefault.getMillis());
this.defaultTimeJob = bdtj;
}
}
@ -503,16 +448,6 @@ public final class Bane { @@ -503,16 +448,6 @@ public final class Bane {
return false;
}
//Remove bane commander NPC
if(!baneStone.getHirelings().isEmpty()) {
NPC npc = (NPC)baneStone.getHirelings().keySet().stream().findFirst().orElse(null);
if(npc != null) {
DbManager.NPCQueries.DELETE_NPC(npc);
DbManager.removeFromCache(npc);
WorldGrid.RemoveWorldObject(npc);
WorldGrid.removeObject(npc);
}
}
// Remove object from simulation
baneStone.removeFromCache();
@ -534,9 +469,6 @@ public final class Bane { @@ -534,9 +469,6 @@ public final class Bane {
return liveDate;
}
public void setLiveDate_NEW(DateTime baneTime) {
}
public void setLiveDate(DateTime baneTime) {
if (DbManager.BaneQueries.SET_BANE_TIME(baneTime, this.getCity().getObjectUUID())) {
@ -712,63 +644,4 @@ public final class Bane { @@ -712,63 +644,4 @@ public final class Bane {
return cityUUID;
}
public void applyZergBuffs(){
City city = this.getCity();
if(city == null)
return;
city.onEnter();
ArrayList<Integer> attackers = new ArrayList<>();
ArrayList<Integer> defenders = new ArrayList<>();
Guild attackNation = this.getOwner().getGuild().getNation();
Guild defendNation = this.getCity().getGuild().getNation();
HashSet<AbstractWorldObject> inSiegeRange = WorldGrid.getObjectsInRangePartial(city.getTOL().loc,1750f,1);
for(AbstractWorldObject obj : inSiegeRange){
int uuid = obj.getObjectUUID();
PlayerCharacter player = PlayerCharacter.getPlayerCharacter(uuid);
if(player == null)
continue;
Guild playerNation = player.guild.getNation();
//separate the players into categories
if(playerNation.equals(defendNation))
defenders.add(uuid);
else if(playerNation.equals(attackNation))
attackers.add(uuid);
else
MovementManager.translocate(player,Vector3fImmutable.getRandomPointOnCircle(ZoneManager.getZoneByUUID(656).getLoc(),30f),Regions.GetRegionForTeleport(ZoneManager.getZoneByUUID(656).getLoc()));
}
int attackerSize = 0;
int defenderSize = 0;
for(int uuid : city.baneAttendees.keySet()){
PlayerCharacter player = PlayerCharacter.getPlayerCharacter(uuid);
if(player == null)
continue;
if(player.guild.getNation().equals(defendNation))
defenderSize += 1;
else if(player.guild.getNation().equals(attackNation))
attackerSize += 1;
}
//apply zerg mechanic for attackers
float attackerMultiplier = ZergManager.getCurrentMultiplier(attackerSize,this.capSize);
float defenderMultiplier = ZergManager.getCurrentMultiplier(defenderSize,this.capSize);
for(int uuid : attackers){
PlayerCharacter player = PlayerCharacter.getPlayerCharacter(uuid);
if(inSiegeRange.contains(player)) //player is still physically here, needs updated multiplier
player.ZergMultiplier = attackerMultiplier;
else
player.ZergMultiplier = 1.0f;
}
for(int uuid : defenders){
PlayerCharacter player = PlayerCharacter.getPlayerCharacter(uuid);
if(inSiegeRange.contains(player)) //player is still physically here, needs updated multiplier
player.ZergMultiplier = defenderMultiplier;
else
player.ZergMultiplier = 1.0f;
}
}
}

98
src/engine/objects/Blueprint.java

@ -17,7 +17,6 @@ import org.pmw.tinylog.Logger; @@ -17,7 +17,6 @@ import org.pmw.tinylog.Logger;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Objects;
/* @Summary - Blueprint class is used for determining
characteristics of instanced player owned
@ -61,12 +60,13 @@ public class Blueprint { @@ -61,12 +60,13 @@ public class Blueprint {
this.name = rs.getString("MeshName");
this.icon = rs.getInt("Icon");
this.buildingGroup = BuildingGroup.valueOf(rs.getString("BuildingGroup"));
this.maxRank = rs.getInt("MaxRank");
this.maxSlots = rs.getInt("MaxSlots");
this.rank1UUID = rs.getInt("Rank1UUID");
this.rank3UUID = rs.getInt("Rank3UUID");
this.rank7UUID = rs.getInt("Rank7UUID");
this.destroyedUUID = rs.getInt("DestroyedUUID");
this.maxRank = rs.getInt("MaxRank");
}
// Accessors
@ -108,10 +108,8 @@ this.maxRank = rs.getInt("MaxRank"); @@ -108,10 +108,8 @@ this.maxRank = rs.getInt("MaxRank");
maxShrines = 2;
break;
case 7:
maxShrines = 3;
break;
case 8:
maxShrines = 4;
maxShrines = 3;
break;
default:
maxShrines = 0;
@ -169,48 +167,20 @@ this.maxRank = rs.getInt("MaxRank"); @@ -169,48 +167,20 @@ this.maxRank = rs.getInt("MaxRank");
// based upon the building's current rank
public static int getNpcMaintCost(int rank) {
return 0;
int maintCost = Integer.MAX_VALUE;
maintCost = (9730 * rank) + 1890;
return maintCost;
}
public int getMaxRank() {
BuildingGroup bg = this.buildingGroup;
switch(bg){
case AMAZONHALL:
case CATHEDRAL:
case GREATHALL:
case KEEP:
case THIEFHALL:
case TEMPLEHALL:
case WIZARDHALL:
case ELVENHALL:
case ELVENSANCTUM:
case IREKEIHALL:
case FORESTHALL:
return 1;
}
return maxRank;
}
public int getMaxSlots() {
if (this.buildingGroup != null && this.buildingGroup.equals(BuildingGroup.BARRACK))
return 1;
if (this.buildingGroup != null && this.buildingGroup.equals(BuildingGroup.TOL))
return 4;
BuildingGroup bg = this.buildingGroup;
switch(bg){
case AMAZONHALL:
case CATHEDRAL:
case GREATHALL:
case KEEP:
case THIEFHALL:
case TEMPLEHALL:
case WIZARDHALL:
case ELVENHALL:
case ELVENSANCTUM:
case IREKEIHALL:
case FORESTHALL:
return 3;
}
return maxSlots;
}
@ -342,27 +312,9 @@ this.maxRank = rs.getInt("MaxRank"); @@ -342,27 +312,9 @@ this.maxRank = rs.getInt("MaxRank");
return 0;
// Early exit for buildings with single or no slots
if (this.maxSlots <= 1 && !this.buildingGroup.equals(BuildingGroup.TOL))
return maxSlots;
BuildingGroup bg = this.buildingGroup;
switch(bg.name()) {
case "AMAZONHALL":
case "CATHEDRAL":
case "GREATHALL":
case "THIEFHALL":
case "TEMPLEHALL":
case "WIZARDHALL":
case "ELVENHALL":
case "ELVENSANCTUM":
case "IREKEIHALL":
case "FORESTHALL":
return 3;
}
if(bg != null && bg.equals(BuildingGroup.TOL) && currentRank == 8){
return 5;
}
if (this.maxSlots <= 1)
return maxSlots;
if (this.maxRank == 1 && currentRank == 1)
return getMaxSlots();
@ -375,22 +327,20 @@ this.maxRank = rs.getInt("MaxRank"); @@ -375,22 +327,20 @@ this.maxRank = rs.getInt("MaxRank");
break;
case 3:
case 4:
availableSlots = 2;
break;
case 5:
case 6:
availableSlots = 2;
break;
case 7:
availableSlots = 3;
break;
case 8:
availableSlots = 4;
availableSlots = 1;
break;
default:
availableSlots = 0;
break;
}
if(this.buildingGroup != null && this.buildingGroup.equals(BuildingGroup.TOL))
availableSlots += 1;
return availableSlots;
}
@ -653,14 +603,26 @@ this.maxRank = rs.getInt("MaxRank"); @@ -653,14 +603,26 @@ this.maxRank = rs.getInt("MaxRank");
return this.blueprintUUID;
}
public int getMaintCost() {
public int getMaintCost(int rank) {
int maintCost = Integer.MAX_VALUE;
if(this.buildingGroup.equals(BuildingGroup.TOL)){
return 3000000;
}else{
return 0;
switch (this.buildingGroup) {
case TOL:
case BARRACK:
maintCost = (61500 * rank) + 19500;
break;
case SPIRE:
maintCost = (4800 * rank) + 1200;
break;
default:
if (maxRank == 1)
maintCost = 22500;
else
maintCost = (15900 * rank) + 3300;
break;
}
return maintCost;
}
}

80
src/engine/objects/Building.java

@ -160,37 +160,28 @@ public class Building extends AbstractWorldObject { @@ -160,37 +160,28 @@ public class Building extends AbstractWorldObject {
// in City resulting in a stack ovreflow.
if (blueprint != null) {
// Only switch mesh for player dropped structures
if (this.blueprintUUID != 0)
this.meshUUID = blueprint.getMeshForRank(rank);
this.healthMax = blueprint.getMaxHealth(this.rank);
// If this object has no blueprint but is a blueprint
// mesh then set it's current health to max health
if (this.blueprintUUID == 0)
this.setHealth(healthMax);
if (blueprint.getBuildingGroup().equals(BuildingGroup.BARRACK))
this.patrolPoints = DbManager.BuildingQueries.LOAD_PATROL_POINTS(this);
} else {
this.healthMax = 100000; // Structures with no blueprint mesh
this.setHealth(healthMax);
}
if(!this.ownerIsNPC){
//add extra HP for city walls of R8 trees
City city = ZoneManager.getCityAtLocation(this.loc);
if(city != null){
Building ToL = city.getTOL();
if(ToL != null){
if(ToL.rank == 8){
float currentHealth = this.health.get();
float newHealth = (currentHealth/this.healthMax) * (this.healthMax * 1.1f);
this.healthMax *= 1.1f;
this.setHealth(newHealth);
}
}
}
}
// Null out blueprint if not needed (npc building)
if (blueprintUUID == 0)
@ -412,22 +403,6 @@ public class Building extends AbstractWorldObject { @@ -412,22 +403,6 @@ public class Building extends AbstractWorldObject {
this.healthMax = this.getBlueprint().getMaxHealth(this.rank);
this.setCurrentHitPoints(this.healthMax);
if(!this.ownerIsNPC && this.getBlueprint() != null && this.getBlueprint().isWallPiece()){
//add extra HP for city walls of R8 trees
City city = ZoneManager.getCityAtLocation(this.loc);
if(city != null){
Building ToL = city.getTOL();
if(ToL != null){
if(ToL.rank == 8){
float currentHealth = this.health.get();
float newHealth = (currentHealth/this.healthMax) * (this.healthMax * 1.1f);
this.healthMax *= 1.1f;
this.setHealth(newHealth);
}
}
}
}
if (this.getUpgradeDateTime() != null)
BuildingManager.setUpgradeDateTime(this, null, 0);
@ -805,9 +780,24 @@ public class Building extends AbstractWorldObject { @@ -805,9 +780,24 @@ public class Building extends AbstractWorldObject {
public int getMaintCost() {
if(this.getBlueprint() != null && this.getBlueprint().getBuildingGroup().equals(BuildingGroup.TOL))
return 3000000;
else return 0;
int maintCost = 0;
// Add cost for building structure
maintCost += this.getBlueprint().getMaintCost(rank);
// Add costs associated with hirelings
for (AbstractCharacter npc : this.hirelings.keySet()) {
if (npc.getObjectType() != GameObjectType.NPC)
continue;
maintCost += Blueprint.getNpcMaintCost(npc.getRank());
}
return maintCost;
}
public final void submitOpenDoorJob(int doorID) {
@ -846,10 +836,6 @@ public class Building extends AbstractWorldObject { @@ -846,10 +836,6 @@ public class Building extends AbstractWorldObject {
return this.meshScale;
}
public void setMeshScale(Vector3f scale) {
this.meshScale = scale;
}
public final int getMeshUUID() {
return this.meshUUID;
}
@ -1137,22 +1123,6 @@ public class Building extends AbstractWorldObject { @@ -1137,22 +1123,6 @@ public class Building extends AbstractWorldObject {
}
}
if(!this.ownerIsNPC && this.getBlueprint() != null && this.getBlueprint().isWallPiece()){
//add extra HP for city walls of R8 trees
City city = ZoneManager.getCityAtLocation(this.loc);
if(city != null){
Building ToL = city.getTOL();
if(ToL != null){
if(ToL.rank == 8){
float currentHealth = this.health.get();
float newHealth = (currentHealth/this.healthMax) * (this.healthMax * 1.1f);
this.healthMax *= 1.1f;
this.setHealth(newHealth);
}
}
}
}
// Set bounds for this building
Bounds buildingBounds = Bounds.borrow();

5
src/engine/objects/CharacterItemManager.java

@ -610,8 +610,6 @@ public class CharacterItemManager { @@ -610,8 +610,6 @@ public class CharacterItemManager {
if (i == null)
return false;
i.stripCastableEnchants();
if (!this.doesCharOwnThisItem(i.getObjectUUID()))
return false;
@ -1056,7 +1054,6 @@ public class CharacterItemManager { @@ -1056,7 +1054,6 @@ public class CharacterItemManager {
// add to Bank
this.bank.add(i);
i.addToCache();
i.stripCastableEnchants();
calculateWeights();
@ -1205,7 +1202,6 @@ public class CharacterItemManager { @@ -1205,7 +1202,6 @@ public class CharacterItemManager {
calculateWeights();
i.stripCastableEnchants();
return true;
}
@ -2013,7 +2009,6 @@ public class CharacterItemManager { @@ -2013,7 +2009,6 @@ public class CharacterItemManager {
if (item.getItemBase().getType().equals(ItemType.GOLD)) {
int amt = item.getNumOfItems();
item.setNumOfItems(0);
item.stripCastableEnchants();
MobLoot ml = new MobLoot(this.absCharacter, amt);
ml.zeroItem();
ml.containerType = Enum.ItemContainerType.INVENTORY;

13
src/engine/objects/CharacterSkill.java

@ -992,9 +992,6 @@ public class CharacterSkill extends AbstractGameObject { @@ -992,9 +992,6 @@ public class CharacterSkill extends AbstractGameObject {
//Get Base skill for unmodified stats
float base = 7f;
if(this.skillsBase.getToken() == -660435875){
base = 0;
}
float statMod = 0.5f;
if (this.skillsBase.getStrMod() > 0)
statMod += (float) this.skillsBase.getStrMod() * (float) (int) ((PlayerCharacter) CharacterSkill.GetOwner(this)).statStrBase / 100f;
@ -1012,7 +1009,7 @@ public class CharacterSkill extends AbstractGameObject { @@ -1012,7 +1009,7 @@ public class CharacterSkill extends AbstractGameObject {
statMod = 600f;
base += CharacterSkill.baseSkillValues[(int) statMod];
if (base + bonus < 1f && this.skillsBase.getToken() != -660435875)
if (base + bonus < 1f)
this.baseAmountBeforeMods = 1f;
else
this.baseAmountBeforeMods = base + bonus;
@ -1087,9 +1084,6 @@ public class CharacterSkill extends AbstractGameObject { @@ -1087,9 +1084,6 @@ public class CharacterSkill extends AbstractGameObject {
//Get Base skill for modified stats
//TODO this fomula needs verified
float base = 7f;
if(this.skillsBase.getToken() == -660435875){
base = 0;
}
float statMod = 0.5f;
if (this.skillsBase.getStrMod() > 0)
statMod += (float) this.skillsBase.getStrMod() * (float) CharacterSkill.GetOwner(this).getStatStrCurrent() / 100f;
@ -1105,9 +1099,6 @@ public class CharacterSkill extends AbstractGameObject { @@ -1105,9 +1099,6 @@ public class CharacterSkill extends AbstractGameObject {
statMod = 1f;
else if (statMod > 600)
statMod = 600f;
if(this.skillsBase.getToken() == -660435875){
statMod = 0;
}
base += CharacterSkill.baseSkillValues[(int) statMod];
SourceType sourceType = SourceType.GetSourceType(this.skillsBase.getNameNoSpace());
@ -1118,7 +1109,7 @@ public class CharacterSkill extends AbstractGameObject { @@ -1118,7 +1109,7 @@ public class CharacterSkill extends AbstractGameObject {
base += bonus + CharacterSkill.GetOwner(this).getBonuses().getFloat(ModType.Skill, sourceType);
}
if (base < 1f && this.skillsBase.getToken() != -660435875)
if (base < 1f)
this.baseAmount = 1f;
else
this.baseAmount = base;

78
src/engine/objects/City.java

@ -39,7 +39,6 @@ import java.sql.SQLException; @@ -39,7 +39,6 @@ import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
@ -89,8 +88,6 @@ public class City extends AbstractWorldObject { @@ -89,8 +88,6 @@ public class City extends AbstractWorldObject {
private boolean reverseKOS = false;
private String hash;
public HashMap<Integer, Long> baneAttendees = new HashMap<>();
/**
* ResultSet Constructor
*/
@ -237,24 +234,7 @@ public class City extends AbstractWorldObject { @@ -237,24 +234,7 @@ public class City extends AbstractWorldObject {
writer.putInt(rulingGuild.getObjectUUID());
writer.putString(rulingGuild.getName());
try {
if (city.getBane() != null) {
Bane bane = city.getBane();
if (bane.daySet && bane.timeSet && bane.getLiveDate() != null) {
int day = bane.getLiveDate().dayOfMonth().get();
int month = bane.getLiveDate().getMonthOfYear();
int year = bane.getLiveDate().year().get();
int hour = bane.getLiveDate().getHourOfDay();
writer.putString("BANE SET: " + month + "/" + day + "/" + year + " " + hour + ":00 CST");
} else {
writer.putString("BANED!: Unset");
}
} else {
writer.putString(city.motto);
}
}catch(Exception e){
writer.putString(city.motto);
}
writer.putString(city.motto);
writer.putString(rulingGuild.getLeadershipType());
// Serialize guild ruler's name
@ -309,11 +289,8 @@ public class City extends AbstractWorldObject { @@ -309,11 +289,8 @@ public class City extends AbstractWorldObject {
else
writer.putString(rulingNation.getName());
if(city.getTOL() != null) {
writer.putInt(city.getTOL().getRank());
} else{
writer.putInt(1);
}
writer.putInt(city.getTOL().getRank());
if (city.isNoobIsle > 0)
writer.putInt(1);
else
@ -340,11 +317,8 @@ public class City extends AbstractWorldObject { @@ -340,11 +317,8 @@ public class City extends AbstractWorldObject {
writer.putFloat(city.location.y);
writer.putFloat(city.location.z);
if(city.getBane() != null) {
writer.putInt(city.getBane().capSize);
}else{
writer.putInt(0);
}
writer.putInt(city.siegesWithstood);
writer.put((byte) 1);
writer.put((byte) 0);
writer.putInt(0x64);
@ -1012,7 +986,7 @@ public class City extends AbstractWorldObject { @@ -1012,7 +986,7 @@ public class City extends AbstractWorldObject {
// Gather current list of players within the zone bounds
currentPlayers = WorldGrid.getObjectsInRangePartial(this.location, 1500, MBServerStatics.MASK_PLAYER);
currentPlayers = WorldGrid.getObjectsInRangePartial(this.location, CityBoundsType.ZONE.extents, MBServerStatics.MASK_PLAYER);
currentMemory = new HashSet<>();
for (AbstractWorldObject playerObject : currentPlayers) {
@ -1024,15 +998,7 @@ public class City extends AbstractWorldObject { @@ -1024,15 +998,7 @@ public class City extends AbstractWorldObject {
currentMemory.add(player.getObjectUUID());
// Player is already in our memory
if(this.getBane() != null){
//handle zerg mechanics here
if(this.getBane().getSiegePhase().equals(SiegePhase.WAR)){
//bane is live, start tallying players
if(!this.baneAttendees.containsKey(player.getObjectUUID())){
this.baneAttendees.put(player.getObjectUUID(),System.currentTimeMillis());
}
}
}
if (_playerMemory.contains(player.getObjectUUID()))
continue;
@ -1059,29 +1025,14 @@ public class City extends AbstractWorldObject { @@ -1059,29 +1025,14 @@ public class City extends AbstractWorldObject {
} catch (Exception e) {
Logger.error(e.getMessage());
}
}
private void onExitBane() {
ArrayList<Integer> toRemove = new ArrayList<>();
for (Integer uuid : this.baneAttendees.keySet()) {
if (!_playerMemory.contains(uuid)) {
long timeGone = System.currentTimeMillis() - this.baneAttendees.get(uuid).longValue();
if (timeGone > 180000L) { // 3 minutes
toRemove.add(uuid); // Mark for removal
}
}
}
for(int uuid : toRemove){
this.baneAttendees.remove(uuid);
}
}
private void onExit(HashSet<Integer> currentMemory) {
PlayerCharacter player;
int playerUUID = 0;
HashSet<Integer> toRemoveStandard = new HashSet<>();
HashSet<Integer> toRemove = new HashSet<>();
Iterator<Integer> iter = _playerMemory.iterator();
while (iter.hasNext()) {
@ -1103,28 +1054,21 @@ public class City extends AbstractWorldObject { @@ -1103,28 +1054,21 @@ public class City extends AbstractWorldObject {
this.removeAllCityEffects(player, false);
player.ZergMultiplier = 1.0f;
// We will remove this player after iteration is complete
// so store it in a temporary collection
toRemoveStandard.add(playerUUID);
toRemove.add(playerUUID);
// ***For debugging
// Logger.info("PlayerMemory for ", this.getCityName() + ": " + _playerMemory.size());
}
// Remove players from city memory
_playerMemory.removeAll(toRemoveStandard);
for (Integer removalUUID : toRemoveStandard) {
_playerMemory.removeAll(toRemove);
for (Integer removalUUID : toRemove) {
if (this.cityOutlaws.contains(removalUUID))
this.cityOutlaws.remove(removalUUID);
}
if(this.getBane() != null){
//handle zerg mechanics here
if(this.getBane().getSiegePhase().equals(SiegePhase.WAR)){
this.onExitBane();
}
}
}
public int getWarehouseBuildingID() {

384
src/engine/objects/Contract.java

@ -11,12 +11,7 @@ package engine.objects; @@ -11,12 +11,7 @@ package engine.objects;
import ch.claude_martin.enumbitset.EnumBitSet;
import engine.Enum;
import engine.gameManager.*;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.msg.CityDataMsg;
import engine.net.client.msg.ErrorPopupMsg;
import org.joda.time.DateTime;
import engine.gameManager.DbManager;
import org.pmw.tinylog.Logger;
import java.sql.ResultSet;
@ -91,15 +86,6 @@ public class Contract extends AbstractGameObject { @@ -91,15 +86,6 @@ public class Contract extends AbstractGameObject {
this.iconID = rs.getInt("iconID");
this.vendorID = rs.getInt("vendorID");
this.allowedBuildings = EnumBitSet.asEnumBitSet(rs.getLong("allowedBuildingTypeID"), Enum.BuildingGroup.class);
switch(this.contractID){
case 866: //banker
case 865: //siege engineer
case 899: //alchemist
this.allowedBuildings.add(Enum.BuildingGroup.TOL);
}
if(this.getName().toLowerCase().contains("sage")){
this.allowedBuildings.add(Enum.BuildingGroup.TOL);
}
this.equipmentSet = rs.getInt("equipSetID");
this.inventorySet = rs.getInt("inventorySet");
@ -195,288 +181,6 @@ public class Contract extends AbstractGameObject { @@ -195,288 +181,6 @@ public class Contract extends AbstractGameObject {
return this.vendorDialog;
}
public static VendorDialog HandleArenaMaster(int optionId, NPC npc, PlayerCharacter pc){
//1502043
pc.setLastNPCDialog(npc);
VendorDialog vd = new VendorDialog(VendorDialog.getHostileVendorDialog().getDialogType(),VendorDialog.getHostileVendorDialog().getIntro(),-1);//VendorDialog.getHostileVendorDialog();
vd.getOptions().clear();
switch(optionId){
case 15020431:
//if(pc.isBoxed){
// ChatManager.chatSystemInfo(pc, "You Cannot Join The Que, You Are Boxed");
//}else {
if (ArenaManager.playerQueue.contains(pc)) {
ChatManager.chatSystemInfo(pc, "You Are Already In The Arena Que");
} else {
ArenaManager.joinQueue(pc);
ChatManager.chatSystemInfo(pc, "You Have Joined The Arena Que");
}
//}
break;
case 15020432:
if(ArenaManager.playerQueue.contains(pc)) {
ArenaManager.leaveQueue(pc);
ChatManager.chatSystemInfo(pc, "You Have Left The Arena Que");
}else{
ChatManager.chatSystemInfo(pc, "You Are Not In The Arena Que");
}
break;
}
MenuOption option1 = new MenuOption(15020431, "Join Arena Que", 15020431);
vd.getOptions().add(option1);
MenuOption option2 = new MenuOption(15020432, "Leave Arena Que", 15020432);
vd.getOptions().add(option2);
return vd;
}
public static VendorDialog HandleEnrollmentOfficer(int optionId, NPC npc, PlayerCharacter pc){
pc.setLastNPCDialog(npc);
//VendorDialog vd = new VendorDialog(npc.contract.getVendorDialog().getDialogType(),npc.contract.getVendorDialog().getIntro(),-1);//VendorDialog.getHostileVendorDialog();
VendorDialog vd = new VendorDialog(npc.contract.getVendorDialog().getDialogType(),npc.contract.getVendorDialog().getIntro(),-1);//VendorDialog.getHostileVendorDialog();
vd.getOptions().clear();
switch(optionId) {
default:
if (pc.isBoxed) {
MenuOption option1 = new MenuOption(15020401, "Unbox Character", 15020401);
vd.getOptions().add(option1);
}
break;
case 15020401:
PlayerCharacter.unboxPlayer(pc);
vd.getOptions().clear();
break;
}
return vd;
}
public static VendorDialog HandleBaneCommanderOptions(int optionId, NPC npc, PlayerCharacter pc){
pc.setLastNPCDialog(npc);
VendorDialog vd = new VendorDialog(VendorDialog.getHostileVendorDialog().getDialogType(),VendorDialog.getHostileVendorDialog().getIntro(),-1);//VendorDialog.getHostileVendorDialog();
vd.getOptions().clear();
Building building = npc.building;
Bane bane = null;
int updateBaneTime = 0;
int updateBaneDay = 0;
int updateBaneCap = 0;
int treesInNation = 0;
if(building != null)
{
City city = ZoneManager.getCityAtLocation(building.loc);
if(city != null){
bane = city.getBane();
if(!city.getGuild().equals(pc.guild))
return vd;
if(!GuildStatusController.isInnerCouncil(pc.getGuildStatus()) && !GuildStatusController.isGuildLeader(pc.getGuildStatus())){
return vd;
}
for(Guild sub : city.getGuild().getNation().getSubGuildList()){
if(sub.getOwnedCity() != null){
treesInNation += 1;
}
}
}
}
if(bane == null){
return VendorDialog.getHostileVendorDialog();
}
if(bane.timeSet && bane.capSet && bane.daySet){
vd.getOptions().clear();
return vd;
}
DateTime placement = bane.getPlacementDate();
vd.getOptions().clear();
switch(optionId){
default:
if(!bane.daySet) {
MenuOption option1 = new MenuOption(796, "Set Bane Day", 796);
vd.getOptions().add(option1);
}
if(!bane.timeSet) {
MenuOption option2 = new MenuOption(797, "Set Bane Time", 797);
vd.getOptions().add(option2);
}
if(!bane.capSet) {
MenuOption option3 = new MenuOption(797, "Set Bane Cap", 798);
vd.getOptions().add(option3);
}
break;
case 796: // set bane day
DateTime dayOption1Date = placement.plusDays(3);
MenuOption dayOption1 = new MenuOption(7961, dayOption1Date.toString("yyyy-MM-dd"), 7961);
vd.getOptions().add(dayOption1);
DateTime dayOption2Date = placement.plusDays(4);
MenuOption dayOption2 = new MenuOption(7962, dayOption2Date.toString("yyyy-MM-dd"), 7962);
vd.getOptions().add(dayOption2);
DateTime dayOption3Date = placement.plusDays(5);
MenuOption dayOption3 = new MenuOption(7963, dayOption3Date.toString("yyyy-MM-dd"), 7963);
vd.getOptions().add(dayOption3);
DateTime dayOption4Date = placement.plusDays(6);
MenuOption dayOption4 = new MenuOption(7964, dayOption4Date.toString("yyyy-MM-dd"), 7964);
vd.getOptions().add(dayOption4);
DateTime dayOption5Date = placement.plusDays(7);
MenuOption dayOption5 = new MenuOption(7965, dayOption5Date.toString("yyyy-MM-dd"), 7965);
vd.getOptions().add(dayOption5);
break;
case 797: // set bane time
MenuOption timeOption1 = new MenuOption(7971, "6:00 pm CST", 7971);
vd.getOptions().add(timeOption1);
MenuOption timeOption2 = new MenuOption(7972, "7:00 pm CST", 7972);
vd.getOptions().add(timeOption2);
MenuOption timeOption3 = new MenuOption(7973, "8:00 pm CST", 7973);
vd.getOptions().add(timeOption3);
MenuOption timeOption4 = new MenuOption(7974, "9:00 pm CST", 7974);
vd.getOptions().add(timeOption4);
MenuOption timeOption5 = new MenuOption(7975, "10:00 pm CST", 7975);
vd.getOptions().add(timeOption5);
break;
case 798: // set bane cap
if(treesInNation < 6) {
MenuOption capOption1 = new MenuOption(7981, "10 Maximum Players", 7981);
vd.getOptions().add(capOption1);
}
if(treesInNation < 11) {
MenuOption capOption2 = new MenuOption(7982, "20 Maximum Players", 7982);
vd.getOptions().add(capOption2);
}
MenuOption capOption3 = new MenuOption(7983, "30 Maximum Players", 7983);
vd.getOptions().add(capOption3);
MenuOption capOption4 = new MenuOption(7984, "40 Maximum Players", 7984);
vd.getOptions().add(capOption4);
MenuOption capOption5 = new MenuOption(7985, "Unlimited Players", 7985);
vd.getOptions().add(capOption5);
break;
case 7961: //3 days after placement
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set 3 Days From Placement Date");
updateBaneDay = 3;
break;
case 7962: //4 days after placement
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set 4 Days From Placement Date");
updateBaneDay = 4;
break;
case 7963: //5 days after placement
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set 5 Days From Placement Date");
updateBaneDay = 5;
break;
case 7964: //6 days after placement
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set 6 Days From Placement Date");
updateBaneDay = 6;
break;
case 7965: //7 days after placement
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set 7 Days From Placement Date");
updateBaneDay = 7;
break;
case 7971: //6:00pm CST
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set For 6:00 pm CST");
updateBaneTime = 6;
break;
case 7972: //7:00pm CST
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set For 7:00 pm CST");
updateBaneTime = 7;
break;
case 7973: //8:00pm CST
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set For 8:00 pm CST");
updateBaneTime = 8;
break;
case 7974: //9:00pm CST
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set For 9:00 pm CST");
updateBaneTime = 9;
break;
case 7975: //10:00pm CST
ErrorPopupMsg.sendErrorMsg(pc, "Bane Set For 10:00 pm CST");
updateBaneTime = 10;
break;
case 7981: //cap = 10
ErrorPopupMsg.sendErrorMsg(pc, "Bane Cap Set To 10 Players On Each Side");
updateBaneCap = 10;
break;
case 7982: //cap = 20
ErrorPopupMsg.sendErrorMsg(pc, "Bane Cap Set To 20 Players On Each Side");
updateBaneCap = 20;
break;
case 7983: //cap = 30
ErrorPopupMsg.sendErrorMsg(pc, "Bane Cap Set To 30 Players On Each Side");
updateBaneCap = 30;
break;
case 7984: //cap = 40
ErrorPopupMsg.sendErrorMsg(pc, "Bane Cap Set To 40 Players On Each Side");
updateBaneCap = 40;
break;
case 7985: //cap = Unlimited
ErrorPopupMsg.sendErrorMsg(pc, "Bane Cap Set To Unlimited Players On Each Side");
updateBaneCap = 9999;
break;
}
if (updateBaneDay > 0) {
if(DbManager.BaneQueries.SET_BANE_DAY_NEW(updateBaneDay,bane.getCityUUID())){
bane.daySet = true;
if(bane.getLiveDate() == null) {
bane.setLiveDate_NEW(bane.getPlacementDate().plusDays(updateBaneDay));
}else{
bane.setLiveDate_NEW(bane.getLiveDate().plusDays(updateBaneDay));
}
}
}
if (updateBaneTime > 0) {
if(DbManager.BaneQueries.SET_BANE_TIME_NEW(updateBaneTime,bane.getCityUUID())){
bane.timeSet = true;
if(bane.getLiveDate() == null) {
bane.setLiveDate_NEW(bane.getPlacementDate().withHourOfDay(12 + updateBaneTime));
}else{
bane.setLiveDate_NEW(bane.getLiveDate().withHourOfDay(12 + updateBaneTime));
}
}
bane.setLiveDate(DbManager.BaneQueries.getLiveDate(bane.getCityUUID()));
}
if (updateBaneCap > 0) {
if(DbManager.BaneQueries.SET_BANE_CAP_NEW(updateBaneCap,bane.getCityUUID())){
bane.capSet = true;
bane.capSize = updateBaneCap;
}
}
if(updateBaneCap > 0 || updateBaneTime > 0 || updateBaneDay > 0) {
bane.getSiegePhase();
for (PlayerCharacter playerCharacter : SessionManager.getAllActivePlayerCharacters()) {
CityDataMsg cityDataMsg = new CityDataMsg(SessionManager.getSession(playerCharacter), false);
cityDataMsg.updateMines(true);
cityDataMsg.updateCities(true);
Dispatch dispatch = Dispatch.borrow(playerCharacter, cityDataMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
vd.getOptions().clear();
if(!bane.daySet) {
MenuOption option1 = new MenuOption(796, "Set Bane Day", 796);
vd.getOptions().add(option1);
}
if(!bane.timeSet) {
MenuOption option2 = new MenuOption(797, "Set Bane Time", 797);
vd.getOptions().add(option2);
}
if(!bane.capSet) {
MenuOption option3 = new MenuOption(797, "Set Bane Cap", 798);
vd.getOptions().add(option3);
}
}
return vd;
}
public ArrayList<Integer> getNPCMenuOptions() {
return this.npcMenuOptions;
}
@ -494,92 +198,6 @@ public class Contract extends AbstractGameObject { @@ -494,92 +198,6 @@ public class Contract extends AbstractGameObject {
}
public ArrayList<MobEquipment> getSellInventory() {
if(this.getObjectUUID() == 900){ //resource merchant
for(MobEquipment me : this.sellInventory){
if(me.getItemBase().getType().equals(Enum.ItemType.RESOURCE)){
int amountResource = Warehouse.getSellStackSize(me.getItemBase().getUUID());
me.magicValue = amountResource * me.getItemBase().getBaseValue();
} else{
me.magicValue = 1000000;
}
}
}
if(this.getObjectUUID() == 1202){ //rune merchant
for(MobEquipment me : this.sellInventory){
switch(me.getItemBase().getUUID()){
case 250001: //5 stats
case 250010:
case 250019:
case 250028:
case 250037:
me.magicValue = 3000000;
break;
case 250002: //10 stats
case 250011:
case 250020:
case 250029:
case 250038:
me.magicValue = 4000000;
break;
case 250003: //15 stats
case 250012:
case 250021:
case 250030:
case 250039:
me.magicValue = 5000000;
break;
case 250004: //20 stats
case 250013:
case 250022:
case 250031:
case 250040:
me.magicValue = 6000000;
break;
case 250005: //25 stats
case 250014:
case 250023:
case 250032:
case 250041:
me.magicValue = 7000000;
break;
case 250006: //30 stats
case 250015:
case 250024:
case 250033:
case 250042:
me.magicValue = 8000000;
break;
case 250007: //35 stats
case 250016:
case 250025:
case 250034:
case 250043:
me.magicValue = 9000000;
break;
default:
me.magicValue = 10000000;
break;
}
}
}
if(this.getObjectUUID() == 1201){ //disc merchant
for(MobEquipment me : this.sellInventory){
if(me.getItemBase().getName().equals("Prospector")){
me.magicValue = 500000;
}else{
me.magicValue = 10000000;
}
}
}
if(this.getObjectUUID() == 1502041) {//noob helper{
for(MobEquipment me : this.sellInventory){
me.magicValue = 1;
}
}
return this.sellInventory;
}

2
src/engine/objects/Corpse.java

@ -43,7 +43,6 @@ public class Corpse extends AbstractWorldObject { @@ -43,7 +43,6 @@ public class Corpse extends AbstractWorldObject {
private int inBuildingID = 0;
private int inFloorID = -1;
private int inBuilding = -1;
public Long spawnedTime = 0L;
/**
* No Id Constructor
@ -75,7 +74,6 @@ public class Corpse extends AbstractWorldObject { @@ -75,7 +74,6 @@ public class Corpse extends AbstractWorldObject {
}
this.setObjectTypeMask(MBServerStatics.MASK_CORPSE);
this.spawnedTime = System.currentTimeMillis();
if (!safeZone)
transferInventory(belongsTo, enterWorld);

46
src/engine/objects/Experience.java

@ -9,7 +9,6 @@ @@ -9,7 +9,6 @@
package engine.objects;
import engine.Enum;
import engine.Enum.TargetColor;
import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable;
@ -118,11 +117,6 @@ public class Experience { @@ -118,11 +117,6 @@ public class Experience {
159932666, // Level 74
169707808, // Level 75
179921247, // Level 76
190585732, // Level 77
201714185, // Level 78
213319687, // Level 79
225415457, // Level 80
238014819 // Level 81
};
@ -220,14 +214,7 @@ public class Experience { @@ -220,14 +214,7 @@ public class Experience {
235166.21f, // Level 72
246039.34f, // Level 73
257240.58f, // Level 74
268774.71f, //Level 75
280647.69f, // Level 76
292865.22f, // Level 77
305433.33f, // Level 78
318358.08f, // Level 79
// R8
1 //331645.74f // Level 80
1 // 268774.71 //Level 75
};
// Used to calcuate the amount of experience a monster grants in the
@ -281,8 +268,8 @@ public class Experience { @@ -281,8 +268,8 @@ public class Experience {
if (level < 1)
level = 1;
if (level > MBServerStatics.LEVELCAP)
level = MBServerStatics.LEVELCAP;
if (level > 75)
level = 75;
return MaxExpPerLevel[level];
}
@ -292,17 +279,17 @@ public class Experience { @@ -292,17 +279,17 @@ public class Experience {
switch (TargetColor.getCon(pc, mob)) {
case Red:
return 1.1;
return 1.25;
case Orange:
return 1.15;
case Yellow:
return 1.2;
return 1.05;
case Blue:
return 1.25;
return 1;
case Cyan:
return 0.9;
return 0.8;
case Green:
return 0.7;
return 0.5;
default:
return 0;
}
@ -346,12 +333,6 @@ public class Experience { @@ -346,12 +333,6 @@ public class Experience {
if (killer == null || mob == null)
return;
if(killer.equals(mob))
return;
if(killer.pvpKills.contains(mob.getObjectUUID()))
return;
double grantedExperience = 0.0;
if (g != null) { // Do group EXP stuff
@ -402,14 +383,10 @@ public class Experience { @@ -402,14 +383,10 @@ public class Experience {
if (playerCharacter.getLevel() >= MBServerStatics.LEVELCAP)
continue;
if(playerCharacter.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
continue; // cannot PVE higher than level 75
// Sets Max XP with server exp mod taken into account.
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(playerCharacter.getLevel());
grantedExperience *= (1/ giveEXPTo.size()+0.9);
// Adjust XP for Mob Level
grantedExperience *= getConMod(playerCharacter, mob);
@ -451,13 +428,10 @@ public class Experience { @@ -451,13 +428,10 @@ public class Experience {
}
} else { // Give EXP to a single character
//if (!killer.isAlive()) // Skip if the player is dead.
// return;
if (killer.getLevel() >= MBServerStatics.LEVELCAP)
if (!killer.isAlive()) // Skip if the player is dead.
return;
if(killer.level >= 75 && !mob.getObjectType().equals(Enum.GameObjectType.PlayerCharacter))
if (killer.getLevel() >= MBServerStatics.LEVELCAP)
return;
// Get XP and adjust for Mob Level with world xp modifier taken into account

10
src/engine/objects/Guild.java

@ -521,10 +521,6 @@ public class Guild extends AbstractWorldObject { @@ -521,10 +521,6 @@ public class Guild extends AbstractWorldObject {
public void setICMOTD(String value) {
this.icmotd = value;
}
public void setNMOTD(String value) {
this.nmotd = value;
}
public String getNMOTD(){return nmotd;}
public boolean isNPCGuild() {
@ -756,9 +752,9 @@ public class Guild extends AbstractWorldObject { @@ -756,9 +752,9 @@ public class Guild extends AbstractWorldObject {
canSub = false;
}
City nationCap = City.getCity(nation.cityUUID);
//if (nation.getSubGuildList().size() >= nationCap.getRank()) {
// canSub = false;
//}
if (nation.getSubGuildList().size() >= nationCap.getRank()) {
canSub = false;
}
return canSub;
}

52
src/engine/objects/Item.java

@ -23,7 +23,6 @@ import engine.net.client.ClientConnection; @@ -23,7 +23,6 @@ import engine.net.client.ClientConnection;
import engine.net.client.msg.DeleteItemMsg;
import engine.powers.EffectsBase;
import engine.powers.effectmodifiers.AbstractEffectModifier;
import engine.powers.effectmodifiers.WeaponProcEffectModifier;
import engine.powers.poweractions.AbstractPowerAction;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
@ -234,6 +233,7 @@ public class Item extends AbstractWorldObject { @@ -234,6 +233,7 @@ public class Item extends AbstractWorldObject {
this.value = rs.getInt("item_value");
this.customName = rs.getString("item_name");
}
public static void _serializeForClientMsg(Item item, ByteBufferWriter writer)
@ -303,7 +303,7 @@ public class Item extends AbstractWorldObject { @@ -303,7 +303,7 @@ public class Item extends AbstractWorldObject {
writer.putString(item.customName); // Unknown. pad?
writer.put((byte) 1); // End Datablock byte
writer.putFloat((float) item.getDurabilityMax());
writer.putFloat((float) item.durabilityMax);
writer.putFloat((float) item.durabilityCurrent);
writer.put((byte) 1); // End Datablock byte
@ -609,7 +609,7 @@ public class Item extends AbstractWorldObject { @@ -609,7 +609,7 @@ public class Item extends AbstractWorldObject {
writer.putIntAt(serialized, indexPosition);
}
public static Item createItemForPlayer(PlayerCharacter pc, ItemBase ib, boolean fromNoob) {
public static Item createItemForPlayer(PlayerCharacter pc, ItemBase ib) {
Item item = null;
byte charges = 0;
@ -817,29 +817,8 @@ public class Item extends AbstractWorldObject { @@ -817,29 +817,8 @@ public class Item extends AbstractWorldObject {
return ownerID;
}
public void stripCastableEnchants(){
ArrayList<String> keys =new ArrayList<>();
for(String eff : this.effects.keySet()){
for(AbstractEffectModifier mod : this.effects.get(eff).getEffectsBase().getModifiers()){
if(mod.modType.equals(ModType.WeaponProc)){
keys.add(eff);
}
}
}
for(String eff : keys){
try {
this.effects.get(eff).endEffect();
this.effects.remove(eff);
}catch(Exception e){
}
}
}
//Only to be used for trading
public void setOwnerID(int ownerID) {
this.stripCastableEnchants();
this.ownerID = ownerID;
}
@ -863,7 +842,6 @@ public class Item extends AbstractWorldObject { @@ -863,7 +842,6 @@ public class Item extends AbstractWorldObject {
public boolean setOwner(AbstractGameObject owner) {
if (owner == null)
return false;
this.stripCastableEnchants();
if (owner.getObjectType().equals(GameObjectType.NPC))
this.ownerType = OwnerType.Npc;
else if (owner.getObjectType().equals(GameObjectType.PlayerCharacter))
@ -907,15 +885,7 @@ public class Item extends AbstractWorldObject { @@ -907,15 +885,7 @@ public class Item extends AbstractWorldObject {
}
public short getDurabilityMax() {
int extra = 0;
for(Effect eff : this.effects.values()){
for(AbstractEffectModifier mod : eff.getEffectModifiers()){
if(mod.modType.equals(ModType.Durability)){
extra += mod.getMaxMod();
}
}
}
return (short)(durabilityMax + extra);
return durabilityMax;
}
public boolean isCanDestroy() {
@ -978,7 +948,6 @@ public class Item extends AbstractWorldObject { @@ -978,7 +948,6 @@ public class Item extends AbstractWorldObject {
}
public boolean isID() {
this.flags |= 1;
return ((this.flags & 1) > 0);
}
@ -1085,7 +1054,6 @@ public class Item extends AbstractWorldObject { @@ -1085,7 +1054,6 @@ public class Item extends AbstractWorldObject {
this.ownerID = pc.getObjectUUID();
this.ownerType = OwnerType.PlayerCharacter;
this.containerType = ItemContainerType.INVENTORY;
this.stripCastableEnchants();
return true;
}
@ -1106,7 +1074,6 @@ public class Item extends AbstractWorldObject { @@ -1106,7 +1074,6 @@ public class Item extends AbstractWorldObject {
this.ownerID = npc.getObjectUUID();
this.ownerType = OwnerType.Npc;
this.containerType = Enum.ItemContainerType.INVENTORY;
this.stripCastableEnchants();
return true;
}
@ -1124,7 +1091,6 @@ public class Item extends AbstractWorldObject { @@ -1124,7 +1091,6 @@ public class Item extends AbstractWorldObject {
this.ownerID = 0;
this.ownerType = null;
this.containerType = Enum.ItemContainerType.INVENTORY;
this.stripCastableEnchants();
return true;
}
@ -1227,14 +1193,10 @@ public class Item extends AbstractWorldObject { @@ -1227,14 +1193,10 @@ public class Item extends AbstractWorldObject {
}
public final int getMagicValue() {
int val = this.calcMagicValue();
if(val == 0)
val = 1;
return val + this.getItemBase().getMagicValue();
return this.magicValue;
}
public int getBaseValue() {
if (this.getItemBase() != null)
return this.getItemBase().getBaseValue();
return 0;
@ -1278,9 +1240,7 @@ public class Item extends AbstractWorldObject { @@ -1278,9 +1240,7 @@ public class Item extends AbstractWorldObject {
continue;
}
AbstractPowerAction apa = PowersManager.getPowerActionByIDString(effect.getIDString());
if(apa != null)
apa.applyBakedInStatsForItem(this, this.getItemBase().getBakedInStats().get(token));
apa.applyBakedInStatsForItem(this, this.getItemBase().getBakedInStats().get(token));
}
}

149
src/engine/objects/ItemBase.java

@ -75,6 +75,7 @@ public class ItemBase { @@ -75,6 +75,7 @@ public class ItemBase {
private boolean isStrBased;
private ArrayList<Integer> animations = new ArrayList<>();
private ArrayList<Integer> offHandAnimations = new ArrayList<>();
private boolean autoID = false;
/**
* ResultSet Constructor
@ -144,6 +145,8 @@ public class ItemBase { @@ -144,6 +145,8 @@ public class ItemBase {
}
this.autoIDItemsCheck();
try {
DbManager.ItemBaseQueries.LOAD_ANIMATIONS(this);
} catch (Exception e) {
@ -229,79 +232,7 @@ public class ItemBase { @@ -229,79 +232,7 @@ public class ItemBase {
AnniverseryGifts.add(5101060);
AnniverseryGifts.add(5101080);
//fate peddler presents
AnniverseryGifts.add(971012);
AnniverseryGifts.add(971013);
AnniverseryGifts.add(971014);
AnniverseryGifts.add(971015);
AnniverseryGifts.add(971016);
AnniverseryGifts.add(971017);
AnniverseryGifts.add(971018);
AnniverseryGifts.add(971019);
AnniverseryGifts.add(971020);
AnniverseryGifts.add(971021);
AnniverseryGifts.add(971022);
AnniverseryGifts.add(971023);
}
public static int getDiscPrice(int uuid) {
if(uuid == 3040)
return 500000;
else return 10000000;
}
public static int getStatPrice(int uuid) {
switch(uuid){
case 250001: //5 stats
case 250010:
case 250019:
case 250028:
case 250037:
return 3000000;
case 250002: //10 stats
case 250011:
case 250020:
case 250029:
case 250038:
return 4000000;
case 250003: //15 stats
case 250012:
case 250021:
case 250030:
case 250039:
return 5000000;
case 250004: //20 stats
case 250013:
case 250022:
case 250031:
case 250040:
return 6000000;
case 250005: //25 stats
case 250014:
case 250023:
case 250032:
case 250041:
return 7000000;
case 250006: //30 stats
case 250015:
case 250024:
case 250033:
case 250042:
return 8000000;
case 250007: //35 stats
case 250016:
case 250025:
case 250034:
case 250043:
return 9000000;
case 250008: //40 stats
case 250017:
case 250026:
case 250035:
case 250044:
return 10000000;
}
return 10000000;
}
/*
@ -441,10 +372,74 @@ public class ItemBase { @@ -441,10 +372,74 @@ public class ItemBase {
return modTable;
}
public int getVendorType() {
return vendorType;
}
public void setVendorType(int vendorType) {
this.vendorType = vendorType;
}
public int getHashID() {
return hashID;
}
public void setHashID(int hashID) {
this.hashID = hashID;
}
private void autoIDItemsCheck() {
//AUto ID Vorg and Glass
switch (uuid) {
case 27550:
case 27560:
case 27580:
case 27590:
case 188500:
case 188510:
case 188520:
case 188530:
case 188540:
case 188550:
case 189100:
case 189110:
case 189120:
case 189130:
case 189140:
case 189150:
case 189510:
case 27600:
case 181840:
case 188700:
case 188720:
case 189550:
case 189560:
case 7000100:
case 7000110:
case 7000120:
case 7000130:
case 7000140:
case 7000150:
case 7000160:
case 7000170:
case 7000180:
case 7000190:
case 7000200:
case 7000210:
case 7000220:
case 7000230:
case 7000240:
case 7000250:
case 7000270:
case 7000280:
this.autoID = true;
break;
default:
this.autoID = false;
}
}
public boolean validForSkills(ConcurrentHashMap<String, CharacterSkill> skills) {
CharacterSkill characterSkill;
@ -911,4 +906,12 @@ public class ItemBase { @@ -911,4 +906,12 @@ public class ItemBase {
public void setOffHandAnimations(ArrayList<Integer> offHandAnimations) {
this.offHandAnimations = offHandAnimations;
}
public boolean isAutoID() {
return autoID;
}
public void setAutoID(boolean autoID) {
this.autoID = autoID;
}
}

53
src/engine/objects/ItemFactory.java

@ -73,7 +73,7 @@ public class ItemFactory { @@ -73,7 +73,7 @@ public class ItemFactory {
itemManager.updateInventory();
}
public static Item ResourceRoll(NPC npc, PlayerCharacter pc, int itemsToRoll, int itemID, int pToken, int sToken, String customName) {
public static Item fillForge(NPC npc, PlayerCharacter pc, int itemsToRoll, int itemID, int pToken, int sToken, String customName) {
String prefixString = "";
String suffixString = "";
@ -215,7 +215,7 @@ public class ItemFactory { @@ -215,7 +215,7 @@ public class ItemFactory {
pi.setAmount(itemsToRoll);
pi.setRandom(false);
ItemQueue produced = ItemQueue.borrow(pi, (long) time);
ItemQueue produced = ItemQueue.borrow(pi, (long) (time * Float.parseFloat(ConfigManager.MB_PRODUCTION_RATE.getValue())));
ItemProductionManager.send(produced);
return ml;
@ -410,7 +410,7 @@ public class ItemFactory { @@ -410,7 +410,7 @@ public class ItemFactory {
if (overdraft > 0 && !useWarehouse) {
if (pc != null)
ErrorPopupMsg.sendErrorMsg(pc, "Not enough gold in building strongbox. " + ib.getName());
ErrorPopupMsg.sendErrorMsg(pc, "Not enough gold in building strongbox." + ib.getName());
return null;
}
@ -707,7 +707,7 @@ public class ItemFactory { @@ -707,7 +707,7 @@ public class ItemFactory {
if (rollPrefix < 80) {
int randomPrefix = TableRoll(vendor.getLevel());
int randomPrefix = LootManager.TableRoll(vendor.getLevel(), false);
prefixEntry = ModTableEntry.rollTable(prefixTypeTable.modTableID, randomPrefix);
if (prefixEntry != null)
@ -722,7 +722,7 @@ public class ItemFactory { @@ -722,7 +722,7 @@ public class ItemFactory {
if (rollSuffix < 80 || prefixEntry == null) {
int randomSuffix = TableRoll(vendor.getLevel());
int randomSuffix = LootManager.TableRoll(vendor.getLevel(), false);
suffixEntry = ModTableEntry.rollTable(suffixTypeTable.modTableID, randomSuffix);
if (suffixEntry != null)
@ -774,43 +774,6 @@ public class ItemFactory { @@ -774,43 +774,6 @@ public class ItemFactory {
return toRoll;
}
public static int TableRoll(int vendorLevel) {
// Calculate min and max based on mobLevel
int min = 60;
int max = 120;
switch(vendorLevel){
case 20:
min = 70;
max = 140;
break;
case 30:
min = 80;
max = 160;
break;
case 40:
min = 90;
max = 180;
break;
case 50:
min = 100;
max = 200;
break;
case 60:
min = 175;
max = 260;
break;
case 70:
min = 220;
max = 320;
break;
}
int roll = ThreadLocalRandom.current().nextInt(min, max + 1);
return roll;
}
public static MobLoot produceRandomRoll(NPC npc, PlayerCharacter pc, String prefixString, String suffixString, int itemID) {
boolean useWarehouse = false;
@ -922,8 +885,8 @@ public class ItemFactory { @@ -922,8 +885,8 @@ public class ItemFactory {
ItemBase goldIB = ItemBase.getGoldItemBase();
//int baseCost = ib.getBaseValue();
int total = ib.getBaseValue();
int baseCost = ib.getBaseValue();
int total = (int) (baseCost + baseCost * .10);
EffectsBase suffix = null;
@ -936,7 +899,7 @@ public class ItemFactory { @@ -936,7 +899,7 @@ public class ItemFactory {
//calculate gold costs and remove from the warehouse
if (prefix != null || suffix != null) {
int costToCreate = ib.getBaseValue();
int costToCreate = (int) (ib.getBaseValue() + ib.getBaseValue() * .10f);
int buildingWithdraw = BuildingManager.GetWithdrawAmountForRolling(forge, costToCreate);
int overdraft = BuildingManager.GetOverdraft(forge, costToCreate);

7
src/engine/objects/MenuOption.java

@ -31,13 +31,6 @@ public class MenuOption extends AbstractGameObject { @@ -31,13 +31,6 @@ public class MenuOption extends AbstractGameObject {
this.prereq = rs.getInt("prereq");
}
public MenuOption(int id, String msg, int option){
this.menuID = id;
this.message = msg;
this.optionID = option;
this.prereq = 0;
}
/*
* Getters
*/

461
src/engine/objects/Mine.java

@ -10,11 +10,11 @@ @@ -10,11 +10,11 @@
package engine.objects;
import engine.Enum;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.WorldGrid;
import engine.gameManager.*;
import engine.math.Vector3f;
import engine.math.Vector3fImmutable;
import engine.gameManager.BuildingManager;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.ZoneManager;
import engine.net.ByteBufferWriter;
import engine.net.client.msg.ErrorPopupMsg;
import engine.server.MBServerStatics;
@ -25,9 +25,6 @@ import java.sql.ResultSet; @@ -25,9 +25,6 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import static engine.gameManager.DbManager.MineQueries;
@ -54,48 +51,20 @@ public class Mine extends AbstractGameObject { @@ -54,48 +51,20 @@ public class Mine extends AbstractGameObject {
private int buildingID;
private MineProduction mineType;
public int openHour;
public int openMinute;
public int capSize;
public LocalDateTime liveTime;
public final HashSet<Integer> _playerMemory = new HashSet<>();
public ArrayList<PlayerCharacter> affectedPlayers = new ArrayList<>();
//stronghold stuff
public boolean isStronghold = false;
public ArrayList<Mob> strongholdMobs;
public HashMap<Integer,Integer> oldBuildings;
/**
* ResultSet Constructor
*/
public Mine(ResultSet rs) throws SQLException, UnknownHostException {
super(rs);
if (rs.getInt("capSize") == 0) {
throw new IllegalArgumentException("Mine creation canceled: capSize cannot be 0");
}
this.mineType = MineProduction.getByName(rs.getString("mine_type"));
int ownerUID = rs.getInt("mine_ownerUID");
this.buildingID = rs.getInt("mine_buildingUID");
this.flags = rs.getInt("flags");
int parent = rs.getInt("parent");
if(ZoneManager.getZoneByUUID(parent) != null) {
this.parentZone = ZoneManager.getZoneByUUID(parent);
this.zoneName = this.parentZone.getParent().getName();
}else{
this.parentZone = ZoneManager.getSeaFloor();
if(this.parentZone.getParent() != null)
this.zoneName = this.parentZone.getParent().getName();
else
this.zoneName = "FAILED TO LOAD ZONE";
Logger.error("MINE FAILED TO LOAD PARENT: ");
Logger.error("MINE UID: " + rs.getInt("UID"));
Logger.error("MINE buildingID: " + buildingID);
}
this.parentZone = ZoneManager.getZoneByUUID(parent);
this.zoneName = this.parentZone.getParent().getName();
this.owningGuild = Guild.getGuild(ownerUID);
Guild nation = null;
@ -121,15 +90,7 @@ public class Mine extends AbstractGameObject { @@ -121,15 +90,7 @@ public class Mine extends AbstractGameObject {
this.production = Resource.valueOf(rs.getString("mine_resource"));
this.lastClaimer = null;
this.openHour = rs.getInt("mineLiveHour");
this.openMinute = rs.getInt("mineLiveMinute");
this.capSize = rs.getInt("capSize");
this.liveTime = LocalDateTime.now().withHour(this.openHour).withMinute(this.openMinute);
Building tower = BuildingManager.getBuildingFromCache(this.buildingID);
if(tower != null){
tower.setMaxHitPoints(5000f * this.capSize);
tower.setCurrentHitPoints(tower.healthMax);
}
}
public static void releaseMineClaims(PlayerCharacter playerCharacter) {
@ -182,10 +143,8 @@ public class Mine extends AbstractGameObject { @@ -182,10 +143,8 @@ public class Mine extends AbstractGameObject {
ArrayList<Mine> serverMines = MineQueries.GET_ALL_MINES_FOR_SERVER();
for (Mine mine : serverMines) {
if(mine.capSize != 0) {
Mine.mineMap.put(mine, mine.buildingID);
Mine.towerMap.put(mine.buildingID, mine);
}
Mine.mineMap.put(mine, mine.buildingID);
Mine.towerMap.put(mine.buildingID, mine);
}
} catch (Exception e) {
@ -202,58 +161,56 @@ public class Mine extends AbstractGameObject { @@ -202,58 +161,56 @@ public class Mine extends AbstractGameObject {
}
public static void serializeForClientMsg(Mine mine, ByteBufferWriter writer) {
try {
writer.putInt(mine.getObjectType().ordinal());
writer.putInt(mine.getObjectUUID());
writer.putInt(mine.getObjectUUID()); //actually a hash of mine
if(mine.isStronghold){
writer.putString("STRONGHOLD");
writer.putString("");
}else {
writer.putString(mine.mineType.name);
writer.putString(mine.capSize + " Man ");
}
//writer.putString(mine.zoneName + " " + mine.capSize + " Man ");
writer.putInt(mine.production.hash);
writer.putInt(mine.production.baseProduction);
writer.putInt(mine.getModifiedProductionAmount()); //TODO calculate range penalty here
writer.putInt(3600); //window in seconds
LocalDateTime mineOpenTime = LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute).withSecond(0).withNano(0);
writer.putLocalDateTime(mineOpenTime);
writer.putLocalDateTime(mineOpenTime.plusMinutes(30));
writer.put(mine.isActive ? (byte) 0x01 : (byte) 0x00);
Building mineTower = BuildingManager.getBuilding(mine.buildingID);
if (mineTower != null) {
writer.putFloat(mineTower.getLoc().x);
writer.putFloat(mineTower.getParentZone().getLoc().y);
writer.putFloat(mineTower.getLoc().z);
} else {
writer.putFloat(mine.parentZone.getLoc().x);
writer.putFloat(mine.parentZone.getLoc().y);
writer.putFloat(mine.parentZone.getLoc().z);
Logger.error("Mine Tower Was Null For Mine: " + mine.getObjectUUID());
}
writer.putInt(mine.getObjectType().ordinal());
writer.putInt(mine.getObjectUUID());
writer.putInt(mine.getObjectUUID()); //actually a hash of mine
writer.putString(mine.mineType.name);
writer.putString(mine.zoneName);
writer.putInt(mine.production.hash);
writer.putInt(mine.production.baseProduction);
writer.putInt(mine.getModifiedProductionAmount()); //TODO calculate range penalty here
writer.putInt(3600); //window in seconds
// Errant mines are currently open. Set time to now.
LocalDateTime mineOpenTime = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0);
// Mine times are those of the nation not individual guild.
Guild mineNatonGuild = mine.getOwningGuild().getNation();
// Adjust the serialized mine time based upon whether
// the Guild's mine window has passed or not and if it was claimed.
// If a mine is active serialize current datetime irrespective
// of any claim.
if (mineNatonGuild.isEmptyGuild() == false && mine.isActive == false) {
int guildWOO = mineNatonGuild.getNation().getMineTime();
LocalDateTime guildMineTime = mineOpenTime.withHour(guildWOO);
if (mineOpenTime.isAfter(guildMineTime) || mine.wasClaimed == true)
mineOpenTime = guildMineTime.plusDays(1);
else
mineOpenTime = guildMineTime;
writer.putInt(mine.isExpansion() ? mine.mineType.xpacHash : mine.mineType.hash);
if (mine.isStronghold) {
writer.putString("");
GuildTag._serializeForDisplay(Guild.getErrantGuild().getGuildTag(), writer);
writer.putString("");
GuildTag._serializeForDisplay(Guild.getErrantGuild().getGuildTag(), writer);
}else {
writer.putString(mine.guildName);
GuildTag._serializeForDisplay(mine.guildTag, writer);
writer.putString(mine.nationName);
GuildTag._serializeForDisplay(mine.nationTag, writer);
}
} catch (Exception e) {
Logger.error("Failed TO Serialize Mine Because: " + e.getMessage());
}
writer.putLocalDateTime(mineOpenTime);
writer.putLocalDateTime(mineOpenTime.plusHours(1));
writer.put(mine.isActive ? (byte) 0x01 : (byte) 0x00);
Building mineTower = BuildingManager.getBuilding(mine.buildingID);
writer.putFloat(mineTower.getLoc().x);
writer.putFloat(mineTower.getParentZone().getLoc().y);
writer.putFloat(mineTower.getLoc().z);
writer.putInt(mine.isExpansion() ? mine.mineType.xpacHash : mine.mineType.hash);
writer.putString(mine.guildName);
GuildTag._serializeForDisplay(mine.guildTag, writer);
writer.putString(mine.nationName);
GuildTag._serializeForDisplay(mine.nationTag, writer);
}
public static ArrayList<Mine> getMinesForGuild(int guildID) {
@ -263,7 +220,8 @@ public class Mine extends AbstractGameObject { @@ -263,7 +220,8 @@ public class Mine extends AbstractGameObject {
// Only inactive mines are returned.
for (Mine mine : Mine.mineMap.keySet()) {
if (mine.owningGuild.getObjectUUID() == guildID)
if (mine.owningGuild.getObjectUUID() == guildID &&
mine.isActive == false)
mineList.add(mine);
}
return mineList;
@ -332,18 +290,24 @@ public class Mine extends AbstractGameObject { @@ -332,18 +290,24 @@ public class Mine extends AbstractGameObject {
if (treeRank < 1)
return false;
if (guildUnderMineLimit(playerGuild.getNation(), treeRank) == false) {
ErrorPopupMsg.sendErrorMsg(playerCharacter, "Your nation cannot support another mine.");
return false;
}
return true;
}
public static ArrayList<Mine> getMinesToTeleportTo(PlayerCharacter player) {
ArrayList<Mine> mines = new ArrayList<>();
for(Mine mine : Mine.getMines())
if(!mine.isActive)
if(mine.getOwningGuild() != null)
if(mine.getOwningGuild().getNation().equals(player.getGuild().getNation()))
mines.add(mine);
private static boolean guildUnderMineLimit(Guild playerGuild, int tolRank) {
int mineCnt = 0;
return mines;
mineCnt += Mine.getMinesForGuild(playerGuild.getObjectUUID()).size();
for (Guild guild : playerGuild.getSubGuildList())
mineCnt += Mine.getMinesForGuild(guild.getObjectUUID()).size();
return mineCnt <= tolRank;
}
public boolean changeProductionType(Resource resource) {
@ -414,24 +378,12 @@ public class Mine extends AbstractGameObject { @@ -414,24 +378,12 @@ public class Mine extends AbstractGameObject {
Building building = BuildingManager.getBuildingFromCache(this.buildingID);
if (building != null && !this.isActive)
building.isDeranking.compareAndSet(true, false);
if(!isAc){
for(PlayerCharacter player : this.affectedPlayers){
try {
player.ZergMultiplier = 1.0f;
} catch(Exception e){
//something went wrong resetting zerg multiplier, maybe player was deleted?
}
}
}
}
public boolean validForMine(Resource r) {
if (this.mineType == null) {
Logger.error("Mine Was Null Setting Resources for Mine: " + this.getObjectUUID());
if (this.mineType == null)
return false;
}
return this.mineType.validForMine(r);
return this.mineType.validForMine(r, this.isExpansion());
}
public void serializeForMineProduction(ByteBufferWriter writer) {
@ -442,10 +394,10 @@ public class Mine extends AbstractGameObject { @@ -442,10 +394,10 @@ public class Mine extends AbstractGameObject {
writer.putString(this.mineType.name);
writer.putString(this.zoneName);
writer.putInt(this.production.hash);
writer.putInt(this.getModifiedProductionAmount());
writer.putInt(this.production.baseProduction);
writer.putInt(this.getModifiedProductionAmount()); //TODO calculate range penalty here
writer.putInt(3600); //window in seconds
writer.putInt(this.mineType.hash);
writer.putInt(this.isExpansion() ? this.mineType.xpacHash : this.mineType.hash);
}
@Override
@ -586,236 +538,41 @@ public class Mine extends AbstractGameObject { @@ -586,236 +538,41 @@ public class Mine extends AbstractGameObject {
}
public int getModifiedProductionAmount() {
ItemBase resourceBase = ItemBase.getItemBase(this.production.UUID);
if(resourceBase == null)
return 0;
int value = resourceBase.getBaseValue();
int amount = 0;
switch(this.capSize){
case 3:
amount = 1800000;
break;
case 5:
amount = 3000000;
break;
case 10:
amount = 6000000;
break;
case 20:
amount = 12000000;
break;
//TODO Calculate Distance modifications.
//calculate base values.
int baseProduction = this.production.baseProduction;
float baseModValue = this.production.baseProduction * .1f;
float rankModValue = this.production.baseProduction * .0143f;
float totalModded = 0;
//get Mine Building.
Building mineBuilding = BuildingManager.getBuilding(this.buildingID);
if (mineBuilding == null)
return this.production.baseProduction;
for (AbstractCharacter harvester : mineBuilding.getHirelings().keySet()) {
totalModded += baseModValue;
totalModded += rankModValue * harvester.getRank();
}
if(this.production.UUID == 7)
value = 1;
amount = amount / value;
return amount;
}
public void onEnter() {
Building tower = BuildingManager.getBuildingFromCache(this.buildingID);
if(tower == null)
return;
// Gather current list of players within the zone bounds
HashSet<AbstractWorldObject> currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, Enum.CityBoundsType.GRID.extents, MBServerStatics.MASK_PLAYER);
HashMap<Guild,ArrayList<PlayerCharacter>> charactersByNation = new HashMap<>();
ArrayList<Guild> updatedNations = new ArrayList<>();
for (AbstractWorldObject playerObject : currentPlayers) {
if (playerObject == null)
continue;
PlayerCharacter player = (PlayerCharacter) playerObject;
if(this.affectedPlayers.contains(player) == false)
this.affectedPlayers.add(player);
if(!this._playerMemory.contains(player.getObjectUUID())){
this._playerMemory.add(player.getObjectUUID());
}
Guild nation = player.guild.getNation();
if(charactersByNation.containsKey(nation)){
if(!charactersByNation.get(nation).contains(player)) {
charactersByNation.get(nation).add(player);
if(!updatedNations.contains(nation)){
updatedNations.add(nation);
}
}
}else{
ArrayList<PlayerCharacter> players = new ArrayList<>();
players.add(player);
charactersByNation.put(nation,players);
if(!updatedNations.contains(nation)){
updatedNations.add(nation);
}
//add base production on top;
totalModded += baseProduction;
//skip distance check for expansion.
if (this.isExpansion())
return (int) totalModded;
if (this.owningGuild.isEmptyGuild() == false) {
if (this.owningGuild.getOwnedCity() != null) {
float distanceSquared = this.owningGuild.getOwnedCity().getLoc().distanceSquared2D(mineBuilding.getLoc());
if (distanceSquared > sqr(10000 * 3))
totalModded *= .25f;
else if (distanceSquared > sqr(10000 * 2))
totalModded *= .50f;
else if (distanceSquared > sqr(10000))
totalModded *= .75f;
}
}
for(Guild nation : updatedNations){
float multiplier = ZergManager.getCurrentMultiplier(charactersByNation.get(nation).size(),this.capSize);
for(PlayerCharacter player : charactersByNation.get(nation)){
player.ZergMultiplier = multiplier;
}
}
try
{
this.onExit(this._playerMemory);
}
catch(Exception ignored){
}
}
private void onExit(HashSet<Integer> currentMemory) {
Building tower = BuildingManager.getBuildingFromCache(this.buildingID);
if(tower == null)
return;
ArrayList<Integer>toRemove = new ArrayList<>();
HashSet<AbstractWorldObject> currentPlayers = WorldGrid.getObjectsInRangePartial(tower.loc, Enum.CityBoundsType.GRID.extents, MBServerStatics.MASK_PLAYER);
for(Integer id : currentMemory){
PlayerCharacter pc = PlayerCharacter.getPlayerCharacter(id);
if(currentPlayers.contains(pc) == false){
toRemove.add(id);
pc.ZergMultiplier = 1.0f;
}
}
// Remove players from city memory
_playerMemory.removeAll(toRemove);
}
public static Building getTower(Mine mine){
Building tower = BuildingManager.getBuildingFromCache(mine.buildingID);
if(tower != null)
return tower;
else
return null;
return (int) totalModded;
}
public static void serializeForClientMsgTeleport(Mine mine, ByteBufferWriter writer) {
AbstractCharacter guildRuler;
Guild rulingGuild;
Guild rulingNation;
java.time.LocalDateTime dateTime1900;
// Cities aren't a mine without a TOL. Time to early exit.
// No need to spam the log here as non-existant TOL's are indicated
// during bootstrap routines.
Building tower = Mine.getTower(mine);
if (tower == null) {
Logger.error("NULL TOWER FOR " + mine.zoneName + " mine");
return;
}
// Assign mine owner
if (tower.getOwner() != null)
guildRuler = tower.getOwner();
else
guildRuler = null;
// If is an errant tree, use errant guild for serialization.
// otherwise we serialize the soverign guild
if (guildRuler == null)
rulingGuild = Guild.getErrantGuild();
else
rulingGuild = guildRuler.getGuild();
rulingNation = rulingGuild.getNation();
// Begin Serialzing soverign guild data
writer.putInt(mine.getObjectType().ordinal());
writer.putInt(mine.getObjectUUID());
writer.putString(mine.zoneName + " Mine");
writer.putInt(rulingGuild.getObjectType().ordinal());
writer.putInt(rulingGuild.getObjectUUID());
writer.putString(rulingGuild.getName());
writer.putString("");
writer.putString(rulingGuild.getLeadershipType());
// Serialize guild ruler's name
// If tree is abandoned blank out the name
// to allow them a rename.
if (guildRuler == null)
writer.putString("");
else
writer.putString(guildRuler.getFirstName() + ' ' + guildRuler.getLastName());
writer.putInt(rulingGuild.getCharter());
writer.putInt(0); // always 00000000
writer.put((byte)0);
writer.put((byte) 1);
writer.put((byte) 1); // *** Refactor: What are these flags?
writer.put((byte) 1);
writer.put((byte) 1);
writer.put((byte) 1);
GuildTag._serializeForDisplay(rulingGuild.getGuildTag(), writer);
GuildTag._serializeForDisplay(rulingNation.getGuildTag(), writer);
writer.putInt(0);// TODO Implement description text
writer.put((byte) 1);
writer.put((byte) 0);
writer.put((byte) 1);
// Begin serializing nation guild info
if (rulingNation.isEmptyGuild()) {
writer.putInt(rulingGuild.getObjectType().ordinal());
writer.putInt(rulingGuild.getObjectUUID());
} else {
writer.putInt(rulingNation.getObjectType().ordinal());
writer.putInt(rulingNation.getObjectUUID());
}
// Serialize nation name
if (rulingNation.isEmptyGuild())
writer.putString("None");
else
writer.putString(rulingNation.getName());
writer.putInt(1);
writer.putInt(0xFFFFFFFF);
writer.putInt(0);
if (rulingNation.isEmptyGuild())
writer.putString(" ");
else
writer.putString(Guild.GetGL(rulingNation).getFirstName() + ' ' + Guild.GetGL(rulingNation).getLastName());
writer.putLocalDateTime(LocalDateTime.now());
if(tower != null) {
writer.putFloat(tower.loc.x);
writer.putFloat(tower.loc.y);
writer.putFloat(tower.loc.z);
} else{
writer.putFloat(0);
writer.putFloat(0);
writer.putFloat(0);
}
writer.putInt(0);
writer.put((byte) 1);
writer.put((byte) 0);
writer.putInt(0x64);
writer.put((byte) 0);
writer.put((byte) 0);
writer.put((byte) 0);
}
}

45
src/engine/objects/MineProduction.java

@ -13,19 +13,21 @@ import java.util.HashMap; @@ -13,19 +13,21 @@ import java.util.HashMap;
public enum MineProduction {
LUMBER("Lumber Camp", new HashMap<>(), 1618637196, 1663491950),
ORE("Ore Mine", new HashMap<>(), 518103023, -788976428),
MAGIC("Magic Mine", new HashMap<>(), 504746863, -1753567069),
GOLDMINE("Gold Mine", new HashMap<>(), -662193002, -1227205358);
LUMBER("Lumber Camp", new HashMap<>(), Resource.WORMWOOD, 1618637196, 1663491950),
ORE("Ore Mine", new HashMap<>(), Resource.OBSIDIAN, 518103023, -788976428),
GOLD("Gold Mine", new HashMap<>(), Resource.GALVOR, -662193002, -1227205358),
MAGIC("Magic Mine", new HashMap<>(), Resource.BLOODSTONE, 504746863, -1753567069);
public final String name;
public final HashMap<Integer, Resource> resources;
public final Resource xpac;
public final int hash;
public final int xpacHash;
MineProduction(String name, HashMap<Integer, Resource> resources,int hash, int xpacHash) {
MineProduction(String name, HashMap<Integer, Resource> resources, Resource xpac, int hash, int xpacHash) {
this.name = name;
this.resources = resources;
this.xpac = xpac;
this.hash = hash;
this.xpacHash = xpacHash;
}
@ -37,7 +39,6 @@ public enum MineProduction { @@ -37,7 +39,6 @@ public enum MineProduction {
MineProduction.LUMBER.resources.put(1580005, Resource.OAK);
MineProduction.LUMBER.resources.put(1580006, Resource.BRONZEWOOD);
MineProduction.LUMBER.resources.put(1580007, Resource.MANDRAKE);
MineProduction.LUMBER.resources.put(1580018, Resource.WORMWOOD);
}
if (MineProduction.ORE.resources.size() == 0) {
MineProduction.ORE.resources.put(7, Resource.GOLD);
@ -45,16 +46,14 @@ public enum MineProduction { @@ -45,16 +46,14 @@ public enum MineProduction {
MineProduction.ORE.resources.put(1580001, Resource.TRUESTEEL);
MineProduction.ORE.resources.put(1580002, Resource.IRON);
MineProduction.ORE.resources.put(1580003, Resource.ADAMANT);
MineProduction.ORE.resources.put(1580019, Resource.OBSIDIAN);
}
if (MineProduction.GOLDMINE.resources.size() == 0) {
MineProduction.GOLDMINE.resources.put(7, Resource.GOLD);
MineProduction.GOLDMINE.resources.put(1580000, Resource.STONE);
MineProduction.GOLDMINE.resources.put(1580008, Resource.COAL);
MineProduction.GOLDMINE.resources.put(1580009, Resource.AGATE);
MineProduction.GOLDMINE.resources.put(1580010, Resource.DIAMOND);
MineProduction.GOLDMINE.resources.put(1580011, Resource.ONYX);
MineProduction.GOLDMINE.resources.put(1580017, Resource.GALVOR);
if (MineProduction.GOLD.resources.size() == 0) {
MineProduction.GOLD.resources.put(7, Resource.GOLD);
MineProduction.GOLD.resources.put(1580000, Resource.STONE);
MineProduction.GOLD.resources.put(1580008, Resource.COAL);
MineProduction.GOLD.resources.put(1580009, Resource.AGATE);
MineProduction.GOLD.resources.put(1580010, Resource.DIAMOND);
MineProduction.GOLD.resources.put(1580011, Resource.ONYX);
}
if (MineProduction.MAGIC.resources.size() == 0) {
MineProduction.MAGIC.resources.put(7, Resource.GOLD);
@ -63,25 +62,27 @@ public enum MineProduction { @@ -63,25 +62,27 @@ public enum MineProduction {
MineProduction.MAGIC.resources.put(1580014, Resource.ANTIMONY);
MineProduction.MAGIC.resources.put(1580015, Resource.SULFUR);
MineProduction.MAGIC.resources.put(1580016, Resource.QUICKSILVER);
MineProduction.MAGIC.resources.put(1580020, Resource.BLOODSTONE);
}
}
public static MineProduction getByName(String name) {
if (name.equalsIgnoreCase("lumber"))
if (name.toLowerCase().equals("lumber"))
return MineProduction.LUMBER;
else if (name.equalsIgnoreCase("ore"))
else if (name.toLowerCase().equals("ore"))
return MineProduction.ORE;
else if (name.equalsIgnoreCase("gold"))
return MineProduction.GOLDMINE;
else if (name.toLowerCase().equals("gold"))
return MineProduction.GOLD;
else
return MineProduction.MAGIC;
}
public boolean validForMine(Resource r) {
public boolean validForMine(Resource r, boolean isXpac) {
if (r == null)
return false;
return this.resources.containsKey(r.UUID);
if (this.resources.containsKey(r.UUID))
return true;
else
return isXpac && r.UUID == this.xpac.UUID;
}

484
src/engine/objects/Mob.java

@ -12,7 +12,6 @@ package engine.objects; @@ -12,7 +12,6 @@ package engine.objects;
import ch.claude_martin.enumbitset.EnumBitSet;
import engine.Enum;
import engine.Enum.*;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.WorldGrid;
import engine.exception.SerializationException;
import engine.gameManager.*;
@ -49,7 +48,6 @@ import static engine.net.client.msg.ErrorPopupMsg.sendErrorPopup; @@ -49,7 +48,6 @@ import static engine.net.client.msg.ErrorPopupMsg.sendErrorPopup;
public class Mob extends AbstractIntelligenceAgent {
public static ArrayList<Mob> discDroppers = new ArrayList<>();
private static final ReentrantReadWriteLock createLock = new ReentrantReadWriteLock();
private static final ConcurrentHashMap<Integer, Mob> mobMapByDBID = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
// Variables NOT to be stored in db
@ -102,14 +100,6 @@ public class Mob extends AbstractIntelligenceAgent { @@ -102,14 +100,6 @@ public class Mob extends AbstractIntelligenceAgent {
private DeferredPowerJob weaponPower;
private DateTime upgradeDateTime = null;
private boolean lootSync = false;
public boolean StrongholdCommander = false;
public boolean StrongholdGuardian = false;
public Mine stronghold = null;
public boolean StrongholdEpic = false;
public boolean isDropper = false;
/**
@ -274,7 +264,7 @@ public class Mob extends AbstractIntelligenceAgent { @@ -274,7 +264,7 @@ public class Mob extends AbstractIntelligenceAgent {
this.notEnemy = EnumBitSet.asEnumBitSet(rs.getLong("notEnemy"), Enum.MonsterType.class);
this.enemy = EnumBitSet.asEnumBitSet(rs.getLong("enemy"), Enum.MonsterType.class);
this.firstName = rs.getString("mob_name");
this.isDropper = rs.getInt("is_dropper") == 1;
if (this.firstName.isEmpty())
this.firstName = this.mobBase.getFirstName();
@ -298,12 +288,6 @@ public class Mob extends AbstractIntelligenceAgent { @@ -298,12 +288,6 @@ public class Mob extends AbstractIntelligenceAgent {
Logger.error("Mobile:" + this.dbID + ": " + e);
}
if(this.firstName.toLowerCase().equals("guardian commander") || this.firstName.toLowerCase().equals("elite guardian")|| this.firstName.toLowerCase().equals("guardian")|| this.firstName.toLowerCase().equals("commander")){
this.despawn();
this.removeFromCache();
DbManager.MobQueries.DELETE_MOB(this);
}
}
public static void serializeMobForClientMsgOtherPlayer(Mob mob, ByteBufferWriter writer) throws SerializationException {
@ -576,32 +560,6 @@ public class Mob extends AbstractIntelligenceAgent { @@ -576,32 +560,6 @@ public class Mob extends AbstractIntelligenceAgent {
return mob;
}
public static Mob createStrongholdMob(int loadID, Vector3fImmutable spawn, Guild guild, boolean isMob, Zone parent, Building building, int contractID, String pirateName, int level) {
// Create a new Mob instance
Mob mobWithoutID = new Mob(pirateName, "", (short) 0, (short) 0, (short) 0, (short) 0, (short) 0, (short) 1, 0, false, false, false, spawn, spawn, Vector3fImmutable.ZERO, (short) 1, (short) 1, (short) 1, guild, (byte) 0, loadID, isMob, parent, building, contractID);
// Check if mobBase is null
if (mobWithoutID.mobBase == null)
return null;
// Set mob level
mobWithoutID.level = (short) level;
// Set the parent zone and parentZoneID
mobWithoutID.parentZone = parent;
mobWithoutID.parentZoneID = parent.getObjectUUID();
// If the mob is in a building, bind it to zero position
if (mobWithoutID.building != null)
mobWithoutID.bindLoc = Vector3fImmutable.ZERO;
// Avoid database actions and directly return the created mobWithoutID
mobWithoutID.setObjectTypeMask(MBServerStatics.MASK_MOB | mobWithoutID.getTypeMasks());
return mobWithoutID;
}
public static Mob createPet(int loadID, Guild guild, Zone parent, PlayerCharacter owner, short level) {
MobBase mobBase = MobBase.getMobBase(loadID);
Mob mob = null;
@ -616,11 +574,11 @@ public class Mob extends AbstractIntelligenceAgent { @@ -616,11 +574,11 @@ public class Mob extends AbstractIntelligenceAgent {
mob = new Mob(mobBase, guild, parent, level, owner, 0);
if (mob.mobBase == null)
return null;
mob.runAfterLoad();
Vector3fImmutable loc = owner.getLoc();
DbManager.addToCache(mob);
mob.setPet(owner, true);
mob.setWalkMode(false);
mob.runAfterLoad();
} catch (Exception e) {
Logger.error(e);
@ -1257,10 +1215,6 @@ public class Mob extends AbstractIntelligenceAgent { @@ -1257,10 +1215,6 @@ public class Mob extends AbstractIntelligenceAgent {
@Override
public void killCharacter(AbstractCharacter attacker) {
if(this.StrongholdGuardian || this.StrongholdCommander) {
ChatManager.chatSystemChannel(this.parentZone.getParent().getName() + "'s Stronghold Is Under Attack!");
StrongholdManager.CheckToEndStronghold(this.stronghold);
}
this.stopMovement(this.getMovementLoc());
@ -1313,7 +1267,7 @@ public class Mob extends AbstractIntelligenceAgent { @@ -1313,7 +1267,7 @@ public class Mob extends AbstractIntelligenceAgent {
}
setLoc(newLoc);
this.region = Regions.GetRegionForTeleport(this.loc);//AbstractWorldObject.GetRegionByWorldObject(this);
this.region = AbstractWorldObject.GetRegionByWorldObject(this);
//Next update will be end Loc, lets stop him here.
}
@ -1327,6 +1281,8 @@ public class Mob extends AbstractIntelligenceAgent { @@ -1327,6 +1281,8 @@ public class Mob extends AbstractIntelligenceAgent {
Dispatch dispatch;
try {
//resync corpses
//this.setLoc(this.getMovementLoc());
if (this.isSiege) {
this.deathTime = System.currentTimeMillis();
//this.state = STATE.Dead;
@ -1406,8 +1362,6 @@ public class Mob extends AbstractIntelligenceAgent { @@ -1406,8 +1362,6 @@ public class Mob extends AbstractIntelligenceAgent {
Logger.error(e);
}
this.updateLocation();
//resync corpses
InterestManager.setObjectDirty(this);
}
public void respawn() {
@ -1442,8 +1396,6 @@ public class Mob extends AbstractIntelligenceAgent { @@ -1442,8 +1396,6 @@ public class Mob extends AbstractIntelligenceAgent {
loadInventory();
this.updateLocation();
this.stopPatrolTime = 0;
this.lastPatrolPointIndex = 0;
}
public void despawn() {
@ -1452,10 +1404,6 @@ public class Mob extends AbstractIntelligenceAgent { @@ -1452,10 +1404,6 @@ public class Mob extends AbstractIntelligenceAgent {
WorldGrid.RemoveWorldObject(this);
this.charItemManager.clearInventory();
if(this.StrongholdEpic && this.stronghold != null && this.stronghold.isActive)
this.stronghold.isActive = false;
//StrongholdManager.EndStronghold(this.stronghold);
}
@Override
@ -1517,31 +1465,11 @@ public class Mob extends AbstractIntelligenceAgent { @@ -1517,31 +1465,11 @@ public class Mob extends AbstractIntelligenceAgent {
} catch (Exception e) {
Logger.error(e.getMessage());
}
if(this.StrongholdCommander || this.StrongholdGuardian || this.StrongholdEpic){
this.setResists(new Resists("Elite"));
}else if(Mob.discDroppers.contains(this)) {
this.setResists(new Resists("Dropper"));
} else if(this.isDropper){
this.setResists(new Resists("Dropper"));
} else{
this.setResists(new Resists());
}
this.resists.calculateResists(this, false);
Resists.calculateResists(this);
}
public void calculateMaxHealthManaStamina() {
if(this.StrongholdCommander){
this.healthMax = 50000;
return;
} else if(this.StrongholdGuardian){
this.healthMax = 12500;
return;
} else if(this.StrongholdEpic){
this.healthMax = 250000;
return;
}
float h;
float m;
float s;
@ -1599,151 +1527,82 @@ public class Mob extends AbstractIntelligenceAgent { @@ -1599,151 +1527,82 @@ public class Mob extends AbstractIntelligenceAgent {
public void calculateAtrDefenseDamage() {
if(this.StrongholdCommander){
this.maxDamageHandOne = 3500;
this.minDamageHandOne = 1500;
int atr = 3500;
int defense = 3500;
if (this.bonuses != null) {
defense = GetDefense(defense, this);
atr = GetAttackRating(atr, this);
}
this.defenseRating = defense;
this.atrHandOne = atr;
return;
} else if(this.StrongholdGuardian){
this.maxDamageHandOne = 1550;
this.minDamageHandOne = 750;
int atr = 1800;
int defense = 2200;
if (this.bonuses != null) {
defense = GetDefense(defense, this);
atr = GetAttackRating(atr, this);
}
this.defenseRating = defense;
this.atrHandOne = atr;
return;
} else if(this.StrongholdEpic){
this.maxDamageHandOne = 5000;
this.minDamageHandOne = 2500;
int atr = 5000;
int defense = 3500;
if (this.bonuses != null) {
defense = GetDefense(defense, this);
atr = GetAttackRating(atr, this);
}
this.defenseRating = defense;
this.atrHandOne = atr;
if (this.charItemManager == null || this.equip == null) {
Logger.error("Player " + currentID + " missing skills or equipment");
defaultAtrAndDamage(true);
defaultAtrAndDamage(false);
this.defenseRating = 0;
return;
}else {
if (this.charItemManager == null || this.equip == null) {
Logger.error("Player " + currentID + " missing skills or equipment");
defaultAtrAndDamage(true);
defaultAtrAndDamage(false);
this.defenseRating = 0;
return;
}
try {
calculateAtrDamageForWeapon(this.equip.get(MBServerStatics.SLOT_MAINHAND), true);
} catch (Exception e) {
this.atrHandOne = GetAttackRating(this.mobBase.getAttackRating(), this);
this.minDamageHandOne = (short) this.mobBase.getDamageMin();
this.maxDamageHandOne = (short) this.mobBase.getDamageMax();
this.rangeHandOne = 6.5f;
this.speedHandOne = 20;
Logger.info("Mobbase ID " + this.getMobBaseID() + " returned an error. setting to default ATR and Damage." + e.getMessage());
}
try {
calculateAtrDamageForWeapon(this.equip.get(MBServerStatics.SLOT_OFFHAND), false);
} catch (Exception e) {
}
this.atrHandTwo = GetAttackRating(this.mobBase.getAttackRating(), this);
this.minDamageHandTwo = (short) this.mobBase.getDamageMin();
this.maxDamageHandTwo = (short) this.mobBase.getDamageMax();
this.rangeHandTwo = 6.5f;
this.speedHandTwo = 20;
Logger.info("Mobbase ID " + this.getMobBaseID() + " returned an error. setting to default ATR and Damage." + e.getMessage());
}
try {
calculateAtrDamageForWeapon(this.equip.get(MBServerStatics.SLOT_MAINHAND), true);
} catch (Exception e) {
try {
float defense = this.mobBase.getDefenseRating();
defense += getShieldDefense(equip.get(MBServerStatics.SLOT_OFFHAND));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_HELMET));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_CHEST));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_ARMS));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_GLOVES));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_LEGGINGS));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_FEET));
defense += getWeaponDefense(equip);
// TODO add error log here
if (this.bonuses != null) {
defense = GetDefense((int) defense, this);
} else
Logger.error("Error: missing bonuses");
defense = (defense < 1) ? 1 : defense;
this.defenseRating = (short) (defense + 0.5f);
} catch (Exception e) {
Logger.info("Mobbase ID " + this.getMobBaseID() + " returned an error. Setting to Default Defense." + e.getMessage());
this.defenseRating = (short) this.mobBase.getDefense();
}
// calculate defense for equipment
}
if(this.isDropper || Mob.discDroppers.contains(this)){
this.defenseRating *= 2;
this.atrHandOne *= 2;
this.atrHandTwo *= 2;
this.minDamageHandOne *= 2;
this.minDamageHandTwo *= 2;
this.maxDamageHandOne *= 2;
this.maxDamageHandTwo *= 2;
this.atrHandOne = (short) this.mobBase.getAttackRating();
this.minDamageHandOne = (short) this.mobBase.getMinDmg();
this.maxDamageHandOne = (short) this.mobBase.getMaxDmg();
this.rangeHandOne = 6.5f;
this.speedHandOne = 20;
Logger.info("Mobbase ID " + this.getMobBaseID() + " returned an error. setting to default ATR and Damage." + e.getMessage());
}
}
public static int GetDefense(int defense, Mob mob){
// add any bonuses
defense += (short) mob.bonuses.getFloat(ModType.DCV, SourceType.None);
try {
calculateAtrDamageForWeapon(this.equip.get(MBServerStatics.SLOT_OFFHAND), false);
// Finally, multiply any percent modifiers. DO THIS LAST!
} catch (Exception e) {
float pos_Bonus = 1 + mob.bonuses.getFloatPercentPositive(ModType.DCV, SourceType.None);
this.atrHandTwo = (short) this.mobBase.getAttackRating();
this.minDamageHandTwo = (short) this.mobBase.getMinDmg();
this.maxDamageHandTwo = (short) this.mobBase.getMaxDmg();
this.rangeHandTwo = 6.5f;
this.speedHandTwo = 20;
Logger.info("Mobbase ID " + this.getMobBaseID() + " returned an error. setting to default ATR and Damage." + e.getMessage());
}
try {
float defense = this.mobBase.getDefenseRating();
defense += getShieldDefense(equip.get(MBServerStatics.SLOT_OFFHAND));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_HELMET));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_CHEST));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_ARMS));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_GLOVES));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_LEGGINGS));
defense += getArmorDefense(equip.get(MBServerStatics.SLOT_FEET));
defense += getWeaponDefense(equip);
// TODO add error log here
if (this.bonuses != null) {
defense = (short) (defense * pos_Bonus);
// add any bonuses
//Lucky rune applies next
defense += (short) this.bonuses.getFloat(ModType.DCV, SourceType.None);
float neg_Bonus = mob.bonuses.getFloatPercentNegative(ModType.DCV, SourceType.None);
return (int) (defense * (1 + neg_Bonus));
}
// Finally, multiply any percent modifiers. DO THIS LAST!
public static int GetAttackRating(int attackRating, Mob mob){
// add any bonuses
float pos_Bonus = 1 + this.bonuses.getFloatPercentPositive(ModType.DCV, SourceType.None);
attackRating += (short) mob.bonuses.getFloat(ModType.OCV, SourceType.None);
// Finally, multiply any percent modifiers. DO THIS LAST!
defense = (short) (defense * pos_Bonus);
float pos_Bonus = 1 + mob.bonuses.getFloatPercentPositive(ModType.OCV, SourceType.None);
//Lucky rune applies next
float neg_Bonus = this.bonuses.getFloatPercentNegative(ModType.DCV, SourceType.None);
defense = (short) (defense * (1 + neg_Bonus));
attackRating = (short) (attackRating * pos_Bonus);
//Lucky rune applies next
} else
Logger.error("Error: missing bonuses");
float neg_Bonus = mob.bonuses.getFloatPercentNegative(ModType.OCV, SourceType.None);
return (int) (attackRating * (1 + neg_Bonus));
defense = (defense < 1) ? 1 : defense;
this.defenseRating = (short) (defense + 0.5f);
} catch (Exception e) {
Logger.info("Mobbase ID " + this.getMobBaseID() + " returned an error. Setting to Default Defense." + e.getMessage());
this.defenseRating = (short) this.mobBase.getDefense();
}
// calculate defense for equipment
}
private float getWeaponDefense(HashMap<Integer, MobEquipment> equipped) {
MobEquipment weapon = equipped.get(MBServerStatics.SLOT_MAINHAND);
@ -1842,46 +1701,168 @@ public class Mob extends AbstractIntelligenceAgent { @@ -1842,46 +1701,168 @@ public class Mob extends AbstractIntelligenceAgent {
private void calculateAtrDamageForWeapon(MobEquipment weapon, boolean mainHand) {
if(mainHand){
int min = (int)this.mobBase.getDamageMin();
int max = (int)this.mobBase.getDamageMax();
int atr = this.mobBase.getAtr();
if(this.bonuses != null){
min *= 1 + this.bonuses.getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
max *= 1 + this.bonuses.getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
atr *= 1 + this.bonuses.getFloatPercentAll(ModType.OCV,SourceType.None);
atr += this.bonuses.getFloat(ModType.OCV,SourceType.None);
}
this.minDamageHandOne = min;
this.maxDamageHandOne = max;
this.atrHandOne = atr;
if(weapon == null){
int baseStrength = 0;
float skillPercentage, masteryPercentage;
float mastDam;
// make sure weapon exists
boolean noWeapon = false;
ItemBase wb = null;
if (weapon == null)
noWeapon = true;
else {
ItemBase ib = weapon.getItemBase();
if (ib == null)
noWeapon = true;
else if (ib.getType().equals(ItemType.WEAPON) == false) {
defaultAtrAndDamage(mainHand);
return;
} else
wb = ib;
}
float min, max;
float speed;
boolean strBased = false;
// get skill percentages and min and max damage for weapons
if (noWeapon) {
if (mainHand)
this.rangeHandOne = this.mobBase.getAttackRange();
this.speedHandTwo = 20.0f;
}else{
this.rangeHandOne = weapon.getItemBase().getRange();
this.speedHandTwo = weapon.getItemBase().getSpeed();
}
}else{
int min = (int)this.mobBase.getDamageMin();
int max = (int)this.mobBase.getDamageMax();
int atr = this.mobBase.getAtr();
if(this.bonuses != null){
min *= 1 + this.bonuses.getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
max *= 1 + this.bonuses.getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None);
atr *= 1 + this.bonuses.getFloatPercentAll(ModType.OCV,SourceType.None);
atr += this.bonuses.getFloat(ModType.OCV,SourceType.None);
}
this.minDamageHandTwo = min;
this.maxDamageHandTwo = max;
this.atrHandTwo = atr;
if(weapon == null){
this.rangeHandTwo = this.mobBase.getAttackRange();
this.speedHandTwo = 20.0f;
}else{
this.rangeHandTwo = weapon.getItemBase().getRange();
this.speedHandTwo = weapon.getItemBase().getSpeed();
}
else
this.rangeHandTwo = -1; // set to do not attack
skillPercentage = getModifiedAmount(this.skills.get("Unarmed Combat"));
masteryPercentage = getModifiedAmount(this.skills.get("Unarmed Combat Mastery"));
if (masteryPercentage == 0f)
mastDam = CharacterSkill.getQuickMastery(this, "Unarmed Combat Mastery");
else
mastDam = masteryPercentage;
// TODO Correct these
min = this.mobBase.getMinDmg();
max = this.mobBase.getMaxDmg();
} else {
if (mainHand)
this.rangeHandOne = weapon.getItemBase().getRange() * (1 + (baseStrength / 600.0f));
else
this.rangeHandTwo = weapon.getItemBase().getRange() * (1 + (baseStrength / 600.0f));
skillPercentage = getModifiedAmount(this.skills.get(wb.getSkillRequired()));
masteryPercentage = getModifiedAmount(this.skills.get(wb.getMastery()));
if (masteryPercentage == 0f)
mastDam = 0f;
else
mastDam = masteryPercentage;
min = wb.getMinDamage();
max = wb.getMaxDamage();
strBased = wb.isStrBased();
}
// calculate atr
float atr = this.mobBase.getAttackRating();
if (this.statStrCurrent > this.statDexCurrent)
atr += statStrCurrent * .5;
else
atr += statDexCurrent * .5;
// add in any bonuses to atr
if (this.bonuses != null) {
atr += this.bonuses.getFloat(ModType.OCV, SourceType.None);
// Finally use any multipliers. DO THIS LAST!
float pos_Bonus = 1 + this.bonuses.getFloatPercentPositive(ModType.OCV, SourceType.None);
atr *= pos_Bonus;
//and negative percent modifiers
//TODO DO DEBUFFS AFTER?? wILL TEst when finished
float neg_Bonus = this.bonuses.getFloatPercentNegative(ModType.OCV, SourceType.None);
atr *= (1 + neg_Bonus);
}
atr = (atr < 1) ? 1 : atr;
// set atr
if (mainHand)
this.atrHandOne = (short) (atr + 0.5f);
else
this.atrHandTwo = (short) (atr + 0.5f);
//calculate speed
if (wb != null)
speed = wb.getSpeed();
else
speed = 20f; //unarmed attack speed
if (this.bonuses != null && this.bonuses.getFloat(ModType.AttackDelay, SourceType.None) != 0f) //add effects speed bonus
speed *= (1 + this.bonuses.getFloatPercentAll(ModType.AttackDelay, SourceType.None));
if (speed < 10)
speed = 10;
//add min/max damage bonuses for weapon **REMOVED
//if duel wielding, cut damage by 30%
// calculate damage
float minDamage;
float maxDamage;
float pri = (strBased) ? (float) this.statStrCurrent : (float) this.statDexCurrent;
float sec = (strBased) ? (float) this.statDexCurrent : (float) this.statStrCurrent;
minDamage = (float) (min * ((0.0315f * Math.pow(pri, 0.75f)) + (0.042f * Math.pow(sec, 0.75f)) + (0.01f * ((int) skillPercentage + (int) mastDam))));
maxDamage = (float) (max * ((0.0785f * Math.pow(pri, 0.75f)) + (0.016f * Math.pow(sec, 0.75f)) + (0.0075f * ((int) skillPercentage + (int) mastDam))));
minDamage = (float) ((int) (minDamage + 0.5f)); //round to nearest decimal
maxDamage = (float) ((int) (maxDamage + 0.5f)); //round to nearest decimal
//add Base damage last.
float minDamageMod = this.mobBase.getDamageMin();
float maxDamageMod = this.mobBase.getDamageMax();
minDamage += minDamageMod;
maxDamage += maxDamageMod;
// add in any bonuses to damage
if (this.bonuses != null) {
// Add any base bonuses
minDamage += this.bonuses.getFloat(ModType.MinDamage, SourceType.None);
maxDamage += this.bonuses.getFloat(ModType.MaxDamage, SourceType.None);
// Finally use any multipliers. DO THIS LAST!
minDamage *= (1 + this.bonuses.getFloatPercentAll(ModType.MinDamage, SourceType.None));
maxDamage *= (1 + this.bonuses.getFloatPercentAll(ModType.MaxDamage, SourceType.None));
}
// set damages
if (mainHand) {
this.minDamageHandOne = (short) minDamage;
this.maxDamageHandOne = (short) maxDamage;
this.speedHandOne = 30;
} else {
this.minDamageHandTwo = (short) minDamage;
this.maxDamageHandTwo = (short) maxDamage;
this.speedHandTwo = 30;
}
}
@ -1948,13 +1929,6 @@ public class Mob extends AbstractIntelligenceAgent { @@ -1948,13 +1929,6 @@ public class Mob extends AbstractIntelligenceAgent {
this.charItemManager = new CharacterItemManager(this);
this.loadInventory();
if(this.isDropper){
this.setLevel((short)65);
this.setResists(new Resists("Dropper"));
this.atrHandOne *= 2;
this.atrHandTwo *= 2;
}
try {
if (this.equipmentSetID != 0)
this.equip = MobBase.loadEquipmentSet(this.equipmentSetID);
@ -1995,7 +1969,6 @@ public class Mob extends AbstractIntelligenceAgent { @@ -1995,7 +1969,6 @@ public class Mob extends AbstractIntelligenceAgent {
try {
NPCManager.applyRuneSetEffects(this);
MobBase.applyMobbaseEffects(this);
recalculateStats();
this.setHealth(this.healthMax);
@ -2047,7 +2020,6 @@ public class Mob extends AbstractIntelligenceAgent { @@ -2047,7 +2020,6 @@ public class Mob extends AbstractIntelligenceAgent {
}
this.deathTime = 0;
InterestManager.setObjectDirty(this);
} catch (Exception e) {
Logger.error(e.getMessage());
}
@ -2291,9 +2263,5 @@ public class Mob extends AbstractIntelligenceAgent { @@ -2291,9 +2263,5 @@ public class Mob extends AbstractIntelligenceAgent {
}
}
}
public static void AddDiscDropper(Mob mob){
discDroppers.add(mob);
mob.setLevel((short)65);
mob.setResists(new Resists("Dropper"));
}
}

23
src/engine/objects/MobBase.java

@ -13,11 +13,8 @@ import ch.claude_martin.enumbitset.EnumBitSet; @@ -13,11 +13,8 @@ import ch.claude_martin.enumbitset.EnumBitSet;
import engine.Enum;
import engine.gameManager.DbManager;
import engine.gameManager.LootManager;
import engine.gameManager.PowersManager;
import engine.loot.BootySetEntry;
import engine.powers.EffectsBase;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.sql.ResultSet;
import java.sql.SQLException;
@ -57,8 +54,6 @@ public class MobBase extends AbstractGameObject { @@ -57,8 +54,6 @@ public class MobBase extends AbstractGameObject {
private float walkCombat = 0;
private float runCombat = 0;
public ArrayList<MobBaseEffects> mobbaseEffects;
/**
* ResultSet Constructor
*/
@ -113,7 +108,6 @@ public class MobBase extends AbstractGameObject { @@ -113,7 +108,6 @@ public class MobBase extends AbstractGameObject {
this.mobBaseStats = DbManager.MobBaseQueries.LOAD_STATS(this.loadID);
DbManager.MobBaseQueries.LOAD_ALL_MOBBASE_SPEEDS(this);
this.mobbaseEffects = DbManager.MobBaseQueries.GET_RUNEBASE_EFFECTS(this.getObjectUUID());
}
@ -260,7 +254,7 @@ public class MobBase extends AbstractGameObject { @@ -260,7 +254,7 @@ public class MobBase extends AbstractGameObject {
}
public int getAtr() {
return attackRating;
return atr;
}
public void setAtr(int atr) {
@ -307,19 +301,4 @@ public class MobBase extends AbstractGameObject { @@ -307,19 +301,4 @@ public class MobBase extends AbstractGameObject {
return runCombat;
}
public static void applyMobbaseEffects(Mob mob){
for(MobBaseEffects mbe : mob.mobBase.mobbaseEffects){
if(mob.level >= mbe.getReqLvl()){
try {
//PowersManager.applyPower(mob, mob, mob.loc, mbe.getToken(), mbe.getRank(), false);
EffectsBase effectsBase = PowersManager.getEffectByToken(mbe.getToken());
if(effectsBase != null)
mob.addEffectNoTimer(Integer.toString(effectsBase.getUUID()), effectsBase, mbe.getRank(), true);
}catch(Exception e){
Logger.error("NULL POWER FOR MOB: " + mob.getObjectUUID() + ", POWER TOKEN: " + mbe.getToken());
}
}
}
}
}

4
src/engine/objects/MobEquipment.java

@ -34,8 +34,7 @@ public class MobEquipment extends AbstractGameObject { @@ -34,8 +34,7 @@ public class MobEquipment extends AbstractGameObject {
private AbstractPowerAction suffix;
private int pValue;
private int sValue;
int magicValue;
public boolean fromNoob = false;
private int magicValue;
private float dropChance = 0;
@ -107,6 +106,7 @@ public class MobEquipment extends AbstractGameObject { @@ -107,6 +106,7 @@ public class MobEquipment extends AbstractGameObject {
public static void serializeForVendor(MobEquipment mobEquipment, ByteBufferWriter writer, float percent) throws SerializationException {
_serializeForClientMsg(mobEquipment, writer, false);
int baseValue = mobEquipment.itemBase.getBaseValue() + mobEquipment.itemBase.getMagicValue();
writer.putInt(mobEquipment.magicValue);
writer.putInt(mobEquipment.magicValue);
}

2
src/engine/objects/MobLoot.java

@ -77,7 +77,7 @@ public final class MobLoot extends Item { @@ -77,7 +77,7 @@ public final class MobLoot extends Item {
this.setNumOfItems(quantity);
this.noSteal = noSteal;
this.setIsID(true);
this.setIsID(this.getItemBase().isAutoID());
// Class is 'final'; passing 'this' should be okay at the end of the constructor

137
src/engine/objects/NPC.java

@ -79,7 +79,7 @@ public class NPC extends AbstractCharacter { @@ -79,7 +79,7 @@ public class NPC extends AbstractCharacter {
private HashSet<Integer> canRoll = null;
public int parentZoneUUID;
public int equipmentSetID = 0;
private int specialPrice = 5;
private int repairCost = 5;
// New NPC constructor. Fill in the blanks and then call
// PERSIST.
@ -122,11 +122,7 @@ public class NPC extends AbstractCharacter { @@ -122,11 +122,7 @@ public class NPC extends AbstractCharacter {
// this.buyPercent = rs.getFloat("npc_buyPercent");
this.buyPercent = .33f;
if(ZoneManager.findSmallestZone(this.loc) != null && ZoneManager.findSmallestZone(this.loc).getSafeZone() == 1){
this.sellPercent = 0;
}else{
this.sellPercent = 1;
}
this.sellPercent = 1;
this.setRot(new Vector3f(0, rs.getFloat("npc_rotation"), 0));
@ -153,12 +149,6 @@ public class NPC extends AbstractCharacter { @@ -153,12 +149,6 @@ public class NPC extends AbstractCharacter {
this.name = rs.getString("npc_name");
try {
this.specialPrice = rs.getInt("specialPrice");
}catch(Exception e){
this.specialPrice = 5;
}
} catch (Exception e) {
Logger.error("NPC: " + this.dbID + " :" + e);
e.printStackTrace();
@ -199,18 +189,6 @@ public class NPC extends AbstractCharacter { @@ -199,18 +189,6 @@ public class NPC extends AbstractCharacter {
serializeForClientMsgOtherPlayer(npc, writer);
}
public boolean isInSafeZone() {
Zone zone = ZoneManager.findSmallestZone(this.getLoc());
if (zone != null) {
return zone.getSafeZone() == (byte) 1;
}
return false;
//return this.safeZone;
}
public static void serializeForClientMsgOtherPlayer(NPC npc, ByteBufferWriter writer)
throws SerializationException {
@ -804,7 +782,7 @@ public class NPC extends AbstractCharacter { @@ -804,7 +782,7 @@ public class NPC extends AbstractCharacter {
@Override
public void updateDatabase() {
DbManager.NPCQueries.updateSpecialPricing(this);
DbManager.NPCQueries.updateDatabase(this);
}
public int getSymbol() {
@ -1202,7 +1180,7 @@ public class NPC extends AbstractCharacter { @@ -1202,7 +1180,7 @@ public class NPC extends AbstractCharacter {
}
// Cannot roll items without a warehouse.
// Due to the fact ResourceRoll references the
// Due to the fact fillForge references the
// warehouse and early exits. *** Refactor???
serverZone = this.building.getParentZone();
@ -1236,7 +1214,7 @@ public class NPC extends AbstractCharacter { @@ -1236,7 +1214,7 @@ public class NPC extends AbstractCharacter {
if (isRandom)
item = ItemFactory.randomRoll(this, player, amount, itemID);
else
item = ItemFactory.ResourceRoll(this, player, amount, itemID, pToken, sToken, customName);
item = ItemFactory.fillForge(this, player, amount, itemID, pToken, sToken, customName);
if (item == null)
return null;
@ -1296,13 +1274,12 @@ public class NPC extends AbstractCharacter { @@ -1296,13 +1274,12 @@ public class NPC extends AbstractCharacter {
return name;
}
public int getSpecialPrice() {
return specialPrice;
public int getRepairCost() {
return repairCost;
}
public void setSpecialPrice(int specialPrice) {
this.specialPrice = specialPrice;
DbManager.NPCQueries.updateSpecialPricing(this);
public void setRepairCost(int repairCost) {
this.repairCost = repairCost;
}
public void processUpgradeNPC(PlayerCharacter player) {
@ -1370,100 +1347,4 @@ public class NPC extends AbstractCharacter { @@ -1370,100 +1347,4 @@ public class NPC extends AbstractCharacter {
}
}
public ArrayList<MobEquipment> getSellInventorySteward() {
ArrayList<MobEquipment> smallList = new ArrayList<>();
for (MobEquipment me : this.contract.getSellInventory()) {
int rankRequired = 0;
if (me.getItemBase().getType().equals(Enum.ItemType.CONTRACT)) {
switch (me.getItemBase().getUUID()) {
case 866:
case 889:
case 860:
case 850:
case 892:
case 1502003:
case 890:
case 896:
rankRequired = 1;
break;
case 899:
case 801:
case 803:
case 802:
case 821:
case 810:
case 806:
case 818:
case 800:
rankRequired = 2;
break;
case 840:
case 848:
case 813:
case 805:
case 804:
case 838:
rankRequired = 3;
break;
case 815:
rankRequired = 4;
break;
case 847:
case 830:
case 820:
rankRequired = 6;
break;
case 865:
case 252637:
rankRequired = 7;
break;
case 1502002: // harvesters don't need to exist but might one day
case 1502001: //mine guards don't need to exist but might one day
continue;
}
if(me.getItemBase().getName().toLowerCase().contains("trainer") || me.getItemBase().getName().toLowerCase().contains("refiner")){
rankRequired = 5;
}
if (this.getRank() >= rankRequired)
smallList.add(me);
}
}
return smallList;
}
public ArrayList<MobEquipment> getSellInventoryBuilder() {
ArrayList<MobEquipment> smallList = new ArrayList<>();
int maxValue = 0;
switch(this.getRank()){
case 1:
maxValue = 300000;
break;
case 2:
maxValue = 450000;
break;
case 3:
maxValue = 550000;
break;
case 4:
maxValue = 650000;
break;
case 5:
maxValue = 1000000;
break;
case 6:
case 7:
maxValue = 999999999;
break;
}
for(MobEquipment me : this.contract.getSellInventory()){
if(me.getItemBase().getBaseValue() <= maxValue)
smallList.add(me);
}
return smallList;
}
}

743
src/engine/objects/PlayerCharacter.java

File diff suppressed because it is too large Load Diff

1
src/engine/objects/PromotionClass.java

@ -150,7 +150,6 @@ public class PromotionClass extends AbstractGameObject { @@ -150,7 +150,6 @@ public class PromotionClass extends AbstractGameObject {
return true;
}
}
return false;
}

25
src/engine/objects/Realm.java

@ -10,14 +10,10 @@ @@ -10,14 +10,10 @@
package engine.objects;
import engine.Enum;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.RealmMap;
import engine.InterestManagement.WorldGrid;
import engine.db.archive.DataWarehouse;
import engine.db.archive.RealmRecord;
import engine.gameManager.BuildingManager;
import engine.gameManager.DbManager;
import engine.gameManager.NPCManager;
import engine.gameManager.PowersManager;
import engine.net.ByteBufferWriter;
import engine.powers.PowersBase;
@ -383,16 +379,6 @@ public class Realm { @@ -383,16 +379,6 @@ public class Realm {
public void abandonRealm() {
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(this.getRulingCity().loc,1750,MBServerStatics.MASK_BUILDING)){
Building wall = (Building)awo;
if(wall.getBlueprint() != null && wall.getBlueprint().getBuildingGroup() != null && wall.getBlueprint().isWallPiece()){
float currentHealthRatio = wall.getCurrentHitpoints()/wall.healthMax;
float newMax = wall.getBlueprint().getMaxHealth(1);
wall.setMaxHitPoints(newMax);
wall.setHealth(wall.healthMax * currentHealthRatio);
}
}
// Push event to warehouse
RealmRecord realmRecord = RealmRecord.borrow(this, Enum.RecordEventType.LOST);
@ -420,17 +406,6 @@ public class Realm { @@ -420,17 +406,6 @@ public class Realm {
this.configure();
this.updateDatabase();
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(city.loc,1750,MBServerStatics.MASK_BUILDING)){
Building wall = (Building)awo;
if(wall.getBlueprint() != null && wall.getBlueprint().getBuildingGroup() != null && wall.getBlueprint().isWallPiece()){
float currentHealthRatio = wall.getCurrentHitpoints()/wall.healthMax;
float newMax = wall.healthMax * 1.1f;
wall.setMaxHitPoints(newMax);
wall.setHealth(wall.healthMax * currentHealthRatio);
}
}
// Push event to warehouse
RealmRecord realmRecord = RealmRecord.borrow(this, Enum.RecordEventType.CAPTURE);

108
src/engine/objects/Resists.java

@ -34,24 +34,6 @@ public class Resists { @@ -34,24 +34,6 @@ public class Resists {
private int protectionTrains = 0;
private boolean immuneToAll;
public Resists() {
this.immuneToAll = false;
this.resists.put(DamageType.Slash, 0f);
this.resists.put(DamageType.Crush, 0f);
this.resists.put(DamageType.Pierce, 0f);
this.resists.put(DamageType.Magic, 0f);
this.resists.put(DamageType.Bleed, 0f);
this.resists.put(DamageType.Poison, 0f);
this.resists.put(DamageType.Mental, 0f);
this.resists.put(DamageType.Holy, 0f);
this.resists.put(DamageType.Unholy, 0f);
this.resists.put(DamageType.Lightning, 0f);
this.resists.put(DamageType.Fire, 0f);
this.resists.put(DamageType.Cold, 0f);
this.resists.put(DamageType.Healing, 0f);
this.immuneTo.put(DamageType.Siege, true);
}
/**
* Generic Constructor
*/
@ -64,12 +46,6 @@ public class Resists { @@ -64,12 +46,6 @@ public class Resists {
case "Mine":
setMineResists();
break;
case "Dropper":
setDropperResists();
break;
case "Elite":
setEliteResists();
break;
default:
setGenericResists();
break;
@ -255,42 +231,6 @@ public class Resists { @@ -255,42 +231,6 @@ public class Resists {
this.resists.put(DamageType.Siege, 0f);
}
public final void setDropperResists() {
this.immuneToAll = false;
this.resists.put(DamageType.Slash, 50f);
this.resists.put(DamageType.Crush, 50f);
this.resists.put(DamageType.Pierce, 50f);
this.resists.put(DamageType.Magic, 50f);
this.resists.put(DamageType.Bleed, 50f);
this.resists.put(DamageType.Poison, 50f);
this.resists.put(DamageType.Mental, 50f);
this.resists.put(DamageType.Holy, 50f);
this.resists.put(DamageType.Unholy, 50f);
this.resists.put(DamageType.Lightning, 50f);
this.resists.put(DamageType.Fire, 50f);
this.resists.put(DamageType.Cold, 50f);
this.resists.put(DamageType.Healing, 0f);
this.immuneTo.put(DamageType.Siege, true);
}
public final void setEliteResists() {
this.immuneToAll = false;
this.resists.put(DamageType.Slash, 75f);
this.resists.put(DamageType.Crush, 75f);
this.resists.put(DamageType.Pierce, 75f);
this.resists.put(DamageType.Magic, 75f);
this.resists.put(DamageType.Bleed, 75f);
this.resists.put(DamageType.Poison, 75f);
this.resists.put(DamageType.Mental, 75f);
this.resists.put(DamageType.Holy, 75f);
this.resists.put(DamageType.Unholy, 75f);
this.resists.put(DamageType.Lightning, 75f);
this.resists.put(DamageType.Fire, 75f);
this.resists.put(DamageType.Cold, 75f);
this.resists.put(DamageType.Healing, 0f);
this.immuneTo.put(DamageType.Siege, true);
}
/**
* Create generic resists
*/
@ -454,7 +394,7 @@ public class Resists { @@ -454,7 +394,7 @@ public class Resists {
*/
public float getResistedDamage(AbstractCharacter source, AbstractCharacter target, DamageType type, float damage, int trains) {
//handle fortitudes
//damage = handleFortitude(target, type, damage);
damage = handleFortitude(target, type, damage);
//calculate armor piercing
float ap = source.getBonuses().getFloatPercentAll(ModType.ArmorPiercing, SourceType.None);
float damageAfterResists = damage * (1 - (this.getResist(type, trains) * 0.01f) + ap);
@ -477,7 +417,6 @@ public class Resists { @@ -477,7 +417,6 @@ public class Resists {
}
target.cancelOnTakeDamage(type, (damageAfterResists));
}
damageAfterResists = handleFortitude(target, type, damageAfterResists);
return damageAfterResists;
}
@ -487,38 +426,6 @@ public class Resists { @@ -487,38 +426,6 @@ public class Resists {
// get resists for runes
PlayerBonuses rb = ac.getBonuses();
float slash = 0f, crush = 0f, pierce = 0f, magic = 0f, bleed = 0f, mental = 0f, holy = 0f, unholy = 0f, poison = 0f, lightning = 0f, fire = 0f, cold = 0f, healing = 0f;
if(ac.getObjectType().equals(Enum.GameObjectType.Mob)){
Mob mob = (Mob)ac;
if(mob.StrongholdEpic || mob.StrongholdCommander || mob.StrongholdGuardian) {
slash = 75f;
crush = 75f;
pierce = 75f;
magic = 75f;
bleed = 75f;
mental = 75f;
holy = 75f;
unholy = 75f;
poison = 75f;
lightning = 75f;
fire = 75f;
cold = 75f;
healing = 0f;
} else if(Mob.discDroppers.contains(mob) || mob.isDropper) {
slash = 200f;
crush = 200f;
pierce = 200f;
magic = 200f;
bleed = 200f;
mental = 200f;
holy = 200f;
unholy = 200f;
poison = 200f;
lightning = 200f;
fire = 200f;
cold = 200f;
healing = 0f;
}
}
if (rb != null) {
// Handle immunities
@ -558,6 +465,19 @@ public class Resists { @@ -558,6 +465,19 @@ public class Resists {
cold += rb.getFloat(ModType.Resistance, SourceType.Cold);
healing += rb.getFloat(ModType.Resistance, SourceType.Healing); // DamageType.Healing.name());
//HHO
// String protectionString = rb.getString("protection");
//
// if (protectionString.isEmpty())
// this.protection = null;
// else try {
// this.protection = DamageType.valueOf(rb.getString("protection"));
// } catch (IllegalArgumentException e) {
// Logger.error( "No enum for: " + protectionString);
// this.protection = null;
// }
// this.protectionTrains = rb.getFloat("protection");
}
// get resists from equipment

27
src/engine/objects/Shrine.java

@ -43,7 +43,7 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> { @@ -43,7 +43,7 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> {
public static boolean canTakeFavor(PlayerCharacter grantee, Shrine shrine) {
if (shrine.shrineType.isRace()) {
if (shrine.shrineType.isRace())
switch (grantee.getRaceID()) {
case 2000:
case 2001:
@ -96,7 +96,6 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> { @@ -96,7 +96,6 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> {
case 2025:
case 2026:
case 1999:
if (shrine.shrineType == ShrineType.Nephilim)
return true;
break;
@ -107,7 +106,7 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> { @@ -107,7 +106,7 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> {
break;
}
}else {
else
switch (grantee.getPromotionClassID()) {
case 2504:
if (shrine.shrineType == ShrineType.Assassin)
@ -198,7 +197,7 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> { @@ -198,7 +197,7 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> {
return true;
break;
}
}
return false;
}
@ -227,6 +226,26 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> { @@ -227,6 +226,26 @@ public class Shrine extends AbstractWorldObject implements Comparable<Shrine> {
}
public void decay() {
if (this.getFavors() == 0)
return;
int decayAmount = (int) (this.getFavors() - (this.getFavors() * .10f));
if (decayAmount < 0)
decayAmount = 0;
if (!DbManager.ShrineQueries.updateFavors(this, decayAmount, this.getFavors())) {
Logger.error("Shrine Decay", "Error writing to DB. UUID: " + this.getObjectUUID());
return;
}
this.favors = decayAmount;
Logger.info(shrineType.name() + " uuid:" + this.getObjectUUID() + " Amount: " + this.getFavors() * .10f);
}
public synchronized boolean addFavor(PlayerCharacter boonOwner, Item boonItem) {
if (boonOwner == null)

78
src/engine/objects/Warehouse.java

@ -281,84 +281,6 @@ public class Warehouse extends AbstractWorldObject { @@ -281,84 +281,6 @@ public class Warehouse extends AbstractWorldObject {
}
public static int getCostForResource(int id){
int newCost = 1;
switch(id){
case 1580000://stone
newCost = 3000;
break;
case 1580001://truesteel
newCost = 50000;
break;
case 1580002://iron
newCost = 50000;
break;
case 1580003://adamant
newCost = 100000;
break;
case 1580004://lumber
newCost = 3000;
break;
case 1580005://oak
newCost = 30000;
break;
case 1580006://bronzewood
newCost = 30000;
break;
case 1580007://mandrake
newCost = 100000;
break;
case 1580008://coal
newCost = 30000;
break;
case 1580009://agate
newCost = 50000;
break;
case 1580010://diamond
newCost = 50000;
break;
case 1580011://onyx
newCost = 100000;
break;
case 1580012://azoth
newCost = 50000;
break;
case 1580013://orichalk
newCost = 30000;
break;
case 1580014://antimony
newCost = 100000;
break;
case 1580015://sulfur
newCost = 100000;
break;
case 1580016://quicksilver
newCost = 100000;
break;
case 1580017://galvor
newCost = 300000;
break;
case 1580018://wormwood
newCost = 300000;
break;
case 1580019://obsidian
newCost = 200000;
break;
case 1580020://bloodstone
newCost = 200000;
break;
case 1705032:
newCost = 100000;
break;
}
return newCost;
}
public static int getSellStackSize(int id){
if(id == 1705032)
return 10;
return 3000000 / getCostForResource(id);
}
public ConcurrentHashMap<ItemBase, Integer> getResources() {
return resources;
}

5
src/engine/objects/Zone.java

@ -101,6 +101,7 @@ public class Zone extends AbstractGameObject { @@ -101,6 +101,7 @@ public class Zone extends AbstractGameObject {
if (hash == null)
setHash();
}
public static void serializeForClientMsg(Zone zone, ByteBufferWriter writer) {
@ -112,8 +113,8 @@ public class Zone extends AbstractGameObject { @@ -112,8 +113,8 @@ public class Zone extends AbstractGameObject {
if (zone.playerCityID > 0) {
writer.put((byte) 1); // Player City - True
writer.putFloat(Enum.CityBoundsType.GRID.extents + 128);
writer.putFloat(Enum.CityBoundsType.GRID.extents + 128);
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
writer.putFloat(Enum.CityBoundsType.ZONE.extents);
} else
writer.put((byte) 0); // Player City - False

5
src/engine/powers/PowersBase.java

@ -11,7 +11,6 @@ package engine.powers; @@ -11,7 +11,6 @@ package engine.powers;
import engine.Enum.PowerCategoryType;
import engine.Enum.PowerTargetType;
import engine.gameManager.PowersManager;
import org.pmw.tinylog.Logger;
import java.sql.ResultSet;
@ -110,8 +109,6 @@ public class PowersBase { @@ -110,8 +109,6 @@ public class PowersBase {
public PowerCategoryType powerCategory;
public String description;
public boolean breaksForm = true;
/**
* No Table ID Constructor
*/
@ -328,8 +325,6 @@ public class PowersBase { @@ -328,8 +325,6 @@ public class PowersBase {
ct = rs.getString("monsterTypeRestrict3").trim();
if (!ct.isEmpty())
this.monsterTypeRestrictions.add(ct);
this.breaksForm = PowersManager.breakForm(this.token);
}

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

@ -30,7 +30,7 @@ public class AttributeEffectModifier extends AbstractEffectModifier { @@ -30,7 +30,7 @@ public class AttributeEffectModifier extends AbstractEffectModifier {
@Override
public void applyBonus(AbstractCharacter ac, int trains) {
ac.update(false);
ac.update();
Float amount = 0f;
PlayerBonuses bonus = ac.getBonuses();
if (this.percentMod != 0f) { //Stat Percent Modifiers

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

@ -29,7 +29,7 @@ public class HealthRecoverRateEffectModifier extends AbstractEffectModifier { @@ -29,7 +29,7 @@ public class HealthRecoverRateEffectModifier extends AbstractEffectModifier {
@Override
public void applyBonus(AbstractCharacter ac, int trains) {
ac.update(false);
ac.update();
Float amount = 0f;
PlayerBonuses bonus = ac.getBonuses();
if (this.useRampAdd)

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

Loading…
Cancel
Save