diff --git a/src/engine/net/client/handlers/ObjectActionMsgHandler.java b/src/engine/net/client/handlers/ObjectActionMsgHandler.java index 9e92da17..ef1d9651 100644 --- a/src/engine/net/client/handlers/ObjectActionMsgHandler.java +++ b/src/engine/net/client/handlers/ObjectActionMsgHandler.java @@ -1,11 +1,7 @@ package engine.net.client.handlers; import engine.Enum; -import engine.Enum.BuildingGroup; -import engine.Enum.DispatchChannel; import engine.Enum.ItemType; -import engine.InterestManagement.RealmMap; -import engine.InterestManagement.WorldGrid; import engine.exception.MsgSendException; import engine.gameManager.*; import engine.math.Bounds; @@ -16,7 +12,6 @@ import engine.net.client.ClientConnection; import engine.net.client.msg.*; import engine.objects.*; import engine.powers.PowersBase; -import org.pmw.tinylog.Logger; import java.util.ArrayList; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -35,233 +30,6 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler { public ObjectActionMsgHandler() { super(ObjectActionMsg.class); } - - private static boolean claimRealm(PlayerCharacter player, int charterUUID) { - - Guild guild; - Realm realm; - City city; - Building tol; - float hPMod; - Warehouse warehouse; - boolean hasResources = true; - int resourceValue; - - if (GuildStatusController.isGuildLeader(player.getGuildStatus()) == false) { - ErrorPopupMsg.sendErrorPopup(player, 176); // Only guild leaders can claim a territory - return false; - } - - guild = player.getGuild(); - city = guild.getOwnedCity(); - - if (city == null) { - ErrorPopupMsg.sendErrorPopup(player, 179); // Only landed guilds may claim a territory - return false; - } - - if (city.isLocationOnCityGrid(player.getLoc()) == false) { - ErrorPopupMsg.sendErrorPopup(player, 186); // Your tree is not inside a territory! - return false; - } - - tol = city.getTOL(); - - if (tol.getRank() != 7) { - ErrorPopupMsg.sendErrorPopup(player, 181); // Your tree must be rank 7 before claiming a territory - return false; - } - - realm = RealmMap.getRealmForCity(city); - - if (realm.getCanBeClaimed() == false) { - ErrorPopupMsg.sendErrorPopup(player, 180); // This territory cannot be ruled by anyone - return false; - } - - if (realm.isRuled() == true) { - ErrorPopupMsg.sendErrorPopup(player, 178); // This territory is already claimed - return false; - } - - if (!Realm.HasAllBlessings(player)) { - ErrorPopupMsg.sendErrorPopup(player, 185); // You must seek the blessing of the three sages before you can rule - return false; - } - - // Must have the required resources in warehouse to claim realm - - warehouse = city.getWarehouse(); - - if (warehouse == null) { - ErrorPopupMsg.sendErrorPopup(player, 188); // You must have a warehouse to become a capital - return false; - } - - resourceValue = warehouse.resources.get(ItemBase.getItemBase(7)); - - if (resourceValue < 5000000) - hasResources = false; - - resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580000)); - - if (resourceValue < 8000) - hasResources = false; - - resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580004)); - - if (resourceValue < 8000) - hasResources = false; - - resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580017)); - - if (resourceValue < 15) - hasResources = false; - - resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580018)); - - if (resourceValue < 15) - hasResources = false; - - if (hasResources == false) { - ErrorPopupMsg.sendErrorPopup(player, 184); // Insufficient gold or resources to upgrade to capital - return false; - } - - // Remove resources from warehouse before claiming realm - - resourceValue = warehouse.resources.get(ItemBase.getItemBase(7)); - - if (DbManager.WarehouseQueries.updateGold(warehouse, resourceValue - 5000000) == true) { - warehouse.resources.put(ItemBase.getItemBase(7), resourceValue - 5000000); - Warehouse.AddTransactionToWarehouse(warehouse, engine.Enum.GameObjectType.Building, tol.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GOLD, 5000000); - } else { - Logger.error("gold update failed for warehouse of UUID:" + warehouse.getObjectUUID()); - return false; - } - - resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580000)); - - if (DbManager.WarehouseQueries.updateStone(warehouse, resourceValue - 8000) == true) { - warehouse.resources.put(ItemBase.getItemBase(1580000), resourceValue - 8000); - Warehouse.AddTransactionToWarehouse(warehouse, engine.Enum.GameObjectType.Building, tol.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.STONE, 8000); - } else { - Logger.error("stone update failed for warehouse of UUID:" + warehouse.getObjectUUID()); - return false; - } - - resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580004)); - - if (DbManager.WarehouseQueries.updateLumber(warehouse, resourceValue - 8000) == true) { - warehouse.resources.put(ItemBase.getItemBase(1580004), resourceValue - 8000); - Warehouse.AddTransactionToWarehouse(warehouse, engine.Enum.GameObjectType.Building, tol.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.LUMBER, 8000); - } else { - Logger.error("lumber update failed for warehouse of UUID:" + warehouse.getObjectUUID()); - return false; - } - - resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580017)); - - if (DbManager.WarehouseQueries.updateGalvor(warehouse, resourceValue - 15) == true) { - warehouse.resources.put(ItemBase.getItemBase(1580017), resourceValue - 15); - Warehouse.AddTransactionToWarehouse(warehouse, engine.Enum.GameObjectType.Building, tol.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GALVOR, 15); - } else { - Logger.error("galvor update failed for warehouse of UUID:" + warehouse.getObjectUUID()); - return false; - } - - resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580018)); - - if (DbManager.WarehouseQueries.updateWormwood(warehouse, resourceValue - 15) == true) { - warehouse.resources.put(ItemBase.getItemBase(1580018), resourceValue - 15); - Warehouse.AddTransactionToWarehouse(warehouse, engine.Enum.GameObjectType.Building, tol.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.WORMWOOD, 15); - } else { - Logger.error("wormwood update failed for warehouse of UUID:" + warehouse.getObjectUUID()); - return false; - } - - realm.claimRealmForCity(city, charterUUID); - - BuildingManager.setRank(tol, 8); - WorldGrid.updateObject(tol); - - for (Building building : city.getParent().zoneBuildingSet) { - - if (building.getBlueprintUUID() != 0) { - - // TOL Health set through regular linear equation - if (building.getBlueprint().getBuildingGroup() == BuildingGroup.TOL) { - continue; - } - - hPMod = (building.getMaxHitPoints() * Realm.getRealmHealthMod(city)); - building.setMaxHitPoints(building.getMaxHitPoints() + hPMod); - } - } - - if (!guild.getNation().equals(guild)) { - guild.getNation().setRealmsOwned(guild.getNation().getRealmsOwned() + 1); - GuildManager.updateAllGuildTags(guild.getNation()); - } - - guild.setRealmsOwned(guild.getRealmsOwned() + 1); - GuildManager.updateAllGuildTags(guild); - - removeAllBlessings(player); - - return true; - - } - - private static void removeAllBlessings(PlayerCharacter player) { - - PowersBase[] powers = new PowersBase[3]; - - powers[0] = PowersManager.getPowerByIDString("BLS-POWER"); - powers[1] = PowersManager.getPowerByIDString("BLS-FORTUNE"); - powers[2] = PowersManager.getPowerByIDString("BLS-WISDOM"); - - for (PowersBase power : powers) { - PowersManager.removeEffect(player, power.getActions().get(0), true, false); - } - - } - - private static void removeRune(PlayerCharacter pc, ClientConnection origin, int runeID) { - - if (pc == null || origin == null) { - return; - } - - //remove only if rune is discipline - if (runeID < 3001 || runeID > 3048) { - return; - } - - //see if pc has rune - ArrayList runes = pc.getRunes(); - - if (runes == null) - return; - - CharacterRune found = pc.getRune(runeID); - - if (found == null) - return; - - //TODO see if player needs to refine skills or powers first - //attempt remove rune from player - - if (!CharacterRune.removeRune(pc, runeID)) - return; - - //update client with removed rune. - ApplyRuneMsg arm = new ApplyRuneMsg(pc.getObjectType().ordinal(), pc.getObjectUUID(), runeID); - Dispatch dispatch = Dispatch.borrow(pc, arm); - DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); - } - // Handle activation of tears of seadron: Removes rune from player. - @Override protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException { @@ -389,7 +157,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler { charterType = -600065291; break; } - if (claimRealm(player, charterType) == true) { + if (Realm.claimRealm(player, charterType) == true) { itemMan.consume(item); } break; @@ -485,7 +253,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler { break; } else if (uuid == 910010) { //tears of saedron if (comps.size() > 1) { - removeRune(player, origin, comps.get(1).intValue()); + AbstractCharacter.removeRune(player, origin, comps.get(1).intValue()); } break; } else if ((byte) item.chargesRemaining > 0) { diff --git a/src/engine/objects/AbstractCharacter.java b/src/engine/objects/AbstractCharacter.java index a095125c..9ac52c58 100644 --- a/src/engine/objects/AbstractCharacter.java +++ b/src/engine/objects/AbstractCharacter.java @@ -26,9 +26,13 @@ import engine.math.AtomicFloat; import engine.math.Bounds; import engine.math.Vector3fImmutable; import engine.net.ByteBufferWriter; +import engine.net.Dispatch; import engine.net.DispatchMessage; +import engine.net.client.ClientConnection; +import engine.net.client.msg.ApplyRuneMsg; import engine.net.client.msg.UpdateStateMsg; import engine.powers.EffectsBase; +import engine.powers.PowersBase; import engine.server.MBServerStatics; import org.pmw.tinylog.Logger; @@ -535,6 +539,54 @@ public abstract class AbstractCharacter extends AbstractWorldObject { } } + public static void removeRune(PlayerCharacter pc, ClientConnection origin, int runeID) { + + if (pc == null || origin == null) { + return; + } + + //remove only if rune is discipline + if (runeID < 3001 || runeID > 3048) { + return; + } + + //see if pc has rune + ArrayList runes = pc.getRunes(); + + if (runes == null) + return; + + CharacterRune found = pc.getRune(runeID); + + if (found == null) + return; + + //TODO see if player needs to refine skills or powers first + //attempt remove rune from player + + if (!CharacterRune.removeRune(pc, runeID)) + return; + + //update client with removed rune. + ApplyRuneMsg arm = new ApplyRuneMsg(pc.getObjectType().ordinal(), pc.getObjectUUID(), runeID); + Dispatch dispatch = Dispatch.borrow(pc, arm); + DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); + } + + public static void removeAllBlessings(PlayerCharacter player) { + + PowersBase[] powers = new PowersBase[3]; + + powers[0] = PowersManager.getPowerByIDString("BLS-POWER"); + powers[1] = PowersManager.getPowerByIDString("BLS-FORTUNE"); + powers[2] = PowersManager.getPowerByIDString("BLS-WISDOM"); + + for (PowersBase power : powers) { + PowersManager.removeEffect(player, power.getActions().get(0), true, false); + } + + } + private void initializeCharacter() { this.timers = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); this.timestamps = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); diff --git a/src/engine/objects/Realm.java b/src/engine/objects/Realm.java index 64397870..347befb8 100644 --- a/src/engine/objects/Realm.java +++ b/src/engine/objects/Realm.java @@ -11,11 +11,15 @@ package engine.objects; import engine.Enum; import engine.InterestManagement.RealmMap; +import engine.InterestManagement.WorldGrid; import engine.db.archive.DataWarehouse; import engine.db.archive.RealmRecord; +import engine.gameManager.BuildingManager; import engine.gameManager.DbManager; +import engine.gameManager.GuildManager; import engine.gameManager.PowersManager; import engine.net.ByteBufferWriter; +import engine.net.client.msg.ErrorPopupMsg; import engine.powers.PowersBase; import engine.server.MBServerStatics; import org.pmw.tinylog.Logger; @@ -168,6 +172,183 @@ public class Realm { } + public static boolean claimRealm(PlayerCharacter player, int charterUUID) { + + Guild guild; + Realm realm; + City city; + Building tol; + float hPMod; + Warehouse warehouse; + boolean hasResources = true; + int resourceValue; + + if (GuildStatusController.isGuildLeader(player.getGuildStatus()) == false) { + ErrorPopupMsg.sendErrorPopup(player, 176); // Only guild leaders can claim a territory + return false; + } + + guild = player.getGuild(); + city = guild.getOwnedCity(); + + if (city == null) { + ErrorPopupMsg.sendErrorPopup(player, 179); // Only landed guilds may claim a territory + return false; + } + + if (city.isLocationOnCityGrid(player.getLoc()) == false) { + ErrorPopupMsg.sendErrorPopup(player, 186); // Your tree is not inside a territory! + return false; + } + + tol = city.getTOL(); + + if (tol.getRank() != 7) { + ErrorPopupMsg.sendErrorPopup(player, 181); // Your tree must be rank 7 before claiming a territory + return false; + } + + realm = RealmMap.getRealmForCity(city); + + if (realm.getCanBeClaimed() == false) { + ErrorPopupMsg.sendErrorPopup(player, 180); // This territory cannot be ruled by anyone + return false; + } + + if (realm.isRuled() == true) { + ErrorPopupMsg.sendErrorPopup(player, 178); // This territory is already claimed + return false; + } + + if (!HasAllBlessings(player)) { + ErrorPopupMsg.sendErrorPopup(player, 185); // You must seek the blessing of the three sages before you can rule + return false; + } + + // Must have the required resources in warehouse to claim realm + + warehouse = city.getWarehouse(); + + if (warehouse == null) { + ErrorPopupMsg.sendErrorPopup(player, 188); // You must have a warehouse to become a capital + return false; + } + + resourceValue = warehouse.resources.get(ItemBase.getItemBase(7)); + + if (resourceValue < 5000000) + hasResources = false; + + resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580000)); + + if (resourceValue < 8000) + hasResources = false; + + resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580004)); + + if (resourceValue < 8000) + hasResources = false; + + resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580017)); + + if (resourceValue < 15) + hasResources = false; + + resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580018)); + + if (resourceValue < 15) + hasResources = false; + + if (hasResources == false) { + ErrorPopupMsg.sendErrorPopup(player, 184); // Insufficient gold or resources to upgrade to capital + return false; + } + + // Remove resources from warehouse before claiming realm + + resourceValue = warehouse.resources.get(ItemBase.getItemBase(7)); + + if (DbManager.WarehouseQueries.updateGold(warehouse, resourceValue - 5000000) == true) { + warehouse.resources.put(ItemBase.getItemBase(7), resourceValue - 5000000); + Warehouse.AddTransactionToWarehouse(warehouse, Enum.GameObjectType.Building, tol.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GOLD, 5000000); + } else { + Logger.error("gold update failed for warehouse of UUID:" + warehouse.getObjectUUID()); + return false; + } + + resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580000)); + + if (DbManager.WarehouseQueries.updateStone(warehouse, resourceValue - 8000) == true) { + warehouse.resources.put(ItemBase.getItemBase(1580000), resourceValue - 8000); + Warehouse.AddTransactionToWarehouse(warehouse, Enum.GameObjectType.Building, tol.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.STONE, 8000); + } else { + Logger.error("stone update failed for warehouse of UUID:" + warehouse.getObjectUUID()); + return false; + } + + resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580004)); + + if (DbManager.WarehouseQueries.updateLumber(warehouse, resourceValue - 8000) == true) { + warehouse.resources.put(ItemBase.getItemBase(1580004), resourceValue - 8000); + Warehouse.AddTransactionToWarehouse(warehouse, Enum.GameObjectType.Building, tol.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.LUMBER, 8000); + } else { + Logger.error("lumber update failed for warehouse of UUID:" + warehouse.getObjectUUID()); + return false; + } + + resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580017)); + + if (DbManager.WarehouseQueries.updateGalvor(warehouse, resourceValue - 15) == true) { + warehouse.resources.put(ItemBase.getItemBase(1580017), resourceValue - 15); + Warehouse.AddTransactionToWarehouse(warehouse, Enum.GameObjectType.Building, tol.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.GALVOR, 15); + } else { + Logger.error("galvor update failed for warehouse of UUID:" + warehouse.getObjectUUID()); + return false; + } + + resourceValue = warehouse.resources.get(ItemBase.getItemBase(1580018)); + + if (DbManager.WarehouseQueries.updateWormwood(warehouse, resourceValue - 15) == true) { + warehouse.resources.put(ItemBase.getItemBase(1580018), resourceValue - 15); + Warehouse.AddTransactionToWarehouse(warehouse, Enum.GameObjectType.Building, tol.getObjectUUID(), Enum.TransactionType.WITHDRAWL, Resource.WORMWOOD, 15); + } else { + Logger.error("wormwood update failed for warehouse of UUID:" + warehouse.getObjectUUID()); + return false; + } + + realm.claimRealmForCity(city, charterUUID); + + BuildingManager.setRank(tol, 8); + WorldGrid.updateObject(tol); + + for (Building building : city.getParent().zoneBuildingSet) { + + if (building.getBlueprintUUID() != 0) { + + // TOL Health set through regular linear equation + if (building.getBlueprint().getBuildingGroup() == Enum.BuildingGroup.TOL) { + continue; + } + + hPMod = (building.getMaxHitPoints() * getRealmHealthMod(city)); + building.setMaxHitPoints(building.getMaxHitPoints() + hPMod); + } + } + + if (!guild.getNation().equals(guild)) { + guild.getNation().setRealmsOwned(guild.getNation().getRealmsOwned() + 1); + GuildManager.updateAllGuildTags(guild.getNation()); + } + + guild.setRealmsOwned(guild.getRealmsOwned() + 1); + GuildManager.updateAllGuildTags(guild); + + AbstractCharacter.removeAllBlessings(player); + + return true; + + } + /* * Getters */