Browse Source

Extractable item changes. Requires [DP5894] . Thx Kerberos
- added support for group rewards and extractable items now using skills

Gigiikun 16 years ago
parent
commit
51f4779ef7

+ 33 - 12
L2_GameServer/java/net/sf/l2j/gameserver/datatables/ExtractableItemsData.java

@@ -22,6 +22,7 @@
 package net.sf.l2j.gameserver.datatables;
 
 import java.io.File;
+import java.util.Map;
 import java.util.Scanner;
 import java.util.logging.Logger;
 
@@ -30,12 +31,13 @@ import javolution.util.FastMap;
 import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.model.L2ExtractableItem;
 import net.sf.l2j.gameserver.model.L2ExtractableProductItem;
+import net.sf.l2j.gameserver.model.L2Skill;
 
 public class ExtractableItemsData
 {
 	protected static final Logger _log = Logger.getLogger(ExtractableItemsData.class.getName());
-	//          Map<itemid, L2ExtractableItem>
-	private FastMap<Integer, L2ExtractableItem> _items;
+	//          Map<FastMap<itemid, skill>, L2ExtractableItem>
+	private Map<Integer, L2ExtractableItem> _items = new FastMap<Integer, L2ExtractableItem>();
 	
 	private static ExtractableItemsData _instance = null;
 	
@@ -49,7 +51,7 @@ public class ExtractableItemsData
 	
 	public ExtractableItemsData()
 	{
-		_items = new FastMap<Integer, L2ExtractableItem>();
+		_items.clear();
 		
 		Scanner s;
 		
@@ -69,7 +71,7 @@ public class ExtractableItemsData
 		{
 			lineCount++;
 			
-			String line = s.nextLine();
+			String line = s.nextLine().trim();
 			
 			if (line.startsWith("#"))
 				continue;
@@ -79,10 +81,14 @@ public class ExtractableItemsData
 			String[] lineSplit = line.split(";");
 			boolean ok = true;
 			int itemID = 0;
+			int skillID = 0;
+			int skillLvl = 0;
 			
 			try
 			{
 				itemID = Integer.parseInt(lineSplit[0]);
+				skillID = Integer.parseInt(lineSplit[1]);
+				skillLvl = Integer.parseInt(lineSplit[2]);
 			}
 			catch (Exception e)
 			{
@@ -90,19 +96,25 @@ public class ExtractableItemsData
 				_log.warning("		" + line);
 				ok = false;
 			}
-			
+			L2Skill skill = SkillTable.getInstance().getInfo(skillID, skillLvl);
+			if (skill == null)
+			{
+					_log.warning("Extractable items data: Error in line " + lineCount + " -> skill is null!");
+					_log.warning("		" + line);
+					ok = false;
+			}
 			if (!ok)
 				continue;
 			
 			FastList<L2ExtractableProductItem> product_temp = new FastList<L2ExtractableProductItem>();
 			
-			for (int i = 0; i < lineSplit.length - 1; i++)
+			for (int i = 2; i < lineSplit.length -1 ; i++)
 			{
 				ok = true;
 				
 				String[] lineSplit2 = lineSplit[i + 1].split(",");
 				
-				if (lineSplit2.length != 3)
+				if (lineSplit2.length < 3 )//|| lineSplit2.length-1 %2 != 0)
 				{
 					_log.warning("Extractable items data: Error in line " + lineCount + " -> wrong seperator!");
 					_log.warning("		" + line);
@@ -112,13 +124,21 @@ public class ExtractableItemsData
 				if (!ok)
 					continue;
 				
-				int production = 0, amount = 0, chance = 0;
+				int[] production = {0};
+				int[] amount = {0};
+				int chance = 0;
 				
 				try
 				{
-					production = Integer.parseInt(lineSplit2[0]);
-					amount = Integer.parseInt(lineSplit2[1]);
-					chance = Integer.parseInt(lineSplit2[2]);
+					int k =0;
+					for (int j = 0; j < lineSplit2.length-1 ;j++)
+					{
+						production[k] = Integer.parseInt(lineSplit2[j]);
+						amount[k] = Integer.parseInt(lineSplit2[j+=1]);
+						k++;
+					}
+
+					chance = Integer.parseInt(lineSplit2[lineSplit2.length-1]);
 				}
 				catch (Exception e)
 				{
@@ -130,7 +150,7 @@ public class ExtractableItemsData
 				if (!ok)
 					continue;
 				
-				L2ExtractableProductItem product = new L2ExtractableProductItem(production, amount, chance);
+				L2ExtractableProductItem product = new L2ExtractableProductItem(production, amount, chance, skill);
 				product_temp.add(product);
 			}
 			
@@ -145,6 +165,7 @@ public class ExtractableItemsData
 				_log.warning("		" + line);
 				continue;
 			}
+
 			L2ExtractableItem product = new L2ExtractableItem(itemID, product_temp);
 			_items.put(itemID, product);
 		}

+ 1 - 0
L2_GameServer/java/net/sf/l2j/gameserver/handler/SkillHandler.java

@@ -85,6 +85,7 @@ public class SkillHandler
 		registerSkillHandler(new GiveSp());
 		registerSkillHandler(new InstantJump());
 		registerSkillHandler(new Dummy());
+		registerSkillHandler(new Extractable());
 		_log.config("SkillHandler: Loaded " + _datatable.size() + " handlers.");
 	}
 	

+ 6 - 75
L2_GameServer/java/net/sf/l2j/gameserver/handler/itemhandlers/ExtractableItems.java

@@ -15,20 +15,14 @@
 
 package net.sf.l2j.gameserver.handler.itemhandlers;
 
-import java.util.logging.Logger;
-
-import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.datatables.ExtractableItemsData;
-import net.sf.l2j.gameserver.datatables.ItemTable;
 import net.sf.l2j.gameserver.handler.IItemHandler;
 import net.sf.l2j.gameserver.model.L2ExtractableItem;
 import net.sf.l2j.gameserver.model.L2ExtractableProductItem;
 import net.sf.l2j.gameserver.model.L2ItemInstance;
+import net.sf.l2j.gameserver.model.L2Skill;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance;
-import net.sf.l2j.gameserver.network.SystemMessageId;
-import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
-import net.sf.l2j.util.Rnd;
 
 /**
  *
@@ -38,7 +32,7 @@ import net.sf.l2j.util.Rnd;
 
 public class ExtractableItems implements IItemHandler
 {
-	private static Logger _log = Logger.getLogger(ItemTable.class.getName());
+	//private static Logger _log = Logger.getLogger(ItemTable.class.getName());
 	
 	/**
 	 * 
@@ -52,78 +46,15 @@ public class ExtractableItems implements IItemHandler
 		L2PcInstance activeChar = (L2PcInstance) playable;
 		
 		int itemID = item.getItemId();
+		L2Skill skill = null;
 		L2ExtractableItem exitem = ExtractableItemsData.getInstance().getExtractableItem(itemID);
-		
-		if (exitem == null)
-			return;
-		
-		int createItemID = 0, createAmount = 0, rndNum = Rnd.get(100), chanceFrom = 0;
-		
-		// calculate extraction
 		for (L2ExtractableProductItem expi : exitem.getProductItemsArray())
 		{
-			int chance = expi.getChance();
-			
-			if (rndNum >= chanceFrom && rndNum <= chance + chanceFrom)
-			{
-				createItemID = expi.getId();
-
-				if ((itemID >= 6411 && itemID <= 6518) || (itemID >= 7726 && itemID <= 7860) || (itemID >= 8403 && itemID <= 8483)) 
-				{
-					createAmount = (int)(expi.getAmmount()* Config.RATE_EXTR_FISH);
-				} 
-				else 
-				{
-					createAmount = expi.getAmmount();
-				}
-				break;
-			}
-			
-			chanceFrom += chance;
-		}
-		
-		if (createItemID == 0)
-		{
-			activeChar.sendMessage("Nothing happened.");
+			skill = expi.getSkill();
+			if (skill != null)
+				activeChar.useMagic(skill,false,false);
 			return;
 		}
-		
-		if (createItemID > 0)
-		{
-			if (ItemTable.getInstance().createDummyItem(createItemID) == null)
-			{
-				_log.warning("createItemID " + createItemID + " doesn't have template!");
-				activeChar.sendMessage("Nothing happened.");
-				return;
-			}
-			if (ItemTable.getInstance().createDummyItem(createItemID).isStackable())
-				activeChar.addItem("Extract", createItemID, createAmount, item, false);
-			else
-			{
-				for (int i = 0; i < createAmount; i++)
-					activeChar.addItem("Extract", createItemID, 1, item, false);
-			}
-			SystemMessage sm;
-			
-			if (createAmount > 1)
-			{
-				sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S);
-				sm.addItemName(createItemID);
-				sm.addNumber(createAmount);
-			}
-			else
-			{
-				sm = new SystemMessage(SystemMessageId.EARNED_ITEM);
-				sm.addItemName(createItemID);
-			}
-			activeChar.sendPacket(sm);
-		}
-		else
-		{
-			activeChar.sendMessage("Item failed to open"); // TODO: Put a more proper message here.
-		}
-		
-		activeChar.destroyItemByItemId("Extract", itemID, 1, activeChar.getTarget(), true);
 	}
 	
 	/**

+ 142 - 0
L2_GameServer/java/net/sf/l2j/gameserver/handler/skillhandlers/Extractable.java

@@ -0,0 +1,142 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 net.sf.l2j.gameserver.handler.skillhandlers;
+
+import net.sf.l2j.Config;
+import net.sf.l2j.gameserver.datatables.ExtractableItemsData;
+import net.sf.l2j.gameserver.datatables.ItemTable;
+import net.sf.l2j.gameserver.handler.ISkillHandler;
+import net.sf.l2j.gameserver.model.L2Character;
+import net.sf.l2j.gameserver.model.L2ExtractableItem;
+import net.sf.l2j.gameserver.model.L2ExtractableProductItem;
+import net.sf.l2j.gameserver.model.L2Object;
+import net.sf.l2j.gameserver.model.L2Skill;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.network.SystemMessageId;
+import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
+import net.sf.l2j.gameserver.templates.skills.L2SkillType;
+import net.sf.l2j.util.Rnd;
+
+public class Extractable implements ISkillHandler
+{
+	private static final L2SkillType[] SKILL_IDS =
+	{
+		L2SkillType.EXTRACTABLE
+	};
+	
+	/**
+	 * 
+	 * @see net.sf.l2j.gameserver.handler.ISkillHandler#useSkill(net.sf.l2j.gameserver.model.L2Character, net.sf.l2j.gameserver.model.L2Skill, net.sf.l2j.gameserver.model.L2Object[])
+	 */
+	public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
+	{
+		if (!(activeChar instanceof L2PcInstance))
+			return;
+		
+		L2PcInstance player = (L2PcInstance)activeChar;
+		int itemID = skill.getReferenceItemId();
+		if (itemID == 0)
+			return;
+		L2ExtractableItem exitem = ExtractableItemsData.getInstance().getExtractableItem(itemID);
+		
+		if (exitem == null)
+			return;
+		
+		int rndNum = Rnd.get(100), chanceFrom = 0;
+		int[] createItemID = new int[20];
+		int[] createAmount = new int[20];
+		
+		
+		// calculate extraction
+		for (L2ExtractableProductItem expi : exitem.getProductItemsArray())
+		{
+			int chance = expi.getChance();
+			
+			if (rndNum >= chanceFrom && rndNum <= chance + chanceFrom)
+			{
+				for (int i = 0; i < expi.getId().length; i++)
+				{
+					createItemID[i] = expi.getId()[i];
+
+					if ((itemID >= 6411 && itemID <= 6518) || (itemID >= 7726 && itemID <= 7860) || (itemID >= 8403 && itemID <= 8483)) 
+						createAmount[i] = (int)(expi.getAmmount()[i]* Config.RATE_EXTR_FISH);
+					else 
+						createAmount[i] = expi.getAmmount()[i];
+				}
+				break;
+			}
+			
+			chanceFrom += chance;
+		}
+		if (player.isSubClassActive() && skill.getReuseDelay() > 0)
+		{
+			// TODO: remove this once skill reuse will be global for main/subclass
+			player.sendPacket(new SystemMessage(SystemMessageId.MAIN_CLASS_SKILL_ONLY));
+			player.sendPacket(new SystemMessage(SystemMessageId.S1_CANNOT_BE_USED).addSkillName(skill));
+			return;
+		}
+		if (createItemID[0] <= 0 || createItemID.length == 0 )
+		{
+			player.sendPacket(new SystemMessage(SystemMessageId.NOTHING_INSIDE_THAT));
+			return;
+		}
+		else
+		{
+			for (int i = 0; i < createItemID.length; i++)
+			{
+				if (createItemID[i] <= 0)
+					return;
+						
+				if (ItemTable.getInstance().createDummyItem(createItemID[i]) == null)
+				{
+					_log.warning("createItemID " + createItemID[i] + " doesn't have template!");
+					player.sendPacket(new SystemMessage(SystemMessageId.NOTHING_INSIDE_THAT));
+					return;
+				}
+
+				if (ItemTable.getInstance().createDummyItem(createItemID[i]).isStackable())
+					player.addItem("Extract", createItemID[i], createAmount[i], targets[0], false);
+				else
+				{
+					for (int j = 0; j < createAmount[i]; j++)
+						player.addItem("Extract", createItemID[i], 1, targets[0], false);
+				}
+				SystemMessage sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S);;
+				SystemMessage sm2 = new SystemMessage(SystemMessageId.EARNED_ADENA);;
+				if (createItemID[i] == 57)
+				{
+					sm2.addNumber(createAmount[i]);
+					player.sendPacket(sm2);
+				}
+				else
+				{
+					sm.addItemName(createItemID[i]);
+					if (createAmount[i] > 1)
+						sm.addNumber(createAmount[i]);
+					player.sendPacket(sm);
+				}
+			}
+		}
+	}
+	
+	/**
+	 * 
+	 * @see net.sf.l2j.gameserver.handler.ISkillHandler#getSkillIds()
+	 */
+	public L2SkillType[] getSkillIds()
+	{
+		return SKILL_IDS;
+	}
+}

+ 12 - 5
L2_GameServer/java/net/sf/l2j/gameserver/model/L2ExtractableProductItem.java

@@ -20,23 +20,25 @@ package net.sf.l2j.gameserver.model;
  */
 public class L2ExtractableProductItem
 {
-	private final int _id;
-	private final int _ammount;
+	private final int[] _id;
+	private final int[] _ammount;
 	private final int _chance;
+	private L2Skill _skill;
 
-	public L2ExtractableProductItem(int id, int ammount, int chance)
+	public L2ExtractableProductItem(int[] id, int[] ammount, int chance, L2Skill skill)
 	{
 		_id = id;
 		_ammount = ammount;
 		_chance = chance;
+		_skill = skill;
 	}
 
-	public int getId()
+	public int[] getId()
 	{
 		return _id;
 	}
 
-	public int getAmmount()
+	public int[] getAmmount()
 	{
 		return _ammount;
 	}
@@ -45,4 +47,9 @@ public class L2ExtractableProductItem
 	{
 		return _chance;
 	}
+	
+	public L2Skill getSkill()
+	{
+		return _skill;
+	}
 }

+ 11 - 1
L2_GameServer/java/net/sf/l2j/gameserver/model/L2Skill.java

@@ -284,6 +284,7 @@ public abstract class L2Skill
     // kill by damage over time
     private final boolean _killByDOT;
 
