diff options
-rw-r--r-- | doc/script_commands.txt | 13 | ||||
-rw-r--r-- | src/map/script.c | 71 |
2 files changed, 84 insertions, 0 deletions
diff --git a/doc/script_commands.txt b/doc/script_commands.txt index e5663f7bf..cb7ded9df 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -7779,6 +7779,19 @@ Example: --------------------------------------- +*swap <variable>,<variable>; + +Swap the value of 2 variables. Both sides must be same integer or string type. + +Example: + .@var1 = 111; + .@var2 = 222; + swap .@var1, .@var2; + mes "var1 = "+ .@var1; // return 222 + mes "var2 = "+ .@var2; // return 111 + +--------------------------------------- + *query_sql("your MySQL query"{, <array variable>{, <array variable>{, ...}}}); *query_logsql("your MySQL query"{, <array variable>{, <array variable>{, ...}}}); diff --git a/src/map/script.c b/src/map/script.c index 03d1a4ed2..1e19cb85b 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -15736,6 +15736,76 @@ BUILDIN(md5) return true; } +BUILDIN(swap) +{ + struct map_session_data *sd = NULL; + struct script_data *data1, *data2; + const char *varname1, *varname2; + int64 uid1, uid2; + + data1 = script_getdata(st,2); + data2 = script_getdata(st,3); + + if (!data_isreference(data1) || !data_isreference(data2) || reference_toconstant(data1) || reference_toconstant(data2)) { + st->state = END; + return true; // avoid print error message twice + } + + if (reference_toparam(data1) || reference_toparam(data2)) { + ShowError("script:swap: detected parameter type constant.\n"); + if (reference_toparam(data1)) + script->reportdata(data1); + if (reference_toparam(data2)) + script->reportdata(data2); + st->state = END; + return false; + } + + varname1 = reference_getname(data1); + varname2 = reference_getname(data2); + + if ((is_string_variable(varname1) && !is_string_variable(varname2)) || (!is_string_variable(varname1) && is_string_variable(varname2))) { + ShowError("script:swap: both sides must be same integer or string type.\n"); + script->reportdata(data1); + script->reportdata(data2); + st->state = END; + return false; + } + + if (not_server_variable(*varname1) || not_server_variable(*varname2)) { + sd = script->rid2sd(st); + if (sd == NULL) + return true; // avoid print error message twice + } + + uid1 = reference_getuid(data1); + uid2 = reference_getuid(data2); + + if (is_string_variable(varname1)) { + const char *value1, *value2; + + value1 = script_getstr(st,2); + value2 = script_getstr(st,3); + + if (strcmpi(value1, value2)) { + script->set_reg(st, sd, uid1, varname1, (void*)(value2), script_getref(st,3)); + script->set_reg(st, sd, uid2, varname2, (void*)(value1), script_getref(st,2)); + } + } + else { + int value1, value2; + + value1 = script_getnum(st,2); + value2 = script_getnum(st,3); + + if (value1 != value2) { + script->set_reg(st, sd, uid1, varname1, (void*)h64BPTRSIZE(value2), script_getref(st,3)); + script->set_reg(st, sd, uid2, varname2, (void*)h64BPTRSIZE(value1), script_getref(st,2)); + } + } + return true; +} + // [zBuffer] List of dynamic var commands ---> BUILDIN(setd) @@ -20489,6 +20559,7 @@ void script_parse_builtin(void) { BUILDIN_DEF(min, "i*"), BUILDIN_DEF(max, "i*"), BUILDIN_DEF(md5,"s"), + BUILDIN_DEF(swap,"rr"), // [zBuffer] List of dynamic var commands ---> BUILDIN_DEF(getd,"s"), BUILDIN_DEF(setd,"sv"), |