ClassChange effect using a small delay.
This commit is contained in:
		@@ -16,6 +16,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package handlers.effecthandlers;
 | 
			
		||||
 | 
			
		||||
import org.l2jmobius.commons.threads.ThreadPool;
 | 
			
		||||
import org.l2jmobius.gameserver.data.xml.SkillData;
 | 
			
		||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
 | 
			
		||||
import org.l2jmobius.gameserver.model.Shortcut;
 | 
			
		||||
@@ -62,91 +63,95 @@ public class ClassChange extends AbstractEffect
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		final PlayerInstance player = effected.getActingPlayer();
 | 
			
		||||
		if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
 | 
			
		||||
		// Executing later otherwise interrupted exception during storeCharBase.
 | 
			
		||||
		ThreadPool.schedule(() ->
 | 
			
		||||
		{
 | 
			
		||||
			player.sendMessage("You cannot switch your class right now!");
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
 | 
			
		||||
		if (identityCrisis != null)
 | 
			
		||||
		{
 | 
			
		||||
			identityCrisis.applyEffects(player, player);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if (OlympiadManager.getInstance().isRegisteredInComp(player))
 | 
			
		||||
		{
 | 
			
		||||
			OlympiadManager.getInstance().unRegisterNoble(player);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		final int activeClass = player.getClassId().getId();
 | 
			
		||||
		player.setActiveClass(_index);
 | 
			
		||||
		
 | 
			
		||||
		final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
 | 
			
		||||
		msg.addClassId(activeClass);
 | 
			
		||||
		msg.addClassId(player.getClassId().getId());
 | 
			
		||||
		player.sendPacket(msg);
 | 
			
		||||
		
 | 
			
		||||
		player.broadcastUserInfo();
 | 
			
		||||
		player.sendPacket(new ExStorageMaxCount(player));
 | 
			
		||||
		player.sendPacket(new AcquireSkillList(player));
 | 
			
		||||
		player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
 | 
			
		||||
		
 | 
			
		||||
		if (player.isInParty())
 | 
			
		||||
		{
 | 
			
		||||
			// Delete party window for other party members
 | 
			
		||||
			player.getParty().broadcastToPartyMembers(player, PartySmallWindowDeleteAll.STATIC_PACKET);
 | 
			
		||||
			for (PlayerInstance member : player.getParty().getMembers())
 | 
			
		||||
			final PlayerInstance player = effected.getActingPlayer();
 | 
			
		||||
			if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
 | 
			
		||||
			{
 | 
			
		||||
				// And re-add
 | 
			
		||||
				if (member != player)
 | 
			
		||||
				{
 | 
			
		||||
					member.sendPacket(new PartySmallWindowAll(member, player.getParty()));
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		// Stop auto use.
 | 
			
		||||
		for (Shortcut shortcut : player.getAllShortCuts())
 | 
			
		||||
		{
 | 
			
		||||
			if (!shortcut.isAutoUse())
 | 
			
		||||
			{
 | 
			
		||||
				continue;
 | 
			
		||||
				player.sendMessage("You cannot switch your class right now!");
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			player.removeAutoShortcut(shortcut.getSlot(), shortcut.getPage());
 | 
			
		||||
			final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
 | 
			
		||||
			if (identityCrisis != null)
 | 
			
		||||
			{
 | 
			
		||||
				identityCrisis.applyEffects(player, player);
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if (player.getAutoUseSettings().isAutoSkill(shortcut.getId()))
 | 
			
		||||
			if (OlympiadManager.getInstance().isRegisteredInComp(player))
 | 
			
		||||
			{
 | 
			
		||||
				final Skill knownSkill = player.getKnownSkill(shortcut.getId());
 | 
			
		||||
				if (knownSkill != null)
 | 
			
		||||
				OlympiadManager.getInstance().unRegisterNoble(player);
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			final int activeClass = player.getClassId().getId();
 | 
			
		||||
			player.setActiveClass(_index);
 | 
			
		||||
			
 | 
			
		||||
			final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
 | 
			
		||||
			msg.addClassId(activeClass);
 | 
			
		||||
			msg.addClassId(player.getClassId().getId());
 | 
			
		||||
			player.sendPacket(msg);
 | 
			
		||||
			
 | 
			
		||||
			player.broadcastUserInfo();
 | 
			
		||||
			player.sendPacket(new ExStorageMaxCount(player));
 | 
			
		||||
			player.sendPacket(new AcquireSkillList(player));
 | 
			
		||||
			player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
 | 
			
		||||
			
 | 
			
		||||
			if (player.isInParty())
 | 
			
		||||
			{
 | 
			
		||||
				// Delete party window for other party members
 | 
			
		||||
				player.getParty().broadcastToPartyMembers(player, PartySmallWindowDeleteAll.STATIC_PACKET);
 | 
			
		||||
				for (PlayerInstance member : player.getParty().getMembers())
 | 
			
		||||
				{
 | 
			
		||||
					if (knownSkill.isBad())
 | 
			
		||||
					// And re-add
 | 
			
		||||
					if (member != player)
 | 
			
		||||
					{
 | 
			
		||||
						AutoUseTaskManager.getInstance().removeAutoSkill(player, shortcut.getId());
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						AutoUseTaskManager.getInstance().removeAutoBuff(player, shortcut.getId());
 | 
			
		||||
						member.sendPacket(new PartySmallWindowAll(member, player.getParty()));
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			
 | 
			
		||||
			// Stop auto use.
 | 
			
		||||
			for (Shortcut shortcut : player.getAllShortCuts())
 | 
			
		||||
			{
 | 
			
		||||
				final ItemInstance knownItem = player.getInventory().getItemByObjectId(shortcut.getId());
 | 
			
		||||
				if (knownItem != null)
 | 
			
		||||
				if (!shortcut.isAutoUse())
 | 
			
		||||
				{
 | 
			
		||||
					if (knownItem.isPotion())
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				player.removeAutoShortcut(shortcut.getSlot(), shortcut.getPage());
 | 
			
		||||
				
 | 
			
		||||
				if (player.getAutoUseSettings().isAutoSkill(shortcut.getId()))
 | 
			
		||||
				{
 | 
			
		||||
					final Skill knownSkill = player.getKnownSkill(shortcut.getId());
 | 
			
		||||
					if (knownSkill != null)
 | 
			
		||||
					{
 | 
			
		||||
						AutoUseTaskManager.getInstance().removeAutoPotionItem(player, knownItem.getId());
 | 
			
		||||
						if (knownSkill.isBad())
 | 
			
		||||
						{
 | 
			
		||||
							AutoUseTaskManager.getInstance().removeAutoSkill(player, shortcut.getId());
 | 
			
		||||
						}
 | 
			
		||||
						else
 | 
			
		||||
						{
 | 
			
		||||
							AutoUseTaskManager.getInstance().removeAutoBuff(player, shortcut.getId());
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					final ItemInstance knownItem = player.getInventory().getItemByObjectId(shortcut.getId());
 | 
			
		||||
					if (knownItem != null)
 | 
			
		||||
					{
 | 
			
		||||
						AutoUseTaskManager.getInstance().removeAutoSupplyItem(player, knownItem.getId());
 | 
			
		||||
						if (knownItem.isPotion())
 | 
			
		||||
						{
 | 
			
		||||
							AutoUseTaskManager.getInstance().removeAutoPotionItem(player, knownItem.getId());
 | 
			
		||||
						}
 | 
			
		||||
						else
 | 
			
		||||
						{
 | 
			
		||||
							AutoUseTaskManager.getInstance().removeAutoSupplyItem(player, knownItem.getId());
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		}, 500);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user