Bug Fixes

* Fixed Arm Cannon target type to be ground. (bugreport:8496)
* Fixed Rampage Blaster damage formula. (bugreport:8480)
* Fixed Lightning Walk spirit sphere cost requirement. (bugreport:8474)
* Fixed Deadly Infect to not pass Guillotine Cross poisons to MVPs. (bugreport:8505)
* Fixed Gentle Touch - Cure HP recovery formula. (bugreport:8511)
* Fixed Tiger Cannon taking more HP and SP than it should. (bugreport:8538)
* Fixed Voice of Siren duration time. (bugreport:8382)
* Fixed script command sscanf to return -1 when a string is empty. Thanks to AnnieRuru. (bugreport:8562)
* Fixed VIP bonus experience being included in a monster's death when a Non-VIP kills the monster.
This commit is contained in:
aleos89
2014-01-27 09:56:16 -05:00
parent 139bc1c940
commit c1871e91dc
12 changed files with 52 additions and 38 deletions

View File

@@ -1014,7 +1014,7 @@
2258,13,6,1,-1,0x2,1,3,1,no,0,0,0,weapon,0,0x0, NC_VULCANARM,Vulcan Arm
2259,7,6,1,3,0,2,3,1,no,0,0,5,weapon,0,0x0, NC_FLAMELAUNCHER,Flame Launcher
2260,7,6,2,1,0x2,2:3:4,3,1,no,0,0,0,weapon,0,0x0, NC_COLDSLOWER,Cold Slower
2261,9:11:13,6,1,-1,0x42,3:2:1,3,1,no,0,0,0,weapon,0,0x0, NC_ARMSCANNON,Arm Cannon
2261,9:11:13,6,2,-1,0x42,3:2:1,3,1,no,0,0,0,weapon,0,0x0, NC_ARMSCANNON,Arm Cannon
2262,0,6,4,0,0x1,0,3,1,no,0,0,0,none,0,0x0, NC_ACCELERATION,Acceleration
2263,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_HOVERING,Hovering
2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_F_SIDESLIDE,Front-Side Slide

View File

@@ -763,7 +763,7 @@
2332,0,0,150,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_RAMPAGEBLASTER#Rampage Blaster#
2333,0,0,80,0,0,0,99,0,0,none,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_CRESCENTELBOW#Crescent Elbow#
2334,0,0,40:60:80:100:120,-1:-2:-3:-4:-5,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_CURSEDCIRCLE#Cursed Circle#
2335,0,0,80:70:60:50:40,-5:-4:-3:-2:-1,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_LIGHTNINGWALK#Lightning Walk#
2335,0,0,80:70:60:50:40,-5:-4:-3:-2:-1,0,0,99,0,0,none,0,1:2:3:4:5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_LIGHTNINGWALK#Lightning Walk#
2336,0,0,10:15:20:25:30,0,0,0,99,0,0,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_KNUCKLEARROW#Knuckle Arrow#
2337,0,0,45,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_WINDMILL#Windmill#
2338,0,0,120,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_RAISINGDRAGON#Raising Dragon#

View File

@@ -1014,7 +1014,7 @@
2258,13,6,1,-1,0x2,1,3,1,no,0,0,0,weapon,0,0x0, NC_VULCANARM,Vulcan Arm
2259,7,6,1,3,0,2,3,1,no,0,0,5,weapon,0,0x0, NC_FLAMELAUNCHER,Flame Launcher
2260,7,6,2,1,0x2,2:3:4,3,1,no,0,0,0,weapon,0,0x0, NC_COLDSLOWER,Cold Slower
2261,9:11:13,6,1,-1,0x42,3:2:1,3,1,no,0,0,0,weapon,0,0x0, NC_ARMSCANNON,Arm Cannon
2261,9:11:13,6,2,-1,0x42,3:2:1,3,1,no,0,0,0,weapon,0,0x0, NC_ARMSCANNON,Arm Cannon
2262,0,6,4,0,0x1,0,3,1,no,0,0,0,none,0,0x0, NC_ACCELERATION,Acceleration
2263,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_HOVERING,Hovering
2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_F_SIDESLIDE,Front-Side Slide

