mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-05 01:02:24 +00:00
Added MessageType and SpecialMessage support
This commit is contained in:
parent
6532a81b80
commit
98f4e570e7
@ -5,7 +5,7 @@ option cc_enable_arenas = true;
|
|||||||
option optimize_for = SPEED;
|
option optimize_for = SPEED;
|
||||||
|
|
||||||
message ChannelMessage {
|
message ChannelMessage {
|
||||||
int32 chan_num = 1;
|
MessageType number = 1;
|
||||||
int32 language = 2;
|
int32 language = 2;
|
||||||
string from = 3;
|
string from = 3;
|
||||||
string to = 4;
|
string to = 4;
|
||||||
@ -138,12 +138,23 @@ message ChannelMessageEvent {
|
|||||||
string target_name = 1; // Tell recipient
|
string target_name = 1; // Tell recipient
|
||||||
string sender = 2; // The senders name (len might be wrong)
|
string sender = 2; // The senders name (len might be wrong)
|
||||||
uint32 language = 3; // Language
|
uint32 language = 3; // Language
|
||||||
uint32 chan_num = 4; // Channel
|
MessageType number = 4; // Channel number
|
||||||
uint32 cm_unknown4 = 5; // ***Placeholder
|
uint32 cm_unknown4 = 5; // ***Placeholder
|
||||||
uint32 skill_in_language = 6; // The players skill in this language? might be wrong
|
uint32 skill_in_language = 6; // The players skill in this language? might be wrong
|
||||||
string message = 7; // Variable length message
|
string message = 7; // Variable length message
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//OP_SpecialMesg
|
||||||
|
message SpecialMessageEvent {
|
||||||
|
string header = 1; // 04 04 00 <-- for #emote style msg
|
||||||
|
MessageType number = 2; // Color of text (see MT_*** below)
|
||||||
|
uint32 target_spawn_id = 3; // Who is it being said to?
|
||||||
|
string sayer = 4; // Who is the source of the info
|
||||||
|
uint32 unknown12 = 5;
|
||||||
|
string message = 6; // What is being said?
|
||||||
|
}
|
||||||
|
|
||||||
//OP_WearChange
|
//OP_WearChange
|
||||||
message WearChangeEvent {
|
message WearChangeEvent {
|
||||||
uint32 spawn_id = 1;
|
uint32 spawn_id = 1;
|
||||||
@ -311,6 +322,113 @@ enum EntityType {
|
|||||||
Object = 6; //Inherits entity
|
Object = 6; //Inherits entity
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
enum MessageType {
|
||||||
|
//option allow_alias = true;
|
||||||
|
WhiteSmoke = 0; // FF|F0F0F0
|
||||||
|
DimGray = 1; // FF|606060
|
||||||
|
Green = 2; // FF|008000
|
||||||
|
BrightBlue = 3; // FF|0040FF
|
||||||
|
Magenta = 5; // FF|F000F0
|
||||||
|
Gray = 6; // FF|808080
|
||||||
|
LightGray = 7; // FF|E0E0E0
|
||||||
|
WhiteSmoke2 = 10; // FF|F0F0F0
|
||||||
|
DarkGray = 12; // FF|A0A0A0
|
||||||
|
Red= 13; // FF|F00000
|
||||||
|
Lime = 14; // FF|00F000
|
||||||
|
Yellow = 15; // FF|F0F000
|
||||||
|
Blue = 16; // FF|0000F0
|
||||||
|
LightNavy = 17; // FF|0000AF
|
||||||
|
Cyan = 18; // FF|00F0F0
|
||||||
|
Black = 20; // FF|000000
|
||||||
|
|
||||||
|
Say = 256;
|
||||||
|
Tell = 257;
|
||||||
|
Group = 258;
|
||||||
|
Guild = 259;
|
||||||
|
OOC = 260;
|
||||||
|
Auction = 261;
|
||||||
|
Shout = 262;
|
||||||
|
Emote = 263;
|
||||||
|
Spells = 264;
|
||||||
|
YouHitOther = 265;
|
||||||
|
OtherHitsYou = 266;
|
||||||
|
YouMissOther = 267;
|
||||||
|
OtherMissesYou = 268;
|
||||||
|
Broadcasts = 269;
|
||||||
|
Skills = 270;
|
||||||
|
Disciplines = 271;
|
||||||
|
Unused1 = 272;
|
||||||
|
DefaultText = 273;
|
||||||
|
Unused2 = 274;
|
||||||
|
MerchantOffer = 275;
|
||||||
|
MerchantBuySell = 276;
|
||||||
|
YourDeath = 277;
|
||||||
|
OtherDeath = 278;
|
||||||
|
OtherHits = 279;
|
||||||
|
OtherMisses = 280;
|
||||||
|
Who = 281;
|
||||||
|
YellForHelp = 282;
|
||||||
|
NonMelee = 283;
|
||||||
|
WornOff = 284;
|
||||||
|
MoneySplit = 285;
|
||||||
|
LootMessages = 286;
|
||||||
|
DiceRoll = 287;
|
||||||
|
OtherSpells = 288;
|
||||||
|
SpellFailure = 289;
|
||||||
|
Chat = 290;
|
||||||
|
Channel1 = 291;
|
||||||
|
Channel2 = 292;
|
||||||
|
Channel3 = 293;
|
||||||
|
Channel4 = 294;
|
||||||
|
Channel5 = 295;
|
||||||
|
Channel6 = 296;
|
||||||
|
Channel7 = 297;
|
||||||
|
Channel8 = 298;
|
||||||
|
Channel9 = 299;
|
||||||
|
Channel10 = 300;
|
||||||
|
CritMelee = 301;
|
||||||
|
SpellCrits = 302;
|
||||||
|
TooFarAway = 303;
|
||||||
|
NPCRampage = 304;
|
||||||
|
NPCFlurry = 305;
|
||||||
|
NPCEnrage = 306;
|
||||||
|
SayEcho = 307;
|
||||||
|
TellEcho = 308;
|
||||||
|
GroupEcho = 309;
|
||||||
|
GuildEcho = 310;
|
||||||
|
OOCEcho = 311;
|
||||||
|
AuctionEcho = 312;
|
||||||
|
ShoutECho = 313;
|
||||||
|
EmoteEcho = 314;
|
||||||
|
Chat1Echo = 315;
|
||||||
|
Chat2Echo = 316;
|
||||||
|
Chat3Echo = 317;
|
||||||
|
Chat4Echo = 318;
|
||||||
|
Chat5Echo = 319;
|
||||||
|
Chat6Echo = 320;
|
||||||
|
Chat7Echo = 321;
|
||||||
|
Chat8Echo = 322;
|
||||||
|
Chat9Echo = 323;
|
||||||
|
Chat10Echo = 324;
|
||||||
|
DoTDamage = 325;
|
||||||
|
ItemLink = 326;
|
||||||
|
RaidSay = 327;
|
||||||
|
MyPet = 328;
|
||||||
|
DS = 329;
|
||||||
|
Leadership = 330;
|
||||||
|
PetFlurry = 331;
|
||||||
|
PetCrit = 332;
|
||||||
|
FocusEffect = 333;
|
||||||
|
Experience = 334;
|
||||||
|
System = 335;
|
||||||
|
PetSpell = 336;
|
||||||
|
PetResponse = 337;
|
||||||
|
ItemSpeech = 338;
|
||||||
|
StrikeThrough = 339;
|
||||||
|
Stun = 340;
|
||||||
|
}
|
||||||
|
|
||||||
enum OpCode {
|
enum OpCode {
|
||||||
//option allow_alias = true;
|
//option allow_alias = true;
|
||||||
OP_Unknown = 0;
|
OP_Unknown = 0;
|
||||||
@ -791,7 +909,7 @@ enum OpCode {
|
|||||||
OP_SpawnAppearance = 475;
|
OP_SpawnAppearance = 475;
|
||||||
OP_SpawnDoor = 476;
|
OP_SpawnDoor = 476;
|
||||||
OP_SpawnPositionUpdate = 477;
|
OP_SpawnPositionUpdate = 477;
|
||||||
OP_SpecialMesg = 478;
|
OP_SpecialMesg = 478; //supported
|
||||||
OP_SpellEffect = 479;
|
OP_SpellEffect = 479;
|
||||||
OP_Split = 480;
|
OP_Split = 480;
|
||||||
OP_Stamina = 481;
|
OP_Stamina = 481;
|
||||||
|
|||||||
@ -234,6 +234,8 @@ func entityEventSubscriber(zone string, instance int, entityID int64) {
|
|||||||
eventPayload = &eqproto.DeleteSpawnEvent{}
|
eventPayload = &eqproto.DeleteSpawnEvent{}
|
||||||
case eqproto.OpCode_OP_Damage:
|
case eqproto.OpCode_OP_Damage:
|
||||||
eventPayload = &eqproto.DamageEvent{}
|
eventPayload = &eqproto.DamageEvent{}
|
||||||
|
case eqproto.OpCode_OP_SpecialMesg:
|
||||||
|
eventPayload = &eqproto.SpecialMessageEvent{}
|
||||||
default:
|
default:
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -44,15 +44,15 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
go entityEventSubscriber(zone, instance, entityID)
|
go entityEventSubscriber(zone, instance, entityID)
|
||||||
zoneChannel(zone, instance, entityID, eqproto.EntityType_Client, 256, "Hello, World!")
|
zoneChannel(zone, instance, entityID, eqproto.EntityType_Client, eqproto.MessageType_Say, "Hello, World!")
|
||||||
time.Sleep(1000 * time.Second)
|
time.Sleep(1000 * time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
func zoneChannel(zone string, instance int64, fromEntityID int32, fromEntityType eqproto.EntityType, chanNumber int32, message string) {
|
func zoneChannel(zone string, instance int64, fromEntityID int32, fromEntityType eqproto.EntityType, chanNumber eqproto.MessageType, message string) {
|
||||||
|
|
||||||
msg := &eqproto.ChannelMessage{
|
msg := &eqproto.ChannelMessage{
|
||||||
Message: message,
|
Message: message,
|
||||||
ChanNum: chanNumber,
|
Number: chanNumber,
|
||||||
FromEntityId: fromEntityID,
|
FromEntityId: fromEntityID,
|
||||||
FromEntityType: fromEntityType,
|
FromEntityType: fromEntityType,
|
||||||
Distance: 500,
|
Distance: 500,
|
||||||
@ -197,7 +197,6 @@ func entityEventSubscriber(zone string, instance int64, entityID int32) {
|
|||||||
return
|
return
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
var opCode int64
|
|
||||||
var index int
|
var index int
|
||||||
channel := fmt.Sprintf("zone.%s.%d.entity.%d.event.out", zone, instance, entityID)
|
channel := fmt.Sprintf("zone.%s.%d.entity.%d.event.out", zone, instance, entityID)
|
||||||
nc.Subscribe(channel, func(m *nats.Msg) {
|
nc.Subscribe(channel, func(m *nats.Msg) {
|
||||||
@ -225,12 +224,14 @@ func entityEventSubscriber(zone string, instance int64, entityID int32) {
|
|||||||
eventPayload = &eqproto.DeleteSpawnEvent{}
|
eventPayload = &eqproto.DeleteSpawnEvent{}
|
||||||
case eqproto.OpCode_OP_Damage:
|
case eqproto.OpCode_OP_Damage:
|
||||||
eventPayload = &eqproto.DamageEvent{}
|
eventPayload = &eqproto.DamageEvent{}
|
||||||
|
case eqproto.OpCode_OP_SpecialMesg:
|
||||||
|
eventPayload = &eqproto.SpecialMessageEvent{}
|
||||||
default:
|
default:
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = proto.Unmarshal(event.Payload, eventPayload)
|
err = proto.Unmarshal(event.Payload, eventPayload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Invalid data passed for opcode", eqproto.OpCode(opCode), err.Error(), string(m.Data[index+1:]))
|
fmt.Println("Invalid data passed for opcode", event.Op, err.Error(), string(m.Data[index+1:]))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Println(m.Subject, event.Op, eventPayload)
|
fmt.Println(m.Subject, event.Op, eventPayload)
|
||||||
|
|||||||
@ -135,7 +135,7 @@ void NatsManager::OnChannelMessage(ServerChannelMessage_Struct* msg) {
|
|||||||
message->set_guilddbid(msg->guilddbid);
|
message->set_guilddbid(msg->guilddbid);
|
||||||
message->set_noreply(msg->noreply);
|
message->set_noreply(msg->noreply);
|
||||||
message->set_queued(msg->queued);
|
message->set_queued(msg->queued);
|
||||||
message->set_chan_num(msg->chan_num);
|
message->set_number(static_cast<eqproto::MessageType>(msg->chan_num));
|
||||||
message->set_message(msg->message);
|
message->set_message(msg->message);
|
||||||
message->set_to(msg->to);
|
message->set_to(msg->to);
|
||||||
message->set_language(msg->language);
|
message->set_language(msg->language);
|
||||||
@ -297,9 +297,9 @@ void NatsManager::GetChannelMessage(eqproto::ChannelMessage* message, const char
|
|||||||
tmpname[0] = '*';
|
tmpname[0] = '*';
|
||||||
strcpy(&tmpname[1], message->from().c_str());
|
strcpy(&tmpname[1], message->from().c_str());
|
||||||
//TODO: add To support on tells
|
//TODO: add To support on tells
|
||||||
int channel = message->chan_num();
|
int channel = message->number();
|
||||||
if (channel < 1)
|
if (channel < 1)
|
||||||
channel = 5; //default to ooc
|
channel = MT_OOC; //default to ooc
|
||||||
zoneserver_list.SendChannelMessage(tmpname, 0, channel, message->language(), message->message().c_str());
|
zoneserver_list.SendChannelMessage(tmpname, 0, channel, message->language(), message->message().c_str());
|
||||||
message->set_result("1");
|
message->set_result("1");
|
||||||
SendChannelMessage(message, reply);
|
SendChannelMessage(message, reply);
|
||||||
|
|||||||
@ -54,7 +54,9 @@ extern volatile bool RunLoops;
|
|||||||
#include "guild_mgr.h"
|
#include "guild_mgr.h"
|
||||||
#include "quest_parser_collection.h"
|
#include "quest_parser_collection.h"
|
||||||
#include "queryserv.h"
|
#include "queryserv.h"
|
||||||
|
#include "nats_manager.h"
|
||||||
|
|
||||||
|
extern NatsManager nats;
|
||||||
extern QueryServ* QServ;
|
extern QueryServ* QServ;
|
||||||
extern EntityList entity_list;
|
extern EntityList entity_list;
|
||||||
extern Zone* zone;
|
extern Zone* zone;
|
||||||
@ -1270,7 +1272,7 @@ void Client::Message(uint32 type, const char* message, ...) {
|
|||||||
sm->header[2] = 0x00;
|
sm->header[2] = 0x00;
|
||||||
sm->msg_type = type;
|
sm->msg_type = type;
|
||||||
memcpy(sm->message, buffer, len+1);
|
memcpy(sm->message, buffer, len+1);
|
||||||
|
nats.OnSpecialMessageEvent(GetID(), sm);
|
||||||
FastQueuePacket(&app);
|
FastQueuePacket(&app);
|
||||||
|
|
||||||
safe_delete_array(buffer);
|
safe_delete_array(buffer);
|
||||||
@ -1301,7 +1303,7 @@ void Client::FilteredMessage(Mob *sender, uint32 type, eqFilterType filter, cons
|
|||||||
sm->header[2] = 0x00;
|
sm->header[2] = 0x00;
|
||||||
sm->msg_type = type;
|
sm->msg_type = type;
|
||||||
memcpy(sm->message, buffer, len + 1);
|
memcpy(sm->message, buffer, len + 1);
|
||||||
|
nats.OnSpecialMessageEvent(GetID(), sm);
|
||||||
FastQueuePacket(&app);
|
FastQueuePacket(&app);
|
||||||
|
|
||||||
safe_delete_array(buffer);
|
safe_delete_array(buffer);
|
||||||
@ -1341,7 +1343,7 @@ void Client::QuestJournalledMessage(const char *npcname, const char* message) {
|
|||||||
dest = dest + strlen(OutNPCName) + 13;
|
dest = dest + strlen(OutNPCName) + 13;
|
||||||
|
|
||||||
memcpy(dest, OutMessage, strlen(OutMessage) + 1);
|
memcpy(dest, OutMessage, strlen(OutMessage) + 1);
|
||||||
|
nats.OnSpecialMessageEvent(GetID(), sm);
|
||||||
QueuePacket(app);
|
QueuePacket(app);
|
||||||
|
|
||||||
safe_delete(app);
|
safe_delete(app);
|
||||||
|
|||||||
@ -137,9 +137,9 @@ void NatsManager::GetChannelMessage(eqproto::ChannelMessage* message, const char
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (message->distance() > 0)
|
if (message->distance() > 0)
|
||||||
entity_list.MessageClose(mob, message->skip_sender(), message->distance(), message->chan_num(), message->message().c_str());
|
entity_list.MessageClose(mob, message->skip_sender(), message->distance(), message->number(), message->message().c_str());
|
||||||
else
|
else
|
||||||
mob->Message(message->chan_num(), message->message().c_str());
|
mob->Message(message->number(), message->message().c_str());
|
||||||
|
|
||||||
message->set_result("1");
|
message->set_result("1");
|
||||||
SendChannelMessage(message, reply);
|
SendChannelMessage(message, reply);
|
||||||
@ -668,8 +668,8 @@ void NatsManager::OnChannelMessageEvent(uint32 entity_id, ChannelMessage_Struct*
|
|||||||
|
|
||||||
event->set_target_name(cm->targetname);
|
event->set_target_name(cm->targetname);
|
||||||
event->set_sender(cm->sender);
|
event->set_sender(cm->sender);
|
||||||
event->set_language(cm->language);
|
event->set_language(cm->language);
|
||||||
event->set_chan_num(cm->chan_num);
|
event->set_number((eqproto::MessageType)cm->chan_num);
|
||||||
event->set_cm_unknown4(*cm->cm_unknown4);
|
event->set_cm_unknown4(*cm->cm_unknown4);
|
||||||
event->set_skill_in_language(cm->skill_in_language);
|
event->set_skill_in_language(cm->skill_in_language);
|
||||||
event->set_message(cm->message);
|
event->set_message(cm->message);
|
||||||
@ -681,6 +681,33 @@ void NatsManager::OnChannelMessageEvent(uint32 entity_id, ChannelMessage_Struct*
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NatsManager::OnSpecialMessageEvent(uint32 entity_id, SpecialMesg_Struct* sm) {
|
||||||
|
if (!connect())
|
||||||
|
return;
|
||||||
|
if (entity_id == 0)
|
||||||
|
return;
|
||||||
|
if (!isEntityEventAllEnabled && !isEntitySubscribed(entity_id))
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto op = eqproto::OP_SpecialMesg;
|
||||||
|
|
||||||
|
std::string pubMessage;
|
||||||
|
eqproto::SpecialMessageEvent* event = google::protobuf::Arena::CreateMessage<eqproto::SpecialMessageEvent>(&the_arena);
|
||||||
|
event->set_header(sm->header);
|
||||||
|
event->set_number(static_cast<eqproto::MessageType>(sm->msg_type));
|
||||||
|
event->set_target_spawn_id(sm->target_spawn_id);
|
||||||
|
event->set_sayer(sm->sayer);
|
||||||
|
event->set_unknown12(*sm->unknown12);
|
||||||
|
event->set_message(sm->message);
|
||||||
|
|
||||||
|
if (!event->SerializeToString(&pubMessage)) {
|
||||||
|
Log(Logs::General, Logs::NATS, "zone.%s.%d.entity.%d.event.out: (OP: %d) failed to serialize message to string", subscribedZoneName.c_str(), subscribedZoneInstance, entity_id, op);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SendEvent(op, entity_id, pubMessage);
|
||||||
|
}
|
||||||
|
|
||||||
void NatsManager::OnEntityEvent(const EmuOpcode op, uint32 entity_id, uint32 target_id) {
|
void NatsManager::OnEntityEvent(const EmuOpcode op, uint32 entity_id, uint32 target_id) {
|
||||||
if (!connect())
|
if (!connect())
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -32,6 +32,7 @@ public:
|
|||||||
void SendEvent(eqproto::OpCode op, uint32 entity_id, std::string pubMessage);
|
void SendEvent(eqproto::OpCode op, uint32 entity_id, std::string pubMessage);
|
||||||
|
|
||||||
void OnChannelMessageEvent(uint32 entity_id, ChannelMessage_Struct * cm);
|
void OnChannelMessageEvent(uint32 entity_id, ChannelMessage_Struct * cm);
|
||||||
|
void OnSpecialMessageEvent(uint32 entity_id, SpecialMesg_Struct *sm);
|
||||||
void OnEntityEvent(const EmuOpcode op, uint32 entity_id, uint32 target_id);
|
void OnEntityEvent(const EmuOpcode op, uint32 entity_id, uint32 target_id);
|
||||||
void OnSpawnEvent(const EmuOpcode op, uint32 entity_id, Spawn_Struct * spawn);
|
void OnSpawnEvent(const EmuOpcode op, uint32 entity_id, Spawn_Struct * spawn);
|
||||||
void OnWearChangeEvent(uint32 entity_id, WearChange_Struct * wc);
|
void OnWearChangeEvent(uint32 entity_id, WearChange_Struct * wc);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user