Source Development Mob DropInfo With Scroll

JamePOWER1

Active Pirate
Registered
LV
0
 
Joined
May 2, 2026
Messages
29
Reaction score
5
Points
23
Age
32
Location
Seattle
The default Mob DropInfo window lacked a scrollbar feature. With 15 possible drop slots, any extra items would overflow and render outside the window bounds.
I'm still tinkering with this, so I'll be sharing more updates here as I go.

~/Client/script/lua/forms/player.clu
search for this inside frmMonsterInfo:
Code:
-- Close Button
btnClose = UI_CreateCompent..

Add this right below:
JavaScript:
-- Drop ListView w Scroll
listMobDrops = UI_CreateListView(frmMonsterInfo, "listMobDrops", 160, 400, 16, 51, 2, 2)
UI_SetPos(listMobDrops, 16, 51)
UI_SetSize(listMobDrops, 160, 400)
UI_SetListRowHeight(listMobDrops, 40)
UI_SetMargin(listMobDrops, 10, 0, 6, 0)
UI_ListSetItemMargin(listMobDrops, 0, 6)
UI_ListViewSetTitle(listMobDrops, 0, 40, "", 0, 0, 0, 0)
UI_ListViewSetTitle(listMobDrops, 1, 100, "", 0, 0, 0, 0)
UI_SetListIsMouseFollow(listMobDrops, TRUE)

-- Scroll bar
scrollid = UI_GetScroll(listMobDrops)
UI_SetSize(scrollid, 11, 1)
UI_LoadImage(scrollid, "texture/ui/PublicC.tga", COMPENT_BACK, 11, 1, 194, 13)

id = UI_GetScrollObj(scrollid, SCROLL_UP)
UI_LoadButtonImage(id, "texture/ui/PublicC.tga", 11, 9, 166, 0, TRUE)
UI_SetSize(id, 11, 9)

id = UI_GetScrollObj(scrollid, SCROLL_SCROLL)
UI_LoadImage(id, "texture/ui/PublicC.tga", COMPENT_BACK, 11, 43, 166, 10)
UI_SetSize(id, 11, 43)

id = UI_GetScrollObj(scrollid, SCROLL_DOWN)
UI_LoadButtonImage(id, "texture/ui/PublicC.tga", 11, 9, 166, 0, TRUE)
UI_SetSize(id, 11, 9)

search for this: (and disable or remove it.)
Code:
--for i = 0, 14 do
--    listMobDrops = UI_CreateCompent(frmMonsterInfo, COMMAND_ONE_TYPE, "listMobDrops"..i, 170, 37, 25, 56 + (i * 40))
--    UI_SetIsDrag(listMobDrops, TRUE)
--
--    LabMobItems = UI_CreateCompent(frmMonsterInfo, LABELEX_TYPE, "LabMobItems"..i, 85, 9, 64, 60 + (i * 40))
--    UI_SetTextColor(LabMobItems, COLOR_BLACK)
--    UI_SetLabelExFont(LabMobItems, DEFAULT_FONT, TRUE, COLOR_WHITE)
--
--    LabMobRates = UI_CreateCompent(frmMonsterInfo, LABELEX_TYPE, "LabMobRates"..i, 85, 9, 64, 74 + (i * 40))
--    UI_SetTextColor(LabMobRates, COLOR_BLACK)
--    UI_SetLabelExFont(LabMobRates, DEFAULT_FONT, TRUE, COLOR_WHITE)
--  
--    checkDropFilter = UI_CreateCompent(frmMonsterInfo, CHECK_TYPE, "checkDropFilter"..i, 10, 10,  160, 68 + (i * 40))
--    UI_LoadImage(checkDropFilter, "texture/ui/corsairs/frmMonsterInfo.png", UNCHECKED, 10, 10, 412, 473)
--    UI_LoadImage(checkDropFilter, "texture/ui/corsairs/frmMonsterInfo.png", CHECKED, 10, 10, 393, 473)
--end

on ~/UIStartForm.h
add this on top:
C++:
#include "UIListView.h"

find and disable:
C++:
COneCommand* listMobDrops[15];
CLabelEx* LabMobItems[15];
CLabelEx* LabMobRates[15];
CCheckBox* checkDropFilter[15];

Replace with this
C++:
CListView* listMobDrops;

on ~/UIStartForm.cpp
find: void CStartMgr::CleanDropListForm()
C++:
void CStartMgr::CleanDropListForm()
{
    for (int i = 0; i < defCHA_INIT_ITEM_NUM - 1; i++) {
        if (listMobDrops[i]) {
            listMobDrops[i]->DelCommand();
        }
        if (LabMobItems[i]) {
            LabMobItems[i]->SetCaption("");
            LabMobItems[i]->SetHint("");
        }
        if (LabMobRates[i]) LabMobRates[i]->SetCaption("");
        if (checkDropFilter[i]) checkDropFilter[i]->SetIsShow(false);
    }
}

