From ef9eb6bde90ec1d9d175b6481935cb3bd67d6c6c Mon Sep 17 00:00:00 2001 From: mekolat Date: Sat, 23 May 2015 10:17:10 -0400 Subject: add clif_message_towards --- src/map/clif.cpp | 31 +++++++++++++++++++++++++------ src/map/clif.hpp | 1 + src/map/script-fun.cpp | 23 +++++++++++++++++------ 3 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 73315d8..db5ecd2 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -3809,19 +3809,16 @@ RecvResult clif_parse_GlobalMessage(Session *s, dumb_ptr sd) return rv; } -void clif_message(dumb_ptr bl, XString msg) +static +void clif_message_sub(Buffer& buf, dumb_ptr bl, XString msg) { size_t msg_len = msg.size() + 1; if (msg_len + 16 > 512) return; - nullpo_retv(bl); - Packet_Head<0x008d> head_8d; head_8d.block_id = bl->bl_id; - Buffer buf = create_vpacket<0x008d, 8, 1>(head_8d, msg); - - clif_send(buf, bl, SendWho::AREA, MIN_CLIENT_VERSION); + buf = create_vpacket<0x008d, 8, 1>(head_8d, msg); } void clif_npc_send_title(Session *s, BlockId npcid, XString msg) @@ -3854,6 +3851,28 @@ void clif_change_music(dumb_ptr sd, XString music) send_buffer(sd->sess, buf); } +void clif_message_towards(dumb_ptr sd, dumb_ptr bl, XString msg) +{ + nullpo_retv(bl); + nullpo_retv(sd); + + if(!sd) + return; + + Buffer buf; + clif_message_sub(buf, bl, msg); + clif_send(buf, sd, SendWho::SELF, MIN_CLIENT_VERSION); +} + +void clif_message(dumb_ptr bl, XString msg) +{ + nullpo_retv(bl); + + Buffer buf; + clif_message_sub(buf, bl, msg); + clif_send(buf, bl, SendWho::AREA, MIN_CLIENT_VERSION); +} + /*========================================== * *------------------------------------------ diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 99d4a2c..cd499de 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -179,6 +179,7 @@ void clif_resurrection(dumb_ptr bl, int type); int clif_specialeffect(dumb_ptr bl, int type, int flag); // special effects [Valaris] void clif_message(dumb_ptr bl, XString msg); // messages (from mobs/npcs) [Valaris] +void clif_message_towards(dumb_ptr sd, dumb_ptr bl, XString msg); int clif_GM_kick(dumb_ptr sd, dumb_ptr tsd, int type); diff --git a/src/map/script-fun.cpp b/src/map/script-fun.cpp index 0d19770..2b72fc4 100644 --- a/src/map/script-fun.cpp +++ b/src/map/script-fun.cpp @@ -2713,13 +2713,24 @@ void builtin_music(ScriptState *st) static void builtin_npctalk(ScriptState *st) { - dumb_ptr nd = map_id_is_npc(st->oid); - RString str = conv_str(st, &AARG(0)); + dumb_ptr nd; + RString str = conv_str(st, &AARG(1)); - if (nd) - { - clif_message(nd, str); + dumb_ptr nd_ = npc_name2id(stringish(ZString(conv_str(st, &AARG(0))))); + assert (nd_ && nd_->npc_subtype == NpcSubtype::SCRIPT); + nd = nd_->is_script(); + + + if(HARG(2)){ + CharName player = stringish(ZString(conv_str(st, &AARG(2)))); + dumb_ptr pl_sd = map_nick2sd(player); + if (pl_sd == nullptr) + return; + clif_message_towards(pl_sd, nd, str); } + + else + clif_message(nd, str); } /*========================================== @@ -3174,7 +3185,7 @@ BuiltinFunction builtin_functions[] = BUILTIN(npcwarp, "xys"_s, '\0'), BUILTIN(npcareawarp, "xyxyis"_s, '\0'), BUILTIN(message, "Ps"_s, '\0'), - BUILTIN(npctalk, "s"_s, '\0'), + BUILTIN(npctalk, "ss?"_s, '\0'), BUILTIN(title, "s"_s, '\0'), BUILTIN(music, "s"_s, '\0'), BUILTIN(getlook, "i"_s, 'i'), -- cgit v1.2.3-60-g2f50