- 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
This commit is contained in:
skotlex 2006-09-13 18:51:07 +00:00
parent 4f24872a12
commit 66869ed12a
4 changed files with 119 additions and 108 deletions

View File

@ -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]

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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)