瀏覽代碼

- Support for SP Regen status just like HP Regen (by items, by a little time). Required in some new items from Ep 12.1

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@12743 54d463be-8e91-2dee-dedb-b68131a5f0ec
zephyrus 17 年之前
父節點
當前提交
4ced695e7e
共有 4 個文件被更改,包括 14 次插入8 次删除
  1. 1 0
      db/const.txt
  2. 1 1
      src/map/pc.c
  3. 11 7
      src/map/status.c
  4. 1 0
      src/map/status.h

+ 1 - 0
db/const.txt

@@ -789,6 +789,7 @@ SC_SPCOST_RATE	272
 SC_COMMONSC_RESIST	273
 SC_SEVENWIND	274
 SC_DEF_RATE	275
+SC_SPREGEN	276
 
 e_gasp	0
 e_what	1

+ 1 - 1
src/map/pc.c

@@ -6645,7 +6645,7 @@ int pc_checkitem(struct map_session_data *sd)
 		if(!sd->status.inventory[i].equip)
 			continue;
 
-		if	(sd->status.inventory[i].equip&~pc_equippoint(sd,i)) {
+		if(sd->status.inventory[i].equip&~pc_equippoint(sd,i)) {
 			sd->status.inventory[i].equip=0;
 			calc_flag = 1;
 			continue;

+ 11 - 7
src/map/status.c

@@ -4970,6 +4970,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 					return 0;
 			break;
 			case SC_HPREGEN:
+			case SC_SPREGEN:
 			case SC_STUN:
 			case SC_SLEEP:
 			case SC_POISON:
@@ -5291,6 +5292,7 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val
 			tick = 10000;
 			break;
 		case SC_HPREGEN:
+		case SC_SPREGEN:
 			if( val1 == 0 ) return 0;
 			// val1 = heal percent/amout
 			// val2 = seconds between heals
@@ -6924,15 +6926,17 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr data)
 		break;
 
 	case SC_HPREGEN:
+	case SC_SPREGEN:
 		if( sd && --(sce->val4) >= 0 )
 		{
-			if( status->hp < status->max_hp )
-			{
-				// val1 < 0 = per maxhp %
-				// val1 > 0 = exact amount
-				int hp = (sce->val1 < 0) ? (int)(sd->status.max_hp * -1 * sce->val1 / 100.) : sce->val1 ;
-				status_heal(bl, hp, 0, 2);
-			}
+			// val1 < 0 = per max% | val1 > 0 = exact amount
+			int hp = 0, sp = 0;
+			if( type == SC_HPREGEN && status->hp < status->max_hp )
+				hp = (sce->val1 < 0) ? (int)(sd->status.max_hp * -1 * sce->val1 / 100.) : sce->val1 ;
+			else if( type == SC_SPREGEN && status->sp < status->max_sp )
+				sp = (sce->val1 < 0) ? (int)(sd->status.max_sp * -1 * sce->val1 / 100.) : sce->val1 ;
+
+			status_heal(bl, hp, sp, 2);
 			sc_timer_next((sce->val2 * 1000) + tick, status_change_timer, bl->id, data );
 			return 0;
 		}

+ 1 - 0
src/map/status.h

@@ -293,6 +293,7 @@ typedef enum sc_type {
 	SC_COMMONSC_RESIST,
 	SC_SEVENWIND,
 	SC_DEF_RATE,
+	SC_SPREGEN,
 	SC_MAX, //Automatically updated max, used in for's to check we are within bounds.
 } sc_type;