From 9a651bc6c9a65c69f6afe858ec12c7aa42751340 Mon Sep 17 00:00:00 2001 From: Ibrahim Zidan Date: Sat, 4 May 2019 23:40:41 +0200 Subject: Fix inter-server deleting zeny from rodex mails when a player requests to take item Signed-off-by: Ibrahim Zidan --- src/char/int_rodex.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/char') diff --git a/src/char/int_rodex.c b/src/char/int_rodex.c index ffa5f5452..fbf628f32 100644 --- a/src/char/int_rodex.c +++ b/src/char/int_rodex.c @@ -493,8 +493,6 @@ static bool inter_rodex_updatemail(int fd, int account_id, int char_id, int64 ma const int count = inter_rodex->getitems(mail_id, &items[0]); if (SQL_ERROR == SQL->Query(inter->sql_handle, "DELETE FROM `%s` WHERE `mail_id` = '%"PRId64"'", rodex_item_db, mail_id)) Sql_ShowDebug(inter->sql_handle); - if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET `zeny` = 0, `type` = `type` & (~4) WHERE `mail_id` = '%"PRId64"'", rodex_db, mail_id)) - Sql_ShowDebug(inter->sql_handle); mapif->rodex_getitemsack(fd, char_id, mail_id, opentype, count, &items[0]); break; } -- cgit v1.2.3-70-g09d2 From a4e2fb4431dfb4c914d0e315d1e43fb05ae489ec Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 10 Apr 2019 00:56:34 +0300 Subject: Truncate too big time in guild member login time field --- src/char/int_guild.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/char') diff --git a/src/char/int_guild.c b/src/char/int_guild.c index 9c0be1629..aabf562a2 100644 --- a/src/char/int_guild.c +++ b/src/char/int_guild.c @@ -444,8 +444,14 @@ static struct guild *inter_guild_fromsql(int guild_id) m->position = MAX_GUILDPOSITION - 1; SQL->GetData(inter->sql_handle, 11, &data, &len); memcpy(m->name, data, min(len, NAME_LENGTH)); SQL->GetData(inter->sql_handle, 12, &data, NULL); - if (data != NULL) + if (data != NULL) { m->last_login = atoi(data); + // 2036-12-31 + if (m->last_login > 2114283600) { + ShowError("Last login time bigger than allowd value in %d:%s: %u\n", guild_id, g->name, m->last_login); + m->last_login = 0; + } + } m->modified = GS_MEMBER_UNMODIFIED; } -- cgit v1.2.3-70-g09d2 From 21557e413a1ed62d2b8321761009b80d13b09379 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 14 Apr 2019 18:19:49 +0300 Subject: Fix compilation for old packet versions (Fixes #2438) --- src/char/char.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/char') diff --git a/src/char/char.c b/src/char/char.c index 5528fb8aa..44225ecb5 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -2153,11 +2153,13 @@ static void char_send_HC_ACK_CHARINFO_PER_PAGE(int fd, struct char_session_data static void char_send_HC_ACK_CHARINFO_PER_PAGE_tail(int fd, struct char_session_data *sd) { +#if PACKETVER_MAIN_NUM >= 20130522 || PACKETVER_RE_NUM >= 20130327 || defined(PACKETVER_ZERO) WFIFOHEAD(fd, sizeof(struct PACKET_HC_ACK_CHARINFO_PER_PAGE)); struct PACKET_HC_ACK_CHARINFO_PER_PAGE *p = WFIFOP(fd, 0); p->packetId = HEADER_HC_ACK_CHARINFO_PER_PAGE; p->packetLen = sizeof(struct PACKET_HC_ACK_CHARINFO_PER_PAGE); WFIFOSET(fd, p->packetLen); +#endif } /* Sends character ban list */ -- cgit v1.2.3-70-g09d2 From 7a95d8dfe44a37759dab2bef67c65ef5f1786ff4 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 25 Apr 2019 02:09:46 +0300 Subject: Add char_id into struct guild_expulsion Also use char_id in packet ZC_BAN_LIST. --- src/char/int_guild.c | 12 +++++++----- src/common/mmo.h | 1 + src/map/clif.c | 3 ++- 3 files changed, 10 insertions(+), 6 deletions(-) (limited to 'src/char') diff --git a/src/char/int_guild.c b/src/char/int_guild.c index aabf562a2..8e05c76e2 100644 --- a/src/char/int_guild.c +++ b/src/char/int_guild.c @@ -319,8 +319,8 @@ static int inter_guild_tosql(struct guild *g, int flag) SQL->EscapeStringLen(inter->sql_handle, esc_name, e->name, strnlen(e->name, NAME_LENGTH)); SQL->EscapeStringLen(inter->sql_handle, esc_mes, e->mes, strnlen(e->mes, sizeof(e->mes))); - if( SQL_ERROR == SQL->Query(inter->sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`name`,`mes`) " - "VALUES ('%d','%d','%s','%s')", guild_expulsion_db, g->guild_id, e->account_id, esc_name, esc_mes) ) + if( SQL_ERROR == SQL->Query(inter->sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`, `char_id`, `name`,`mes`) " + "VALUES ('%d','%d','%d','%s','%s')", guild_expulsion_db, g->guild_id, e->account_id, e->char_id, esc_name, esc_mes) ) Sql_ShowDebug(inter->sql_handle); } } @@ -494,7 +494,7 @@ static struct guild *inter_guild_fromsql(int guild_id) } //printf("- Read guild_expulsion %d from sql \n",guild_id); - if( SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `account_id`,`name`,`mes` FROM `%s` WHERE `guild_id`='%d'", guild_expulsion_db, guild_id) ) + if( SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `account_id`,`char_id`,`name`,`mes` FROM `%s` WHERE `guild_id`='%d'", guild_expulsion_db, guild_id) ) { Sql_ShowDebug(inter->sql_handle); aFree(g); @@ -505,8 +505,9 @@ static struct guild *inter_guild_fromsql(int guild_id) struct guild_expulsion *e = &g->expulsion[i]; SQL->GetData(inter->sql_handle, 0, &data, NULL); e->account_id = atoi(data); - SQL->GetData(inter->sql_handle, 1, &data, &len); memcpy(e->name, data, min(len, NAME_LENGTH)); - SQL->GetData(inter->sql_handle, 2, &data, &len); memcpy(e->mes, data, min(len, sizeof(e->mes))); + SQL->GetData(inter->sql_handle, 1, &data, NULL); e->char_id = atoi(data); + SQL->GetData(inter->sql_handle, 2, &data, &len); memcpy(e->name, data, min(len, NAME_LENGTH)); + SQL->GetData(inter->sql_handle, 3, &data, &len); memcpy(e->mes, data, min(len, sizeof(e->mes))); } //printf("- Read guild_skill %d from sql \n",guild_id); @@ -1044,6 +1045,7 @@ static bool inter_guild_leave(int guild_id, int account_id, int char_id, int fla } // Save the expulsion entry g->expulsion[j].account_id = account_id; + g->expulsion[j].char_id = char_id; safestrncpy(g->expulsion[j].name, g->member[i].name, NAME_LENGTH); safestrncpy(g->expulsion[j].mes, mes, 40); } diff --git a/src/common/mmo.h b/src/common/mmo.h index a29b0f2db..aafa54008 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -856,6 +856,7 @@ struct guild_expulsion { char name[NAME_LENGTH]; char mes[40]; int account_id; + int char_id; }; struct guild_skill { diff --git a/src/map/clif.c b/src/map/clif.c index a7bcc5801..336bbb752 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -8405,6 +8405,7 @@ static void clif_guild_expulsion(struct map_session_data *sd, const char *name, #endif safestrncpy(&p.reason[0], mes, 40); +// version unconfirmed #if PACKETVER < 20100803 memset(&p.account_name, 0, NAME_LENGTH); // account name (not used for security reasons) #endif @@ -8437,7 +8438,7 @@ static void clif_guild_expulsionlist(struct map_session_data *sd) if (e->account_id > 0) { #if PACKETVER_MAIN_NUM >= 20161019 || PACKETVER_RE_NUM >= 20160921 || defined(PACKETVER_ZERO) - packet->chars[c].char_id = 0; // for now char_id unknown [4144] + packet->chars[c].char_id = e->char_id; // version unconfirmed #elif PACKETVER >= 20100803 memcpy(packet->chars[c].char_name, e->name, NAME_LENGTH); -- cgit v1.2.3-70-g09d2 From 62ee0d94b98493e60d41c8a5a3ec27a7246a21e9 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 8 May 2019 23:48:48 +0300 Subject: Add define MAX_HOTKEYS_DB for max stored hotkeys in db For new RE clients it's double of MAX_HOTKEYS --- src/char/char.c | 2 +- src/common/mmo.h | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'src/char') diff --git a/src/char/char.c b/src/char/char.c index 44225ecb5..81856a25d 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -1415,7 +1415,7 @@ static int char_mmo_char_fromsql(int char_id, struct mmo_charstatus *p, bool loa while( SQL_SUCCESS == SQL->StmtNextRow(stmt) ) { - if( hotkey_num >= 0 && hotkey_num < MAX_HOTKEYS ) + if( hotkey_num >= 0 && hotkey_num < MAX_HOTKEYS_DB ) memcpy(&p->hotkeys[hotkey_num], &tmp_hotkey, sizeof(tmp_hotkey)); else ShowWarning("chr->mmo_char_fromsql: ignoring invalid hotkey (hotkey=%d,type=%u,id=%u,lv=%u) of character %s (AID=%d,CID=%d)\n", hotkey_num, tmp_hotkey.type, tmp_hotkey.id, tmp_hotkey.lv, p->name, p->account_id, p->char_id); diff --git a/src/common/mmo.h b/src/common/mmo.h index eb74d62b3..c62fd31d0 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -151,6 +151,12 @@ #endif // 20090603 #endif // 20070227 +#if PACKETVER_RE_NUM >= 20190508 +#define MAX_HOTKEYS_DB ((MAX_HOTKEYS) * 2) +#else +#define MAX_HOTKEYS_DB MAX_HOTKEYS +#endif + #if PACKETVER >= 20150805 /* Cart Decoration */ #define CART_DECORATION #define MAX_CARTDECORATION_CARTS 3 // Currently there are 3 Carts available in kRO. [Frost] @@ -732,7 +738,7 @@ struct mmo_charstatus { struct s_friend friends[MAX_FRIENDS]; //New friend system [Skotlex] #ifdef HOTKEY_SAVING - struct hotkey hotkeys[MAX_HOTKEYS]; + struct hotkey hotkeys[MAX_HOTKEYS_DB]; #endif bool show_equip; bool allow_party; -- cgit v1.2.3-70-g09d2 From 70b5e954990b857946d81750263bcf11b06414ce Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 9 May 2019 18:12:01 +0300 Subject: Use separate field hotkey_rowshift for each hotkeys group --- sql-files/main.sql | 2 ++ sql-files/upgrades/2019-05-09--18-07.sql | 22 ++++++++++++++++++++++ sql-files/upgrades/index.txt | 1 + src/char/char.c | 21 +++++++++++---------- src/common/mmo.h | 1 + src/map/clif.c | 11 ++++++++--- 6 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 sql-files/upgrades/2019-05-09--18-07.sql (limited to 'src/char') diff --git a/sql-files/main.sql b/sql-files/main.sql index 241efd39b..e364ec778 100644 --- a/sql-files/main.sql +++ b/sql-files/main.sql @@ -241,6 +241,7 @@ CREATE TABLE IF NOT EXISTS `char` ( `uniqueitem_counter` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0', `sex` ENUM('M','F','U') NOT NULL DEFAULT 'U', `hotkey_rowshift` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', + `hotkey_rowshift2` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', `attendance_count` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', `attendance_timer` BIGINT(20) NULL DEFAULT '0', `title_id` INT(11) UNSIGNED NOT NULL DEFAULT '0', @@ -928,6 +929,7 @@ INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1544738447); -- 2018-12-1 INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1546059075); -- 2018-12-29--07-51.sql INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1554760320); -- 2019-04-08--21-52.sql INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1556147483); -- 2019-04-25--02-12.sql +INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1557414445); -- 2019-05-09--18-07.sql -- -- Table structure for table `storage` diff --git a/sql-files/upgrades/2019-05-09--18-07.sql b/sql-files/upgrades/2019-05-09--18-07.sql new file mode 100644 index 000000000..96d80c29c --- /dev/null +++ b/sql-files/upgrades/2019-05-09--18-07.sql @@ -0,0 +1,22 @@ +#1557414445 + +-- This file is part of Hercules. +-- http://herc.ws - http://github.com/HerculesWS/Hercules +-- +-- Copyright (C) 2015 Hercules Dev Team +-- +-- Hercules is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +ALTER TABLE `char` ADD COLUMN `hotkey_rowshift2` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `hotkey_rowshift`; +INSERT INTO `sql_updates` (`timestamp`) VALUES (1557414445); diff --git a/sql-files/upgrades/index.txt b/sql-files/upgrades/index.txt index a820f3b0d..3025a728c 100644 --- a/sql-files/upgrades/index.txt +++ b/sql-files/upgrades/index.txt @@ -54,3 +54,4 @@ 2018-12-29--07-51.sql 2019-04-08--21-52.sql 2019-04-25--02-12.sql +2019-05-09--18-07.sql diff --git a/src/char/char.c b/src/char/char.c index 81856a25d..cad28b373 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -477,7 +477,7 @@ static int char_mmo_char_tosql(int char_id, struct mmo_charstatus *p) (p->look.head_mid != cp->look.head_mid) || (p->look.head_bottom != cp->look.head_bottom) || (p->delete_date != cp->delete_date) || (p->rename != cp->rename) || (p->slotchange != cp->slotchange) || (p->look.robe != cp->look.robe) || (p->show_equip != cp->show_equip) || (p->allow_party != cp->allow_party) || (p->font != cp->font) || - (p->uniqueitem_counter != cp->uniqueitem_counter) || (p->hotkey_rowshift != cp->hotkey_rowshift) || + (p->uniqueitem_counter != cp->uniqueitem_counter) || (p->hotkey_rowshift != cp->hotkey_rowshift) || (p->hotkey_rowshift2 != cp->hotkey_rowshift2) || (p->clan_id != cp->clan_id) || (p->last_login != cp->last_login) || (p->attendance_count != cp->attendance_count) || (p->attendance_timer != cp->attendance_timer) || (p->title_id != cp->title_id) || (p->inventorySize != cp->inventorySize) || (p->allow_call != cp->allow_call) @@ -507,7 +507,7 @@ static int char_mmo_char_tosql(int char_id, struct mmo_charstatus *p) "`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d'," "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `rename`='%d'," "`delete_date`='%lu',`robe`='%d',`slotchange`='%d', `char_opt`='%u', `font`='%u', `uniqueitem_counter` ='%u'," - "`hotkey_rowshift`='%d',`clan_id`='%d',`last_login`='%"PRId64"',`attendance_count`='%d',`attendance_timer`='%"PRId64"'," + "`hotkey_rowshift`='%d',`hotkey_rowshift2`='%d',`clan_id`='%d',`last_login`='%"PRId64"',`attendance_count`='%d',`attendance_timer`='%"PRId64"'," "`title_id`='%d', `inventory_size`='%d'" " WHERE `account_id`='%d' AND `char_id` = '%d'", char_db, p->base_level, p->job_level, @@ -520,7 +520,7 @@ static int char_mmo_char_tosql(int char_id, struct mmo_charstatus *p) mapindex_id2name(p->save_point.map), p->save_point.x, p->save_point.y, p->rename, (unsigned long)p->delete_date, // FIXME: platform-dependent size p->look.robe,p->slotchange,opt,p->font,p->uniqueitem_counter, - p->hotkey_rowshift,p->clan_id,p->last_login, p->attendance_count, p->attendance_timer, + p->hotkey_rowshift,p->hotkey_rowshift2,p->clan_id,p->last_login, p->attendance_count, p->attendance_timer, p->title_id, p->inventorySize, p->account_id, p->char_id) ) { @@ -1215,7 +1215,7 @@ static int char_mmo_char_fromsql(int char_id, struct mmo_charstatus *p, bool loa "`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`elemental_id`,`hair`," "`hair_color`,`clothes_color`,`body`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`last_x`,`last_y`," "`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`,`robe`,`slotchange`," - "`char_opt`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`clan_id`,`last_login`, `attendance_count`, `attendance_timer`," + "`char_opt`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`hotkey_rowshift2`,`clan_id`,`last_login`, `attendance_count`, `attendance_timer`," "`title_id`, `inventory_size`" " FROM `%s` WHERE `char_id`=? LIMIT 1", char_db) || SQL_ERROR == SQL->StmtBindParam(stmt, 0, SQLDT_INT, &char_id, sizeof char_id) @@ -1279,12 +1279,13 @@ static int char_mmo_char_fromsql(int char_id, struct mmo_charstatus *p, bool loa || SQL_ERROR == SQL->StmtBindColumn(stmt, 56, SQLDT_UINT32, &p->uniqueitem_counter, sizeof p->uniqueitem_counter, NULL, NULL) || SQL_ERROR == SQL->StmtBindColumn(stmt, 57, SQLDT_ENUM, &sex, sizeof sex, NULL, NULL) || SQL_ERROR == SQL->StmtBindColumn(stmt, 58, SQLDT_UCHAR, &p->hotkey_rowshift, sizeof p->hotkey_rowshift, NULL, NULL) - || SQL_ERROR == SQL->StmtBindColumn(stmt, 59, SQLDT_INT, &p->clan_id, sizeof p->clan_id, NULL, NULL) - || SQL_ERROR == SQL->StmtBindColumn(stmt, 60, SQLDT_INT64, &p->last_login, sizeof p->last_login, NULL, NULL) - || SQL_ERROR == SQL->StmtBindColumn(stmt, 61, SQLDT_SHORT, &p->attendance_count, sizeof p->attendance_count, NULL, NULL) - || SQL_ERROR == SQL->StmtBindColumn(stmt, 62, SQLDT_INT64, &p->attendance_timer, sizeof p->attendance_timer, NULL, NULL) - || SQL_ERROR == SQL->StmtBindColumn(stmt, 63, SQLDT_INT, &p->title_id, sizeof p->title_id, NULL, NULL) - || SQL_ERROR == SQL->StmtBindColumn(stmt, 64, SQLDT_INT, &p->inventorySize, sizeof p->inventorySize, NULL, NULL) + || SQL_ERROR == SQL->StmtBindColumn(stmt, 59, SQLDT_UCHAR, &p->hotkey_rowshift2, sizeof p->hotkey_rowshift2, NULL, NULL) + || SQL_ERROR == SQL->StmtBindColumn(stmt, 60, SQLDT_INT, &p->clan_id, sizeof p->clan_id, NULL, NULL) + || SQL_ERROR == SQL->StmtBindColumn(stmt, 61, SQLDT_INT64, &p->last_login, sizeof p->last_login, NULL, NULL) + || SQL_ERROR == SQL->StmtBindColumn(stmt, 62, SQLDT_SHORT, &p->attendance_count, sizeof p->attendance_count, NULL, NULL) + || SQL_ERROR == SQL->StmtBindColumn(stmt, 63, SQLDT_INT64, &p->attendance_timer, sizeof p->attendance_timer, NULL, NULL) + || SQL_ERROR == SQL->StmtBindColumn(stmt, 64, SQLDT_INT, &p->title_id, sizeof p->title_id, NULL, NULL) + || SQL_ERROR == SQL->StmtBindColumn(stmt, 65, SQLDT_INT, &p->inventorySize, sizeof p->inventorySize, NULL, NULL) ) { SqlStmt_ShowDebug(stmt); SQL->StmtFree(stmt); diff --git a/src/common/mmo.h b/src/common/mmo.h index 3af414fdb..9594a39eb 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -764,6 +764,7 @@ struct mmo_charstatus { short attendance_count; unsigned char hotkey_rowshift; + unsigned char hotkey_rowshift2; int32 title_id; // Achievement Title[Dastgir/Hercules] }; diff --git a/src/map/clif.c b/src/map/clif.c index 9f751a68d..f5fcc7d9d 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -10849,7 +10849,10 @@ static void clif_hotkeys_send(struct map_session_data *sd, int tab) struct PACKET_ZC_SHORTCUT_KEY_LIST p; p.packetType = HEADER_ZC_SHORTCUT_KEY_LIST; #if PACKETVER_MAIN_NUM >= 20141022 || PACKETVER_RE_NUM >= 20141015 || defined(PACKETVER_ZERO) - p.rotate = sd->status.hotkey_rowshift; + if (tab == 0) + p.rotate = sd->status.hotkey_rowshift; + else + p.rotate = sd->status.hotkey_rowshift2; #endif #if PACKETVER_RE_NUM >= 20190508 p.tab = tab; @@ -10878,8 +10881,10 @@ static void clif_parse_HotkeyRowShift2(int fd, struct map_session_data *sd) { #if PACKETVER_RE_NUM >= 20190508 const struct PACKET_CZ_SHORTCUTKEYBAR_ROTATE2 *p = RFIFOP(fd, 0); - // need use p->tab - sd->status.hotkey_rowshift = p->rowshift; + if (p->tab == 0) + sd->status.hotkey_rowshift = p->rowshift; + else + sd->status.hotkey_rowshift2 = p->rowshift; #endif } -- cgit v1.2.3-70-g09d2 From 2793fa142be02e91f43a831366db232f80940d21 Mon Sep 17 00:00:00 2001 From: Emistry Haoyan Date: Fri, 12 Jul 2019 01:25:19 +0800 Subject: Fix family check and EXP bug - failsafe function to not execute the query - avoid EXP sharing bug --- src/char/char.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/char') diff --git a/src/char/char.c b/src/char/char.c index cad28b373..c5afc0f63 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -2273,6 +2273,8 @@ static int char_char_married(int pl1, int pl2) static int char_char_child(int parent_id, int child_id) { + if (parent_id == 0 || child_id == 0) // Failsafe, avoild querys and fix EXP bug dividing with lower level chars + return 0; if( SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `child` FROM `%s` WHERE `char_id` = '%d'", char_db, parent_id) ) Sql_ShowDebug(inter->sql_handle); else if( SQL_SUCCESS == SQL->NextRow(inter->sql_handle) ) @@ -2292,6 +2294,8 @@ static int char_char_child(int parent_id, int child_id) static int char_char_family(int cid1, int cid2, int cid3) { + if (cid1 == 0 || cid2 == 0 || cid3 == 0) //Failsafe, and avoid querys where there is no sense to keep executing if any of the inputs are 0 + return 0; if( SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT `char_id`,`partner_id`,`child` FROM `%s` WHERE `char_id` IN ('%d','%d','%d')", char_db, cid1, cid2, cid3) ) Sql_ShowDebug(inter->sql_handle); else while( SQL_SUCCESS == SQL->NextRow(inter->sql_handle) ) -- cgit v1.2.3-70-g09d2