From 4bf3d0470d4cbaef9c11368767ca0be5ad37612a Mon Sep 17 00:00:00 2001 From: gumi Date: Sun, 26 Feb 2017 11:59:43 -0500 Subject: Revert "allow to get vars of other players with getd" This reverts commit eb5fc0076764d2f604e6a484fe144988f6e9da9b. --- doc/script_commands.txt | 5 +- src/map/script.c | 306 +++++++++++++++--------------------------------- 2 files changed, 98 insertions(+), 213 deletions(-) diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 77b361498..ca7ebacca 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -1371,11 +1371,10 @@ Examples: --------------------------------------- -*getd(""{, {, }}) +*getd("") Returns a reference to a variable, the name can be constructed dynamically. -If is present, it can be used to get a variable from another player or -npc. If the target player or npc is not found, is returned. +Refer to setd() for usage. This can also be used to set an array dynamically: setarray(getd(".array[0]"), 1, 2, 3, 4, 5); diff --git a/src/map/script.c b/src/map/script.c index a1886d043..30295b8dc 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -2861,44 +2861,32 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { const char *str = NULL; switch (prefix) { - case '@': - if (data->ref) { - str = script->get_val_ref_str(st, data->ref, data); - } else { + case '@': str = pc->readregstr(sd, data->u.num); - } - break; - case '$': - str = mapreg->readregstr(data->u.num); - break; - case '#': - if (data->ref) { - str = script->get_val_ref_str(st, data->ref, data); - } else if (name[1] == '#') { - str = pc_readaccountreg2str(sd, data->u.num);// global - } else { - str = pc_readaccountregstr(sd, data->u.num);// local - } - break; - case '.': - if (data->ref) { - str = script->get_val_ref_str(st, data->ref, data); - } else if (name[1] == '@') { - str = script->get_val_scope_str(st, &st->stack->scope, data); - } else { - str = script->get_val_npc_str(st, &st->script->local, data); - } - break; - case '\'': - str = script->get_val_instance_str(st, name, data); - break; - default: - if (data->ref) { - str = script->get_val_ref_str(st, data->ref, data); - } else { + break; + case '$': + str = mapreg->readregstr(data->u.num); + break; + case '#': + if (name[1] == '#') + str = pc_readaccountreg2str(sd, data->u.num);// global + else + str = pc_readaccountregstr(sd, data->u.num);// local + break; + case '.': + if (data->ref) + str = script->get_val_ref_str(st, data->ref, data); + else if (name[1] == '@') + str = script->get_val_scope_str(st, &st->stack->scope, data); + else + str = script->get_val_npc_str(st, &st->script->local, data); + break; + case '\'': + str = script->get_val_instance_str(st, name, data); + break; + default: str = pc_readglobalreg_str(sd, data->u.num); - } - break; + break; } if (str == NULL || str[0] == '\0') { @@ -2918,48 +2906,35 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { data->u.num = reference_getconstant(data); } else if( reference_toparam(data) ) { data->u.num = pc->readparam(sd, reference_getparamtype(data)); - } else { - switch(prefix) { - case '@': - if (data->ref) { - data->u.num = script->get_val_ref_num(st, data->ref, data); - } else { + } else + switch( prefix ) { + case '@': data->u.num = pc->readreg(sd, data->u.num); - } - break; - case '$': - data->u.num = mapreg->readreg(data->u.num); - break; - case '#': - if (data->ref) { - data->u.num = script->get_val_ref_num(st, data->ref, data); - } else if(name[1] == '#') { - data->u.num = pc_readaccountreg2(sd, data->u.num);// global - } else { - data->u.num = pc_readaccountreg(sd, data->u.num);// local - } - break; - case '.': - if (data->ref) { - data->u.num = script->get_val_ref_num(st, data->ref, data); - } else if (name[1] == '@') { - data->u.num = script->get_val_scope_num(st, &st->stack->scope, data); - } else { - data->u.num = script->get_val_npc_num(st, &st->script->local, data); - } - break; - case '\'': - data->u.num = script->get_val_instance_num(st, name, data); - break; - default: - if (data->ref) { - data->u.num = script->get_val_ref_num(st, data->ref, data); - } else { + break; + case '$': + data->u.num = mapreg->readreg(data->u.num); + break; + case '#': + if( name[1] == '#' ) + data->u.num = pc_readaccountreg2(sd, data->u.num);// global + else + data->u.num = pc_readaccountreg(sd, data->u.num);// local + break; + case '.': + if (data->ref) + data->u.num = script->get_val_ref_num(st, data->ref, data); + else if (name[1] == '@') + data->u.num = script->get_val_scope_num(st, &st->stack->scope, data); + else + data->u.num = script->get_val_npc_num(st, &st->script->local, data); + break; + case '\'': + data->u.num = script->get_val_instance_num(st, name, data); + break; + default: data->u.num = pc_readglobalreg(sd, data->u.num); - } - break; + break; } - } } data->ref = NULL; @@ -3317,47 +3292,32 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con return 0; } - if(is_string_variable(name)) {// string variable + if( is_string_variable(name) ) {// string variable const char *str = (const char*)value; switch (prefix) { - case '@': - if (ref) { - script->set_reg_ref_str(st, ref, num, name, str); - } else { + case '@': pc->setregstr(sd, num, str); - } - return 1; - case '$': - return mapreg->setregstr(num, str); - case '#': - if (ref) { - script->set_reg_ref_str(st, ref, num, name, str); - } else if (name[1] == '#') { - pc_setaccountreg2str(sd, num, str); - } else { - pc_setaccountregstr(sd, num, str); - } - return 1; - case '.': - if (ref) { - script->set_reg_ref_str(st, ref, num, name, str); - } else if (name[1] == '@') { - script->set_reg_scope_str(st, &st->stack->scope, num, name, str); - } else { - script->set_reg_npc_str(st, &st->script->local, num, name, str); - } - return 1; - case '\'': - set_reg_instance_str(st, num, name, str); - return 1; - default: - if (ref) { - script->set_reg_ref_str(st, ref, num, name, str); - } else { - pc_setglobalreg_str(sd, num, str); - } - return 1; + return 1; + case '$': + return mapreg->setregstr(num, str); + case '#': + return (name[1] == '#') ? + pc_setaccountreg2str(sd, num, str) : + pc_setaccountregstr(sd, num, str); + case '.': + if (ref) + script->set_reg_ref_str(st, ref, num, name, str); + else if (name[1] == '@') + script->set_reg_scope_str(st, &st->stack->scope, num, name, str); + else + script->set_reg_npc_str(st, &st->script->local, num, name, str); + return 1; + case '\'': + set_reg_instance_str(st, num, name, str); + return 1; + default: + return pc_setglobalreg_str(sd, num, str); } } else {// integer variable // FIXME: This isn't safe, in 32bits systems we're converting a 64bit pointer @@ -3381,43 +3341,28 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con } switch (prefix) { - case '@': - if (ref) { - script->set_reg_ref_num(st, ref, num, name, val); - } else { + case '@': pc->setreg(sd, num, val); - } - return 1; - case '$': - return mapreg->setreg(num, val); - case '#': - if (ref) { - script->set_reg_ref_num(st, ref, num, name, val); - } else if (name[1] == '#') { - pc_setaccountreg2(sd, num, val); - } else { - pc_setaccountreg(sd, num, val); - } - return 1; - case '.': - if (ref) { - script->set_reg_ref_num(st, ref, num, name, val); - } else if (name[1] == '@') { - script->set_reg_scope_num(st, &st->stack->scope, num, name, val); - } else { - script->set_reg_npc_num(st, &st->script->local, num, name, val); - } - return 1; - case '\'': - set_reg_instance_num(st, num, name, val); - return 1; - default: - if (ref) { - script->set_reg_ref_num(st, ref, num, name, val); - } else { - pc_setglobalreg(sd, num, val); - } - return 1; + return 1; + case '$': + return mapreg->setreg(num, val); + case '#': + return (name[1] == '#') ? + pc_setaccountreg2(sd, num, val) : + pc_setaccountreg(sd, num, val); + case '.': + if (ref) + script->set_reg_ref_num(st, ref, num, name, val); + else if (name[1] == '@') + script->set_reg_scope_num(st, &st->stack->scope, num, name, val); + else + script->set_reg_npc_num(st, &st->script->local, num, name, val); + return 1; + case '\'': + set_reg_instance_num(st, num, name, val); + return 1; + default: + return pc_setglobalreg(sd, num, val); } } } @@ -16549,11 +16494,7 @@ BUILDIN(escape_sql) return true; } -BUILDIN(getd) -{ - struct block_list *bl = NULL; - struct map_session_data *sd; - struct npc_data *nd; +BUILDIN(getd) { char varname[100]; const char *buffer; int elem; @@ -16563,63 +16504,8 @@ BUILDIN(getd) if (sscanf(buffer, "%99[^[][%d]", varname, &elem) < 2) elem = 0; - if (strlen(varname) < 1) { - ShowError("script:getd: variable cannot be empty\n"); - script->reportdata(script_getdata(st, 2)); - script_pushnil(st); - st->state = END; - return false; - } - - if (script_hasdata(st, 3)) { - bl = map->id2bl(script_getnum(st, 3)); - - if (bl == NULL) { - // being not found, push default value - if (script_hasdata(st, 4)) { - script_pushcopy(st, 4); - } else if (varname[strlen(varname) - 1] == '$') { - script_pushconststr(st, ""); - } else { - script_pushint(st, 0); - } - return false; - } else if (bl->type == BL_NPC && (varname[0] != '.' || varname[1] == '@')) { - ShowError("script:getd: invalid scope (not npc variable)\n"); - script->reportdata(script_getdata(st, 2)); - script_pushnil(st); - st->state = END; - return false; - } else if (bl->type == BL_PC && (varname[0] == '.' || varname[0] == '$' || varname[0] == '\'')) { - ShowError("script:getd: invalid scope (not pc variable)\n"); - script->reportdata(script_getdata(st, 2)); - script_pushnil(st); - st->state = END; - return false; - } - } - // Push the 'pointer' so it's more flexible [Lance] - - if (bl != NULL) { - switch (bl->type) { - case BL_PC: - sd = map->id2sd(bl->id); - script->push_val(st->stack, C_NAME, reference_uid(script->add_str(varname), elem), &sd->regs); - break; - case BL_NPC: - nd = map->id2nd(bl->id); - script->push_val(st->stack, C_NAME, reference_uid(script->add_str(varname), elem), &nd->u.scr.script->local); - break; - default: - ShowError("script:getd: invalid being type (not npc or pc)\n"); - script_pushnil(st); - st->state = END; - return false; - } - } else { - script->push_val(st->stack, C_NAME, reference_uid(script->add_str(varname), elem), NULL); - } + script->push_val(st->stack, C_NAME, reference_uid(script->add_str(varname), elem),NULL); return true; } @@ -21257,7 +21143,7 @@ void script_parse_builtin(void) { BUILDIN_DEF(md5,"s"), BUILDIN_DEF(swap,"rr"), // [zBuffer] List of dynamic var commands ---> - BUILDIN_DEF(getd,"s??"), + BUILDIN_DEF(getd,"s"), BUILDIN_DEF(setd,"sv"), // <--- [zBuffer] List of dynamic var commands BUILDIN_DEF(petstat,"i"), -- cgit v1.2.3-70-g09d2 From 2cc5c040948b3e6a90e7f344bb74155b79afa942 Mon Sep 17 00:00:00 2001 From: gumi Date: Sun, 26 Feb 2017 10:17:36 -0500 Subject: fix indentation in get_val --- src/map/script.c | 104 +++++++++++++++++++++++++++---------------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/src/map/script.c b/src/map/script.c index 30295b8dc..fed00048e 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -2861,32 +2861,32 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { const char *str = NULL; switch (prefix) { - case '@': - str = pc->readregstr(sd, data->u.num); - break; - case '$': - str = mapreg->readregstr(data->u.num); - break; - case '#': - if (name[1] == '#') - str = pc_readaccountreg2str(sd, data->u.num);// global - else - str = pc_readaccountregstr(sd, data->u.num);// local - break; - case '.': - if (data->ref) - str = script->get_val_ref_str(st, data->ref, data); - else if (name[1] == '@') - str = script->get_val_scope_str(st, &st->stack->scope, data); - else - str = script->get_val_npc_str(st, &st->script->local, data); - break; - case '\'': - str = script->get_val_instance_str(st, name, data); - break; - default: - str = pc_readglobalreg_str(sd, data->u.num); - break; + case '@': + str = pc->readregstr(sd, data->u.num); + break; + case '$': + str = mapreg->readregstr(data->u.num); + break; + case '#': + if (name[1] == '#') + str = pc_readaccountreg2str(sd, data->u.num);// global + else + str = pc_readaccountregstr(sd, data->u.num);// local + break; + case '.': + if (data->ref) + str = script->get_val_ref_str(st, data->ref, data); + else if (name[1] == '@') + str = script->get_val_scope_str(st, &st->stack->scope, data); + else + str = script->get_val_npc_str(st, &st->script->local, data); + break; + case '\'': + str = script->get_val_instance_str(st, name, data); + break; + default: + str = pc_readglobalreg_str(sd, data->u.num); + break; } if (str == NULL || str[0] == '\0') { @@ -2908,32 +2908,32 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { data->u.num = pc->readparam(sd, reference_getparamtype(data)); } else switch( prefix ) { - case '@': - data->u.num = pc->readreg(sd, data->u.num); - break; - case '$': - data->u.num = mapreg->readreg(data->u.num); - break; - case '#': - if( name[1] == '#' ) - data->u.num = pc_readaccountreg2(sd, data->u.num);// global - else - data->u.num = pc_readaccountreg(sd, data->u.num);// local - break; - case '.': - if (data->ref) - data->u.num = script->get_val_ref_num(st, data->ref, data); - else if (name[1] == '@') - data->u.num = script->get_val_scope_num(st, &st->stack->scope, data); - else - data->u.num = script->get_val_npc_num(st, &st->script->local, data); - break; - case '\'': - data->u.num = script->get_val_instance_num(st, name, data); - break; - default: - data->u.num = pc_readglobalreg(sd, data->u.num); - break; + case '@': + data->u.num = pc->readreg(sd, data->u.num); + break; + case '$': + data->u.num = mapreg->readreg(data->u.num); + break; + case '#': + if( name[1] == '#' ) + data->u.num = pc_readaccountreg2(sd, data->u.num);// global + else + data->u.num = pc_readaccountreg(sd, data->u.num);// local + break; + case '.': + if (data->ref) + data->u.num = script->get_val_ref_num(st, data->ref, data); + else if (name[1] == '@') + data->u.num = script->get_val_scope_num(st, &st->stack->scope, data); + else + data->u.num = script->get_val_npc_num(st, &st->script->local, data); + break; + case '\'': + data->u.num = script->get_val_instance_num(st, name, data); + break; + default: + data->u.num = pc_readglobalreg(sd, data->u.num); + break; } } -- cgit v1.2.3-70-g09d2 From 489281c3de7d4d2d9370f7352f6d3108c4681e89 Mon Sep 17 00:00:00 2001 From: gumi Date: Sun, 26 Feb 2017 10:29:20 -0500 Subject: fix code style in get_val --- src/map/script.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/map/script.c b/src/map/script.c index fed00048e..3394e0ed3 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -2825,7 +2825,7 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { char postfix; struct map_session_data *sd = NULL; - if( !data_isreference(data) ) + if (!data_isreference(data)) return data;// not a variable/constant name = reference_getname(data); @@ -2840,10 +2840,10 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { } //##TODO use reference_tovariable(data) when it's confirmed that it works [FlavioJS] - if( !reference_toconstant(data) && not_server_variable(prefix) ) { + if (!reference_toconstant(data) && not_server_variable(prefix)) { sd = script->rid2sd(st); - if( sd == NULL ) {// needs player attached - if( postfix == '$' ) {// string variable + if (sd == NULL) {// needs player attached + if (postfix == '$') {// string variable ShowWarning("script_get_val: cannot access player variable '%s', defaulting to \"\"\n", name); data->type = C_CONSTSTR; data->u.str = ""; @@ -2868,18 +2868,20 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { str = mapreg->readregstr(data->u.num); break; case '#': - if (name[1] == '#') + if (name[1] == '#') { str = pc_readaccountreg2str(sd, data->u.num);// global - else + } else { str = pc_readaccountregstr(sd, data->u.num);// local + } break; case '.': - if (data->ref) + if (data->ref) { str = script->get_val_ref_str(st, data->ref, data); - else if (name[1] == '@') + } else if (name[1] == '@') { str = script->get_val_scope_str(st, &st->stack->scope, data); - else + } else { str = script->get_val_npc_str(st, &st->script->local, data); + } break; case '\'': str = script->get_val_instance_str(st, name, data); @@ -2906,8 +2908,8 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { data->u.num = reference_getconstant(data); } else if( reference_toparam(data) ) { data->u.num = pc->readparam(sd, reference_getparamtype(data)); - } else - switch( prefix ) { + } else { + switch (prefix) { case '@': data->u.num = pc->readreg(sd, data->u.num); break; @@ -2915,18 +2917,21 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { data->u.num = mapreg->readreg(data->u.num); break; case '#': - if( name[1] == '#' ) + if (name[1] == '#') { data->u.num = pc_readaccountreg2(sd, data->u.num);// global - else + } else { data->u.num = pc_readaccountreg(sd, data->u.num);// local + } break; case '.': - if (data->ref) + if (data->ref) { data->u.num = script->get_val_ref_num(st, data->ref, data); - else if (name[1] == '@') + } else if (name[1] == '@') { data->u.num = script->get_val_scope_num(st, &st->stack->scope, data); - else + } + else { data->u.num = script->get_val_npc_num(st, &st->script->local, data); + } break; case '\'': data->u.num = script->get_val_instance_num(st, name, data); @@ -2935,7 +2940,7 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { data->u.num = pc_readglobalreg(sd, data->u.num); break; } - + } } data->ref = NULL; -- cgit v1.2.3-70-g09d2 From 37d14b0961719c938824f2bcded967c27e3a71bc Mon Sep 17 00:00:00 2001 From: gumi Date: Sun, 26 Feb 2017 10:32:43 -0500 Subject: fix indentation in script_array_src --- src/map/script.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/map/script.c b/src/map/script.c index 3394e0ed3..1e839e8f1 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -3117,29 +3117,29 @@ struct reg_db *script_array_src(struct script_state *st, struct map_session_data nullpo_retr(NULL, name); switch( name[0] ) { /* from player */ - default: /* char reg */ - case '@':/* temp char reg */ - case '#':/* account reg */ - nullpo_retr(NULL, sd); - src = &sd->regs; - break; - case '$':/* map reg */ - src = &mapreg->regs; - break; - case '.':/* npc/script */ - if (ref != NULL) { - src = ref; - } else { - nullpo_retr(NULL, st); - src = (name[1] == '@') ? &st->stack->scope : &st->script->local; - } - break; - case '\'':/* instance */ + default: /* char reg */ + case '@':/* temp char reg */ + case '#':/* account reg */ + nullpo_retr(NULL, sd); + src = &sd->regs; + break; + case '$':/* map reg */ + src = &mapreg->regs; + break; + case '.':/* npc/script */ + if (ref != NULL) { + src = ref; + } else { nullpo_retr(NULL, st); - if( st->instance_id >= 0 ) { - src = &instance->list[st->instance_id].regs; - } - break; + src = (name[1] == '@') ? &st->stack->scope : &st->script->local; + } + break; + case '\'':/* instance */ + nullpo_retr(NULL, st); + if( st->instance_id >= 0 ) { + src = &instance->list[st->instance_id].regs; + } + break; } if( src ) { -- cgit v1.2.3-70-g09d2 From 567abb9c907a471b35c6aa70c8e5f47393fec4b3 Mon Sep 17 00:00:00 2001 From: gumi Date: Sun, 26 Feb 2017 10:39:52 -0500 Subject: fix code style in script_array_src --- src/map/script.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/map/script.c b/src/map/script.c index 1e839e8f1..d4243a4bd 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -3113,9 +3113,9 @@ void script_array_add_member(struct script_array *sa, unsigned int idx) { **/ struct reg_db *script_array_src(struct script_state *st, struct map_session_data *sd, const char *name, struct reg_db *ref) { struct reg_db *src = NULL; - nullpo_retr(NULL, name); - switch( name[0] ) { + + switch (name[0]) { /* from player */ default: /* char reg */ case '@':/* temp char reg */ @@ -3136,15 +3136,16 @@ struct reg_db *script_array_src(struct script_state *st, struct map_session_data break; case '\'':/* instance */ nullpo_retr(NULL, st); - if( st->instance_id >= 0 ) { + if (st->instance_id >= 0) { src = &instance->list[st->instance_id].regs; } break; } - if( src ) { - if( !src->arrays ) + if (src) { + if (!src->arrays) { src->arrays = idb_alloc(DB_OPT_BASE); + } return src; } return NULL; -- cgit v1.2.3-70-g09d2 From 7fa73225837fc5857df26494caa669debeaa860b Mon Sep 17 00:00:00 2001 From: gumi Date: Sun, 26 Feb 2017 10:42:45 -0500 Subject: fix indentation in set_reg --- src/map/script.c | 88 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/map/script.c b/src/map/script.c index d4243a4bd..283abf2e0 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -3302,28 +3302,28 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con const char *str = (const char*)value; switch (prefix) { - case '@': - pc->setregstr(sd, num, str); - return 1; - case '$': - return mapreg->setregstr(num, str); - case '#': - return (name[1] == '#') ? - pc_setaccountreg2str(sd, num, str) : - pc_setaccountregstr(sd, num, str); - case '.': - if (ref) - script->set_reg_ref_str(st, ref, num, name, str); - else if (name[1] == '@') - script->set_reg_scope_str(st, &st->stack->scope, num, name, str); - else - script->set_reg_npc_str(st, &st->script->local, num, name, str); - return 1; - case '\'': - set_reg_instance_str(st, num, name, str); - return 1; - default: - return pc_setglobalreg_str(sd, num, str); + case '@': + pc->setregstr(sd, num, str); + return 1; + case '$': + return mapreg->setregstr(num, str); + case '#': + return (name[1] == '#') ? + pc_setaccountreg2str(sd, num, str) : + pc_setaccountregstr(sd, num, str); + case '.': + if (ref) + script->set_reg_ref_str(st, ref, num, name, str); + else if (name[1] == '@') + script->set_reg_scope_str(st, &st->stack->scope, num, name, str); + else + script->set_reg_npc_str(st, &st->script->local, num, name, str); + return 1; + case '\'': + set_reg_instance_str(st, num, name, str); + return 1; + default: + return pc_setglobalreg_str(sd, num, str); } } else {// integer variable // FIXME: This isn't safe, in 32bits systems we're converting a 64bit pointer @@ -3347,28 +3347,28 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con } switch (prefix) { - case '@': - pc->setreg(sd, num, val); - return 1; - case '$': - return mapreg->setreg(num, val); - case '#': - return (name[1] == '#') ? - pc_setaccountreg2(sd, num, val) : - pc_setaccountreg(sd, num, val); - case '.': - if (ref) - script->set_reg_ref_num(st, ref, num, name, val); - else if (name[1] == '@') - script->set_reg_scope_num(st, &st->stack->scope, num, name, val); - else - script->set_reg_npc_num(st, &st->script->local, num, name, val); - return 1; - case '\'': - set_reg_instance_num(st, num, name, val); - return 1; - default: - return pc_setglobalreg(sd, num, val); + case '@': + pc->setreg(sd, num, val); + return 1; + case '$': + return mapreg->setreg(num, val); + case '#': + return (name[1] == '#') ? + pc_setaccountreg2(sd, num, val) : + pc_setaccountreg(sd, num, val); + case '.': + if (ref) + script->set_reg_ref_num(st, ref, num, name, val); + else if (name[1] == '@') + script->set_reg_scope_num(st, &st->stack->scope, num, name, val); + else + script->set_reg_npc_num(st, &st->script->local, num, name, val); + return 1; + case '\'': + set_reg_instance_num(st, num, name, val); + return 1; + default: + return pc_setglobalreg(sd, num, val); } } } -- cgit v1.2.3-70-g09d2 From 6304acd20004c2dd682fe592a55b2bfa31f08b6c Mon Sep 17 00:00:00 2001 From: gumi Date: Sun, 26 Feb 2017 10:50:30 -0500 Subject: fix code style in set_reg --- src/map/script.c | 51 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/map/script.c b/src/map/script.c index 283abf2e0..c530f24c2 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -3298,7 +3298,7 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con return 0; } - if( is_string_variable(name) ) {// string variable + if (is_string_variable(name)) {// string variable const char *str = (const char*)value; switch (prefix) { @@ -3306,40 +3306,47 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con pc->setregstr(sd, num, str); return 1; case '$': - return mapreg->setregstr(num, str); + mapreg->setregstr(num, str); + return 1; case '#': - return (name[1] == '#') ? - pc_setaccountreg2str(sd, num, str) : + if (name[1] == '#') { + pc_setaccountreg2str(sd, num, str); + } else { pc_setaccountregstr(sd, num, str); + } + return 1; case '.': - if (ref) + if (ref) { script->set_reg_ref_str(st, ref, num, name, str); - else if (name[1] == '@') + } else if (name[1] == '@') { script->set_reg_scope_str(st, &st->stack->scope, num, name, str); - else + } else { script->set_reg_npc_str(st, &st->script->local, num, name, str); + } return 1; case '\'': set_reg_instance_str(st, num, name, str); return 1; default: - return pc_setglobalreg_str(sd, num, str); + pc_setglobalreg_str(sd, num, str); + return 1; } } else {// integer variable // FIXME: This isn't safe, in 32bits systems we're converting a 64bit pointer // to a 32bit int, this will lead to overflows! [Panikon] int val = (int)h64BPTRSIZE(value); - if(script->str_data[script_getvarid(num)].type == C_PARAM) { - if( pc->setparam(sd, script->str_data[script_getvarid(num)].val, val) == 0 ) { - if( st != NULL ) { + if (script->str_data[script_getvarid(num)].type == C_PARAM) { + if (pc->setparam(sd, script->str_data[script_getvarid(num)].val, val) == 0) { + if (st != NULL) { ShowError("script:set_reg: failed to set param '%s' to %d.\n", name, val); script->reportsrc(st); // Instead of just stop the script execution we let the character close // the window if it was open. st->state = (sd->state.dialog) ? CLOSE : END; - if( st->state == CLOSE ) + if(st->state == CLOSE) { clif->scriptclose(sd, st->oid); + } } return 0; } @@ -3351,24 +3358,30 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con pc->setreg(sd, num, val); return 1; case '$': - return mapreg->setreg(num, val); + mapreg->setreg(num, val); + return 1; case '#': - return (name[1] == '#') ? - pc_setaccountreg2(sd, num, val) : + if (name[1] == '#') { + pc_setaccountreg2(sd, num, val); + } else { pc_setaccountreg(sd, num, val); + } + return 1; case '.': - if (ref) + if (ref) { script->set_reg_ref_num(st, ref, num, name, val); - else if (name[1] == '@') + } else if (name[1] == '@') { script->set_reg_scope_num(st, &st->stack->scope, num, name, val); - else + } else { script->set_reg_npc_num(st, &st->script->local, num, name, val); + } return 1; case '\'': set_reg_instance_num(st, num, name, val); return 1; default: - return pc_setglobalreg(sd, num, val); + pc_setglobalreg(sd, num, val); + return 1; } } } -- cgit v1.2.3-70-g09d2 From a16fbb3c0abe63587280bb9ec744b8f65b4c8e38 Mon Sep 17 00:00:00 2001 From: gumi Date: Sun, 26 Feb 2017 11:00:03 -0500 Subject: allow character and account variables to reference another registry --- src/map/script.c | 74 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/src/map/script.c b/src/map/script.c index c530f24c2..6c0fdfb22 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -2840,7 +2840,7 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { } //##TODO use reference_tovariable(data) when it's confirmed that it works [FlavioJS] - if (!reference_toconstant(data) && not_server_variable(prefix)) { + if (!reference_toconstant(data) && not_server_variable(prefix) && reference_getref(data) == NULL) { sd = script->rid2sd(st); if (sd == NULL) {// needs player attached if (postfix == '$') {// string variable @@ -2862,13 +2862,19 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { switch (prefix) { case '@': - str = pc->readregstr(sd, data->u.num); + if (data->ref) { + str = script->get_val_ref_str(st, data->ref, data); + } else { + str = pc->readregstr(sd, data->u.num); + } break; case '$': str = mapreg->readregstr(data->u.num); break; case '#': - if (name[1] == '#') { + if (data->ref) { + str = script->get_val_ref_str(st, data->ref, data); + } else if (name[1] == '#') { str = pc_readaccountreg2str(sd, data->u.num);// global } else { str = pc_readaccountregstr(sd, data->u.num);// local @@ -2887,7 +2893,11 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { str = script->get_val_instance_str(st, name, data); break; default: - str = pc_readglobalreg_str(sd, data->u.num); + if (data->ref) { + str = script->get_val_ref_str(st, data->ref, data); + } else { + str = pc_readglobalreg_str(sd, data->u.num); + } break; } @@ -2911,13 +2921,19 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { } else { switch (prefix) { case '@': - data->u.num = pc->readreg(sd, data->u.num); + if (data->ref) { + data->u.num = script->get_val_ref_num(st, data->ref, data); + } else { + data->u.num = pc->readreg(sd, data->u.num); + } break; case '$': data->u.num = mapreg->readreg(data->u.num); break; case '#': - if (name[1] == '#') { + if (data->ref) { + data->u.num = script->get_val_ref_num(st, data->ref, data); + } else if (name[1] == '#') { data->u.num = pc_readaccountreg2(sd, data->u.num);// global } else { data->u.num = pc_readaccountreg(sd, data->u.num);// local @@ -2937,7 +2953,11 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { data->u.num = script->get_val_instance_num(st, name, data); break; default: - data->u.num = pc_readglobalreg(sd, data->u.num); + if (data->ref) { + data->u.num = script->get_val_ref_num(st, data->ref, data); + } else { + data->u.num = pc_readglobalreg(sd, data->u.num); + } break; } } @@ -3120,8 +3140,12 @@ struct reg_db *script_array_src(struct script_state *st, struct map_session_data default: /* char reg */ case '@':/* temp char reg */ case '#':/* account reg */ - nullpo_retr(NULL, sd); - src = &sd->regs; + if (ref != NULL) { + src = ref; + } else { + nullpo_retr(NULL, sd); + src = &sd->regs; + } break; case '$':/* map reg */ src = &mapreg->regs; @@ -3303,13 +3327,19 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con switch (prefix) { case '@': - pc->setregstr(sd, num, str); + if (ref) { + script->set_reg_ref_str(st, ref, num, name, str); + } else { + pc->setregstr(sd, num, str); + } return 1; case '$': mapreg->setregstr(num, str); return 1; case '#': - if (name[1] == '#') { + if (ref) { + script->set_reg_ref_str(st, ref, num, name, str); + } else if (name[1] == '#') { pc_setaccountreg2str(sd, num, str); } else { pc_setaccountregstr(sd, num, str); @@ -3328,7 +3358,11 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con set_reg_instance_str(st, num, name, str); return 1; default: - pc_setglobalreg_str(sd, num, str); + if (ref) { + script->set_reg_ref_str(st, ref, num, name, str); + } else { + pc_setglobalreg_str(sd, num, str); + } return 1; } } else {// integer variable @@ -3355,13 +3389,19 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con switch (prefix) { case '@': - pc->setreg(sd, num, val); + if (ref) { + script->set_reg_ref_num(st, ref, num, name, val); + } else { + pc->setreg(sd, num, val); + } return 1; case '$': mapreg->setreg(num, val); return 1; case '#': - if (name[1] == '#') { + if (ref) { + script->set_reg_ref_num(st, ref, num, name, val); + } else if (name[1] == '#') { pc_setaccountreg2(sd, num, val); } else { pc_setaccountreg(sd, num, val); @@ -3380,7 +3420,11 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con set_reg_instance_num(st, num, name, val); return 1; default: - pc_setglobalreg(sd, num, val); + if (ref) { + script->set_reg_ref_num(st, ref, num, name, val); + } else { + pc_setglobalreg(sd, num, val); + } return 1; } } -- cgit v1.2.3-70-g09d2 From 1b0d3bd8f84db5b471646e0404193759afb908db Mon Sep 17 00:00:00 2001 From: gumi Date: Sun, 26 Feb 2017 12:04:23 -0500 Subject: add getvariableofpc() buildin --- doc/script_commands.txt | 21 ++++++++++++++++++++ src/map/script.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/doc/script_commands.txt b/doc/script_commands.txt index ca7ebacca..7015feec1 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -1409,6 +1409,27 @@ getvariableofnpc() should not be used on them. --------------------------------------- +*getvariableofpc(, {, }) + +Returns a reference to a PC variable from the target player. +If is passed, it will return this value if the player is +not found. + +Examples: + +//This will return the value of @var, note that this can't be used, since +//the value isn't caught. + getvariableofpc(@var, getcharid(CHAR_ID_ACCOUNT, "player")); + +//This will set the .@v variable to the value of the player's @var +//variable. + .@v = getvariableofpc(@var, getcharid(CHAR_ID_ACCOUNT, "player")); + +//This will set the @var variable of the player to 1. + set(getvariableofpc(@var, getcharid(CHAR_ID_ACCOUNT, "player")), 1); + +--------------------------------------- + *goto(