Ver código fonte

BETA : Rework Manor System
* Manor system:
* Merged ManorData and CastleManorManager
* Moved manor related logic from Castle to CastleManorManager
* Removed CastleUpdater class
* Changed manor approve time from 6:00 to 4:30
* Replaced ManorManager bypass handler with OnNpcManorBypass listener
* Moved L2ManorManagerInstance to DP
* Other:
* Removed questEvents holder from L2Item
* Fixed bug in CastleMercenaryManager AI
* Updated method L2Character#isInsidePeaceZone
* Changed ZoneId (enum) to use ordinal values instead of ID

Patch by: malyelfik
Reviewed by: UnAfraid, Zealar
Tested by: Zealar

Zealar 10 anos atrás
pai
commit
fbd6eb6b02
42 arquivos alterados com 1456 adições e 2325 exclusões
  1. 9 9
      L2J_Server_BETA/dist/game/config/General.properties
  2. 4 4
      L2J_Server_BETA/java/com/l2jserver/Config.java
  3. 0 77
      L2J_Server_BETA/java/com/l2jserver/gameserver/CastleUpdater.java
  4. 0 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java
  5. 6 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/Shutdown.java
  6. 0 347
      L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ManorData.java
  7. 0 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/enums/InstanceType.java
  8. 30 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/enums/ManorMode.java
  9. 620 315
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/CastleManorManager.java
  10. 7 49
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/CropProcure.java
  11. 51 12
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Seed.java
  12. 35 25
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/SeedProduction.java
  13. 52 72
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Attackable.java
  14. 6 28
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java
  15. 9 64
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Npc.java
  16. 0 58
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ManorManagerInstance.java
  17. 6 391
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Castle.java
  18. 2 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/EventType.java
  19. 76 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/impl/character/npc/OnNpcManorBypass.java
  20. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/holders/UniqueItemHolder.java
  21. 29 28
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java
  22. 1 17
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/L2Item.java
  23. 23 35
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/ZoneId.java
  24. 3 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/SystemMessageId.java
  25. 65 119
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestBuySeed.java
  26. 8 21
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java
  27. 2 25
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestManorList.java
  28. 87 151
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestProcureCropList.java
  29. 33 71
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSetCrop.java
  30. 31 67
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSetSeed.java
  31. 14 34
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/BuyListSeed.java
  32. 11 14
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExSendManorList.java
  33. 27 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowCropInfo.java
  34. 60 63
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowCropSetting.java
  35. 19 22
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowManorDefaultInfo.java
  36. 5 7
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowProcureCropDetail.java
  37. 30 13
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowSeedInfo.java
  38. 56 56
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowSeedSetting.java
  39. 21 27
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowSellCropList.java
  40. 5 14
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/SellListProcure.java
  41. 9 50
      L2J_Server_BETA/java/com/l2jserver/gameserver/util/HtmlUtil.java
  42. 3 19
      L2J_Server_BETA/java/com/l2jserver/util/StringUtil.java

+ 9 - 9
L2J_Server_BETA/dist/game/config/General.properties

@@ -656,24 +656,24 @@ AltManorRefreshTime = 20
 AltManorRefreshMin = 00
 
 # Manor period approve time in military hours.
-# Default: 6 (6am)
-AltManorApproveTime = 6
+# Default: 4 (4am)
+AltManorApproveTime = 4
 
 # Manor period approve time (minutes).
-# Default: 00 (start of the hour)
-AltManorApproveMin = 00
+# Default: 30
+AltManorApproveMin = 30
 
-# Manor maintenance time.
-# Default: 360000 (6 minutes)
-AltManorMaintenancePeriod = 360000
+# Manor maintenance time (minutes).
+# Default: 6
+AltManorMaintenanceMin = 6
 
 # Manor Save Type.
 # True = Save data into the database after every action
 # Default: False
 AltManorSaveAllActions = False
 
-# Manor Save Period (used only if AltManorSaveAllActions = False) Default very 2 hours
-# Default: 2
+# Manor Save Period (used only if AltManorSaveAllActions = False)
+# Default: 2 (hour)
 AltManorSavePeriodRate = 2
 
 

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/Config.java

@@ -603,7 +603,7 @@ public final class Config
 	public static int ALT_MANOR_REFRESH_MIN;
 	public static int ALT_MANOR_APPROVE_TIME;
 	public static int ALT_MANOR_APPROVE_MIN;
-	public static int ALT_MANOR_MAINTENANCE_PERIOD;
+	public static int ALT_MANOR_MAINTENANCE_MIN;
 	public static boolean ALT_MANOR_SAVE_ALL_ACTIONS;
 	public static int ALT_MANOR_SAVE_PERIOD_RATE;
 	public static long ALT_LOTTERY_PRIZE;
@@ -1923,9 +1923,9 @@ public final class Config
 			}
 			ALT_MANOR_REFRESH_TIME = General.getInt("AltManorRefreshTime", 20);
 			ALT_MANOR_REFRESH_MIN = General.getInt("AltManorRefreshMin", 0);
-			ALT_MANOR_APPROVE_TIME = General.getInt("AltManorApproveTime", 6);
-			ALT_MANOR_APPROVE_MIN = General.getInt("AltManorApproveMin", 0);
-			ALT_MANOR_MAINTENANCE_PERIOD = General.getInt("AltManorMaintenancePeriod", 360000);
+			ALT_MANOR_APPROVE_TIME = General.getInt("AltManorApproveTime", 4);
+			ALT_MANOR_APPROVE_MIN = General.getInt("AltManorApproveMin", 30);
+			ALT_MANOR_MAINTENANCE_MIN = General.getInt("AltManorMaintenanceMin", 6);
 			ALT_MANOR_SAVE_ALL_ACTIONS = General.getBoolean("AltManorSaveAllActions", false);
 			ALT_MANOR_SAVE_PERIOD_RATE = General.getInt("AltManorSavePeriodRate", 2);
 			ALT_LOTTERY_PRIZE = General.getLong("AltLotteryPrize", 50000);

+ 0 - 77
L2J_Server_BETA/java/com/l2jserver/gameserver/CastleUpdater.java

@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2004-2014 L2J Server
- * 
- * This file is part of L2J Server.
- * 
- * L2J Server is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * 
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import com.l2jserver.Config;
-import com.l2jserver.gameserver.instancemanager.CastleManager;
-import com.l2jserver.gameserver.model.L2Clan;
-import com.l2jserver.gameserver.model.entity.Castle;
-import com.l2jserver.gameserver.model.itemcontainer.ItemContainer;
-
-/**
- * Class managing periodical events with castle
- * @author Thorgrim - 2005
- */
-public class CastleUpdater implements Runnable
-{
-	protected static final Logger _log = Logger.getLogger(CastleUpdater.class.getName());
-	private final L2Clan _clan;
-	private int _runCount = 0;
-	
-	public CastleUpdater(L2Clan clan, int runCount)
-	{
-		_clan = clan;
-		_runCount = runCount;
-	}
-	
-	@Override
-	public void run()
-	{
-		try
-		{
-			// Move current castle treasury to clan warehouse every 2 hour
-			ItemContainer warehouse = _clan.getWarehouse();
-			if ((warehouse != null) && (_clan.getCastleId() > 0))
-			{
-				Castle castle = CastleManager.getInstance().getCastleById(_clan.getCastleId());
-				if (!Config.ALT_MANOR_SAVE_ALL_ACTIONS)
-				{
-					if ((_runCount % Config.ALT_MANOR_SAVE_PERIOD_RATE) == 0)
-					{
-						castle.saveSeedData();
-						castle.saveCropData();
-						if (Config.DEBUG)
-						{
-							_log.info("Manor System: all data for " + castle.getName() + " saved");
-						}
-					}
-				}
-				CastleUpdater cu = new CastleUpdater(_clan, ++_runCount);
-				ThreadPoolManager.getInstance().scheduleGeneral(cu, 3600000);
-			}
-		}
-		catch (Exception e)
-		{
-			_log.log(Level.WARNING, "", e);
-		}
-	}
-}

+ 0 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java

@@ -67,7 +67,6 @@ import com.l2jserver.gameserver.datatables.InitialEquipmentData;
 import com.l2jserver.gameserver.datatables.InitialShortcutData;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.KarmaData;
-import com.l2jserver.gameserver.datatables.ManorData;
 import com.l2jserver.gameserver.datatables.MerchantPriceConfigTable;
 import com.l2jserver.gameserver.datatables.MultisellData;
 import com.l2jserver.gameserver.datatables.NpcBufferTable;
@@ -295,7 +294,6 @@ public class GameServer
 		TerritoryWarManager.getInstance();
 		CastleManorManager.getInstance();
 		MercTicketManager.getInstance();
-		ManorData.getInstance();
 		
 		printSection("Olympiad");
 		Olympiad.getInstance();

+ 6 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/Shutdown.java

@@ -549,8 +549,11 @@ public class Shutdown extends Thread
 		_log.info("Cursed Weapons Manager: Data saved(" + tc.getEstimatedTimeAndRestartCounter() + "ms).");
 		
 		// Save all manor data
-		CastleManorManager.getInstance().save();
-		_log.info("Castle Manor Manager: Data saved(" + tc.getEstimatedTimeAndRestartCounter() + "ms).");
+		if (!Config.ALT_MANOR_SAVE_ALL_ACTIONS)
+		{
+			CastleManorManager.getInstance().storeMe();
+			_log.info("Castle Manor Manager: Data saved(" + tc.getEstimatedTimeAndRestartCounter() + "ms).");
+		}
 		
 		CHSiegeManager.getInstance().onServerShutDown();
 		_log.info("CHSiegeManager: Siegable hall attacker lists saved!");
