diff --git a/common/message.proto b/common/message.proto index efc5807fd..ae67ed11a 100644 --- a/common/message.proto +++ b/common/message.proto @@ -231,6 +231,46 @@ message SpecialMessageEvent { string message = 6; // What is being said? } +//OP_NewZone +message NewZoneEvent { + string char_name = 1; // Character Name + string zone_short_name = 2; // Zone Short Name + string zone_long_name = 3; // Zone Long Name + uint32 ztype = 4; // Zone type (usually FF) + uint32 fog_red = 5; // Zone fog (red) + uint32 fog_green = 6; // Zone fog (green) + uint32 fog_blue = 7; // Zone fog (blue) + uint32 unknown323 = 8; + float fog_minclip = 9; + float fog_maxclip = 10; + float gravity = 11; + uint32 time_type = 12; + uint32 rain_chance = 13; + uint32 rain_duration = 14; + uint32 snow_chance = 15; + uint32 snow_duration = 16; + uint32 unknown360 = 17; + uint32 sky = 18; // Sky Type + uint32 unknown331 = 19; // ***Placeholder + float zone_exp_multiplier = 20; // Experience Multiplier + float safe_y = 21; // Zone Safe Y + float safe_x = 22; // Zone Safe X + float safe_z = 23; // Zone Safe Z + float max_z = 24; // Guessed + float underworld = 25; // Underworld, min z (Not Sure?) + float minclip = 26; // Minimum View Distance + float maxclip = 27; // Maximum View DIstance + uint32 unknown_end = 28; // ***Placeholder + string zone_short_name2 = 29; + string unknown672 = 30; + uint32 zone_id = 31; + uint32 zone_instance = 32; + uint32 unknown688 = 33; + uint32 unknown692 = 34; + float fog_density = 35; + uint32 suspend_buffs = 36; +} + //OP_WearChange message WearChangeEvent { uint32 spawn_id = 1; @@ -702,7 +742,7 @@ enum OpCode { OP_ChannelMessage = 74; OP_CharacterCreate = 75; OP_CharacterCreateRequest = 76; - OP_CharInventory = 77; + OP_CharInventory = 77; //uses outbuffer, may not be worth working with OP_Charm = 78; OP_ChatMessage = 79; //used by lua OP_ClearAA = 80; @@ -739,8 +779,8 @@ enum OpCode { OP_CrystalCreate = 111; OP_CrystalReclaim = 112; OP_CustomTitles = 113; - OP_Damage = 114; - OP_Death = 115; + OP_Damage = 114; //supported + OP_Death = 115; //supported OP_DelegateAbility = 116; OP_DeleteCharacter = 117; OP_DeleteCharge = 118; @@ -971,7 +1011,7 @@ enum OpCode { OP_MultiLineMsg = 343; OP_NewSpawn = 344; //supported OP_NewTitlesAvailable = 345; - OP_NewZone = 346; + OP_NewZone = 346; //supported OP_OnLevelMessage = 347; OP_OpenContainer = 348; OP_OpenDiscordMerchant = 349; diff --git a/zone/attack.cpp b/zone/attack.cpp index 33d61c126..ad1a8397b 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -1657,7 +1657,7 @@ bool Client::Death(Mob* killerMob, int32 damage, uint16 spell, EQEmu::skills::Sk d->damage = damage; app.priority = 6; entity_list.QueueClients(this, &app); - + nats.OnDeathEvent(d); /* #2: figure out things that affect the player dying and mark them dead */ diff --git a/zone/client.cpp b/zone/client.cpp index b7971fa15..88e4c3458 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -3875,7 +3875,7 @@ void Client::Sacrifice(Client *caster) d->damage = 0; app.priority = 6; entity_list.QueueClients(this, &app); - + nats.OnDeathEvent(d); BuffFadeAll(); UnmemSpellAll(); Group *g = GetGroup(); diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index b205deb52..a625f9cbf 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -1226,7 +1226,7 @@ void Client::Handle_Connect_OP_ZoneComplete(const EQApplicationPacket *app) auto outapp = new EQApplicationPacket(OP_0x0347, 0); QueuePacket(outapp); safe_delete(outapp); - nats.OnZoneComplete(GetID()); + nats.OnZoneCompleteEvent(GetID()); return; } diff --git a/zone/nats_manager.cpp b/zone/nats_manager.cpp index 9b6a135f8..b25a6af76 100644 --- a/zone/nats_manager.cpp +++ b/zone/nats_manager.cpp @@ -1304,7 +1304,7 @@ void NatsManager::OnAlternateAdvancementStats(uint32 entity_id, AltAdvStats_Stru } -void NatsManager::OnZoneComplete(uint32 entity_id) { +void NatsManager::OnZoneCompleteEvent(uint32 entity_id) { if (!connect()) return; if (entity_id == 0) @@ -1370,4 +1370,61 @@ void NatsManager::OnAlternateAdvancementActionRequest(uint32 entity_id, AA_Actio return; } SendEvent(op, entity_id, event_buffer, event_size); +} + +void NatsManager::OnNewZoneEvent(uint32 entity_id, NewZone_Struct * nz) { + if (!connect()) + return; + if (entity_id == 0) + return; + if (!isEntityEventAllEnabled && !isEntitySubscribed(entity_id)) + return; + + auto op = eqproto::OP_NewZone; + + eqproto::NewZoneEvent* event = google::protobuf::Arena::CreateMessage(&the_arena); + + event->set_char_name(nz->char_name); + event->set_zone_short_name(nz->zone_short_name); + event->set_zone_long_name(nz->zone_long_name); + event->set_ztype(nz->ztype); + event->set_fog_red(*nz->fog_red); + event->set_fog_green(*nz->fog_green); + event->set_fog_blue(*nz->fog_blue); + event->set_unknown323(nz->unknown323); + event->set_fog_minclip(*nz->fog_minclip); + event->set_fog_maxclip(*nz->fog_maxclip); + event->set_gravity(nz->gravity); + event->set_time_type(nz->time_type); + event->set_rain_chance(*nz->rain_chance); + event->set_rain_duration(*nz->rain_duration); + event->set_snow_chance(*nz->snow_chance); + event->set_snow_duration(*nz->snow_duration); + event->set_unknown360(*nz->unknown360); + event->set_sky(nz->sky); + event->set_unknown331(*nz->unknown331); + event->set_zone_exp_multiplier(nz->zone_exp_multiplier); + event->set_safe_y(nz->safe_y); + event->set_safe_x(nz->safe_x); + event->set_safe_z(nz->safe_z); + event->set_max_z(nz->max_z); + event->set_underworld(nz->underworld); + event->set_minclip(nz->minclip); + event->set_maxclip(nz->maxclip); + event->set_unknown_end(*nz->unknown_end); + event->set_zone_short_name2(nz->zone_short_name2); + event->set_unknown672(nz->unknown672); + event->set_zone_id(nz->zone_id); + event->set_zone_instance(nz->zone_instance); + event->set_unknown688(nz->unknown688); + event->set_unknown692(*nz->unknown692); + event->set_fog_density(nz->fog_density); + event->set_suspend_buffs(nz->SuspendBuffs); + size_t event_size = event->ByteSizeLong(); + void *event_buffer = malloc(event_size); + if (!event->SerializeToArray(event_buffer, event_size)) { + Log(Logs::General, Logs::NATS, "zone.%s.%d.entity.%d.event.out: (OP: %d) failed to serialize message", subscribedZoneName.c_str(), subscribedZoneInstance, entity_id, op); + return; + } + SendEvent(op, entity_id, event_buffer, event_size); } \ No newline at end of file diff --git a/zone/nats_manager.h b/zone/nats_manager.h index ae7dd15d9..f67e9827f 100644 --- a/zone/nats_manager.h +++ b/zone/nats_manager.h @@ -45,8 +45,8 @@ public: void OnSpawnEvent(const EmuOpcode op, uint32 entity_id, Spawn_Struct * spawn); void OnSpecialMessageEvent(uint32 entity_id, SpecialMesg_Struct *sm); void OnWearChangeEvent(uint32 entity_id, WearChange_Struct * wc); - void OnZoneComplete(uint32 entity_id); - + void OnZoneCompleteEvent(uint32 entity_id); + void OnNewZoneEvent(uint32 entity_id, NewZone_Struct * nz); protected: bool connect(); Timer nats_timer;