Files
prestonbane/src/engine/objects/Warehouse.java
T

643 lines
22 KiB
Java
Raw Normal View History

2022-04-30 09:41:17 -04:00
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.objects;
import engine.Enum;
2024-01-24 20:21:41 -06:00
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.*;
import engine.server.MBServerStatics;
import org.joda.time.DateTime;
2024-03-17 10:06:26 -04:00
import org.json.simple.JSONArray;
2024-03-17 09:01:35 -04:00
import org.json.simple.JSONObject;
2022-04-30 09:41:17 -04:00
import org.pmw.tinylog.Logger;
2024-02-28 16:31:09 -05:00
2022-04-30 09:41:17 -04:00
import java.sql.SQLException;
import java.util.ArrayList;
2024-03-15 10:47:35 -04:00
import java.util.EnumSet;
2024-03-17 12:25:59 -04:00
import java.util.HashMap;
2022-04-30 09:41:17 -04:00
import java.util.concurrent.ConcurrentHashMap;
2024-03-17 09:01:35 -04:00
public class Warehouse {
2022-04-30 09:41:17 -04:00
2024-03-17 11:10:47 -04:00
public EnumSet<Enum.ResourceType> locked = EnumSet.noneOf(Enum.ResourceType.class);
2024-03-17 11:29:30 -04:00
public Building building;
2024-03-17 09:01:35 -04:00
public City city;
2024-01-24 20:03:27 -06:00
public ArrayList<Transaction> transactions = new ArrayList<>();
2024-03-15 10:01:22 -04:00
public ConcurrentHashMap<Enum.ResourceType, Integer> resources = new ConcurrentHashMap<>();
2023-07-15 09:23:48 -04:00
2024-03-17 10:52:33 -04:00
public Warehouse(Building building) {
2024-03-17 11:29:30 -04:00
this.building = building;
2024-03-17 10:52:33 -04:00
this.city = building.getCity();
// New empty warehouse
for (Enum.ResourceType resourceType : EnumSet.allOf(Enum.ResourceType.class))
this.resources.put(resourceType, 0);
// With no locks
this.locked = EnumSet.noneOf(Enum.ResourceType.class);
}
2024-03-17 09:01:35 -04:00
public Warehouse(JSONObject warehouse) throws SQLException {
JSONObject resources = (JSONObject) warehouse.get("resources");
for (Object key : resources.keySet()) {
Enum.ResourceType resourceType = Enum.ResourceType.valueOf((String) key);
2024-03-17 11:06:56 -04:00
int value = ((Long) resources.get(key)).intValue();
this.resources.put(resourceType, value);
2024-03-17 09:01:35 -04:00
}
2023-07-15 09:23:48 -04:00
2024-03-17 12:09:37 -04:00
JSONArray lockedResources = (JSONArray) warehouse.get("locked");
2024-03-17 10:06:26 -04:00
if (lockedResources.isEmpty() == false)
for (Object o : lockedResources)
this.locked.add(Enum.ResourceType.valueOf((String) o));
2024-01-24 20:21:41 -06:00
}
2024-03-17 12:26:57 -04:00
public static HashMap<Enum.ResourceType, Integer>
calculateWarehouseOverdraft(Warehouse warehouse, HashMap<Enum.ResourceType, Integer> costMap) {
2024-03-17 12:25:59 -04:00
HashMap<Enum.ResourceType, Integer> overdraft = new HashMap<>();
for (Enum.ResourceType resourceType : costMap.keySet()) {
int cost = costMap.get(resourceType);
if (cost > warehouse.resources.get(resourceType))
overdraft.put(resourceType, cost - warehouse.resources.get(resourceType));
}
return overdraft;
}
2024-01-24 20:21:41 -06:00
public static void warehouseDeposit(MerchantMsg msg, PlayerCharacter player, NPC npc) {
Building warehouseBuilding;
Warehouse warehouse;
int depositAmount;
Dispatch dispatch;
Item resource = Item.getFromCache(msg.getItemID());
if (resource == null)
return;
depositAmount = msg.getAmount();
2024-03-18 10:01:29 -04:00
CharacterItemManager itemMan = player.charItemManager;
2024-01-24 20:21:41 -06:00
if (!itemMan.doesCharOwnThisItem(resource.getObjectUUID()))
return;
warehouseBuilding = npc.getBuilding();
if (warehouseBuilding == null)
return;
2024-03-17 09:01:35 -04:00
warehouse = warehouseBuilding.getCity().warehouse;
2024-01-24 20:21:41 -06:00
if (warehouse == null)
return;
2024-03-17 12:26:57 -04:00
if (!deposit(player, resource, depositAmount, true, true, warehouse)) {
2024-01-24 20:21:41 -06:00
return;
}
ViewResourcesMessage vrm = new ViewResourcesMessage(player);
vrm.setGuild(player.getGuild());
vrm.setWarehouseBuilding(warehouseBuilding);
vrm.configure();
dispatch = Dispatch.borrow(player, vrm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
public static void warehouseWithdraw(MerchantMsg msg, PlayerCharacter player, NPC npc) {
int withdrawAmount;
Building warehouseBuilding;
Warehouse warehouse;
Dispatch dispatch;
withdrawAmount = msg.getAmount();
warehouseBuilding = npc.getBuilding();
if (warehouseBuilding == null)
return;
if (player.getGuild() != warehouseBuilding.getGuild() || !GuildStatusController.isInnerCouncil(player.getGuildStatus()))
return;
2024-03-17 09:01:35 -04:00
City city = warehouseBuilding.getCity();
if (city == null)
return;
warehouse = city.warehouse;
2024-01-24 20:21:41 -06:00
if (warehouse == null)
return;
2024-03-15 10:01:22 -04:00
Enum.ResourceType resourceType = Enum.ResourceType.hashLookup.get(msg.getHashID());
2024-01-24 20:21:41 -06:00
2024-03-15 10:01:22 -04:00
if (isResourceLocked(warehouse, resourceType)) {
2024-01-24 20:21:41 -06:00
ChatManager.chatSystemInfo(player, "You cannot withdrawl a locked resource.");
return;
}
2024-03-15 10:01:22 -04:00
if (!withdraw(warehouse, player, resourceType, withdrawAmount, true, true)) {
ChatManager.chatGuildError(player, "Failed to withdrawl " + resourceType.name() + '.');
Logger.debug(player.getName() + " Failed to withdrawl =" + resourceType.name() + " from Warehouse With ID = " + warehouseBuilding.getObjectUUID());
2024-01-24 20:21:41 -06:00
return;
}
ViewResourcesMessage vrm = new ViewResourcesMessage(player);
vrm.setGuild(player.getGuild());
vrm.setWarehouseBuilding(warehouseBuilding);
vrm.configure();
dispatch = Dispatch.borrow(player, vrm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
}
public static void warehouseLock(MerchantMsg msg, PlayerCharacter player, NPC npc) {
2024-03-17 09:01:35 -04:00
Building warehouseBuilding;
Warehouse warehouse;
2024-01-24 20:21:41 -06:00
int hashID;
Dispatch dispatch;
hashID = msg.getHashID();
2024-03-17 09:01:35 -04:00
warehouseBuilding = npc.getBuilding();
2024-01-24 20:21:41 -06:00
2024-03-17 09:01:35 -04:00
if (warehouseBuilding == null)
2024-01-24 20:21:41 -06:00
return;
2024-03-17 09:01:35 -04:00
if (player.getGuild() != warehouseBuilding.getGuild() || !GuildStatusController.isInnerCouncil(player.getGuildStatus()))
2024-01-24 20:21:41 -06:00
return;
2024-03-17 09:01:35 -04:00
City city = warehouseBuilding.getCity();
2024-01-24 20:21:41 -06:00
2024-03-17 09:01:35 -04:00
if (city == null)
2024-01-24 20:21:41 -06:00
return;
2024-03-17 09:01:35 -04:00
warehouse = city.warehouse;
2024-01-24 20:21:41 -06:00
2024-03-11 17:10:34 -04:00
Enum.ResourceType resourceType = Enum.ResourceType.hashLookup.get(hashID);
2024-01-24 20:21:41 -06:00
2024-03-17 09:01:35 -04:00
// toggle lock
2024-01-24 20:21:41 -06:00
2024-03-17 10:06:26 -04:00
if (warehouse.locked.contains(resourceType)) {
2024-01-24 20:21:41 -06:00
2024-03-17 09:01:35 -04:00
boolean worked;
2024-03-17 10:06:26 -04:00
warehouse.locked.remove(resourceType);
2024-03-17 09:47:00 -04:00
worked = DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse);
2024-01-24 20:21:41 -06:00
if (worked) {
ViewResourcesMessage vrm = new ViewResourcesMessage(player);
vrm.setGuild(player.getGuild());
2024-03-17 09:01:35 -04:00
vrm.setWarehouseBuilding(warehouseBuilding);
2024-01-24 20:21:41 -06:00
vrm.configure();
dispatch = Dispatch.borrow(player, vrm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
2024-03-17 09:01:35 -04:00
} else
2024-03-17 10:06:26 -04:00
warehouse.locked.add(resourceType);
2024-01-24 20:21:41 -06:00
return;
2024-03-17 09:01:35 -04:00
}
2024-01-24 20:21:41 -06:00
2024-03-17 09:01:35 -04:00
boolean worked;
2024-03-17 10:06:26 -04:00
warehouse.locked.add(resourceType);
2024-03-17 09:47:00 -04:00
worked = DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse);
2024-03-17 09:01:35 -04:00
if (worked) {
ViewResourcesMessage vrm = new ViewResourcesMessage(player);
vrm.setGuild(player.getGuild());
vrm.setWarehouseBuilding(warehouseBuilding);
vrm.configure();
dispatch = Dispatch.borrow(player, vrm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
} else
2024-03-17 10:06:26 -04:00
warehouse.locked.remove(resourceType);
2024-01-24 20:21:41 -06:00
}
public static synchronized boolean deposit(PlayerCharacter pc, Item resource, int amount, boolean removeFromInventory, boolean transaction, Warehouse warehouse) {
ClientConnection origin = pc.getClientConnection();
2024-03-15 10:01:22 -04:00
2024-01-24 20:21:41 -06:00
if (origin == null)
return false;
if (amount < 0) {
Logger.info(pc.getFirstName() + " Attempting to Dupe!!!!!!");
return false;
}
2024-03-15 10:35:41 -04:00
Enum.ResourceType resourceType = Enum.ResourceType.resourceLookup.get(resource.templateID);
2024-01-24 20:21:41 -06:00
2024-03-15 10:01:22 -04:00
if (warehouse.resources.get(resourceType) == null)
2024-01-24 20:21:41 -06:00
return false;
2024-03-18 10:01:29 -04:00
CharacterItemManager itemMan = pc.charItemManager;
2024-01-24 20:21:41 -06:00
if (itemMan == null)
return false;
if (itemMan.getGoldTrading() > 0) {
ErrorPopupMsg.sendErrorPopup(pc, 195);
return false;
}
if (!itemMan.doesCharOwnThisItem(resource.getObjectUUID()))
return false;
if (!resource.validForInventory(origin, pc, itemMan))
return false;
if (resource.getNumOfItems() < amount)
return false;
2024-03-15 10:01:22 -04:00
int oldAmount = warehouse.resources.get(resourceType);
2024-01-24 20:21:41 -06:00
int newAmount = oldAmount + amount;
2024-03-17 09:01:35 -04:00
if (newAmount > Enum.ResourceType.resourceLookup.get(resource.templateID).deposit_limit)
2024-01-24 20:21:41 -06:00
return false;
if (removeFromInventory) {
2024-03-15 10:01:22 -04:00
if (resourceType.equals(Enum.ResourceType.GOLD)) {
2024-01-24 20:21:41 -06:00
if (itemMan.getGoldInventory().getNumOfItems() - amount < 0)
return false;
if (itemMan.getGoldInventory().getNumOfItems() - amount > MBServerStatics.PLAYER_GOLD_LIMIT)
return false;
2024-03-17 09:01:35 -04:00
if (!itemMan.modifyInventoryGold(-amount))
2024-01-24 20:21:41 -06:00
return false;
UpdateGoldMsg ugm = new UpdateGoldMsg(pc);
ugm.configure();
Dispatch dispatch = Dispatch.borrow(pc, ugm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
itemMan.updateInventory();
} else {
itemMan.delete(resource);
itemMan.updateInventory();
}
}
2024-03-17 09:01:35 -04:00
2024-01-24 20:21:41 -06:00
itemMan.updateInventory();
2024-03-17 09:01:35 -04:00
if (newAmount > resourceType.deposit_limit)
2024-01-24 20:21:41 -06:00
return false;
2024-03-15 10:01:22 -04:00
warehouse.resources.put(resourceType, newAmount);
2024-01-24 20:21:41 -06:00
2024-03-17 09:47:00 -04:00
if (!DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse)) {
2024-03-17 09:01:35 -04:00
warehouse.resources.put(resourceType, oldAmount);
return false;
}
2024-03-10 13:34:24 -04:00
if (resource.template.item_type.equals(Enum.ItemType.GOLD))
2024-03-14 14:47:20 -04:00
resourceType = Enum.ResourceType.GOLD;
2024-01-24 20:21:41 -06:00
else
2024-03-16 07:57:17 -04:00
resourceType = Enum.ResourceType.valueOf(ItemTemplate.templates.get(resource.getTemplateID()).item_base_name.toUpperCase());
2024-01-24 20:21:41 -06:00
if (transaction)
AddTransactionToWarehouse(warehouse, pc.getObjectType(), pc.getObjectUUID(), Enum.TransactionType.DEPOSIT, resourceType, amount);
return true;
}
2024-03-15 10:01:22 -04:00
public static synchronized boolean depositFromMine(Mine mine, Enum.ResourceType resourceType, int amount, Warehouse warehouse) {
2024-01-24 20:21:41 -06:00
2024-03-15 10:01:22 -04:00
int oldAmount = warehouse.resources.get(resourceType);
2024-01-24 20:21:41 -06:00
int newAmount = oldAmount + amount;
2024-03-15 10:01:22 -04:00
if (newAmount > resourceType.deposit_limit)
2024-01-24 20:21:41 -06:00
return false;
2024-03-15 10:01:22 -04:00
warehouse.resources.put(resourceType, newAmount);
2024-01-24 20:21:41 -06:00
2024-03-17 09:47:00 -04:00
if (!DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse)) {
2024-03-17 09:01:35 -04:00
warehouse.resources.put(resourceType, oldAmount);
return false;
}
2024-01-24 20:21:41 -06:00
if (mine != null)
AddTransactionToWarehouse(warehouse, Enum.GameObjectType.Building, mine.getBuildingID(), Enum.TransactionType.MINE, resourceType, amount);
return true;
}
2024-03-15 10:01:22 -04:00
public static synchronized void depositRealmTaxes(PlayerCharacter taxer, Enum.ResourceType resourceType, int amount, Warehouse warehouse) {
2024-01-24 20:21:41 -06:00
2024-03-15 10:01:22 -04:00
int oldAmount = warehouse.resources.get(resourceType);
2024-01-24 20:21:41 -06:00
int newAmount = oldAmount + amount;
2024-03-15 10:01:22 -04:00
warehouse.resources.put(resourceType, newAmount);
2024-01-24 20:21:41 -06:00
2024-03-17 09:47:00 -04:00
if (!DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse)) {
2024-03-17 09:01:35 -04:00
warehouse.resources.put(resourceType, oldAmount);
return;
}
2024-01-24 20:21:41 -06:00
AddTransactionToWarehouse(warehouse, taxer.getObjectType(), taxer.getObjectUUID(), Enum.TransactionType.TAXRESOURCEDEPOSIT, resourceType, amount);
}
2024-03-15 10:01:22 -04:00
public static synchronized void depositProfitTax(Enum.ResourceType resourceType, int amount, Building building, Warehouse warehouse) {
2024-02-28 16:31:09 -05:00
2024-03-15 10:01:22 -04:00
if (warehouse.resources.get(resourceType) == null)
2024-01-24 20:21:41 -06:00
return;
2024-03-15 10:01:22 -04:00
int oldAmount = warehouse.resources.get(resourceType);
2024-01-24 20:21:41 -06:00
int newAmount = oldAmount + amount;
2024-03-15 10:01:22 -04:00
if (newAmount > resourceType.deposit_limit)
2024-01-24 20:21:41 -06:00
return;
2024-03-15 10:01:22 -04:00
warehouse.resources.put(resourceType, newAmount);
2024-01-24 20:21:41 -06:00
2024-03-17 09:47:00 -04:00
if (!DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse)) {
2024-03-17 09:01:35 -04:00
warehouse.resources.put(resourceType, oldAmount);
return;
}
2024-01-24 20:21:41 -06:00
if (building != null)
AddTransactionToWarehouse(warehouse, Enum.GameObjectType.Building, building.getObjectUUID(), Enum.TransactionType.DEPOSIT, resourceType, amount);
}
2024-03-17 09:01:35 -04:00
public static synchronized boolean withdraw(Warehouse warehouse, NPC npc, Enum.ResourceType resourceType, int amount, boolean transaction) {
int oldAmount = warehouse.resources.get(resourceType);
2024-01-24 20:21:41 -06:00
2024-03-17 09:01:35 -04:00
int newAmount = oldAmount - amount;
2024-01-24 20:21:41 -06:00
2024-03-15 10:01:22 -04:00
if (warehouse.resources.get(resourceType) == null)
2024-01-24 20:21:41 -06:00
return false;
if (amount <= 0)
return false;
if (oldAmount < amount)
return false;
2024-03-17 09:01:35 -04:00
warehouse.resources.put(resourceType, newAmount);
2024-01-24 20:21:41 -06:00
2024-03-17 09:47:00 -04:00
if (!DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse)) {
2024-03-17 09:01:35 -04:00
warehouse.resources.put(resourceType, oldAmount);
2024-01-24 20:21:41 -06:00
return false;
2024-03-17 09:01:35 -04:00
}
2024-01-24 20:21:41 -06:00
if (transaction)
AddTransactionToWarehouse(warehouse, npc.getObjectType(), npc.getObjectUUID(), Enum.TransactionType.WITHDRAWL, resourceType, amount);
return true;
}
2024-03-15 10:47:35 -04:00
public static synchronized void transferResources(Warehouse warehouse, PlayerCharacter taxer, TaxResourcesMsg msg, ArrayList<Enum.ResourceType> realmResources, float taxPercent) {
2024-01-24 20:21:41 -06:00
2024-03-15 10:47:35 -04:00
for (Enum.ResourceType resourceType : realmResources) {
2024-02-28 16:31:09 -05:00
2024-03-15 10:01:22 -04:00
if (warehouse.resources.get(resourceType) == null)
2024-01-24 20:21:41 -06:00
return;
2024-03-15 10:01:22 -04:00
int amount = (int) (warehouse.resources.get(resourceType) * taxPercent);
2024-01-24 20:21:41 -06:00
if (amount <= 0) {
2024-03-11 17:10:34 -04:00
msg.getResources().put(resourceType.hash, 0);
2024-01-24 20:21:41 -06:00
continue;
}
2024-03-15 10:01:22 -04:00
int oldAmount = warehouse.resources.get(resourceType);
2024-01-24 20:21:41 -06:00
if (oldAmount < amount)
amount = oldAmount;
int newAmount = oldAmount - amount;
if (newAmount < amount)
continue;
2024-03-17 09:47:00 -04:00
msg.getResources().put(resourceType.hash, amount);
if (!DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse)) {
2024-03-11 17:10:34 -04:00
msg.getResources().put(resourceType.hash, 0);
2024-03-17 09:47:00 -04:00
warehouse.resources.put(resourceType, oldAmount);
2024-01-24 20:21:41 -06:00
continue;
}
2024-03-15 10:01:22 -04:00
warehouse.resources.put(resourceType, newAmount);
depositRealmTaxes(taxer, resourceType, amount, warehouse);
2024-03-14 14:47:20 -04:00
Enum.ResourceType resource;
2024-01-24 20:21:41 -06:00
2024-03-15 10:47:35 -04:00
AddTransactionToWarehouse(warehouse, taxer.getObjectType(), taxer.getObjectUUID(), Enum.TransactionType.TAXRESOURCE, resourceType, amount);
2024-01-24 20:21:41 -06:00
}
}
2024-03-15 10:01:22 -04:00
public static synchronized boolean withdraw(Warehouse warehouse, PlayerCharacter pc, Enum.ResourceType resourceType, int amount, boolean addToInventory, boolean transaction) {
2024-01-24 20:21:41 -06:00
if (pc == null)
return false;
2024-03-16 07:57:17 -04:00
ItemTemplate template = ItemTemplate.templates.get(resourceType.templateID);
2024-02-28 16:31:09 -05:00
2024-03-15 10:01:22 -04:00
if (warehouse.resources.get(resourceType) == null)
2024-01-24 20:21:41 -06:00
return false;
if (amount <= 0)
return false;
2024-03-18 10:01:29 -04:00
CharacterItemManager itemMan = pc.charItemManager;
2024-01-24 20:21:41 -06:00
if (itemMan == null)
return false;
if (addToInventory)
2024-03-15 10:18:07 -04:00
if (!itemMan.hasRoomInventory(template.item_wt * amount)) {
2024-01-24 20:21:41 -06:00
ChatManager.chatSystemInfo(pc, "You can not carry any more of that item.");
return false;
}
2024-03-15 10:01:22 -04:00
if (addToInventory && resourceType.equals(Enum.ResourceType.GOLD)) {
2024-03-18 10:01:29 -04:00
if (pc.charItemManager.getGoldInventory().getNumOfItems() + amount > MBServerStatics.PLAYER_GOLD_LIMIT)
2024-01-24 20:21:41 -06:00
return false;
2024-03-18 10:01:29 -04:00
if (pc.charItemManager.getGoldInventory().getNumOfItems() + amount < 0)
2024-01-24 20:21:41 -06:00
return false;
}
2024-03-15 10:01:22 -04:00
int oldAmount = warehouse.resources.get(resourceType);
2024-01-24 20:21:41 -06:00
if (oldAmount < amount)
return false;
int newAmount = oldAmount - amount;
2024-03-17 09:01:35 -04:00
warehouse.resources.put(resourceType, newAmount);
2024-01-24 20:21:41 -06:00
2024-03-17 09:47:00 -04:00
if (!DbManager.WarehouseQueries.UPDATE_WAREHOUSE(warehouse)) {
2024-03-17 09:01:35 -04:00
warehouse.resources.put(resourceType, oldAmount);
2024-01-24 20:21:41 -06:00
return false;
2024-03-17 09:01:35 -04:00
}
2024-01-24 20:21:41 -06:00
if (addToInventory) {
2024-03-15 10:01:22 -04:00
if (resourceType.equals(Enum.ResourceType.GOLD)) {
2024-01-24 20:21:41 -06:00
itemMan.addGoldToInventory(amount, false);
UpdateGoldMsg ugm = new UpdateGoldMsg(pc);
ugm.configure();
Dispatch dispatch = Dispatch.borrow(pc, ugm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
itemMan.updateInventory();
} else {
boolean itemWorked = false;
2024-03-02 11:07:07 -05:00
2024-03-15 10:01:22 -04:00
Item item = new Item(resourceType.templateID);
2024-03-02 11:07:07 -05:00
item.ownerID = pc.getObjectUUID();
item.ownerType = Enum.OwnerType.PlayerCharacter;
2024-01-24 20:21:41 -06:00
item.containerType = Enum.ItemContainerType.INVENTORY;
2024-03-02 11:07:07 -05:00
item.numberOfItems = amount;
2024-01-24 20:21:41 -06:00
try {
2024-03-02 09:55:30 -05:00
item = DbManager.ItemQueries.PERSIST(item);
2024-01-24 20:21:41 -06:00
itemWorked = true;
} catch (Exception e) {
Logger.error(e);
}
if (itemWorked) {
itemMan.addItemToInventory(item);
itemMan.updateInventory();
}
}
}
if (transaction)
AddTransactionToWarehouse(warehouse, pc.getObjectType(), pc.getObjectUUID(), Enum.TransactionType.WITHDRAWL, resourceType, amount);
return true;
}
2024-03-15 10:01:22 -04:00
public static synchronized boolean loot(Warehouse warehouse, PlayerCharacter pc, Enum.ResourceType resourceType, int amount, boolean addToInventory) {
2024-01-24 20:21:41 -06:00
if (pc == null)
return false;
2024-03-16 07:57:17 -04:00
ItemTemplate template = ItemTemplate.templates.get(resourceType);
2024-03-03 15:06:44 -05:00
if (template == null)
2024-01-24 20:21:41 -06:00
return false;
2024-03-15 10:01:22 -04:00
if (warehouse.resources.get(resourceType) == null)
2024-01-24 20:21:41 -06:00
return false;
if (amount <= 0)
return false;
2024-03-18 10:01:29 -04:00
CharacterItemManager itemMan = pc.charItemManager;
2024-01-24 20:21:41 -06:00
if (itemMan == null)
return false;
2024-03-03 15:06:44 -05:00
if (!itemMan.hasRoomInventory(template.item_wt)) {
2024-01-24 20:21:41 -06:00
ChatManager.chatSystemInfo(pc, "You can not carry any more of that item.");
return false;
}
2024-03-15 10:01:22 -04:00
int oldAmount = warehouse.resources.get(resourceType);
2024-01-24 20:21:41 -06:00
if (oldAmount < amount)
return false;
int newAmount = oldAmount - amount;
2024-03-15 10:01:22 -04:00
warehouse.resources.put(resourceType, newAmount);
2024-01-24 20:21:41 -06:00
if (addToInventory) {
2024-03-15 10:01:22 -04:00
if (resourceType.equals(Enum.ResourceType.GOLD)) {
2024-01-24 20:21:41 -06:00
itemMan.addGoldToInventory(amount, false);
UpdateGoldMsg ugm = new UpdateGoldMsg(pc);
ugm.configure();
Dispatch dispatch = Dispatch.borrow(pc, ugm);
DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
itemMan.updateInventory();
} else {
boolean itemWorked = false;
2024-03-15 10:01:22 -04:00
Item item = new Item(resourceType.templateID);
2024-03-02 11:07:07 -05:00
item.ownerID = pc.getObjectUUID();
item.ownerType = Enum.OwnerType.PlayerCharacter;
2024-01-24 20:21:41 -06:00
item.containerType = Enum.ItemContainerType.INVENTORY;
2024-03-02 11:07:07 -05:00
item.numberOfItems = amount;
2024-01-24 20:21:41 -06:00
try {
2024-03-02 09:55:30 -05:00
item = DbManager.ItemQueries.PERSIST(item);
2024-01-24 20:21:41 -06:00
itemWorked = true;
} catch (Exception e) {
Logger.error(e);
}
if (itemWorked) {
itemMan.addItemToInventory(item);
itemMan.updateInventory();
}
}
}
return true;
}
public static boolean isEmpty(Warehouse warehouse) {
int amount = 0;
2024-03-15 10:47:35 -04:00
for (Enum.ResourceType resourceType : EnumSet.allOf(Enum.ResourceType.class)) {
amount += warehouse.resources.get(resourceType);
2024-01-24 20:21:41 -06:00
if (amount > 0)
return false;
}
return true;
}
public static void loadAllTransactions(Warehouse warehouse) {
2024-03-17 11:29:30 -04:00
warehouse.transactions = DbManager.WarehouseQueries.GET_TRANSACTIONS_FOR_WAREHOUSE(warehouse.building.getObjectUUID());
2024-01-24 20:21:41 -06:00
}
2024-03-14 14:47:20 -04:00
public static void AddTransactionToWarehouse(Warehouse warehouse, Enum.GameObjectType targetType, int targetUUID, Enum.TransactionType transactionType, Enum.ResourceType resource, int amount) {
2024-01-24 20:21:41 -06:00
2024-03-17 11:29:30 -04:00
if (!DbManager.WarehouseQueries.CREATE_TRANSACTION(warehouse.building.getObjectUUID(), targetType, targetUUID, transactionType, resource, amount, DateTime.now()))
2024-01-24 20:21:41 -06:00
return;
2024-03-17 11:29:30 -04:00
Transaction transaction = new Transaction(warehouse.building.getObjectUUID(), targetType, targetUUID, transactionType, resource, amount, DateTime.now());
2024-01-24 20:21:41 -06:00
warehouse.transactions.add(transaction);
}
2024-03-15 10:47:35 -04:00
public static boolean isAboveCap(Warehouse warehouse, Enum.ResourceType resourceType, int deposit) {
int newAmount = warehouse.resources.get(resourceType) + deposit;
return newAmount > resourceType.deposit_limit;
2024-01-24 20:21:41 -06:00
}
2024-03-15 10:01:22 -04:00
public static boolean isResourceLocked(Warehouse warehouse, Enum.ResourceType resourceType) {
2024-03-17 10:06:26 -04:00
return resourceType.elementOf(warehouse.locked);
2023-07-15 09:23:48 -04:00
}
2024-01-24 20:03:27 -06:00
}