搜索修改：

    public void changeSingleSkillLevel(final Skill skill, int newLevel, byte newMasterlevel, long expiration) {
        final Map<Skill, SkillEntry> list = new HashMap<Skill, SkillEntry>();
        boolean hasRecovery = false, recalculate = false;
        if (changeSkillData(skill, newLevel, newMasterlevel, expiration)) { // no loop, only 1
            list.put(skill, new SkillEntry(newLevel, newMasterlevel, expiration + (3600000 * 12))); //添加技能的顯示的時間
            if (GameConstants.isRecoveryIncSkill(skill.getId())) {
                hasRecovery = true;
            }
            if (skill.getId() < 80000000) {
                recalculate = true;
            }
        }
        if (list.isEmpty()) { // nothing is changed
            return;
        }
        client.getSession().write(MaplePacketCreator.updateSkills(list));
        reUpdateStat(hasRecovery, recalculate);
    }


搜索修改：

    public static final void addSkillInfo(final MaplePacketLittleEndianWriter mplew, final MapleCharacter chr) { // 0x100
        final Map<Skill, SkillEntry> skills = chr.getSkills();
        mplew.write(1);
        mplew.writeShort(skills.size());
        for (Entry<Skill, SkillEntry> skill : skills.entrySet()) {
            mplew.writeInt(skill.getKey().getId());
            if (skill.getKey().getId() == 80000000 || skill.getKey().getId() == 80000001 || skill.getKey().getId() == 80001040) {//顯示傳授技能的角色
                mplew.writeInt(skill.getValue().teachId);
            } else if (skill.getKey().getId() == 110 || skill.getKey().getId() == 20021110 || skill.getKey().getId() == 30010112) {//過濾已傳授技能的角色
                mplew.writeInt(skill.getValue().teachId > 0 ? skill.getValue().teachId : skill.getValue().skillevel);
            } else {
                mplew.writeInt(skill.getValue().skillevel);
            }
            addExpirationTime(mplew, skill.getValue().expiration + (3600000 * 12)); //上線載入技能顯示的時間
            if (skill.getKey().isFourthJob()) {
                mplew.writeInt(skill.getValue().masterlevel);
            }
        }
    }


搜索：

            pendingExpiration = null;
            if (pendingSkills != null) {
                client.getSession().write(MaplePacketCreator.updateSkills(pendingSkills));
                for (Skill z : pendingSkills.keySet()) {
                    client.getSession().write(MaplePacketCreator.serverNotice(5, "[" + SkillFactory.getSkillName(z.getId()) + "] 技能尚未恢復，無法使用。"));
                }
            } //not real msg
            pendingSkills = null;
            return;
        }

替換：

            pendingExpiration = null;
            if (pendingSkills != null) {
            client.getSession().write(MaplePacketCreator.updateSkills(pendingSkills)); //發送刪除技能的封包
            client.getSession().write(MaplePacketCreator.showSkillExpired(pendingSkills)); //發送技能到期提示
            } //not real msg
            pendingSkills = null;
            return;
        }

搜索：

    public static byte[] updateSkills(final Map<Skill, SkillEntry> update) {
        MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(7 + (update.size() * 20));

        mplew.writeShort(SendPacketOpcode.UPDATE_SKILLS.getValue());
        mplew.write(1);
        mplew.write(0); // A skill has been activated / deactivated?
        mplew.writeShort(update.size());
        for (final Entry<Skill, SkillEntry> z : update.entrySet()) {
            mplew.writeInt(z.getKey().getId());
            mplew.writeInt(z.getValue().skillevel);
            mplew.writeInt(z.getValue().masterlevel);
            PacketHelper.addExpirationTime(mplew, z.getValue().expiration);
        }
        mplew.write(4);

        return mplew.getPacket();
    }


替換：

    public static byte[] updateSkills(final Map<Skill, SkillEntry> update) {
        MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(7 + (update.size() * 20));

        mplew.writeShort(SendPacketOpcode.UPDATE_SKILLS.getValue());
        mplew.write(1);
        mplew.write(0); // A skill has been activated / deactivated?
        mplew.writeShort(update.size());
        for (final Entry<Skill, SkillEntry> z : update.entrySet()) {
            mplew.writeInt(z.getKey().getId());
            mplew.writeInt(z.getValue().skillevel);
            mplew.writeInt(z.getValue().masterlevel);
            PacketHelper.addExpirationTime(mplew, z.getValue().expiration);
        }
        mplew.write(4);

        return mplew.getPacket();
    }

    public static byte[] showSkillExpired(Map<Skill, SkillEntry> update) {
        MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();

        mplew.writeShort(SendPacketOpcode.SHOW_STATUS_INFO.getValue());
        mplew.write(0x0F);
        mplew.write(update.size()); //技能數量
        for (Entry<Skill, SkillEntry> skills : update.entrySet()) {
            mplew.writeInt(skills.getKey().getId());
        }

        return mplew.getPacket();
    }