فهرست منبع

BETA: Support for "unequip_skill" parameter of items. Also fixes Ticket #6374
* Reviewed by: UnAfraid
* Tested by: djmouse

VlLight 12 سال پیش
والد
کامیت
c49cc07fc9

+ 5 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -7918,15 +7918,17 @@ public final class L2PcInstance extends L2Playable
 			// Note that Clan, Noblesse and Hero skills are given separately and not here.
 			// Retrieve from the database all skills of this L2PcInstance and add them to _skills
 			player.restoreCharData();
-			// Reward auto-get skills and all available skills if auto-learn skills is true.
-			player.rewardSkills();
-			
+
 			// buff and status icons
 			if (Config.STORE_SKILL_COOLTIME)
 			{
 				player.restoreEffects();
 			}
 			
+			// Reward auto-get skills and all available skills if auto-learn skills is true.
+			//Moved beyond restoreEffects() for proper handling of weapon's "unequip_skill" on player login
+			player.rewardSkills();
+
 			player.restoreItemReuse();
 			
 			// Restore current Cp, HP and MP values

+ 20 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java

@@ -28,6 +28,8 @@ import com.l2jserver.Config;
 import com.l2jserver.L2DatabaseFactory;
 import com.l2jserver.gameserver.datatables.ArmorSetsData;
 import com.l2jserver.gameserver.datatables.ItemTable;
+import com.l2jserver.gameserver.handler.ISkillHandler;
+import com.l2jserver.gameserver.handler.SkillHandler;
 import com.l2jserver.gameserver.model.L2ArmorSet;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.PcCondOverride;
@@ -395,7 +397,24 @@ public abstract class Inventory extends ItemContainer
 					}
 				}
 			}
-			
+
+			// Apply skill, if weapon have "skills on unequip"
+			L2Skill unequipSkill = it.getUnequipSkill();
+			if (unequipSkill != null)
+			{
+				ISkillHandler handler = SkillHandler.getInstance().getHandler(unequipSkill.getSkillType());
+				L2PcInstance[] targets = { player };
+
+				if (handler != null)
+				{
+					handler.useSkill(player, unequipSkill, targets);
+				}
+				else
+				{
+					unequipSkill.useSkill(player, targets);
+				}
+			}
+
 			if (update)
 			{
 				player.sendSkillList();

+ 39 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/L2Item.java

@@ -41,6 +41,7 @@ import com.l2jserver.gameserver.model.items.type.L2ActionType;
 import com.l2jserver.gameserver.model.items.type.L2EtcItemType;
 import com.l2jserver.gameserver.model.items.type.L2ItemType;
 import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
 import com.l2jserver.gameserver.model.skills.funcs.FuncTemplate;
 import com.l2jserver.gameserver.model.stats.Env;
@@ -219,7 +220,7 @@ public abstract class L2Item
 	private final boolean _ex_immediate_effect;
 	private final int _defaultEnchantLevel;
 	private final L2ActionType _defaultAction;
-	
+
 	protected int _type1; // needed for item list (inventory)
 	protected int _type2; // different lists for armor, weapon, etc
 	protected Elementals[] _elementals = null;
@@ -227,10 +228,11 @@ public abstract class L2Item
 	protected EffectTemplate[] _effectTemplates;
 	protected List<Condition> _preConditions;
 	private SkillHolder[] _skillHolder;
-	
+	private SkillHolder _unequipSkill = null;
+
 	protected static final Func[] _emptyFunctionSet = new Func[0];
 	protected static final L2Effect[] _emptyEffectSet = new L2Effect[0];
-	
+
 	private final List<Quest> _questEvents = new FastList<>();
 	private final int _useSkillDisTime;
 	private final int _reuseDelay;
@@ -365,7 +367,32 @@ public abstract class L2Item
 				_skillHolder = skillHolder;
 			}
 		}
-		
+
+		skills = set.getString("unequip_skill", null);
+		if (skills != null)
+		{
+			String[] info = skills.split("-");
+			if ((info != null) && (info.length == 2))
+			{
+				int id = 0;
+				int level = 0;
+				try
+				{
+					id = Integer.parseInt(info[0]);
+					level = Integer.parseInt(info[1]);
+				}
+				catch (Exception nfe)
+				{
+					// Incorrect syntax, dont add new skill
+					_log.info(StringUtil.concat("> Couldnt parse ", skills, " in weapon unequip skills! item ", this.toString()));
+				}
+				if ((id > 0) && (level > 0))
+				{
+					_unequipSkill = new SkillHolder(id, level);
+				}
+			}
+		}
+
 		_common = ((_itemId >= 11605) && (_itemId <= 12361));
 		_heroItem = ((_itemId >= 6611) && (_itemId <= 6621)) || ((_itemId >= 9388) && (_itemId <= 9390)) || (_itemId == 6842);
 		_pvpItem = ((_itemId >= 10667) && (_itemId <= 10835)) || ((_itemId >= 12852) && (_itemId <= 12977)) || ((_itemId >= 14363) && (_itemId <= 14525)) || (_itemId == 14528) || (_itemId == 14529) || (_itemId == 14558) || ((_itemId >= 15913) && (_itemId <= 16024)) || ((_itemId >= 16134) && (_itemId <= 16147)) || (_itemId == 16149) || (_itemId == 16151) || (_itemId == 16153) || (_itemId == 16155) || (_itemId == 16157) || (_itemId == 16159) || ((_itemId >= 16168) && (_itemId <= 16176)) || ((_itemId >= 16179) && (_itemId <= 16220));
@@ -949,6 +976,14 @@ public abstract class L2Item
 		return _skillHolder;
 	}
 	
+	/**
+	 * @return skill that activates, when player unequip this weapon or armor
+	 */
+	public final L2Skill getUnequipSkill()
+	{
+		return _unequipSkill == null ? null : _unequipSkill.getSkill();
+	}
+
 	public boolean checkCondition(L2Character activeChar, L2Object target, boolean sendMessage)
 	{
 		if (activeChar.canOverrideCond(PcCondOverride.ITEM_CONDITIONS) && !Config.GM_ITEM_RESTRICTION)