Jelajahi Sumber

Added script command sc_end_class (#2368)

* Added a new script command sc_end_class to remove status changes from any learned skills.
* Adjusted the custom Reset NPC to make use of this behavior.
Thanks to @sader1992!

* Follow up to f93680b
* Adjusted documentation.

* Follow up to f93680b
* Removed the check from script command resetskill.
* Added a new script command sc_end_class.

* Fixed a compile error
* Corrected the define of the script command.
* Adjusted some documentation.
* Reverted some formatting from the original commit.
Thanks to @sader1992 and @Lemongrass3110!
Aleos 7 tahun lalu
induk
melakukan
4539d557e2
3 mengubah file dengan 34 tambahan dan 11 penghapusan
  1. 8 4
      doc/script_commands.txt
  2. 2 7
      npc/custom/resetnpc.txt
  3. 24 0
      src/map/script.c

+ 8 - 4
doc/script_commands.txt

@@ -5316,10 +5316,11 @@ Used in reset NPC's (duh!)
 
 ---------------------------------------
 
-*sc_start 	<effect type>,<ticks>,<value 1>{,<rate>,<flag>{,<GID>}};
-*sc_start2 	<effect type>,<ticks>,<value 1>,<value 2>{,<rate>,<flag>{,<GID>}};
-*sc_start4 	<effect type>,<ticks>,<value 1>,<value 2>,<value 3>,<value 4>{,<rate>,<flag>{,<GID>}};
-*sc_end 	<effect type>{,<GID>};
+*sc_start <effect type>,<ticks>,<value 1>{,<rate>,<flag>{,<GID>}};
+*sc_start2 <effect type>,<ticks>,<value 1>,<value 2>{,<rate>,<flag>{,<GID>}};
+*sc_start4 <effect type>,<ticks>,<value 1>,<value 2>,<value 3>,<value 4>{,<rate>,<flag>{,<GID>}};
+*sc_end <effect type>{,<GID>};
+*sc_end_class {<char_id>};
 
 These commands will bestow a status effect on a character.
 
@@ -5357,6 +5358,9 @@ and theirs val1, val2, val3, and val4 usage in source.
 'sc_end' will remove a specified status effect. If SC_ALL (-1) is given, it will
 perform a complete removal of all statuses (although permanent ones will re-apply).
 
+'sc_end_class' works like 'sc_end' but will remove all status effects from any learned
+skill on the invoking character.
+
 Examples:
 	// This will poison the invoking character for 10 minutes at 50% chance.
 	sc_start SC_POISON,600000,0,5000;

+ 2 - 7
npc/custom/resetnpc.txt

@@ -1,11 +1,5 @@
 //===== rAthena Script =======================================
 //= Reset NPC
-//===== By: ==================================================
-//= rAthena Dev Team
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= rAthena Project
 //===== Description: =========================================
 //= Resets skills, stats, or both.
 //===== Additional Comments: =================================
@@ -15,6 +9,7 @@
 //= 1.3 All statuses removed upon skill reset. [Euphy]
 //= 1.4 Compressed Script, Added limit use option [Stolao]
 //=	Changed set -> setarray, Improved text with F_InsertPlural
+//= 1.5 Added sc_end_class to reset related status changes [sader1992]
 //============================================================
 prontera,150,193,4	script	Reset Girl	124,{
 	//	 		Skills,	Stats,	Both,	Limit
@@ -44,7 +39,7 @@ prontera,150,193,4	script	Reset Girl	124,{
 	}
 	set Zeny, Zeny-.@Reset[.@i-1];
 	if(.@i&1){
-		sc_end SC_ALL;// TODO make a sc_end current classes sc only
+		sc_end_class;
 		ResetSkill;
 	}
 	if(.@i&2) ResetStatus;

+ 24 - 0
src/map/script.c

@@ -11319,6 +11319,29 @@ BUILDIN_FUNC(sc_end)
 	return SCRIPT_CMD_SUCCESS;
 }
 
+/**
+ * Ends all status effects from any learned skill on the attached player.
+ * sc_end_class {<char_id>};
+ */
+BUILDIN_FUNC(sc_end_class)
+{
+	struct map_session_data *sd;
+	uint16 skill_id;
+	int i;
+
+	if (!script_charid2sd(2, sd))
+		return SCRIPT_CMD_FAILURE;
+
+	for (i = 0; i < MAX_SKILL_TREE && (skill_id = skill_tree[pc_class2idx(sd->status.class_)][i].skill_id) > 0; i++) { // Remove status specific to your current tree skills.
+		enum sc_type sc = status_skill2sc(skill_id);
+
+		if (sc > SC_COMMON_MAX && sd->sc.data[sc])
+			status_change_end(&sd->bl, sc, INVALID_TIMER);
+	}
+
+	return SCRIPT_CMD_SUCCESS;
+}
+
 /*==========================================
  * @FIXME atm will return reduced tick, 0 immune, 1 no tick
  *------------------------------------------*/
@@ -23747,6 +23770,7 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF2(sc_start,"sc_start2","iiii???"),
 	BUILDIN_DEF2(sc_start,"sc_start4","iiiiii???"),
 	BUILDIN_DEF(sc_end,"i?"),
+	BUILDIN_DEF(sc_end_class,"?"),
 	BUILDIN_DEF(getstatus, "i??"),
 	BUILDIN_DEF(getscrate,"ii?"),
 	BUILDIN_DEF(debugmes,"s"),