Ver Fonte

- Fixed exp bonuses applying twice for the job-exp
- Magic damage adjustment per number of hits is now performed before mdef reductions.
- @reloadbattleconf will now also update the ragsrvinfo table on the char-server.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@8518 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex há 19 anos atrás
pai
commit
33cb9f7449
8 ficheiros alterados com 63 adições e 17 exclusões
  1. 5 0
      Changelog-Trunk.txt
  2. 41 1
      src/map/atcommand.c
  3. 4 4
      src/map/battle.c
  4. 1 1
      src/map/clif.c
  5. 6 5
      src/map/mob.c
  6. 3 3
      src/map/skill.c
  7. 2 2
      src/map/status.c
  8. 1 1
      src/map/status.h

+ 5 - 0
Changelog-Trunk.txt

@@ -4,6 +4,11 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2006/08/28
+	* Fixed exp bonuses applying twice for the job-exp [Skotlex]
+	* Magic damage adjustment per number of hits is now performed before mdef
+	  reductions. [Skotlex]
+	* @reloadbattleconf  will now also update the ragsrvinfo table on the
+	  char-server. [Skotlex]
 	* Reverted Mpeg's change of NJ_BUNSINJYUTSU SCB [Toms]
 	* Fixed homun hp/sp growth rates stacking with HP/SP passive increasing
 	  skills. [Skotlex]

+ 41 - 1
src/map/atcommand.c

@@ -5530,8 +5530,48 @@ atcommand_reloadbattleconf(
 	const int fd, struct map_session_data* sd,
 	const char* command, const char* message)
 {
+	struct Battle_Config prev_config;
+	memcpy(&prev_config, &battle_config, sizeof(prev_config));
+
 	battle_config_read(BATTLE_CONF_FILENAME);
-	mob_reload(); //Needed as well so rate changes take effect.
+
+	if (memcmp(&prev_config.item_rate_mvp,
+		&battle_config.item_rate_mvp,
+		sizeof(battle_config.item_rate_mvp)+
+		sizeof(battle_config.item_rate_common)+
+		sizeof(battle_config.item_rate_common_boss)+
+		sizeof(battle_config.item_rate_card)+
+		sizeof(battle_config.item_rate_card_boss)+
+		sizeof(battle_config.item_rate_equip)+
+		sizeof(battle_config.item_rate_equip_boss)+
+		sizeof(battle_config.item_rate_heal)+
+		sizeof(battle_config.item_rate_heal_boss)+
+		sizeof(battle_config.item_rate_use)+
+		sizeof(battle_config.item_rate_use_boss)+
+		sizeof(battle_config.item_rate_treasure)+
+		sizeof(battle_config.item_rate_adddrop)+
+		sizeof(battle_config.logarithmic_drops)+
+		sizeof(battle_config.item_drop_common_min)+
+		sizeof(battle_config.item_drop_common_max)+
+		sizeof(battle_config.item_drop_card_min)+
+		sizeof(battle_config.item_drop_card_max)+
+		sizeof(battle_config.item_drop_equip_min)+
+		sizeof(battle_config.item_drop_equip_max)+
+		sizeof(battle_config.item_drop_mvp_min)+
+		sizeof(battle_config.item_drop_mvp_max)+
+		sizeof(battle_config.item_drop_heal_min)+
+		sizeof(battle_config.item_drop_heal_max)+
+		sizeof(battle_config.item_drop_use_min)+
+		sizeof(battle_config.item_drop_use_max)+
+		sizeof(battle_config.item_drop_treasure_min)+
+		sizeof(battle_config.item_drop_treasure_max)
+	) != 0)
+  	{	//Drop rates changed.
+		mob_reload(); //Needed as well so rate changes take effect.
+#ifndef TXT_ONLY
+		chrif_ragsrvinfo(battle_config.base_exp_rate, battle_config.job_exp_rate, battle_config.item_rate_common);
+#endif
+	}
 	clif_displaymessage(fd, msg_txt(255));
 	return 0;
 }

+ 4 - 4
src/map/battle.c

@@ -2365,6 +2365,8 @@ struct Damage battle_calc_magic_attack(
 					MATK_ADD(50);
 			}
 		}
+		//Adjust damage per number of hits.
+		damage_div_fix(ad.damage, ad.div_);
 
 		if(sd) {
 			//Ignore Defense?
@@ -2449,9 +2451,8 @@ struct Damage battle_calc_magic_attack(
 
 			MATK_RATE(cardfix);
 		}
-	}
-
-	damage_div_fix(ad.damage, ad.div_);
+	} else //Correct number of hits anyway.
+		damage_div_fix(ad.damage, ad.div_);
 	
 	if (flag.infdef && ad.damage)
 		ad.damage = ad.damage>0?1:-1;
