Bladeren bron

Several no-damage status change skills updated
* Scream and Frost Joke (fixes #945)
-- The delay until the status change kicks in was increased from 2s to 3s
-- Aftercast delay in pre-renewal was increased from 3s to 4s (already 4s in renewal)
-- Duration of Freeze from Frost Joke increased from 10-14s to 30s
* Hammer Fall, Lex Divina and offensive Status Recovery (fixes #945)
-- A delay of 1 second until the status change kicks in was added
-- Hammer Fall will hit the targets that are in the AoE before the delay (so you can't dodge)
-- Offensive Status Recovery's base duration reduced from 30s to 20s and base chance increased to 100%
-- Increased the maximum number of skill timers from 15 to 40 as they are needed for delayed status changes
* Stone and Freeze now remove Lex Aeterna (fixes #947)
-- For stone this refers to the second phase
* Scream, Frost Joke and Hammer Fall no longer make a target stop (fixes #948)
-- Similar behavior to e.g. Ankle Snare against bosses or in WoE
-- If the target was singing/dancing, it will still stop and the song/dance will be canceled
-- Fixed a bug that caused position lag when targets that are still moving but can't move anymore are hit

Playtester 9 jaren geleden
bovenliggende
commit
f5ea1dcb3e
7 gewijzigde bestanden met toevoegingen van 34 en 23 verwijderingen
  1. 4 4
      db/pre-re/skill_cast_db.txt
  2. 3 3
      db/re/skill_cast_db.txt
  3. 1 1
      src/map/battle.c
  4. 12 13
      src/map/skill.c
  5. 1 1
      src/map/skill.h
  6. 10 0
      src/map/status.c
  7. 3 1
      src/map/unit.c

+ 4 - 4
db/pre-re/skill_cast_db.txt

@@ -135,7 +135,7 @@
 //-- PR_SLOWPOISON
 71,0,0,0,10000:20000:30000:40000,0,0
 //-- PR_STRECOVERY
-72,0,2000,0,0,30000,0
+72,0,2000,0,0,20000,0
 //-- PR_KYRIE
 73,2000,2000,0,120000,0,0
 //-- PR_MAGNIFICAT
@@ -143,7 +143,7 @@
 //-- PR_GLORIA
 75,0,2000,0,10000:15000:20000:25000:30000,0,0
 //-- PR_LEXDIVINA
-76,0,3000,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0,0
+76,0,3000,0,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0
 //-- PR_TURNUNDEAD
 77,1000,3000,0,0,0,0
 //-- PR_LEXAETERNA
@@ -472,7 +472,7 @@
 //-- BA_DISSONANCE
 317,0,0,0,30000,3000,0
 //-- BA_FROSTJOKE
-318,0,3000,0,0,10000:11000:12000:13000:14000,0
+318,0,4000,0,0,30000,0
 //-- BA_WHISTLE
 319,0,0,0,60000,20000,0
 //-- BA_ASSASSINCROSS
@@ -490,7 +490,7 @@
 //-- DC_UGLYDANCE
 325,0,0,0,30000,3000,0
 //-- DC_SCREAM
-326,0,3000,0,0,5000,0
+326,0,4000,0,0,5000,0
 //-- DC_HUMMING
 327,0,0,0,60000,20000,0
 //-- DC_DONTFORGETME

+ 3 - 3
db/re/skill_cast_db.txt

@@ -135,7 +135,7 @@
 //-- PR_SLOWPOISON
 71,0,0,0,10000:20000:30000:40000,0,0,0
 //-- PR_STRECOVERY
-72,0,2000,0,0,30000,0,0
+72,0,2000,0,0,20000,0,0
 //-- PR_KYRIE
 73,1600,2000,0,120000,0,0,400
 //-- PR_MAGNIFICAT
@@ -143,7 +143,7 @@
 //-- PR_GLORIA
 75,0,2000,0,10000:15000:20000:25000:30000,0,0,0
 //-- PR_LEXDIVINA
-76,0,3000,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0,0,0
+76,0,3000,0,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0,0
 //-- PR_TURNUNDEAD
 77,800,3000,0,0,0,0,200
 //-- PR_LEXAETERNA
@@ -466,7 +466,7 @@
 //-- BA_DISSONANCE
 317,0,0,0,30000,3000,0,0
 //-- BA_FROSTJOKER
-318,0,4000,0,0,10000:11000:12000:13000:14000,0,0
+318,0,4000,0,0,30000,0,0
 //-- BA_WHISTLE
 319,0,0,0,60000,20000,0,0
 //-- BA_ASSASSINCROSS

+ 1 - 1
src/map/battle.c

@@ -252,7 +252,7 @@ struct block_list* battle_getenemyarea(struct block_list *src, int x, int y, int
 * @param skill_lv: Level of skill used
 * @param skill_id: ID o skill used
 * @param dmg_lv: State of the attack (miss, etc.)
-* @param attack_type: Damage delay
+* @param attack_type: Type of the attack (BF_NORMAL|BF_SKILL|BF_SHORT|BF_LONG|BF_WEAPON|BF_MAGIC|BF_MISC)
 * @param additional_effects: Whether additional effect should be applied
 * @param tick: Current tick
 *------------------------------------------*/

+ 12 - 13
src/map/skill.c

@@ -3892,6 +3892,11 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
 					map_foreachinarea(skill_frostjoke_scream,skl->map,skl->x-range,skl->y-range,
 						skl->x+range,skl->y+range,BL_CHAR,src,skl->skill_id,skl->skill_lv,tick);
 					break;
+				case PR_LEXDIVINA:
+				case PR_STRECOVERY:
+				case BS_HAMMERFALL:
+					sc_start(src, target, status_skill2sc(skl->skill_id), skl->type, skl->skill_lv, skill_get_time2(skl->skill_id, skl->skill_lv));
+					break;
 				case NPC_EARTHQUAKE:
 					if( skl->type > 1 )
 						skill_addtimerskill(src,tick+250,src->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag);
@@ -5998,10 +6003,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 
 	case PR_LEXDIVINA:
 	case MER_LEXDIVINA:
-		if( tsce )
-			status_change_end(bl,type, INVALID_TIMER);
+		if (tsce)
+			status_change_end(bl, type, INVALID_TIMER);
 		else
-			sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv));
+			skill_addtimerskill(src, tick+1000, bl->id, 0, 0, skill_id, skill_lv, 100, flag);
 		clif_skill_nodamage (src, bl, skill_id, skill_lv, 1);
 		break;
 
@@ -6699,9 +6704,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 		break;
 
 	case BS_HAMMERFALL:
-		clif_skill_nodamage(src,bl,skill_id,skill_lv,
-			sc_start(src,bl,SC_STUN,(20 + 10 * skill_lv),skill_lv,skill_get_time2(skill_id,skill_lv)));
+		skill_addtimerskill(src, tick+1000, bl->id, 0, 0, skill_id, skill_lv, (20 + 10 * skill_lv), flag);
 		break;
+
 	case RG_RAID:
 		skill_area_temp[1] = 0;
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
@@ -6971,7 +6976,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case BA_FROSTJOKER:
 	case DC_SCREAM:
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
-		skill_addtimerskill(src,tick+2000,bl->id,src->x,src->y,skill_id,skill_lv,0,flag);
+		skill_addtimerskill(src,tick+3000,bl->id,src->x,src->y,skill_id,skill_lv,0,flag);
 
 		if (md) {
 			// custom hack to make the mob display the skill, because these skills don't show the skill use text themselves
@@ -7098,14 +7103,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			status_change_end(bl, SC_WHITEIMPRISON, INVALID_TIMER);
 		}
 		status_change_end(bl, SC_STASIS, INVALID_TIMER);
-		//Is this equation really right? It looks so... special.
 		if(battle_check_undead(tstatus->race,tstatus->def_ele))
-		{
-			status_change_start(src,bl, SC_BLIND,
-				100*(100-(tstatus->int_/2+tstatus->vit/3+tstatus->luk/10)),
-				1,0,0,0,
-				skill_get_time2(skill_id, skill_lv) * (100-(tstatus->int_+tstatus->vit)/2)/100,SCSTART_NONE);
-		}
+			skill_addtimerskill(src, tick+1000, bl->id, 0, 0, skill_id, skill_lv, 100, flag);
 		clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 		if(dstmd)
 			mob_unlocktarget(dstmd,tick);

+ 1 - 1
src/map/skill.h

@@ -242,7 +242,7 @@ struct s_skill_nounit_layout {
 	int dy[MAX_SKILL_UNIT_COUNT];
 };
 
-#define MAX_SKILLTIMERSKILL 15
+#define MAX_SKILLTIMERSKILL 40
 struct skill_timerskill {
 	int timer;
 	int src_id;

+ 10 - 0
src/map/status.c

@@ -255,6 +255,7 @@ void initChangeTables(void)
 	set_sc( PR_KYRIE		, SC_KYRIE		, SI_KYRIE		, SCB_NONE );
 	set_sc( PR_MAGNIFICAT		, SC_MAGNIFICAT		, SI_MAGNIFICAT		, SCB_REGEN );
 	set_sc( PR_GLORIA		, SC_GLORIA		, SI_GLORIA		, SCB_LUK );
+	add_sc( PR_STRECOVERY		, SC_BLIND		);
 	add_sc( PR_LEXDIVINA		, SC_SILENCE		);
 	set_sc( PR_LEXAETERNA		, SC_AETERNA		, SI_AETERNA		, SCB_NONE );
 	add_sc( WZ_METEOR		, SC_STUN		);
@@ -262,6 +263,7 @@ void initChangeTables(void)
 	add_sc( WZ_FROSTNOVA		, SC_FREEZE		);
 	add_sc( WZ_STORMGUST		, SC_FREEZE		);
 	set_sc( WZ_QUAGMIRE		, SC_QUAGMIRE		, SI_QUAGMIRE		, SCB_AGI|SCB_DEX|SCB_ASPD|SCB_SPEED );
+	add_sc( BS_HAMMERFALL		, SC_STUN		);
 	set_sc( BS_ADRENALINE		, SC_ADRENALINE		, SI_ADRENALINE		, SCB_ASPD );
 	set_sc( BS_WEAPONPERFECT	, SC_WEAPONPERFECTION	, SI_WEAPONPERFECTION	, SCB_NONE );
 	set_sc( BS_OVERTHRUST		, SC_OVERTHRUST		, SI_OVERTHRUST		, SCB_NONE );
@@ -8355,6 +8357,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		if (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF)
 			status_change_end(bl, SC_GOSPEL, INVALID_TIMER);
 		break;
+	case SC_FREEZE:
+		status_change_end(bl, SC_AETERNA, INVALID_TIMER);
+		break;
 	case SC_HIDING:
 		status_change_end(bl, SC_CLOSECONFINE, INVALID_TIMER);
 		status_change_end(bl, SC_CLOSECONFINE2, INVALID_TIMER);
@@ -10465,6 +10470,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 	switch (type) {
 		case SC_FREEZE:
 		case SC_STUN:
+			if(sc->data[SC_DANCING])
+				unit_stop_walking(bl, 1);
 		case SC_SLEEP:
 		case SC_STONE:
 		case SC_WHITEIMPRISON:
@@ -10480,6 +10487,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		// Fall through
 		case SC_CURSEDCIRCLE_ATKER:
 			unit_stop_attack(bl);
+			if (type == SC_FREEZE || type == SC_STUN)
+				break; //Handled above
 		// Fall through
 		case SC_STOP:
 		case SC_CONFUSION:
@@ -11880,6 +11889,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
 			sce->val4 = 0;
 			unit_stop_walking(bl,1);
 			unit_stop_attack(bl);
+			status_change_end(bl, SC_AETERNA, INVALID_TIMER);
 			sc->opt1 = OPT1_STONE;
 			clif_changeoption(bl);
 			sc_timer_next(1000+tick,status_change_timer, bl->id, data );

+ 3 - 1
src/map/unit.c

@@ -1436,8 +1436,10 @@ int unit_set_walkdelay(struct block_list *bl, unsigned int tick, int delay, int
 			return 0;
 	} else {
 		// Don't set walk delays when already trapped.
-		if (!unit_can_move(bl))
+		if (!unit_can_move(bl)) {
+			unit_stop_walking(bl,4); //Unit might still be moving even though it can't move
 			return 0;
+		}
 		//Immune to being stopped for double the flinch time
 		if (DIFF_TICK(ud->canmove_tick, tick-delay) > 0)
 			return 0;