浏览代码

Bug Fixes
* Taekwon stances will now be removed on logout to prevent them being permanently on when a Taekwon is no longer ranked. (bugreport:8614)
* Added a battle config (taekwon_mission_mobname) for Taekwon Mission to check for kills based on monster names, off by default. (bugreport:8614) -- Credits to clydelion for the base.
* Removed a case that ignores damaging a target when they are on the same cell as the caster for Frost Nova. (bugreport:8705)
* Removed a skill unit check for Overbrand. (bugreport:8711)

aleos89 11 年之前
父节点
当前提交
f6cc486ab7
共有 11 个文件被更改,包括 38 次插入31 次删除
  1. 7 0
      conf/battle/skill.conf
  2. 0 1
      db/pre-re/skill_unit_db.txt
  3. 0 1
      db/re/skill_unit_db.txt
  4. 1 0
      src/map/battle.c
  5. 1 0
      src/map/battle.h
  6. 4 0
      src/map/map.c
  7. 5 0
      src/map/map.h
  8. 3 1
      src/map/mob.c
  9. 2 0
      src/map/mob.h
  10. 12 19
      src/map/pc.c
  11. 3 9
      src/map/skill.c

+ 7 - 0
conf/battle/skill.conf

@@ -291,3 +291,10 @@ bowling_bash_area: 0
 // On official servers, hitting a wall will always cause the unit to stop moving.
 // If "no", the unit will continue moving when approaching walls diagonally (old Athena behavior).
 path_blown_halt: yes
+
+// Taekwon Mission mob name check
+// iRO Wiki States: If your target is Goblin, any monster called "Goblin" will count toward the mission.
+// 0: Off (default)
+// 1: All 5 of the Goblin monsters will count, regardless of Mob ID (Mob ID: 1122-1126) - iRO default
+// 2: Any monster with the same exact name will count, regardless of Mob ID - Comparison based off of jName
+taekwon_mission_mobname: 0

+ 0 - 1
db/pre-re/skill_unit_db.txt

@@ -128,7 +128,6 @@
 2303,0xd0,    ,  0, 2,  -1,all,   0x2018	//SC_BLOODYLUST
 2304,0xd1,    ,  0, 2,1000,enemy, 0x018	//SC_FEINTBOMB
 
-2317,0x86,    , -1, 0,	-1,enemy, 0x010	//LG_OVERBRAND
 2319,0xec,    ,  0, 3,5000,all,   0x000	//LG_BANDING
 
 2414,0xda,    ,  0, 1,1000,enemy, 0x008	//WM_REVERBERATION

+ 0 - 1
db/re/skill_unit_db.txt

@@ -130,7 +130,6 @@
 2303,0xd0,    ,  0, 2,  -1,all,   0x2018	//SC_BLOODYLUST
 2304,0xd1,    ,  0, 2,1000,enemy, 0x018	//SC_FEINTBOMB
 
-2317,0x86,    , -1, 0,	-1,enemy, 0x010	//LG_OVERBRAND
 2319,0xec,    ,  0, 3,5000,all,   0x000	//LG_BANDING
 
 2414,0xda,    ,  0, 1,1000,enemy, 0x008	//WM_REVERBERATION

+ 1 - 0
src/map/battle.c

@@ -7371,6 +7371,7 @@ static const struct _battle_data {
 	{ "path_blown_halt",                    &battle_config.path_blown_halt,                 1,      0,      1,              },
 	{ "rental_mount_speed_boost",           &battle_config.rental_mount_speed_boost,        25,     0,      100,        	},
 	{ "feature.warp_suggestions",           &battle_config.warp_suggestions_enabled,        0,      0,      1,              },
+	{ "taekwon_mission_mobname",            &battle_config.taekwon_mission_mobname,         0,      0,      2,              },
 };
 #ifndef STATS_OPT_OUT
 /**

+ 1 - 0
src/map/battle.h

@@ -533,6 +533,7 @@ extern struct Battle_Config
 	int path_blown_halt;
 	int rental_mount_speed_boost;
 	int warp_suggestions_enabled;
+	int taekwon_mission_mobname;
 } battle_config;
 
 void do_init_battle(void);

+ 4 - 0
src/map/map.c

@@ -1681,6 +1681,10 @@ int map_quit(struct map_session_data *sd) {
 		status_change_end(&sd->bl, SC_SATURDAYNIGHTFEVER, INVALID_TIMER);
 		status_change_end(&sd->bl, SC_KYOUGAKU, INVALID_TIMER);
 		status_change_end(&sd->bl, SC_C_MARKER, INVALID_TIMER);
+		status_change_end(&sd->bl, SC_READYSTORM, INVALID_TIMER);
+		status_change_end(&sd->bl, SC_READYDOWN, INVALID_TIMER);
+		status_change_end(&sd->bl, SC_READYTURN, INVALID_TIMER);
+		status_change_end(&sd->bl, SC_READYCOUNTER, INVALID_TIMER);
 		if (battle_config.debuff_on_logout&1) { //Remove negative buffs
 			status_change_end(&sd->bl, SC_ORCISH, INVALID_TIMER);
 			status_change_end(&sd->bl, SC_STRIPWEAPON, INVALID_TIMER);

+ 5 - 0
src/map/map.h

@@ -54,6 +54,11 @@ void map_msg_reload(void);
 /** Added definitions for WoESE objects and other [L0ne_W0lf], [aleos] */
 enum MOBID {
 	MOBID_PORING			= 1002,
+	MOBID_GOBLIN_1			= 1122,
+	MOBID_GOBLIN_2,
+	MOBID_GOBLIN_3,
+	MOBID_GOBLIN_4,
+	MOBID_GOBLIN_5,
 	MOBID_MARINE_SPHERE		= 1142,
 	MOBID_A_GUARDIAN		= 1285,
 	MOBID_K_GUARDIAN,

+ 3 - 1
src/map/mob.c

@@ -2583,7 +2583,9 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
 		}
 
 		if( sd ) {
-			if( sd->mission_mobid == md->mob_id) { //TK_MISSION [Skotlex]
+			if( sd->mission_mobid == md->mob_id ||
+				( battle_config.taekwon_mission_mobname == 1 && mob_is_goblin(md, sd->mission_mobid) ) ||
+				( battle_config.taekwon_mission_mobname == 2 && mob_is_samename(md, sd->mission_mobid) ) ) { //TK_MISSION [Skotlex]
 				if( ++sd->mission_count >= 100 && (temp = mob_get_random_id(0, 0xE, sd->status.base_level)) ) {
 					pc_addfame(sd, 1);
 					sd->mission_mobid = temp;

+ 2 - 0
src/map/mob.h

@@ -274,6 +274,8 @@ void mob_heal(struct mob_data *md,unsigned int heal);
 #define mob_is_gvg(md) (map[(md)->bl.m].flag.gvg_castle && ( (md)->mob_id == MOBID_EMPERIUM || (md)->mob_id == MOBID_BARRICADE1 || (md)->mob_id == MOBID_GUARIDAN_STONE1 || (md)->mob_id == MOBID_GUARIDAN_STONE2) )
 #define mob_is_treasure(md) (((md)->mob_id >= MOBID_TREAS01 && (md)->mob_id <= MOBID_TREAS40) || ((md)->mob_id >= MOBID_TREAS41 && (md)->mob_id <= MOBID_TREAS49))
 #define mob_is_guardian(mob_id) ((mob_id >= MOBID_A_GUARDIAN && mob_id <= MOBID_S_GUARDIAN) || mob_id == MOBID_S_GUARDIAN_ || mob_id == MOBID_A_GUARDIAN_)
+#define mob_is_goblin(md, mid) (((md)->mob_id >= MOBID_GOBLIN_1 && (md)->mob_id <= MOBID_GOBLIN_5) && (mid >= MOBID_GOBLIN_1 && mid <= MOBID_GOBLIN_5))
+#define mob_is_samename(md, mid) (strcmp(mob_db((md)->mob_id)->jname, mob_db(mid)->jname) == 0)
 
 void mob_clear_spawninfo();
 int do_init_mob(void);

+ 12 - 19
src/map/pc.c

@@ -370,9 +370,9 @@ void pc_addfame(struct map_session_data *sd,int count)
 		sd->status.fame = MAX_FAME;
 
 	switch(sd->class_&MAPID_UPPERMASK){
-		case MAPID_BLACKSMITH: ranktype=0; break;
-		case MAPID_ALCHEMIST:  ranktype=1; break;
-		case MAPID_TAEKWON: ranktype=2; break;
+		case MAPID_BLACKSMITH:	ranktype = 0; break;
+		case MAPID_ALCHEMIST:	ranktype = 1; break;
+		case MAPID_TAEKWON:		ranktype = 2; break;
 	}
 
 	clif_update_rankingpoint(sd,ranktype,count);
@@ -1490,7 +1490,7 @@ int pc_calc_skilltree(struct map_session_data *sd)
 						if (sd->status.skill[k].id == 0 || sd->status.skill[k].flag == SKILL_FLAG_TEMPORARY || sd->status.skill[k].flag == SKILL_FLAG_PLAGIARIZED)
 							k = 0; //Not learned.
 						else
-						if (sd->status.skill[k].flag >= SKILL_FLAG_REPLACED_LV_0) //Real lerned level
+						if (sd->status.skill[k].flag >= SKILL_FLAG_REPLACED_LV_0) //Real learned level
 							k = sd->status.skill[skill_tree[c][i].need[j].id].flag - SKILL_FLAG_REPLACED_LV_0;
 						else
 							k = pc_checkskill(sd,k);
@@ -1531,29 +1531,22 @@ int pc_calc_skilltree(struct map_session_data *sd)
 		}
 	} while(flag);
 
-	//
-	if( c > 0 && (sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON && sd->status.base_level >= 90 && sd->status.skill_point == 0 && pc_famerank(sd->status.char_id, MAPID_TAEKWON) )
-	{
-		/* Taekwon Ranger Bonus Skill Tree
+	if( c > 0 && (sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON && sd->status.base_level >= 90 && sd->status.skill_point == 0 && pc_famerank(sd->status.char_id, MAPID_TAEKWON) ) {
+		/* Taekwon Ranker Bonus Skill Tree
 		============================================
 		- Grant All Taekwon Tree, but only as Bonus Skills in case they drop from ranking.
 		- (c > 0) to avoid grant Novice Skill Tree in case of Skill Reset (need more logic)
-		- (sd->status.skill_point == 0) to wait until all skill points are asigned to avoid problems with Job Change quest. */
+		- (sd->status.skill_point == 0) to wait until all skill points are assigned to avoid problems with Job Change quest. */
 
-		for( i = 0; i < MAX_SKILL_TREE && (id = skill_tree[c][i].id) > 0; i++ )
-		{
+		for( i = 0; i < MAX_SKILL_TREE && (id = skill_tree[c][i].id) > 0; i++ ) {
 			if( (skill_get_inf2(id)&(INF2_QUEST_SKILL|INF2_WEDDING_SKILL)) )
 				continue; //Do not include Quest/Wedding skills.
 
-			if( sd->status.skill[id].id == 0 )
-			{
+			if( sd->status.skill[id].id == 0 ) {
 				sd->status.skill[id].id = id;
 				sd->status.skill[id].flag = SKILL_FLAG_TEMPORARY; // So it is not saved, and tagged as a "bonus" skill.
-			}
-			else if( id != NV_BASIC )
-			{
+			} else if( id != NV_BASIC )
 				sd->status.skill[id].flag = SKILL_FLAG_REPLACED_LV_0 + sd->status.skill[id].lv; // Remember original level
-			}
 
 			sd->status.skill[id].lv = skill_tree_get_max(id, sd->status.class_);
 		}
@@ -6340,7 +6333,7 @@ int pc_skillup(struct map_session_data *sd,uint16 skill_id)
 		if( !skill_get_inf(skill_id) )
 			status_calc_pc(sd,0); // Only recalculate for passive skills.
 		else if( sd->status.skill_point == 0 && (sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON && sd->status.base_level >= 90 && pc_famerank(sd->status.char_id, MAPID_TAEKWON) )
-			pc_calc_skilltree(sd); // Required to grant all TK Ranger skills.
+			pc_calc_skilltree(sd); // Required to grant all TK Ranker skills.
 		else
 			pc_check_skilltree(sd, skill_id); // Check if a new skill can Lvlup
 
@@ -6583,7 +6576,7 @@ int pc_resetskill(struct map_session_data* sd, int flag)
 	if( !(flag&2) ) { //Remove stuff lost when resetting skills.
 
 		/**
-		 * It has been confirmed on official server that when you reset skills with a ranked tweakwon your skills are not reset (because you have all of them anyway)
+		 * It has been confirmed on official servers that when you reset skills with a ranked Taekwon your skills are not reset (because you have all of them anyway)
 		 **/
 		if( (sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON && sd->status.base_level >= 90 && pc_famerank(sd->status.char_id, MAPID_TAEKWON) )
 			return 0;

+ 3 - 9
src/map/skill.c

@@ -930,16 +930,13 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
 					if(sc && !sc->data[SC_COMBO]) {
 						if(sc->data[SC_READYSTORM] &&
 							sc_start(src,src,SC_COMBO, 15, TK_STORMKICK,
-								(2000 - 4*sstatus->agi - 2*sstatus->dex)))
-							; //Stance triggered
+								(2000 - 4*sstatus->agi - 2*sstatus->dex))); //Stance triggered
 						else if(sc->data[SC_READYDOWN] &&
 							sc_start(src,src,SC_COMBO, 15, TK_DOWNKICK,
-								(2000 - 4*sstatus->agi - 2*sstatus->dex)))
-							; //Stance triggered
+								(2000 - 4*sstatus->agi - 2*sstatus->dex))); //Stance triggered
 						else if(sc->data[SC_READYTURN] &&
 							sc_start(src,src,SC_COMBO, 15, TK_TURNKICK,
-								(2000 - 4*sstatus->agi - 2*sstatus->dex)))
-							; //Stance triggered
+								(2000 - 4*sstatus->agi - 2*sstatus->dex))); //Stance triggered
 						else if (sc->data[SC_READYCOUNTER]) { //additional chance from SG_FRIEND [Komurka]
 							rate = 20;
 							if (sc->data[SC_SKILLRATE_UP] && sc->data[SC_SKILLRATE_UP]->val1 == TK_COUNTER) {
@@ -2646,9 +2643,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 	tsc= status_get_sc(bl);
 	if (tsc && !tsc->count) tsc = NULL; //Don't need it.
 
-	// Is this check really needed? FrostNova won't hurt you if you step right where the caster is?
-	if(skill_id == WZ_FROSTNOVA && dsrc->x == bl->x && dsrc->y == bl->y)
-		return 0;
 	 //Trick Dead protects you from damage, but not from buffs and the like, hence it's placed here.
 	if (tsc && tsc->data[SC_TRICKDEAD])
 		return 0;