@@ -3746,7 +3747,6 @@ static const struct battle_data_short {
 	{ "duel_autoleave_when_die",			&battle_config.duel_autoleave_when_die}, //[LuzZza]
 	{ "duel_time_interval",					&battle_config.duel_time_interval}, // [LuzZza]
 	{ "duel_only_on_same_map",				&battle_config.duel_only_on_same_map}, // [Toms]
-
 	{ "skip_teleport_lv1_menu",			&battle_config.skip_teleport_lv1_menu}, // [LuzZza]
 	{ "allow_skill_without_day",			&battle_config.allow_skill_without_day}, // [Komurka]
 	{ "allow_es_magic_player",				&battle_config.allow_es_magic_pc },

+ 1 - 1
src/map/clif.c

@@ -9431,7 +9431,7 @@ void clif_parse_NpcBuyListSend(int fd,struct map_session_data *sd)
 
 	if (sd->state.trading|| !sd->npc_shopid)
 		fail = 1;
-	else{
+	else {
 		if((nd = ((struct npc_data *)map_id2bl(sd->npc_shopid))->master_nd)){
 			int regkey = add_str("@bought_nameid");
 			int regkey2 = add_str("@bought_quantity");

+ 6 - 5
src/map/mob.c

@@ -1781,6 +1781,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
 		int flag=1,zeny=0;
 		unsigned int base_exp,job_exp;
 		double per; //Your share of the mob's exp
+		double jper; //For the job-exp
 		int bonus; //Bonus on top of your share.
 		
 		if (status_isdead(tmpbl[i]) || tmpbl[i]->m != md->bl.m)
@@ -1814,11 +1815,11 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
 			zeny=(int) ((md->level+rand()%md->level)*per*bonus/100.);
 			if(md->db->mexp > 0)
 				zeny*=rand()%250;
-		}
+		
+		jper = per;
 
 		if (map[md->bl.m].flag.nobaseexp)
 			base_exp=0; 
-		else {
 			temp = bonus; //Do not alter bonus for the jExp section below.
 			if (map[md->bl.m].bexp != 100)
 				temp = map[md->bl.m].bexp*temp/100;
@@ -1842,14 +1843,14 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
 			if (map[md->bl.m].jexp != 100)
 				bonus = map[md->bl.m].jexp*bonus/100;
 			if (bonus != 100)
-				per = per*bonus/100.;
+				jper = jper*bonus/100.;
 	
 			job_exp = md->db->job_exp;
 			
-			if (job_exp*per > UINT_MAX)
+			if (job_exp*jper > UINT_MAX)
 				job_exp = UINT_MAX;
 			else
-				job_exp = (unsigned int)(job_exp*per);
+				job_exp = (unsigned int)(job_exp*jper);
 			
 			if (job_exp < 1)
 				job_exp = 1;

+ 3 - 3
src/map/skill.c

@@ -5605,7 +5605,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
 	nullpo_retr(0, ud);
 
 	BL_CAST( BL_PC,  src, sd);
-	BL_CAST( BL_HOM,  src, hd);	//[orn]
+	BL_CAST( BL_HOM, src, hd);	//[orn]
 	BL_CAST( BL_MOB, src, md);
 
 	if( src->prev == NULL ) {
@@ -5819,7 +5819,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
 	nullpo_retr(0, ud);
 
 	BL_CAST( BL_PC , src, sd);
-	BL_CAST( BL_HOM , src, hd);	//[orn]
+	BL_CAST( BL_HOM, src, hd);	//[orn]
 	BL_CAST( BL_MOB, src, md);
 
 	if( src->prev == NULL ) {
@@ -10069,7 +10069,7 @@ int skill_unit_timer_sub (struct block_list *bl, va_list ap)
 		if (--group->val1 <= 0)
 	  	{	//All tiles were processed, disable skill.
 			group->target_flag=BCT_NOONE;
-			group->bl_flag= 0;
+			group->bl_flag= BL_NUL;
 		}
 	}
 

+ 2 - 2
src/map/status.c

@@ -355,7 +355,7 @@ void initChangeTables(void) {
 	set_sc(KN_ONEHAND, SC_ONEHAND, SI_ONEHAND, SCB_ASPD);
 	set_sc(GS_FLING, SC_FLING, SI_BLANK, SCB_DEF|SCB_DEF2);
 	add_sc(GS_CRACKER, SC_STUN);
-	set_sc(GS_DISARM, SC_STRIPWEAPON, SI_STRIPWEAPON, SCB_WATK);
+	add_sc(GS_DISARM, SC_STRIPWEAPON);
 	add_sc(GS_PIERCINGSHOT, SC_BLEEDING);
 	set_sc(GS_MADNESSCANCEL, SC_MADNESSCANCEL, SI_MADNESSCANCEL, SCB_BATK|SCB_ASPD);
 	set_sc(GS_ADJUSTMENT, SC_ADJUSTMENT, SI_ADJUSTMENT, SCB_HIT|SCB_FLEE);
@@ -4766,7 +4766,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 			case SC_ATKPOTION:
 			case SC_MATKPOTION:
 			case SC_JAILED:
-			case SC_ARMOR_ELEMENT: // Just delete the current one
+			case SC_ARMOR_ELEMENT:
 				break;
 			case SC_GOSPEL:
 				 //Must not override a casting gospel char.

+ 1 - 1
src/map/status.h

@@ -521,8 +521,8 @@ enum {
 #define SCB_SIZE	0x04000000
 #define SCB_RACE	0x08000000
 #define SCB_RANGE	0x10000000
-//SCB_DYE means the sc should force cloth-dye change to 0 to avoid client crashes.
 #define SCB_REGEN	0x20000000
+//SCB_DYE means the sc should force cloth-dye change to 0 to avoid client crashes.
 #define SCB_DYE	0x40000000
 #define SCB_PC		0x80000000
 #define SCB_ALL	0x3FFFFFFF