View File

@@ -763,7 +763,7 @@
2332,0,0,150,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_RAMPAGEBLASTER#Rampage Blaster#
2333,0,0,80,0,0,0,99,0,0,none,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_CRESCENTELBOW#Crescent Elbow#
2334,0,0,40:60:80:100:120,-1:-2:-3:-4:-5,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_CURSEDCIRCLE#Cursed Circle#
2335,0,0,80:70:60:50:40,-5:-4:-3:-2:-1,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_LIGHTNINGWALK#Lightning Walk#
2335,0,0,80:70:60:50:40,-5:-4:-3:-2:-1,0,0,99,0,0,none,0,1:2:3:4:5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_LIGHTNINGWALK#Lightning Walk#
2336,0,0,10:15:20:25:30,0,0,0,99,0,0,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_KNUCKLEARROW#Knuckle Arrow#
2337,0,0,45,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_WINDMILL#Windmill#
2338,0,0,120,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_RAISINGDRAGON#Raising Dragon#

View File

@@ -3466,12 +3466,13 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
}
break;
case SR_RAMPAGEBLASTER:
skillratio = 20 * skill_lv * (sd?sd->spiritball_old:5);
if( sc && sc->data[SC_EXPLOSIONSPIRITS] ){
skillratio += sc->data[SC_EXPLOSIONSPIRITS]->val1 * 20;
if( sc && sc->data[SC_EXPLOSIONSPIRITS] ) {
skillratio = (20 * ((sd) ? sd->spiritball_old : 5) + 20 * sc->data[SC_EXPLOSIONSPIRITS]->val1) * skill_lv;
RE_LVL_DMOD(120);
}else
} else {
skillratio = 20 * ((sd) ? sd->spiritball_old : 5) * skill_lv;
RE_LVL_DMOD(150);
}
break;
case SR_KNUCKLEARROW:
if( wd.miscflag&4 ){ // ATK [(Skill Level x 150) + (1000 x Target current weight / Maximum weight) + (Target Base Level x 5) x (Caster Base Level / 150)] %

View File

@@ -41,8 +41,8 @@ struct eventlist {
};
//Constant related to the flash of the Guild EXP cache
#define GUILD_SEND_XY_INVERVAL 5000 // Interval of sending coordinates and HP
#define GUILD_PAYEXP_INVERVAL 10000 //Interval (maximum survival time of the cache, in milliseconds)
#define GUILD_SEND_XY_INTERVAL 5000 // Interval of sending coordinates and HP
#define GUILD_PAYEXP_INTERVAL 10000 //Interval (maximum survival time of the cache, in milliseconds)
#define GUILD_PAYEXP_LIST 8192 //The maximum number of cache
//Guild EXP cache
@@ -1652,7 +1652,7 @@ int guild_broken(int guild_id,int flag) {
return 0;
for(i=0;i<g->max_member;i++){ // Destroy all relationships
struct map_session_data *sd = sd=g->member[i].sd;
struct map_session_data *sd = g->member[i].sd;
if(sd != NULL){
if(sd->state.storage_flag == 2)
storage_guild_storage_quit(sd,1);
@@ -2115,8 +2115,8 @@ void do_init_guild(void) {
add_timer_func_list(guild_payexp_timer,"guild_payexp_timer");
add_timer_func_list(guild_send_xy_timer, "guild_send_xy_timer");
add_timer_interval(gettick()+GUILD_PAYEXP_INVERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INVERVAL);
add_timer_interval(gettick()+GUILD_SEND_XY_INVERVAL,guild_send_xy_timer,0,0,GUILD_SEND_XY_INVERVAL);
add_timer_interval(gettick()+GUILD_PAYEXP_INTERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INTERVAL);
add_timer_interval(gettick()+GUILD_SEND_XY_INTERVAL,guild_send_xy_timer,0,0,GUILD_SEND_XY_INTERVAL);
}
void do_final_guild(void) {

View File

@@ -1894,7 +1894,7 @@ bool map_blid_exists( int id ) {
}
/*==========================================
* Convext Mirror
* Convex Mirror
*------------------------------------------*/
struct mob_data * map_getmob_boss(int16 m)
{

View File

@@ -2246,13 +2246,6 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
if (map[m].flag.nobaseexp || !md->db->base_exp)
base_exp = 0;
else {
int vip_bonus = 0;
// Increase base EXP rate for VIP.
if (battle_config.vip_base_exp_increase && (sd && pc_isvip(sd)))
vip_bonus += battle_config.vip_base_exp_increase;
base_exp = (unsigned int)cap_value(md->db->base_exp * per * (bonus+vip_bonus)/100. * map[m].adjust.bexp/100., 1, UINT_MAX);
}
if (map[m].flag.nojobexp || !md->db->job_exp || md->dmglog[i].flag == MDLF_HOMUN) //Homun earned job-exp is always lost.
job_exp = 0;

View File

@@ -614,7 +614,7 @@ int pc_equippoint(struct map_session_data *sd,int n){
}
/**
* Fill inventory_data with struct *item_data trough inventory (fill with struct *item)
* Fill inventory_data with struct *item_data through inventory (fill with struct *item)
* @param sd : player session
* @return 0 sucess, 1:invalid sd
*/
@@ -6002,6 +6002,10 @@ int pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned int
if(!battle_config.pvp_exp && map[sd->bl.m].flag.pvp) // [MouseJstr]
return 0; // no exp on pvp maps
// Increase base EXP rate for VIP.
if (src && src->type&BL_MOB && (battle_config.vip_base_exp_increase && (sd && pc_isvip(sd))))
base_exp = (unsigned int)cap_value(base_exp * (battle_config.vip_base_exp_increase)/100., 1, UINT_MAX);
if(sd->status.guild_id>0)
base_exp-=guild_payexp(sd,base_exp);

View File

@@ -14488,7 +14488,10 @@ BUILDIN_FUNC(sscanf){
*(buf_p-len+1) = '*';
}
script_pushint(st, arg);
if( !strcmp(str, "") )
script_pushint(st, -1);
else
script_pushint(st, arg);
if(buf) aFree(buf);
if(ref_str) aFree(ref_str);

View File

@@ -5030,7 +5030,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
break;
}
map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
status_zap(src, hpcost, spcost);
}
break;
@@ -9142,17 +9141,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
{
int heal;
if( status_isimmune(bl) )
{
if( status_isimmune(bl) ) {
clif_skill_nodamage(src,bl,skill_id,skill_lv,0);
break;
}
heal = 120 * skill_lv + status_get_max_hp(bl);
heal = (120 * skill_lv) + (status_get_max_hp(bl) * (skill_lv / 100));
status_heal(bl, heal, 0, 0);
if( (tsc && tsc->opt1) && (rnd()%100 < ((skill_lv * 5) + (status_get_dex(src) + status_get_lv(src)) / 4) - (1 + (rnd() % 10))) )
{
if( (tsc && tsc->opt1) && (rnd()%100 < ((skill_lv * 5) + (status_get_dex(src) + status_get_lv(src)) / 4) - (1 + (rnd() % 10))) ) {
status_change_end(bl, SC_STONE, INVALID_TIMER);
status_change_end(bl, SC_FREEZE, INVALID_TIMER);
status_change_end(bl, SC_STUN, INVALID_TIMER);
@@ -19224,9 +19221,9 @@ static void skill_readdb(void) {
int n2 = strlen(db_path)+strlen(DBPATH)+strlen(dbsubpath[i])+1;
char* dbsubpath1 = aMalloc(n1+1);
char* dbsubpath2 = aMalloc(n2+1);
safesnprintf(dbsubpath1,n1+1,"%s%s",db_path,dbsubpath[i]);
safesnprintf(dbsubpath1,n1+1,"%s/%s",db_path,dbsubpath[i]);
if(i==0) safesnprintf(dbsubpath2,n2,"%s/%s%s",db_path,DBPATH,dbsubpath[i]);
else safesnprintf(dbsubpath2,n2,"%s%s",db_path,dbsubpath[i]);
else safesnprintf(dbsubpath2,n2,"%s/%s",db_path,dbsubpath[i]);
sv_readdb(dbsubpath2, "skill_db.txt" , ',', 18, 18, MAX_SKILL_DB, skill_parse_row_skilldb, i);
sv_readdb(dbsubpath2, "skill_require_db.txt" , ',', 34, 34, MAX_SKILL_DB, skill_parse_row_requiredb, i);

View File

@@ -7103,7 +7103,7 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
tick_def2 = (status->vit + status->luk)*50;
break;
case SC_VOICEOFSIREN:
tick_def2 = (status_get_lv(bl) * 100) + ((bl->type == BL_PC)?((TBL_PC*)bl)->status.job_level * 20 : 0);
tick_def2 = (status_get_lv(bl) * 100) + ((bl->type == BL_PC)?((TBL_PC*)bl)->status.job_level * 200 : 0);
break;
default:
// Effect that cannot be reduced? Likely a buff.
@@ -11889,6 +11889,7 @@ void status_change_clear_buffs (struct block_list* bl, int type)
int status_change_spread( struct block_list *src, struct block_list *bl )
{
int i, flag = 0;
struct status_data* status = status_get_status_data(bl);
struct status_change *sc = status_get_sc(src);
const struct TimerData *timer;
unsigned int tick;
@@ -11903,6 +11904,21 @@ int status_change_spread( struct block_list *src, struct block_list *bl )
if( !sc->data[i] || i == SC_COMMON_MAX )
continue;
// Boss monsters are still resistant to Guillotine Cross poisons but not other statuses.
if( status->mode&MD_BOSS ) {
switch( i ) {
case SC_PYREXIA:
case SC_DEATHHURT:
case SC_TOXIN:
case SC_PARALYSE:
case SC_VENOMBLEED:
case SC_MAGICMUSHROOM:
case SC_OBLIVIONCURSE:
case SC_LEECHESEND:
continue;
}
}
switch( i ) {
// Debuffs that can be spread.
// NOTE: We'll add/delete SCs when we are able to confirm it.
@@ -11910,21 +11926,21 @@ int status_change_spread( struct block_list *src, struct block_list *bl )
case SC_SILENCE:
case SC_CONFUSION:
case SC_BLIND:
case SC_NOCHAT:
//case SC_NOCHAT:
case SC_HALLUCINATION:
case SC_SIGNUMCRUCIS:
case SC_DECREASEAGI:
case SC_SLOWDOWN:
case SC_MINDBREAKER:
case SC_WINKCHARM:
case SC_STOP:
//case SC_MINDBREAKER:
//case SC_WINKCHARM:
//case SC_STOP:
case SC_ORCISH:
// case SC_STRIPWEAPON: // Omg I got infected and had the urge to strip myself physically.
// case SC_STRIPSHIELD: // No this is stupid and shouldnt be spreadable at all.
// case SC_STRIPARMOR: // Disabled until I can confirm if it does or not. [Rytech]
// case SC_STRIPHELM:
// case SC__STRIPACCESSORY:
case SC_BITE:
//case SC_BITE:
case SC_FREEZING:
case SC_VENOMBLEED:
case SC_DEATHHURT:
@@ -11950,7 +11966,7 @@ int status_change_spread( struct block_list *src, struct block_list *bl )
data.tick = sc->data[i]->val4 * 2000;
break;
case SC_PYREXIA:
case SC_OBLIVIONCURSE:
//case SC_OBLIVIONCURSE: // Players are not affected by Oblivion Curse.
data.tick = sc->data[i]->val4 * 3000;
break;
case SC_MAGICMUSHROOM: