summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/script_commands.txt8
-rw-r--r--sql-files/upgrades/index.txt3
-rw-r--r--src/common/console.c83
-rw-r--r--src/common/console.h12
-rw-r--r--src/map/clif.c10
-rw-r--r--src/map/pc.c22
6 files changed, 115 insertions, 23 deletions
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index 767aa5459..f6cad66d5 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -5393,8 +5393,9 @@ will retain the default behavior of the command.
*statusup <stat>;
This command will bump a specified stat of the invoking character up by
-one permanently. Stats are to be given as number, but you can use these
-constants to replace them:
+one permanently using status points to do so, if there aren't enough to perform
+the change nothing will happen.
+Stats are to be given as number, but you can use these constants to replace them:
bStr - Strength
bVit - Vitality
@@ -5408,7 +5409,8 @@ bLuk - Luck
*statusup2 <stat>,<amount>;
This command will bump a specified stat of the invoking character up by
-the specified amount permanently. Amount can be negative. See 'statusup'.
+the specified amount permanently without using status points.
+Amount can be negative. See 'statusup'.
// This will decrease a character's Vit forever.
statusup bVit,-1;
diff --git a/sql-files/upgrades/index.txt b/sql-files/upgrades/index.txt
index 39fbd0070..1c25d8210 100644
--- a/sql-files/upgrades/index.txt
+++ b/sql-files/upgrades/index.txt
@@ -18,4 +18,5 @@
2013-12-24--00-15.sql
2014-01-04--16-47.sql
2014-01-06--17-22.sql
-2014-02-19--17-57.sql \ No newline at end of file
+2014-02-19--17-57.sql
+2014-03-25--23-57.sql \ No newline at end of file
diff --git a/src/common/console.c b/src/common/console.c
index 94824dc25..ec228b563 100644
--- a/src/common/console.c
+++ b/src/common/console.c
@@ -82,15 +82,35 @@ int console_parse_key_pressed(void) {
return FD_ISSET(STDIN_FILENO, &fds);
}
#endif /* _WIN32 */
-CPCMD(exit) {
+
+/*======================================
+ * CORE: Console commands
+ *--------------------------------------*/
+
+/**
+ * Stops server
+ **/
+CPCMD_C(exit,server) {
runflag = 0;
}
-CPCMD(ers_report) {
+
+/**
+ * Displays ERS-related statistics (Entry Reusage System)
+ **/
+CPCMD_C(ers_report,server) {
ers_report();
}
-CPCMD(mem_report) {
+
+/**
+ * Displays memory usage
+ **/
+CPCMD_C(mem_report,server) {
memmgr_report(line?atoi(line):0);
}
+
+/**
+ * Displays command list
+ **/
CPCMD(help) {
unsigned int i = 0;
for ( i = 0; i < console->cmd_list_count; i++ ) {
@@ -102,22 +122,61 @@ CPCMD(help) {
}
}
}
-/* [Ind/Hercules] */
-CPCMD(malloc_usage) {
+
+/**
+ * [Ind/Hercules]
+ * Displays current malloc usage
+ */
+CPCMD_C(malloc_usage,server) {
unsigned int val = (unsigned int)iMalloc->usage();
ShowInfo("malloc_usage: %.2f MB\n",(double)(val)/1024);
}
-CPCMD(skip) {
+
+/**
+ * Skips an sql update
+ * Usage: sql update skip UPDATE-FILE.sql
+ **/
+CPCMD_C(skip,update) {
if( !line ) {
ShowDebug("usage example: sql update skip 2013-02-14--16-15.sql\n");
return;
}
Sql_HerculesUpdateSkip(console->SQL, line);
}
+
+/**
+ * Defines a main category
+ * Categories can't be used as commands!
+ * E.G.
+ * sql update skip
+ * 'sql' is the main category
+ * CP_DEF_C(category)
+ **/
#define CP_DEF_C(x) { #x , NULL , NULL, NULL }
+/**
+ * Defines a sub-category
+ * Sub-categories can't be used as commands!
+ * E.G.
+ * sql update skip
+ * 'update' is a sub-category
+ * CP_DEF_C2(command, category)
+ **/
#define CP_DEF_C2(x,y) { #x , NULL , #y, NULL }
-#define CP_DEF_S(x,y) { #x , console_parse_ ## x , #y, NULL }
-#define CP_DEF(x) { #x , console_parse_ ## x , NULL, NULL }
+/**
+ * Defines a command that is inside a category or sub-category
+ * CP_DEF_S(command, category/sub-category)
+ **/
+#define CP_DEF_S(x,y) { #x, CPCMD_C_A(x,y), #y, NULL }
+/**
+ * Defines a command that is _not_ inside any category
+ * CP_DEF_S(command)
+ **/
+#define CP_DEF(x) { #x , CPCMD_A(x), NULL, NULL }
+
+/**
+ * Loads console commands list
+ * See CP_DEF_C, CP_DEF_C2, CP_DEF_S, CP_DEF
+ **/
void console_load_defaults(void) {
struct {
char *name;
@@ -126,11 +185,17 @@ void console_load_defaults(void) {
struct CParseEntry *self;
} default_list[] = {
CP_DEF(help),
+ /**
+ * Server related commands
+ **/
CP_DEF_C(server),
CP_DEF_S(ers_report,server),
CP_DEF_S(mem_report,server),
CP_DEF_S(malloc_usage,server),
CP_DEF_S(exit,server),
+ /**
+ * Sql related commands
+ **/
CP_DEF_C(sql),
CP_DEF_C2(update,sql),
CP_DEF_S(skip,update),
@@ -305,7 +370,7 @@ void console_parse_sub(char *line) {
cmd = cmd->u.next[i];
len += snprintf(sublist + len,CP_CMD_LENGTH * 5,":%s", cmd->cmd);
}
- ShowError("it is only a category, type '"CL_WHITE"%s help"CL_RESET"' to list its subcommands\n",sublist);
+ ShowError("Is only a category, type '"CL_WHITE"%s help"CL_RESET"' to list its subcommands\n",sublist);
}
}
void console_parse(char* line) {
diff --git a/src/common/console.h b/src/common/console.h
index 513c769ff..bd1de4cbf 100644
--- a/src/common/console.h
+++ b/src/common/console.h
@@ -16,9 +16,21 @@
**/
#define CONSOLE_PARSE_SIZE 10
+/**
+ * Default parsing function abstract prototype
+ **/
typedef void (*CParseFunc)(char *line);
+
+/**
+ * Console parsing function prototypes
+ * CPCMD: Console Parsing CoMmand
+ * x - command
+ * y - category
+ **/
#define CPCMD(x) void console_parse_ ##x (char *line)
#define CPCMD_A(x) console_parse_ ##x
+#define CPCMD_C(x,y) void console_parse_ ##y ##x (char *line)
+#define CPCMD_C_A(x,y) console_parse_ ##y ##x
#define CP_CMD_LENGTH 20
struct CParseEntry {
diff --git a/src/map/clif.c b/src/map/clif.c
index e78c034cb..2dbe7cb96 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -11177,7 +11177,15 @@ void clif_parse_ChangeCart(int fd,struct map_session_data *sd)
/// Old clients send always 1 for this, even when using /str+ and the like.
/// Newer clients (2013-12-23 and newer) send the correct amount.
void clif_parse_StatusUp(int fd,struct map_session_data *sd) {
- pc->statusup(sd,RFIFOW(fd,2), RFIFOB(fd, 4));
+ int increase_amount;
+
+ increase_amount = RFIFOB(fd,4);
+ if( increase_amount < 0 )
+ {
+ ShowDebug("clif_parse_StatusUp: Negative 'increase' value sent by client! (fd: %d, value: %d)\n",
+ fd, increase_amount);
+ }
+ pc->statusup(sd, RFIFOW(fd,2), increase_amount);
}
diff --git a/src/map/pc.c b/src/map/pc.c
index 268125ae1..249b5f0b1 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -6220,7 +6220,7 @@ int pc_maxparameterincrease(struct map_session_data* sd, int type) {
/**
* Raises a stat by the specified amount.
* Obeys max_parameter limits.
- * Subtracts stat points.
+ * Does not subtract stat points.
*
* @param sd The target character.
* @param type The stat to change (see enum _sp)
@@ -6275,12 +6275,16 @@ bool pc_statusup(struct map_session_data* sd, int type, int increase) {
return true;
}
-/// Raises a stat by the specified amount.
-/// Obeys max_parameter limits.
-/// Does not subtract stat points.
-///
-/// @param type The stat to change (see enum _sp)
-/// @param val The stat increase amount.
+/**
+ * Raises a stat by the specified amount.
+ * Obeys max_parameter limits.
+ * Subtracts stat points.
+ *
+ * @param sd The target character.
+ * @param type The stat to change (see enum _sp)
+ * @param increase The stat increase amount.
+ * @return zero if no changes were made, otherwise returns stat increase amount
+ */
int pc_statusup2(struct map_session_data* sd, int type, int val)
{
int max, need;
@@ -6289,7 +6293,7 @@ int pc_statusup2(struct map_session_data* sd, int type, int val)
if( type < SP_STR || type > SP_LUK )
{
clif->statusupack(sd,type,0,0);
- return 1;
+ return 0;
}
need = pc->need_status_point(sd,type,1);
@@ -6309,7 +6313,7 @@ int pc_statusup2(struct map_session_data* sd, int type, int val)
if( val > 255 )
clif->updatestatus(sd,type); // send after the 'ack' to override the truncated value
- return 0;
+ return val;
}
/*==========================================