@@ -581,8 +584,7 @@ public class Shutdown extends Thread
 		
 		try
 		{
-			int delay = 5000;
-			Thread.sleep(delay);
+			Thread.sleep(5000);
 		}
 		catch (InterruptedException e)
 		{

+ 0 - 347
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ManorData.java

@@ -1,347 +0,0 @@
-/*
- * Copyright (C) 2004-2014 L2J Server
- * 
- * This file is part of L2J Server.
- * 
- * L2J Server is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * 
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver.datatables;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import com.l2jserver.gameserver.engines.DocumentParser;
-import com.l2jserver.gameserver.model.L2Seed;
-import com.l2jserver.gameserver.model.StatsSet;
-import com.l2jserver.gameserver.model.items.L2Item;
-
-/**
- * Service class for manor
- * @author l3x, UnAfraid
- */
-public class ManorData extends DocumentParser
-{
-	private static Logger _log = Logger.getLogger(ManorData.class.getName());
-	
-	private static Map<Integer, L2Seed> _seeds = new HashMap<>();
-	
-	protected ManorData()
-	{
-		load();
-	}
-	
-	@Override
-	public void load()
-	{
-		_seeds.clear();
-		parseDatapackFile("data/seeds.xml");
-		_log.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _seeds.size() + " seeds.");
-	}
-	
-	@Override
-	protected void parseDocument()
-	{
-		StatsSet set;
-		NamedNodeMap attrs;
-		Node att;
-		int castleId;
-		for (Node n = getCurrentDocument().getFirstChild(); n != null; n = n.getNextSibling())
-		{
-			if ("list".equalsIgnoreCase(n.getNodeName()))
-			{
-				for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
-				{
-					if ("castle".equalsIgnoreCase(d.getNodeName()))
-					{
-						castleId = parseInteger(d.getAttributes(), "id");
-						for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
-						{
-							if ("crop".equalsIgnoreCase(c.getNodeName()))
-							{
-								set = new StatsSet();
-								set.set("castleId", castleId);
-								
-								attrs = c.getAttributes();
-								for (int i = 0; i < attrs.getLength(); i++)
-								{
-									att = attrs.item(i);
-									set.set(att.getNodeName(), att.getNodeValue());
-								}
-								
-								L2Seed seed = new L2Seed(set);
-								_seeds.put(seed.getSeedId(), seed);
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	
-	public List<Integer> getAllCrops()
-	{
-		List<Integer> crops = new ArrayList<>();
-		
-		for (L2Seed seed : _seeds.values())
-		{
-			if (!crops.contains(seed.getCropId()) && (seed.getCropId() != 0) && !crops.contains(seed.getCropId()))
-			{
-				crops.add(seed.getCropId());
-			}
-		}
-		
-		return crops;
-	}
-	
-	public int getSeedBasicPrice(int seedId)
-	{
-		final L2Item seedItem = ItemTable.getInstance().getTemplate(seedId);
-		if (seedItem != null)
-		{
-			return seedItem.getReferencePrice();
-		}
-		return 0;
-	}
-	
-	public int getSeedBasicPriceByCrop(int cropId)
-	{
-		for (L2Seed seed : _seeds.values())
-		{
-			if (seed.getCropId() == cropId)
-			{
-				return getSeedBasicPrice(seed.getSeedId());
-			}
-		}
-		return 0;
-	}
-	
-	public int getCropBasicPrice(int cropId)
-	{
-		final L2Item cropItem = ItemTable.getInstance().getTemplate(cropId);
-		if (cropItem != null)
-		{
-			return cropItem.getReferencePrice();
-		}
-		return 0;
-	}
-	
-	public int getMatureCrop(int cropId)
-	{
-		for (L2Seed seed : _seeds.values())
-		{
-			if (seed.getCropId() == cropId)
-			{
-				return seed.getMatureId();
-			}
-		}
-		return 0;
-	}
-	
-	/**
-	 * Returns price which lord pays to buy one seed
-	 * @param seedId
-	 * @return seed price
-	 */
-	public long getSeedBuyPrice(int seedId)
-	{
-		long buyPrice = getSeedBasicPrice(seedId);
-		return (buyPrice > 0 ? buyPrice : 1);
-	}
-	
-	public int getSeedMinLevel(int seedId)
-	{
-		L2Seed seed = _seeds.get(seedId);
-		
-		if (seed != null)
-		{
-			return seed.getLevel() - 5;
-		}
-		return -1;
-	}
-	
-	public int getSeedMaxLevel(int seedId)
-	{
-		L2Seed seed = _seeds.get(seedId);
-		
-		if (seed != null)
-		{
-			return seed.getLevel() + 5;
-		}
-		return -1;
-	}
-	
-	public int getSeedLevelByCrop(int cropId)
-	{
-		for (L2Seed seed : _seeds.values())
-		{
-			if (seed.getCropId() == cropId)
-			{
-				return seed.getLevel();
-			}
-		}
-		return 0;
-	}
-	
-	public int getSeedLevel(int seedId)
-	{
-		L2Seed seed = _seeds.get(seedId);
-		
-		if (seed != null)
-		{
-			return seed.getLevel();
-		}
-		return -1;
-	}
-	
-	public boolean isAlternative(int seedId)
-	{
-		L2Seed seed = _seeds.get(seedId);
-		
-		if (seed != null)
-		{
-			return seed.isAlternative();
-		}
-		return false;
-	}
-	
-	public int getCropType(int seedId)
-	{
-		L2Seed seed = _seeds.get(seedId);
-		
-		if (seed != null)
-		{
-			return seed.getCropId();
-		}
-		return -1;
-	}
-	
-	public int getRewardItem(int cropId, int type)
-	{
-		for (L2Seed seed : _seeds.values())
-		{
-			if (seed.getCropId() == cropId)
-			{
-				return seed.getReward(type); // there can be several seeds with same crop, but reward should be the same for all.
-			}
-		}
-		return -1;
-	}
-	
-	public int getRewardItemBySeed(int seedId, int type)
-	{
-		L2Seed seed = _seeds.get(seedId);
-		
-		if (seed != null)
-		{
-			return seed.getReward(type);
-		}
-		return 0;
-	}
-	
-	/**
-	 * Return all crops which can be purchased by given castle
-	 * @param castleId
-	 * @return
-	 */
-	public List<Integer> getCropsForCastle(int castleId)
-	{
-		List<Integer> crops = new ArrayList<>();
-		
-		for (L2Seed seed : _seeds.values())
-		{
-			if ((seed.getCastleId() == castleId) && !crops.contains(seed.getCropId()))
-			{
-				crops.add(seed.getCropId());
-			}
-		}
-		
-		return crops;
-	}
-	
-	/**
-	 * Return list of seed ids, which belongs to castle with given id
-	 * @param castleId - id of the castle
-	 * @return seedIds - list of seed ids
-	 */
-	public List<Integer> getSeedsForCastle(int castleId)
-	{
-		List<Integer> seedsID = new ArrayList<>();
-		
-		for (L2Seed seed : _seeds.values())
-		{
-			if ((seed.getCastleId() == castleId) && !seedsID.contains(seed.getSeedId()))
-			{
-				seedsID.add(seed.getSeedId());
-			}
-		}
-		
-		return seedsID;
-	}
-	
-	/**
-	 * Returns castle id where seed can be sowned<br>
-	 * @param seedId
-	 * @return castleId
-	 */
-	public int getCastleIdForSeed(int seedId)
-	{
-		L2Seed seed = _seeds.get(seedId);
-		
-		if (seed != null)
-		{
-			return seed.getCastleId();
-		}
-		return 0;
-	}
-	
-	public int getSeedSaleLimit(int seedId)
-	{
-		L2Seed seed = _seeds.get(seedId);
-		
-		if (seed != null)
-		{
-			return seed.getSeedLimit();
-		}
-		return 0;
-	}
-	
-	public int getCropPuchaseLimit(int cropId)
-	{
-		for (L2Seed seed : _seeds.values())
-		{
-			if (seed.getCropId() == cropId)
-			{
-				return seed.getCropLimit();
-			}
-		}
-		return 0;
-	}
-	
-	public static ManorData getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
-	private static class SingletonHolder
-	{
-		protected static final ManorData _instance = new ManorData();
-	}
-}

+ 0 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/enums/InstanceType.java

@@ -91,7 +91,6 @@ public enum InstanceType
 	L2AuctioneerInstance(L2Npc),
 	L2ClanHallManagerInstance(L2MerchantInstance),
 	L2FishermanInstance(L2MerchantInstance),
-	L2ManorManagerInstance(L2MerchantInstance),
 	L2ObservationInstance(L2Npc),
 	L2OlympiadManagerInstance(L2Npc),
 	L2PetManagerInstance(L2MerchantInstance),

+ 30 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/enums/ManorMode.java

@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2004-2014 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.enums;
+
+/**
+ * @author malyelfik
+ */
+public enum ManorMode
+{
+	DISABLED,
+	MODIFIABLE,
+	MAINTENANCE,
+	APPROVED
+}

Diferenças do arquivo suprimidas por serem muito extensas
+ 620 - 315
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/CastleManorManager.java


+ 7 - 49
L2J_Server_BETA/java/com/l2jserver/gameserver/model/CropProcure.java

@@ -19,62 +19,20 @@
 package com.l2jserver.gameserver.model;
 
 /**
- * @author xban1x
+ * @author malyelfik
  */
-public final class CropProcure
+public final class CropProcure extends SeedProduction
 {
-	final int _cropId;
-	long _buyResidual;
-	final int _rewardType;
-	final long _buy;
-	final long _price;
+	private final int _rewardType;
 	
-	public CropProcure(int id)
+	public CropProcure(int id, long amount, int type, long startAmount, long price)
 	{
-		_cropId = id;
-		_buyResidual = 0;
-		_rewardType = 0;
-		_buy = 0;
-		_price = 0;
-	}
-	
-	public CropProcure(int id, long amount, int type, long buy, long price)
-	{
-		_cropId = id;
-		_buyResidual = amount;
+		super(id, amount, price, startAmount);
 		_rewardType = type;
-		_buy = buy;
-		_price = price;
 	}
 	
-	public int getReward()
+	public final int getReward()
 	{
 		return _rewardType;
 	}
-	
-	public int getId()
-	{
-		return _cropId;
-	}
-	
-	public long getAmount()
-	{
-		return _buyResidual;
-	}
-	
-	public long getStartAmount()
-	{
-		return _buy;
-	}
-	
-	public long getPrice()
-	{
-		return _price;
-	}
-	
-	public void setAmount(long amount)
-	{
-		_buyResidual = amount;
-	}
-	
-}
+}

+ 51 - 12
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Seed.java

@@ -19,8 +19,10 @@
 package com.l2jserver.gameserver.model;
 
 import com.l2jserver.Config;
+import com.l2jserver.gameserver.datatables.ItemTable;
+import com.l2jserver.gameserver.model.items.L2Item;
 
-public class L2Seed
+public final class L2Seed
 {
 	private final int _seedId;
 	private final int _cropId; // crop type
@@ -32,6 +34,8 @@ public class L2Seed
 	private final boolean _isAlternative;
 	private final int _limitSeeds;
 	private final int _limitCrops;
+	private final int _seedReferencePrice;
+	private final int _cropReferencePrice;
 	
 	public L2Seed(StatsSet set)
 	{
@@ -45,55 +49,90 @@ public class L2Seed
 		_isAlternative = set.getBoolean("alternative");
 		_limitCrops = set.getInt("limit_crops");
 		_limitSeeds = set.getInt("limit_seed");
+		// Set prices
+		L2Item item = ItemTable.getInstance().getTemplate(_cropId);
+		_cropReferencePrice = (item != null) ? item.getReferencePrice() : 1;
+		item = ItemTable.getInstance().getTemplate(_seedId);
+		_seedReferencePrice = (item != null) ? item.getReferencePrice() : 1;
 	}
 	
-	public int getCastleId()
+	public final int getCastleId()
 	{
 		return _castleId;
 	}
 	
-	public int getSeedId()
+	public final int getSeedId()
 	{
 		return _seedId;
 	}
 	
-	public int getCropId()
+	public final int getCropId()
 	{
 		return _cropId;
 	}
 	
-	public int getMatureId()
+	public final int getMatureId()
 	{
 		return _matureId;
 	}
 	
-	public int getReward(int type)
+	public final int getReward(int type)
 	{
-		return (type == 1 ? _reward1 : _reward2);
+		return (type == 1) ? _reward1 : _reward2;
 	}
 	
-	public int getLevel()
+	public final int getLevel()
 	{
 		return _level;
 	}
 	
-	public boolean isAlternative()
+	public final boolean isAlternative()
 	{
 		return _isAlternative;
 	}
 	
-	public int getSeedLimit()
+	public final int getSeedLimit()
 	{
 		return _limitSeeds * Config.RATE_DROP_MANOR;
 	}
 	
-	public int getCropLimit()
+	public final int getCropLimit()
 	{
 		return _limitCrops * Config.RATE_DROP_MANOR;
 	}
 	
+	public final int getSeedReferencePrice()
+	{
+		return _seedReferencePrice;
+	}
+	
+	public final int getSeedMaxPrice()
+	{
+		return _seedReferencePrice * 10;
+	}
+	
+	public final int getSeedMinPrice()
+	{
+		return (int) (_seedReferencePrice * 0.6);
+	}
+	
+	public final int getCropReferencePrice()
+	{
+		return _cropReferencePrice;
+	}
+	
+	public final int getCropMaxPrice()
+	{
+		return _cropReferencePrice * 10;
+	}
+	
+	public final int getCropMinPrice()
+	{
+		return (int) (_cropReferencePrice * 0.6);
+	}
+	
 	@Override
-	public String toString()
+	public final String toString()
 	{
 		return "SeedData [_id=" + _seedId + ", _level=" + _level + ", _crop=" + _cropId + ", _mature=" + _matureId + ", _type1=" + _reward1 + ", _type2=" + _reward2 + ", _manorId=" + _castleId + ", _isAlternative=" + _isAlternative + ", _limitSeeds=" + _limitSeeds + ", _limitCrops=" + _limitCrops + "]";
 	}

+ 35 - 25
L2J_Server_BETA/java/com/l2jserver/gameserver/model/SeedProduction.java

@@ -18,54 +18,64 @@
  */
 package com.l2jserver.gameserver.model;
 
+import java.util.concurrent.atomic.AtomicLong;
+
 /**
  * @author xban1x
  */
-public final class SeedProduction
+public class SeedProduction
 {
-	final int _seedId;
-	long _residual;
-	final long _price;
-	final long _sales;
-	
-	public SeedProduction(int id)
-	{
-		_seedId = id;
-		_residual = 0;
-		_price = 0;
-		_sales = 0;
-	}
+	private final int _seedId;
+	private final long _price;
+	private final long _startAmount;
+	private final AtomicLong _amount;
 	
-	public SeedProduction(int id, long amount, long price, long sales)
+	public SeedProduction(int id, long amount, long price, long startAmount)
 	{
 		_seedId = id;
-		_residual = amount;
+		_amount = new AtomicLong(amount);
 		_price = price;
-		_sales = sales;
+		_startAmount = startAmount;
 	}
 	
-	public int getId()
+	public final int getId()
 	{
 		return _seedId;
 	}
 	
-	public long getCanProduce()
+	public final long getAmount()
 	{
-		return _residual;
+		return _amount.get();
 	}
 	
-	public long getPrice()
+	public final long getPrice()
 	{
 		return _price;
 	}
 	
-	public long getStartProduce()
+	public final long getStartAmount()
+	{
+		return _startAmount;
+	}
+	
+	public final void setAmount(long amount)
 	{
-		return _sales;
+		_amount.set(amount);
 	}
 	
-	public void setCanProduce(long amount)
+	public final boolean decreaseAmount(long val)
 	{
-		_residual = amount;
+		long current, next;
+		do
+		{
+			current = _amount.get();
+			next = current - val;
+			if (next < 0)
+			{
+				return false;
+			}
+		}
+		while (!_amount.compareAndSet(current, next));
+		return true;
 	}
-}
+}

+ 52 - 72
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Attackable.java

@@ -21,7 +21,6 @@ package com.l2jserver.gameserver.model.actor;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Level;
 
@@ -36,7 +35,6 @@ import com.l2jserver.gameserver.ai.L2SiegeGuardAI;
 import com.l2jserver.gameserver.datatables.EventDroplist;
 import com.l2jserver.gameserver.datatables.EventDroplist.DateDrop;
 import com.l2jserver.gameserver.datatables.ItemTable;
-import com.l2jserver.gameserver.datatables.ManorData;
 import com.l2jserver.gameserver.enums.InstanceType;
 import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager;
 import com.l2jserver.gameserver.instancemanager.WalkingManager;
@@ -46,6 +44,7 @@ import com.l2jserver.gameserver.model.DamageDoneInfo;
 import com.l2jserver.gameserver.model.L2CommandChannel;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2Party;
+import com.l2jserver.gameserver.model.L2Seed;
 import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -74,40 +73,37 @@ import com.l2jserver.util.Rnd;
 
 public class L2Attackable extends L2Npc
 {
+	// Raid
 	private boolean _isRaid = false;
 	private boolean _isRaidMinion = false;
+	//
 	private boolean _champion = false;
 	private final Map<L2Character, AggroInfo> _aggroList = new ConcurrentHashMap<>();
 	private boolean _isReturningToSpawnPoint = false;
 	private boolean _canReturnToSpawnPoint = true;
 	private boolean _seeThroughSilentMove = false;
-	private ItemHolder[] _sweepItems;
-	private ItemHolder[] _harvestItems;
-	private boolean _seeded;
-	private int _seedType = 0;
+	// Manor
+	private boolean _seeded = false;
+	private L2Seed _seed = null;
 	private int _seederObjId = 0;
-	
+	private ItemHolder _harvestItem;
+	// Spoil
+	private boolean _isSpoil = false;
+	private int _isSpoiledBy = 0;
+	private ItemHolder[] _sweepItems;
+	// Over-hit
 	private boolean _overhit;
-	
 	private double _overhitDamage;
-	
 	private L2Character _overhitAttacker;
-	
+	// Command channel
 	private volatile L2CommandChannel _firstCommandChannelAttacked = null;
 	private CommandChannelTimer _commandChannelTimer = null;
 	private long _commandChannelLastAttack = 0;
-	
+	// Soul crystal
 	private boolean _absorbed;
-	
 	private final Map<Integer, AbsorberInfo> _absorbersList = new ConcurrentHashMap<>();
-	
+	// Misc
 	private boolean _mustGiveExpSp;
-	
-	/** True if a Dwarf has used Spoil on this L2NpcInstance */
-	private boolean _isSpoil = false;
-	
-	private int _isSpoiledBy = 0;
-	
 	protected int _onKillDelay = 5000;
 	
 	/**
@@ -1175,10 +1171,10 @@ public class L2Attackable extends L2Npc
 	/**
 	 * @return table containing all L2ItemInstance that can be harvested.
 	 */
-	public synchronized ItemHolder[] takeHarvest()
+	public synchronized ItemHolder takeHarvest()
 	{
-		ItemHolder[] harvest = _harvestItems;
-		_harvestItems = null;
+		ItemHolder harvest = _harvestItem;
+		_harvestItem = null;
 		return harvest;
 	}
 	
@@ -1422,11 +1418,11 @@ public class L2Attackable extends L2Npc
 		setSpoil(false);
 		// Clear all aggro char from list
 		clearAggroList();
-		// Clear Harvester Rewrard List
-		_harvestItems = null;
+		// Clear Harvester reward
+		_harvestItem = null;
 		// Clear mod Seeded stat
 		_seeded = false;
-		_seedType = 0;
+		_seed = null;
 		_seederObjId = 0;
 		// Clear overhit value
 		overhitEnabled(false);
@@ -1474,42 +1470,17 @@ public class L2Attackable extends L2Npc
 	}
 	
 	/**
-	 * Sets state of the mob to seeded. Paramets needed to be set before.
+	 * Sets state of the mob to seeded. Parameters needed to be set before.
 	 * @param seeder
 	 */
-	public void setSeeded(L2PcInstance seeder)
-	{
-		if ((_seedType != 0) && (_seederObjId == seeder.getObjectId()))
-		{
-			setSeeded(_seedType, seeder.getLevel());
-		}
-	}
-	
-	/**
-	 * Sets the seed parameters, but not the seed state
-	 * @param id - id of the seed
-	 * @param seeder - player who is sowind the seed
-	 */
-	public void setSeeded(int id, L2PcInstance seeder)
-	{
-		if (!_seeded)
-		{
-			_seedType = id;
-			_seederObjId = seeder.getObjectId();
-		}
-	}
-	
-	private void setSeeded(int id, int seederLvl)
+	public final void setSeeded(L2PcInstance seeder)
 	{
-		_seeded = true;
-		_seedType = id;
-		int count = 1;
-		
-		Set<Integer> skillIds = getTemplate().getSkills().keySet();
-		
-		if (skillIds != null)
+		if ((_seed != null) && (_seederObjId == seeder.getObjectId()))
 		{
-			for (int skillId : skillIds)
+			_seeded = true;
+			
+			int count = 1;
+			for (int skillId : getTemplate().getSkills().keySet())
 			{
 				switch (skillId)
 				{
@@ -1539,33 +1510,42 @@ public class L2Attackable extends L2Npc
 						break;
 				}
 			}
+			
+			// hi-lvl mobs bonus
+			final int diff = getLevel() - _seed.getLevel() - 5;
+			if (diff > 0)
+			{
+				count += diff;
+			}
+			_harvestItem = new ItemHolder(_seed.getCropId(), count * Config.RATE_DROP_MANOR);
 		}
-		
-		int diff = (getLevel() - (ManorData.getInstance().getSeedLevel(_seedType) - 5));
-		
-		// hi-lvl mobs bonus
-		if (diff > 0)
+	}
+	
+	/**
+	 * Sets the seed parameters, but not the seed state
+	 * @param seed - instance {@link L2Seed} of used seed
+	 * @param seeder - player who sows the seed
+	 */
+	public final void setSeeded(L2Seed seed, L2PcInstance seeder)
+	{
+		if (!_seeded)
 		{
-			count += diff;
+			_seed = seed;
+			_seederObjId = seeder.getObjectId();
 		}
-		
-		_harvestItems = new ItemHolder[]
-		{
-			new ItemHolder(ManorData.getInstance().getCropType(_seedType), count * Config.RATE_DROP_MANOR)
-		};
 	}
 	
-	public int getSeederId()
+	public final int getSeederId()
 	{
 		return _seederObjId;
 	}
 	
-	public int getSeedType()
+	public final L2Seed getSeed()
 	{
-		return _seedType;
+		return _seed;
 	}
 	
-	public boolean isSeeded()
+	public final boolean isSeeded()
 	{
 		return _seeded;
 	}

+ 6 - 28
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -59,7 +59,6 @@ import com.l2jserver.gameserver.instancemanager.DimensionalRiftManager;
 import com.l2jserver.gameserver.instancemanager.InstanceManager;
 import com.l2jserver.gameserver.instancemanager.MapRegionManager;
 import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
-import com.l2jserver.gameserver.instancemanager.TownManager;
 import com.l2jserver.gameserver.model.CharEffectList;
 import com.l2jserver.gameserver.model.L2AccessLevel;
 import com.l2jserver.gameserver.model.L2Object;
@@ -364,14 +363,14 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 				{
 					return true;
 				}
-				return (_zones[ZoneId.PVP.getId()] > 0) && (_zones[ZoneId.PEACE.getId()] == 0);
+				return (_zones[ZoneId.PVP.ordinal()] > 0) && (_zones[ZoneId.PEACE.ordinal()] == 0);
 			case PEACE:
 				if ((instance != null) && instance.isPvPInstance())
 				{
 					return false;
 				}
 		}
-		return _zones[zone.getId()] > 0;
+		return _zones[zone.ordinal()] > 0;
 	}
 	
 	/**
@@ -384,15 +383,11 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 		{
 			if (state)
 			{
-				_zones[zone.getId()]++;
+				_zones[zone.ordinal()]++;
 			}
-			else
+			else if (_zones[zone.ordinal()] > 0)
 			{
-				_zones[zone.getId()]--;
-				if (_zones[zone.getId()] < 0)
-				{
-					_zones[zone.getId()] = 0;
-				}
+				_zones[zone.ordinal()]--;
 			}
 		}
 	}
@@ -5241,26 +5236,9 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 			{
 				return false;
 			}
-			
-			if ((attacker instanceof L2Character) && (target instanceof L2Character))
-			{
-				return (target.isInsideZone(ZoneId.PEACE) || attacker.isInsideZone(ZoneId.PEACE));
-			}
-			if (attacker instanceof L2Character)
-			{
-				return ((TownManager.getTown(target.getX(), target.getY(), target.getZ()) != null) || attacker.isInsideZone(ZoneId.PEACE));
-			}
 		}
 		
-		if ((attacker instanceof L2Character) && (target instanceof L2Character))
-		{
-			return (target.isInsideZone(ZoneId.PEACE) || attacker.isInsideZone(ZoneId.PEACE));
-		}
-		if (attacker instanceof L2Character)
-		{
-			return ((TownManager.getTown(target.getX(), target.getY(), target.getZ()) != null) || attacker.isInsideZone(ZoneId.PEACE));
-		}
-		return ((TownManager.getTown(target.getX(), target.getY(), target.getZ()) != null) || (TownManager.getTown(attacker.getX(), attacker.getY(), attacker.getZ()) != null));
+		return (target.isInsideZone(ZoneId.PEACE) || attacker.isInsideZone(ZoneId.PEACE));
 	}
 	
 	/**

+ 9 - 64
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Npc.java

@@ -54,10 +54,8 @@ import com.l2jserver.gameserver.model.L2WorldRegion;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.instance.L2ClanHallManagerInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2DoormenInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2FestivalGuideInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2FishermanInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2MerchantInstance;
-import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2TeleporterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2TrainerInstance;
@@ -570,53 +568,6 @@ public class L2Npc extends L2Character
 		}
 	}
 	
-	/**
-	 * <B><U>Values </U>:</B>
-	 * <ul>
-	 * <li>object is a L2FolkInstance : 0 (don't remember it)</li>
-	 * <li>object is a L2Character : 0 (don't remember it)</li>
-	 * <li>object is a L2Playable : 1500</li>
-	 * <li>others : 500</li>
-	 * <ul>
-	 * @param object The Object to add to _knownObject
-	 * @return the distance under which the object must be add to _knownObject in function of the object type.
-	 */
-	public int getDistanceToWatchObject(L2Object object)
-	{
-		if (object instanceof L2FestivalGuideInstance)
-		{
-			return 10000;
-		}
-		
-		if ((object instanceof L2NpcInstance) || !(object instanceof L2Character))
-		{
-			return 0;
-		}
-		
-		if (object instanceof L2Playable)
-		{
-			return 1500;
-		}
-		
-		return 500;
-	}
-	
-	/**
-	 * <B><U>Values</U>:</B>
-	 * <ul>
-	 * <li>object is not a L2Character : 0 (don't remember it)</li>
-	 * <li>object is a L2FolkInstance : 0 (don't remember it)</li>
-	 * <li>object is a L2Playable : 3000</li>
-	 * <li>others : 1000</li>
-	 * </ul>
-	 * @param object The Object to remove from _knownObject
-	 * @return the distance after which the object must be remove from _knownObject in function of the object type.
-	 */
-	public int getDistanceToForgetObject(L2Object object)
-	{
-		return 2 * getDistanceToWatchObject(object);
-	}
-	
 	public boolean isEventMob()
 	{
 		return _eventMob;
@@ -723,27 +674,27 @@ public class L2Npc extends L2Character
 		{
 			return false;
 		}
-		if (player.isDead() || player.isFakeDeath())
+		else if (player.isDead() || player.isFakeDeath())
 		{
 			return false;
 		}
-		if (player.isSitting())
+		else if (player.isSitting())
 		{
 			return false;
 		}
-		if (player.getPrivateStoreType() != PrivateStoreType.NONE)
+		else if (player.getPrivateStoreType() != PrivateStoreType.NONE)
 		{
 			return false;
 		}
-		if (!isInsideRadius(player, INTERACTION_DISTANCE, true, false))
+		else if (!isInsideRadius(player, INTERACTION_DISTANCE, true, false))
 		{
 			return false;
 		}
-		if ((player.getInstanceId() != getInstanceId()) && (player.getInstanceId() != -1))
+		else if ((player.getInstanceId() != getInstanceId()) && (player.getInstanceId() != -1))
 		{
 			return false;
 		}
-		if (isBusy())
+		else if (isBusy())
 		{
 			return false;
 		}
@@ -1644,20 +1595,14 @@ public class L2Npc extends L2Character
 	
 	public L2Npc scheduleDespawn(long delay)
 	{
-		ThreadPoolManager.getInstance().scheduleGeneral(new DespawnTask(), delay);
-		return this;
-	}
-	
-	protected class DespawnTask implements Runnable
-	{
-		@Override
-		public void run()
+		ThreadPoolManager.getInstance().scheduleGeneral(() ->
 		{
 			if (!isDecayed())
 			{
 				deleteMe();
 			}
-		}
+		}, delay);
+		return this;
 	}
 	
 	@Override

+ 0 - 58
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2ManorManagerInstance.java

@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2004-2014 L2J Server
- * 
- * This file is part of L2J Server.
- * 
- * L2J Server is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * 
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver.model.actor.instance;
-
-import com.l2jserver.gameserver.enums.InstanceType;
-import com.l2jserver.gameserver.instancemanager.CastleManorManager;
-import com.l2jserver.gameserver.model.PcCondOverride;
-import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
-
-public class L2ManorManagerInstance extends L2MerchantInstance
-{
-	public L2ManorManagerInstance(int objectId, L2NpcTemplate template)
-	{
-		super(objectId, template);
-		setInstanceType(InstanceType.L2ManorManagerInstance);
-	}
-	
-	@Override
-	public String getHtmlPath(int npcId, int val)
-	{
-		return "data/html/manormanager/manager.htm";
-	}
-	
-	@Override
-	public void showChatWindow(L2PcInstance player)
-	{
-		if (CastleManorManager.getInstance().isDisabled())
-		{
-			showChatWindow(player, "data/html/npcdefault.htm");
-			return;
-		}
-		
-		if (!player.canOverrideCond(PcCondOverride.CASTLE_CONDITIONS) && (getCastle() != null) && (getCastle().getResidenceId() > 0) && player.isClanLeader() && (getCastle().getOwnerId() == player.getClanId()))
-		{
-			showChatWindow(player, "data/html/manormanager/manager-lord.htm");
-		}
-		else
-		{
-			showChatWindow(player, "data/html/manormanager/manager.htm");
-		}
-	}
-}

+ 6 - 391
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Castle.java

@@ -32,11 +32,9 @@ import javolution.util.FastMap;
 
 import com.l2jserver.Config;
 import com.l2jserver.L2DatabaseFactory;
-import com.l2jserver.gameserver.CastleUpdater;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.ClanTable;
 import com.l2jserver.gameserver.datatables.DoorTable;
-import com.l2jserver.gameserver.datatables.ManorData;
 import com.l2jserver.gameserver.datatables.SkillData;
 import com.l2jserver.gameserver.datatables.SkillTreesData;
 import com.l2jserver.gameserver.enums.MountType;
@@ -47,11 +45,9 @@ import com.l2jserver.gameserver.instancemanager.SiegeManager;
 import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
 import com.l2jserver.gameserver.instancemanager.TerritoryWarManager.Territory;
 import com.l2jserver.gameserver.instancemanager.ZoneManager;
-import com.l2jserver.gameserver.model.CropProcure;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2SkillLearn;
-import com.l2jserver.gameserver.model.SeedProduction;
 import com.l2jserver.gameserver.model.TowerSpawn;
 import com.l2jserver.gameserver.model.actor.instance.L2ArtefactInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
@@ -70,13 +66,6 @@ public final class Castle extends AbstractResidence
 {
 	protected static final Logger _log = Logger.getLogger(Castle.class.getName());
 	
-	private static final String CASTLE_MANOR_DELETE_PRODUCTION = "DELETE FROM castle_manor_production WHERE castle_id=?;";
-	private static final String CASTLE_MANOR_DELETE_PRODUCTION_PERIOD = "DELETE FROM castle_manor_production WHERE castle_id=? AND period=?;";
-	private static final String CASTLE_MANOR_DELETE_PROCURE = "DELETE FROM castle_manor_procure WHERE castle_id=?;";
-	private static final String CASTLE_MANOR_DELETE_PROCURE_PERIOD = "DELETE FROM castle_manor_procure WHERE castle_id=? AND period=?;";
-	private static final String CASTLE_UPDATE_CROP = "UPDATE castle_manor_procure SET can_buy=? WHERE crop_id=? AND castle_id=? AND period=?";
-	private static final String CASTLE_UPDATE_SEED = "UPDATE castle_manor_production SET can_produce=? WHERE seed_id=? AND castle_id=? AND period=?";
-	
 	private final List<L2DoorInstance> _doors = new ArrayList<>();
 	private int _ownerId = 0;
 	private Siege _siege = null;
@@ -94,12 +83,6 @@ public final class Castle extends AbstractResidence
 	private final Map<Integer, CastleFunction> _function;
 	private int _ticketBuyCount = 0;
 	
-	private List<CropProcure> _procure = new ArrayList<>();
-	private List<SeedProduction> _production = new ArrayList<>();
-	private List<CropProcure> _procureNext = new ArrayList<>();
-	private List<SeedProduction> _productionNext = new ArrayList<>();
-	private boolean _isNextPeriodApproved = false;
-	
 	/** Castle Functions */
 	public static final int FUNC_TELEPORT = 1;
 	public static final int FUNC_RESTORE_HP = 2;
@@ -685,12 +668,6 @@ public final class Castle extends AbstractResidence
 					_ownerId = rs.getInt("clan_id");
 				}
 			}
-			
-			if (getOwnerId() > 0)
-			{
-				L2Clan clan = ClanTable.getInstance().getClan(getOwnerId()); // Try to find clan instance
-				ThreadPoolManager.getInstance().scheduleGeneral(new CastleUpdater(clan, 1), 3600000); // Schedule owner tasks to start running
-			}
 		}
 		catch (Exception e)
 		{
@@ -876,7 +853,7 @@ public final class Castle extends AbstractResidence
 		else
 		{
 			_ownerId = 0; // Remove owner
-			resetManor();
+			CastleManorManager.getInstance().resetManorData(getResidenceId());
 		}
 		
 		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
@@ -901,7 +878,6 @@ public final class Castle extends AbstractResidence
 				clan.setCastleId(getResidenceId()); // Set has castle flag for new owner
 				clan.broadcastToOnlineMembers(new PledgeShowInfoUpdate(clan));
 				clan.broadcastToOnlineMembers(new PlaySound(1, "Siege_Victory", 0, 0, 0, 0, 0));
-				ThreadPoolManager.getInstance().scheduleGeneral(new CastleUpdater(clan, 1), 3600000); // Schedule owner tasks to start running
 			}
 		}
 		catch (Exception e)
@@ -937,6 +913,11 @@ public final class Castle extends AbstractResidence
 		return _ownerId;
 	}
 	
