Ver Fonte

Star Gladiator Heat Official Behavior (#8800)

- Heat now has an interval of 20ms instead of 100ms
- Heat no longer has an aftercast delay
- Knockback of Heat is now a random value between 2 and 5 cells
- Heat now drains 10 SP on players per interval (500 SP per second)
- Heat now has an 80% chance to not activate on bosses per interval
- Heat no longer has an SP penalty when it misses
- Heat now fails when it's already active
- If Heat fails, you will now do the "T-Pose" animation without the effect activating instead of getting a skill failed message
- Fixed order of packets sent to the client (prevents position lag)
- Fixes #8799
Playtester há 6 meses atrás
pai
commit
e1ec8c15d9
4 ficheiros alterados com 45 adições e 28 exclusões
  1. 3 6
      db/pre-re/skill_db.yml
  2. 3 3
      db/re/skill_db.yml
  3. 6 0
      src/map/battle.cpp
  4. 33 19
      src/map/skill.cpp

+ 3 - 6
db/pre-re/skill_db.yml

@@ -11618,7 +11618,6 @@ Body:
     SplashArea: 1
     Knockback: 2
     CastCancel: true
-    AfterCastActDelay: 1000
     Duration1:
       - Level: 1
         Time: 10000
@@ -11631,7 +11630,7 @@ Body:
     Unit:
       Id: Dummyskill
       Range: 1
-      Interval: 100
+      Interval: 20
       Target: Enemy
     Status: Warm
   - Id: 429
@@ -11652,7 +11651,6 @@ Body:
     SplashArea: 1
     Knockback: 2
     CastCancel: true
-    AfterCastActDelay: 1000
     Duration1:
       - Level: 1
         Time: 10000
@@ -11665,7 +11663,7 @@ Body:
     Unit:
       Id: Dummyskill
       Range: 1
-      Interval: 100
+      Interval: 20
       Target: Enemy
     Status: Warm
   - Id: 430
@@ -11686,7 +11684,6 @@ Body:
     SplashArea: 1
     Knockback: 2
     CastCancel: true
-    AfterCastActDelay: 1000
     Duration1:
       - Level: 1
         Time: 10000
@@ -11699,7 +11696,7 @@ Body:
     Unit:
       Id: Dummyskill
       Range: 1
-      Interval: 100
+      Interval: 20
       Target: Enemy
     Status: Warm
   - Id: 431

+ 3 - 3
db/re/skill_db.yml

@@ -11904,7 +11904,7 @@ Body:
     Unit:
       Id: Dummyskill
       Range: 1
-      Interval: 100
+      Interval: 20
       Target: Enemy
     Status: Warm
   - Id: 429
@@ -11937,7 +11937,7 @@ Body:
     Unit:
       Id: Dummyskill
       Range: 1
-      Interval: 100
+      Interval: 20
       Target: Enemy
     Status: Warm
   - Id: 430
@@ -11970,7 +11970,7 @@ Body:
     Unit:
       Id: Dummyskill
       Range: 1
-      Interval: 100
+      Interval: 20
       Target: Enemy
     Status: Warm
   - Id: 431

+ 6 - 0
src/map/battle.cpp

@@ -7252,6 +7252,12 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
 			case TK_TURNKICK:
 				wd.blewcount = 0;
 				break;
+			case SG_SUN_WARM:
+			case SG_MOON_WARM:
+			case SG_STAR_WARM:
+				// A random 0~3 knockback bonus is added to the base knockback
+				wd.blewcount += rnd_value(0, 3);
+				break;
 #ifdef RENEWAL
 			case KN_BOWLINGBASH:
 				if (sd && sd->status.weapon == W_2HSWORD) {

+ 33 - 19
src/map/skill.cpp

@@ -16107,14 +16107,18 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
 					//If target isn't knocked back it should hit every "interval" ms [Playtester]
 					do {
 						if( bl->type == BL_PC )
-							status_zap(bl, 0, 15); // sp damage to players
-						else // mobs
-						if( status_charge(ss, 0, 2) ) { // costs 2 SP per hit
-							if( !skill_attack(BF_WEAPON,ss,&unit->bl,bl,sg->skill_id,sg->skill_lv,tick+(t_tick)count*sg->interval,0) )
-								status_charge(ss, 0, 8); //costs additional 8 SP if miss
-						} else { //should end when out of sp.
-							sg->limit = DIFF_TICK(tick,sg->tick);
-							break;
+							status_zap(bl, 0, 10); // sp damage to players
+						else { // mobs
+							// Bosses trigger the effect only 1 out of 5 times
+							if (status_get_class_(bl) == CLASS_BOSS && rnd_chance(4, 5))
+								continue;
+							// costs 2 SP per hit
+							if (!status_charge(ss, 0, 2)) {
+								//should end when out of sp.
+								sg->limit = DIFF_TICK(tick, sg->tick);
+								break;
+							}
+							skill_attack(BF_WEAPON, ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick + (t_tick)count * sg->interval, 0);
 						}
 					} while(sg->interval > 0 && x == bl->x && y == bl->y &&
 						++count < SKILLUNITTIMER_INTERVAL/sg->interval && !status_isdead(*bl) );
@@ -17813,17 +17817,6 @@ bool skill_check_condition_castbegin( map_session_data& sd, uint16 skill_id, uin
 				return false;
 			}
 			break;
-		case SG_SUN_WARM:
-		case SG_MOON_WARM:
-		case SG_STAR_WARM:
-			if (sc && sc->getSCE(SC_MIRACLE))
-				break;
-			i = skill_id-SG_SUN_WARM;
-			if (sd.bl.m == sd.feel_map[i].m)
-				break;
-			clif_skill_fail( sd, skill_id );
-			return false;
-			break;
 		case SG_SUN_COMFORT:
 		case SG_MOON_COMFORT:
 		case SG_STAR_COMFORT:
@@ -18524,6 +18517,10 @@ bool skill_check_condition_castend( map_session_data& sd, uint16 skill_id, uint1
 		return false;
 	}
 
+	status_change* sc = &sd.sc;
+	if (!sc->count)
+		sc = nullptr;
+
 	// perform skill-specific checks (and actions)
 	switch( skill_id ) {
 		case PR_BENEDICTIO:
@@ -18546,6 +18543,23 @@ bool skill_check_condition_castend( map_session_data& sd, uint16 skill_id, uint1
 			}
 			break;
 		}
+		case SG_SUN_WARM:
+		case SG_MOON_WARM:
+		case SG_STAR_WARM:
+			if (sc != nullptr) {
+				// Skill fails when already active
+				if (sc->getSCE(SC_WARM)) {
+					clif_skill_nodamage(&sd.bl, sd.bl, skill_id, skill_lv, 0);
+					return false;
+				}
+				// When having Miracle, skill succeeds regardless of map
+				if (sc->getSCE(SC_MIRACLE))
+					break;
+			}
+			if (sd.bl.m == sd.feel_map[skill_id - SG_SUN_WARM].m)
+				break;
+			clif_skill_nodamage(&sd.bl, sd.bl, skill_id, skill_lv, 0);
+			return false;
 		case NC_SILVERSNIPER:
 		case NC_MAGICDECOY: {
 				int c = 0;