How can I go about altering the mob_read_db_drops_sub routine so that it automatically removes the item line from mob_db.conf?
I am using an older version of Herc, and so it may be outdated, but the following is the routine found within my mob.c.
void mob_read_db_drops_sub(struct mob_db *entry, struct status_data *mstatus, int class_, config_setting_t *t)
{
config_setting_t *drop;
int i = 0;
int idx = 0;
int i32;
int k;
while (idx < MAX_MOB_DROP && (drop = libconfig->setting_get_elem(t, i))) {
const char *name = config_setting_name(drop);
int rate_adjust, type;
unsigned short ratemin, ratemax;
struct item_data* id = itemdb->search_name(name);
int value = 0;
if (!id)
{
ShowWarning("mob_read_db: drop item %s not found in monster %d\n", name, class_);
i ++;
continue;
}
if (mob->get_const(drop, &i32) && i32 >= 0) {
value = i32;
}
if (value <= 0)
{
ShowWarning("mob_read_db: wrong drop chance %d for drop item %s in monster %d\n", value, name, class_);
i ++;
continue;
}
entry->dropitem[idx].nameid = id->nameid;
if (!entry->dropitem[idx].nameid) {
entry->dropitem[idx].p = 0; //No drop.
i ++;
continue;
}
type = id->type;
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 support to restrict normal drops of MVP's [Reddozen]
case IT_HEALING:
rate_adjust = (mstatus->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 = (mstatus->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 = (mstatus->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 = (mstatus->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 = (mstatus->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;
}
mob->item_dropratio_adjust(id->nameid, class_, &rate_adjust);
entry->dropitem[idx].p = mob->drop_adjust(value, rate_adjust, ratemin, ratemax);
//calculate and store Max available drop chance of the item
if (entry->dropitem[idx].p && (class_ < 1324 || class_ > 1363) && (class_ < 1938 || class_ > 1946))
{ //Skip treasure chests.
if (id->maxchance == -1 || (id->maxchance < entry->dropitem[idx].p) ) {
id->maxchance = entry->dropitem[idx].p; //item has bigger drop chance or sold in shops
}
for (k = 0; k< MAX_SEARCH; k++) {
if (id->mob[k].chance <= entry->dropitem[idx].p)
break;
}
if (k == MAX_SEARCH)
{
i++;
idx++;
continue;
}
if (id->mob[k].id != class_ && k != MAX_SEARCH - 1)
memmove(&id->mob[k+1], &id->mob[k], (MAX_SEARCH-k-1)*sizeof(id->mob[0]));
id->mob[k].chance = entry->dropitem[idx].p;
id->mob[k].id = class_;
}
i++;
idx++;
}
if (idx == MAX_MOB_DROP && libconfig->setting_get_elem(t, i)) {
ShowWarning("mob_read_db: Too many drops in mob %d\n", class_);
}
}
To further elaborate upon my request. As is shown above, when the item listed under the mob does not exist in the item_db, the following occurs.
if (!id)
{
ShowWarning("mob_read_db: drop item %s not found in monster %d\n", name, class_);
i ++;
continue;
}
On top of the warning, how can I alter the code to automatically delete the non-existent item line from the mob inside the mob_db.conf and save the file?
So for instance, if the following was the original drops of the monster:
Drops: {
Wand: 100
Orange: 1000
Pecopeco_Card: 1
}
And the Orange does not exist within the item_db, the following change to mob_db.conf would result automatically:
Drops: {
Wand: 100
Pecopeco_Card: 1
}