mirror of
https://github.com/EQEmu/Server.git
synced 2026-04-26 15:32:27 +00:00
WIP, porting old laurion changes to tob
This commit is contained in:
parent
75ddf8dfc3
commit
a2b3b36cf1
@ -93,6 +93,8 @@ set(common_sources
|
||||
patches/sod_limits.cpp
|
||||
patches/sof.cpp
|
||||
patches/sof_limits.cpp
|
||||
patches/steam_latest.cpp
|
||||
patches/steam_latest_limits.cpp
|
||||
patches/titanium.cpp
|
||||
patches/titanium_limits.cpp
|
||||
patches/uf.cpp
|
||||
@ -674,6 +676,10 @@ set(common_headers
|
||||
patches/sof_limits.h
|
||||
patches/sof_ops.h
|
||||
patches/sof_structs.h
|
||||
patches/steam_latest.h
|
||||
patches/steam_latest_limits.h
|
||||
patches/steam_latest_ops.h
|
||||
patches/steam_latest_structs.h
|
||||
patches/ss_declare.h
|
||||
patches/ss_define.h
|
||||
patches/ss_register.h
|
||||
|
||||
@ -50,6 +50,7 @@ public:
|
||||
void WriteUInt8(uint8 value) { *(uint8 *)(pBuffer + _wpos) = value; _wpos += sizeof(uint8); }
|
||||
void WriteUInt32(uint32 value) { *(uint32 *)(pBuffer + _wpos) = value; _wpos += sizeof(uint32); }
|
||||
void WriteUInt64(uint64 value) { *(uint64 *)(pBuffer + _wpos) = value; _wpos += sizeof(uint64); }
|
||||
void WriteSInt16(int32 value) { *(int16*)(pBuffer + _wpos) = value; _wpos += sizeof(int16); }
|
||||
void WriteUInt16(uint32 value) { *(uint16 *)(pBuffer + _wpos) = value; _wpos += sizeof(uint16); }
|
||||
void WriteSInt32(int32 value) { *(int32 *)(pBuffer + _wpos) = value; _wpos += sizeof(int32); }
|
||||
void WriteFloat(float value) { *(float *)(pBuffer + _wpos) = value; _wpos += sizeof(float); }
|
||||
|
||||
@ -71,6 +71,9 @@ namespace Class {
|
||||
constexpr uint8 FellowshipMaster = 69;
|
||||
constexpr uint8 AlternateCurrencyMerchant = 70;
|
||||
constexpr uint8 MercenaryLiaison = 71;
|
||||
constexpr uint8 RealEstateMerchant = 72;
|
||||
constexpr uint8 LoyaltyMerchant = 73;
|
||||
constexpr uint8 TributeMaster2 = 74;
|
||||
|
||||
constexpr uint8 PLAYER_CLASS_COUNT = 16;
|
||||
constexpr uint16 ALL_CLASSES_BITMASK = 65535;
|
||||
|
||||
@ -99,6 +99,24 @@ uint32 CRC32::GenerateNoFlip(const uint8* buf, uint32 bufsize) {
|
||||
return Update(buf, bufsize);
|
||||
}
|
||||
|
||||
unsigned long CRC32::GetEQChecksum(uchar* in_data, uint32 in_length, uint32 start_at)
|
||||
{
|
||||
unsigned long data;
|
||||
unsigned long check = 0xffffffff;
|
||||
|
||||
for (uint32 i = start_at; i < in_length; i++)
|
||||
{
|
||||
data = in_data[i];
|
||||
data = data ^ (check);
|
||||
data = data & 0x000000ff;
|
||||
check = check >> 8;
|
||||
data = CRC32Table[data];
|
||||
check = check ^ data;
|
||||
}
|
||||
|
||||
return check;
|
||||
}
|
||||
|
||||
void CRC32::SetEQChecksum(uchar* in_data, uint32 in_length, uint32 start_at)
|
||||
{
|
||||
unsigned long data;
|
||||
|
||||
@ -25,6 +25,7 @@ public:
|
||||
static uint32 Generate(const uint8* buf, uint32 bufsize);
|
||||
static uint32 GenerateNoFlip(const uint8* buf, uint32 bufsize); // Same as Generate(), but without the ~
|
||||
static void SetEQChecksum(uchar* in_data, uint32 in_length, uint32 start_at=4);
|
||||
static unsigned long GetEQChecksum(uchar* in_data, uint32 in_length, uint32 start_at = 4);
|
||||
|
||||
// Multiple buffer CRC32
|
||||
static uint32 Update(const uint8* buf, uint32 bufsize, uint32 crc32 = 0xFFFFFFFF);
|
||||
|
||||
@ -18,8 +18,6 @@
|
||||
// system use
|
||||
N(OP_ExploreUnknown),
|
||||
// start (please add new opcodes in descending order and re-order any name changes where applicable)
|
||||
N(OP_0x0193),
|
||||
N(OP_0x0347),
|
||||
N(OP_AAAction),
|
||||
N(OP_AAExpUpdate),
|
||||
N(OP_AcceptNewTask),
|
||||
@ -380,6 +378,7 @@ N(OP_MercenaryTimer),
|
||||
N(OP_MercenaryTimerRequest),
|
||||
N(OP_MercenaryUnknown1),
|
||||
N(OP_MercenaryUnsuspendResponse),
|
||||
N(OP_MerchantBulkItems),
|
||||
N(OP_MobEnduranceUpdate),
|
||||
N(OP_MobHealth),
|
||||
N(OP_MobManaUpdate),
|
||||
@ -398,6 +397,7 @@ N(OP_MultiLineMsg),
|
||||
N(OP_NewSpawn),
|
||||
N(OP_NewTitlesAvailable),
|
||||
N(OP_NewZone),
|
||||
N(OP_NPCMoveUpdate),
|
||||
N(OP_OnLevelMessage),
|
||||
N(OP_OpenContainer),
|
||||
N(OP_OpenDiscordMerchant),
|
||||
|
||||
@ -54,6 +54,8 @@ const char* EQ::versions::ClientVersionName(ClientVersion client_version)
|
||||
return "RoF";
|
||||
case ClientVersion::RoF2:
|
||||
return "RoF2";
|
||||
case ClientVersion::SteamLatest:
|
||||
return "SteamLatest";
|
||||
default:
|
||||
return "Invalid Version";
|
||||
};
|
||||
@ -74,6 +76,8 @@ uint32 EQ::versions::ConvertClientVersionToClientVersionBit(ClientVersion client
|
||||
return bitRoF;
|
||||
case ClientVersion::RoF2:
|
||||
return bitRoF2;
|
||||
case ClientVersion::SteamLatest:
|
||||
return bitSteamLatest;
|
||||
default:
|
||||
return bitUnknown;
|
||||
}
|
||||
@ -94,6 +98,8 @@ EQ::versions::ClientVersion EQ::versions::ConvertClientVersionBitToClientVersion
|
||||
return ClientVersion::RoF;
|
||||
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::RoF2) - 1)) :
|
||||
return ClientVersion::RoF2;
|
||||
case ((uint32)1 << (static_cast<unsigned int>(ClientVersion::SteamLatest) - 1)) :
|
||||
return ClientVersion::SteamLatest;
|
||||
default:
|
||||
return ClientVersion::Unknown;
|
||||
}
|
||||
@ -182,6 +188,8 @@ const char* EQ::versions::MobVersionName(MobVersion mob_version)
|
||||
return "RoF";
|
||||
case MobVersion::RoF2:
|
||||
return "RoF2";
|
||||
case MobVersion::SteamLatest:
|
||||
return "SteamLatest";
|
||||
case MobVersion::NPC:
|
||||
return "NPC";
|
||||
case MobVersion::NPCMerchant:
|
||||
@ -210,6 +218,8 @@ const char* EQ::versions::MobVersionName(MobVersion mob_version)
|
||||
return "Offline RoF";
|
||||
case MobVersion::OfflineRoF2:
|
||||
return "Offline RoF2";
|
||||
case MobVersion::OfflineSteamLatest:
|
||||
return "Offline Steam Latest";
|
||||
default:
|
||||
return "Invalid Version";
|
||||
};
|
||||
@ -233,6 +243,8 @@ EQ::versions::ClientVersion EQ::versions::ConvertMobVersionToClientVersion(MobVe
|
||||
return ClientVersion::RoF;
|
||||
case MobVersion::RoF2:
|
||||
return ClientVersion::RoF2;
|
||||
case MobVersion::SteamLatest:
|
||||
return ClientVersion::SteamLatest;
|
||||
default:
|
||||
return ClientVersion::Unknown;
|
||||
}
|
||||
@ -256,6 +268,8 @@ EQ::versions::MobVersion EQ::versions::ConvertClientVersionToMobVersion(ClientVe
|
||||
return MobVersion::RoF;
|
||||
case ClientVersion::RoF2:
|
||||
return MobVersion::RoF2;
|
||||
case ClientVersion::SteamLatest:
|
||||
return MobVersion::SteamLatest;
|
||||
default:
|
||||
return MobVersion::Unknown;
|
||||
}
|
||||
@ -276,6 +290,8 @@ EQ::versions::MobVersion EQ::versions::ConvertPCMobVersionToOfflinePCMobVersion(
|
||||
return MobVersion::OfflineRoF;
|
||||
case MobVersion::RoF2:
|
||||
return MobVersion::OfflineRoF2;
|
||||
case MobVersion::SteamLatest:
|
||||
return MobVersion::OfflineSteamLatest;
|
||||
default:
|
||||
return MobVersion::Unknown;
|
||||
}
|
||||
@ -296,6 +312,8 @@ EQ::versions::MobVersion EQ::versions::ConvertOfflinePCMobVersionToPCMobVersion(
|
||||
return MobVersion::RoF;
|
||||
case MobVersion::OfflineRoF2:
|
||||
return MobVersion::RoF2;
|
||||
case MobVersion::OfflineSteamLatest:
|
||||
return MobVersion::SteamLatest;
|
||||
default:
|
||||
return MobVersion::Unknown;
|
||||
}
|
||||
@ -316,6 +334,8 @@ EQ::versions::ClientVersion EQ::versions::ConvertOfflinePCMobVersionToClientVers
|
||||
return ClientVersion::RoF;
|
||||
case MobVersion::OfflineRoF2:
|
||||
return ClientVersion::RoF2;
|
||||
case MobVersion::OfflineSteamLatest:
|
||||
return ClientVersion::SteamLatest;
|
||||
default:
|
||||
return ClientVersion::Unknown;
|
||||
}
|
||||
@ -336,6 +356,8 @@ EQ::versions::MobVersion EQ::versions::ConvertClientVersionToOfflinePCMobVersion
|
||||
return MobVersion::OfflineRoF;
|
||||
case ClientVersion::RoF2:
|
||||
return MobVersion::OfflineRoF2;
|
||||
case ClientVersion::SteamLatest:
|
||||
return MobVersion::OfflineSteamLatest;
|
||||
default:
|
||||
return MobVersion::Unknown;
|
||||
}
|
||||
@ -386,6 +408,28 @@ const char* EQ::expansions::ExpansionName(Expansion expansion)
|
||||
return "Rain of Fear";
|
||||
case Expansion::CotF:
|
||||
return "Call of the Forsaken";
|
||||
case Expansion::TDS:
|
||||
return "The Darkened Sea";
|
||||
case Expansion::TBM:
|
||||
return "The Broken Mirror";
|
||||
case Expansion::EoK:
|
||||
return "Empires of Kunark";
|
||||
case Expansion::RoS:
|
||||
return "Ring of Scale";
|
||||
case Expansion::TBL:
|
||||
return "The Burning Lands";
|
||||
case Expansion::ToV:
|
||||
return "Torment of Velious";
|
||||
case Expansion::CoV:
|
||||
return "Claws of Veeshan";
|
||||
case Expansion::ToL:
|
||||
return "Terror of Luclin";
|
||||
case Expansion::NoS:
|
||||
return "Night of Shadows";
|
||||
case Expansion::LS:
|
||||
return "Laurion's Song";
|
||||
case Expansion::TOB:
|
||||
return "The Outer Brood";
|
||||
default:
|
||||
return "Invalid Expansion";
|
||||
}
|
||||
@ -439,6 +483,29 @@ uint32 EQ::expansions::ConvertExpansionToExpansionBit(Expansion expansion)
|
||||
return bitRoF;
|
||||
case Expansion::CotF:
|
||||
return bitCotF;
|
||||
case Expansion::TDS:
|
||||
return bitTDS;
|
||||
case Expansion::TBM:
|
||||
return bitTBM;
|
||||
case Expansion::EoK:
|
||||
return bitEoK;
|
||||
case Expansion::RoS:
|
||||
return bitRoS;
|
||||
case Expansion::TBL:
|
||||
return bitTBL;
|
||||
case Expansion::ToV:
|
||||
return bitToV;
|
||||
case Expansion::CoV:
|
||||
return bitCoV;
|
||||
case Expansion::ToL:
|
||||
return bitToL;
|
||||
case Expansion::NoS:
|
||||
return bitNoS;
|
||||
case Expansion::LS:
|
||||
return bitLS;
|
||||
case Expansion::TOB:
|
||||
return bitTOB;
|
||||
|
||||
default:
|
||||
return bitEverQuest;
|
||||
}
|
||||
@ -487,6 +554,28 @@ EQ::expansions::Expansion EQ::expansions::ConvertExpansionBitToExpansion(uint32
|
||||
return Expansion::RoF;
|
||||
case bitCotF:
|
||||
return Expansion::CotF;
|
||||
case bitTDS:
|
||||
return Expansion::TDS;
|
||||
case bitTBM:
|
||||
return Expansion::TBM;
|
||||
case bitEoK:
|
||||
return Expansion::EoK;
|
||||
case bitRoS:
|
||||
return Expansion::RoS;
|
||||
case bitTBL:
|
||||
return Expansion::TBL;
|
||||
case bitToV:
|
||||
return Expansion::ToV;
|
||||
case bitCoV:
|
||||
return Expansion::CoV;
|
||||
case bitToL:
|
||||
return Expansion::ToL;
|
||||
case bitNoS:
|
||||
return Expansion::NoS;
|
||||
case bitLS:
|
||||
return Expansion::LS;
|
||||
case bitTOB:
|
||||
return Expansion::TOB;
|
||||
default:
|
||||
return Expansion::EverQuest;
|
||||
}
|
||||
@ -535,6 +624,28 @@ uint32 EQ::expansions::ConvertExpansionToExpansionsMask(Expansion expansion)
|
||||
return maskRoF;
|
||||
case Expansion::CotF:
|
||||
return maskCotF;
|
||||
case Expansion::TDS:
|
||||
return maskTDS;
|
||||
case Expansion::TBM:
|
||||
return maskTBM;
|
||||
case Expansion::EoK:
|
||||
return maskEoK;
|
||||
case Expansion::RoS:
|
||||
return maskRoS;
|
||||
case Expansion::TBL:
|
||||
return maskTBL;
|
||||
case Expansion::ToV:
|
||||
return maskToV;
|
||||
case Expansion::CoV:
|
||||
return maskCoV;
|
||||
case Expansion::ToL:
|
||||
return maskToL;
|
||||
case Expansion::NoS:
|
||||
return maskNoS;
|
||||
case Expansion::LS:
|
||||
return maskLS;
|
||||
case Expansion::TOB:
|
||||
return maskTOB;
|
||||
default:
|
||||
return maskEverQuest;
|
||||
}
|
||||
|
||||
@ -32,7 +32,8 @@ namespace EQ
|
||||
SoD, // Build: 'Dec 19 2008 15:22:49'
|
||||
UF, // Build: 'Jun 8 2010 16:44:32'
|
||||
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'
|
||||
};
|
||||
|
||||
enum ClientVersionBitmask : uint32 {
|
||||
@ -44,6 +45,7 @@ namespace EQ
|
||||
bitUF = 0x00000010,
|
||||
bitRoF = 0x00000020,
|
||||
bitRoF2 = 0x00000040,
|
||||
bitSteamLatest = 0x00000080,
|
||||
maskUnknown = 0x00000000,
|
||||
maskTitaniumAndEarlier = 0x00000003,
|
||||
maskSoFAndEarlier = 0x00000007,
|
||||
@ -55,10 +57,11 @@ namespace EQ
|
||||
maskUFAndLater = 0xFFFFFFF0,
|
||||
maskRoFAndLater = 0xFFFFFFE0,
|
||||
maskRoF2AndLater = 0xFFFFFFC0,
|
||||
maskSteamLatestAndLater = 0xFFFFFF80,
|
||||
maskAllClients = 0xFFFFFFFF
|
||||
};
|
||||
|
||||
const ClientVersion LastClientVersion = ClientVersion::RoF2;
|
||||
const ClientVersion LastClientVersion = ClientVersion::SteamLatest;
|
||||
const size_t ClientVersionCount = (static_cast<size_t>(LastClientVersion) + 1);
|
||||
|
||||
bool IsValidClientVersion(ClientVersion client_version);
|
||||
@ -76,6 +79,7 @@ namespace EQ
|
||||
UF,
|
||||
RoF,
|
||||
RoF2,
|
||||
SteamLatest
|
||||
NPC,
|
||||
NPCMerchant,
|
||||
Merc,
|
||||
@ -89,13 +93,14 @@ namespace EQ
|
||||
OfflineSoD,
|
||||
OfflineUF,
|
||||
OfflineRoF,
|
||||
OfflineRoF2
|
||||
OfflineRoF2,
|
||||
OfflineSteamLatest
|
||||
};
|
||||
|
||||
const MobVersion LastMobVersion = MobVersion::OfflineRoF2;
|
||||
const MobVersion LastPCMobVersion = MobVersion::RoF2;
|
||||
const MobVersion LastMobVersion = MobVersion::OfflineSteamLatest;
|
||||
const MobVersion LastPCMobVersion = MobVersion::SteamLatest;
|
||||
const MobVersion LastNonPCMobVersion = MobVersion::BotPet;
|
||||
const MobVersion LastOfflinePCMobVersion = MobVersion::OfflineRoF2;
|
||||
const MobVersion LastOfflinePCMobVersion = MobVersion::OfflineSteamLatest;
|
||||
const size_t MobVersionCount = (static_cast<size_t>(LastMobVersion) + 1);
|
||||
|
||||
bool IsValidMobVersion(MobVersion mob_version);
|
||||
@ -127,7 +132,8 @@ namespace EQ
|
||||
ucsSoDCombined = 'D',
|
||||
ucsUFCombined = 'E',
|
||||
ucsRoFCombined = 'F',
|
||||
ucsRoF2Combined = 'G'
|
||||
ucsRoF2Combined = 'G',
|
||||
ucsSteamLatestCombined = 'H'
|
||||
};
|
||||
|
||||
} /*versions*/
|
||||
@ -154,7 +160,18 @@ namespace EQ
|
||||
HoT,
|
||||
VoA,
|
||||
RoF,
|
||||
CotF
|
||||
CotF,
|
||||
TDS,
|
||||
TBM,
|
||||
EoK,
|
||||
RoS,
|
||||
TBL,
|
||||
ToV,
|
||||
CoV,
|
||||
ToL,
|
||||
NoS,
|
||||
LS,
|
||||
TOB
|
||||
};
|
||||
|
||||
enum ExpansionBitmask : uint32 {
|
||||
@ -179,6 +196,17 @@ namespace EQ
|
||||
bitVoA = 0x00020000,
|
||||
bitRoF = 0x00040000,
|
||||
bitCotF = 0x00080000,
|
||||
bitTDS = 0x00100000,
|
||||
bitTBM = 0x00200000,
|
||||
bitEoK = 0x00400000,
|
||||
bitRoS = 0x00800000,
|
||||
bitTBL = 0x01000000,
|
||||
bitToV = 0x02000000,
|
||||
bitCoV = 0x04000000,
|
||||
bitToL = 0x08000000,
|
||||
bitNoS = 0x10000000,
|
||||
bitLS = 0x20000000,
|
||||
bitTOB = 0x40000000,
|
||||
maskEverQuest = 0x00000000,
|
||||
maskRoK = 0x00000001,
|
||||
maskSoV = 0x00000003,
|
||||
@ -200,6 +228,18 @@ namespace EQ
|
||||
maskVoA = 0x0003FFFF,
|
||||
maskRoF = 0x0007FFFF,
|
||||
maskCotF = 0x000FFFFF
|
||||
maskCotF = 0x000FFFFF,
|
||||
maskTDS = 0x001FFFFF,
|
||||
maskTBM = 0x003FFFFF,
|
||||
maskEoK = 0x007FFFFF,
|
||||
maskRoS = 0x00FFFFFF,
|
||||
maskTBL = 0x01FFFFFF,
|
||||
maskToV = 0x03FFFFFF,
|
||||
maskCoV = 0x07FFFFFF,
|
||||
maskToL = 0x0FFFFFFF,
|
||||
maskNoS = 0x1FFFFFFF,
|
||||
maskLS = 0x3FFFFFFF,
|
||||
maskTOB = 0x7FFFFFFF,
|
||||
};
|
||||
|
||||
const char* ExpansionName(Expansion expansion);
|
||||
|
||||
@ -759,6 +759,46 @@ typedef enum {
|
||||
FilterStrikethrough = 26, //0=show, 1=hide // RoF2 Confirmed
|
||||
FilterStuns = 27, //0=show, 1=hide // RoF2 Confirmed
|
||||
FilterBardSongsOnPets = 28, //0=show, 1=hide // RoF2 Confirmed
|
||||
FilterSwarmPetDeath = 29,
|
||||
FilterFellowshipChat = 30,
|
||||
FilterMercenaryMessages = 31,
|
||||
FilterSpam = 32,
|
||||
FilterAchievements = 33,
|
||||
FilterPvPMessages = 34,
|
||||
FilterSpellNameInCast = 35,
|
||||
FilterRandomMine = 36,
|
||||
FilterRandomGroupRaid = 37,
|
||||
FilterRandomOthers = 38,
|
||||
FilterEnvironmentalDamage = 39,
|
||||
FilterMessages = 40,
|
||||
FilterOverwriteDetrimental = 41,
|
||||
FilterOverwriteBeneficial = 42,
|
||||
FilterCantUseCommand = 43,
|
||||
FilterCombatAbilityReuse = 44,
|
||||
FilterAAAbilityReuse = 45,
|
||||
FilterProcBeginCasting = 46,
|
||||
FilterDestroyedItems = 47,
|
||||
FilterYourAuras = 48,
|
||||
FilterOtherAuras = 49,
|
||||
FilterYourHeals = 50,
|
||||
FilterOtherHeals = 51,
|
||||
FilterYourDoTs = 52,
|
||||
FilterOtherDoTs = 53,
|
||||
FilterOtherDirectDamage = 54,
|
||||
FilterSpellEmotes = 55,
|
||||
FilterFactionMessages = 56,
|
||||
FilterTauntMessages = 57,
|
||||
FilterYourDisciplines = 58,
|
||||
FilterOtherDisplines = 59,
|
||||
FilterAchievementsOthers = 60,
|
||||
FilterRaidVictory = 61,
|
||||
FilterOtherDirectDamageCrits = 62,
|
||||
FilterDoTYoursCritical = 63,
|
||||
FilterDoTOthersCritical = 64,
|
||||
FilterDoTDamageTaken = 65,
|
||||
FilterHealsReceived = 66,
|
||||
FilterHealsYoursCritical = 67,
|
||||
FilterHealsOthersCritical = 68,
|
||||
_FilterCount
|
||||
} eqFilterType;
|
||||
|
||||
|
||||
@ -110,6 +110,14 @@ static const EQ::constants::LookupEntry constants_static_lookup_entries[EQ::vers
|
||||
RoF2::constants::CHARACTER_CREATION_LIMIT,
|
||||
RoF2::constants::SAY_LINK_BODY_SIZE,
|
||||
RoF2::constants::MAX_BAZAAR_TRADERS
|
||||
),
|
||||
/*[ClientVersion::SteamLatest] =*/
|
||||
EQ::constants::LookupEntry(
|
||||
SteamLatest::constants::EXPANSION,
|
||||
SteamLatest::constants::EXPANSION_BIT,
|
||||
SteamLatest::constants::EXPANSIONS_MASK,
|
||||
SteamLatest::constants::CHARACTER_CREATION_LIMIT,
|
||||
SteamLatest::constants::SAY_LINK_BODY_SIZE
|
||||
)
|
||||
};
|
||||
|
||||
@ -376,6 +384,34 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
||||
RoF2::inventory::ConcatenateInvTypeLimbo,
|
||||
RoF2::inventory::AllowOverLevelEquipment
|
||||
),
|
||||
/*[MobVersion::SteamLatest] =*/
|
||||
//SteamLatestTodo: These need to be set to the latest values not just use RoF2
|
||||
EQ::inventory::LookupEntry(
|
||||
EQ::inventory::LookupEntry::InventoryTypeSize_Struct(
|
||||
EQ::invtype::POSSESSIONS_SIZE, RoF2::invtype::BANK_SIZE, RoF2::invtype::SHARED_BANK_SIZE,
|
||||
RoF2::invtype::TRADE_SIZE, RoF2::invtype::WORLD_SIZE, RoF2::invtype::LIMBO_SIZE,
|
||||
RoF2::invtype::TRIBUTE_SIZE, RoF2::invtype::TROPHY_TRIBUTE_SIZE, RoF2::invtype::GUILD_TRIBUTE_SIZE,
|
||||
RoF2::invtype::MERCHANT_SIZE, RoF2::invtype::DELETED_SIZE, RoF2::invtype::CORPSE_SIZE,
|
||||
RoF2::invtype::BAZAAR_SIZE, RoF2::invtype::INSPECT_SIZE, RoF2::invtype::REAL_ESTATE_SIZE,
|
||||
RoF2::invtype::VIEW_MOD_PC_SIZE, RoF2::invtype::VIEW_MOD_BANK_SIZE, RoF2::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||
RoF2::invtype::VIEW_MOD_LIMBO_SIZE, RoF2::invtype::ALT_STORAGE_SIZE, RoF2::invtype::ARCHIVED_SIZE,
|
||||
RoF2::invtype::MAIL_SIZE, RoF2::invtype::GUILD_TROPHY_TRIBUTE_SIZE, RoF2::invtype::KRONO_SIZE,
|
||||
RoF2::invtype::OTHER_SIZE
|
||||
),
|
||||
|
||||
RoF2::invslot::EQUIPMENT_BITMASK,
|
||||
RoF2::invslot::GENERAL_BITMASK,
|
||||
RoF2::invslot::CURSOR_BITMASK,
|
||||
RoF2::invslot::POSSESSIONS_BITMASK,
|
||||
RoF2::invslot::CORPSE_BITMASK,
|
||||
RoF2::invbag::SLOT_COUNT,
|
||||
RoF2::invaug::SOCKET_COUNT,
|
||||
|
||||
RoF2::inventory::AllowEmptyBagInBag,
|
||||
RoF2::inventory::AllowClickCastFromBag,
|
||||
RoF2::inventory::ConcatenateInvTypeLimbo,
|
||||
RoF2::inventory::AllowOverLevelEquipment
|
||||
),
|
||||
/*[MobVersion::NPC] =*/
|
||||
EQ::inventory::LookupEntry(
|
||||
EQ::inventory::LookupEntry::InventoryTypeSize_Struct(
|
||||
@ -748,6 +784,35 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
||||
RoF2::INULL,
|
||||
RoF2::invbag::SLOT_COUNT,
|
||||
RoF2::invaug::SOCKET_COUNT,
|
||||
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
),
|
||||
/*[MobVersion::OfflineSteamLatest] =*/
|
||||
//SteamLatestTodo: Need to use their own values instead of RoF2
|
||||
EQ::inventory::LookupEntry(
|
||||
EQ::inventory::LookupEntry::InventoryTypeSize_Struct(
|
||||
RoF2::INULL, RoF2::INULL, RoF2::INULL,
|
||||
RoF2::invtype::TRADE_SIZE, RoF2::INULL, RoF2::INULL,
|
||||
RoF2::INULL, RoF2::INULL, RoF2::INULL,
|
||||
RoF2::invtype::MERCHANT_SIZE, RoF2::INULL, RoF2::INULL,
|
||||
RoF2::invtype::BAZAAR_SIZE, RoF2::invtype::INSPECT_SIZE, RoF2::INULL,
|
||||
RoF2::invtype::VIEW_MOD_PC_SIZE, RoF2::invtype::VIEW_MOD_BANK_SIZE, RoF2::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||
RoF2::invtype::VIEW_MOD_LIMBO_SIZE, RoF2::INULL, RoF2::INULL,
|
||||
RoF2::INULL, RoF2::INULL, RoF2::INULL,
|
||||
RoF2::INULL
|
||||
),
|
||||
|
||||
RoF2::INULL,
|
||||
RoF2::INULL,
|
||||
RoF2::INULL,
|
||||
RoF2::INULL,
|
||||
RoF2::INULL,
|
||||
RoF2::invbag::SLOT_COUNT,
|
||||
RoF2::invaug::SOCKET_COUNT,
|
||||
|
||||
|
||||
false,
|
||||
false,
|
||||
@ -1000,6 +1065,11 @@ static const EQ::behavior::LookupEntry behavior_static_lookup_entries[EQ::versio
|
||||
EQ::behavior::LookupEntry(
|
||||
RoF2::behavior::CoinHasWeight
|
||||
),
|
||||
/*[MobVersion::SteamLatest] =*/
|
||||
//SteamLatestTodo: We need this value set properly
|
||||
EQ::behavior::LookupEntry(
|
||||
RoF2::behavior::CoinHasWeight
|
||||
),
|
||||
/*[MobVersion::NPC] =*/
|
||||
EQ::behavior::LookupEntry(
|
||||
EQ::behavior::CoinHasWeight
|
||||
@ -1053,6 +1123,11 @@ static const EQ::behavior::LookupEntry behavior_static_lookup_entries[EQ::versio
|
||||
RoF::behavior::CoinHasWeight
|
||||
),
|
||||
/*[MobVersion::OfflineRoF2] =*/
|
||||
EQ::behavior::LookupEntry(
|
||||
RoF2::behavior::CoinHasWeight
|
||||
),
|
||||
/*[MobVersion::OfflineSteamLatest] =*/
|
||||
//SteamLatestTodo: We need this value set properly
|
||||
EQ::behavior::LookupEntry(
|
||||
RoF2::behavior::CoinHasWeight
|
||||
)
|
||||
@ -1209,6 +1284,19 @@ static const EQ::spells::LookupEntry spells_static_lookup_entries[EQ::versions::
|
||||
RoF2::spells::PET_BUFFS,
|
||||
RoF2::spells::MERC_BUFFS
|
||||
)
|
||||
/*[ClientVersion::SteamLatest] =*/
|
||||
EQ::spells::LookupEntry(
|
||||
SteamLatest::spells::SPELL_ID_MAX,
|
||||
SteamLatest::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
|
||||
SteamLatest::spells::LONG_BUFFS,
|
||||
SteamLatest::spells::SHORT_BUFFS,
|
||||
SteamLatest::spells::DISC_BUFFS,
|
||||
SteamLatest::spells::TOTAL_BUFFS,
|
||||
SteamLatest::spells::NPC_BUFFS,
|
||||
SteamLatest::spells::PET_BUFFS,
|
||||
SteamLatest::spells::MERC_BUFFS
|
||||
)
|
||||
};
|
||||
|
||||
static bool spells_dictionary_init = false;
|
||||
|
||||
@ -23,6 +23,7 @@
|
||||
#include "common/patches/rof2_limits.h"
|
||||
#include "common/patches/sod_limits.h"
|
||||
#include "common/patches/sof_limits.h"
|
||||
#include "common/patches/steam_latest_limits.h"
|
||||
#include "common/patches/titanium_limits.h"
|
||||
#include "common/patches/uf_limits.h"
|
||||
#include "common/types.h"
|
||||
|
||||
@ -47,6 +47,13 @@ static const uint32 ADVANCED_LORE_LENGTH = 8192;
|
||||
#pragma pack(push)
|
||||
#pragma pack(1)
|
||||
|
||||
struct EqGuid
|
||||
{
|
||||
uint32_t Id;
|
||||
uint16_t WorldId;
|
||||
uint16_t Reserved;
|
||||
};
|
||||
|
||||
struct LoginInfo {
|
||||
/*000*/ char login_info[64];
|
||||
/*064*/ uint8 unknown064[124];
|
||||
@ -326,6 +333,7 @@ union
|
||||
bool buyer;
|
||||
bool untargetable;
|
||||
uint32 npc_tint_id;
|
||||
EqGuid CharacterGuid;
|
||||
};
|
||||
|
||||
struct PlayerState_Struct {
|
||||
|
||||
@ -21,6 +21,7 @@
|
||||
#include "common/patches/rof2.h"
|
||||
#include "common/patches/sod.h"
|
||||
#include "common/patches/sof.h"
|
||||
#include "common/patches/steam_latest.h"
|
||||
#include "common/patches/titanium.h"
|
||||
#include "common/patches/uf.h"
|
||||
|
||||
@ -33,6 +34,7 @@ void RegisterAllPatches(EQStreamIdentifier &into)
|
||||
UF::Register(into);
|
||||
RoF::Register(into);
|
||||
RoF2::Register(into);
|
||||
SteamLatest::Register(into);
|
||||
}
|
||||
|
||||
void ReloadAllPatches()
|
||||
@ -43,4 +45,5 @@ void ReloadAllPatches()
|
||||
UF::Reload();
|
||||
RoF::Reload();
|
||||
RoF2::Reload();
|
||||
SteamLatest::Reload();
|
||||
}
|
||||
|
||||
5750
common/patches/steam_latest.cpp
Normal file
5750
common/patches/steam_latest.cpp
Normal file
File diff suppressed because it is too large
Load Diff
0
common/patches/steam_latest.h
Normal file
0
common/patches/steam_latest.h
Normal file
0
common/patches/steam_latest_limits.cpp
Normal file
0
common/patches/steam_latest_limits.cpp
Normal file
336
common/patches/steam_latest_limits.h
Normal file
336
common/patches/steam_latest_limits.h
Normal file
@ -0,0 +1,336 @@
|
||||
#ifndef COMMON_LAURION_LIMITS_H
|
||||
#define COMMON_LAURION_LIMITS_H
|
||||
|
||||
#include "../types.h"
|
||||
#include "../emu_versions.h"
|
||||
#include "../skills.h"
|
||||
|
||||
namespace SteamLatest
|
||||
{
|
||||
const int16 IINVALID = -1;
|
||||
const int16 INULL = 0;
|
||||
|
||||
namespace inventory {
|
||||
inline EQ::versions::ClientVersion GetInventoryRef() { return EQ::versions::ClientVersion::SteamLatest; }
|
||||
|
||||
const bool ConcatenateInvTypeLimbo = false;
|
||||
|
||||
const bool AllowOverLevelEquipment = true;
|
||||
|
||||
const bool AllowEmptyBagInBag = true;
|
||||
const bool AllowClickCastFromBag = true;
|
||||
|
||||
} /*inventory*/
|
||||
|
||||
namespace invtype {
|
||||
inline EQ::versions::ClientVersion GetInvTypeRef() { return EQ::versions::ClientVersion::SteamLatest; }
|
||||
|
||||
namespace enum_ {
|
||||
enum InventoryTypes : int16 {
|
||||
typePossessions = INULL,
|
||||
typeBank,
|
||||
typeSharedBank,
|
||||
typeTrade,
|
||||
typeWorld,
|
||||
typeLimbo,
|
||||
typeTribute,
|
||||
typeTrophyTribute,
|
||||
typeGuildTribute,
|
||||
typeMerchant,
|
||||
typeDeleted,
|
||||
typeCorpse,
|
||||
typeBazaar,
|
||||
typeInspect,
|
||||
typeRealEstate,
|
||||
typeViewMODPC,
|
||||
typeViewMODBank,
|
||||
typeViewMODSharedBank,
|
||||
typeViewMODLimbo,
|
||||
typeAltStorage,
|
||||
typeArchived,
|
||||
typeMail,
|
||||
typeGuildTrophyTribute,
|
||||
typeKrono,
|
||||
typeOther,
|
||||
typeMercenaryItems,
|
||||
typeViewModMercenaryItems,
|
||||
typeMountKeyRingItems,
|
||||
typeViewModMountKeyRingItems,
|
||||
typeIllusionKeyRingItems,
|
||||
typeViewModIllusionKeyRingItems,
|
||||
typeFamiliarKeyRingItems,
|
||||
typeViewModFamiliarKeyRingItems,
|
||||
typeHeroForgeKeyRingItems,
|
||||
typeViewModHeroForgeKeyRingItems,
|
||||
typeTeleportationKeyRingItems,
|
||||
typeViewModTeleportationKeyRingItems,
|
||||
typeOverflow,
|
||||
typeDragonHoard,
|
||||
typeTradeskillDepot,
|
||||
typeGuildTradeskillDepot
|
||||
};
|
||||
|
||||
} // namespace enum_
|
||||
using namespace enum_;
|
||||
|
||||
const int16 POSSESSIONS_SIZE = 34;
|
||||
const int16 BANK_SIZE = 24;
|
||||
const int16 SHARED_BANK_SIZE = 2;
|
||||
const int16 TRADE_SIZE = 8;
|
||||
const int16 WORLD_SIZE = 10;
|
||||
const int16 LIMBO_SIZE = 36;
|
||||
const int16 TRIBUTE_SIZE = 5;
|
||||
const int16 TROPHY_TRIBUTE_SIZE = 0;//unknown
|
||||
const int16 GUILD_TRIBUTE_SIZE = 2;//unverified
|
||||
const int16 MERCHANT_SIZE = 200;
|
||||
const int16 DELETED_SIZE = 0;//unknown - "Recovery Tab"
|
||||
const int16 CORPSE_SIZE = POSSESSIONS_SIZE;
|
||||
const int16 BAZAAR_SIZE = 200;
|
||||
const int16 INSPECT_SIZE = 23;
|
||||
const int16 REAL_ESTATE_SIZE = 0;//unknown
|
||||
const int16 VIEW_MOD_PC_SIZE = POSSESSIONS_SIZE;
|
||||
const int16 VIEW_MOD_BANK_SIZE = BANK_SIZE;
|
||||
const int16 VIEW_MOD_SHARED_BANK_SIZE = SHARED_BANK_SIZE;
|
||||
const int16 VIEW_MOD_LIMBO_SIZE = LIMBO_SIZE;
|
||||
const int16 ALT_STORAGE_SIZE = 0;//unknown - "Shroud Bank"
|
||||
const int16 ARCHIVED_SIZE = 0;//unknown
|
||||
const int16 MAIL_SIZE = 0;//unknown
|
||||
const int16 GUILD_TROPHY_TRIBUTE_SIZE = 0;//unknown
|
||||
const int16 KRONO_SIZE = 0;//unknown
|
||||
const int16 OTHER_SIZE = 0;//unknown
|
||||
|
||||
const int16 TRADE_NPC_SIZE = 4; // defined by implication
|
||||
|
||||
const int16 TYPE_INVALID = IINVALID;
|
||||
const int16 TYPE_BEGIN = typePossessions;
|
||||
const int16 TYPE_END = typeOther;
|
||||
const int16 TYPE_COUNT = (TYPE_END - TYPE_BEGIN) + 1;
|
||||
|
||||
int16 GetInvTypeSize(int16 inv_type);
|
||||
const char* GetInvTypeName(int16 inv_type);
|
||||
|
||||
bool IsInvTypePersistent(int16 inv_type);
|
||||
|
||||
} /*invtype*/
|
||||
|
||||
namespace invslot {
|
||||
inline EQ::versions::ClientVersion GetInvSlotRef() { return EQ::versions::ClientVersion::SteamLatest; }
|
||||
|
||||
namespace enum_ {
|
||||
enum InventorySlots : int16 {
|
||||
slotCharm = INULL,
|
||||
slotEar1,
|
||||
slotHead,
|
||||
slotFace,
|
||||
slotEar2,
|
||||
slotNeck,
|
||||
slotShoulders,
|
||||
slotArms,
|
||||
slotBack,
|
||||
slotWrist1,
|
||||
slotWrist2,
|
||||
slotRange,
|
||||
slotHands,
|
||||
slotPrimary,
|
||||
slotSecondary,
|
||||
slotFinger1,
|
||||
slotFinger2,
|
||||
slotChest,
|
||||
slotLegs,
|
||||
slotFeet,
|
||||
slotWaist,
|
||||
slotPowerSource,
|
||||
slotAmmo,
|
||||
slotGeneral1,
|
||||
slotGeneral2,
|
||||
slotGeneral3,
|
||||
slotGeneral4,
|
||||
slotGeneral5,
|
||||
slotGeneral6,
|
||||
slotGeneral7,
|
||||
slotGeneral8,
|
||||
slotGeneral9,
|
||||
slotGeneral10,
|
||||
slotGeneral11,
|
||||
slotGeneral12,
|
||||
slotCursor
|
||||
};
|
||||
|
||||
constexpr int16 format_as(InventorySlots slot) { return static_cast<int16>(slot); }
|
||||
} // namespace enum_
|
||||
using namespace enum_;
|
||||
|
||||
const int16 SLOT_INVALID = IINVALID;
|
||||
const int16 SLOT_BEGIN = INULL;
|
||||
|
||||
const int16 POSSESSIONS_BEGIN = slotCharm;
|
||||
const int16 POSSESSIONS_END = slotCursor;
|
||||
const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1;
|
||||
|
||||
const int16 EQUIPMENT_BEGIN = slotCharm;
|
||||
const int16 EQUIPMENT_END = slotAmmo;
|
||||
const int16 EQUIPMENT_COUNT = (EQUIPMENT_END - EQUIPMENT_BEGIN) + 1;
|
||||
|
||||
//We support more if enabled but for now lets leave it at the 10 slots
|
||||
const int16 GENERAL_BEGIN = slotGeneral1;
|
||||
const int16 GENERAL_END = slotGeneral10;
|
||||
const int16 GENERAL_COUNT = (GENERAL_END - GENERAL_BEGIN) + 1;
|
||||
|
||||
const int16 BONUS_BEGIN = invslot::slotCharm;
|
||||
const int16 BONUS_STAT_END = invslot::slotPowerSource;
|
||||
const int16 BONUS_SKILL_END = invslot::slotAmmo;
|
||||
|
||||
const int16 CORPSE_BEGIN = invslot::slotGeneral1;
|
||||
const int16 CORPSE_END = invslot::slotGeneral1 + invslot::slotCursor;
|
||||
|
||||
const uint64 EQUIPMENT_BITMASK = 0x00000000007FFFFF;
|
||||
const uint64 GENERAL_BITMASK = 0x00000007FF800000;
|
||||
const uint64 CURSOR_BITMASK = 0x0000000800000000;
|
||||
const uint64 POSSESSIONS_BITMASK = (EQUIPMENT_BITMASK | GENERAL_BITMASK | CURSOR_BITMASK); // based on 36-slot count (SteamLatest+)
|
||||
const uint64 CORPSE_BITMASK = (GENERAL_BITMASK | CURSOR_BITMASK | (EQUIPMENT_BITMASK << 36)); // based on 36-slot count (SteamLatest+)
|
||||
|
||||
|
||||
const char* GetInvPossessionsSlotName(int16 inv_slot);
|
||||
const char* GetInvSlotName(int16 inv_type, int16 inv_slot);
|
||||
|
||||
} /*invslot*/
|
||||
|
||||
namespace invbag {
|
||||
inline EQ::versions::ClientVersion GetInvBagRef() { return EQ::versions::ClientVersion::SteamLatest; }
|
||||
|
||||
const int16 SLOT_INVALID = IINVALID;
|
||||
const int16 SLOT_BEGIN = INULL;
|
||||
const int16 SLOT_END = 9; //254;
|
||||
const int16 SLOT_COUNT = 10; //255; // server Size will be 255..unsure what actual client is (test)
|
||||
|
||||
const char* GetInvBagIndexName(int16 bag_index);
|
||||
|
||||
} /*invbag*/
|
||||
|
||||
namespace invaug {
|
||||
inline EQ::versions::ClientVersion GetInvAugRef() { return EQ::versions::ClientVersion::SteamLatest; }
|
||||
|
||||
const int16 SOCKET_INVALID = IINVALID;
|
||||
const int16 SOCKET_BEGIN = INULL;
|
||||
const int16 SOCKET_END = 5;
|
||||
const int16 SOCKET_COUNT = 6;
|
||||
|
||||
const char* GetInvAugIndexName(int16 aug_index);
|
||||
|
||||
} /*invaug*/
|
||||
|
||||
namespace item {
|
||||
inline EQ::versions::ClientVersion GetItemRef() { return EQ::versions::ClientVersion::SteamLatest; }
|
||||
|
||||
//enum Unknown : int { // looks like item class..but, RoF has it too - nothing in UF-
|
||||
// Unknown1 = 0,
|
||||
// Unknown2 = 1,
|
||||
// Unknown3 = 2,
|
||||
// Unknown4 = 5 // krono?
|
||||
//};
|
||||
|
||||
enum ItemPacketType : int {
|
||||
ItemPacketMerchant = 0x64,
|
||||
ItemPacketTradeView = 0x65,
|
||||
ItemPacketLoot = 0x66,
|
||||
ItemPacketTrade = 0x67,
|
||||
//looks like they added something at 0x68 that didn't exist before and shifted everything after it up by 1
|
||||
ItemPacketUnknown068 = 0x68, //Not sure but it seems to deal with the cursor somehow.
|
||||
ItemPacketCharInventory = 0x6A, //Rof 0x69 -> Larion 0x6a (requires translation)
|
||||
ItemPacketLimbo = 0x6B, //0x6A -> 0x6B
|
||||
ItemPacketWorldContainer = 0x6C,
|
||||
ItemPacketTributeItem = 0x6D,
|
||||
ItemPacketGuildTribute = 0x6E,
|
||||
ItemPacketCharmUpdate = 0x6f,
|
||||
ItemPacketRecovery = 0x72,
|
||||
ItemPacketParcel = 0x74,
|
||||
ItemPacketUnknown075 = 0x75, //Not sure but uses a lot of the same logic as the trade and char inventory types
|
||||
ItemPacketOverflow = 0x76,
|
||||
ItemPacketDragonHoard = 0x77,
|
||||
ItemPacketTradeskill = 0x78,
|
||||
ItemPacketTradeskillDepot = 0x79,
|
||||
ItemPacketInvalid = 0xFF
|
||||
};
|
||||
|
||||
} /*item*/
|
||||
|
||||
namespace profile {
|
||||
inline EQ::versions::ClientVersion GetProfileRef() { return EQ::versions::ClientVersion::SteamLatest; }
|
||||
|
||||
const int16 BANDOLIERS_SIZE = 20; // number of bandolier instances
|
||||
const int16 BANDOLIER_ITEM_COUNT = 4; // number of equipment slots in bandolier instance
|
||||
|
||||
const int16 POTION_BELT_SIZE = 5;
|
||||
|
||||
const int16 SKILL_ARRAY_SIZE = 100;
|
||||
|
||||
} /*profile*/
|
||||
|
||||
namespace constants {
|
||||
inline EQ::versions::ClientVersion GetConstantsRef() { return EQ::versions::ClientVersion::SteamLatest; }
|
||||
|
||||
const EQ::expansions::Expansion EXPANSION = EQ::expansions::Expansion::LS;
|
||||
const uint32 EXPANSION_BIT = EQ::expansions::bitLS;
|
||||
const uint32 EXPANSIONS_MASK = EQ::expansions::maskLS;
|
||||
|
||||
const size_t CHARACTER_CREATION_LIMIT = 12;
|
||||
|
||||
const size_t SAY_LINK_BODY_SIZE = 56;
|
||||
const uint32 MAX_GUILD_ID = 50000;
|
||||
|
||||
} /*constants*/
|
||||
|
||||
namespace behavior {
|
||||
inline EQ::versions::ClientVersion GetBehaviorRef() { return EQ::versions::ClientVersion::SteamLatest; }
|
||||
|
||||
const bool CoinHasWeight = false;
|
||||
|
||||
} /*behavior*/
|
||||
|
||||
namespace skills {
|
||||
inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::SteamLatest; }
|
||||
|
||||
const size_t LastUsableSkill = EQ::skills::Skill2HPiercing;
|
||||
|
||||
} /*skills*/
|
||||
|
||||
namespace spells {
|
||||
inline EQ::versions::ClientVersion GetSkillsRef() { return EQ::versions::ClientVersion::SteamLatest; }
|
||||
|
||||
enum class CastingSlot : uint32 {
|
||||
Gem1 = 0,
|
||||
Gem2 = 1,
|
||||
Gem3 = 2,
|
||||
Gem4 = 3,
|
||||
Gem5 = 4,
|
||||
Gem6 = 5,
|
||||
Gem7 = 6,
|
||||
Gem8 = 7,
|
||||
Gem9 = 8,
|
||||
Gem10 = 9,
|
||||
Gem11 = 10,
|
||||
Gem12 = 11,
|
||||
MaxGems = 18, // fallacy..only 12 slot are useable...
|
||||
Item = 12,
|
||||
Discipline = 13,
|
||||
AltAbility = 0xFF
|
||||
};
|
||||
|
||||
const int SPELL_ID_MAX = 71999;
|
||||
const int SPELLBOOK_SIZE = 1120;
|
||||
const int SPELL_GEM_COUNT = static_cast<uint32>(CastingSlot::MaxGems);
|
||||
const int SPELL_GEM_RECAST_TIMER = 15;
|
||||
|
||||
const int LONG_BUFFS = 42;
|
||||
const int SHORT_BUFFS = 30;
|
||||
const int DISC_BUFFS = 1;
|
||||
const int TOTAL_BUFFS = LONG_BUFFS + SHORT_BUFFS + DISC_BUFFS;
|
||||
const int NPC_BUFFS = 400;
|
||||
const int PET_BUFFS = NPC_BUFFS;
|
||||
const int MERC_BUFFS = LONG_BUFFS;
|
||||
|
||||
} /*spells*/
|
||||
|
||||
}; /* SteamLatest */
|
||||
|
||||
#endif /*COMMON_LAURION_LIMITS_H*/
|
||||
95
common/patches/steam_latest_ops.h
Normal file
95
common/patches/steam_latest_ops.h
Normal file
@ -0,0 +1,95 @@
|
||||
//list of packets we need to encode on the way out:
|
||||
E(OP_Action)
|
||||
E(OP_Animation)
|
||||
E(OP_ApplyPoison)
|
||||
E(OP_AugmentInfo)
|
||||
E(OP_BeginCast)
|
||||
E(OP_BlockedBuffs)
|
||||
E(OP_Buff)
|
||||
E(OP_BuffCreate)
|
||||
E(OP_CancelTrade)
|
||||
E(OP_CastSpell)
|
||||
E(OP_ChannelMessage)
|
||||
E(OP_CharInventory)
|
||||
E(OP_ClickObjectAction)
|
||||
E(OP_ClientUpdate)
|
||||
E(OP_Consider)
|
||||
E(OP_Damage)
|
||||
E(OP_Death)
|
||||
E(OP_DeleteCharge)
|
||||
E(OP_DeleteItem)
|
||||
E(OP_DeleteSpawn)
|
||||
E(OP_DisciplineUpdate)
|
||||
E(OP_ExpansionInfo)
|
||||
E(OP_ExpUpdate)
|
||||
E(OP_FormattedMessage)
|
||||
E(OP_GMTraining)
|
||||
E(OP_GMTrainSkillConfirm)
|
||||
E(OP_GroundSpawn)
|
||||
E(OP_HPUpdate)
|
||||
E(OP_Illusion)
|
||||
E(OP_ItemPacket)
|
||||
E(OP_LogServer)
|
||||
E(OP_ManaChange)
|
||||
E(OP_MobHealth)
|
||||
E(OP_MoneyOnCorpse)
|
||||
E(OP_MoveItem)
|
||||
E(OP_NewSpawn)
|
||||
E(OP_NewZone)
|
||||
E(OP_OnLevelMessage)
|
||||
E(OP_PlayerProfile)
|
||||
E(OP_RemoveBlockedBuffs)
|
||||
E(OP_RespondAA)
|
||||
E(OP_RequestClientZoneChange)
|
||||
E(OP_RecipeAutoCombine)
|
||||
E(OP_SendAATable)
|
||||
E(OP_SendCharInfo)
|
||||
E(OP_SendMaxCharacters)
|
||||
E(OP_SendMembership)
|
||||
E(OP_SendMembershipDetails)
|
||||
E(OP_SendZonepoints)
|
||||
E(OP_ShopPlayerBuy)
|
||||
E(OP_ShopPlayerSell)
|
||||
E(OP_ShopRequest)
|
||||
E(OP_SkillUpdate)
|
||||
E(OP_SpecialMesg)
|
||||
E(OP_SpawnAppearance)
|
||||
E(OP_SpawnDoor)
|
||||
E(OP_Stun)
|
||||
E(OP_WearChange)
|
||||
E(OP_ZoneChange)
|
||||
E(OP_ZoneEntry)
|
||||
E(OP_ZonePlayerToBind)
|
||||
E(OP_ZoneSpawns)
|
||||
|
||||
//list of packets we need to decode on the way in:
|
||||
D(OP_Animation)
|
||||
D(OP_ApplyPoison)
|
||||
D(OP_AugmentInfo)
|
||||
D(OP_AugmentItem)
|
||||
D(OP_BlockedBuffs)
|
||||
D(OP_CastSpell)
|
||||
D(OP_ChannelMessage)
|
||||
D(OP_ClientUpdate)
|
||||
D(OP_ClickDoor)
|
||||
D(OP_Consider)
|
||||
D(OP_ConsiderCorpse)
|
||||
D(OP_DeleteItem)
|
||||
D(OP_EnterWorld)
|
||||
D(OP_GMTraining)
|
||||
D(OP_GroupDisband)
|
||||
D(OP_GroupInvite)
|
||||
D(OP_GroupInvite2)
|
||||
D(OP_MoveItem)
|
||||
D(OP_RemoveBlockedBuffs)
|
||||
D(OP_SetServerFilter)
|
||||
D(OP_ShopPlayerBuy)
|
||||
D(OP_ShopPlayerSell)
|
||||
D(OP_ShopRequest)
|
||||
D(OP_SpawnAppearance)
|
||||
D(OP_TradeSkillCombine)
|
||||
D(OP_WearChange)
|
||||
D(OP_ZoneEntry)
|
||||
D(OP_ZoneChange)
|
||||
#undef E
|
||||
#undef D
|
||||
1019
common/patches/steam_latest_structs.h
Normal file
1019
common/patches/steam_latest_structs.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -354,6 +354,7 @@ RULE_STRING(World, CustomFilesKey, "", "Enable if the server requires custom fil
|
||||
RULE_STRING(World, CustomFilesUrl, "github.com/knervous/eqnexus/releases", "URL to display at character select if client is missing custom files")
|
||||
RULE_INT(World, CustomFilesAdminLevel, 20, "Admin level at which custom file key is not required when CustomFilesKey is specified")
|
||||
RULE_BOOL(World, RealTimeCalculateGuilds, false, "(Temp feature flag) If true, guilds will be calculated in real time instead of at zone boot. This is a performance hit but allows for more dynamic guilds.")
|
||||
RULE_INT(World, Id, 100, "Used by later clients to create GUIDs, expected to be Unique to the world but ultimately not that important")
|
||||
RULE_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY(Zone)
|
||||
|
||||
699
utils/patches/patch_SteamLatest.conf
Normal file
699
utils/patches/patch_SteamLatest.conf
Normal file
@ -0,0 +1,699 @@
|
||||
# ShowEQ Import Notes:
|
||||
# ZERO THE FILE first
|
||||
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
|
||||
# Unknown Mapping:
|
||||
# OP_Action2 -> OP_Damage
|
||||
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
|
||||
# Name Differences:
|
||||
# OP_CancelInvite -> OP_GroupCancelInvite
|
||||
# OP_GMFind -> OP_FindPersonRequest
|
||||
# OP_CommonMessage -> OP_ChannelMessage
|
||||
|
||||
OP_Unknown=0x0000
|
||||
OP_ExploreUnknown=0x0000 # used for unknown explorer
|
||||
|
||||
# world packets
|
||||
# Required to reach Char Select:
|
||||
OP_SendLoginInfo=0x2fca
|
||||
OP_ApproveWorld=0x0000
|
||||
OP_LogServer=0x6d4d
|
||||
OP_SendCharInfo=0x832
|
||||
OP_ExpansionInfo=0x066d
|
||||
OP_EnterWorld=0x6691
|
||||
OP_PostEnterWorld=0x2062
|
||||
OP_World_Client_CRC1=0x74c8
|
||||
OP_World_Client_CRC2=0x3984
|
||||
OP_World_Client_CRC3=0x6516
|
||||
OP_SendSpellChecksum=0x0000
|
||||
OP_SendSkillCapsChecksum=0x0000
|
||||
|
||||
# Character Select Related:
|
||||
OP_SendMaxCharacters=0x13af
|
||||
OP_SendMembership=0x2aca
|
||||
OP_SendMembershipDetails=0x2608
|
||||
OP_CharacterCreateRequest=0x2df4
|
||||
OP_CharacterCreate=0x6a3c
|
||||
OP_DeleteCharacter=x67d7
|
||||
OP_RandomNameGenerator=0x49d9
|
||||
OP_ApproveName=0x11e5
|
||||
OP_MOTD=0x0be4
|
||||
OP_SetChatServer=0x0000
|
||||
OP_SetChatServer2=0x2726
|
||||
OP_ZoneServerInfo=0x2273
|
||||
OP_WorldComplete=0x195c
|
||||
OP_WorldUnknown001=0x2049
|
||||
OP_FloatListThing=0x66fd
|
||||
|
||||
# Reasons for Disconnect:
|
||||
OP_ZoneUnavail=0x582d
|
||||
OP_WorldClientReady=0x7ed8
|
||||
OP_CharacterStillInZone=0x0000
|
||||
OP_WorldChecksumFailure=0x0000
|
||||
OP_WorldLoginFailed=0x0000
|
||||
OP_WorldLogout=0x0000
|
||||
OP_WorldLevelTooHigh=0x0000
|
||||
OP_CharInacessable=0x0000
|
||||
OP_UserCompInfo=0x0000
|
||||
OP_SendExeChecksum=0x0000
|
||||
OP_SendBaseDataChecksum=0x0000
|
||||
|
||||
# Zone in opcodes
|
||||
OP_AckPacket=0x77c9
|
||||
OP_ZoneEntry=0x784a
|
||||
OP_ReqNewZone=0x3895
|
||||
OP_NewZone=0x4341
|
||||
OP_ZoneSpawns=0x17d9
|
||||
OP_PlayerProfile=0x1c76
|
||||
OP_TimeOfDay=0x3736
|
||||
OP_LevelUpdate=0x0eb2
|
||||
OP_Stamina=0x1563
|
||||
OP_RequestClientZoneChange=0x0191
|
||||
OP_ZoneChange=0x17a3
|
||||
OP_LockoutTimerInfo=0x0000
|
||||
OP_ZoneServerReady=0x0000
|
||||
OP_ZoneInUnknown=0x0000
|
||||
OP_LogoutReply=0x0000
|
||||
OP_PreLogoutReply=0x0000
|
||||
|
||||
# Required to fully log in
|
||||
OP_SpawnAppearance=0x4eb0
|
||||
OP_ChangeSize=0x2fdc
|
||||
OP_Weather=0x6fe6
|
||||
OP_ReqClientSpawn=0x6732
|
||||
OP_SpawnDoor=0x4273
|
||||
OP_GroundSpawn=0x49c5
|
||||
OP_SendZonepoints=0x279f
|
||||
OP_BlockedBuffs=0x4fdb
|
||||
OP_RemoveBlockedBuffs=0x53cd
|
||||
OP_ClearBlockedBuffs=0x5752
|
||||
OP_WorldObjectsSent=0x2879
|
||||
OP_SendExpZonein=0x02b4
|
||||
OP_SendAATable=0x5f30
|
||||
OP_ClearAA=0x3498
|
||||
OP_ClearLeadershipAbilities=0x0000 #removed; leadership abilities are baked in and always on
|
||||
OP_RespondAA=0x4c67
|
||||
OP_UpdateAA=0x3b30
|
||||
OP_SendAAStats=0x7d65 #i'll be honest i think this was removed at some point but this is the op at the spot in the list
|
||||
OP_AAExpUpdate=0x642f #need to look into whether this has changed; exp did
|
||||
OP_ExpUpdate=0x611d
|
||||
OP_HPUpdate=0x775c
|
||||
OP_ManaChange=0x700f
|
||||
OP_TGB=0x0000 #removed; tgb is baked in and always on
|
||||
OP_SpecialMesg=0x7d93
|
||||
OP_CharInventory=0x21d6
|
||||
OP_WearChange=0x44c0
|
||||
OP_ClientUpdate=0x3a4b
|
||||
OP_ClientReady=0x0831
|
||||
OP_SetServerFilter=0x6b7f
|
||||
|
||||
# Guild Opcodes
|
||||
OP_GuildsList=0x0000
|
||||
OP_GuildMemberList=0x0000
|
||||
OP_GuildMOTD=0x0000
|
||||
OP_GetGuildMOTD=0x0000
|
||||
OP_GetGuildMOTDReply=0x0000
|
||||
OP_GuildMemberUpdate=0x0000
|
||||
OP_GuildInvite=0x0000
|
||||
OP_GuildRemove=0x0000
|
||||
OP_GuildPeace=0x0000
|
||||
OP_SetGuildMOTD=0x0000
|
||||
OP_GuildWar=0x0000
|
||||
OP_GuildLeader=0x0000
|
||||
OP_GuildDelete=0x0000
|
||||
OP_GuildInviteAccept=0x0000
|
||||
OP_GuildDemote=0x0000
|
||||
OP_GuildPromote=0x0000
|
||||
OP_GuildPublicNote=0x0000
|
||||
OP_GuildManageBanker=0x0000
|
||||
OP_GuildBank=0x0000
|
||||
OP_GuildBankItemList=0x0000
|
||||
OP_SetGuildRank=0x0000
|
||||
OP_GuildUpdate=0x0000
|
||||
OP_GuildStatus=0x0000
|
||||
OP_GuildCreate=0x0000
|
||||
OP_GuildOpenGuildWindow=0x0000
|
||||
OP_GuildMemberLevel=0x0000
|
||||
OP_GuildMemberRankAltBanker=0x0000
|
||||
OP_GuildMemberPublicNote=0x0000
|
||||
OP_GuildMemberAdd=0x0000
|
||||
OP_GuildMemberRename=0x0000
|
||||
OP_GuildMemberDelete=0x0000
|
||||
OP_GuildMemberDetails=0x0000
|
||||
OP_GuildRenameGuild=0x0000
|
||||
OP_LFGuild=0x0000
|
||||
OP_GuildDeleteGuild=0x0000
|
||||
|
||||
# GM/Guide Opcodes
|
||||
OP_GMServers=0x0000
|
||||
OP_GMBecomeNPC=0x0000
|
||||
OP_GMZoneRequest=0x0000
|
||||
OP_GMZoneRequest2=0x0000
|
||||
OP_GMGoto=0x0000
|
||||
OP_GMSearchCorpse=0x0000
|
||||
OP_GMHideMe=0x0000
|
||||
OP_GMDelCorpse=0x0000
|
||||
OP_GMApproval=0x0000
|
||||
OP_GMToggle=0x0000
|
||||
OP_GMSummon=0x0000
|
||||
OP_GMEmoteZone=0x0000
|
||||
OP_GMEmoteWorld=0x0000
|
||||
OP_GMFind=0x0000
|
||||
OP_GMKick=0x0000
|
||||
OP_GMKill=0x0000
|
||||
OP_GMNameChange=0x0000
|
||||
OP_GMLastName=0x0000
|
||||
|
||||
# Misc Opcodes
|
||||
OP_QueryUCSServerStatus=0x2570
|
||||
OP_InspectRequest=0x0000
|
||||
OP_InspectAnswer=0x0000
|
||||
OP_InspectMessageUpdate=0x0000
|
||||
OP_BeginCast=0x31f9
|
||||
OP_ColoredText=0x0f3c
|
||||
OP_ConsentResponse=0x3229
|
||||
OP_MemorizeSpell=0x1d31
|
||||
OP_LinkedReuse=0x7a8e
|
||||
OP_SwapSpell=0x63c7
|
||||
OP_CastSpell=0x325b
|
||||
OP_Consider=0x53e3
|
||||
OP_FormattedMessage=0x7f7f
|
||||
OP_SimpleMessage=0x1943
|
||||
OP_Buff=0x6ce5
|
||||
OP_Illusion=0x5a3f
|
||||
OP_MoneyOnCorpse=0x39d3
|
||||
OP_RandomReply=0x6603
|
||||
OP_DenyResponse=0x3f2c
|
||||
OP_SkillUpdate=0x6735
|
||||
OP_GMTrainSkillConfirm=0x6fbc
|
||||
OP_RandomReq=0x528a
|
||||
OP_Death=0x429a
|
||||
OP_GMTraining=0x7c7a
|
||||
OP_GMEndTraining=0x3ec6
|
||||
OP_GMTrainSkill=0x54e1
|
||||
OP_Animation=0x79c7
|
||||
OP_Begging=0x7ded
|
||||
OP_Consent=0x44fc
|
||||
OP_ConsentDeny=0x3df9
|
||||
OP_AutoFire=0x5280
|
||||
OP_PetCommands=0x0000
|
||||
OP_PetCommandState=0x0000
|
||||
OP_PetHoTT=0x0000
|
||||
OP_DeleteSpell=0x4281
|
||||
OP_Surname=0x0000
|
||||
OP_ClearSurname=0x0000
|
||||
OP_FaceChange=0x0000
|
||||
OP_SetFace=0x0000
|
||||
OP_SenseHeading=0x6fcf
|
||||
OP_Action=0x4c13
|
||||
OP_ConsiderCorpse=0x6092
|
||||
OP_HideCorpse=0x3f5c
|
||||
OP_CorpseDrag=0x234d
|
||||
OP_CorpseDrop=0x4342
|
||||
OP_Bug=0x770b
|
||||
OP_Feedback=0x0000
|
||||
OP_Report=0x5bcf
|
||||
OP_Damage=0x7d07
|
||||
OP_ChannelMessage=0x6adc
|
||||
OP_Assist=0x51f1
|
||||
OP_AssistGroup=0x3f23
|
||||
OP_MoveCoin=0x4e6a
|
||||
OP_ZonePlayerToBind=0x5643
|
||||
OP_KeyRing=0x0000
|
||||
OP_WhoAllRequest=0x2a09
|
||||
OP_WhoAllResponse=0x6404
|
||||
OP_FriendsWho=0x75a2
|
||||
OP_ConfirmDelete=0x4dd0
|
||||
OP_Logout=0x771d
|
||||
OP_Rewind=0x2b19
|
||||
OP_TargetCommand=0x3b18
|
||||
OP_Hide=0x1cdf
|
||||
OP_Jump=0x6fa0
|
||||
OP_Camp=0x326f
|
||||
OP_Emote=0x0000
|
||||
OP_SetRunMode=0x1449
|
||||
OP_BankerChange=0x2a33
|
||||
OP_TargetMouse=0x5741
|
||||
OP_MobHealth=0x5b77
|
||||
OP_InitialMobHealth=0x0000 # Unused?
|
||||
OP_TargetHoTT=0x0000
|
||||
OP_TargetBuffs=0x0000
|
||||
OP_XTargetResponse=0x0000
|
||||
OP_XTargetRequest=0x0000
|
||||
OP_XTargetAutoAddHaters=0x0000
|
||||
OP_XTargetOpen=0x0000
|
||||
OP_XTargetOpenResponse=0x0000
|
||||
OP_BuffCreate=0x27a1
|
||||
OP_BuffRemoveRequest=0x4507
|
||||
OP_DeleteSpawn=0x7712
|
||||
OP_AutoAttack=0x3f03
|
||||
OP_AutoAttack2=0x1c31
|
||||
OP_Consume=0x5ef7
|
||||
OP_MoveItem=0x11e3
|
||||
OP_MoveMultipleItems=0x5205
|
||||
OP_DeleteItem=0x0150
|
||||
OP_DeleteCharge=0x1b7e
|
||||
OP_ItemPacket=0x7d43
|
||||
OP_ItemLinkResponse=0x0000
|
||||
OP_ItemLinkClick=0x0000
|
||||
OP_ItemPreview=0x0000
|
||||
OP_NewSpawn=0x3ea8
|
||||
OP_Track=0x5351
|
||||
OP_TrackTarget=0x611a
|
||||
OP_TrackUnknown=0x2c7a
|
||||
OP_ClickDoor=0x733c
|
||||
OP_MoveDoor=0x567c
|
||||
OP_RemoveAllDoors=0x73e8
|
||||
OP_EnvDamage=0x1ffd
|
||||
OP_BoardBoat=0x7015
|
||||
OP_LeaveBoat=0x2486
|
||||
OP_ControlBoat=0x166f
|
||||
OP_Forage=0x4c52
|
||||
OP_SafeFallSuccess=0x6690
|
||||
OP_RezzComplete=0x0000
|
||||
OP_RezzRequest=0x0000
|
||||
OP_RezzAnswer=0x0000
|
||||
OP_Shielding=0x0000
|
||||
OP_RequestDuel=0x0000
|
||||
OP_MobRename=0x0000
|
||||
OP_AugmentItem=0x3a1b
|
||||
OP_WeaponEquip1=0x0000
|
||||
OP_PlayerStateAdd=0x2178
|
||||
OP_PlayerStateRemove=0x178e
|
||||
OP_ApplyPoison=0x55b9
|
||||
OP_Save=0x6da2
|
||||
OP_TestBuff=0x0000
|
||||
OP_CustomTitles=0x0000
|
||||
OP_Split=0x7f6e
|
||||
OP_YellForHelp=0x5fc9
|
||||
OP_LoadSpellSet=0x0000
|
||||
OP_Bandolier=0x0000
|
||||
OP_PotionBelt=0x0000
|
||||
OP_DuelDecline=0x0000
|
||||
OP_DuelAccept=0x0000
|
||||
OP_SaveOnZoneReq=0x3bfe
|
||||
OP_ReadBook=0x51af
|
||||
OP_Dye=0x0000
|
||||
OP_InterruptCast=0x1d71
|
||||
OP_AAAction=0x71BB
|
||||
OP_LeadershipExpToggle=0x0000 #removed, these act as if all purchased now
|
||||
OP_LeadershipExpUpdate=0x0000 #removed, these act as if all purchased now
|
||||
OP_PurchaseLeadershipAA=0x0000 #removed, these act as if all purchased now
|
||||
OP_UpdateLeadershipAA=0x0000 #removed, these act as if all purchased now
|
||||
OP_MarkNPC=0x0000
|
||||
OP_ClearNPCMarks=0x0000
|
||||
OP_DelegateAbility=0x0000
|
||||
OP_SetGroupTarget=0x0000
|
||||
OP_Charm=0x66bb
|
||||
OP_Stun=0x34be
|
||||
OP_SendFindableNPCs=0x0000
|
||||
OP_FindPersonRequest=0x0000
|
||||
OP_FindPersonReply=0x0000
|
||||
OP_Sound=0x2fa8
|
||||
OP_CashReward=0x5e23
|
||||
OP_PetBuffWindow=0x0000
|
||||
OP_LevelAppearance=0x5d24
|
||||
OP_Translocate=0x2772
|
||||
OP_Sacrifice=0x2cbf
|
||||
OP_PopupResponse=0x6be9
|
||||
OP_OnLevelMessage=0x2a41
|
||||
OP_AugmentInfo=0x2e11
|
||||
OP_Petition=0x0000
|
||||
OP_SomeItemPacketMaybe=0x0000
|
||||
OP_PVPStats=0x0000
|
||||
OP_PVPLeaderBoardRequest=0x0000
|
||||
OP_PVPLeaderBoardReply=0x0000
|
||||
OP_PVPLeaderBoardDetailsRequest=0x0000
|
||||
OP_PVPLeaderBoardDetailsReply=0x0000
|
||||
OP_RestState=0x0a92
|
||||
OP_RespawnWindow=0x55ed
|
||||
OP_LDoNButton=0x0000
|
||||
OP_SetStartCity=0x0000
|
||||
OP_VoiceMacroIn=0x703f
|
||||
OP_VoiceMacroOut=0x72d1
|
||||
OP_ItemViewUnknown=0x0000
|
||||
OP_VetRewardsAvaliable=0x0000
|
||||
OP_VetClaimRequest=0x0000
|
||||
OP_VetClaimReply=0x0000
|
||||
OP_DisciplineUpdate=0x6ce4
|
||||
OP_DisciplineTimer=0x7436
|
||||
OP_BecomeCorpse=0x0000 # Unused?
|
||||
OP_Action2=0x0000 # Unused?
|
||||
OP_MobUpdate=0x0000
|
||||
OP_NPCMoveUpdate=0x0000
|
||||
OP_CameraEffect=0x2f01
|
||||
OP_SpellEffect=0x7378
|
||||
OP_AddNimbusEffect=0x069f
|
||||
OP_RemoveNimbusEffect=0x19ee
|
||||
OP_AltCurrency=0x0000
|
||||
OP_AltCurrencyMerchantRequest=0x0000
|
||||
OP_AltCurrencyMerchantReply=0x0000
|
||||
OP_AltCurrencyPurchase=0x0000
|
||||
OP_AltCurrencySell=0x0000
|
||||
OP_AltCurrencySellSelection=0x0000
|
||||
OP_AltCurrencyReclaim=0x0000
|
||||
OP_CrystalCountUpdate=0x0000
|
||||
OP_CrystalCreate=0x0000
|
||||
OP_CrystalReclaim=0x0000
|
||||
OP_Untargetable=0x026f
|
||||
OP_IncreaseStats=0x1005
|
||||
OP_Weblink=0x16a3
|
||||
OP_OpenContainer=0x6758
|
||||
OP_Marquee=0x6bca
|
||||
OP_ItemRecastDelay=0x547a
|
||||
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
|
||||
OP_ResetAA=0x53c0
|
||||
OP_Fling=0x3731
|
||||
OP_CancelSneakHide=0x7452
|
||||
OP_AggroMeterLockTarget=0x0000
|
||||
OP_AggroMeterTargetInfo=0x0000
|
||||
OP_AggroMeterUpdate=0x0000
|
||||
OP_UnderWorld=0x4ca9 # clients sends up when they detect an underworld issue, might be useful for cheat detection
|
||||
OP_KickPlayers=0x7154
|
||||
OP_BookButton=0x014d
|
||||
|
||||
# Expeditions
|
||||
OP_DzQuit=0x0000
|
||||
OP_DzListTimers=0x0000
|
||||
OP_DzAddPlayer=0x0000
|
||||
OP_DzRemovePlayer=0x0000
|
||||
OP_DzSwapPlayer=0x0000
|
||||
OP_DzMakeLeader=0x0000
|
||||
OP_DzPlayerList=0x0000
|
||||
OP_DzExpeditionInvite=0x0000
|
||||
OP_DzExpeditionInviteResponse=0x0000
|
||||
OP_DzExpeditionInfo=0x0000
|
||||
OP_DzExpeditionLockoutTimers=0x0000
|
||||
OP_DzMemberList=0x0000
|
||||
OP_DzMemberListName=0x0000
|
||||
OP_DzMemberListStatus=0x0000
|
||||
OP_DzSetLeaderName=0x0000
|
||||
OP_DzExpeditionEndsWarning=0x0000
|
||||
OP_DzCompass=0x0000
|
||||
OP_DzChooseZone=0x0000
|
||||
OP_DzChooseZoneReply=0x0000
|
||||
|
||||
# New Opcodes
|
||||
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
|
||||
OP_ManaUpdate=0x0000
|
||||
OP_EnduranceUpdate=0x0000
|
||||
OP_MobManaUpdate=0x0000
|
||||
OP_MobEnduranceUpdate=0x0000
|
||||
|
||||
# Mercenary Opcodes
|
||||
OP_MercenaryDataUpdateRequest=0x0000
|
||||
OP_MercenaryDataUpdate=0x0000
|
||||
OP_MercenaryDataRequest=0x0000
|
||||
OP_MercenaryDataResponse=0x0000
|
||||
OP_MercenaryHire=0x0000
|
||||
OP_MercenaryDismiss=0x0000
|
||||
OP_MercenaryTimerRequest=0x0000
|
||||
OP_MercenaryTimer=0x0000
|
||||
OP_MercenaryUnknown1=0x0000
|
||||
OP_MercenaryCommand=0x0000
|
||||
OP_MercenarySuspendRequest=0x0000
|
||||
OP_MercenarySuspendResponse=0x0000
|
||||
OP_MercenaryUnsuspendResponse=0x0000
|
||||
|
||||
# Looting
|
||||
OP_LootRequest=0x60e5
|
||||
OP_EndLootRequest=0x35f6
|
||||
OP_LootItem=0x0856
|
||||
OP_LootComplete=0x1f5e
|
||||
|
||||
# bazaar trader stuff:
|
||||
OP_BazaarSearch=0x0000
|
||||
OP_TraderDelItem=0x0000
|
||||
OP_BecomeTrader=0x0000
|
||||
OP_TraderShop=0x0000
|
||||
OP_TraderBulkSend=0x0000
|
||||
OP_Trader=0x0000
|
||||
OP_Barter=0x0000
|
||||
OP_BuyerItems=0x0000
|
||||
OP_TraderBuy=0x0000
|
||||
OP_ShopItem=0x0000
|
||||
OP_BazaarInspect=0x0000
|
||||
OP_Bazaar=0x0000
|
||||
OP_TraderItemUpdate=0x0000
|
||||
|
||||
# pc/npc trading
|
||||
OP_TradeRequest=0x7066
|
||||
OP_TradeAcceptClick=0x34ad
|
||||
OP_TradeRequestAck=0x1c6b
|
||||
OP_TradeCoins=0x44fe
|
||||
OP_FinishTrade=0x0ec6
|
||||
OP_CancelTrade=0x5839
|
||||
OP_TradeMoneyUpdate=0x5fb3
|
||||
OP_MoneyUpdate=0x70bb
|
||||
OP_TradeBusy=0x109f
|
||||
|
||||
# Sent after canceling trade or after closing tradeskill object
|
||||
OP_FinishWindow=0x50d4
|
||||
OP_FinishWindow2=0x6b03
|
||||
|
||||
# Sent on Live for what seems to be item existance verification
|
||||
# Ex. Before Right Click Effect happens from items
|
||||
OP_ItemVerifyRequest=0x2003
|
||||
OP_ItemVerifyReply=0x43d0
|
||||
|
||||
OP_ItemAdvancedLoreText=0x0000
|
||||
|
||||
# merchant stuff
|
||||
OP_ShopPlayerSell=0x6489
|
||||
OP_ShopRequest=0x840
|
||||
OP_ShopEnd=0x74bb
|
||||
OP_ShopEndConfirm=0x2ed1
|
||||
OP_ShopPlayerBuy=0x625e
|
||||
OP_ShopDelItem=0x4ce4
|
||||
OP_ShopSendParcel=0x0f16
|
||||
OP_ShopDeleteParcel=0x4e2a
|
||||
OP_ShopRetrieveParcel=0x27d1
|
||||
OP_ShopParcelIcon=0x4f27
|
||||
|
||||
# tradeskill stuff:
|
||||
OP_ClickObject=0x687e
|
||||
OP_ClickObjectAction=0x110f
|
||||
OP_ClearObject=0x6155
|
||||
OP_RecipeDetails=0x01e7
|
||||
OP_RecipesFavorite=0x0495
|
||||
OP_RecipesSearch=0x2f4e
|
||||
OP_RecipeReply=0x2cd2
|
||||
OP_RecipeAutoCombine=0x5dba
|
||||
OP_TradeSkillCombine=0x4ed8
|
||||
|
||||
# Tribute Packets:
|
||||
OP_TributeUpdate=0x0000
|
||||
OP_TributeTimer=0x0000
|
||||
OP_SendTributes=0x0000
|
||||
OP_RequestGuildTributes=0x0000
|
||||
OP_TributeInfo=0x0000
|
||||
OP_OpenTributeMaster=0x0000
|
||||
OP_SelectTribute=0x0000
|
||||
OP_TributeItem=0x0000
|
||||
OP_TributeMoney=0x0000
|
||||
OP_TributeToggle=0x0000
|
||||
OP_TributePointUpdate=0x0000
|
||||
OP_TributeNPC=0x0000
|
||||
OP_GuildTributeInfo=0x0000
|
||||
OP_OpenTributeReply=0x0000
|
||||
OP_GuildTributeStatus=0x0000
|
||||
OP_GuildSaveActiveTributes=0x0000
|
||||
OP_GuildSendActiveTributes=0x0000
|
||||
OP_GuildTributeToggleReq=0x0000
|
||||
OP_GuildTributeToggleReply=0x0000
|
||||
OP_GuildTributeFavorAndTimer=0x0000
|
||||
OP_GuildTributeDonateItem=0x0000
|
||||
OP_GuildTributeDonatePlat=0x0000
|
||||
OP_GuildSelectTribute=0x0000
|
||||
OP_GuildModifyBenefits=0x0000
|
||||
OP_GuildOptInOut=0x0000
|
||||
OP_SendGuildTributes=0x0000
|
||||
OP_OpenGuildTributeMaster=0x0000
|
||||
|
||||
# Adventure packets:
|
||||
OP_LeaveAdventure=0x0000
|
||||
OP_AdventureFinish=0x0000
|
||||
OP_AdventureInfoRequest=0x0000
|
||||
OP_AdventureInfo=0x0000
|
||||
OP_AdventureRequest=0x0000
|
||||
OP_AdventureDetails=0x0000
|
||||
OP_AdventureData=0x0000
|
||||
OP_AdventureUpdate=0x0000
|
||||
OP_AdventureMerchantRequest=0x0000
|
||||
OP_AdventureMerchantResponse=0x0000
|
||||
OP_AdventureMerchantPurchase=0x0000
|
||||
OP_AdventureMerchantSell=0x0000
|
||||
OP_AdventurePointsUpdate=0x0000
|
||||
OP_AdventureStatsRequest=0x0000
|
||||
OP_AdventureStatsReply=0x0000
|
||||
OP_AdventureLeaderboardRequest=0x0000
|
||||
OP_AdventureLeaderboardReply=0x0000
|
||||
|
||||
# Group Opcodes
|
||||
OP_GroupDisband=0x78ef
|
||||
OP_GroupInvite=0x1d90
|
||||
OP_GroupFollow=0x0000
|
||||
OP_GroupUpdate=0x0000
|
||||
OP_GroupUpdateB=0x0000
|
||||
OP_GroupCancelInvite=0x0000
|
||||
OP_GroupAcknowledge=0x0000
|
||||
OP_GroupDelete=0x0000
|
||||
OP_CancelInvite=0x0000
|
||||
OP_GroupFollow2=0x0000
|
||||
OP_GroupInvite2=0x1e7e
|
||||
OP_GroupDisbandYou=0x0000
|
||||
OP_GroupDisbandOther=0x0000
|
||||
OP_GroupLeaderChange=0x0000
|
||||
OP_GroupRoles=0x0000
|
||||
OP_GroupMakeLeader=0x0000
|
||||
OP_DoGroupLeadershipAbility=0x0000
|
||||
OP_GroupLeadershipAAUpdate=0x0000 # removed these act as if you have always purchased them
|
||||
OP_GroupMentor=0x0000
|
||||
OP_InspectBuffs=0x0000
|
||||
|
||||
# LFG/LFP Opcodes
|
||||
OP_LFGCommand=0x0000
|
||||
OP_LFGGetMatchesRequest=0x0000
|
||||
OP_LFGGetMatchesResponse=0x0000
|
||||
OP_LFPGetMatchesRequest=0x0000
|
||||
OP_LFPGetMatchesResponse=0x0000
|
||||
OP_LFPCommand=0x0000
|
||||
OP_LFGAppearance=0x0000
|
||||
OP_LFGResponse=0x0000
|
||||
|
||||
# Raid Opcodes
|
||||
OP_RaidInvite=0x0000
|
||||
OP_RaidUpdate=0x0000
|
||||
OP_RaidJoin=0x0000
|
||||
OP_RaidDelegateAbility=0x0000
|
||||
OP_MarkRaidNPC=0x0000
|
||||
OP_RaidClearNPCMarks=0x0000
|
||||
|
||||
# Button-push commands
|
||||
OP_Taunt=0x5064
|
||||
OP_CombatAbility=0xbf
|
||||
OP_SenseTraps=0x579c
|
||||
OP_PickPocket=0x53d1
|
||||
OP_DisarmTraps=0x21bf
|
||||
OP_Disarm=0x31e9
|
||||
OP_Sneak=0x78a7
|
||||
OP_Fishing=0x57cc
|
||||
OP_InstillDoubt=0x57cc
|
||||
OP_FeignDeath=0x14b8
|
||||
OP_Mend=0x6b8
|
||||
OP_Bind_Wound=0x650e
|
||||
OP_LDoNOpen=0x448
|
||||
OP_LDoNPickLock=0x61c8
|
||||
OP_LDoNInspect=0xc1c
|
||||
|
||||
# Task packets
|
||||
OP_TaskDescription=0x0000
|
||||
OP_TaskActivity=0x0000
|
||||
OP_CompletedTasks=0x0000
|
||||
OP_TaskActivityComplete=0x0000
|
||||
OP_AcceptNewTask=0x0000
|
||||
OP_CancelTask=0x0000
|
||||
OP_AvaliableTask=0x0000
|
||||
OP_TaskHistoryRequest=0x0000
|
||||
OP_TaskHistoryReply=0x0000
|
||||
OP_DeclineAllTasks=0x0000
|
||||
OP_TaskRequestTimer=0x0000
|
||||
OP_TaskSelectWindow=0x0000
|
||||
|
||||
# Shared Tasks
|
||||
OP_SharedTaskMemberList=0x0000 #
|
||||
OP_SharedTaskRemovePlayer=0x0000 # /taskremoveplayer
|
||||
OP_SharedTaskAddPlayer=0x0000 # /taskaddplayer
|
||||
OP_SharedTaskMakeLeader=0x0000 # /taskmakeleader
|
||||
OP_SharedTaskInvite=0x0000 # Dialog window
|
||||
OP_SharedTaskInviteResponse=0x0000 # Dialog window response
|
||||
OP_SharedTaskAcceptNew=0x0000 #
|
||||
OP_SharedTaskMemberChange=0x0000 #
|
||||
OP_TaskTimers=0x0000 # /tasktimers
|
||||
OP_SharedTaskQuit=0x0000 # /taskquit
|
||||
OP_SharedTaskSelectWindow=0x0000
|
||||
OP_SharedTaskPlayerList=0x0000 # /taskplayerlist
|
||||
|
||||
# Title opcodes
|
||||
OP_NewTitlesAvailable=0x0000
|
||||
OP_RequestTitles=0x0000
|
||||
OP_SendTitleList=0x0000
|
||||
OP_SetTitle=0x0000
|
||||
OP_SetTitleReply=0x0000
|
||||
|
||||
# mail opcodes
|
||||
OP_Command=0x0000
|
||||
OP_MailboxHeader=0x0000
|
||||
OP_MailHeader=0x0000
|
||||
OP_MailBody=0x0000
|
||||
OP_NewMail=0x0000
|
||||
OP_SentConfirm=0x0000
|
||||
|
||||
########### Below this point should not be needed ###########
|
||||
|
||||
# This section are all unknown in Titanium
|
||||
OP_ForceFindPerson=0x0000
|
||||
OP_LocInfo=0x0000
|
||||
OP_ReloadUI=0x0000
|
||||
OP_ItemName=0x0000
|
||||
OP_ItemLinkText=0x0000
|
||||
OP_MultiLineMsg=0x0000
|
||||
OP_MendHPUpdate=0x0000
|
||||
OP_TargetReject=0x0000
|
||||
OP_SafePoint=0x0000
|
||||
OP_ApproveZone=0x0000
|
||||
OP_ZoneComplete=0x0000
|
||||
OP_ClientError=0x0000
|
||||
OP_DumpName=0x0000
|
||||
OP_Heartbeat=0x0000
|
||||
OP_CrashDump=0x0000
|
||||
OP_LoginComplete=0x0000
|
||||
|
||||
# discovered opcodes not yet used:
|
||||
OP_PickLockSuccess=0x0000
|
||||
OP_PlayMP3=0x6451
|
||||
OP_ReclaimCrystals=0x0000
|
||||
OP_DynamicWall=0x0000
|
||||
OP_OpenDiscordMerchant=0x0000
|
||||
OP_DiscordMerchantInventory=0x0000
|
||||
OP_GiveMoney=0x0000
|
||||
OP_RequestKnowledgeBase=0x0000
|
||||
OP_KnowledgeBase=0x0000
|
||||
OP_SlashAdventure=0x0000 # /adventure
|
||||
OP_BecomePVPPrompt=0x0000
|
||||
OP_MoveLogRequest=0x0000 # gone I think
|
||||
OP_MoveLogDisregard=0x0000 # gone I think
|
||||
|
||||
# named unknowns, to make looking for real unknown easier
|
||||
OP_AnnoyingZoneUnknown=0x0000
|
||||
OP_Some6ByteHPUpdate=0x0000 #seems to happen when you target group members
|
||||
OP_QueryResponseThing=0x0000
|
||||
|
||||
|
||||
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
|
||||
#OP_LoginUnknown1=0x0000 # OP_SendSpellChecksum
|
||||
#OP_LoginUnknown2=0x0000 # OP_SendSkillCapsChecksum
|
||||
|
||||
# Petition Opcodes
|
||||
OP_PetitionSearch=0x0000 #search term for petition
|
||||
OP_PetitionSearchResults=0x0000 #(list of?) matches from search
|
||||
OP_PetitionSearchText=0x0000 #text results of search
|
||||
|
||||
OP_PetitionUpdate=0x0000
|
||||
OP_PetitionCheckout=0x0000
|
||||
OP_PetitionCheckIn=0x0000
|
||||
OP_PetitionQue=0x0000
|
||||
OP_PetitionUnCheckout=0x0000
|
||||
OP_PetitionDelete=0x0000
|
||||
OP_DeletePetition=0x0000
|
||||
OP_PetitionResolve=0x0000
|
||||
OP_PDeletePetition=0x0000
|
||||
OP_PetitionBug=0x0000
|
||||
OP_PetitionRefresh=0x0000
|
||||
OP_PetitionCheckout2=0x0000
|
||||
OP_PetitionViewPetition=0x0000
|
||||
|
||||
#aura related
|
||||
OP_UpdateAura=0x0000
|
||||
OP_RemoveTrap=0x0000
|
||||
|
||||
OP_Fingerprint=0x7a5b
|
||||
@ -1223,8 +1223,10 @@ bool Client::Process() {
|
||||
}
|
||||
|
||||
if(connect.Check()){
|
||||
SendGuildList();// Send OPCode: OP_GuildsList
|
||||
SendApproveWorld();
|
||||
if (!(m_ClientVersionBit & EQ::versions::maskLaurionAndLater)) {
|
||||
SendGuildList();// Send OPCode: OP_GuildsList
|
||||
SendApproveWorld();
|
||||
}
|
||||
connect.Disable();
|
||||
}
|
||||
|
||||
|
||||
@ -1205,7 +1205,7 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
||||
LogDebug("Client::ChannelMessageReceived() Channel:[{}] message:[{}]", chan_num, message);
|
||||
|
||||
if (RuleB(Chat, AlwaysCaptureCommandText)) {
|
||||
if (message[0] == COMMAND_CHAR) {
|
||||
if (message[0] == COMMAND_CHAR || message[0] == COMMAND_CHAR_NON_HASH) {
|
||||
if (command_dispatch(this, message, false) == -2) {
|
||||
if (parse->PlayerHasQuestSub(EVENT_COMMAND)) {
|
||||
int i = parse->EventPlayer(EVENT_COMMAND, this, message, 0);
|
||||
@ -1538,7 +1538,7 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
||||
}
|
||||
}
|
||||
|
||||
if (message[0] == COMMAND_CHAR) {
|
||||
if (message[0] == COMMAND_CHAR || message[0] == COMMAND_CHAR_NON_HASH) {
|
||||
if (command_dispatch(this, message, false) == -2) {
|
||||
if (parse->PlayerHasQuestSub(EVENT_COMMAND)) {
|
||||
int i = parse->EventPlayer(EVENT_COMMAND, this, message, 0);
|
||||
@ -8083,7 +8083,7 @@ void Client::GarbleMessage(char *message, uint8 variance)
|
||||
int delimiter_count = 0;
|
||||
|
||||
// Don't garble # commands
|
||||
if (message[0] == COMMAND_CHAR || message[0] == BOT_COMMAND_CHAR) {
|
||||
if (message[0] == COMMAND_CHAR || message[0] == COMMAND_CHAR_NON_HASH || message[0] == BOT_COMMAND_CHAR) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -9158,6 +9158,44 @@ void Client::SendHPUpdateMarquee(){
|
||||
SendMarqueeMessage(Chat::Yellow, 510, 0, 3000, 3000, health_update_notification);
|
||||
}
|
||||
|
||||
void Client::SendMembership() {
|
||||
if (m_ClientVersion >= EQ::versions::ClientVersion::Laurion) {
|
||||
auto outapp = new EQApplicationPacket(OP_SendMembership, sizeof(Membership_Struct));
|
||||
Membership_Struct* mc = (Membership_Struct*)outapp->pBuffer;
|
||||
|
||||
mc->membership = 2; //Hardcode to gold for now. We don't use anything else.
|
||||
mc->races = 0x1ffff; // Available Races (4110 for silver)
|
||||
mc->classes = 0x1ffff; // Available Classes (4614 for silver) - Was 0x101ffff
|
||||
mc->entrysize = 21; // Number of membership setting entries below
|
||||
mc->entries[0] = 0xffffffff; // Max AA Restriction
|
||||
mc->entries[1] = 0xffffffff; // Max Level Restriction
|
||||
mc->entries[2] = 0xffffffff; // Max Char Slots per Account (not used by client?)
|
||||
mc->entries[3] = 0xffffffff; // 1 for Silver
|
||||
mc->entries[4] = 0xffffffff; // Main Inventory Size (0xffffffff on Live for Gold, but limiting to 8 until 10 is supported)
|
||||
mc->entries[5] = 0xffffffff; // Max Platinum per level
|
||||
mc->entries[6] = 1; // 0 for Silver
|
||||
mc->entries[7] = 1; // 0 for Silver
|
||||
mc->entries[8] = 1; // 1 for Silver
|
||||
mc->entries[9] = 0xffffffff; // Unknown - Maybe Loyalty Points every 12 hours? 60 per week for Silver
|
||||
mc->entries[10] = 1; // 1 for Silver
|
||||
mc->entries[11] = 0xffffffff; // Shared Bank Slots
|
||||
mc->entries[12] = 0xffffffff; // Unknown - Maybe Max Active Tasks?
|
||||
mc->entries[13] = 1; // 1 for Silver
|
||||
mc->entries[14] = 1; // 0 for Silver
|
||||
mc->entries[15] = 1; // 0 for Silver
|
||||
mc->entries[16] = 1; // 1 for Silver
|
||||
mc->entries[17] = 1; // 0 for Silver
|
||||
mc->entries[18] = 1; // 0 for Silver
|
||||
mc->entries[19] = 0xffffffff; // 0 for Silver
|
||||
mc->entries[20] = 0xffffffff; // 0 for Silver
|
||||
mc->exit_url_length = 0;
|
||||
//mc->exit_url = 0; // Used on Live: "http://www.everquest.com/free-to-play/exit-silver"
|
||||
|
||||
QueuePacket(outapp);
|
||||
safe_delete(outapp);
|
||||
}
|
||||
}
|
||||
|
||||
uint32 Client::GetMoney(uint8 type, uint8 subtype) {
|
||||
uint32 value = 0;
|
||||
|
||||
|
||||
@ -1856,6 +1856,7 @@ public:
|
||||
void ResetHPUpdateTimer() { hpupdate_timer.Start(); }
|
||||
|
||||
void SendHPUpdateMarquee();
|
||||
void SendMembership();
|
||||
|
||||
void CheckRegionTypeChanges();
|
||||
|
||||
|
||||
@ -105,7 +105,6 @@ void MapOpcodes()
|
||||
ConnectingOpcodes[OP_ZoneEntry] = &Client::Handle_Connect_OP_ZoneEntry;
|
||||
|
||||
// connected opcode handler assignments:
|
||||
ConnectedOpcodes[OP_0x0193] = &Client::Handle_0x0193;
|
||||
ConnectedOpcodes[OP_AAAction] = &Client::Handle_OP_AAAction;
|
||||
ConnectedOpcodes[OP_AcceptNewTask] = &Client::Handle_OP_AcceptNewTask;
|
||||
ConnectedOpcodes[OP_AdventureInfoRequest] = &Client::Handle_OP_AdventureInfoRequest;
|
||||
@ -1704,10 +1703,8 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app)
|
||||
if ((m_pp.RestTimer > RuleI(Character, RestRegenTimeToActivate)) && (m_pp.RestTimer > RuleI(Character, RestRegenRaidTimeToActivate)))
|
||||
m_pp.RestTimer = 0;
|
||||
|
||||
/* This checksum should disappear once dynamic structs are in... each struct strategy will do it */ // looks to be in place now
|
||||
//CRC32::SetEQChecksum((unsigned char*)&m_pp, sizeof(PlayerProfile_Struct) - sizeof(m_pp.m_player_profile_version) - 4);
|
||||
// m_pp.checksum = 0; // All server out-bound player profile packets are now translated - no need to waste cycles calculating this...
|
||||
|
||||
SendMembership();
|
||||
|
||||
outapp = new EQApplicationPacket(OP_PlayerProfile, sizeof(PlayerProfile_Struct));
|
||||
|
||||
/* The entityid field in the Player Profile is used by the Client in relation to Group Leadership AA */
|
||||
@ -1881,16 +1878,6 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app)
|
||||
return;
|
||||
}
|
||||
|
||||
// connected opcode handlers
|
||||
void Client::Handle_0x0193(const EQApplicationPacket *app)
|
||||
{
|
||||
// Not sure what this opcode does. It started being sent when OP_ClientUpdate was
|
||||
// changed to pump OP_ClientUpdate back out instead of OP_MobUpdate
|
||||
// 2 bytes: 00 00
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void Client::Handle_OP_AAAction(const EQApplicationPacket *app)
|
||||
{
|
||||
LogAA("Received OP_AAAction");
|
||||
@ -4276,21 +4263,30 @@ void Client::Handle_OP_Camp(const EQApplicationPacket *app)
|
||||
|
||||
if (IsLFP())
|
||||
worldserver.StopLFP(CharacterID());
|
||||
|
||||
if (GetGM())
|
||||
{
|
||||
if (RuleB(Character, EnableHackedFastCampForGM))
|
||||
{
|
||||
camp_timer.Start(100, true);
|
||||
}
|
||||
else {
|
||||
OnDisconnect(true);
|
||||
|
||||
if (ClientVersion() >= EQ::versions::ClientVersion::SteamLatest) {
|
||||
if (!GetGM()) {
|
||||
camp_timer.Start(29000, true);
|
||||
}
|
||||
|
||||
return;
|
||||
auto outapp = new EQApplicationPacket(OP_Camp, 1);
|
||||
FastQueuePacket(&outapp);
|
||||
}
|
||||
else {
|
||||
if (GetGM())
|
||||
{
|
||||
if (RuleB(Character, EnableHackedFastCampForGM))
|
||||
{
|
||||
camp_timer.Start(100, true);
|
||||
}
|
||||
else {
|
||||
OnDisconnect(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
camp_timer.Start(29000, true);
|
||||
camp_timer.Start(29000, true);
|
||||
}
|
||||
|
||||
if (RuleB(Bots, Enabled)) {
|
||||
bot_camp_timer.Start((RuleI(Bots, CampTimer) * 1000), true);
|
||||
@ -14568,7 +14564,10 @@ void Client::Handle_OP_ShopRequest(const EQApplicationPacket *app)
|
||||
mco->rate = 1 / buy_cost_mod;
|
||||
}
|
||||
|
||||
outapp->priority = 6;
|
||||
if (m_ClientVersion >= EQ::versions::ClientVersion::SteamLatest) {
|
||||
mco->player_id = GetID();
|
||||
}
|
||||
|
||||
QueuePacket(outapp);
|
||||
safe_delete(outapp);
|
||||
|
||||
|
||||
@ -38,8 +38,6 @@
|
||||
void Handle_Connect_OP_ZoneComplete(const EQApplicationPacket *app);
|
||||
void Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app);
|
||||
/* Connected opcode handlers*/
|
||||
void Handle_0x0193(const EQApplicationPacket *app);
|
||||
void Handle_0x01e7(const EQApplicationPacket *app);
|
||||
void Handle_OP_AAAction(const EQApplicationPacket *app);
|
||||
void Handle_OP_AcceptNewTask(const EQApplicationPacket *app);
|
||||
void Handle_OP_AdventureInfoRequest(const EQApplicationPacket *app);
|
||||
|
||||
@ -25,6 +25,7 @@ class Client;
|
||||
class Seperator;
|
||||
|
||||
#define COMMAND_CHAR '#'
|
||||
#define COMMAND_CHAR_NON_HASH '$'
|
||||
|
||||
typedef void (*CmdFuncPtr)(Client *, const Seperator *);
|
||||
|
||||
|
||||
@ -693,8 +693,6 @@ luabind::scope lua_register_packet_opcodes() {
|
||||
luabind::value("ShopEndConfirm", static_cast<int>(OP_ShopEndConfirm)),
|
||||
luabind::value("AdventureMerchantRequest", static_cast<int>(OP_AdventureMerchantRequest)),
|
||||
luabind::value("Sound", static_cast<int>(OP_Sound)),
|
||||
luabind::value("0x0193", static_cast<int>(OP_0x0193)),
|
||||
luabind::value("0x0347", static_cast<int>(OP_0x0347)),
|
||||
luabind::value("WorldComplete", static_cast<int>(OP_WorldComplete)),
|
||||
luabind::value("MobRename", static_cast<int>(OP_MobRename)),
|
||||
luabind::value("TaskDescription", static_cast<int>(OP_TaskDescription)),
|
||||
|
||||
@ -1284,6 +1284,14 @@ void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho)
|
||||
strcpy(ns->spawn.name, name);
|
||||
if(IsClient()) {
|
||||
strn0cpy(ns->spawn.lastName, lastname, sizeof(ns->spawn.lastName));
|
||||
ns->spawn.CharacterGuid.Id = CastToClient()->CharacterID();
|
||||
ns->spawn.CharacterGuid.WorldId = RuleI(World, Id);
|
||||
ns->spawn.CharacterGuid.Reserved = 0;
|
||||
}
|
||||
else {
|
||||
ns->spawn.CharacterGuid.Id = 0;
|
||||
ns->spawn.CharacterGuid.WorldId = 0;
|
||||
ns->spawn.CharacterGuid.Reserved = 0;
|
||||
}
|
||||
|
||||
ns->spawn.heading = FloatToEQ12(m_Position.w);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user