Ver Fonte

Fix few transformations bugs apply to transform skills

Reported by : epu
Tested by : epu
Zealar há 10 anos atrás
pai
commit
b337778c5b

+ 2 - 2
L2J_Server/java/com/l2jserver/gameserver/model/CursedWeapon.java

@@ -336,9 +336,9 @@ public class CursedWeapon implements INamable
 		
 		// Void Burst, Void Flow
 		_player.addSkill(CommonSkill.VOID_BURST.getSkill(), false);
-		_player.addTransformSkill(CommonSkill.VOID_BURST.getId());
+		_player.addTransformSkill(CommonSkill.VOID_BURST.getSkill());
 		_player.addSkill(CommonSkill.VOID_FLOW.getSkill(), false);
-		_player.addTransformSkill(CommonSkill.VOID_FLOW.getId());
+		_player.addTransformSkill(CommonSkill.VOID_FLOW.getSkill());
 		_player.sendSkillList();
 	}
 	

+ 59 - 11
L2J_Server/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -29,7 +29,6 @@ import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -37,6 +36,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Queue;
 import java.util.Set;
+import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.ConcurrentSkipListMap;
@@ -209,8 +209,10 @@ import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerPvPKi
 import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerTransform;
 import com.l2jserver.gameserver.model.fishing.L2Fish;
 import com.l2jserver.gameserver.model.fishing.L2Fishing;
+import com.l2jserver.gameserver.model.holders.AdditionalSkillHolder;
 import com.l2jserver.gameserver.model.holders.ItemHolder;
 import com.l2jserver.gameserver.model.holders.PlayerEventHolder;
+import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.holders.SkillUseHolder;
 import com.l2jserver.gameserver.model.interfaces.IEventListener;
 import com.l2jserver.gameserver.model.interfaces.ILocational;
@@ -504,6 +506,7 @@ public final class L2PcInstance extends L2Playable
 	private long _offlineShopStart = 0;
 	
 	private Transform _transformation;
+	private volatile Map<Integer, Skill> _transformSkills;
 	
 	/** The table containing all L2RecipeList of the L2PcInstance */
 	private final Map<Integer, L2RecipeList> _dwarvenRecipeBook = new ConcurrentHashMap<>();
@@ -732,7 +735,6 @@ public final class L2PcInstance extends L2Playable
 	private int _fishy = 0;
 	private int _fishz = 0;
 	
-	private volatile Set<Integer> _transformAllowedSkills;
 	private ScheduledFuture<?> _taskRentPet;
 	private ScheduledFuture<?> _taskWater;
 	
@@ -9899,7 +9901,7 @@ public final class L2PcInstance extends L2Playable
 				continue;
 			}
 			
-			if ((_transformation != null) && (!hasTransformSkill(s.getId()) && !s.allowOnTransform()))
+			if ((_transformation != null) && !s.isPassive())
 			{
 				continue;
 			}
@@ -9929,7 +9931,48 @@ public final class L2PcInstance extends L2Playable
 			
 			sl.addSkill(s.getDisplayId(), s.getDisplayLevel(), s.isPassive(), isDisabled, isEnchantable);
 		}
-		
+		if (_transformation != null)
+		{
+			Map<Integer, Integer> ts = new TreeMap<>();
+			
+			for (SkillHolder holder : _transformation.getTemplate(this).getSkills())
+			{
+				ts.putIfAbsent(holder.getSkillId(), holder.getSkillLvl());
+				
+				if (ts.get(holder.getSkillId()) < holder.getSkillLvl())
+				{
+					ts.put(holder.getSkillId(), holder.getSkillLvl());
+				}
+				addTransformSkill(holder.getSkill());
+			}
+			
+			for (AdditionalSkillHolder holder : _transformation.getTemplate(this).getAdditionalSkills())
+			{
+				if (getLevel() >= holder.getMinLevel())
+				{
+					ts.putIfAbsent(holder.getSkillId(), holder.getSkillLvl());
+					if (ts.get(holder.getSkillId()) < holder.getSkillLvl())
+					{
+						ts.put(holder.getSkillId(), holder.getSkillLvl());
+					}
+					addTransformSkill(holder.getSkill());
+				}
+			}
+			
+			// Add collection skills.
+			for (L2SkillLearn skill : SkillTreesData.getInstance().getCollectSkillTree().values())
+			{
+				if (getKnownSkill(skill.getSkillId()) != null)
+				{
+					addTransformSkill(SkillData.getInstance().getSkill(skill.getSkillId(), skill.getSkillLevel()));
+				}
+			}
+			
+			for (Entry<Integer, Integer> transformSkill : ts.entrySet())
+			{
+				sl.addSkill(transformSkill.getKey(), transformSkill.getValue(), false, false, false);
+			}
+		}
 		sendPacket(sl);
 	}
 	
