From e0d4f9ecd1f9554ae92feafa29262550493cc5c5 Mon Sep 17 00:00:00 2001 From: Xackery Date: Wed, 14 Mar 2018 11:30:58 -0700 Subject: [PATCH] Added door properties, and more entitylist types --- common/message.proto | 29 ++++++- zone/nats_manager.cpp | 178 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 179 insertions(+), 28 deletions(-) diff --git a/common/message.proto b/common/message.proto index 3c93a46c3..02fc9b726 100644 --- a/common/message.proto +++ b/common/message.proto @@ -41,7 +41,7 @@ message Entity { EntityType type = 3; //Type of entity int32 hp = 4; //Mob: Current health int32 level = 5; //Mob: Current level - Position position = 6; //Mob: Position + Position position = 6; //Mob, Door: Position int32 race = 7; //Mob: Race int32 class = 8; //Mob: Class int32 max_hp = 9; //Mob: Maximum Hitpoints @@ -53,7 +53,7 @@ message Entity { BodyType bodytype = 15; //Mob: Body Type DeityType deity = 16; //Mob: Deity uint32 npctype_id = 17; //Mob: When npc was spawned from db, this is it's entry for npctype - float size = 18; //Mob: size of mob + float size = 18; //Mob, Door: size of mob float runspeed = 19; //Mob: runspeed //int32 light = 20; //Mob: Light level int32 texture = 21; //Mob: texture @@ -95,6 +95,31 @@ message Entity { uint8 in_legtexture, uint8 in_feettexture */ + + +//DOOR + + uint32 door_db_id = 100; //Door: databse ID of door + uint32 door_id = 101; //Door: Unique ID of door + //string door_zone_name = 102; //Door: zone name of door not needed? + string door_name = 103; //Door: name + int32 door_incline = 104; //Door: Incline + uint32 door_opentype = 105; //Door: Open type + uint32 door_guild_id = 106; //Door: Guild ID + uint32 door_lockpick = 107; //Door: Lockpick + uint32 door_keyitem = 108; //Door: Key item + uint32 door_nokeyring = 109; //Door: No key ring + uint32 door_trigger_door_id = 110; //Door: trigger door + uint32 door_trigger_type = 111; //Door: trigger type + uint32 door_param = 112; //Door: parameter + int32 door_invert_state = 113; //Door: invert state + bool door_disable_timer = 114; //Door: is timer disabled? + bool door_is_open = 115; //Door: is it currently open? + //string door_destination_zone = 116; //Door: destination zone TODO: not exposed + //int32 door_destination_instance_id = 117; //Door: destination instance TODO: not exposed + //Position door_destination_position = 118; //Door: destination position TODO: not exposed + uint32 door_is_ldon = 119; //Door: is it ldon? + uint32 door_client_version_mask = 120; //Door: client version mask } message Entities { diff --git a/zone/nats_manager.cpp b/zone/nats_manager.cpp index 6e822fbe6..0c4af8ccc 100644 --- a/zone/nats_manager.cpp +++ b/zone/nats_manager.cpp @@ -1,6 +1,9 @@ #include "entity.h" #include "mob.h" #include "client.h" +#include "doors.h" +#include "corpse.h" +#include "object.h" #include "event_codes.h" #include "nats.h" #include "zone_config.h" @@ -318,70 +321,164 @@ void NatsManager::GetCommandMessage(eqproto::CommandMessage* message, const char eqproto::Entities* entities = google::protobuf::Arena::CreateMessage(&the_arena); if (message->params(0).compare("npc") == 0) { - auto npcs = entity_list.GetNPCList(); - auto it = npcs.begin(); - for (const auto &entry : npcs) { + auto ents = entity_list.GetNPCList(); + auto it = ents.begin(); + for (const auto &entry : ents) { if (entry.second == nullptr) continue; - auto npc = entry.second; + auto ent = entry.second; auto entity = entities->add_entities(); - EncodeEntity(npc, entity); + EncodeEntity(ent, entity); } - if (!entities->SerializeToString(&entityPayload)) { + size_t size = entities->ByteSizeLong(); + void *buffer = malloc(size); + if (!entities->SerializeToArray(buffer, size)) { message->set_result("Failed to serialize entitiy result"); SendCommandMessage(message, reply); return; } - message->set_result("1"); - message->set_payload(entityPayload.c_str()); + message->set_payload(buffer, size); SendCommandMessage(message, reply); return; } else if (message->params(0).compare("client") == 0) { - auto clients = entity_list.GetClientList(); - auto it = clients.begin(); - for (const auto &entry : clients) { + auto ents = entity_list.GetClientList(); + auto it = ents.begin(); + for (const auto &entry : ents) { if (entry.second == nullptr) continue; - auto client = entry.second; - + auto ent = entry.second; auto entity = entities->add_entities(); - //EncodeEntity(client, entity); - entity->set_id(client->GetID()); - entity->set_name(client->GetName()); + EncodeEntity(ent, entity); } - if (!entities->SerializeToString(&entityPayload)) { + size_t size = entities->ByteSizeLong(); + void *buffer = malloc(size); + if (!entities->SerializeToArray(buffer, size)) { message->set_result("Failed to serialize entitiy result"); SendCommandMessage(message, reply); return; } message->set_result("1"); - message->set_payload(entityPayload.c_str()); + message->set_payload(buffer, size); SendCommandMessage(message, reply); return; } else if (message->params(0).compare("mob") == 0) { - auto mobs = entity_list.GetMobList(); - auto it = mobs.begin(); - for (const auto &entry : mobs) { + auto ents = entity_list.GetMobList(); + auto it = ents.begin(); + for (const auto &entry : ents) { if (entry.second == nullptr) continue; - - auto mob = entry.second; + auto ent = entry.second; auto entity = entities->add_entities(); - EncodeEntity(mob, entity); + EncodeEntity(ent, entity); } - if (!entities->SerializeToString(&entityPayload)) { + size_t size = entities->ByteSizeLong(); + void *buffer = malloc(size); + if (!entities->SerializeToArray(buffer, size)) { message->set_result("Failed to serialize entitiy result"); SendCommandMessage(message, reply); return; } message->set_result("1"); - message->set_payload(entityPayload.c_str()); + message->set_payload(buffer, size); + SendCommandMessage(message, reply); + return; + } + else if (message->params(0).compare("mercenary") == 0) { + auto ents = entity_list.GetMercList(); + auto it = ents.begin(); + for (const auto &entry : ents) { + if (entry.second == nullptr) + continue; + auto ent = entry.second; + auto entity = entities->add_entities(); + EncodeEntity(ent, entity); + } + + size_t size = entities->ByteSizeLong(); + void *buffer = malloc(size); + if (!entities->SerializeToArray(buffer, size)) { + message->set_result("Failed to serialize entitiy result"); + SendCommandMessage(message, reply); + return; + } + message->set_result("1"); + message->set_payload(buffer, size); + SendCommandMessage(message, reply); + return; + } + else if (message->params(0).compare("corpse") == 0) { + auto ents = entity_list.GetCorpseList(); + auto it = ents.begin(); + for (const auto &entry : ents) { + if (entry.second == nullptr) + continue; + Corpse* ent = entry.second; + auto entity = entities->add_entities(); + EncodeEntity(ent, entity); + } + + size_t size = entities->ByteSizeLong(); + void *buffer = malloc(size); + if (!entities->SerializeToArray(buffer, size)) { + message->set_result("Failed to serialize entitiy result"); + SendCommandMessage(message, reply); + return; + } + message->set_result("1"); + message->set_payload(buffer, size); + SendCommandMessage(message, reply); + return; + } + else if (message->params(0).compare("door") == 0) { + auto ents = entity_list.GetDoorsList(); + auto it = ents.begin(); + for (const auto &entry : ents) { + if (entry.second == nullptr) + continue; + Doors* ent = entry.second; + + auto entity = entities->add_entities(); + EncodeEntity(ent, entity); + } + + size_t size = entities->ByteSizeLong(); + void *buffer = malloc(size); + if (!entities->SerializeToArray(buffer, size)) { + message->set_result("Failed to serialize entitiy result"); + SendCommandMessage(message, reply); + return; + } + message->set_result("1"); + message->set_payload(buffer, size); + SendCommandMessage(message, reply); + return; + } + else if (message->params(0).compare("object") == 0) { + auto ents = entity_list.GetObjectList(); + auto it = ents.begin(); + for (const auto &entry : ents) { + if (entry.second == nullptr) + continue; + Object * ent = entry.second; + auto entity = entities->add_entities(); + EncodeEntity(ent, entity); + } + + size_t size = entities->ByteSizeLong(); + void *buffer = malloc(size); + if (!entities->SerializeToArray(buffer, size)) { + message->set_result("Failed to serialize entitiy result"); + SendCommandMessage(message, reply); + return; + } + message->set_result("1"); + message->set_payload(buffer, size); SendCommandMessage(message, reply); return; } @@ -683,6 +780,35 @@ void NatsManager::EncodeEntity(Entity * entity, eqproto::Entity * out) if (entity->IsDoor()) { out->set_type(eqproto::EntityType::Door); + Doors * door = entity->CastToDoors(); + eqproto::Position* pos = google::protobuf::Arena::CreateMessage(&the_arena); + + auto door_pos = door->GetPosition(); + pos->set_x(door_pos.x); + pos->set_y(door_pos.y); + pos->set_z(door_pos.z); + pos->set_h(door_pos.w); + out->set_allocated_position(pos); + + out->set_door_db_id(door->GetDoorDBID()); + out->set_door_id(door->GetDoorID()); + out->set_door_name(door->GetName()); + out->set_door_incline(door->GetIncline()); + out->set_door_opentype(door->GetOpenType()); + out->set_door_guild_id(door->GetGuildID()); + out->set_door_lockpick(door->GetLockpick()); + out->set_door_keyitem(door->GetKeyItem()); + out->set_door_nokeyring(door->GetNoKeyring()); + out->set_door_trigger_door_id(door->GetTriggerDoorID()); + out->set_door_trigger_type(door->GetTriggerType()); + out->set_door_param(door->GetDoorParam()); + out->set_door_invert_state(door->GetInvertState()); + out->set_door_disable_timer(door->GetDisableTimer()); + out->set_door_is_open(door->IsDoorOpen()); + //TODO: expose door destination properties + //out->set_door_destination_zone(door->) + out->set_door_is_ldon(door->IsLDoNDoor()); + out->set_door_client_version_mask(door->GetClientVersionMask()); }