@ -9,16 +9,14 @@
@@ -9,16 +9,14 @@
package engine.net.client.handlers ;
import engine.Enum ;
import engine.Enum.DispatchChannel ;
import engine.exception.MsgSendException ;
import engine.gameManager.SessionManager ;
import engine.net.Dispatch ;
import engine.net.DispatchMessage ;
import engine.net.client.ClientConnection ;
import engine.net.client.msg.BuyFromNPCMsg ;
import engine.net.client.msg.ClientNetMsg ;
import engine.net.client.msg.ErrorPopupMsg ;
import engine.objects.* ;
import org.pmw.tinylog.Logger ;
import java.util.ArrayList ;
@ -39,6 +37,7 @@ public class BuyFromNPCMsgHandler extends AbstractClientMsgHandler {
@@ -39,6 +37,7 @@ public class BuyFromNPCMsgHandler extends AbstractClientMsgHandler {
buyFromNPCMsg = ( BuyFromNPCMsg ) baseMsg ;
PlayerCharacter sourcePlayer = SessionManager . getPlayerCharacter ( origin ) ;
Item vendorItem ;
if ( sourcePlayer = = null )
return true ;
@ -61,21 +60,15 @@ public class BuyFromNPCMsgHandler extends AbstractClientMsgHandler {
@@ -61,21 +60,15 @@ public class BuyFromNPCMsgHandler extends AbstractClientMsgHandler {
if ( gold = = null )
return true ;
Item buy = Item . getFromCache ( buyFromNPCMsg . getItemID ( ) ) ;
ArrayList < Item > sellInventory = npc . getContract ( ) . getSellInventory ( ) ;
if ( bu y = = null )
if ( sellInventor y = = null )
return true ;
if ( buyFromNPCMsg . getItemType ( ) = = Enum . GameObjectType . Item . ordinal ( ) ) {
ArrayList < Item > sellInventory = npc . getContract ( ) . getSellInventory ( ) ;
if ( sellInventory = = null )
return true ;
if ( buyFromNPCMsg . getItemID ( ) < 0 ) {
for ( Item me : sellInventory ) {
if ( me . templateID = = buy . templateID ) {
if ( me . objectUUID = = buyFromNPCMsg . getItemID ( ) ) {
//test room available for item
if ( ! itemMan . hasRoomInventory ( me . template . item_wt ) )
@ -115,150 +108,82 @@ public class BuyFromNPCMsgHandler extends AbstractClientMsgHandler {
@@ -115,150 +108,82 @@ public class BuyFromNPCMsgHandler extends AbstractClientMsgHandler {
return true ;
}
buy = Item . createItemForPlayer ( sourcePlayer , me . templateID ) ;
vendorItem = Item . createItemForPlayer ( sourcePlayer , me . templateID ) ;
if ( buy ! = null ) {
// me.transferEnchants(buy);
itemMan . addItemToInventory ( buy ) ;
if ( vendorItem ! = null ) {
// me.transferEnchants(buy);
itemMan . addItemToInventory ( vendorItem ) ;
//itemMan.updateInventory();
}
}
}
} else if ( buyFromNPCMsg . getItemType ( ) = = Enum . GameObjectType . Item . ordinal ( ) ) {
CharacterItemManager npcCim = npc . charItemManager ;
if ( npcCim = = null )
return true ;
buy = Item . getFromCache ( buyFromNPCMsg . getItemID ( ) ) ;
if ( buy = = null )
return true ;
if ( ! npcCim . inventoryContains ( buy ) )
return true ;
//test room available for item
if ( ! itemMan . hasRoomInventory ( buy . template . item_wt ) )
return true ;
//TODO test cost and subtract goldItem
//TODO CHnage this if we ever put NPc city npcs in buildings.
int cost = buy . template . item_value ;
if ( buy . flags . contains ( Enum . ItemFlags . Identified ) | | buy . isCustomValue ( ) )
cost = buy . getMagicValue ( ) ;
float bargain = sourcePlayer . getBargain ( ) ;
float profit = npc . getSellPercent ( sourcePlayer ) - bargain ;
if ( profit < 1 )
profit = 1 ;
if ( ! buy . isCustomValue ( ) )
cost * = profit ;
else
cost = buy . getValue ( ) ;
if ( gold . getNumOfItems ( ) - cost < 0 ) {
ErrorPopupMsg . sendErrorPopup ( sourcePlayer , 128 ) ; // Insufficient Gold
return true ;
}
Building building = ( ! npc . isStatic ( ) ) ? npc . getBuilding ( ) : null ;
if ( building ! = null )
if ( building . getProtectionState ( ) . equals ( Enum . ProtectionState . NPC ) )
building = null ;
int buildingDeposit = cost ;
if ( building ! = null & & ( building . getStrongboxValue ( ) + buildingDeposit ) > building . getMaxGold ( ) ) {
ErrorPopupMsg . sendErrorPopup ( sourcePlayer , 206 ) ;
return true ;
}
return true ;
}
if ( ! itemMan . buyFromNPC ( building , cost , buildingDeposit ) ) {
ErrorPopupMsg . sendErrorPopup ( sourcePlayer , 110 ) ;
return true ;
}
CharacterItemManager npcCim = npc . charItemManager ;
if ( buy ! = null )
itemMan . buyFromNPC ( buy , npc ) ;
if ( npcCim = = null )
return true ;
} else if ( buyFromNPCMsg . getItemType ( ) = = Enum . GameObjectType . MobLoot . ordinal ( ) ) {
vendorItem = Item . getFromCache ( buyFromNPCMsg . getItemID ( ) ) ;
CharacterItemManager npcCim = npc . charItemManager ;
if ( vendorItem = = null )
return true ;
if ( npcCim = = null )
return true ;
//test room available for item
buy = MobLoot . getFromCache ( buyFromNPCMsg . getItemID ( ) ) ;
if ( ! itemMan . hasRoomInventory ( vendorItem . template . item_wt ) )
return true ;
if ( buy = = null )
return true ;
int cost = vendorItem . template . item_value ;
if ( ! npcCim . inventoryContains ( buy ) )
return true ;
if ( vendorItem . flags . contains ( Enum . ItemFlags . Identified ) | | vendorItem . isCustomValue ( ) )
cost = vendorItem . getMagicValue ( ) ;
//test room available for item
if ( ! itemMan . hasRoomInventory ( buy . template . item_wt ) )
return true ;
float bargain = sourcePlayer . getBargain ( ) ;
//TODO test cost and subtract goldItem
float profit = npc . getSellPercent ( sourcePlayer ) - bargain ;
//TODO CHnage this if we ever put NPc city npcs in buildings.
if ( profit < 1 )
profit = 1 ;
int cost = buy . getMagicValue ( ) ;
cost * = npc . getSellPercent ( sourcePlayer ) ;
if ( ! vendorItem . isCustomValue ( ) )
cost * = profit ;
else
cost = vendorItem . getValue ( ) ;
if ( gold . getNumOfItems ( ) - cost < 0 ) {
ErrorPopupMsg . sendErrorPopup ( sourcePlayer , 128 ) ; // Insufficient Gold
return true ;
}
if ( gold . getNumOfItems ( ) - cost < 0 ) {
ErrorPopupMsg . sendErrorPopup ( sourcePlayer , 128 ) ; // Insufficient Gold
return true ;
}
Building building = ( ! npc . isStatic ( ) ) ? npc . getBuilding ( ) : null ;
Building building = ( ! npc . isStatic ( ) ) ? npc . getBuilding ( ) : null ;
if ( building ! = null & & building . getProtectionState ( ) . equals ( Enum . ProtectionState . NPC ) )
if ( building ! = null )
if ( building . getProtectionState ( ) . equals ( Enum . ProtectionState . NPC ) )
building = null ;
int buildingDeposit = cost ;
if ( building ! = null & & ( building . getStrongboxValue ( ) + buildingDeposit ) > building . getMaxGold ( ) ) {
ErrorPopupMsg . sendErrorPopup ( sourcePlayer , 206 ) ;
return true ;
}
if ( ! itemMan . buyFromNPC ( building , cost , buildingDeposit ) )
return true ;
int buildingDeposit = cost ;
if ( buy ! = null )
itemMan . buyFromNPC ( buy , npc ) ;
} else
if ( building ! = null & & ( building . getStrongboxValue ( ) + buildingDeposit ) > building . getMaxGold ( ) ) {
ErrorPopupMsg . sendErrorPopup ( sourcePlayer , 206 ) ;
return true ;
}
if ( buy ! = null ) {
buyFromNPCMsg . setItem ( buy ) ;
//send the buy message back to update player
// msg.setItemType(buy.getObjectType().ordinal());
// msg.setItemID(buy.getObjectUUID());
Dispatch dispatch = Dispatch . borrow ( sourcePlayer , buyFromNPCMsg ) ;
DispatchMessage . dispatchMsgDispatch ( dispatch , DispatchChannel . SECONDARY ) ;
itemMan . updateInventory ( ) ;
if ( ! itemMan . buyFromNPC ( building , cost , buildingDeposit ) ) {
ErrorPopupMsg . sendErrorPopup ( sourcePlayer , 110 ) ;
return true ;
}
if ( vendorItem ! = null )
itemMan . buyFromNPC ( vendorItem , npc ) ;
return true ;
} catch ( Exception e ) {
Logger . error ( e ) ;
} finally {
origin . buyLock . unlock ( ) ;
}
} else {
ErrorPopupMsg . sendErrorPopup ( origin . getPlayerCharacter ( ) , 12 ) ; // All production slots taken
}
return true ;
}
}