소스 검색

Fixed bugreport:6544 when mvp drops are at 100% drop rate it'll no longer always drop the first.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16804 54d463be-8e91-2dee-dedb-b68131a5f0ec
shennetsind 12 년 전
부모
커밋
7471433a27
1개의 변경된 파일52개의 추가작업 그리고 37개의 파일을 삭제
  1. 52 37
      src/map/mob.c

+ 52 - 37
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);