Prechádzať zdrojové kódy

Updated Endure, added SC_BLOCKSKILL and SC_SLOWDOWN

git-svn-id: https://svn.code.sf.net/p/rathena/svn/athena@262 54d463be-8e91-2dee-dedb-b68131a5f0ec
celest 20 rokov pred
rodič
commit
971f033392
4 zmenil súbory, kde vykonal 44 pridanie a 10 odobranie
  1. 2 1
      Changelog.txt
  2. 2 0
      src/map/battle.c
  3. 35 5
      src/map/skill.c
  4. 5 4
      src/map/skill.h

+ 2 - 1
Changelog.txt

@@ -14,7 +14,8 @@ Date	Added
           - Pneuma (thanks to DracoRPG)
           - Changed sc_ id for Basilica
           - Cancel Basilica (100%) when caster moves or uses another skill
-          - Updated Poison React (90%)
+          - Updated Poison React (90%), Endure
+          - Added SC_BLOCKSKILL, SC_SLOWDOWN
 	* Modified pc_attack to fix monster npc's not working in certain exes, thanks
 	  to leinsirk10 [celest]
 	* Moved mapflags organized by type to main mapflag folder and removed "type" folder.

+ 2 - 0
src/map/battle.c

@@ -932,6 +932,8 @@ int battle_get_speed(struct block_list *bl)
 			//ウィンドウォーク時はLv*2%減算
 			if(sc_data[SC_WINDWALK].timer!=-1)
 				speed -= (speed*(sc_data[SC_WINDWALK].val1*2))/100;
+			if(sc_data[SC_SLOWDOWN].timer!=-1)
+				speed = speed*150/100;
 		}
 		if(speed < 1) speed = 1;
 		return speed;

+ 35 - 5
src/map/skill.c

@@ -2272,7 +2272,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
 	case MO_CHAINCOMBO:		/* 連打掌 */
 		{
 			struct status_change *sc_data = battle_get_sc_data(src);
-		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+			skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
 			if(sc_data && sc_data[SC_BLADESTOP].timer != -1)
 				skill_status_change_end(src,SC_BLADESTOP,-1);
 		}
@@ -2371,6 +2371,11 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
 			if (skillid == SM_MAGNUM)	// fire element for 10 seconds
 				skill_status_change_start(src,SC_FLAMELAUNCHER,0,0,0,0,10000,0);
 		}
+		if (bl->type == BL_MOB && skillid == AS_GRIMTOOTH) {
+			struct status_change *sc_data = battle_get_sc_data(bl);
+			if (sc_data && sc_data[SC_SLOWDOWN].timer == -1)
+				skill_status_change_start(bl,SC_SLOWDOWN,0,0,0,0,1000,0);
+		}
 		break;
 
 	case KN_BOWLINGBASH:	/* ボウリングバッシュ */
@@ -3019,7 +3024,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 	case AS_POISONREACT:	/* ポイズンリアクト */
 	case MC_LOUD:			/* ラウドボイス */
 	case MG_ENERGYCOAT:		/* エナジ?コ?ト */
-	case SM_ENDURE:			/* インデュア */
+//	case SM_ENDURE:			/* インデュア */
 	case MG_SIGHT:			/* サイト */
 	case AL_RUWACH:			/* ルアフ */
 	case MO_EXPLOSIONSPIRITS:	// 爆裂波動
@@ -3039,6 +3044,13 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 		clif_skill_nodamage(src,bl,skillid,skilllv,1);
 		skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
 		break;
+	case SM_ENDURE:			/* インデュア */
+		clif_skill_nodamage(src,bl,skillid,skilllv,1);
+		skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+		skill_status_change_start(src,SC_BLOCKSKILL,skilllv,0,skillid,0,10000,0 );
+		break;
+		
+	
 	case AS_ENCHANTPOISON: // Prevent spamming [Valaris]
 		if(bl->type==BL_PC) {
 			struct map_session_data *sd2=(struct map_session_data *)bl;
@@ -4619,6 +4631,10 @@ int skill_castend_map( struct map_session_data *sd,int skill_num, const char *ma
 			sd->sc_data[SC_BERSERK].timer != -1 ||
 			sd->sc_data[SC_MARIONETTE].timer != -1)
 			return 0;
+		
+		if (sd->sc_data[SC_BLOCKSKILL].timer!=-1)
+			if (skill_num == sd->sc_data[SC_BLOCKSKILL].val3)
+				return 0;
 	}
 
 	if( skill_num != sd->skillid)	/* 不正パケットらしい */