+    private final int _refId;
     // all times in milliseconds
     private final int _hitTime;
     //private final int _skillInterruptTime;
@@ -384,7 +385,7 @@ public abstract class L2Skill
     {
         _id = set.getInteger("skill_id");
         _level = set.getInteger("level");
-
+        _refId = set.getInteger("referenceId", set.getInteger("itemConsumeId", 0));
         _displayId = set.getInteger("displayId", _id);
         _name = set.getString("name");
         _operateType = set.getEnum("operateType", SkillOpType.class);
@@ -3166,4 +3167,13 @@ public abstract class L2Skill
 	{
 		return _feed;
 	}
+
+	/**
+	 * used for extractable item skills
+     * @return reference item id
+     */
+    public int getReferenceItemId()
+    {
+	    return _refId;
+    }
 }

+ 5 - 0
L2_GameServer/java/net/sf/l2j/gameserver/skills/DocumentBase.java

@@ -435,6 +435,11 @@ abstract class DocumentBase
                 int weight = Integer.decode(getValue(a.getNodeValue(), null));
                 cond = joinAnd(cond, new ConditionPlayerWeight(weight));
             }
+            else if ("invSize".equalsIgnoreCase(a.getNodeName()))
+            {
+                int size = Integer.decode(getValue(a.getNodeValue(), null));
+                cond = joinAnd(cond, new ConditionPlayerInvSize(size));
+            }
             else if ("pledgeClass".equalsIgnoreCase(a.getNodeName()))
             {
                 int pledgeClass = Integer.decode(getValue(a.getNodeValue(), null));

+ 42 - 0
L2_GameServer/java/net/sf/l2j/gameserver/skills/conditions/ConditionPlayerInvSize.java

@@ -0,0 +1,42 @@
+/*
+ * This program 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.
+ * 
+ * This program 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 net.sf.l2j.gameserver.skills.conditions;
+
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.skills.Env;
+
+
+
+/**
+ * @author Kerberos
+ *
+ **/
+public class ConditionPlayerInvSize extends Condition {
+
+	private final int _size;
+
+	public ConditionPlayerInvSize(int size)
+	{
+		_size = size;
+	}
+
+	@Override
+	public boolean testImpl(Env env)
+	{
+		if (env.player instanceof L2PcInstance)
+			return env.player.getInventory().getSize() <= (((L2PcInstance) env.player).getInventoryLimit()-_size);
+		return true;
+	}
+}

+ 9 - 1
L2_GameServer/java/net/sf/l2j/gameserver/skills/conditions/ConditionPlayerWeight.java

@@ -16,6 +16,7 @@ package net.sf.l2j.gameserver.skills.conditions;
 
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.skills.Env;
+import net.sf.l2j.gameserver.skills.Stats;
 
 
 
@@ -36,7 +37,14 @@ public class ConditionPlayerWeight extends Condition {
 	public boolean testImpl(Env env)
 	{
 		if (env.player instanceof L2PcInstance)
-			return (((L2PcInstance) env.player).getInventoryLimit()*(_weight/100)) <= env.player.getInventory().getSize();
+		{
+			if (((L2PcInstance) env.player).getMaxLoad() > 0)
+			{
+				int weightproc = ((L2PcInstance) env.player).getCurrentLoad() * 100 / ((L2PcInstance) env.player).getMaxLoad();
+				weightproc*=(int)((L2PcInstance) env.player).calcStat(Stats.WEIGHT_LIMIT, 1, env.player, null);
+				return weightproc < _weight || ((L2PcInstance) env.player).getDietMode();
+			}
+		}
 		return true;
 	}
 }

+ 1 - 2
L2_GameServer/java/net/sf/l2j/gameserver/templates/skills/L2SkillType.java

@@ -116,7 +116,6 @@ public enum L2SkillType
 	MOUNT(L2SkillMount.class),
 	INSTANT_JUMP,
 	
-	MYSTERIOUS_CUBE,
 	// Creation
 	COMMON_CRAFT,
 	DWARVEN_CRAFT,
@@ -175,7 +174,7 @@ public enum L2SkillType
 	COREDONE,
 	
 	// unimplemented
-	NOTDONE, BALLISTA, DUMMY;
+	NOTDONE, BALLISTA, DUMMY, EXTRACTABLE;
 	
 	private final Class<? extends L2Skill> _class;