diff --git a/zone/client.cpp b/zone/client.cpp index 6cf490960..cc79233ce 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -2963,6 +2963,101 @@ void Client::Message_StringID(uint32 type, uint32 string_id, const char* message safe_delete(outapp); } +// helper function, returns true if we should see the message +bool Client::FilteredMessageCheck(Mob *sender, eqFilterType filter) +{ + eqFilterMode mode = GetFilter(filter); + // easy ones first + if (mode == FilterShow) + return true; + else if (mode == FilterHide) + return false; + + if (!sender && mode == FilterHide) { + return false; + } else if (sender) { + if (this == sender) { + if (mode == FilterHide) // don't need to check others + return false; + } else if (mode == FilterShowSelfOnly) { // we know sender isn't us + return false; + } else if (mode == FilterShowGroupOnly) { + Group *g = GetGroup(); + if (!g || !g->IsGroupMember(sender)) + return false; + } + } + + // we passed our checks + return true; +} + +void Client::FilteredMessage_StringID(Mob *sender, uint32 type, + eqFilterType filter, uint32 string_id) +{ + if (!FilteredMessageCheck(sender, filter)) + return; + + EQApplicationPacket *outapp = new EQApplicationPacket(OP_SimpleMessage, 12); + SimpleMessage_Struct *sms = (SimpleMessage_Struct *)outapp->pBuffer; + sms->color = type; + sms->string_id = string_id; + + sms->unknown8 = 0; + + QueuePacket(outapp); + safe_delete(outapp); + + return; +} + +void Client::FilteredMessage_StringID(Mob *sender, uint32 type, eqFilterType filter, uint32 string_id, + const char *message1, const char *message2, const char *message3, + const char *message4, const char *message5, const char *message6, + const char *message7, const char *message8, const char *message9) +{ + if (!FilteredMessageCheck(sender, filter)) + return; + + int i, argcount, length; + char *bufptr; + const char *message_arg[9] = {0}; + + if (type == MT_Emote) + type = 4; + + if (!message1) { + Message_StringID(type, string_id); // use the simple message instead + return; + } + + i = 0; + message_arg[i++] = message1; + message_arg[i++] = message2; + message_arg[i++] = message3; + message_arg[i++] = message4; + message_arg[i++] = message5; + message_arg[i++] = message6; + message_arg[i++] = message7; + message_arg[i++] = message8; + message_arg[i++] = message9; + + for (argcount = length = 0; message_arg[argcount]; argcount++) + length += strlen(message_arg[argcount]) + 1; + + EQApplicationPacket *outapp = new EQApplicationPacket(OP_FormattedMessage, length+13); + FormattedMessage_Struct *fm = (FormattedMessage_Struct *)outapp->pBuffer; + fm->string_id = string_id; + fm->type = type; + bufptr = fm->message; + for (i = 0; i < argcount; i++) { + strcpy(bufptr, message_arg[i]); + bufptr += strlen(message_arg[i]) + 1; + } + + QueuePacket(outapp); + safe_delete(outapp); +} void Client::SetTint(int16 in_slot, uint32 color) { Color_Struct new_color; diff --git a/zone/client.h b/zone/client.h index be1c29c1c..10465dbc6 100644 --- a/zone/client.h +++ b/zone/client.h @@ -250,6 +250,14 @@ public: uint8 SlotConvert(uint8 slot,bool bracer=false); void Message_StringID(uint32 type, uint32 string_id, uint32 distance = 0); void Message_StringID(uint32 type, uint32 string_id, const char* message,const char* message2=0,const char* message3=0,const char* message4=0,const char* message5=0,const char* message6=0,const char* message7=0,const char* message8=0,const char* message9=0, uint32 distance = 0); + bool FilteredMessageCheck(Mob *sender, eqFilterType filter); + void FilteredMessage_StringID(Mob *sender, uint32 type, eqFilterType filter, uint32 string_id); + void FilteredMessage_StringID(Mob *sender, uint32 type, eqFilterType filter, + uint32 string_id, const char *message1, const char *message2 = nullptr, + const char *message3 = nullptr, const char *message4 = nullptr, + const char *message5 = nullptr, const char *message6 = nullptr, + const char *message7 = nullptr, const char *message8 = nullptr, + const char *message9 = nullptr); void SendBazaarResults(uint32 trader_id,uint32 class_,uint32 race,uint32 stat,uint32 slot,uint32 type,char name[64],uint32 minprice,uint32 maxprice); void SendTraderItem(uint32 item_id,uint16 quantity); uint16 FindTraderItem(int32 SerialNumber,uint16 Quantity); diff --git a/zone/entity.cpp b/zone/entity.cpp index 64bbe53c1..c42ebc685 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -1907,6 +1907,24 @@ void EntityList::MessageClose_StringID(Mob *sender, bool skipsender, float dist, } } +void EntityList::FilteredMessageClose_StringID(Mob *sender, bool skipsender, + float dist, uint32 type, eqFilterType filter, uint32 string_id, + const char *message1, const char *message2, const char *message3, + const char *message4, const char *message5, const char *message6, + const char *message7, const char *message8, const char *message9) +{ + Client *c; + float dist2 = dist * dist; + + for (auto it = client_list.begin(); it != client_list.end(); ++it) { + c = it->second; + if (c && c->DistNoRoot(*sender) <= dist2 && (!skipsender || c != sender)) + c->FilteredMessage_StringID(sender, type, filter, string_id, + message1, message2, message3, message4, message5, + message6, message7, message8, message9); + } +} + void EntityList::Message_StringID(Mob *sender, bool skipsender, uint32 type, uint32 string_id, const char* message1,const char* message2,const char* message3,const char* message4,const char* message5,const char* message6,const char* message7,const char* message8,const char* message9) { Client *c; @@ -1918,6 +1936,23 @@ void EntityList::Message_StringID(Mob *sender, bool skipsender, uint32 type, uin } } +void EntityList::FilteredMessage_StringID(Mob *sender, bool skipsender, + uint32 type, eqFilterType filter, uint32 string_id, + const char *message1, const char *message2, const char *message3, + const char *message4, const char *message5, const char *message6, + const char *message7, const char *message8, const char *message9) +{ + Client *c; + + for (auto it = client_list.begin(); it != client_list.end(); ++it) { + c = it->second; + if (c && (!skipsender || c != sender)) + c->FilteredMessage_StringID(sender, type, filter, string_id, + message1, message2, message3, message4, message5, message6, + message7, message8, message9); + } +} + void EntityList::MessageClose(Mob* sender, bool skipsender, float dist, uint32 type, const char* message, ...) { va_list argptr; diff --git a/zone/entity.h b/zone/entity.h index a42e63f9b..ede4b3bea 100644 --- a/zone/entity.h +++ b/zone/entity.h @@ -267,7 +267,9 @@ public: void MessageStatus(uint32 to_guilddbid, int to_minstatus, uint32 type, const char* message, ...); void MessageClose(Mob* sender, bool skipsender, float dist, uint32 type, const char* message, ...); void Message_StringID(Mob *sender, bool skipsender, uint32 type, uint32 string_id, const char* message1=0,const char* message2=0,const char* message3=0,const char* message4=0,const char* message5=0,const char* message6=0,const char* message7=0,const char* message8=0,const char* message9=0); + void FilteredMessage_StringID(Mob *sender, bool skipsender, uint32 type, eqFilterType filter, uint32 string_id, const char* message1=0,const char* message2=0,const char* message3=0,const char* message4=0,const char* message5=0,const char* message6=0,const char* message7=0,const char* message8=0,const char* message9=0); void MessageClose_StringID(Mob *sender, bool skipsender, float dist, uint32 type, uint32 string_id, const char* message1=0,const char* message2=0,const char* message3=0,const char* message4=0,const char* message5=0,const char* message6=0,const char* message7=0,const char* message8=0,const char* message9=0); + void FilteredMessageClose_StringID(Mob *sender, bool skipsender, float dist, uint32 type, eqFilterType filter, uint32 string_id, const char* message1=0,const char* message2=0,const char* message3=0,const char* message4=0,const char* message5=0,const char* message6=0,const char* message7=0,const char* message8=0,const char* message9=0); void ChannelMessageFromWorld(const char* from, const char* to, uint8 chan_num, uint32 guilddbid, uint8 language, const char* message); void ChannelMessage(Mob* from, uint8 chan_num, uint8 language, const char* message, ...); void ChannelMessage(Mob* from, uint8 chan_num, uint8 language, uint8 lang_skill, const char* message, ...);