@ -24,10 +24,7 @@ import engine.net.client.msg.ClientNetMsg;
@@ -24,10 +24,7 @@ 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.CharacterItemManager ;
import engine.objects.Item ;
import engine.objects.NPC ;
import engine.objects.PlayerCharacter ;
import engine.objects.* ;
import org.pmw.tinylog.Logger ;
import java.util.HashMap ;
@ -132,44 +129,54 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
@@ -132,44 +129,54 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
Item virtualItem = Item . getFromCache ( itemUUID ) ;
WorkOrder workOrder = ForgeManager . itemWorkOrderLookup . get ( virtualItem ) ;
// Refresh the window. SetPrice is used only to force a window refresh.
// What controls items displayed are the contents of the workOrders. (ManageNPCMsg)
City city = workOrder . vendor . building . getCity ( ) ;
city . transactionLock . writeLock ( ) . lock ( ) ;
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 ) ;
try {
// Remove virtualItem from collections
// Refresh the window. SetPrice is used only to force a window refresh.
// What controls items displayed are the contents of the workOrders. (ManageNPCMsg)
workOrder . cooking . remove ( virtualItem ) ;
ForgeManager . itemWorkOrderLookup . remove ( virtualItem ) ;
DbManager . removeFromCache ( virtualItem ) ;
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 ) ;
// WorkOrder exists until all items are completed or junked
// this is to hold a reference to the virtual item for serialization (NPCMsgHandler)
// Remove virtualItem from collections
workOrder . slots_used = workOrder . slots_used - 1 ;
workOrder . cooking . remove ( virtualItem ) ;
ForgeManager . itemWorkOrderLookup . remove ( virtualItem ) ;
DbManager . removeFromCache ( virtualItem ) ;
if ( workOrder . slots_used = = 0 )
ForgeManager . vendorWorkOrderLookup . get ( workOrder . vendor ) . remove ( workOrder ) ;
// WorkOrder exists until all items are completed or junked
// this is to hold a reference to the virtual item for serialization (NPCMsgHandler)
// Persist item and add to vendor inventory
workOrder . slots_used = workOrder . slots_used - 1 ;
Item completedItem = DbManager . ItemQueries . PERSIST ( virtualItem ) ;
if ( workOrder . slots_used = = 0 )
ForgeManager . vendorWorkOrderLookup . get ( workOrder . vendor ) . remove ( workOrder ) ;
// Apply Item effects for Prefix and Suffix tokens
// Persist item and add to vendor inventory
completedItem . prefixToken = virtualItem . prefixToken ;
completedItem . suffixToken = virtualItem . suffixToken ;
Item completedItem = DbManager . ItemQueries . PERSIST ( virtualItem ) ;
ItemManager . applyItemEffects ( completedItem ) ;
// Apply Item effects for Prefix and Suffix tokens
vendor . charItemManager . addItemToInventory ( completedItem ) ;
completedItem . prefixToken = virtualItem . prefixToken ;
completedItem . suffixToken = virtualItem . suffixToken ;
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 ) ;
ItemManager . applyItemEffects ( completedItem ) ;
vendor . charItemManager . addItemToInventory ( completedItem ) ;
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 ( ) ;
}
}
private static void setItemPrice ( int itemUUID , int itemPrice , NPC vendor , ClientConnection origin ) {
@ -189,18 +196,18 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
@@ -189,18 +196,18 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
return ;
if ( ! DbManager . ItemQueries . UPDATE_VALUE ( targetItem , itemPrice ) ) {
ChatManager . chatInfoError ( origin . getPlayerCharacter ( ) , "Failed to set price! Contact CCR For help." ) ;
return ;
}
ChatManager . chatInfoError ( origin . getPlayerCharacter ( ) , "Failed to set price! Contact CCR For help." ) ;
return ;
}
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 ) ;
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 ) ;
outMsg = new ItemProductionMsg ( vendor . getBuilding ( ) , vendor , targetItem , mbEnums . ProductionActionType . SETPRICE , true ) ;
dispatch = Dispatch . borrow ( player , outMsg ) ;
DispatchMessage . dispatchMsgDispatch ( dispatch , mbEnums . DispatchChannel . SECONDARY ) ;
outMsg = new ItemProductionMsg ( vendor . getBuilding ( ) , vendor , targetItem , mbEnums . ProductionActionType . SETPRICE , true ) ;
dispatch = Dispatch . borrow ( player , outMsg ) ;
DispatchMessage . dispatchMsgDispatch ( dispatch , mbEnums . DispatchChannel . SECONDARY ) ;
}
@ -312,7 +319,7 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
@@ -312,7 +319,7 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
if ( ! vendor . charItemManager . doesCharOwnThisItem ( targetItem . getObjectUUID ( ) ) )
continue ;
if ( vendor . charItemManager . inventoryContains ( targetItem ) = = false )
if ( ! vendor . charItemManager . inventoryContains ( targetItem ) )
continue ;
itemValue = targetItem . template . item_value ;
@ -361,48 +368,51 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
@@ -361,48 +368,51 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
ManageNPCMsg outMsg ;
Dispatch dispatch ;
if ( origin . sellLock . tryLock ( ) ) {
targetItem = Item . getFromCache ( itemUUID ) ;
try {
PlayerCharacter player = origin . getPlayerCharacter ( ) ;
targetItem = Item . getFromCache ( itemUUID ) ;
if ( player = = null )
return ;
PlayerCharacter player = origin . getPlayerCharacter ( ) ;
// junk nothing?
if ( player = = null )
return ;
if ( targetItem = = null )
return ;
// junk nothing?
// Cannot junk items without a forge!
if ( targetItem = = null )
return ;
if ( vendor . getBuilding ( ) = = null )
return ;
// Cannot junk items without a forge!
WorkOrder workOrder = ForgeManager . itemWorkOrderLookup . get ( targetItem ) ;
if ( vendor . getBuilding ( ) = = null )
return ;
City city = workOrder . vendor . building . getCity ( ) ;
city . transactionLock . writeLock ( ) . lock ( ) ;
WorkOrder workOrder = ForgeManager . itemWorkOrderLookup . get ( targetItem ) ;
workOrder . cooking . remove ( targetItem ) ;
DbManager . removeFromCache ( targetItem ) ;
try {
// WorkOrder exists until all items are completed or junked
// this is to hold a reference to the virtual item for serialization (NPCMsgHandler)
workOrder . cooking . remove ( targetItem ) ;
DbManager . removeFromCache ( targetItem ) ;
workOrder . slots_used = workOrder . slots_used - 1 ;
// WorkOrder exists until all items are completed or junked
// this is to hold a reference to the virtual item for serialization (NPCMsgHandler)
if ( workOrder . slots_used = = 0 )
ForgeManager . vendorWorkOrderLookup . get ( workOrder . vendor ) . remove ( workOrder ) ;
workOrder . slots_used = workOrder . slots_used - 1 ;
// Refresh vendor's inventory to client
if ( workOrder . slots_used = = 0 )
ForgeManager . vendorWorkOrderLookup . get ( workOrder . vendor ) . remove ( workOrder ) ;
outMsg = new ManageNPCMsg ( vendor ) ;
outMsg . setMessageType ( 1 ) ;
dispatch = Dispatch . borrow ( player , outMsg ) ;
DispatchMessage . dispatchMsgDispatch ( dispatch , mbEnums . DispatchChannel . SECONDARY ) ;
} finally {
origin . sellLock . unlock ( ) ;
}
// 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 ( ) ;
}
}
@ -425,10 +435,10 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
@@ -425,10 +435,10 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
if ( targetItem . template . item_type . equals ( ItemType . GOLD ) )
return ;
if ( vendor . charItemManager . inventoryContains ( targetItem ) = = false )
if ( ! vendor . charItemManager . inventoryContains ( targetItem ) )
return ;
if ( player . charItemManager . hasRoomInventory ( targetItem . template . item_wt ) = = false )
if ( ! player . charItemManager . hasRoomInventory ( targetItem . template . item_wt ) )
return ;
player . charItemManager . buyFromNPC ( targetItem , vendor ) ;