diff options
author | panikon <panikon@zoho.com> | 2014-03-22 00:07:10 -0300 |
---|---|---|
committer | panikon <panikon@zoho.com> | 2014-03-22 00:07:10 -0300 |
commit | aa120720cec6ba1ddf6ec8ac6098fef6377dddc0 (patch) | |
tree | 17c926639ad7107be62e88cb670eaa22167a8b96 | |
parent | 26f2adab3126c5b76a93c3220ccfb4aec7db07e1 (diff) | |
download | hercules-aa120720cec6ba1ddf6ec8ac6098fef6377dddc0.tar.gz hercules-aa120720cec6ba1ddf6ec8ac6098fef6377dddc0.tar.bz2 hercules-aa120720cec6ba1ddf6ec8ac6098fef6377dddc0.tar.xz hercules-aa120720cec6ba1ddf6ec8ac6098fef6377dddc0.zip |
Fixed issue 7338 (added new char configuration char_aegis_delete)
http://hercules.ws/board/tracker/issue-7338-deleting-character/
As @jaBote requested in 26f2ada, renamed "rathena-logs-database-upgrade" to "rAthena-logs-upgrade.sql" and updated 'last revision'.
Added a 'FIXME' in db_obj_put
-rw-r--r-- | conf/char-server.conf | 5 | ||||
-rw-r--r-- | sql-files/upgrades/rAthena-logs-upgrade.sql (renamed from sql-files/upgrades/rathena-logs-database-upgrade) | 2 | ||||
-rw-r--r-- | sql-files/upgrades/rAthena-main-upgrade.sql | 2 | ||||
-rw-r--r-- | src/char/char.c | 47 | ||||
-rw-r--r-- | src/common/db.c | 2 |
5 files changed, 41 insertions, 17 deletions
diff --git a/conf/char-server.conf b/conf/char-server.conf index b1172e654..7ebb7ed00 100644 --- a/conf/char-server.conf +++ b/conf/char-server.conf @@ -150,6 +150,11 @@ char_del_level: 0 // NOTE: Requires client 2010-08-03aragexeRE or newer. char_del_delay: 86400 +// Block deletion if character is inside a guild or a party? (BOOL) +// default: 0 official: 1 +// !!This check is imposed by Aegis to avoid dead entries in databases and _is_not_needed_ as we clear data properly!! +char_aegis_delete: 0 + // What folder the DB files are in (item_db.txt, etc.) db_path: db diff --git a/sql-files/upgrades/rathena-logs-database-upgrade b/sql-files/upgrades/rAthena-logs-upgrade.sql index 7cdf58992..b523f8444 100644 --- a/sql-files/upgrades/rathena-logs-database-upgrade +++ b/sql-files/upgrades/rAthena-logs-upgrade.sql @@ -4,7 +4,7 @@ -- Remember to make a backup before applying. -- We are not liable for any data loss this may cause. -- Apply in the same database you applied your logs.sql --- Last revision: November 10, 2013, 19:00 +-- Last revised: March 21, 2014 20:30 GMT -- Upgrades to table `picklog` ALTER TABLE `picklog` MODIFY `type` enum('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U') NOT NULL default 'P'; diff --git a/sql-files/upgrades/rAthena-main-upgrade.sql b/sql-files/upgrades/rAthena-main-upgrade.sql index 165584795..9982322e5 100644 --- a/sql-files/upgrades/rAthena-main-upgrade.sql +++ b/sql-files/upgrades/rAthena-main-upgrade.sql @@ -4,7 +4,7 @@ -- Remember to make a backup before applying. -- We are not liable for any data loss this may cause. -- Apply in the same database you applied your main.sql --- Last revised: March 21, 2014 20:30 +-- Last revised: March 21, 2014 20:30 GMT -- Drop table contents from ´sc_data´ since we use a different status order than rAthena -- /!\ WARNING /!\ This will remove _ALL_ of the status effects active on the server diff --git a/src/char/char.c b/src/char/char.c index bf19a0012..0769067fd 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -125,6 +125,8 @@ int char_del_delay = 86400; int log_char = 1; // loggin char or not [devil] int log_inter = 1; // loggin inter or not [devil] +int char_aegis_delete = 0; // Verify if char is in guild/party or char and reacts as Aegis does (doesn't allow deletion), see char_delete2_req for more information + // Advanced subnet check [LuzZza] struct s_subnet { uint32 mask; @@ -3854,6 +3856,7 @@ int lan_subnetcheck(uint32 ip) } +/// Answers to deletion request (HC_DELETE_CHAR3_RESERVED) /// @param result /// 0 (0x718): An unknown error has occurred. /// 1: none/success @@ -3919,7 +3922,7 @@ void char_delete2_cancel_ack(int fd, int char_id, uint32 result) static void char_delete2_req(int fd, struct char_session_data* sd) {// CH: <0827>.W <char id>.L - int char_id, i; + int char_id, party_id, guild_id, i; char* data; time_t delete_date; @@ -3946,22 +3949,34 @@ static void char_delete2_req(int fd, struct char_session_data* sd) return; } -/* - // Aegis imposes these checks probably to avoid dead member - // entries in guilds/parties, otherwise they are not required. - // TODO: Figure out how these are enforced during waiting. - if( guild_id ) - {// character in guild - char_delete2_ack(fd, char_id, 4, 0); - return; - } + // This check is imposed by Aegis to avoid dead entries in databases + // _it is not needed_ as we clear data properly + // see issue: 7338 + if( char_aegis_delete ) + { + if( SQL_SUCCESS != SQL->Query(sql_handle, "SELECT `party_id`, `guild_id` FROM `%s` WHERE `char_id`='%d'", char_db, char_id) + || SQL_SUCCESS != SQL->NextRow(sql_handle) + ) + { + Sql_ShowDebug(sql_handle); + char_delete2_ack(fd, char_id, 3, 0); + return; + } + SQL->GetData(sql_handle, 0, &data, NULL); party_id = atoi(data); + SQL->GetData(sql_handle, 1, &data, NULL); guild_id = atoi(data); - if( party_id ) - {// character in party - char_delete2_ack(fd, char_id, 5, 0); - return; + if( guild_id ) + { + char_delete2_ack(fd, char_id, 4, 0); + return; + } + + if( party_id ) + { + char_delete2_ack(fd, char_id, 5, 0); + return; + } } -*/ // success delete_date = time(NULL)+char_del_delay; @@ -5258,6 +5273,8 @@ int char_config_read(const char* cfgName) char_del_level = atoi(w2); } else if (strcmpi(w1, "char_del_delay") == 0) { char_del_delay = atoi(w2); + } else if (strcmpi(w1, "char_aegis_delete") == 0) { + char_aegis_delete = atoi(w2); } else if(strcmpi(w1,"db_path")==0) { safestrncpy(db_path, w2, sizeof(db_path)); } else if (strcmpi(w1, "fame_list_alchemist") == 0) { diff --git a/src/common/db.c b/src/common/db.c index 8c15c0feb..8d6b08815 100644 --- a/src/common/db.c +++ b/src/common/db.c @@ -1846,6 +1846,8 @@ static DBData* db_obj_ensure(DBMap* self, DBKey key, DBCreateData create, ...) * @protected * @see #db_malloc_dbn(void) * @see DBMap#put + * FIXME: If this method fails shouldn't it return another value? + * Other functions rely on this to know if they were able to put something [Panikon] */ static int db_obj_put(DBMap* self, DBKey key, DBData data, DBData *out_data) { |