Bläddra i källkod

Manor system packets update.
1. Using ArrayList instead of FastList.
2. Client manor packets totally reworked.
2.1. Strict length and sanity check for all packets.
2.2. NPC type and distance checks.
2.3. Castle owner clan and clan permisstions "manor administrator" checks.
2.4. Overflow checks added.

_DS_ 16 år sedan
förälder
incheckning
1599503b14

+ 2 - 2
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2ManorManagerInstance.java

@@ -14,9 +14,9 @@
  */
 package net.sf.l2j.gameserver.model.actor.instance;
 
+import java.util.List;
 import java.util.StringTokenizer;
 
-import javolution.util.FastList;
 import net.sf.l2j.gameserver.ai.CtrlIntention;
 import net.sf.l2j.gameserver.instancemanager.CastleManager;
 import net.sf.l2j.gameserver.instancemanager.CastleManorManager;
@@ -144,7 +144,7 @@ public class L2ManorManagerInstance extends L2MerchantInstance
                 else
                 {
 					L2TradeList tradeList = new L2TradeList(0);
-					FastList<SeedProduction> seeds = getCastle().getSeedProduction(CastleManorManager.PERIOD_CURRENT);
+					List<SeedProduction> seeds = getCastle().getSeedProduction(CastleManorManager.PERIOD_CURRENT);
 
 					for (SeedProduction s : seeds)
                     {

+ 13 - 12
L2_GameServer/java/net/sf/l2j/gameserver/model/entity/Castle.java

@@ -17,6 +17,7 @@ package net.sf.l2j.gameserver.model.entity;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.List;
 import java.util.Map;
@@ -59,10 +60,10 @@ public class Castle
 	
 	// =========================================================
 	// Data Field
-	private FastList<CropProcure> _procure = new FastList<CropProcure>();
-	private FastList<SeedProduction> _production = new FastList<SeedProduction>();
-	private FastList<CropProcure> _procureNext = new FastList<CropProcure>();
-	private FastList<SeedProduction> _productionNext = new FastList<SeedProduction>();
+	private List<CropProcure> _procure = new ArrayList<CropProcure>();
+	private List<SeedProduction> _production = new ArrayList<SeedProduction>();
+	private List<CropProcure> _procureNext = new ArrayList<CropProcure>();
+	private List<SeedProduction> _productionNext = new ArrayList<SeedProduction>();
 	private boolean _isNextPeriodApproved = false;
 	
 	private static final String CASTLE_MANOR_DELETE_PRODUCTION = "DELETE FROM castle_manor_production WHERE castle_id=?;";
@@ -1123,17 +1124,17 @@ public class Castle
 		return _treasury;
 	}
 	
-	public FastList<SeedProduction> getSeedProduction(int period)
+	public List<SeedProduction> getSeedProduction(int period)
 	{
 		return (period == CastleManorManager.PERIOD_CURRENT ? _production : _productionNext);
 	}
 	
-	public FastList<CropProcure> getCropProcure(int period)
+	public List<CropProcure> getCropProcure(int period)
 	{
 		return (period == CastleManorManager.PERIOD_CURRENT ? _procure : _procureNext);
 	}
 	
-	public void setSeedProduction(FastList<SeedProduction> seed, int period)
+	public void setSeedProduction(List<SeedProduction> seed, int period)
 	{
 		if (period == CastleManorManager.PERIOD_CURRENT)
 			_production = seed;
@@ -1141,7 +1142,7 @@ public class Castle
 			_productionNext = seed;
 	}
 	
-	public void setCropProcure(FastList<CropProcure> crop, int period)
+	public void setCropProcure(List<CropProcure> crop, int period)
 	{
 		if (period == CastleManorManager.PERIOD_CURRENT)
 			_procure = crop;
@@ -1175,8 +1176,8 @@ public class Castle
 	
 	public long getManorCost(int period)
 	{
-		FastList<CropProcure> procure;
-		FastList<SeedProduction> production;
+		List<CropProcure> procure;
+		List<SeedProduction> production;
 		
 		if (period == CastleManorManager.PERIOD_CURRENT)
 		{
@@ -1300,7 +1301,7 @@ public class Castle
 			statement.execute();
 			statement.close();
 			
-			FastList<SeedProduction> prod = null;
+			List<SeedProduction> prod = null;
 			prod = getSeedProduction(period);
 			
 			if (prod != null)
@@ -1431,7 +1432,7 @@ public class Castle
 			statement.execute();
 			statement.close();
 			
-			FastList<CropProcure> proc = null;
+			List<CropProcure> proc = null;
 			proc = getCropProcure(period);
 			
 			if (proc != null)

+ 99 - 63
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestBuyProcure.java

@@ -14,6 +14,7 @@
  */
 package net.sf.l2j.gameserver.network.clientpackets;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import javolution.util.FastList;
@@ -25,7 +26,9 @@ import net.sf.l2j.gameserver.model.L2ItemInstance;
 import net.sf.l2j.gameserver.model.L2Manor;
 import net.sf.l2j.gameserver.model.L2Object;
 import net.sf.l2j.gameserver.model.actor.instance.L2ManorManagerInstance;
+import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.model.entity.Castle;
 import net.sf.l2j.gameserver.network.SystemMessageId;
 import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
@@ -34,37 +37,41 @@ import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 import net.sf.l2j.gameserver.templates.item.L2Item;
 import net.sf.l2j.gameserver.util.Util;
 
+import static net.sf.l2j.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE;
+
 @SuppressWarnings("unused")
 public class RequestBuyProcure extends L2GameClientPacket {
 	private static final String _C__C3_REQUESTBUYPROCURE = "[C] C3 RequestBuyProcure";
+
+	private static final int BATCH_LENGTH = 12; // length of the one item
+
 	private int _listId;
-	private int _count;
-	private int[] _items;
-	private List<CropProcure> _procureList = new FastList<CropProcure>();
+	private Procure[] _items = null;;
 
 	@Override
 	protected void readImpl()
 	{
 		_listId = readD();
-		_count = readD();
-		if(_count > 500) // protect server
+		int count = readD();
+		if(count <= 0
+				|| count > Config.MAX_ITEM_IN_PACKET
+				|| count * BATCH_LENGTH != _buf.remaining())
 		{
-			_count = 0;
 			return;
 		}
 
-		_items = new int[_count * 2];
-		for (int i = 0; i < _count; i++)
+		_items = new Procure[count];
+		for (int i = 0; i < count; i++)
 		{
-			long servise = readD();
-			int itemId   = readD(); _items[i * 2 + 0] = itemId;
-			long cnt      = readQ();
-			if (cnt > Integer.MAX_VALUE || cnt < 1)
+			readD(); //service
+			int itemId = readD();
+			long cnt = readQ();
+			if (itemId < 1 || cnt < 1)
 			{
-				_count=0; _items = null;
+				_items = null;
 				return;
 			}
-			_items[i * 2 + 1] = (int)cnt;
+			_items[i] = new Procure(itemId, cnt);
 		}
 	}
 
@@ -72,48 +79,47 @@ public class RequestBuyProcure extends L2GameClientPacket {
 	protected void runImpl()
 	{
 		L2PcInstance player = getClient().getActiveChar();
-		if (player == null) return;
+		if (player == null)
+			return;
 
+		if(_items == null)
+		{
+			sendPacket(ActionFailed.STATIC_PACKET);
+			return;
+		}
 
 		// Alt game - Karma punishment
-        if (!Config.ALT_GAME_KARMA_PLAYER_CAN_SHOP && player.getKarma() > 0) return;
+		if (!Config.ALT_GAME_KARMA_PLAYER_CAN_SHOP && player.getKarma() > 0)
+			return;
 
-		L2Object target = player.getTarget();
+		L2Object manager = player.getTarget();
 
-        if(_count < 1)
-        {
-            sendPacket(ActionFailed.STATIC_PACKET);
-            return;
-        }
+		if (!(manager instanceof L2ManorManagerInstance))
+			manager = player.getLastFolkNPC();
 
-        long subTotal = 0;
-        int tax = 0;
+		if (!(manager instanceof L2ManorManagerInstance))
+			return;
 
-    	// Check for buylist validity and calculates summary values
-        int slots = 0;
-        int weight = 0;
-        L2ManorManagerInstance manor = (target instanceof L2ManorManagerInstance) ? (L2ManorManagerInstance)target : null;
+		if (!player.isInsideRadius(manager, INTERACTION_DISTANCE, true, false))
+			return;
 
+		Castle castle = ((L2ManorManagerInstance)manager).getCastle();
+		long subTotal = 0;
+		int tax = 0;
+		int slots = 0;
+		int weight = 0;
 
-		for (int i = 0; i < _count; i++)
+		for (Procure i : _items)
 		{
-			int itemId = _items[i * 2 + 0];
-			int count  = _items[i * 2 + 1];
-			int price = 0;
-			if (count > Integer.MAX_VALUE)
-			{
-				Util.handleIllegalPlayerAction(player,"Warning!! Character "+player.getName()+" of account "+player.getAccountName()+" tried to purchase over "+Integer.MAX_VALUE+" items at the same time.",  Config.DEFAULT_PUNISH);
-				SystemMessage sm = new SystemMessage(SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED);
-				sendPacket(sm);
-				return;
-			}
+			i.setReward(castle);
 
-			L2Item template = ItemTable.getInstance().getTemplate(L2Manor.getInstance().getRewardItem(
-					itemId,manor.getCastle().getCrop(itemId,CastleManorManager.PERIOD_CURRENT).getReward()));
-	        weight += count * template.getWeight();
+			L2Item template = ItemTable.getInstance().getTemplate(i.getReward());
+	        weight += i.getCount() * template.getWeight();
 
-			if (!template.isStackable()) slots += count;
-			else if (player.getInventory().getItemByItemId(itemId) == null) slots++;
+			if (!template.isStackable())
+				slots += i.getCount();
+			else if (player.getInventory().getItemByItemId(i.getItemId()) == null)
+				slots++;
 		}
 
 		if (!player.getInventory().validateWeight(weight))
@@ -122,7 +128,6 @@ public class RequestBuyProcure extends L2GameClientPacket {
 			return;
 		}
 
-
 		if (!player.getInventory().validateCapacity(slots))
 		{
 			sendPacket(new SystemMessage(SystemMessageId.SLOTS_FULL));
@@ -131,36 +136,33 @@ public class RequestBuyProcure extends L2GameClientPacket {
 
 		// Proceed the purchase
 		InventoryUpdate playerIU = new InventoryUpdate();
-		_procureList =  manor.getCastle().getCropProcure(CastleManorManager.PERIOD_CURRENT);
 
-		for (int i=0; i < _count; i++)
+		for (Procure i : _items)
 		{
-			int itemId = _items[i * 2 + 0];
-			int count  = _items[i * 2 + 1];
-			if (count < 0) count = 0;
-
-			int rewardItemId=L2Manor.getInstance().getRewardItem(
-					itemId,manor.getCastle().getCrop(itemId, CastleManorManager.PERIOD_CURRENT).getReward());
-
-			int rewardItemCount = 1; //L2Manor.getInstance().getRewardAmount(itemId, manor.getCastle().getCropReward(itemId));
+			// check if player have correct items count
+			L2ItemInstance item = player.getInventory().getItemByItemId(i.getItemId());
+			if (item == null || item.getCount() < i.getCount())
+				continue;
 
-			rewardItemCount = count / rewardItemCount;
+			L2ItemInstance iteme = player.getInventory().destroyItemByItemId("Manor",i.getItemId(),i.getCount(),player,manager);
+			if (iteme == null)
+				continue;
 
 			// Add item to Inventory and adjust update packet
-			L2ItemInstance item = player.getInventory().addItem("Manor",rewardItemId,rewardItemCount,player,manor);
-			L2ItemInstance iteme = player.getInventory().destroyItemByItemId("Manor",itemId,count,player,manor);
-
-			if (item == null || iteme == null)
+			item = player.getInventory().addItem("Manor",i.getReward(),i.getCount(),player,manager);
+			if (item == null)
 				continue;
 
 			playerIU.addRemovedItem(iteme);
-			if (item.getCount() > rewardItemCount) playerIU.addModifiedItem(item);
-			else playerIU.addNewItem(item);
+			if (item.getCount() > i.getCount())
+				playerIU.addModifiedItem(item);
+			else
+				playerIU.addNewItem(item);
 
 			// Send Char Buy Messages
 			SystemMessage sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S);
 			sm.addItemName(item);
-			sm.addItemNumber(rewardItemCount);
+			sm.addItemNumber(i.getCount());
 			player.sendPacket(sm);
 			sm = null;
 
@@ -175,6 +177,40 @@ public class RequestBuyProcure extends L2GameClientPacket {
 		player.sendPacket(su);
 	}
 
+	private class Procure
+	{
+		private final int _itemId;
+		private final long _count;
+		private int _reward;
+
+		public Procure(int id, long num)
+		{
+			_itemId = id;
+			_count = num;
+		}
+
+		public int getItemId()
+		{
+			return _itemId;
+		}
+
+		public long getCount()
+		{
+			return _count;
+		}
+
+		public int getReward()
+		{
+			return _reward;
+		}
+
+		public void setReward(Castle c)
+		{
+			_reward = L2Manor.getInstance().getRewardItem(_itemId,
+					c.getCrop(_itemId,CastleManorManager.PERIOD_CURRENT).getReward());
+		}
+	}
+
 	@Override
 	public String getType()
 	{

+ 103 - 70
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestBuySeed.java

@@ -24,7 +24,6 @@ import net.sf.l2j.gameserver.model.L2Object;
 import net.sf.l2j.gameserver.model.actor.instance.L2ManorManagerInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.model.entity.Castle;
-import net.sf.l2j.gameserver.model.itemcontainer.PcInventory;
 import net.sf.l2j.gameserver.network.SystemMessageId;
 import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
@@ -33,6 +32,9 @@ import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 import net.sf.l2j.gameserver.templates.item.L2Item;
 import net.sf.l2j.gameserver.util.Util;
 
+import static net.sf.l2j.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE;
+import static net.sf.l2j.gameserver.model.itemcontainer.PcInventory.MAX_ADENA;
+
 /**
  * Format: cdd[dd]
  * c    // id (0xC4)
@@ -53,101 +55,93 @@ public class RequestBuySeed extends L2GameClientPacket
 {
 	private static final String _C__C4_REQUESTBUYSEED = "[C] C4 RequestBuySeed";
 
-	private int _count;
+	private static final int BATCH_LENGTH = 12; // length of the one item
+
 	private int _manorId;
-	private int[] _items; // size _count * 2
+	private Seed[] _seeds = null;
 
 	@Override
 	protected void readImpl()
 	{
 		_manorId = readD();
-		_count = readD();
 
-		if (_count > 500 || _count * 12 < _buf.remaining()) // check values
+		int count = readD();
+		if (count <= 0
+				|| count > Config.MAX_ITEM_IN_PACKET
+				|| count * BATCH_LENGTH != _buf.remaining())
 		{
-			_count = 0;
 			return;
 		}
 
-		_items = new int[_count * 2];
-
-		for (int i = 0; i < _count; i++)
+		_seeds = new Seed[count];
+		for (int i = 0; i < count; i++)
 		{
-			_items[i * 2 + 0] = readD(); // itemId
+			int itemId = readD();
 			long cnt = readQ();
-			if (cnt > Integer.MAX_VALUE || cnt < 1)
+			if (cnt < 1)
 			{
-				_count = 0;
-				_items = null;
+				_seeds = null;
 				return;
 			}
-			_items[i * 2 + 1] = (int) cnt;
+			_seeds[i] = new Seed(itemId, cnt);
 		}
 	}
 
 	@Override
 	protected void runImpl()
 	{
-		long totalPrice = 0;
-		int slots = 0;
-		int totalWeight = 0;
-
 		L2PcInstance player = getClient().getActiveChar();
 		if (player == null)
 			return;
-		if (_count < 1)
+
+		if (_seeds == null)
 		{
 			sendPacket(ActionFailed.STATIC_PACKET);
 			return;
 		}
 
-		L2Object target = player.getTarget();
+		L2Object manager = player.getTarget();
 
-		if (!(target instanceof L2ManorManagerInstance))
-			target = player.getLastFolkNPC();
+		if (!(manager instanceof L2ManorManagerInstance))
+			manager = player.getLastFolkNPC();
 
-		if (!(target instanceof L2ManorManagerInstance))
+		if (!(manager instanceof L2ManorManagerInstance))
 			return;
 
-		Castle castle = CastleManager.getInstance().getCastleById(_manorId);
+		if (!player.isInsideRadius(manager, INTERACTION_DISTANCE, true, false))
+			return;
 
-		for (int i = 0; i < _count; i++)
-		{
-			int seedId = _items[i * 2 + 0];
-			long count = _items[i * 2 + 1];
-			long price = 0;
-			long residual = 0;
+		Castle castle = CastleManager.getInstance().getCastleById(_manorId);
 
-			SeedProduction seed = castle.getSeed(seedId,CastleManorManager.PERIOD_CURRENT);
-			price = seed.getPrice();
-			residual = seed.getCanProduce();
+		long totalPrice = 0;
+		int slots = 0;
+		int totalWeight = 0;
 
-			if (price <= 0)
+		for (Seed i : _seeds)
+		{
+			if (!i.setProduction(castle))
 				return;
 
-			if (residual < count)
-				return;
+			totalPrice += i.getPrice();
 
-			totalPrice += count * price;
+			if (totalPrice > MAX_ADENA)
+			{
+				Util.handleIllegalPlayerAction(player, "Warning!! Character "
+						+ player.getName() + " of account "
+						+ player.getAccountName() + " tried to purchase over "
+						+ MAX_ADENA + " adena worth of goods.",
+						Config.DEFAULT_PUNISH);
+				return;
+			}
 
-			L2Item template = ItemTable.getInstance().getTemplate(seedId);
-			totalWeight += count * template.getWeight();
+			L2Item template = ItemTable.getInstance().getTemplate(i.getSeedId());
+			totalWeight += i.getCount() * template.getWeight();
 			if (!template.isStackable())
-				slots += count;
-			else if (player.getInventory().getItemByItemId(seedId) == null)
+				slots += i.getCount();
+			else if (player.getInventory().getItemByItemId(i.getSeedId()) == null)
 				slots++;
 		}
 
-		if (totalPrice > PcInventory.MAX_ADENA)
-		{
-			Util.handleIllegalPlayerAction(player, "Warning!! Character "
-					+ player.getName() + " of account "
-					+ player.getAccountName() + " tried to purchase over "
-					+ PcInventory.MAX_ADENA + " adena worth of goods.",
-					Config.DEFAULT_PUNISH);
-			return;
-		}
-
 		if (!player.getInventory().validateWeight(totalWeight))
 		{
 			sendPacket(new SystemMessage(SystemMessageId.WEIGHT_LIMIT_EXCEEDED));
@@ -161,7 +155,7 @@ public class RequestBuySeed extends L2GameClientPacket
 		}
 
 		// Charge buyer
-		if ((totalPrice < 0) || !player.reduceAdena("Buy", totalPrice, target, false))
+		if ((totalPrice < 0) || !player.reduceAdena("Buy", totalPrice, manager, false))
 		{
 			sendPacket(new SystemMessage(SystemMessageId.YOU_NOT_ENOUGH_ADENA));
 			return;
@@ -172,27 +166,14 @@ public class RequestBuySeed extends L2GameClientPacket
 
 		// Proceed the purchase
 		InventoryUpdate playerIU = new InventoryUpdate();
-		for (int i = 0; i < _count; i++)
+		for (Seed i : _seeds)
 		{
-			int seedId = _items[i * 2 + 0];
-			int count = _items[i * 2 + 1];
-			if (count < 0)
-				count = 0;
-
-			// Update Castle Seeds Amount
-			SeedProduction seed = castle.getSeed(seedId,
-					CastleManorManager.PERIOD_CURRENT);
-			seed.setCanProduce(seed.getCanProduce() - count);
-			if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
-				CastleManager.getInstance().getCastleById(_manorId).updateSeed(
-						seed.getId(), seed.getCanProduce(),
-						CastleManorManager.PERIOD_CURRENT);
+			i.updateProduction(castle);
 
 			// Add item to Inventory and adjust update packet
-			L2ItemInstance item = player.getInventory().addItem("Buy", seedId,
-					count, player, target);
+			L2ItemInstance item = player.getInventory().addItem("Buy", i.getSeedId(), i.getCount(), player, manager);
 
-			if (item.getCount() > count)
+			if (item.getCount() > i.getCount())
 				playerIU.addModifiedItem(item);
 			else
 				playerIU.addNewItem(item);
@@ -201,7 +182,7 @@ public class RequestBuySeed extends L2GameClientPacket
 			SystemMessage sm = null;
 			sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S);
 			sm.addItemName(item);
-			sm.addItemNumber(count);
+			sm.addItemNumber(i.getCount());
 			player.sendPacket(sm);
 		}
 		// Send update packets
@@ -212,6 +193,58 @@ public class RequestBuySeed extends L2GameClientPacket
 		player.sendPacket(su);
 	}
 
+	private class Seed
+	{
+		private final int _seedId;
+		private final long _count;
+		SeedProduction _seed;
+		
+		public Seed(int id, long num)
+		{
+			_seedId = id;
+			_count = num;
+		}
+
+		public int getSeedId()
+		{
+			return _seedId;
+		}
+
+		public long getCount()
+		{
+			return _count;
+		}
+
+		public long getPrice()
+		{
+			return _seed.getPrice() * _count;
+		}
+
+		public boolean setProduction(Castle c)
+		{
+			_seed = c.getSeed(_seedId, CastleManorManager.PERIOD_CURRENT);
+			// invalid price - seed disabled
+			if (_seed.getPrice() <= 0)
+				return false;
+			// try to buy more than castle can produce 
+			if (_seed.getCanProduce() < _count)
+				return false;
+			// check for overflow
+			if ((MAX_ADENA / _count) < _seed.getPrice())
+				return false;
+
+			return true;
+		}
+
+		public void updateProduction(Castle c)
+		{
+			_seed.setCanProduce(_seed.getCanProduce() - _count);
+			// Update Castle Seeds Amount
+			if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
+				c.updateSeed(_seedId, _seed.getCanProduce(), CastleManorManager.PERIOD_CURRENT);
+		}
+	}
+
 	@Override
 	public String getType()
 	{

+ 146 - 131
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestProcureCropList.java

@@ -22,7 +22,6 @@ import net.sf.l2j.gameserver.instancemanager.CastleManorManager.CropProcure;
 import net.sf.l2j.gameserver.model.L2ItemInstance;
 import net.sf.l2j.gameserver.model.L2Manor;
 import net.sf.l2j.gameserver.model.L2Object;
-import net.sf.l2j.gameserver.model.actor.L2Npc;
 import net.sf.l2j.gameserver.model.actor.instance.L2ManorManagerInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.network.SystemMessageId;
@@ -31,7 +30,9 @@ import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 import net.sf.l2j.gameserver.templates.item.L2Item;
-import net.sf.l2j.gameserver.util.Util;
+
+import static net.sf.l2j.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE;
+import static net.sf.l2j.gameserver.model.itemcontainer.PcInventory.MAX_ADENA;
 
 /**
  * Format: (ch) d [dddd]
@@ -49,106 +50,82 @@ public class RequestProcureCropList extends L2GameClientPacket
 {
 	private static final String _C__D0_09_REQUESTPROCURECROPLIST = "[C] D0:09 RequestProcureCropList";
 
-	private int _size;
+	private static final int BATCH_LENGTH = 20; // length of the one item
 
-	private int[] _items; // count*4
+	private Crop[] _items = null;
 
 	@Override
 	protected void readImpl()
 	{
-		_size = readD();
-		if (_size * 16 > _buf.remaining() || _size > 500)
+		int count = readD();
+		if(count <= 0
+				|| count > Config.MAX_ITEM_IN_PACKET
+				|| count * BATCH_LENGTH != _buf.remaining())
 		{
-			_size = 0;
 			return;
 		}
-		_items = new int[_size * 4];
-		for (int i = 0; i < _size; i++)
+
+		_items = new Crop[count];
+		for (int i = 0; i < count; i++)
 		{
 			int objId = readD();
-			_items[i * 4 + 0] = objId;
 			int itemId = readD();
-			_items[i * 4 + 1] = itemId;
 			int manorId = readD();
-			_items[i * 4 + 2] = manorId;
-			long count = readQ();
-			if (count > Integer.MAX_VALUE) count = Integer.MAX_VALUE;
-			_items[i * 4 + 3] = (int)count;
+			long cnt = readQ();
+			if (objId < 1 || itemId < 1 || manorId < 0 || cnt < 0)
+			{
+				_items = null;
+				return;
+			}
+			_items[i] = new Crop(objId, itemId, manorId, cnt);
 		}
 	}
 
 	@Override
     protected void runImpl()
 	{
+		if (_items == null)
+			return;
+
 		L2PcInstance player = getClient().getActiveChar();
 		if (player == null)
 			return;
 
-		L2Object target = player.getTarget();
+		L2Object manager = player.getTarget();
+
+		if (!(manager instanceof L2ManorManagerInstance))
+			manager = player.getLastFolkNPC();
 
-		if (!(target instanceof L2ManorManagerInstance))
-			target = player.getLastFolkNPC();
+		if (!(manager instanceof L2ManorManagerInstance))
+			return;
 
-		if (!player.isGM()
-				&& (target == null
-						|| !(target instanceof L2ManorManagerInstance) || !player
-						.isInsideRadius(target,
-								L2Npc.INTERACTION_DISTANCE, false,
-								false)))
+		if (!player.isInsideRadius(manager, INTERACTION_DISTANCE, false, false))
 			return;
 
-		if (_size < 1)
+		if (_items == null)
 		{
 			sendPacket(ActionFailed.STATIC_PACKET);
 			return;
 		}
-		L2ManorManagerInstance manorManager = (L2ManorManagerInstance) target;
 
-		int currentManorId = manorManager.getCastle().getCastleId();
+		int castleId = ((L2ManorManagerInstance)manager).getCastle().getCastleId();
 
 		// Calculate summary values
 		int slots = 0;
 		int weight = 0;
 
-		for (int i = 0; i < _size; i++)
+		for (Crop i : _items)
 		{
-			int itemId  = _items[i * 4 + 1];
-			int manorId = _items[i * 4 + 2];
-			int count   = _items[i * 4 + 3];
-
-			if (itemId == 0 || manorId == 0 || count == 0)
-				continue;
-			if (count < 1)
+			if (!i.getCrop())
 				continue;
-			if (count > Integer.MAX_VALUE)
-			{
-				Util.handleIllegalPlayerAction(player, "Warning!! Character "
-						+ player.getName() + " of account "
-						+ player.getAccountName() + " tried to purchase over "
-						+ Integer.MAX_VALUE + " items at the same time.",
-						Config.DEFAULT_PUNISH);
-				SystemMessage sm = new SystemMessage(
-						SystemMessageId.YOU_HAVE_EXCEEDED_QUANTITY_THAT_CAN_BE_INPUTTED);
-				sendPacket(sm);
-				return;
-			}
 
-			try
-			{
-				CropProcure crop = CastleManager.getInstance().getCastleById(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;
-			}
+			L2Item template = ItemTable.getInstance().getTemplate(i.getReward());
+			weight += i.getCount() * template.getWeight();
+
+			if (!template.isStackable())
+				slots += i.getCount();
+			else if (player.getInventory().getItemByItemId(i.getItemId()) == null)
+				slots++;
 		}
 
 		if (!player.getInventory().validateWeight(weight))
@@ -166,65 +143,30 @@ public class RequestProcureCropList extends L2GameClientPacket
 		// Proceed the purchase
 		InventoryUpdate playerIU = new InventoryUpdate();
 
-		for (int i = 0; i < _size; i++)
+		for (Crop i : _items)
 		{
-			int objId   = _items[i * 4 + 0];
-			int cropId  = _items[i * 4 + 1];
-			int manorId = _items[i * 4 + 2];
-			int 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().getCastleById(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 fee = i.getFee(castleId); // fee for selling to other manors
 
-			long sellPrice = (count * crop.getPrice());
-			long rewardPrice = ItemTable.getInstance().getTemplate(rewardItem).getReferencePrice();
+			long rewardPrice = ItemTable.getInstance().getTemplate(i.getReward()).getReferencePrice();
 
 			if (rewardPrice == 0)
 				continue;
 
-			long rewardItemCount = sellPrice / rewardPrice;
+			long rewardItemCount = i.getPrice() / rewardPrice;
 			if (rewardItemCount < 1)
 			{
 				SystemMessage sm = new SystemMessage(SystemMessageId.FAILED_IN_TRADING_S2_OF_CROP_S1);
-				sm.addItemName(cropId);
-				sm.addItemNumber(count);
+				sm.addItemName(i.getItemId());
+				sm.addItemNumber(i.getCount());
 				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(SystemMessageId.FAILED_IN_TRADING_S2_OF_CROP_S1);
-				sm.addItemName(cropId);
-				sm.addItemNumber(count);
+				sm.addItemName(i.getItemId());
+				sm.addItemNumber(i.getCount());
 				player.sendPacket(sm);
 				sm = new SystemMessage(SystemMessageId.YOU_NOT_ENOUGH_ADENA);
 				player.sendPacket(sm);
@@ -234,31 +176,24 @@ public class RequestProcureCropList extends L2GameClientPacket
 			// Add item to Inventory and adjust update packet
 			L2ItemInstance itemDel = null;
 			L2ItemInstance itemAdd = null;
-			if (player.getInventory().getItemByObjectId(objId) != null)
-			{
-				// check if player have correct items count
-				L2ItemInstance item = player.getInventory().getItemByObjectId(objId);
-				if (item.getCount() < count)
-					continue;
-
-				itemDel = player.getInventory().destroyItem("Manor", objId, count, player, manorManager);
-				if (itemDel == null)
-					continue;
-				if (fee > 0)
-					player.getInventory().reduceAdena("Manor", fee, player,manorManager);
-				crop.setAmount(crop.getAmount() - count);
-				if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
-					CastleManager.getInstance().getCastleById(manorId).updateCrop(crop.getId(), crop.getAmount(), CastleManorManager.PERIOD_CURRENT);
-				itemAdd = player.getInventory().addItem("Manor", rewardItem,rewardItemCount, player, manorManager);
-			}
-			else
-			{
+
+			// check if player have correct items count
+			L2ItemInstance item = player.getInventory().getItemByObjectId(i.getObjectId());
+			if (item == null || item.getCount() < i.getCount())
 				continue;
-			}
 
-			if (itemDel == null || itemAdd == null)
+			itemDel = player.getInventory().destroyItem("Manor", i.getObjectId(), i.getCount(), player, manager);
+			if (itemDel == null)
 				continue;
 
+			if (fee > 0)
+				player.getInventory().reduceAdena("Manor", fee, player, manager);
+
+			i.setCrop();
+
+			itemAdd = player.getInventory().addItem("Manor", i.getReward(), rewardItemCount, player, manager);
+			if (itemAdd == null)
+				continue;
 
 			playerIU.addRemovedItem(itemDel);
 			if (itemAdd.getCount() > rewardItemCount)
@@ -269,8 +204,8 @@ public class RequestProcureCropList extends L2GameClientPacket
 			// Send System Messages
 			SystemMessage sm = new SystemMessage(
 					SystemMessageId.TRADED_S2_OF_CROP_S1);
-			sm.addItemName(cropId);
-			sm.addItemNumber(count);
+			sm.addItemName(i.getItemId());
+			sm.addItemNumber(i.getCount());
 			player.sendPacket(sm);
 
 			if (fee > 0)
@@ -281,8 +216,8 @@ public class RequestProcureCropList extends L2GameClientPacket
 			}
 
 			sm = new SystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
-			sm.addItemName(cropId);
-			sm.addItemNumber(count);
+			sm.addItemName(i.getItemId());
+			sm.addItemNumber(i.getCount());
 			player.sendPacket(sm);
 
 			if (fee > 0)
@@ -304,7 +239,87 @@ public class RequestProcureCropList extends L2GameClientPacket
 		StatusUpdate su = new StatusUpdate(player.getObjectId());
 		su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad());
 		player.sendPacket(su);
+	}
+
+	private class Crop
+	{
+		private final int _objectId;
+		private final int _itemId;
+		private final int _manorId;
+		private final long _count;
+		private int _reward;
+		private CropProcure _crop = null;
+		
+		public Crop(int obj, int id, int m, long num)
+		{
+			_objectId = obj;
+			_itemId = id;
+			_manorId = m;
+			_count = num;
+		}
+
+		public int getObjectId()
+		{
+			return _objectId;
+		}
 
+		public int getItemId()
+		{
+			return _itemId;
+		}
+
+		public long getCount()
+		{
+			return _count;
+		}
+
+		public int getReward()
+		{
+			return _reward;
+		}
+
+		public long getPrice()
+		{
+			return _crop.getPrice() * _count;
+		}
+
+		public long getFee(int castleId)
+		{
+			if (_manorId == castleId)
+				return 0;
+
+			return (getPrice() /100) * 5; // 5% fee for selling to other manor
+		}
+
+		public boolean getCrop()
+		{
+			try
+			{
+				_crop = CastleManager.getInstance().getCastleById(_manorId).getCrop(_itemId, CastleManorManager.PERIOD_CURRENT);
+			}
+			catch (NullPointerException e)
+			{
+				return false;
+			}
+			if (_crop == null || _crop.getId() == 0 || _crop.getPrice() == 0)
+				return false;
+
+			if (_count > _crop.getAmount())
+				return false;
+
+			if ((MAX_ADENA / _count) < _crop.getPrice())
+				return false;
+
+			_reward = L2Manor.getInstance().getRewardItem(_itemId, _crop.getReward()); 
+			return true;
+		}
+
+		public void setCrop()
+		{
+			_crop.setAmount(_crop.getAmount() - _count);
+			if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
+				CastleManager.getInstance().getCastleById(_manorId).updateCrop(_itemId, _crop.getAmount(), CastleManorManager.PERIOD_CURRENT);
+		}
 	}
 
 	@Override

+ 92 - 26
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestSetCrop.java

@@ -14,11 +14,22 @@
  */
 package net.sf.l2j.gameserver.network.clientpackets;
 
-import javolution.util.FastList;
+import java.util.ArrayList;
+import java.util.List;
+
 import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.instancemanager.CastleManager;
 import net.sf.l2j.gameserver.instancemanager.CastleManorManager;
 import net.sf.l2j.gameserver.instancemanager.CastleManorManager.CropProcure;
+import net.sf.l2j.gameserver.model.L2Clan;
+import net.sf.l2j.gameserver.model.L2Object;
+import net.sf.l2j.gameserver.model.actor.instance.L2CastleChamberlainInstance;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.model.entity.Castle;
+import net.sf.l2j.gameserver.util.Util;
+
+import static net.sf.l2j.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE;
+import static net.sf.l2j.gameserver.model.itemcontainer.PcInventory.MAX_ADENA;
 
 /**
  * Format: (ch) dd [dddc]
@@ -35,61 +46,116 @@ import net.sf.l2j.gameserver.instancemanager.CastleManorManager.CropProcure;
  */
 public class RequestSetCrop extends L2GameClientPacket {
 	private static final String _C__D0_0B_REQUESTSETCROP = "[C] D0:0B RequestSetCrop";
+	//private static Logger _log = Logger.getLogger(RequestSetCrop.class.getName());
 
-	private int _size;
+	private static final int BATCH_LENGTH = 21; // length of the one item
 
 	private int _manorId;
-
-	private long[] _items; // _size*4
+	private Crop[] _items = null;
 
 	@Override
 	protected void readImpl()
 	{
 		_manorId = readD();
-		_size = readD();
-		if (_size * 13 > _buf.remaining() || _size > 500)
+		int count = readD();
+		if (count <= 0
+				|| count > Config.MAX_ITEM_IN_PACKET
+				|| count * BATCH_LENGTH != _buf.remaining())
 		{
-			_size = 0;
 			return;
 		}
-		_items = new long[_size * 4];
-		for (int i = 0; i < _size; i++)
+
+		_items = new Crop[count];
+		for (int i = 0; i < count; i++)
 		{
 			int itemId = readD();
-			_items[i * 4 + 0] = itemId;
 			long sales = readQ();
-			_items[i * 4 + 1] = sales;
 			long price = readQ();
-			_items[i * 4 + 2] = price;
 			int type = readC();
-			_items[i * 4 + 3] = type;
+			if (itemId < 1 || sales < 0 || price < 0)
+			{
+				_items = null;
+				return;
+			}
+			_items[i] = new Crop(itemId, sales, price, type);
 		}
 	}
 
 	@Override
     protected void runImpl()
 	{
-		if (_size < 1)
+		if (_items == null)
+			return;
+
+		L2PcInstance player = getClient().getActiveChar();
+		// check player privileges
+		if (player == null
+				|| player.getClan() == null
+				|| (player.getClanPrivileges() & L2Clan.CP_CS_MANOR_ADMIN) == 0)
+			return;
+
+		// check castle owner
+		Castle currentCastle = CastleManager.getInstance().getCastleById(_manorId);
+		if (currentCastle.getOwnerId() != player.getClanId())
+			return;
+
+		L2Object manager = player.getTarget();
+
+		if (!(manager instanceof L2CastleChamberlainInstance))
+			manager = player.getLastFolkNPC();
+		
+		if (!(manager instanceof L2CastleChamberlainInstance))
 			return;
 
-		FastList<CropProcure> crops = new FastList<CropProcure>();
-		for (int i = 0; i < _size; i++)
+		if (((L2CastleChamberlainInstance)manager).getCastle() != currentCastle)
+			return;
+
+		if (!player.isInsideRadius(manager, INTERACTION_DISTANCE, true, false))
+			return;
+
+		List<CropProcure> crops = new ArrayList<CropProcure>(_items.length);
+		for (Crop i : _items)
 		{
-			int id = (int) _items[i * 4 + 0];
-			long sales = _items[i * 4 + 1];
-			long price = _items[i * 4 + 2];
-			int type = (int) _items[i * 4 + 3];
-			if (id > 0)
+			CropProcure s = i.getCrop();
+			if (s == null)
 			{
-				CropProcure s = CastleManorManager.getInstance().getNewCropProcure(id, sales, type, price, sales);
-				crops.add(s);
+				Util.handleIllegalPlayerAction(player, "Warning!! Character "
+						+ player.getName() + " of account "
+						+ player.getAccountName()
+						+ " tried to overflow while setting manor.",
+						Config.DEFAULT_PUNISH);
+				return;
 			}
+			crops.add(s);
 		}
 
-		CastleManager.getInstance().getCastleById(_manorId).setCropProcure(crops,
-				CastleManorManager.PERIOD_NEXT);
+		currentCastle.setCropProcure(crops, CastleManorManager.PERIOD_NEXT);
 		if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
-			CastleManager.getInstance().getCastleById(_manorId).saveCropData(CastleManorManager.PERIOD_NEXT);
+			currentCastle.saveCropData(CastleManorManager.PERIOD_NEXT);
+	}
+
+	private class Crop
+	{
+		private final int _itemId;
+		private final long _sales;
+		private final long _price;
+		private final int _type;
+		
+		public Crop(int id, long s, long p, int t)
+		{
+			_itemId = id;
+			_sales = s;
+			_price = p;
+			_type = t;
+		}
+
+		public CropProcure getCrop()
+		{
+			if (_sales != 0 && (MAX_ADENA / _sales) < _price)
+				return null;
+
+			return CastleManorManager.getInstance().getNewCropProcure(_itemId, _sales, _type, _price, _sales);
+		}
 	}
 
 	@Override

+ 89 - 24
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestSetSeed.java

@@ -14,12 +14,22 @@
  */
 package net.sf.l2j.gameserver.network.clientpackets;
 
-import javolution.util.FastList;
+import java.util.ArrayList;
+import java.util.List;
+
 import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.instancemanager.CastleManager;
 import net.sf.l2j.gameserver.instancemanager.CastleManorManager;
 import net.sf.l2j.gameserver.instancemanager.CastleManorManager.SeedProduction;
+import net.sf.l2j.gameserver.model.L2Clan;
+import net.sf.l2j.gameserver.model.L2Object;
+import net.sf.l2j.gameserver.model.actor.instance.L2CastleChamberlainInstance;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.model.entity.Castle;
+import net.sf.l2j.gameserver.util.Util;
 
+import static net.sf.l2j.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE;
+import static net.sf.l2j.gameserver.model.itemcontainer.PcInventory.MAX_ADENA;
 
 /**
  * Format: (ch) dd [ddd]
@@ -35,12 +45,12 @@ import net.sf.l2j.gameserver.instancemanager.CastleManorManager.SeedProduction;
  */
 public class RequestSetSeed extends L2GameClientPacket {
 	private static final String _C__D0_0A_REQUESTSETSEED = "[C] D0:0A RequestSetSeed";
+	//private static Logger _log = Logger.getLogger(RequestSetSeed.class.getName());
 
-	private int _size;
+	private static final int BATCH_LENGTH = 20; // length of the one item
 
 	private int _manorId;
-
-	private long[] _items; // _size*3
+	private Seed _items[] = null;
 
 	/**
 	 * @param buf
@@ -50,47 +60,102 @@ public class RequestSetSeed extends L2GameClientPacket {
 	protected void readImpl()
 	{
 		_manorId = readD();
-		_size = readD();
-		if (_size * 12 > _buf.remaining() || _size > 500)
+		int count = readD();
+		if (count <= 0
+				|| count > Config.MAX_ITEM_IN_PACKET
+				|| count * BATCH_LENGTH != _buf.remaining())
 		{
-			_size = 0;
 			return;
 		}
-		_items = new long[_size * 3];
-		for (int i = 0; i < _size; i++)
+
+		_items = new Seed[count];
+		for (int i = 0; i < count; i++)
 		{
 			int itemId = readD();
-			_items[i * 3 + 0] = itemId;
 			long sales = readQ();
-			_items[i * 3 + 1] = sales;
 			long price = readQ();
-			_items[i * 3 + 2] = price;
+			if (itemId < 1 || sales < 0 || price < 0)
+			{
+				_items = null;
+				return;
+			}
+			_items[i] = new Seed(itemId, sales, price);
 		}
 	}
 
 	@Override
 	protected void runImpl()
 	{
-		if (_size < 1)
+		if (_items == null)
+			return;
+
+		L2PcInstance player = getClient().getActiveChar();
+		// check player privileges
+		if (player == null
+				|| player.getClan() == null
+				|| (player.getClanPrivileges() & L2Clan.CP_CS_MANOR_ADMIN) == 0)
 			return;
 
-		FastList<SeedProduction> seeds = new FastList<SeedProduction>();
-		for (int i = 0; i < _size; i++)
+		// check castle owner
+		Castle currentCastle = CastleManager.getInstance().getCastleById(_manorId);
+		if (currentCastle.getOwnerId() != player.getClanId())
+			return;
+
+		L2Object manager = player.getTarget();
+
+		if (!(manager instanceof L2CastleChamberlainInstance))
+			manager = player.getLastFolkNPC();
+		
+		if (!(manager instanceof L2CastleChamberlainInstance))
+			return;
+
+		if (((L2CastleChamberlainInstance)manager).getCastle() != currentCastle)
+			return;
+
+		if (!player.isInsideRadius(manager, INTERACTION_DISTANCE, true, false))
+			return;
+
+		List<SeedProduction> seeds = new ArrayList<SeedProduction>(_items.length);
+		for (Seed i : _items)
 		{
-			int id = (int) _items[i * 3 + 0];
-			long sales = _items[i * 3 + 1];
-			long price = _items[i * 3 + 2];
-			if (id > 0)
+			SeedProduction s = i.getSeed();
+			if (s == null)
 			{
-				SeedProduction s = CastleManorManager.getInstance()
-						.getNewSeedProduction(id, sales, price, sales);
-				seeds.add(s);
+				Util.handleIllegalPlayerAction(player, "Warning!! Character "
+						+ player.getName() + " of account "
+						+ player.getAccountName()
+						+ " tried to overflow while setting manor.",
+						Config.DEFAULT_PUNISH);
+				return;
 			}
+			seeds.add(s);
 		}
 
-		CastleManager.getInstance().getCastleById(_manorId).setSeedProduction(seeds, CastleManorManager.PERIOD_NEXT);
+		currentCastle.setSeedProduction(seeds, CastleManorManager.PERIOD_NEXT);
 		if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
-			CastleManager.getInstance().getCastleById(_manorId).saveSeedData(CastleManorManager.PERIOD_NEXT);
+			currentCastle.saveSeedData(CastleManorManager.PERIOD_NEXT);
+	}
+
+	private class Seed
+	{
+		private final int _itemId;
+		private final long _sales;
+		private final long _price;
+		
+		public Seed(int id, long s, long p)
+		{
+			_itemId = id;
+			_sales = s;
+			_price = p;
+		}
+
+		public SeedProduction getSeed()
+		{
+			if (_sales != 0 && (MAX_ADENA / _sales) < _price)
+				return null;
+
+			return CastleManorManager.getInstance().getNewSeedProduction(_itemId, _sales, _price, _sales); 
+		}
 	}
 
 	@Override

+ 18 - 18
L2_GameServer/java/net/sf/l2j/gameserver/network/serverpackets/ExShowCropInfo.java

@@ -14,7 +14,8 @@
  */
 package net.sf.l2j.gameserver.network.serverpackets;
 
-import javolution.util.FastList;
+import java.util.List;
+
 import net.sf.l2j.gameserver.instancemanager.CastleManorManager.CropProcure;
 import net.sf.l2j.gameserver.model.L2Manor;
 
@@ -46,30 +47,31 @@ import net.sf.l2j.gameserver.model.L2Manor;
 public class ExShowCropInfo extends L2GameServerPacket
 {
 	private static final String _S__FE_1C_EXSHOWSEEDINFO = "[S] FE:24 ExShowCropInfo";
-	private FastList<CropProcure> _crops;
+	private List<CropProcure> _crops;
 	private int _manorId;
 
-    public ExShowCropInfo(int manorId, FastList<CropProcure> crops)
-    {
+	public ExShowCropInfo(int manorId, List<CropProcure> crops)
+	{
 		_manorId = manorId;
 		_crops = crops;
-		if (_crops == null)
-        {
-			_crops = new FastList<CropProcure>();
-		}
-    }
+	}
 
 	@Override
-    protected void writeImpl()
-    {
+	protected void writeImpl()
+	{
 		writeC(0xFE);     // Id
 		writeH(0x24);     // SubId
 		writeC(0);
 		writeD(_manorId); // Manor ID
 		writeD(0);
+		if (_crops == null)
+		{
+			writeD(0);
+			return;
+		}
 		writeD(_crops.size());
 		for (CropProcure crop : _crops)
-        {
+		{
 			writeD(crop.getId());          // Crop id
 			writeQ(crop.getAmount());      // Buy residual
 			writeQ(crop.getStartAmount()); // Buy
@@ -81,13 +83,11 @@ public class ExShowCropInfo extends L2GameServerPacket
 			writeC(1); // rewrad 2 Type
 			writeD(L2Manor.getInstance().getRewardItem(crop.getId(),2));    // Rewrad 2 Type Item Id
 		}
-    }
+	}
 
 	@Override
-    public String getType()
-    {
+	public String getType()
+	{
 		return _S__FE_1C_EXSHOWSEEDINFO;
-    }
-
-
+	}
 }

+ 43 - 40
L2_GameServer/java/net/sf/l2j/gameserver/network/serverpackets/ExShowSeedInfo.java

@@ -14,7 +14,8 @@
  */
 package net.sf.l2j.gameserver.network.serverpackets;
 
-import javolution.util.FastList;
+import java.util.List;
+
 import net.sf.l2j.gameserver.instancemanager.CastleManorManager.SeedProduction;
 import net.sf.l2j.gameserver.model.L2Manor;
 
@@ -42,47 +43,49 @@ import net.sf.l2j.gameserver.model.L2Manor;
  *
  * @author l3x
  */
-public class ExShowSeedInfo extends L2GameServerPacket {
+public class ExShowSeedInfo extends L2GameServerPacket
+{
 	private static final String _S__FE_1C_EXSHOWSEEDINFO = "[S] FE:23 ExShowSeedInfo";
-    private FastList<SeedProduction> _seeds;
-    private int _manorId;
+	private List<SeedProduction> _seeds;
+	private int _manorId;
 
-    public ExShowSeedInfo(int manorId, FastList<SeedProduction> seeds)
-    {
-        _manorId = manorId;
-        _seeds = seeds;
-        if (_seeds == null)
-        {
-            _seeds = new FastList<SeedProduction>();
-        }
-    }
+	public ExShowSeedInfo(int manorId, List<SeedProduction> seeds)
+	{
+		_manorId = manorId;
+		_seeds = seeds;
+	}
 
-    @Override
-    protected void writeImpl()
-    {
-        writeC(0xFE); // Id
-        writeH(0x23); // SubId
-        writeC(0);
-        writeD(_manorId); // Manor ID
-        writeD(0);
-        writeD(_seeds.size());
-        for (SeedProduction seed : _seeds)
-        {
-        	 writeD(seed.getId()); // Seed id
-             writeQ(seed.getCanProduce()); // Left to buy
-             writeQ(seed.getStartProduce()); // Started amount
-             writeQ(seed.getPrice());        // Sell Price
-             writeD(L2Manor.getInstance().getSeedLevel(seed.getId())); // Seed Level
-             writeC(1); // reward 1 Type
-             writeD(L2Manor.getInstance().getRewardItemBySeed(seed.getId(),1)); // Reward 1 Type Item Id
-             writeC(1); // reward 2 Type
-             writeD(L2Manor.getInstance().getRewardItemBySeed(seed.getId(),2)); // Reward 2 Type Item Id
-        }
-    }
+	@Override
+	protected void writeImpl()
+	{
+		writeC(0xFE); // Id
+		writeH(0x23); // SubId
+		writeC(0);
+		writeD(_manorId); // Manor ID
+		writeD(0);
+		if (_seeds == null)
+		{
+			writeD(0);
+			return;
+		}
+		writeD(_seeds.size());
+		for (SeedProduction seed : _seeds)
+		{
+			writeD(seed.getId()); // Seed id
+			writeQ(seed.getCanProduce()); // Left to buy
+			writeQ(seed.getStartProduce()); // Started amount
+			writeQ(seed.getPrice());        // Sell Price
+			writeD(L2Manor.getInstance().getSeedLevel(seed.getId())); // Seed Level
+			writeC(1); // reward 1 Type
+			writeD(L2Manor.getInstance().getRewardItemBySeed(seed.getId(),1)); // Reward 1 Type Item Id
+			writeC(1); // reward 2 Type
+			writeD(L2Manor.getInstance().getRewardItemBySeed(seed.getId(),2)); // Reward 2 Type Item Id
+		}
+	}
 
-    @Override
-    public String getType()
-    {
-        return _S__FE_1C_EXSHOWSEEDINFO;
-    }
+	@Override
+	public String getType()
+	{
+		return _S__FE_1C_EXSHOWSEEDINFO;
+	}
 }

+ 82 - 87
L2_GameServer/java/net/sf/l2j/gameserver/network/serverpackets/ExShowSellCropList.java

@@ -15,6 +15,8 @@
 
 package net.sf.l2j.gameserver.network.serverpackets;
 
+import java.util.List;
+
 import javolution.util.FastList;
 import javolution.util.FastMap;
 import net.sf.l2j.gameserver.instancemanager.CastleManorManager.CropProcure;
@@ -34,91 +36,84 @@ import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 
 public class ExShowSellCropList extends L2GameServerPacket
 {
-    private static final String _S__FE_21_EXSHOWSELLCROPLIST = "[S] FE:2c ExShowSellCropList";
-    
-    private int _manorId = 1;
-    
-    private FastMap<Integer, L2ItemInstance> _cropsItems;
-    
-    private FastMap<Integer, CropProcure> _castleCrops;
-    
-    public ExShowSellCropList(L2PcInstance player, int manorId,
-            FastList<CropProcure> crops)
-    {
-        _manorId = manorId;
-        _castleCrops = new FastMap<Integer, CropProcure>();
-        _cropsItems = new FastMap<Integer, L2ItemInstance>();
-        
-        FastList<Integer> allCrops = L2Manor.getInstance().getAllCrops();
-        for (int cropId : allCrops)
-        {
-            L2ItemInstance item = player.getInventory().getItemByItemId(cropId);
-            if (item != null)
-            {
-                _cropsItems.put(cropId, item);
-            }
-        }
-        
-        for (CropProcure crop : crops)
-        {
-            if (_cropsItems.containsKey(crop.getId()) && crop.getAmount() > 0)
-            {
-                _castleCrops.put(crop.getId(), crop);
-            }
-        }
-        
-    }
-    
-    @Override
-    public void runImpl()
-    {
-        // no long running
-    }
-    
-    @Override
-    public void writeImpl()
-    {
-        writeC(0xFE);
-        writeH(0x2c);
-        
-        writeD(_manorId); // manor id
-        writeD(_cropsItems.size()); // size
-        
-        for (L2ItemInstance item : _cropsItems.values())
-        {
-            writeD(item.getObjectId()); // Object id
-            writeD(item.getItemId()); // crop id
-            writeD(L2Manor.getInstance().getSeedLevelByCrop(item.getItemId())); // seed
-                                                                                // level
-            writeC(1);
-            writeD(L2Manor.getInstance().getRewardItem(item.getItemId(), 1)); // reward
-                                                                                // 1 id
-            writeC(1);
-            writeD(L2Manor.getInstance().getRewardItem(item.getItemId(), 2)); // reward
-                                                                                // 2 id
-            
-            if (_castleCrops.containsKey(item.getItemId()))
-            {
-                CropProcure crop = _castleCrops.get(item.getItemId());
-                writeD(_manorId); // manor
-                writeQ(crop.getAmount()); // buy residual
-                writeQ(crop.getPrice()); // buy price
-                writeC(crop.getReward()); // reward
-            }
-            else
-            {
-                writeD(0xFFFFFFFF); // manor
-                writeQ(0); // buy residual
-                writeQ(0); // buy price
-                writeC(0); // reward
-            }
-            writeQ(item.getCount()); // my crops
-        }
-    }
-    
-    @Override
-    public String getType()
-    {
-        return _S__FE_21_EXSHOWSELLCROPLIST;
-    }
+	private static final String _S__FE_21_EXSHOWSELLCROPLIST = "[S] FE:2c ExShowSellCropList";
+
+	private int _manorId = 1;
+	private final FastMap<Integer, L2ItemInstance> _cropsItems;
+	private final FastMap<Integer, CropProcure> _castleCrops;
+
+	public ExShowSellCropList(L2PcInstance player, int manorId, List<CropProcure> crops)
+	{
+		_manorId = manorId;
+		_castleCrops = new FastMap<Integer, CropProcure>();
+		_cropsItems = new FastMap<Integer, L2ItemInstance>();
+
+		FastList<Integer> allCrops = L2Manor.getInstance().getAllCrops();
+		for (int cropId : allCrops)
+		{
+			L2ItemInstance item = player.getInventory().getItemByItemId(cropId);
+			if (item != null)
+			{
+				_cropsItems.put(cropId, item);
+			}
+		}
+
+		for (CropProcure crop : crops)
+		{
+			if (_cropsItems.containsKey(crop.getId()) && crop.getAmount() > 0)
+			{
+				_castleCrops.put(crop.getId(), crop);
+			}
+		}
+	}
+
+	@Override
+	public void runImpl()
+	{
+		// no long running
+	}
+
+	@Override
+	public void writeImpl()
+	{
+		writeC(0xFE);
+		writeH(0x2c);
+
+		writeD(_manorId); // manor id
+		writeD(_cropsItems.size()); // size
+
+		for (L2ItemInstance item : _cropsItems.values())
+		{
+			writeD(item.getObjectId()); // Object id
+			writeD(item.getItemId()); // crop id
+			writeD(L2Manor.getInstance().getSeedLevelByCrop(item.getItemId())); // seed level
+			writeC(1);
+			writeD(L2Manor.getInstance().getRewardItem(item.getItemId(), 1)); // reward 1 id
+			writeC(1);
+			writeD(L2Manor.getInstance().getRewardItem(item.getItemId(), 2)); // reward 2 id
+
+			if (_castleCrops.containsKey(item.getItemId()))
+			{
+				CropProcure crop = _castleCrops.get(item.getItemId());
+				writeD(_manorId); // manor
+				writeQ(crop.getAmount()); // buy residual
+				writeQ(crop.getPrice()); // buy price
+				writeC(crop.getReward()); // reward
+			}
+			else
+			{
+				writeD(0xFFFFFFFF); // manor
+				writeQ(0); // buy residual
+				writeQ(0); // buy price
+				writeC(0); // reward
+			}
+			writeQ(item.getCount()); // my crops
+		}
+	}
+
+	@Override
+	public String getType()
+	{
+		return _S__FE_21_EXSHOWSELLCROPLIST;
+	}
 }