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:
@@ -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
|
||||
|
||||
@@ -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#
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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#
|
||||
|
||||
@@ -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)] %
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -1894,7 +1894,7 @@ bool map_blid_exists( int id ) {
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* Convext Mirror
|
||||
* Convex Mirror
|
||||
*------------------------------------------*/
|
||||
struct mob_data * map_getmob_boss(int16 m)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user