From 6cb5b5bac6f76a058dc72e9595cbca31f2cb3266 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Thu, 1 Sep 2022 22:01:13 +0200 Subject: [PATCH] Implemented the /call command (#7225) Fixes #7139. Thanks to @idk-whoami --- sql-files/main.sql | 1 + sql-files/upgrades/upgrade_20220831.sql | 3 +++ src/char/char.cpp | 14 ++++++++------ src/common/mmo.hpp | 2 +- src/map/clif.cpp | 4 ++++ src/map/clif.hpp | 4 ++-- src/map/skill.cpp | 6 ++++++ 7 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 sql-files/upgrades/upgrade_20220831.sql diff --git a/sql-files/main.sql b/sql-files/main.sql index 49f50940fa..6de5038a82 100644 --- a/sql-files/main.sql +++ b/sql-files/main.sql @@ -283,6 +283,7 @@ CREATE TABLE IF NOT EXISTS `char` ( `show_equip` tinyint(3) unsigned NOT NULL default '0', `inventory_slots` smallint(6) NOT NULL default '100', `body_direction` tinyint(1) unsigned NOT NULL default '0', + `disable_call` tinyint(3) unsigned NOT NULL default '0', PRIMARY KEY (`char_id`), UNIQUE KEY `name_key` (`name`), KEY `account_id` (`account_id`), diff --git a/sql-files/upgrades/upgrade_20220831.sql b/sql-files/upgrades/upgrade_20220831.sql new file mode 100644 index 0000000000..f3e6ce60a0 --- /dev/null +++ b/sql-files/upgrades/upgrade_20220831.sql @@ -0,0 +1,3 @@ +ALTER TABLE `char` + ADD COLUMN `disable_call` tinyint unsigned NOT NULL default '0' +; diff --git a/src/char/char.cpp b/src/char/char.cpp index 406e9ef7d3..a03ee221b8 100644 --- a/src/char/char.cpp +++ b/src/char/char.cpp @@ -347,20 +347,20 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){ (p->mother != cp->mother) || (p->child != cp->child) || (p->karma != cp->karma) || (p->manner != cp->manner) || (p->fame != cp->fame) || (p->inventory_slots != cp->inventory_slots) || - (p->body_direction != cp->body_direction) + (p->body_direction != cp->body_direction) || (p->disable_call != cp->disable_call) ) { if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `class`='%d'," "`hair`='%d', `hair_color`='%d', `clothes_color`='%d', `body`='%d'," "`partner_id`='%u', `father`='%u', `mother`='%u', `child`='%u'," "`karma`='%d',`manner`='%d', `fame`='%d', `inventory_slots`='%hu'," - "`body_direction`='%d'" + "`body_direction`='%d',`disable_call`='%d'" " WHERE `account_id`='%d' AND `char_id` = '%d'", schema_config.char_db, p->class_, p->hair, p->hair_color, p->clothes_color, p->body, p->partner_id, p->father, p->mother, p->child, p->karma, p->manner, p->fame, p->inventory_slots, - p->body_direction, + p->body_direction, p->disable_call, p->account_id, p->char_id) ) { Sql_ShowDebug(sql_handle); @@ -939,7 +939,7 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf, uint8* coun "`robe`,`moves`,`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`title_id`,`show_equip`," "`hotkey_rowshift2`," "`max_ap`,`ap`,`trait_point`,`pow`,`sta`,`wis`,`spl`,`con`,`crt`," - "`inventory_slots`,`body_direction`" + "`inventory_slots`,`body_direction`,`disable_call`" " FROM `%s` WHERE `account_id`='%d' AND `char_num` < '%d'", schema_config.char_db, sd->account_id, MAX_CHARS) || SQL_ERROR == SqlStmt_Execute(stmt) || SQL_ERROR == SqlStmt_BindColumn(stmt, 0, SQLDT_INT, &p.char_id, 0, NULL, NULL) @@ -999,6 +999,7 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf, uint8* coun || SQL_ERROR == SqlStmt_BindColumn(stmt, 54, SQLDT_SHORT, &p.crt, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 55, SQLDT_UINT16, &p.inventory_slots, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 56, SQLDT_UINT8, &p.body_direction, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 57, SQLDT_UINT16, &p.disable_call, 0, NULL, NULL) ) { SqlStmt_ShowDebug(stmt); @@ -1068,7 +1069,7 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev "`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`,`robe`, `moves`," "`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`clan_id`,`title_id`,`show_equip`,`hotkey_rowshift2`," "`max_ap`,`ap`,`trait_point`,`pow`,`sta`,`wis`,`spl`,`con`,`crt`," - "`inventory_slots`,`body_direction`" + "`inventory_slots`,`body_direction`,`disable_call`" " FROM `%s` WHERE `char_id`=? LIMIT 1", schema_config.char_db) || SQL_ERROR == SqlStmt_BindParam(stmt, 0, SQLDT_INT, &char_id, 0) || SQL_ERROR == SqlStmt_Execute(stmt) @@ -1146,6 +1147,7 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev || SQL_ERROR == SqlStmt_BindColumn(stmt, 71, SQLDT_SHORT, &p->crt, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 72, SQLDT_UINT16, &p->inventory_slots, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 73, SQLDT_UINT8, &p->body_direction, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 74, SQLDT_UINT16, &p->disable_call, 0, NULL, NULL) ) { SqlStmt_ShowDebug(stmt); @@ -2339,7 +2341,7 @@ bool char_checkdb(void){ "`moves`,`unban_time`,`font`,`sex`,`hotkey_rowshift`,`clan_id`,`last_login`,`title_id`,`show_equip`," "`hotkey_rowshift2`," "`max_ap`,`ap`,`trait_point`,`pow`,`sta`,`wis`,`spl`,`con`,`crt`," - "`inventory_slots`,`body_direction`" + "`inventory_slots`,`body_direction`,`disable_call`" " FROM `%s` LIMIT 1;", schema_config.char_db) ){ Sql_ShowDebug(sql_handle); return false; diff --git a/src/common/mmo.hpp b/src/common/mmo.hpp index f4d770bed7..9cd28082a2 100644 --- a/src/common/mmo.hpp +++ b/src/common/mmo.hpp @@ -590,7 +590,7 @@ struct mmo_charstatus { #ifdef HOTKEY_SAVING struct hotkey hotkeys[MAX_HOTKEYS_DB]; #endif - bool show_equip,allow_party; + bool show_equip,allow_party, disable_call; short rename; time_t delete_date; diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 1d84219e87..42844eade4 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -11081,6 +11081,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) clif_equipcheckbox(sd); #endif clif_pet_autofeed_status(sd,false); + clif_configuration( sd, CONFIG_CALL, sd->status.disable_call ); #if PACKETVER >= 20170920 if( battle_config.homunculus_autofeed_always ){ // Always send ON or OFF @@ -17560,6 +17561,9 @@ void clif_parse_configuration( int fd, struct map_session_data* sd ){ case CONFIG_OPEN_EQUIPMENT_WINDOW: sd->status.show_equip = flag; break; + case CONFIG_CALL: + sd->status.disable_call = flag; + break; case CONFIG_PET_AUTOFEED: // Player can not click this if he does not have a pet if( sd->pd == nullptr || !battle_config.feature_pet_autofeed || !sd->pd->get_pet_db()->allow_autofeed ){ diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 46f8e32776..7e7b481126 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -594,8 +594,8 @@ enum class e_pet_evolution_result : uint32 { enum e_config_type : uint32 { CONFIG_OPEN_EQUIPMENT_WINDOW = 0, - // Unknown - CONFIG_PET_AUTOFEED = 2, + CONFIG_CALL, + CONFIG_PET_AUTOFEED, CONFIG_HOMUNCULUS_AUTOFEED }; diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 6c3fe18390..9fbae5f218 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -12212,6 +12212,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (pl_sd == nullptr || pl_sd == sd || pl_sd->status.party_id != p->party.party_id || pc_isdead(pl_sd) || sd->bl.m != pl_sd->bl.m) continue; + + // Respect /call configuration + if( pl_sd->status.disable_call ){ + continue; + } + if (!(map_getmapflag(sd->bl.m, MF_NOTELEPORT) || map_getmapflag(sd->bl.m, MF_PVP) || map_getmapflag(sd->bl.m, MF_BATTLEGROUND) || map_flag_gvg2(sd->bl.m))) { pc_setpos(pl_sd, map_id2index(sd->bl.m), sd->bl.x, sd->bl.y, CLR_TELEPORT); count++;