Compare commits

..

59 Commits

Author SHA1 Message Date
MagicBot a10c8c9aa5 Update sourcetype 2024-07-21 22:04:21 -04:00
MagicBot cdf3e4db8a Update sourcetype 2024-07-21 22:00:09 -04:00
MagicBot b53133655c Update sourcetype 2024-07-21 21:55:08 -04:00
FatBoy f07974f673 dual wield spam attack issue resolved 2024-07-21 19:46:06 -05:00
FatBoy 0d5cef1652 guilds that have sub guilds can no longer be invited to join nations 2024-07-21 19:36:17 -05:00
FatBoy 04203c092a Lowering stats below item requirement unequips and removes item from map correctly 2024-07-21 19:32:16 -05:00
FatBoy 78feee482b items can now be equipped when skill level exactly meets item requirement 2024-07-21 19:23:34 -05:00
FatBoy 8c35844e08 Huntress pet cannot attack players resolved 2024-07-21 19:16:57 -05:00
FatBoy 0fbb43e021 proc fix 2024-07-12 13:43:28 -04:00
MagicBot 145449f26d Bronzewood mine_production updated. 2024-06-29 14:33:19 -04:00
FatBoy feef6263b4 cleanup 2024-06-27 20:41:43 -05:00
FatBoy 6c622c377f blocked power type structuring 2024-06-27 20:19:11 -05:00
FatBoy 8943121336 blocked power type structuring 2024-06-27 19:54:29 -05:00
FatBoy 70cb469190 final cleanup 2024-06-26 20:44:46 -05:00
FatBoy a42f307a70 immunitiy check compiled to single location 2024-06-26 20:37:28 -05:00
FatBoy 2a3ae6eaec Immunities refresh 2024-06-26 20:24:05 -05:00
FatBoy 9e4b596aa1 enforce KOS for building works 2024-06-26 20:07:37 -05:00
FatBoy aa1fe792a3 Load enforceKOS for buildings 2024-06-26 19:57:50 -05:00
FatBoy 79919121a8 claiming an errant ToL gives ownership to the leader of the guild, not individual player 2024-06-26 19:44:23 -05:00
FatBoy 80ccfff635 Building Management compiled to a single method check 2024-06-26 19:27:32 -05:00
MagicBot 381139af35 Collection of resourceHash 2024-06-26 12:31:08 -04:00
MagicBot e79da63556 Method cleanup. 2024-06-24 03:18:59 -04:00
MagicBot 533565e37e UUID is in keyset 2024-06-24 03:09:38 -04:00
FatBoy da0510d2bc proccing system 2024-06-22 19:50:53 -05:00
FatBoy 1f732a8ca9 failed rune sno longer get consumed 2024-06-22 19:31:13 -05:00
FatBoy 0d24789a93 reverse KOS function completed 2024-06-22 19:22:13 -05:00
FatBoy 35427cfb4a reverse KOS function 2024-06-22 19:04:04 -05:00
MagicBot 695a78b1e2 Noob island filter at 20 2024-06-19 17:57:28 -04:00
MagicBot 9f6710ccb9 More logic work 2024-06-19 17:51:42 -04:00
MagicBot fff1e80f61 More logic work 2024-06-19 17:49:46 -04:00
MagicBot 141af19daa More logic work 2024-06-19 17:38:44 -04:00
MagicBot 630748541f More logic work 2024-06-19 17:36:09 -04:00
MagicBot d32818f351 Rearrange logic 2024-06-19 17:27:04 -04:00
MagicBot d6f94bd0e7 Merged methods 2024-06-19 17:10:49 -04:00
MagicBot db6a4e471d Lore rules added to method 2024-06-19 17:08:56 -04:00
MagicBot a24c611bac Lore rules added to method 2024-06-19 17:01:02 -04:00
MagicBot 3926160ab1 Unused method removed 2024-06-19 16:56:57 -04:00
MagicBot 4a7013de61 Signature update 2024-06-19 16:56:06 -04:00
MagicBot 56564f1c3b Cleanup of teleport list 2024-06-19 16:53:55 -04:00
MagicBot 8a3e39e97d Cleanup of cityChoice handler 2024-06-19 15:05:01 -04:00
MagicBot 5224c79441 Condemned uuid is key not value in map 2024-06-19 14:53:57 -04:00
MagicBot ede016a93d Never null 2024-06-19 14:43:31 -04:00
MagicBot cc1825dec9 Increase to handle larger banks. 2024-06-18 12:43:59 -04:00
MagicBot d257ce50cf Sanity check for null city. 2024-06-18 11:56:19 -04:00
MagicBot 5b246211e1 Warehouse record removed in destruction banes. 2024-06-18 11:51:11 -04:00
FatBoy 33c923b0de fixed immunities in powers manager 2024-06-13 20:47:28 -05:00
FatBoy 02d524663a fixed a lore issue in powers manager 2024-06-13 20:14:43 -05:00
MagicBot 5bd85addb7 Removed count when validating stack withdraw weight. 2024-06-13 15:42:54 -04:00
FatBoy 40bae67443 fixed mob damage defense and ATR 2024-06-12 19:35:20 -05:00
FatBoy 1cf1d731c4 added = to range checks and converted speed to float 2024-06-12 19:23:34 -05:00
MagicBot 24215e21c9 Sanity check for deleted vendors 2024-06-12 14:15:19 -04:00
MagicBot 3accd779b9 Sanity check for deleted vendors 2024-06-12 14:06:18 -04:00
MagicBot 1d673ca2e5 Sanity check for deleted vendors 2024-06-12 14:04:19 -04:00
MagicBot c935ea1986 Project reformat. 2024-06-11 13:40:42 -04:00
MagicBot 678ccafd3c Unused variable removed. 2024-06-11 13:23:49 -04:00
MagicBot 31292785a5 templateHash used in this context. 2024-06-11 13:09:40 -04:00
MagicBot cdc4717033 Update to resources message 2024-06-11 12:54:57 -04:00
MagicBot 35c8ac0289 Update to resources message 2024-06-11 12:53:07 -04:00
MagicBot f5cc4a3290 Update to resource type 2024-06-10 15:19:57 -04:00
66 changed files with 923 additions and 1130 deletions
+1 -1
View File
@@ -41,7 +41,7 @@ public class dbPowerHandler extends dbHandlerBase {
int token = DbManager.hasher.SBStringHash(IDString); int token = DbManager.hasher.SBStringHash(IDString);
source = rs.getString("source").replace("-", "").trim(); source = rs.getString("source").replace("-", "").trim();
mbEnums.EffectSourceType effectSourceType = mbEnums.EffectSourceType.GetEffectSourceType(source); mbEnums.EffectSourceType effectSourceType = mbEnums.EffectSourceType.getEffectSourceType(source);
if (EffectsBase.effectSourceTypeMap.containsKey(token) == false) if (EffectsBase.effectSourceTypeMap.containsKey(token) == false)
EffectsBase.effectSourceTypeMap.put(token, new HashSet<>()); EffectsBase.effectSourceTypeMap.put(token, new HashSet<>());
@@ -136,6 +136,12 @@ public class dbWarehouseHandler extends dbHandlerBase {
int cityUID = rs.getInt("cityUUID"); int cityUID = rs.getInt("cityUUID");
JSONObject jsonObject = new JSONObject(rs.getString("warehouse")); JSONObject jsonObject = new JSONObject(rs.getString("warehouse"));
City city = City.getCity(cityUID); City city = City.getCity(cityUID);
if (city == null) {
Logger.error("No city " + cityUID + " for warehouse");
continue;
}
city.warehouse = new Warehouse(jsonObject); city.warehouse = new Warehouse(jsonObject);
city.warehouse.city = city; city.warehouse.city = city;
@@ -192,6 +198,7 @@ public class dbWarehouseHandler extends dbHandlerBase {
// via the client interface. // via the client interface.
ArrayList<WorkOrder> submitList = new ArrayList<>(); ArrayList<WorkOrder> submitList = new ArrayList<>();
ArrayList<WorkOrder> orphanList = new ArrayList<>();
try (Connection connection = DbManager.getConnection(); try (Connection connection = DbManager.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_workorders`;"); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `dyn_workorders`;");
@@ -209,7 +216,14 @@ public class dbWarehouseHandler extends dbHandlerBase {
// Submit new workOrders to the ForgeManager // Submit new workOrders to the ForgeManager
for (WorkOrder workOrder : submitList) { for (WorkOrder workOrder : submitList) {
DbManager.WarehouseQueries.DELETE_WORKORDER(workOrder); DbManager.WarehouseQueries.DELETE_WORKORDER(workOrder);
// Delete but do not reconstitute orphan workOrders
if (workOrder.vendor == null)
continue;
workOrder.workOrderID = ForgeManager.workOrderCounter.incrementAndGet(); workOrder.workOrderID = ForgeManager.workOrderCounter.incrementAndGet();
DbManager.WarehouseQueries.WRITE_WORKORDER(workOrder); DbManager.WarehouseQueries.WRITE_WORKORDER(workOrder);
ForgeManager.vendorWorkOrderLookup.get(workOrder.vendor).add(workOrder); ForgeManager.vendorWorkOrderLookup.get(workOrder.vendor).add(workOrder);
+57 -67
View File
@@ -104,67 +104,67 @@ public enum BuildingManager {
if (building == null) if (building == null)
return false; return false;
//cannot access destroyed buildings
if (building.getRank() == -1) if (building.getRank() == -1)
return false; return false;
if (IsOwner(building, player)) //admin characters can always access buildings
return true;
//individual friend.
if (building.getFriends() != null && building.getFriends().get(player.getObjectUUID()) != null)
return true;
//Admins can access stuff
if (player.isCSR()) if (player.isCSR())
return true; return true;
//Guild stuff //owner can always access their own building
if (building.getGuild().isGuildLeader(player.getObjectUUID()))
return true;
if (building.getFriends().get(player.getGuild().getObjectUUID()) != null && building.getFriends().get(player.getGuild().getObjectUUID()).friendType == 8)
return true;
if (building.getFriends().get(player.getGuild().getObjectUUID()) != null && building.getFriends().get(player.getGuild().getObjectUUID()).friendType == 9 && GuildStatusController.isInnerCouncil(player.getGuildStatus()))
return true;
if (Guild.sameGuild(building.getGuild(), player.getGuild()) && GuildStatusController.isInnerCouncil(player.getGuildStatus()))
return true;
return Guild.sameGuild(building.getGuild(), player.getGuild()) && GuildStatusController.isGuildLeader(player.getGuildStatus());
//TODO test friends list once added
//does not meet above criteria. Cannot access.
}
public static boolean playerCanManageNotFriends(PlayerCharacter player, Building building) {
//Player Can only Control Building if player is in Same Guild as Building and is higher rank than IC.
if (player == null)
return false;
if (building == null)
return false;
if (building.getRank() == -1)
return false;
if (IsOwner(building, player)) if (IsOwner(building, player))
return true; return true;
//Somehow guild leader check fails? lets check if Player is true Guild GL. //check for default IC access if building belongs to same guild
if (building.getGuild() != null && building.getGuild().isGuildLeader(player.getObjectUUID())) if(player.guild.equals(building.getGuild())) {
return true; if (building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() != null) {
switch (building.getBlueprint().getBuildingGroup()) {
case TOL:
case BARRACK:
case SPIRE:
case SHRINE:
case BANESTONE:
case MINE:
case WAREHOUSE:
case BULWARK:
case SIEGETENT:
if (GuildStatusController.isInnerCouncil(player.getGuildStatus()))
return true;
if (GuildStatusController.isGuildLeader(player.getGuildStatus()))
return true;
break;
}
}
}
if (!GuildStatusController.isGuildLeader(player.getGuildStatus()) && !GuildStatusController.isInnerCouncil(player.getGuildStatus())) //check against friends list entries if any present
return false; if (building.getFriends() != null) {
//check individuals
if (building.getFriends().get(player.getObjectUUID()) != null)
return true;
if (building.getFriends().get(player.guild.objectUUID) != null) {
//check friend type for guild related access
switch (building.getFriends().get(player.guild.objectUUID).friendType) {
case 8: //full member
if (GuildStatusController.isFullMember(player.getGuildStatus()))
return true;
break;
case 9: //Inner Council
if (GuildStatusController.isInnerCouncil(player.getGuildStatus()))
return true;
if (GuildStatusController.isGuildLeader(player.getGuildStatus()))
return true;
break;
}
}
}
//did not meet access grant criteria, deny access
return false; return false;
} }
public static synchronized boolean lootBuilding(PlayerCharacter player, Building building) { public static synchronized boolean lootBuilding(PlayerCharacter player, Building building) {
@@ -463,29 +463,19 @@ public enum BuildingManager {
return GuildStatusController.isGuildLeader(player.getGuildStatus()) || GuildStatusController.isInnerCouncil(player.getGuildStatus()); return GuildStatusController.isGuildLeader(player.getGuildStatus()) || GuildStatusController.isInnerCouncil(player.getGuildStatus());
} }
public static int GetAvailableGold(Building building) {
if (building.getStrongboxValue() == 0)
return 0;
if (building.getStrongboxValue() < building.reserve)
return 0;
return building.getStrongboxValue() - building.reserve;
}
public static boolean IsPlayerHostile(Building building, PlayerCharacter player) { public static boolean IsPlayerHostile(Building building, PlayerCharacter player) {
//Nation Members and Guild members are not hostile.
// if (building.getGuild() != null){
// if (pc.getGuild() != null)
// if (building.getGuild().getObjectUUID() == pc.getGuildUUID()
// || pc.getGuild().getNation().getObjectUUID() == building.getGuild().getNation().getObjectUUID())
// return false;
// }
if (Guild.sameNationExcludeErrant(building.getGuild(), player.getGuild())) if (Guild.sameNationExcludeErrant(building.getGuild(), player.getGuild()))
return false; return false;
if(building.enforceKOS) {
if (building.getCity() != null) {
Building TOL = building.getCity().getTOL();
if (TOL != null) {
building = TOL;
}
}
}
if (!building.reverseKOS) { if (!building.reverseKOS) {
Condemned condemn = building.getCondemned().get(player.getObjectUUID()); Condemned condemn = building.getCondemned().get(player.getObjectUUID());
+2 -2
View File
@@ -13,9 +13,9 @@ import engine.InterestManagement.WorldGrid;
import engine.db.archive.BaneRecord; import engine.db.archive.BaneRecord;
import engine.db.archive.PvpRecord; import engine.db.archive.PvpRecord;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.MessageDispatcher; import engine.net.MessageDispatcher;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
@@ -94,7 +94,7 @@ public enum ChatManager {
PlayerBonuses bonus = pc.getBonuses(); PlayerBonuses bonus = pc.getBonuses();
if (bonus != null && bonus.getBool(ModType.Silenced, SourceType.None)) { if (bonus != null && bonus.getBool(ModType.Silenced, EffectSourceType.None)) {
ChatManager.chatSayError(pc, SILENCED); ChatManager.chatSayError(pc, SILENCED);
return true; return true;
} }
+333 -332
View File
@@ -19,6 +19,7 @@ import engine.net.client.msg.UpdateStateMsg;
import engine.objects.*; import engine.objects.*;
import engine.powers.DamageShield; import engine.powers.DamageShield;
import engine.powers.effectmodifiers.AbstractEffectModifier; import engine.powers.effectmodifiers.AbstractEffectModifier;
import engine.powers.effectmodifiers.WeaponProcEffectModifier;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -47,7 +48,7 @@ public enum CombatManager {
public static final int COMBAT_PARRY_ANIMATION = 299; public static final int COMBAT_PARRY_ANIMATION = 299;
public static final int COMBAT_DODGE_ANIMATION = 300; public static final int COMBAT_DODGE_ANIMATION = 300;
public static void combatCycle(AbstractCharacter attacker, AbstractWorldObject target, long addedDelay) { public static void combatCycle(AbstractCharacter attacker, AbstractWorldObject target) {
//early exit checks //early exit checks
@@ -66,7 +67,7 @@ public enum CombatManager {
case PlayerCharacter: case PlayerCharacter:
case Mob: case Mob:
PlayerBonuses bonuses = ((AbstractCharacter) target).getBonuses(); PlayerBonuses bonuses = ((AbstractCharacter) target).getBonuses();
if (bonuses != null && bonuses.getBool(mbEnums.ModType.ImmuneToAttack, mbEnums.SourceType.None)) if (bonuses != null && bonuses.getBool(mbEnums.ModType.ImmuneToAttack, mbEnums.EffectSourceType.None))
return; return;
break; break;
case NPC: case NPC:
@@ -78,413 +79,411 @@ public enum CombatManager {
if (mainWeapon == null && offWeapon == null) { if (mainWeapon == null && offWeapon == null) {
//no weapons equipped, punch with both fists //no weapons equipped, punch with both fists
processAttack(attacker, target, mbEnums.EquipSlotType.RHELD,addedDelay); processAttack(attacker, target, mbEnums.EquipSlotType.RHELD);
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter))
processAttack(attacker, target, mbEnums.EquipSlotType.LHELD,addedDelay); processAttack(attacker, target, mbEnums.EquipSlotType.LHELD);
return; return;
} }
if (mainWeapon != null && offWeapon == null) { if (mainWeapon != null && offWeapon == null) {
//swing right hand only //swing right hand only
processAttack(attacker, target, mbEnums.EquipSlotType.RHELD,addedDelay); processAttack(attacker, target, mbEnums.EquipSlotType.RHELD);
return; return;
} }
if (mainWeapon == null && offWeapon != null && !offWeapon.template.item_skill_used.equals("Block")) { if (mainWeapon == null && offWeapon != null && !offWeapon.template.item_skill_used.equals("Block")) {
//swing left hand only //swing left hand only
processAttack(attacker, target, mbEnums.EquipSlotType.LHELD,addedDelay); processAttack(attacker, target, mbEnums.EquipSlotType.LHELD);
return; return;
} }
if (mainWeapon == null && offWeapon != null && offWeapon.template.item_skill_used.equals("Block")) { if (mainWeapon == null && offWeapon != null && offWeapon.template.item_skill_used.equals("Block")) {
//no weapon equipped with a shield, punch with one hand //no weapon equipped with a shield, punch with one hand
processAttack(attacker, target, mbEnums.EquipSlotType.RHELD,addedDelay); processAttack(attacker, target, mbEnums.EquipSlotType.RHELD);
return; return;
} }
if (mainWeapon != null && offWeapon != null && offWeapon.template.item_skill_used.equals("Block")) { if (mainWeapon != null && offWeapon != null && offWeapon.template.item_skill_used.equals("Block")) {
//one weapon equipped with a shield, swing with one hand //one weapon equipped with a shield, swing with one hand
processAttack(attacker, target, mbEnums.EquipSlotType.RHELD,addedDelay); processAttack(attacker, target, mbEnums.EquipSlotType.RHELD);
return; return;
} }
if (mainWeapon != null && offWeapon != null && !offWeapon.template.item_skill_used.equals("Block")) { if (mainWeapon != null && offWeapon != null && !offWeapon.template.item_skill_used.equals("Block")) {
//two weapons equipped, swing both hands //two weapons equipped, swing both hands
processAttack(attacker, target, mbEnums.EquipSlotType.RHELD,addedDelay); processAttack(attacker, target, mbEnums.EquipSlotType.RHELD);
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter))
processAttack(attacker, target, mbEnums.EquipSlotType.LHELD,addedDelay); processAttack(attacker, target, mbEnums.EquipSlotType.LHELD);
} }
} }
public static void processAttack(AbstractCharacter attacker, AbstractWorldObject target, mbEnums.EquipSlotType slot, long addedDelay) { public static void processAttack(AbstractCharacter attacker, AbstractWorldObject target, mbEnums.EquipSlotType slot) {
if (slot == null || target == null || attacker == null)
return;
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) { if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
if (!attacker.isCombat()) if (!attacker.isCombat())
return; return;
//check if this slot is on attack timer, if timer has passed clear it, else early exit
if (attacker.getTimers() != null && attacker.getTimers().containsKey("Attack" + slot.name()))
if (attacker.getTimers().get("Attack" + slot.name()).timeToExecutionLeft() <= 0)
attacker.getTimers().remove("Attack" + slot.name());
else
return;
} }
target.combatLock.writeLock().lock();
// check if character is in range to attack target // check if character is in range to attack target
try {
PlayerBonuses bonus = attacker.getBonuses();
float rangeMod = 1.0f; PlayerBonuses bonus = attacker.getBonuses();
float attackRange = MBServerStatics.NO_WEAPON_RANGE;
Item weapon = attacker.charItemManager.getEquipped(slot); float rangeMod = 1.0f;
float attackRange = MBServerStatics.NO_WEAPON_RANGE;
if (weapon != null) { Item weapon = attacker.charItemManager.getEquipped(slot);
if (bonus != null)
rangeMod += bonus.getFloatPercentAll(mbEnums.ModType.WeaponRange, mbEnums.SourceType.None);
attackRange += weapon.template.item_weapon_max_range * rangeMod; if (weapon != null) {
} if (bonus != null)
rangeMod += bonus.getFloatPercentAll(mbEnums.ModType.WeaponRange, mbEnums.EffectSourceType.None);
if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob)) attackRange += weapon.template.item_weapon_max_range * rangeMod;
if (((Mob) attacker).isSiege()) }
attackRange = 300;
float distanceSquared = attacker.loc.distanceSquared(target.loc); if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob))
if (((Mob) attacker).isSiege())
attackRange = 300;
boolean inRange = false; float distanceSquared = attacker.loc.distanceSquared(target.loc);
if (AbstractCharacter.IsAbstractCharacter(target)) {
boolean inRange = false;
if (AbstractCharacter.IsAbstractCharacter(target)) {
attackRange += ((AbstractCharacter) target).calcHitBox();
} else {
}
if (attackRange > 15 && attacker.isMoving()) {
//cannot shoot bow while moving;
return;
}
switch (target.getObjectType()) {
case PlayerCharacter:
attackRange += ((PlayerCharacter) target).getCharacterHeight() * 0.5f;
if (distanceSquared <= attackRange * attackRange)
inRange = true;
break;
case Mob:
attackRange += ((AbstractCharacter) target).calcHitBox(); attackRange += ((AbstractCharacter) target).calcHitBox();
} else { if (distanceSquared <= attackRange * attackRange)
//need to handle building attacks range calculations here inRange = true;
} break;
case Building:
attackRange += 4; // need to add 4 to the attack range to offset where the client stops short of legitimate range if (attackRange > 15) {
float rangeSquared = (attackRange + target.getBounds().getHalfExtents().x) * (attackRange + target.getBounds().getHalfExtents().x);
float distance = target.loc.distance(attacker.loc); //float distanceSquared = attacker.loc.distanceSquared(target.loc);
if (attackRange > 25 && attacker.isMoving()) { if (distanceSquared < rangeSquared) {
//cannot shoot bow while moving;
return;
}
switch (target.getObjectType()) {
case PlayerCharacter:
attackRange += ((PlayerCharacter) target).getCharacterHeight() * 0.5f;
if (distanceSquared < attackRange * attackRange)
inRange = true; inRange = true;
break;
case Mob:
attackRange += ((AbstractCharacter) target).calcHitBox();
if (distanceSquared < attackRange * attackRange)
inRange = true;
break;
case Building:
if (attackRange > 15) {
float rangeSquared = (attackRange + target.getBounds().getHalfExtents().x) * (attackRange + target.getBounds().getHalfExtents().x);
//float distanceSquared = attacker.loc.distanceSquared(target.loc);
if (distanceSquared < rangeSquared) {
inRange = true;
break;
}
} else {
float locX = target.loc.x - target.getBounds().getHalfExtents().x;
float locZ = target.loc.z - target.getBounds().getHalfExtents().y;
float sizeX = (target.getBounds().getHalfExtents().x + attackRange) * 2;
float sizeZ = (target.getBounds().getHalfExtents().y + attackRange) * 2;
Rectangle2D.Float rect = new Rectangle2D.Float(locX, locZ, sizeX, sizeZ);
if (rect.contains(new Point2D.Float(attacker.loc.x, attacker.loc.z)))
inRange = true;
break; break;
} }
} } else {
float locX = target.loc.x - target.getBounds().getHalfExtents().x;
float locZ = target.loc.z - target.getBounds().getHalfExtents().y;
float sizeX = (target.getBounds().getHalfExtents().x + attackRange) * 2;
float sizeZ = (target.getBounds().getHalfExtents().y + attackRange) * 2;
Rectangle2D.Float rect = new Rectangle2D.Float(locX, locZ, sizeX, sizeZ);
if (rect.contains(new Point2D.Float(attacker.loc.x, attacker.loc.z)))
inRange = true;
break;
}
}
//get delay for the auto attack job //get delay for the auto attack job
long delay = 5000; long delay = 5000;
//if (weapon != null) { if (weapon != null) {
// int wepSpeed = (int) (weapon.template.item_weapon_wepspeed); float wepSpeed = (int) (weapon.template.item_weapon_wepspeed);
// if (weapon.getBonusPercent(mbEnums.ModType.WeaponSpeed, mbEnums.SourceType.None) != 0f) //add weapon speed bonus if (weapon.getBonusPercent(mbEnums.ModType.WeaponSpeed, mbEnums.EffectSourceType.None) != 0f) //add weapon speed bonus
// wepSpeed *= (1 + weapon.getBonus(mbEnums.ModType.WeaponSpeed, mbEnums.SourceType.None)); wepSpeed *= (1 + weapon.getBonus(mbEnums.ModType.WeaponSpeed, mbEnums.EffectSourceType.None));
// if (attacker.getBonuses() != null && attacker.getBonuses().getFloatPercentAll(mbEnums.ModType.AttackDelay, mbEnums.SourceType.None) != 0f) //add effects speed bonus if (attacker.getBonuses() != null && attacker.getBonuses().getFloatPercentAll(mbEnums.ModType.AttackDelay, mbEnums.EffectSourceType.None) != 0f) //add effects speed bonus
// wepSpeed *= (1 + attacker.getBonuses().getFloatPercentAll(mbEnums.ModType.AttackDelay, mbEnums.SourceType.None)); wepSpeed *= (1 + attacker.getBonuses().getFloatPercentAll(mbEnums.ModType.AttackDelay, mbEnums.EffectSourceType.None));
// if (wepSpeed < 10) if (wepSpeed < 10)
// wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects. wepSpeed = 10; //Old was 10, but it can be reached lower with legit buffs,effects.
// delay = wepSpeed * 100L; delay = (long)wepSpeed * 100L;
//} }
if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob))
((Mob) attacker).nextAttackTime = System.currentTimeMillis() + delay;
if (inRange) {
if(attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)){ if(attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)){
if(slot.equals(mbEnums.EquipSlotType.RHELD)){ if(!attacker.getTimestamps().contains(slot.name()+"Attack")){
delay = (long)(attacker.speedHandOne * 100L); attacker.getTimestamps().put(slot.name()+"Attack", System.currentTimeMillis() - 1000);
}else{ } else if(System.currentTimeMillis() < attacker.getTimestamps().get(slot.name()+"Attack") + delay){
delay = (long)(attacker.speedHandTwo * 100L); setAutoAttackJob(attacker,slot,delay);
return;
} }
} }
if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob))
((Mob) attacker).nextAttackTime = System.currentTimeMillis() + delay;
delay += addedDelay;
if (inRange) {
//handle retaliate //handle retaliate
if (AbstractCharacter.IsAbstractCharacter(target)) { if (AbstractCharacter.IsAbstractCharacter(target)) {
if (((AbstractCharacter) target).combatTarget == null || !((AbstractCharacter) target).combatTarget.isAlive()) { if (((AbstractCharacter) target).combatTarget == null || !((AbstractCharacter) target).combatTarget.isAlive()) {
((AbstractCharacter) target).combatTarget = attacker; ((AbstractCharacter) target).combatTarget = attacker;
if (target.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter) && ((AbstractCharacter) target).isCombat()) if (target.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter) && ((AbstractCharacter) target).isCombat())
combatCycle((AbstractCharacter) target, attacker,0); combatCycle((AbstractCharacter) target, attacker);
}
} }
}
// take stamina away from attacker if its not a mob // take stamina away from attacker if its not a mob
if (weapon != null && !attacker.getObjectType().equals(mbEnums.GameObjectType.Mob)) { if (weapon != null && !attacker.getObjectType().equals(mbEnums.GameObjectType.Mob)) {
//check if Out of Stamina //check if Out of Stamina
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
if (attacker.getStamina() < (weapon.template.item_wt / 3f)) {
//set auto attack job
setAutoAttackJob(attacker, slot, delay);
return;
}
}
float stam = weapon.template.item_wt / 3f;
stam = (stam < 1) ? 1 : stam;
attacker.modifyStamina(-(stam), attacker, true);
} else
attacker.modifyStamina(1, attacker, true);
//cancel things that are cancelled by an attack
attacker.cancelOnAttackSwing();
//declare relevant variables
int min = attacker.minDamageHandOne;
int max = attacker.maxDamageHandOne;
int atr = attacker.atrHandOne;
//get the proper stats based on which slot is attacking
if (slot == mbEnums.EquipSlotType.LHELD) {
min = attacker.minDamageHandTwo;
max = attacker.maxDamageHandTwo;
atr = attacker.atrHandTwo;
}
//apply weapon powers before early exit for miss or passives
DeferredPowerJob dpj = null;
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) { if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
if (attacker.getStamina() < (weapon.template.item_wt / 3f)) {
dpj = ((PlayerCharacter) attacker).getWeaponPower();
if (dpj != null) {
dpj.attack(target, attackRange);
if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518))
((PlayerCharacter) attacker).setWeaponPower(dpj);
}
}
int def = 0;
if (AbstractCharacter.IsAbstractCharacter(target))
def = ((AbstractCharacter) target).defenseRating;
//calculate hit chance based off ATR and DEF
int hitChance;
if (def == 0)
def = 1;
float dif = atr * 1f / def;
if (dif <= 0.8f)
hitChance = 4;
else
hitChance = ((int) (450 * (dif - 0.8f)) + 4);
if (target.getObjectType() == mbEnums.GameObjectType.Building)
hitChance = 100;
int passiveAnim = getPassiveAnimation(mbEnums.PassiveType.None); // checking for a miss due to ATR vs Def
if (ThreadLocalRandom.current().nextInt(100) > hitChance) {
TargetedActionMsg msg = new TargetedActionMsg(attacker, target, 0f, passiveAnim);
if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter)
DispatchManager.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
else
DispatchManager.sendToAllInRange(attacker, msg);
//we need to send the animation even if the attacker misses
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot));
DispatchManager.sendToAllInRange(target, cmm);
//set auto attack job
setAutoAttackJob(attacker, slot, delay);
return;
}
//calculate passive chances only if target is AbstractCharacter
if (EnumSet.of(mbEnums.GameObjectType.PlayerCharacter, mbEnums.GameObjectType.NPC, mbEnums.GameObjectType.Mob).contains(target.getObjectType())) {
mbEnums.PassiveType passiveType = mbEnums.PassiveType.None;
int hitRoll = ThreadLocalRandom.current().nextInt(100);
float dodgeChance = ((AbstractCharacter) target).getPassiveChance("Dodge", attacker.getLevel(), true);
float blockChance = ((AbstractCharacter) target).getPassiveChance("Block", attacker.getLevel(), true);
float parryChance = ((AbstractCharacter) target).getPassiveChance("Parry", attacker.getLevel(), true);
// Passive chance clamped at 75
dodgeChance = Math.max(0, Math.min(75, dodgeChance));
blockChance = Math.max(0, Math.min(75, blockChance));
parryChance = Math.max(0, Math.min(75, parryChance));
if (hitRoll < dodgeChance)
passiveType = mbEnums.PassiveType.Dodge;
else if (hitRoll < blockChance)
passiveType = mbEnums.PassiveType.Block;
else if (hitRoll < parryChance)
passiveType = mbEnums.PassiveType.Parry;
if (!passiveType.equals(mbEnums.PassiveType.None)) {
passiveAnim = getPassiveAnimation(passiveType);
TargetedActionMsg msg = new TargetedActionMsg(attacker, passiveAnim, target, passiveType.value);
if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter)
DispatchManager.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
//we need to send the animation even if the attacker misses
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot));
DispatchManager.sendToAllInRange(target, cmm);
//set auto attack job //set auto attack job
setAutoAttackJob(attacker, slot, delay); setAutoAttackJob(attacker, slot, delay);
return; return;
} }
} }
float stam = weapon.template.item_wt / 3f;
stam = (stam < 1) ? 1 : stam;
attacker.modifyStamina(-(stam), attacker, true);
} else
attacker.modifyStamina(1, attacker, true);
//calculate the base damage //cancel things that are cancelled by an attack
int damage = ThreadLocalRandom.current().nextInt(min, max + 1);
if (damage == 0) { attacker.cancelOnAttackSwing();
//declare relevant variables
int min = attacker.minDamageHandOne;
int max = attacker.maxDamageHandOne;
int atr = attacker.atrHandOne;
//get the proper stats based on which slot is attacking
if (slot == mbEnums.EquipSlotType.LHELD) {
min = attacker.minDamageHandTwo;
max = attacker.maxDamageHandTwo;
atr = attacker.atrHandTwo;
}
//apply weapon powers before early exit for miss or passives
DeferredPowerJob dpj = null;
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
dpj = ((PlayerCharacter) attacker).getWeaponPower();
if (dpj != null) {
dpj.attack(target, attackRange);
if (dpj.getPower() != null && (dpj.getPowerToken() == -1851459567 || dpj.getPowerToken() == -1851489518))
((PlayerCharacter) attacker).setWeaponPower(dpj);
}
}
int def = 0;
if (AbstractCharacter.IsAbstractCharacter(target))
def = ((AbstractCharacter) target).defenseRating;
//calculate hit chance based off ATR and DEF
int hitChance;
if (def == 0)
def = 1;
float dif = atr * 1f / def;
if (dif <= 0.8f)
hitChance = 4;
else
hitChance = ((int) (450 * (dif - 0.8f)) + 4);
if (target.getObjectType() == mbEnums.GameObjectType.Building)
hitChance = 100;
int passiveAnim = getPassiveAnimation(mbEnums.PassiveType.None); // checking for a miss due to ATR vs Def
if (ThreadLocalRandom.current().nextInt(100) > hitChance) {
TargetedActionMsg msg = new TargetedActionMsg(attacker, target, 0f, passiveAnim);
if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter)
DispatchManager.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
else
DispatchManager.sendToAllInRange(attacker, msg);
//we need to send the animation even if the attacker misses
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot));
DispatchManager.sendToAllInRange(target, cmm);
//set auto attack job
setAutoAttackJob(attacker, slot, delay);
return;
}
//calculate passive chances only if target is AbstractCharacter
if (EnumSet.of(mbEnums.GameObjectType.PlayerCharacter, mbEnums.GameObjectType.NPC, mbEnums.GameObjectType.Mob).contains(target.getObjectType())) {
mbEnums.PassiveType passiveType = mbEnums.PassiveType.None;
int hitRoll = ThreadLocalRandom.current().nextInt(100);
float dodgeChance = ((AbstractCharacter) target).getPassiveChance("Dodge", attacker.getLevel(), true);
float blockChance = ((AbstractCharacter) target).getPassiveChance("Block", attacker.getLevel(), true);
float parryChance = ((AbstractCharacter) target).getPassiveChance("Parry", attacker.getLevel(), true);
// Passive chance clamped at 75
dodgeChance = Math.max(0, Math.min(75, dodgeChance));
blockChance = Math.max(0, Math.min(75, blockChance));
parryChance = Math.max(0, Math.min(75, parryChance));
if (hitRoll < dodgeChance)
passiveType = mbEnums.PassiveType.Dodge;
else if (hitRoll < blockChance)
passiveType = mbEnums.PassiveType.Block;
else if (hitRoll < parryChance)
passiveType = mbEnums.PassiveType.Parry;
if (!passiveType.equals(mbEnums.PassiveType.None)) {
passiveAnim = getPassiveAnimation(passiveType);
TargetedActionMsg msg = new TargetedActionMsg(attacker, passiveAnim, target, passiveType.value);
if (target.getObjectType() == mbEnums.GameObjectType.PlayerCharacter)
DispatchManager.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false);
//we need to send the animation even if the attacker misses
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot));
DispatchManager.sendToAllInRange(target, cmm);
//set auto attack job //set auto attack job
setAutoAttackJob(attacker, slot, delay); setAutoAttackJob(attacker, slot, delay);
return; return;
} }
if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob) && ((Mob) attacker).isPet()) }
calculatePetDamage(attacker);
//get the damage type //check for proccing
checkForProc(attacker,target,weapon);
mbEnums.DamageType damageType; //calculate the base damage
int damage = ThreadLocalRandom.current().nextInt(min, max + 1);
if (damage == 0) {
//set auto attack job
setAutoAttackJob(attacker, slot, delay);
return;
}
if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob) && ((Mob) attacker).isPet())
calculatePetDamage(attacker);
if (attacker.charItemManager.getEquipped().get(slot) == null) { //get the damage type
damageType = mbEnums.DamageType.CRUSHING;
if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob))
if (((Mob) attacker).isSiege())
damageType = mbEnums.DamageType.SIEGE;
} else {
damageType = (mbEnums.DamageType) attacker.charItemManager.getEquipped().get(slot).template.item_weapon_damage.keySet().toArray()[0];
}
//get resists mbEnums.DamageType damageType;
Resists resists; if (attacker.charItemManager.getEquipped().get(slot) == null) {
damageType = mbEnums.DamageType.CRUSHING;
if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob))
if (((Mob) attacker).isSiege())
damageType = mbEnums.DamageType.SIEGE;
} else {
damageType = (mbEnums.DamageType) attacker.charItemManager.getEquipped().get(slot).template.item_weapon_damage.keySet().toArray()[0];
}
if (!AbstractCharacter.IsAbstractCharacter(target)) //get resists
resists = ((Building) target).getResists(); //this is a building
else
resists = ((AbstractCharacter) target).getResists(); //this is a character
if (AbstractCharacter.IsAbstractCharacter(target)) { Resists resists;
AbstractCharacter absTarget = (AbstractCharacter) target;
//check damage shields if (!AbstractCharacter.IsAbstractCharacter(target))
resists = ((Building) target).getResists(); //this is a building
else
resists = ((AbstractCharacter) target).getResists(); //this is a character
PlayerBonuses bonuses = absTarget.getBonuses(); if (AbstractCharacter.IsAbstractCharacter(target)) {
AbstractCharacter absTarget = (AbstractCharacter) target;
if (bonuses != null) { //check damage shields
ConcurrentHashMap<AbstractEffectModifier, DamageShield> damageShields = bonuses.getDamageShields(); PlayerBonuses bonuses = absTarget.getBonuses();
float total = 0;
for (DamageShield ds : damageShields.values()) { if (bonuses != null) {
//get amount to damage back ConcurrentHashMap<AbstractEffectModifier, DamageShield> damageShields = bonuses.getDamageShields();
float total = 0;
float amount; for (DamageShield ds : damageShields.values()) {
if (ds.usePercent()) //get amount to damage back
amount = damage * ds.getAmount() / 100;
else
amount = ds.getAmount();
//get resisted damage for damagetype float amount;
if (resists != null) if (ds.usePercent())
amount = resists.getResistedDamage(absTarget, attacker, ds.getDamageType(), amount, 0); amount = damage * ds.getAmount() / 100;
total += amount; else
} amount = ds.getAmount();
if (total > 0) { //get resisted damage for damagetype
//apply Damage back
attacker.modifyHealth(-total, absTarget, true); if (resists != null)
TargetedActionMsg cmm = new TargetedActionMsg(attacker, attacker, total, 0); amount = resists.getResistedDamage(absTarget, attacker, ds.getDamageType(), amount, 0);
DispatchManager.sendToAllInRange(target, cmm); total += amount;
}
} }
if (resists != null) { if (total > 0) {
//apply Damage back
//check for damage type immunities attacker.modifyHealth(-total, absTarget, true);
TargetedActionMsg cmm = new TargetedActionMsg(attacker, attacker, total, 0);
if (resists.immuneTo(damageType)) { DispatchManager.sendToAllInRange(target, cmm);
//set auto attack job
//we need to send the animation even if the attacker misses
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot));
DispatchManager.sendToAllInRange(target, cmm);
setAutoAttackJob(attacker, slot, delay);
return;
}
//calculate resisted damage including fortitude
if(attacker.getObjectType().equals(mbEnums.GameObjectType.Mob))
if(((Mob)attacker).isPet())
damage *= attacker.level * 0.1f;
damage = (int) resists.getResistedDamage(attacker, (AbstractCharacter) target, damageType, damage, 0);
} }
} }
//remove damage from target health if (resists != null) {
if (damage > 0) { //check for damage type immunities
if (AbstractCharacter.IsAbstractCharacter(target)) if (resists.immuneTo(damageType)) {
((AbstractCharacter) target).modifyHealth(-damage, attacker, true); //set auto attack job
else //we need to send the animation even if the attacker misses
((Building) target).modifyHealth(-damage, attacker); TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot));
DispatchManager.sendToAllInRange(target, cmm);
int attackAnim = getSwingAnimation(null, null, slot); setAutoAttackJob(attacker, slot, delay);
if (attacker.charItemManager.getEquipped().get(slot) != null) { return;
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
DeferredPowerJob weaponPower = ((PlayerCharacter) attacker).getWeaponPower();
attackAnim = getSwingAnimation(weapon.template, weaponPower, slot);
} else {
attackAnim = getSwingAnimation(weapon.template, null, slot);
}
} }
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) damage, attackAnim); //calculate resisted damage including fortitude
DispatchManager.sendToAllInRange(target, cmm);
damage = (int) resists.getResistedDamage(attacker, (AbstractCharacter) target, damageType, damage, 0);
} }
} }
//set auto attack job //remove damage from target health
setAutoAttackJob(attacker, slot, delay);
} catch (Exception ex) { if (damage > 0) {
cancelAutoAttackJob(attacker,slot);
//Logger.error("COMBAT CAUGHT ERROR: " + ex.getMessage()); if (AbstractCharacter.IsAbstractCharacter(target))
} finally { ((AbstractCharacter) target).modifyHealth(-damage, attacker, true);
target.combatLock.writeLock().unlock(); else
((Building) target).modifyHealth(-damage, attacker);
int attackAnim = getSwingAnimation(null, null, slot);
if (attacker.charItemManager.getEquipped().get(slot) != null) {
if (attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
DeferredPowerJob weaponPower = ((PlayerCharacter) attacker).getWeaponPower();
attackAnim = getSwingAnimation(weapon.template, weaponPower, slot);
} else {
attackAnim = getSwingAnimation(weapon.template, null, slot);
}
}
TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) damage, attackAnim);
DispatchManager.sendToAllInRange(target, cmm);
}
} }
//set auto attack job
setAutoAttackJob(attacker, slot, delay);
} }
public static void toggleCombat(boolean toggle, ClientConnection origin) { public static void toggleCombat(boolean toggle, ClientConnection origin) {
@@ -559,7 +558,7 @@ public enum CombatManager {
} }
//Item has no equipment slots and should not try to return an animation, return default instead //Item has no equipment slots and should not try to return an animation, return default instead
if(wb.item_eq_slots_or == null || wb.item_eq_slots_or.isEmpty()){ if (wb.item_eq_slots_or == null || wb.item_eq_slots_or.isEmpty()) {
return 75; return 75;
} }
@@ -568,15 +567,15 @@ public enum CombatManager {
int random; int random;
//Item can only be equipped in one slot, return animation for that slot //Item can only be equipped in one slot, return animation for that slot
if(wb.item_eq_slots_or.size() == 1){ if (wb.item_eq_slots_or.size() == 1) {
if (wb.item_eq_slots_or.iterator().next().equals(mbEnums.EquipSlotType.RHELD)) { if (wb.item_eq_slots_or.iterator().next().equals(mbEnums.EquipSlotType.RHELD)) {
anim = wb.weapon_attack_anim_right.get(0)[0]; anim = wb.weapon_attack_anim_right.get(0)[0];
if (dpj != null) { if (dpj != null) {
random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_right.size()); random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_right.size());
anim = wb.weapon_attack_anim_right.get(random)[0]; anim = wb.weapon_attack_anim_right.get(random)[0];
} }
}else { } else {
anim = wb.weapon_attack_anim_left.get(0)[0]; anim = wb.weapon_attack_anim_left.get(0)[0];
if (dpj != null) { if (dpj != null) {
random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_left.size()); random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_left.size());
anim = wb.weapon_attack_anim_left.get(random)[0]; anim = wb.weapon_attack_anim_left.get(random)[0];
@@ -592,7 +591,7 @@ public enum CombatManager {
random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_right.size()); random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_right.size());
anim = wb.weapon_attack_anim_right.get(random)[0]; anim = wb.weapon_attack_anim_right.get(random)[0];
} }
}else { } else {
anim = wb.weapon_attack_anim_left.get(0)[0]; anim = wb.weapon_attack_anim_left.get(0)[0];
if (dpj != null) { if (dpj != null) {
random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_left.size()); random = ThreadLocalRandom.current().nextInt(wb.weapon_attack_anim_left.size());
@@ -602,8 +601,8 @@ public enum CombatManager {
return anim; return anim;
} }
public static int getPassiveAnimation(mbEnums.PassiveType passiveType){ public static int getPassiveAnimation(mbEnums.PassiveType passiveType) {
switch(passiveType){ switch (passiveType) {
case Block: case Block:
return COMBAT_BLOCK_ANIMATION; return COMBAT_BLOCK_ANIMATION;
case Parry: case Parry:
@@ -618,10 +617,7 @@ public enum CombatManager {
public static void setAutoAttackJob(AbstractCharacter attacker, mbEnums.EquipSlotType slot, long delay) { public static void setAutoAttackJob(AbstractCharacter attacker, mbEnums.EquipSlotType slot, long delay) {
//calculate next allowed attack and update the timestamp //calculate next allowed attack and update the timestamp
if(attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter) == false) if (attacker.getTimestamps().containsKey("Attack" + slot.name()) && attacker.getTimestamps().get("Attack" + slot.name()) > System.currentTimeMillis())
return; //mobs dont submit auto attack jobs
if(attacker.getTimestamps().containsKey("Attack" + slot.name()) && attacker.getTimestamps().get("Attack" + slot.name()) > System.currentTimeMillis())
return; return;
attacker.getTimestamps().put("Attack" + slot.name(), System.currentTimeMillis() + delay); attacker.getTimestamps().put("Attack" + slot.name(), System.currentTimeMillis() + delay);
@@ -630,7 +626,7 @@ public enum CombatManager {
ConcurrentHashMap<String, JobContainer> timers = attacker.getTimers(); ConcurrentHashMap<String, JobContainer> timers = attacker.getTimers();
if (timers != null) { if (timers != null) {
AttackJob aj = new AttackJob(attacker, slot.ordinal(), true, attacker.getCombatTarget()); AttackJob aj = new AttackJob(attacker, slot.ordinal(), true);
JobContainer job; JobContainer job;
job = JobScheduler.getInstance().scheduleJob(aj, (System.currentTimeMillis() + delay)); // offset 1 millisecond so no overlap issue job = JobScheduler.getInstance().scheduleJob(aj, (System.currentTimeMillis() + delay)); // offset 1 millisecond so no overlap issue
timers.put("Attack" + slot.name(), job); timers.put("Attack" + slot.name(), job);
@@ -638,34 +634,22 @@ public enum CombatManager {
Logger.error("Unable to find Timers for Character " + attacker.getObjectUUID()); Logger.error("Unable to find Timers for Character " + attacker.getObjectUUID());
} }
public static void cancelAutoAttackJob(AbstractCharacter attacker, mbEnums.EquipSlotType slot) {
if(attacker.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter) == false) public static int calculatePetDamage(AbstractCharacter agent) {
return;
attacker.getTimestamps().put("Attack" + slot.name(), System.currentTimeMillis());
//handle auto attack job creation
ConcurrentHashMap<String, JobContainer> timers = attacker.getTimers();
if (timers != null) {
timers.get("Attack" + slot.name()).cancelJob();
} else
Logger.error("Unable to find Timers for Character " + attacker.getObjectUUID());
}
public static void calculatePetDamage(AbstractCharacter agent) {
//damage calc for pet //damage calc for pet
float range; float range;
float damage; float damage;
float min = 40; float min = 40;
float max = 60; float max = 60;
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(mbEnums.ModType.MeleeDamageModifier, mbEnums.SourceType.None); float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(mbEnums.ModType.MeleeDamageModifier, mbEnums.EffectSourceType.None);
double minDmg = getMinDmg(min, agent); double minDmg = getMinDmg(min, agent);
double maxDmg = getMaxDmg(max, agent); double maxDmg = getMaxDmg(max, agent);
dmgMultiplier += agent.getLevel() * 0.1f; dmgMultiplier += agent.getLevel() * 0.1f;
range = (float) (maxDmg - minDmg); range = (float) (maxDmg - minDmg);
damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2; damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2;
return (int) (damage * dmgMultiplier);
} }
public static double getMinDmg(double min, AbstractCharacter agent) { public static double getMinDmg(double min, AbstractCharacter agent) {
int primary = agent.getStatStrCurrent(); int primary = agent.getStatStrCurrent();
int secondary = agent.getStatDexCurrent(); int secondary = agent.getStatDexCurrent();
@@ -673,6 +657,7 @@ public enum CombatManager {
int masteryLevel = 0; int masteryLevel = 0;
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)); return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel));
} }
public static double getMaxDmg(double max, AbstractCharacter agent) { public static double getMaxDmg(double max, AbstractCharacter agent) {
int primary = agent.getStatStrCurrent(); int primary = agent.getStatStrCurrent();
int secondary = agent.getStatDexCurrent(); int secondary = agent.getStatDexCurrent();
@@ -680,4 +665,20 @@ public enum CombatManager {
int masteryLevel = 0; int masteryLevel = 0;
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)); return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel));
} }
public static void checkForProc(AbstractCharacter attacker, AbstractWorldObject target, Item weapon){
if(weapon == null) // cant proc without a weapon
return;
for(Effect eff : weapon.effects.values()){
for(AbstractEffectModifier mod : eff.getEffectsBase().getModifiers()){
if(mod.modType.equals(mbEnums.ModType.WeaponProc))
if(ThreadLocalRandom.current().nextInt(0,101) < 6)
((WeaponProcEffectModifier)mod).applyProc(attacker,target);
}
}
}
} }
+1 -1
View File
@@ -67,7 +67,7 @@ public enum ForgeManager implements Runnable {
// Early exit for completed workOrders loaded from disk // Early exit for completed workOrders loaded from disk
// or vendors who were re-deeded with items still cooking. // or vendors who were re-deeded with items still cooking.
if (workOrder.vendor == null && workOrder.runCompleted.get()) if (workOrder.vendor == null || workOrder.runCompleted.get())
continue; continue;
// This workOrder has completed production. // This workOrder has completed production.
+1 -1
View File
@@ -102,7 +102,7 @@ public enum ItemManager {
if (characterSkill == null) if (characterSkill == null)
return false; return false;
if (characterSkill.getModifiedAmountBeforeMods() > required_value) if (characterSkill.getModifiedAmountBeforeMods() >= required_value)
return true; return true;
} }
+3 -3
View File
@@ -14,9 +14,9 @@ import engine.math.Vector3f;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.DispatchChannel; import engine.mbEnums.DispatchChannel;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.MoveToPointMsg; import engine.net.client.msg.MoveToPointMsg;
import engine.net.client.msg.TeleportToPointMsg; import engine.net.client.msg.TeleportToPointMsg;
@@ -74,7 +74,7 @@ public enum MovementManager {
toMove.setIsCasting(false); toMove.setIsCasting(false);
toMove.setItemCasting(false); toMove.setItemCasting(false);
if (toMove.getBonuses().getBool(ModType.Stunned, SourceType.None) || toMove.getBonuses().getBool(ModType.CannotMove, SourceType.None)) { if (toMove.getBonuses().getBool(ModType.Stunned, EffectSourceType.None) || toMove.getBonuses().getBool(ModType.CannotMove, EffectSourceType.None)) {
return; return;
} }
@@ -390,7 +390,7 @@ public enum MovementManager {
//don't move if player is stunned or rooted //don't move if player is stunned or rooted
PlayerBonuses bonus = member.getBonuses(); PlayerBonuses bonus = member.getBonuses();
if (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotMove, SourceType.None)) if (bonus.getBool(ModType.Stunned, EffectSourceType.None) || bonus.getBool(ModType.CannotMove, EffectSourceType.None))
continue; continue;
member.update(); member.update();
+34 -22
View File
@@ -172,16 +172,33 @@ public enum PowersManager {
public static void usePower(final PerformActionMsg msg, ClientConnection origin, public static void usePower(final PerformActionMsg msg, ClientConnection origin,
boolean sendCastToSelf) { boolean sendCastToSelf) {
if (ConfigManager.MB_RULESET.getValue().equals("LORE") && getPowerByToken(msg.getPowerUsedID()).ignoreLore() == false) { if (ConfigManager.MB_RULESET.getValue().equals("LORE")) {
PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID()); PowersBase pb = PowersManager.powersBaseByToken.get(msg.getPowerUsedID());
PlayerCharacter caster = origin.getPlayerCharacter(); PlayerCharacter caster = origin.getPlayerCharacter();
PlayerCharacter target = PlayerCharacter.getFromCache(msg.getTargetID()); PlayerCharacter target = PlayerCharacter.getFromCache(msg.getTargetID());
if (pb != null && pb.isHarmful == false) { if (pb != null && pb.enforceLore()) {
//if (caster.guild.equals(Guild.getErrantGuild())) //if (caster.guild.equals(Guild.getErrantGuild()))
// return; // return;
if (target != null && caster.guild.getGuildType().equals(target.guild.getGuildType()) == false && target.getObjectType().equals(GameObjectType.Building) == false) if (target != null && caster.guild.getGuildType().equals(target.guild.getGuildType()) == false && target.getObjectType().equals(GameObjectType.Building) == false) {
RecyclePowerMsg recyclePowerMsg = new RecyclePowerMsg(msg.getPowerUsedID());
Dispatch dispatch = Dispatch.borrow(origin.getPlayerCharacter(), recyclePowerMsg);
DispatchManager.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();
}
pc.setIsCasting(false);
}
return; return;
}
} }
} }
@@ -331,8 +348,8 @@ public enum PowersManager {
// verify player is not stunned or prohibited from casting // verify player is not stunned or prohibited from casting
PlayerBonuses bonus = playerCharacter.getBonuses(); PlayerBonuses bonus = playerCharacter.getBonuses();
SourceType sourceType = SourceType.GetSourceType(pb.getCategory()); EffectSourceType sourceType = EffectSourceType.getEffectSourceType(pb.getCategory());
if (bonus != null && (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotCast, SourceType.None) || bonus.getBool(ModType.BlockedPowerType, sourceType))) if (bonus != null && (bonus.getBool(ModType.Stunned, EffectSourceType.None) || bonus.getBool(ModType.CannotCast, EffectSourceType.None) || bonus.getBool(ModType.BlockedPowerType, sourceType)))
return true; return true;
// if moving make sure spell valid for movement // if moving make sure spell valid for movement
@@ -468,7 +485,7 @@ public enum PowersManager {
cost = 0; cost = 0;
if (bonus != null) if (bonus != null)
cost *= (1 + bonus.getFloatPercentAll(ModType.PowerCost, SourceType.None)); cost *= (1 + bonus.getFloatPercentAll(ModType.PowerCost, EffectSourceType.None));
if (playerCharacter.getAltitude() > 0) if (playerCharacter.getAltitude() > 0)
cost *= 1.5f; cost *= 1.5f;
@@ -614,8 +631,8 @@ public enum PowersManager {
// verify player is in correct mode (combat/nonCombat) // verify player is in correct mode (combat/nonCombat)
// verify player is not stunned or prohibited from casting // verify player is not stunned or prohibited from casting
PlayerBonuses bonus = caster.getBonuses(); PlayerBonuses bonus = caster.getBonuses();
SourceType sourceType = SourceType.GetSourceType(pb.getCategory()); EffectSourceType sourceType = EffectSourceType.getEffectSourceType(pb.getCategory());
if (bonus != null && (bonus.getBool(ModType.Stunned, SourceType.None) || bonus.getBool(ModType.CannotCast, SourceType.None) || bonus.getBool(ModType.BlockedPowerType, sourceType))) if (bonus != null && (bonus.getBool(ModType.Stunned, EffectSourceType.None) || bonus.getBool(ModType.CannotCast, EffectSourceType.None) || bonus.getBool(ModType.BlockedPowerType, sourceType)))
return true; return true;
// if moving make sure spell valid for movement // if moving make sure spell valid for movement
@@ -775,10 +792,10 @@ public enum PowersManager {
PlayerBonuses bonus = playerCharacter.getBonuses(); PlayerBonuses bonus = playerCharacter.getBonuses();
if (bonus != null) { if (bonus != null) {
if (bonus.getBool(ModType.Stunned, SourceType.None)) if (bonus.getBool(ModType.Stunned, EffectSourceType.None))
return; return;
SourceType sourceType = SourceType.GetSourceType(pb.getCategory()); EffectSourceType sourceType = EffectSourceType.getEffectSourceType(pb.getCategory());
if (bonus.getBool(ModType.BlockedPowerType, sourceType)) { if (bonus.getBool(ModType.BlockedPowerType, sourceType)) {
finishRecycleTime(msg.getPowerUsedID(), playerCharacter, true); finishRecycleTime(msg.getPowerUsedID(), playerCharacter, true);
return; return;
@@ -908,10 +925,6 @@ public enum PowersManager {
if (pb.isHarmful()) if (pb.isHarmful())
mobTarget.handleDirectAggro(playerCharacter); mobTarget.handleDirectAggro(playerCharacter);
} }
//Power is aiding a target, handle aggro if combat target is a Mob.
if (!pb.isHarmful() && target.getObjectType() == GameObjectType.PlayerCharacter) {
PlayerCharacter pcTarget = (PlayerCharacter) target;
}
// update target of used power timer // update target of used power timer
@@ -933,8 +946,7 @@ public enum PowersManager {
continue; continue;
// If something blocks the action, then stop // If something blocks the action, then stop
if (ab.blocked(target, pb, trains)) { if (ab.blocked(target,pb.vampDrain)) {
PowersManager.sendEffectMsg(playerCharacter, 5, ab, pb); PowersManager.sendEffectMsg(playerCharacter, 5, ab, pb);
continue; continue;
} }
@@ -1053,9 +1065,9 @@ public enum PowersManager {
// verify player is not stunned or power type is blocked // verify player is not stunned or power type is blocked
PlayerBonuses bonus = caster.getBonuses(); PlayerBonuses bonus = caster.getBonuses();
if (bonus != null) { if (bonus != null) {
if (bonus.getBool(ModType.Stunned, SourceType.None)) if (bonus.getBool(ModType.Stunned, EffectSourceType.None))
return; return;
SourceType sourceType = SourceType.GetSourceType(pb.getCategory()); EffectSourceType sourceType = EffectSourceType.getEffectSourceType(pb.getCategory());
if (bonus.getBool(ModType.BlockedPowerType, sourceType)) if (bonus.getBool(ModType.BlockedPowerType, sourceType))
return; return;
} }
@@ -1109,7 +1121,7 @@ public enum PowersManager {
continue; continue;
// If something blocks the action, then stop // If something blocks the action, then stop
if (ab.blocked(target, pb, trains)) if (ab.blocked(target,pb.vampDrain))
continue; continue;
// TODO handle overwrite stack order here // TODO handle overwrite stack order here
String stackType = ab.getStackType(); String stackType = ab.getStackType();
@@ -1423,7 +1435,7 @@ public enum PowersManager {
if (trains < ab.getMinTrains() || trains > ab.getMaxTrains()) if (trains < ab.getMinTrains() || trains > ab.getMaxTrains())
continue; continue;
// If something blocks the action, then stop // If something blocks the action, then stop
if (ab.blocked(target, pb, trains)) if (ab.blocked(target,pb.vampDrain))
// sendPowerMsg(pc, 5, msg); // sendPowerMsg(pc, 5, msg);
continue; continue;
// TODO handle overwrite stack order here // TODO handle overwrite stack order here
@@ -1688,7 +1700,7 @@ public enum PowersManager {
PlayerCharacter pcc = (PlayerCharacter) awo; PlayerCharacter pcc = (PlayerCharacter) awo;
PlayerBonuses bonuses = pcc.getBonuses(); PlayerBonuses bonuses = pcc.getBonuses();
if (bonuses != null && bonuses.getBool(ModType.ImmuneToPowers, SourceType.None)) { if (bonuses != null && bonuses.getBool(ModType.ImmuneToPowers, EffectSourceType.None)) {
awolist.remove(); awolist.remove();
continue; continue;
} }
@@ -1838,7 +1850,7 @@ public enum PowersManager {
// Remove players who are in safe mode // Remove players who are in safe mode
PlayerCharacter pcc = (PlayerCharacter) awo; PlayerCharacter pcc = (PlayerCharacter) awo;
PlayerBonuses bonuses = pcc.getBonuses(); PlayerBonuses bonuses = pcc.getBonuses();
if (bonuses != null && bonuses.getBool(ModType.ImmuneToPowers, SourceType.None)) { if (bonuses != null && bonuses.getBool(ModType.ImmuneToPowers, EffectSourceType.None)) {
awolist.remove(); awolist.remove();
continue; continue;
} }
+2 -7
View File
@@ -12,7 +12,6 @@ package engine.jobs;
import engine.gameManager.CombatManager; import engine.gameManager.CombatManager;
import engine.job.AbstractJob; import engine.job.AbstractJob;
import engine.objects.AbstractCharacter; import engine.objects.AbstractCharacter;
import engine.objects.AbstractWorldObject;
public class AttackJob extends AbstractJob { public class AttackJob extends AbstractJob {
@@ -20,20 +19,16 @@ public class AttackJob extends AbstractJob {
private final int slot; private final int slot;
private final boolean success; private final boolean success;
public final AbstractWorldObject target; public AttackJob(AbstractCharacter source, int slot, boolean success) {
public AttackJob(AbstractCharacter source, int slot, boolean success, AbstractWorldObject target) {
super(); super();
this.source = source; this.source = source;
this.slot = slot; this.slot = slot;
this.success = success; this.success = success;
this.target = target;
} }
@Override @Override
protected void doJob() { protected void doJob() {
CombatManager.combatCycle(this.source, this.source.combatTarget);
CombatManager.combatCycle(this.source,target,0);
} }
public boolean success() { public boolean success() {
+2 -2
View File
@@ -11,9 +11,9 @@ package engine.jobs;
import engine.gameManager.PowersManager; import engine.gameManager.PowersManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.objects.AbstractCharacter; import engine.objects.AbstractCharacter;
import engine.objects.AbstractWorldObject; import engine.objects.AbstractWorldObject;
import engine.objects.PlayerBonuses; import engine.objects.PlayerBonuses;
@@ -52,7 +52,7 @@ public class ChantJob extends AbstractEffectJob {
PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains); PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains);
if (AbstractWorldObject.IsAbstractCharacter(source)) if (AbstractWorldObject.IsAbstractCharacter(source))
((AbstractCharacter) source).cancelLastChant(); ((AbstractCharacter) source).cancelLastChant();
} else if (bonuses != null && bonuses.getBool(ModType.Silenced, SourceType.None)) { } else if (bonuses != null && bonuses.getBool(ModType.Silenced, EffectSourceType.None)) {
PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains); PowersManager.finishEffectTime(this.source, this.target, this.action, this.trains);
if (AbstractWorldObject.IsAbstractCharacter(source)) if (AbstractWorldObject.IsAbstractCharacter(source))
((AbstractCharacter) source).cancelLastChant(); ((AbstractCharacter) source).cancelLastChant();
+2 -2
View File
@@ -12,8 +12,8 @@ package engine.jobs;
import engine.gameManager.PowersManager; import engine.gameManager.PowersManager;
import engine.job.AbstractScheduleJob; import engine.job.AbstractScheduleJob;
import engine.job.JobContainer; import engine.job.JobContainer;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.net.client.msg.ErrorPopupMsg; import engine.net.client.msg.ErrorPopupMsg;
import engine.objects.PlayerCharacter; import engine.objects.PlayerCharacter;
@@ -55,7 +55,7 @@ public class FinishSummonsJob extends AbstractScheduleJob {
return; return;
} }
if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, SourceType.SUMMON)) { if (this.target.getBonuses() != null && this.target.getBonuses().getBool(ModType.BlockedPowerType, EffectSourceType.Summon)) {
ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!"); ErrorPopupMsg.sendErrorMsg(this.target, "You have been blocked from receiving summons!");
ErrorPopupMsg.sendErrorMsg(this.source, "Target is blocked from receiving summons!"); ErrorPopupMsg.sendErrorMsg(this.source, "Target is blocked from receiving summons!");
return; return;
+6
View File
@@ -84,6 +84,11 @@ public class WorkOrder implements Delayed {
this.completionTime = jsonWorkOrder.getLong("completionTime"); this.completionTime = jsonWorkOrder.getLong("completionTime");
this.runCompleted.set(jsonWorkOrder.getBoolean("runCompleted")); this.runCompleted.set(jsonWorkOrder.getBoolean("runCompleted"));
// Vendor sanity check. Might have been deleted
if (this.vendor == null)
return;
JSONObject productionCostMap = jsonWorkOrder.getJSONObject("production_cost"); JSONObject productionCostMap = jsonWorkOrder.getJSONObject("production_cost");
for (String key : productionCostMap.keySet()) { for (String key : productionCostMap.keySet()) {
@@ -107,6 +112,7 @@ public class WorkOrder implements Delayed {
for (Object o : tokenList) { for (Object o : tokenList) {
int prefix = ((JSONArray) o).getInt(0); int prefix = ((JSONArray) o).getInt(0);
int suffix = ((JSONArray) o).getInt(1); int suffix = ((JSONArray) o).getInt(1);
Item cookingItem = ForgeManager.forgeItem(this); Item cookingItem = ForgeManager.forgeItem(this);
cookingItem.prefixToken = prefix; cookingItem.prefixToken = prefix;
cookingItem.suffixToken = suffix; cookingItem.suffixToken = suffix;
+43 -204
View File
@@ -831,16 +831,22 @@ public class mbEnums {
SPIRES, SPIRES,
SNARE, SNARE,
STUN, STUN,
BLIND, BLINDNESS,
ROOT, ROOT,
FEAR, FEAR,
CHARM, CHARM,
POWERBLOCK, POWERINHIBITOR,
DEBUFF, DEBUFF,
STEAL, STEAL,
DRAIN; DRAIN;
public static DamageType getDamageType(String modName) { public static DamageType getDamageType(String modName) {
if(modName.toLowerCase().equals("blind"))
modName = "BLINDNESS";
if(modName.toLowerCase().equals("powerblock"))
modName = "POWERINHIBITOR";
DamageType damageType; DamageType damageType;
if (modName.isEmpty()) if (modName.isEmpty())
return DamageType.NONE; return DamageType.NONE;
@@ -855,176 +861,6 @@ public class mbEnums {
} }
} }
public enum SourceType {
None,
Abjuration,
Acid,
AntiSiege,
Archery,
Axe,
Bardsong,
Beastcraft,
Benediction,
BladeWeaving,
Bleeding,
Blind,
Block,
Bloodcraft,
Bow,
Buff,
Channeling,
Charm,
Cold,
COLD,
Constitution,
Corruption,
Crossbow,
Crushing,
Dagger,
DaggerMastery,
DeBuff,
Dexterity,
Disease,
Dodge,
Dragon,
Drain,
Earth,
Effect,
Exorcism,
Fear,
Fire,
FIRE,
Fly,
Giant,
GreatAxeMastery,
GreatSwordMastery,
Hammer,
Heal,
Healing,
Holy,
HOLY,
ImmuneToAttack,
ImmuneToPowers,
Intelligence,
Invisible,
Lightning,
LIGHTNING,
Liturgy,
Magic,
MAGIC,
Mental,
MENTAL,
NatureLore,
Necromancy,
Parry,
Piercing,
Poison,
POISON,
PoleArm,
Powerblock,
Rat,
ResistDeBuff,
Restoration,
Root,
Shadowmastery,
Siege,
Slashing,
Snare,
Sorcery,
Spear,
SpearMastery,
Spirit,
Staff,
Stormcalling,
Strength,
Stun,
Summon,
Sword,
SwordMastery,
Thaumaturgy,
Theurgy,
Transform,
UnarmedCombat,
UnarmedCombatMastery,
Unholy,
UNHOLY,
Unknown,
Warding,
Warlockry,
WayoftheGaana,
WearArmorHeavy,
WearArmorLight,
WearArmorMedium,
Wereform,
Athletics,
AxeMastery,
Bargaining,
BladeMastery,
FlameCalling,
GreatHammerMastery,
HammerMastery,
Leadership,
PoleArmMastery,
Running,
StaffMastery,
Throwing,
Toughness,
WayoftheWolf,
WayoftheRat,
WayoftheBear,
Orthanatos,
SunDancing,
//Power categories.
AE,
AEDAMAGE,
BEHAVIOR,
BLESSING,
BOONCLASS,
BOONRACE,
BREAKFLY,
BUFF,
CHANT,
DAMAGE,
DEBUFF,
DISPEL,
FLIGHT,
GROUPBUFF,
GROUPHEAL,
HEAL,
INVIS,
MOVE,
RECALL,
SPECIAL,
SPIREDISABLE,
SPIREPROOFTELEPORT,
STANCE,
STUN,
SUMMON,
TELEPORT,
THIEF,
TRACK,
TRANSFORM,
VAMPDRAIN,
WEAPON,
Wizardry;
public static SourceType GetSourceType(String modName) {
SourceType returnMod;
if (modName.isEmpty())
return SourceType.None;
try {
returnMod = SourceType.valueOf(modName.replace(",", ""));
} catch (Exception e) {
Logger.error(modName);
Logger.error(e);
return SourceType.None;
}
return returnMod;
}
}
public enum EffectSourceType { public enum EffectSourceType {
None, None,
AttackSpeedBuff, AttackSpeedBuff,
@@ -1084,7 +920,7 @@ public class mbEnums {
WereformSPRecBuff, WereformSPRecBuff,
WereformStrBuff; WereformStrBuff;
public static EffectSourceType GetEffectSourceType(String modName) { public static EffectSourceType getEffectSourceType(String modName) {
EffectSourceType returnMod; EffectSourceType returnMod;
if (modName.isEmpty()) if (modName.isEmpty())
return EffectSourceType.None; return EffectSourceType.None;
@@ -2715,42 +2551,45 @@ public class mbEnums {
public enum ResourceType { public enum ResourceType {
GOLD(7, 2308551, 100000000, 10), GOLD(7, -1670881623, 2308551, 100000000, 50000),
ADAMANT(1580003, -1741189964, 1000, 10), ADAMANT(1580003, 1557001525, -1741189964, 1000, 10),
AGATE(1580009, 75173057, 2000, 10), AGATE(1580009, -1096157543, 75173057, 2000, 20),
ANTIMONY(1580014, 452320058, 1000, 10), ANTIMONY(1580014, 1256147265, 452320058, 1000, 10),
AZOTH(1580012, 78329697, 2000, 10), AZOTH(1580012, -1205326951, 78329697, 2000, 20),
BLOODSTONE(1580020, -1569826353, 500, 10), BLOODSTONE(1580020, -1912381716, -1569826353, 500, 5),
BRONZEWOOD(1580006, 1334770447, 500, 10), BRONZEWOOD(1580006, -519681813, 1334770447, 1000, 30),
COAL(1580008, 2559427, 3000, 10), COAL(1580008, -1672872311, 2559427, 3000, 30),
DIAMOND(1580010, -1730704107, 2000, 10), DIAMOND(1580010, 1540225085, -1730704107, 2000, 20),
GALVOR(1580017, -1596311545, 2000, 10), GALVOR(1580017, -1683992404, -1596311545, 2000, 5),
IRON(1580002, 2504297, 2000, 10), IRON(1580002, -1673518119, 2504297, 2000, 20),
LUMBER(1580004, -1603256692, 10000, 10), LUMBER(1580004, 1628412684, -1603256692, 10000, 100),
MANDRAKE(1580007, 1191391799, 1000, 10), MANDRAKE(1580007, 1519910613, 1191391799, 1000, 10),
MITHRIL(1580021, -1761257186, 500, 10), MITHRIL(1580021, 626743397, -1761257186, 500, 5),
OAK(1580005, 74767, 3000, 10), OAK(1580005, -1653034775, 74767, 3000, 30),
OBSIDIAN(1580019, -697973233, 500, 10), OBSIDIAN(1580019, 778019055, -697973233, 500, 5),
ONYX(1580011, 2977263, 1000, 10), ONYX(1580011, -1675952151, 2977263, 1000, 10),
ORICHALK(1580013, -2036290524, 3000, 10), ORICHALK(1580013, -1468730955, -2036290524, 3000, 30),
QUICKSILVER(1580016, -472884509, 1000, 10), QUICKSILVER(1580016, -2081208434, -472884509, 1000, 10),
STONE(1580000, 74856115, 10000, 10), STONE(1580000, -1094703863, 74856115, 10000, 100),
SULFUR(1580015, -1586349421, 1000, 10), SULFUR(1580015, -1763687412, -1586349421, 1000, 10),
TRUESTEEL(1580001, -317484979, 2000, 10), TRUESTEEL(1580001, -169012482, -317484979, 2000, 20),
WORMWOOD(1580018, 1532478436, 500, 10); WORMWOOD(1580018, 1204785075, 1532478436, 500, 5);
public static HashMap<Integer, ResourceType> resourceLookup = new HashMap<>(); public static HashMap<Integer, ResourceType> templateLookup = new HashMap<>();
public static HashMap<Integer, ResourceType> hashLookup = new HashMap<>(); public static HashMap<Integer, ResourceType> templateHashLookup = new HashMap<>();
public static HashMap<Integer, ResourceType> resourceHashLookup = new HashMap<>();
public int templateID; public int templateID;
public ItemTemplate template; public ItemTemplate template;
public int hash; public int resourceHash;
public int templateHash;
public int deposit_limit; public int deposit_limit;
public int mine_production; public int mine_production;
ResourceType(int templateID, int hash, int deposit_limit, int mine_production) { ResourceType(int templateID, int resourceHash, int templateHash, int deposit_limit, int mine_production) {
this.templateID = templateID; this.templateID = templateID;
this.template = ItemTemplate.templates.get(this.templateID); this.template = ItemTemplate.templates.get(this.templateID);
this.hash = hash; this.resourceHash = resourceHash;
this.templateHash = templateHash;
this.deposit_limit = deposit_limit; this.deposit_limit = deposit_limit;
this.mine_production = mine_production; this.mine_production = mine_production;
} }
@@ -2758,11 +2597,11 @@ public class mbEnums {
public static void InitializeResourceTypes() { public static void InitializeResourceTypes() {
for (ResourceType resourceType : ResourceType.values()) { for (ResourceType resourceType : ResourceType.values()) {
resourceLookup.put(resourceType.templateID, resourceType); templateLookup.put(resourceType.templateID, resourceType);
hashLookup.put(resourceType.hash, resourceType); templateHashLookup.put(resourceType.templateHash, resourceType);
resourceHashLookup.put(resourceType.resourceHash, resourceType);
} }
} }
} }
+32 -32
View File
@@ -100,7 +100,7 @@ public class MobAI {
public static void attackPlayer(Mob mob, PlayerCharacter target) { public static void attackPlayer(Mob mob, PlayerCharacter target) {
try { try {
if(target == null || !target.isAlive() || !target.isActive() ) { if (target == null || !target.isAlive() || !target.isActive()) {
mob.setCombatTarget(null); mob.setCombatTarget(null);
return; return;
} }
@@ -109,7 +109,7 @@ public class MobAI {
return; return;
} }
if (mob.behaviourType != null && mob.behaviourType.callsForHelp) if (mob.behaviourType.callsForHelp)
mobCallForHelp(mob); mobCallForHelp(mob);
if (!MovementUtilities.inRangeDropAggro(mob, target)) { if (!MovementUtilities.inRangeDropAggro(mob, target)) {
@@ -125,7 +125,7 @@ public class MobAI {
if (mob.isMoving() && mob.getRange() > 20) if (mob.isMoving() && mob.getRange() > 20)
return; return;
CombatManager.combatCycle(mob, target,0); CombatManager.combatCycle(mob, target);
} }
if (target.getPet() != null) if (target.getPet() != null)
@@ -159,7 +159,7 @@ public class MobAI {
MovementManager.sendRWSSMsg(mob); MovementManager.sendRWSSMsg(mob);
CombatManager.combatCycle(mob, target,0); CombatManager.combatCycle(mob, target);
if (mob.isSiege()) { if (mob.isSiege()) {
PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target); PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target);
@@ -175,7 +175,7 @@ public class MobAI {
public static void attackMob(Mob mob, Mob target) { public static void attackMob(Mob mob, Mob target) {
try { try {
if(mob == null || target == null) if (mob == null || target == null)
return; return;
if (mob.getRange() >= 30 && mob.isMoving()) if (mob.getRange() >= 30 && mob.isMoving())
@@ -183,7 +183,7 @@ public class MobAI {
//no weapons, default mob attack speed 3 seconds. //no weapons, default mob attack speed 3 seconds.
CombatManager.combatCycle(mob, target,0); CombatManager.combatCycle(mob, target);
} catch (Exception e) { } catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage());
@@ -938,7 +938,7 @@ public class MobAI {
if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000) if (mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000)
if (mob.getHealth() < mob.getHealthMax()) { if (mob.getHealth() < mob.getHealthMax()) {
float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(mbEnums.ModType.HealthRecoverRate, mbEnums.SourceType.None)) * 0.01f); float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(mbEnums.ModType.HealthRecoverRate, mbEnums.EffectSourceType.None)) * 0.01f);
mob.setHealth(mob.getHealth() + recoveredHealth); mob.setHealth(mob.getHealth() + recoveredHealth);
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis()); mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
@@ -975,36 +975,36 @@ public class MobAI {
} }
private static void hamletGuardAggro(Mob mob) { private static void hamletGuardAggro(Mob mob) {
Realm realm = RealmMap.getRealmAtLocation(mob.loc); Realm realm = RealmMap.getRealmAtLocation(mob.loc);
if(realm.getRealmName().equals("Uthgaard")){ if (realm.getRealmName().equals("Uthgaard")) {
HashSet<AbstractWorldObject> loadedMobs = WorldGrid.getObjectsInRangePartial(mob.loc, MobAIThread.AI_BASE_AGGRO_RANGE, MBServerStatics.MASK_MOB); HashSet<AbstractWorldObject> loadedMobs = WorldGrid.getObjectsInRangePartial(mob.loc, MobAIThread.AI_BASE_AGGRO_RANGE, MBServerStatics.MASK_MOB);
for (AbstractWorldObject awo : loadedMobs) { for (AbstractWorldObject awo : loadedMobs) {
Mob targetMob = (Mob) awo; Mob targetMob = (Mob) awo;
if (targetMob.equals(mob)) if (targetMob.equals(mob))
continue; continue;
if (!targetMob.isAlive() || targetMob.despawned) if (!targetMob.isAlive() || targetMob.despawned)
continue; continue;
if (targetMob.isPet()) if (targetMob.isPet())
continue; continue;
mob.combatTarget = targetMob; mob.combatTarget = targetMob;
return;
}
return; return;
} }
HashSet<AbstractWorldObject> loadedPlayers = WorldGrid.getObjectsInRangePartial(mob.loc, MobAIThread.AI_BASE_AGGRO_RANGE, MBServerStatics.MASK_PLAYER); return;
for (AbstractWorldObject awo : loadedPlayers) { }
PlayerCharacter pc = (PlayerCharacter) awo; HashSet<AbstractWorldObject> loadedPlayers = WorldGrid.getObjectsInRangePartial(mob.loc, MobAIThread.AI_BASE_AGGRO_RANGE, MBServerStatics.MASK_PLAYER);
if (!pc.isAlive() || !pc.isActive()) for (AbstractWorldObject awo : loadedPlayers) {
continue; PlayerCharacter pc = (PlayerCharacter) awo;
if (pc.guild.equals(Guild.getErrantGuild())) { if (!pc.isAlive() || !pc.isActive())
mob.combatTarget = pc; continue;
return; if (pc.guild.equals(Guild.getErrantGuild())) {
}
if (pc.guild.charter.equals(mob.guild.charter))
continue;
mob.combatTarget = pc; mob.combatTarget = pc;
return; return;
} }
if (pc.guild.charter.equals(mob.guild.charter))
continue;
mob.combatTarget = pc;
return;
}
} }
private static void defaultLogic(Mob mob) { private static void defaultLogic(Mob mob) {
@@ -12,9 +12,9 @@ package engine.mobileAI.utilities;
import engine.gameManager.MovementManager; import engine.gameManager.MovementManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.mobileAI.Threads.MobAIThread; import engine.mobileAI.Threads.MobAIThread;
import engine.net.client.msg.MoveToPointMsg; import engine.net.client.msg.MoveToPointMsg;
import engine.objects.*; import engine.objects.*;
@@ -169,7 +169,7 @@ public class MovementUtilities {
if (agent.getMobBase() != null && agent.getMobBase().getFlags().contains(mbEnums.MobFlagType.SENTINEL)) if (agent.getMobBase() != null && agent.getMobBase().getFlags().contains(mbEnums.MobFlagType.SENTINEL))
return false; return false;
return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, SourceType.None) && !agent.getBonuses().getBool(ModType.CannotMove, SourceType.None)); return (agent.isAlive() && !agent.getBonuses().getBool(ModType.Stunned, EffectSourceType.None) && !agent.getBonuses().getBool(ModType.CannotMove, EffectSourceType.None));
} }
public static Vector3fImmutable randomPatrolLocation(Mob agent, Vector3fImmutable center, float radius) { public static Vector3fImmutable randomPatrolLocation(Mob agent, Vector3fImmutable center, float radius) {
@@ -50,7 +50,7 @@ public class ArcMineChangeProductionMsgHandler extends AbstractClientMsgHandler
//make sure valid resource //make sure valid resource
mbEnums.ResourceType resource = mbEnums.ResourceType.hashLookup.get(changeProductionMsg.getResourceHash()); mbEnums.ResourceType resource = mbEnums.ResourceType.resourceHashLookup.get(changeProductionMsg.getResourceHash());
if (resource == null) if (resource == null)
return true; return true;
@@ -2,7 +2,6 @@ package engine.net.client.handlers;
import engine.gameManager.BuildingManager; import engine.gameManager.BuildingManager;
import engine.gameManager.CombatManager; import engine.gameManager.CombatManager;
import engine.jobs.AttackJob;
import engine.mbEnums; import engine.mbEnums;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.msg.AttackCmdMsg; import engine.net.client.msg.AttackCmdMsg;
@@ -83,29 +82,7 @@ public class AttackCmdMsgHandler extends AbstractClientMsgHandler {
if (playerCharacter.isSit()) if (playerCharacter.isSit())
CombatManager.toggleSit(false, origin); CombatManager.toggleSit(false, origin);
long addedDelay = 0; CombatManager.combatCycle(playerCharacter, target);
//check if we are changing targets, cancel outstanding jobs if so
if (playerCharacter.getTimers().containsKey("Attack" + mbEnums.EquipSlotType.RHELD)) {
AttackJob ajR = ((AttackJob)playerCharacter.getTimers().get("Attack" + mbEnums.EquipSlotType.RHELD).getJob());
if(ajR.target != null && !ajR.target.equals(target)){
playerCharacter.getTimers().get("Attack" + mbEnums.EquipSlotType.RHELD).cancelJob();
addedDelay = ajR.getStopTime() - System.currentTimeMillis();
}else{
return true;
}
}
if (playerCharacter.getTimers().containsKey("Attack" + mbEnums.EquipSlotType.LHELD)) {
AttackJob ajL = ((AttackJob)playerCharacter.getTimers().get("Attack" + mbEnums.EquipSlotType.LHELD).getJob());
if(ajL.target != null && !ajL.target.equals(target)){
playerCharacter.getTimers().get("Attack" + mbEnums.EquipSlotType.LHELD).cancelJob();
addedDelay = ajL.getStopTime() - System.currentTimeMillis();
}else{
return true;
}
}
CombatManager.combatCycle(playerCharacter, target, addedDelay);
return true; return true;
} }
@@ -102,7 +102,7 @@ public class ClaimGuildTreeMsgHandler extends AbstractClientMsgHandler {
if (building.getGuild().isEmptyGuild()) if (building.getGuild().isEmptyGuild())
return true; return true;
if (!ManageCityAssetMsgHandler.playerCanManageNotFriends(sourcePlayer, building)) if (!BuildingManager.playerCanManage(sourcePlayer, building))
return true; return true;
@@ -159,7 +159,7 @@ public class ClaimGuildTreeMsgHandler extends AbstractClientMsgHandler {
(building == null) || playerZone == null || playerCity == null) (building == null) || playerZone == null || playerCity == null)
return true; return true;
if (!ManageCityAssetMsgHandler.playerCanManageNotFriends(sourcePlayer, building)) if (!BuildingManager.playerCanManage(sourcePlayer, building))
return true; return true;
boolean open = (msg.getMessageType() == OPEN_CITY); boolean open = (msg.getMessageType() == OPEN_CITY);
@@ -102,6 +102,9 @@ public class InviteToSubHandler extends AbstractClientMsgHandler {
//source guild is limited to 7 subs //source guild is limited to 7 subs
//TODO this should be based on TOL rank //TODO this should be based on TOL rank
//cannot be subbed into a nation if you already have your own sub guilds
if(targetGuild.getSubGuildList() != null && targetGuild.getSubGuildList().size() > 0)
return true;
if (!sourceGuild.canSubAGuild(targetGuild)) { if (!sourceGuild.canSubAGuild(targetGuild)) {
sendChat(source, "This Guild can't be subbed."); sendChat(source, "This Guild can't be subbed.");
@@ -28,30 +28,6 @@ public class ManageCityAssetMsgHandler extends AbstractClientMsgHandler {
super(); super();
} }
public static boolean playerCanManageNotFriends(PlayerCharacter player, Building building) {
//Player Can only Control Building if player is in Same Guild as Building and is higher rank than IC.
if (player == null)
return false;
if (building.getRank() == -1)
return false;
if (BuildingManager.IsOwner(building, player))
return true;
if (GuildStatusController.isGuildLeader(player.getGuildStatus()) == false && GuildStatusController.isInnerCouncil(player.getGuildStatus()) == false)
return false;
//Somehow guild leader check fails above? lets check if Player is true Guild GL.
if (building.getGuild() != null && building.getGuild().isGuildLeader(player.getObjectUUID()))
return true;
return Guild.sameGuild(building.getGuild(), player.getGuild());
}
@Override @Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) { protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) {
@@ -248,7 +248,7 @@ public class MerchantMsgHandler extends AbstractClientMsgHandler {
City targetCity = null; City targetCity = null;
if (isTeleport) if (isTeleport)
cities = City.getCitiesToTeleportTo(player); cities = City.getCitiesToTeleportTo(player, false);
else else
cities = City.getCitiesToRepledgeTo(player); cities = City.getCitiesToRepledgeTo(player);
for (City city : cities) { for (City city : cities) {
@@ -264,8 +264,9 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
player.cancelOnSpell(); player.cancelOnSpell();
break; break;
case RUNE: case RUNE:
ApplyRuneMsg.applyRune(uuid, origin, player); if(ApplyRuneMsg.applyRune(uuid, origin, player)) {
itemMan.consume(item); itemMan.consume(item);
}
break; break;
default: //shouldn't be here, consume item default: //shouldn't be here, consume item
dispatch = Dispatch.borrow(player, msg); dispatch = Dispatch.borrow(player, msg);
@@ -183,7 +183,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
if (building == null) if (building == null)
return; return;
if (ManageCityAssetMsgHandler.playerCanManageNotFriends(player, building) == false) if (BuildingManager.playerCanManage(player, building) == false)
return; return;
if (orderNpcMsg.getPatrolSize() >= 20) if (orderNpcMsg.getPatrolSize() >= 20)
@@ -411,7 +411,7 @@ public class OrderNPCMsgHandler extends AbstractClientMsgHandler {
case 2: case 2:
player = SessionManager.getPlayerCharacter(origin); player = SessionManager.getPlayerCharacter(origin);
if (ManageCityAssetMsgHandler.playerCanManageNotFriends(player, building) == false) if (BuildingManager.playerCanManage(player, building) == false)
return true; return true;
if (building.getHirelings().containsKey(npc) == false) if (building.getHirelings().containsKey(npc) == false)
@@ -54,7 +54,7 @@ public class PetAttackMsgHandler extends AbstractClientMsgHandler {
pet.setCombatTarget(PlayerCharacter.getPlayerCharacter(msg.getTargetID())); pet.setCombatTarget(PlayerCharacter.getPlayerCharacter(msg.getTargetID()));
switch (msg.getTargetType()) { switch (msg.getTargetType()) {
case 53: //player character case 52: //player character
pet.setCombatTarget(PlayerCharacter.getPlayerCharacter(msg.getTargetID())); pet.setCombatTarget(PlayerCharacter.getPlayerCharacter(msg.getTargetID()));
break; break;
case 37://mob case 37://mob
@@ -58,7 +58,7 @@ public class RecvSummonsMsgHandler extends AbstractClientMsgHandler {
return true; return true;
} }
if (playerCharacter.getBonuses() != null && playerCharacter.getBonuses().getBool(mbEnums.ModType.BlockedPowerType, mbEnums.SourceType.SUMMON)) { if (playerCharacter.getBonuses() != null && playerCharacter.getBonuses().getBool(mbEnums.ModType.BlockedPowerType, mbEnums.EffectSourceType.Summon)) {
ErrorPopupMsg.sendErrorMsg(playerCharacter, "You have been blocked from receiving summons!"); ErrorPopupMsg.sendErrorMsg(playerCharacter, "You have been blocked from receiving summons!");
ErrorPopupMsg.sendErrorMsg(source, "Target is blocked from receiving summons!"); ErrorPopupMsg.sendErrorMsg(source, "Target is blocked from receiving summons!");
playerCharacter.removeSummoner(source.getObjectUUID()); playerCharacter.removeSummoner(source.getObjectUUID());
@@ -89,7 +89,7 @@ public class RepairMsgHandler extends AbstractClientMsgHandler {
//account for durability modifications //account for durability modifications
float durMod = toRepair.getBonusPercent(mbEnums.ModType.Durability, mbEnums.SourceType.None); float durMod = toRepair.getBonusPercent(mbEnums.ModType.Durability, mbEnums.EffectSourceType.None);
max *= (1 + (durMod * 0.01f)); max *= (1 + (durMod * 0.01f));
if (dur >= max || dur < 1) { if (dur >= max || dur < 1) {
@@ -148,7 +148,7 @@ public class TrackWindowMsgHandler extends AbstractClientMsgHandler {
else if (awo.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) { else if (awo.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) {
PlayerBonuses bonus = ((PlayerCharacter) awo).getBonuses(); PlayerBonuses bonus = ((PlayerCharacter) awo).getBonuses();
if (bonus != null && bonus.getBool(mbEnums.ModType.CannotTrack, mbEnums.SourceType.None)) if (bonus != null && bonus.getBool(mbEnums.ModType.CannotTrack, mbEnums.EffectSourceType.None))
it.remove(); it.remove();
} }
} }
@@ -53,7 +53,7 @@ public class TransferGoldToFromBuildingMsgHandler extends AbstractClientMsgHandl
if (msg.getDirection() == 2) { if (msg.getDirection() == 2) {
if (!ManageCityAssetMsgHandler.playerCanManageNotFriends(player, building)) if (!BuildingManager.playerCanManage(player, building))
return true; return true;
if (building.setReserve(msg.getUnknown01(), player)) { if (building.setReserve(msg.getUnknown01(), player)) {
dispatch = Dispatch.borrow(player, msg); dispatch = Dispatch.borrow(player, msg);
@@ -59,7 +59,7 @@ public class SendOwnPlayerMsg extends ClientNetMsg {
@Override @Override
protected int getPowerOfTwoBufferSize() { protected int getPowerOfTwoBufferSize() {
//Larger size for historically larger opcodes //Larger size for historically larger opcodes
return (17); // 2^17 == 131,072 return (18); // 2^17 == 131,072
} }
/** /**
@@ -73,10 +73,8 @@ public class TeleportRepledgeListMsg extends ClientNetMsg {
public void configure() { public void configure() {
if (isTeleport) cities = City.getCitiesToTeleportTo(player, !isTeleport);
cities = City.getCitiesToTeleportTo(player);
else
cities = City.getCitiesToRepledgeTo(player);
} }
/** /**
@@ -93,7 +93,7 @@ public class ViewResourcesMsg extends ClientNetMsg {
for (mbEnums.ResourceType resourceType : (warehouseObject.resources.keySet())) { for (mbEnums.ResourceType resourceType : (warehouseObject.resources.keySet())) {
writer.putInt(resourceType.hash); writer.putInt(resourceType.templateHash);
writer.putInt((warehouseObject.resources.get(resourceType))); writer.putInt((warehouseObject.resources.get(resourceType)));
@@ -107,7 +107,7 @@ public class ViewResourcesMsg extends ClientNetMsg {
for (mbEnums.ResourceType resourceType : warehouseObject.resources.keySet()) { for (mbEnums.ResourceType resourceType : warehouseObject.resources.keySet()) {
writer.putInt(resourceType.hash); writer.putInt(resourceType.templateHash);
writer.putInt(0); //available? writer.putInt(0); //available?
writer.putInt(resourceType.deposit_limit); //max? writer.putInt(resourceType.deposit_limit); //max?
} }
+40 -41
View File
@@ -527,7 +527,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
boolean canFly = false; boolean canFly = false;
PlayerBonuses bonus = flyer.getBonuses(); 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, EffectSourceType.Flight) && bonus.getBool(ModType.Fly, EffectSourceType.None) && flyer.isAlive())
canFly = true; canFly = true;
return canFly; return canFly;
@@ -613,10 +613,10 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
if (abstractCharacter.bonuses != null) { if (abstractCharacter.bonuses != null) {
// add any bonuses // add any bonuses
defense += (short) abstractCharacter.bonuses.getFloat(ModType.DCV, SourceType.None); defense += (short) abstractCharacter.bonuses.getFloat(ModType.DCV, EffectSourceType.None);
// Finally multiply any percent modifiers. DO THIS LAST! // Finally multiply any percent modifiers. DO THIS LAST!
float pos_Bonus = abstractCharacter.bonuses.getFloatPercentPositive(ModType.DCV, SourceType.None); float pos_Bonus = abstractCharacter.bonuses.getFloatPercentPositive(ModType.DCV, EffectSourceType.None);
defense = (short) (defense * (1 + pos_Bonus)); defense = (short) (defense * (1 + pos_Bonus));
//Lucky rune applies next //Lucky rune applies next
@@ -625,7 +625,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
//and negative percent modifiers //and negative percent modifiers
//already done... //already done...
float neg_Bonus = abstractCharacter.bonuses.getFloatPercentNegative(ModType.DCV, SourceType.None); float neg_Bonus = abstractCharacter.bonuses.getFloatPercentNegative(ModType.DCV, EffectSourceType.None);
defense = (short) (defense * (1 + neg_Bonus)); defense = (short) (defense * (1 + neg_Bonus));
} else } else
@@ -656,13 +656,13 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
AssignDamageAtrForPlayers(abstractCharacter, equipped.get(EquipSlotType.LHELD), false, equipped.get(EquipSlotType.LHELD)); AssignDamageAtrForPlayers(abstractCharacter, equipped.get(EquipSlotType.LHELD), false, equipped.get(EquipSlotType.LHELD));
if (abstractCharacter.getObjectType().equals(GameObjectType.Mob)) { if (abstractCharacter.getObjectType().equals(GameObjectType.Mob)) {
Mob mob = (Mob) abstractCharacter; Mob mob = (Mob) abstractCharacter;
abstractCharacter.minDamageHandOne += (int) mob.mobBase.getDamageMin(); abstractCharacter.minDamageHandOne = (int) mob.mobBase.getDamageMin();
abstractCharacter.minDamageHandTwo += (int) mob.mobBase.getDamageMin(); abstractCharacter.minDamageHandTwo = (int) mob.mobBase.getDamageMin();
abstractCharacter.maxDamageHandOne += (int) mob.mobBase.getDamageMax(); abstractCharacter.maxDamageHandOne = (int) mob.mobBase.getDamageMax();
abstractCharacter.maxDamageHandTwo += (int) mob.mobBase.getDamageMax(); abstractCharacter.maxDamageHandTwo = (int) mob.mobBase.getDamageMax();
abstractCharacter.atrHandOne += mob.mobBase.getAttackRating(); abstractCharacter.atrHandOne = mob.mobBase.getAttackRating();
abstractCharacter.atrHandTwo += mob.mobBase.getAttackRating(); abstractCharacter.atrHandTwo = mob.mobBase.getAttackRating();
abstractCharacter.defenseRating += mob.mobBase.getDefenseRating(); abstractCharacter.defenseRating = mob.mobBase.getDefenseRating();
} }
} }
@@ -728,7 +728,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
abstractCharacter.rangeHandTwo = weapon.template.item_weapon_max_range * (1 + (abstractCharacter.statStrBase / 600)); abstractCharacter.rangeHandTwo = weapon.template.item_weapon_max_range * (1 + (abstractCharacter.statStrBase / 600));
if (abstractCharacter.bonuses != null) { if (abstractCharacter.bonuses != null) {
float range_bonus = 1 + abstractCharacter.bonuses.getFloatPercentAll(ModType.WeaponRange, SourceType.None); float range_bonus = 1 + abstractCharacter.bonuses.getFloatPercentAll(ModType.WeaponRange, EffectSourceType.None);
if (mainHand) if (mainHand)
abstractCharacter.rangeHandOne *= range_bonus; abstractCharacter.rangeHandOne *= range_bonus;
@@ -772,10 +772,10 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
// add in any bonuses to atr // add in any bonuses to atr
if (abstractCharacter.bonuses != null) { if (abstractCharacter.bonuses != null) {
// Add any base bonuses // Add any base bonuses
atr += abstractCharacter.bonuses.getFloat(ModType.OCV, SourceType.None); atr += abstractCharacter.bonuses.getFloat(ModType.OCV, EffectSourceType.None);
// Finally use any multipliers. DO THIS LAST! // Finally use any multipliers. DO THIS LAST!
float pos_Bonus = (1 + abstractCharacter.bonuses.getFloatPercentPositive(ModType.OCV, SourceType.None)); float pos_Bonus = (1 + abstractCharacter.bonuses.getFloatPercentPositive(ModType.OCV, EffectSourceType.None));
atr *= pos_Bonus; atr *= pos_Bonus;
// next precise // next precise
@@ -783,7 +783,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
// atr *= (1 + ((float) this.bonuses.getShort("rune.Attack") / 100)); // atr *= (1 + ((float) this.bonuses.getShort("rune.Attack") / 100));
//and negative percent modifiers //and negative percent modifiers
float neg_Bonus = abstractCharacter.bonuses.getFloatPercentNegative(ModType.OCV, SourceType.None); float neg_Bonus = abstractCharacter.bonuses.getFloatPercentNegative(ModType.OCV, EffectSourceType.None);
atr *= (1 + neg_Bonus); atr *= (1 + neg_Bonus);
} }
@@ -803,10 +803,10 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
else else
speed = 20f; //unarmed attack speed speed = 20f; //unarmed attack speed
if (weapon != null) if (weapon != null)
speed *= (1 + abstractCharacter.bonuses.getFloatPercentAll(ModType.WeaponSpeed, SourceType.None)); speed *= (1 + abstractCharacter.bonuses.getFloatPercentAll(ModType.WeaponSpeed, EffectSourceType.None));
PlayerBonuses bonuses = abstractCharacter.bonuses; PlayerBonuses bonuses = abstractCharacter.bonuses;
if(bonuses != null){ if (bonuses != null) {
ModType modType = ModType.AttackDelay; ModType modType = ModType.AttackDelay;
for (AbstractEffectModifier mod : bonuses.bonusFloats.keySet()) { for (AbstractEffectModifier mod : bonuses.bonusFloats.keySet()) {
@@ -823,7 +823,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
speed *= (1 + bonuses.bonusFloats.get(mod)); speed *= (1 + bonuses.bonusFloats.get(mod));
} }
} }
//speed *= (1 + abstractCharacter.bonuses.getFloatPercentAll(ModType.AttackDelay, SourceType.None)); //speed *= (1 + abstractCharacter.bonuses.getFloatPercentAll(ModType.AttackDelay, EffectSourceType.None));
if (speed < 10) if (speed < 10)
speed = 10; speed = 10;
@@ -832,22 +832,22 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
if (weapon != null) { if (weapon != null) {
// Add any base bonuses // Add any base bonuses
min += weapon.getBonus(ModType.MinDamage, SourceType.None); min += weapon.getBonus(ModType.MinDamage, EffectSourceType.None);
max += weapon.getBonus(ModType.MaxDamage, SourceType.None); max += weapon.getBonus(ModType.MaxDamage, EffectSourceType.None);
min += weapon.getBonus(ModType.MeleeDamageModifier, SourceType.None); min += weapon.getBonus(ModType.MeleeDamageModifier, EffectSourceType.None);
max += weapon.getBonus(ModType.MeleeDamageModifier, SourceType.None); max += weapon.getBonus(ModType.MeleeDamageModifier, EffectSourceType.None);
// Finally use any multipliers. DO THIS LAST! // Finally use any multipliers. DO THIS LAST!
float percentMinDamage = 1; float percentMinDamage = 1;
float percentMaxDamage = 1; float percentMaxDamage = 1;
percentMinDamage += weapon.getBonusPercent(ModType.MinDamage, SourceType.None); percentMinDamage += weapon.getBonusPercent(ModType.MinDamage, EffectSourceType.None);
percentMinDamage += weapon.getBonusPercent(ModType.MeleeDamageModifier, SourceType.None); percentMinDamage += weapon.getBonusPercent(ModType.MeleeDamageModifier, EffectSourceType.None);
percentMaxDamage += weapon.getBonusPercent(ModType.MaxDamage, SourceType.None); percentMaxDamage += weapon.getBonusPercent(ModType.MaxDamage, EffectSourceType.None);
percentMaxDamage += weapon.getBonusPercent(ModType.MeleeDamageModifier, SourceType.None); percentMaxDamage += weapon.getBonusPercent(ModType.MeleeDamageModifier, EffectSourceType.None);
min *= percentMinDamage; min *= percentMinDamage;
@@ -884,21 +884,21 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
// add in any bonuses to damage // add in any bonuses to damage
if (abstractCharacter.bonuses != null) { if (abstractCharacter.bonuses != null) {
// Add any base bonuses // Add any base bonuses
minDamage += abstractCharacter.bonuses.getFloat(ModType.MinDamage, SourceType.None); minDamage += abstractCharacter.bonuses.getFloat(ModType.MinDamage, EffectSourceType.None);
maxDamage += abstractCharacter.bonuses.getFloat(ModType.MaxDamage, SourceType.None); maxDamage += abstractCharacter.bonuses.getFloat(ModType.MaxDamage, EffectSourceType.None);
minDamage += abstractCharacter.bonuses.getFloat(ModType.MeleeDamageModifier, SourceType.None); minDamage += abstractCharacter.bonuses.getFloat(ModType.MeleeDamageModifier, EffectSourceType.None);
maxDamage += abstractCharacter.bonuses.getFloat(ModType.MeleeDamageModifier, SourceType.None); maxDamage += abstractCharacter.bonuses.getFloat(ModType.MeleeDamageModifier, EffectSourceType.None);
// Finally use any multipliers. DO THIS LAST! // Finally use any multipliers. DO THIS LAST!
float percentMinDamage = 1; float percentMinDamage = 1;
float percentMaxDamage = 1; float percentMaxDamage = 1;
percentMinDamage += abstractCharacter.bonuses.getFloatPercentAll(ModType.MinDamage, SourceType.None); percentMinDamage += abstractCharacter.bonuses.getFloatPercentAll(ModType.MinDamage, EffectSourceType.None);
percentMinDamage += abstractCharacter.bonuses.getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None); percentMinDamage += abstractCharacter.bonuses.getFloatPercentAll(ModType.MeleeDamageModifier, EffectSourceType.None);
percentMaxDamage += abstractCharacter.bonuses.getFloatPercentAll(ModType.MaxDamage, SourceType.None); percentMaxDamage += abstractCharacter.bonuses.getFloatPercentAll(ModType.MaxDamage, EffectSourceType.None);
percentMaxDamage += abstractCharacter.bonuses.getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None); percentMaxDamage += abstractCharacter.bonuses.getFloatPercentAll(ModType.MeleeDamageModifier, EffectSourceType.None);
minDamage *= percentMinDamage; minDamage *= percentMinDamage;
maxDamage *= percentMaxDamage; maxDamage *= percentMaxDamage;
@@ -947,8 +947,8 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
//apply item defense bonuses //apply item defense bonuses
if (shield != null) { if (shield != null) {
def += shield.getBonus(ModType.DR, SourceType.None); def += shield.getBonus(ModType.DR, EffectSourceType.None);
def *= (1 + shield.getBonusPercent(ModType.DR, SourceType.None)); def *= (1 + shield.getBonusPercent(ModType.DR, EffectSourceType.None));
} }
@@ -991,8 +991,8 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
//apply item defense bonuses //apply item defense bonuses
if (armor != null) { if (armor != null) {
def += armor.getBonus(ModType.DR, SourceType.None); def += armor.getBonus(ModType.DR, EffectSourceType.None);
def *= (1 + armor.getBonusPercent(ModType.DR, SourceType.None)); def *= (1 + armor.getBonusPercent(ModType.DR, EffectSourceType.None));
} }
return (def * (1 + ((int) armorSkill.getModifiedAmount() / 50f))); return (def * (1 + ((int) armorSkill.getModifiedAmount() / 50f)));
@@ -1787,7 +1787,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
final boolean fromCost) { final boolean fromCost) {
try { try {
this.combatLock.writeLock().lock();
try { try {
boolean ready = this.healthLock.writeLock().tryLock(1, TimeUnit.SECONDS); boolean ready = this.healthLock.writeLock().tryLock(1, TimeUnit.SECONDS);
@@ -1829,7 +1829,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
Mob target = (Mob) this; Mob target = (Mob) this;
if (attacker.getObjectType().equals(GameObjectType.PlayerCharacter)) { if (attacker.getObjectType().equals(GameObjectType.PlayerCharacter)) {
if(target.playerAgroMap.containsKey(attacker.getObjectUUID())) if (target.playerAgroMap.containsKey(attacker.getObjectUUID()))
target.playerAgroMap.put(attacker.getObjectUUID(), target.playerAgroMap.get(attacker.getObjectUUID()) + value); target.playerAgroMap.put(attacker.getObjectUUID(), target.playerAgroMap.get(attacker.getObjectUUID()) + value);
else else
target.playerAgroMap.put(attacker.getObjectUUID(), value); target.playerAgroMap.put(attacker.getObjectUUID(), value);
@@ -1852,7 +1852,6 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
return newHealth - oldHealth; return newHealth - oldHealth;
} finally { } finally {
this.healthLock.writeLock().unlock(); this.healthLock.writeLock().unlock();
this.combatLock.writeLock().unlock();
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
@@ -14,9 +14,9 @@ import engine.gameManager.DispatchManager;
import engine.gameManager.ZoneManager; import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.mobileAI.Threads.MobAIThread; import engine.mobileAI.Threads.MobAIThread;
import engine.net.Dispatch; import engine.net.Dispatch;
import engine.net.client.msg.PetMsg; import engine.net.client.msg.PetMsg;
@@ -141,7 +141,7 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter {
float ret = MobAIThread.AI_BASE_AGGRO_RANGE; float ret = MobAIThread.AI_BASE_AGGRO_RANGE;
if (this.bonuses != null) if (this.bonuses != null)
ret *= (1 + this.bonuses.getFloatPercentAll(ModType.ScanRange, SourceType.None)); ret *= (1 + this.bonuses.getFloatPercentAll(ModType.ScanRange, EffectSourceType.None));
return ret; return ret;
} }
@@ -59,7 +59,6 @@ public abstract class AbstractWorldObject extends AbstractGameObject {
private Vector3f rot = new Vector3f(0.0f, 0.0f, 0.0f); private Vector3f rot = new Vector3f(0.0f, 0.0f, 0.0f);
private int objectTypeMask = 0; private int objectTypeMask = 0;
private Bounds bounds; private Bounds bounds;
public ReentrantReadWriteLock combatLock = new ReentrantReadWriteLock();
/** /**
* No Id Constructor * No Id Constructor
+6 -6
View File
@@ -641,18 +641,18 @@ public final class Bane {
return cityUUID; return cityUUID;
} }
public void startBane(){ public void startBane() {
City city = this.getCity(); City city = this.getCity();
if(city == null) if (city == null)
return; return;
this.isStarted = true; //flag the bane as started this.isStarted = true; //flag the bane as started
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(city.loc,mbEnums.CityBoundsType.ZONE.halfExtents + 64,MBServerStatics.MASK_BUILDING)){ for (AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(city.loc, mbEnums.CityBoundsType.ZONE.halfExtents + 64, MBServerStatics.MASK_BUILDING)) {
Building building = (Building)awo; Building building = (Building) awo;
if(building == null) if (building == null)
continue; continue;
if(building.protectionState.equals(ProtectionState.UNDERSIEGE) == false) if (building.protectionState.equals(ProtectionState.UNDERSIEGE) == false)
building.protectionState = ProtectionState.UNDERSIEGE; building.protectionState = ProtectionState.UNDERSIEGE;
} }
+6 -1
View File
@@ -163,6 +163,11 @@ public class Building extends AbstractWorldObject {
if (upgradeTimeStamp != null) if (upgradeTimeStamp != null)
this.upgradeDateTime = LocalDateTime.ofInstant(upgradeTimeStamp.toInstant(), ZoneId.systemDefault()); this.upgradeDateTime = LocalDateTime.ofInstant(upgradeTimeStamp.toInstant(), ZoneId.systemDefault());
if(rs.getInt("enforceKOS") == 0)
this.enforceKOS = false;
else
this.enforceKOS = true;
} catch (Exception e) { } catch (Exception e) {
Logger.error("Failed for object " + this.blueprintUUID + ' ' + this.getObjectUUID() + e); Logger.error("Failed for object " + this.blueprintUUID + ' ' + this.getObjectUUID() + e);
} }
@@ -1447,7 +1452,7 @@ public class Building extends AbstractWorldObject {
public synchronized boolean setReserve(int amount, PlayerCharacter player) { public synchronized boolean setReserve(int amount, PlayerCharacter player) {
if (!BuildingManager.playerCanManageNotFriends(player, this)) if (!BuildingManager.playerCanManage(player, this))
return false; return false;
if (amount < 0) if (amount < 0)
@@ -1400,6 +1400,7 @@ public class CharacterItemManager {
if (!ItemManager.validForSkills(item, pc.getSkills())) { if (!ItemManager.validForSkills(item, pc.getSkills())) {
this.forceToInventory(slot, item, pc, initialized); this.forceToInventory(slot, item, pc, initialized);
this.equipped.remove(slot);
pc.applyBonuses(); pc.applyBonuses();
} }
} }
+7 -7
View File
@@ -11,8 +11,8 @@ package engine.objects;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.net.ByteBufferWriter; import engine.net.ByteBufferWriter;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -306,12 +306,12 @@ public class CharacterSkill extends AbstractGameObject {
PlayerBonuses bonus = ac.getBonuses(); PlayerBonuses bonus = ac.getBonuses();
if (bonus == null) if (bonus == null)
return atr; return atr;
atr += bonus.getFloat(ModType.OCV, SourceType.None); atr += bonus.getFloat(ModType.OCV, EffectSourceType.None);
float pos_Bonus = bonus.getFloatPercentPositive(ModType.OCV, SourceType.None); float pos_Bonus = bonus.getFloatPercentPositive(ModType.OCV, EffectSourceType.None);
atr *= (1 + pos_Bonus); atr *= (1 + pos_Bonus);
//rUNES will already be applied //rUNES will already be applied
// atr *= (1 + ((float)bonus.getShort("rune.Attack") / 100)); //precise // atr *= (1 + ((float)bonus.getShort("rune.Attack") / 100)); //precise
float neg_Bonus = bonus.getFloatPercentNegative(ModType.OCV, SourceType.None); float neg_Bonus = bonus.getFloatPercentNegative(ModType.OCV, EffectSourceType.None);
atr *= (1 + neg_Bonus); atr *= (1 + neg_Bonus);
return atr; return atr;
} }
@@ -462,7 +462,7 @@ public class CharacterSkill extends AbstractGameObject {
} }
float bonus = 0f; float bonus = 0f;
SourceType sourceType = SourceType.GetSourceType(sb.getNameNoSpace()); EffectSourceType sourceType = EffectSourceType.getEffectSourceType(sb.getNameNoSpace());
if (pc.getBonuses() != null) { if (pc.getBonuses() != null) {
//Get bonuses from runes //Get bonuses from runes
bonus = pc.getBonuses().getSkillBonus(sb.sourceType); bonus = pc.getBonuses().getSkillBonus(sb.sourceType);
@@ -1103,7 +1103,7 @@ public class CharacterSkill extends AbstractGameObject {
statMod = 600f; statMod = 600f;
} }
base += CharacterSkill.baseSkillValues[(int) statMod]; base += CharacterSkill.baseSkillValues[(int) statMod];
SourceType sourceType = SourceType.GetSourceType(this.skillsBase.getNameNoSpace()); EffectSourceType sourceType = EffectSourceType.getEffectSourceType(this.skillsBase.getNameNoSpace());
//Get any rune, effect and item bonus //Get any rune, effect and item bonus
@@ -1217,7 +1217,7 @@ public class CharacterSkill extends AbstractGameObject {
return 0; return 0;
float bonus = 0f; float bonus = 0f;
SourceType sourceType = SourceType.GetSourceType(this.skillsBase.getNameNoSpace()); EffectSourceType sourceType = EffectSourceType.getEffectSourceType(this.skillsBase.getNameNoSpace());
if (CharacterSkill.GetOwner(this).getBonuses() != null) { if (CharacterSkill.GetOwner(this).getBonuses() != null) {
//Get bonuses from runes //Get bonuses from runes
bonus = CharacterSkill.GetOwner(this).getBonuses().getSkillBonus(this.skillsBase.sourceType); bonus = CharacterSkill.GetOwner(this).getBonuses().getSkillBonus(this.skillsBase.sourceType);
+122 -130
View File
@@ -120,9 +120,7 @@ public class City extends AbstractWorldObject {
this.treeOfLifeID = rs.getInt("treeOfLifeUUID"); this.treeOfLifeID = rs.getInt("treeOfLifeUUID");
this.bindX = rs.getFloat("bindX"); this.bindX = rs.getFloat("bindX");
this.bindZ = rs.getFloat("bindZ"); this.bindZ = rs.getFloat("bindZ");
this.bindLoc = new Vector3fImmutable(this.location.getX() + this.bindX, this.bindLoc = new Vector3fImmutable(this.location.getX() + this.bindX, this.location.getY(), this.location.getZ() + this.bindZ);
this.location.getY(),
this.location.getZ() + this.bindZ);
this.radiusType = rs.getInt("radiusType"); this.radiusType = rs.getInt("radiusType");
float bindradiustemp = rs.getFloat("bindRadius"); float bindradiustemp = rs.getFloat("bindRadius");
@@ -288,106 +286,119 @@ public class City extends AbstractWorldObject {
return city.getBindLoc(); return city.getBindLoc();
} }
public static ArrayList<City> getCitiesToTeleportTo(PlayerCharacter pc) { public static ArrayList<City> getCitiesToTeleportTo(PlayerCharacter playerCharacter, boolean repledge) {
ArrayList<City> cities = new ArrayList<>(); ArrayList<City> cities = new ArrayList<>();
if (pc == null) if (playerCharacter == null)
return cities; return cities;
ConcurrentHashMap<Integer, AbstractGameObject> worldCities = DbManager.getMap(mbEnums.GameObjectType.City); ConcurrentHashMap<Integer, AbstractGameObject> worldCities = DbManager.getMap(mbEnums.GameObjectType.City);
if (ConfigManager.MB_RULESET.getValue().equals("LORE")) { //handle compiling of cities able to be teleported to for lore rule-set
//handle compiling of cities able to be teleported to for lore rule-set
for (AbstractGameObject ago : worldCities.values()) { for (AbstractGameObject ago : worldCities.values()) {
City city = (City) ago;
if(city.cityName.equals("Perdition") || city.cityName.equals("Bastion")) City city = (City) ago;
continue; // cannot teleport to perdition or bastion
if (city.isNpc == 1 && city.getGuild().charter.equals(pc.guild.charter)) { // Filter Player cities
cities.add(city); // anyone of the same charter can teleport to a safehold of that charter
if (city.parentZone == null)
continue;
//can't repledge to a guild you're already part of
if (repledge && city.getGuild().equals(playerCharacter.guild))
continue;
if (city.parentZone.guild_zone) {
//players can all port and repledge inside their own nation
if(city.getGuild().getNation().equals(playerCharacter.guild.getNation())){
cities.add(city);
continue; continue;
} else if (city.isNoobIsle == 1 && pc.level <= 20) { }
cities.add(city); // everyone can go to noob island if they are under level 20
continue; if (city.isOpen() && city.getTOL().rank > 4) {
} else if (city.cityName.equals("Khan'Ov Srekel")) {
cities.add(city); //everyone anytime can teleport to khan // Filter Lore cities
continue;
} else if (city.isOpen() && city.getTOL().rank > 4 && city.getGuild().charter.equals(pc.guild.charter)) if (ConfigManager.MB_RULESET.getValue().equals("LORE")) {
if (!city.getTOL().reverseKOS) {
cities.add(city);//can teleport to any open ToL that shares charter if (repledge) {
continue; if (!city.getGuild().charter.canJoin(playerCharacter))
continue;
} else if (!city.getGuild().charter.equals(playerCharacter.guild.charter))
continue;
}
Integer playerUUID = playerCharacter.objectUUID;
Integer guildUUID = playerCharacter.guildUUID;
Integer nationUUID = playerCharacter.guild.getNation().getObjectUUID();
boolean allowed = false;
if (city.getTOL().reverseKOS) {
//reverse KOS, specific values are allowed
if ((city.getTOL().getCondemned().containsKey(playerUUID) && city.getTOL().getCondemned().get(playerUUID).active) ||
(city.getTOL().getCondemned().containsKey(guildUUID) && city.getTOL().getCondemned().get(guildUUID).active) ||
(city.getTOL().getCondemned().containsKey(nationUUID) && city.getTOL().getCondemned().get(nationUUID).active))
allowed = true;
} else { } else {
if (city.getTOL().getCondemned().contains(pc.objectUUID) && city.getTOL().getCondemned().get(pc.objectUUID).active) { //not reverse KOS, everyone is allowed by default
cities.add(city);//this player is allowed for the reverse KOS
continue; allowed = true;
}
if (city.getTOL().getCondemned().contains(pc.guildUUID) && city.getTOL().getCondemned().get(pc.guildUUID).active) { //specific values are not allowed
cities.add(city);//this guild is allowed for the reverse KOS
continue; if ((city.getTOL().getCondemned().containsKey(playerUUID) && city.getTOL().getCondemned().get(playerUUID).active) ||
} (city.getTOL().getCondemned().containsKey(guildUUID) && city.getTOL().getCondemned().get(guildUUID).active) ||
if (city.getTOL().getCondemned().contains(pc.guild.getNation().getObjectUUID()) && city.getTOL().getCondemned().get(pc.guild.getNation().getObjectUUID()).active) { (city.getTOL().getCondemned().containsKey(nationUUID) && city.getTOL().getCondemned().get(nationUUID).active))
cities.add(city);//this nation is allowed for the reverse KOS allowed = false;
continue;
}
} }
if (city.getGuild().getNation().equals(pc.guild.getNation())) {
cities.add(city);//can always teleport inside your own nation if (allowed)
cities.add(city);
} }
} } else {
} else {
Guild pcG = pc.getGuild(); // Filter NPC cities
//add npc cities
for (AbstractGameObject ago : worldCities.values()) { if (city.isNoobIsle == 1) {
if (ago.getObjectType().equals(GameObjectType.City)) { if (playerCharacter.level < 20)
City city = (City) ago; cities.add(city); // everyone can go to noob island if they are under level 20
if (city.noTeleport) continue;
continue; }
if (city.parentZone != null && city.parentZone.guild_zone) { // Players cannot teleport to perdition or bastion
if (pc.getAccount().status.equals(AccountStatus.ADMIN)) { if (city.cityName.equals("Perdition") || city.cityName.equals("Bastion"))
continue;
// These cities are available for anyone off noob island
if (playerCharacter.level >= 20 && (city.cityName.equals("Sea Dog's Rest") || city.cityName.equals("Khan'Ov Srekel") || city.cityName.equals("City of Khar Th'Sekt"))) {
cities.add(city);
continue;
}
// Add Lore cities
if (ConfigManager.MB_RULESET.getValue().equals("LORE")) {
if (repledge) {
if (city.getGuild().charter.canJoin(playerCharacter))
cities.add(city); cities.add(city);
} else } else if (city.getGuild().charter.equals(playerCharacter.guild.charter))
//list Player cities cities.add(city);
//open city, just list
if (city.open && city.getTOL() != null && city.getTOL().getRank() > 4) {
if (!BuildingManager.IsPlayerHostile(city.getTOL(), pc)) {
if (ConfigManager.MB_RULESET.getValue().equals("LORE")) {
if (city.getGuild().getGuildType().equals(pc.guild.getGuildType())) {
cities.add(city);
}
} else {
cities.add(city); //verify nation or guild is same
}
}
} else if (Guild.sameNationExcludeErrant(city.getGuild(), pcG))
cities.add(city);
} else if (city.isNpc == 1) {
//list NPC cities
Guild g = city.getGuild();
if (g == null) {
if (city.isNpc == 1)
if (city.isNoobIsle == 1) {
if (pc.getLevel() < 21)
cities.add(city); //verify nation or guild is same
} else if (pc.getLevel() > 9)
cities.add(city); //verify nation or guild is same
} else if (pc.getLevel() >= g.getTeleportMin() && pc.getLevel() <= g.getTeleportMax())
cities.add(city); //verify nation or guild is same
}
} }
} }
} }
return cities; return cities;
@@ -407,13 +418,14 @@ public class City extends AbstractWorldObject {
//handle compiling of cities able to be repledged to for lore rule-set //handle compiling of cities able to be repledged to for lore rule-set
for (AbstractGameObject ago : worldCities.values()) { for (AbstractGameObject ago : worldCities.values()) {
City city = (City) ago; City city = (City) ago;
if(city.cityName.equals("Perdition") || city.cityName.equals("Bastion")) if (city.cityName.equals("Perdition") || city.cityName.equals("Bastion"))
continue; // cannot repledge to perdition or bastion continue; // cannot repledge to perdition or bastion
if (city.isNpc == 1 && city.getGuild().charter.canJoin(playerCharacter)) { if (city.isNpc == 1 && city.getGuild().charter.canJoin(playerCharacter)) {
if(city.isNoobIsle == 1 && playerCharacter.level >= 21)
continue;
cities.add(city); // anyone of the same charter can teleport to a safehold of that charter cities.add(city); // anyone of the same charter can teleport to a safehold of that charter
continue; continue;
} else if (city.isNoobIsle == 1 && playerCharacter.level <= 20) {
cities.add(city); // everyone can go to noob island if they are under level 20
continue;
} else if (city.isOpen() && city.getTOL().rank > 4 && city.getGuild().charter.canJoin(playerCharacter)) } else if (city.isOpen() && city.getTOL().rank > 4 && city.getGuild().charter.canJoin(playerCharacter))
if (!city.getTOL().reverseKOS) { if (!city.getTOL().reverseKOS) {
cities.add(city);//can repledge to any open ToL that player can fit into charter cities.add(city);//can repledge to any open ToL that player can fit into charter
@@ -585,7 +597,7 @@ public class City extends AbstractWorldObject {
if (this.siegesWithstood == siegesWithstood) if (this.siegesWithstood == siegesWithstood)
return; return;
if (DbManager.CityQueries.updateSiegesWithstood(this, siegesWithstood) == true) if (DbManager.CityQueries.updateSiegesWithstood(this, siegesWithstood))
this.siegesWithstood = siegesWithstood; this.siegesWithstood = siegesWithstood;
else else
Logger.error("Error when writing to database for cityUUID: " + this.getObjectUUID()); Logger.error("Error when writing to database for cityUUID: " + this.getObjectUUID());
@@ -641,17 +653,10 @@ public class City extends AbstractWorldObject {
if (this.getTOL() == null) if (this.getTOL() == null)
return Guild.getErrantGuild(); return Guild.getErrantGuild();
if (this.isNpc == 1) { if (this.getTOL().getOwner() == null)
return Guild.getErrantGuild();
if (this.getTOL().getOwner() == null) return this.getTOL().getOwner().getGuild();
return Guild.getErrantGuild();
return this.getTOL().getOwner().getGuild();
} else {
if (this.getTOL().getOwner() == null)
return Guild.getErrantGuild();
return this.getTOL().getOwner().getGuild();
}
} }
public boolean openCity(boolean open) { public boolean openCity(boolean open) {
@@ -730,7 +735,7 @@ public class City extends AbstractWorldObject {
for (AbstractCharacter npc : getTOL().getHirelings().keySet()) { for (AbstractCharacter npc : getTOL().getHirelings().keySet()) {
if (npc.getObjectType() == GameObjectType.NPC) if (npc.getObjectType() == GameObjectType.NPC)
if (((NPC) npc).getContract().isRuneMaster() == true) if (((NPC) npc).getContract().isRuneMaster())
outNPC = (NPC) npc; outNPC = (NPC) npc;
} }
@@ -763,16 +768,13 @@ public class City extends AbstractWorldObject {
// Set location for this city // Set location for this city
this.location = new Vector3fImmutable(this.parentZone.absX, this.parentZone.absY, this.parentZone.absZ); this.location = new Vector3fImmutable(this.parentZone.absX, this.parentZone.absY, this.parentZone.absZ);
this.bindLoc = new Vector3fImmutable(this.location.x + this.bindX, this.bindLoc = new Vector3fImmutable(this.location.x + this.bindX, this.location.y, this.location.z + this.bindZ);
this.location.y,
this.location.z + this.bindZ);
// set city bounds // set city bounds
Bounds cityBounds = Bounds.borrow(); Bounds cityBounds = Bounds.borrow();
cityBounds.setBounds(new Vector2f(this.location.x + 64, this.location.z + 64), // location x and z are offset by 64 from the center of the city. cityBounds.setBounds(new Vector2f(this.location.x + 64, this.location.z + 64), // location x and z are offset by 64 from the center of the city.
new Vector2f(mbEnums.CityBoundsType.GRID.halfExtents, mbEnums.CityBoundsType.GRID.halfExtents), new Vector2f(mbEnums.CityBoundsType.GRID.halfExtents, mbEnums.CityBoundsType.GRID.halfExtents), 0.0f);
0.0f);
this.setBounds(cityBounds); this.setBounds(cityBounds);
// Sanity check; no tol // Sanity check; no tol
@@ -780,8 +782,7 @@ public class City extends AbstractWorldObject {
if (BuildingManager.getBuilding(this.treeOfLifeID) == null) if (BuildingManager.getBuilding(this.treeOfLifeID) == null)
Logger.info("City UID " + this.getObjectUUID() + " Failed to Load Tree of Life with ID " + this.treeOfLifeID); Logger.info("City UID " + this.getObjectUUID() + " Failed to Load Tree of Life with ID " + this.treeOfLifeID);
if ((ConfigManager.serverType.equals(ServerType.WORLDSERVER)) if ((ConfigManager.serverType.equals(ServerType.WORLDSERVER)) && (this.isNpc == (byte) 0)) {
&& (this.isNpc == (byte) 0)) {
this.realm = RealmMap.getRealmAtLocation(this.getLoc()); this.realm = RealmMap.getRealmAtLocation(this.getLoc());
@@ -801,8 +802,7 @@ public class City extends AbstractWorldObject {
if (this.getGuild().getGuildState() == GuildState.Nation) if (this.getGuild().getGuildState() == GuildState.Nation)
for (Guild sub : this.getGuild().getSubGuildList()) { for (Guild sub : this.getGuild().getSubGuildList()) {
if ((sub.getGuildState() == GuildState.Protectorate) || if ((sub.getGuildState() == GuildState.Protectorate) || (sub.getGuildState() == GuildState.Province)) {
(sub.getGuildState() == GuildState.Province)) {
this.isCapital = 1; this.isCapital = 1;
break; break;
} }
@@ -827,7 +827,7 @@ public class City extends AbstractWorldObject {
this.setHash(); this.setHash();
if (DataWarehouse.recordExists(mbEnums.DataRecordType.CITY, this.getObjectUUID()) == false) { if (!DataWarehouse.recordExists(DataRecordType.CITY, this.getObjectUUID())) {
CityRecord cityRecord = CityRecord.borrow(this, mbEnums.RecordEventType.CREATE); CityRecord cityRecord = CityRecord.borrow(this, mbEnums.RecordEventType.CREATE);
DataWarehouse.pushToWarehouse(cityRecord); DataWarehouse.pushToWarehouse(cityRecord);
} }
@@ -852,9 +852,7 @@ public class City extends AbstractWorldObject {
for (Building building : this.parentZone.zoneBuildingSet) { for (Building building : this.parentZone.zoneBuildingSet) {
if (building.getBlueprint() != null && if (building.getBlueprint() != null && building.getBlueprint().getBuildingGroup() != BuildingGroup.BANESTONE && building.getBlueprint().getBuildingGroup() != BuildingGroup.TOL) {
building.getBlueprint().getBuildingGroup() != BuildingGroup.BANESTONE &&
building.getBlueprint().getBuildingGroup() != BuildingGroup.TOL) {
building.healthMax += (building.healthMax * Realm.getRealmHealthMod(this)); building.healthMax += (building.healthMax * Realm.getRealmHealthMod(this));
@@ -936,7 +934,7 @@ public class City extends AbstractWorldObject {
// Reapply effect with timeout? // Reapply effect with timeout?
if (refreshEffect == true) if (refreshEffect)
player.addCityEffect(Integer.toString(effectBase.getUUID()), effectBase, rank, MBServerStatics.FOURTYFIVE_SECONDS, false, this); player.addCityEffect(Integer.toString(effectBase.getUUID()), effectBase, rank, MBServerStatics.FOURTYFIVE_SECONDS, false, this);
} }
@@ -1192,26 +1190,25 @@ public class City extends AbstractWorldObject {
// All protection contracts are void upon transfer of a city // All protection contracts are void upon transfer of a city
//Dont forget to not Flip protection on Banestones and siege Equipment... Noob. //Dont forget to not Flip protection on Banestones and siege Equipment... Noob.
if (cityBuilding.getBlueprint() != null && !cityBuilding.getBlueprint().isSiegeEquip() if (cityBuilding.getBlueprint() != null && !cityBuilding.getBlueprint().isSiegeEquip() && cityBuilding.getBlueprint().getBuildingGroup() != BuildingGroup.BANESTONE)
&& cityBuilding.getBlueprint().getBuildingGroup() != BuildingGroup.BANESTONE)
cityBuilding.setProtectionState(ProtectionState.NONE); cityBuilding.setProtectionState(ProtectionState.NONE);
// Transfer ownership of valid city assets // Transfer ownership of valid city assets
// these assets are autoprotected. // these assets are autoprotected.
if ((cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.TOL) if ((cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.TOL) || (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.SPIRE) || (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.BARRACK) || (cityBuilding.getBlueprint().isWallPiece()) || (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.SHRINE)) {
|| (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.SPIRE) PlayerCharacter guildLeader = PlayerCharacter.getPlayerCharacter(sourcePlayer.guild.getGuildLeaderUUID());
|| (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.BARRACK) if(guildLeader != null)
|| (cityBuilding.getBlueprint().isWallPiece()) cityBuilding.claim(guildLeader);
|| (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.SHRINE)) { else
cityBuilding.claim(sourcePlayer);
cityBuilding.claim(sourcePlayer);
cityBuilding.setProtectionState(ProtectionState.PROTECTED); cityBuilding.setProtectionState(ProtectionState.PROTECTED);
} }
} }
this.setForceRename(true); this.setForceRename(true);
// Reset city timer for map update // Reset city timer for map update
City.lastCityUpdate = System.currentTimeMillis(); City.lastCityUpdate = System.currentTimeMillis();
@@ -1244,12 +1241,7 @@ public class City extends AbstractWorldObject {
// Transfer ownership of valid city assets // Transfer ownership of valid city assets
// these assets are autoprotected. // these assets are autoprotected.
if ((cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.TOL) if ((cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.TOL) || (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.SPIRE) || (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.BARRACK) || (cityBuilding.getBlueprint().isWallPiece()) || (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.SHRINE)) {
|| (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.SPIRE)
|| (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.BARRACK)
|| (cityBuilding.getBlueprint().isWallPiece())
|| (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.SHRINE)
) {
cityBuilding.claim(sourcePlayer); cityBuilding.claim(sourcePlayer);
cityBuilding.setProtectionState(ProtectionState.PROTECTED); cityBuilding.setProtectionState(ProtectionState.PROTECTED);
@@ -1398,7 +1390,7 @@ public class City extends AbstractWorldObject {
taxPercent = .20f; taxPercent = .20f;
for (int resourceHash : msg.getResources().keySet()) for (int resourceHash : msg.getResources().keySet())
resources.add(ResourceType.hashLookup.get(resourceHash)); resources.add(ResourceType.templateHashLookup.get(resourceHash));
for (ResourceType resourceType : resources) { for (ResourceType resourceType : resources) {
if (Warehouse.isAboveCap(ruledWarehouse, resourceType, (int) (city.warehouse.resources.get(resourceType) * taxPercent))) { if (Warehouse.isAboveCap(ruledWarehouse, resourceType, (int) (city.warehouse.resources.get(resourceType) * taxPercent))) {
+4
View File
@@ -193,12 +193,16 @@ public class Guild extends AbstractWorldObject {
} }
public static boolean sameNationExcludeErrant(Guild a, Guild b) { public static boolean sameNationExcludeErrant(Guild a, Guild b) {
if (a == null || b == null) if (a == null || b == null)
return false; return false;
if (a.getObjectUUID() == b.getObjectUUID()) if (a.getObjectUUID() == b.getObjectUUID())
return true; return true;
if (a.nation == null || b.nation == null) if (a.nation == null || b.nation == null)
return false; return false;
return a.nation.getObjectUUID() == b.nation.getObjectUUID() && !a.nation.isEmptyGuild(); return a.nation.getObjectUUID() == b.nation.getObjectUUID() && !a.nation.isEmptyGuild();
} }
+2 -2
View File
@@ -694,7 +694,7 @@ public class Item extends AbstractWorldObject {
this.bonuses.clear(); this.bonuses.clear();
} }
public float getBonus(ModType modType, SourceType sourceType) { public float getBonus(ModType modType, EffectSourceType sourceType) {
int amount = 0; int amount = 0;
for (AbstractEffectModifier modifier : this.getBonuses().keySet()) { for (AbstractEffectModifier modifier : this.getBonuses().keySet()) {
@@ -707,7 +707,7 @@ public class Item extends AbstractWorldObject {
return amount; return amount;
} }
public float getBonusPercent(ModType modType, SourceType sourceType) { public float getBonusPercent(ModType modType, EffectSourceType sourceType) {
int amount = 0; int amount = 0;
for (AbstractEffectModifier modifier : this.getBonuses().keySet()) { for (AbstractEffectModifier modifier : this.getBonuses().keySet()) {
+3 -3
View File
@@ -166,7 +166,7 @@ public class Mine extends AbstractGameObject {
writer.putInt(mine.getObjectUUID()); //actually a hash of mine writer.putInt(mine.getObjectUUID()); //actually a hash of mine
writer.putString(mine.mineType.name); writer.putString(mine.mineType.name);
writer.putString(mine.zoneName); writer.putString(mine.zoneName);
writer.putInt(mine.production.hash); writer.putInt(mine.production.resourceHash);
writer.putInt(mine.production.mine_production); writer.putInt(mine.production.mine_production);
writer.putInt(mine.getModifiedProductionAmount()); //TODO calculate range penalty here writer.putInt(mine.getModifiedProductionAmount()); //TODO calculate range penalty here
writer.putInt(3600); //window in seconds writer.putInt(3600); //window in seconds
@@ -393,7 +393,7 @@ public class Mine extends AbstractGameObject {
// writer.putInt(0x215C92BB); //this.unknown1); // writer.putInt(0x215C92BB); //this.unknown1);
writer.putString(this.mineType.name); writer.putString(this.mineType.name);
writer.putString(this.zoneName); writer.putString(this.zoneName);
writer.putInt(this.production.hash); writer.putInt(this.production.resourceHash);
writer.putInt(this.production.mine_production); writer.putInt(this.production.mine_production);
writer.putInt(this.getModifiedProductionAmount()); //TODO calculate range penalty here writer.putInt(this.getModifiedProductionAmount()); //TODO calculate range penalty here
writer.putInt(3600); //window in seconds writer.putInt(3600); //window in seconds
@@ -482,7 +482,7 @@ public class Mine extends AbstractGameObject {
if (this.owningGuild.getOwnedCity().warehouse == null) if (this.owningGuild.getOwnedCity().warehouse == null)
return false; return false;
return Warehouse.depositFromMine(this, mbEnums.ResourceType.resourceLookup.get(this.production.templateID), this.getModifiedProductionAmount(), this.owningGuild.getOwnedCity().warehouse); return Warehouse.depositFromMine(this, mbEnums.ResourceType.templateLookup.get(this.production.templateID), this.getModifiedProductionAmount(), this.owningGuild.getOwnedCity().warehouse);
} }
public boolean updateGuildOwner(PlayerCharacter playerCharacter) { public boolean updateGuildOwner(PlayerCharacter playerCharacter) {
+18 -18
View File
@@ -708,19 +708,19 @@ public class Mob extends AbstractIntelligenceAgent implements Delayed {
// TODO modify for equipment // TODO modify for equipment
if (this.bonuses != null) { if (this.bonuses != null) {
// modify for effects // modify for effects
strVal += this.bonuses.getFloat(ModType.Attr, SourceType.Strength); strVal += this.bonuses.getFloat(ModType.Attr, EffectSourceType.Strength);
dexVal += this.bonuses.getFloat(ModType.Attr, SourceType.Dexterity); dexVal += this.bonuses.getFloat(ModType.Attr, EffectSourceType.Dexterity);
conVal += this.bonuses.getFloat(ModType.Attr, SourceType.Constitution); conVal += this.bonuses.getFloat(ModType.Attr, EffectSourceType.Constitution);
intVal += this.bonuses.getFloat(ModType.Attr, SourceType.Intelligence); intVal += this.bonuses.getFloat(ModType.Attr, EffectSourceType.Intelligence);
spiVal += this.bonuses.getFloat(ModType.Attr, SourceType.Spirit); spiVal += this.bonuses.getFloat(ModType.Attr, EffectSourceType.Spirit);
// apply dex penalty for armor // apply dex penalty for armor
// modify percent amounts. DO THIS LAST! // modify percent amounts. DO THIS LAST!
strVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, SourceType.Strength)); strVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, EffectSourceType.Strength));
dexVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, SourceType.Dexterity)); dexVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, EffectSourceType.Dexterity));
conVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, SourceType.Constitution)); conVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, EffectSourceType.Constitution));
intVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, SourceType.Intelligence)); intVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, EffectSourceType.Intelligence));
spiVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, SourceType.Spirit)); spiVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, EffectSourceType.Spirit));
} }
// Set current stats // Set current stats
@@ -737,7 +737,7 @@ public class Mob extends AbstractIntelligenceAgent implements Delayed {
float bonus = 1; float bonus = 1;
if (this.bonuses != null) if (this.bonuses != null)
// get rune and effect bonuses // get rune and effect bonuses
bonus *= (1 + this.bonuses.getFloatPercentAll(ModType.Speed, SourceType.None)); bonus *= (1 + this.bonuses.getFloatPercentAll(ModType.Speed, EffectSourceType.None));
if (this.isPlayerGuard()) if (this.isPlayerGuard())
switch (this.mobBase.getLoadID()) { switch (this.mobBase.getLoadID()) {
@@ -834,7 +834,7 @@ public class Mob extends AbstractIntelligenceAgent implements Delayed {
if (!this.isMoving()) if (!this.isMoving())
return; return;
if (this.isAlive() == false || this.getBonuses().getBool(ModType.Stunned, SourceType.None) || this.getBonuses().getBool(ModType.CannotMove, SourceType.None)) { if (this.isAlive() == false || this.getBonuses().getBool(ModType.Stunned, EffectSourceType.None) || this.getBonuses().getBool(ModType.CannotMove, EffectSourceType.None)) {
//Target is stunned or rooted. Don't move //Target is stunned or rooted. Don't move
this.stopMovement(this.getMovementLoc()); this.stopMovement(this.getMovementLoc());
@@ -1070,15 +1070,15 @@ public class Mob extends AbstractIntelligenceAgent implements Delayed {
// Apply any bonuses from runes and effects // Apply any bonuses from runes and effects
if (this.bonuses != null) { if (this.bonuses != null) {
h += this.bonuses.getFloat(ModType.HealthFull, SourceType.None); h += this.bonuses.getFloat(ModType.HealthFull, EffectSourceType.None);
m += this.bonuses.getFloat(ModType.ManaFull, SourceType.None); m += this.bonuses.getFloat(ModType.ManaFull, EffectSourceType.None);
s += this.bonuses.getFloat(ModType.StaminaFull, SourceType.None); s += this.bonuses.getFloat(ModType.StaminaFull, EffectSourceType.None);
//apply effects percent modifiers. DO THIS LAST! //apply effects percent modifiers. DO THIS LAST!
h *= (1 + this.bonuses.getFloatPercentAll(ModType.HealthFull, SourceType.None)); h *= (1 + this.bonuses.getFloatPercentAll(ModType.HealthFull, EffectSourceType.None));
m *= (1 + this.bonuses.getFloatPercentAll(ModType.ManaFull, SourceType.None)); m *= (1 + this.bonuses.getFloatPercentAll(ModType.ManaFull, EffectSourceType.None));
s *= (1 + this.bonuses.getFloatPercentAll(ModType.StaminaFull, SourceType.None)); s *= (1 + this.bonuses.getFloatPercentAll(ModType.StaminaFull, EffectSourceType.None));
} }
// Set max health, mana and stamina // Set max health, mana and stamina
+21 -21
View File
@@ -13,8 +13,8 @@ import engine.gameManager.ChatManager;
import engine.gameManager.ConfigManager; import engine.gameManager.ConfigManager;
import engine.gameManager.PowersManager; import engine.gameManager.PowersManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.powers.DamageShield; import engine.powers.DamageShield;
import engine.powers.EffectsBase; import engine.powers.EffectsBase;
import engine.powers.effectmodifiers.AbstractEffectModifier; import engine.powers.effectmodifiers.AbstractEffectModifier;
@@ -30,9 +30,9 @@ public class PlayerBonuses {
ConcurrentHashMap<AbstractEffectModifier, Float> bonusFloats = new ConcurrentHashMap<>(); ConcurrentHashMap<AbstractEffectModifier, Float> bonusFloats = new ConcurrentHashMap<>();
private ConcurrentHashMap<AbstractEffectModifier, DamageShield> bonusDamageShields = new ConcurrentHashMap<>(); private ConcurrentHashMap<AbstractEffectModifier, DamageShield> bonusDamageShields = new ConcurrentHashMap<>();
private ConcurrentHashMap<AbstractEffectModifier, String> bonusStrings = new ConcurrentHashMap<>(); private ConcurrentHashMap<AbstractEffectModifier, String> bonusStrings = new ConcurrentHashMap<>();
private ConcurrentHashMap<ModType, HashSet<SourceType>> bonusLists = new ConcurrentHashMap<>(); private ConcurrentHashMap<ModType, HashSet<EffectSourceType>> bonusLists = new ConcurrentHashMap<>();
private ConcurrentHashMap<ModType, HashMap<SourceType, Boolean>> bonusBools = new ConcurrentHashMap<>(); private ConcurrentHashMap<ModType, HashMap<EffectSourceType, Boolean>> bonusBools = new ConcurrentHashMap<>();
private ConcurrentHashMap<SourceType, Float> skillBonuses = new ConcurrentHashMap<>(); private ConcurrentHashMap<EffectSourceType, Float> skillBonuses = new ConcurrentHashMap<>();
private ConcurrentHashMap<ModType, Float> regens = new ConcurrentHashMap<>(); private ConcurrentHashMap<ModType, Float> regens = new ConcurrentHashMap<>();
//If active == 0 then all gets come from the A list and all puts go to the B list //If active == 0 then all gets come from the A list and all puts go to the B list
@@ -229,7 +229,7 @@ public class PlayerBonuses {
//Update seeInvis if needed //Update seeInvis if needed
float seeInvis = this.getFloat(ModType.SeeInvisible, SourceType.None); float seeInvis = this.getFloat(ModType.SeeInvisible, EffectSourceType.None);
if (pc.getSeeInvis() < seeInvis) if (pc.getSeeInvis() < seeInvis)
pc.setSeeInvis((short) seeInvis); pc.setSeeInvis((short) seeInvis);
@@ -254,7 +254,7 @@ public class PlayerBonuses {
this.bonusStrings.remove(mod); this.bonusStrings.remove(mod);
} }
public void setList(ModType mod, HashSet<SourceType> val) { public void setList(ModType mod, HashSet<EffectSourceType> val) {
if (!val.equals(null)) if (!val.equals(null))
this.bonusLists.put(mod, val); this.bonusLists.put(mod, val);
else else
@@ -281,7 +281,7 @@ public class PlayerBonuses {
} }
public boolean getBool(ModType modType, SourceType sourceType) { public boolean getBool(ModType modType, EffectSourceType sourceType) {
if (this.bonusBools.containsKey(modType) == false) if (this.bonusBools.containsKey(modType) == false)
return false; return false;
@@ -293,7 +293,7 @@ public class PlayerBonuses {
} }
public float getSkillBonus(SourceType sourceType) { public float getSkillBonus(EffectSourceType sourceType) {
if (this.skillBonuses.containsKey(sourceType) == false) if (this.skillBonuses.containsKey(sourceType) == false)
return 0; return 0;
@@ -301,7 +301,7 @@ public class PlayerBonuses {
} }
public float getFloat(ModType modType, SourceType sourceType) { public float getFloat(ModType modType, EffectSourceType sourceType) {
float amount = 0; float amount = 0;
for (AbstractEffectModifier mod : this.bonusFloats.keySet()) { for (AbstractEffectModifier mod : this.bonusFloats.keySet()) {
if (mod.getPercentMod() != 0) if (mod.getPercentMod() != 0)
@@ -317,7 +317,7 @@ public class PlayerBonuses {
return amount; return amount;
} }
public float getFloatPercentPositive(ModType modType, SourceType sourceType) { public float getFloatPercentPositive(ModType modType, EffectSourceType sourceType) {
float amount = 0; float amount = 0;
for (AbstractEffectModifier mod : this.bonusFloats.keySet()) { for (AbstractEffectModifier mod : this.bonusFloats.keySet()) {
@@ -340,7 +340,7 @@ public class PlayerBonuses {
return amount; return amount;
} }
public float getFloatPercentAll(ModType modType, SourceType sourceType) { public float getFloatPercentAll(ModType modType, EffectSourceType sourceType) {
float amount = 0; float amount = 0;
for (AbstractEffectModifier mod : this.bonusFloats.keySet()) { for (AbstractEffectModifier mod : this.bonusFloats.keySet()) {
@@ -365,7 +365,7 @@ public class PlayerBonuses {
} }
public float getFloatPercentNullZero(ModType modType, SourceType sourceType) { public float getFloatPercentNullZero(ModType modType, EffectSourceType sourceType) {
float amount = 0; float amount = 0;
for (AbstractEffectModifier mod : this.bonusFloats.keySet()) { for (AbstractEffectModifier mod : this.bonusFloats.keySet()) {
@@ -382,7 +382,7 @@ public class PlayerBonuses {
return amount; return amount;
} }
public float getFloatPercentNegative(ModType modType, SourceType sourceType) { public float getFloatPercentNegative(ModType modType, EffectSourceType sourceType) {
float amount = 0; float amount = 0;
for (AbstractEffectModifier mod : this.bonusFloats.keySet()) { for (AbstractEffectModifier mod : this.bonusFloats.keySet()) {
@@ -404,7 +404,7 @@ public class PlayerBonuses {
} }
public HashSet<SourceType> getList(ModType modType) { public HashSet<EffectSourceType> getList(ModType modType) {
if (this.bonusLists.containsKey(modType)) if (this.bonusLists.containsKey(modType))
return this.bonusLists.get(modType); return this.bonusLists.get(modType);
else else
@@ -442,7 +442,7 @@ public class PlayerBonuses {
for (ModType modType : this.bonusBools.keySet()) { for (ModType modType : this.bonusBools.keySet()) {
for (SourceType sourceType : this.bonusBools.get(modType).keySet()) { for (EffectSourceType sourceType : this.bonusBools.get(modType).keySet()) {
ChatManager.chatSystemInfo(pc, modType.name() + "-" + sourceType.name() + " = " + this.bonusBools.get(modType).get(sourceType)); ChatManager.chatSystemInfo(pc, modType.name() + "-" + sourceType.name() + " = " + this.bonusBools.get(modType).get(sourceType));
} }
} }
@@ -452,19 +452,19 @@ public class PlayerBonuses {
if (modType.equals(ModType.StaminaRecoverRate) || modType.equals(ModType.HealthRecoverRate) || modType.equals(ModType.ManaRecoverRate)) if (modType.equals(ModType.StaminaRecoverRate) || modType.equals(ModType.HealthRecoverRate) || modType.equals(ModType.ManaRecoverRate))
ChatManager.chatSystemInfo(pc, modType.name() + " = " + this.getRegen(modType)); ChatManager.chatSystemInfo(pc, modType.name() + " = " + this.getRegen(modType));
else else
for (SourceType sourceType : SourceType.values()) { for (EffectSourceType sourceType : EffectSourceType.values()) {
float amount = this.getFloat(modType, sourceType); float amount = this.getFloat(modType, sourceType);
float percentAmount = this.getFloatPercentPositive(modType, sourceType); float percentAmount = this.getFloatPercentPositive(modType, sourceType);
float percentAmountNegative = this.getFloatPercentNegative(modType, sourceType); float percentAmountNegative = this.getFloatPercentNegative(modType, sourceType);
if (amount != 0) if (amount != 0)
ChatManager.chatSystemInfo(pc, modType.name() + "-" + (sourceType.equals(SourceType.None) == false ? sourceType.name() : "") + " = " + amount); ChatManager.chatSystemInfo(pc, modType.name() + "-" + (sourceType.equals(EffectSourceType.None) == false ? sourceType.name() : "") + " = " + amount);
if (percentAmount != 0) if (percentAmount != 0)
ChatManager.chatSystemInfo(pc, "Percent : " + modType.name() + "-" + (sourceType.equals(SourceType.None) == false ? sourceType.name() : "") + " = " + percentAmount); ChatManager.chatSystemInfo(pc, "Percent : " + modType.name() + "-" + (sourceType.equals(EffectSourceType.None) == false ? sourceType.name() : "") + " = " + percentAmount);
if (percentAmountNegative != 0) if (percentAmountNegative != 0)
ChatManager.chatSystemInfo(pc, "Negative Percent : " + modType.name() + "-" + (sourceType.equals(SourceType.None) == false ? sourceType.name() : "") + " = " + percentAmountNegative); ChatManager.chatSystemInfo(pc, "Negative Percent : " + modType.name() + "-" + (sourceType.equals(EffectSourceType.None) == false ? sourceType.name() : "") + " = " + percentAmountNegative);
} }
} }
@@ -472,11 +472,11 @@ public class PlayerBonuses {
} }
public void setBool(ModType modType, SourceType sourceType, boolean val) { public void setBool(ModType modType, EffectSourceType sourceType, boolean val) {
if (val == true) { if (val == true) {
if (this.bonusBools.get(modType) == null) { if (this.bonusBools.get(modType) == null) {
HashMap<SourceType, Boolean> sourceMap = new HashMap<>(); HashMap<EffectSourceType, Boolean> sourceMap = new HashMap<>();
this.bonusBools.put(modType, sourceMap); this.bonusBools.put(modType, sourceMap);
} }
+29 -29
View File
@@ -3093,7 +3093,7 @@ public class PlayerCharacter extends AbstractCharacter {
if (this.bonuses != null) if (this.bonuses != null)
// get rune and effect bonuses // get rune and effect bonuses
bonus += this.bonuses.getFloatPercentNullZero(ModType.Speed, SourceType.None); bonus += this.bonuses.getFloatPercentNullZero(ModType.Speed, EffectSourceType.None);
// TODO get equip bonus // TODO get equip bonus
this.update(); this.update();
@@ -3597,8 +3597,8 @@ public class PlayerCharacter extends AbstractCharacter {
//calculateModifiedStats(); //calculateModifiedStats();
//update hide and seeInvis levels //update hide and seeInvis levels
if (this.bonuses != null) { if (this.bonuses != null) {
this.hidden = (int) bonuses.getFloat(ModType.Invisible, SourceType.None); this.hidden = (int) bonuses.getFloat(ModType.Invisible, EffectSourceType.None);
this.seeInvis = (int) bonuses.getFloat(ModType.SeeInvisible, SourceType.None); this.seeInvis = (int) bonuses.getFloat(ModType.SeeInvisible, EffectSourceType.None);
} else { } else {
this.hidden = (byte) 0; this.hidden = (byte) 0;
this.seeInvis = (byte) 0; this.seeInvis = (byte) 0;
@@ -3666,21 +3666,21 @@ public class PlayerCharacter extends AbstractCharacter {
// TODO modify for equipment // TODO modify for equipment
if (this.bonuses != null) { if (this.bonuses != null) {
// modify for effects // modify for effects
strVal += Math.round(this.bonuses.getFloat(ModType.Attr, SourceType.Strength)); strVal += Math.round(this.bonuses.getFloat(ModType.Attr, EffectSourceType.Strength));
dexVal += Math.round(this.bonuses.getFloat(ModType.Attr, SourceType.Dexterity)); dexVal += Math.round(this.bonuses.getFloat(ModType.Attr, EffectSourceType.Dexterity));
conVal += Math.round(this.bonuses.getFloat(ModType.Attr, SourceType.Constitution)); conVal += Math.round(this.bonuses.getFloat(ModType.Attr, EffectSourceType.Constitution));
intVal += Math.round(this.bonuses.getFloat(ModType.Attr, SourceType.Intelligence)); intVal += Math.round(this.bonuses.getFloat(ModType.Attr, EffectSourceType.Intelligence));
spiVal += Math.round(this.bonuses.getFloat(ModType.Attr, SourceType.Spirit)); spiVal += Math.round(this.bonuses.getFloat(ModType.Attr, EffectSourceType.Spirit));
// apply dex penalty for armor // apply dex penalty for armor
dexVal *= this.dexPenalty; dexVal *= this.dexPenalty;
// modify percent amounts. DO THIS LAST! // modify percent amounts. DO THIS LAST!
strVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, SourceType.Strength)); strVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, EffectSourceType.Strength));
dexVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, SourceType.Dexterity)); dexVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, EffectSourceType.Dexterity));
conVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, SourceType.Constitution)); conVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, EffectSourceType.Constitution));
intVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, SourceType.Intelligence)); intVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, EffectSourceType.Intelligence));
spiVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, SourceType.Spirit)); spiVal *= (1 + this.bonuses.getFloatPercentAll(ModType.Attr, EffectSourceType.Spirit));
} else } else
// apply dex penalty for armor // apply dex penalty for armor
@@ -3776,24 +3776,24 @@ public class PlayerCharacter extends AbstractCharacter {
wbOff = off.template; wbOff = off.template;
//set block if block found //set block if block found
this.bonuses.setBool(ModType.Block, SourceType.None, false); this.bonuses.setBool(ModType.Block, EffectSourceType.None, false);
if (this.baseClass != null && (this.baseClass.getObjectUUID() == 2500 || this.baseClass.getObjectUUID() == 2501)) if (this.baseClass != null && (this.baseClass.getObjectUUID() == 2500 || this.baseClass.getObjectUUID() == 2501))
if (off != null && off.template != null && ItemManager.isShield(off)) if (off != null && off.template != null && ItemManager.isShield(off))
this.bonuses.setBool(ModType.Block, SourceType.None, true); this.bonuses.setBool(ModType.Block, EffectSourceType.None, true);
//set dodge if rogue //set dodge if rogue
if (this.baseClass != null && this.baseClass.getObjectUUID() == 2502) if (this.baseClass != null && this.baseClass.getObjectUUID() == 2502)
this.bonuses.setBool(ModType.Dodge, SourceType.None, true); this.bonuses.setBool(ModType.Dodge, EffectSourceType.None, true);
else else
this.bonuses.setBool(ModType.Dodge, SourceType.None, false); this.bonuses.setBool(ModType.Dodge, EffectSourceType.None, false);
//set parry if fighter or thief and no invalid weapon found //set parry if fighter or thief and no invalid weapon found
this.bonuses.setBool(ModType.Parry, SourceType.None, false); this.bonuses.setBool(ModType.Parry, EffectSourceType.None, false);
if ((this.baseClass != null && this.baseClass.getObjectUUID() == 2500) if ((this.baseClass != null && this.baseClass.getObjectUUID() == 2500)
|| (this.promotionClass != null && this.promotionClass.getObjectUUID() == 2520)) || (this.promotionClass != null && this.promotionClass.getObjectUUID() == 2520))
if (wbMain == null || wbMain.item_weapon_max_range < MBServerStatics.RANGED_WEAPON_RANGE) if (wbMain == null || wbMain.item_weapon_max_range < MBServerStatics.RANGED_WEAPON_RANGE)
if (wbOff == null || wbOff.item_weapon_max_range < MBServerStatics.RANGED_WEAPON_RANGE) if (wbOff == null || wbOff.item_weapon_max_range < MBServerStatics.RANGED_WEAPON_RANGE)
this.bonuses.setBool(ModType.Parry, SourceType.None, true); this.bonuses.setBool(ModType.Parry, EffectSourceType.None, true);
} }
@@ -3892,13 +3892,13 @@ public class PlayerCharacter extends AbstractCharacter {
//apply effects //apply effects
h += this.bonuses.getFloat(ModType.HealthFull, SourceType.None); h += this.bonuses.getFloat(ModType.HealthFull, EffectSourceType.None);
m += this.bonuses.getFloat(ModType.ManaFull, SourceType.None); m += this.bonuses.getFloat(ModType.ManaFull, EffectSourceType.None);
s += this.bonuses.getFloat(ModType.StaminaFull, SourceType.None); s += this.bonuses.getFloat(ModType.StaminaFull, EffectSourceType.None);
h *= (1 + this.bonuses.getFloatPercentAll(ModType.HealthFull, SourceType.None)); h *= (1 + this.bonuses.getFloatPercentAll(ModType.HealthFull, EffectSourceType.None));
m *= (1 + this.bonuses.getFloatPercentAll(ModType.ManaFull, SourceType.None)); m *= (1 + this.bonuses.getFloatPercentAll(ModType.ManaFull, EffectSourceType.None));
s *= (1 + this.bonuses.getFloatPercentAll(ModType.StaminaFull, SourceType.None)); s *= (1 + this.bonuses.getFloatPercentAll(ModType.StaminaFull, EffectSourceType.None));
} }
@@ -3933,11 +3933,11 @@ public class PlayerCharacter extends AbstractCharacter {
ModType modType = ModType.GetModType(type); ModType modType = ModType.GetModType(type);
// must be allowed to use this passive // must be allowed to use this passive
if (!this.bonuses.getBool(modType, SourceType.None)) if (!this.bonuses.getBool(modType, EffectSourceType.None))
return 0f; return 0f;
// must not be stunned // must not be stunned
if (this.bonuses.getBool(ModType.Stunned, SourceType.None)) if (this.bonuses.getBool(ModType.Stunned, EffectSourceType.None))
return 0f; return 0f;
// Get base skill amount // Get base skill amount
@@ -3949,7 +3949,7 @@ public class PlayerCharacter extends AbstractCharacter {
amount = sk.getModifiedAmount(); amount = sk.getModifiedAmount();
// Add bonuses // Add bonuses
amount += this.bonuses.getFloat(modType, SourceType.None); amount += this.bonuses.getFloat(modType, EffectSourceType.None);
// Add item bonuses and return // Add item bonuses and return
if (type.equals(ModType.Dodge) && !fromCombat) if (type.equals(ModType.Dodge) && !fromCombat)
@@ -4383,7 +4383,7 @@ public class PlayerCharacter extends AbstractCharacter {
Vector3fImmutable newLoc = this.getMovementLoc(); Vector3fImmutable newLoc = this.getMovementLoc();
if (this.isAlive() == false || this.getBonuses().getBool(ModType.Stunned, SourceType.None) || this.getBonuses().getBool(ModType.CannotMove, SourceType.None)) { if (this.isAlive() == false || this.getBonuses().getBool(ModType.Stunned, EffectSourceType.None) || this.getBonuses().getBool(ModType.CannotMove, EffectSourceType.None)) {
//Target is stunned or rooted. Don't move //Target is stunned or rooted. Don't move
this.stopMovement(newLoc); this.stopMovement(newLoc);
return; return;
+32 -32
View File
@@ -12,8 +12,8 @@ package engine.objects;
import engine.gameManager.ChatManager; import engine.gameManager.ChatManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -105,7 +105,7 @@ public class Resists {
PlayerBonuses bonus = target.getBonuses(); PlayerBonuses bonus = target.getBonuses();
//see if there is a fortitude //see if there is a fortitude
float damageCap = bonus.getFloatPercentAll(ModType.DamageCap, SourceType.None); float damageCap = bonus.getFloatPercentAll(ModType.DamageCap, EffectSourceType.None);
if (damageCap == 0f || type == mbEnums.DamageType.HEALING) if (damageCap == 0f || type == mbEnums.DamageType.HEALING)
return damage; return damage;
@@ -117,7 +117,7 @@ public class Resists {
//let's see if valid damagetype to apply it //let's see if valid damagetype to apply it
boolean exclusive; boolean exclusive;
HashSet<SourceType> forts = bonus.getList(ModType.IgnoreDamageCap); HashSet<EffectSourceType> forts = bonus.getList(ModType.IgnoreDamageCap);
if (forts == null) { if (forts == null) {
exclusive = true; exclusive = true;
forts = bonus.getList(ModType.ExclusiveDamageCap); forts = bonus.getList(ModType.ExclusiveDamageCap);
@@ -126,15 +126,15 @@ public class Resists {
if (forts == null || !isValidDamageCapType(forts, type, exclusive)) if (forts == null || !isValidDamageCapType(forts, type, exclusive))
return damage; return damage;
float adjustedDamage = bonus.getFloatPercentAll(ModType.AdjustAboveDmgCap, SourceType.None); float adjustedDamage = bonus.getFloatPercentAll(ModType.AdjustAboveDmgCap, EffectSourceType.None);
//Adjust damage down and return new amount //Adjust damage down and return new amount
float aadc = 1 + adjustedDamage; float aadc = 1 + adjustedDamage;
return capFire * aadc; return capFire * aadc;
} }
//Test if Damagetype is valid for foritude //Test if Damagetype is valid for foritude
private static boolean isValidDamageCapType(HashSet<SourceType> forts, mbEnums.DamageType damageType, boolean exclusive) { private static boolean isValidDamageCapType(HashSet<EffectSourceType> forts, mbEnums.DamageType damageType, boolean exclusive) {
for (SourceType fort : forts) { for (EffectSourceType fort : forts) {
mbEnums.DamageType dt = mbEnums.DamageType.getDamageType(fort.name()); mbEnums.DamageType dt = mbEnums.DamageType.getDamageType(fort.name());
if (dt.equals(mbEnums.DamageType.NONE)) if (dt.equals(mbEnums.DamageType.NONE))
@@ -327,7 +327,7 @@ public class Resists {
damage = handleFortitude(target, type, damage); damage = handleFortitude(target, type, damage);
//calculate armor piercing //calculate armor piercing
float ap = source.getBonuses().getFloatPercentAll(ModType.ArmorPiercing, SourceType.None); float ap = source.getBonuses().getFloatPercentAll(ModType.ArmorPiercing, EffectSourceType.None);
float damageAfterResists = damage * (1 - (this.getResist(type, trains) * 0.01f) + ap); float damageAfterResists = damage * (1 - (this.getResist(type, trains) * 0.01f) + ap);
//check to see if any damage absorbers should cancel //check to see if any damage absorbers should cancel
@@ -346,41 +346,41 @@ public class Resists {
if (rb != null) { if (rb != null) {
// Handle immunities // Handle immunities
if (rb.getBool(ModType.ImmuneTo, SourceType.Stun)) if (rb.getBool(ModType.ImmuneTo, EffectSourceType.Stun))
this.immuneTo.put(mbEnums.DamageType.STUN, true); this.immuneTo.put(mbEnums.DamageType.STUN, true);
if (rb.getBool(ModType.ImmuneTo, SourceType.Blind)) if (rb.getBool(ModType.ImmuneTo, EffectSourceType.Blind))
this.immuneTo.put(mbEnums.DamageType.BLIND, true); this.immuneTo.put(mbEnums.DamageType.BLINDNESS, true);
if (rb.getBool(ModType.ImmuneToAttack, SourceType.None)) if (rb.getBool(ModType.ImmuneToAttack, EffectSourceType.None))
this.immuneTo.put(mbEnums.DamageType.ATTACK, true); this.immuneTo.put(mbEnums.DamageType.ATTACK, true);
if (rb.getBool(ModType.ImmuneToPowers, SourceType.None)) if (rb.getBool(ModType.ImmuneToPowers, EffectSourceType.None))
this.immuneTo.put(mbEnums.DamageType.POWERS, true); this.immuneTo.put(mbEnums.DamageType.POWERS, true);
if (rb.getBool(ModType.ImmuneTo, SourceType.Powerblock)) if (rb.getBool(ModType.ImmuneTo, EffectSourceType.Powerblock))
this.immuneTo.put(mbEnums.DamageType.POWERBLOCK, true); this.immuneTo.put(mbEnums.DamageType.POWERINHIBITOR, true);
if (rb.getBool(ModType.ImmuneTo, SourceType.DeBuff)) if (rb.getBool(ModType.ImmuneTo, EffectSourceType.DeBuff))
this.immuneTo.put(mbEnums.DamageType.DEBUFF, true); this.immuneTo.put(mbEnums.DamageType.DEBUFF, true);
if (rb.getBool(ModType.ImmuneTo, SourceType.Fear)) if (rb.getBool(ModType.ImmuneTo, EffectSourceType.Fear))
this.immuneTo.put(mbEnums.DamageType.FEAR, true); this.immuneTo.put(mbEnums.DamageType.FEAR, true);
if (rb.getBool(ModType.ImmuneTo, SourceType.Charm)) if (rb.getBool(ModType.ImmuneTo, EffectSourceType.Charm))
this.immuneTo.put(mbEnums.DamageType.CHARM, true); this.immuneTo.put(mbEnums.DamageType.CHARM, true);
if (rb.getBool(ModType.ImmuneTo, SourceType.Root)) if (rb.getBool(ModType.ImmuneTo, EffectSourceType.Root))
this.immuneTo.put(mbEnums.DamageType.ROOT, true); this.immuneTo.put(mbEnums.DamageType.ROOT, true);
if (rb.getBool(ModType.ImmuneTo, SourceType.Snare)) if (rb.getBool(ModType.ImmuneTo, EffectSourceType.Snare))
this.immuneTo.put(mbEnums.DamageType.SNARE, true); this.immuneTo.put(mbEnums.DamageType.SNARE, true);
// Handle resists // Handle resists
slash += rb.getFloat(ModType.Resistance, SourceType.Slashing); slash += rb.getFloat(ModType.Resistance, EffectSourceType.Slashing);
crush += rb.getFloat(ModType.Resistance, SourceType.Crushing); crush += rb.getFloat(ModType.Resistance, EffectSourceType.Crushing);
pierce += rb.getFloat(ModType.Resistance, SourceType.Piercing); pierce += rb.getFloat(ModType.Resistance, EffectSourceType.Piercing);
magic += rb.getFloat(ModType.Resistance, SourceType.Magic); magic += rb.getFloat(ModType.Resistance, EffectSourceType.Magic);
bleed += rb.getFloat(ModType.Resistance, SourceType.Bleeding); bleed += rb.getFloat(ModType.Resistance, EffectSourceType.Bleeding);
poison += rb.getFloat(ModType.Resistance, SourceType.Poison); poison += rb.getFloat(ModType.Resistance, EffectSourceType.Poison);
mental += rb.getFloat(ModType.Resistance, SourceType.Mental); mental += rb.getFloat(ModType.Resistance, EffectSourceType.Mental);
holy += rb.getFloat(ModType.Resistance, SourceType.Holy); holy += rb.getFloat(ModType.Resistance, EffectSourceType.Holy);
unholy += rb.getFloat(ModType.Resistance, SourceType.Unholy); unholy += rb.getFloat(ModType.Resistance, EffectSourceType.Unholy);
lightning += rb.getFloat(ModType.Resistance, SourceType.Lightning); lightning += rb.getFloat(ModType.Resistance, EffectSourceType.Lightning);
fire += rb.getFloat(ModType.Resistance, SourceType.Fire); fire += rb.getFloat(ModType.Resistance, EffectSourceType.Fire);
cold += rb.getFloat(ModType.Resistance, SourceType.Cold); cold += rb.getFloat(ModType.Resistance, EffectSourceType.Cold);
healing += rb.getFloat(ModType.Resistance, SourceType.Healing); // DamageType.Healing.name()); healing += rb.getFloat(ModType.Resistance, EffectSourceType.Heal); // DamageType.Healing.name());
} }
+4 -4
View File
@@ -10,7 +10,7 @@
package engine.objects; package engine.objects;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.mbEnums.SourceType; import engine.mbEnums.EffectSourceType;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import java.sql.ResultSet; import java.sql.ResultSet;
@@ -33,7 +33,7 @@ public class SkillsBase extends AbstractGameObject {
private final short conMod; private final short conMod;
private final short intMod; private final short intMod;
private final short spiMod; private final short spiMod;
public SourceType sourceType; public EffectSourceType sourceType;
/** /**
* No Table ID Constructor * No Table ID Constructor
@@ -43,7 +43,7 @@ public class SkillsBase extends AbstractGameObject {
super(); super();
this.name = name; this.name = name;
this.nameNoSpace = name.replace(" ", ""); this.nameNoSpace = name.replace(" ", "");
this.sourceType = SourceType.GetSourceType(this.nameNoSpace.replace(",", "")); this.sourceType = EffectSourceType.getEffectSourceType(this.nameNoSpace.replace(",", ""));
this.description = description; this.description = description;
this.token = token; this.token = token;
this.strMod = strMod; this.strMod = strMod;
@@ -79,7 +79,7 @@ public class SkillsBase extends AbstractGameObject {
this.name = rs.getString("name"); this.name = rs.getString("name");
this.nameNoSpace = name.replace(" ", ""); this.nameNoSpace = name.replace(" ", "");
this.description = rs.getString("description"); this.description = rs.getString("description");
this.sourceType = SourceType.GetSourceType(this.nameNoSpace.replace("-", "").replace("\"", "").replace(",", "")); this.sourceType = EffectSourceType.getEffectSourceType(this.nameNoSpace.replace("-", "").replace("\"", "").replace(",", ""));
this.token = rs.getInt("token"); this.token = rs.getInt("token");
this.strMod = rs.getShort("strMod"); this.strMod = rs.getShort("strMod");
this.dexMod = rs.getShort("dexMod"); this.dexMod = rs.getShort("dexMod");
+8 -10
View File
@@ -140,7 +140,7 @@ public class Warehouse {
if (warehouse == null) if (warehouse == null)
return; return;
mbEnums.ResourceType resourceType = mbEnums.ResourceType.hashLookup.get(msg.getHashID()); mbEnums.ResourceType resourceType = mbEnums.ResourceType.templateHashLookup.get(msg.getHashID());
if (isResourceLocked(warehouse, resourceType)) { if (isResourceLocked(warehouse, resourceType)) {
ChatManager.chatSystemInfo(playerCharacter, "You cannot withdrawl a locked resource."); ChatManager.chatSystemInfo(playerCharacter, "You cannot withdrawl a locked resource.");
@@ -182,7 +182,7 @@ public class Warehouse {
warehouse = city.warehouse; warehouse = city.warehouse;
mbEnums.ResourceType resourceType = mbEnums.ResourceType.hashLookup.get(hashID); mbEnums.ResourceType resourceType = mbEnums.ResourceType.templateHashLookup.get(hashID);
// toggle lock // toggle lock
@@ -233,7 +233,7 @@ public class Warehouse {
return false; return false;
} }
mbEnums.ResourceType resourceType = mbEnums.ResourceType.resourceLookup.get(resource.templateID); mbEnums.ResourceType resourceType = mbEnums.ResourceType.templateLookup.get(resource.templateID);
if (warehouse.resources.get(resourceType) == null) if (warehouse.resources.get(resourceType) == null)
return false; return false;
@@ -261,7 +261,7 @@ public class Warehouse {
int newAmount = oldAmount + amount; int newAmount = oldAmount + amount;
if (newAmount > mbEnums.ResourceType.resourceLookup.get(resource.templateID).deposit_limit) if (newAmount > mbEnums.ResourceType.templateLookup.get(resource.templateID).deposit_limit)
return false; return false;
if (removeFromInventory) { if (removeFromInventory) {
@@ -381,7 +381,7 @@ public class Warehouse {
int amount = (int) (warehouse.resources.get(resourceType) * taxPercent); int amount = (int) (warehouse.resources.get(resourceType) * taxPercent);
if (amount <= 0) { if (amount <= 0) {
msg.getResources().put(resourceType.hash, 0); msg.getResources().put(resourceType.resourceHash, 0);
continue; continue;
} }
@@ -395,20 +395,18 @@ public class Warehouse {
if (newAmount < amount) if (newAmount < amount)
continue; continue;
msg.getResources().put(resourceType.hash, amount); msg.getResources().put(resourceType.resourceHash, amount);
if (!DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse)) { if (!DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse)) {
msg.getResources().put(resourceType.hash, 0); msg.getResources().put(resourceType.resourceHash, 0);
warehouse.resources.put(resourceType, oldAmount); warehouse.resources.put(resourceType, oldAmount);
continue; continue;
} }
warehouse.resources.put(resourceType, newAmount); warehouse.resources.put(resourceType, newAmount);
depositRealmTaxes(taxer, resourceType, amount, warehouse); depositRealmTaxes(taxer, resourceType, amount, warehouse);
mbEnums.ResourceType resource;
AddTransactionToWarehouse(warehouse, taxer.getObjectType(), taxer.getObjectUUID(), mbEnums.TransactionType.TAXRESOURCE, resourceType, amount); AddTransactionToWarehouse(warehouse, taxer.getObjectType(), taxer.getObjectUUID(), mbEnums.TransactionType.TAXRESOURCE, resourceType, amount);
} }
} }
@@ -431,7 +429,7 @@ public class Warehouse {
return false; return false;
if (addToInventory) if (addToInventory)
if (!itemMan.hasRoomInventory(template.item_wt * amount)) { if (!itemMan.hasRoomInventory(template.item_wt)) {
ChatManager.chatSystemInfo(playerCharacter, "You can not carry any more of that item."); ChatManager.chatSystemInfo(playerCharacter, "You can not carry any more of that item.");
return false; return false;
} }
+17 -25
View File
@@ -11,8 +11,9 @@ package engine.powers;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.PowersManager; import engine.gameManager.PowersManager;
import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.mbEnums.StackType; import engine.mbEnums.StackType;
import engine.objects.AbstractCharacter; import engine.objects.AbstractCharacter;
import engine.objects.AbstractWorldObject; import engine.objects.AbstractWorldObject;
@@ -244,32 +245,23 @@ public class ActionsBase {
} }
//Add blocked types here //Add blocked types here
public boolean blocked(AbstractWorldObject awo, PowersBase pb, int trains) { public boolean blocked(AbstractWorldObject awo, boolean vampDrain) {
if (AbstractWorldObject.IsAbstractCharacter(awo)) { //Check for immunities
AbstractCharacter ac = (AbstractCharacter) awo; if (AbstractCharacter.IsAbstractCharacter(awo)){
PlayerBonuses bonus = ac.getBonuses(); AbstractCharacter pcTarget = (AbstractCharacter) awo;
if (bonus == null) PlayerBonuses bonus = pcTarget.getBonuses();
return false;
//TODO make this more efficient then testing strings if(vampDrain)
if (this.stackType.equals("Stun") && bonus.getBool(ModType.ImmuneTo, SourceType.STUN)) return bonus.getBool(ModType.BlockedPowerType, EffectSourceType.VAMPDRAIN);
return true; //Currently stun immune. Skip stun
else if (this.stackType.equals("Snare") && bonus.getBool(ModType.ImmuneTo, SourceType.Snare)) if ((this.stackType.equals("Flight") && bonus.getBool(ModType.NoMod, EffectSourceType.Fly)) ||
return true; //Currently snare immune. Skip snare (this.stackType.equals("Track") && bonus.getBool(ModType.CannotTrack, EffectSourceType.None))) {
else if (this.stackType.equals("Blindness") && bonus.getBool(ModType.ImmuneTo, SourceType.Blind))
return true; //Currently blind immune. Skip blind
else if (this.stackType.equals("PowerInhibitor") && bonus.getBool(ModType.ImmuneTo, SourceType.Powerblock))
return true; //Currently power block immune. Skip power block
else if (this.stackType.equals("Root") && bonus.getBool(ModType.ImmuneTo, SourceType.Root))
return true; return true;
// else if (pb.isHeal() && (bonus.getByte("immuneTo.Heal")) >= trains) }
// return true; //Currently shadowmantled. Skip heals
else if (this.stackType.equals("Flight") && bonus.getBool(ModType.NoMod, SourceType.Fly)) mbEnums.DamageType damageType = mbEnums.DamageType.getDamageType(this.stackType.toUpperCase());
return true; return pcTarget.getResists().immuneTo(damageType);
else if (this.stackType.equals("Track") && bonus.getBool(ModType.CannotTrack, SourceType.None))
return true;
else
return pb.vampDrain() && bonus.getBool(ModType.BlockedPowerType, SourceType.VAMPDRAIN);
} }
return false; return false;
} }
+2 -9
View File
@@ -633,15 +633,8 @@ public class PowersBase {
return description; return description;
} }
public boolean ignoreLore(){ public boolean enforceLore(){
switch(this.category){ return this.powerCategory.equals(PowerCategoryType.SUMMON) || this.powerCategory.equals(PowerCategoryType.HEAL)|| this.powerCategory.equals(PowerCategoryType.BUFF);
case "HEAL":
case "BUFF":
case "DISPELL":
case "SUMMON":
return false;
}
return true;
} }
} }
@@ -10,8 +10,8 @@
package engine.powers.effectmodifiers; package engine.powers.effectmodifiers;
import engine.jobs.AbstractEffectJob; import engine.jobs.AbstractEffectJob;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.objects.AbstractCharacter; import engine.objects.AbstractCharacter;
import engine.objects.AbstractWorldObject; import engine.objects.AbstractWorldObject;
import engine.objects.Building; import engine.objects.Building;
@@ -25,7 +25,7 @@ import java.sql.SQLException;
public abstract class AbstractEffectModifier { public abstract class AbstractEffectModifier {
public float minMod; public float minMod;
public SourceType sourceType; public EffectSourceType sourceType;
public ModType modType; public ModType modType;
protected EffectsBase parent; protected EffectsBase parent;
protected int UUID; protected int UUID;
@@ -46,7 +46,7 @@ public abstract class AbstractEffectModifier {
this.effectType = rs.getString("modType"); this.effectType = rs.getString("modType");
this.modType = ModType.GetModType(this.effectType); this.modType = ModType.GetModType(this.effectType);
this.type = rs.getString("type").replace("\"", ""); this.type = rs.getString("type").replace("\"", "");
this.sourceType = SourceType.GetSourceType(this.type.replace(" ", "").replace("-", "")); this.sourceType = EffectSourceType.getEffectSourceType(this.type.replace(" ", "").replace("-", ""));
this.minMod = rs.getFloat("minMod"); this.minMod = rs.getFloat("minMod");
this.maxMod = rs.getFloat("maxMod"); this.maxMod = rs.getFloat("maxMod");
this.percentMod = rs.getFloat("percentMod"); this.percentMod = rs.getFloat("percentMod");
@@ -10,8 +10,8 @@
package engine.powers.effectmodifiers; package engine.powers.effectmodifiers;
import engine.jobs.AbstractEffectJob; import engine.jobs.AbstractEffectJob;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.objects.*; import engine.objects.*;
import java.sql.ResultSet; import java.sql.ResultSet;
@@ -32,7 +32,7 @@ public class AmbidexterityEffectModifier extends AbstractEffectModifier {
@Override @Override
public void applyBonus(AbstractCharacter ac, int trains) { public void applyBonus(AbstractCharacter ac, int trains) {
PlayerBonuses bonus = ac.getBonuses(); PlayerBonuses bonus = ac.getBonuses();
bonus.setBool(ModType.Ambidexterity, SourceType.None, true); bonus.setBool(ModType.Ambidexterity, EffectSourceType.None, true);
} }
@Override @Override
@@ -10,8 +10,8 @@
package engine.powers.effectmodifiers; package engine.powers.effectmodifiers;
import engine.jobs.AbstractEffectJob; import engine.jobs.AbstractEffectJob;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.objects.*; import engine.objects.*;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
@@ -33,7 +33,7 @@ public class BlackMantleEffectModifier extends AbstractEffectModifier {
@Override @Override
public void applyBonus(AbstractCharacter ac, int trains) { public void applyBonus(AbstractCharacter ac, int trains) {
PlayerBonuses bonus = ac.getBonuses(); PlayerBonuses bonus = ac.getBonuses();
SourceType sourceType = SourceType.valueOf(this.type); EffectSourceType sourceType = EffectSourceType.valueOf(this.type);
if (sourceType == null) { if (sourceType == null) {
Logger.error("Bad Source Type for " + this.type); Logger.error("Bad Source Type for " + this.type);
@@ -40,7 +40,7 @@ public class BlockedPowerTypeEffectModifier extends AbstractEffectModifier {
ModType toBlock = ModType.None; ModType toBlock = ModType.None;
switch (this.sourceType) { switch (this.sourceType) {
case Invisible: case Invisibility:
toBlock = ModType.Invisible; toBlock = ModType.Invisible;
break; break;
} }
@@ -13,9 +13,9 @@ import engine.gameManager.DispatchManager;
import engine.jobs.AbstractEffectJob; import engine.jobs.AbstractEffectJob;
import engine.jobs.DamageOverTimeJob; import engine.jobs.DamageOverTimeJob;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.net.AbstractNetMsg; import engine.net.AbstractNetMsg;
import engine.net.client.msg.ModifyHealthKillMsg; import engine.net.client.msg.ModifyHealthKillMsg;
import engine.net.client.msg.ModifyHealthMsg; import engine.net.client.msg.ModifyHealthMsg;
@@ -154,7 +154,7 @@ public class HealthEffectModifier extends AbstractEffectModifier {
// Apply any power effect modifiers (such as stances) // Apply any power effect modifiers (such as stances)
if (bonus != null) if (bonus != null)
modAmount *= (1 + (bonus.getFloatPercentAll(ModType.PowerDamageModifier, SourceType.None))); modAmount *= (1 + (bonus.getFloatPercentAll(ModType.PowerDamageModifier, EffectSourceType.None)));
} }
if (modAmount == 0f) if (modAmount == 0f)
return; return;
@@ -193,7 +193,7 @@ public class HealthEffectModifier extends AbstractEffectModifier {
}*/ }*/
PlayerBonuses bonus = ac.getBonuses(); PlayerBonuses bonus = ac.getBonuses();
if (!skipImmune && bonus.getFloat(ModType.BlackMantle, SourceType.Heal) >= trains) { if (!skipImmune && bonus.getFloat(ModType.BlackMantle, EffectSourceType.Heal) >= trains) {
ModifyHealthMsg mhm = new ModifyHealthMsg(source, ac, 0f, 0f, 0f, powerID, powerName, trains, effectID); ModifyHealthMsg mhm = new ModifyHealthMsg(source, ac, 0f, 0f, 0f, powerID, powerName, trains, effectID);
mhm.setUnknown03(5); //set target is immune mhm.setUnknown03(5); //set target is immune
DispatchManager.sendToAllInRange(ac, mhm); DispatchManager.sendToAllInRange(ac, mhm);
@@ -13,8 +13,8 @@ import engine.gameManager.DispatchManager;
import engine.jobs.AbstractEffectJob; import engine.jobs.AbstractEffectJob;
import engine.jobs.DamageOverTimeJob; import engine.jobs.DamageOverTimeJob;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.net.client.msg.ModifyHealthMsg; import engine.net.client.msg.ModifyHealthMsg;
import engine.objects.*; import engine.objects.*;
import engine.powers.ActionsBase; import engine.powers.ActionsBase;
@@ -114,7 +114,7 @@ public class ManaEffectModifier extends AbstractEffectModifier {
// Apply any power effect modifiers (such as stances) // Apply any power effect modifiers (such as stances)
if (bonus != null) if (bonus != null)
modAmount *= (1 + bonus.getFloatPercentAll(ModType.PowerDamageModifier, SourceType.None)); modAmount *= (1 + bonus.getFloatPercentAll(ModType.PowerDamageModifier, EffectSourceType.None));
} }
if (modAmount == 0f) if (modAmount == 0f)
return; return;
@@ -142,7 +142,7 @@ public class ManaEffectModifier extends AbstractEffectModifier {
} }
} }
PlayerBonuses bonus = ac.getBonuses(); PlayerBonuses bonus = ac.getBonuses();
if (!skipImmune && bonus.getFloat(ModType.BlackMantle, SourceType.Heal) >= trains) { if (!skipImmune && bonus.getFloat(ModType.BlackMantle, EffectSourceType.Heal) >= trains) {
ModifyHealthMsg mhm = new ModifyHealthMsg(source, ac, 0f, 0f, 0f, powerID, powerName, trains, effectID); ModifyHealthMsg mhm = new ModifyHealthMsg(source, ac, 0f, 0f, 0f, powerID, powerName, trains, effectID);
mhm.setUnknown03(5); //set target is immune mhm.setUnknown03(5); //set target is immune
DispatchManager.sendToAllInRange(ac, mhm); DispatchManager.sendToAllInRange(ac, mhm);
@@ -33,7 +33,7 @@ public class NoModEffectModifier extends AbstractEffectModifier {
bonus.setBool(this.modType, this.sourceType, true); bonus.setBool(this.modType, this.sourceType, true);
switch (this.sourceType) { switch (this.sourceType) {
case Fly: case Flight:
if (!ac.getObjectType().equals(GameObjectType.PlayerCharacter)) if (!ac.getObjectType().equals(GameObjectType.PlayerCharacter))
return; return;
PlayerCharacter flyer = (PlayerCharacter) ac; PlayerCharacter flyer = (PlayerCharacter) ac;
@@ -13,8 +13,8 @@ import engine.gameManager.DispatchManager;
import engine.jobs.AbstractEffectJob; import engine.jobs.AbstractEffectJob;
import engine.jobs.DamageOverTimeJob; import engine.jobs.DamageOverTimeJob;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.net.client.msg.ModifyHealthMsg; import engine.net.client.msg.ModifyHealthMsg;
import engine.objects.*; import engine.objects.*;
import engine.powers.ActionsBase; import engine.powers.ActionsBase;
@@ -112,7 +112,7 @@ public class StaminaEffectModifier extends AbstractEffectModifier {
// Apply any power effect modifiers (such as stances) // Apply any power effect modifiers (such as stances)
if (bonus != null) if (bonus != null)
modAmount *= (1 + (bonus.getFloatPercentAll(ModType.PowerDamageModifier, SourceType.None))); modAmount *= (1 + (bonus.getFloatPercentAll(ModType.PowerDamageModifier, EffectSourceType.None)));
} }
if (modAmount == 0f) if (modAmount == 0f)
return; return;
@@ -140,7 +140,7 @@ public class StaminaEffectModifier extends AbstractEffectModifier {
} }
} }
PlayerBonuses bonus = ac.getBonuses(); PlayerBonuses bonus = ac.getBonuses();
if (!skipImmune && bonus.getFloat(ModType.BlackMantle, SourceType.Heal) >= trains) { if (!skipImmune && bonus.getFloat(ModType.BlackMantle, EffectSourceType.Heal) >= trains) {
ModifyHealthMsg mhm = new ModifyHealthMsg(source, ac, 0f, 0f, 0f, powerID, powerName, trains, effectID); ModifyHealthMsg mhm = new ModifyHealthMsg(source, ac, 0f, 0f, 0f, powerID, powerName, trains, effectID);
mhm.setUnknown03(5); //set target is immune mhm.setUnknown03(5); //set target is immune
DispatchManager.sendToAllInRange(ac, mhm); DispatchManager.sendToAllInRange(ac, mhm);
@@ -16,9 +16,9 @@ import engine.jobs.ChantJob;
import engine.jobs.DeferredPowerJob; import engine.jobs.DeferredPowerJob;
import engine.jobs.FinishEffectTimeJob; import engine.jobs.FinishEffectTimeJob;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.net.client.msg.chat.ChatSystemMsg; import engine.net.client.msg.chat.ChatSystemMsg;
import engine.objects.*; import engine.objects.*;
import engine.powers.ActionsBase; import engine.powers.ActionsBase;
@@ -180,7 +180,7 @@ public class ApplyEffectPowerAction extends AbstractPowerAction {
if (bonuses == null) if (bonuses == null)
return; return;
boolean noSilence = bonuses.getBool(ModType.Silenced, SourceType.None); boolean noSilence = bonuses.getBool(ModType.Silenced, EffectSourceType.None);
if (noSilence) if (noSilence)
return; return;
@@ -11,7 +11,6 @@ package engine.powers.poweractions;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.BuildingGroup;
import engine.mbEnums.GameObjectType; import engine.mbEnums.GameObjectType;
import engine.mbEnums.PortalType; import engine.mbEnums.PortalType;
import engine.objects.AbstractCharacter; import engine.objects.AbstractCharacter;
@@ -54,15 +53,17 @@ public class OpenGatePowerAction extends AbstractPowerAction {
return; return;
// Make sure target building is a runegate // Make sure target building is a runegate
if(targetBuilding.meshUUID != 24500) // runegate
if (targetBuilding.meshUUID != 24500) // runegate
return; return;
// Which runegate was clicked on? // Which runegate was clicked on?
Runegate runeGate = Runegate._runegates.get(targetBuilding.getObjectUUID()); Runegate runeGate = Runegate._runegates.get(targetBuilding.getObjectUUID());
if(runeGate == null){ if (runeGate == null)
return; // mob camp prop runegate cannot be opened return; // mob camp prop runegate cannot be opened
}
// Which portal was opened? // Which portal was opened?
token = pb.getToken(); token = pb.getToken();
@@ -72,41 +73,31 @@ public class OpenGatePowerAction extends AbstractPowerAction {
case 428937084: //Death Gate case 428937084: //Death Gate
portalType = PortalType.OBLIV; portalType = PortalType.OBLIV;
break; break;
case 429756284: //Chaos Gate case 429756284: //Chaos Gate
portalType = PortalType.CHAOS; portalType = PortalType.CHAOS;
break; break;
case 429723516: //Khar Gate case 429723516: //Khar Gate
portalType = PortalType.MERCHANT; portalType = PortalType.MERCHANT;
break; break;
case 429559676: //Spirit Gate case 429559676: //Spirit Gate
portalType = PortalType.SPIRIT; portalType = PortalType.SPIRIT;
break; break;
case 429592444: //Water Gate case 429592444: //Water Gate
portalType = PortalType.WATER; portalType = PortalType.WATER;
break; break;
case 429428604: //Fire Gate case 429428604: //Fire Gate
portalType = PortalType.FIRE; portalType = PortalType.FIRE;
break; break;
case 429526908: //Air Gate case 429526908: //Air Gate
portalType = PortalType.AIR; portalType = PortalType.AIR;
break; break;
case 429625212: //Earth Gate case 429625212: //Earth Gate
portalType = PortalType.EARTH; portalType = PortalType.EARTH;
break; break;
default: default:
} }
runeGate.activatePortal(portalType); runeGate.activatePortal(portalType);
} }
@Override @Override
@@ -29,7 +29,7 @@ public class RemoveEffectPowerAction extends AbstractPowerAction {
public RemoveEffectPowerAction(ResultSet rs) throws SQLException { public RemoveEffectPowerAction(ResultSet rs) throws SQLException {
super(rs); super(rs);
String effectTypeToRemove = rs.getString("effectSourceToRemove").replace("-", "").trim(); String effectTypeToRemove = rs.getString("effectSourceToRemove").replace("-", "").trim();
sourceType = EffectSourceType.GetEffectSourceType(effectTypeToRemove); sourceType = EffectSourceType.getEffectSourceType(effectTypeToRemove);
int flags = rs.getInt("flags"); int flags = rs.getInt("flags");
this.removeAll = ((flags & 2) != 0) ? true : false; this.removeAll = ((flags & 2) != 0) ? true : false;
} }
@@ -14,8 +14,8 @@ import engine.gameManager.PowersManager;
import engine.gameManager.ZoneManager; import engine.gameManager.ZoneManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.objects.*; import engine.objects.*;
import engine.powers.ActionsBase; import engine.powers.ActionsBase;
import engine.powers.PowersBase; import engine.powers.PowersBase;
@@ -66,7 +66,7 @@ public class TeleportPowerAction extends AbstractPowerAction {
return; return;
} }
if (source.getBonuses().getBool(ModType.BlockedPowerType, SourceType.TELEPORT)) if (source.getBonuses().getBool(ModType.BlockedPowerType, EffectSourceType.TELEPORT))
return; return;
City city = ZoneManager.getCityAtLocation(targetLoc); City city = ZoneManager.getCityAtLocation(targetLoc);
@@ -12,8 +12,8 @@ package engine.powers.poweractions;
import engine.gameManager.DispatchManager; import engine.gameManager.DispatchManager;
import engine.math.Vector3fImmutable; import engine.math.Vector3fImmutable;
import engine.mbEnums; import engine.mbEnums;
import engine.mbEnums.EffectSourceType;
import engine.mbEnums.ModType; import engine.mbEnums.ModType;
import engine.mbEnums.SourceType;
import engine.net.AbstractNetMsg; import engine.net.AbstractNetMsg;
import engine.net.client.msg.ModifyHealthKillMsg; import engine.net.client.msg.ModifyHealthKillMsg;
import engine.net.client.msg.ModifyHealthMsg; import engine.net.client.msg.ModifyHealthMsg;
@@ -210,7 +210,7 @@ public class TransferStatPowerAction extends AbstractPowerAction {
// Apply any power effect modifiers (such as stances) // Apply any power effect modifiers (such as stances)
PlayerBonuses bonus = source.getBonuses(); PlayerBonuses bonus = source.getBonuses();
if (bonus != null) if (bonus != null)
damage *= (1 + bonus.getFloatPercentAll(ModType.PowerDamageModifier, SourceType.None)); damage *= (1 + bonus.getFloatPercentAll(ModType.PowerDamageModifier, EffectSourceType.None));
//get amount to transfer //get amount to transfer
fromAmount = damage; fromAmount = damage;
@@ -236,7 +236,7 @@ public class TransferStatPowerAction extends AbstractPowerAction {
AbstractNetMsg mhmFrom = null; AbstractNetMsg mhmFrom = null;
//stop if target is immune to drains //stop if target is immune to drains
if (from.getBonuses().getBool(ModType.ImmuneTo, SourceType.Drain)) { if (from.getBonuses().getBool(ModType.ImmuneTo, EffectSourceType.Drain)) {
ModifyHealthMsg mhm = new ModifyHealthMsg(source, to, 0f, 0f, 0f, powerID, powerName, trains, effectID); ModifyHealthMsg mhm = new ModifyHealthMsg(source, to, 0f, 0f, 0f, powerID, powerName, trains, effectID);
mhm.setUnknown03(5); //set target is immune mhm.setUnknown03(5); //set target is immune
DispatchManager.sendToAllInRange(from, mhm); DispatchManager.sendToAllInRange(from, mhm);
@@ -125,6 +125,13 @@ public class DestroyCityThread implements Runnable {
cityBuilding.setProtectionState(mbEnums.ProtectionState.NONE); cityBuilding.setProtectionState(mbEnums.ProtectionState.NONE);
// Remove warehouse entry if one exists.
if (cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.WAREHOUSE) {
DbManager.WarehouseQueries.DELETE_WAREHOUSE(city.warehouse);
city.warehouse = null;
}
// Destroy all remaining city assets // Destroy all remaining city assets
if ((cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.BARRACK) if ((cityBuilding.getBlueprint().getBuildingGroup() == mbEnums.BuildingGroup.BARRACK)
+3 -3
View File
@@ -289,10 +289,10 @@ public class HourlyJobThread implements Runnable {
Logger.info(PurgeOprhans.recordsDeleted.toString() + "orphaned items deleted"); Logger.info(PurgeOprhans.recordsDeleted.toString() + "orphaned items deleted");
} }
public static void processBanes(){ public static void processBanes() {
//handle banes //handle banes
for(Bane bane : Bane.banes.values()){ for (Bane bane : Bane.banes.values()) {
if(bane.getLiveDate() != null && DateTime.now().isAfter(bane.getLiveDate().minusMinutes(1)) && bane.isStarted == false) if (bane.getLiveDate() != null && DateTime.now().isAfter(bane.getLiveDate().minusMinutes(1)) && bane.isStarted == false)
bane.startBane(); bane.startBane();
} }
} }