| 
 
					
UID59213閱讀權限10主題1帖子4精華0A幣0 在線時間16 小時最後登錄2024-6-25 
 
集團新軍 
 
	主題1帖子4精華0綜合社群主題發文量3 電玩社群主題發文量0 娛樂社群主題發文量0 技術社群主題發文量0 閱讀權限10註冊時間2019-3-11 
 	
 TA的每日心情|  | 衰 2020-10-29 00:01
 | 
|---|
 簽到天數: 33 天 連續簽到: 0 天 [LV.5]常住居民I | 
 
| 本帖最後由 longay 於 2019-3-19 11:31 編輯 
 
 本篇使用白狐113作為示範
 
 鑒於看到版上另一篇文章
 來實做一下
 
 首先,轉蛋機給予物品使用的函式是
 gainGachaponItem(int itemid, int quantity);
 先來查詢此function實際做的內容是甚麼
 對於NPC內使用的函式多位於 NPCConversationManager裡
 進而搜尋之後可以看到
 在js裡呼叫的是複製代碼    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;
    }
然而他這邊又回傳一個同名稱的function複製代碼 public int gainGachaponItem(int id, int quantity) {
        return gainGachaponItem(id, quantity, c.getPlayer().getMap().getStreetName() + " - " + c.getPlayer().getMap().getMapName());
    }
也就是下面的那串
 利用簡單的英文可以辨別出上綠廣的條件,rareness
 這邊他為了查詢輸入的物品id是否為rareness
 呼叫了這個function
 透過滑鼠右鍵 navigate->go to declaretion 可以直接查看這個function的實作內容(此為相當實用的操作方法)複製代碼GameConstants.gachaponRareItem(item.getItemId());
很清楚的他直接透過switch 然後針對特定物品代碼return 2;複製代碼    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;
    }
 了解了背後在做甚麼後
 這邊有兩個解決方案
 一個是直接在他gachaponRareItem內添加你想要上廣的物品代碼
 缺點是過於冗長,且後面的擴充刪減相當不便
 
 因此接下來要實做的是能夠透過多一個boolean參數來決定是否為稀有物品(上廣)
 有鑑於在原本的function直接添加新參數會導致其餘地方應用該function時少了新參數進而出錯
 找到所有呼叫這個function的地方並做修改是有點不切實際而且耗費相當多時間的
 所以選擇使用Overloaded function的原理來操作
 這邊直接複製上方實際呼叫的 gainGachaponItem 在下方貼上
 並修改為由於省去了上方的第一次回傳跟呼叫 缺少了msg 參數,我選擇直接刪除該參數並在原本使用的地方直接放入第一個函式的傳入值,之後添加新的參數boolean rare
 然後修改上方判斷是否為稀有道具的判斷式,直接放入傳入的參數
 至此大功告成
 將來在js裡面應用時只需要用
 即可讓該道具上廣。複製代碼gainGachaponItem(itemid, quantity, true);
 有任何不夠清楚的地方歡迎討論
 內容若有錯誤或者不夠乾淨,希望能夠指點,謝謝
 內容歡迎轉載,轉載前請告知並附上原文
 
 | 
 |