Просмотр исходного кода

Reverted r16439 that cause bugreport:6182 again and proper fix for bugreport:6261.
Fixed bugreport:6240 WM_VOICEOFSIREN should now effect all target except caster.
Fixed bugreport:6264 where repeated entry in the 'produce_db.txt' are not process properly.
Added a proper message for casting restricted skills in a certain map flag same with official servers.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16442 54d463be-8e91-2dee-dedb-b68131a5f0ec

rud0lp20 13 лет назад
Родитель
Сommit
5f33bf4bd9
2 измененных файлов с 30 добавлено и 21 удалено
  1. 26 16
      src/map/skill.c
  2. 4 5
      src/map/status.c

+ 26 - 16
src/map/skill.c

@@ -496,16 +496,14 @@ int skillnotok (int skillid, struct map_session_data *sd)
 	if( sd->skillitem == skillid )
 		return 0;
 	// Check skill restrictions [Celest]
-	if(!map_flag_vs(m) && skill_get_nocast (skillid) & 1)
-		return 1;
-	if(map[m].flag.pvp && skill_get_nocast (skillid) & 2)
-		return 1;
-	if(map_flag_gvg(m) && skill_get_nocast (skillid) & 4)
-		return 1;
-	if(map[m].flag.battleground && skill_get_nocast (skillid) & 8)
-		return 1;
-	if(map[m].flag.restricted && map[m].zone && skill_get_nocast (skillid) & (8*map[m].zone))
-		return 1;
+	if( (!map_flag_vs(m) && skill_get_nocast (skillid) & 1) ||
+		(map[m].flag.pvp && skill_get_nocast (skillid) & 2) ||
+		(map_flag_gvg(m) && skill_get_nocast (skillid) & 4) ||
+		(map[m].flag.battleground && skill_get_nocast (skillid) & 8) ||
+		(map[m].flag.restricted && map[m].zone && skill_get_nocast (skillid) & (8*map[m].zone)) ){
+			clif_msgtable(sd->fd,0x536); // This skill cannot be used within this area
+			return 1;
+	}
 
 	if( sd->sc.option&OPTION_MOUNTING )
 		return 1;//You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe)
@@ -8196,8 +8194,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 		break;
 		
 	case WM_SIRCLEOFNATURE:
-		flag |= BCT_PARTY|BCT_SELF;
+		flag |= BCT_SELF|BCT_PARTY|BCT_GUILD;
 	case WM_VOICEOFSIREN:
+		if( skillid != WM_SIRCLEOFNATURE )
+			flag &= ~BCT_SELF;
 		if( flag&1 ) {
 			sc_start2(bl,type,(skillid==WM_VOICEOFSIREN)?20+10*skilllv:100,skilllv,(skillid==WM_VOICEOFSIREN)?src->id:0,skill_get_time(skillid,skilllv));
 		} else {
@@ -9065,6 +9065,16 @@ int skill_castend_pos(int tid, unsigned int tick, int id, intptr_t data)
 
 		if( !sd || sd->skillitem != ud->skillid || skill_get_delay(ud->skillid,ud->skilllv) )
 			ud->canact_tick = tick + skill_delayfix(src, ud->skillid, ud->skilllv);
+		if( sd && skill_get_cooldown(ud->skillid,ud->skilllv) > 0 ){
+			int i, cooldown = skill_get_cooldown(ud->skillid, ud->skilllv);
+			for (i = 0; i < ARRAYLENGTH(sd->skillcooldown) && sd->skillcooldown[i].id; i++) { // Increases/Decreases cooldown of a skill by item/card bonuses.
+				if (sd->skillcooldown[i].id == ud->skillid){
+					cooldown += sd->skillcooldown[i].val;
+					break;
+				}
+			}
+			skill_blockpc_start(sd, ud->skillid, cooldown);
+		}
 		if( battle_config.display_status_timers && sd )
 			clif_status_change(src, SI_ACTIONDELAY, 1, skill_delayfix(src, ud->skillid, ud->skilllv), 0, 0, 0);
 //		if( sd )
@@ -9607,7 +9617,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
 				}
 				skill_addtimerskill(src,gettick() + (150 * i),0,sx,sy,skillid,skilllv,dir,flag&2);
 			}
-			if(sd) skill_blockpc_start(sd, skillid, skill_get_cooldown(skillid, skilllv));
 		}
 		break;
 	/**
@@ -15050,8 +15059,12 @@ int skill_can_produce_mix (struct map_session_data *sd, int nameid, int trigger,
 		return 0;
 
 	for(i=0;i<MAX_SKILL_PRODUCE_DB;i++){
-		if(skill_produce_db[i].nameid == nameid )
+		if(skill_produce_db[i].nameid == nameid ){
+			if((j=skill_produce_db[i].req_skill)>0 &&
+				pc_checkskill(sd,j) < skill_produce_db[i].req_skill_lv)
+					continue; // must iterate again to check other skills that produce it. [malufett]
 			break;
+		}
 	}
 	if( i >= MAX_SKILL_PRODUCE_DB )
 		return 0;
@@ -15073,9 +15086,6 @@ int skill_can_produce_mix (struct map_session_data *sd, int nameid, int trigger,
 				return 0;
 		}
 	}
-	if((j=skill_produce_db[i].req_skill)>0 &&
-		pc_checkskill(sd,j) < skill_produce_db[i].req_skill_lv)
-		return 0;
 
 	for(j=0;j<MAX_PRODUCE_RESOURCE;j++){
 		int id,x,y;

+ 4 - 5
src/map/status.c

@@ -641,8 +641,8 @@ void initChangeTables(void) {
 	set_sc( MI_ECHOSONG               , SC_ECHOSONG             , SI_ECHOSONG             , SCB_DEF2  );
 	set_sc( MI_HARMONIZE              , SC_HARMONIZE            , SI_HARMONIZE            , SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK );
 	set_sc_with_vfx( WM_POEMOFNETHERWORLD      , SC_NETHERWORLD          , SI_NETHERWORLD          , SCB_NONE );
-	set_sc( WM_VOICEOFSIREN           , SC_VOICEOFSIREN         , SI_VOICEOFSIREN         , SCB_NONE );
-	set_sc( WM_LULLABY_DEEPSLEEP      , SC_DEEPSLEEP            , SI_DEEPSLEEP            , SCB_NONE );
+	set_sc_with_vfx( WM_VOICEOFSIREN           , SC_VOICEOFSIREN         , SI_VOICEOFSIREN         , SCB_NONE );
+	set_sc_with_vfx( WM_LULLABY_DEEPSLEEP      , SC_DEEPSLEEP            , SI_DEEPSLEEP            , SCB_NONE );
 	set_sc( WM_SIRCLEOFNATURE         , SC_SIRCLEOFNATURE       , SI_SIRCLEOFNATURE       , SCB_NONE );
 	set_sc( WM_GLOOMYDAY              , SC_GLOOMYDAY            , SI_GLOOMYDAY            , SCB_FLEE|SCB_ASPD );
 	set_sc( WM_SONG_OF_MANA           , SC_SONGOFMANA           , SI_SONGOFMANA           , SCB_NONE );
@@ -1679,9 +1679,8 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, int
 				if (pc_isinvisible(sd))
 					return 0;
 				if (tsc->option&hide_flag && !is_boss &&
-					(sd->special_state.perfect_hiding || !is_detect) )
-					return 0;
-				if( tsc->data[SC_CLOAKINGEXCEED] && !(is_boss) && (status->mode&(RC_INSECT|RC_DEMON)) )	// Cloaking Exceed => undetected from insect & demon except bosses
+					((sd->special_state.perfect_hiding || !is_detect) ||
+					(tsc->data[SC_CLOAKINGEXCEED] && is_detect)))
 					return 0;
 				if( tsc->data[SC_CAMOUFLAGE] && !(is_boss || is_detect) && !skill_num )
 					return 0;