From 591fa0eb1d0017d6d71d63a053c48176ec07eee9 Mon Sep 17 00:00:00 2001 From: KimLS Date: Sat, 30 Nov 2024 23:52:00 -0800 Subject: [PATCH] -Set laurion commands to $ from . since that's closer to muscle memory. -Add translation for OP_SpawnAppearance (later to support guilds we will need to extend it a bit server side.) --- common/patches/laurion.cpp | 150 ++++++++++++++++++++++++++++++- common/patches/laurion_ops.h | 1 + common/patches/laurion_structs.h | 55 +++++++++++- zone/command.h | 2 +- 4 files changed, 202 insertions(+), 6 deletions(-) diff --git a/common/patches/laurion.cpp b/common/patches/laurion.cpp index 7abfcab0c..967e10716 100644 --- a/common/patches/laurion.cpp +++ b/common/patches/laurion.cpp @@ -51,6 +51,10 @@ namespace Laurion void SerializeItem(SerializeBuffer &buffer, const EQ::ItemInstance* inst, int16 slot_id, uint8 depth, ItemPacketType packet_type); + //SpawnAppearance + static inline uint32 ServerToLaurionSpawnAppearanceType(uint32 server_type); + static inline uint32 LaurionToServerSpawnAppearanceType(uint32 laurion_type); + // server to client inventory location converters static inline structs::InventorySlot_Struct ServerToLaurionSlot(uint32 server_slot); static inline structs::InventorySlot_Struct ServerToLaurionCorpseSlot(uint32 server_corpse_slot); @@ -515,11 +519,12 @@ namespace Laurion if (sas->type != AppearanceType::Size) { //laurion struct is different than rof2's but the idea is the same + //we will probably want to better implement Laurion's structure later auto outapp = new EQApplicationPacket(OP_SpawnAppearance, sizeof(structs::SpawnAppearance_Struct)); structs::SpawnAppearance_Struct *eq = (structs::SpawnAppearance_Struct*)outapp->pBuffer; eq->spawn_id = sas->spawn_id; - eq->type = sas->type; + eq->type = ServerToLaurionSpawnAppearanceType(sas->type); eq->parameter = sas->parameter; dest->FastQueuePacket(&outapp, ack_req); @@ -2759,6 +2764,17 @@ namespace Laurion FINISH_DIRECT_DECODE(); } + DECODE(OP_SpawnAppearance) { + DECODE_LENGTH_EXACT(structs::SpawnAppearance_Struct); + SETUP_DIRECT_DECODE(SpawnAppearance_Struct, structs::SpawnAppearance_Struct); + + IN(spawn_id); + emu->type = LaurionToServerSpawnAppearanceType(eq->type); + IN(parameter); + + FINISH_DIRECT_DECODE(); + } + //Naive version but should work well enough for now int ExtractIDFile(const std::string& input) { std::string number; @@ -3537,6 +3553,138 @@ namespace Laurion buffer.WriteInt32(0); //unsupported atm } + static inline uint32 ServerToLaurionSpawnAppearanceType(uint32 server_type) { + switch (server_type) + { + case AppearanceType::WhoLevel: + return structs::LaurionAppearance::WhoLevel; + case AppearanceType::MaxHealth: + return structs::LaurionAppearance::MaxHealth; + case AppearanceType::Invisibility: + return structs::LaurionAppearance::Invisibility; + case AppearanceType::PVP: + return structs::LaurionAppearance::PVP; + case AppearanceType::Light: + return structs::LaurionAppearance::Light; + case AppearanceType::Animation: + return structs::LaurionAppearance::Animation; + case AppearanceType::Sneak: + return structs::LaurionAppearance::Sneak; + case AppearanceType::SpawnID: + return structs::LaurionAppearance::SpawnID; + case AppearanceType::Health: + return structs::LaurionAppearance::Health; + case AppearanceType::Linkdead: + return structs::LaurionAppearance::Linkdead; + case AppearanceType::FlyMode: + return structs::LaurionAppearance::FlyMode; + case AppearanceType::GM: + return structs::LaurionAppearance::GM; + case AppearanceType::Anonymous: + return structs::LaurionAppearance::Anonymous; + case AppearanceType::GuildID: + return structs::LaurionAppearance::GuildID; + case AppearanceType::AFK: + return structs::LaurionAppearance::AFK; + case AppearanceType::Pet: + return structs::LaurionAppearance::Pet; + case AppearanceType::Summoned: + return structs::LaurionAppearance::Summoned; + case AppearanceType::SetType: + return structs::LaurionAppearance::NPCName; + case AppearanceType::CancelSneakHide: + return structs::LaurionAppearance::CancelSneakHide; + case AppearanceType::AreaHealthRegen: + return structs::LaurionAppearance::AreaHealthRegen; + case AppearanceType::AreaManaRegen: + return structs::LaurionAppearance::AreaManaRegen; + case AppearanceType::AreaEnduranceRegen: + return structs::LaurionAppearance::AreaEnduranceRegen; + case AppearanceType::FreezeBeneficialBuffs: + return structs::LaurionAppearance::FreezeBeneficialBuffs; + case AppearanceType::NPCTintIndex: + return structs::LaurionAppearance::NPCTintIndex; + case AppearanceType::ShowHelm: + return structs::LaurionAppearance::ShowHelm; + case AppearanceType::DamageState: + return structs::LaurionAppearance::DamageState; + case AppearanceType::TextureType: + return structs::LaurionAppearance::TextureType; + case AppearanceType::GuildShow: + return structs::LaurionAppearance::GuildShow; + case AppearanceType::OfflineMode: + return structs::LaurionAppearance::OfflineMode; + default: + return structs::LaurionAppearance::None; + } + } + + static inline uint32 LaurionToServerSpawnAppearanceType(uint32 laurion_type) { + switch (laurion_type) + { + case structs::LaurionAppearance::WhoLevel: + return AppearanceType::WhoLevel; + case structs::LaurionAppearance::MaxHealth: + return AppearanceType::MaxHealth; + case structs::LaurionAppearance::Invisibility: + return AppearanceType::Invisibility; + case structs::LaurionAppearance::PVP: + return AppearanceType::PVP; + case structs::LaurionAppearance::Light: + return AppearanceType::Light; + case structs::LaurionAppearance::Animation: + return AppearanceType::Animation; + case structs::LaurionAppearance::Sneak: + return AppearanceType::Sneak; + case structs::LaurionAppearance::SpawnID: + return AppearanceType::SpawnID; + case structs::LaurionAppearance::Health: + return AppearanceType::Health; + case structs::LaurionAppearance::Linkdead: + return AppearanceType::Linkdead; + case structs::LaurionAppearance::FlyMode: + return AppearanceType::FlyMode; + case structs::LaurionAppearance::GM: + return AppearanceType::GM; + case structs::LaurionAppearance::Anonymous: + return AppearanceType::Anonymous; + case structs::LaurionAppearance::GuildID: + return AppearanceType::GuildID; + case structs::LaurionAppearance::AFK: + return AppearanceType::AFK; + case structs::LaurionAppearance::Pet: + return AppearanceType::Pet; + case structs::LaurionAppearance::Summoned: + return AppearanceType::Summoned; + case structs::LaurionAppearance::SetType: + return AppearanceType::NPCName; + case structs::LaurionAppearance::CancelSneakHide: + return AppearanceType::CancelSneakHide; + case structs::LaurionAppearance::AreaHealthRegen: + return AppearanceType::AreaHealthRegen; + case structs::LaurionAppearance::AreaManaRegen: + return AppearanceType::AreaManaRegen; + case structs::LaurionAppearance::AreaEnduranceRegen: + return AppearanceType::AreaEnduranceRegen; + case structs::LaurionAppearance::FreezeBeneficialBuffs: + return AppearanceType::FreezeBeneficialBuffs; + case structs::LaurionAppearance::NPCTintIndex: + return AppearanceType::NPCTintIndex; + case structs::LaurionAppearance::ShowHelm: + return AppearanceType::ShowHelm; + case structs::LaurionAppearance::DamageState: + return AppearanceType::DamageState; + case structs::LaurionAppearance::TextureType: + return AppearanceType::TextureType; + case structs::LaurionAppearance::GuildShow: + return AppearanceType::GuildShow; + case structs::LaurionAppearance::OfflineMode: + return AppearanceType::OfflineMode; + default: + return AppearanceType::Die; + } + } + static inline structs::InventorySlot_Struct ServerToLaurionSlot(uint32 server_slot) { structs::InventorySlot_Struct LaurionSlot; diff --git a/common/patches/laurion_ops.h b/common/patches/laurion_ops.h index a4c2d7d32..a8476d38d 100644 --- a/common/patches/laurion_ops.h +++ b/common/patches/laurion_ops.h @@ -38,6 +38,7 @@ D(OP_SetServerFilter) D(OP_Consider) D(OP_ConsiderCorpse) D(OP_ClickDoor) +D(OP_SpawnAppearance) #undef E #undef D diff --git a/common/patches/laurion_structs.h b/common/patches/laurion_structs.h index fa5cbf1d6..fa83dd312 100644 --- a/common/patches/laurion_structs.h +++ b/common/patches/laurion_structs.h @@ -180,14 +180,61 @@ namespace Laurion { /*000*/ uint32 CharCount; //number of chars in this packet }; + enum LaurionAppearance : uint32 + { + None, + WhoLevel, + MaxHealth, + Invisibility, + PVP, + Light, + Animation, + Sneak, + SpawnID, + Health, + Linkdead, + FlyMode, + GM, + Anonymous, + GuildID, + AFK, + Pet, + Summoned, + Unknown18, + Unknown19, + SetType, + NPCName, + CancelSneakHide, + AreaHealthRegen, + AreaManaRegen, + AreaEnduranceRegen, + FreezeBeneficialBuffs, + NPCTintIndex, + Unknown28, + Unknown29, + Unknown30, + ShowHelm, + DamageState, + Unknown33, //Some virtual function call; based on location might be EQPlayers (my guess personally) or FindBits + TextureType, //Texture ID + Unknown35, + Unknown36, + GuildShow, + OfflineMode, + Unknown39, + Unknown40, + Unknown41, + Unknown42, + Birthdate, + EncounterLock + }; + struct SpawnAppearance_Struct { /*0000*/ uint32 spawn_id; // ID of the spawn /*0004*/ uint32 type; // Values associated with the type - /*0008*/ uint32 parameter; // Type of data sent - /*0012*/ uint32 unknown012; - /*0016*/ uint32 unknown016; - /*0020*/ uint32 unknown020; + /*0008*/ uint64 parameter; // Type of data sent + /*0016*/ uint64 lock_id; //the only place client uses this as far as I can tell is when you send 0x2c as type in which case it sets LockID = this /*0024*/ }; diff --git a/zone/command.h b/zone/command.h index 3f03a19ab..1c96758ee 100644 --- a/zone/command.h +++ b/zone/command.h @@ -8,7 +8,7 @@ class Seperator; #include #define COMMAND_CHAR '#' -#define COMMAND_CHAR_NON_HASH '.' +#define COMMAND_CHAR_NON_HASH '$' typedef void (*CmdFuncPtr)(Client *, const Seperator *);