Eraton

Gigi

Прославленный
Проверенный
Легенда Истоков
Старожил I степени
Сообщения
477
Розыгрыши
0
Решения
3
Репутация
219
Реакции
137
Баллы
1 438
Хроники
  1. Master Class
Сборка
Mobius
Есть такой чувак в ивенте либры который меняет судьбу человечества, за камушек. ну добавил я для смены класса волка и самурая, так на волка меняет всё тип-топ а на самурая убей не хочет, не нравится 268 профа. Застревает этом диалоге

Untitled.webp ​

Вот сам код и что я добавил

Код:
package events.RedLibra.Eraton;

import java.util.List;

import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.config.PlayerConfig;
import org.l2jmobius.gameserver.data.xml.ClassListData;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.data.xml.SkillTreeData;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.enums.player.PlayerClass;
import org.l2jmobius.gameserver.model.actor.enums.player.SubclassInfoType;
import org.l2jmobius.gameserver.model.actor.holders.player.Shortcut;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
import org.l2jmobius.gameserver.model.events.annotations.Id;
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
import org.l2jmobius.gameserver.model.events.holders.actor.npc.OnNpcMenuSelect;
import org.l2jmobius.gameserver.model.item.enums.ItemProcessType;
import org.l2jmobius.gameserver.model.item.holders.ItemHolder;
import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.olympiad.Hero;
import org.l2jmobius.gameserver.model.olympiad.Olympiad;
import org.l2jmobius.gameserver.model.script.Script;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.skill.holders.SkillLearn;
import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight;
import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
import org.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
import org.l2jmobius.gameserver.taskmanagers.AutoUseTaskManager;

/**
 * Red Libra<br>
 * Step 1.<br>
 * Contact Red to move to Eraton in the Aden Temple where the class change is taking place. (Must have the Stone of Destiny and the Main Class cloak.)<br>
 * Step 2.<br>
 * Contact Eraton in the Aden Temple to learn the details of the class change. Once everything is ready, select the desired class and confirm your choice.<br>
 * Step 3.<br>
 * Congratulations! The main character class has been changed. The process is accompanied by a distinctive animation with a character jumping up.
 * @author Index, Gaikotsu
 */
public class Eraton extends Script
{
    // NPC
    private static final int ERATON = 34584;
 
    // Items
    private static final ItemHolder STONE_OF_DESTINY = new ItemHolder(17722, 1);
    private static final ItemHolder CHAOS_POMANDER = new ItemHolder(37374, 2);
 
    // Misc
    private static final String ITEM_NAME_PATTERN = "&#" + STONE_OF_DESTINY.getId() + ";";
 
    private Eraton()
    {
        addStartNpc(ERATON);
        addFirstTalkId(ERATON);
        addTalkId(ERATON);
    }
 
    @Override
    public String onEvent(String event, Npc npc, Player player)
    {
        String htmltext = null;
        switch (event)
        {
            case ("back"):
            {
                htmltext = getHtm(player, "34584.html").replace("%required_item%", ITEM_NAME_PATTERN);
                break;
            }
            case ("ERATON_HELP"):
            {
                // TODO: NEED TO BE FOUND!!
                htmltext = getHtm(player, "34584-9.html").replace("%required_item%", ITEM_NAME_PATTERN).replace("%required_item_count%", String.valueOf(STONE_OF_DESTINY.getCount()));
                break;
            }
            case ("ERATON_LIST"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "SIGEL" + "\">Sigel Knight</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "TYRR" + "\">Tyrr Warrior</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "OTHELL" + "\">Othell Rogue</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "YUL" + "\">Yul Archer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "FEOH" + "\">Feoh Wizard</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "ISS" + "\">Iss Enchanter</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "WYNN" + "\">Wynn Summoner</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "AEORE" + "\">Aeore Healer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "SHINEMAKER" + "\">Shine Maker</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "WARG" + "\">Warg</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "SAMURAI" + "\">Samurai</button>");
                htmltext = getHtm(player, "34584-1.html").replace("%CLASS_NAMES%", sb.toString());
                break;
            }
            case ("ERATON_SIGEL"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SIGEL_PHOENIX_KNIGHT + "\">Sigel Phoenix Knight</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SIGEL_HELL_KNIGHT + "\">Sigel Hell Knight</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SIGEL_EVA_TEMPLAR + "\">Sigel Eva Templar</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SIGEL_SHILLIEN_TEMPLAR + "\">Sigel Shillien Templar</button>");
            
                // Death Knights became able to use the Stone of Destiny item with the Death Knight Reborn Content Update released on August 1st 2023.
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SIGEL_DEATH_KNIGHT + "\">Sigel Death Knight</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_TYRR"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_DUELIST + "\">Tyrr Duelist</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_DREADNOUGHT + "\">Tyrr Drearnought</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_TITAN + "\">Tyrr Titan</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_GRAND_KHAVATARI + "\">Tyrr Grand Khavatari</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_DOOMBRINGER + "\">Tyrr Doombringer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_MAESTRO + "\">Tyrr Maestro</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.EVISCERATOR + "\">Eviscerator</button>");
            
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_OTHELL"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.OTHELL_ADVENTURER + "\">Othell Adventurer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.OTHELL_WIND_RIDER + "\">Othell Wind Rider</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.OTHELL_GHOST_HUNTER + "\">Othell Ghost Hunter</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.OTHELL_FORTUNE_SEEKER + "\">Othell Fortune Seeker</button>");
            
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_YUL"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.YUL_SAGITTARIUS + "\">Yul Sagittarius</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.YUL_MOONLIGHT_SENTINEL + "\">Yul Moonlight Sentinel</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.YUL_GHOST_SENTINEL + "\">Yul Ghost Sentinel</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.YUL_TRICKSTER + "\">Yul Trickster</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_FEOH"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.FEOH_ARCHMAGE + "\">Feoh Archmage</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.FEOH_SOULTAKER + "\">Feoh Soultaker</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.FEOH_MYSTIC_MUSE + "\">Feoh Mystic Muse</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.FEOH_STORM_SCREAMER + "\">Feoh Storm Screamer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.FEOH_SOUL_HOUND + "\">Feoh SoulHound</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SAYHA_SEER + "\">Sayha's Seer</button>");
            
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_ISS"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.ISS_HIEROPHANT + "\">Iss Hierophant</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.ISS_SWORD_MUSE + "\">Iss Sword Muse</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.ISS_SPECTRAL_DANCER + "\">Iss Spectral Dancer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.ISS_DOOMCRYER + "\">Iss Doomcryer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.ISS_DOMINATOR + "\">Iss Dominator</button>");
            
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_WYNN"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.WYNN_ARCANA_LORD + "\">Wynn Arcana Lord</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.WYNN_ELEMENTAL_MASTER + "\">Wynn Elemental Master</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.WYNN_SPECTRAL_MASTER + "\">Wynn Spectral Master</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_AEORE"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.AEORE_CARDINAL + "\">Aeore Cardinal</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.AEORE_EVA_SAINT + "\">Aeore Eva Saint</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.AEORE_SHILLIEN_SAINT + "\">Aeore Shillien Saint</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_SHINEMAKER"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SHINE_MAKER + "\">Shine Maker</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_WARG"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.WARG_4 + "\">Wrag</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_SAMURAI"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SAMURAI + "\">Samurai</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            default:
            {
                final PlayerClass playerClass = PlayerClass.valueOf(event.replace("ERATON_", ""));
                if (playerClass != null)
                {
                    final StringBuilder sb = new StringBuilder();
                    sb.append("<Button ALIGN=LEFT ICON=NORMAL action=\"bypass -h menu_select?ask=1&reply=" + playerClass.getId() + "\">" + "Select " + ClassListData.getInstance().getClass(playerClass.getId()).getClassName() + "</Button>");
                    htmltext = getHtm(player, "34584-3.html").replace("%CONFIRM_BUTTON%", sb.toString());
                }
            }
        }
    
        return htmltext;
    }
 
    @Override
    public String onFirstTalk(Npc npc, Player player)
    {
        String htmltext;
        htmltext = getHtm(player, "34584.html").replace("%required_item%", ITEM_NAME_PATTERN);
        return htmltext;
    }
 
    @RegisterEvent(EventType.ON_NPC_MENU_SELECT)
    @RegisterType(ListenerRegisterType.NPC)
    @Id(ERATON)
    public void onNpcMenuSelect(OnNpcMenuSelect event)
    {
        final Player player = event.getTalker();
        final int ask = event.getAsk();
        switch (ask)
        {
            case 1:
            {
                final int classId = event.getReply();
                if (!player.isAwakenedClass())
                {
                    player.sendPacket(new NpcHtmlMessage(getHtm(player, "34584-7.html")));
                    return;
                }
            
                if (!hasQuestItems(player, STONE_OF_DESTINY.getId()))
                {
                    player.sendPacket(new NpcHtmlMessage(getHtm(player, "34584-4.html").replace("%required_item%", ITEM_NAME_PATTERN).replace("%required_item_count%", String.valueOf(STONE_OF_DESTINY.getCount()))));
                    return;
                }
            
                if ((player.getDualClass() != null) && (player.getDualClass().getId() == classId))
                {
                    player.sendPacket(new NpcHtmlMessage(getHtm(player, "34584-6.html").replace("%s1%", "Main").replace("%s2%", "Dual")));
                    return;
                }
            
                if ((player.getClass() != null) && (player.getBaseClass() == classId))
                {
                    player.sendPacket(new NpcHtmlMessage(getHtm(player, "34584-6.html").replace("%s1%", "Main").replace("%s2%", "Current")));
                    return;
                }
            
                if (player.isTransformed() || player.hasSummon() || player.isDualClassActive())
                {
                    player.sendPacket(new NpcHtmlMessage(getHtm(player, "34584-5.html")));
                    return;
                }
            
                if (player.isHero() || player.isTrueHero() || Hero.getInstance().isUnclaimedHero(player.getObjectId()))
                {
                    player.sendPacket(SystemMessageId.YOU_CANNOT_AWAKEN_WHEN_YOU_ARE_A_HERO_OR_ON_THE_WAIT_LIST_FOR_HERO_STATUS);
                    return;
                }
            
                // TODO: SET 1000 points for Olympiad after change main class.
            
                takeItem(player, STONE_OF_DESTINY);
            
                player.abortCast();
                player.stopCubics();
                player.stopAllEffects();
                player.getEffectList().stopAllToggles();
                player.getEffectList().stopAllEffectsWithoutExclusions(false, false); // ReplaceSkillBySkill should stop here.
                if (PlayerConfig.ERATON_RETAINED_SKILLS.isEmpty())
                {
                    player.removeAllSkills();
                }
                else
                {
                    for (Skill skill : player.getAllSkills())
                    {
                        if (!PlayerConfig.ERATON_RETAINED_SKILLS.contains(skill.getId()))
                        {
                            player.removeSkill(skill);
                        }
                    }
                }
            
                player.getEffectList().stopAllEffectsWithoutExclusions(false, false); // After removal of skills.
            
                // Stop auto use.
                for (Shortcut shortcut : player.getAllShortcuts())
                {
                    if (!shortcut.isAutoUse())
                    {
                        continue;
                    }
                
                    player.removeAutoShortcut(shortcut.getSlot(), shortcut.getPage());
                
                    if (player.getAutoUseSettings().isAutoSkill(shortcut.getId()))
                    {
                        final Skill knownSkill = player.getKnownSkill(shortcut.getId());
                        if (knownSkill != null)
                        {
                            if (knownSkill.hasNegativeEffect())
                            {
                                AutoUseTaskManager.getInstance().removeAutoSkill(player, shortcut.getId());
                            }
                            else
                            {
                                AutoUseTaskManager.getInstance().removeAutoBuff(player, shortcut.getId());
                            }
                        }
                    }
                    else
                    {
                        final Item knownItem = player.getInventory().getItemByObjectId(shortcut.getId());
                        if (knownItem != null)
                        {
                            if (knownItem.isPotion())
                            {
                                AutoUseTaskManager.getInstance().setAutoPotionItem(player, knownItem.getId());
                            }
                            else
                            {
                                AutoUseTaskManager.getInstance().removeAutoSupplyItem(player, knownItem.getId());
                            }
                        }
                    }
                }
            
                if ((classId == 216)) // Death Knight
                {
                    player.getAppearance().setMale();
                    player.setDeathKnight(true);
                    player.setOriginalClass(PlayerClass.SIGEL_DEATH_KNIGHT);
                    player.setPlayerClass(classId);
                }
                else if (classId == 174) // Iss Dominator
                {
                    player.setOriginalClass(PlayerClass.ISS_DOMINATOR);
                    player.setPlayerClass(classId);
                }
                else if (classId == 156) // Tyrr Maestro
                {
                    player.setOriginalClass(PlayerClass.TYRR_MAESTRO);
                    player.setPlayerClass(classId);
                }
                else if (classId == 188) // Eviscerator
                {
                    player.getAppearance().setFemale();
                    player.setOriginalClass(PlayerClass.EVISCERATOR);
                    player.setPlayerClass(classId);
                }
                else if (classId == 189) // Sayha's Seer
                {
                    player.getAppearance().setFemale();
                    player.setOriginalClass(PlayerClass.SAYHA_SEER);
                    player.setPlayerClass(classId);
                }
                else if (classId == 235) // Shine Maker
                {
                    player.getAppearance().setFemale();
                    player.setOriginalClass(PlayerClass.SHINE_MAKER);
                    player.setPlayerClass(classId);
                }
                else if (classId == 259) // Warg
                {
                    player.getAppearance().setMale();
                    player.setWarg(true);
                    player.setOriginalClass(PlayerClass.WARG_4);
                    player.setPlayerClass(classId);
                }
                else if (classId == 268) // Samurai
                {
                    player.getAppearance().setMale();
                    player.setSamurai(true);
                    player.setOriginalClass(PlayerClass.SAMURAI);
                    player.setPlayerClass(classId);
                }
                else
                {
                    if (player.getPlayerClass() == PlayerClass.SIGEL_DEATH_KNIGHT)
                    {
                        player.setOriginalClass(PlayerClass.SIGEL_PHOENIX_KNIGHT);
                    }
                
                    if (player.getPlayerClass() == PlayerClass.SHINE_MAKER)
                    {
                        player.setOriginalClass(PlayerClass.MAESTRO);
                    }
                
                    if (player.getPlayerClass() == PlayerClass.WARG_0)
                    {
                        player.setOriginalClass(PlayerClass.SIGEL_PHOENIX_KNIGHT);
                    }
                
                    if (player.getPlayerClass() == PlayerClass.SAMURAI)
                    {
                        player.setOriginalClass(PlayerClass.FEOH_SOUL_HOUND);
                    }
                
                    if (player.getOriginalClass() == null)
                    {
                        player.setOriginalClass(player.getPlayerClass());
                    }
                
                    player.setPlayerClass(classId);
                }
            
                player.setBaseClass(player.getActiveClass());
                player.setAbilityPointsUsed(0, true);
                player.restoreAbilitySkills();
                player.storeMe();
                SkillTreeData.getInstance().cleanSkillUponChangeClass(player);
                for (SkillLearn skill : SkillTreeData.getInstance().getRaceSkillTree(player.getRace()))
                {
                    player.addSkill(SkillData.getInstance().getSkill(skill.getSkillId(), skill.getSkillLevel()), true);
                }
            
                final List<Integer> removedSkillIds = PlayerConfig.HARDIN_REMOVED_SKILLS.get(classId);
                if (removedSkillIds != null)
                {
                    for (int skillId : removedSkillIds)
                    {
                        final Skill skill = player.getKnownSkill(skillId);
                        if (skill != null)
                        {
                            player.removeSkill(skill);
                        }
                    }
                }
            
                // Disarm unusable equipment.
                player.disarmUnusableEquipment();
            
                if (player.getWarehouse().getItemByItemId(CHAOS_POMANDER.getId()) != null)
                {
                    final long warehouseCount = (player.getWarehouse().getItemByItemId(CHAOS_POMANDER.getId())).getCount();
                    if (warehouseCount > 0)
                    {
                        player.getWarehouse().destroyItemByItemId(ItemProcessType.FEE, CHAOS_POMANDER.getId(), warehouseCount, player, null);
                    }
                }
            
                if (hasAtLeastOneQuestItem(player, CHAOS_POMANDER.getId()))
                {
                    takeItems(player, CHAOS_POMANDER.getId(), -1);
                }
            
                // Remove olympiad nobless.
                Olympiad.removeNobleStats(player.getObjectId());
            
                // Set new PlayerClass.
                player.restoreDualSkills();
                player.store(false);
                player.broadcastUserInfo();
                player.sendSkillList();
                player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
                player.sendPacket(new ExUserInfoInvenWeight(player));
                giveItems(player, CHAOS_POMANDER);
                player.sendPacket(SystemMessageId.YOU_HAVE_BEEN_DISCONNECTED_FROM_THE_SERVER_2);
                ThreadPool.schedule(() -> Disconnection.of(player).storeAndDeleteWith(LeaveWorld.STATIC_PACKET), 4000);
                break;
            }
        }
    }
 
    public static void main(String[] args)
    {
        new Eraton();
    }
}

Чем ему не нравиться профа самурая (268)
 
Последнее редактирование:
Есть такой чувак в ивенте либры который меняет судьбу человечества, за камушек. ну добавил я для смены класса волка и самурая, так на волка меняет всё тип-топ а на свмурая убей не хочет, не нравится 268 профа. Застревает этом диалоге


Вот сам код и что я добавил

Код:
package events.RedLibra.Eraton;

import java.util.List;

import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.config.PlayerConfig;
import org.l2jmobius.gameserver.data.xml.ClassListData;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.data.xml.SkillTreeData;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.enums.player.PlayerClass;
import org.l2jmobius.gameserver.model.actor.enums.player.SubclassInfoType;
import org.l2jmobius.gameserver.model.actor.holders.player.Shortcut;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
import org.l2jmobius.gameserver.model.events.annotations.Id;
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
import org.l2jmobius.gameserver.model.events.holders.actor.npc.OnNpcMenuSelect;
import org.l2jmobius.gameserver.model.item.enums.ItemProcessType;
import org.l2jmobius.gameserver.model.item.holders.ItemHolder;
import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.olympiad.Hero;
import org.l2jmobius.gameserver.model.olympiad.Olympiad;
import org.l2jmobius.gameserver.model.script.Script;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.skill.holders.SkillLearn;
import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight;
import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
import org.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
import org.l2jmobius.gameserver.taskmanagers.AutoUseTaskManager;

/**
 * Red Libra<br>
 * Step 1.<br>
 * Contact Red to move to Eraton in the Aden Temple where the class change is taking place. (Must have the Stone of Destiny and the Main Class cloak.)<br>
 * Step 2.<br>
 * Contact Eraton in the Aden Temple to learn the details of the class change. Once everything is ready, select the desired class and confirm your choice.<br>
 * Step 3.<br>
 * Congratulations! The main character class has been changed. The process is accompanied by a distinctive animation with a character jumping up.
 * @author Index, Gaikotsu
 */
public class Eraton extends Script
{
    // NPC
    private static final int ERATON = 34584;
 
    // Items
    private static final ItemHolder STONE_OF_DESTINY = new ItemHolder(17722, 1);
    private static final ItemHolder CHAOS_POMANDER = new ItemHolder(37374, 2);
 
    // Misc
    private static final String ITEM_NAME_PATTERN = "&#" + STONE_OF_DESTINY.getId() + ";";
 
    private Eraton()
    {
        addStartNpc(ERATON);
        addFirstTalkId(ERATON);
        addTalkId(ERATON);
    }
 
    @Override
    public String onEvent(String event, Npc npc, Player player)
    {
        String htmltext = null;
        switch (event)
        {
            case ("back"):
            {
                htmltext = getHtm(player, "34584.html").replace("%required_item%", ITEM_NAME_PATTERN);
                break;
            }
            case ("ERATON_HELP"):
            {
                // TODO: NEED TO BE FOUND!!
                htmltext = getHtm(player, "34584-9.html").replace("%required_item%", ITEM_NAME_PATTERN).replace("%required_item_count%", String.valueOf(STONE_OF_DESTINY.getCount()));
                break;
            }
            case ("ERATON_LIST"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "SIGEL" + "\">Sigel Knight</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "TYRR" + "\">Tyrr Warrior</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "OTHELL" + "\">Othell Rogue</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "YUL" + "\">Yul Archer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "FEOH" + "\">Feoh Wizard</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "ISS" + "\">Iss Enchanter</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "WYNN" + "\">Wynn Summoner</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "AEORE" + "\">Aeore Healer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "SHINEMAKER" + "\">Shine Maker</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "WARG" + "\">Warg</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + "SAMURAI" + "\">Samurai</button>");
                htmltext = getHtm(player, "34584-1.html").replace("%CLASS_NAMES%", sb.toString());
                break;
            }
            case ("ERATON_SIGEL"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SIGEL_PHOENIX_KNIGHT + "\">Sigel Phoenix Knight</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SIGEL_HELL_KNIGHT + "\">Sigel Hell Knight</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SIGEL_EVA_TEMPLAR + "\">Sigel Eva Templar</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SIGEL_SHILLIEN_TEMPLAR + "\">Sigel Shillien Templar</button>");
            
                // Death Knights became able to use the Stone of Destiny item with the Death Knight Reborn Content Update released on August 1st 2023.
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SIGEL_DEATH_KNIGHT + "\">Sigel Death Knight</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_TYRR"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_DUELIST + "\">Tyrr Duelist</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_DREADNOUGHT + "\">Tyrr Drearnought</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_TITAN + "\">Tyrr Titan</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_GRAND_KHAVATARI + "\">Tyrr Grand Khavatari</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_DOOMBRINGER + "\">Tyrr Doombringer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.TYRR_MAESTRO + "\">Tyrr Maestro</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.EVISCERATOR + "\">Eviscerator</button>");
            
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_OTHELL"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.OTHELL_ADVENTURER + "\">Othell Adventurer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.OTHELL_WIND_RIDER + "\">Othell Wind Rider</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.OTHELL_GHOST_HUNTER + "\">Othell Ghost Hunter</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.OTHELL_FORTUNE_SEEKER + "\">Othell Fortune Seeker</button>");
            
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_YUL"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.YUL_SAGITTARIUS + "\">Yul Sagittarius</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.YUL_MOONLIGHT_SENTINEL + "\">Yul Moonlight Sentinel</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.YUL_GHOST_SENTINEL + "\">Yul Ghost Sentinel</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.YUL_TRICKSTER + "\">Yul Trickster</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_FEOH"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.FEOH_ARCHMAGE + "\">Feoh Archmage</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.FEOH_SOULTAKER + "\">Feoh Soultaker</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.FEOH_MYSTIC_MUSE + "\">Feoh Mystic Muse</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.FEOH_STORM_SCREAMER + "\">Feoh Storm Screamer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.FEOH_SOUL_HOUND + "\">Feoh SoulHound</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SAYHA_SEER + "\">Sayha's Seer</button>");
            
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_ISS"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.ISS_HIEROPHANT + "\">Iss Hierophant</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.ISS_SWORD_MUSE + "\">Iss Sword Muse</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.ISS_SPECTRAL_DANCER + "\">Iss Spectral Dancer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.ISS_DOOMCRYER + "\">Iss Doomcryer</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.ISS_DOMINATOR + "\">Iss Dominator</button>");
            
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_WYNN"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.WYNN_ARCANA_LORD + "\">Wynn Arcana Lord</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.WYNN_ELEMENTAL_MASTER + "\">Wynn Elemental Master</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.WYNN_SPECTRAL_MASTER + "\">Wynn Spectral Master</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_AEORE"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.AEORE_CARDINAL + "\">Aeore Cardinal</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.AEORE_EVA_SAINT + "\">Aeore Eva Saint</button>");
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.AEORE_SHILLIEN_SAINT + "\">Aeore Shillien Saint</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_SHINEMAKER"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SHINE_MAKER + "\">Shine Maker</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_WARG"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.WARG_4 + "\">Wrag</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            case ("ERATON_SAMURAI"):
            {
                final StringBuilder sb = new StringBuilder();
                sb.append("<button align=\"LEFT\" icon=\"NORMAL\" action=\"bypass -h Script Eraton ERATON_" + PlayerClass.SAMURAI + "\">Samurai</button>");
                htmltext = getHtm(player, "34584-2.html").replace("%CLASS_LIST%", sb.toString());
                break;
            }
            default:
            {
                final PlayerClass playerClass = PlayerClass.valueOf(event.replace("ERATON_", ""));
                if (playerClass != null)
                {
                    final StringBuilder sb = new StringBuilder();
                    sb.append("<Button ALIGN=LEFT ICON=NORMAL action=\"bypass -h menu_select?ask=1&reply=" + playerClass.getId() + "\">" + "Select " + ClassListData.getInstance().getClass(playerClass.getId()).getClassName() + "</Button>");
                    htmltext = getHtm(player, "34584-3.html").replace("%CONFIRM_BUTTON%", sb.toString());
                }
            }
        }
    
        return htmltext;
    }
 
    @Override
    public String onFirstTalk(Npc npc, Player player)
    {
        String htmltext;
        htmltext = getHtm(player, "34584.html").replace("%required_item%", ITEM_NAME_PATTERN);
        return htmltext;
    }
 
    @RegisterEvent(EventType.ON_NPC_MENU_SELECT)
    @RegisterType(ListenerRegisterType.NPC)
    @Id(ERATON)
    public void onNpcMenuSelect(OnNpcMenuSelect event)
    {
        final Player player = event.getTalker();
        final int ask = event.getAsk();
        switch (ask)
        {
            case 1:
            {
                final int classId = event.getReply();
                if (!player.isAwakenedClass())
                {
                    player.sendPacket(new NpcHtmlMessage(getHtm(player, "34584-7.html")));
                    return;
                }
            
                if (!hasQuestItems(player, STONE_OF_DESTINY.getId()))
                {
                    player.sendPacket(new NpcHtmlMessage(getHtm(player, "34584-4.html").replace("%required_item%", ITEM_NAME_PATTERN).replace("%required_item_count%", String.valueOf(STONE_OF_DESTINY.getCount()))));
                    return;
                }
            
                if ((player.getDualClass() != null) && (player.getDualClass().getId() == classId))
                {
                    player.sendPacket(new NpcHtmlMessage(getHtm(player, "34584-6.html").replace("%s1%", "Main").replace("%s2%", "Dual")));
                    return;
                }
            
                if ((player.getClass() != null) && (player.getBaseClass() == classId))
                {
                    player.sendPacket(new NpcHtmlMessage(getHtm(player, "34584-6.html").replace("%s1%", "Main").replace("%s2%", "Current")));
                    return;
                }
            
                if (player.isTransformed() || player.hasSummon() || player.isDualClassActive())
                {
                    player.sendPacket(new NpcHtmlMessage(getHtm(player, "34584-5.html")));
                    return;
                }
            
                if (player.isHero() || player.isTrueHero() || Hero.getInstance().isUnclaimedHero(player.getObjectId()))
                {
                    player.sendPacket(SystemMessageId.YOU_CANNOT_AWAKEN_WHEN_YOU_ARE_A_HERO_OR_ON_THE_WAIT_LIST_FOR_HERO_STATUS);
                    return;
                }
            
                // TODO: SET 1000 points for Olympiad after change main class.
            
                takeItem(player, STONE_OF_DESTINY);
            
                player.abortCast();
                player.stopCubics();
                player.stopAllEffects();
                player.getEffectList().stopAllToggles();
                player.getEffectList().stopAllEffectsWithoutExclusions(false, false); // ReplaceSkillBySkill should stop here.
                if (PlayerConfig.ERATON_RETAINED_SKILLS.isEmpty())
                {
                    player.removeAllSkills();
                }
                else
                {
                    for (Skill skill : player.getAllSkills())
                    {
                        if (!PlayerConfig.ERATON_RETAINED_SKILLS.contains(skill.getId()))
                        {
                            player.removeSkill(skill);
                        }
                    }
                }
            
                player.getEffectList().stopAllEffectsWithoutExclusions(false, false); // After removal of skills.
            
                // Stop auto use.
                for (Shortcut shortcut : player.getAllShortcuts())
                {
                    if (!shortcut.isAutoUse())
                    {
                        continue;
                    }
                
                    player.removeAutoShortcut(shortcut.getSlot(), shortcut.getPage());
                
                    if (player.getAutoUseSettings().isAutoSkill(shortcut.getId()))
                    {
                        final Skill knownSkill = player.getKnownSkill(shortcut.getId());
                        if (knownSkill != null)
                        {
                            if (knownSkill.hasNegativeEffect())
                            {
                                AutoUseTaskManager.getInstance().removeAutoSkill(player, shortcut.getId());
                            }
                            else
                            {
                                AutoUseTaskManager.getInstance().removeAutoBuff(player, shortcut.getId());
                            }
                        }
                    }
                    else
                    {
                        final Item knownItem = player.getInventory().getItemByObjectId(shortcut.getId());
                        if (knownItem != null)
                        {
                            if (knownItem.isPotion())
                            {
                                AutoUseTaskManager.getInstance().setAutoPotionItem(player, knownItem.getId());
                            }
                            else
                            {
                                AutoUseTaskManager.getInstance().removeAutoSupplyItem(player, knownItem.getId());
                            }
                        }
                    }
                }
            
                if ((classId == 216)) // Death Knight
                {
                    player.getAppearance().setMale();
                    player.setDeathKnight(true);
                    player.setOriginalClass(PlayerClass.SIGEL_DEATH_KNIGHT);
                    player.setPlayerClass(classId);
                }
                else if (classId == 174) // Iss Dominator
                {
                    player.setOriginalClass(PlayerClass.ISS_DOMINATOR);
                    player.setPlayerClass(classId);
                }
                else if (classId == 156) // Tyrr Maestro
                {
                    player.setOriginalClass(PlayerClass.TYRR_MAESTRO);
                    player.setPlayerClass(classId);
                }
                else if (classId == 188) // Eviscerator
                {
                    player.getAppearance().setFemale();
                    player.setOriginalClass(PlayerClass.EVISCERATOR);
                    player.setPlayerClass(classId);
                }
                else if (classId == 189) // Sayha's Seer
                {
                    player.getAppearance().setFemale();
                    player.setOriginalClass(PlayerClass.SAYHA_SEER);
                    player.setPlayerClass(classId);
                }
                else if (classId == 235) // Shine Maker
                {
                    player.getAppearance().setFemale();
                    player.setOriginalClass(PlayerClass.SHINE_MAKER);
                    player.setPlayerClass(classId);
                }
                else if (classId == 259) // Warg
                {
                    player.getAppearance().setMale();
                    player.setWarg(true);
                    player.setOriginalClass(PlayerClass.WARG_4);
                    player.setPlayerClass(classId);
                }
                else if (classId == 268) // Samurai
                {
                    player.getAppearance().setMale();
                    player.setSamurai(true);
                    player.setOriginalClass(PlayerClass.SAMURAI);
                    player.setPlayerClass(classId);
                }
                else
                {
                    if (player.getPlayerClass() == PlayerClass.SIGEL_DEATH_KNIGHT)
                    {
                        player.setOriginalClass(PlayerClass.SIGEL_PHOENIX_KNIGHT);
                    }
                
                    if (player.getPlayerClass() == PlayerClass.SHINE_MAKER)
                    {
                        player.setOriginalClass(PlayerClass.MAESTRO);
                    }
                
                    if (player.getPlayerClass() == PlayerClass.WARG_0)
                    {
                        player.setOriginalClass(PlayerClass.SIGEL_PHOENIX_KNIGHT);
                    }
                
                    if (player.getPlayerClass() == PlayerClass.SAMURAI)
                    {
                        player.setOriginalClass(PlayerClass.FEOH_SOUL_HOUND);
                    }
                
                    if (player.getOriginalClass() == null)
                    {
                        player.setOriginalClass(player.getPlayerClass());
                    }
                
                    player.setPlayerClass(classId);
                }
            
                player.setBaseClass(player.getActiveClass());
                player.setAbilityPointsUsed(0, true);
                player.restoreAbilitySkills();
                player.storeMe();
                SkillTreeData.getInstance().cleanSkillUponChangeClass(player);
                for (SkillLearn skill : SkillTreeData.getInstance().getRaceSkillTree(player.getRace()))
                {
                    player.addSkill(SkillData.getInstance().getSkill(skill.getSkillId(), skill.getSkillLevel()), true);
                }
            
                final List<Integer> removedSkillIds = PlayerConfig.HARDIN_REMOVED_SKILLS.get(classId);
                if (removedSkillIds != null)
                {
                    for (int skillId : removedSkillIds)
                    {
                        final Skill skill = player.getKnownSkill(skillId);
                        if (skill != null)
                        {
                            player.removeSkill(skill);
                        }
                    }
                }
            
                // Disarm unusable equipment.
                player.disarmUnusableEquipment();
            
                if (player.getWarehouse().getItemByItemId(CHAOS_POMANDER.getId()) != null)
                {
                    final long warehouseCount = (player.getWarehouse().getItemByItemId(CHAOS_POMANDER.getId())).getCount();
                    if (warehouseCount > 0)
                    {
                        player.getWarehouse().destroyItemByItemId(ItemProcessType.FEE, CHAOS_POMANDER.getId(), warehouseCount, player, null);
                    }
                }
            
                if (hasAtLeastOneQuestItem(player, CHAOS_POMANDER.getId()))
                {
                    takeItems(player, CHAOS_POMANDER.getId(), -1);
                }
            
                // Remove olympiad nobless.
                Olympiad.removeNobleStats(player.getObjectId());
            
                // Set new PlayerClass.
                player.restoreDualSkills();
                player.store(false);
                player.broadcastUserInfo();
                player.sendSkillList();
                player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
                player.sendPacket(new ExUserInfoInvenWeight(player));
                giveItems(player, CHAOS_POMANDER);
                player.sendPacket(SystemMessageId.YOU_HAVE_BEEN_DISCONNECTED_FROM_THE_SERVER_2);
                ThreadPool.schedule(() -> Disconnection.of(player).storeAndDeleteWith(LeaveWorld.STATIC_PACKET), 4000);
                break;
            }
        }
    }
 
    public static void main(String[] args)
    {
        new Eraton();
    }
}

Чем ему не нравиться профа самурая (268)
Тем что она может быть попросту не реализована , надо смотреть что выдают функции setSamurai ,setOriginalClass ,setPlayerClass в логах , если ничего не выдают то надо добавить вывод в логи .
 
Тем что она может быть попросту не реализована , надо смотреть что выдают функции setSamurai ,setOriginalClass ,setPlayerClass в логах , если ничего не выдают то надо добавить вывод в логи .
В коде нет ошибок, и в классах всё прописано и в playerClass.java и в xml
также:
Код:
    /**
     * @return True if the Player is a Samurai.
     */
    public boolean isSamurai()
    {
        return _isSamurai;
    }
 
    public void setSamurai(boolean value)
    {
        _isSamurai = value;
    }

в пакете выбора чара

        if (_player.isSamurai())
        {
            buffer.writeInt(264); // Base Samurai class id.
        }
 
В коде нет ошибок, и в классах всё прописано и в playerClass.java и в xml
также:
Код:
    /**
     * @return True if the Player is a Samurai.
     */
    public boolean isSamurai()
    {
        return _isSamurai;
    }
 
    public void setSamurai(boolean value)
    {
        _isSamurai = value;
    }

в пакете выбора чара

        if (_player.isSamurai())
        {
            buffer.writeInt(264); // Base Samurai class id.
        }
Значит то что надо там не прописано, соответственно отправляется либо не то что надо, либо не полностью то что надо. Чтобы точно сказать надо смотреть декомпил клиента, либо отлавливать оригинальные пакеты сниффером ( с оффа или того сервера где работает ) все.
 
Увелич лимит id проф в сервере во всех местах (и проблема в том, что эти значения захардкожены в многих местах сервера: java, xml, xsd - вместо 1 проверки максимального значения id проф в ядре), У мобиуса точно не будет желания и понимания переписать эту "устаревшую не актуальную логику".
И еще провеь в Таблице sql - занчение, принимает ли оно это число (а сокрее всего нет, делай изменения).
 
Увелич лимит id проф в сервере во всех местах (и проблема в том, что эти значения захардкожены в многих местах сервера: java, xml, xsd - вместо 1 проверки максимального значения id проф в ядре), У мобиуса точно не будет желания и понимания переписать эту "устаревшую не актуальную логику".
И еще провеь в Таблице sql - занчение, принимает ли оно это число (а сокрее всего нет, делай изменения).
Раз самурай создается значит в Таблице sql нет проблем и в xml тоже, так как xsd не ругается
Ну по логике раз с волком нет проблем класс ИД - 259 надо искать ограничения на большее значения числа класса. Но пока не могу нечего найти :oops:
 
Раз самурай создается значит в Таблице sql нет проблем и в xml тоже, так как xsd не ругается
Ну по логике раз с волком нет проблем класс ИД - 259 надо искать ограничения на большее значения числа класса. Но пока не могу нечего найти :oops:
Логики тут нет,
когда ты имеешь по харду в овер много где прописаное число (зачем??) - вместо 1 проверки,
П.с. и видимо, если у тебя не работает - то не верно скрипт описал в котром и проверки откуда то тянет.
 
Назад
Сверху Снизу