summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/battle/client.conf6
-rw-r--r--src/map/battle.c1
-rw-r--r--src/map/battle.h2
-rw-r--r--src/map/clif.c42
4 files changed, 44 insertions, 7 deletions
diff --git a/conf/battle/client.conf b/conf/battle/client.conf
index 93ad536ee..c832163be 100644
--- a/conf/battle/client.conf
+++ b/conf/battle/client.conf
@@ -112,3 +112,9 @@ client_reshuffle_dice: yes
// Official servers do not sort storage. (Note 1)
// NOTE: Enabling this option degrades performance.
client_sort_storage: no
+
+// Duration of client's self mute in minutes.
+// Note: Do not enable this, if you enabled commands for players,
+// because the client sees multiple commands in succession as spam.
+// Default: 0 (means disabled)
+client_accept_chatdori: 1
diff --git a/src/map/battle.c b/src/map/battle.c
index 18c95c76d..d03afc431 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -6461,6 +6461,7 @@ static const struct _battle_data {
{ "item_enabled_npc", &battle_config.item_enabled_npc, 1, 0, 1, },
{ "gm_ignore_warpable_area", &battle_config.gm_ignore_warpable_area, 0, 2, 100, },
{ "packet_obfuscation", &battle_config.packet_obfuscation, 1, 0, 3, },
+ { "client_accept_chatdori", &battle_config.client_accept_chatdori, 0, 0, 1, },
};
#ifndef STATS_OPT_OUT
/**
diff --git a/src/map/battle.h b/src/map/battle.h
index 9a8c18fd7..9d1e3276d 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -452,6 +452,8 @@ struct Battle_Config {
int gm_ignore_warpable_area;
+ int client_accept_chatdori; // [Ai4rei/Mirei]
+
} battle_config;
diff --git a/src/map/clif.c b/src/map/clif.c
index 1e05ced14..1cdb59966 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -13412,14 +13412,42 @@ void clif_parse_GMReqNoChat(int fd,struct map_session_data *sd)
if( type == 0 )
value = -value;
- //If type is 2 and the ids don't match, this is a crafted hacked packet!
- //Disabled because clients keep self-muting when you give players public @ commands... [Skotlex]
- if (type == 2 /* && (pc->get_group_level(sd) > 0 || sd->bl.id != id)*/)
- return;
+ if (type == 2)
+ {
+ if (!battle_config.client_accept_chatdori)
+ return;
+ if (pc->get_group_level(sd) > 0 || sd->bl.id != id)
+ return;
- dstsd = iMap->id2sd(id);
- if( dstsd == NULL )
- return;
+ dstsd = sd;
+ }
+ else
+ {
+ dstsd = iMap->id2sd(id);
+ if( dstsd == NULL )
+ return;
+ }
+
+ if (type == 2 || ( (pc->get_group_level(sd)) > pc->get_group_level(dstsd) && !pc->can_use_command(sd, "@mute")))
+ {
+ clif->manner_message(sd, 0);
+ clif->manner_message(dstsd, 5);
+
+ if (dstsd->status.manner < value)
+ {
+ dstsd->status.manner -= value;
+ sc_start(&dstsd->bl,SC_NOCHAT,100,0,0);
+
+ }
+ else
+ {
+ dstsd->status.manner = 0;
+ status_change_end(&dstsd->bl, SC_NOCHAT, INVALID_TIMER);
+ }
+
+ if( type != 2 )
+ clif->GM_silence(sd, dstsd, type);
+ }
sprintf(command, "%cmute %d %s", atcommand->at_symbol, value, dstsd->status.name);
atcommand->parse(fd, sd, command, 1);