微信扫一扫 分享朋友圈

已有 1021 人浏览分享

[服務器教學] 任務道具簡單修正

[複製鏈接]

初窺門道

Rank: 2

230

威望

732

金錢

338

A幣
主題
32
帖子
64
精華
1
綜合社群主題發文量
0
電玩社群主題發文量
0
娛樂社群主題發文量
0
技術社群主題發文量
32
閱讀權限
20
註冊時間
2021-11-15
  • TA的每日心情
    奮鬥
    2024-1-28 13:17
  • 簽到天數: 1 天

    連續簽到: 1 天

    [LV.1]初來乍到

    chenhui540 發表於  2023-12-26 10:10:06 | 顯示全部樓層 | 閱讀模式
    本帖最後由 chenhui540 於 2023-12-26 10:40 編輯

    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, 下載次數: 881)

    異軍突起

    Rank: 4

    677

    威望

    1760

    金錢

    57

    A幣
    主題
    12
    帖子
    133
    精華
    0
    綜合社群主題發文量
    0
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    11
    閱讀權限
    50
    註冊時間
    2022-10-9
  • TA的每日心情
    難過
    2022-10-29 13:56
  • 簽到天數: 2 天

    連續簽到: 1 天

    [LV.1]初來乍到

    cia47 發表於 2023-12-26 14:53:20 | 顯示全部樓層
    原來孵蛋任務那麼複雜牽扯那麼多東西,難怪怎麼改scripts\quest也沒辦法長大(很久沒玩正服忘了怎麼養想說能出蛋和UI以為問題是養的方式或scripts\quest的js出問題)

    集團新軍

    Rank: 1

    61

    威望

    143

    金錢

    0

    A幣
    主題
    0
    帖子
    16
    精華
    0
    綜合社群主題發文量
    0
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    0
    閱讀權限
    10
    註冊時間
    2023-4-11

    該用戶從未簽到

    A_Bodhi 發表於 2023-12-27 09:14:49 | 顯示全部樓層
    谢谢大佬整理分享

    集團新軍

    Rank: 1

    123

    威望

    291

    金錢

    0

    A幣
    主題
    0
    帖子
    35
    精華
    0
    綜合社群主題發文量
    0
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    0
    閱讀權限
    10
    註冊時間
    2021-8-6
  • TA的每日心情

    2021-8-18 09:47
  • 簽到天數: 2 天

    連續簽到: 1 天

    [LV.1]初來乍到

    幼幼 發表於 2023-12-30 18:37:25 | 顯示全部樓層
    大大發的文章都蠻不錯的,很有幫助,
    您需要登錄後才可以回帖 登錄 | 註冊會員

    本版積分規則

    64

    發文

    732

    金錢

    338

    A幣

    ----------榮譽勳章----------

    熱門推薦
    圖文推薦
    • 聯繫我們

    小黑屋|AICL社群娛樂集團

    GMT+8, 2024-11-24 11:00 , 網路刷新 0.117124 秒 .

    歡迎來到 AICL網路社群

    版權AICL社群所有 2011-2021.

    Total:123 Today:213 Online:322