From dff7e258eb1e4eefc5d455212a912fe454b7d3d3 Mon Sep 17 00:00:00 2001 From: Asheraf Date: Sat, 26 May 2018 23:42:02 +0000 Subject: add support for send target in unittalk --- doc/script_commands.txt | 31 +++++++++++++++++++++++++++++-- src/map/atcommand.c | 8 ++++---- src/map/clif.c | 14 +++++++++----- src/map/clif.h | 2 +- src/map/script.c | 24 +++++++++++++++++++----- src/map/skill.c | 2 +- 6 files changed, 63 insertions(+), 18 deletions(-) diff --git a/doc/script_commands.txt b/doc/script_commands.txt index efccf799b..53d24de4d 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -6631,22 +6631,49 @@ Examples: *unitwarp(, , , ) *unitattack(, ) *unitstop() -*unittalk(, {, show_name}) +*unittalk(, {, show_name{, {, }}}) *unitemote(, ) Okay, these commands should be fairly self explaining. For the emotions, you can look in db/constants.conf for prefixes with e_ PS: unitwarp() supports a of zero, which causes the executor of the -PS: unittalk() can receive a third parameter: +PS: unittalk() can receive 3 extra parameters: show_name: true: Shows Unit name like "UnitName : Message" (default) false: Hides Unit name + send_target: + AREA_CHAT_WOC: sends the message to everyone in view range including the attached unit (default) + SELF: sends the message to the given unit gid only + target_id: + if send_target is set to SELF, the message will be shown by the given gid, + target_id allows changing the unit that will see the message. script to be affected. This can be used with OnTouchNPC to warp monsters: OnTouchNPC: unitwarp(0, "this", -1, -1); + // hide the npc name from the text + unittalk(getnpcid(0), "foobar", false); + + // display by npc to everyone + unittalk(getnpcid(0), "foobar", true); + + // display by npc to npc + unittalk(getnpcid(0), "foobar", true, SELF); + + // display the text by the npc to the attached player only + unittalk(getnpcid(0), "foobar", true, SELF, playerattached()); + + // display by player to everyone + unittalk(playerattached(), "foobar", true); + + // display by player to himself only + unittalk(playerattached(), "foobar", true, SELF); + + // display the text by the 1st player to the attached player only + unittalk(getcharid(CHAR_ID_ACCOUNT, "Name"), "foobar", true, SELF, playerattached()); + --------------------------------------- *disablenpc("") diff --git a/src/map/atcommand.c b/src/map/atcommand.c index ae0c776c6..a9b8fb7b0 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -6228,7 +6228,7 @@ ACMD(npctalk) snprintf(temp, sizeof(temp), "%s : %s", name, mes); if(ifcolor) clif->messagecolor(&nd->bl,color,temp); - else clif->disp_overhead(&nd->bl, temp); + else clif->disp_overhead(&nd->bl, temp, AREA_CHAT_WOC, NULL); return true; } @@ -6288,7 +6288,7 @@ ACMD(pettalk) } snprintf(temp, sizeof temp ,"%s : %s", pd->pet.name, mes); - clif->disp_overhead(&pd->bl, temp); + clif->disp_overhead(&pd->bl, temp, AREA_CHAT_WOC, NULL); return true; } @@ -7063,7 +7063,7 @@ ACMD(homtalk) } snprintf(temp, sizeof temp ,"%s : %s", sd->hd->homunculus.name, mes); - clif->disp_overhead(&sd->hd->bl, temp); + clif->disp_overhead(&sd->hd->bl, temp, AREA_CHAT_WOC, NULL); return true; } @@ -7423,7 +7423,7 @@ ACMD(me) } safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,270), sd->status.name, tempmes); // *%s %s* - clif->disp_overhead(&sd->bl, atcmd_output); + clif->disp_overhead(&sd->bl, atcmd_output, AREA_CHAT_WOC, NULL); return true; } diff --git a/src/map/clif.c b/src/map/clif.c index 654c43b53..18fb063ef 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -8965,7 +8965,7 @@ void clif_slide(struct block_list *bl, int x, int y) /// Public chat message (ZC_NOTIFY_CHAT). lordalfa/Skotlex - used by @me as well /// 008d .W .L .?B -void clif_disp_overhead(struct block_list *bl, const char *mes) +void clif_disp_overhead(struct block_list *bl, const char *mes, enum send_target target, struct block_list *target_bl) { char buf[CHAT_SIZE_MAX + (int)sizeof(struct PACKET_ZC_NOTIFY_CHAT)]; uint32 max_len = CHAT_SIZE_MAX - (int)sizeof(struct PACKET_ZC_NOTIFY_CHAT); @@ -8986,11 +8986,15 @@ void clif_disp_overhead(struct block_list *bl, const char *mes) p->PacketLength = mes_len + (int)sizeof(struct PACKET_ZC_NOTIFY_CHAT); // len of message + 8 (command+len+id) p->GID = bl->id; safestrncpy(p->Message, mes, mes_len); - clif->send(p, p->PacketLength, bl, AREA_CHAT_WOC); + if (target == SELF && target_bl != NULL) { + clif->send(p, p->PacketLength, target_bl, SELF); + } else { + clif->send(p, p->PacketLength, bl, AREA_CHAT_WOC); - // send back message to the speaker - if (bl->type == BL_PC) - clif->notify_playerchat(bl, mes); + // send back message to the speaker + if (bl->type == BL_PC) + clif->notify_playerchat(bl, mes); + } } void clif_notify_playerchat(struct block_list *bl, const char *mes) diff --git a/src/map/clif.h b/src/map/clif.h index 6c07998d5..1dffc2711 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -939,7 +939,7 @@ struct clif_interface { void (*broadcast2) (struct block_list *bl, const char *mes, int len, unsigned int fontColor, short fontType, short fontSize, short fontAlign, short fontY, enum send_target target); void (*messagecolor_self) (int fd, uint32 color, const char *msg); void (*messagecolor) (struct block_list* bl, uint32 color, const char* msg); - void (*disp_overhead) (struct block_list *bl, const char* mes); + void (*disp_overhead) (struct block_list *bl, const char *mes, enum send_target target, struct block_list *target_bl); void (*notify_playerchat) (struct block_list *bl, const char *mes); void (*msgtable) (struct map_session_data* sd, enum clif_messages msg_id); void (*msgtable_num) (struct map_session_data *sd, enum clif_messages msg_id, int value); diff --git a/src/map/script.c b/src/map/script.c index 94a991d06..e1d26e731 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -15594,7 +15594,7 @@ BUILDIN(npctalk) } else { safesnprintf(message, sizeof(message), "%s", str); } - clif->disp_overhead(&nd->bl, message); + clif->disp_overhead(&nd->bl, message, AREA_CHAT_WOC, NULL); } return true; @@ -20117,12 +20117,13 @@ BUILDIN(unitstop) { /// Makes the unit say the message /// -/// unittalk(,""{, show_name}); +/// unittalk(,""{, show_name{, {, }}}); BUILDIN(unittalk) { int unit_id; const char* message; - struct block_list* bl; + struct block_list *bl, *target_bl = NULL; bool show_name = true; + enum send_target target = AREA_CHAT_WOC; unit_id = script_getnum(st,2); message = script_getstr(st, 3); @@ -20131,6 +20132,14 @@ BUILDIN(unittalk) { show_name = (script_getnum(st, 4) != 0) ? true : false; } + if (script_hasdata(st, 5)) { + target = script_getnum(st, 5); + } + + if (script_hasdata(st, 6)) { + target_bl = map->id2bl(script_getnum(st, 6)); + } + bl = map->id2bl(unit_id); if( bl != NULL ) { struct StringBuf sbuf; @@ -20144,7 +20153,12 @@ BUILDIN(unittalk) { } else { StrBuf->Printf(&sbuf, "%s", message); } - clif->disp_overhead(bl, StrBuf->Value(&sbuf)); + + if (bl->type == BL_PC && target == SELF && (target_bl == NULL || bl == target_bl)) { + clif->notify_playerchat(bl, StrBuf->Value(&sbuf)); + } else { + clif->disp_overhead(bl, StrBuf->Value(&sbuf), target, target_bl); + } StrBuf->Destroy(&sbuf); } @@ -24789,7 +24803,7 @@ void script_parse_builtin(void) { BUILDIN_DEF(unitwarp,"isii"), BUILDIN_DEF(unitattack,"iv?"), BUILDIN_DEF(unitstop,"i"), - BUILDIN_DEF(unittalk,"is?"), + BUILDIN_DEF(unittalk,"is???"), BUILDIN_DEF(unitemote,"ii"), BUILDIN_DEF(unitskilluseid,"ivi?"), // originally by Qamera [Celest] BUILDIN_DEF(unitskillusepos,"iviii"), // [Celest] diff --git a/src/map/skill.c b/src/map/skill.c index 34c36d7f3..f437ce66c 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -7168,7 +7168,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin //NOTE: mobs don't have the sprite animation that is used when performing this skill (will cause glitches) char temp[70]; snprintf(temp, sizeof(temp), "%s : %s !!", md->name, skill->get_desc(skill_id)); - clif->disp_overhead(&md->bl,temp); + clif->disp_overhead(&md->bl, temp, AREA_CHAT_WOC, NULL); } break; -- cgit v1.2.3-70-g09d2