Issue information

Issue ID
#4980
Status
Fixed
Severity
Low
Started
Hercules Elf Bot
Jun 26, 2011 13:01
Last Post
Hercules Elf Bot
Mar 19, 2012 19:25
Confirmation
N/A

Hercules Elf Bot - Jun 26, 2011 13:01

Originally posted by [b]Ind[/b]
http://www.eathena.ws/board/index.php?autocom=bugtracker&showbug=4980

CODE
for(i = 0; i < MAX_MOB_DROP; i++) {
        int rate = 0, rate_adjust, type;
        unsigned short ratemin, ratemax;
        struct item_data *id;
        k = 38+i*2;
        db->dropitem[i].nameid = atoi(str[k]);
        if (!db->dropitem[i].nameid) {
            db->dropitem[i].p = 0; //No drop.
            continue;
        }
        type = itemdb_type(db->dropitem[i].nameid);
        rate = atoi(str[k+1]);
        if( (class_ >= 1324 && class_ <= 1363) || (class_ >= 1938 && class_ <= 1946) )
        {    //Treasure box drop rates [Skotlex]
            rate_adjust = battle_config.item_rate_treasure;
            ratemin = battle_config.item_drop_treasure_min;
            ratemax = battle_config.item_drop_treasure_max;
        }
        else switch (type)
        { // Added suport to restrict normal drops of MVP's [Reddozen]
        case IT_HEALING:
            rate_adjust = (status->mode&MD_BOSS) ? battle_config.item_rate_heal_boss : battle_config.item_rate_heal;
            ratemin = battle_config.item_drop_heal_min;
            ratemax = battle_config.item_drop_heal_max;
            break;
        case IT_USABLE:
        case IT_CASH:
            rate_adjust = (status->mode&MD_BOSS) ? battle_config.item_rate_use_boss : battle_config.item_rate_use;
            ratemin = battle_config.item_drop_use_min;
            ratemax = battle_config.item_drop_use_max;
            break;
        case IT_WEAPON:
        case IT_ARMOR:
        case IT_PETARMOR:
            rate_adjust = (status->mode&MD_BOSS) ? battle_config.item_rate_equip_boss : battle_config.item_rate_equip;
            ratemin = battle_config.item_drop_equip_min;
            ratemax = battle_config.item_drop_equip_max;
            break;
        case IT_CARD:
            rate_adjust = (status->mode&MD_BOSS) ? battle_config.item_rate_card_boss : battle_config.item_rate_card;
            ratemin = battle_config.item_drop_card_min;
            ratemax = battle_config.item_drop_card_max;
            break;
        default:
            rate_adjust = (status->mode&MD_BOSS) ? battle_config.item_rate_common_boss : battle_config.item_rate_common;
            ratemin = battle_config.item_drop_common_min;
            ratemax = battle_config.item_drop_common_max;
            break;
        }
        db->dropitem[i].p = mob_drop_adjust(rate, rate_adjust, ratemin, ratemax);
        
        //calculate and store Max available drop chance of the item
        if( db->dropitem[i].p && (class_ < 1324 || class_ > 1363) && (class_ < 1938 || class_ > 1946) )
        { //Skip treasure chests.
            id = itemdb_search(db->dropitem[i].nameid);
            if (id->maxchance == -1 || (id->maxchance < db->dropitem[i].p) ) {
                id->maxchance = db->dropitem[i].p; //item has bigger drop chance or sold in shops
            }
            for (k = 0; k< MAX_SEARCH; k++) {
                if (id->mob[k].chance <= db->dropitem[i].p)
                    break;
            }
            if (k == MAX_SEARCH)
                continue;
            
            if (id->mob[k].id != class_)
                memmove(&id->mob[k+1], &id->mob[k], (MAX_SEARCH-k-1)*sizeof(id->mob[0]));
            id->mob[k].chance = db->dropitem[i].p;
            id->mob[k].id = class_;
        }
    }

note type is first loaded in itemdb_type (which is a shortcut for itemdb_search -> type), then later for the same item id it loops through item db again on id = itemdb_search(db->dropitem[i].nameid);
Imo moving the itemdb search to the top then making type = id->type; would work p:

Hercules Elf Bot - Dec 6, 2011 4:59

Originally posted by [b]Ind[/b]
Fixed in [r=15013]