@@ -6260,9 +6276,9 @@ int skill_check_condition(struct map_session_data *sd,int type)
 			sd->sc_data[SC_STEELBODY].timer != -1 ||
 			sd->sc_data[SC_BERSERK].timer != -1 ||
 			(sd->sc_data[SC_MARIONETTE].timer != -1 && sd->skillid != CG_MARIONETTE)){
-		clif_skill_fail(sd,sd->skillid,0,0);
+			clif_skill_fail(sd,sd->skillid,0,0);
 			return 0;	/* ?態異常や沈?など */
-		}
+		}	
 	}
 	skill = sd->skillid;
 	lv = sd->skilllv;
@@ -6737,6 +6753,10 @@ int skill_use_id( struct map_session_data *sd, int target_id,
 			if(lv==5 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE && skill_num!=MO_CHAINCOMBO && skill_num!=MO_EXTREMITYFIST) return 0;
 		}
 
+		if (sd->sc_data[SC_BLOCKSKILL].timer!=-1)
+			if (skill_num == sd->sc_data[SC_BLOCKSKILL].val3)
+				return 0;
+
 		if (sc_data[SC_BASILICA].timer != -1) { // Basilica cancels if caster moves [celest]
 			struct skill_unit *su;
 			if ((su = (struct skill_unit *)sc_data[SC_BASILICA].val4)) {
@@ -6746,7 +6766,7 @@ int skill_use_id( struct map_session_data *sd, int target_id,
 					skill_delunitgroup (sg);
 				}
 			}
-		}
+		}		
 	}
 
 	if(sd->status.option&4 && skill_num==TF_HIDING)
@@ -7032,6 +7052,10 @@ int skill_use_pos( struct map_session_data *sd,
 			sd->sc_data[SC_MARIONETTE].timer != -1)
 			return 0;	/* ?態異常や沈?など */
 
+		if (sd->sc_data[SC_BLOCKSKILL].timer!=-1)
+			if (skill_num == sd->sc_data[SC_BLOCKSKILL].val3)
+				return 0;
+
 		if (sc_data[SC_BASILICA].timer != -1) { // Basilica cancels if caster moves [celest]
 			struct skill_unit *su;
 			if ((su = (struct skill_unit *)sc_data[SC_BASILICA].val4)) {
@@ -9159,6 +9183,12 @@ int skill_status_change_start(struct block_list *bl, int type, int val1, int val
 			val2 = 75;
 			// calc_flag = 1;	// not sure of effects yet [celest]
 			break;
+		case SC_BLOCKSKILL:
+			if (!tick) tick = 60000;
+			if (!val3) val3 = -1;
+			break;
+		case SC_SLOWDOWN:
+			break;
 		default:
 			if(battle_config.error_log)
 				printf("UnknownStatusChange [%d]\n", type);

+ 5 - 4
src/map/skill.h

@@ -322,6 +322,8 @@ enum {	// struct map_session_data 
 	SC_SIGHTTRASHER		=73,
 //	SC_BASILICA			=125, // 125 is the same id as joint break
 	SC_BASILICA			=102, // temporarily use this before an actual id is found [celest]
+	SC_EDP				= 114, // 
+	SC_MARIONETTE2      = 122, // Marionette target
 	SC_ENSEMBLE			=159,
 	SC_FOGWALL			=178,
 	SC_GOSPEL			=179,
@@ -334,11 +336,10 @@ enum {	// struct map_session_data 
 	SC_SPELLBREAKER		=192,
 
 // [Celest]
-	SC_EDP				= 114, // 
-	SC_MARIONETTE2      = 122, // Marionette target
+	SC_SLOWDOWN         = 45, // for skill slowdown
 	SC_BLEEDING         = 124, // Temporarily same id as headcrush
-	SC_POISON2			= 193, // for EDP -- notes: Not implemented since damage unknown yet
-	SC_GRIMTOOTH        = 194, // for grimtooth's slowdown
+	SC_POISON2			= 193, // for EDP -- notes: Not implemented since damage unknown yet	
+	SC_BLOCKSKILL       = 194, // for disallowing the use of a skill for a time period
 
 // -- testing various SC effects
 //	SC_AURABLADE			=81,