فهرست منبع

Fixed Soul Reaper's Soul Collect behavior

Added missing status change cancel condition, when the player has reached the maximum amount of soul spheres.
Fixed duration display on the client.
Some cleanup of duplicate code.

Thanks to @aleos89
Lemongrass3110 5 سال پیش
والد
کامیت
6570489a84
2فایلهای تغییر یافته به همراه13 افزوده شده و 10 حذف شده
  1. 6 8
      src/map/skill.cpp
  2. 7 2
      src/map/status.cpp

+ 6 - 8
src/map/skill.cpp

@@ -7718,21 +7718,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case SJ_STARSTANCE:
 	case SJ_UNIVERSESTANCE:
 	case SJ_SUNSTANCE:
+	case SP_SOULCOLLECT:
 		if( tsce )
 		{
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,status_change_end(bl, type, INVALID_TIMER));
 			map_freeblock_unlock();
 			return 0;
 		}
-		clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
-		break;
-	case SP_SOULCOLLECT:
-		if (tsce) {
-			clif_skill_nodamage(src, bl, skill_id, skill_lv, status_change_end(bl, type, INVALID_TIMER));
-			map_freeblock_unlock();
-			return 0;
+
+		if( skill_id == SP_SOULCOLLECT ){
+			clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, pc_checkskill(sd, SP_SOULENERGY), max(1000, skill_get_time(skill_id, skill_lv))));
+		}else{
+			clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)));
 		}
-		clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, pc_checkskill(sd,SP_SOULENERGY), max(1000, skill_get_time(skill_id, skill_lv))));
 		break;
 	case SL_KAITE:
 	case SL_KAAHI:

+ 7 - 2
src/map/status.cpp

@@ -11950,6 +11950,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		case SC_SOULCOLLECT:
 			val2 = 5 + 3 * val2; // Max Soul Sphere's.
 			val3 = tick > 0 ? tick : 60000;
+			tick_time = tick;
+			tick = INFINITE_TICK;
 			break;
 		case SC_SP_SHA:
 			val2 = 50; // Move speed reduction
@@ -14570,8 +14572,11 @@ TIMER_FUNC(status_change_timer){
 		break;
 	case SC_SOULCOLLECT:
 		pc_addsoulball(sd, skill_get_time2(SP_SOULCOLLECT, sce->val1), sce->val2);
-		sc_timer_next(sce->val3 + tick);
-		return 0;
+		if( sd->soulball < sce->val2 ){
+			sc_timer_next(sce->val3 + tick);
+			return 0;
+		}
+		break;
 	}
 
 	// If status has an interval and there is at least 100ms remaining time, wait for next interval