Explorar o código

BETA: Support for custom progressive enchanting.
* Note: To enable it check enchantData.xml for examples.
* Also when enchant scroll isn't loaded NPE wont be thrown.
* Reported by: baluu

Rumen Nikiforov %!s(int64=12) %!d(string=hai) anos
pai
achega
6c443517c8

+ 7 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/EnchantItemData.java

@@ -60,6 +60,7 @@ public class EnchantItemData extends DocumentParser
 	{
 		StatsSet set;
 		Node att;
+		Map<Integer, Double> enchantSteps;
 		for (Node n = getCurrentDocument().getFirstChild(); n != null; n = n.getNextSibling())
 		{
 			if ("list".equalsIgnoreCase(n.getNodeName()))
@@ -70,6 +71,7 @@ public class EnchantItemData extends DocumentParser
 					{
 						NamedNodeMap attrs = d.getAttributes();
 						set = new StatsSet();
+						enchantSteps = new HashMap<>();
 						for (int i = 0; i < attrs.getLength(); i++)
 						{
 							att = attrs.item(i);
@@ -83,8 +85,12 @@ public class EnchantItemData extends DocumentParser
 							{
 								items.add(parseInteger(cd.getAttributes(), "id"));
 							}
+							else if ("step".equalsIgnoreCase(cd.getNodeName()))
+							{
+								enchantSteps.put(parseInt(cd.getAttributes(), "level"), parseDouble(cd.getAttributes(), "successRate"));
+							}
 						}
-						EnchantScroll item = new EnchantScroll(set, items);
+						EnchantScroll item = new EnchantScroll(set, items, enchantSteps);
 						_scrolls.put(item.getScrollId(), item);
 					}
 					else if ("support".equalsIgnoreCase(d.getNodeName()))

+ 18 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/EnchantScroll.java

@@ -15,8 +15,10 @@
 package com.l2jserver.gameserver.model;
 
 import java.util.List;
+import java.util.Map;
 
 import com.l2jserver.Config;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 
@@ -27,17 +29,20 @@ public class EnchantScroll extends EnchantItem
 {
 	private final boolean _isBlessed;
 	private final boolean _isSafe;
+	private final Map<Integer, Double> _enchantSteps;
 	
 	/**
 	 * @param set
 	 * @param items
+	 * @param enchantSteps
 	 */
-	public EnchantScroll(StatsSet set, List<Integer> items)
+	public EnchantScroll(StatsSet set, List<Integer> items, Map<Integer, Double> enchantSteps)
 	{
 		super(set, items);
 		
 		_isBlessed = set.getBool("isBlessed", false);
 		_isSafe = set.getBool("isSafe", false);
+		_enchantSteps = enchantSteps;
 	}
 	
 	/**
@@ -90,8 +95,20 @@ public class EnchantScroll extends EnchantItem
 			return 100;
 		}
 		
+		L2PcInstance activeChar = L2World.getInstance().getPlayer(enchantItem.getOwnerId());
+		int level = enchantItem.getEnchantLevel() + 1;
 		double chance = _chanceAdd;
 		
+		if (_enchantSteps.containsKey(level))
+		{
+			chance = _enchantSteps.get(level);
+		}
+		
+		if (activeChar.isDebug())
+		{
+			activeChar.sendDebugMessage("Enchant Level: " + level + " Chance: " + chance + " " + (supportItem != null ? "Support item: " + supportItem.getChanceAdd() : ""));
+		}
+		
 		if ((supportItem != null) && !_isBlessed)
 		{
 			chance *= supportItem.getChanceAdd();

+ 7 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestExTryToPutEnchantTargetItem.java

@@ -14,6 +14,8 @@
  */
 package com.l2jserver.gameserver.network.clientpackets;
 
+import java.util.logging.Level;
+
 import com.l2jserver.gameserver.datatables.EnchantItemData;
 import com.l2jserver.gameserver.model.EnchantScroll;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -59,20 +61,21 @@ public class RequestExTryToPutEnchantTargetItem extends L2GameClientPacket
 			return;
 		}
 		
-		// template for scroll
 		EnchantScroll scrollTemplate = EnchantItemData.getInstance().getEnchantScroll(scroll);
-		
-		if (!scrollTemplate.isValid(item))
+		if ((scrollTemplate == null) || !scrollTemplate.isValid(item))
 		{
 			activeChar.sendPacket(SystemMessageId.DOES_NOT_FIT_SCROLL_CONDITIONS);
 			activeChar.setActiveEnchantItem(null);
 			activeChar.sendPacket(new ExPutEnchantTargetItemResult(0));
+			if (scrollTemplate == null)
+			{
+				_log.log(Level.WARNING, getClass().getSimpleName() + ": Undefined scroll have been used id: " + scroll.getItemId());
+			}
 			return;
 		}
 		activeChar.setIsEnchanting(true);
 		activeChar.setActiveEnchantTimestamp(System.currentTimeMillis());
 		activeChar.sendPacket(new ExPutEnchantTargetItemResult(_objectId));
-		
 	}
 	
 	@Override