diff options
-rw-r--r-- | src/map/mob.c | 89 |
1 files changed, 52 insertions, 37 deletions
diff --git a/src/map/mob.c b/src/map/mob.c index ca4da158b..c7918ce93 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -2467,8 +2467,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) add_timer(tick + (!battle_config.delay_battle_damage?500:0), mob_delay_item_drop, 0, (intptr_t)dlist); } - if(mvp_sd && md->db->mexp > 0 && !md->special_state.ai) - { + if(mvp_sd && md->db->mexp > 0 && !md->special_state.ai) { int log_mvp[2] = {0}; unsigned int mexp; struct item item; @@ -2489,46 +2488,62 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) clif_mvp_exp(mvp_sd,mexp); pc_gainexp(mvp_sd, &md->bl, mexp,0, false); log_mvp[1] = mexp; - if(map[m].flag.nomvploot || type&1) - ; //No drops. - else - for(i = 0; i < MAX_MVP_DROP; i++) - { - if(md->db->mvpitem[i].nameid <= 0) - continue; - if(!itemdb_exists(md->db->mvpitem[i].nameid)) - continue; + + if( !(map[m].flag.nomvploot || type&1) ) { + /* pose them randomly in the list -- so on 100% drop servers it wont always drop the same item */ + int mdrop_id[MAX_MVP_DROP]; + int mdrop_p[MAX_MVP_DROP]; - temp = md->db->mvpitem[i].p; - if(temp <= 0 && !battle_config.drop_rate0item) - temp = 1; - if(temp <= rnd()%10000+1) //if ==0, then it doesn't drop - continue; - - memset(&item,0,sizeof(item)); - item.nameid=md->db->mvpitem[i].nameid; - item.identify= itemdb_isidentified(item.nameid); - clif_mvp_item(mvp_sd,item.nameid); - log_mvp[0] = item.nameid; + memset(&mdrop_id,0,MAX_MVP_DROP*sizeof(int)); - //A Rare MVP Drop Global Announce by Lupus - if(temp<=battle_config.rare_drop_announce) { - struct item_data *i_data; - char message[128]; - i_data = itemdb_exists(item.nameid); - sprintf (message, msg_txt(541), mvp_sd->status.name, md->name, i_data->jname, temp/100.); - //MSG: "'%s' won %s's %s (chance: %0.02f%%)" - intif_broadcast(message,strlen(message)+1,0); + for(i = 0; i < MAX_MVP_DROP; i++) { + while( 1 ) { + int va = rand()%MAX_MVP_DROP; + if( !mdrop_id[va] || !md->db->mvpitem[i].nameid ) { + mdrop_id[va] = md->db->mvpitem[i].nameid; + mdrop_p[va] = md->db->mvpitem[i].p; + break; + } + } } + + for(i = 0; i < MAX_MVP_DROP; i++) { + if(mdrop_id[i] <= 0) + continue; + if(!itemdb_exists(mdrop_id[i])) + continue; + + temp = mdrop_p[i]; + if(temp <= 0 && !battle_config.drop_rate0item) + temp = 1; + if(temp <= rnd()%10000+1) //if ==0, then it doesn't drop + continue; - if((temp = pc_additem(mvp_sd,&item,1,LOG_TYPE_PICKDROP_PLAYER)) != 0) { - clif_additem(mvp_sd,0,0,temp); - map_addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd->status.char_id,(second_sd?second_sd->status.char_id:0),(third_sd?third_sd->status.char_id:0),1); + memset(&item,0,sizeof(item)); + item.nameid=mdrop_id[i]; + item.identify= itemdb_isidentified(item.nameid); + clif_mvp_item(mvp_sd,item.nameid); + log_mvp[0] = item.nameid; + + //A Rare MVP Drop Global Announce by Lupus + if(temp<=battle_config.rare_drop_announce) { + struct item_data *i_data; + char message[128]; + i_data = itemdb_exists(item.nameid); + sprintf (message, msg_txt(541), mvp_sd->status.name, md->name, i_data->jname, temp/100.); + //MSG: "'%s' won %s's %s (chance: %0.02f%%)" + intif_broadcast(message,strlen(message)+1,0); + } + + if((temp = pc_additem(mvp_sd,&item,1,LOG_TYPE_PICKDROP_PLAYER)) != 0) { + clif_additem(mvp_sd,0,0,temp); + map_addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd->status.char_id,(second_sd?second_sd->status.char_id:0),(third_sd?third_sd->status.char_id:0),1); + } + + //Logs items, MVP prizes [Lupus] + log_pick_mob(md, LOG_TYPE_MVP, -1, &item); + break; } - - //Logs items, MVP prizes [Lupus] - log_pick_mob(md, LOG_TYPE_MVP, -1, &item); - break; } log_mvpdrop(mvp_sd, md->class_, log_mvp); |