summaryrefslogtreecommitdiff
path: root/src/char_sql/char.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/char_sql/char.c')
-rw-r--r--src/char_sql/char.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
index 7c912af8c..bbae5f76e 100644
--- a/src/char_sql/char.c
+++ b/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;