summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenpachi Developer <Kenpachi.Developer@gmx.de>2020-05-31 23:01:47 +0200
committerKenpachi Developer <Kenpachi.Developer@gmx.de>2020-05-31 23:11:34 +0200
commitd8151aad24c138efcf2ce791c27b85f55119f09c (patch)
treea5ca930d6df4fa6941d64be8d77b23d3005c9771
parent1cccfca3dd708354bf808068c1210ce353957f2e (diff)
downloadhercules-d8151aad24c138efcf2ce791c27b85f55119f09c.tar.gz
hercules-d8151aad24c138efcf2ce791c27b85f55119f09c.tar.bz2
hercules-d8151aad24c138efcf2ce791c27b85f55119f09c.tar.xz
hercules-d8151aad24c138efcf2ce791c27b85f55119f09c.zip
Implement loudhailer() script command
-rw-r--r--src/map/clif.c4
-rw-r--r--src/map/clif.h2
-rw-r--r--src/map/script.c45
3 files changed, 50 insertions, 1 deletions
diff --git a/src/map/clif.c b/src/map/clif.c
index a0ec1fdf6..bc56d13c6 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -6224,7 +6224,7 @@ static void clif_displaymessage_sprintf(const int fd, const char *mes, ...)
/// 009a <packet len>.W <message>.?B
static void clif_broadcast(struct block_list *bl, const char *mes, int len, int type, enum send_target target)
{
- int lp = (type&BC_COLOR_MASK) ? 4 : 0;
+ int lp = ((type & BC_COLOR_MASK) != 0 || (type & BC_MEGAPHONE) != 0) ? 4 : 0;
unsigned char *buf = NULL;
nullpo_retv(mes);
@@ -6236,6 +6236,8 @@ static void clif_broadcast(struct block_list *bl, const char *mes, int len, int
WBUFL(buf,4) = 0x65756c62; //If there's "blue" at the beginning of the message, game client will display it in blue instead of yellow.
else if( type&BC_WOE )
WBUFL(buf,4) = 0x73737373; //If there's "ssss", game client will recognize message as 'WoE broadcast'.
+ else if ((type & BC_MEGAPHONE) != 0)
+ WBUFL(buf, 4) = 0x6363696d; // If there's "micc" at the beginning of the message, the game client will recognize message as 'Megaphone shout'.
memcpy(WBUFP(buf, 4 + lp), mes, len);
clif->send(buf, WBUFW(buf,2), bl, target);
diff --git a/src/map/clif.h b/src/map/clif.h
index fdaaf85e3..e43aad808 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -146,6 +146,8 @@ typedef enum broadcast_flags {
BC_WOE = 0x20,
BC_COLOR_MASK = 0x30, // BC_YELLOW|BC_BLUE|BC_WOE
+ BC_MEGAPHONE = 0x40,
+
BC_DEFAULT = BC_ALL|BC_PC|BC_YELLOW
} broadcast_flags;
diff --git a/src/map/script.c b/src/map/script.c
index e4a57194d..59708b893 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -12401,6 +12401,50 @@ static BUILDIN(mobattached)
return true;
}
+/**
+ * Announces a colored text in '<char_name> Shouts : <message>' format.
+ * Default color is white ("FFFFFF").
+ *
+ * This is a special use case of packet 0x009a where the message's first 34 bytes
+ * are reserved for string "micc" (4B) which identifies the broadcast as megaphone shout,
+ * the character's name (24B) and the text color (6B).
+ *
+ * 009a <packet len>.W <micc>.4B <char name>.24B <color>.6B <message>.?B
+ *
+ * @code{.herc}
+ * loudhailer("<message>"{, "<color>"});
+ * @endcode
+ *
+ **/
+static BUILDIN(loudhailer)
+{
+ const char *mes = script_getstr(st, 2);
+ size_t len_mes = strlen(mes);
+
+ Assert_retr(false, len_mes + 33 < CHAT_SIZE_MAX); // +33 because of the '<char_name> Shouts : ' message prefix.
+
+ const char *color = script_hasdata(st, 3) ? script_getstr(st, 3) : "FFFFFF";
+
+ Assert_retr(false, strlen(color) == 6);
+
+ struct map_session_data *sd = script->rid2sd(st);
+
+ if (sd == NULL)
+ return false;
+
+ char mes_formatted[CHAT_SIZE_MAX + 30] = "";
+
+ strcpy(mes_formatted, sd->status.name);
+ strcpy(mes_formatted + 24, color);
+ safesnprintf(mes_formatted + 30, CHAT_SIZE_MAX, "%s Shouts : %s", sd->status.name, mes);
+
+ size_t len_formatted = 30 + strlen(sd->status.name) + 10 + len_mes + 1;
+
+ clif->broadcast(&sd->bl, mes_formatted, (int)len_formatted, BC_MEGAPHONE, ALL_CLIENT);
+
+ return true;
+}
+
/*==========================================
*------------------------------------------*/
static BUILDIN(announce)
@@ -27213,6 +27257,7 @@ static void script_parse_builtin(void)
BUILDIN_DEF(detachnpctimer,"?"), // detached the player id from the npc timer [Celest]
BUILDIN_DEF(playerattached,""), // returns id of the current attached player. [Skotlex]
BUILDIN_DEF(mobattached, ""),
+ BUILDIN_DEF(loudhailer, "s?"),
BUILDIN_DEF(announce,"si?????"),
BUILDIN_DEF(mapannounce,"ssi?????"),
BUILDIN_DEF(areaannounce,"siiiisi?????"),