sendPacket(Msg.YOU_HAVE_EXCEEDED_THE_QUANTITY_THAT_CAN_BE_INPUTTED);
return;
}
try
{
CropProcure crop = CastleManager.getInstance().getCastleByIndex(manorId).getCrop(itemId, CastleManorManager.PERIOD_CURRENT);
int rewardItemId = L2Manor.getInstance().getRewardItem(itemId, crop.getReward());
L2Item template = ItemTable.getInstance().getTemplate(rewardItemId);
weight += count * template.getWeight();
if(!template.isStackable())
{
slots += count;
}
else if(player.getInventory().getItemByItemId(itemId) == null)
{
slots++;
}
}
catch(NullPointerException e)
{
continue;
}
}
if(!player.getInventory().validateWeight(weight))
{
sendPacket(Msg.YOU_HAVE_EXCEEDED_THE_WEIGHT_LIMIT);
return;
}
if(!player.getInventory().validateCapacity(slots))
{
sendPacket(Msg.YOUR_INVENTORY_IS_FULL);
return;
}
// Proceed the purchase
for(int i = 0; i < _size; i++)
{
int objId = (int) _items[i * 4 + 0];
int cropId = (int) _items[i * 4 + 1];
int manorId = (int) _items[i * 4 + 2];
long count = _items[i * 4 + 3];
if(objId == 0 || cropId == 0 || manorId == 0 || count == 0)
{
continue;
}
if(count < 1)
{
continue;
}
CropProcure crop = null;
try
{
crop = CastleManager.getInstance().getCastleByIndex(manorId).getCrop(cropId, CastleManorManager.PERIOD_CURRENT);
}
catch(NullPointerException e)
{
continue;
}
if(crop == null || crop.getId() == 0 || crop.getPrice() == 0)
{
continue;
}
long fee = 0; // fee for selling to other manors
int rewardItem = L2Manor.getInstance().getRewardItem(cropId, crop.getReward());
if(count > crop.getAmount())
{
continue;
}
long sellPrice = count * crop.getPrice();
long rewardPrice = ItemTable.getInstance().getTemplate(rewardItem).getReferencePrice();
if(rewardPrice == 0)
{
continue;
}
double reward = ((double) sellPrice) / rewardPrice;
long rewardItemCount = ((long) reward) + (Rnd.nextDouble() <= reward % 1 ? 1 : 0); // дробную часть округляем с шансом пропорционально размеру дробной части
if(rewardItemCount < 1)
{
SystemMessage sm = new SystemMessage(SystemMessage.FAILED_IN_TRADING_S2_OF_CROP_S1);
sm.addItemName(cropId);
sm.addNumber(count);
player.sendPacket(sm);
continue;
}
if(manorId != currentManorId)
{
fee = sellPrice * 5 / 100;
} // 5% fee for selling to other manor
if(player.getInventory().getAdena() < fee)
{
SystemMessage sm = new SystemMessage(SystemMessage.FAILED_IN_TRADING_S2_OF_CROP_S1);
sm.addItemName(cropId);
sm.addNumber(count);
player.sendPacket(sm, Msg.YOU_DO_NOT_HAVE_ENOUGH_ADENA);
continue;
}
// Add item to Inventory and adjust update packet
L2ItemInstance itemDel = null;
L2ItemInstance itemAdd = null;
if(player.getInventory().getItemByObjectId(objId) == null)
{
continue;
}
// check if player have correct items count
L2ItemInstance item = player.getInventory().getItemByObjectId(objId);
if(item.getCount() < count)
{
continue;
}
if(crop.getId() != item.getItemId())
{
Util.handleIllegalPlayerAction(player, "RequestProcureCropList", "packet cheat 1", 2);
break;
}
itemDel = player.getInventory().destroyItem(objId, count, true);
if(itemDel == null)
{
continue;
}
if(fee > 0)
{
player.getInventory().reduceAdena(fee);
}
crop.setAmount(crop.getAmount() - count);
CastleManager.getInstance().getCastleByIndex(manorId).updateCrop(crop.getId(), crop.getAmount(), CastleManorManager.PERIOD_CURRENT);
itemAdd = player.getInventory().addItem(rewardItem, rewardItemCount);
if(itemAdd == null)
{
continue;
}