mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-17 11:28:25 +00:00
Fix issues with OP_SpecialMesg handling
This should prevent any optimizations being done on the "1 char string" This also fully documents the packet and expands the uses of quest::say/QuestSay
This commit is contained in:
+18
-16
@@ -3733,24 +3733,26 @@ bool Entity::CheckCoordLosNoZLeaps(float cur_x, float cur_y, float cur_z,
|
||||
}
|
||||
|
||||
void EntityList::QuestJournalledSayClose(Mob *sender, Client *QuestInitiator,
|
||||
float dist, const char* mobname, const char* message)
|
||||
float dist, const char* mobname, const char* message, Journal::Options &opts)
|
||||
{
|
||||
Client *c = nullptr;
|
||||
float dist2 = dist * dist;
|
||||
SerializeBuffer buf(sizeof(SpecialMesgHeader_Struct) + 12 + 64 + 64);
|
||||
|
||||
// Send the message to the quest initiator such that the client will enter it into the NPC Quest Journal
|
||||
if (QuestInitiator) {
|
||||
auto buf = new char[strlen(mobname) + strlen(message) + 10];
|
||||
sprintf(buf, "%s says, '%s'", mobname, message);
|
||||
QuestInitiator->QuestJournalledMessage(mobname, buf);
|
||||
safe_delete_array(buf);
|
||||
}
|
||||
// Use the old method for all other nearby clients
|
||||
for (auto it = client_list.begin(); it != client_list.end(); ++it) {
|
||||
c = it->second;
|
||||
if(c && (c != QuestInitiator) && DistanceSquared(c->GetPosition(), sender->GetPosition()) <= dist2)
|
||||
c->Message_StringID(10, GENERIC_SAY, mobname, message);
|
||||
}
|
||||
buf.WriteInt8(static_cast<int8>(opts.speak_mode));
|
||||
buf.WriteInt8(static_cast<int8>(opts.journal_mode));
|
||||
buf.WriteInt8(opts.language);
|
||||
buf.WriteInt32(opts.message_type);
|
||||
buf.WriteInt32(opts.target_spawn_id);
|
||||
buf.WriteString(mobname);
|
||||
buf.WriteInt32(0); // location, client doesn't seem to do anything with this
|
||||
buf.WriteInt32(0);
|
||||
buf.WriteInt32(0);
|
||||
buf.WriteString(message);
|
||||
|
||||
auto outapp = new EQApplicationPacket(OP_SpecialMesg, buf);
|
||||
|
||||
// client only bothers logging if target spawn ID matches, safe to send to everyone
|
||||
QueueCloseClients(sender, outapp, false, dist);
|
||||
delete outapp;
|
||||
}
|
||||
|
||||
Corpse *EntityList::GetClosestCorpse(Mob *sender, const char *Name)
|
||||
|
||||
Reference in New Issue
Block a user