Added partial OP_NewZone support

This commit is contained in:
Xackery 2018-03-15 15:54:31 -07:00
parent c09ab507dd
commit a5f35bf32a
6 changed files with 107 additions and 10 deletions

View File

@ -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;

View File

@ -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
*/

View File

@ -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();

View File

@ -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;
}

View File

@ -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<eqproto::NewZoneEvent>(&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);
}

View File

@ -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;