Added EncodeEntity

This commit is contained in:
Xackery 2018-03-13 22:02:33 -07:00
parent 98f4e570e7
commit cb72ad4d0f
3 changed files with 252 additions and 25 deletions

View File

@ -36,14 +36,65 @@ message CommandMessage {
//Entity is full of entity data.
message Entity {
int32 id = 1;
string name = 2;
EntityType type = 3; //0 - NPC, 1 - Client
int32 hp = 4;
int32 level = 5;
Position position = 6;
int32 race = 7;
int32 class = 8;
int32 id = 1; //Entity: Unique entity identifier for zone.
string name = 2; //Entity: Name of entity
EntityType type = 3; //Type of entity
int32 hp = 4; //Mob: Current health
int32 level = 5; //Mob: Current level
Position position = 6; //Mob: Position
int32 race = 7; //Mob: Race
int32 class = 8; //Mob: Class
int32 max_hp = 9; //Mob: Maximum Hitpoints
int64 spawn_timestamp = 10; //Entity: When entity was spawned
//SpecialAbility special_ability = 11; //Mob: Special abilities mob contains
//AuraInfo aura_info = 12; //Mob: Aura information
string lastname = 13; //Mob: Last name. Surname for clients
GenderType gender = 14; //Mob: Gender
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 runspeed = 19; //Mob: runspeed
//int32 light = 20; //Mob: Light level
int32 texture = 21; //Mob: texture
int32 helmtexture = 22; //Mob: helm texture
int32 ac = 23; //Mob: Armor class
int32 atk = 24; //Mob: Attack
int32 str = 25; //Mob: Strength
int32 sta = 26; //Mob: Stamina
int32 dex = 27; //Mob: Dexterity
int32 agi = 28; //Mob: Agility
int32 int = 29; //Mob: Intelligence
int32 wis = 30; //Mob: Wisdom
int32 cha = 31; //Mob: Charisma
int32 haircolor = 32; //Mob: Hair color
int32 beardcolor = 33; //Mob: beard color
int32 eyecolor1 = 34; //Mob: eye color left?
int32 eyecolor2 = 35; //Mob: eye color right?
/*uint8 in_eyecolor2,
uint8 in_hairstyle,
uint8 in_luclinface,
uint8 in_beard,
uint32 in_drakkin_heritage,
uint32 in_drakkin_tattoo,
uint32 in_drakkin_details,
EQEmu::TintProfile in_armor_tint,
uint8 in_aa_title,
uint8 in_see_invis, // see through invis
uint8 in_see_invis_undead, // see through invis vs. undead
uint8 in_see_hide,
uint8 in_see_improved_hide,
int32 in_hp_regen,
int32 in_mana_regen,
uint8 in_qglobal,
uint8 in_maxlevel,
uint32 in_scalerate,
uint8 in_armtexture,
uint8 in_bracertexture,
uint8 in_handtexture,
uint8 in_legtexture,
uint8 in_feettexture
*/
}
message Entities {
@ -320,6 +371,53 @@ enum EntityType {
Corpse = 4; //Inherits mob
Door = 5; //Inherits entity
Object = 6; //Inherits entity
Trap = 7; //Inherits entity
Beacon = 9; //Inherits mob
Encounter = 10; //Inherits mob
}
enum DeityType {
Unknown = 0;
Agnostic_LB = 140;
Bertoxxulous = 201;
BrellSirilis = 202;
CazicThule = 203;
ErollisiMarr = 204;
Bristlebane = 205;
Innoruuk = 206;
Karana = 207;
MithanielMarr = 208;
Prexus = 209;
Quellious = 210;
RallosZek = 211;
RodcetNife = 212;
SolusekRo = 213;
TheTribunal = 214;
Tunare = 215;
Veeshan = 216;
Agnostic = 396;
}
enum DeityTypeBit {
bit_DeityNone = 0x00000000;
bit_DeityAgnostic = 0x00000001;
bit_DeityBertoxxulous = 0x00000002;
bit_DeityBrellSirilis = 0x00000004;
bit_DeityCazicThule = 0x00000008;
bit_DeityErollisiMarr = 0x00000010;
bit_DeityBristlebane = 0x00000020;
bit_DeityInnoruuk = 0x00000040;
bit_DeityKarana = 0x00000080;
bit_DeityMithanielMarr = 0x00000100;
bit_DeityPrexus = 0x00000200;
bit_DeityQuellious = 0x00000400;
bit_DeityRallosZek = 0x00000800;
bit_DeityRodcetNife = 0x00001000;
bit_DeitySolusekRo = 0x00002000;
bit_DeityTheTribunal = 0x00004000;
bit_DeityTunare = 0x00008000;
bit_DeityVeeshan = 0x00010000;
bit_DeityAll = 0xFFFFFFF;
}
@ -429,6 +527,57 @@ enum MessageType {
Stun = 340;
}
enum BodyType {
//option allow_alias = true;
BT_Unknown = 0;
BT_Humanoid = 1;
BT_Lycanthrope = 2;
BT_Undead = 3;
BT_Giant = 4;
BT_Construct = 5;
BT_Extraplanar = 6;
BT_Magical = 7; //this name might be a bit off
BT_SummonedUndead = 8;
BT_RaidGiant = 9;
BT_NoTarget = 11; //no name; can't target this bodytype
BT_Vampire = 12;
BT_Atenha_Ra = 13;
BT_Greater_Akheva = 14;
BT_Khati_Sha = 15;
BT_Seru = 16; //not confirmed....
BT_Draz_Nurakk = 18;
BT_Zek = 19;
BT_Luggald = 20;
BT_Animal = 21;
BT_Insect = 22;
BT_Monster = 23;
BT_Summoned = 24; //Elemental?
BT_Plant = 25;
BT_Dragon = 26;
BT_Summoned2 = 27;
BT_Summoned3 = 28;
BT_VeliousDragon = 30; //might not be a tight set
BT_Dragon3 = 32;
BT_Boxes = 33;
BT_Muramite = 34; //tribal dudes
BT_NoTarget2 = 60;
BT_SwarmPet = 63; //is this valid; or made up?
BT_InvisMan = 66; //no name; seen on 'InvisMan'; can be /targeted
BT_Special = 67;
}
enum GenderType {
Male = 0;
Female = 1;
Neutral = 2;
}
enum OpCode {
//option allow_alias = true;
OP_Unknown = 0;

View File

@ -325,9 +325,7 @@ void NatsManager::GetCommandMessage(eqproto::CommandMessage* message, const char
continue;
auto npc = entry.second;
auto entity = entities->add_entities();
entity->set_id(npc->GetID());
entity->set_type(eqproto::EntityType::NPC);
entity->set_name(npc->GetName());
EncodeEntity(npc, entity);
}
if (!entities->SerializeToString(&entityPayload)) {
@ -348,11 +346,11 @@ void NatsManager::GetCommandMessage(eqproto::CommandMessage* message, const char
if (entry.second == nullptr)
continue;
auto client = entry.second;
auto entity = entities->add_entities();
entity->set_type(eqproto::EntityType::Client);
//EncodeEntity(client, entity);
entity->set_id(client->GetID());
entity->set_name(client->GetName());
entity->set_id(client->GetID());
}
if (!entities->SerializeToString(&entityPayload)) {
@ -374,16 +372,7 @@ void NatsManager::GetCommandMessage(eqproto::CommandMessage* message, const char
auto mob = entry.second;
auto entity = entities->add_entities();
entity->set_type(eqproto::EntityType::Mob);
if (mob->IsClient())
entity->set_type(eqproto::EntityType::Client);
if (mob->IsNPC())
entity->set_type(eqproto::EntityType::NPC);
if (mob->IsMerc())
entity->set_type(eqproto::EntityType::Mercenary);
entity->set_id(mob->GetID());
entity->set_name(mob->GetName());
EncodeEntity(mob, entity);
}
if (!entities->SerializeToString(&entityPayload)) {
@ -621,6 +610,92 @@ bool NatsManager::isEntitySubscribed(const uint16 ID) {
return true;
}
void NatsManager::EncodeEntity(Entity * entity, eqproto::Entity * out)
{
out->set_id(entity->GetID());
out->set_name(entity->GetName());
out->set_spawn_timestamp(entity->GetSpawnTimeStamp());
if (entity->IsMob()) {
out->set_type(eqproto::EntityType::Mob);
Mob* mob = entity->CastToMob();
out->set_hp(mob->GetHP());
out->set_level(mob->GetLevel());
eqproto::Position* pos = google::protobuf::Arena::CreateMessage<eqproto::Position>(&the_arena);
pos->set_x(mob->GetX());
pos->set_y(mob->GetY());
pos->set_z(mob->GetZ());
pos->set_h(mob->GetHeading());
out->set_allocated_position(pos);
out->set_race(mob->GetRace());
out->set_class_(mob->GetClass());
out->set_max_hp(mob->GetMaxHP());
//TODO: SpecialAbility
//TODO: AuraInfo
out->set_lastname(mob->GetLastName());
out->set_gender(static_cast<eqproto::GenderType>(mob->GetGender()));
out->set_bodytype(static_cast<eqproto::BodyType>(mob->GetBodyType()));
out->set_deity(static_cast<eqproto::DeityType>(mob->GetDeity()));
out->set_npctype_id(mob->GetNPCTypeID());
out->set_size(mob->GetSize());
out->set_runspeed(mob->GetRunspeed());
//TODO: out->set_light(mob->GetLight)
out->set_texture(mob->GetTexture());
out->set_helmtexture(mob->GetHelmTexture());
out->set_ac(mob->GetAC());
out->set_atk(mob->GetATK());
out->set_str(mob->GetSTR());
out->set_sta(mob->GetSTA());
out->set_dex(mob->GetDEX());
out->set_agi(mob->GetAGI());
out->set_int_(mob->GetINT());
out->set_wis(mob->GetWIS());
out->set_cha(mob->GetCHA());
out->set_haircolor(mob->GetHairColor());
out->set_beardcolor(mob->GetBeardColor());
out->set_eyecolor1(mob->GetEyeColor1());
out->set_eyecolor2(mob->GetEyeColor2());
if (mob->IsClient()) {
out->set_type(eqproto::EntityType::Client);
Client *client = entity->CastToClient();
}
if (mob->IsNPC()) {
out->set_type(eqproto::EntityType::NPC);
NPC *npc = entity->CastToNPC();
if (npc->IsMerc()) {
out->set_type(eqproto::EntityType::Mercenary);
}
}
if (mob->IsCorpse()) {
out->set_type(eqproto::EntityType::Corpse);
}
if (mob->IsBeacon()) {
out->set_type(eqproto::EntityType::Beacon);
}
if (mob->IsEncounter()) {
out->set_type(eqproto::EntityType::Encounter);
}
}
if (entity->IsDoor()) {
out->set_type(eqproto::EntityType::Door);
}
if (entity->IsObject()) {
out->set_type(eqproto::EntityType::Object);
}
if (entity->IsTrap()) {
out->set_type(eqproto::EntityType::Trap);
}
}
void NatsManager::OnDeathEvent(Death_Struct* d) {
if (!connect())

View File

@ -42,7 +42,8 @@ public:
void OnClientUpdateEvent(uint32 entity_id, PlayerPositionUpdateServer_Struct * spu);
void OnAnimationEvent(uint32 entity_id, Animation_Struct * anim);
void OnDeathEvent(Death_Struct * d);
protected:
bool connect();
Timer nats_timer;
@ -57,6 +58,8 @@ protected:
natsSubscription *zoneInstanceChannelMessageSub = NULL;
natsSubscription *zoneCommandMessageSub = NULL;
natsSubscription *zoneInstanceCommandMessageSub = NULL;
void EncodeEntity(Entity *entity, eqproto::Entity *out);
};
#endif