diff options
-rw-r--r-- | npc/dev/test.txt | 18 | ||||
-rw-r--r-- | src/map/script.c | 32 |
2 files changed, 39 insertions, 11 deletions
diff --git a/npc/dev/test.txt b/npc/dev/test.txt index a091f5998..9c2de9a55 100644 --- a/npc/dev/test.txt +++ b/npc/dev/test.txt @@ -86,6 +86,15 @@ function script F_TestNPCArrays { return getarraysize(.y); } +function script F_TestVarOfAnotherNPC { + return getvariableofnpc(.x, getarg(0)); +} + +- script TestVarOfAnotherNPC -1,{ + // Used to test getvariableofnpc() + end; +} + function script HerculesSelfTestHelper { if (.once > 0) return .errors; @@ -622,6 +631,9 @@ function script HerculesSelfTestHelper { callsub(OnCheck, "Callsub (parent array vars isolation)", getarraysize(.@x), .@z); deletearray .@x; deletearray .@y; + .x = 2; + set getvariableofnpc(.x, "TestVarOfAnotherNPC"), 1; + callsub(OnCheck, "Callsub (return NPC variables from another NPC)", callsub(OnTestVarOfAnotherNPC, "TestVarOfAnotherNPC"), 1); // Callfunc callsub(OnCheck, "Callfunc return value", callfunc("F_TestReturnValue", 1)); @@ -667,6 +679,9 @@ function script HerculesSelfTestHelper { callsub(OnCheck, "Callfunc (parent array NPC vars isolation)", getarraysize(.@x), .@z); deletearray .x; deletearray .y; + .x = 2; + set getvariableofnpc(.x, "TestVarOfAnotherNPC"), 1; + callsub(OnCheck, "Callfunc (return NPC variables from another NPC)", callfunc("F_TestVarOfAnotherNPC", "TestVarOfAnotherNPC"), 1); if (.errors) { debugmes "Script engine self-test [ \033[0;31mFAILED\033[0m ]"; @@ -708,6 +723,9 @@ OnTestScopeArrays: setarray .@x, 1, 2, 3, 4; copyarray .@y, getarg(0), getarraysize(getarg(0)); return getarraysize(.@y); + +OnTestVarOfAnotherNPC: + return getvariableofnpc(.x, getarg(0)); OnReportError: .@msg$ = getarg(0,"Unknown Error"); diff --git a/src/map/script.c b/src/map/script.c index b7fdf1596..51bb344fe 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -5682,6 +5682,13 @@ BUILDIN(getarg) /// return; /// return <value>; BUILDIN(return) { + st->state = RETFUNC; + + if( st->stack->defsp < 1 || st->stack->stack_data[st->stack->defsp-1].type != C_RETINFO ) { + // Incorrect usage of return outside the scope of a function or subroutine. + return true; // No need for further processing, running script is about to be aborted. + } + if( script_hasdata(st,2) ) {// return value struct script_data* data; @@ -5695,16 +5702,19 @@ BUILDIN(return) { script->get_val(st, data);// current scope, convert to value if( data->ref && data->ref->vars == st->stack->stack_data[st->stack->defsp-1].u.ri->scope.vars ) data->ref = NULL; // Reference to the parent scope, remove reference pointer - } else if( name[0] == '.' && !data->ref ) { - // script variable without a reference set, link to current script - data->ref = (struct reg_db *)aCalloc(sizeof(struct reg_db), 1); - script->add_pending_ref(st, data->ref); - data->ref->vars = st->script->local.vars; - if( !st->script->local.arrays ) - st->script->local.arrays = idb_alloc(DB_OPT_BASE); - data->ref->arrays = st->script->local.arrays; - } else if ( name[0] == '.' /* && data->ref != NULL */ ) { - data->ref = NULL; // Reference to the parent scope's script, remove reference pointer. + } else if( name[0] == '.' ) { + // npc variable + if( !data->ref ) { + // npc variable without a reference set, link to current script + data->ref = (struct reg_db *)aCalloc(sizeof(struct reg_db), 1); + script->add_pending_ref(st, data->ref); + data->ref->vars = st->script->local.vars; + if( !st->script->local.arrays ) + st->script->local.arrays = idb_alloc(DB_OPT_BASE); + data->ref->arrays = st->script->local.arrays; + } else if( data->ref->vars == st->stack->stack_data[st->stack->defsp-1].u.ri->script->local.vars ) { + data->ref = NULL; // Reference to the parent scope's script, remove reference pointer. + } } } } @@ -5712,7 +5722,7 @@ BUILDIN(return) { {// no return value script_pushnil(st); } - st->state = RETFUNC; + return true; } |