@@ -12513,29 +12556,34 @@ public final class L2PcInstance extends L2Playable
 		}
 	}
 	
-	public void addTransformSkill(int id)
+	public void addTransformSkill(Skill sk)
 	{
-		if (_transformAllowedSkills == null)
+		if (_transformSkills == null)
 		{
 			synchronized (this)
 			{
-				if (_transformAllowedSkills == null)
+				if (_transformSkills == null)
 				{
-					_transformAllowedSkills = new HashSet<>();
+					_transformSkills = new HashMap<>();
 				}
 			}
 		}
-		_transformAllowedSkills.add(id);
+		_transformSkills.put(sk.getId(), sk);
+	}
+	
+	public Skill getTransformSkill(int id)
+	{
+		return _transformSkills.get(id);
 	}
 	
 	public boolean hasTransformSkill(int id)
 	{
-		return (_transformAllowedSkills != null) && _transformAllowedSkills.contains(id);
+		return _transformSkills.containsKey(id);
 	}
 	
 	public synchronized void removeAllTransformSkills()
 	{
-		_transformAllowedSkills = null;
+		_transformSkills = null;
 	}
 	
 	protected void startFeed(int npcId)

+ 1 - 34
L2J_Server/java/com/l2jserver/gameserver/model/actor/transform/Transform.java

@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.List;
 
 import com.l2jserver.gameserver.data.xml.impl.SkillTreesData;
-import com.l2jserver.gameserver.model.L2SkillLearn;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.holders.AdditionalItemHolder;
@@ -224,38 +223,6 @@ public final class Transform implements IIdentifiable
 				player.getAppearance().setVisibleTitle(getTitle());
 			}
 			
-			// Add common skills.
-			for (SkillHolder holder : template.getSkills())
-			{
-				if (player.getSkillLevel(holder.getSkillId()) < holder.getSkillLvl())
-				{
-					player.addSkill(holder.getSkill(), false);
-				}
-				player.addTransformSkill(holder.getSkillId());
-			}
-			
-			// Add skills depending on level.
-			for (AdditionalSkillHolder holder : template.getAdditionalSkills())
-			{
-				if (player.getLevel() >= holder.getMinLevel())
-				{
-					if (player.getSkillLevel(holder.getSkillId()) < holder.getSkillLvl())
-					{
-						player.addSkill(holder.getSkill(), false);
-					}
-					player.addTransformSkill(holder.getSkillId());
-				}
-			}
-			
-			// Add collection skills.
-			for (L2SkillLearn skill : SkillTreesData.getInstance().getCollectSkillTree().values())
-			{
-				if (player.getKnownSkill(skill.getSkillId()) != null)
-				{
-					player.addTransformSkill(skill.getSkillId());
-				}
-			}
-			
 			// Set inventory blocks if needed.
 			if (!template.getAdditionalItems().isEmpty())
 			{
@@ -376,7 +343,7 @@ public final class Transform implements IIdentifiable
 						if (player.getSkillLevel(holder.getSkillId()) < holder.getSkillLvl())
 						{
 							player.addSkill(holder.getSkill(), false);
-							player.addTransformSkill(holder.getSkillId());
+							player.addTransformSkill(holder.getSkill());
 						}
 					}
 				}

+ 0 - 5
L2J_Server/java/com/l2jserver/gameserver/model/skills/Skill.java

@@ -446,11 +446,6 @@ public final class Skill implements IIdentifiable
 		return _isSuicideAttack;
 	}
 	
-	public boolean allowOnTransform()
-	{
-		return isPassive();
-	}
-	
 	/**
 	 * Return the power of the skill.
 	 * @param activeChar

+ 7 - 3
L2J_Server/java/com/l2jserver/gameserver/network/clientpackets/RequestMagicSkillUse.java

@@ -61,9 +61,13 @@ public final class RequestMagicSkillUse extends L2GameClientPacket
 			skill = activeChar.getCustomSkill(_magicId);
 			if (skill == null)
 			{
-				activeChar.sendPacket(ActionFailed.STATIC_PACKET);
-				_log.warning("Skill Id " + _magicId + " not found in player!");
-				return;
+				skill = activeChar.getTransformSkill(_magicId);
+				if (skill == null)
+				{
+					activeChar.sendPacket(ActionFailed.STATIC_PACKET);
+					_log.warning("Skill Id " + _magicId + " not found in player : " + activeChar);
+					return;
+				}
 			}
 		}