2
0
Эх сурвалжийг харах

BETA: Fixes for following tickets:
* #5495 and #5477, NPE@SummonEffectsTable.java:45
* #5514, players shouldn't be able to enchant skills in stance mode.
* #5507, NPE if SubClassSkills quests is null, reloaded scripts or not updated datapack...

Zoey76 14 жил өмнө
parent
commit
0c4188ba23

+ 13 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/SummonEffectsTable.java

@@ -34,7 +34,7 @@ public class SummonEffectsTable
 	 * 			key: servitorSkillId, value: Effects list
 	 */
 	private TIntObjectHashMap<TIntObjectHashMap<TIntObjectHashMap<List<SummonEffect>>>> _servitorEffects = new TIntObjectHashMap<TIntObjectHashMap<TIntObjectHashMap<List<SummonEffect>>>>();
-
+	
 	public TIntObjectHashMap<TIntObjectHashMap<TIntObjectHashMap<List<SummonEffect>>>> getServitorEffectsOwner()
 	{
 		return _servitorEffects;
@@ -42,10 +42,14 @@ public class SummonEffectsTable
 	
 	public TIntObjectHashMap<List<SummonEffect>> getServitorEffects(L2PcInstance owner)
 	{
-		return _servitorEffects.get(owner.getObjectId()).get(owner.getClassIndex());
+		final TIntObjectHashMap<TIntObjectHashMap<List<SummonEffect>>> servitorMap = _servitorEffects.get(owner.getObjectId());
+		if (servitorMap == null)
+		{
+			return null;
+		}
+		return servitorMap.get(owner.getClassIndex());
 	}
 	
-	
 	/** Pets **/
 	private TIntObjectHashMap<List<SummonEffect>> _petEffects = new TIntObjectHashMap<List<SummonEffect>>(); // key: petItemObjectId, value: Effects list
 	
@@ -54,13 +58,6 @@ public class SummonEffectsTable
 		return _petEffects;
 	}
 	
-	
-	/** Common **/
-	public static SummonEffectsTable getInstance()
-	{
-		return SingletonHolder._instance;
-	}
-	
 	public class SummonEffect
 	{
 		L2Skill _skill;
@@ -90,6 +87,12 @@ public class SummonEffectsTable
 		}
 	}
 	
+	/** Common **/
+	public static SummonEffectsTable getInstance()
+	{
+		return SingletonHolder._instance;
+	}
+	
 	@SuppressWarnings("synthetic-access")
 	private static class SingletonHolder
 	{

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

@@ -14260,7 +14260,7 @@ public final class L2PcInstance extends L2Playable
 	{
 		if (isLocked())
 			return false;
-		if (isTransformed())
+		if (isTransformed() || isInStance())
 			return false;
 		if (AttackStanceTaskManager.getInstance().getAttackStanceTask(this))
 			return false;

+ 14 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2SummonInstance.java

@@ -236,11 +236,11 @@ public class L2SummonInstance extends L2Summon
 		if(petLevel >= 70)
 			skillLevel += (petLevel-65)/10;
 		
-		// adjust the level for servitors less than lv 10
+		// Adjust the level for servitors less than level 1.
 		if (skillLevel < 1)
 			skillLevel = 1;
 		
-		L2Skill skillToCast = SkillTable.getInstance().getInfo(skill.getId(),skillLevel);
+		final L2Skill skillToCast = SkillTable.getInstance().getInfo(skill.getId(),skillLevel);
 		
 		if (skillToCast != null)
 			super.doCast(skillToCast);
@@ -258,13 +258,20 @@ public class L2SummonInstance extends L2Summon
 	public final void stopSkillEffects(int skillId)
 	{
 		super.stopSkillEffects(skillId);
-		List<SummonEffect> effects = SummonEffectsTable.getInstance().getServitorEffects(getOwner()).get(getReferenceSkill());
-		if (effects != null && !effects.isEmpty())
+		final TIntObjectHashMap<List<SummonEffect>> servitorEffects = SummonEffectsTable.getInstance().getServitorEffects(getOwner());
+		if (servitorEffects != null)
 		{
-			for (SummonEffect effect : effects)
+			final List<SummonEffect> effects = servitorEffects.get(getReferenceSkill());
+			if ((effects != null) && !effects.isEmpty())
 			{
-				if (effect.getSkill().getId() == skillId)
-					SummonEffectsTable.getInstance().getServitorEffects(getOwner()).get(getReferenceSkill()).remove(effect);
+				for (SummonEffect effect : effects)
+				{
+					final L2Skill skill = effect.getSkill();
+					if ((skill != null) && (skill.getId() == skillId))
+					{
+						effects.remove(effect);
+					}
+				}
 			}
 		}
 	}

+ 12 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestAcquireSkill.java

@@ -33,6 +33,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2TrainerHealersInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2TransformManagerInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2VillageMasterInstance;
+import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.AcquireSkillDone;
@@ -284,7 +285,6 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 						}
 						
 						rep = s.getLevelUpSp();
-						
 						if (clan.getReputationScore() < rep)
 						{
 							activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ACQUIRE_SKILL_FAILED_BAD_CLAN_REP_SCORE));
@@ -319,9 +319,7 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 						}
 						
 						clan.addNewSkill(skill, _subType);
-						
 						clan.broadcastToOnlineMembers(new PledgeSkillList(clan));
-						
 						activeChar.sendPacket(new AcquireSkillDone());
 						
 						((L2SquadTrainer) trainer).showSubUnitSkillList(activeChar);
@@ -354,7 +352,16 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 				QuestState st = activeChar.getQuestState("SubClassSkills");
 				if (st == null)
 				{
-					st = QuestManager.getInstance().getQuest("SubClassSkills").newQuestState(activeChar);
+					final Quest subClassSkilllsQuest = QuestManager.getInstance().getQuest("SubClassSkills");
+					if (subClassSkilllsQuest != null)
+					{
+						st = subClassSkilllsQuest.newQuestState(activeChar);
+					}
+					else
+					{
+						_log.warning("Null SubClassSkills quest, for Sub-Class skill Id: " + _id + " level: " + _level + " for player " + activeChar.getName() + "!");
+						return;
+					}
 				}
 				
 				for (String varName : L2TransformManagerInstance._questVarNames)
@@ -366,7 +373,7 @@ public final class RequestAcquireSkill extends L2GameClientPacket
 						{
 							if (Util.isDigit(itemOID))
 							{
-								int itemObjId = Integer.parseInt(itemOID);
+								final int itemObjId = Integer.parseInt(itemOID);
 								final L2ItemInstance item = activeChar.getInventory().getItemByObjectId(itemObjId);
 								if ((item != null) && Util.contains(L2TransformManagerInstance._itemsIds, item.getItemId()))
 								{

+ 23 - 9
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestDispel.java

@@ -21,11 +21,11 @@ import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 
 /**
- *
- * @author  KenM
+ * @author KenM
  */
 public class RequestDispel extends L2GameClientPacket
 {
+	private static final String _C_D0_4B_REQUESTDISPEL = "[C] D0:4B RequestDispel";
 	private int _objectId;
 	private int _skillId;
 	private int _skillLevel;
@@ -47,29 +47,43 @@ public class RequestDispel extends L2GameClientPacket
 	@Override
 	protected void runImpl()
 	{
-		if (_skillId <= 0 || _skillLevel <= 0)
+		if ((_skillId <= 0) || (_skillLevel <= 0))
+		{
 			return;
-
+		}
 		final L2PcInstance activeChar = getClient().getActiveChar();
 		if (activeChar == null)
+		{
 			return;
-		
-		L2Skill skill = SkillTable.getInstance().getInfo(_skillId, _skillLevel);
+		}
+		final L2Skill skill = SkillTable.getInstance().getInfo(_skillId, _skillLevel);
 		if (skill == null)
+		{
 			return;
+		}
 		if (!skill.canBeDispeled() || skill.isStayAfterDeath() || skill.isDebuff())
+		{
 			return;
-		if (skill.getTransformId() > 0) // transformation
+		}
+		if (skill.getTransformId() > 0)
+		{
 			return;
+		}
 		if (skill.isDance() && !Config.DANCE_CANCEL_BUFF)
+		{
 			return;
+		}
 		if (activeChar.getObjectId() == _objectId)
+		{
 			activeChar.stopSkillEffects(_skillId);
+		}
 		else
 		{
 			final L2Summon pet = activeChar.getPet();
-			if (pet != null && pet.getObjectId() == _objectId)
+			if ((pet != null) && (pet.getObjectId() == _objectId))
+			{
 				pet.stopSkillEffects(_skillId);
+			}
 		}
 	}
 	
@@ -79,6 +93,6 @@ public class RequestDispel extends L2GameClientPacket
 	@Override
 	public String getType()
 	{
-		return "[C] D0:4E RequestDispel";
+		return _C_D0_4B_REQUESTDISPEL;
 	}
 }

+ 14 - 18
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestExEnchantSkill.java

@@ -37,7 +37,6 @@ import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.network.serverpackets.UserInfo;
 import com.l2jserver.util.Rnd;
 
-
 /**
  * Format (ch) dd
  * c: (id) 0xD0
@@ -45,11 +44,10 @@ import com.l2jserver.util.Rnd;
  * d: skill id
  * d: skill lvl
  * @author -Wooden-
- *
  */
 public final class RequestExEnchantSkill extends L2GameClientPacket
 {
-	private static final String _C__D0_07_REQUESTEXENCHANTSKILL = "[C] D0:07 RequestExEnchantSkill";
+	private static final String _C__D0_07_REQUESTEXENCHANTSKILL = "[C] D0:0F RequestExEnchantSkill";
 	private static final Logger _log = Logger.getLogger(RequestAcquireSkill.class.getName());
 	private static final Logger _logEnchant = Logger.getLogger("enchant");
 	
@@ -63,7 +61,7 @@ public final class RequestExEnchantSkill extends L2GameClientPacket
 		_skillLvl = readD();
 	}
 	
-	/* (non-Javadoc)
+	/**
 	 * @see com.l2jserver.gameserver.clientpackets.ClientBasePacket#runImpl()
 	 */
 	@Override
@@ -72,7 +70,7 @@ public final class RequestExEnchantSkill extends L2GameClientPacket
 		if (_skillId <= 0 || _skillLvl <= 0) // minimal sanity check
 			return;
 
-		L2PcInstance player = getClient().getActiveChar();
+		final L2PcInstance player = getClient().getActiveChar();
 		if (player == null)
 			return;
 		
@@ -94,35 +92,35 @@ public final class RequestExEnchantSkill extends L2GameClientPacket
 			return;
 		}
 		
-		L2Skill skill = SkillTable.getInstance().getInfo(_skillId, _skillLvl);
+		final L2Skill skill = SkillTable.getInstance().getInfo(_skillId, _skillLvl);
 		if (skill == null)
 		{
 			return;
 		}
 		
-		int costMultiplier = EnchantGroupsTable.NORMAL_ENCHANT_COST_MULTIPLIER;
-		int reqItemId = EnchantGroupsTable.NORMAL_ENCHANT_BOOK;
+		final int costMultiplier = EnchantGroupsTable.NORMAL_ENCHANT_COST_MULTIPLIER;
+		final int reqItemId = EnchantGroupsTable.NORMAL_ENCHANT_BOOK;
 		
-		L2EnchantSkillLearn s = EnchantGroupsTable.getInstance().getSkillEnchantmentBySkillId(_skillId);
+		final L2EnchantSkillLearn s = EnchantGroupsTable.getInstance().getSkillEnchantmentBySkillId(_skillId);
 		if (s == null)
 		{
 			return;
 		}
-		EnchantSkillDetail esd = s.getEnchantSkillDetail(_skillLvl);
+		final EnchantSkillDetail esd = s.getEnchantSkillDetail(_skillLvl);
 		if (player.getSkillLevel(_skillId) != s.getMinSkillLevel(_skillLvl))
 		{
 			return;
 		}
 		
-		int requiredSp = esd.getSpCost() * costMultiplier;
-		int requireditems = (esd.getAdenaCost() * costMultiplier);
-		int rate = esd.getRate(player);
+		final int requiredSp = esd.getSpCost() * costMultiplier;
+		final int requireditems = (esd.getAdenaCost() * costMultiplier);
+		final int rate = esd.getRate(player);
 		
 		if (player.getSp() >= requiredSp)
 		{
 			// only first lvl requires book
-			boolean usesBook = _skillLvl % 100 == 1; // 101, 201, 301 ...
-			L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
+			final boolean usesBook = _skillLvl % 100 == 1; // 101, 201, 301 ...
+			final L2ItemInstance spb = player.getInventory().getItemByItemId(reqItemId);
 			
 			if (Config.ES_SP_BOOK_NEEDED && usesBook)
 			{
@@ -206,7 +204,6 @@ public final class RequestExEnchantSkill extends L2GameClientPacket
 			player.sendPacket(new ExEnchantSkillInfoDetail(0, _skillId, player.getSkillLevel(_skillId)+1, player));
 			
 			this.updateSkillShortcuts(player);
-			
 		}
 		else
 		{
@@ -231,7 +228,7 @@ public final class RequestExEnchantSkill extends L2GameClientPacket
 		}
 	}
 	
-	/* (non-Javadoc)
+	/**
 	 * @see com.l2jserver.gameserver.BasePacket#getType()
 	 */
 	@Override
@@ -239,5 +236,4 @@ public final class RequestExEnchantSkill extends L2GameClientPacket
 	{
 		return _C__D0_07_REQUESTEXENCHANTSKILL;
 	}
-	
 }