Files
prestonbane/src/engine/net/client/handlers/ItemProductionMsgHandler.java
T

486 lines
16 KiB
Java
Raw Normal View History

2022-04-30 09:41:17 -04:00
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.net.client.handlers;
import engine.exception.MsgSendException;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
2024-04-07 22:21:47 -04:00
import engine.gameManager.ForgeManager;
2024-04-20 12:37:55 -04:00
import engine.gameManager.ItemManager;
2024-04-07 22:15:06 -04:00
import engine.loot.WorkOrder;
import engine.mbEnums;
import engine.mbEnums.ItemType;
2022-04-30 09:41:17 -04:00
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.ItemProductionMsg;
import engine.net.client.msg.ManageNPCMsg;
import engine.objects.*;
2022-04-30 09:41:17 -04:00
import org.pmw.tinylog.Logger;
import java.util.HashMap;
/*
* @Summary: Processes application protocol message which modifies
* hireling inventory through rolling, junking or depositing.
*/
2024-04-13 08:51:02 -04:00
2022-04-30 09:41:17 -04:00
public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
2023-07-15 09:23:48 -04:00
public ItemProductionMsgHandler() {
super(ItemProductionMsg.class);
}
2022-04-30 09:41:17 -04:00
2024-04-07 13:23:22 -04:00
@Override
protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {
// Member variable declaration
PlayerCharacter player;
2024-04-16 15:53:13 -04:00
NPC vendor;
2024-04-07 13:23:22 -04:00
ItemProductionMsg msg;
Dispatch dispatch;
// Member variable assignment
msg = (ItemProductionMsg) baseMsg;
player = origin.getPlayerCharacter();
if (player == null)
return true;
// Grab reference to vendor we are interacting with
2024-04-16 15:53:13 -04:00
vendor = (NPC) DbManager.getObject(mbEnums.GameObjectType.NPC, msg.npcUUID);
2024-04-07 13:23:22 -04:00
// Oops?
2024-04-16 15:53:13 -04:00
if (vendor == null)
2024-04-07 13:23:22 -04:00
return true;
// Process Request
switch (msg.actionType) {
case PRODUCE:
2024-04-07 13:25:42 -04:00
2024-04-07 22:15:06 -04:00
// Create new work order
WorkOrder workOrder = new WorkOrder();
2024-04-07 22:31:58 -04:00
workOrder.total_to_produce = msg.total_to_produce;
2024-04-16 15:53:13 -04:00
workOrder.vendor = vendor;
2024-04-14 14:48:59 -04:00
workOrder.templateID = msg.itemUUID;
2024-04-07 22:18:12 -04:00
workOrder.prefixToken = msg.pToken;
workOrder.suffixToken = msg.sToken;
2024-04-13 07:54:26 -04:00
workOrder.item_name_override = msg.name;
workOrder.multiple_slot_request = (msg.size != 0);
2024-04-07 22:15:06 -04:00
2024-04-14 12:08:51 -04:00
// Submit workOder to begin rolling items
2024-04-07 22:21:47 -04:00
2024-04-14 12:08:51 -04:00
int validation_result = ForgeManager.submit(workOrder);
2024-04-07 22:21:47 -04:00
2024-04-14 14:13:10 -04:00
// workOrder could not be completed
// Report back to the user the reason why
2024-04-07 22:40:14 -04:00
2024-04-14 12:08:51 -04:00
if (validation_result != 0) {
ErrorPopupMsg.sendErrorPopup(player, validation_result);
return true;
}
2024-04-14 15:38:24 -04:00
2024-04-07 13:23:22 -04:00
break;
case JUNK:
2024-04-16 15:53:13 -04:00
junkItem(msg.itemUUID, vendor, origin);
2024-04-07 13:23:22 -04:00
break;
case RECYCLE:
2024-04-16 15:53:13 -04:00
recycleItem(msg.items, vendor, origin);
2024-04-07 13:23:22 -04:00
msg.actionType = mbEnums.ProductionActionType.TAKE;
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
break;
case COMPLETE:
2024-04-17 12:47:28 -04:00
completeItem(msg.itemUUID, vendor);
2024-04-07 13:23:22 -04:00
break;
case DEPOSIT:
2024-04-16 15:53:13 -04:00
depositItem(msg.itemUUID, vendor, origin);
2024-04-07 13:23:22 -04:00
break;
case SETPRICE:
2024-04-17 14:07:42 -04:00
setItemPrice(msg.itemUUID, msg.itemPrice, vendor, origin);
2024-04-07 13:23:22 -04:00
break;
case TAKE:
2024-04-16 15:53:13 -04:00
takeItem(msg.items, vendor, origin);
2024-04-07 13:23:22 -04:00
dispatch = Dispatch.borrow(player, msg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
break;
}
return true;
}
2024-04-17 12:47:28 -04:00
private static void completeItem(int itemUUID, NPC vendor) {
2024-04-17 12:36:23 -04:00
2024-04-20 12:45:05 -04:00
Item virtualItem = Item.getFromCache(itemUUID);
2024-04-17 13:58:25 -04:00
WorkOrder workOrder = ForgeManager.itemWorkOrderLookup.get(virtualItem);
2024-04-17 12:36:23 -04:00
City city = workOrder.vendor.building.getCity();
2024-04-27 08:17:17 -04:00
if (city == null)
return;
city.transactionLock.writeLock().lock();
2024-04-19 09:16:01 -04:00
try {
2024-04-19 09:16:01 -04:00
2024-04-22 08:20:02 -04:00
// Remove virtual item from the vendor rolling window
// (Add / Completed / Remove)
2024-04-19 09:16:38 -04:00
ItemProductionMsg outMsg = new ItemProductionMsg(workOrder.vendor.building, workOrder.vendor, virtualItem, mbEnums.ProductionActionType.CONFIRM_SETPRICE, true);
DispatchMessage.dispatchMsgToInterestArea(workOrder.vendor, outMsg, mbEnums.DispatchChannel.SECONDARY, 700, false, false);
2024-04-19 09:07:23 -04:00
// Remove virtualItem from collections
workOrder.cooking.remove(virtualItem);
ForgeManager.itemWorkOrderLookup.remove(virtualItem);
DbManager.removeFromCache(virtualItem);
2024-05-11 09:16:48 -04:00
workOrder.slots_used.decrementAndGet();
2024-04-22 15:12:46 -04:00
// Update workOrder on disk
2024-04-22 00:25:16 -04:00
2024-04-22 15:12:46 -04:00
if (workOrder.cooking.isEmpty()) {
2024-04-22 00:25:16 -04:00
ForgeManager.vendorWorkOrderLookup.get(vendor).remove(workOrder);
2024-04-22 15:12:46 -04:00
DbManager.WarehouseQueries.DELETE_WORKORDER(workOrder);
} else
2024-04-27 07:24:57 -04:00
DbManager.WarehouseQueries.WRITE_WORKORDER(workOrder);
2024-04-22 00:25:16 -04:00
// Persist item and add to vendor inventory
2024-04-20 12:33:55 -04:00
2024-04-24 13:36:32 -04:00
virtualItem.containerType = mbEnums.ItemContainerType.INVENTORY;
Item completedItem = DbManager.ItemQueries.PERSIST(virtualItem);
2024-04-20 12:33:55 -04:00
// Apply Item effects for Prefix and Suffix tokens
2024-04-20 12:33:55 -04:00
completedItem.prefixToken = virtualItem.prefixToken;
completedItem.suffixToken = virtualItem.suffixToken;
2024-04-17 12:36:23 -04:00
ItemManager.applyItemEffects(completedItem);
2024-04-17 13:58:25 -04:00
vendor.charItemManager.addItemToInventory(completedItem);
2024-04-22 08:20:02 -04:00
// Add persisted items to the vendor inventory window
2024-04-22 00:37:49 -04:00
ItemProductionMsg outMsg1 = new ItemProductionMsg(vendor.building, vendor, completedItem, mbEnums.ProductionActionType.DEPOSIT, true);
DispatchMessage.dispatchMsgToInterestArea(vendor, outMsg1, mbEnums.DispatchChannel.SECONDARY, 700, false, false);
ItemProductionMsg outMsg2 = new ItemProductionMsg(vendor.building, vendor, completedItem, mbEnums.ProductionActionType.CONFIRM_DEPOSIT, true);
DispatchMessage.dispatchMsgToInterestArea(vendor, outMsg2, mbEnums.DispatchChannel.SECONDARY, 700, false, false);
} catch (Exception e) {
Logger.error(e);
} finally {
city.transactionLock.writeLock().unlock();
}
2024-04-17 12:36:23 -04:00
}
2024-04-17 14:07:42 -04:00
private static void setItemPrice(int itemUUID, int itemPrice, NPC vendor, ClientConnection origin) {
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
Item targetItem;
ItemProductionMsg outMsg;
Dispatch dispatch;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
PlayerCharacter player = origin.getPlayerCharacter();
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (player == null)
return;
2022-04-30 09:41:17 -04:00
2024-04-17 14:07:42 -04:00
targetItem = Item.getFromCache(itemUUID);
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (targetItem == null)
return;
2022-04-30 09:41:17 -04:00
2024-04-17 14:07:42 -04:00
if (!DbManager.ItemQueries.UPDATE_VALUE(targetItem, itemPrice)) {
ChatManager.chatInfoError(origin.getPlayerCharacter(), "Failed to set price! Contact CCR For help.");
return;
}
2022-04-30 09:41:17 -04:00
targetItem.setValue(itemPrice);
outMsg = new ItemProductionMsg(vendor.getBuilding(), vendor, targetItem, mbEnums.ProductionActionType.DEPOSIT, true);
dispatch = Dispatch.borrow(player, outMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
2022-04-30 09:41:17 -04:00
outMsg = new ItemProductionMsg(vendor.getBuilding(), vendor, targetItem, mbEnums.ProductionActionType.SETPRICE, true);
dispatch = Dispatch.borrow(player, outMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
2024-04-17 14:07:42 -04:00
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
// Method sets the price on an item in the vendor inventory
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
private static void depositItem(int itemUUID, NPC vendor, ClientConnection origin) {
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
Item targetItem;
ItemProductionMsg outMsg;
CharacterItemManager itemMan;
Dispatch dispatch;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
PlayerCharacter player = origin.getPlayerCharacter();
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (player == null)
return;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (origin.sellLock.tryLock()) {
try {
targetItem = Item.getFromCache(itemUUID);
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (targetItem == null)
return;
2022-04-30 09:41:17 -04:00
2024-03-10 13:34:24 -04:00
if (targetItem.template.item_type.equals(ItemType.GOLD))
2023-07-15 09:23:48 -04:00
return;
2022-04-30 09:41:17 -04:00
2024-03-18 10:01:29 -04:00
if (!vendor.charItemManager.hasRoomInventory(targetItem.template.item_wt)) {
2023-07-15 09:23:48 -04:00
ErrorPopupMsg.sendErrorPopup(player, 21);
return;
}
2022-04-30 09:41:17 -04:00
2024-03-18 10:01:29 -04:00
itemMan = origin.getPlayerCharacter().charItemManager;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (itemMan == null)
return;
2022-04-30 09:41:17 -04:00
2024-03-18 10:01:29 -04:00
if (vendor.charItemManager.getInventoryWeight() > 500) {
2023-07-15 09:23:48 -04:00
ErrorPopupMsg.sendErrorPopup(player, 21);
return;
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (!targetItem.validForInventory(origin, player, itemMan)) {
ErrorPopupMsg.sendErrorPopup(player, 19);
return;
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
// Transfer item from player to vendor's inventory
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (!itemMan.sellToNPC(targetItem, vendor)) {
ErrorPopupMsg.sendErrorPopup(player, 109);
return;
}
2022-04-30 09:41:17 -04:00
2024-04-14 17:30:35 -04:00
outMsg = new ItemProductionMsg(vendor.getBuilding(), vendor, targetItem, mbEnums.ProductionActionType.DEPOSIT, true);
2023-07-15 09:23:48 -04:00
dispatch = Dispatch.borrow(player, outMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
2022-04-30 09:41:17 -04:00
2024-04-14 17:30:35 -04:00
outMsg = new ItemProductionMsg(vendor.getBuilding(), vendor, targetItem, mbEnums.ProductionActionType.CONFIRM_DEPOSIT, true);
2023-07-15 09:23:48 -04:00
dispatch = Dispatch.borrow(player, outMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
2022-04-30 09:41:17 -04:00
2024-03-18 10:01:29 -04:00
origin.getPlayerCharacter().charItemManager.updateInventory();
2023-07-15 09:23:48 -04:00
} catch (Exception e) {
Logger.error(e);
} finally {
origin.sellLock.unlock();
}
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
// Method completes an item that has been previously rolled
2024-04-27 08:17:17 -04:00
// adding it to the Vendor inventory
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
private static void recycleItem(HashMap<Integer, Integer> itemList, NPC vendor, ClientConnection origin) {
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
Item targetItem;
ItemProductionMsg outMsg;
int totalValue = 0;
Dispatch dispatch;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (vendor.getBuilding() == null)
return;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
PlayerCharacter player = origin.getPlayerCharacter();
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (player == null)
return;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (itemList == null)
return;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (origin.sellLock.tryLock()) {
try {
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
for (int itemUUID : itemList.keySet()) {
int itemValue = 0;
2022-04-30 09:41:17 -04:00
2024-04-17 14:07:42 -04:00
targetItem = Item.getFromCache(itemUUID);
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (targetItem == null)
continue;
2022-04-30 09:41:17 -04:00
2024-03-10 13:34:24 -04:00
if (targetItem.template.item_type.equals(ItemType.GOLD))
2023-07-15 09:23:48 -04:00
return;
2022-04-30 09:41:17 -04:00
2024-03-18 10:01:29 -04:00
if (!vendor.charItemManager.doesCharOwnThisItem(targetItem.getObjectUUID()))
2023-07-15 09:23:48 -04:00
continue;
2024-04-17 14:07:42 -04:00
if (!vendor.charItemManager.inventoryContains(targetItem))
2023-07-15 09:23:48 -04:00
continue;
2022-04-30 09:41:17 -04:00
2024-03-03 13:06:05 -05:00
itemValue = targetItem.template.item_value;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (vendor.getBuilding().getStrongboxValue() + itemValue > vendor.getBuilding().getMaxGold()) {
ErrorPopupMsg.sendErrorPopup(player, 201);
break;
}
2022-04-30 09:41:17 -04:00
2024-03-10 13:34:24 -04:00
switch (targetItem.template.item_type) {
case EMPLOYMENTCONTRACT:
case CHARTER:
2023-07-15 09:23:48 -04:00
case DEED:
case REALMCHARTER:
case SCROLL:
2024-03-10 13:34:24 -04:00
case POTION:
2023-07-15 09:23:48 -04:00
continue;
}
2024-04-17 14:07:42 -04:00
2023-07-15 09:23:48 -04:00
totalValue += itemValue;
2024-03-18 10:01:29 -04:00
vendor.charItemManager.recycle(targetItem);
2022-04-30 09:41:17 -04:00
2024-04-14 17:30:35 -04:00
outMsg = new ItemProductionMsg(vendor.getBuilding(), vendor, targetItem, mbEnums.ProductionActionType.TAKE, true);
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
dispatch = Dispatch.borrow(origin.getPlayerCharacter(), outMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
// Refund a portion of the gold
2022-04-30 09:41:17 -04:00
2024-04-17 14:07:42 -04:00
vendor.getBuilding().transferGold(totalValue, false);
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
} catch (Exception e) {
Logger.error(e);
} finally {
origin.sellLock.unlock();
}
}
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
// Method handles recycling of an item
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
private static void junkItem(int itemUUID, NPC vendor, ClientConnection origin) {
2022-04-30 09:41:17 -04:00
2024-04-22 00:10:32 -04:00
Item virtualItem;
2023-07-15 09:23:48 -04:00
ManageNPCMsg outMsg;
Dispatch dispatch;
2022-04-30 09:41:17 -04:00
PlayerCharacter player = origin.getPlayerCharacter();
2024-04-15 14:45:34 -04:00
if (player == null)
return;
2022-04-30 09:41:17 -04:00
// Cannot junk items without a forge!
if (vendor.getBuilding() == null)
return;
// junk nothing?
2022-04-30 09:41:17 -04:00
virtualItem = Item.getFromCache(itemUUID);
2024-04-22 00:10:32 -04:00
if (virtualItem == null)
return;
2022-04-30 09:41:17 -04:00
WorkOrder workOrder = ForgeManager.itemWorkOrderLookup.get(virtualItem);
2022-04-30 09:41:17 -04:00
// If this virtual item was already processed then
// it will have been removed from the workOrder.
if (workOrder == null)
return;
2022-04-30 09:41:17 -04:00
2024-04-27 08:17:17 -04:00
if (!workOrder.cooking.contains(virtualItem))
return;
2022-04-30 09:41:17 -04:00
City city = workOrder.vendor.building.getCity();
2024-04-26 16:15:07 -04:00
if (city == null)
return;
city.transactionLock.writeLock().lock();
2022-04-30 09:41:17 -04:00
try {
2022-04-30 09:41:17 -04:00
2024-04-22 00:10:32 -04:00
workOrder.cooking.remove(virtualItem);
DbManager.removeFromCache(virtualItem);
ForgeManager.itemWorkOrderLookup.remove(virtualItem);
// Update total_to_produce accounting for the slot being
// removed while workOrder is not completed.
2024-05-11 09:15:11 -04:00
if (!workOrder.runCompleted.get())
if (workOrder.multiple_slot_request && workOrder.slots_used.get() > 1) {
int itemsPerSlot = workOrder.total_to_produce / workOrder.slots_used.get();
2024-04-27 08:17:17 -04:00
workOrder.total_to_produce = workOrder.total_to_produce - itemsPerSlot;
}
// Slot is no longer allocated to this workOrder.
2024-05-11 09:16:48 -04:00
workOrder.slots_used.decrementAndGet();
2024-04-22 15:12:46 -04:00
// Update workOrder on disk
2024-04-22 00:25:16 -04:00
2024-04-22 15:12:46 -04:00
if (workOrder.cooking.isEmpty()) {
2024-04-22 00:25:16 -04:00
ForgeManager.vendorWorkOrderLookup.get(vendor).remove(workOrder);
2024-04-22 15:12:46 -04:00
DbManager.WarehouseQueries.DELETE_WORKORDER(workOrder);
} else
2024-04-27 07:24:57 -04:00
DbManager.WarehouseQueries.WRITE_WORKORDER(workOrder);
2024-04-22 00:25:16 -04:00
// Refresh vendor's inventory to client
outMsg = new ManageNPCMsg(vendor);
outMsg.setMessageType(1);
dispatch = Dispatch.borrow(player, outMsg);
DispatchMessage.dispatchMsgDispatch(dispatch, mbEnums.DispatchChannel.SECONDARY);
} catch (Exception e) {
Logger.error(e);
} finally {
city.transactionLock.writeLock().unlock();
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
private static void takeItem(HashMap<Integer, Integer> itemList, NPC vendor, ClientConnection origin) {
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
Item targetItem;
PlayerCharacter player = origin.getPlayerCharacter();
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (player == null)
return;
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
for (int itemUUID : itemList.keySet()) {
2022-04-30 09:41:17 -04:00
2024-04-17 14:07:42 -04:00
targetItem = Item.getFromCache(itemUUID);
2022-04-30 09:41:17 -04:00
2023-07-15 09:23:48 -04:00
if (targetItem == null)
return;
2022-04-30 09:41:17 -04:00
2024-03-10 13:34:24 -04:00
if (targetItem.template.item_type.equals(ItemType.GOLD))
2023-07-15 09:23:48 -04:00
return;
2024-04-17 14:07:42 -04:00
if (!vendor.charItemManager.inventoryContains(targetItem))
2023-07-15 09:23:48 -04:00
return;
2022-04-30 09:41:17 -04:00
if (!player.charItemManager.hasRoomInventory(targetItem.template.item_wt))
2023-07-15 09:23:48 -04:00
return;
2022-04-30 09:41:17 -04:00
2024-03-18 10:01:29 -04:00
player.charItemManager.buyFromNPC(targetItem, vendor);
2023-07-15 09:23:48 -04:00
}
2024-03-18 10:01:29 -04:00
player.charItemManager.updateInventory();
2023-07-15 09:23:48 -04:00
}
2022-04-30 09:41:17 -04:00
}