Ver Fonte

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.

aleos89 há 11 anos atrás
pai
commit
c1871e91dc

+ 1 - 1
db/pre-re/skill_db.txt

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

+ 1 - 1
db/pre-re/skill_require_db.txt

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

+ 1 - 1
db/re/skill_db.txt

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

+ 1 - 1
db/re/skill_require_db.txt

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

+ 5 - 4
src/map/battle.c

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

+ 5 - 5
src/map/guild.c

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

+ 1 - 1
src/map/map.c

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

+ 0 - 7
src/map/mob.c

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

+ 5 - 1
src/map/pc.c

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

+ 4 - 1
src/map/script.c

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

+ 5 - 8
src/map/skill.c

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

+ 23 - 7
src/map/status.c

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