+	public final L2Clan getOwner()
+	{
+		return (_ownerId != 0) ? ClanTable.getInstance().getClan(_ownerId) : null;
+	}
+	
 	public final Siege getSiege()
 	{
 		if (_siege == null)
@@ -999,359 +980,6 @@ public final class Castle extends AbstractResidence
 		}
 	}
 	
-	public List<SeedProduction> getSeedProduction(int period)
-	{
-		return (period == CastleManorManager.PERIOD_CURRENT ? _production : _productionNext);
-	}
-	
-	public List<CropProcure> getCropProcure(int period)
-	{
-		return (period == CastleManorManager.PERIOD_CURRENT ? _procure : _procureNext);
-	}
-	
-	public void setSeedProduction(List<SeedProduction> seed, int period)
-	{
-		if (period == CastleManorManager.PERIOD_CURRENT)
-		{
-			_production = seed;
-		}
-		else
-		{
-			_productionNext = seed;
-		}
-	}
-	
-	public void setCropProcure(List<CropProcure> crop, int period)
-	{
-		if (period == CastleManorManager.PERIOD_CURRENT)
-		{
-			_procure = crop;
-		}
-		else
-		{
-			_procureNext = crop;
-		}
-	}
-	
-	public SeedProduction getSeed(int seedId, int period)
-	{
-		for (SeedProduction seed : getSeedProduction(period))
-		{
-			if (seed.getId() == seedId)
-			{
-				return seed;
-			}
-		}
-		return null;
-	}
-	
-	public CropProcure getCrop(int cropId, int period)
-	{
-		for (CropProcure crop : getCropProcure(period))
-		{
-			if (crop.getId() == cropId)
-			{
-				return crop;
-			}
-		}
-		return null;
-	}
-	
-	public long getManorCost(int period)
-	{
-		List<CropProcure> procure;
-		List<SeedProduction> production;
-		
-		if (period == CastleManorManager.PERIOD_CURRENT)
-		{
-			procure = _procure;
-			production = _production;
-		}
-		else
-		{
-			procure = _procureNext;
-			production = _productionNext;
-		}
-		
-		long total = 0;
-		if (production != null)
-		{
-			for (SeedProduction seed : production)
-			{
-				total += ManorData.getInstance().getSeedBuyPrice(seed.getId()) * seed.getStartProduce();
-			}
-		}
-		if (procure != null)
-		{
-			for (CropProcure crop : procure)
-			{
-				total += crop.getPrice() * crop.getStartAmount();
-			}
-		}
-		return total;
-	}
-	
-	// save manor production data
-	public void saveSeedData()
-	{
-		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
-		{
-			try (PreparedStatement ps1 = con.prepareStatement(CASTLE_MANOR_DELETE_PRODUCTION))
-			{
-				ps1.setInt(1, getResidenceId());
-				ps1.execute();
-			}
-			
-			if (_production != null)
-			{
-				int count = 0;
-				StringBuilder query = new StringBuilder();
-				query.append("INSERT INTO castle_manor_production VALUES ");
-				String values[] = new String[_production.size()];
-				for (SeedProduction s : _production)
-				{
-					values[count++] = "(" + getResidenceId() + "," + s.getId() + "," + s.getCanProduce() + "," + s.getStartProduce() + "," + s.getPrice() + "," + CastleManorManager.PERIOD_CURRENT + ")";
-				}
-				if (values.length > 0)
-				{
-					query.append(values[0]);
-					for (int i = 1; i < values.length; i++)
-					{
-						query.append(',');
-						query.append(values[i]);
-					}
-					try (PreparedStatement ps2 = con.prepareStatement(query.toString()))
-					{
-						ps2.execute();
-					}
-				}
-			}
-			
-			if (_productionNext != null)
-			{
-				int count = 0;
-				String query = "INSERT INTO castle_manor_production VALUES ";
-				String values[] = new String[_productionNext.size()];
-				for (SeedProduction s : _productionNext)
-				{
-					values[count++] = "(" + getResidenceId() + "," + s.getId() + "," + s.getCanProduce() + "," + s.getStartProduce() + "," + s.getPrice() + "," + CastleManorManager.PERIOD_NEXT + ")";
-				}
-				if (values.length > 0)
-				{
-					query += values[0];
-					for (int i = 1; i < values.length; i++)
-					{
-						query += "," + values[i];
-					}
-					try (PreparedStatement ps3 = con.prepareStatement(query))
-					{
-						ps3.execute();
-					}
-				}
-			}
-		}
-		catch (Exception e)
-		{
-			_log.info("Error adding seed production data for castle " + getName() + ": " + e.getMessage());
-		}
-	}
-	
-	// save manor production data for specified period
-	public void saveSeedData(int period)
-	{
-		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement ps = con.prepareStatement(CASTLE_MANOR_DELETE_PRODUCTION_PERIOD))
-		{
-			ps.setInt(1, getResidenceId());
-			ps.setInt(2, period);
-			ps.execute();
-			
-			List<SeedProduction> prod = null;
-			prod = getSeedProduction(period);
-			
-			if (prod != null)
-			{
-				int count = 0;
-				StringBuilder query = new StringBuilder();
-				query.append("INSERT INTO castle_manor_production VALUES ");
-				String values[] = new String[prod.size()];
-				for (SeedProduction s : prod)
-				{
-					values[count++] = "(" + getResidenceId() + "," + s.getId() + "," + s.getCanProduce() + "," + s.getStartProduce() + "," + s.getPrice() + "," + period + ")";
-				}
-				if (values.length > 0)
-				{
-					query.append(values[0]);
-					for (int i = 1; i < values.length; i++)
-					{
-						query.append(',').append(values[i]);
-					}
-					try (PreparedStatement insert = con.prepareStatement(query.toString()))
-					{
-						insert.execute();
-					}
-				}
-			}
-		}
-		catch (Exception e)
-		{
-			_log.info("Error adding seed production data for castle " + getName() + ": " + e.getMessage());
-		}
-	}
-	
-	// save crop procure data
-	public void saveCropData()
-	{
-		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
-		{
-			try (PreparedStatement ps1 = con.prepareStatement(CASTLE_MANOR_DELETE_PROCURE))
-			{
-				ps1.setInt(1, getResidenceId());
-				ps1.execute();
-			}
-			
-			if (!_procure.isEmpty())
-			{
-				int count = 0;
-				StringBuilder query = new StringBuilder();
-				query.append("INSERT INTO castle_manor_procure VALUES ");
-				String values[] = new String[_procure.size()];
-				for (CropProcure cp : _procure)
-				{
-					values[count++] = "(" + getResidenceId() + "," + cp.getId() + "," + cp.getAmount() + "," + cp.getStartAmount() + "," + cp.getPrice() + "," + cp.getReward() + "," + CastleManorManager.PERIOD_CURRENT + ")";
-				}
-				if (values.length > 0)
-				{
-					query.append(values[0]);
-					for (int i = 1; i < values.length; i++)
-					{
-						query.append(',');
-						query.append(values[i]);
-					}
-					try (PreparedStatement ps2 = con.prepareStatement(query.toString()))
-					{
-						ps2.execute();
-					}
-				}
-			}
-			if (!_procureNext.isEmpty())
-			{
-				int count = 0;
-				String query = "INSERT INTO castle_manor_procure VALUES ";
-				String values[] = new String[_procureNext.size()];
-				for (CropProcure cp : _procureNext)
-				{
-					values[count++] = "(" + getResidenceId() + "," + cp.getId() + "," + cp.getAmount() + "," + cp.getStartAmount() + "," + cp.getPrice() + "," + cp.getReward() + "," + CastleManorManager.PERIOD_NEXT + ")";
-				}
-				if (values.length > 0)
-				{
-					query += values[0];
-					for (int i = 1; i < values.length; i++)
-					{
-						query += "," + values[i];
-					}
-					try (PreparedStatement ps3 = con.prepareStatement(query))
-					{
-						ps3.execute();
-					}
-				}
-			}
-		}
-		catch (Exception e)
-		{
-			_log.info("Error adding crop data for castle " + getName() + ": " + e.getMessage());
-		}
-	}
-	
-	// save crop procure data for specified period
-	public void saveCropData(int period)
-	{
-		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement ps = con.prepareStatement(CASTLE_MANOR_DELETE_PROCURE_PERIOD))
-		{
-			ps.setInt(1, getResidenceId());
-			ps.setInt(2, period);
-			ps.execute();
-			
-			List<CropProcure> proc = null;
-			proc = getCropProcure(period);
-			
-			if ((proc != null) && (proc.size() > 0))
-			{
-				int count = 0;
-				StringBuilder query = new StringBuilder();
-				query.append("INSERT INTO castle_manor_procure VALUES ");
-				String values[] = new String[proc.size()];
-				
-				for (CropProcure cp : proc)
-				{
-					values[count++] = "(" + getResidenceId() + "," + cp.getId() + "," + cp.getAmount() + "," + cp.getStartAmount() + "," + cp.getPrice() + "," + cp.getReward() + "," + period + ")";
-				}
-				if (values.length > 0)
-				{
-					query.append(values[0]);
-					for (int i = 1; i < values.length; i++)
-					{
-						query.append(',');
-						query.append(values[i]);
-					}
-					try (PreparedStatement insert = con.prepareStatement(query.toString()))
-					{
-						insert.execute();
-					}
-				}
-			}
-		}
-		catch (Exception e)
-		{
-			_log.info("Error adding crop data for castle " + getName() + ": " + e.getMessage());
-		}
-	}
-	
-	public void updateCrop(int cropId, long amount, int period)
-	{
-		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement ps = con.prepareStatement(CASTLE_UPDATE_CROP))
-		{
-			ps.setLong(1, amount);
-			ps.setInt(2, cropId);
-			ps.setInt(3, getResidenceId());
-			ps.setInt(4, period);
-			ps.execute();
-		}
-		catch (Exception e)
-		{
-			_log.info("Error adding crop data for castle " + getName() + ": " + e.getMessage());
-		}
-	}
-	
-	public void updateSeed(int seedId, long amount, int period)
-	{
-		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement ps = con.prepareStatement(CASTLE_UPDATE_SEED))
-		{
-			ps.setLong(1, amount);
-			ps.setInt(2, seedId);
-			ps.setInt(3, getResidenceId());
-			ps.setInt(4, period);
-			ps.execute();
-		}
-		catch (Exception e)
-		{
-			_log.info("Error adding seed production data for castle " + getName() + ": " + e.getMessage());
-		}
-	}
-	
-	public boolean isNextPeriodApproved()
-	{
-		return _isNextPeriodApproved;
-	}
-	
-	public void setNextPeriodApproved(boolean val)
-	{
-		_isNextPeriodApproved = val;
-	}
-	
 	public void updateClansReputation()
 	{
 		if (_formerOwner != null)
@@ -1461,19 +1089,6 @@ public final class Castle extends AbstractResidence
 		return _artefacts;
 	}
 	
-	public void resetManor()
-	{
-		setCropProcure(new ArrayList<CropProcure>(), CastleManorManager.PERIOD_CURRENT);
-		setCropProcure(new ArrayList<CropProcure>(), CastleManorManager.PERIOD_NEXT);
-		setSeedProduction(new ArrayList<SeedProduction>(), CastleManorManager.PERIOD_CURRENT);
-		setSeedProduction(new ArrayList<SeedProduction>(), CastleManorManager.PERIOD_NEXT);
-		if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
-		{
-			saveCropData();
-			saveSeedData();
-		}
-	}
-	
 	/**
 	 * @return the tickets exchanged for this castle
 	 */

+ 2 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/EventType.java

@@ -33,6 +33,7 @@ import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcCanBeSeen;
 import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcCreatureSee;
 import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcEventReceived;
 import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcFirstTalk;
+import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcManorBypass;
 import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcMoveFinished;
 import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcMoveNodeArrived;
 import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcMoveRouteFinished;
@@ -160,6 +161,7 @@ public enum EventType
 	ON_NPC_SPAWN(OnNpcSpawn.class, void.class),
 	ON_NPC_TALK(null, void.class),
 	ON_NPC_TELEPORT(OnNpcTeleport.class, void.class),
+	ON_NPC_MANOR_BYPASS(OnNpcManorBypass.class, void.class),
 	
 	// Olympiad events
 	ON_OLYMPIAD_MATCH_RESULT(OnOlympiadMatchResult.class, void.class),

+ 76 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/events/impl/character/npc/OnNpcManorBypass.java

@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2004-2014 L2J Server
+ * 
+ * This file is part of L2J Server.
+ * 
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.events.impl.character.npc;
+
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.events.EventType;
+import com.l2jserver.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author malyelfik
+ */
+public final class OnNpcManorBypass implements IBaseEvent
+{
+	private final L2PcInstance _activeChar;
+	private final L2Npc _target;
+	private final int _request;
+	private final int _manorId;
+	private final boolean _nextPeriod;
+	
+	public OnNpcManorBypass(L2PcInstance activeChar, L2Npc target, int request, int manorId, boolean nextPeriod)
+	{
+		_activeChar = activeChar;
+		_target = target;
+		_request = request;
+		_manorId = manorId;
+		_nextPeriod = nextPeriod;
+	}
+	
+	public L2PcInstance getActiveChar()
+	{
+		return _activeChar;
+	}
+	
+	public L2Npc getTarget()
+	{
+		return _target;
+	}
+	
+	public int getRequest()
+	{
+		return _request;
+	}
+	
+	public int getManorId()
+	{
+		return _manorId;
+	}
+	
+	public boolean isNextPeriod()
+	{
+		return _nextPeriod;
+	}
+	
+	@Override
+	public EventType getType()
+	{
+		return EventType.ON_NPC_MANOR_BYPASS;
+	}
+}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/holders/UniqueItemHolder.java

@@ -24,7 +24,7 @@ import com.l2jserver.gameserver.model.interfaces.IUniqueId;
  * A DTO for items; contains item ID, object ID and count.
  * @author xban1x
  */
-public final class UniqueItemHolder extends ItemHolder implements IUniqueId
+public class UniqueItemHolder extends ItemHolder implements IUniqueId
 {
 	private final int _objectId;
 	

+ 29 - 28
L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java

@@ -539,40 +539,41 @@ public class PcInventory extends Inventory
 	@Override
 	public L2ItemInstance addItem(String process, int itemId, long count, L2PcInstance actor, Object reference)
 	{
-		L2ItemInstance item = super.addItem(process, itemId, count, actor, reference);
-		
-		if ((item != null) && (item.getId() == ADENA_ID) && !item.equals(_adena))
-		{
-			_adena = item;
-		}
-		
-		if ((item != null) && (item.getId() == ANCIENT_ADENA_ID) && !item.equals(_ancientAdena))
-		{
-			_ancientAdena = item;
-		}
-		if ((item != null) && (actor != null))
+		final L2ItemInstance item = super.addItem(process, itemId, count, actor, reference);
+		if (item != null)
 		{
-			// Send inventory update packet
-			if (!Config.FORCE_INVENTORY_UPDATE)
+			if ((item.getId() == ADENA_ID) && !item.equals(_adena))
 			{
-				InventoryUpdate playerIU = new InventoryUpdate();
-				playerIU.addItem(item);
-				actor.sendPacket(playerIU);
+				_adena = item;
 			}
-			else
+			
+			if ((item.getId() == ANCIENT_ADENA_ID) && !item.equals(_ancientAdena))
 			{
-				actor.sendPacket(new ItemList(actor, false));
+				_ancientAdena = item;
+			}
+			if (actor != null)
+			{
+				// Send inventory update packet
+				if (!Config.FORCE_INVENTORY_UPDATE)
+				{
+					InventoryUpdate playerIU = new InventoryUpdate();
+					playerIU.addItem(item);
+					actor.sendPacket(playerIU);
+				}
+				else
+				{
+					actor.sendPacket(new ItemList(actor, false));
+				}
+				
+				// Update current load as well
+				StatusUpdate su = new StatusUpdate(actor);
+				su.addAttribute(StatusUpdate.CUR_LOAD, actor.getCurrentLoad());
+				actor.sendPacket(su);
+				
+				// Notify to scripts
+				EventDispatcher.getInstance().notifyEventAsync(new OnPlayerItemAdd(actor, item), item.getItem());
 			}
-			
-			// Update current load as well
-			StatusUpdate su = new StatusUpdate(actor);
-			su.addAttribute(StatusUpdate.CUR_LOAD, actor.getCurrentLoad());
-			actor.sendPacket(su);
-			
-			// Notify to scripts
-			EventDispatcher.getInstance().notifyEventAsync(new OnPlayerItemAdd(actor, item), item.getItem());
 		}
-		
 		return item;
 	}
 	

+ 1 - 17
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/L2Item.java

@@ -44,7 +44,6 @@ import com.l2jserver.gameserver.model.items.type.CrystalType;
 import com.l2jserver.gameserver.model.items.type.EtcItemType;
 import com.l2jserver.gameserver.model.items.type.ItemType;
 import com.l2jserver.gameserver.model.items.type.MaterialType;
-import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.Skill;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
@@ -157,7 +156,6 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable
 	private SkillHolder[] _skillHolder;
 	private SkillHolder _unequipSkill = null;
 	
-	private List<Quest> _questEvents;
 	private final int _useSkillDisTime;
 	private final int _reuseDelay;
 	private final int _sharedReuseGroup;
@@ -999,20 +997,6 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable
 		return _icon;
 	}
 	
-	public void addQuestEvent(Quest q)
-	{
-		if (_questEvents == null)
-		{
-			_questEvents = new ArrayList<>();
-		}
-		_questEvents.add(q);
-	}
-	
-	public List<Quest> getQuestEvents()
-	{
-		return _questEvents;
-	}
-	
 	public int getDefaultEnchantLevel()
 	{
 		return _defaultEnchantLevel;
@@ -1027,4 +1011,4 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable
 	{
 		return null;
 	}
-}
+}

+ 23 - 35
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/ZoneId.java

@@ -24,41 +24,29 @@ package com.l2jserver.gameserver.model.zone;
  */
 public enum ZoneId
 {
-	PVP(0),
-	PEACE(1),
-	SIEGE(2),
-	MOTHER_TREE(3),
-	CLAN_HALL(4),
-	LANDING(5),
-	NO_LANDING(6),
-	WATER(7),
-	JAIL(8),
-	MONSTER_TRACK(9),
-	CASTLE(10),
-	SWAMP(11),
-	NO_SUMMON_FRIEND(12),
-	FORT(13),
-	NO_STORE(14),
-	TOWN(15),
-	SCRIPT(16),
-	HQ(17),
-	DANGER_AREA(18),
-	ALTERED(19),
-	NO_BOOKMARK(20),
-	NO_ITEM_DROP(21),
-	NO_RESTART(22);
-	
-	private final int _id;
-	
-	private ZoneId(int id)
-	{
-		_id = id;
-	}
-	
-	public int getId()
-	{
-		return _id;
-	}
+	PVP,
+	PEACE,
+	SIEGE,
+	MOTHER_TREE,
+	CLAN_HALL,
+	LANDING,
+	NO_LANDING,
+	WATER,
+	JAIL,
+	MONSTER_TRACK,
+	CASTLE,
+	SWAMP,
+	NO_SUMMON_FRIEND,
+	FORT,
+	NO_STORE,
+	TOWN,
+	SCRIPT,
+	HQ,
+	DANGER_AREA,
+	ALTERED,
+	NO_BOOKMARK,
+	NO_ITEM_DROP,
+	NO_RESTART;
 	
 	public static int getZoneCount()
 	{

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/network/SystemMessageId.java

@@ -9802,9 +9802,9 @@ public final class SystemMessageId
 	
 	/**
 	 * ID: 1675<br>
-	 * Message: A manor cannot be set up between 6 a.m. and 8 p.m.
+	 * Message: A manor cannot be set up between 4:30 am and 8 pm.
 	 */
-	public static final SystemMessageId A_MANOR_CANNOT_BE_SET_UP_BETWEEN_6_AM_AND_8_PM;
+	public static final SystemMessageId A_MANOR_CANNOT_BE_SET_UP_BETWEEN_4_30_AM_AND_8_PM;
 	
 	/**
 	 * ID: 1676<br>
@@ -16845,7 +16845,7 @@ public final class SystemMessageId
 		PUMPING_SUCCESSFUL_PENALTY_S1 = new SystemMessageId(1672);
 		THE_CURRENT_RECORD_FOR_THIS_OLYMPIAD_SESSION_IS_S1_MATCHES_S2_WINS_S3_DEFEATS_YOU_HAVE_EARNED_S4_OLYMPIAD_POINTS = new SystemMessageId(1673);
 		NOBLESSE_ONLY = new SystemMessageId(1674);
-		A_MANOR_CANNOT_BE_SET_UP_BETWEEN_6_AM_AND_8_PM = new SystemMessageId(1675);
+		A_MANOR_CANNOT_BE_SET_UP_BETWEEN_4_30_AM_AND_8_PM = new SystemMessageId(1675);
 		NO_SERVITOR_CANNOT_AUTOMATE_USE = new SystemMessageId(1676);
 		CANT_STOP_CLAN_WAR_WHILE_IN_COMBAT = new SystemMessageId(1677);
 		NO_CLAN_WAR_AGAINST_CLAN_S1 = new SystemMessageId(1678);

+ 65 - 119
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestBuySeed.java

@@ -18,130 +18,138 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import static com.l2jserver.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE;
 import static com.l2jserver.gameserver.model.itemcontainer.Inventory.MAX_ADENA;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.CastleManorManager;
-import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.SeedProduction;
-import com.l2jserver.gameserver.model.actor.instance.L2ManorManagerInstance;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2MerchantInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.Castle;
+import com.l2jserver.gameserver.model.holders.ItemHolder;
 import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.util.Util;
 
 /**
- * Format: cdd[dd] c // id (0xC4) d // manor id d // seeds to buy [ d // seed id q // count ]
  * @author l3x
  */
 public class RequestBuySeed extends L2GameClientPacket
 {
-	private static final String _C__C5_REQUESTBUYSEED = "[C] C5 RequestBuySeed";
-	
 	private static final int BATCH_LENGTH = 12; // length of the one item
-	
 	private int _manorId;
-	private Seed[] _seeds = null;
+	private List<ItemHolder> _items = null;
 	
 	@Override
-	protected void readImpl()
+	protected final void readImpl()
 	{
 		_manorId = readD();
-		
-		int count = readD();
+		final int count = readD();
 		if ((count <= 0) || (count > Config.MAX_ITEM_IN_PACKET) || ((count * BATCH_LENGTH) != _buf.remaining()))
 		{
 			return;
 		}
 		
-		_seeds = new Seed[count];
+		_items = new ArrayList<>(count);
 		for (int i = 0; i < count; i++)
 		{
-			int itemId = readD();
-			long cnt = readQ();
-			if (cnt < 1)
+			final int itemId = readD();
+			final long cnt = readQ();
+			if ((cnt < 1) || (itemId < 1))
 			{
-				_seeds = null;
+				_items = null;
 				return;
 			}
-			_seeds[i] = new Seed(itemId, cnt);
+			_items.add(new ItemHolder(itemId, cnt));
 		}
 	}
 	
 	@Override
-	protected void runImpl()
+	protected final void runImpl()
 	{
-		L2PcInstance player = getClient().getActiveChar();
+		final L2PcInstance player = getActiveChar();
 		if (player == null)
 		{
 			return;
 		}
-		
-		if (!getClient().getFloodProtectors().getManor().tryPerformAction("BuySeed"))
+		else if (!getClient().getFloodProtectors().getManor().tryPerformAction("BuySeed"))
 		{
+			player.sendMessage("You are buying seeds too fast!");
 			return;
 		}
-		
-		if (_seeds == null)
+		else if (_items == null)
 		{
-			sendPacket(ActionFailed.STATIC_PACKET);
+			sendActionFailed();
 			return;
 		}
 		
-		L2Object manager = player.getTarget();
-		
-		if (!(manager instanceof L2ManorManagerInstance))
+		final CastleManorManager manor = CastleManorManager.getInstance();
+		if (manor.isUnderMaintenance())
 		{
-			manager = player.getLastFolkNPC();
+			sendActionFailed();
+			return;
 		}
 		
-		if (!(manager instanceof L2ManorManagerInstance))
+		final Castle castle = CastleManager.getInstance().getCastleById(_manorId);
+		if (castle == null)
 		{
+			sendActionFailed();
 			return;
 		}
 		
-		if (!player.isInsideRadius(manager, INTERACTION_DISTANCE, true, false))
+		final L2Npc manager = player.getLastFolkNPC();
+		if (!(manager instanceof L2MerchantInstance) || !manager.canInteract(player) || (manager.getTemplate().getParameters().getInt("manor_id", -1) != _manorId))
 		{
+			sendActionFailed();
 			return;
 		}
 		
-		Castle castle = CastleManager.getInstance().getCastleById(_manorId);
-		
 		long totalPrice = 0;
 		int slots = 0;
 		int totalWeight = 0;
 		
-		for (Seed i : _seeds)
+		final Map<Integer, SeedProduction> _productInfo = new HashMap<>();
+		for (ItemHolder ih : _items)
 		{
-			if (!i.setProduction(castle))
+			final SeedProduction sp = manor.getSeedProduct(_manorId, ih.getId(), false);
+			if ((sp == null) || (sp.getPrice() <= 0) || (sp.getAmount() < ih.getCount()) || ((MAX_ADENA / ih.getCount()) < sp.getPrice()))
 			{
+				sendActionFailed();
 				return;
 			}
 			
-			totalPrice += i.getPrice();
-			
+			// Calculate price
+			totalPrice += (sp.getPrice() * ih.getCount());
 			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);
+				sendActionFailed();
 				return;
 			}
 			
-			L2Item template = ItemTable.getInstance().getTemplate(i.getSeedId());
-			totalWeight += i.getCount() * template.getWeight();
+			// Calculate weight
+			final L2Item template = ItemTable.getInstance().getTemplate(ih.getId());
+			totalWeight += ih.getCount() * template.getWeight();
+			
+			// Calculate slots
 			if (!template.isStackable())
 			{
-				slots += i.getCount();
+				slots += ih.getCount();
 			}
-			else if (player.getInventory().getItemByItemId(i.getSeedId()) == null)
+			else if (player.getInventory().getItemByItemId(ih.getId()) == null)
 			{
 				slots++;
 			}
+			_productInfo.put(ih.getId(), sp);
 		}
 		
 		if (!player.getInventory().validateWeight(totalWeight))
@@ -149,116 +157,54 @@ public class RequestBuySeed extends L2GameClientPacket
 			player.sendPacket(SystemMessageId.WEIGHT_LIMIT_EXCEEDED);
 			return;
 		}
-		
-		if (!player.getInventory().validateCapacity(slots))
+		else if (!player.getInventory().validateCapacity(slots))
 		{
 			player.sendPacket(SystemMessageId.SLOTS_FULL);
 			return;
 		}
-		
-		if ((totalPrice < 0) || (player.getAdena() < totalPrice))
+		else if ((totalPrice < 0) || (player.getAdena() < totalPrice))
 		{
 			player.sendPacket(SystemMessageId.YOU_NOT_ENOUGH_ADENA);
 			return;
 		}
 		
 		// Proceed the purchase
-		for (Seed i : _seeds)
+		for (ItemHolder i : _items)
 		{
-			// take adena and check seed amount once again
-			if (!player.reduceAdena("Buy", i.getPrice(), player, false) || !i.updateProduction(castle))
+			final SeedProduction sp = _productInfo.get(i.getId());
+			final long price = sp.getPrice() * i.getCount();
+			
+			// Take Adena and decrease seed amount
+			if (!sp.decreaseAmount(i.getCount()) || !player.reduceAdena("Buy", price, player, false))
 			{
 				// failed buy, reduce total price
-				totalPrice -= i.getPrice();
+				totalPrice -= price;
 				continue;
 			}
 			
-			// Add item to Inventory and adjust update packet
-			player.addItem("Buy", i.getSeedId(), i.getCount(), manager, true);
+			// Add item to player's inventory
+			player.addItem("Buy", i.getId(), i.getCount(), manager, true);
 		}
 		
 		// Adding to treasury for Manor Castle
 		if (totalPrice > 0)
 		{
 			castle.addToTreasuryNoTax(totalPrice);
-			SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DISAPPEARED_ADENA);
+			
+			final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DISAPPEARED_ADENA);
 			sm.addLong(totalPrice);
 			player.sendPacket(sm);
-		}
-	}
-	
-	private static 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 boolean updateProduction(Castle c)
-		{
-			synchronized (_seed)
-			{
-				long amount = _seed.getCanProduce();
-				if (_count > amount)
-				{
-					return false; // not enough seeds
-				}
-				_seed.setCanProduce(amount - _count);
-			}
-			// Update Castle Seeds Amount
 			if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
 			{
-				c.updateSeed(_seedId, _seed.getCanProduce(), CastleManorManager.PERIOD_CURRENT);
+				manor.updateCurrentProduction(_manorId, _productInfo.values());
 			}
-			return true;
 		}
 	}
 	
 	@Override
 	public String getType()
 	{
-		return _C__C5_REQUESTBUYSEED;
+		return "[C] C5 RequestBuySeed";
 	}
-}
+}

+ 8 - 21
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java

@@ -38,6 +38,7 @@ import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.Hero;
 import com.l2jserver.gameserver.model.events.EventDispatcher;
+import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcManorBypass;
 import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerBypass;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -301,28 +302,14 @@ public final class RequestBypassToServer extends L2GameClientPacket
 			}
 			else if (_command.startsWith("manor_menu_select"))
 			{
-				final IBypassHandler handler = BypassHandler.getInstance().getHandler("manor_menu_select");
-				if (handler == null)
+				final L2Npc lastNpc = activeChar.getLastFolkNPC();
+				if (Config.ALLOW_MANOR && (lastNpc != null) && lastNpc.canInteract(activeChar))
 				{
-					_log.warning("Manor menu select handler is not registered!");
-					return;
-				}
-				
-				if (bypassOriginId > 0)
-				{
-					L2Object bypassOrigin = activeChar.getKnownList().getKnownObjects().get(bypassOriginId);
-					if ((bypassOrigin != null) && bypassOrigin.isInstanceTypes(InstanceType.L2Character))
-					{
-						handler.useBypass(_command, activeChar, (L2Character) bypassOrigin);
-					}
-					else
-					{
-						handler.useBypass(_command, activeChar, null);
-					}
-				}
-				else
-				{
-					handler.useBypass(_command, activeChar, null);
+					final String[] split = _command.substring(_command.indexOf("?") + 1).split("&");
+					final int ask = Integer.parseInt(split[0].split("=")[1]);
+					final int state = Integer.parseInt(split[1].split("=")[1]);
+					final boolean time = split[2].split("=")[1].equals("1");
+					EventDispatcher.getInstance().notifyEventAsync(new OnNpcManorBypass(activeChar, lastNpc, ask, state, time), lastNpc);
 				}
 			}
 			else

+ 2 - 25
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestManorList.java

@@ -18,19 +18,13 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import javolution.util.FastList;
-
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.serverpackets.ExSendManorList;
 
 /**
- * Format: ch c (id) 0xD0 h (subid) 0x01
  * @author l3x
  */
 public class RequestManorList extends L2GameClientPacket
 {
-	private static final String _C__D0_01_REQUESTMANORLIST = "[C] D0:01 RequestManorList";
-	
 	@Override
 	protected void readImpl()
 	{
@@ -39,30 +33,13 @@ public class RequestManorList extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		L2PcInstance player = getClient().getActiveChar();
-		if (player == null)
-		{
-			return;
-		}
-		FastList<String> manorsName = new FastList<>();
-		manorsName.add("gludio");
-		manorsName.add("dion");
-		manorsName.add("giran");
-		manorsName.add("oren");
-		manorsName.add("aden");
-		manorsName.add("innadril");
-		manorsName.add("goddard");
-		manorsName.add("rune");
-		manorsName.add("schuttgart");
-		ExSendManorList manorlist = new ExSendManorList(manorsName);
-		player.sendPacket(manorlist);
-		
+		sendPacket(new ExSendManorList());
 	}
 	
 	@Override
 	public String getType()
 	{
-		return _C__D0_01_REQUESTMANORLIST;
+		return "[C] D0:01 RequestManorList";
 	}
 	
 	@Override

+ 87 - 151
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestProcureCropList.java

@@ -18,112 +18,116 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import static com.l2jserver.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE;
-import static com.l2jserver.gameserver.model.itemcontainer.Inventory.MAX_ADENA;
+import java.util.ArrayList;
+import java.util.List;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.ItemTable;
-import com.l2jserver.gameserver.datatables.ManorData;
-import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.CastleManorManager;
 import com.l2jserver.gameserver.model.CropProcure;
-import com.l2jserver.gameserver.model.L2Object;
-import com.l2jserver.gameserver.model.actor.instance.L2ManorManagerInstance;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2MerchantInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.holders.UniqueItemHolder;
 import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
 /**
- * Format: (ch) d [dddd] d: size [ d obj id d item id d manor id d count ]
  * @author l3x
  */
 public class RequestProcureCropList extends L2GameClientPacket
 {
-	private static final String _C__D0_02_REQUESTPROCURECROPLIST = "[C] D0:02 RequestProcureCropList";
-	
 	private static final int BATCH_LENGTH = 20; // length of the one item
 	
-	private Crop[] _items = null;
+	private List<CropHolder> _items = null;
 	
 	@Override
-	protected void readImpl()
+	protected final void readImpl()
 	{
-		int count = readD();
+		final int count = readD();
 		if ((count <= 0) || (count > Config.MAX_ITEM_IN_PACKET) || ((count * BATCH_LENGTH) != _buf.remaining()))
 		{
 			return;
 		}
 		
-		_items = new Crop[count];
+		_items = new ArrayList<>(count);
 		for (int i = 0; i < count; i++)
 		{
-			int objId = readD();
-			int itemId = readD();
-			int manorId = readD();
-			long cnt = readQ();
+			final int objId = readD();
+			final int itemId = readD();
+			final int manorId = readD();
+			final long cnt = readQ();
 			if ((objId < 1) || (itemId < 1) || (manorId < 0) || (cnt < 0))
 			{
 				_items = null;
 				return;
 			}
-			_items[i] = new Crop(objId, itemId, manorId, cnt);
+			_items.add(new CropHolder(objId, itemId, cnt, manorId));
 		}
 	}
 	
 	@Override
-	protected void runImpl()
+	protected final void runImpl()
 	{
 		if (_items == null)
 		{
 			return;
 		}
 		
-		L2PcInstance player = getClient().getActiveChar();
+		final L2PcInstance player = getActiveChar();
 		if (player == null)
 		{
 			return;
 		}
 		
-		L2Object manager = player.getTarget();
-		
-		if (!(manager instanceof L2ManorManagerInstance))
+		final CastleManorManager manor = CastleManorManager.getInstance();
+		if (manor.isUnderMaintenance())
 		{
-			manager = player.getLastFolkNPC();
+			sendActionFailed();
+			return;
 		}
 		
-		if (!(manager instanceof L2ManorManagerInstance))
+		final L2Npc manager = player.getLastFolkNPC();
+		if (!(manager instanceof L2MerchantInstance) || !manager.canInteract(player))
 		{
+			sendActionFailed();
 			return;
 		}
 		
-		if (!player.isInsideRadius(manager, INTERACTION_DISTANCE, false, false))
+		final int castleId = manager.getCastle().getResidenceId();
+		if (manager.getTemplate().getParameters().getInt("manor_id", -1) != castleId)
 		{
+			sendActionFailed();
 			return;
 		}
 		
-		int castleId = ((L2ManorManagerInstance) manager).getCastle().getResidenceId();
-		
-		// Calculate summary values
-		int slots = 0;
-		int weight = 0;
-		
-		for (Crop i : _items)
+		int slots = 0, weight = 0;
+		for (CropHolder i : _items)
 		{
-			if (!i.getCrop())
+			final L2ItemInstance item = player.getInventory().getItemByObjectId(i.getObjectId());
+			if ((item == null) || (item.getCount() < i.getCount()) || (item.getId() != i.getId()))
 			{
-				continue;
+				sendActionFailed();
+				return;
+			}
+			
+			final CropProcure cp = i.getCropProcure();
+			if ((cp == null) || (cp.getAmount() < i.getCount()))
+			{
+				sendActionFailed();
+				return;
 			}
 			
-			L2Item template = ItemTable.getInstance().getTemplate(i.getReward());
-			weight += i.getCount() * template.getWeight();
+			final L2Item template = ItemTable.getInstance().getTemplate(i.getRewardId());
+			weight += (i.getCount() * template.getWeight());
 			
 			if (!template.isStackable())
 			{
 				slots += i.getCount();
 			}
-			else if (player.getInventory().getItemByItemId(i.getItemId()) == null)
+			else if (player.getInventory().getItemByItemId(i.getRewardId()) == null)
 			{
 				slots++;
 			}
@@ -134,180 +138,112 @@ public class RequestProcureCropList extends L2GameClientPacket
 			player.sendPacket(SystemMessageId.WEIGHT_LIMIT_EXCEEDED);
 			return;
 		}
-		
-		if (!player.getInventory().validateCapacity(slots))
+		else if (!player.getInventory().validateCapacity(slots))
 		{
 			player.sendPacket(SystemMessageId.SLOTS_FULL);
 			return;
 		}
 		
+		// Used when Config.ALT_MANOR_SAVE_ALL_ACTIONS == true
+		final int updateListSize = Config.ALT_MANOR_SAVE_ALL_ACTIONS ? _items.size() : 0;
+		final List<CropProcure> updateList = new ArrayList<>(updateListSize);
+		
 		// Proceed the purchase
-		for (Crop i : _items)
+		for (CropHolder i : _items)
 		{
-			if (i.getReward() == 0)
-			{
-				continue;
-			}
-			
-			long fee = i.getFee(castleId); // fee for selling to other manors
-			
-			long rewardPrice = ItemTable.getInstance().getTemplate(i.getReward()).getReferencePrice();
+			final long rewardPrice = ItemTable.getInstance().getTemplate(i.getRewardId()).getReferencePrice();
 			if (rewardPrice == 0)
 			{
 				continue;
 			}
 			
-			long rewardItemCount = i.getPrice() / rewardPrice;
+			final long rewardItemCount = i.getPrice() / rewardPrice;
 			if (rewardItemCount < 1)
 			{
-				SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FAILED_IN_TRADING_S2_OF_CROP_S1);
-				sm.addItemName(i.getItemId());
+				final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FAILED_IN_TRADING_S2_OF_CROP_S1);
+				sm.addItemName(i.getId());
 				sm.addLong(i.getCount());
 				player.sendPacket(sm);
 				continue;
 			}
 			
-			if (player.getAdena() < fee)
+			// Fee for selling to other manors
+			final long fee = (castleId == i.getManorId()) ? 0 : ((long) (i.getPrice() * 0.05));
+			if ((fee != 0) && (player.getAdena() < fee))
 			{
 				SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FAILED_IN_TRADING_S2_OF_CROP_S1);
-				sm.addItemName(i.getItemId());
+				sm.addItemName(i.getId());
 				sm.addLong(i.getCount());
 				player.sendPacket(sm);
+				
 				sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_NOT_ENOUGH_ADENA);
 				player.sendPacket(sm);
 				continue;
 			}
 			
-			// check if player have correct items count
-			L2ItemInstance item = player.getInventory().getItemByObjectId(i.getObjectId());
-			if ((item == null) || (item.getCount() < i.getCount()))
-			{
-				continue;
-			}
-			
-			// try modify castle crop
-			if (!i.setCrop())
+			final CropProcure cp = i.getCropProcure();
+			if (!cp.decreaseAmount(i.getCount()) || ((fee > 0) && !player.reduceAdena("Manor", fee, manager, true)) || !player.destroyItem("Manor", i.getObjectId(), i.getCount(), manager, true))
 			{
 				continue;
 			}
+			player.addItem("Manor", i.getRewardId(), rewardItemCount, manager, true);
 			
-			if ((fee > 0) && !player.reduceAdena("Manor", fee, manager, true))
-			{
-				continue;
-			}
-			
-			if (!player.destroyItem("Manor", i.getObjectId(), i.getCount(), manager, true))
+			if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
 			{
-				continue;
+				updateList.add(cp);
 			}
-			
-			player.addItem("Manor", i.getReward(), rewardItemCount, manager, true);
+		}
+		
+		if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
+		{
+			manor.updateCurrentProcure(castleId, updateList);
 		}
 	}
 	
-	private static class Crop
+	private final class CropHolder extends UniqueItemHolder
 	{
-		private final int _objectId;
-		private final int _itemId;
 		private final int _manorId;
-		private final long _count;
-		private int _reward = 0;
-		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;
-		}
+		private CropProcure _cp;
+		private int _rewardId = 0;
 		
-		public int getItemId()
+		public CropHolder(int objectId, int id, long count, int manorId)
 		{
-			return _itemId;
+			super(id, objectId, count);
+			_manorId = manorId;
 		}
 		
-		public long getCount()
+		public final int getManorId()
 		{
-			return _count;
+			return _manorId;
 		}
 		
-		public int getReward()
+		public final long getPrice()
 		{
-			return _reward;
+			return getCount() * _cp.getPrice();
 		}
 		
-		public long getPrice()
+		public final CropProcure getCropProcure()
 		{
-			return _crop.getPrice() * _count;
-		}
-		
-		public long getFee(int castleId)
-		{
-			if (_manorId == castleId)
+			if (_cp == null)
 			{
-				return 0;
+				_cp = CastleManorManager.getInstance().getCropProcure(_manorId, getId(), false);
 			}
-			
-			return (getPrice() / 100) * 5; // 5% fee for selling to other manor
+			return _cp;
 		}
 		
-		public boolean getCrop()
+		public final int getRewardId()
 		{
-			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) || (_count == 0))
-			{
-				return false;
-			}
-			
-			if (_count > _crop.getAmount())
-			{
-				return false;
-			}
-			
-			if ((MAX_ADENA / _count) < _crop.getPrice())
-			{
-				return false;
-			}
-			
-			_reward = ManorData.getInstance().getRewardItem(_itemId, _crop.getReward());
-			return true;
-		}
-		
-		public boolean setCrop()
-		{
-			synchronized (_crop)
-			{
-				long amount = _crop.getAmount();
-				if (_count > amount)
-				{
-					return false; // not enough crops
-				}
-				_crop.setAmount(amount - _count);
-			}
-			if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
+			if (_rewardId == 0)
 			{
-				CastleManager.getInstance().getCastleById(_manorId).updateCrop(_itemId, _crop.getAmount(), CastleManorManager.PERIOD_CURRENT);
+				_rewardId = CastleManorManager.getInstance().getSeedByCrop(_cp.getId()).getReward(_cp.getReward());
 			}
-			return true;
+			return _rewardId;
 		}
 	}
 	
 	@Override
 	public String getType()
 	{
-		return _C__D0_02_REQUESTPROCURECROPLIST;
+		return "[C] D0:02 RequestProcureCropList";
 	}
-}
+}

+ 33 - 71
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSetCrop.java

@@ -18,135 +18,97 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import static com.l2jserver.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE;
-import static com.l2jserver.gameserver.model.itemcontainer.Inventory.MAX_ADENA;
-
 import java.util.ArrayList;
 import java.util.List;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.CastleManorManager;
 import com.l2jserver.gameserver.model.ClanPrivilege;
 import com.l2jserver.gameserver.model.CropProcure;
+import com.l2jserver.gameserver.model.L2Seed;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.entity.Castle;
-import com.l2jserver.gameserver.util.Util;
 
 /**
- * Format: (ch) dd [dddc] d - manor id d - size [ d - crop id d - sales d - price c - reward type ]
  * @author l3x
  */
-public class RequestSetCrop extends L2GameClientPacket
+public final class RequestSetCrop extends L2GameClientPacket
 {
-	private static final String _C__D0_04_REQUESTSETCROP = "[C] D0:04 RequestSetCrop";
-	
 	private static final int BATCH_LENGTH = 21; // length of the one item
 	
 	private int _manorId;
-	private Crop[] _items = null;
+	private List<CropProcure> _items;
 	
 	@Override
 	protected void readImpl()
 	{
 		_manorId = readD();
-		int count = readD();
+		final int count = readD();
 		if ((count <= 0) || (count > Config.MAX_ITEM_IN_PACKET) || ((count * BATCH_LENGTH) != _buf.remaining()))
 		{
 			return;
 		}
 		
-		_items = new Crop[count];
+		_items = new ArrayList<>(count);
 		for (int i = 0; i < count; i++)
 		{
-			int itemId = readD();
-			long sales = readQ();
-			long price = readQ();
-			int type = readC();
+			final int itemId = readD();
+			final long sales = readQ();
+			final long price = readQ();
+			final int type = readC();
 			if ((itemId < 1) || (sales < 0) || (price < 0))
 			{
-				_items = null;
+				_items.clear();
 				return;
 			}
-			_items[i] = new Crop(itemId, sales, price, type);
+			
+			if (sales > 0)
+			{
+				_items.add(new CropProcure(itemId, sales, type, sales, price));
+			}
 		}
 	}
 	
 	@Override
 	protected void runImpl()
 	{
-		if (_items == null)
-		{
-			return;
-		}
-		
-		L2PcInstance player = getClient().getActiveChar();
-		// check player privileges
-		if ((player == null) || (player.getClan() == null) || !player.hasClanPrivilege(ClanPrivilege.CS_MANOR_ADMIN))
+		if (_items.isEmpty())
 		{
 			return;
 		}
 		
-		// check castle owner
-		Castle currentCastle = CastleManager.getInstance().getCastleById(_manorId);
-		if (currentCastle.getOwnerId() != player.getClanId())
+		final CastleManorManager manor = CastleManorManager.getInstance();
+		if (!manor.isModifiablePeriod())
 		{
+			sendActionFailed();
 			return;
 		}
 		
-		if (!player.isInsideRadius(player.getLastFolkNPC(), INTERACTION_DISTANCE, true, false))
+		// Check player privileges
+		final L2PcInstance player = getActiveChar();
+		if ((player == null) || (player.getClan() == null) || (player.getClan().getCastleId() != _manorId) || !player.hasClanPrivilege(ClanPrivilege.CS_MANOR_ADMIN) || !player.getLastFolkNPC().canInteract(player))
 		{
+			sendActionFailed();
 			return;
 		}
 		
-		List<CropProcure> crops = new ArrayList<>(_items.length);
-		for (Crop i : _items)
+		// Filter crops with start amount lower than 0 and incorrect price
+		final List<CropProcure> list = new ArrayList<>(_items.size());
+		for (CropProcure cp : _items)
 		{
-			CropProcure s = i.getCrop();
-			if (s == null)
+			final L2Seed s = manor.getSeedByCrop(cp.getId(), _manorId);
+			if ((s != null) && (cp.getStartAmount() <= s.getCropLimit()) && (cp.getPrice() >= s.getCropMinPrice()) && (cp.getPrice() <= s.getCropMaxPrice()))
 			{
-				Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to overflow while setting manor.", Config.DEFAULT_PUNISH);
-				return;
+				list.add(cp);
 			}
-			crops.add(s);
-		}
-		
-		currentCastle.setCropProcure(crops, CastleManorManager.PERIOD_NEXT);
-		if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
-		{
-			currentCastle.saveCropData(CastleManorManager.PERIOD_NEXT);
-		}
-	}
-	
-	private static 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);
-		}
+		// Save crop list
+		manor.setNextCropProcure(list, _manorId);
 	}
 	
 	@Override
 	public String getType()
 	{
-		return _C__D0_04_REQUESTSETCROP;
+		return "[C] D0:04 RequestSetCrop";
 	}
-}
+}

+ 31 - 67
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestSetSeed.java

@@ -18,132 +18,96 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
-import static com.l2jserver.gameserver.model.actor.L2Npc.INTERACTION_DISTANCE;
-import static com.l2jserver.gameserver.model.itemcontainer.Inventory.MAX_ADENA;
-
 import java.util.ArrayList;
 import java.util.List;
 
 import com.l2jserver.Config;
-import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.CastleManorManager;
 import com.l2jserver.gameserver.model.ClanPrivilege;
+import com.l2jserver.gameserver.model.L2Seed;
 import com.l2jserver.gameserver.model.SeedProduction;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.entity.Castle;
-import com.l2jserver.gameserver.util.Util;
 
 /**
- * Format: (ch) dd [ddd] d - manor id d - size [ d - seed id d - sales d - price ]
  * @author l3x
  */
 public class RequestSetSeed extends L2GameClientPacket
 {
-	private static final String _C__D0_03_REQUESTSETSEED = "[C] D0:03 RequestSetSeed";
-	
 	private static final int BATCH_LENGTH = 20; // length of the one item
 	
 	private int _manorId;
-	private Seed _items[] = null;
+	private List<SeedProduction> _items;
 	
 	@Override
 	protected void readImpl()
 	{
 		_manorId = readD();
-		int count = readD();
+		final int count = readD();
 		if ((count <= 0) || (count > Config.MAX_ITEM_IN_PACKET) || ((count * BATCH_LENGTH) != _buf.remaining()))
 		{
 			return;
 		}
 		
-		_items = new Seed[count];
+		_items = new ArrayList<>(count);
 		for (int i = 0; i < count; i++)
 		{
-			int itemId = readD();
-			long sales = readQ();
-			long price = readQ();
+			final int itemId = readD();
+			final long sales = readQ();
+			final long price = readQ();
 			if ((itemId < 1) || (sales < 0) || (price < 0))
 			{
-				_items = null;
+				_items.clear();
 				return;
 			}
-			_items[i] = new Seed(itemId, sales, price);
+			
+			if (sales > 0)
+			{
+				_items.add(new SeedProduction(itemId, sales, price, sales));
+			}
 		}
 	}
 	
 	@Override
 	protected void runImpl()
 	{
-		if (_items == null)
-		{
-			return;
-		}
-		
-		L2PcInstance player = getClient().getActiveChar();
-		// check player privileges
-		if ((player == null) || (player.getClan() == null) || !player.hasClanPrivilege(ClanPrivilege.CS_MANOR_ADMIN))
+		if (_items.isEmpty())
 		{
 			return;
 		}
 		
-		// check castle owner
-		Castle currentCastle = CastleManager.getInstance().getCastleById(_manorId);
-		if (currentCastle.getOwnerId() != player.getClanId())
+		final CastleManorManager manor = CastleManorManager.getInstance();
+		if (!manor.isModifiablePeriod())
 		{
+			sendActionFailed();
 			return;
 		}
 		
-		if (!player.isInsideRadius(player.getLastFolkNPC(), INTERACTION_DISTANCE, true, false))
+		// Check player privileges
+		final L2PcInstance player = getActiveChar();
+		if ((player == null) || (player.getClan() == null) || (player.getClan().getCastleId() != _manorId) || !player.hasClanPrivilege(ClanPrivilege.CS_MANOR_ADMIN) || !player.getLastFolkNPC().canInteract(player))
 		{
+			sendActionFailed();
 			return;
 		}
 		
-		List<SeedProduction> seeds = new ArrayList<>(_items.length);
-		for (Seed i : _items)
+		// Filter seeds with start amount lower than 0 and incorrect price
+		final List<SeedProduction> list = new ArrayList<>(_items.size());
+		for (SeedProduction sp : _items)
 		{
-			SeedProduction s = i.getSeed();
-			if (s == null)
+			final L2Seed s = manor.getSeed(sp.getId());
+			if ((s != null) && (sp.getStartAmount() <= s.getSeedLimit()) && (sp.getPrice() >= s.getSeedMinPrice()) && (sp.getPrice() <= s.getSeedMaxPrice()))
 			{
-				Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to overflow while setting manor.", Config.DEFAULT_PUNISH);
-				return;
+				list.add(sp);
 			}
-			seeds.add(s);
-		}
-		
-		currentCastle.setSeedProduction(seeds, CastleManorManager.PERIOD_NEXT);
-		if (Config.ALT_MANOR_SAVE_ALL_ACTIONS)
-		{
-			currentCastle.saveSeedData(CastleManorManager.PERIOD_NEXT);
-		}
-	}
-	
-	private static 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);
-		}
+		// Save new list
+		manor.setNextSeedProduction(list, _manorId);
 	}
 	
 	@Override
 	public String getType()
 	{
-		return _C__D0_03_REQUESTSETSEED;
+		return "[C] D0:03 RequestSetSeed";
 	}
-}
+}

+ 14 - 34
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/BuyListSeed.java

@@ -18,36 +18,31 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
+import java.util.ArrayList;
 import java.util.List;
 
-import javolution.util.FastList;
-
+import com.l2jserver.gameserver.instancemanager.CastleManorManager;
 import com.l2jserver.gameserver.model.SeedProduction;
 
 /**
  * @author l3x
  */
-
 public final class BuyListSeed extends L2GameServerPacket
 {
 	private final int _manorId;
-	private List<Seed> _list = null;
 	private final long _money;
+	private final List<SeedProduction> _list = new ArrayList<>();
 	
-	public BuyListSeed(long currentMoney, int castleId, List<SeedProduction> seeds)
+	public BuyListSeed(long currentMoney, int castleId)
 	{
 		_money = currentMoney;
 		_manorId = castleId;
 		
-		if ((seeds != null) && (seeds.size() > 0))
+		for (SeedProduction s : CastleManorManager.getInstance().getSeedProduction(castleId, false))
 		{
-			_list = new FastList<>();
-			for (SeedProduction s : seeds)
+			if ((s.getAmount() > 0) && (s.getPrice() > 0))
 			{
-				if ((s.getCanProduce() > 0) && (s.getPrice() > 0))
-				{
-					_list.add(new Seed(s.getId(), s.getCanProduce(), s.getPrice()));
-				}
+				_list.add(s);
 			}
 		}
 	}
@@ -60,15 +55,15 @@ public final class BuyListSeed extends L2GameServerPacket
 		writeQ(_money); // current money
 		writeD(_manorId); // manor id
 		
-		if ((_list != null) && (_list.size() > 0))
+		if (!_list.isEmpty())
 		{
 			writeH(_list.size()); // list length
-			for (Seed s : _list)
+			for (SeedProduction s : _list)
 			{
-				writeD(s._itemId);
-				writeD(s._itemId);
+				writeD(s.getId());
+				writeD(s.getId());
 				writeD(0x00);
-				writeQ(s._count); // item count
+				writeQ(s.getAmount()); // item count
 				writeH(0x05); // Custom Type 2
 				writeH(0x00); // Custom Type 1
 				writeH(0x00); // Equipped
@@ -88,7 +83,7 @@ public final class BuyListSeed extends L2GameServerPacket
 				writeH(0x00);
 				writeH(0x00);
 				writeH(0x00);
-				writeQ(s._price); // price
+				writeQ(s.getPrice()); // price
 			}
 			_list.clear();
 		}
@@ -96,20 +91,5 @@ public final class BuyListSeed extends L2GameServerPacket
 		{
 			writeH(0x00);
 		}
-		
-	}
-	
-	private static class Seed
-	{
-		public final int _itemId;
-		public final long _count;
-		public final long _price;
-		
-		public Seed(int itemId, long count, long price)
-		{
-			_itemId = itemId;
-			_count = count;
-			_price = price;
-		}
 	}
-}
+}

+ 11 - 14
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExSendManorList.java

@@ -18,33 +18,30 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
+import java.util.Comparator;
 import java.util.List;
 
