mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-27 16:11:29 +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;
|
||||
|
||||
message ChannelMessage {
|
||||
int32 chan_num = 1;
|
||||
MessageType number = 1;
|
||||
int32 language = 2;
|
||||
string from = 3;
|
||||
string to = 4;
|
||||
@ -138,12 +138,23 @@ message ChannelMessageEvent {
|
||||
string target_name = 1; // Tell recipient
|
||||
string sender = 2; // The senders name (len might be wrong)
|
||||
uint32 language = 3; // Language
|
||||
uint32 chan_num = 4; // Channel
|
||||
MessageType number = 4; // Channel number
|
||||
uint32 cm_unknown4 = 5; // ***Placeholder
|
||||
uint32 skill_in_language = 6; // The players skill in this language? might be wrong
|
||||
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
|
||||
message WearChangeEvent {
|
||||
uint32 spawn_id = 1;
|
||||
@ -311,6 +322,113 @@ enum EntityType {
|
||||
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 {
|
||||
//option allow_alias = true;
|
||||
OP_Unknown = 0;
|
||||
@ -791,7 +909,7 @@ enum OpCode {
|
||||
OP_SpawnAppearance = 475;
|
||||
OP_SpawnDoor = 476;
|
||||
OP_SpawnPositionUpdate = 477;
|
||||
OP_SpecialMesg = 478;
|
||||
OP_SpecialMesg = 478; //supported
|
||||
OP_SpellEffect = 479;
|
||||
OP_Split = 480;
|
||||
OP_Stamina = 481;
|
||||
|
||||
@ -234,6 +234,8 @@ func entityEventSubscriber(zone string, instance int, entityID int64) {
|
||||
eventPayload = &eqproto.DeleteSpawnEvent{}
|
||||
case eqproto.OpCode_OP_Damage:
|
||||
eventPayload = &eqproto.DamageEvent{}
|
||||
case eqproto.OpCode_OP_SpecialMesg:
|
||||
eventPayload = &eqproto.SpecialMessageEvent{}
|
||||
default:
|
||||
return
|
||||
}
|
||||
|
||||
@ -44,15 +44,15 @@ func main() {
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
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{
|
||||
Message: message,
|
||||
ChanNum: chanNumber,
|
||||
Number: chanNumber,
|
||||
FromEntityId: fromEntityID,
|
||||
FromEntityType: fromEntityType,
|
||||
Distance: 500,
|
||||
@ -197,7 +197,6 @@ func entityEventSubscriber(zone string, instance int64, entityID int32) {
|
||||
return
|
||||
}*/
|
||||
|
||||
var opCode int64
|
||||
var index int
|
||||
channel := fmt.Sprintf("zone.%s.%d.entity.%d.event.out", zone, instance, entityID)
|
||||
nc.Subscribe(channel, func(m *nats.Msg) {
|
||||
@ -225,12 +224,14 @@ func entityEventSubscriber(zone string, instance int64, entityID int32) {
|
||||
eventPayload = &eqproto.DeleteSpawnEvent{}
|
||||
case eqproto.OpCode_OP_Damage:
|
||||
eventPayload = &eqproto.DamageEvent{}
|
||||
case eqproto.OpCode_OP_SpecialMesg:
|
||||
eventPayload = &eqproto.SpecialMessageEvent{}
|
||||
default:
|
||||
return
|
||||
}
|
||||
err = proto.Unmarshal(event.Payload, eventPayload)
|
||||
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
|
||||
}
|
||||
fmt.Println(m.Subject, event.Op, eventPayload)
|
||||
|
||||
@ -135,7 +135,7 @@ void NatsManager::OnChannelMessage(ServerChannelMessage_Struct* msg) {
|
||||
message->set_guilddbid(msg->guilddbid);
|
||||
message->set_noreply(msg->noreply);
|
||||
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_to(msg->to);
|
||||
message->set_language(msg->language);
|
||||
@ -297,9 +297,9 @@ void NatsManager::GetChannelMessage(eqproto::ChannelMessage* message, const char
|
||||
tmpname[0] = '*';
|
||||
strcpy(&tmpname[1], message->from().c_str());
|
||||
//TODO: add To support on tells
|
||||
int channel = message->chan_num();
|
||||
int channel = message->number();
|
||||
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());
|
||||
message->set_result("1");
|
||||
SendChannelMessage(message, reply);
|
||||
|
||||
@ -54,7 +54,9 @@ extern volatile bool RunLoops;
|
||||
#include "guild_mgr.h"
|
||||
#include "quest_parser_collection.h"
|
||||
#include "queryserv.h"
|
||||
#include "nats_manager.h"
|
||||
|
||||
extern NatsManager nats;
|
||||
extern QueryServ* QServ;
|
||||
extern EntityList entity_list;
|
||||
extern Zone* zone;
|
||||
@ -1270,7 +1272,7 @@ void Client::Message(uint32 type, const char* message, ...) {
|
||||
sm->header[2] = 0x00;
|
||||
sm->msg_type = type;
|
||||
memcpy(sm->message, buffer, len+1);
|
||||
|
||||
nats.OnSpecialMessageEvent(GetID(), sm);
|
||||
FastQueuePacket(&app);
|
||||
|
||||
safe_delete_array(buffer);
|
||||
@ -1301,7 +1303,7 @@ void Client::FilteredMessage(Mob *sender, uint32 type, eqFilterType filter, cons
|
||||
sm->header[2] = 0x00;
|
||||
sm->msg_type = type;
|
||||
memcpy(sm->message, buffer, len + 1);
|
||||
|
||||
nats.OnSpecialMessageEvent(GetID(), sm);
|
||||
FastQueuePacket(&app);
|
||||
|
||||
safe_delete_array(buffer);
|
||||
@ -1341,7 +1343,7 @@ void Client::QuestJournalledMessage(const char *npcname, const char* message) {
|
||||
dest = dest + strlen(OutNPCName) + 13;
|
||||
|
||||
memcpy(dest, OutMessage, strlen(OutMessage) + 1);
|
||||
|
||||
nats.OnSpecialMessageEvent(GetID(), sm);
|
||||
QueuePacket(app);
|
||||
|
||||
safe_delete(app);
|
||||
|
||||
@ -137,9 +137,9 @@ void NatsManager::GetChannelMessage(eqproto::ChannelMessage* message, const char
|
||||
}
|
||||
|
||||
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
|
||||
mob->Message(message->chan_num(), message->message().c_str());
|
||||
mob->Message(message->number(), message->message().c_str());
|
||||
|
||||
message->set_result("1");
|
||||
SendChannelMessage(message, reply);
|
||||
@ -668,8 +668,8 @@ void NatsManager::OnChannelMessageEvent(uint32 entity_id, ChannelMessage_Struct*
|
||||
|
||||
event->set_target_name(cm->targetname);
|
||||
event->set_sender(cm->sender);
|
||||
event->set_language(cm->language);
|
||||
event->set_chan_num(cm->chan_num);
|
||||
event->set_language(cm->language);
|
||||
event->set_number((eqproto::MessageType)cm->chan_num);
|
||||
event->set_cm_unknown4(*cm->cm_unknown4);
|
||||
event->set_skill_in_language(cm->skill_in_language);
|
||||
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) {
|
||||
if (!connect())
|
||||
return;
|
||||
|
||||
@ -32,6 +32,7 @@ public:
|
||||
void SendEvent(eqproto::OpCode op, uint32 entity_id, std::string pubMessage);
|
||||
|
||||
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 OnSpawnEvent(const EmuOpcode op, uint32 entity_id, Spawn_Struct * spawn);
|
||||
void OnWearChangeEvent(uint32 entity_id, WearChange_Struct * wc);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user