diff options
-rw-r--r-- | Changelog-Trunk.txt | 4 | ||||
-rw-r--r-- | doc/script_commands.txt | 34 | ||||
-rw-r--r-- | src/map/map.c | 4 | ||||
-rw-r--r-- | src/map/map.h | 2 | ||||
-rw-r--r-- | src/map/pc.c | 54 | ||||
-rw-r--r-- | src/map/script.c | 7 |
6 files changed, 65 insertions, 40 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index d56f3c333..6e0fb2558 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,10 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2007/12/27 + * Corrected description of scope and npc variables in script_commands.txt. + * Made temporary character string variables not have a limited length. + (now all temporary string variables don't have limited length) + * Made temporary character variables reuse free positions. * Tweeked the declaration and initialization defines for vectors. * Made do_sockets leave the for loop as soon as the readable number of sockets returned by select is found. diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 925f20842..a7564b672 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -4,7 +4,7 @@ //= A reference manual for the eAthena scripting language. //= Commands are sorted depending on their functionality. //===== Version =========================================== -//= 3.10.20071122 +//= 3.12.20071227 //========================================================= //= 1.0 - First release, filled will as much info as I could //= remember or figure out, most likely there are errors, @@ -93,6 +93,8 @@ //= Updated guardianinfo and get-/setcastledata [ultramage] //= 3.12.20071218 //= Corrected various mistakes mentioned in bugreport:373 [ultramage] +//= 3.12.20071227 +//= Corrected description of scope and npc variables. [FlavioJS] //========================================================= This document is a reference manual for all the scripting commands and functions @@ -495,12 +497,11 @@ local - local to the server account - attached to the account of the character identified by RID character - attached to the character identified by RID npc - attached to the NPC +scope - attached to the scope of the instance Extent can be: -permanent - Permanent NPC variables exist while the server is running. - Others still exist when the server resets. -temporary - Temporary NPC variables exist while the script instance is running. - Others cease to exist when the server resets. +permanent - They still exist when the server resets. +temporary - They cease to exist when the server resets. Prefix: scope and extent nothing - A permanent variable attached to the character, the default @@ -515,11 +516,16 @@ nothing - A permanent variable attached to the character, the default "$@" - A global temporary variable. This is important for scripts which are called with no RID attached, that is, not triggered by a specific character object. -"." - A variable that exists on the NPC as long as the server is running. - They are only accessible from inside the NPC or by calling +"." - A NPC variable. + They exist in the NPC and dissapear when the server restarts or the + npc is reloaded. Can be accessed from inside the NPC or by calling 'getvariableofnpc'. -".@" - A temporary variable that exists until the script instance ends. - They are only accessible in that NPC instance. +".@" - A scope variable. + They are unique to the instance and scope. Each instance has it's + own scope that ends when the script ends. Calling a function with + callsub/callfunc starts a new scope, returning from the function + ends it. When a scope ends, it's variables are converted to values + ('return .@var;' returns a value, not a reference). "#" - A permanent local account variable. They are stored with all the account data in "save\accreg.txt" in TXT versions and in the SQL versions in the 'global_reg_value' @@ -546,10 +552,10 @@ Examples: $name$ - permanent global string variable $@name - temporary global integer variable $@name$ - temporary global string variable - .name - permanent npc integer variable - .name$ - permanent npc string variable -.@name - temporary npc integer variable -.@name$ - temporary npc string variable + .name - npc integer variable + .name$ - npc string variable +.@name - scope integer variable +.@name$ - scope string variable #name - permanent local account integer variable #name$ - permanent local account string variable ##name - permanent global account integer variable @@ -1473,7 +1479,7 @@ You can pass multiple arguments in a function call: getarg(0) would be 5, getarg(1) would be 4 and getarg(2) would be 3. -Getarg has an optional argument since trunk r10773. +Getarg has an optional argument since trunk r10773 and stable r10958. If the target argument exists, it is returned. Otherwise, if <default_value> is present it is returned instead, if not the script terminates immediately. diff --git a/src/map/map.c b/src/map/map.c index 6e8bf4775..4f8984041 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -1671,6 +1671,10 @@ int map_quit(struct map_session_data *sd) } if(sd->regstr) { + int i; + for( i = 0; i < sd->regstr_num; ++i ) + if( sd->regstr[i].data ) + aFree(sd->regstr[i].data); aFree(sd->regstr); sd->regstr = NULL; sd->regstr_num = 0; diff --git a/src/map/map.h b/src/map/map.h index ecdc72c4f..24b6eb052 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -365,7 +365,7 @@ struct script_reg { }; struct script_regstr { int index; - char data[256]; + char* data; }; struct status_change_entry { diff --git a/src/map/pc.c b/src/map/pc.c index 959503654..5c5b08a49 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -5898,15 +5898,19 @@ int pc_setreg(struct map_session_data* sd, int reg, int val) ARR_FIND( 0, sd->reg_num, i, sd->reg[i].index == reg ); if( i < sd->reg_num ) - // overwrite existing entry + {// overwrite existing entry sd->reg[i].data = val; - else { - // insert new entry + return 1; + } + + ARR_FIND( 0, sd->reg_num, i, sd->reg[i].data == 0 ); + if( i == sd->regstr_num ) + {// nothing free, increase size sd->reg_num++; RECREATE(sd->reg, struct script_reg, sd->reg_num); - sd->reg[i].index = reg; - sd->reg[i].data = val; } + sd->reg[i].index = reg; + sd->reg[i].data = val; return 1; } @@ -5939,27 +5943,37 @@ int pc_setregstr(struct map_session_data* sd, int reg, char* str) ARR_FIND( 0, sd->regstr_num, i, sd->regstr[i].index == reg ); if( i < sd->regstr_num ) - { - if (str && strcmp(str,"")!=0) - safestrncpy(sd->regstr[i].data, str, sizeof(sd->regstr[i].data)); - else { - sd->regstr_num--; - memcpy(&sd->regstr[i], &sd->regstr[sd->regstr_num], sizeof(sd->regstr[0])); - RECREATE(sd->regstr, struct script_regstr, sd->regstr_num); + {// found entry, update + if( str == NULL || *str == '\0' ) + {// empty string + if( sd->regstr[i].data != NULL ) + aFree(sd->regstr[i].data); + sd->regstr[i].data = NULL; + } + else if( sd->regstr[i].data ) + {// recreate + size_t len = strlen(str)+1; + RECREATE(sd->regstr[i].data, char, len); + memcpy(sd->regstr[i].data, str, len*sizeof(char)); + } + else + {// create + sd->regstr[i].data = aStrdup(str); } return 1; } - if (!str) return 1; + if( str == NULL || *str == '\0' ) + return 1;// nothing to add, empty string - sd->regstr_num++; - RECREATE(sd->regstr, struct script_regstr, sd->regstr_num); - if(sd->regstr==NULL){ - ShowFatalError("out of memory : pc_setreg\n"); - exit(EXIT_FAILURE); + ARR_FIND( 0, sd->regstr_num, i, sd->regstr[i].data == NULL ); + if( i == sd->regstr_num ) + {// nothing free, increase size + sd->regstr_num++; + RECREATE(sd->regstr, struct script_regstr, sd->regstr_num); } sd->regstr[i].index = reg; - safestrncpy(sd->regstr[i].data, str, sizeof(sd->regstr[i].data)); + sd->regstr[i].data = aStrdup(str); return 1; } @@ -5968,7 +5982,7 @@ int pc_readregistry(struct map_session_data *sd,const char *reg,int type) { struct global_reg *sd_reg; int i,max; - + nullpo_retr(0, sd); switch (type) { case 3: //Char reg diff --git a/src/map/script.c b/src/map/script.c index b0621aa40..12f9b9313 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -2268,11 +2268,8 @@ static int set_reg(struct script_state* st, TBL_PC* sd, int num, char* name, voi char* p; struct linkdb_node** n; n = (ref) ? ref : (name[1] == '@') ? st->stack->var_function : &st->script->script_vars; - p = linkdb_search(n, (void*)num); - if (p) { - linkdb_erase(n, (void*)num); - aFree(p); - } + p = linkdb_erase(n, (void*)num); + if (p) aFree(p); if (str[0]) linkdb_insert(n, (void*)num, aStrdup(str)); } return 1; |