-import javolution.util.FastList;
+import com.l2jserver.gameserver.instancemanager.CastleManager;
+import com.l2jserver.gameserver.model.entity.Castle;
 
 /**
  * @author l3x
  */
-public class ExSendManorList extends L2GameServerPacket
+public final class ExSendManorList extends L2GameServerPacket
 {
-	private final List<String> _manors;
-	
-	public ExSendManorList(FastList<String> manors)
-	{
-		_manors = manors;
-	}
-	
 	@Override
 	protected void writeImpl()
 	{
+		final List<Castle> castles = CastleManager.getInstance().getCastles();
+		castles.sort(Comparator.comparing(Castle::getResidenceId));
+		
 		writeC(0xFE);
 		writeH(0x22);
-		writeD(_manors.size());
-		int i = 1;
-		for (String manor : _manors)
+		writeD(castles.size());
+		for (Castle castle : castles)
 		{
-			writeD(i++);
-			writeS(manor);
+			writeD(castle.getResidenceId());
+			writeS(castle.getName().toLowerCase());
 		}
 	}
 }

+ 27 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowCropInfo.java

@@ -20,8 +20,9 @@ package com.l2jserver.gameserver.network.serverpackets;
 
 import java.util.List;
 
-import com.l2jserver.gameserver.datatables.ManorData;
+import com.l2jserver.gameserver.instancemanager.CastleManorManager;
 import com.l2jserver.gameserver.model.CropProcure;
+import com.l2jserver.gameserver.model.L2Seed;
 
 /**
  * @author l3x
@@ -30,11 +31,15 @@ public class ExShowCropInfo extends L2GameServerPacket
 {
 	private final List<CropProcure> _crops;
 	private final int _manorId;
+	private final boolean _hideButtons;
 	
-	public ExShowCropInfo(int manorId, List<CropProcure> crops)
+	public ExShowCropInfo(int manorId, boolean nextPeriod, boolean hideButtons)
 	{
 		_manorId = manorId;
-		_crops = crops;
+		_hideButtons = hideButtons;
+		
+		final CastleManorManager manor = CastleManorManager.getInstance();
+		_crops = (nextPeriod && !manor.isManorApproved()) ? null : manor.getCropProcure(manorId, nextPeriod);
 	}
 	
 	@Override
@@ -42,7 +47,7 @@ public class ExShowCropInfo extends L2GameServerPacket
 	{
 		writeC(0xFE); // Id
 		writeH(0x24); // SubId
-		writeC(0x00);
+		writeC(_hideButtons ? 0x01 : 0x00); // Hide "Crop Sales" button
 		writeD(_manorId); // Manor ID
 		writeD(0x00);
 		if (_crops == null)
@@ -58,11 +63,23 @@ public class ExShowCropInfo extends L2GameServerPacket
 			writeQ(crop.getStartAmount()); // Buy
 			writeQ(crop.getPrice()); // Buy price
 			writeC(crop.getReward()); // Reward
-			writeD(ManorData.getInstance().getSeedLevelByCrop(crop.getId())); // Seed Level
-			writeC(0x01); // rewrad 1 Type
-			writeD(ManorData.getInstance().getRewardItem(crop.getId(), 1)); // Rewrad 1 Type Item Id
-			writeC(0x01); // rewrad 2 Type
-			writeD(ManorData.getInstance().getRewardItem(crop.getId(), 2)); // Rewrad 2 Type Item Id
+			final L2Seed seed = CastleManorManager.getInstance().getSeedByCrop(crop.getId());
+			if (seed == null)
+			{
+				writeD(0); // Seed level
+				writeC(0x01); // Reward 1
+				writeD(0); // Reward 1 - item id
+				writeC(0x01); // Reward 2
+				writeD(0); // Reward 2 - item id
+			}
+			else
+			{
+				writeD(seed.getLevel()); // Seed level
+				writeC(0x01); // Reward 1
+				writeD(seed.getReward(1)); // Reward 1 - item id
+				writeC(0x01); // Reward 2
+				writeD(seed.getReward(2)); // Reward 2 - item id
+			}
 		}
 	}
-}
+}

+ 60 - 63
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowCropSetting.java

@@ -18,13 +18,13 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
 
-import com.l2jserver.gameserver.datatables.ManorData;
-import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.CastleManorManager;
 import com.l2jserver.gameserver.model.CropProcure;
-import com.l2jserver.gameserver.model.entity.Castle;
+import com.l2jserver.gameserver.model.L2Seed;
 
 /**
  * @author l3x
@@ -32,54 +32,29 @@ import com.l2jserver.gameserver.model.entity.Castle;
 public class ExShowCropSetting extends L2GameServerPacket
 {
 	private final int _manorId;
-	private final int _count;
-	private final long[] _cropData; // data to send, size:_count*14
+	private final Set<L2Seed> _seeds;
+	private final Map<Integer, CropProcure> _current = new HashMap<>();
+	private final Map<Integer, CropProcure> _next = new HashMap<>();
 	
 	public ExShowCropSetting(int manorId)
 	{
+		final CastleManorManager manor = CastleManorManager.getInstance();
 		_manorId = manorId;
-		Castle c = CastleManager.getInstance().getCastleById(_manorId);
-		List<Integer> crops = ManorData.getInstance().getCropsForCastle(_manorId);
-		_count = crops.size();
-		_cropData = new long[_count * 14];
-		int i = 0;
-		for (int cr : crops)
+		_seeds = manor.getSeedsForCastle(_manorId);
+		for (L2Seed s : _seeds)
 		{
-			_cropData[(i * 14) + 0] = cr;
-			_cropData[(i * 14) + 1] = ManorData.getInstance().getSeedLevelByCrop(cr);
-			_cropData[(i * 14) + 2] = ManorData.getInstance().getRewardItem(cr, 1);
-			_cropData[(i * 14) + 3] = ManorData.getInstance().getRewardItem(cr, 2);
-			_cropData[(i * 14) + 4] = ManorData.getInstance().getCropPuchaseLimit(cr);
-			_cropData[(i * 14) + 5] = 0; // Looks like not used
-			_cropData[(i * 14) + 6] = (ManorData.getInstance().getCropBasicPrice(cr) * 60) / 100;
-			_cropData[(i * 14) + 7] = ManorData.getInstance().getCropBasicPrice(cr) * 10;
-			CropProcure cropPr = c.getCrop(cr, CastleManorManager.PERIOD_CURRENT);
-			if (cropPr != null)
+			// Current period
+			CropProcure cp = manor.getCropProcure(manorId, s.getCropId(), false);
+			if (cp != null)
 			{
-				_cropData[(i * 14) + 8] = cropPr.getStartAmount();
-				_cropData[(i * 14) + 9] = cropPr.getPrice();
-				_cropData[(i * 14) + 10] = cropPr.getReward();
+				_current.put(s.getCropId(), cp);
 			}
-			else
-			{
-				_cropData[(i * 14) + 8] = 0;
-				_cropData[(i * 14) + 9] = 0;
-				_cropData[(i * 14) + 10] = 0;
-			}
-			cropPr = c.getCrop(cr, CastleManorManager.PERIOD_NEXT);
-			if (cropPr != null)
-			{
-				_cropData[(i * 14) + 11] = cropPr.getStartAmount();
-				_cropData[(i * 14) + 12] = cropPr.getPrice();
-				_cropData[(i * 14) + 13] = cropPr.getReward();
-			}
-			else
+			// Next period
+			cp = manor.getCropProcure(manorId, s.getCropId(), true);
+			if (cp != null)
 			{
-				_cropData[(i * 14) + 11] = 0;
-				_cropData[(i * 14) + 12] = 0;
-				_cropData[(i * 14) + 13] = 0;
+				_next.put(s.getCropId(), cp);
 			}
-			i++;
 		}
 	}
 	
@@ -90,29 +65,51 @@ public class ExShowCropSetting extends L2GameServerPacket
 		writeH(0x2b); // SubId
 		
 		writeD(_manorId); // manor id
-		writeD(_count); // size
+		writeD(_seeds.size()); // size
 		
-		for (int i = 0; i < _count; i++)
+		CropProcure cp;
+		for (L2Seed s : _seeds)
 		{
-			writeD((int) _cropData[(i * 14) + 0]); // crop id
-			writeD((int) _cropData[(i * 14) + 1]); // seed level
+			writeD(s.getCropId()); // crop id
+			writeD(s.getLevel()); // seed level
 			writeC(1);
-			writeD((int) _cropData[(i * 14) + 2]); // reward 1 id
+			writeD(s.getReward(1)); // reward 1 id
 			writeC(1);
-			writeD((int) _cropData[(i * 14) + 3]); // reward 2 id
-			
-			writeD((int) _cropData[(i * 14) + 4]); // next sale limit
-			writeD((int) _cropData[(i * 14) + 5]); // ???
-			writeD((int) _cropData[(i * 14) + 6]); // min crop price
-			writeD((int) _cropData[(i * 14) + 7]); // max crop price
-			
-			writeQ(_cropData[(i * 14) + 8]); // today buy
-			writeQ(_cropData[(i * 14) + 9]); // today price
-			writeC((int) _cropData[(i * 14) + 10]); // today reward
-			
-			writeQ(_cropData[(i * 14) + 11]); // next buy
-			writeQ(_cropData[(i * 14) + 12]); // next price
-			writeC((int) _cropData[(i * 14) + 13]); // next reward
+			writeD(s.getReward(2)); // reward 2 id
+			writeD(s.getCropLimit()); // next sale limit
+			writeD(0); // ???
+			writeD(s.getCropMinPrice()); // min crop price
+			writeD(s.getCropMaxPrice()); // max crop price
+			// Current period
+			if (_current.containsKey(s.getCropId()))
+			{
+				cp = _current.get(s.getCropId());
+				writeQ(cp.getStartAmount()); // buy
+				writeQ(cp.getPrice()); // price
+				writeC(cp.getReward()); // reward
+			}
+			else
+			{
+				writeQ(0);
+				writeQ(0);
+				writeC(0);
+			}
+			// Next period
+			if (_next.containsKey(s.getCropId()))
+			{
+				cp = _next.get(s.getCropId());
+				writeQ(cp.getStartAmount()); // buy
+				writeQ(cp.getPrice()); // price
+				writeC(cp.getReward()); // reward
+			}
+			else
+			{
+				writeQ(0);
+				writeQ(0);
+				writeC(0);
+			}
 		}
+		_next.clear();
+		_current.clear();
 	}
-}
+}

+ 19 - 22
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowManorDefaultInfo.java

@@ -20,18 +20,21 @@ package com.l2jserver.gameserver.network.serverpackets;
 
 import java.util.List;
 
-import com.l2jserver.gameserver.datatables.ManorData;
+import com.l2jserver.gameserver.instancemanager.CastleManorManager;
+import com.l2jserver.gameserver.model.L2Seed;
 
 /**
  * @author l3x
  */
-public class ExShowManorDefaultInfo extends L2GameServerPacket
+public final class ExShowManorDefaultInfo extends L2GameServerPacket
 {
-	private List<Integer> _crops = null;
+	private final List<L2Seed> _crops;
+	private final boolean _hideButtons;
 	
-	public ExShowManorDefaultInfo()
+	public ExShowManorDefaultInfo(boolean hideButtons)
 	{
-		_crops = ManorData.getInstance().getAllCrops();
+		_crops = CastleManorManager.getInstance().getCrops();
+		_hideButtons = hideButtons;
 	}
 	
 	@Override
@@ -39,24 +42,18 @@ public class ExShowManorDefaultInfo extends L2GameServerPacket
 	{
 		writeC(0xFE);
 		writeH(0x25);
-		writeC(0);
+		writeC(_hideButtons ? 0x01 : 0x00); // Hide "Seed Purchase" and "Crop Sales" buttons
 		writeD(_crops.size());
-		for (int cropId : _crops)
+		for (L2Seed crop : _crops)
 		{
-			writeD(cropId); // crop Id
-			writeD(ManorData.getInstance().getSeedLevelByCrop(cropId)); // level
-			writeD(ManorData.getInstance().getSeedBasicPriceByCrop(cropId)); // seed
-			// price
-			writeD(ManorData.getInstance().getCropBasicPrice(cropId)); // crop
-			// price
-			writeC(1); // rewrad 1 Type
-			writeD(ManorData.getInstance().getRewardItem(cropId, 1)); // Rewrad 1
-			// Type Item
-			// Id
-			writeC(1); // rewrad 2 Type
-			writeD(ManorData.getInstance().getRewardItem(cropId, 2)); // Rewrad 2
-			// Type Item
-			// Id
+			writeD(crop.getCropId()); // crop Id
+			writeD(crop.getLevel()); // level
+			writeD(crop.getSeedReferencePrice()); // seed price
+			writeD(crop.getCropReferencePrice()); // crop price
+			writeC(1); // Reward 1 type
+			writeD(crop.getReward(1)); // Reward 1 itemId
+			writeC(1); // Reward 2 type
+			writeD(crop.getReward(2)); // Reward 2 itemId
 		}
 	}
-}
+}

+ 5 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowProcureCropDetail.java

