longay

自定義轉蛋上綠廣之物品

發表於 2019-3-19 04:09:48
longay 發表於 2019-3-19 04:09:48 | 顯示全部樓層 |閱讀模式

本篇使用白狐113作為示範

鑒於看到版上另一篇文章
來實做一下

首先,轉蛋機給予物品使用的函式是
gainGachaponItem(int itemid, int quantity);
先來查詢此function實際做的內容是甚麼
對於NPC內使用的函式多位於 NPCConversationManager裡
進而搜尋之後可以看到
    public int gainGachaponItem(int id, int quantity) {
        return gainGachaponItem(id, quantity, c.getPlayer().getMap().getStreetName() + " - " + c.getPlayer().getMap().getMapName());
    }

    public int gainGachaponItem(int id, int quantity, final String msg) {
        try {
            if (!MapleItemInformationProvider.getInstance().itemExists(id)) {
                return -1;
            }
            final IItem item = MapleInventoryManipulator.addbyId_Gachapon(c, id, (short) quantity);

            if (item == null) {
                return -1;
            }
            final byte rareness = GameConstants.gachaponRareItem(item.getItemId());
            if (rareness > 0) {
                World.Broadcast.broadcastMessage(MaplePacketCreator.getGachaponMega("[" + msg + "] " + c.getPlayer().getName(), " : 從轉蛋機轉到了!", item, rareness,c.getChannel()-1).getBytes());
            }
            return item.getItemId();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1;
    }
複製代碼
在js裡呼叫的是
 public int gainGachaponItem(int id, int quantity) {
        return gainGachaponItem(id, quantity, c.getPlayer().getMap().getStreetName() + " - " + c.getPlayer().getMap().getMapName());
    }
複製代碼
然而他這邊又回傳一個同名稱的function
也就是下面的那串
利用簡單的英文可以辨別出上綠廣的條件,rareness
這邊他為了查詢輸入的物品id是否為rareness
呼叫了這個function
GameConstants.gachaponRareItem(item.getItemId());
複製代碼
透過滑鼠右鍵 navigate->go to declaretion 可以直接查看這個function的實作內容(此為相當實用的操作方法)
    public static byte gachaponRareItem(final int id) {
        switch (id) {
            case 2049100: // Chaos Scroll
            case 1102042: // Purple Adventurer Cape
                return 2;
            //1 = wedding msg o.o
        }
        return 0;
    }
複製代碼
很清楚的他直接透過switch 然後針對特定物品代碼return 2;

了解了背後在做甚麼後
這邊有兩個解決方案
一個是直接在他gachaponRareItem內添加你想要上廣的物品代碼
缺點是過於冗長,且後面的擴充刪減相當不便

因此接下來要實做的是能夠透過多一個boolean參數來決定是否為稀有物品(上廣)
有鑑於在原本的function直接添加新參數會導致其餘地方應用該function時少了新參數進而出錯
找到所有呼叫這個function的地方並做修改是有點不切實際而且耗費相當多時間的
所以選擇使用Overloaded function的原理來操作
這邊直接複製上方實際呼叫的 gainGachaponItem 在下方貼上
並修改為

註冊並回覆,就能免費看到這裡的內容(例如下載連結)

註冊會員

由於省去了上方的第一次回傳跟呼叫 缺少了msg 參數,我選擇直接刪除該參數並在原本使用的地方直接放入第一個函式的傳入值,之後添加新的參數boolean rare
然後修改上方判斷是否為稀有道具的判斷式,直接放入傳入的參數
至此大功告成
將來在js裡面應用時只需要用
gainGachaponItem(itemid, quantity, true);
複製代碼
即可讓該道具上廣。

有任何不夠清楚的地方歡迎討論
內容若有錯誤或者不夠乾淨,希望能夠指點,謝謝
內容歡迎轉載,轉載前請告知並附上原文
瀏覽 25703 回復 44

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

:謝大大教學 太感謝了唷 2026-01-03 16:52回復
:感谢分享 2025-09-26 00:54回復
:感謝分享~ 2025-09-12 11:06回復
:來了解學習看看 2025-07-07 13:06回復
:感謝大大的分享 2025-02-05 00:13回復
:777 2025-01-05 04:23回復
:來看看 謝謝 2025-01-04 14:32回復
:謝大大教學 2025-01-01 19:35回復
:趕緊看看 2024-12-11 22:18回復
:1111111111 2024-12-11 07:10回復
12345下一頁
返回頂部