summaryrefslogtreecommitdiff
path: root/src/map/atcommand.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/atcommand.c')
-rw-r--r--src/map/atcommand.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index b2830d41c..4020b82e3 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -230,6 +230,8 @@ ATCOMMAND_FUNC(sound); // [Valaris]
ATCOMMAND_FUNC(refreshonline); // [Valaris]
#endif /* TXT_ONLY */
+ATCOMMAND_FUNC(skilltree); // by MouseJstr
+
/*==========================================
*AtCommandInfo atcommand_info[]構造体の定義
*------------------------------------------
@@ -480,6 +482,7 @@ static AtCommandInfo atcommand_info[] = {
{ AtCommand_RefreshOnline, "@refreshonline", 99, atcommand_refreshonline }, // [Valaris]
#endif /* TXT_ONLY */
+ { AtCommand_SkillTree, "@skilltree", 40, atcommand_skilltree }, // [MouseJstr]
// add new commands before this line
{ AtCommand_Unknown, NULL, 1, NULL }
@@ -7142,6 +7145,7 @@ atcommand_skillid(const int fd, struct map_session_data* sd,
}
return 0;
}
+
/*==========================================
* @useskill by [MouseJstr]
*
@@ -7177,6 +7181,88 @@ atcommand_useskill(const int fd, struct map_session_data* sd,
return 0;
}
+
+/*==========================================
+ * @skilltree by [MouseJstr]
+ *
+ * prints the skill tree for a player required to get to a skill
+ *------------------------------------------
+ */
+int
+atcommand_skilltree(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd = NULL;
+ int skillnum, skillidx = -1;
+ int meets = 1, j, c=0, s=0;
+ struct pc_base_job s_class;
+ char target[255], *tbl;
+ char output[255];
+
+ if (!message || !*message)
+ return -1;
+
+ if(sscanf(message, "%d %[^\r\n]", &skillnum, target) != 2) {
+ clif_displaymessage(fd, "Usage: @skilltree <skillnum> <target>");
+ return -1;
+ }
+ if((pl_sd=map_nick2sd(target)) == NULL)
+ return -1;
+
+ s_class = pc_calc_base_job(pl_sd->status.class);
+ c = s_class.job;
+ s = s_class.upper;
+
+ c = pc_calc_skilltree_normalize_job(c, pl_sd);
+
+ tbl = job_name(c);
+
+ sprintf(output, "Player is using %s %s skill tree (%d basic points)",
+ s_class.upper ? "upper" : "lower",
+ tbl, pc_checkskill(pl_sd, 1));
+ clif_displaymessage(fd, output);
+
+ for (j = 0; j < MAX_SKILL; j++) {
+ if (skill_tree[s][c][j].id == skillnum) {
+ skillidx = j;
+ break;
+ }
+ }
+
+ if (skillidx == -1) {
+ sprintf(output, "I do not believe the player can use that skill");
+ clif_displaymessage(fd, output);
+ return 0;
+ }
+
+ struct skill_tree_entry *ent = &skill_tree[s][c][skillidx];
+
+ for(j=0;j<5;j++)
+ if( ent->need[j].id &&
+ pc_checkskill(sd,ent->need[j].id) < ent->need[j].lv)
+ {
+ int idx = 0;
+ char *desc;
+ while (skill_names[idx].id != 0 && skill_names[idx].id != ent->need[j].id)
+ idx++;
+ if (skill_names[idx].id == 0)
+ desc = "Unknown skill";
+ else
+ desc = skill_names[idx].desc;
+ sprintf(output, "player requires level %d of skill %s",
+ ent->need[j].lv, desc);
+ clif_displaymessage(fd, output);
+ meets = 0;
+ }
+
+ if (meets == 1) {
+ sprintf(output, "I believe the player meets all the requirements for that skill");
+ clif_displaymessage(fd, output);
+ }
+
+ return 0;
+}
+
/*==========================================
* It is made to rain.
*------------------------------------------