From a54bb653de6444ebb98c48e21d81e7f7e20f5a94 Mon Sep 17 00:00:00 2001 From: aleos89 Date: Fri, 8 Jan 2016 12:27:10 -0500 Subject: [PATCH] Randomized Start Point * Fixes #805 --- conf/char_athena.conf | 8 ++++--- src/char/char.c | 50 +++++++++++++++++++++++++++++-------------- src/char/char.h | 5 ++++- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/conf/char_athena.conf b/conf/char_athena.conf index 5d8c12ec46..6e40aa9496 100644 --- a/conf/char_athena.conf +++ b/conf/char_athena.conf @@ -108,9 +108,11 @@ autosave_time: 60 save_log: yes // Starting point for new characters -// Format: ,, -start_point: iz_int,97,90 -start_point_pre: new_1-1,53,111 +// Format: ,,{:,,...} +// Max number of start points is MAX_STARTPOINT in char.h (default 5) +// Location is randomly picked on character creation. +start_point: iz_int,97,90,iz_int01,97,90,iz_int02,97,90,iz_int03,97,90,iz_int04,97,90 +start_point_pre: new_1-1,53,111,new_2-1,53,111,new_3-1,53,111,new_4-1,53,111,new_5-1,53,111 // Starting items for new characters // Max number of items is MAX_STARTITEM in char.c (default 32) diff --git a/src/char/char.c b/src/char/char.c index 3950732514..3188a34f88 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -1421,7 +1421,7 @@ int char_make_new_char_sql(struct char_session_data* sd, char* name_, int str, i char name[NAME_LENGTH]; char esc_name[NAME_LENGTH*2+1]; uint32 char_id; - int flag, k; + int flag, k, start_point_idx = rand() % charserv_config.start_point_count; safestrncpy(name, name_, NAME_LENGTH); normalize_name(name,TRIM_CHARS); @@ -1473,7 +1473,7 @@ int char_make_new_char_sql(struct char_session_data* sd, char* name_, int str, i "'%d', '%d', '%s', '%d', '%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')", schema_config.char_db, sd->account_id , slot, esc_name, charserv_config.start_zeny, 48, str, agi, vit, int_, dex, luk, (40 * (100 + vit)/100) , (40 * (100 + vit)/100 ), (11 * (100 + int_)/100), (11 * (100 + int_)/100), hair_style, hair_color, - mapindex_id2name(charserv_config.start_point.map), charserv_config.start_point.x, charserv_config.start_point.y, mapindex_id2name(charserv_config.start_point.map), charserv_config.start_point.x, charserv_config.start_point.y) ) + mapindex_id2name(charserv_config.start_point[start_point_idx].map), charserv_config.start_point[start_point_idx].x, charserv_config.start_point[start_point_idx].y, mapindex_id2name(charserv_config.start_point[start_point_idx].map), charserv_config.start_point[start_point_idx].x, charserv_config.start_point[start_point_idx].y) ) { Sql_ShowDebug(sql_handle); return -2; //No, stop the procedure! @@ -1485,7 +1485,7 @@ int char_make_new_char_sql(struct char_session_data* sd, char* name_, int str, i "'%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')", schema_config.char_db, sd->account_id , slot, esc_name, charserv_config.start_zeny, str, agi, vit, int_, dex, luk, (40 * (100 + vit)/100) , (40 * (100 + vit)/100 ), (11 * (100 + int_)/100), (11 * (100 + int_)/100), hair_style, hair_color, - mapindex_id2name(charserv_config.start_point.map), charserv_config.start_point.x, charserv_config.start_point.y, mapindex_id2name(charserv_config.start_point.map), charserv_config.start_point.x, charserv_config.start_point.y) ) + mapindex_id2name(charserv_config.start_point[start_point_idx].map), charserv_config.start_point[start_point_idx].x, charserv_config.start_point[start_point_idx].y, mapindex_id2name(charserv_config.start_point[start_point_idx].map), charserv_config.start_point[start_point_idx].x, charserv_config.start_point[start_point_idx].y) ) { Sql_ShowDebug(sql_handle); return -2; //No, stop the procedure! @@ -2635,9 +2635,10 @@ void char_set_defaults(){ charserv_config.char_check_db =1; //see const.h to change those default - charserv_config.start_point.map = mapindex_name2id(MAP_DEFAULT_NAME); - charserv_config.start_point.x = MAP_DEFAULT_X; - charserv_config.start_point.y = MAP_DEFAULT_Y; + charserv_config.start_point[0].map = mapindex_name2id(MAP_DEFAULT_NAME); + charserv_config.start_point[0].x = MAP_DEFAULT_X; + charserv_config.start_point[0].y = MAP_DEFAULT_Y; + charserv_config.start_point_count = 0; charserv_config.console = 0; charserv_config.max_connect_user = -1; @@ -2747,17 +2748,34 @@ bool char_config_read(const char* cfgName, bool normal){ #else } else if (strcmpi(w1, "start_point_pre") == 0) { #endif - char map[MAP_NAME_LENGTH_EXT]; - short x, y; - if (sscanf(w2, "%15[^,],%6hd,%6hd", map, &x, &y) < 3){ - ShowWarning( "Specified start_point has an invalid format.\n" ); - continue; + int i = 0, fields_length = 3 + 1; + char *lineitem, **fields; + + fields = (char**)aMalloc(fields_length * sizeof(char*)); + lineitem = strtok(w2, ":"); + + while (lineitem != NULL) { + int n = sv_split(lineitem, strlen(lineitem), 0, ',', fields, fields_length, SV_NOESCAPE_NOTERMINATE); + + if (n + 1 < fields_length) { + ShowDebug("start_point: not enough arguments for %s! Skipping...\n", lineitem); + lineitem = strtok(NULL, ":"); //next itemline + continue; + } + if (i > MAX_STARTPOINT) { + ShowDebug("start_point: too many start points, only %d are allowed! Ignoring parameter %s...\n", MAX_STARTPOINT, lineitem); + } else { + charserv_config.start_point[i].map = mapindex_name2id(fields[1]); + if (!charserv_config.start_point[i].map) + ShowError("Specified start_point %s not found in map-index cache.\n", charserv_config.start_point[i].map); + charserv_config.start_point[i].x = max(0, atoi(fields[2])); + charserv_config.start_point[i].y = max(0, atoi(fields[3])); + charserv_config.start_point_count++; + } + lineitem = strtok(NULL, ":"); //next itemline + i++; } - charserv_config.start_point.map = mapindex_name2id(map); - if (!charserv_config.start_point.map) - ShowError("Specified start_point %s not found in map-index cache.\n", map); - charserv_config.start_point.x = x; - charserv_config.start_point.y = y; + aFree(fields); } else if (strcmpi(w1, "start_zeny") == 0) { charserv_config.start_zeny = atoi(w2); if (charserv_config.start_zeny < 0) diff --git a/src/char/char.h b/src/char/char.h index 6ac44a0202..c7e9e2899a 100644 --- a/src/char/char.h +++ b/src/char/char.h @@ -15,6 +15,8 @@ extern int login_fd; //login file descriptor extern int char_fd; //char file descriptor +#define MAX_STARTPOINT 5 + enum E_CHARSERVER_ST { CHARSERVER_ST_RUNNING = CORE_ST_LAST, CHARSERVER_ST_STARTING, @@ -142,7 +144,8 @@ struct CharServ_Config { int log_inter; // loggin inter or not [devil] int char_check_db; ///cheking sql-table at begining ? - struct point start_point; // Initial position the player will spawn on server + struct point start_point[MAX_STARTPOINT]; // Initial position the player will spawn on server + short start_point_count; int console; int max_connect_user; int gm_allow_group;