Prechádzať zdrojové kódy

- Changed a bit the dnsbl lookup in the login servers to make it faster.
- Moved the pc rate modifiers from items (hp/sp/matk/hit/flee/cri/flee2/def2/mdef2/def/def2/speed) from status_calc_bl_sub_pc to status_calc_pc, as it simplifies code vastly, and also fixes Osiris card not applying to said bonuses.
- Fixed pc_damage_delay_rate not working, thanks to Orn.


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

skotlex 18 rokov pred
rodič
commit
66869ed12a
4 zmenil súbory, kde vykonal 119 pridanie a 108 odobranie
  1. 7 0
      Changelog-Trunk.txt
  2. 7 2
      src/login/login.c
  3. 7 2
      src/login_sql/login.c
  4. 98 104
      src/map/status.c

+ 7 - 0
Changelog-Trunk.txt

@@ -4,6 +4,13 @@ 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/09/13
+	* Changed a bit the dnsbl lookup in the login servers to make it faster.
+	  [Skotlex]
+	* Moved the pc rate modifiers from items
+	  (hp/sp/matk/hit/flee/cri/flee2/def2/mdef2/def/def2/speed) from
+	  status_calc_bl_sub_pc to status_calc_pc, as it simplifies code vastly, and
+	  also fixes Osiris card not applying to said bonuses. [Skotlex]
+	* Fixed pc_damage_delay_rate not working, thanks to Orn. [Skotlex]
 	* Modified the nocommand mapflag so you can specify the GM range that is
 	  blocked from using commands (eg: "prontera.gat mapflag nocommand 40"
 	  disables commands to characters in the GM range 0~39) [Skotlex]

+ 7 - 2
src/login/login.c

@@ -11,6 +11,7 @@
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <netdb.h>
 #endif
 #include <stdio.h>
 #include <stdlib.h>
