summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt3
-rw-r--r--conf-tmpl/battle/gm.conf5
-rw-r--r--src/map/battle.c3
-rw-r--r--src/map/battle.h1
-rw-r--r--src/map/map.c35
5 files changed, 38 insertions, 9 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 2b29660c7..7922cbe14 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,9 @@ 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.
2006/09/01
+ * Added config setting "partial_name_scan", which specifies whether @ given
+ names should use a partial string lookup or absolute name lookup. Defaults
+ to no (gm.conf) [Skotlex]
* Expanded status_calc_misc so it may also calculate the batk of characters
as well as their regen data (if they have it) [Skotlex]
* Fixed a memory leak when using charsave_method:1 [Skotlex]
diff --git a/conf-tmpl/battle/gm.conf b/conf-tmpl/battle/gm.conf
index cf16b3b45..b5aff6ba1 100644
--- a/conf-tmpl/battle/gm.conf
+++ b/conf-tmpl/battle/gm.conf
@@ -33,6 +33,11 @@ atcommand_spawn_quantity_limit: 100
// Maximum number of slave-clones that can be have by using the @slaveclone at command. (0 denotes unlimited quantity)
atcommand_slave_clone_limit: 25
+// If 'no', commands require exact player name. If 'yes', entering a partial
+// name will work, as long as there's only one match from all players in the
+// current map server.
+partial_name_scan: yes
+
// [GM] Can use all skills? (No or mimimum GM level)
gm_all_skill: no
diff --git a/src/map/battle.c b/src/map/battle.c
index 5265dd270..e77a26e2e 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -3193,6 +3193,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
} else //Excepting traps and icewall, you should not be able to target skills.
return 0;
}
+ break;
//Valid targets with no special checks here.
case BL_HOM:
break;
@@ -3479,6 +3480,7 @@ static const struct battle_data_short {
{ "atcommand_gm_only", &battle_config.atc_gmonly },
{ "atcommand_spawn_quantity_limit", &battle_config.atc_spawn_quantity_limit },
{ "atcommand_slave_clone_limit", &battle_config.atc_slave_clone_limit},
+ { "partial_name_scan", &battle_config.partial_name_scan },
{ "gm_all_skill", &battle_config.gm_allskill },
{ "gm_all_skill_add_abra", &battle_config.gm_allskill_addabra },
{ "gm_all_equipment", &battle_config.gm_allequip },
@@ -3884,6 +3886,7 @@ void battle_set_defaults() {
battle_config.atc_gmonly=0;
battle_config.atc_spawn_quantity_limit=0;
battle_config.atc_slave_clone_limit=0;
+ battle_config.partial_name_scan=0;
battle_config.gm_allskill=0;
battle_config.gm_allequip=0;
battle_config.gm_skilluncond=0;
diff --git a/src/map/battle.h b/src/map/battle.h
index f4cdbd58d..fec0a9025 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -134,6 +134,7 @@ extern struct Battle_Config {
unsigned short atc_gmonly;
unsigned short atc_spawn_quantity_limit;
unsigned short atc_slave_clone_limit;
+ unsigned short partial_name_scan;
unsigned short gm_allskill;
unsigned short gm_allskill_addabra;
unsigned short gm_allequip;
diff --git a/src/map/map.c b/src/map/map.c
index 61527cadb..87300b2e4 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -1787,15 +1787,32 @@ struct map_session_data * map_nick2sd(char *nick) {
if (nick == NULL)
return NULL;
- pl_allsd = map_getallusers(&users);
-
- for (i = 0; i < users; i++) {
- pl_sd = pl_allsd[i];
- // Without case sensitive check (increase the number of similar character names found)
- if (strcasecmp(pl_sd->status.name, nick) == 0)
- return pl_sd;
- }
- // Exact character name is not found and 0 or more than 1 similar characters have been found ==> we say not found
+ pl_allsd = map_getallusers(&users);
+ if (battle_config.partial_name_scan)
+ {
+ int qty = 0, nicklen = strlen(nick);
+ struct map_session_data *sd = NULL;
+ for (i = 0; i < users; i++) {
+ pl_sd = pl_allsd[i];
+ // Without case sensitive check (increase the number of similar character names found)
+ if (strnicmp(pl_sd->status.name, nick, nicklen) == 0) {
+ // Strict comparison (if found, we finish the function immediatly with correct value)
+ if (strcmp(pl_sd->status.name, nick) == 0)
+ return pl_sd;
+ qty++;
+ sd = pl_sd;
+ }
+ }
+ // We return the found index of a similar account ONLY if there is 1 similar character
+ if (qty == 1)
+ return sd;
+ } else { //Exact Search
+ for (i = 0; i < users; i++) {
+ if (strcasecmp(pl_allsd[i]->status.name, nick) == 0)
+ return pl_allsd[i];
+ }
+ }
+ //Not found.
return NULL;
}