Merge pull request #5057 from dannuic/tob_charactercreate

Implemented through character creation packets
This commit is contained in:
Alex
2026-04-06 14:51:18 -07:00
committed by GitHub
22 changed files with 506 additions and 435 deletions
+6 -6
View File
@@ -93,8 +93,8 @@ set(common_sources
patches/sod_limits.cpp patches/sod_limits.cpp
patches/sof.cpp patches/sof.cpp
patches/sof_limits.cpp patches/sof_limits.cpp
patches/steam_latest.cpp patches/tob.cpp
patches/steam_latest_limits.cpp patches/tob_limits.cpp
patches/titanium.cpp patches/titanium.cpp
patches/titanium_limits.cpp patches/titanium_limits.cpp
patches/uf.cpp patches/uf.cpp
@@ -676,10 +676,10 @@ set(common_headers
patches/sof_limits.h patches/sof_limits.h
patches/sof_ops.h patches/sof_ops.h
patches/sof_structs.h patches/sof_structs.h
patches/steam_latest.h patches/tob.h
patches/steam_latest_limits.h patches/tob_limits.h
patches/steam_latest_ops.h patches/tob_ops.h
patches/steam_latest_structs.h patches/tob_structs.h
patches/ss_declare.h patches/ss_declare.h
patches/ss_define.h patches/ss_define.h
patches/ss_register.h patches/ss_register.h
+21 -21
View File
@@ -54,8 +54,8 @@ const char* EQ::versions::ClientVersionName(ClientVersion client_version)
return "RoF"; return "RoF";
case ClientVersion::RoF2: case ClientVersion::RoF2:
return "RoF2"; return "RoF2";
case ClientVersion::SteamLatest: case ClientVersion::TOB:
return "SteamLatest"; return "TOB";
default: default:
return "Invalid Version"; return "Invalid Version";
}; };
@@ -76,8 +76,8 @@ uint32 EQ::versions::ConvertClientVersionToClientVersionBit(ClientVersion client
return bitRoF; return bitRoF;
case ClientVersion::RoF2: case ClientVersion::RoF2:
return bitRoF2; return bitRoF2;
case ClientVersion::SteamLatest: case ClientVersion::TOB:
return bitSteamLatest; return bitTOB;
default: default:
return bitUnknown; return bitUnknown;
} }
@@ -98,8 +98,8 @@ EQ::versions::ClientVersion EQ::versions::ConvertClientVersionBitToClientVersion
return ClientVersion::RoF; return ClientVersion::RoF;
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::RoF2) - 1)) : case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::RoF2) - 1)) :
return ClientVersion::RoF2; return ClientVersion::RoF2;
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::SteamLatest) - 1)) : case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::TOB) - 1)) :
return ClientVersion::SteamLatest; return ClientVersion::TOB;
default: default:
return ClientVersion::Unknown; return ClientVersion::Unknown;
} }
@@ -188,8 +188,8 @@ const char* EQ::versions::MobVersionName(MobVersion mob_version)
return "RoF"; return "RoF";
case MobVersion::RoF2: case MobVersion::RoF2:
return "RoF2"; return "RoF2";
case MobVersion::SteamLatest: case MobVersion::TOB:
return "SteamLatest"; return "TOB";
case MobVersion::NPC: case MobVersion::NPC:
return "NPC"; return "NPC";
case MobVersion::NPCMerchant: case MobVersion::NPCMerchant:
@@ -218,7 +218,7 @@ const char* EQ::versions::MobVersionName(MobVersion mob_version)
return "Offline RoF"; return "Offline RoF";
case MobVersion::OfflineRoF2: case MobVersion::OfflineRoF2:
return "Offline RoF2"; return "Offline RoF2";
case MobVersion::OfflineSteamLatest: case MobVersion::OfflineTOB:
return "Offline Steam Latest"; return "Offline Steam Latest";
default: default:
return "Invalid Version"; return "Invalid Version";
@@ -243,8 +243,8 @@ EQ::versions::ClientVersion EQ::versions::ConvertMobVersionToClientVersion(MobVe
return ClientVersion::RoF; return ClientVersion::RoF;
case MobVersion::RoF2: case MobVersion::RoF2:
return ClientVersion::RoF2; return ClientVersion::RoF2;
case MobVersion::SteamLatest: case MobVersion::TOB:
return ClientVersion::SteamLatest; return ClientVersion::TOB;
default: default:
return ClientVersion::Unknown; return ClientVersion::Unknown;
} }
@@ -268,8 +268,8 @@ EQ::versions::MobVersion EQ::versions::ConvertClientVersionToMobVersion(ClientVe
return MobVersion::RoF; return MobVersion::RoF;
case ClientVersion::RoF2: case ClientVersion::RoF2:
return MobVersion::RoF2; return MobVersion::RoF2;
case ClientVersion::SteamLatest: case ClientVersion::TOB:
return MobVersion::SteamLatest; return MobVersion::TOB;
default: default:
return MobVersion::Unknown; return MobVersion::Unknown;
} }
@@ -290,8 +290,8 @@ EQ::versions::MobVersion EQ::versions::ConvertPCMobVersionToOfflinePCMobVersion(
return MobVersion::OfflineRoF; return MobVersion::OfflineRoF;
case MobVersion::RoF2: case MobVersion::RoF2:
return MobVersion::OfflineRoF2; return MobVersion::OfflineRoF2;
case MobVersion::SteamLatest: case MobVersion::TOB:
return MobVersion::OfflineSteamLatest; return MobVersion::OfflineTOB;
default: default:
return MobVersion::Unknown; return MobVersion::Unknown;
} }
@@ -312,8 +312,8 @@ EQ::versions::MobVersion EQ::versions::ConvertOfflinePCMobVersionToPCMobVersion(
return MobVersion::RoF; return MobVersion::RoF;
case MobVersion::OfflineRoF2: case MobVersion::OfflineRoF2:
return MobVersion::RoF2; return MobVersion::RoF2;
case MobVersion::OfflineSteamLatest: case MobVersion::OfflineTOB:
return MobVersion::SteamLatest; return MobVersion::TOB;
default: default:
return MobVersion::Unknown; return MobVersion::Unknown;
} }
@@ -334,8 +334,8 @@ EQ::versions::ClientVersion EQ::versions::ConvertOfflinePCMobVersionToClientVers
return ClientVersion::RoF; return ClientVersion::RoF;
case MobVersion::OfflineRoF2: case MobVersion::OfflineRoF2:
return ClientVersion::RoF2; return ClientVersion::RoF2;
case MobVersion::OfflineSteamLatest: case MobVersion::OfflineTOB:
return ClientVersion::SteamLatest; return ClientVersion::TOB;
default: default:
return ClientVersion::Unknown; return ClientVersion::Unknown;
} }
@@ -356,8 +356,8 @@ EQ::versions::MobVersion EQ::versions::ConvertClientVersionToOfflinePCMobVersion
return MobVersion::OfflineRoF; return MobVersion::OfflineRoF;
case ClientVersion::RoF2: case ClientVersion::RoF2:
return MobVersion::OfflineRoF2; return MobVersion::OfflineRoF2;
case ClientVersion::SteamLatest: case ClientVersion::TOB:
return MobVersion::OfflineSteamLatest; return MobVersion::OfflineTOB;
default: default:
return MobVersion::Unknown; return MobVersion::Unknown;
} }
+10 -10
View File
@@ -33,7 +33,7 @@ namespace EQ
UF, // Build: 'Jun 8 2010 16:44:32' UF, // Build: 'Jun 8 2010 16:44:32'
RoF, // Build: 'Dec 10 2012 17:35:44' RoF, // Build: 'Dec 10 2012 17:35:44'
RoF2, // Build: 'May 10 2013 23:30:08' RoF2, // Build: 'May 10 2013 23:30:08'
SteamLatest // Build: 'Sep 11 2025 11:54:10' TOB // Build: 'Sep 11 2025 11:54:10'
}; };
enum ClientVersionBitmask : uint32 { enum ClientVersionBitmask : uint32 {
@@ -45,7 +45,7 @@ namespace EQ
bitUF = 0x00000010, bitUF = 0x00000010,
bitRoF = 0x00000020, bitRoF = 0x00000020,
bitRoF2 = 0x00000040, bitRoF2 = 0x00000040,
bitSteamLatest = 0x00000080, bitTOB = 0x00000080,
maskUnknown = 0x00000000, maskUnknown = 0x00000000,
maskTitaniumAndEarlier = 0x00000003, maskTitaniumAndEarlier = 0x00000003,
maskSoFAndEarlier = 0x00000007, maskSoFAndEarlier = 0x00000007,
@@ -57,11 +57,11 @@ namespace EQ
maskUFAndLater = 0xFFFFFFF0, maskUFAndLater = 0xFFFFFFF0,
maskRoFAndLater = 0xFFFFFFE0, maskRoFAndLater = 0xFFFFFFE0,
maskRoF2AndLater = 0xFFFFFFC0, maskRoF2AndLater = 0xFFFFFFC0,
maskSteamLatestAndLater = 0xFFFFFF80, maskTOBAndLater = 0xFFFFFF80,
maskAllClients = 0xFFFFFFFF maskAllClients = 0xFFFFFFFF
}; };
const ClientVersion LastClientVersion = ClientVersion::SteamLatest; const ClientVersion LastClientVersion = ClientVersion::TOB;
const size_t ClientVersionCount = (static_cast<size_t>(LastClientVersion) + 1); const size_t ClientVersionCount = (static_cast<size_t>(LastClientVersion) + 1);
bool IsValidClientVersion(ClientVersion client_version); bool IsValidClientVersion(ClientVersion client_version);
@@ -79,7 +79,7 @@ namespace EQ
UF, UF,
RoF, RoF,
RoF2, RoF2,
SteamLatest, TOB,
NPC, NPC,
NPCMerchant, NPCMerchant,
Merc, Merc,
@@ -94,13 +94,13 @@ namespace EQ
OfflineUF, OfflineUF,
OfflineRoF, OfflineRoF,
OfflineRoF2, OfflineRoF2,
OfflineSteamLatest OfflineTOB
}; };
const MobVersion LastMobVersion = MobVersion::OfflineSteamLatest; const MobVersion LastMobVersion = MobVersion::OfflineTOB;
const MobVersion LastPCMobVersion = MobVersion::SteamLatest; const MobVersion LastPCMobVersion = MobVersion::TOB;
const MobVersion LastNonPCMobVersion = MobVersion::BotPet; const MobVersion LastNonPCMobVersion = MobVersion::BotPet;
const MobVersion LastOfflinePCMobVersion = MobVersion::OfflineSteamLatest; const MobVersion LastOfflinePCMobVersion = MobVersion::OfflineTOB;
const size_t MobVersionCount = (static_cast<size_t>(LastMobVersion) + 1); const size_t MobVersionCount = (static_cast<size_t>(LastMobVersion) + 1);
bool IsValidMobVersion(MobVersion mob_version); bool IsValidMobVersion(MobVersion mob_version);
@@ -133,7 +133,7 @@ namespace EQ
ucsUFCombined = 'E', ucsUFCombined = 'E',
ucsRoFCombined = 'F', ucsRoFCombined = 'F',
ucsRoF2Combined = 'G', ucsRoF2Combined = 'G',
ucsSteamLatestCombined = 'H' ucsTOBCombined = 'H'
}; };
} /*versions*/ } /*versions*/
+25 -25
View File
@@ -111,14 +111,14 @@ static const EQ::constants::LookupEntry constants_static_lookup_entries[EQ::vers
RoF2::constants::SAY_LINK_BODY_SIZE, RoF2::constants::SAY_LINK_BODY_SIZE,
RoF2::constants::MAX_BAZAAR_TRADERS RoF2::constants::MAX_BAZAAR_TRADERS
), ),
/*[ClientVersion::SteamLatest] =*/ /*[ClientVersion::TOB] =*/
EQ::constants::LookupEntry( EQ::constants::LookupEntry(
SteamLatest::constants::EXPANSION, TOB::constants::EXPANSION,
SteamLatest::constants::EXPANSION_BIT, TOB::constants::EXPANSION_BIT,
SteamLatest::constants::EXPANSIONS_MASK, TOB::constants::EXPANSIONS_MASK,
SteamLatest::constants::CHARACTER_CREATION_LIMIT, TOB::constants::CHARACTER_CREATION_LIMIT,
SteamLatest::constants::SAY_LINK_BODY_SIZE, TOB::constants::SAY_LINK_BODY_SIZE,
SteamLatest::constants::MAX_BAZAAR_TRADERS TOB::constants::MAX_BAZAAR_TRADERS
) )
}; };
@@ -385,8 +385,8 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
RoF2::inventory::ConcatenateInvTypeLimbo, RoF2::inventory::ConcatenateInvTypeLimbo,
RoF2::inventory::AllowOverLevelEquipment RoF2::inventory::AllowOverLevelEquipment
), ),
/*[MobVersion::SteamLatest] =*/ /*[MobVersion::TOB] =*/
//SteamLatestTodo: These need to be set to the latest values not just use RoF2 //TOBTodo: These need to be set to the latest values not just use RoF2
EQ::inventory::LookupEntry( EQ::inventory::LookupEntry(
EQ::inventory::LookupEntry::InventoryTypeSize_Struct( EQ::inventory::LookupEntry::InventoryTypeSize_Struct(
EQ::invtype::POSSESSIONS_SIZE, RoF2::invtype::BANK_SIZE, RoF2::invtype::SHARED_BANK_SIZE, EQ::invtype::POSSESSIONS_SIZE, RoF2::invtype::BANK_SIZE, RoF2::invtype::SHARED_BANK_SIZE,
@@ -791,8 +791,8 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
false, false,
false false
), ),
/*[MobVersion::OfflineSteamLatest] =*/ /*[MobVersion::OfflineTOB] =*/
//SteamLatestTodo: Need to use their own values instead of RoF2 //TOBTodo: Need to use their own values instead of RoF2
EQ::inventory::LookupEntry( EQ::inventory::LookupEntry(
EQ::inventory::LookupEntry::InventoryTypeSize_Struct( EQ::inventory::LookupEntry::InventoryTypeSize_Struct(
RoF2::INULL, RoF2::INULL, RoF2::INULL, RoF2::INULL, RoF2::INULL, RoF2::INULL,
@@ -1066,8 +1066,8 @@ static const EQ::behavior::LookupEntry behavior_static_lookup_entries[EQ::versio
EQ::behavior::LookupEntry( EQ::behavior::LookupEntry(
RoF2::behavior::CoinHasWeight RoF2::behavior::CoinHasWeight
), ),
/*[MobVersion::SteamLatest] =*/ /*[MobVersion::TOB] =*/
//SteamLatestTodo: We need this value set properly //TOBTodo: We need this value set properly
EQ::behavior::LookupEntry( EQ::behavior::LookupEntry(
RoF2::behavior::CoinHasWeight RoF2::behavior::CoinHasWeight
), ),
@@ -1127,8 +1127,8 @@ static const EQ::behavior::LookupEntry behavior_static_lookup_entries[EQ::versio
EQ::behavior::LookupEntry( EQ::behavior::LookupEntry(
RoF2::behavior::CoinHasWeight RoF2::behavior::CoinHasWeight
), ),
/*[MobVersion::OfflineSteamLatest] =*/ /*[MobVersion::OfflineTOB] =*/
//SteamLatestTodo: We need this value set properly //TOBTodo: We need this value set properly
EQ::behavior::LookupEntry( EQ::behavior::LookupEntry(
RoF2::behavior::CoinHasWeight RoF2::behavior::CoinHasWeight
) )
@@ -1285,18 +1285,18 @@ static const EQ::spells::LookupEntry spells_static_lookup_entries[EQ::versions::
RoF2::spells::PET_BUFFS, RoF2::spells::PET_BUFFS,
RoF2::spells::MERC_BUFFS RoF2::spells::MERC_BUFFS
), ),
/*[ClientVersion::SteamLatest] =*/ /*[ClientVersion::TOB] =*/
EQ::spells::LookupEntry( EQ::spells::LookupEntry(
SteamLatest::spells::SPELL_ID_MAX, TOB::spells::SPELL_ID_MAX,
SteamLatest::spells::SPELLBOOK_SIZE, TOB::spells::SPELLBOOK_SIZE,
UF::spells::SPELL_GEM_COUNT, // client translators are setup to allow the max value a client supports..however, the top 4 indices are not valid in this case UF::spells::SPELL_GEM_COUNT, // client translators are setup to allow the max value a client supports..however, the top 4 indices are not valid in this case
SteamLatest::spells::LONG_BUFFS, TOB::spells::LONG_BUFFS,
SteamLatest::spells::SHORT_BUFFS, TOB::spells::SHORT_BUFFS,
SteamLatest::spells::DISC_BUFFS, TOB::spells::DISC_BUFFS,
SteamLatest::spells::TOTAL_BUFFS, TOB::spells::TOTAL_BUFFS,
SteamLatest::spells::NPC_BUFFS, TOB::spells::NPC_BUFFS,
SteamLatest::spells::PET_BUFFS, TOB::spells::PET_BUFFS,
SteamLatest::spells::MERC_BUFFS TOB::spells::MERC_BUFFS
) )
}; };
+1 -1
View File
@@ -23,7 +23,7 @@
#include "common/patches/rof2_limits.h" #include "common/patches/rof2_limits.h"
#include "common/patches/sod_limits.h" #include "common/patches/sod_limits.h"
#include "common/patches/sof_limits.h" #include "common/patches/sof_limits.h"
#include "common/patches/steam_latest_limits.h" #include "common/patches/tob_limits.h"
#include "common/patches/titanium_limits.h" #include "common/patches/titanium_limits.h"
#include "common/patches/uf_limits.h" #include "common/patches/uf_limits.h"
#include "common/types.h" #include "common/types.h"
+3 -3
View File
@@ -21,7 +21,7 @@
#include "common/patches/rof2.h" #include "common/patches/rof2.h"
#include "common/patches/sod.h" #include "common/patches/sod.h"
#include "common/patches/sof.h" #include "common/patches/sof.h"
#include "common/patches/steam_latest.h" #include "common/patches/tob.h"
#include "common/patches/titanium.h" #include "common/patches/titanium.h"
#include "common/patches/uf.h" #include "common/patches/uf.h"
@@ -34,7 +34,7 @@ void RegisterAllPatches(EQStreamIdentifier &into)
UF::Register(into); UF::Register(into);
RoF::Register(into); RoF::Register(into);
RoF2::Register(into); RoF2::Register(into);
SteamLatest::Register(into); TOB::Register(into);
} }
void ReloadAllPatches() void ReloadAllPatches()
@@ -45,5 +45,5 @@ void ReloadAllPatches()
UF::Reload(); UF::Reload();
RoF::Reload(); RoF::Reload();
RoF2::Reload(); RoF2::Reload();
SteamLatest::Reload(); TOB::Reload();
} }
File diff suppressed because it is too large Load Diff
@@ -5,7 +5,7 @@
class EQStreamIdentifier; class EQStreamIdentifier;
namespace SteamLatest namespace TOB
{ {
//these are the only public member of this namespace. //these are the only public member of this namespace.
@@ -28,9 +28,10 @@ namespace SteamLatest
//magic macro to declare our opcode processors //magic macro to declare our opcode processors
#include "ss_declare.h" #include "ss_declare.h"
#include "steam_latest_ops.h" #include "tob_ops.h"
}; };
}; /*SteamLatest*/ }; /*TOB*/
#endif /*COMMON_LAURION_H*/ #endif /*COMMON_LAURION_H*/
@@ -1,9 +1,9 @@
#include "steam_latest_limits.h" #include "tob_limits.h"
#include "../strings.h" #include "../strings.h"
int16 SteamLatest::invtype::GetInvTypeSize(int16 inv_type) int16 TOB::invtype::GetInvTypeSize(int16 inv_type)
{ {
switch (inv_type) { switch (inv_type) {
case invtype::typePossessions: case invtype::typePossessions:
@@ -61,7 +61,7 @@ int16 SteamLatest::invtype::GetInvTypeSize(int16 inv_type)
} }
} }
const char* SteamLatest::invtype::GetInvTypeName(int16 inv_type) const char* TOB::invtype::GetInvTypeName(int16 inv_type)
{ {
switch (inv_type) { switch (inv_type) {
case invtype::TYPE_INVALID: case invtype::TYPE_INVALID:
@@ -121,7 +121,7 @@ const char* SteamLatest::invtype::GetInvTypeName(int16 inv_type)
} }
} }
bool SteamLatest::invtype::IsInvTypePersistent(int16 inv_type) bool TOB::invtype::IsInvTypePersistent(int16 inv_type)
{ {
switch (inv_type) { switch (inv_type) {
case invtype::typePossessions: case invtype::typePossessions:
@@ -139,7 +139,7 @@ bool SteamLatest::invtype::IsInvTypePersistent(int16 inv_type)
} }
} }
const char* SteamLatest::invslot::GetInvPossessionsSlotName(int16 inv_slot) const char* TOB::invslot::GetInvPossessionsSlotName(int16 inv_slot)
{ {
switch (inv_slot) { switch (inv_slot) {
case invslot::SLOT_INVALID: case invslot::SLOT_INVALID:
@@ -217,7 +217,7 @@ const char* SteamLatest::invslot::GetInvPossessionsSlotName(int16 inv_slot)
} }
} }
const char* SteamLatest::invslot::GetInvSlotName(int16 inv_type, int16 inv_slot) const char* TOB::invslot::GetInvSlotName(int16 inv_type, int16 inv_slot)
{ {
if (inv_type == invtype::typePossessions) if (inv_type == invtype::typePossessions)
return invslot::GetInvPossessionsSlotName(inv_slot); return invslot::GetInvPossessionsSlotName(inv_slot);
@@ -236,7 +236,7 @@ const char* SteamLatest::invslot::GetInvSlotName(int16 inv_type, int16 inv_slot)
return ret_str.c_str(); return ret_str.c_str();
} }
const char* SteamLatest::invbag::GetInvBagIndexName(int16 bag_index) const char* TOB::invbag::GetInvBagIndexName(int16 bag_index)
{ {
if (bag_index == invbag::SLOT_INVALID) if (bag_index == invbag::SLOT_INVALID)
return "Invalid Bag"; return "Invalid Bag";
@@ -250,7 +250,7 @@ const char* SteamLatest::invbag::GetInvBagIndexName(int16 bag_index)
return ret_str.c_str(); return ret_str.c_str();
} }
const char* SteamLatest::invaug::GetInvAugIndexName(int16 aug_index) const char* TOB::invaug::GetInvAugIndexName(int16 aug_index)
{ {
if (aug_index == invaug::SOCKET_INVALID) if (aug_index == invaug::SOCKET_INVALID)
return "Invalid Augment"; return "Invalid Augment";
@@ -5,13 +5,13 @@
#include "../emu_versions.h" #include "../emu_versions.h"
#include "../skills.h" #include "../skills.h"
namespace SteamLatest namespace TOB
{ {
const int16 IINVALID = -1; const int16 IINVALID = -1;
const int16 INULL = 0; const int16 INULL = 0;
namespace inventory { namespace inventory {
inline EQ::versions::ClientVersion GetInventoryRef() { return EQ::versions::ClientVersion::SteamLatest; } inline EQ::versions::ClientVersion GetInventoryRef() { return EQ::versions::ClientVersion::TOB; }
const bool ConcatenateInvTypeLimbo = false; const bool ConcatenateInvTypeLimbo = false;
@@ -23,7 +23,7 @@ namespace SteamLatest
} /*inventory*/ } /*inventory*/
namespace invtype { namespace invtype {
inline EQ::versions::ClientVersion GetInvTypeRef() { return EQ::versions::ClientVersion::SteamLatest; } inline EQ::versions::ClientVersion GetInvTypeRef() { return EQ::versions::ClientVersion::TOB; }
namespace enum_ { namespace enum_ {
enum InventoryTypes : int16 { enum InventoryTypes : int16 {
@@ -114,7 +114,7 @@ namespace SteamLatest
} /*invtype*/ } /*invtype*/
namespace invslot { namespace invslot {
inline EQ::versions::ClientVersion GetInvSlotRef() { return EQ::versions::ClientVersion::SteamLatest; } inline EQ::versions::ClientVersion GetInvSlotRef() { return EQ::versions::ClientVersion::TOB; }
namespace enum_ { namespace enum_ {
enum InventorySlots : int16 { enum InventorySlots : int16 {
@@ -186,8 +186,8 @@ namespace SteamLatest
const uint64 EQUIPMENT_BITMASK = 0x00000000007FFFFF; const uint64 EQUIPMENT_BITMASK = 0x00000000007FFFFF;
const uint64 GENERAL_BITMASK = 0x00000007FF800000; const uint64 GENERAL_BITMASK = 0x00000007FF800000;
const uint64 CURSOR_BITMASK = 0x0000000800000000; const uint64 CURSOR_BITMASK = 0x0000000800000000;
const uint64 POSSESSIONS_BITMASK = (EQUIPMENT_BITMASK | GENERAL_BITMASK | CURSOR_BITMASK); // based on 36-slot count (SteamLatest+) const uint64 POSSESSIONS_BITMASK = (EQUIPMENT_BITMASK | GENERAL_BITMASK | CURSOR_BITMASK); // based on 36-slot count (TOB+)
const uint64 CORPSE_BITMASK = (GENERAL_BITMASK | CURSOR_BITMASK | (EQUIPMENT_BITMASK << 36)); // based on 36-slot count (SteamLatest+) const uint64 CORPSE_BITMASK = (GENERAL_BITMASK | CURSOR_BITMASK | (EQUIPMENT_BITMASK << 36)); // based on 36-slot count (TOB+)
const char* GetInvPossessionsSlotName(int16 inv_slot); const char* GetInvPossessionsSlotName(int16 inv_slot);
@@ -196,7 +196,7 @@ namespace SteamLatest
} /*invslot*/ } /*invslot*/
namespace invbag { namespace invbag {
inline EQ::versions::ClientVersion GetInvBagRef() { return EQ::versions::ClientVersion::SteamLatest; } inline EQ::versions::ClientVersion GetInvBagRef() { return EQ::versions::ClientVersion::TOB; }
const int16 SLOT_INVALID = IINVALID; const int16 SLOT_INVALID = IINVALID;
const int16 SLOT_BEGIN = INULL; const int16 SLOT_BEGIN = INULL;
@@ -208,7 +208,7 @@ namespace SteamLatest
} /*invbag*/ } /*invbag*/
namespace invaug { namespace invaug {
inline EQ::versions::ClientVersion GetInvAugRef() { return EQ::versions::ClientVersion::SteamLatest; } inline EQ::versions::ClientVersion GetInvAugRef() { return EQ::versions::ClientVersion::TOB; }
const int16 SOCKET_INVALID = IINVALID; const int16 SOCKET_INVALID = IINVALID;
const int16 SOCKET_BEGIN = INULL; const int16 SOCKET_BEGIN = INULL;
@@ -220,7 +220,7 @@ namespace SteamLatest
} /*invaug*/ } /*invaug*/
namespace item { namespace item {
inline EQ::versions::ClientVersion GetItemRef() { return EQ::versions::ClientVersion::SteamLatest; } inline EQ::versions::ClientVersion GetItemRef() { return EQ::versions::ClientVersion::TOB; }
//enum Unknown : int { // looks like item class..but, RoF has it too - nothing in UF- //enum Unknown : int { // looks like item class..but, RoF has it too - nothing in UF-
// Unknown1 = 0, // Unknown1 = 0,
@@ -255,7 +255,7 @@ namespace SteamLatest
} /*item*/ } /*item*/
namespace profile { namespace profile {
inline EQ::versions::ClientVersion GetProfileRef() { return EQ::versions::ClientVersion::SteamLatest; } inline EQ::versions::ClientVersion GetProfileRef() { return EQ::versions::ClientVersion::TOB; }
const int16 BANDOLIERS_SIZE = 20; // number of bandolier instances const int16 BANDOLIERS_SIZE = 20; // number of bandolier instances
const int16 BANDOLIER_ITEM_COUNT = 4; // number of equipment slots in bandolier instance const int16 BANDOLIER_ITEM_COUNT = 4; // number of equipment slots in bandolier instance
@@ -267,7 +267,7 @@ namespace SteamLatest
} /*profile*/ } /*profile*/
namespace constants { namespace constants {
inline EQ::versions::ClientVersion GetConstantsRef() { return EQ::versions::ClientVersion::SteamLatest; } inline EQ::versions::ClientVersion GetConstantsRef() { return EQ::versions::ClientVersion::TOB; }
const EQ::expansions::Expansion EXPANSION = EQ::expansions::Expansion::LS; const EQ::expansions::Expansion EXPANSION = EQ::expansions::Expansion::LS;
const uint32 EXPANSION_BIT = EQ::expansions::bitLS; const uint32 EXPANSION_BIT = EQ::expansions::bitLS;
@@ -282,21 +282,21 @@ namespace SteamLatest
} /*constants*/ } /*constants*/
namespace behavior { namespace behavior {
inline EQ::versions::ClientVersion GetBehaviorRef() { return EQ::versions::ClientVersion::SteamLatest; } inline EQ::versions::ClientVersion GetBehaviorRef() { return EQ::versions::ClientVersion::TOB; }
const bool CoinHasWeight = false; const bool CoinHasWeight = false;
} /*behavior*/ } /*behavior*/
namespace skills { namespace skills {
inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::SteamLatest; } inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::TOB; }
const size_t LastUsableSkill = EQ::skills::Skill2HPiercing; const size_t LastUsableSkill = EQ::skills::Skill2HPiercing;
} /*skills*/ } /*skills*/
namespace spells { namespace spells {
inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::SteamLatest; } inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::TOB; }
enum class CastingSlot : uint32 { enum class CastingSlot : uint32 {
Gem1 = 0, Gem1 = 0,
@@ -332,6 +332,6 @@ namespace SteamLatest
} /*spells*/ } /*spells*/
}; /* SteamLatest */ }; /* TOB */
#endif /*COMMON_LAURION_LIMITS_H*/ #endif /*COMMON_LAURION_LIMITS_H*/
@@ -10,6 +10,7 @@ E(OP_BuffCreate)
E(OP_CancelTrade) E(OP_CancelTrade)
E(OP_CastSpell) E(OP_CastSpell)
E(OP_ChannelMessage) E(OP_ChannelMessage)
E(OP_CharacterCreateRequest)
E(OP_CharInventory) E(OP_CharInventory)
E(OP_ClickObjectAction) E(OP_ClickObjectAction)
E(OP_ClientUpdate) E(OP_ClientUpdate)
@@ -1,7 +1,7 @@
#ifndef STEAM_LATEST_STRUCTS_H_ #ifndef STEAM_LATEST_STRUCTS_H_
#define STEAM_LATEST_STRUCTS_H_ #define STEAM_LATEST_STRUCTS_H_
namespace SteamLatest { namespace TOB {
namespace structs { namespace structs {
// constants // constants
static const uint32 MAX_PP_AA_ARRAY = 300; static const uint32 MAX_PP_AA_ARRAY = 300;
@@ -94,7 +94,7 @@ namespace SteamLatest {
struct ExpansionInfo_Struct { struct ExpansionInfo_Struct {
/*000*/ char Unknown000[64]; /*000*/ char Unknown000[64];
/*064*/ uint32 Expansions; /*064*/ uint64 Expansions;
}; };
/* /*
@@ -181,7 +181,7 @@ namespace SteamLatest {
/*000*/ uint32 CharCount; //number of chars in this packet /*000*/ uint32 CharCount; //number of chars in this packet
}; };
enum SteamLatestAppearance : uint32 enum TOBAppearance : uint32
{ {
None, None,
WhoLevel, WhoLevel,
@@ -399,7 +399,7 @@ namespace SteamLatest {
struct EnterWorld_Struct { struct EnterWorld_Struct {
/*000*/ char name[64]; /*000*/ char name[64];
/*064*/ int32 unknown1; /*064*/ int32 unknown1;
/*068*/ int32 unknown2; //steam_latest handles these differently so for now im just going to ignore them till i figure it out /*068*/ int32 unknown2; //tob handles these differently so for now im just going to ignore them till i figure it out
}; };
struct ZoneChange_Struct { struct ZoneChange_Struct {
@@ -1011,9 +1011,28 @@ namespace SteamLatest {
/*007*/ uint8 unknown007; // seen 0 /*007*/ uint8 unknown007; // seen 0
/*008*/ /*008*/
}; };
/*
* Structs used in OP_CharacterCreateRequest
*/
struct RaceClassAllocation {
uint32 Index;
uint32 BaseStats[7];
uint32 DefaultPointAllocation[7];
};
struct RaceClassCombos {
uint64 ExpansionRequired;
uint32 Race;
uint32 Class;
uint32 Deity;
uint32 AllocationIndex;
uint32 Zone;
};
#pragma pack() #pragma pack()
}; //end namespace structs }; //end namespace structs
}; //end namespace steam_latest }; //end namespace tob
#endif /*LAURION_STRUCTS_H_*/ #endif /*LAURION_STRUCTS_H_*/
+4 -4
View File
@@ -362,14 +362,14 @@ void Client::SendFailedLogin()
m_stored_username.clear(); m_stored_username.clear();
m_stored_password.clear(); m_stored_password.clear();
if (m_client_version == cv_steam_latest) { if (m_client_version == cv_tob) {
// unencrypted // unencrypted
LoginBaseMessage h{}; LoginBaseMessage h{};
h.sequence = m_login_base_message.sequence; // login (3) h.sequence = m_login_base_message.sequence; // login (3)
h.encrypt_type = m_login_base_message.encrypt_type; h.encrypt_type = m_login_base_message.encrypt_type;
// encrypted // encrypted
PlayerLoginReplySteamLatest r{}; PlayerLoginReplyTOB r{};
r.base_reply.success = false; r.base_reply.success = false;
r.base_reply.error_str_id = 105; // Error - The username and/or password were not valid r.base_reply.error_str_id = 105; // Error - The username and/or password were not valid
@@ -496,7 +496,7 @@ void Client::DoSuccessfulLogin(LoginAccountsRepository::LoginAccounts &a)
m_account_name = a.account_name; m_account_name = a.account_name;
m_loginserver_name = a.source_loginserver; m_loginserver_name = a.source_loginserver;
if (m_client_version == cv_steam_latest) { if (m_client_version == cv_tob) {
// unencrypted // unencrypted
LoginBaseMessage h{}; LoginBaseMessage h{};
h.sequence = m_login_base_message.sequence; h.sequence = m_login_base_message.sequence;
@@ -505,7 +505,7 @@ void Client::DoSuccessfulLogin(LoginAccountsRepository::LoginAccounts &a)
h.unk3 = m_login_base_message.unk3; h.unk3 = m_login_base_message.unk3;
// not serializing any of the variable length strings so just use struct directly // not serializing any of the variable length strings so just use struct directly
PlayerLoginReplySteamLatest r{}; PlayerLoginReplyTOB r{};
r.base_reply.success = true; r.base_reply.success = true;
r.base_reply.error_str_id = 101; // No Error r.base_reply.error_str_id = 101; // No Error
r.unk1 = 0; r.unk1 = 0;
+12 -12
View File
@@ -74,7 +74,7 @@ void CheckSoDOpcodeFile(const std::string &path)
} }
} }
void CheckSteamLatestOpcodeFile(const std::string &path) void CheckTOBOpcodeFile(const std::string &path)
{ {
if (File::Exists(path)) { if (File::Exists(path)) {
return; return;
@@ -177,31 +177,31 @@ ClientManager::ClientManager()
} }
); );
int steam_latest_port = server.config.GetVariableInt("client_configuration", "steam_latest_port", 15900); int tob_port = server.config.GetVariableInt("client_configuration", "tob_port", 15900);
EQStreamManagerInterfaceOptions steam_latest_opts(steam_latest_port, false, false); EQStreamManagerInterfaceOptions tob_opts(tob_port, false, false);
m_steam_latest_stream = new EQ::Net::EQStreamManager(steam_latest_opts); m_tob_stream = new EQ::Net::EQStreamManager(tob_opts);
m_steam_latest_ops = new RegularOpcodeManager; m_tob_ops = new RegularOpcodeManager;
opcodes_path = fmt::format( opcodes_path = fmt::format(
"{}/{}", "{}/{}",
PathManager::Instance()->GetOpcodePath(), PathManager::Instance()->GetOpcodePath(),
"login_opcodes_steam_latest.conf" "login_opcodes_tob.conf"
); );
CheckSteamLatestOpcodeFile(opcodes_path); CheckTOBOpcodeFile(opcodes_path);
if (!m_steam_latest_ops->LoadOpcodes(opcodes_path.c_str())) { if (!m_tob_ops->LoadOpcodes(opcodes_path.c_str())) {
LogError( LogError(
"ClientManager fatal error: couldn't load opcodes for Steam Latest file [{}]", "ClientManager fatal error: couldn't load opcodes for Steam Latest file [{}]",
server.config.GetVariableString("client_configuration", "steam_latest_opcodes", "login_opcodes.conf") server.config.GetVariableString("client_configuration", "tob_opcodes", "login_opcodes.conf")
); );
run_server = false; run_server = false;
} }
m_steam_latest_stream->OnNewConnection( m_tob_stream->OnNewConnection(
[this](std::shared_ptr<EQ::Net::EQStream> stream) { [this](std::shared_ptr<EQ::Net::EQStream> stream) {
LogInfo( LogInfo(
"New Steam Latest client connection from [{}:{}]", "New Steam Latest client connection from [{}:{}]",
@@ -209,8 +209,8 @@ ClientManager::ClientManager()
stream->GetRemotePort() stream->GetRemotePort()
); );
stream->SetOpcodeManager(&m_steam_latest_ops); stream->SetOpcodeManager(&m_tob_ops);
Client *c = new Client(stream, cv_steam_latest); Client *c = new Client(stream, cv_tob);
m_clients.push_back(c); m_clients.push_back(c);
} }
); );
+2 -2
View File
@@ -37,6 +37,6 @@ private:
EQ::Net::EQStreamManager *m_titanium_stream; EQ::Net::EQStreamManager *m_titanium_stream;
OpcodeManager *m_sod_ops; OpcodeManager *m_sod_ops;
EQ::Net::EQStreamManager *m_sod_stream; EQ::Net::EQStreamManager *m_sod_stream;
OpcodeManager *m_steam_latest_ops; OpcodeManager *m_tob_ops;
EQ::Net::EQStreamManager *m_steam_latest_stream; EQ::Net::EQStreamManager *m_tob_stream;
}; };
+2 -2
View File
@@ -67,7 +67,7 @@ struct PlayerLoginReply {
char unknown[1]; // variable length, password unlikely? client doesn't send this on re-login from char select char unknown[1]; // variable length, password unlikely? client doesn't send this on re-login from char select
}; };
struct PlayerLoginReplySteamLatest struct PlayerLoginReplyTOB
{ {
LoginBaseReplyMessage base_reply; LoginBaseReplyMessage base_reply;
int8_t unk1; // (default: 0) int8_t unk1; // (default: 0)
@@ -126,7 +126,7 @@ struct SystemFingerprint {
enum LSClientVersion { enum LSClientVersion {
cv_titanium, cv_titanium,
cv_sod, cv_sod,
cv_steam_latest cv_tob
}; };
enum LSClientStatus { enum LSClientStatus {
+1 -1
View File
@@ -706,7 +706,7 @@ bool WorldServer::ValidateWorldServerAdminLogin(
void WorldServer::SerializeForClientServerList(SerializeBuffer &out, bool use_local_ip, LSClientVersion version) const void WorldServer::SerializeForClientServerList(SerializeBuffer &out, bool use_local_ip, LSClientVersion version) const
{ {
if (version == cv_steam_latest) { if (version == cv_tob) {
if (use_local_ip) { if (use_local_ip) {
out.WriteString(GetLocalIP()); out.WriteString(GetLocalIP());
} }
+1 -1
View File
@@ -24,5 +24,5 @@ if __name__ == "__main__":
patch_template( patch_template(
template_path='opcode.template', template_path='opcode.template',
opcodes_path='opcodes.csv', opcodes_path='opcodes.csv',
output_path='patch_SteamLatest.conf' output_path='patch_TOB.conf'
) )
+1 -1
View File
@@ -1223,7 +1223,7 @@ bool Client::Process() {
} }
if(connect.Check()){ if(connect.Check()){
if (!(m_ClientVersionBit & EQ::versions::maskSteamLatestAndLater)) { if (!(m_ClientVersionBit & EQ::versions::maskTOBAndLater)) {
SendGuildList();// Send OPCode: OP_GuildsList SendGuildList();// Send OPCode: OP_GuildsList
SendApproveWorld(); SendApproveWorld();
} }
+1 -1
View File
@@ -9159,7 +9159,7 @@ void Client::SendHPUpdateMarquee(){
} }
void Client::SendMembership() { void Client::SendMembership() {
if (m_ClientVersion >= EQ::versions::ClientVersion::SteamLatest) { if (m_ClientVersion >= EQ::versions::ClientVersion::TOB) {
auto outapp = new EQApplicationPacket(OP_SendMembership, sizeof(Membership_Struct)); auto outapp = new EQApplicationPacket(OP_SendMembership, sizeof(Membership_Struct));
Membership_Struct* mc = (Membership_Struct*)outapp->pBuffer; Membership_Struct* mc = (Membership_Struct*)outapp->pBuffer;
+2 -2
View File
@@ -4261,7 +4261,7 @@ void Client::Handle_OP_Camp(const EQApplicationPacket *app)
if (IsLFP()) if (IsLFP())
worldserver.StopLFP(CharacterID()); worldserver.StopLFP(CharacterID());
if (ClientVersion() >= EQ::versions::ClientVersion::SteamLatest) { if (ClientVersion() >= EQ::versions::ClientVersion::TOB) {
if (!GetGM()) { if (!GetGM()) {
camp_timer.Start(29000, true); camp_timer.Start(29000, true);
} }
@@ -14561,7 +14561,7 @@ void Client::Handle_OP_ShopRequest(const EQApplicationPacket *app)
mco->rate = 1 / buy_cost_mod; mco->rate = 1 / buy_cost_mod;
} }
if (m_ClientVersion >= EQ::versions::ClientVersion::SteamLatest) { if (m_ClientVersion >= EQ::versions::ClientVersion::TOB) {
mco->player_id = GetID(); mco->player_id = GetID();
} }