@@ -32,17 +32,15 @@ import com.l2jserver.gameserver.model.entity.Castle;
 public class ExShowProcureCropDetail extends L2GameServerPacket
 {
 	private final int _cropId;
-	
-	private final Map<Integer, CropProcure> _castleCrops;
+	private final Map<Integer, CropProcure> _castleCrops = new HashMap<>();
 	
 	public ExShowProcureCropDetail(int cropId)
 	{
 		_cropId = cropId;
-		_castleCrops = new HashMap<>();
 		
 		for (Castle c : CastleManager.getInstance().getCastles())
 		{
-			CropProcure cropItem = c.getCrop(_cropId, CastleManorManager.PERIOD_CURRENT);
+			final CropProcure cropItem = CastleManorManager.getInstance().getCropProcure(c.getResidenceId(), cropId, false);
 			if ((cropItem != null) && (cropItem.getAmount() > 0))
 			{
 				_castleCrops.put(c.getResidenceId(), cropItem);
@@ -59,10 +57,10 @@ public class ExShowProcureCropDetail extends L2GameServerPacket
 		writeD(_cropId); // crop id
 		writeD(_castleCrops.size()); // size
 		
-		for (int manorId : _castleCrops.keySet())
+		for (Map.Entry<Integer, CropProcure> entry : _castleCrops.entrySet())
 		{
-			CropProcure crop = _castleCrops.get(manorId);
-			writeD(manorId); // manor name
+			final CropProcure crop = entry.getValue();
+			writeD(entry.getKey()); // manor name
 			writeQ(crop.getAmount()); // buy residual
 			writeQ(crop.getPrice()); // buy price
 			writeC(crop.getReward()); // reward type

+ 30 - 13
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowSeedInfo.java

@@ -20,7 +20,8 @@ package com.l2jserver.gameserver.network.serverpackets;
 
 import java.util.List;
 
-import com.l2jserver.gameserver.datatables.ManorData;
+import com.l2jserver.gameserver.instancemanager.CastleManorManager;
+import com.l2jserver.gameserver.model.L2Seed;
 import com.l2jserver.gameserver.model.SeedProduction;
 
 /**
@@ -30,11 +31,15 @@ public class ExShowSeedInfo extends L2GameServerPacket
 {
 	private final List<SeedProduction> _seeds;
 	private final int _manorId;
+	private final boolean _hideButtons;
 	
-	public ExShowSeedInfo(int manorId, List<SeedProduction> seeds)
+	public ExShowSeedInfo(int manorId, boolean nextPeriod, boolean hideButtons)
 	{
 		_manorId = manorId;
-		_seeds = seeds;
+		_hideButtons = hideButtons;
+		
+		final CastleManorManager manor = CastleManorManager.getInstance();
+		_seeds = (nextPeriod && !manor.isManorApproved()) ? null : manor.getSeedProduction(manorId, nextPeriod);
 	}
 	
 	@Override
@@ -42,9 +47,9 @@ public class ExShowSeedInfo extends L2GameServerPacket
 	{
 		writeC(0xFE); // Id
 		writeH(0x23); // SubId
-		writeC(0x00);
+		writeC(_hideButtons ? 0x01 : 0x00); // Hide "Seed Purchase" button
 		writeD(_manorId); // Manor ID
-		writeD(0x00);
+		writeD(0x00); // Unknown
 		if (_seeds == null)
 		{
 			writeD(0);
@@ -54,14 +59,26 @@ public class ExShowSeedInfo extends L2GameServerPacket
 		for (SeedProduction seed : _seeds)
 		{
 			writeD(seed.getId()); // Seed id
-			writeQ(seed.getCanProduce()); // Left to buy
-			writeQ(seed.getStartProduce()); // Started amount
+			writeQ(seed.getAmount()); // Left to buy
+			writeQ(seed.getStartAmount()); // Started amount
 			writeQ(seed.getPrice()); // Sell Price
-			writeD(ManorData.getInstance().getSeedLevel(seed.getId())); // Seed Level
-			writeC(0x01); // reward 1 Type
-			writeD(ManorData.getInstance().getRewardItemBySeed(seed.getId(), 1)); // Reward 1 Type Item Id
-			writeC(0x01); // reward 2 Type
-			writeD(ManorData.getInstance().getRewardItemBySeed(seed.getId(), 2)); // Reward 2 Type Item Id
+			final L2Seed s = CastleManorManager.getInstance().getSeed(seed.getId());
+			if (s == null)
+			{
+				writeD(0); // Seed level
+				writeC(0x01); // Reward 1
+				writeD(0); // Reward 1 - item id
+				writeC(0x01); // Reward 2
+				writeD(0); // Reward 2 - item id
+			}
+			else
+			{
+				writeD(s.getLevel()); // Seed level
+				writeC(0x01); // Reward 1
+				writeD(s.getReward(1)); // Reward 1 - item id
+				writeC(0x01); // Reward 2
+				writeD(s.getReward(2)); // Reward 2 - item id
+			}
 		}
 	}
-}
+}

+ 56 - 56
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowSeedSetting.java

@@ -18,13 +18,13 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
 
-import com.l2jserver.gameserver.datatables.ManorData;
-import com.l2jserver.gameserver.instancemanager.CastleManager;
 import com.l2jserver.gameserver.instancemanager.CastleManorManager;
+import com.l2jserver.gameserver.model.L2Seed;
 import com.l2jserver.gameserver.model.SeedProduction;
-import com.l2jserver.gameserver.model.entity.Castle;
 
 /**
  * @author l3x
@@ -32,50 +32,29 @@ import com.l2jserver.gameserver.model.entity.Castle;
 public class ExShowSeedSetting extends L2GameServerPacket
 {
 	private final int _manorId;
-	private final int _count;
-	private final long[] _seedData; // data to send, size:_count*12
+	private final Set<L2Seed> _seeds;
+	private final Map<Integer, SeedProduction> _current = new HashMap<>();
+	private final Map<Integer, SeedProduction> _next = new HashMap<>();
 	
 	public ExShowSeedSetting(int manorId)
 	{
+		final CastleManorManager manor = CastleManorManager.getInstance();
 		_manorId = manorId;
-		Castle c = CastleManager.getInstance().getCastleById(_manorId);
-		List<Integer> seeds = ManorData.getInstance().getSeedsForCastle(_manorId);
-		_count = seeds.size();
-		_seedData = new long[_count * 12];
-		int i = 0;
-		for (int s : seeds)
+		_seeds = manor.getSeedsForCastle(_manorId);
+		for (L2Seed s : _seeds)
 		{
-			_seedData[(i * 12) + 0] = s;
-			_seedData[(i * 12) + 1] = ManorData.getInstance().getSeedLevel(s);
-			_seedData[(i * 12) + 2] = ManorData.getInstance().getRewardItemBySeed(s, 1);
-			_seedData[(i * 12) + 3] = ManorData.getInstance().getRewardItemBySeed(s, 2);
-			_seedData[(i * 12) + 4] = ManorData.getInstance().getSeedSaleLimit(s);
-			_seedData[(i * 12) + 5] = ManorData.getInstance().getSeedBuyPrice(s);
-			_seedData[(i * 12) + 6] = (ManorData.getInstance().getSeedBasicPrice(s) * 60) / 100;
-			_seedData[(i * 12) + 7] = ManorData.getInstance().getSeedBasicPrice(s) * 10;
-			SeedProduction seedPr = c.getSeed(s, CastleManorManager.PERIOD_CURRENT);
-			if (seedPr != null)
+			// Current period
+			SeedProduction sp = manor.getSeedProduct(manorId, s.getSeedId(), false);
+			if (sp != null)
 			{
-				_seedData[(i * 12) + 8] = seedPr.getStartProduce();
-				_seedData[(i * 12) + 9] = seedPr.getPrice();
+				_current.put(s.getSeedId(), sp);
 			}
-			else
-			{
-				_seedData[(i * 12) + 8] = 0;
-				_seedData[(i * 12) + 9] = 0;
-			}
-			seedPr = c.getSeed(s, CastleManorManager.PERIOD_NEXT);
-			if (seedPr != null)
-			{
-				_seedData[(i * 12) + 10] = seedPr.getStartProduce();
-				_seedData[(i * 12) + 11] = seedPr.getPrice();
-			}
-			else
+			// Next period
+			sp = manor.getSeedProduct(manorId, s.getSeedId(), true);
+			if (sp != null)
 			{
-				_seedData[(i * 12) + 10] = 0;
-				_seedData[(i * 12) + 11] = 0;
+				_next.put(s.getSeedId(), sp);
 			}
-			i++;
 		}
 	}
 	
@@ -86,26 +65,47 @@ public class ExShowSeedSetting extends L2GameServerPacket
 		writeH(0x26); // SubId
 		
 		writeD(_manorId); // manor id
-		writeD(_count); // size
+		writeD(_seeds.size()); // size
 		
-		for (int i = 0; i < _count; i++)
+		SeedProduction sp;
+		for (L2Seed s : _seeds)
 		{
-			writeD((int) _seedData[(i * 12) + 0]); // seed id
-			writeD((int) _seedData[(i * 12) + 1]); // level
+			writeD(s.getSeedId()); // seed id
+			writeD(s.getLevel()); // level
 			writeC(1);
-			writeD((int) _seedData[(i * 12) + 2]); // reward 1 id
+			writeD(s.getReward(1)); // reward 1 id
 			writeC(1);
-			writeD((int) _seedData[(i * 12) + 3]); // reward 2 id
-			
-			writeD((int) _seedData[(i * 12) + 4]); // next sale limit
-			writeD((int) _seedData[(i * 12) + 5]); // price for castle to produce 1
-			writeD((int) _seedData[(i * 12) + 6]); // min seed price
-			writeD((int) _seedData[(i * 12) + 7]); // max seed price
-			
-			writeQ(_seedData[(i * 12) + 8]); // today sales
-			writeQ(_seedData[(i * 12) + 9]); // today price
-			writeQ(_seedData[(i * 12) + 10]); // next sales
-			writeQ(_seedData[(i * 12) + 11]); // next price
+			writeD(s.getReward(2)); // reward 2 id
+			writeD(s.getSeedLimit()); // next sale limit
+			writeD(s.getSeedReferencePrice()); // price for castle to produce 1
+			writeD(s.getSeedMinPrice()); // min seed price
+			writeD(s.getSeedMaxPrice()); // max seed price
+			// Current period
+			if (_current.containsKey(s.getSeedId()))
+			{
+				sp = _current.get(s.getSeedId());
+				writeQ(sp.getStartAmount()); // sales
+				writeQ(sp.getPrice()); // price
+			}
+			else
+			{
+				writeQ(0);
+				writeQ(0);
+			}
+			// Next period
+			if (_next.containsKey(s.getSeedId()))
+			{
+				sp = _next.get(s.getSeedId());
+				writeQ(sp.getStartAmount()); // sales
+				writeQ(sp.getPrice()); // price
+			}
+			else
+			{
+				writeQ(0);
+				writeQ(0);
+			}
 		}
+		_current.clear();
+		_next.clear();
 	}
-}
+}

+ 21 - 27
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ExShowSellCropList.java

@@ -18,42 +18,37 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 
-import javolution.util.FastMap;
-
-import com.l2jserver.gameserver.datatables.ManorData;
+import com.l2jserver.gameserver.instancemanager.CastleManorManager;
 import com.l2jserver.gameserver.model.CropProcure;
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.L2Seed;
+import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 
 /**
  * @author l3x
  */
-
-public class ExShowSellCropList extends L2GameServerPacket
+public final class ExShowSellCropList extends L2GameServerPacket
 {
-	private int _manorId = 1;
-	private final FastMap<Integer, L2ItemInstance> _cropsItems;
-	private final FastMap<Integer, CropProcure> _castleCrops;
+	private final int _manorId;
+	private final Map<Integer, L2ItemInstance> _cropsItems = new HashMap<>();
+	private final Map<Integer, CropProcure> _castleCrops = new HashMap<>();
 	
-	public ExShowSellCropList(L2PcInstance player, int manorId, List<CropProcure> crops)
+	public ExShowSellCropList(PcInventory inventory, int manorId)
 	{
 		_manorId = manorId;
-		_castleCrops = new FastMap<>();
-		_cropsItems = new FastMap<>();
-		
-		List<Integer> allCrops = ManorData.getInstance().getAllCrops();
-		for (int cropId : allCrops)
+		for (int cropId : CastleManorManager.getInstance().getCropIds())
 		{
-			L2ItemInstance item = player.getInventory().getItemByItemId(cropId);
+			final L2ItemInstance item = inventory.getItemByItemId(cropId);
 			if (item != null)
 			{
 				_cropsItems.put(cropId, item);
 			}
 		}
 		
-		for (CropProcure crop : crops)
+		for (CropProcure crop : CastleManorManager.getInstance().getCropProcure(_manorId, false))
 		{
 			if (_cropsItems.containsKey(crop.getId()) && (crop.getAmount() > 0))
 			{
@@ -66,24 +61,23 @@ public class ExShowSellCropList extends L2GameServerPacket
 	public void writeImpl()
 	{
 		writeC(0xFE);
-		writeH(0x2c);
+		writeH(0x2C);
 		
 		writeD(_manorId); // manor id
 		writeD(_cropsItems.size()); // size
-		
 		for (L2ItemInstance item : _cropsItems.values())
 		{
+			final L2Seed seed = CastleManorManager.getInstance().getSeedByCrop(item.getId());
 			writeD(item.getObjectId()); // Object id
-			writeD(item.getDisplayId()); // crop id
-			writeD(ManorData.getInstance().getSeedLevelByCrop(item.getId())); // seed level
+			writeD(item.getId()); // crop id
+			writeD(seed.getLevel()); // seed level
 			writeC(0x01);
-			writeD(ManorData.getInstance().getRewardItem(item.getId(), 1)); // reward 1 id
+			writeD(seed.getReward(1)); // reward 1 id
 			writeC(0x01);
-			writeD(ManorData.getInstance().getRewardItem(item.getId(), 2)); // reward 2 id
-			
+			writeD(seed.getReward(2)); // reward 2 id
 			if (_castleCrops.containsKey(item.getId()))
 			{
-				CropProcure crop = _castleCrops.get(item.getId());
+				final CropProcure crop = _castleCrops.get(item.getId());
 				writeD(_manorId); // manor
 				writeQ(crop.getAmount()); // buy residual
 				writeQ(crop.getPrice()); // buy price
@@ -99,4 +93,4 @@ public class ExShowSellCropList extends L2GameServerPacket
 			writeQ(item.getCount()); // my crops
 		}
 	}
-}
+}

+ 5 - 14
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/SellListProcure.java

@@ -18,34 +18,25 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
-import java.util.List;
+import java.util.HashMap;
 import java.util.Map;
 
-import javolution.util.FastList;
-import javolution.util.FastMap;
-
-import com.l2jserver.gameserver.instancemanager.CastleManager;
+import com.l2jserver.gameserver.instancemanager.CastleManorManager;
 import com.l2jserver.gameserver.model.CropProcure;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 
 public class SellListProcure extends L2GameServerPacket
 {
-	private final L2PcInstance _activeChar;
 	private final long _money;
-	private final Map<L2ItemInstance, Long> _sellList = new FastMap<>();
-	private List<CropProcure> _procureList = new FastList<>();
-	private final int _castle;
+	private final Map<L2ItemInstance, Long> _sellList = new HashMap<>();
 	
 	public SellListProcure(L2PcInstance player, int castleId)
 	{
 		_money = player.getAdena();
-		_activeChar = player;
-		_castle = castleId;
-		_procureList = CastleManager.getInstance().getCastleById(_castle).getCropProcure(0);
-		for (CropProcure c : _procureList)
+		for (CropProcure c : CastleManorManager.getInstance().getCropProcure(castleId, false))
 		{
-			L2ItemInstance item = _activeChar.getInventory().getItemByItemId(c.getId());
+			final L2ItemInstance item = player.getInventory().getItemByItemId(c.getId());
 			if ((item != null) && (c.getAmount() > 0))
 			{
 				_sellList.put(item, c.getAmount());

+ 9 - 50
L2J_Server_BETA/java/com/l2jserver/gameserver/util/HtmlUtil.java

@@ -23,6 +23,7 @@ import java.util.Collection;
 import java.util.function.Function;
 
 import com.l2jserver.gameserver.model.PageResult;
+import com.l2jserver.util.StringUtil;
 
 /**
  * A class containing useful methods for constructing HTML
@@ -164,62 +165,20 @@ public class HtmlUtil
 	{
 		current = Math.min(current, max);
 		final StringBuilder sb = new StringBuilder();
-		sb.append("<table width=");
-		sb.append(width);
-		sb.append(" cellpadding=0 cellspacing=0>");
-		sb.append("<tr>");
-		sb.append("<td background=\"");
-		sb.append(backgroundImage);
-		sb.append("\">");
-		sb.append("<img src=\"");
-		sb.append(image);
-		sb.append("\" width=");
-		sb.append((long) (((double) current / max) * width));
-		sb.append(" height=");
-		sb.append(imageHeight);
-		sb.append(">");
-		sb.append("</td>");
-		sb.append("</tr>");
-		sb.append("<tr>");
-		sb.append("<td align=center>");
-		sb.append("<table cellpadding=0 cellspacing=");
-		sb.append(top);
-		sb.append(">");
-		sb.append("<tr>");
-		sb.append("<td>");
+		StringUtil.append(sb, "<table width=", String.valueOf(width), " cellpadding=0 cellspacing=0><tr><td background=\"" + backgroundImage + "\">");
+		StringUtil.append(sb, "<img src=\"" + image + "\" width=", String.valueOf((long) (((double) current / max) * width)), " height=", String.valueOf(imageHeight), ">");
+		StringUtil.append(sb, "</td></tr><tr><td align=center><table cellpadding=0 cellspacing=", String.valueOf(top), "><tr><td>");
 		if (displayAsPercentage)
 		{
-			sb.append("<table cellpadding=0 cellspacing=2>");
-			sb.append("<tr><td>");
-			sb.append(String.format("%.2f%%", ((double) current / max) * 100));
-			sb.append("</td></tr>");
-			sb.append("</table>");
+			StringUtil.append(sb, "<table cellpadding=0 cellspacing=2><tr><td>", String.format("%.2f%%", ((double) current / max) * 100), "</td></tr></table>");
 		}
 		else
 		{
-			int tdWidth = (width - 10) / 2;
-			sb.append("<table cellpadding=0 cellspacing=0>");
-			sb.append("<tr>");
-			sb.append("<td width=");
-			sb.append(tdWidth);
-			sb.append(" align=right>");
-			sb.append(current);
-			sb.append("</td>");
-			sb.append("<td width=10 align=center>/</td>");
-			sb.append("<td width=");
-			sb.append(tdWidth);
-			sb.append(">");
-			sb.append(max);
-			sb.append("</td>");
-			sb.append("</tr>");
-			sb.append("</table>");
+			final String tdWidth = String.valueOf((width - 10) / 2);
+			StringUtil.append(sb, "<table cellpadding=0 cellspacing=0><tr><td width=" + tdWidth + " align=right>", String.valueOf(current), "</td>");
+			StringUtil.append(sb, "<td width=10 align=center>/</td><td width=" + tdWidth + ">", String.valueOf(max), "</td></tr></table>");
 		}
-		sb.append("</td>");
-		sb.append("</tr>");
-		sb.append("</table>");
-		sb.append("</td>");
-		sb.append("</tr>");
-		sb.append("</table>");
+		StringUtil.append(sb, "</td></tr></table></td></tr></table>");
 		return sb.toString();
 	}
 	

+ 3 - 19
L2J_Server_BETA/java/com/l2jserver/util/StringUtil.java

@@ -250,14 +250,7 @@ public final class StringUtil
 		int length = 0;
 		for (final String string : strings)
 		{
-			if (string == null)
-			{
-				length += 4;
-			}
-			else
-			{
-				length += string.length();
-			}
+			length += (string == null) ? 4 : string.length();
 		}
 		return length;
 	}
@@ -270,19 +263,10 @@ public final class StringUtil
 	public static int getLength(final String[] strings)
 	{
 		int length = 0;
-		
 		for (final String string : strings)
 		{
-			if (string == null)
-			{
-				length += 4;
-			}
-			else
-			{
-				length += string.length();
-			}
+			length += (string == null) ? 4 : string.length();
 		}
-		
 		return length;
 	}
 	
@@ -298,4 +282,4 @@ public final class StringUtil
 		TextBuilder.recycle(sbString);
 		return result;
 	}
-}
+}

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff