chenhui540

任務道具簡單修正

發表於 2023-12-26 10:10:06
chenhui540 發表於 2023-12-26 10:10:06 | 顯示全部樓層 |閱讀模式
1.png 2.png 3.png 4.png 5.png




recvops包頭   每個版本的值不同,需要推算

# 任務道具
QUEST_ITEM = 0x19E

# 使用任務道具
USE_ITEM_QUEST = 0x1A0


源碼部分

搜索:

    //QUEST_ITEM, //header -> questid(int) -> 1/0(byte, open or close)
    USE_ITEM_QUEST,



替換:

    QUEST_ITEM,
    USE_ITEM_QUEST,



搜索:


            case USE_ITEM_QUEST:
                NPCHandler.UseItemQuest(slea, c);
                break;


替換:

            case USE_ITEM_QUEST:
                NPCHandler.UseItemQuest(slea, c);
                break;
            case QUEST_ITEM:
                NPCHandler.QuestItem(slea, c);
                break;




搜索:

    public static final void UseItemQuest(final LittleEndianAccessor slea, final MapleClient c) {
        final short slot = slea.readShort();
        final int itemId = slea.readInt();
        final Item item = c.getPlayer().getInventory(MapleInventoryType.ETC).getItem(slot);
        final int qid = slea.readInt();
        final MapleQuest quest = MapleQuest.getInstance(qid);
        final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
        Pair<Integer, List<Integer>> questItemInfo = null;
        boolean found = false;
        for (Item i : c.getPlayer().getInventory(MapleInventoryType.ETC)) {
            if (i.getItemId() / 10000 == 422) {
                questItemInfo = ii.questItemInfo(i.getItemId());
                if (questItemInfo != null && questItemInfo.getLeft() == qid && questItemInfo.getRight() != null && questItemInfo.getRight().contains(itemId)) {
                    found = true;
                    break; //i believe it's any order
                }
            }
        }
        if (quest != null && found && item != null && item.getQuantity() > 0 && item.getItemId() == itemId) {
            final int newData = slea.readInt();
            final MapleQuestStatus stats = c.getPlayer().getQuestNoAdd(quest);
            if (stats != null && stats.getStatus() == 1) {
                stats.setCustomData(String.valueOf(newData));
                c.getPlayer().updateQuest(stats, true);
                MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.ETC, slot, (short) 1, false);
            }
        }
    }


替換:

    public static final void UseItemQuest(final LittleEndianAccessor slea, final MapleClient c) {
        slea.readByte();
        final short slot = slea.readByte();
        slea.readByte();
        final int itemId = slea.readInt();
        final Item item = c.getPlayer().getInventory(MapleInventoryType.ETC).getItem(slot);
        final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
        int qid = ii.questItemInfo(itemId).left;
        final MapleQuest quest = MapleQuest.getInstance(qid);

        if (quest != null && item != null && item.getQuantity() > 0) {

            final MapleQuestStatus stats = c.getPlayer().getQuestNoAdd(quest);
            if (stats != null && stats.getStatus() == 1) {
                if (stats.getCustomData()== null){
                    stats.setCustomData(String.valueOf(0));
                }
                int num = 100;
                stats.setCustomData(String.valueOf(Long.parseLong(stats.getCustomData()) + num));
                c.getPlayer().updateQuest(stats, true);
                MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.ETC, slot, (short) 1, false);
                c.announce(MaplePacketCreator.enableActions());
            }
        }
    }

    public static final void QuestItem(final LittleEndianAccessor slea, final MapleClient c) {
        final int qid = slea.readShort();
        final MapleQuest quest = MapleQuest.getInstance(qid);
        final MapleQuestStatus stats = c.getPlayer().getQuestNoAdd(quest);
        c.getPlayer().updateQuest(stats, true);
        c.announce(MaplePacketCreator.enableActions());
    }



搜索:


            if (attacker.getInventory(MapleInventoryType.EQUIPPED).findById(1122017) != null && attacker.getPendantExp() > 0 || attacker.getInventory(MapleInventoryType.EQUIPPED).findById(1122156) != null && attacker.getPendantExp() > 0) {
                Equipment_Bonus_EXP += (int) exp / 10 * attacker.getPendantExp();
            }
            attacker.getTrait(MapleTraitType.charisma).addExp(stats.getCharismaEXP(), attacker);
            attacker.gainExpMonster(exp, true, highestDamage, pty, Class_Bonus_EXP, Equipment_Bonus_EXP, Premium_Bonus_EXP, stats.isPartyBonus(), stats.getPartyBonusRate());
        }
        attacker.mobKilled(getId(), lastskillID);
    }


替換:


            if (attacker.getInventory(MapleInventoryType.EQUIPPED).findById(1122017) != null && attacker.getPendantExp() > 0 || attacker.getInventory(MapleInventoryType.EQUIPPED).findById(1122156) != null && attacker.getPendantExp() > 0) {
                Equipment_Bonus_EXP += (int) exp / 10 * attacker.getPendantExp();
            }
            if ((attacker.getQuestStatus(20522) == 1 || attacker.getQuestStatus(20526) == 1) && attacker.getQuestStatus(20514) == 1 && attacker.itemQuantity(4220137) > 0) {
                final int mobexp = Integer.parseInt(attacker.getQuestNAdd(MapleQuest.getInstance(20514)).getCustomData()) + exp;
                attacker.getQuestNAdd(MapleQuest.getInstance(20514)).setCustomData(mobexp + "");
                attacker.updateQuest(attacker.getQuestNAdd(MapleQuest.getInstance(20514)), true);
                exp = (int) (exp * 0.9);
            }
            if (attacker.getQuestStatus(23961) == 1 && attacker.getQuestStatus(23980) == 1 && attacker.itemQuantity(4220178) > 0) {
                final int mobexp = Integer.parseInt(attacker.getQuestNAdd(MapleQuest.getInstance(23980)).getCustomData()) + exp;
                attacker.getQuestNAdd(MapleQuest.getInstance(23980)).setCustomData(mobexp + "");
                attacker.updateQuest(attacker.getQuestNAdd(MapleQuest.getInstance(23980)), true);
                exp = (int) (exp * 0.9);
            }
            if (attacker.getQuestStatus(23968) == 1 && attacker.getQuestStatus(23981) == 1 && attacker.itemQuantity(4220179) > 0) {
                final int mobexp = Integer.parseInt(attacker.getQuestNAdd(MapleQuest.getInstance(23981)).getCustomData()) + exp;
                attacker.getQuestNAdd(MapleQuest.getInstance(23981)).setCustomData(mobexp + "");
                attacker.updateQuest(attacker.getQuestNAdd(MapleQuest.getInstance(23981)), true);
                exp = (int) (exp * 0.9);
            }
            attacker.getTrait(MapleTraitType.charisma).addExp(stats.getCharismaEXP(), attacker);
            attacker.gainExpMonster(exp, true, highestDamage, pty, Class_Bonus_EXP, Equipment_Bonus_EXP, Premium_Bonus_EXP, stats.isPartyBonus(), stats.getPartyBonusRate());
        }
        attacker.mobKilled(getId(), lastskillID);
    }


頁首添加:

import server.quest.MapleQuest;


腳本部分在開始任務的時候需要給予完成條件的開始項

/*
        名字:        作戰3階段:可愛的小鳥
        地圖:        遺忘的時間之路<1>
        描述:        220070000
*/

var status = -1;

function start(mode, type, selection) {
        switch (mode) {
        case -1:
                qm.dispose();
                return;
        case 0:
                if (status > 1) {
                qm.sendOk("哼……看來你好像不是很喜歡動物。這麼可愛的動物……我寧願不吃漢堡,也要給牠們吃。");
                qm.dispose();
                return;
                }
                status--;
                break;
        case 1:
                status++;
                break;
                }
        switch (status) {
        case 0:
                qm.sendNext("哇!這個喂過了,這個也喂過了,這個喂過了嗎?啊!第3個還沒喂過!來,快吃吧!唉~都張著嘴巴,我都不知道到底哪個肚子餓了……啊,你來啦?");
                break;
        case 1:
                qm.sendNextPrev("唉……太忙了。不久前我聽研究員們說,咕咕鐘是受到了拉圖斯的支配才會變成那樣的。只要好好馴養,牠們就會變成可愛又聽話的鳥。所以趁現在有空,我正在試著飼養牠們。");
                break;
        case 2:
                qm.sendYesNo("不過……一下子養了十隻,讓我覺得很累……食物也很難收集到……雖然我很喜歡牠們。你能幫我養一隻嗎?我送給你。");
                break;
        case 3:
                if (qm.getPlayer().getInventory(Packages.client.inventory.MapleInventoryType.ETC).getNumFreeSlot() < 1) {
                        qm.getClient().getSession().write(Packages.tools.packet.MaplePacketCreator.serverNotice(1, "其他道具視窗的欄位不足"));
                        qm.dispose();
                        return;
                        }
                        Packages.server.quest.MapleQuest.getInstance(3250).forceStart(qm.getPlayer(), qm.getNpc(), null);
                        Packages.server.quest.MapleQuest.getInstance(7067).forceStart(qm.getPlayer(), qm.getNpc(), 0);//給予讀取任務完成的條件
                        qm.gainItem(4220046, qm.getPlayer().itemQuantity(4220046) ? 0 : 1);
                        qm.dispose();
}
}

function end(mode, type, selection) {
        switch (mode) {
        case -1:
                qm.dispose();
                return;
        case 0:
                status--;
                break;
        case 1:
                status++;
                break;
                }
        switch (status) {
        case 0:
                qm.sendNext("小鳥這麼快就長大了,看來你有好好照顧牠哦。好了,小鳥交給我吧。");
                break;
        case 1:
                qm.sendPrev("牠們本來都不屬於這裡,我會將它們送回到原來的世界。辛苦你了。\r\n\r\n#fUI/UIWindow.img/QuestIcon/4/0# \r\n\r\n#fUI/UIWindow.img/QuestIcon/8/0# 100000 exp");
                break;
        case 2:
                Packages.server.quest.MapleQuest.getInstance(3250).forceComplete(qm.getPlayer(), qm.getNpc());
                qm.gainItem(4220046, -1);
                qm.gainExp(100000);
                qm.dispose();
}
}

空白的卷軸.rar (2.13 KB, 下載次數: 2049) 作戰3階段:可愛的小鳥.rar (1.24 KB, 下載次數: 1905)

飼養提提阿那.rar (1.32 KB, 下載次數: 2095) 重新飼養提提阿那.rar (1.42 KB, 下載次數: 2053)

我是沒有感情的玩偶.rar (1.19 KB, 下載次數: 2328) 莫斯卡丹的善意.rar (1.49 KB, 下載次數: 1947)



市面上能找到的資源,基本上都沒有修完整的任務,任務的流程也是楓之谷很重要的環節呢

瀏覽 3582 回復 4

您需要登錄後才可以回帖 登錄 | 註冊會員

返回頂部