Reemplace with this
C++:
void CStartMgr::CleanDropListForm()
{
    if (listMobDrops) {
        listMobDrops->GetList()->Clear();
    }
}

Find: void CStartMgr::SetMonsterInfo()
C++:
for (int i = 0; i < max; i++) {
    CItemRecord* rInfo = GetItemRecordInfo(vect[i][0]);
    if (!rInfo)
        continue;

    CItemCommand* rItem = new CItemCommand(rInfo);
    if (!rItem)
        continue;  

    listMobDrops[i]->AddCommand(rItem);
    listMobDrops[i]->SetIsEnabled(false);

    const char* item_name = rInfo->szName;
    char get_name[128] = {0};
    sprintf(get_name, "%s", StringLimit(item_name, 16).c_str());
    LabMobItems[i]->SetCaption(get_name);

    float calcuDrop = (10000 / float(vect[i][1])) * g_DropBonus;
    if (calcuDrop > 100) {
        calcuDrop = 100;
    }

    char item_rate[25];
    sprintf(item_rate, "%0.2f%%", calcuDrop);
    LabMobRates[i]->SetCaption(item_rate);
   
    if (!rInfo)
        return;

    if (checkDropFilter[i]) {
        checkDropFilter[i]->nTag = rInfo->lID;
        checkDropFilter[i]->SetIsShow(true);
        checkDropFilter[i]->SetIsChecked(!g_lootFilter->HasFilteredItem(rInfo->lID));
    }
}

Reemplace with this
C++:
listMobDrops->GetList()->Clear();

for (int i = 0; i < max; i++) {
    CItemRecord* rInfo = GetItemRecordInfo(vect[i][0]);
    if (!rInfo) continue;

    float calcuDrop = (10000 / float(vect[i][1])) * g_DropBonus;
    if (calcuDrop > 100) calcuDrop = 100;
    char item_rate[32] = { 0 };
    sprintf(item_rate, "%0.2f%%", calcuDrop);

    CItemRow* pRow = listMobDrops->AddItemRow();
    if (!pRow) continue;

    CItemCommand* rItem = new CItemCommand(rInfo);
    rItem->SetIsSolid(true);
    rItem->SetIsValid(true);
    pRow->SetIndex(0, rItem);
    listMobDrops->pItem[i] = rItem;

    char line[160] = { 0 };
    sprintf(line, "%s\n%s", StringLimit(rInfo->szName, 16).c_str(), item_rate);
    CItemEx* pText = new CItemEx(line, COLOR_BLACK);
    pRow->SetIndex(1, pText);
}

listMobDrops->Refresh();

Find: bool CStartMgr::Init()
C++:
for (int i = 0; i < defCHA_INIT_ITEM_NUM - 1; i++) {
    char buf_list[25] = {0};
    sprintf(buf_list, "listMobDrops%d", i);
    listMobDrops[i] = dynamic_cast<COneCommand*>(frmMonsterInfo->Find(buf_list));
    if (!listMobDrops[i]) return false;

    char buf_name[25] = {0};
    sprintf(buf_name, "LabMobItems%d", i);
    LabMobItems[i] = dynamic_cast<CLabelEx*>(frmMonsterInfo->Find(buf_name));
    if (!LabMobItems[i]) return false;

    char buf_rate[25] = {0};
    sprintf(buf_rate, "LabMobRates%d", i);
    LabMobRates[i] = dynamic_cast<CLabelEx*>(frmMonsterInfo->Find(buf_rate));
    if (!LabMobRates[i]) return false;

    char buf_filter[25] = {0};
    sprintf(buf_filter, "checkDropFilter%d", i);
    checkDropFilter[i] = static_cast<CCheckBox*>(frmMonsterInfo->Find(buf_filter));
    if (checkDropFilter[i]) {
        checkDropFilter[i]->evtCheckChange = _evtCheckLootFilter;
    }
    if (!checkDropFilter[i]) return false;
}

Reemplace with this
C++:
listMobDrops = dynamic_cast<CListView*>(frmMonsterInfo->Find("listMobDrops"));
if (!listMobDrops) return false;

listMobDrops->GetList()->SetIsChangeColor(false);
listMobDrops->_IsShowHint = true;

Hovering over an item shows the preview just like any other screen in the client.
 

Attachments

  • Before.webp
    Before.webp
    24.7 KB · Views: 14
  • After.webp
    After.webp
    16.7 KB · Views: 14
  • BlueSquidCool
  • Like
Reactions: zLuke and Zakernado