From b35860a736d42d0320e9a7afbf9d56b7b95214f9 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 25 Feb 2015 13:40:10 +0300 Subject: Add packet for homunculus/mercenary talk. --- src/map/init.c | 1 + src/map/parse.c | 22 +++++++++++++++++++++- src/map/parse.h | 1 + src/map/send.c | 11 +++++------ src/map/send.h | 5 ++++- 5 files changed, 32 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/map/init.c b/src/map/init.c index 2b58fc5..c5ed8eb 100644 --- a/src/map/init.c +++ b/src/map/init.c @@ -114,6 +114,7 @@ HPExport void plugin_init (void) addPacket(0xb0f, 2, map_parse_get_online_list, hpClif_Parse); addPacket(0xb11, 10, map_parse_pet_move, hpClif_Parse); addPacket(0xb12, 9, map_parse_pet_dir, hpClif_Parse); + addPacket(0xb13, -1, map_parse_homun_say, hpClif_Parse); addHookPre("pc->readparam", epc_readparam_pre); addHookPre("pc->setregistry", epc_setregistry); diff --git a/src/map/parse.c b/src/map/parse.c index 97aac6f..ba73516 100644 --- a/src/map/parse.c +++ b/src/map/parse.c @@ -12,6 +12,8 @@ #include "../../../common/strlib.h" #include "../../../map/channel.h" #include "../../../map/clif.h" +#include "../../../map/homunculus.h" +#include "../../../map/mercenary.h" #include "../../../map/pc.h" #include "../../../map/pet.h" #include "../../../map/unit.h" @@ -110,11 +112,14 @@ void map_parse_pet_say(int fd) char message[500]; struct map_session_data* sd = (struct map_session_data*)session[fd]->session_data; + if (!sd || !sd->pd) + return; + const int len = RFIFOW(fd, 2); if (len > 500 || len < 6) return; safestrncpy(message, (char*)RFIFOP(fd, 4), len - 4); - send_pet_say(sd, message); + send_slave_say(sd, &sd->pd->bl, sd->pd->pet.name, message); } void map_parse_pet_emote(int fd) @@ -166,3 +171,18 @@ void map_parse_pet_dir(int fd) return; unit->setdir(&sd->pd->bl, RFIFOB(fd, 8)); } + +void map_parse_homun_say(int fd) +{ + char message[500]; + + struct map_session_data* sd = (struct map_session_data*)session[fd]->session_data; + const int len = RFIFOW(fd, 2); + if (len > 500 || len < 6) + return; + safestrncpy(message, (char*)RFIFOP(fd, 4), len - 4); + if (sd->md && sd->md->db) + send_slave_say(sd, &sd->md->bl, sd->md->db->name, message); + else if (sd->hd && homun_alive(sd->hd)) + send_slave_say(sd, &sd->hd->bl, sd->hd->homunculus.name, message); +} diff --git a/src/map/parse.h b/src/map/parse.h index 8db1fca..d59fd87 100644 --- a/src/map/parse.h +++ b/src/map/parse.h @@ -13,5 +13,6 @@ void map_parse_set_status(int fd); void map_parse_get_online_list(int fd); void map_parse_pet_move(int fd); void map_parse_pet_dir(int fd); +void map_parse_homun_say(int fd); #endif // EVOL_MAP_PARSE diff --git a/src/map/send.c b/src/map/send.c index 61522ac..c2e79fc 100644 --- a/src/map/send.c +++ b/src/map/send.c @@ -261,19 +261,18 @@ void send_join_ack(int fd, const char *const name, int flag) WFIFOSET (fd, 27); } -void send_pet_say(struct map_session_data *sd, const char *const message) +void send_slave_say(struct map_session_data *sd, + struct block_list *bl, + const char *const name, + const char *const message) { - if (!sd || !sd->pd || !message) - return; - - const char *const name = sd->pd->pet.name; const int len = 24 + 7 + strlen(message); char *buf = NULL; CREATE(buf, char, len); snprintf(buf, len, "%s's %s : %s", sd->status.name, name, message); buf[len - 1] = 0; - clif->GlobalMessage(&sd->pd->bl, buf); + clif->GlobalMessage(bl, buf); aFree(buf); } diff --git a/src/map/send.h b/src/map/send.h index 54bd844..0e18ff2 100644 --- a/src/map/send.h +++ b/src/map/send.h @@ -21,7 +21,10 @@ void send_pc_info(struct block_list* bl1, void send_npc_info(struct block_list* bl1, struct block_list* bl2, enum send_target target); -void send_pet_say(struct map_session_data *sd, const char *const message); +void send_slave_say(struct map_session_data *sd, + struct block_list *bl, + const char *const name, + const char *const message); void send_pet_emote(struct map_session_data *sd, const int emote); void send_online_list(int fd, const char *buf, unsigned size); -- cgit v1.2.3-70-g09d2