@@ -1163,14 +1164,18 @@ int mmo_auth(struct mmo_account* account, int fd) {
 
 		dnsbl_serv=strtok(dnsbl_servs,",");
 		sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
-		if(resolve_hostbyname(ip_dnsbl,NULL,NULL)) {
+// Using directly gethostbyname should be quicker. [Skotlex]
+//		if(resolve_hostbyname(ip_dnsbl, NULL, NULL)) {
+		if(gethostbyname(ip_dnsbl)) {
 			ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
 			return 3;
 		}
 
 		while((dnsbl_serv=strtok(dnsbl_servs,","))) {
 			sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
-			if(resolve_hostbyname(ip_dnsbl,NULL,NULL)!=0) {
+// Using directly gethostbyname should be quicker. [Skotlex]
+//			if(resolve_hostbyname(ip_dnsbl,NULL,NULL)!=0) {
+			if(gethostbyname(ip_dnsbl)) {
 				ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
 				return 3;
 			}

+ 7 - 2
src/login_sql/login.c

@@ -14,6 +14,7 @@
 #include <sys/socket.h>
 #include <netinet/in.h> 
 #include <arpa/inet.h>
+#include <netdb.h>
 #endif
 #endif
 
@@ -589,14 +590,18 @@ int mmo_auth( struct mmo_account* account , int fd){
 
 		dnsbl_serv=strtok(dnsbl_servs,",");
 		sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
-		if(resolve_hostbyname(ip_dnsbl, NULL, NULL)) {
+// Using directly gethostbyname should be quicker. [Skotlex]
+//		if(resolve_hostbyname(ip_dnsbl, NULL, NULL)) {
+		if(gethostbyname(ip_dnsbl)) {
 			ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
 			return 3;
 		}
 
 		while((dnsbl_serv=strtok(dnsbl_servs,","))!=NULL) {
 			sprintf(ip_dnsbl,"%s.%s",r_ip,dnsbl_serv);
-			if(resolve_hostbyname(ip_dnsbl, NULL, NULL)) {
+// Using directly gethostbyname should be quicker. [Skotlex]
+//			if(resolve_hostbyname(ip_dnsbl, NULL, NULL)) {
+			if(gethostbyname(ip_dnsbl)) {
 				ShowInfo("DNSBL: (%s) Blacklisted. User Kicked.\n",ip);
 				return 3;
 			}

+ 98 - 104
src/map/status.c

@@ -1956,6 +1956,19 @@ int status_calc_pc(struct map_session_data* sd,int first)
 	if((skill=pc_checkskill(sd,CR_TRUST))>0)
 		status->max_hp += skill*200;
 
+	// Apply relative modifiers from equipment
+	if(sd->hprate < 0)
+		sd->hprate = 0;
+	if(sd->hprate!=100)
+		status->max_hp = status->max_hp * sd->hprate/100;
+	if(battle_config.hp_rate != 100)
+		status->max_hp = status->max_hp * battle_config.hp_rate/100;
+
+	if(status->max_hp > (unsigned int)battle_config.max_hp)
+		status->max_hp = battle_config.max_hp;
+	else if(!status->max_hp)
+		status->max_hp = 1;
+	
 // ----- SP MAX CALCULATION -----
 
 	// Basic MaxSP value
@@ -1965,9 +1978,23 @@ int status_calc_pc(struct map_session_data* sd,int first)
 	// Absolute modifiers from passive skills
 	if((skill=pc_checkskill(sd,SL_KAINA))>0)
 		status->max_sp += 30*skill;
+	if((skill=pc_checkskill(sd,HP_MEDITATIO))>0)
+		status->max_sp += status->max_sp * skill/100;
+	if((skill=pc_checkskill(sd,HW_SOULDRAIN))>0)
+		status->max_sp += status->max_sp * 2*skill/100;
 
-	if(status->sp>status->max_sp)
-		status->sp=status->max_sp;
+	// Apply relative modifiers from equipment
+	if(sd->sprate < 0)
+		sd->sprate = 0;
+	if(sd->sprate!=100)
+		status->max_sp = status->max_sp * sd->sprate/100;
+	if(battle_config.sp_rate != 100)
+		status->max_sp = status->max_sp * battle_config.sp_rate/100;
+
+	if(status->max_sp > (unsigned int)battle_config.max_sp)
+		status->max_sp = battle_config.max_sp;
+	else if(!status->max_sp)
+		status->max_sp = 1;
 
 // ----- RESPAWN HP/SP -----
 // 
@@ -1991,6 +2018,53 @@ int status_calc_pc(struct map_session_data* sd,int first)
 // ----- MISC CALCULATION -----
 	status_calc_misc(&sd->bl, status, sd->status.base_level);
 
+	//Equipment modifiers for misc settings
+	if(sd->matk_rate < 0)
+		sd->matk_rate = 0;
+	if(sd->matk_rate != 100){
+		status->matk_max = status->matk_max * sd->matk_rate/100;
+		status->matk_min = status->matk_min * sd->matk_rate/100;
+	}
+
+	if(sd->hit_rate < 0)
+		sd->hit_rate = 0;
+	if(sd->hit_rate != 100)
+		status->hit = status->hit * sd->hit_rate/100;
+
+	if(sd->flee_rate < 0)
+		sd->flee_rate = 0;
+	if(sd->flee_rate != 100)
+		status->flee = status->flee * sd->flee_rate/100;
+
+	if(sd->def2_rate < 0)
+		sd->def2_rate = 0;
+	if(sd->def2_rate != 100)
+		status->def2 = status->def2 * sd->def2_rate/100;
+
+	if(sd->mdef2_rate < 0)
+		sd->mdef2_rate = 0;
+	if(sd->mdef2_rate != 100)
+		status->mdef2 = status->mdef2 * sd->mdef2_rate/100;
+		
+	if(sd->critical_rate < 0) 
+		sd->critical_rate = 0;
+	if(sd->critical_rate != 100)
+		status->cri = status->cri * sd->critical_rate/100;
+
+	if(sd->flee2_rate < 0)
+		sd->flee2_rate = 0;
+	if(sd->flee2_rate != 100)
+		status->flee2 = status->flee2 * sd->flee2_rate/100;
+
+	if(sd->speed_rate < 0)
+		sd->speed_rate = 0;
+	if(sd->speed_rate != 100)
+		status->speed = status->speed*sd->speed_rate/100;
+
+	if(status->speed < battle_config.max_walk_speed)
+		status->speed = battle_config.max_walk_speed;
+
+
 // ----- HIT CALCULATION -----
 
 	// Absolute modifiers from passive skills
@@ -2022,6 +2096,8 @@ int status_calc_pc(struct map_session_data* sd,int first)
 // ----- EQUIPMENT-DEF CALCULATION -----
 
 	// Apply relative modifiers from equipment
+	if(sd->def_rate < 0)
+		sd->def_rate = 0;
 	if(sd->def_rate != 100) {
 		i =  status->def * sd->def_rate/100;
 		status->def = cap_value(i, CHAR_MIN, CHAR_MAX);
@@ -2036,6 +2112,8 @@ int status_calc_pc(struct map_session_data* sd,int first)
 // ----- EQUIPMENT-MDEF CALCULATION -----
 
 	// Apply relative modifiers from equipment
+	if(sd->mdef_rate < 0)
+		sd->mdef_rate = 0;
 	if(sd->mdef_rate != 100) {
 		i =  status->mdef * sd->mdef_rate/100;
 		status->mdef = cap_value(i, CHAR_MIN, CHAR_MAX);
@@ -2093,6 +2171,8 @@ int status_calc_pc(struct map_session_data* sd,int first)
 //
 	i =  800-status->agi*4;
 	status->dmotion = cap_value(i, 400, 800);
+	if(battle_config.pc_damage_delay_rate != 100)
+		status->dmotion = status->dmotion*battle_config.pc_damage_delay_rate/100;
 
 // ----- MISC CALCULATIONS -----
 
@@ -2119,42 +2199,16 @@ int status_calc_pc(struct map_session_data* sd,int first)
 	}
 
 	//Underflow protections.
-	if(sd->sprate < 0)
-		sd->sprate = 0;
 	if(sd->dsprate < 0)
 		sd->dsprate = 0;
-	if(sd->hprate < 0)
-		sd->hprate = 0;
-	if(sd->sprate < 0)
-		sd->sprate = 0;
 	if(sd->castrate < 0)
 		sd->castrate = 0;
 	if(sd->delayrate < 0)
 		sd->delayrate = 0;
-	if(sd->speed_rate < 0)
-		sd->speed_rate = 0;
 	if(sd->hprecov_rate < 0)
 		sd->hprecov_rate = 0;
 	if(sd->sprecov_rate < 0)
 		sd->sprecov_rate = 0;
-	if(sd->matk_rate < 0)
-		sd->matk_rate = 0;
-	if(sd->critical_rate < 0) 
-		sd->critical_rate = 0;
-	if(sd->hit_rate < 0)
-		sd->hit_rate = 0;
-	if(sd->flee_rate < 0)
-		sd->flee_rate = 0;
-	if(sd->flee2_rate < 0)
-		sd->flee2_rate = 0;
-	if(sd->def_rate < 0)
-		sd->def_rate = 0;
-	if(sd->def2_rate < 0)
-		sd->def2_rate = 0;
-	if(sd->mdef_rate < 0)
-		sd->mdef_rate = 0;
-	if(sd->mdef2_rate < 0)
-		sd->mdef2_rate = 0;
 
 	// Anti-element and anti-race
 	if((skill=pc_checkskill(sd,CR_TRUST))>0)
@@ -2542,11 +2596,6 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
 		status->max_hp += b_status->max_hp - sd->status.max_hp;
 		
 		status->max_hp = status_calc_maxhp(&sd->bl, &sd->sc, status->max_hp);
-		// Apply relative modifiers from equipment
-		if(sd->hprate!=100)
-			status->max_hp = status->max_hp * sd->hprate/100;
-		if(battle_config.hp_rate != 100)
-			status->max_hp = status->max_hp * battle_config.hp_rate/100;
 		
 		if(status->max_hp > (unsigned int)battle_config.max_hp)
 			status->max_hp = battle_config.max_hp;
@@ -2566,19 +2615,8 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
 		status->max_sp = status_base_pc_maxsp(sd,status);
 		status->max_sp += b_status->max_sp - sd->status.max_sp;
 		
-		if((skill=pc_checkskill(sd,HP_MEDITATIO))>0)
-			status->max_sp += status->max_sp * skill/100;
-		if((skill=pc_checkskill(sd,HW_SOULDRAIN))>0)
-			status->max_sp += status->max_sp * 2*skill/100;
-
 		status->max_sp = status_calc_maxsp(&sd->bl, &sd->sc, status->max_sp);
 		
-		// Apply relative modifiers from equipment
-		if(sd->sprate!=100)
-			status->max_sp = status->max_sp * sd->sprate/100;
-		if(battle_config.sp_rate != 100)
-			status->max_sp = status->max_sp * battle_config.sp_rate/100;
-		
 		if(status->max_sp > (unsigned int)battle_config.max_sp)
 			status->max_sp = battle_config.max_sp;
 		else if(!status->max_sp)
@@ -2601,49 +2639,14 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
 
 		status->matk_min = status_calc_matk(&sd->bl, &sd->sc, status->matk_min);
 		status->matk_max = status_calc_matk(&sd->bl, &sd->sc, status->matk_max);
-		if(sd->matk_rate != 100){
-			status->matk_max = status->matk_max * sd->matk_rate/100;
-			status->matk_min = status->matk_min * sd->matk_rate/100;
-		}
 
 		if(sd->sc.data[SC_MAGICPOWER].timer!=-1) { //Store current matk values
 			sd->sc.data[SC_MAGICPOWER].val3 = status->matk_min;
 			sd->sc.data[SC_MAGICPOWER].val4 = status->matk_max;
 		}
 	}
-	
-	if(flag&SCB_HIT) {
-		if(sd->hit_rate != 100)
-			status->hit = status->hit * sd->hit_rate/100;
-
-		if(status->hit < 1) status->hit = 1;
-	}
-
-	if(flag&SCB_FLEE) {
-		if(sd->flee_rate != 100)
-			status->flee = status->flee * sd->flee_rate/100;
-
-		if(status->flee < 1) status->flee = 1;
-	}
-
-	if(flag&SCB_DEF2) {
-		if(sd->def2_rate != 100)
-			status->def2 = status->def2 * sd->def2_rate/100;
-
-		if(status->def2 < 1) status->def2 = 1;
-	}
-
-	if(flag&SCB_MDEF2) {
-		if(sd->mdef2_rate != 100)
-			status->mdef2 = status->mdef2 * sd->mdef2_rate/100;
-
-		if(status->mdef2 < 1) status->mdef2 = 1;
-	}
 
 	if(flag&SCB_SPEED) {
-		if(sd->speed_rate != 100)
-			status->speed = status->speed*sd->speed_rate/100;
-
 		if(status->speed < battle_config.max_walk_speed)
 			status->speed = battle_config.max_walk_speed;
 
@@ -2693,29 +2696,16 @@ void status_calc_bl_sub_pc(struct map_session_data *sd, unsigned long flag)
 	}
 	
 	if(flag&(SCB_AGI|SCB_DSPD)) {
-		//Even though people insist this is too slow, packet data reports this is the actual real equation.
-		skill = 800-status->agi*4;
-		status->dmotion = cap_value(skill, 400, 800);
-
-		if(battle_config.pc_damage_delay_rate != 100)
-			status->dmotion  = status->dmotion*battle_config.pc_damage_delay_rate/100;
-		status->dmotion = status_calc_dmotion(&sd->bl, &sd->sc, b_status->dmotion);
-	}
-
-
-	if(flag&SCB_CRI)
-	{
-		if(sd->critical_rate != 100)
-			status->cri = status->cri * sd->critical_rate/100;
-
-		if(status->cri < 10) status->cri = 10;
-	}
-
-	if(flag&SCB_FLEE2) {
-		if(sd->flee2_rate != 100)
-			status->flee2 = status->flee2 * sd->flee2_rate/100;
-
-		if(status->flee2 < 10) status->flee2 = 10;
+		if (b_status->agi == status->agi)
+			status->dmotion = status_calc_dmotion(&sd->bl, &sd->sc, b_status->dmotion);
+		else {
+			skill = 800-status->agi*4;
+			status->dmotion = cap_value(skill, 400, 800);
+			if(battle_config.pc_damage_delay_rate != 100)
+				status->dmotion = status->dmotion*battle_config.pc_damage_delay_rate/100;
+			//It's safe to ignore b_status->dmotion since no bonus affects it.
+			status->dmotion = status_calc_dmotion(&sd->bl, &sd->sc, status->dmotion);
+		}
 	}
 
 	if(flag&SCB_SPEED) {
@@ -3037,12 +3027,16 @@ void status_calc_bl(struct block_list *bl, unsigned long flag)
 	
 	if(flag&SCB_MAXHP) {
 		status->max_hp = status_calc_maxhp(bl, sc, b_status->max_hp);
+		if (status->max_hp < 1)
+			status->max_hp = 1;
 		if (status->hp > status->max_hp) //FIXME: Should perhaps a status_zap should be issued?
 			status->hp = status->max_hp;
 	}
 
 	if(flag&SCB_MAXSP) {
 		status->max_sp = status_calc_maxsp(bl, sc, b_status->max_sp);
+		if (status->max_sp < 1)
+			status->max_sp = 1;
 		if (status->sp > status->max_sp)
 			status->sp = status->max_sp;
 	}
@@ -3593,14 +3587,14 @@ static signed char status_calc_mdef(struct block_list *bl, struct status_change
 static signed short status_calc_mdef2(struct block_list *bl, struct status_change *sc, int mdef2)
 {
 	if(!sc || !sc->count)
-		return cap_value(mdef2,0,SHRT_MAX);
+		return cap_value(mdef2,1,SHRT_MAX);
 
 	if(sc->data[SC_BERSERK].timer!=-1)
 		return 0;
 	if(sc->data[SC_MINDBREAKER].timer!=-1)
 		mdef2 -= mdef2 * sc->data[SC_MINDBREAKER].val3/100;
 
-	return cap_value(mdef2,0,SHRT_MAX);
+	return cap_value(mdef2,1,SHRT_MAX);
 }
 
 static unsigned short status_calc_speed(struct block_list *bl, struct status_change *sc, int speed)