Browse Source

added char deletion condition by BaseLevel

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@8420 54d463be-8e91-2dee-dedb-b68131a5f0ec
Lupus 19 years ago
parent
commit
796497fae5
3 changed files with 40 additions and 6 deletions
  1. 3 0
      Changelog-Trunk.txt
  2. 7 0
      conf-tmpl/char_athena.conf
  3. 30 6
      src/char_sql/char.c

+ 3 - 0
Changelog-Trunk.txt

@@ -3,6 +3,9 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2006/08/22
+	* Added option to disable character deletion of certain levels [Lupus]
+		check char_athena.conf for this option format
 2006/08/21
 	* Some more cleaning up of the splash skill code. Now the passed hit value
 	  for the splash targetted mobs is 9 instead of 5, this allows multi-hitting

+ 7 - 0
conf-tmpl/char_athena.conf

@@ -205,6 +205,13 @@ log_char: 1
 // How many Characters are allowed per Account ? (0 = disabled) [SQL Only!]
 chars_per_account: 0
 
+// Restrict character deletion by BaseLevel
+// 0: no restriction (players can delete characters of may levels)
+// -X: you can't delete chars with BaseLevel <= X
+// Y: you can't delete chars with BaseLevel >= Y
+// e.g. char_del_level: 80 (players can't delete characters with 80+ BaseLevel)
+char_del_level: 0
+
 // What folder the DB files are in (item_db.txt, etc.)
 db_path: db
 

+ 30 - 6
src/char_sql/char.c

@@ -92,6 +92,7 @@ char char_name_letters[1024] = ""; // list of letters/symbols used to authorise
 //The following are characters that are trimmed regardless because they cause confusion and problems on the servers. [Skotlex]
 #define TRIM_CHARS "\032\t\x0A\x0D "
 int char_per_account = 0; //Maximum charas per account (default unlimited) [Sirius]
+int char_del_level = 0; //From which level u can delete character [Lupus]
 
 int log_char = 1;	// loggin char or not [devil]
 int log_inter = 1;	// loggin inter or not [devil]
@@ -135,7 +136,7 @@ int max_connect_user = 0;
 int gm_allow_level = 99;
 int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
 int save_log = 1;
-int start_zeny = 500;
+int start_zeny = 0;
 int start_weapon = 1201;
 int start_armor = 2301;
 int guild_exp_rate = 100;
@@ -1478,9 +1479,9 @@ int make_new_char_sql(int fd, unsigned char *dat) {
 int delete_char_sql(int char_id, int partner_id)
 {
 	char char_name[NAME_LENGTH], t_name[NAME_LENGTH*2]; //Name needs be escaped.
-	int account_id=0, party_id=0, guild_id=0;
+	int account_id=0, party_id=0, guild_id=0, char_base_level=0;
 	
-	sprintf(tmp_sql, "SELECT `name`,`account_id`,`party_id`,`guild_id` FROM `%s` WHERE `char_id`='%d'",char_db, char_id);
+	sprintf(tmp_sql, "SELECT `name`,`account_id`,`party_id`,`guild_id`,`baselevel` FROM `%s` WHERE `char_id`='%d'",char_db, char_id);
 
 	if (mysql_query(&mysql_handle, tmp_sql)) {
 		ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
@@ -1505,8 +1506,20 @@ int delete_char_sql(int char_id, int partner_id)
 	account_id = atoi(sql_row[1]);
 	party_id = atoi(sql_row[2]);
 	guild_id = atoi(sql_row[3]);
+	char_base_level = atoi(sql_row[4]);
 	mysql_free_result(sql_res); //Let's free this as soon as possible to avoid problems later on.
 
+	//check for config char del condition [Lupus]
+	if(char_del_level!=0){
+		if(
+			( char_del_level > 0 && char_base_level >= char_del_level )
+			|| ( char_del_level < 0 && char_base_level <= -char_del_level )
+		) {
+			ShowInfo("Char deletion aborted: %s, BaseLevel: %i\n",char_name,char_base_level);
+			return -1;
+		}
+	}
+
 	/* Divorce [Wizputer] */
 	if (partner_id) {
 		sprintf(tmp_sql,"UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d'",char_db,partner_id);
@@ -3513,7 +3526,7 @@ int parse_char(int fd) {
 					RFIFOSKIP(fd, 46);
 					break;
 				}
-			}
+			}				
 			
 			for(i = 0; i < 9; i++) {
 				/* Debug:
@@ -3554,7 +3567,16 @@ int parse_char(int fd) {
 				mysql_free_result(sql_res);
 			
 				/* Delete character and partner (if any) */
-				delete_char_sql(cid, char_pid);
+				if(delete_char_sql(cid, char_pid)<0){
+					//can't delete the char
+					//either SQL error or can't delete by some CONFIG conditions
+					//del fail
+					WFIFOW(fd, 0) = 0x70;
+					WFIFOB(fd, 2) = 0;
+					WFIFOSET(fd, 3);
+					RFIFOSKIP(fd, 46);
+					break;
+				}
 				if (char_pid != 0)
 				{	/* If there is partner, tell map server to do divorce */
 					WBUFW(buf,0) = 0x2b12;
@@ -3563,7 +3585,7 @@ int parse_char(int fd) {
 					mapif_sendall(buf,10);
 				}
 			}
-			/* Char successfully deleted. <- For sure? There could had been an sql db error, what is done then?. [Skotlex] */
+			/* Char successfully deleted.
 			WFIFOW(fd, 0) = 0x6f;
 			WFIFOSET(fd, 2);
 				
@@ -4144,6 +4166,8 @@ int char_config_read(const char *cfgName) {
 			check_ip_flag = config_switch(w2);
 		} else if (strcmpi(w1, "chars_per_account") == 0) { //maxchars per account [Sirius]
 			char_per_account = atoi(w2);
+		} else if (strcmpi(w1, "char_del_level") == 0) { //disable/enable char deletion by its level condition [Lupus]
+			char_del_level = atoi(w2);
 		} else if (strcmpi(w1, "console") == 0) {
 			if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
 				console = 1;