mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-31 09:06:46 +00:00
Add Buff infrastructure to go through different logic paths from different patches (#5073)
This commit is contained in:
@@ -657,6 +657,7 @@ set(common_headers
|
|||||||
packet_dump_file.h
|
packet_dump_file.h
|
||||||
packet_dump.h
|
packet_dump.h
|
||||||
packet_functions.h
|
packet_functions.h
|
||||||
|
patches/IBuff.h
|
||||||
patches/IMessage.h
|
patches/IMessage.h
|
||||||
patches/client_version.h
|
patches/client_version.h
|
||||||
patches/patches.h
|
patches/patches.h
|
||||||
|
|||||||
@@ -7207,6 +7207,25 @@ ALTER TABLE `character_parcels_containers`
|
|||||||
)",
|
)",
|
||||||
.content_schema_update = false
|
.content_schema_update = false
|
||||||
},
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9329,
|
||||||
|
.description = "2026_04_27_spell_id_type_correction.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `character_spells` WHERE `Field` LIKE 'spell_id' AND `Type` LIKE 'int(%)'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `blocked_spells` MODIFY COLUMN `spellid` INTEGER NULL;
|
||||||
|
ALTER TABLE `character_buffs` MODIFY COLUMN `spell_id` INTEGER NOT NULL;
|
||||||
|
ALTER TABLE `character_memmed_spells` MODIFY COLUMN `spell_id` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE `character_spells` MODIFY COLUMN `spell_id` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE `damageshieldtypes` MODIFY COLUMN `spellid` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE `ldon_trap_templates` MODIFY COLUMN `spell_id` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE IF EXISTS `merc_buffs` MODIFY COLUMN `SpellId` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE IF EXISTS `merc_spell_list_entries` MODIFY COLUMN `spell_id` INTEGER NOT NULL;
|
||||||
|
ALTER TABLE `npc_spells_entries` MODIFY COLUMN `spellid` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE `spell_buckets` MODIFY COLUMN `spell_id` INTEGER NOT NULL;
|
||||||
|
)"
|
||||||
|
},
|
||||||
// -- template; copy/paste this when you need to create a new entry
|
// -- template; copy/paste this when you need to create a new entry
|
||||||
// ManifestEntry{
|
// ManifestEntry{
|
||||||
// .version = 9228,
|
// .version = 9228,
|
||||||
|
|||||||
@@ -2174,7 +2174,23 @@ FROM bot_settings
|
|||||||
WHERE `setting_id` = 0
|
WHERE `setting_id` = 0
|
||||||
AND `setting_type` = 0;
|
AND `setting_type` = 0;
|
||||||
)"
|
)"
|
||||||
}
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9056,
|
||||||
|
.description = "some_new_migration.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `table_name` LIKE 'column_name'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `bot_blocked_buffs` MODIFY COLUMN `spell_id` INTEGER NOT NULL;
|
||||||
|
ALTER TABLE `bot_buffs` MODIFY COLUMN `spell_id` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE `bot_pet_buffs` MODIFY COLUMN `spell_id` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE `bot_pets` MODIFY COLUMN `spell_id` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE `bot_spell_settings` MODIFY COLUMN `spell_id` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE `bot_spells_entries` MODIFY COLUMN `spell_id` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
ALTER TABLE `bot_timers` MODIFY COLUMN `spell_id` INTEGER NOT NULL DEFAULT 0;
|
||||||
|
)"
|
||||||
|
},
|
||||||
// -- template; copy/paste this when you need to create a new entry
|
// -- template; copy/paste this when you need to create a new entry
|
||||||
// ManifestEntry{
|
// ManifestEntry{
|
||||||
// .version = 9228,
|
// .version = 9228,
|
||||||
|
|||||||
+4
-4
@@ -78,8 +78,8 @@ N(OP_Bind_Wound),
|
|||||||
N(OP_BlockedBuffs),
|
N(OP_BlockedBuffs),
|
||||||
N(OP_BoardBoat),
|
N(OP_BoardBoat),
|
||||||
N(OP_BookButton),
|
N(OP_BookButton),
|
||||||
N(OP_Buff),
|
N(OP_BuffDefinition),
|
||||||
N(OP_BuffCreate),
|
N(OP_RefreshBuffs),
|
||||||
N(OP_BuffRemoveRequest),
|
N(OP_BuffRemoveRequest),
|
||||||
N(OP_Bug),
|
N(OP_Bug),
|
||||||
N(OP_BuyerItems),
|
N(OP_BuyerItems),
|
||||||
@@ -406,7 +406,7 @@ N(OP_OpenGuildTributeMaster),
|
|||||||
N(OP_OpenInventory),
|
N(OP_OpenInventory),
|
||||||
N(OP_OpenTributeMaster),
|
N(OP_OpenTributeMaster),
|
||||||
N(OP_PDeletePetition),
|
N(OP_PDeletePetition),
|
||||||
N(OP_PetBuffWindow),
|
N(OP_RefreshPetBuffs),
|
||||||
N(OP_PetCommands),
|
N(OP_PetCommands),
|
||||||
N(OP_PetCommandState),
|
N(OP_PetCommandState),
|
||||||
N(OP_PetHoTT),
|
N(OP_PetHoTT),
|
||||||
@@ -562,7 +562,7 @@ N(OP_Stun),
|
|||||||
N(OP_Surname),
|
N(OP_Surname),
|
||||||
N(OP_SwapSpell),
|
N(OP_SwapSpell),
|
||||||
N(OP_SystemFingerprint),
|
N(OP_SystemFingerprint),
|
||||||
N(OP_TargetBuffs),
|
N(OP_RefreshTargetBuffs),
|
||||||
N(OP_TargetCommand),
|
N(OP_TargetCommand),
|
||||||
N(OP_TargetHoTT),
|
N(OP_TargetHoTT),
|
||||||
N(OP_TargetMouse),
|
N(OP_TargetMouse),
|
||||||
|
|||||||
+18
-18
@@ -128,7 +128,7 @@ struct LDoNTrapTemplate
|
|||||||
{
|
{
|
||||||
uint32 id;
|
uint32 id;
|
||||||
LDoNChestTypes type;
|
LDoNChestTypes type;
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
uint16 skill;
|
uint16 skill;
|
||||||
uint8 locked;
|
uint8 locked;
|
||||||
};
|
};
|
||||||
@@ -422,7 +422,7 @@ struct NewZone_Struct {
|
|||||||
*/
|
*/
|
||||||
struct MemorizeSpell_Struct {
|
struct MemorizeSpell_Struct {
|
||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
int32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
uint32 reduction; // lower reuse
|
uint32 reduction; // lower reuse
|
||||||
};
|
};
|
||||||
@@ -471,7 +471,7 @@ struct ManaChange_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
/*04*/ uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
/*08*/ uint32 spell_id;
|
/*08*/ int32 spell_id;
|
||||||
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
/*16*/ int32 slot; // -1 normal, otherwise clear ETA and GCD
|
/*16*/ int32 slot; // -1 normal, otherwise clear ETA and GCD
|
||||||
@@ -489,14 +489,14 @@ struct BeginCast_Struct
|
|||||||
{
|
{
|
||||||
// len = 8
|
// len = 8
|
||||||
/*000*/ uint16 caster_id;
|
/*000*/ uint16 caster_id;
|
||||||
/*002*/ uint16 spell_id;
|
/*002*/ int16 spell_id;
|
||||||
/*004*/ uint32 cast_time; // in miliseconds
|
/*004*/ uint32 cast_time; // in miliseconds
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CastSpell_Struct
|
struct CastSpell_Struct
|
||||||
{
|
{
|
||||||
uint32 slot;
|
uint32 slot;
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
||||||
uint32 target_id;
|
uint32 target_id;
|
||||||
uint32 cs_unknown1;
|
uint32 cs_unknown1;
|
||||||
@@ -544,7 +544,7 @@ struct SpellBuff_Struct
|
|||||||
/*001*/ uint8 level;
|
/*001*/ uint8 level;
|
||||||
/*002*/ uint8 bard_modifier;
|
/*002*/ uint8 bard_modifier;
|
||||||
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking? -- OSX client calls this "activated"
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking? -- OSX client calls this "activated"
|
||||||
/*004*/ uint32 spellid;
|
/*004*/ int32 spellid;
|
||||||
/*008*/ int32 duration;
|
/*008*/ int32 duration;
|
||||||
/*012*/ uint32 counters; // single book keeping value (counters, rune/vie)
|
/*012*/ uint32 counters; // single book keeping value (counters, rune/vie)
|
||||||
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
@@ -574,7 +574,7 @@ struct BuffRemoveRequest_Struct
|
|||||||
|
|
||||||
struct PetBuff_Struct {
|
struct PetBuff_Struct {
|
||||||
/*000*/ uint32 petid;
|
/*000*/ uint32 petid;
|
||||||
/*004*/ uint32 spellid[PET_BUFF_COUNT];
|
/*004*/ int32 spellid[PET_BUFF_COUNT];
|
||||||
/*124*/ int32 ticsremaining[PET_BUFF_COUNT];
|
/*124*/ int32 ticsremaining[PET_BUFF_COUNT];
|
||||||
/*244*/ uint32 buffcount;
|
/*244*/ uint32 buffcount;
|
||||||
};
|
};
|
||||||
@@ -875,7 +875,7 @@ struct BindStruct {
|
|||||||
|
|
||||||
struct SuspendedMinion_Struct
|
struct SuspendedMinion_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint16 SpellID;
|
/*000*/ int16 SpellID;
|
||||||
/*002*/ uint32 HP;
|
/*002*/ uint32 HP;
|
||||||
/*006*/ uint32 Mana;
|
/*006*/ uint32 Mana;
|
||||||
/*010*/ SpellBuff_Struct Buffs[BUFF_COUNT];
|
/*010*/ SpellBuff_Struct Buffs[BUFF_COUNT];
|
||||||
@@ -1010,7 +1010,7 @@ struct PlayerProfile_Struct
|
|||||||
/*2505*/ uint8 unknown2541[47]; // ?
|
/*2505*/ uint8 unknown2541[47]; // ?
|
||||||
/*2552*/ uint8 languages[MAX_PP_LANGUAGE];
|
/*2552*/ uint8 languages[MAX_PP_LANGUAGE];
|
||||||
/*2580*/ uint8 unknown2616[4];
|
/*2580*/ uint8 unknown2616[4];
|
||||||
/*2584*/ uint32 spell_book[EQ::spells::SPELLBOOK_SIZE];
|
/*2584*/ int32 spell_book[EQ::spells::SPELLBOOK_SIZE];
|
||||||
/*4504*/ uint8 unknown4540[128]; // Was [428] all 0xff
|
/*4504*/ uint8 unknown4540[128]; // Was [428] all 0xff
|
||||||
/*4632*/ uint32 mem_spells[EQ::spells::SPELL_GEM_COUNT];
|
/*4632*/ uint32 mem_spells[EQ::spells::SPELL_GEM_COUNT];
|
||||||
/*4668*/ uint8 unknown4704[32]; //
|
/*4668*/ uint8 unknown4704[32]; //
|
||||||
@@ -1344,7 +1344,7 @@ struct CombatDamage_Struct
|
|||||||
/* 00 */ uint16 target;
|
/* 00 */ uint16 target;
|
||||||
/* 02 */ uint16 source;
|
/* 02 */ uint16 source;
|
||||||
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells, skill
|
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells, skill
|
||||||
/* 05 */ uint16 spellid;
|
/* 05 */ int16 spellid;
|
||||||
/* 07 */ uint32 damage;
|
/* 07 */ uint32 damage;
|
||||||
/* 11 */ float force;
|
/* 11 */ float force;
|
||||||
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
||||||
@@ -1377,7 +1377,7 @@ struct Death_Struct
|
|||||||
/*004*/ uint32 killer_id;
|
/*004*/ uint32 killer_id;
|
||||||
/*008*/ uint32 corpseid; // was corpseid
|
/*008*/ uint32 corpseid; // was corpseid
|
||||||
/*012*/ uint32 bindzoneid;
|
/*012*/ uint32 bindzoneid;
|
||||||
/*016*/ uint32 spell_id;
|
/*016*/ int32 spell_id;
|
||||||
/*020*/ uint32 attack_skill;
|
/*020*/ uint32 attack_skill;
|
||||||
/*024*/ uint32 damage;
|
/*024*/ uint32 damage;
|
||||||
/*028*/ uint32 unknown028;
|
/*028*/ uint32 unknown028;
|
||||||
@@ -2983,7 +2983,7 @@ struct Resurrect_Struct {
|
|||||||
/*024*/ char your_name[64];
|
/*024*/ char your_name[64];
|
||||||
/*088*/ uint32 unknown088;
|
/*088*/ uint32 unknown088;
|
||||||
/*092*/ char rezzer_name[64];
|
/*092*/ char rezzer_name[64];
|
||||||
/*156*/ uint32 spellid;
|
/*156*/ int32 spellid;
|
||||||
/*160*/ char corpse_name[64];
|
/*160*/ char corpse_name[64];
|
||||||
/*224*/ uint32 action;
|
/*224*/ uint32 action;
|
||||||
/* 228 */
|
/* 228 */
|
||||||
@@ -2991,7 +2991,7 @@ struct Resurrect_Struct {
|
|||||||
|
|
||||||
struct Translocate_Struct {
|
struct Translocate_Struct {
|
||||||
/*000*/ uint32 ZoneID;
|
/*000*/ uint32 ZoneID;
|
||||||
/*004*/ uint32 SpellID;
|
/*004*/ int32 SpellID;
|
||||||
/*008*/ uint32 unknown008; //Heading ?
|
/*008*/ uint32 unknown008; //Heading ?
|
||||||
/*012*/ char Caster[64];
|
/*012*/ char Caster[64];
|
||||||
/*076*/ float y;
|
/*076*/ float y;
|
||||||
@@ -3008,7 +3008,7 @@ struct PendingTranslocate_Struct
|
|||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
float z;
|
float z;
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Sacrifice_Struct {
|
struct Sacrifice_Struct {
|
||||||
@@ -4875,7 +4875,7 @@ struct MarkNPC_Struct
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct InspectBuffs_Struct {
|
struct InspectBuffs_Struct {
|
||||||
/*000*/ uint32 spell_id[BUFF_COUNT];
|
/*000*/ int32 spell_id[BUFF_COUNT];
|
||||||
/*100*/ int32 tics_remaining[BUFF_COUNT];
|
/*100*/ int32 tics_remaining[BUFF_COUNT];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -5144,7 +5144,7 @@ struct SendAA_Struct {
|
|||||||
/*0040*/ uint32 prereq_skill; //is < 0, abs() is category #
|
/*0040*/ uint32 prereq_skill; //is < 0, abs() is category #
|
||||||
/*0044*/ uint32 prereq_minpoints; //min points in the prereq
|
/*0044*/ uint32 prereq_minpoints; //min points in the prereq
|
||||||
/*0048*/ uint32 type;
|
/*0048*/ uint32 type;
|
||||||
/*0052*/ uint32 spellid;
|
/*0052*/ int32 spellid;
|
||||||
/*0056*/ uint32 spell_type;
|
/*0056*/ uint32 spell_type;
|
||||||
/*0060*/ uint32 spell_refresh;
|
/*0060*/ uint32 spell_refresh;
|
||||||
/*0064*/ uint16 classes;
|
/*0064*/ uint16 classes;
|
||||||
@@ -5645,7 +5645,7 @@ struct HideCorpse_Struct
|
|||||||
struct BuffIconEntry_Struct
|
struct BuffIconEntry_Struct
|
||||||
{
|
{
|
||||||
uint32 buff_slot;
|
uint32 buff_slot;
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
int32 tics_remaining;
|
int32 tics_remaining;
|
||||||
uint32 num_hits;
|
uint32 num_hits;
|
||||||
char caster[64];
|
char caster[64];
|
||||||
@@ -5656,7 +5656,7 @@ struct BuffIcon_Struct
|
|||||||
uint32 entity_id;
|
uint32 entity_id;
|
||||||
uint8 all_buffs;
|
uint8 all_buffs;
|
||||||
uint16 count;
|
uint16 count;
|
||||||
uint8 type; // 0 = self buff window, 1 = self target window, 4 = group, 5 = PC, 7 = NPC
|
uint8 type; // 0 = self buff window, 1 = self target window, 2 = pet buff or target window, 4 = group, 5 = PC, 7 = NPC
|
||||||
int32 tic_timer;
|
int32 tic_timer;
|
||||||
int32 name_lengths; // so ahh we kind of do these packets hacky, this is the total length of all the names to make creating the real packets in the translators easier
|
int32 name_lengths; // so ahh we kind of do these packets hacky, this is the total length of all the names to make creating the real packets in the translators easier
|
||||||
BuffIconEntry_Struct entries[0];
|
BuffIconEntry_Struct entries[0];
|
||||||
|
|||||||
@@ -960,7 +960,7 @@ namespace PlayerEvent {
|
|||||||
struct ResurrectAcceptEvent {
|
struct ResurrectAcceptEvent {
|
||||||
std::string resurrecter_name;
|
std::string resurrecter_name;
|
||||||
std::string spell_name;
|
std::string spell_name;
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
|
|
||||||
// cereal
|
// cereal
|
||||||
template <class Archive>
|
template <class Archive>
|
||||||
@@ -1058,7 +1058,7 @@ namespace PlayerEvent {
|
|||||||
uint32 killer_id;
|
uint32 killer_id;
|
||||||
std::string killer_name;
|
std::string killer_name;
|
||||||
int64 damage;
|
int64 damage;
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
std::string spell_name;
|
std::string spell_name;
|
||||||
int skill_id;
|
int skill_id;
|
||||||
std::string skill_name;
|
std::string skill_name;
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ void Links::FormatItemLink(char* Buffer, size_t BufferSize, const EQ::ItemInstan
|
|||||||
// TODO: Reverse 0x14064B220 to get definition of this function
|
// TODO: Reverse 0x14064B220 to get definition of this function
|
||||||
}
|
}
|
||||||
|
|
||||||
void Links::FormatSpellLink(char* Buffer, size_t BufferSize, uint32_t SpellID,
|
void Links::FormatSpellLink(char* Buffer, size_t BufferSize, int32_t SpellID,
|
||||||
const char* spellNameOverride)
|
const char* spellNameOverride)
|
||||||
{
|
{
|
||||||
snprintf(Buffer, BufferSize, "%c%d3^%d^0^'%s%c", ITEM_TAG_CHAR, ETAG_SPELL, SpellID,
|
snprintf(Buffer, BufferSize, "%c%d3^%d^0^'%s%c", ITEM_TAG_CHAR, ETAG_SPELL, SpellID,
|
||||||
|
|||||||
+1
-1
@@ -49,7 +49,7 @@ void FormatItemLink(char* Buffer, size_t BufferSize, const EQ::ItemInstance* ite
|
|||||||
|
|
||||||
// Create a spell link for the given spell, with optional spell name override. Spells on items often have
|
// Create a spell link for the given spell, with optional spell name override. Spells on items often have
|
||||||
// spell name overrides that changes the display name of the spell.
|
// spell name overrides that changes the display name of the spell.
|
||||||
void FormatSpellLink(char* Buffer, size_t BufferSize, uint32_t SpellID,
|
void FormatSpellLink(char* Buffer, size_t BufferSize, int32_t SpellID,
|
||||||
const char* spellNameOverride = nullptr);
|
const char* spellNameOverride = nullptr);
|
||||||
|
|
||||||
// Format text into a clickable dialog link. The keyword is the text that will be displayed in the chat window,
|
// Format text into a clickable dialog link. The keyword is the text that will be displayed in the chat window,
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/* EQEmu: EQEmulator
|
||||||
|
|
||||||
|
Copyright (C) 2001-2026 EQEmu Development Team
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common/emu_opcodes.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
class Client;
|
||||||
|
class Mob;
|
||||||
|
class EQApplicationPacket;
|
||||||
|
class Buffs_Struct;
|
||||||
|
|
||||||
|
namespace ClientPatch {
|
||||||
|
|
||||||
|
class IBuff
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using BuffSequenceFunc = std::function<std::unique_ptr<EQApplicationPacket>(const Client*)>;
|
||||||
|
|
||||||
|
IBuff(uint32_t maxLongBuffs, uint32_t maxShortBuffs)
|
||||||
|
: m_maxLongBuffs(maxLongBuffs)
|
||||||
|
, m_maxShortBuffs(maxShortBuffs)
|
||||||
|
{}
|
||||||
|
|
||||||
|
IBuff() = delete;
|
||||||
|
virtual ~IBuff() = default;
|
||||||
|
|
||||||
|
virtual std::unique_ptr<EQApplicationPacket> BuffDefinition(Mob* mob, const Buffs_Struct& buff, uint32_t slot,
|
||||||
|
bool fade) const = 0;
|
||||||
|
virtual std::unique_ptr<EQApplicationPacket> RefreshBuffs(EmuOpcode opcode, Mob* mob, bool remove,
|
||||||
|
bool buff_timers_suspended, const std::vector<uint32_t>& slots) const = 0;
|
||||||
|
virtual void SetRefreshType(std::unique_ptr<EQApplicationPacket>& packet, uint8_t refresh_type) const = 0;
|
||||||
|
virtual bool NeedsWearMessage() const = 0;
|
||||||
|
|
||||||
|
uint32_t ServerToPatchBuffSlot(uint32_t slot) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
uint32_t m_maxLongBuffs;
|
||||||
|
uint32_t m_maxShortBuffs;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Buff
|
||||||
@@ -15,9 +15,8 @@
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "client_version.h"
|
#pragma once
|
||||||
|
|
||||||
// Migration path: replace string_ids.h usage with ID enum values one call site at a time.
|
// Migration path: replace string_ids.h usage with ID enum values one call site at a time.
|
||||||
|
|
||||||
@@ -25,7 +24,7 @@ class Client;
|
|||||||
class Mob;
|
class Mob;
|
||||||
class EQApplicationPacket;
|
class EQApplicationPacket;
|
||||||
|
|
||||||
namespace Message {
|
namespace ClientPatch {
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
concept AllConstChar = (std::is_convertible_v<Args, const char*> && ...);
|
concept AllConstChar = (std::is_convertible_v<Args, const char*> && ...);
|
||||||
@@ -33,13 +32,14 @@ concept AllConstChar = (std::is_convertible_v<Args, const char*> && ...);
|
|||||||
class IMessage
|
class IMessage
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
using FormattedArgs = std::array<const char*, 9>;
|
||||||
IMessage() = default;
|
IMessage() = default;
|
||||||
virtual ~IMessage() = default;
|
virtual ~IMessage() = default;
|
||||||
|
|
||||||
// these two are the basic string message packets
|
// these two are the basic string message packets
|
||||||
virtual std::unique_ptr<EQApplicationPacket> Simple(uint32_t color, uint32_t id) const = 0;
|
virtual std::unique_ptr<EQApplicationPacket> Simple(uint32_t color, uint32_t id) const = 0;
|
||||||
virtual std::unique_ptr<EQApplicationPacket> Formatted(uint32_t color, uint32_t id,
|
virtual std::unique_ptr<EQApplicationPacket> Formatted(uint32_t color, uint32_t id,
|
||||||
const std::array<const char*, 9>& args) const = 0;
|
const FormattedArgs& args) const = 0;
|
||||||
|
|
||||||
// These aren't technically messages, but they use the same format and are similar enough to include here
|
// These aren't technically messages, but they use the same format and are similar enough to include here
|
||||||
virtual std::unique_ptr<EQApplicationPacket> InterruptSpell(uint32_t message, uint32_t spawn_id,
|
virtual std::unique_ptr<EQApplicationPacket> InterruptSpell(uint32_t message, uint32_t spawn_id,
|
||||||
|
|||||||
@@ -18,13 +18,22 @@
|
|||||||
|
|
||||||
#include "client_version.h"
|
#include "client_version.h"
|
||||||
|
|
||||||
|
#include "common/emu_constants.h"
|
||||||
|
|
||||||
#include "common/patches/titanium.h"
|
#include "common/patches/titanium.h"
|
||||||
|
#include "common/patches/titanium_limits.h"
|
||||||
#include "common/patches/sof.h"
|
#include "common/patches/sof.h"
|
||||||
|
#include "common/patches/sof_limits.h"
|
||||||
#include "common/patches/sod.h"
|
#include "common/patches/sod.h"
|
||||||
|
#include "common/patches/sod_limits.h"
|
||||||
#include "common/patches/uf.h"
|
#include "common/patches/uf.h"
|
||||||
|
#include "common/patches/uf_limits.h"
|
||||||
#include "common/patches/rof.h"
|
#include "common/patches/rof.h"
|
||||||
|
#include "common/patches/rof_limits.h"
|
||||||
#include "common/patches/rof2.h"
|
#include "common/patches/rof2.h"
|
||||||
|
#include "common/patches/rof2_limits.h"
|
||||||
#include "common/patches/tob.h"
|
#include "common/patches/tob.h"
|
||||||
|
#include "common/patches/tob_limits.h"
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
@@ -36,25 +45,32 @@ struct ClientComponents
|
|||||||
{
|
{
|
||||||
switch (version) {
|
switch (version) {
|
||||||
case Version::TOB:
|
case Version::TOB:
|
||||||
messageComponent = std::make_unique<Message::TOB>();
|
buffComponent = std::make_unique<TOB::BuffComponent>(TOB::spells::LONG_BUFFS, TOB::spells::SHORT_BUFFS);
|
||||||
|
messageComponent = std::make_unique<TOB::MessageComponent>();
|
||||||
break;
|
break;
|
||||||
case Version::RoF2:
|
case Version::RoF2:
|
||||||
messageComponent = std::make_unique<Message::RoF2>();
|
buffComponent = std::make_unique<UF::BuffComponent>(RoF2::spells::LONG_BUFFS, RoF2::spells::SHORT_BUFFS);
|
||||||
|
messageComponent = std::make_unique<Titanium::MessageComponent>();
|
||||||
break;
|
break;
|
||||||
case Version::RoF:
|
case Version::RoF:
|
||||||
messageComponent = std::make_unique<Message::RoF>();
|
buffComponent = std::make_unique<UF::BuffComponent>(RoF::spells::LONG_BUFFS, RoF::spells::SHORT_BUFFS);
|
||||||
|
messageComponent = std::make_unique<Titanium::MessageComponent>();
|
||||||
break;
|
break;
|
||||||
case Version::UF:
|
case Version::UF:
|
||||||
messageComponent = std::make_unique<Message::UF>();
|
buffComponent = std::make_unique<UF::BuffComponent>(UF::spells::LONG_BUFFS, UF::spells::SHORT_BUFFS);
|
||||||
|
messageComponent = std::make_unique<Titanium::MessageComponent>();
|
||||||
break;
|
break;
|
||||||
case Version::SoD:
|
case Version::SoD:
|
||||||
messageComponent = std::make_unique<Message::SoD>();
|
buffComponent = std::make_unique<SoD::BuffComponent>(SoD::spells::LONG_BUFFS, SoD::spells::SHORT_BUFFS);
|
||||||
|
messageComponent = std::make_unique<Titanium::MessageComponent>();
|
||||||
break;
|
break;
|
||||||
case Version::SoF:
|
case Version::SoF:
|
||||||
messageComponent = std::make_unique<Message::SoF>();
|
buffComponent = std::make_unique<Titanium::BuffComponent>(SoF::spells::LONG_BUFFS, SoF::spells::SHORT_BUFFS);
|
||||||
|
messageComponent = std::make_unique<Titanium::MessageComponent>();
|
||||||
break;
|
break;
|
||||||
case Version::Titanium:
|
case Version::Titanium:
|
||||||
messageComponent = std::make_unique<Message::Titanium>();
|
buffComponent = std::make_unique<Titanium::BuffComponent>(Titanium::spells::LONG_BUFFS, Titanium::spells::SHORT_BUFFS);
|
||||||
|
messageComponent = std::make_unique<Titanium::MessageComponent>();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -62,7 +78,8 @@ struct ClientComponents
|
|||||||
}
|
}
|
||||||
|
|
||||||
const Version version;
|
const Version version;
|
||||||
std::unique_ptr<Message::IMessage> messageComponent;
|
std::unique_ptr<ClientPatch::IBuff> buffComponent;
|
||||||
|
std::unique_ptr<ClientPatch::IMessage> messageComponent;
|
||||||
};
|
};
|
||||||
|
|
||||||
// this array must be in the same order as the Version enum because it converts Version to index directly
|
// this array must be in the same order as the Version enum because it converts Version to index directly
|
||||||
@@ -80,7 +97,27 @@ static const std::array<ClientComponents, EQ::versions::ClientVersionCount> s_pa
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::unique_ptr<Message::IMessage>& GetMessageComponent(Version version)
|
template<>
|
||||||
|
const std::unique_ptr<ClientPatch::IBuff>& GetComponent(Version version)
|
||||||
|
{
|
||||||
|
return s_patches.at(static_cast<uint32_t>(version)).buffComponent;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
const std::unique_ptr<ClientPatch::IMessage>& GetComponent(Version version)
|
||||||
{
|
{
|
||||||
return s_patches.at(static_cast<uint32_t>(version)).messageComponent;
|
return s_patches.at(static_cast<uint32_t>(version)).messageComponent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t ClientPatch::IBuff::ServerToPatchBuffSlot(uint32_t slot) const
|
||||||
|
{
|
||||||
|
// we're a disc
|
||||||
|
if (slot >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS)
|
||||||
|
return slot - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS +
|
||||||
|
m_maxLongBuffs + m_maxShortBuffs;
|
||||||
|
// we're a song
|
||||||
|
if (slot >= EQ::spells::LONG_BUFFS)
|
||||||
|
return slot - EQ::spells::LONG_BUFFS + m_maxLongBuffs;
|
||||||
|
// we're a normal buff
|
||||||
|
return slot; // as long as we guard against bad slots server side, we should be fine
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,13 +1,38 @@
|
|||||||
//
|
/* EQEmu: EQEmulator
|
||||||
// Created by dannu on 4/21/2026.
|
|
||||||
//
|
Copyright (C) 2001-2026 EQEmu Development Team
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common/emu_versions.h"
|
#include "common/emu_versions.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace Message { class IMessage; }
|
namespace ClientPatch {
|
||||||
|
class IBuff;
|
||||||
|
class IMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
// store all static functions for the different patches here
|
||||||
// store all static functions for the different patches here, this can return nullptr for unsupported patches
|
// store all static functions for the different patches here, this can return nullptr for unsupported patches
|
||||||
const std::unique_ptr<Message::IMessage>& GetMessageComponent(EQ::versions::ClientVersion version);
|
template <typename Component>
|
||||||
|
const std::unique_ptr<Component>& GetComponent(EQ::versions::ClientVersion version);
|
||||||
|
|
||||||
|
template <>
|
||||||
|
const std::unique_ptr<ClientPatch::IBuff>& GetComponent(EQ::versions::ClientVersion version);
|
||||||
|
|
||||||
|
template <>
|
||||||
|
const std::unique_ptr<ClientPatch::IMessage>& GetComponent(EQ::versions::ClientVersion version);
|
||||||
|
|||||||
@@ -353,7 +353,7 @@
|
|||||||
0x05ea,
|
0x05ea,
|
||||||
0x1b6f,
|
0x1b6f,
|
||||||
0x198e,
|
0x198e,
|
||||||
0x7bd6, OP_Buff
|
0x7bd6, OP_BuffDefinition
|
||||||
0x3501,
|
0x3501,
|
||||||
0x47ab,
|
0x47ab,
|
||||||
0x7a9e, OP_World_Client_CRC1
|
0x7a9e, OP_World_Client_CRC1
|
||||||
|
|||||||
+5
-102
@@ -67,7 +67,6 @@ namespace RoF
|
|||||||
static inline spells::CastingSlot ServerToRoFCastingSlot(EQ::spells::CastingSlot slot);
|
static inline spells::CastingSlot ServerToRoFCastingSlot(EQ::spells::CastingSlot slot);
|
||||||
static inline EQ::spells::CastingSlot RoFToServerCastingSlot(spells::CastingSlot slot);
|
static inline EQ::spells::CastingSlot RoFToServerCastingSlot(spells::CastingSlot slot);
|
||||||
|
|
||||||
static inline int ServerToRoFBuffSlot(int index);
|
|
||||||
static inline int RoFToServerBuffSlot(int index);
|
static inline int RoFToServerBuffSlot(int index);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
@@ -402,7 +401,7 @@ namespace RoF
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_Buff)
|
ENCODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -410,8 +409,7 @@ namespace RoF
|
|||||||
OUT(entityid);
|
OUT(entityid);
|
||||||
OUT(buff.effect_type);
|
OUT(buff.effect_type);
|
||||||
OUT(buff.level);
|
OUT(buff.level);
|
||||||
// just so we're 100% sure we get a 1.0f ...
|
OUT(buff.bard_modifier);
|
||||||
eq->buff.bard_modifier = emu->buff.bard_modifier == 10 ? 1.0f : emu->buff.bard_modifier / 10.0f;
|
|
||||||
OUT(buff.spellid);
|
OUT(buff.spellid);
|
||||||
OUT(buff.duration);
|
OUT(buff.duration);
|
||||||
OUT(buff.player_id);
|
OUT(buff.player_id);
|
||||||
@@ -420,59 +418,13 @@ namespace RoF
|
|||||||
OUT(buff.x);
|
OUT(buff.x);
|
||||||
OUT(buff.z);
|
OUT(buff.z);
|
||||||
// TODO: implement slot_data stuff
|
// TODO: implement slot_data stuff
|
||||||
eq->slotid = ServerToRoFBuffSlot(emu->slotid);
|
OUT(slotid);
|
||||||
|
|
||||||
if (emu->bufffade == 1)
|
if (emu->bufffade == 1)
|
||||||
eq->bufffade = 1;
|
eq->bufffade = 1;
|
||||||
else
|
else
|
||||||
eq->bufffade = 2;
|
eq->bufffade = 2;
|
||||||
|
|
||||||
// Bit of a hack. OP_Buff appears to add/remove the buff while OP_BuffCreate adds/removes the actual buff icon
|
|
||||||
EQApplicationPacket *outapp = nullptr;
|
|
||||||
if (eq->bufffade == 1)
|
|
||||||
{
|
|
||||||
outapp = new EQApplicationPacket(OP_BuffCreate, 29);
|
|
||||||
outapp->WriteUInt32(emu->entityid);
|
|
||||||
outapp->WriteUInt32(0); // tic timer
|
|
||||||
outapp->WriteUInt8(0); // Type of OP_BuffCreate packet ?
|
|
||||||
outapp->WriteUInt16(1); // 1 buff in this packet
|
|
||||||
outapp->WriteUInt32(eq->slotid);
|
|
||||||
outapp->WriteUInt32(0xffffffff); // SpellID (0xffff to remove)
|
|
||||||
outapp->WriteUInt32(0); // Duration
|
|
||||||
outapp->WriteUInt32(0); // numhits
|
|
||||||
outapp->WriteUInt8(0); // Caster name
|
|
||||||
outapp->WriteUInt8(0); // Type
|
|
||||||
}
|
|
||||||
FINISH_ENCODE();
|
|
||||||
|
|
||||||
if (outapp)
|
|
||||||
dest->FastQueuePacket(&outapp); // Send the OP_BuffCreate to remove the buff
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_BuffCreate)
|
|
||||||
{
|
|
||||||
SETUP_VAR_ENCODE(BuffIcon_Struct);
|
|
||||||
|
|
||||||
uint32 sz = 12 + (17 * emu->count) + emu->name_lengths; // 17 includes nullterm
|
|
||||||
__packet->size = sz;
|
|
||||||
__packet->pBuffer = new unsigned char[sz];
|
|
||||||
memset(__packet->pBuffer, 0, sz);
|
|
||||||
|
|
||||||
__packet->WriteUInt32(emu->entity_id);
|
|
||||||
__packet->WriteUInt32(emu->tic_timer);
|
|
||||||
__packet->WriteUInt8(emu->all_buffs); // 1 indicates all buffs on the player (0 to add or remove a single buff)
|
|
||||||
__packet->WriteUInt16(emu->count);
|
|
||||||
|
|
||||||
for (int i = 0; i < emu->count; ++i)
|
|
||||||
{
|
|
||||||
__packet->WriteUInt32(emu->type == 0 ? ServerToRoFBuffSlot(emu->entries[i].buff_slot) : emu->entries[i].buff_slot);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].spell_id);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].tics_remaining);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].num_hits); // Unknown
|
|
||||||
__packet->WriteString(emu->entries[i].caster);
|
|
||||||
}
|
|
||||||
__packet->WriteUInt8(emu->type); // Unknown
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1858,38 +1810,6 @@ namespace RoF
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_PetBuffWindow)
|
|
||||||
{
|
|
||||||
// The format of the RoF packet is identical to the OP_BuffCreate packet.
|
|
||||||
|
|
||||||
SETUP_VAR_ENCODE(PetBuff_Struct);
|
|
||||||
|
|
||||||
uint32 sz = 12 + (17 * emu->buffcount);
|
|
||||||
__packet->size = sz;
|
|
||||||
__packet->pBuffer = new unsigned char[sz];
|
|
||||||
memset(__packet->pBuffer, 0, sz);
|
|
||||||
|
|
||||||
__packet->WriteUInt32(emu->petid);
|
|
||||||
__packet->WriteUInt32(0); // PlayerID ?
|
|
||||||
__packet->WriteUInt8(1); // 1 indicates all buffs on the pet (0 to add or remove a single buff)
|
|
||||||
__packet->WriteUInt16(emu->buffcount);
|
|
||||||
|
|
||||||
for (uint16 i = 0; i < PET_BUFF_COUNT; ++i)
|
|
||||||
{
|
|
||||||
if (emu->spellid[i])
|
|
||||||
{
|
|
||||||
__packet->WriteUInt32(i);
|
|
||||||
__packet->WriteUInt32(emu->spellid[i]);
|
|
||||||
__packet->WriteUInt32(emu->ticsremaining[i]);
|
|
||||||
__packet->WriteUInt32(0); // numhits
|
|
||||||
__packet->WriteString("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
__packet->WriteUInt8(0); // some sort of type
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_PlayerProfile)
|
ENCODE(OP_PlayerProfile)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *in = *p;
|
EQApplicationPacket *in = *p;
|
||||||
@@ -2179,7 +2099,7 @@ namespace RoF
|
|||||||
outapp->WriteUInt32(emu->buffs[r].counters);
|
outapp->WriteUInt32(emu->buffs[r].counters);
|
||||||
outapp->WriteUInt32(emu->buffs[r].duration);
|
outapp->WriteUInt32(emu->buffs[r].duration);
|
||||||
outapp->WriteUInt8(emu->buffs[r].level);
|
outapp->WriteUInt8(emu->buffs[r].level);
|
||||||
outapp->WriteUInt32(emu->buffs[r].spellid);
|
outapp->WriteSInt32 (emu->buffs[r].spellid);
|
||||||
outapp->WriteUInt8(effect_type); // Only ever seen 2
|
outapp->WriteUInt8(effect_type); // Only ever seen 2
|
||||||
outapp->WriteUInt32(emu->buffs[r].num_hits);
|
outapp->WriteUInt32(emu->buffs[r].num_hits);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
@@ -3239,8 +3159,6 @@ namespace RoF
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_TargetBuffs) { ENCODE_FORWARD(OP_BuffCreate); }
|
|
||||||
|
|
||||||
ENCODE(OP_TaskDescription)
|
ENCODE(OP_TaskDescription)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *in = *p;
|
EQApplicationPacket *in = *p;
|
||||||
@@ -4196,7 +4114,7 @@ namespace RoF
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -6263,21 +6181,6 @@ namespace RoF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// these should be optimized out for RoF since they should all boil down to return index :P
|
|
||||||
// but lets leave it here for future proofing
|
|
||||||
static inline int ServerToRoFBuffSlot(int index)
|
|
||||||
{
|
|
||||||
// we're a disc
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS +
|
|
||||||
spells::LONG_BUFFS + spells::SHORT_BUFFS;
|
|
||||||
// we're a song
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS;
|
|
||||||
// we're a normal buff
|
|
||||||
return index; // as long as we guard against bad slots server side, we should be fine
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int RoFToServerBuffSlot(int index)
|
static inline int RoFToServerBuffSlot(int index)
|
||||||
{
|
{
|
||||||
// we're a disc
|
// we're a disc
|
||||||
|
|||||||
+15
-33
@@ -17,46 +17,28 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "uf.h"
|
|
||||||
#include "common/struct_strategy.h"
|
#include "common/struct_strategy.h"
|
||||||
|
#include "common/patches/uf.h"
|
||||||
|
|
||||||
class EQStreamIdentifier;
|
class EQStreamIdentifier;
|
||||||
|
|
||||||
namespace RoF
|
namespace RoF {
|
||||||
{
|
|
||||||
|
|
||||||
//these are the only public member of this namespace.
|
extern void Register(EQStreamIdentifier& into);
|
||||||
extern void Register(EQStreamIdentifier &into);
|
extern void Reload();
|
||||||
extern void Reload();
|
|
||||||
|
|
||||||
|
class Strategy : public StructStrategy
|
||||||
|
|
||||||
//you should not directly access anything below..
|
|
||||||
//I just dont feel like making a seperate header for it.
|
|
||||||
|
|
||||||
class Strategy : public StructStrategy {
|
|
||||||
public:
|
|
||||||
Strategy();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual std::string Describe() const;
|
|
||||||
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
|
||||||
|
|
||||||
//magic macro to declare our opcode processors
|
|
||||||
#include "ss_declare.h"
|
|
||||||
#include "rof_ops.h"
|
|
||||||
};
|
|
||||||
|
|
||||||
} /*RoF*/
|
|
||||||
|
|
||||||
namespace Message {
|
|
||||||
|
|
||||||
class RoF : public UF
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RoF() = default;
|
Strategy();
|
||||||
~RoF() override = default;
|
|
||||||
|
protected:
|
||||||
|
virtual std::string Describe() const;
|
||||||
|
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
||||||
|
|
||||||
|
//magic macro to declare our opcode processors
|
||||||
|
#include "ss_declare.h"
|
||||||
|
#include "rof_ops.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Message
|
} /*RoF*/
|
||||||
|
|||||||
+4
-100
@@ -69,7 +69,6 @@ namespace RoF2
|
|||||||
static inline spells::CastingSlot ServerToRoF2CastingSlot(EQ::spells::CastingSlot slot);
|
static inline spells::CastingSlot ServerToRoF2CastingSlot(EQ::spells::CastingSlot slot);
|
||||||
static inline EQ::spells::CastingSlot RoF2ToServerCastingSlot(spells::CastingSlot slot);
|
static inline EQ::spells::CastingSlot RoF2ToServerCastingSlot(spells::CastingSlot slot);
|
||||||
|
|
||||||
static inline int ServerToRoF2BuffSlot(int index);
|
|
||||||
static inline int RoF2ToServerBuffSlot(int index);
|
static inline int RoF2ToServerBuffSlot(int index);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
@@ -661,7 +660,7 @@ namespace RoF2
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_Buff)
|
ENCODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -678,59 +677,13 @@ namespace RoF2
|
|||||||
OUT(buff.y);
|
OUT(buff.y);
|
||||||
OUT(buff.x);
|
OUT(buff.x);
|
||||||
OUT(buff.z);
|
OUT(buff.z);
|
||||||
eq->slotid = ServerToRoF2BuffSlot(emu->slotid);
|
OUT(slotid);
|
||||||
// TODO: implement slot_data stuff
|
// TODO: implement slot_data stuff
|
||||||
if (emu->bufffade == 1)
|
if (emu->bufffade == 1)
|
||||||
eq->bufffade = 1;
|
eq->bufffade = 1;
|
||||||
else
|
else
|
||||||
eq->bufffade = 2;
|
eq->bufffade = 2;
|
||||||
|
|
||||||
// Bit of a hack. OP_Buff appears to add/remove the buff while OP_BuffCreate adds/removes the actual buff icon
|
|
||||||
EQApplicationPacket *outapp = nullptr;
|
|
||||||
if (eq->bufffade == 1)
|
|
||||||
{
|
|
||||||
outapp = new EQApplicationPacket(OP_BuffCreate, 29u);
|
|
||||||
outapp->WriteUInt32(emu->entityid);
|
|
||||||
outapp->WriteUInt32(0); // tic timer
|
|
||||||
outapp->WriteUInt8(0); // Type of OP_BuffCreate packet ?
|
|
||||||
outapp->WriteUInt16(1); // 1 buff in this packet
|
|
||||||
outapp->WriteUInt32(eq->slotid);
|
|
||||||
outapp->WriteUInt32(0xffffffff); // SpellID (0xffff to remove)
|
|
||||||
outapp->WriteUInt32(0); // Duration
|
|
||||||
outapp->WriteUInt32(0); // numhits
|
|
||||||
outapp->WriteUInt8(0); // Caster name
|
|
||||||
outapp->WriteUInt8(0); // Type
|
|
||||||
}
|
|
||||||
FINISH_ENCODE();
|
|
||||||
|
|
||||||
if (outapp)
|
|
||||||
dest->FastQueuePacket(&outapp); // Send the OP_BuffCreate to remove the buff
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_BuffCreate)
|
|
||||||
{
|
|
||||||
SETUP_VAR_ENCODE(BuffIcon_Struct);
|
|
||||||
|
|
||||||
uint32 sz = 12 + (17 * emu->count) + emu->name_lengths; // 17 includes nullterm
|
|
||||||
__packet->size = sz;
|
|
||||||
__packet->pBuffer = new unsigned char[sz];
|
|
||||||
memset(__packet->pBuffer, 0, sz);
|
|
||||||
|
|
||||||
__packet->WriteUInt32(emu->entity_id);
|
|
||||||
__packet->WriteUInt32(emu->tic_timer);
|
|
||||||
__packet->WriteUInt8(emu->all_buffs); // 1 indicates all buffs on the player (0 to add or remove a single buff)
|
|
||||||
__packet->WriteUInt16(emu->count);
|
|
||||||
|
|
||||||
for (int i = 0; i < emu->count; ++i)
|
|
||||||
{
|
|
||||||
__packet->WriteUInt32(emu->type == 0 ? ServerToRoF2BuffSlot(emu->entries[i].buff_slot) : emu->entries[i].buff_slot);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].spell_id);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].tics_remaining);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].num_hits); // Unknown
|
|
||||||
__packet->WriteString(emu->entries[i].caster);
|
|
||||||
}
|
|
||||||
__packet->WriteUInt8(emu->type); // Unknown
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2464,38 +2417,6 @@ namespace RoF2
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_PetBuffWindow)
|
|
||||||
{
|
|
||||||
// The format of the RoF2 packet is identical to the OP_BuffCreate packet.
|
|
||||||
|
|
||||||
SETUP_VAR_ENCODE(PetBuff_Struct);
|
|
||||||
|
|
||||||
uint32 sz = 12 + (17 * emu->buffcount);
|
|
||||||
__packet->size = sz;
|
|
||||||
__packet->pBuffer = new unsigned char[sz];
|
|
||||||
memset(__packet->pBuffer, 0, sz);
|
|
||||||
|
|
||||||
__packet->WriteUInt32(emu->petid);
|
|
||||||
__packet->WriteUInt32(0); // PlayerID ?
|
|
||||||
__packet->WriteUInt8(1); // 1 indicates all buffs on the pet (0 to add or remove a single buff)
|
|
||||||
__packet->WriteUInt16(emu->buffcount);
|
|
||||||
|
|
||||||
for (uint16 i = 0; i < PET_BUFF_COUNT; ++i)
|
|
||||||
{
|
|
||||||
if (emu->spellid[i])
|
|
||||||
{
|
|
||||||
__packet->WriteUInt32(i);
|
|
||||||
__packet->WriteUInt32(emu->spellid[i]);
|
|
||||||
__packet->WriteUInt32(emu->ticsremaining[i]);
|
|
||||||
__packet->WriteUInt32(0); // num hits
|
|
||||||
__packet->WriteString("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
__packet->WriteUInt8(0); // some sort of type
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_PlayerProfile)
|
ENCODE(OP_PlayerProfile)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *in = *p;
|
EQApplicationPacket *in = *p;
|
||||||
@@ -2786,7 +2707,7 @@ namespace RoF2
|
|||||||
outapp->WriteUInt32(emu->buffs[r].counters);
|
outapp->WriteUInt32(emu->buffs[r].counters);
|
||||||
outapp->WriteUInt32(emu->buffs[r].duration);
|
outapp->WriteUInt32(emu->buffs[r].duration);
|
||||||
outapp->WriteUInt8(emu->buffs[r].level);
|
outapp->WriteUInt8(emu->buffs[r].level);
|
||||||
outapp->WriteUInt32(emu->buffs[r].spellid);
|
outapp->WriteSInt32 (emu->buffs[r].spellid);
|
||||||
outapp->WriteUInt8(effect_type); // Only ever seen 2
|
outapp->WriteUInt8(effect_type); // Only ever seen 2
|
||||||
outapp->WriteUInt32(emu->buffs[r].num_hits);
|
outapp->WriteUInt32(emu->buffs[r].num_hits);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
@@ -3841,8 +3762,6 @@ namespace RoF2
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_TargetBuffs) { ENCODE_FORWARD(OP_BuffCreate); }
|
|
||||||
|
|
||||||
ENCODE(OP_TaskDescription)
|
ENCODE(OP_TaskDescription)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *in = *p;
|
EQApplicationPacket *in = *p;
|
||||||
@@ -5145,7 +5064,7 @@ namespace RoF2
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -7495,21 +7414,6 @@ namespace RoF2
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// these should be optimized out for RoF2 since they should all boil down to return index :P
|
|
||||||
// but lets leave it here for future proofing
|
|
||||||
static inline int ServerToRoF2BuffSlot(int index)
|
|
||||||
{
|
|
||||||
// we're a disc
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS +
|
|
||||||
spells::LONG_BUFFS + spells::SHORT_BUFFS;
|
|
||||||
// we're a song
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS;
|
|
||||||
// we're a normal buff
|
|
||||||
return index; // as long as we guard against bad slots server side, we should be fine
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int RoF2ToServerBuffSlot(int index)
|
static inline int RoF2ToServerBuffSlot(int index)
|
||||||
{
|
{
|
||||||
// we're a disc
|
// we're a disc
|
||||||
|
|||||||
+15
-33
@@ -17,46 +17,28 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "rof.h"
|
|
||||||
#include "common/struct_strategy.h"
|
#include "common/struct_strategy.h"
|
||||||
|
#include "common/patches/rof.h"
|
||||||
|
|
||||||
class EQStreamIdentifier;
|
class EQStreamIdentifier;
|
||||||
|
|
||||||
namespace RoF2
|
namespace RoF2 {
|
||||||
{
|
|
||||||
|
|
||||||
//these are the only public member of this namespace.
|
extern void Register(EQStreamIdentifier& into);
|
||||||
extern void Register(EQStreamIdentifier &into);
|
extern void Reload();
|
||||||
extern void Reload();
|
|
||||||
|
|
||||||
|
class Strategy : public StructStrategy
|
||||||
|
|
||||||
//you should not directly access anything below..
|
|
||||||
//I just dont feel like making a seperate header for it.
|
|
||||||
|
|
||||||
class Strategy : public StructStrategy {
|
|
||||||
public:
|
|
||||||
Strategy();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual std::string Describe() const;
|
|
||||||
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
|
||||||
|
|
||||||
//magic macro to declare our opcode processors
|
|
||||||
#include "ss_declare.h"
|
|
||||||
#include "rof2_ops.h"
|
|
||||||
};
|
|
||||||
|
|
||||||
}; /*RoF2*/
|
|
||||||
|
|
||||||
namespace Message {
|
|
||||||
|
|
||||||
class RoF2 : public RoF
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RoF2() = default;
|
Strategy();
|
||||||
~RoF2() override = default;
|
|
||||||
|
protected:
|
||||||
|
virtual std::string Describe() const;
|
||||||
|
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
||||||
|
|
||||||
|
//magic macro to declare our opcode processors
|
||||||
|
#include "ss_declare.h"
|
||||||
|
#include "rof2_ops.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Message
|
}; /*RoF2*/
|
||||||
|
|||||||
@@ -43,8 +43,7 @@ E(OP_BazaarSearch)
|
|||||||
E(OP_BecomeTrader)
|
E(OP_BecomeTrader)
|
||||||
E(OP_BeginCast)
|
E(OP_BeginCast)
|
||||||
E(OP_BlockedBuffs)
|
E(OP_BlockedBuffs)
|
||||||
E(OP_Buff)
|
E(OP_BuffDefinition)
|
||||||
E(OP_BuffCreate)
|
|
||||||
E(OP_BuyerItems)
|
E(OP_BuyerItems)
|
||||||
E(OP_CancelTrade)
|
E(OP_CancelTrade)
|
||||||
E(OP_CastSpell)
|
E(OP_CastSpell)
|
||||||
@@ -100,7 +99,6 @@ E(OP_MoveItem)
|
|||||||
E(OP_NewSpawn)
|
E(OP_NewSpawn)
|
||||||
E(OP_NewZone)
|
E(OP_NewZone)
|
||||||
E(OP_OnLevelMessage)
|
E(OP_OnLevelMessage)
|
||||||
E(OP_PetBuffWindow)
|
|
||||||
E(OP_PlayerProfile)
|
E(OP_PlayerProfile)
|
||||||
E(OP_RaidJoin)
|
E(OP_RaidJoin)
|
||||||
E(OP_RaidUpdate)
|
E(OP_RaidUpdate)
|
||||||
@@ -123,7 +121,6 @@ E(OP_SpawnAppearance)
|
|||||||
E(OP_SpawnDoor)
|
E(OP_SpawnDoor)
|
||||||
E(OP_SpecialMesg)
|
E(OP_SpecialMesg)
|
||||||
E(OP_Stun)
|
E(OP_Stun)
|
||||||
E(OP_TargetBuffs)
|
|
||||||
E(OP_TaskDescription)
|
E(OP_TaskDescription)
|
||||||
E(OP_TaskHistoryReply)
|
E(OP_TaskHistoryReply)
|
||||||
E(OP_Track)
|
E(OP_Track)
|
||||||
@@ -153,7 +150,7 @@ D(OP_Barter)
|
|||||||
D(OP_BazaarSearch)
|
D(OP_BazaarSearch)
|
||||||
D(OP_BlockedBuffs)
|
D(OP_BlockedBuffs)
|
||||||
D(OP_BookButton)
|
D(OP_BookButton)
|
||||||
D(OP_Buff)
|
D(OP_BuffDefinition)
|
||||||
D(OP_BuffRemoveRequest)
|
D(OP_BuffRemoveRequest)
|
||||||
D(OP_BuyerItems)
|
D(OP_BuyerItems)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
|
|||||||
@@ -668,7 +668,7 @@ struct NewZone_Struct {
|
|||||||
*/
|
*/
|
||||||
struct MemorizeSpell_Struct {
|
struct MemorizeSpell_Struct {
|
||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
int32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
uint32 reduction; // lowers reuse
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
@@ -705,7 +705,7 @@ struct ManaChange_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
/*04*/ uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
/*08*/ uint32 spell_id;
|
/*08*/ int32 spell_id;
|
||||||
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
||||||
@@ -719,7 +719,7 @@ struct SwapSpell_Struct
|
|||||||
|
|
||||||
struct BeginCast_Struct
|
struct BeginCast_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint32 spell_id;
|
/*000*/ int32 spell_id;
|
||||||
/*004*/ uint16 caster_id;
|
/*004*/ uint16 caster_id;
|
||||||
/*006*/ uint32 cast_time; // in miliseconds
|
/*006*/ uint32 cast_time; // in miliseconds
|
||||||
/*010*/
|
/*010*/
|
||||||
@@ -728,7 +728,7 @@ struct BeginCast_Struct
|
|||||||
struct CastSpell_Struct
|
struct CastSpell_Struct
|
||||||
{
|
{
|
||||||
/*00*/ uint32 slot;
|
/*00*/ uint32 slot;
|
||||||
/*04*/ uint32 spell_id;
|
/*04*/ int32 spell_id;
|
||||||
/*08*/ InventorySlot_Struct inventory_slot; // slot for clicky item, Seen unknown of 131 = normal cast
|
/*08*/ InventorySlot_Struct inventory_slot; // slot for clicky item, Seen unknown of 131 = normal cast
|
||||||
/*20*/ uint32 target_id;
|
/*20*/ uint32 target_id;
|
||||||
/*24*/ uint32 cs_unknown[2];
|
/*24*/ uint32 cs_unknown[2];
|
||||||
@@ -760,7 +760,7 @@ struct SpellBuff_Struct
|
|||||||
/*002*/ uint8 unknown002; //pretty sure padding now
|
/*002*/ uint8 unknown002; //pretty sure padding now
|
||||||
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*004*/ float bard_modifier;
|
/*004*/ float bard_modifier;
|
||||||
/*008*/ uint32 spellid;
|
/*008*/ int32 spellid;
|
||||||
/*012*/ uint32 duration;
|
/*012*/ uint32 duration;
|
||||||
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
/*020*/ uint32 num_hits;
|
/*020*/ uint32 num_hits;
|
||||||
@@ -791,7 +791,7 @@ struct BuffRemoveRequest_Struct
|
|||||||
// not in use
|
// not in use
|
||||||
struct BuffIconEntry_Struct {
|
struct BuffIconEntry_Struct {
|
||||||
/*000*/ uint32 buff_slot;
|
/*000*/ uint32 buff_slot;
|
||||||
/*004*/ uint32 spell_id;
|
/*004*/ int32 spell_id;
|
||||||
/*008*/ uint32 tics_remaining;
|
/*008*/ uint32 tics_remaining;
|
||||||
/*012*/ uint32 num_hits;
|
/*012*/ uint32 num_hits;
|
||||||
// char name[0]; caster name is also here sometimes
|
// char name[0]; caster name is also here sometimes
|
||||||
@@ -1513,7 +1513,7 @@ struct CombatDamage_Struct
|
|||||||
/* 00 */ uint16 target;
|
/* 00 */ uint16 target;
|
||||||
/* 02 */ uint16 source;
|
/* 02 */ uint16 source;
|
||||||
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
||||||
/* 05 */ uint32 spellid;
|
/* 05 */ int32 spellid;
|
||||||
/* 09 */ int32 damage;
|
/* 09 */ int32 damage;
|
||||||
/* 13 */ float force; // cd cc cc 3d
|
/* 13 */ float force; // cd cc cc 3d
|
||||||
/* 17 */ float hit_heading; // see above notes in Action_Struct
|
/* 17 */ float hit_heading; // see above notes in Action_Struct
|
||||||
@@ -1549,7 +1549,7 @@ struct Death_Struct
|
|||||||
/*004*/ uint32 killer_id;
|
/*004*/ uint32 killer_id;
|
||||||
/*008*/ uint32 corpseid; // was corpseid
|
/*008*/ uint32 corpseid; // was corpseid
|
||||||
/*012*/ uint32 attack_skill; // was type
|
/*012*/ uint32 attack_skill; // was type
|
||||||
/*016*/ uint32 spell_id;
|
/*016*/ int32 spell_id;
|
||||||
/*020*/ uint32 bindzoneid; //bindzoneid?
|
/*020*/ uint32 bindzoneid; //bindzoneid?
|
||||||
/*024*/ uint32 damage;
|
/*024*/ uint32 damage;
|
||||||
/*028*/ uint32 unknown028;
|
/*028*/ uint32 unknown028;
|
||||||
@@ -2658,7 +2658,7 @@ struct GroupFollow_Struct { // Live Follow Struct
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct InspectBuffs_Struct {
|
struct InspectBuffs_Struct {
|
||||||
/*000*/ uint32 spell_id[BUFF_COUNT];
|
/*000*/ int32 spell_id[BUFF_COUNT];
|
||||||
/*168*/ int32 tics_remaining[BUFF_COUNT];
|
/*168*/ int32 tics_remaining[BUFF_COUNT];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3077,7 +3077,7 @@ struct Resurrect_Struct
|
|||||||
/*024*/ char your_name[64];
|
/*024*/ char your_name[64];
|
||||||
/*088*/ uint32 unknown088;
|
/*088*/ uint32 unknown088;
|
||||||
/*092*/ char rezzer_name[64];
|
/*092*/ char rezzer_name[64];
|
||||||
/*156*/ uint32 spellid;
|
/*156*/ int32 spellid;
|
||||||
/*160*/ char corpse_name[64];
|
/*160*/ char corpse_name[64];
|
||||||
/*224*/ uint32 action;
|
/*224*/ uint32 action;
|
||||||
/*228*/ uint32 unknown228;
|
/*228*/ uint32 unknown228;
|
||||||
@@ -4581,7 +4581,7 @@ struct SendAA_Struct {
|
|||||||
/*0045*/ uint32 prereq_minpoints_count; // mutliple prereqs at least 1, even no prereqs
|
/*0045*/ uint32 prereq_minpoints_count; // mutliple prereqs at least 1, even no prereqs
|
||||||
/*0049*/ uint32 prereq_minpoints; //min points in the prereq
|
/*0049*/ uint32 prereq_minpoints; //min points in the prereq
|
||||||
/*0053*/ uint32 type;
|
/*0053*/ uint32 type;
|
||||||
/*0057*/ uint32 spellid;
|
/*0057*/ int32 spellid;
|
||||||
/*0061*/ uint32 unknown057; // Introduced during HoT - Seen 1 - Maybe account status or enable/disable AA?
|
/*0061*/ uint32 unknown057; // Introduced during HoT - Seen 1 - Maybe account status or enable/disable AA?
|
||||||
/*0065*/ uint32 spell_type;
|
/*0065*/ uint32 spell_type;
|
||||||
/*0069*/ uint32 spell_refresh;
|
/*0069*/ uint32 spell_refresh;
|
||||||
|
|||||||
@@ -27,8 +27,7 @@ E(OP_Barter)
|
|||||||
E(OP_BazaarSearch)
|
E(OP_BazaarSearch)
|
||||||
E(OP_BeginCast)
|
E(OP_BeginCast)
|
||||||
E(OP_BlockedBuffs)
|
E(OP_BlockedBuffs)
|
||||||
E(OP_Buff)
|
E(OP_BuffDefinition)
|
||||||
E(OP_BuffCreate)
|
|
||||||
E(OP_CancelTrade)
|
E(OP_CancelTrade)
|
||||||
E(OP_CastSpell)
|
E(OP_CastSpell)
|
||||||
E(OP_ChannelMessage)
|
E(OP_ChannelMessage)
|
||||||
@@ -81,7 +80,6 @@ E(OP_MoveItem)
|
|||||||
E(OP_NewSpawn)
|
E(OP_NewSpawn)
|
||||||
E(OP_NewZone)
|
E(OP_NewZone)
|
||||||
E(OP_OnLevelMessage)
|
E(OP_OnLevelMessage)
|
||||||
E(OP_PetBuffWindow)
|
|
||||||
E(OP_PlayerProfile)
|
E(OP_PlayerProfile)
|
||||||
E(OP_RaidJoin)
|
E(OP_RaidJoin)
|
||||||
E(OP_RaidUpdate)
|
E(OP_RaidUpdate)
|
||||||
@@ -104,7 +102,6 @@ E(OP_SpawnAppearance)
|
|||||||
E(OP_SpawnDoor)
|
E(OP_SpawnDoor)
|
||||||
E(OP_SpecialMesg)
|
E(OP_SpecialMesg)
|
||||||
E(OP_Stun)
|
E(OP_Stun)
|
||||||
E(OP_TargetBuffs)
|
|
||||||
E(OP_TaskDescription)
|
E(OP_TaskDescription)
|
||||||
E(OP_TaskHistoryReply)
|
E(OP_TaskHistoryReply)
|
||||||
E(OP_Track)
|
E(OP_Track)
|
||||||
@@ -131,7 +128,7 @@ D(OP_AugmentInfo)
|
|||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_BazaarSearch)
|
D(OP_BazaarSearch)
|
||||||
D(OP_BlockedBuffs)
|
D(OP_BlockedBuffs)
|
||||||
D(OP_Buff)
|
D(OP_BuffDefinition)
|
||||||
D(OP_BuffRemoveRequest)
|
D(OP_BuffRemoveRequest)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
D(OP_ChannelMessage)
|
D(OP_ChannelMessage)
|
||||||
|
|||||||
@@ -614,7 +614,7 @@ struct NewZone_Struct {
|
|||||||
*/
|
*/
|
||||||
struct MemorizeSpell_Struct {
|
struct MemorizeSpell_Struct {
|
||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
int32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
uint32 reduction; // lowers reuse
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
@@ -651,7 +651,7 @@ struct ManaChange_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
/*04*/ uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
/*08*/ uint32 spell_id;
|
/*08*/ int32 spell_id;
|
||||||
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
||||||
@@ -665,7 +665,7 @@ struct SwapSpell_Struct
|
|||||||
|
|
||||||
struct BeginCast_Struct
|
struct BeginCast_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint32 spell_id;
|
/*000*/ int32 spell_id;
|
||||||
/*004*/ uint16 caster_id;
|
/*004*/ uint16 caster_id;
|
||||||
/*006*/ uint32 cast_time; // in miliseconds
|
/*006*/ uint32 cast_time; // in miliseconds
|
||||||
/*010*/
|
/*010*/
|
||||||
@@ -674,7 +674,7 @@ struct BeginCast_Struct
|
|||||||
struct CastSpell_Struct
|
struct CastSpell_Struct
|
||||||
{
|
{
|
||||||
/*00*/ uint32 slot;
|
/*00*/ uint32 slot;
|
||||||
/*04*/ uint32 spell_id;
|
/*04*/ int32 spell_id;
|
||||||
/*08*/ InventorySlot_Struct inventory_slot; // slot for clicky item, Seen unknown of 131 = normal cast
|
/*08*/ InventorySlot_Struct inventory_slot; // slot for clicky item, Seen unknown of 131 = normal cast
|
||||||
/*20*/ uint32 target_id;
|
/*20*/ uint32 target_id;
|
||||||
/*24*/ uint32 cs_unknown[2];
|
/*24*/ uint32 cs_unknown[2];
|
||||||
@@ -706,7 +706,7 @@ struct SpellBuff_Struct
|
|||||||
/*002*/ uint8 unknown002; //pretty sure padding now
|
/*002*/ uint8 unknown002; //pretty sure padding now
|
||||||
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*004*/ float bard_modifier;
|
/*004*/ float bard_modifier;
|
||||||
/*008*/ uint32 spellid;
|
/*008*/ int32 spellid;
|
||||||
/*012*/ uint32 duration;
|
/*012*/ uint32 duration;
|
||||||
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
/*020*/ uint32 num_hits;
|
/*020*/ uint32 num_hits;
|
||||||
@@ -737,7 +737,7 @@ struct BuffRemoveRequest_Struct
|
|||||||
// not in use
|
// not in use
|
||||||
struct BuffIconEntry_Struct {
|
struct BuffIconEntry_Struct {
|
||||||
/*000*/ uint32 buff_slot;
|
/*000*/ uint32 buff_slot;
|
||||||
/*004*/ uint32 spell_id;
|
/*004*/ int32 spell_id;
|
||||||
/*008*/ uint32 tics_remaining;
|
/*008*/ uint32 tics_remaining;
|
||||||
/*012*/ uint32 num_hits;
|
/*012*/ uint32 num_hits;
|
||||||
// char name[0]; caster name is also here sometimes
|
// char name[0]; caster name is also here sometimes
|
||||||
@@ -1500,7 +1500,7 @@ struct CombatDamage_Struct
|
|||||||
/* 00 */ uint16 target;
|
/* 00 */ uint16 target;
|
||||||
/* 02 */ uint16 source;
|
/* 02 */ uint16 source;
|
||||||
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
||||||
/* 05 */ uint32 spellid;
|
/* 05 */ int32 spellid;
|
||||||
/* 09 */ int32 damage;
|
/* 09 */ int32 damage;
|
||||||
/* 13 */ float force; // cd cc cc 3d
|
/* 13 */ float force; // cd cc cc 3d
|
||||||
/* 17 */ float hit_heading; // see above notes in Action_Struct
|
/* 17 */ float hit_heading; // see above notes in Action_Struct
|
||||||
@@ -1536,7 +1536,7 @@ struct Death_Struct
|
|||||||
/*004*/ uint32 killer_id;
|
/*004*/ uint32 killer_id;
|
||||||
/*008*/ uint32 corpseid; // was corpseid
|
/*008*/ uint32 corpseid; // was corpseid
|
||||||
/*012*/ uint32 attack_skill; // was type
|
/*012*/ uint32 attack_skill; // was type
|
||||||
/*016*/ uint32 spell_id;
|
/*016*/ int32 spell_id;
|
||||||
/*020*/ uint32 bindzoneid; //bindzoneid?
|
/*020*/ uint32 bindzoneid; //bindzoneid?
|
||||||
/*024*/ uint32 damage;
|
/*024*/ uint32 damage;
|
||||||
/*028*/ uint32 unknown028;
|
/*028*/ uint32 unknown028;
|
||||||
@@ -2603,7 +2603,7 @@ struct GroupFollow_Struct { // Live Follow Struct
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct InspectBuffs_Struct {
|
struct InspectBuffs_Struct {
|
||||||
/*000*/ uint32 spell_id[BUFF_COUNT];
|
/*000*/ int32 spell_id[BUFF_COUNT];
|
||||||
/*168*/ int32 tics_remaining[BUFF_COUNT];
|
/*168*/ int32 tics_remaining[BUFF_COUNT];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3013,7 +3013,7 @@ struct Resurrect_Struct
|
|||||||
/*024*/ char your_name[64];
|
/*024*/ char your_name[64];
|
||||||
/*088*/ uint32 unknown088;
|
/*088*/ uint32 unknown088;
|
||||||
/*092*/ char rezzer_name[64];
|
/*092*/ char rezzer_name[64];
|
||||||
/*156*/ uint32 spellid;
|
/*156*/ int32 spellid;
|
||||||
/*160*/ char corpse_name[64];
|
/*160*/ char corpse_name[64];
|
||||||
/*224*/ uint32 action;
|
/*224*/ uint32 action;
|
||||||
/*228*/ uint32 unknown228;
|
/*228*/ uint32 unknown228;
|
||||||
@@ -4333,7 +4333,7 @@ struct SendAA_Struct {
|
|||||||
/*0045*/ uint32 prereq_minpoints_count; // mutliple prereqs at least 1, even no prereqs
|
/*0045*/ uint32 prereq_minpoints_count; // mutliple prereqs at least 1, even no prereqs
|
||||||
/*0049*/ uint32 prereq_minpoints; //min points in the prereq
|
/*0049*/ uint32 prereq_minpoints; //min points in the prereq
|
||||||
/*0053*/ uint32 type;
|
/*0053*/ uint32 type;
|
||||||
/*0057*/ uint32 spellid;
|
/*0057*/ int32 spellid;
|
||||||
/*0061*/ uint32 unknown057; // Introduced during HoT - Seen 1 - Maybe account status or enable/disable AA?
|
/*0061*/ uint32 unknown057; // Introduced during HoT - Seen 1 - Maybe account status or enable/disable AA?
|
||||||
/*0065*/ uint32 spell_type;
|
/*0065*/ uint32 spell_type;
|
||||||
/*0069*/ uint32 spell_refresh;
|
/*0069*/ uint32 spell_refresh;
|
||||||
|
|||||||
+56
-78
@@ -31,6 +31,8 @@
|
|||||||
#include "common/raid.h"
|
#include "common/raid.h"
|
||||||
#include "common/rulesys.h"
|
#include "common/rulesys.h"
|
||||||
#include "common/strings.h"
|
#include "common/strings.h"
|
||||||
|
#include "zone/client.h"
|
||||||
|
#include "zone/mob.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -61,7 +63,6 @@ namespace SoD
|
|||||||
static inline spells::CastingSlot ServerToSoDCastingSlot(EQ::spells::CastingSlot slot);
|
static inline spells::CastingSlot ServerToSoDCastingSlot(EQ::spells::CastingSlot slot);
|
||||||
static inline EQ::spells::CastingSlot SoDToServerCastingSlot(spells::CastingSlot slot);
|
static inline EQ::spells::CastingSlot SoDToServerCastingSlot(spells::CastingSlot slot);
|
||||||
|
|
||||||
static inline int ServerToSoDBuffSlot(int index);
|
|
||||||
static inline int SoDToServerBuffSlot(int index);
|
static inline int SoDToServerBuffSlot(int index);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
@@ -293,7 +294,7 @@ namespace SoD
|
|||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_Buff)
|
ENCODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -306,7 +307,7 @@ namespace SoD
|
|||||||
OUT(buff.duration);
|
OUT(buff.duration);
|
||||||
OUT(buff.counters);
|
OUT(buff.counters);
|
||||||
OUT(buff.player_id);
|
OUT(buff.player_id);
|
||||||
eq->slotid = ServerToSoDBuffSlot(emu->slotid);
|
OUT(slotid);
|
||||||
OUT(bufffade);
|
OUT(bufffade);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@@ -1375,38 +1376,6 @@ namespace SoD
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_PetBuffWindow)
|
|
||||||
{
|
|
||||||
EQApplicationPacket *in = *p;
|
|
||||||
*p = nullptr;
|
|
||||||
|
|
||||||
unsigned char *__emu_buffer = in->pBuffer;
|
|
||||||
PetBuff_Struct *emu = (PetBuff_Struct *)__emu_buffer;
|
|
||||||
int PacketSize = 7 + (emu->buffcount * 13);
|
|
||||||
in->size = PacketSize;
|
|
||||||
in->pBuffer = new unsigned char[in->size];
|
|
||||||
char *Buffer = (char *)in->pBuffer;
|
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petid);
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint16, Buffer, emu->buffcount);
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < PET_BUFF_COUNT; ++i)
|
|
||||||
{
|
|
||||||
if (emu->spellid[i])
|
|
||||||
{
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, i);
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->spellid[i]);
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->ticsremaining[i]);
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // This is a string. Name of the caster of the buff.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->buffcount); // I think this is actually some sort of type
|
|
||||||
|
|
||||||
delete[] __emu_buffer;
|
|
||||||
dest->FastQueuePacket(&in, ack_req);
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_PlayerProfile)
|
ENCODE(OP_PlayerProfile)
|
||||||
{
|
{
|
||||||
SETUP_DIRECT_ENCODE(PlayerProfile_Struct, structs::PlayerProfile_Struct);
|
SETUP_DIRECT_ENCODE(PlayerProfile_Struct, structs::PlayerProfile_Struct);
|
||||||
@@ -2145,35 +2114,6 @@ namespace SoD
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_TargetBuffs)
|
|
||||||
{
|
|
||||||
SETUP_VAR_ENCODE(BuffIcon_Struct);
|
|
||||||
|
|
||||||
uint32 sz = 7 + (13 * emu->count);
|
|
||||||
__packet->size = sz;
|
|
||||||
__packet->pBuffer = new unsigned char[sz];
|
|
||||||
memset(__packet->pBuffer, 0, sz);
|
|
||||||
|
|
||||||
uchar *ptr = __packet->pBuffer;
|
|
||||||
*((uint32*)ptr) = emu->entity_id;
|
|
||||||
ptr += sizeof(uint32);
|
|
||||||
|
|
||||||
*((uint16*)ptr) = emu->count;
|
|
||||||
ptr += sizeof(uint16);
|
|
||||||
|
|
||||||
for (uint16 i = 0; i < emu->count; ++i)
|
|
||||||
{
|
|
||||||
*((uint32*)ptr) = emu->entries[i].buff_slot;
|
|
||||||
ptr += sizeof(uint32);
|
|
||||||
*((uint32*)ptr) = emu->entries[i].spell_id;
|
|
||||||
ptr += sizeof(uint32);
|
|
||||||
*((uint32*)ptr) = emu->entries[i].tics_remaining;
|
|
||||||
ptr += sizeof(uint32);
|
|
||||||
ptr += 1;
|
|
||||||
}
|
|
||||||
FINISH_ENCODE();
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_TaskDescription)
|
ENCODE(OP_TaskDescription)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *in = *p;
|
EQApplicationPacket *in = *p;
|
||||||
@@ -2877,7 +2817,7 @@ namespace SoD
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -4259,19 +4199,6 @@ namespace SoD
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int ServerToSoDBuffSlot(int index)
|
|
||||||
{
|
|
||||||
// we're a disc
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS +
|
|
||||||
spells::LONG_BUFFS + spells::SHORT_BUFFS;
|
|
||||||
// we're a song
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS;
|
|
||||||
// we're a normal buff
|
|
||||||
return index; // as long as we guard against bad slots server side, we should be fine
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int SoDToServerBuffSlot(int index)
|
static inline int SoDToServerBuffSlot(int index)
|
||||||
{
|
{
|
||||||
// we're a disc
|
// we're a disc
|
||||||
@@ -4284,4 +4211,55 @@ namespace SoD
|
|||||||
// we're a normal buff
|
// we're a normal buff
|
||||||
return index; // as long as we guard against bad slots server side, we should be fine
|
return index; // as long as we guard against bad slots server side, we should be fine
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<EQApplicationPacket> BuffComponent::RefreshBuffs(EmuOpcode opcode, Mob* mob, bool remove,
|
||||||
|
bool buff_timers_suspended, const std::vector<uint32_t>& slots) const
|
||||||
|
{
|
||||||
|
if (opcode == OP_RefreshPetBuffs || opcode == OP_RefreshTargetBuffs) {
|
||||||
|
Buffs_Struct* buffs = mob->GetBuffs();
|
||||||
|
|
||||||
|
size_t buffer_size = 7; // 7 bytes outside the list
|
||||||
|
std::vector<uint32_t> send_slots;
|
||||||
|
if (slots.empty()) {
|
||||||
|
for (uint32_t slot = 0; slot < mob->GetMaxTotalSlots(); ++slot)
|
||||||
|
if (buffs[slot].spellid > 1) {
|
||||||
|
buffer_size += 13 + strlen(buffs[slot].caster_name); // 13 includes the null terminator
|
||||||
|
send_slots.push_back(slot);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (uint32_t slot : slots)
|
||||||
|
if (slot < mob->GetMaxTotalSlots() && buffs[slot].spellid > 1) {
|
||||||
|
buffer_size += 13 + strlen(buffs[slot].caster_name);
|
||||||
|
send_slots.push_back(slot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SoD only supports target and pet refresh, not self refresh packets
|
||||||
|
SerializeBuffer buffer(buffer_size);
|
||||||
|
|
||||||
|
buffer.WriteUInt32(mob->GetID());
|
||||||
|
buffer.WriteUInt16(send_slots.size());
|
||||||
|
|
||||||
|
for (uint32_t slot : send_slots) {
|
||||||
|
buffer.WriteUInt32(ServerToPatchBuffSlot(slot));
|
||||||
|
buffer.WriteInt32(remove ? -1 : buffs[slot].spellid);
|
||||||
|
buffer.WriteInt32(buffs[slot].ticsremaining);
|
||||||
|
buffer.WriteString(buffs[slot].caster_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.WriteUInt8(opcode == OP_RefreshPetBuffs ? 2 : 0);
|
||||||
|
|
||||||
|
return std::make_unique<EQApplicationPacket>(opcode, std::move(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0 = self buff window, 1 = self target window, 2 = pet buff or target window, 4 = group, 5 = PC, 7 = NPC
|
||||||
|
void BuffComponent::SetRefreshType(std::unique_ptr<EQApplicationPacket>& packet, uint8_t refresh_type) const
|
||||||
|
{
|
||||||
|
if (packet)
|
||||||
|
packet->pBuffer[packet->size - 1] = refresh_type;
|
||||||
|
}
|
||||||
|
|
||||||
} /*SoD*/
|
} /*SoD*/
|
||||||
|
|||||||
+27
-33
@@ -17,46 +17,40 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "sof.h"
|
|
||||||
#include "common/struct_strategy.h"
|
#include "common/struct_strategy.h"
|
||||||
|
#include "common/patches/sof.h"
|
||||||
|
|
||||||
class EQStreamIdentifier;
|
class EQStreamIdentifier;
|
||||||
|
|
||||||
namespace SoD
|
namespace SoD {
|
||||||
{
|
|
||||||
|
|
||||||
//these are the only public member of this namespace.
|
extern void Register(EQStreamIdentifier& into);
|
||||||
extern void Register(EQStreamIdentifier &into);
|
extern void Reload();
|
||||||
extern void Reload();
|
|
||||||
|
|
||||||
|
class Strategy : public StructStrategy
|
||||||
|
|
||||||
//you should not directly access anything below..
|
|
||||||
//I just dont feel like making a seperate header for it.
|
|
||||||
|
|
||||||
class Strategy : public StructStrategy {
|
|
||||||
public:
|
|
||||||
Strategy();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual std::string Describe() const;
|
|
||||||
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
|
||||||
|
|
||||||
//magic macro to declare our opcode processors
|
|
||||||
#include "ss_declare.h"
|
|
||||||
#include "sod_ops.h"
|
|
||||||
};
|
|
||||||
|
|
||||||
} /*SoD*/
|
|
||||||
|
|
||||||
namespace Message {
|
|
||||||
|
|
||||||
class SoD : public SoF
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SoD() = default;
|
Strategy();
|
||||||
~SoD() override = default;
|
|
||||||
|
protected:
|
||||||
|
virtual std::string Describe() const;
|
||||||
|
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
||||||
|
|
||||||
|
//magic macro to declare our opcode processors
|
||||||
|
#include "ss_declare.h"
|
||||||
|
#include "sod_ops.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Message
|
class BuffComponent : public Titanium::BuffComponent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BuffComponent(uint32_t maxLongBuffs, uint32_t maxShortBuffs) : Titanium::BuffComponent(maxLongBuffs, maxShortBuffs) {}
|
||||||
|
BuffComponent() = delete;
|
||||||
|
~BuffComponent() override = default;
|
||||||
|
|
||||||
|
std::unique_ptr<EQApplicationPacket> RefreshBuffs(EmuOpcode opcode, Mob* mob, bool remove,
|
||||||
|
bool buff_timers_suspended, const std::vector<uint32_t>& slots) const override;
|
||||||
|
void SetRefreshType(std::unique_ptr<EQApplicationPacket>& packet, uint8_t refresh_type) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} /*SoD*/
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ E(OP_ApplyPoison)
|
|||||||
E(OP_AugmentInfo)
|
E(OP_AugmentInfo)
|
||||||
E(OP_Barter)
|
E(OP_Barter)
|
||||||
E(OP_BazaarSearch)
|
E(OP_BazaarSearch)
|
||||||
E(OP_Buff)
|
E(OP_BuffDefinition)
|
||||||
E(OP_CancelTrade)
|
E(OP_CancelTrade)
|
||||||
E(OP_ChannelMessage)
|
E(OP_ChannelMessage)
|
||||||
E(OP_CharInventory)
|
E(OP_CharInventory)
|
||||||
@@ -65,7 +65,6 @@ E(OP_MoveItem)
|
|||||||
E(OP_NewSpawn)
|
E(OP_NewSpawn)
|
||||||
E(OP_NewZone)
|
E(OP_NewZone)
|
||||||
E(OP_OnLevelMessage)
|
E(OP_OnLevelMessage)
|
||||||
E(OP_PetBuffWindow)
|
|
||||||
E(OP_PlayerProfile)
|
E(OP_PlayerProfile)
|
||||||
E(OP_RaidJoin)
|
E(OP_RaidJoin)
|
||||||
E(OP_RaidUpdate)
|
E(OP_RaidUpdate)
|
||||||
@@ -80,7 +79,6 @@ E(OP_SomeItemPacketMaybe)
|
|||||||
E(OP_SpawnDoor)
|
E(OP_SpawnDoor)
|
||||||
E(OP_SpecialMesg)
|
E(OP_SpecialMesg)
|
||||||
E(OP_Stun)
|
E(OP_Stun)
|
||||||
E(OP_TargetBuffs)
|
|
||||||
E(OP_TaskDescription)
|
E(OP_TaskDescription)
|
||||||
E(OP_Track)
|
E(OP_Track)
|
||||||
E(OP_Trader)
|
E(OP_Trader)
|
||||||
@@ -102,7 +100,7 @@ D(OP_AugmentInfo)
|
|||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_BazaarSearch)
|
D(OP_BazaarSearch)
|
||||||
D(OP_BookButton)
|
D(OP_BookButton)
|
||||||
D(OP_Buff)
|
D(OP_BuffDefinition)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
D(OP_ChannelMessage)
|
D(OP_ChannelMessage)
|
||||||
D(OP_CharacterCreate)
|
D(OP_CharacterCreate)
|
||||||
|
|||||||
@@ -480,7 +480,7 @@ struct NewZone_Struct {
|
|||||||
*/
|
*/
|
||||||
struct MemorizeSpell_Struct {
|
struct MemorizeSpell_Struct {
|
||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
int32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
uint32 reduction; // lowers reuse
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
@@ -517,7 +517,7 @@ struct ManaChange_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
/*04*/ uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
/*08*/ uint32 spell_id;
|
/*08*/ int32 spell_id;
|
||||||
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
||||||
@@ -535,14 +535,14 @@ struct BeginCast_Struct
|
|||||||
{
|
{
|
||||||
// len = 8
|
// len = 8
|
||||||
/*004*/ uint16 caster_id;
|
/*004*/ uint16 caster_id;
|
||||||
/*006*/ uint16 spell_id;
|
/*006*/ int16 spell_id;
|
||||||
/*016*/ uint32 cast_time; // in miliseconds
|
/*016*/ uint32 cast_time; // in miliseconds
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CastSpell_Struct
|
struct CastSpell_Struct
|
||||||
{
|
{
|
||||||
uint32 slot;
|
uint32 slot;
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
||||||
uint32 target_id;
|
uint32 target_id;
|
||||||
uint8 cs_unknown[4];
|
uint8 cs_unknown[4];
|
||||||
@@ -571,7 +571,7 @@ struct SpellBuff_Struct
|
|||||||
/*001*/ uint8 level; // Seen 1 for no buff
|
/*001*/ uint8 level; // Seen 1 for no buff
|
||||||
/*002*/ uint8 bard_modifier;
|
/*002*/ uint8 bard_modifier;
|
||||||
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*004*/ uint32 spellid;
|
/*004*/ int32 spellid;
|
||||||
/*008*/ uint32 duration;
|
/*008*/ uint32 duration;
|
||||||
/*012*/ uint32 counters;
|
/*012*/ uint32 counters;
|
||||||
/*016*/ uint32 unknown016;
|
/*016*/ uint32 unknown016;
|
||||||
@@ -1266,7 +1266,7 @@ struct CombatDamage_Struct
|
|||||||
/* 00 */ uint16 target;
|
/* 00 */ uint16 target;
|
||||||
/* 02 */ uint16 source;
|
/* 02 */ uint16 source;
|
||||||
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
||||||
/* 05 */ uint16 spellid;
|
/* 05 */ int16 spellid;
|
||||||
/* 07 */ int32 damage;
|
/* 07 */ int32 damage;
|
||||||
/* 11 */ float force; // cd cc cc 3d
|
/* 11 */ float force; // cd cc cc 3d
|
||||||
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
||||||
@@ -1301,7 +1301,7 @@ struct Death_Struct
|
|||||||
/*004*/ uint32 killer_id;
|
/*004*/ uint32 killer_id;
|
||||||
/*008*/ uint32 corpseid; // was corpseid
|
/*008*/ uint32 corpseid; // was corpseid
|
||||||
/*012*/ uint32 attack_skill; // was type
|
/*012*/ uint32 attack_skill; // was type
|
||||||
/*016*/ uint32 spell_id;
|
/*016*/ int32 spell_id;
|
||||||
/*020*/ uint32 bindzoneid; //bindzoneid?
|
/*020*/ uint32 bindzoneid; //bindzoneid?
|
||||||
/*024*/ uint32 damage;
|
/*024*/ uint32 damage;
|
||||||
/*028*/ uint32 unknown028;
|
/*028*/ uint32 unknown028;
|
||||||
@@ -2534,7 +2534,7 @@ struct Resurrect_Struct {
|
|||||||
char your_name[64];
|
char your_name[64];
|
||||||
uint32 unknown88;
|
uint32 unknown88;
|
||||||
char rezzer_name[64];
|
char rezzer_name[64];
|
||||||
uint32 spellid;
|
int32 spellid;
|
||||||
char corpse_name[64];
|
char corpse_name[64];
|
||||||
uint32 action;
|
uint32 action;
|
||||||
/* 228 */
|
/* 228 */
|
||||||
@@ -3787,7 +3787,7 @@ struct SendAA_Struct {
|
|||||||
/*0037*/ uint32 prereq_skill; //is < 0, abs() is category #
|
/*0037*/ uint32 prereq_skill; //is < 0, abs() is category #
|
||||||
/*0041*/ uint32 prereq_minpoints; //min points in the prereq
|
/*0041*/ uint32 prereq_minpoints; //min points in the prereq
|
||||||
/*0045*/ uint32 type;
|
/*0045*/ uint32 type;
|
||||||
/*0049*/ uint32 spellid;
|
/*0049*/ int32 spellid;
|
||||||
/*0053*/ uint32 spell_type;
|
/*0053*/ uint32 spell_type;
|
||||||
/*0057*/ uint32 spell_refresh;
|
/*0057*/ uint32 spell_refresh;
|
||||||
/*0061*/ uint32 classes;
|
/*0061*/ uint32 classes;
|
||||||
|
|||||||
+4
-39
@@ -60,7 +60,6 @@ namespace SoF
|
|||||||
static inline spells::CastingSlot ServerToSoFCastingSlot(EQ::spells::CastingSlot slot);
|
static inline spells::CastingSlot ServerToSoFCastingSlot(EQ::spells::CastingSlot slot);
|
||||||
static inline EQ::spells::CastingSlot SoFToServerCastingSlot(spells::CastingSlot slot, uint32 item_location);
|
static inline EQ::spells::CastingSlot SoFToServerCastingSlot(spells::CastingSlot slot, uint32 item_location);
|
||||||
|
|
||||||
static inline int ServerToSoFBuffSlot(int index);
|
|
||||||
static inline int SoFToServerBuffSlot(int index);
|
static inline int SoFToServerBuffSlot(int index);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
@@ -272,7 +271,7 @@ namespace SoF
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_Buff)
|
ENCODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -285,7 +284,7 @@ namespace SoF
|
|||||||
OUT(buff.duration);
|
OUT(buff.duration);
|
||||||
OUT(buff.counters);
|
OUT(buff.counters);
|
||||||
OUT(buff.player_id);
|
OUT(buff.player_id);
|
||||||
eq->slotid = ServerToSoFBuffSlot(emu->slotid);
|
eq->slotid = SoFToServerBuffSlot(emu->slotid);
|
||||||
OUT(bufffade);
|
OUT(bufffade);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@@ -1049,28 +1048,6 @@ namespace SoF
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_PetBuffWindow)
|
|
||||||
{
|
|
||||||
ENCODE_LENGTH_EXACT(PetBuff_Struct);
|
|
||||||
SETUP_DIRECT_ENCODE(PetBuff_Struct, PetBuff_Struct);
|
|
||||||
|
|
||||||
OUT(petid);
|
|
||||||
OUT(buffcount);
|
|
||||||
|
|
||||||
int EQBuffSlot = 0; // do we really want to shuffle them around like this?
|
|
||||||
|
|
||||||
for (uint32 EmuBuffSlot = 0; EmuBuffSlot < PET_BUFF_COUNT; ++EmuBuffSlot)
|
|
||||||
{
|
|
||||||
if (emu->spellid[EmuBuffSlot])
|
|
||||||
{
|
|
||||||
eq->spellid[EQBuffSlot] = emu->spellid[EmuBuffSlot];
|
|
||||||
eq->ticsremaining[EQBuffSlot++] = emu->ticsremaining[EmuBuffSlot];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_PlayerProfile)
|
ENCODE(OP_PlayerProfile)
|
||||||
{
|
{
|
||||||
SETUP_DIRECT_ENCODE(PlayerProfile_Struct, structs::PlayerProfile_Struct);
|
SETUP_DIRECT_ENCODE(PlayerProfile_Struct, structs::PlayerProfile_Struct);
|
||||||
@@ -2321,7 +2298,7 @@ namespace SoF
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -2334,7 +2311,7 @@ namespace SoF
|
|||||||
IN(buff.duration);
|
IN(buff.duration);
|
||||||
IN(buff.counters);
|
IN(buff.counters);
|
||||||
IN(buff.player_id);
|
IN(buff.player_id);
|
||||||
emu->slotid = SoFToServerBuffSlot(eq->slotid);
|
IN(slotid);
|
||||||
IN(bufffade);
|
IN(bufffade);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
@@ -3657,18 +3634,6 @@ namespace SoF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int ServerToSoFBuffSlot(int index) {
|
|
||||||
// we're a disc
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS +
|
|
||||||
spells::LONG_BUFFS + spells::SHORT_BUFFS;
|
|
||||||
// we're a song
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS;
|
|
||||||
// we're a normal buff
|
|
||||||
return index; // as long as we guard against bad slots server side, we should be fine
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int SoFToServerBuffSlot(int index)
|
static inline int SoFToServerBuffSlot(int index)
|
||||||
{
|
{
|
||||||
// we're a disc
|
// we're a disc
|
||||||
|
|||||||
+15
-33
@@ -17,46 +17,28 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "titanium.h"
|
|
||||||
#include "common/struct_strategy.h"
|
#include "common/struct_strategy.h"
|
||||||
|
#include "common/patches/titanium.h"
|
||||||
|
|
||||||
class EQStreamIdentifier;
|
class EQStreamIdentifier;
|
||||||
|
|
||||||
namespace SoF
|
namespace SoF {
|
||||||
{
|
|
||||||
|
|
||||||
//these are the only public member of this namespace.
|
extern void Register(EQStreamIdentifier& into);
|
||||||
extern void Register(EQStreamIdentifier &into);
|
extern void Reload();
|
||||||
extern void Reload();
|
|
||||||
|
|
||||||
|
class Strategy : public StructStrategy
|
||||||
|
|
||||||
//you should not directly access anything below..
|
|
||||||
//I just dont feel like making a seperate header for it.
|
|
||||||
|
|
||||||
class Strategy : public StructStrategy {
|
|
||||||
public:
|
|
||||||
Strategy();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual std::string Describe() const;
|
|
||||||
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
|
||||||
|
|
||||||
//magic macro to declare our opcode processors
|
|
||||||
#include "ss_declare.h"
|
|
||||||
#include "sof_ops.h"
|
|
||||||
};
|
|
||||||
|
|
||||||
} /*SoF*/
|
|
||||||
|
|
||||||
namespace Message {
|
|
||||||
|
|
||||||
class SoF : public Titanium
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SoF() = default;
|
Strategy();
|
||||||
~SoF() override = default;
|
|
||||||
|
protected:
|
||||||
|
virtual std::string Describe() const;
|
||||||
|
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
||||||
|
|
||||||
|
//magic macro to declare our opcode processors
|
||||||
|
#include "ss_declare.h"
|
||||||
|
#include "sof_ops.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Message
|
} /*SoF*/
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ E(OP_ApplyPoison)
|
|||||||
E(OP_AugmentInfo)
|
E(OP_AugmentInfo)
|
||||||
E(OP_BazaarSearch)
|
E(OP_BazaarSearch)
|
||||||
E(OP_BecomeTrader)
|
E(OP_BecomeTrader)
|
||||||
E(OP_Buff)
|
E(OP_BuffDefinition)
|
||||||
E(OP_CancelTrade)
|
E(OP_CancelTrade)
|
||||||
E(OP_ChannelMessage)
|
E(OP_ChannelMessage)
|
||||||
E(OP_CharInventory)
|
E(OP_CharInventory)
|
||||||
@@ -60,7 +60,6 @@ E(OP_MoveItem)
|
|||||||
E(OP_NewSpawn)
|
E(OP_NewSpawn)
|
||||||
E(OP_NewZone)
|
E(OP_NewZone)
|
||||||
E(OP_OnLevelMessage)
|
E(OP_OnLevelMessage)
|
||||||
E(OP_PetBuffWindow)
|
|
||||||
E(OP_PlayerProfile)
|
E(OP_PlayerProfile)
|
||||||
E(OP_RaidJoin)
|
E(OP_RaidJoin)
|
||||||
E(OP_RaidUpdate)
|
E(OP_RaidUpdate)
|
||||||
@@ -93,7 +92,7 @@ D(OP_ApplyPoison)
|
|||||||
D(OP_AugmentInfo)
|
D(OP_AugmentInfo)
|
||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_BookButton)
|
D(OP_BookButton)
|
||||||
D(OP_Buff)
|
D(OP_BuffDefinition)
|
||||||
D(OP_Bug)
|
D(OP_Bug)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
D(OP_ChannelMessage)
|
D(OP_ChannelMessage)
|
||||||
|
|||||||
@@ -480,7 +480,7 @@ struct NewZone_Struct {
|
|||||||
*/
|
*/
|
||||||
struct MemorizeSpell_Struct {
|
struct MemorizeSpell_Struct {
|
||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
int32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
uint32 reduction; // lowers reuse
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
@@ -517,7 +517,7 @@ struct ManaChange_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
/*04*/ uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
/*08*/ uint32 spell_id;
|
/*08*/ int32 spell_id;
|
||||||
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
||||||
@@ -535,14 +535,14 @@ struct BeginCast_Struct
|
|||||||
{
|
{
|
||||||
// len = 8
|
// len = 8
|
||||||
/*004*/ uint16 caster_id;
|
/*004*/ uint16 caster_id;
|
||||||
/*006*/ uint16 spell_id;
|
/*006*/ int16 spell_id;
|
||||||
/*016*/ uint32 cast_time; // in miliseconds
|
/*016*/ uint32 cast_time; // in miliseconds
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CastSpell_Struct
|
struct CastSpell_Struct
|
||||||
{
|
{
|
||||||
uint32 slot;
|
uint32 slot;
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
||||||
uint32 target_id;
|
uint32 target_id;
|
||||||
uint8 cs_unknown[4];
|
uint8 cs_unknown[4];
|
||||||
@@ -571,7 +571,7 @@ struct SpellBuff_Struct
|
|||||||
/*001*/ uint8 level; // Seen 1 for no buff
|
/*001*/ uint8 level; // Seen 1 for no buff
|
||||||
/*002*/ uint8 bard_modifier;
|
/*002*/ uint8 bard_modifier;
|
||||||
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*004*/ uint32 spellid;
|
/*004*/ int32 spellid;
|
||||||
/*008*/ uint32 duration;
|
/*008*/ uint32 duration;
|
||||||
/*012*/ uint32 counters;
|
/*012*/ uint32 counters;
|
||||||
/*016*/ uint32 unknown016;
|
/*016*/ uint32 unknown016;
|
||||||
@@ -1266,7 +1266,7 @@ struct CombatDamage_Struct
|
|||||||
/* 00 */ uint16 target;
|
/* 00 */ uint16 target;
|
||||||
/* 02 */ uint16 source;
|
/* 02 */ uint16 source;
|
||||||
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
||||||
/* 05 */ uint16 spellid;
|
/* 05 */ int16 spellid;
|
||||||
/* 07 */ int32 damage;
|
/* 07 */ int32 damage;
|
||||||
/* 11 */ float force; // cd cc cc 3d
|
/* 11 */ float force; // cd cc cc 3d
|
||||||
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
||||||
@@ -1301,7 +1301,7 @@ struct Death_Struct
|
|||||||
/*004*/ uint32 killer_id;
|
/*004*/ uint32 killer_id;
|
||||||
/*008*/ uint32 corpseid; // was corpseid
|
/*008*/ uint32 corpseid; // was corpseid
|
||||||
/*012*/ uint32 attack_skill; // was type
|
/*012*/ uint32 attack_skill; // was type
|
||||||
/*016*/ uint32 spell_id;
|
/*016*/ int32 spell_id;
|
||||||
/*020*/ uint32 bindzoneid; //bindzoneid?
|
/*020*/ uint32 bindzoneid; //bindzoneid?
|
||||||
/*024*/ uint32 damage;
|
/*024*/ uint32 damage;
|
||||||
/*028*/ uint32 unknown028;
|
/*028*/ uint32 unknown028;
|
||||||
@@ -2504,7 +2504,7 @@ struct Resurrect_Struct {
|
|||||||
char your_name[64];
|
char your_name[64];
|
||||||
uint32 unknown88;
|
uint32 unknown88;
|
||||||
char rezzer_name[64];
|
char rezzer_name[64];
|
||||||
uint32 spellid;
|
int32 spellid;
|
||||||
char corpse_name[64];
|
char corpse_name[64];
|
||||||
uint32 action;
|
uint32 action;
|
||||||
/* 228 */
|
/* 228 */
|
||||||
@@ -3711,7 +3711,7 @@ struct SendAA_Struct {
|
|||||||
/*0037*/ uint32 prereq_skill; //is < 0, abs() is category #
|
/*0037*/ uint32 prereq_skill; //is < 0, abs() is category #
|
||||||
/*0041*/ uint32 prereq_minpoints; //min points in the prereq
|
/*0041*/ uint32 prereq_minpoints; //min points in the prereq
|
||||||
/*0045*/ uint32 type;
|
/*0045*/ uint32 type;
|
||||||
/*0049*/ uint32 spellid;
|
/*0049*/ int32 spellid;
|
||||||
/*0053*/ uint32 spell_type;
|
/*0053*/ uint32 spell_type;
|
||||||
/*0057*/ uint32 spell_refresh;
|
/*0057*/ uint32 spell_refresh;
|
||||||
/*0061*/ uint32 classes;
|
/*0061*/ uint32 classes;
|
||||||
|
|||||||
+13
-20
@@ -23,27 +23,20 @@ class EQStreamIdentifier;
|
|||||||
|
|
||||||
namespace TEMPLATE {
|
namespace TEMPLATE {
|
||||||
|
|
||||||
//these are the only public member of this namespace.
|
extern void Register(EQStreamIdentifier& into);
|
||||||
extern void Register(EQStreamIdentifier &into);
|
extern void Reload();
|
||||||
extern void Reload();
|
|
||||||
|
|
||||||
|
class Strategy : public StructStrategy
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Strategy();
|
||||||
|
|
||||||
|
protected:
|
||||||
//you should not directly access anything below..
|
virtual std::string Describe() const;
|
||||||
//I just dont feel like making a seperate header for it.
|
virtual const EQClientVersion ClientVersion() const;
|
||||||
|
//magic macro to declare our opcodes
|
||||||
class Strategy : public StructStrategy {
|
#include "ss_declare.h"
|
||||||
public:
|
#include "TEMPLATE_ops.h"
|
||||||
Strategy();
|
};
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual std::string Describe() const;
|
|
||||||
virtual const EQClientVersion ClientVersion() const;
|
|
||||||
//magic macro to declare our opcodes
|
|
||||||
#include "ss_declare.h"
|
|
||||||
#include "TEMPLATE_ops.h"
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
+98
-54
@@ -32,6 +32,7 @@
|
|||||||
#include "common/raid.h"
|
#include "common/raid.h"
|
||||||
#include "common/rulesys.h"
|
#include "common/rulesys.h"
|
||||||
#include "common/strings.h"
|
#include "common/strings.h"
|
||||||
|
#include "zone/mob.h"
|
||||||
#include "zone/string_ids.h"
|
#include "zone/string_ids.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -62,7 +63,6 @@ namespace Titanium
|
|||||||
static inline spells::CastingSlot ServerToTitaniumCastingSlot(EQ::spells::CastingSlot slot);
|
static inline spells::CastingSlot ServerToTitaniumCastingSlot(EQ::spells::CastingSlot slot);
|
||||||
static inline EQ::spells::CastingSlot TitaniumToServerCastingSlot(spells::CastingSlot slot, uint32 item_location);
|
static inline EQ::spells::CastingSlot TitaniumToServerCastingSlot(spells::CastingSlot slot, uint32 item_location);
|
||||||
|
|
||||||
static inline int ServerToTitaniumBuffSlot(int index);
|
|
||||||
static inline int TitaniumToServerBuffSlot(int index);
|
static inline int TitaniumToServerBuffSlot(int index);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
@@ -326,7 +326,7 @@ namespace Titanium
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_Buff)
|
ENCODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -339,7 +339,7 @@ namespace Titanium
|
|||||||
OUT(buff.duration);
|
OUT(buff.duration);
|
||||||
OUT(buff.counters);
|
OUT(buff.counters);
|
||||||
OUT(buff.player_id);
|
OUT(buff.player_id);
|
||||||
eq->slotid = ServerToTitaniumBuffSlot(emu->slotid);
|
OUT(slotid);
|
||||||
OUT(bufffade);
|
OUT(bufffade);
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@@ -1307,28 +1307,6 @@ namespace Titanium
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_PetBuffWindow)
|
|
||||||
{
|
|
||||||
ENCODE_LENGTH_EXACT(PetBuff_Struct);
|
|
||||||
SETUP_DIRECT_ENCODE(PetBuff_Struct, PetBuff_Struct);
|
|
||||||
|
|
||||||
OUT(petid);
|
|
||||||
OUT(buffcount);
|
|
||||||
|
|
||||||
int EQBuffSlot = 0; // do we really want to shuffle them around like this?
|
|
||||||
|
|
||||||
for (uint32 EmuBuffSlot = 0; EmuBuffSlot < PET_BUFF_COUNT; ++EmuBuffSlot)
|
|
||||||
{
|
|
||||||
if (emu->spellid[EmuBuffSlot])
|
|
||||||
{
|
|
||||||
eq->spellid[EQBuffSlot] = emu->spellid[EmuBuffSlot];
|
|
||||||
eq->ticsremaining[EQBuffSlot++] = emu->ticsremaining[EmuBuffSlot];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_PlayerProfile)
|
ENCODE(OP_PlayerProfile)
|
||||||
{
|
{
|
||||||
SETUP_DIRECT_ENCODE(PlayerProfile_Struct, structs::PlayerProfile_Struct);
|
SETUP_DIRECT_ENCODE(PlayerProfile_Struct, structs::PlayerProfile_Struct);
|
||||||
@@ -2540,7 +2518,7 @@ namespace Titanium
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -3894,19 +3872,6 @@ namespace Titanium
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int ServerToTitaniumBuffSlot(int index)
|
|
||||||
{
|
|
||||||
// we're a disc
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS +
|
|
||||||
spells::LONG_BUFFS + spells::SHORT_BUFFS;
|
|
||||||
// we're a song
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS;
|
|
||||||
// we're a normal buff
|
|
||||||
return index; // as long as we guard against bad slots server side, we should be fine
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int TitaniumToServerBuffSlot(int index)
|
static inline int TitaniumToServerBuffSlot(int index)
|
||||||
{
|
{
|
||||||
// we're a disc
|
// we're a disc
|
||||||
@@ -3919,10 +3884,8 @@ namespace Titanium
|
|||||||
// we're a normal buff
|
// we're a normal buff
|
||||||
return index; // as long as we guard against bad slots server side, we should be fine
|
return index; // as long as we guard against bad slots server side, we should be fine
|
||||||
}
|
}
|
||||||
} /*Titanium*/
|
|
||||||
|
|
||||||
namespace Message {
|
std::unique_ptr<EQApplicationPacket> MessageComponent::Simple(uint32_t color, uint32_t id) const
|
||||||
std::unique_ptr<EQApplicationPacket> Titanium::Simple(uint32_t color, uint32_t id) const
|
|
||||||
{
|
{
|
||||||
uint32_t string_id = ResolveID(id);
|
uint32_t string_id = ResolveID(id);
|
||||||
if (string_id > 0) {
|
if (string_id > 0) {
|
||||||
@@ -3938,8 +3901,8 @@ std::unique_ptr<EQApplicationPacket> Titanium::Simple(uint32_t color, uint32_t i
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<EQApplicationPacket> Titanium::Formatted(
|
std::unique_ptr<EQApplicationPacket> MessageComponent::Formatted(uint32_t color, uint32_t id,
|
||||||
uint32_t color, uint32_t id, const std::array<const char*, 9>& args) const
|
const FormattedArgs& args) const
|
||||||
{
|
{
|
||||||
uint32_t string_id = ResolveID(id);
|
uint32_t string_id = ResolveID(id);
|
||||||
if (string_id > 0) {
|
if (string_id > 0) {
|
||||||
@@ -3966,7 +3929,7 @@ std::unique_ptr<EQApplicationPacket> Titanium::Formatted(
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<EQApplicationPacket> Titanium::InterruptSpell(uint32_t message, uint32_t spawn_id,
|
std::unique_ptr<EQApplicationPacket> MessageComponent::InterruptSpell(uint32_t message, uint32_t spawn_id,
|
||||||
const char* spell_link) const
|
const char* spell_link) const
|
||||||
{
|
{
|
||||||
auto outapp = std::make_unique<EQApplicationPacket>(OP_InterruptCast, sizeof(InterruptCast_Struct));
|
auto outapp = std::make_unique<EQApplicationPacket>(OP_InterruptCast, sizeof(InterruptCast_Struct));
|
||||||
@@ -3978,40 +3941,121 @@ std::unique_ptr<EQApplicationPacket> Titanium::InterruptSpell(uint32_t message,
|
|||||||
return outapp;
|
return outapp;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<EQApplicationPacket> Titanium::InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id,
|
std::unique_ptr<EQApplicationPacket> MessageComponent::InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id,
|
||||||
const char* name,
|
const char* name, const char* spell_link) const
|
||||||
const char* spell_link) const
|
|
||||||
{
|
{
|
||||||
auto outapp = std::make_unique<EQApplicationPacket>(OP_InterruptCast, sizeof(InterruptCast_Struct) + strlen(name) + 1);
|
auto outapp = std::make_unique<EQApplicationPacket>(OP_InterruptCast, sizeof(InterruptCast_Struct) + strlen(name) + 1);
|
||||||
auto ic = reinterpret_cast<InterruptCast_Struct*>(outapp->pBuffer);
|
auto ic = reinterpret_cast<InterruptCast_Struct*>(outapp->pBuffer);
|
||||||
ic->messageid = ResolveID(message);
|
ic->messageid = ResolveID(message);
|
||||||
ic->spawnid = spawn_id;
|
ic->spawnid = spawn_id;
|
||||||
fmt::format_to_n(ic->message, strlen(name) + 1, "{}\0", name);
|
strcpy(ic->message, spell_link);
|
||||||
return outapp;
|
return outapp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// A value of 0 means that the string isn't mapped in this client, valid string ids start at 1
|
// A value of 0 means that the string isn't mapped in this client, valid string ids start at 1
|
||||||
uint32_t Titanium::ResolveID(uint32_t id) const
|
uint32_t MessageComponent::ResolveID(uint32_t id) const
|
||||||
{
|
{
|
||||||
// passthrough — string IDs are defined at the base client level;
|
// passthrough — string IDs are defined at the base client level;
|
||||||
// override in patches where IDs need remapping
|
// override in patches where IDs need remapping
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Titanium::ResolveArguments(uint32_t id, std::array<const char*, 9>& args) const
|
void MessageComponent::ResolveArguments(uint32_t id, std::array<const char*, 9>& args) const
|
||||||
{
|
{
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case SPELL_FIZZLE:
|
case SPELL_FIZZLE:
|
||||||
case MISS_NOTE:
|
case MISS_NOTE:
|
||||||
args[0] = nullptr; // drop spell link
|
args[0] = nullptr; // the 0th (and only) argument here is the spell link, not supported before TOB
|
||||||
break;
|
break;
|
||||||
case SPELL_FIZZLE_OTHER:
|
case SPELL_FIZZLE_OTHER:
|
||||||
case MISSED_NOTE_OTHER:
|
case MISSED_NOTE_OTHER:
|
||||||
args[1] = nullptr; // drop spell link
|
args[1] = nullptr; // the 1st argument here is the spell link, not supported before TOB
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Message
|
std::unique_ptr<EQApplicationPacket> BuffComponent::BuffDefinition(Mob* mob, const Buffs_Struct& buff, uint32_t slot,
|
||||||
|
bool fade) const
|
||||||
|
{
|
||||||
|
auto outapp = std::make_unique<EQApplicationPacket>(OP_BuffDefinition, sizeof(SpellBuffPacket_Struct));
|
||||||
|
auto sbf = reinterpret_cast<SpellBuffPacket_Struct*>(outapp->pBuffer);
|
||||||
|
|
||||||
|
sbf->entityid = mob->GetID();
|
||||||
|
|
||||||
|
sbf->buff.effect_type = 2;
|
||||||
|
|
||||||
|
sbf->buff.level = buff.casterlevel > 0 ? buff.casterlevel : mob->GetLevel();
|
||||||
|
sbf->buff.bard_modifier = buff.instrument_mod;
|
||||||
|
sbf->buff.spellid = buff.spellid;
|
||||||
|
sbf->buff.duration = buff.ticsremaining;
|
||||||
|
if (buff.dot_rune)
|
||||||
|
sbf->buff.counters = buff.dot_rune;
|
||||||
|
else if (buff.magic_rune)
|
||||||
|
sbf->buff.counters = buff.magic_rune;
|
||||||
|
else if (buff.melee_rune)
|
||||||
|
sbf->buff.counters = buff.melee_rune;
|
||||||
|
else if (buff.counters)
|
||||||
|
sbf->buff.counters = buff.counters;
|
||||||
|
sbf->buff.player_id = buff.casterid;
|
||||||
|
sbf->buff.num_hits = buff.hit_number;
|
||||||
|
sbf->buff.y = buff.caston_y;
|
||||||
|
sbf->buff.x = buff.caston_x;
|
||||||
|
sbf->buff.z = buff.caston_z;
|
||||||
|
|
||||||
|
sbf->slotid = ServerToPatchBuffSlot(slot);
|
||||||
|
sbf->bufffade = fade;
|
||||||
|
|
||||||
|
return outapp;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<EQApplicationPacket> BuffComponent::RefreshBuffs(EmuOpcode opcode, Mob* mob, bool remove,
|
||||||
|
bool buff_timers_suspended, const std::vector<uint32_t>& slots) const
|
||||||
|
{
|
||||||
|
// titanium only sends refresh for pet buffs
|
||||||
|
if (opcode == OP_RefreshPetBuffs) {
|
||||||
|
Buffs_Struct* buffs = mob->GetBuffs();
|
||||||
|
|
||||||
|
std::vector<uint32_t> send_slots;
|
||||||
|
if (slots.empty()) {
|
||||||
|
for (uint32_t slot = 0; slot < mob->GetMaxTotalSlots(); ++slot)
|
||||||
|
if (buffs[slot].spellid > 1)
|
||||||
|
send_slots.push_back(slot);
|
||||||
|
} else {
|
||||||
|
for (uint32_t slot : slots)
|
||||||
|
if (slot < mob->GetMaxTotalSlots() && buffs[slot].spellid > 1)
|
||||||
|
send_slots.push_back(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto outapp = std::make_unique<EQApplicationPacket>(OP_RefreshPetBuffs, sizeof(PetBuff_Struct));
|
||||||
|
auto pbs = reinterpret_cast<PetBuff_Struct*>(outapp->pBuffer);
|
||||||
|
memset(outapp->pBuffer, 0, outapp->size);
|
||||||
|
|
||||||
|
pbs->petid = mob->GetID();
|
||||||
|
int MaxSlots = mob->GetMaxTotalSlots();
|
||||||
|
if (MaxSlots > PET_BUFF_COUNT)
|
||||||
|
MaxSlots = PET_BUFF_COUNT;
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for (uint32_t slot : send_slots) {
|
||||||
|
if (slot < MaxSlots) {
|
||||||
|
pbs->spellid[slot] = buffs[slot].spellid;
|
||||||
|
pbs->ticsremaining[slot] = buffs[slot].ticsremaining;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pbs->buffcount = count;
|
||||||
|
|
||||||
|
return outapp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BuffComponent::NeedsWearMessage() const { return true; }
|
||||||
|
|
||||||
|
void BuffComponent::SetRefreshType(std::unique_ptr<EQApplicationPacket>& packet, uint8_t refresh_type) const {}
|
||||||
|
|
||||||
|
} /*Titanium*/
|
||||||
|
|||||||
+39
-35
@@ -17,51 +17,40 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "IMessage.h"
|
|
||||||
#include "common/struct_strategy.h"
|
#include "common/struct_strategy.h"
|
||||||
|
#include "common/patches/IBuff.h"
|
||||||
|
#include "common/patches/IMessage.h"
|
||||||
|
|
||||||
class EQStreamIdentifier;
|
class EQStreamIdentifier;
|
||||||
|
|
||||||
namespace Titanium
|
namespace Titanium {
|
||||||
{
|
|
||||||
|
|
||||||
//these are the only public member of this namespace.
|
extern void Register(EQStreamIdentifier& into);
|
||||||
extern void Register(EQStreamIdentifier &into);
|
extern void Reload();
|
||||||
extern void Reload();
|
|
||||||
|
|
||||||
|
class Strategy : public StructStrategy
|
||||||
|
|
||||||
//you should not directly access anything below..
|
|
||||||
//I just dont feel like making a seperate header for it.
|
|
||||||
|
|
||||||
class Strategy : public StructStrategy {
|
|
||||||
public:
|
|
||||||
Strategy();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual std::string Describe() const;
|
|
||||||
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
|
||||||
|
|
||||||
//magic macro to declare our opcode processors
|
|
||||||
#include "ss_declare.h"
|
|
||||||
#include "titanium_ops.h"
|
|
||||||
};
|
|
||||||
|
|
||||||
} /*Titanium*/
|
|
||||||
|
|
||||||
// out-going message packets
|
|
||||||
namespace Message {
|
|
||||||
|
|
||||||
class Titanium : public IMessage
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Titanium() = default;
|
Strategy();
|
||||||
~Titanium() override = default;
|
|
||||||
|
protected:
|
||||||
|
virtual std::string Describe() const;
|
||||||
|
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
||||||
|
|
||||||
|
//magic macro to declare our opcode processors
|
||||||
|
#include "ss_declare.h"
|
||||||
|
#include "titanium_ops.h"
|
||||||
|
};
|
||||||
|
|
||||||
|
class MessageComponent : public ClientPatch::IMessage
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MessageComponent() = default;
|
||||||
|
~MessageComponent() override = default;
|
||||||
|
|
||||||
std::unique_ptr<EQApplicationPacket> Simple(uint32_t color, uint32_t id) const override;
|
std::unique_ptr<EQApplicationPacket> Simple(uint32_t color, uint32_t id) const override;
|
||||||
std::unique_ptr<EQApplicationPacket> Formatted(uint32_t color, uint32_t id,
|
std::unique_ptr<EQApplicationPacket> Formatted(uint32_t color, uint32_t id,
|
||||||
const std::array<const char*, 9>& args) const override;
|
const FormattedArgs& args) const override;
|
||||||
|
|
||||||
std::unique_ptr<EQApplicationPacket> InterruptSpell(uint32_t message, uint32_t spawn_id,
|
std::unique_ptr<EQApplicationPacket> InterruptSpell(uint32_t message, uint32_t spawn_id,
|
||||||
const char* spell_link) const override;
|
const char* spell_link) const override;
|
||||||
@@ -74,5 +63,20 @@ protected:
|
|||||||
virtual void ResolveArguments(uint32_t id, std::array<const char*, 9>& args) const;
|
virtual void ResolveArguments(uint32_t id, std::array<const char*, 9>& args) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Message
|
class BuffComponent : public ClientPatch::IBuff
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BuffComponent(uint32_t maxLongBuffs, uint32_t maxShortBuffs) : IBuff(maxLongBuffs, maxShortBuffs) {}
|
||||||
|
BuffComponent() = delete;
|
||||||
|
~BuffComponent() override = default;
|
||||||
|
|
||||||
|
std::unique_ptr<EQApplicationPacket> BuffDefinition(Mob* mob, const Buffs_Struct& buff, uint32_t slot,
|
||||||
|
bool fade) const override;
|
||||||
|
std::unique_ptr<EQApplicationPacket> RefreshBuffs(EmuOpcode opcode, Mob* mob, bool remove,
|
||||||
|
bool buff_timers_suspended, const std::vector<uint32_t>& slots) const override;
|
||||||
|
bool NeedsWearMessage() const override;
|
||||||
|
void SetRefreshType(std::unique_ptr<EQApplicationPacket>& packet, uint8_t refresh_type) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} /*Titanium*/
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ E(OP_AdventureMerchantSell)
|
|||||||
E(OP_ApplyPoison)
|
E(OP_ApplyPoison)
|
||||||
E(OP_BazaarSearch)
|
E(OP_BazaarSearch)
|
||||||
E(OP_BecomeTrader)
|
E(OP_BecomeTrader)
|
||||||
E(OP_Buff)
|
E(OP_BuffDefinition)
|
||||||
E(OP_ChannelMessage)
|
E(OP_ChannelMessage)
|
||||||
E(OP_CharInventory)
|
E(OP_CharInventory)
|
||||||
E(OP_ClientUpdate)
|
E(OP_ClientUpdate)
|
||||||
@@ -61,7 +61,6 @@ E(OP_ManaChange)
|
|||||||
E(OP_MemorizeSpell)
|
E(OP_MemorizeSpell)
|
||||||
E(OP_MoveItem)
|
E(OP_MoveItem)
|
||||||
E(OP_OnLevelMessage)
|
E(OP_OnLevelMessage)
|
||||||
E(OP_PetBuffWindow)
|
|
||||||
E(OP_PlayerProfile)
|
E(OP_PlayerProfile)
|
||||||
E(OP_NewSpawn)
|
E(OP_NewSpawn)
|
||||||
E(OP_MarkRaidNPC)
|
E(OP_MarkRaidNPC)
|
||||||
@@ -91,7 +90,7 @@ D(OP_AdventureMerchantSell)
|
|||||||
D(OP_ApplyPoison)
|
D(OP_ApplyPoison)
|
||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_BazaarSearch)
|
D(OP_BazaarSearch)
|
||||||
D(OP_Buff)
|
D(OP_BuffDefinition)
|
||||||
D(OP_Bug)
|
D(OP_Bug)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
D(OP_ChannelMessage)
|
D(OP_ChannelMessage)
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ struct NewZone_Struct {
|
|||||||
*/
|
*/
|
||||||
struct MemorizeSpell_Struct {
|
struct MemorizeSpell_Struct {
|
||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
int32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
uint32 reduction; // lowers reuse
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
@@ -442,7 +442,7 @@ struct ManaChange_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
/*04*/ uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
/*08*/ uint32 spell_id;
|
/*08*/ int32 spell_id;
|
||||||
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
};
|
};
|
||||||
@@ -459,14 +459,14 @@ struct BeginCast_Struct
|
|||||||
{
|
{
|
||||||
// len = 8
|
// len = 8
|
||||||
/*000*/ uint16 caster_id;
|
/*000*/ uint16 caster_id;
|
||||||
/*002*/ uint16 spell_id;
|
/*002*/ int16 spell_id;
|
||||||
/*004*/ uint32 cast_time; // in miliseconds
|
/*004*/ uint32 cast_time; // in miliseconds
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CastSpell_Struct
|
struct CastSpell_Struct
|
||||||
{
|
{
|
||||||
uint32 slot;
|
uint32 slot;
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
||||||
uint32 target_id;
|
uint32 target_id;
|
||||||
uint8 cs_unknown[4];
|
uint8 cs_unknown[4];
|
||||||
@@ -495,7 +495,7 @@ struct SpellBuff_Struct
|
|||||||
/*001*/ uint8 level;
|
/*001*/ uint8 level;
|
||||||
/*002*/ uint8 bard_modifier;
|
/*002*/ uint8 bard_modifier;
|
||||||
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*004*/ uint32 spellid;
|
/*004*/ int32 spellid;
|
||||||
/*008*/ int32 duration;
|
/*008*/ int32 duration;
|
||||||
/*012*/ uint32 counters; // single book keeping value (counters, rune/vie)
|
/*012*/ uint32 counters; // single book keeping value (counters, rune/vie)
|
||||||
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
@@ -1142,7 +1142,7 @@ struct CombatDamage_Struct
|
|||||||
/* 00 */ uint16 target;
|
/* 00 */ uint16 target;
|
||||||
/* 02 */ uint16 source;
|
/* 02 */ uint16 source;
|
||||||
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells, skill
|
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells, skill
|
||||||
/* 05 */ uint16 spellid;
|
/* 05 */ int16 spellid;
|
||||||
/* 07 */ uint32 damage;
|
/* 07 */ uint32 damage;
|
||||||
/* 11 */ float force;
|
/* 11 */ float force;
|
||||||
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
||||||
@@ -1177,7 +1177,7 @@ struct Death_Struct
|
|||||||
/*004*/ uint32 killer_id;
|
/*004*/ uint32 killer_id;
|
||||||
/*008*/ uint32 corpseid; // was corpseid
|
/*008*/ uint32 corpseid; // was corpseid
|
||||||
/*012*/ uint32 attack_skill; // was type
|
/*012*/ uint32 attack_skill; // was type
|
||||||
/*016*/ uint32 spell_id;
|
/*016*/ int32 spell_id;
|
||||||
/*020*/ uint32 bindzoneid; //bindzoneid?
|
/*020*/ uint32 bindzoneid; //bindzoneid?
|
||||||
/*024*/ uint32 damage;
|
/*024*/ uint32 damage;
|
||||||
/*028*/ uint32 unknown028;
|
/*028*/ uint32 unknown028;
|
||||||
@@ -2233,7 +2233,7 @@ struct Resurrect_Struct {
|
|||||||
char your_name[64];
|
char your_name[64];
|
||||||
uint32 unknown88;
|
uint32 unknown88;
|
||||||
char rezzer_name[64];
|
char rezzer_name[64];
|
||||||
uint32 spellid;
|
int32 spellid;
|
||||||
char corpse_name[64];
|
char corpse_name[64];
|
||||||
uint32 action;
|
uint32 action;
|
||||||
/* 228 */
|
/* 228 */
|
||||||
@@ -3247,7 +3247,7 @@ struct SendAA_Struct {
|
|||||||
/*0040*/ uint32 prereq_skill; //is < 0, abs() is category #
|
/*0040*/ uint32 prereq_skill; //is < 0, abs() is category #
|
||||||
/*0044*/ uint32 prereq_minpoints; //min points in the prereq
|
/*0044*/ uint32 prereq_minpoints; //min points in the prereq
|
||||||
/*0048*/ uint32 type;
|
/*0048*/ uint32 type;
|
||||||
/*0052*/ uint32 spellid;
|
/*0052*/ int32 spellid;
|
||||||
/*0056*/ uint32 spell_type;
|
/*0056*/ uint32 spell_type;
|
||||||
/*0060*/ uint32 spell_refresh;
|
/*0060*/ uint32 spell_refresh;
|
||||||
/*0064*/ uint32 classes;
|
/*0064*/ uint32 classes;
|
||||||
|
|||||||
+172
-136
@@ -1,22 +1,46 @@
|
|||||||
#include "../global_define.h"
|
/* EQEmu: EQEmulator
|
||||||
#include "../eqemu_config.h"
|
|
||||||
#include "../eqemu_logsys.h"
|
Copyright (C) 2001-2026 EQEmu Development Team
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "tob.h"
|
#include "tob.h"
|
||||||
#include "../opcodemgr.h"
|
|
||||||
|
|
||||||
#include "../eq_stream_ident.h"
|
|
||||||
#include "../crc32.h"
|
|
||||||
|
|
||||||
#include "../eq_packet_structs.h"
|
|
||||||
#include "../misc_functions.h"
|
|
||||||
#include "../strings.h"
|
|
||||||
#include "../inventory_profile.h"
|
|
||||||
#include "tob_structs.h"
|
#include "tob_structs.h"
|
||||||
#include "../rulesys.h"
|
|
||||||
#include "../path_manager.h"
|
#include "common/global_define.h"
|
||||||
#include "../classes.h"
|
#include "common/eqemu_config.h"
|
||||||
#include "../races.h"
|
#include "common/eqemu_logsys.h"
|
||||||
#include "../raid.h"
|
#include "common/opcodemgr.h"
|
||||||
|
|
||||||
|
#include "common/eq_stream_ident.h"
|
||||||
|
#include "common/crc32.h"
|
||||||
|
|
||||||
|
#include "common/eq_packet_structs.h"
|
||||||
|
#include "common/misc_functions.h"
|
||||||
|
#include "common/strings.h"
|
||||||
|
#include "common/inventory_profile.h"
|
||||||
|
#include "common/rulesys.h"
|
||||||
|
#include "common/path_manager.h"
|
||||||
|
#include "common/classes.h"
|
||||||
|
#include "common/packet_dump.h"
|
||||||
|
#include "common/races.h"
|
||||||
|
#include "common/raid.h"
|
||||||
|
#include "world/sof_char_create_data.h"
|
||||||
|
#include "zone/client.h"
|
||||||
|
#include "zone/mob.h"
|
||||||
|
#include "zone/string_ids.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -25,10 +49,6 @@
|
|||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include "common/packet_dump.h"
|
|
||||||
#include "world/sof_char_create_data.h"
|
|
||||||
#include "zone/string_ids.h"
|
|
||||||
|
|
||||||
namespace TOB
|
namespace TOB
|
||||||
{
|
{
|
||||||
static const char* name = "TOB";
|
static const char* name = "TOB";
|
||||||
@@ -67,7 +87,6 @@ namespace TOB
|
|||||||
static inline EQ::spells::CastingSlot TOBToServerCastingSlot(spells::CastingSlot slot);
|
static inline EQ::spells::CastingSlot TOBToServerCastingSlot(spells::CastingSlot slot);
|
||||||
|
|
||||||
// buff slots
|
// buff slots
|
||||||
static inline int ServerToTOBBuffSlot(int index);
|
|
||||||
static inline int TOBToServerBuffSlot(int index);
|
static inline int TOBToServerBuffSlot(int index);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier& into)
|
void Register(EQStreamIdentifier& into)
|
||||||
@@ -254,92 +273,6 @@ namespace TOB
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_Buff)
|
|
||||||
{
|
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::EQAffectPacket_Struct);
|
|
||||||
|
|
||||||
eq->entity_id = emu->entityid;
|
|
||||||
eq->unknown004 = 0;
|
|
||||||
|
|
||||||
//fill in affect info
|
|
||||||
eq->affect.caster_id.Id = emu->buff.player_id;
|
|
||||||
eq->affect.flags = 0;
|
|
||||||
eq->affect.spell_id = emu->buff.spellid;
|
|
||||||
eq->affect.duration = emu->buff.duration;
|
|
||||||
eq->affect.initial_duration = emu->buff.duration;
|
|
||||||
eq->affect.hit_count = emu->buff.num_hits;
|
|
||||||
eq->affect.viral_timer = 0;
|
|
||||||
eq->affect.modifier = emu->buff.bard_modifier == 10 ? 1.0f : emu->buff.bard_modifier / 10.0f;
|
|
||||||
eq->affect.y = emu->buff.y;
|
|
||||||
eq->affect.x = emu->buff.x;
|
|
||||||
eq->affect.z = emu->buff.z;
|
|
||||||
eq->affect.level = emu->buff.level;
|
|
||||||
|
|
||||||
eq->slot_id = ServerToTOBBuffSlot(emu->slotid);
|
|
||||||
if (emu->bufffade == 1)
|
|
||||||
{
|
|
||||||
eq->buff_fade = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
eq->buff_fade = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
EQApplicationPacket* outapp = nullptr;
|
|
||||||
if (emu->bufffade == 1)
|
|
||||||
{
|
|
||||||
// Bit of a hack. OP_Buff appears to add/remove the buff while OP_BuffCreate adds/removes the actual buff icon
|
|
||||||
outapp = new EQApplicationPacket(OP_BuffCreate, 30);
|
|
||||||
outapp->WriteUInt32(emu->entityid);
|
|
||||||
outapp->WriteUInt32(0); // tic timer
|
|
||||||
outapp->WriteUInt8(0); // Type of OP_BuffCreate packet ?
|
|
||||||
outapp->WriteUInt16(1); // 1 buff in this packet
|
|
||||||
outapp->WriteUInt32(ServerToTOBBuffSlot(emu->slotid));
|
|
||||||
outapp->WriteUInt32(0xffffffff); // SpellID (0xffff to remove)
|
|
||||||
outapp->WriteUInt32(0); // Duration
|
|
||||||
outapp->WriteUInt32(0); // numhits
|
|
||||||
outapp->WriteUInt8(0); // Caster name
|
|
||||||
outapp->WriteUInt8(0); // Type
|
|
||||||
outapp->WriteUInt8(0); // Type
|
|
||||||
}
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
|
||||||
|
|
||||||
if (outapp) {
|
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_BuffCreate)
|
|
||||||
{
|
|
||||||
SETUP_VAR_ENCODE(BuffIcon_Struct);
|
|
||||||
|
|
||||||
//TOB has one extra 0x00 byte before the end byte
|
|
||||||
uint32 sz = 13 + (17 * emu->count) + emu->name_lengths; // 17 includes nullterm
|
|
||||||
__packet->size = sz;
|
|
||||||
__packet->pBuffer = new unsigned char[sz];
|
|
||||||
memset(__packet->pBuffer, 0, sz);
|
|
||||||
|
|
||||||
__packet->WriteUInt32(emu->entity_id);
|
|
||||||
__packet->WriteUInt32(emu->tic_timer);
|
|
||||||
__packet->WriteUInt8(emu->all_buffs); // 1 indicates all buffs on the player (0 to add or remove a single buff)
|
|
||||||
__packet->WriteUInt16(emu->count);
|
|
||||||
|
|
||||||
for (int i = 0; i < emu->count; ++i)
|
|
||||||
{
|
|
||||||
__packet->WriteUInt32(emu->type == 0 ? ServerToTOBBuffSlot(emu->entries[i].buff_slot) : emu->entries[i].buff_slot);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].spell_id);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].tics_remaining);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].num_hits); // Unknown
|
|
||||||
__packet->WriteString(emu->entries[i].caster);
|
|
||||||
}
|
|
||||||
__packet->WriteUInt8(0); // Unknown1
|
|
||||||
__packet->WriteUInt8(emu->type); // Unknown2
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_CancelTrade)
|
ENCODE(OP_CancelTrade)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(CancelTrade_Struct);
|
ENCODE_LENGTH_EXACT(CancelTrade_Struct);
|
||||||
@@ -3603,6 +3536,20 @@ namespace TOB
|
|||||||
emu->Initialise = init;
|
emu->Initialise = init;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_BuffRemoveRequest)
|
||||||
|
{
|
||||||
|
// This is to cater for the fact that short buff box buffs start at 30 as opposed to 25 in prior clients.
|
||||||
|
//
|
||||||
|
DECODE_LENGTH_EXACT(BuffRemoveRequest_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(BuffRemoveRequest_Struct, BuffRemoveRequest_Struct);
|
||||||
|
|
||||||
|
emu->SlotID = TOBToServerBuffSlot(eq->SlotID);
|
||||||
|
|
||||||
|
IN(EntityID);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_CastSpell)
|
DECODE(OP_CastSpell)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
|
||||||
@@ -5536,20 +5483,6 @@ namespace TOB
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TOB has the same # of long buffs as rof2, but 10 more short buffs
|
|
||||||
static inline int ServerToTOBBuffSlot(int index)
|
|
||||||
{
|
|
||||||
// we're a disc
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS +
|
|
||||||
spells::LONG_BUFFS + spells::SHORT_BUFFS;
|
|
||||||
// we're a song
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS;
|
|
||||||
// we're a normal buff
|
|
||||||
return index; // as long as we guard against bad slots server side, we should be fine
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int TOBToServerBuffSlot(int index)
|
static inline int TOBToServerBuffSlot(int index)
|
||||||
{
|
{
|
||||||
// we're a disc
|
// we're a disc
|
||||||
@@ -5562,16 +5495,13 @@ namespace TOB
|
|||||||
// we're a normal buff
|
// we're a normal buff
|
||||||
return index; // as long as we guard against bad slots server side, we should be fine
|
return index; // as long as we guard against bad slots server side, we should be fine
|
||||||
}
|
}
|
||||||
} /*TOB*/
|
|
||||||
|
|
||||||
namespace Message {
|
|
||||||
|
|
||||||
struct TOBStringIDs
|
struct TOBStringIDs
|
||||||
{
|
{
|
||||||
static constexpr uint32_t DisarmedTrap = 1458; // You successfully disarmed the trap
|
static constexpr uint32_t DisarmedTrap = 1458; // You successfully disarmed the trap
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t TOB::ResolveID(uint32_t id) const
|
uint32_t MessageComponent::ResolveID(uint32_t id) const
|
||||||
{
|
{
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case YOU_FLURRY:
|
case YOU_FLURRY:
|
||||||
@@ -5615,11 +5545,11 @@ uint32_t TOB::ResolveID(uint32_t id) const
|
|||||||
case DISARMED_TRAP:
|
case DISARMED_TRAP:
|
||||||
return TOBStringIDs::DisarmedTrap;
|
return TOBStringIDs::DisarmedTrap;
|
||||||
default:
|
default:
|
||||||
return RoF2::ResolveID(id);
|
return Titanium::MessageComponent::ResolveID(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TOB::ResolveArguments(uint32_t id, std::array<const char*, 9>& args) const
|
void MessageComponent::ResolveArguments(uint32_t id, std::array<const char*, 9>& args) const
|
||||||
{
|
{
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case SPELL_FIZZLE:
|
case SPELL_FIZZLE:
|
||||||
@@ -5629,13 +5559,13 @@ void TOB::ResolveArguments(uint32_t id, std::array<const char*, 9>& args) const
|
|||||||
// take all arguments (spell link)
|
// take all arguments (spell link)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
RoF2::ResolveArguments(id, args);
|
Titanium::MessageComponent::ResolveArguments(id, args);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<EQApplicationPacket> TOB::Formatted(uint32_t color, uint32_t id,
|
std::unique_ptr<EQApplicationPacket> MessageComponent::Formatted(uint32_t color, uint32_t id,
|
||||||
const std::array<const char*, 9>& args) const
|
const FormattedArgs& args) const
|
||||||
{
|
{
|
||||||
uint32_t string_id = ResolveID(id);
|
uint32_t string_id = ResolveID(id);
|
||||||
if (string_id > 0) {
|
if (string_id > 0) {
|
||||||
@@ -5667,20 +5597,20 @@ std::unique_ptr<EQApplicationPacket> TOB::Formatted(uint32_t color, uint32_t id,
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<EQApplicationPacket> TOB::InterruptSpell(uint32_t message, uint32_t spawn_id,
|
std::unique_ptr<EQApplicationPacket> MessageComponent::InterruptSpell(uint32_t message, uint32_t spawn_id,
|
||||||
const char* spell_link) const
|
const char* spell_link) const
|
||||||
{
|
{
|
||||||
auto outapp = std::make_unique<EQApplicationPacket>(OP_InterruptCast, sizeof(InterruptCast_Struct) + strlen(spell_link) + 1);
|
auto outapp = std::make_unique<EQApplicationPacket>(OP_InterruptCast, sizeof(InterruptCast_Struct) + strlen(spell_link) + 1);
|
||||||
auto ic = reinterpret_cast<InterruptCast_Struct*>(outapp->pBuffer);
|
auto ic = reinterpret_cast<InterruptCast_Struct*>(outapp->pBuffer);
|
||||||
ic->messageid = ResolveID(message);
|
ic->messageid = ResolveID(message);
|
||||||
ic->spawnid = spawn_id;
|
ic->spawnid = spawn_id;
|
||||||
fmt::format_to_n(ic->message, strlen(spell_link) + 1, "{}\0", spell_link);
|
strcpy(ic->message, spell_link);
|
||||||
outapp->priority = 5;
|
outapp->priority = 5;
|
||||||
|
|
||||||
return outapp;
|
return outapp;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<EQApplicationPacket> TOB::InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id,
|
std::unique_ptr<EQApplicationPacket> MessageComponent::InterruptSpellOther(Mob* sender, uint32_t message, uint32_t spawn_id,
|
||||||
const char* name,
|
const char* name,
|
||||||
const char* spell_link) const
|
const char* spell_link) const
|
||||||
{
|
{
|
||||||
@@ -5689,10 +5619,116 @@ std::unique_ptr<EQApplicationPacket> TOB::InterruptSpellOther(Mob* sender, uint3
|
|||||||
auto ic = reinterpret_cast<InterruptCast_Struct*>(outapp->pBuffer);
|
auto ic = reinterpret_cast<InterruptCast_Struct*>(outapp->pBuffer);
|
||||||
ic->messageid = ResolveID(message);
|
ic->messageid = ResolveID(message);
|
||||||
ic->spawnid = spawn_id;
|
ic->spawnid = spawn_id;
|
||||||
fmt::format_to_n(ic->message, strlen(name) + strlen(spell_link) + 2, "{}\0{}\0", name, spell_link);
|
strcpy(ic->message, name);
|
||||||
|
strcpy(&ic->message[strlen(name) + 1], spell_link);
|
||||||
|
|
||||||
return outapp;
|
return outapp;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Message
|
std::unique_ptr<EQApplicationPacket> BuffComponent::BuffDefinition(Mob* mob, const Buffs_Struct& buff, uint32_t slot, bool fade) const
|
||||||
|
{
|
||||||
|
auto packet = std::make_unique<EQApplicationPacket>(OP_BuffDefinition, sizeof(structs::EQAffectPacket_Struct));
|
||||||
|
auto affect = reinterpret_cast<structs::EQAffectPacket_Struct*>(packet->pBuffer);
|
||||||
|
|
||||||
|
// base packet
|
||||||
|
affect->entity_id = mob->GetID();
|
||||||
|
affect->unknown004 = 0;
|
||||||
|
affect->slot_id = ServerToPatchBuffSlot(slot);
|
||||||
|
affect->buff_fade = fade ? 1 : 2; // 1 is remove, 2 is modify, 3 is add (only seen 1 and 2 sent)
|
||||||
|
|
||||||
|
memset(&affect->affect, 0, sizeof(affect->affect));
|
||||||
|
|
||||||
|
// affect slots
|
||||||
|
for (int affect_slot = 0; affect_slot < 6; ++affect_slot) {
|
||||||
|
// all of this is unknown, just what we've seen
|
||||||
|
affect->affect.slots[affect_slot].slot = -1; // this is always -1
|
||||||
|
affect->affect.slots[affect_slot].padding = 0; // this is never 0, but the values aren't clear
|
||||||
|
affect->affect.slots[affect_slot].value = 0; // this is always 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// affect info
|
||||||
|
affect->affect.caster_id.Id = buff.casterid;
|
||||||
|
affect->affect.caster_id.WorldId = RuleI(World, Id);
|
||||||
|
affect->affect.caster_id.Reserved = 0;
|
||||||
|
affect->affect.flags = 0;
|
||||||
|
affect->affect.spell_id = buff.spellid;
|
||||||
|
affect->affect.duration = buff.ticsremaining;
|
||||||
|
affect->affect.initial_duration = buff.initialduration;
|
||||||
|
affect->affect.hit_count = buff.hit_number;
|
||||||
|
affect->affect.viral_timer = 0;
|
||||||
|
affect->affect.modifier = static_cast<float>(buff.instrument_mod) / 10.f;
|
||||||
|
affect->affect.y = static_cast<float>(buff.caston_y);
|
||||||
|
affect->affect.x = static_cast<float>(buff.caston_x);
|
||||||
|
affect->affect.z = static_cast<float>(buff.caston_z);
|
||||||
|
affect->affect.type = 2;
|
||||||
|
affect->affect.level = buff.casterlevel > 0 ? buff.casterlevel : mob->GetLevel();
|
||||||
|
|
||||||
|
//no idea if these are right; eqlib doesn't seem to know either
|
||||||
|
if (buff.dot_rune > 0)
|
||||||
|
affect->affect.charges = buff.dot_rune;
|
||||||
|
else if (buff.magic_rune > 0)
|
||||||
|
affect->affect.charges = buff.magic_rune;
|
||||||
|
else if (buff.melee_rune > 0)
|
||||||
|
affect->affect.charges = buff.melee_rune;
|
||||||
|
else if (buff.counters > 0)
|
||||||
|
affect->affect.charges = buff.counters;
|
||||||
|
|
||||||
|
affect->affect.activatable = 0;
|
||||||
|
affect->affect.unknown1 = 0; //might be some timer, not sure though
|
||||||
|
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<EQApplicationPacket> BuffComponent::RefreshBuffs(EmuOpcode opcode, Mob* mob, bool remove,
|
||||||
|
bool buff_timers_suspended, const std::vector<uint32_t>& slots) const
|
||||||
|
{
|
||||||
|
Buffs_Struct* buffs = mob->GetBuffs();
|
||||||
|
|
||||||
|
// pre-calculate the buffer size to avoid too many grow calls
|
||||||
|
size_t buffer_size = 13; // 13 bytes outside the list
|
||||||
|
std::vector<uint32_t> send_slots;
|
||||||
|
if (slots.empty()) {
|
||||||
|
for (uint32_t slot = 0; slot < mob->GetMaxTotalSlots(); ++slot)
|
||||||
|
if (buffs[slot].spellid > 1) {
|
||||||
|
buffer_size += 17 + strlen(buffs[slot].caster_name); // 17 includes the null terminator
|
||||||
|
send_slots.push_back(slot);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (uint32_t slot : slots)
|
||||||
|
if (slot < mob->GetMaxTotalSlots() && buffs[slot].spellid > 1) {
|
||||||
|
buffer_size += 17 + strlen(buffs[slot].caster_name);
|
||||||
|
send_slots.push_back(slot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SerializeBuffer buffer(buffer_size);
|
||||||
|
|
||||||
|
buffer.WriteUInt32(mob->GetID());
|
||||||
|
buffer.WriteInt32(mob->GetRemainingTicTime());
|
||||||
|
buffer.WriteUInt8(slots.empty() ? 1 : 0); // 1 indicates all buffs on the mob (0 to add or remove a single buff)
|
||||||
|
buffer.WriteUInt16(send_slots.size());
|
||||||
|
|
||||||
|
for (uint32_t slot : send_slots) {
|
||||||
|
buffer.WriteUInt32(ServerToPatchBuffSlot(slot)); // the server stores fewer buffs
|
||||||
|
buffer.WriteInt32(remove ? -1 : buffs[slot].spellid);
|
||||||
|
buffer.WriteUInt32(buffs[slot].ticsremaining);
|
||||||
|
buffer.WriteUInt32(buffs[slot].hit_number);
|
||||||
|
buffer.WriteString(buffs[slot].caster_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.WriteUInt8(opcode == OP_RefreshPetBuffs ? 2 : 0);
|
||||||
|
buffer.WriteUInt8(buff_timers_suspended ? 1 : 0); // bBuffTimersOnHold
|
||||||
|
|
||||||
|
return std::make_unique<EQApplicationPacket>(opcode, std::move(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BuffComponent::NeedsWearMessage() const { return false; }
|
||||||
|
|
||||||
|
// 0 = self buff window, 1 = self target window, 2 = pet buff or target window, 4 = group, 5 = PC, 7 = NPC
|
||||||
|
void BuffComponent::SetRefreshType(std::unique_ptr<EQApplicationPacket>& packet, uint8_t refresh_type) const
|
||||||
|
{
|
||||||
|
if (packet)
|
||||||
|
packet->pBuffer[packet->size - 2] = refresh_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
} /*TOB*/
|
||||||
+57
-36
@@ -1,49 +1,55 @@
|
|||||||
|
/* EQEmu: EQEmulator
|
||||||
|
|
||||||
|
Copyright (C) 2001-2026 EQEmu Development Team
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "rof2.h"
|
#include "common/struct_strategy.h"
|
||||||
#include "../struct_strategy.h"
|
#include "common/patches/rof2.h"
|
||||||
|
|
||||||
class EQStreamIdentifier;
|
class EQStreamIdentifier;
|
||||||
|
|
||||||
namespace TOB
|
namespace TOB {
|
||||||
{
|
|
||||||
|
|
||||||
//these are the only public member of this namespace.
|
extern void Register(EQStreamIdentifier& into);
|
||||||
extern void Register(EQStreamIdentifier& into);
|
extern void Reload();
|
||||||
extern void Reload();
|
|
||||||
|
|
||||||
|
class Strategy : public StructStrategy
|
||||||
|
|
||||||
//you should not directly access anything below..
|
|
||||||
//I just dont feel like making a seperate header for it.
|
|
||||||
|
|
||||||
class Strategy : public StructStrategy {
|
|
||||||
public:
|
|
||||||
Strategy();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual std::string Describe() const;
|
|
||||||
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
|
||||||
|
|
||||||
//magic macro to declare our opcode processors
|
|
||||||
#include "ss_declare.h"
|
|
||||||
#include "tob_ops.h"
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}; /*TOB*/
|
|
||||||
|
|
||||||
namespace Message {
|
|
||||||
|
|
||||||
class TOB : public RoF2
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TOB() {}
|
Strategy();
|
||||||
~TOB() override {}
|
|
||||||
|
protected:
|
||||||
|
virtual std::string Describe() const;
|
||||||
|
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
||||||
|
|
||||||
|
//magic macro to declare our opcode processors
|
||||||
|
#include "ss_declare.h"
|
||||||
|
#include "tob_ops.h"
|
||||||
|
};
|
||||||
|
|
||||||
|
class MessageComponent : public Titanium::MessageComponent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MessageComponent() = default;
|
||||||
|
~MessageComponent() override = default;
|
||||||
|
|
||||||
std::unique_ptr<EQApplicationPacket> Formatted(uint32_t color, uint32_t id,
|
std::unique_ptr<EQApplicationPacket> Formatted(uint32_t color, uint32_t id,
|
||||||
const std::array<const char*, 9>& args) const override;
|
const FormattedArgs& args) const override;
|
||||||
|
|
||||||
std::unique_ptr<EQApplicationPacket> InterruptSpell(uint32_t message, uint32_t spawn_id,
|
std::unique_ptr<EQApplicationPacket> InterruptSpell(uint32_t message, uint32_t spawn_id,
|
||||||
const char* spell_link) const override;
|
const char* spell_link) const override;
|
||||||
@@ -55,4 +61,19 @@ protected:
|
|||||||
void ResolveArguments(uint32_t id, std::array<const char*, 9>& args) const override;
|
void ResolveArguments(uint32_t id, std::array<const char*, 9>& args) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Message
|
class BuffComponent : public UF::BuffComponent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BuffComponent(uint32_t maxLongBuffs, uint32_t maxShortBuffs) : UF::BuffComponent(maxLongBuffs, maxShortBuffs) {}
|
||||||
|
BuffComponent() = delete;
|
||||||
|
~BuffComponent() override = default;
|
||||||
|
|
||||||
|
std::unique_ptr<EQApplicationPacket>
|
||||||
|
BuffDefinition(Mob* mob, const Buffs_Struct& buff, uint32_t slot, bool fade) const override;
|
||||||
|
std::unique_ptr<EQApplicationPacket> RefreshBuffs(EmuOpcode opcode, Mob* mob, bool remove,
|
||||||
|
bool buff_timers_suspended, const std::vector<uint32_t>& slots) const override;
|
||||||
|
bool NeedsWearMessage() const override;
|
||||||
|
void SetRefreshType(std::unique_ptr<EQApplicationPacket>& packet, uint8_t refresh_type) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
}; /*TOB*/
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#ifndef COMMON_LAURION_LIMITS_H
|
#ifndef COMMON_LAURION_LIMITS_H
|
||||||
#define COMMON_LAURION_LIMITS_H
|
#define COMMON_LAURION_LIMITS_H
|
||||||
|
|
||||||
#include "../types.h"
|
#include "common/types.h"
|
||||||
#include "../emu_versions.h"
|
#include "common/emu_versions.h"
|
||||||
#include "../skills.h"
|
#include "common/skills.h"
|
||||||
|
|
||||||
namespace TOB
|
namespace TOB
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ E(OP_ApplyPoison)
|
|||||||
E(OP_AugmentInfo)
|
E(OP_AugmentInfo)
|
||||||
E(OP_BeginCast)
|
E(OP_BeginCast)
|
||||||
E(OP_BlockedBuffs)
|
E(OP_BlockedBuffs)
|
||||||
E(OP_Buff)
|
|
||||||
E(OP_BuffCreate)
|
|
||||||
E(OP_CancelTrade)
|
E(OP_CancelTrade)
|
||||||
E(OP_CastSpell)
|
E(OP_CastSpell)
|
||||||
E(OP_ChannelMessage)
|
E(OP_ChannelMessage)
|
||||||
@@ -71,6 +69,7 @@ D(OP_ApproveName)
|
|||||||
D(OP_AugmentInfo)
|
D(OP_AugmentInfo)
|
||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_BlockedBuffs)
|
D(OP_BlockedBuffs)
|
||||||
|
D(OP_BuffRemoveRequest)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
D(OP_ChannelMessage)
|
D(OP_ChannelMessage)
|
||||||
D(OP_CharacterCreate)
|
D(OP_CharacterCreate)
|
||||||
|
|||||||
@@ -1,5 +1,25 @@
|
|||||||
#ifndef STEAM_LATEST_STRUCTS_H_
|
/* EQEmu: EQEmulator
|
||||||
#define STEAM_LATEST_STRUCTS_H_
|
|
||||||
|
Copyright (C) 2001-2026 EQEmu Development Team
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common/eq_packet_structs.h"
|
||||||
|
#include "common/skills.h"
|
||||||
|
|
||||||
namespace TOB {
|
namespace TOB {
|
||||||
namespace structs {
|
namespace structs {
|
||||||
@@ -627,7 +647,7 @@ namespace TOB {
|
|||||||
/*004*/ uint32 killer_id;
|
/*004*/ uint32 killer_id;
|
||||||
/*008*/ uint32 corpseid; //not read by client
|
/*008*/ uint32 corpseid; //not read by client
|
||||||
/*012*/ uint32 unknown1; //not read by client
|
/*012*/ uint32 unknown1; //not read by client
|
||||||
/*016*/ uint32 spell_id;
|
/*016*/ int32 spell_id;
|
||||||
/*020*/ uint32 attack_skill;
|
/*020*/ uint32 attack_skill;
|
||||||
/*024*/ uint64 damage;
|
/*024*/ uint64 damage;
|
||||||
/*032*/ uint32 unknown2; //not read by client
|
/*032*/ uint32 unknown2; //not read by client
|
||||||
@@ -672,7 +692,7 @@ namespace TOB {
|
|||||||
|
|
||||||
struct BeginCast_Struct
|
struct BeginCast_Struct
|
||||||
{
|
{
|
||||||
/*000*/ uint32 spell_id;
|
/*000*/ int32 spell_id;
|
||||||
/*004*/ uint16 caster_id;
|
/*004*/ uint16 caster_id;
|
||||||
/*006*/ uint32 cast_time; // in miliseconds
|
/*006*/ uint32 cast_time; // in miliseconds
|
||||||
/*010*/ uint32 unknown0a; // I think this is caster effective level but im not sure. live always sends 0. The client uses this for the spell link
|
/*010*/ uint32 unknown0a; // I think this is caster effective level but im not sure. live always sends 0. The client uses this for the spell link
|
||||||
@@ -682,7 +702,7 @@ namespace TOB {
|
|||||||
|
|
||||||
struct MemorizeSpell_Struct {
|
struct MemorizeSpell_Struct {
|
||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
int32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // -1 refreshes book, 0 scribe to book, 2 end mem, 1 start mem, 3 unmem, 4 set activated item keyring -- client will send back 2 if a 0 operation updated a memorized spell of the same group + subgroup
|
uint32 scribing; // -1 refreshes book, 0 scribe to book, 2 end mem, 1 start mem, 3 unmem, 4 set activated item keyring -- client will send back 2 if a 0 operation updated a memorized spell of the same group + subgroup
|
||||||
uint32 reduction; // lower reuse (only used if scribing is 4)
|
uint32 reduction; // lower reuse (only used if scribing is 4)
|
||||||
};
|
};
|
||||||
@@ -702,7 +722,7 @@ namespace TOB {
|
|||||||
struct CastSpell_Struct
|
struct CastSpell_Struct
|
||||||
{
|
{
|
||||||
/*00*/ uint32 slot;
|
/*00*/ uint32 slot;
|
||||||
/*04*/ uint32 spell_id;
|
/*04*/ int32 spell_id;
|
||||||
/*08*/ CastSpellInventorySlot_Struct inventory_slot;
|
/*08*/ CastSpellInventorySlot_Struct inventory_slot;
|
||||||
/*18*/ uint32 target_id;
|
/*18*/ uint32 target_id;
|
||||||
/*22*/ uint32 spell_crc;
|
/*22*/ uint32 spell_crc;
|
||||||
@@ -732,7 +752,7 @@ namespace TOB {
|
|||||||
/*000*/ EQAffectSlot_Struct slots[6];
|
/*000*/ EQAffectSlot_Struct slots[6];
|
||||||
/*096*/ EqGuid caster_id;
|
/*096*/ EqGuid caster_id;
|
||||||
/*104*/ uint32 flags;
|
/*104*/ uint32 flags;
|
||||||
/*108*/ uint32 spell_id;
|
/*108*/ int32 spell_id;
|
||||||
/*112*/ uint32 duration;
|
/*112*/ uint32 duration;
|
||||||
/*116*/ uint32 initial_duration;
|
/*116*/ uint32 initial_duration;
|
||||||
/*120*/ uint32 hit_count;
|
/*120*/ uint32 hit_count;
|
||||||
@@ -762,7 +782,7 @@ namespace TOB {
|
|||||||
{
|
{
|
||||||
uint32 new_mana;
|
uint32 new_mana;
|
||||||
uint32 stamina; // endurance
|
uint32 stamina; // endurance
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
uint32 keepcasting;
|
uint32 keepcasting;
|
||||||
int32 slot; // gem slot
|
int32 slot; // gem slot
|
||||||
};
|
};
|
||||||
@@ -775,7 +795,7 @@ namespace TOB {
|
|||||||
{
|
{
|
||||||
uint16 target;
|
uint16 target;
|
||||||
uint16 source;
|
uint16 source;
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
//4 leaves a buff
|
//4 leaves a buff
|
||||||
uint32 effect_type;
|
uint32 effect_type;
|
||||||
uint32 effective_casting_level;
|
uint32 effective_casting_level;
|
||||||
@@ -1086,5 +1106,3 @@ namespace TOB {
|
|||||||
|
|
||||||
}; //end namespace structs
|
}; //end namespace structs
|
||||||
}; //end namespace tob
|
}; //end namespace tob
|
||||||
|
|
||||||
#endif /*LAURION_STRUCTS_H_*/
|
|
||||||
+49
-113
@@ -33,6 +33,7 @@
|
|||||||
#include "common/raid.h"
|
#include "common/raid.h"
|
||||||
#include "common/rulesys.h"
|
#include "common/rulesys.h"
|
||||||
#include "common/strings.h"
|
#include "common/strings.h"
|
||||||
|
#include "zone/mob.h"
|
||||||
|
|
||||||
#include "cereal/types/vector.hpp"
|
#include "cereal/types/vector.hpp"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@@ -64,7 +65,6 @@ namespace UF
|
|||||||
static inline spells::CastingSlot ServerToUFCastingSlot(EQ::spells::CastingSlot slot);
|
static inline spells::CastingSlot ServerToUFCastingSlot(EQ::spells::CastingSlot slot);
|
||||||
static inline EQ::spells::CastingSlot UFToServerCastingSlot(spells::CastingSlot slot);
|
static inline EQ::spells::CastingSlot UFToServerCastingSlot(spells::CastingSlot slot);
|
||||||
|
|
||||||
static inline int ServerToUFBuffSlot(int index);
|
|
||||||
static inline int UFToServerBuffSlot(int index);
|
static inline int UFToServerBuffSlot(int index);
|
||||||
|
|
||||||
void Register(EQStreamIdentifier &into)
|
void Register(EQStreamIdentifier &into)
|
||||||
@@ -434,7 +434,7 @@ namespace UF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_Buff)
|
ENCODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -442,72 +442,17 @@ namespace UF
|
|||||||
OUT(entityid);
|
OUT(entityid);
|
||||||
OUT(buff.effect_type);
|
OUT(buff.effect_type);
|
||||||
OUT(buff.level);
|
OUT(buff.level);
|
||||||
// just so we're 100% sure we get a 1.0f ...
|
OUT(buff.bard_modifier);
|
||||||
eq->buff.bard_modifier = emu->buff.bard_modifier == 10 ? 1.0f : emu->buff.bard_modifier / 10.0f;
|
|
||||||
OUT(buff.spellid);
|
OUT(buff.spellid);
|
||||||
OUT(buff.duration);
|
OUT(buff.duration);
|
||||||
OUT(buff.num_hits);
|
OUT(buff.num_hits);
|
||||||
// TODO: implement slot_data stuff
|
// TODO: implement slot_data stuff
|
||||||
eq->slotid = ServerToUFBuffSlot(emu->slotid);
|
OUT(slotid);
|
||||||
OUT(bufffade); // Live (October 2011) sends a 2 rather than 0 when a buff is created, but it doesn't seem to matter.
|
OUT(bufffade); // Live (October 2011) sends a 2 rather than 0 when a buff is created, but it doesn't seem to matter.
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_BuffCreate)
|
|
||||||
{
|
|
||||||
SETUP_VAR_ENCODE(BuffIcon_Struct);
|
|
||||||
|
|
||||||
uint32 sz = 12 + (17 * emu->count) + emu->name_lengths; // 17 includes nullterm
|
|
||||||
__packet->size = sz;
|
|
||||||
__packet->pBuffer = new unsigned char[sz];
|
|
||||||
memset(__packet->pBuffer, 0, sz);
|
|
||||||
|
|
||||||
__packet->WriteUInt32(emu->entity_id);
|
|
||||||
__packet->WriteUInt32(emu->tic_timer);
|
|
||||||
__packet->WriteUInt8(emu->all_buffs); // 1 = all buffs, 0 = 1 buff
|
|
||||||
__packet->WriteUInt16(emu->count);
|
|
||||||
|
|
||||||
for (int i = 0; i < emu->count; ++i)
|
|
||||||
{
|
|
||||||
__packet->WriteUInt32(emu->type == 0 ? ServerToUFBuffSlot(emu->entries[i].buff_slot) : emu->entries[i].buff_slot);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].spell_id);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].tics_remaining);
|
|
||||||
__packet->WriteUInt32(emu->entries[i].num_hits);
|
|
||||||
__packet->WriteString(emu->entries[i].caster);
|
|
||||||
}
|
|
||||||
__packet->WriteUInt8(emu->type);
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
|
||||||
/*
|
|
||||||
uint32 write_var32 = 60;
|
|
||||||
uint8 write_var8 = 1;
|
|
||||||
ss.write((const char*)&emu->entity_id, sizeof(uint32));
|
|
||||||
ss.write((const char*)&write_var32, sizeof(uint32));
|
|
||||||
ss.write((const char*)&write_var8, sizeof(uint8));
|
|
||||||
ss.write((const char*)&emu->count, sizeof(uint16));
|
|
||||||
write_var32 = 0;
|
|
||||||
write_var8 = 0;
|
|
||||||
for(uint16 i = 0; i < emu->count; ++i)
|
|
||||||
{
|
|
||||||
if(emu->entries[i].buff_slot >= 25 && emu->entries[i].buff_slot < 37)
|
|
||||||
{
|
|
||||||
emu->entries[i].buff_slot += 5;
|
|
||||||
}
|
|
||||||
else if(emu->entries[i].buff_slot >= 37)
|
|
||||||
{
|
|
||||||
emu->entries[i].buff_slot += 14;
|
|
||||||
}
|
|
||||||
ss.write((const char*)&emu->entries[i].buff_slot, sizeof(uint32));
|
|
||||||
ss.write((const char*)&emu->entries[i].spell_id, sizeof(uint32));
|
|
||||||
ss.write((const char*)&emu->entries[i].tics_remaining, sizeof(uint32));
|
|
||||||
ss.write((const char*)&write_var32, sizeof(uint32));
|
|
||||||
ss.write((const char*)&write_var8, sizeof(uint8));
|
|
||||||
}
|
|
||||||
ss.write((const char*)&write_var8, sizeof(uint8));
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_CancelTrade)
|
ENCODE(OP_CancelTrade)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(CancelTrade_Struct);
|
ENCODE_LENGTH_EXACT(CancelTrade_Struct);
|
||||||
@@ -1800,44 +1745,6 @@ namespace UF
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_PetBuffWindow)
|
|
||||||
{
|
|
||||||
EQApplicationPacket *in = *p;
|
|
||||||
*p = nullptr;
|
|
||||||
|
|
||||||
unsigned char *__emu_buffer = in->pBuffer;
|
|
||||||
|
|
||||||
PetBuff_Struct *emu = (PetBuff_Struct *)__emu_buffer;
|
|
||||||
|
|
||||||
int PacketSize = 12 + (emu->buffcount * 17);
|
|
||||||
|
|
||||||
in->size = PacketSize;
|
|
||||||
in->pBuffer = new unsigned char[in->size];
|
|
||||||
|
|
||||||
char *Buffer = (char *)in->pBuffer;
|
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petid);
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 1);
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint16, Buffer, emu->buffcount);
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < PET_BUFF_COUNT; ++i)
|
|
||||||
{
|
|
||||||
if (emu->spellid[i])
|
|
||||||
{
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, i);
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->spellid[i]);
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->ticsremaining[i]);
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // numhits
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // This is a string. Name of the caster of the buff.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->buffcount); /// I think this is actually some sort of type
|
|
||||||
|
|
||||||
delete[] __emu_buffer;
|
|
||||||
dest->FastQueuePacket(&in, ack_req);
|
|
||||||
}
|
|
||||||
|
|
||||||
ENCODE(OP_PlayerProfile)
|
ENCODE(OP_PlayerProfile)
|
||||||
{
|
{
|
||||||
SETUP_DIRECT_ENCODE(PlayerProfile_Struct, structs::PlayerProfile_Struct);
|
SETUP_DIRECT_ENCODE(PlayerProfile_Struct, structs::PlayerProfile_Struct);
|
||||||
@@ -2729,8 +2636,6 @@ namespace UF
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_TargetBuffs) { ENCODE_FORWARD(OP_BuffCreate); }
|
|
||||||
|
|
||||||
ENCODE(OP_TaskDescription)
|
ENCODE(OP_TaskDescription)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *in = *p;
|
EQApplicationPacket *in = *p;
|
||||||
@@ -3638,7 +3543,7 @@ namespace UF
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_BuffDefinition)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
|
||||||
@@ -5208,19 +5113,6 @@ namespace UF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int ServerToUFBuffSlot(int index)
|
|
||||||
{
|
|
||||||
// we're a disc
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS + EQ::spells::SHORT_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS - EQ::spells::SHORT_BUFFS +
|
|
||||||
spells::LONG_BUFFS + spells::SHORT_BUFFS;
|
|
||||||
// we're a song
|
|
||||||
if (index >= EQ::spells::LONG_BUFFS)
|
|
||||||
return index - EQ::spells::LONG_BUFFS + spells::LONG_BUFFS;
|
|
||||||
// we're a normal buff
|
|
||||||
return index; // as long as we guard against bad slots server side, we should be fine
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int UFToServerBuffSlot(int index)
|
static inline int UFToServerBuffSlot(int index)
|
||||||
{
|
{
|
||||||
// we're a disc
|
// we're a disc
|
||||||
@@ -5233,4 +5125,48 @@ namespace UF
|
|||||||
// we're a normal buff
|
// we're a normal buff
|
||||||
return index; // as long as we guard against bad slots server side, we should be fine
|
return index; // as long as we guard against bad slots server side, we should be fine
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<EQApplicationPacket> BuffComponent::RefreshBuffs(EmuOpcode opcode, Mob* mob,
|
||||||
|
bool remove,
|
||||||
|
bool buff_timers_suspended, const std::vector<uint32_t>& slots) const
|
||||||
|
{
|
||||||
|
// UF introduced the self refresh buff packet
|
||||||
|
Buffs_Struct* buffs = mob->GetBuffs();
|
||||||
|
|
||||||
|
size_t buffer_size = 12; // 12 bytes outside the list
|
||||||
|
std::vector<uint32_t> send_slots;
|
||||||
|
if (slots.empty()) {
|
||||||
|
for (uint32_t slot = 0; slot < mob->GetMaxTotalSlots(); ++slot)
|
||||||
|
if (buffs[slot].spellid > 1) {
|
||||||
|
buffer_size += 17 + strlen(buffs[slot].caster_name); // 17 includes the null terminator
|
||||||
|
send_slots.push_back(slot);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (uint32_t slot : slots)
|
||||||
|
if (slot < mob->GetMaxTotalSlots() && buffs[slot].spellid > 1) {
|
||||||
|
buffer_size += 17 + strlen(buffs[slot].caster_name);
|
||||||
|
send_slots.push_back(slot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SerializeBuffer buffer(buffer_size);
|
||||||
|
|
||||||
|
buffer.WriteUInt32(mob->GetID());
|
||||||
|
buffer.WriteUInt32(mob->GetRemainingTicTime());
|
||||||
|
buffer.WriteUInt8(slots.empty() ? 1 : 0);
|
||||||
|
buffer.WriteUInt16(send_slots.size());
|
||||||
|
|
||||||
|
for (uint32_t slot : send_slots) {
|
||||||
|
buffer.WriteUInt32(ServerToPatchBuffSlot(slot));
|
||||||
|
buffer.WriteInt32(remove ? -1 : buffs[slot].spellid);
|
||||||
|
buffer.WriteInt32(buffs[slot].ticsremaining);
|
||||||
|
buffer.WriteUInt32(buffs[slot].hit_number);
|
||||||
|
buffer.WriteString(buffs[slot].caster_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.WriteUInt8(opcode == OP_RefreshPetBuffs ? 2 : 0);
|
||||||
|
|
||||||
|
return std::make_unique<EQApplicationPacket>(opcode, std::move(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
} /*UF*/
|
} /*UF*/
|
||||||
|
|||||||
+26
-33
@@ -17,46 +17,39 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "sod.h"
|
|
||||||
#include "common/struct_strategy.h"
|
#include "common/struct_strategy.h"
|
||||||
|
#include "common/patches/sod.h"
|
||||||
|
|
||||||
class EQStreamIdentifier;
|
class EQStreamIdentifier;
|
||||||
|
|
||||||
namespace UF
|
namespace UF {
|
||||||
{
|
|
||||||
|
|
||||||
//these are the only public member of this namespace.
|
extern void Register(EQStreamIdentifier& into);
|
||||||
extern void Register(EQStreamIdentifier &into);
|
extern void Reload();
|
||||||
extern void Reload();
|
|
||||||
|
|
||||||
|
class Strategy : public StructStrategy
|
||||||
|
|
||||||
//you should not directly access anything below..
|
|
||||||
//I just dont feel like making a seperate header for it.
|
|
||||||
|
|
||||||
class Strategy : public StructStrategy {
|
|
||||||
public:
|
|
||||||
Strategy();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual std::string Describe() const;
|
|
||||||
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
|
||||||
|
|
||||||
//magic macro to declare our opcode processors
|
|
||||||
#include "ss_declare.h"
|
|
||||||
#include "uf_ops.h"
|
|
||||||
};
|
|
||||||
|
|
||||||
}; /*UF*/
|
|
||||||
|
|
||||||
namespace Message {
|
|
||||||
|
|
||||||
class UF : public SoD
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
UF() = default;
|
Strategy();
|
||||||
~UF() override = default;
|
|
||||||
|
protected:
|
||||||
|
virtual std::string Describe() const;
|
||||||
|
virtual const EQ::versions::ClientVersion ClientVersion() const;
|
||||||
|
|
||||||
|
//magic macro to declare our opcode processors
|
||||||
|
#include "ss_declare.h"
|
||||||
|
#include "uf_ops.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Message
|
class BuffComponent : public SoD::BuffComponent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BuffComponent(uint32_t maxLongBuffs, uint32_t maxShortBuffs) : SoD::BuffComponent(maxLongBuffs, maxShortBuffs) {}
|
||||||
|
BuffComponent() = delete;
|
||||||
|
~BuffComponent() override = default;
|
||||||
|
|
||||||
|
std::unique_ptr<EQApplicationPacket> RefreshBuffs(EmuOpcode opcode, Mob* mob, bool remove,
|
||||||
|
bool buff_timers_suspended, const std::vector<uint32_t>& slots) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
}; /*UF*/
|
||||||
|
|||||||
@@ -25,8 +25,7 @@ E(OP_AugmentInfo)
|
|||||||
E(OP_Barter)
|
E(OP_Barter)
|
||||||
E(OP_BazaarSearch)
|
E(OP_BazaarSearch)
|
||||||
E(OP_BecomeTrader)
|
E(OP_BecomeTrader)
|
||||||
E(OP_Buff)
|
E(OP_BuffDefinition)
|
||||||
E(OP_BuffCreate)
|
|
||||||
E(OP_CancelTrade)
|
E(OP_CancelTrade)
|
||||||
E(OP_ChannelMessage)
|
E(OP_ChannelMessage)
|
||||||
E(OP_CharInventory)
|
E(OP_CharInventory)
|
||||||
@@ -75,7 +74,6 @@ E(OP_MoveItem)
|
|||||||
E(OP_NewSpawn)
|
E(OP_NewSpawn)
|
||||||
E(OP_NewZone)
|
E(OP_NewZone)
|
||||||
E(OP_OnLevelMessage)
|
E(OP_OnLevelMessage)
|
||||||
E(OP_PetBuffWindow)
|
|
||||||
E(OP_PlayerProfile)
|
E(OP_PlayerProfile)
|
||||||
E(OP_RaidJoin)
|
E(OP_RaidJoin)
|
||||||
E(OP_RaidUpdate)
|
E(OP_RaidUpdate)
|
||||||
@@ -93,7 +91,6 @@ E(OP_SpawnAppearance)
|
|||||||
E(OP_SpawnDoor)
|
E(OP_SpawnDoor)
|
||||||
E(OP_SpecialMesg)
|
E(OP_SpecialMesg)
|
||||||
E(OP_Stun)
|
E(OP_Stun)
|
||||||
E(OP_TargetBuffs)
|
|
||||||
E(OP_TaskDescription)
|
E(OP_TaskDescription)
|
||||||
E(OP_Track)
|
E(OP_Track)
|
||||||
E(OP_Trader)
|
E(OP_Trader)
|
||||||
@@ -116,7 +113,7 @@ D(OP_AugmentInfo)
|
|||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_BazaarSearch)
|
D(OP_BazaarSearch)
|
||||||
D(OP_BookButton)
|
D(OP_BookButton)
|
||||||
D(OP_Buff)
|
D(OP_BuffDefinition)
|
||||||
D(OP_BuffRemoveRequest)
|
D(OP_BuffRemoveRequest)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
D(OP_ChannelMessage)
|
D(OP_ChannelMessage)
|
||||||
|
|||||||
+11
-11
@@ -480,7 +480,7 @@ struct NewZone_Struct {
|
|||||||
*/
|
*/
|
||||||
struct MemorizeSpell_Struct {
|
struct MemorizeSpell_Struct {
|
||||||
uint32 slot; // Spot in the spell book/memorized slot
|
uint32 slot; // Spot in the spell book/memorized slot
|
||||||
uint32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
int32 spell_id; // Spell id (200 or c8 is minor healing, etc)
|
||||||
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
uint32 scribing; // 1 if memorizing a spell, set to 0 if scribing to book, 2 if un-memming
|
||||||
uint32 reduction; // lowers reuse
|
uint32 reduction; // lowers reuse
|
||||||
};
|
};
|
||||||
@@ -517,7 +517,7 @@ struct ManaChange_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint32 new_mana; // New Mana AMount
|
/*00*/ uint32 new_mana; // New Mana AMount
|
||||||
/*04*/ uint32 stamina;
|
/*04*/ uint32 stamina;
|
||||||
/*08*/ uint32 spell_id;
|
/*08*/ int32 spell_id;
|
||||||
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
/*12*/ uint8 keepcasting; // won't stop the cast. Change mana while casting?
|
||||||
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
/*13*/ uint8 padding[3]; // client doesn't read it, garbage data seems like
|
||||||
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
/*16*/ int32 slot; // -1 for normal usage slot for when we want silent interrupt? I think it does timer stuff or something. Linked Spell Reuse interrupt uses it
|
||||||
@@ -535,14 +535,14 @@ struct BeginCast_Struct
|
|||||||
{
|
{
|
||||||
// len = 8
|
// len = 8
|
||||||
/*004*/ uint16 caster_id;
|
/*004*/ uint16 caster_id;
|
||||||
/*006*/ uint16 spell_id;
|
/*006*/ int16 spell_id;
|
||||||
/*016*/ uint32 cast_time; // in miliseconds
|
/*016*/ uint32 cast_time; // in miliseconds
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CastSpell_Struct
|
struct CastSpell_Struct
|
||||||
{
|
{
|
||||||
uint32 slot;
|
uint32 slot;
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
uint32 inventoryslot; // slot for clicky item, 0xFFFF = normal cast
|
||||||
uint32 target_id;
|
uint32 target_id;
|
||||||
uint32 cs_unknown1;
|
uint32 cs_unknown1;
|
||||||
@@ -575,7 +575,7 @@ struct SpellBuff_Struct
|
|||||||
/*002*/ uint8 unknown002; //pretty sure padding now
|
/*002*/ uint8 unknown002; //pretty sure padding now
|
||||||
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
|
||||||
/*004*/ float bard_modifier;
|
/*004*/ float bard_modifier;
|
||||||
/*008*/ uint32 spellid;
|
/*008*/ int32 spellid;
|
||||||
/*012*/ uint32 duration;
|
/*012*/ uint32 duration;
|
||||||
/*016*/ uint32 num_hits;
|
/*016*/ uint32 num_hits;
|
||||||
/*020*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
/*020*/ uint32 player_id; // caster ID, pretty sure just zone ID
|
||||||
@@ -595,7 +595,7 @@ struct SpellBuffPacket_Struct {
|
|||||||
#if 0
|
#if 0
|
||||||
struct BuffIconEntry_Struct {
|
struct BuffIconEntry_Struct {
|
||||||
/*000*/ uint32 buff_slot;
|
/*000*/ uint32 buff_slot;
|
||||||
/*004*/ uint32 spell_id;
|
/*004*/ int32 spell_id;
|
||||||
/*008*/ uint32 tics_remaining;
|
/*008*/ uint32 tics_remaining;
|
||||||
/*012*/ uint32 num_hits;
|
/*012*/ uint32 num_hits;
|
||||||
// char name[0]; caster name is also here sometimes
|
// char name[0]; caster name is also here sometimes
|
||||||
@@ -1306,7 +1306,7 @@ struct CombatDamage_Struct
|
|||||||
/* 00 */ uint16 target;
|
/* 00 */ uint16 target;
|
||||||
/* 02 */ uint16 source;
|
/* 02 */ uint16 source;
|
||||||
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells
|
||||||
/* 05 */ uint16 spellid;
|
/* 05 */ int16 spellid;
|
||||||
/* 07 */ int32 damage;
|
/* 07 */ int32 damage;
|
||||||
/* 11 */ float force; // cd cc cc 3d
|
/* 11 */ float force; // cd cc cc 3d
|
||||||
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
/* 15 */ float hit_heading; // see above notes in Action_Struct
|
||||||
@@ -1342,7 +1342,7 @@ struct Death_Struct
|
|||||||
/*004*/ uint32 killer_id;
|
/*004*/ uint32 killer_id;
|
||||||
/*008*/ uint32 corpseid; // was corpseid
|
/*008*/ uint32 corpseid; // was corpseid
|
||||||
/*012*/ uint32 attack_skill; // was type
|
/*012*/ uint32 attack_skill; // was type
|
||||||
/*016*/ uint32 spell_id;
|
/*016*/ int32 spell_id;
|
||||||
/*020*/ uint32 bindzoneid; //bindzoneid?
|
/*020*/ uint32 bindzoneid; //bindzoneid?
|
||||||
/*024*/ uint32 damage;
|
/*024*/ uint32 damage;
|
||||||
/*028*/ uint32 unknown028;
|
/*028*/ uint32 unknown028;
|
||||||
@@ -2194,7 +2194,7 @@ struct GroupFollow_Struct { // Underfoot Follow Struct
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct InspectBuffs_Struct {
|
struct InspectBuffs_Struct {
|
||||||
/*000*/ uint32 spell_id[BUFF_COUNT];
|
/*000*/ int32 spell_id[BUFF_COUNT];
|
||||||
/*120*/ int32 tics_remaining[BUFF_COUNT];
|
/*120*/ int32 tics_remaining[BUFF_COUNT];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2610,7 +2610,7 @@ struct Resurrect_Struct {
|
|||||||
char your_name[64];
|
char your_name[64];
|
||||||
uint32 unknown88;
|
uint32 unknown88;
|
||||||
char rezzer_name[64];
|
char rezzer_name[64];
|
||||||
uint32 spellid;
|
int32 spellid;
|
||||||
char corpse_name[64];
|
char corpse_name[64];
|
||||||
uint32 action;
|
uint32 action;
|
||||||
/* 228 */
|
/* 228 */
|
||||||
@@ -3896,7 +3896,7 @@ struct SendAA_Struct {
|
|||||||
/*0037*/ uint32 prereq_skill; //is < 0, abs() is category #
|
/*0037*/ uint32 prereq_skill; //is < 0, abs() is category #
|
||||||
/*0041*/ uint32 prereq_minpoints; //min points in the prereq
|
/*0041*/ uint32 prereq_minpoints; //min points in the prereq
|
||||||
/*0045*/ uint32 type;
|
/*0045*/ uint32 type;
|
||||||
/*0049*/ uint32 spellid;
|
/*0049*/ int32 spellid;
|
||||||
/*0053*/ uint32 spell_type;
|
/*0053*/ uint32 spell_type;
|
||||||
/*0057*/ uint32 spell_refresh;
|
/*0057*/ uint32 spell_refresh;
|
||||||
/*0061*/ uint32 classes;
|
/*0061*/ uint32 classes;
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class BaseBlockedSpellsRepository {
|
|||||||
public:
|
public:
|
||||||
struct BlockedSpells {
|
struct BlockedSpells {
|
||||||
int32_t id;
|
int32_t id;
|
||||||
uint32_t spellid;
|
int32_t spellid;
|
||||||
int8_t type;
|
int8_t type;
|
||||||
int32_t zoneid;
|
int32_t zoneid;
|
||||||
float x;
|
float x;
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class BaseBotBlockedBuffsRepository {
|
|||||||
public:
|
public:
|
||||||
struct BotBlockedBuffs {
|
struct BotBlockedBuffs {
|
||||||
uint32_t bot_id;
|
uint32_t bot_id;
|
||||||
uint32_t spell_id;
|
int32_t spell_id;
|
||||||
uint8_t blocked;
|
uint8_t blocked;
|
||||||
uint8_t blocked_pet;
|
uint8_t blocked_pet;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
struct BotBuffs {
|
struct BotBuffs {
|
||||||
uint32_t buffs_index;
|
uint32_t buffs_index;
|
||||||
uint32_t bot_id;
|
uint32_t bot_id;
|
||||||
uint32_t spell_id;
|
int32_t spell_id;
|
||||||
uint8_t caster_level;
|
uint8_t caster_level;
|
||||||
uint32_t duration_formula;
|
uint32_t duration_formula;
|
||||||
uint32_t tics_remaining;
|
uint32_t tics_remaining;
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
struct BotPetBuffs {
|
struct BotPetBuffs {
|
||||||
uint32_t pet_buffs_index;
|
uint32_t pet_buffs_index;
|
||||||
uint32_t pets_index;
|
uint32_t pets_index;
|
||||||
uint32_t spell_id;
|
int32_t spell_id;
|
||||||
uint32_t caster_level;
|
uint32_t caster_level;
|
||||||
uint32_t duration;
|
uint32_t duration;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class BaseBotPetsRepository {
|
|||||||
public:
|
public:
|
||||||
struct BotPets {
|
struct BotPets {
|
||||||
uint32_t pets_index;
|
uint32_t pets_index;
|
||||||
uint32_t spell_id;
|
int32_t spell_id;
|
||||||
uint32_t bot_id;
|
uint32_t bot_id;
|
||||||
std::string name;
|
std::string name;
|
||||||
int32_t mana;
|
int32_t mana;
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
struct BotSpellSettings {
|
struct BotSpellSettings {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
int32_t bot_id;
|
int32_t bot_id;
|
||||||
int16_t spell_id;
|
int32_t spell_id;
|
||||||
int16_t priority;
|
int16_t priority;
|
||||||
int16_t min_hp;
|
int16_t min_hp;
|
||||||
int16_t max_hp;
|
int16_t max_hp;
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
struct BotSpellsEntries {
|
struct BotSpellsEntries {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
int32_t npc_spells_id;
|
int32_t npc_spells_id;
|
||||||
uint16_t spell_id;
|
int32_t spell_id;
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
uint8_t minlevel;
|
uint8_t minlevel;
|
||||||
uint8_t maxlevel;
|
uint8_t maxlevel;
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public:
|
|||||||
uint32_t recast_time;
|
uint32_t recast_time;
|
||||||
uint8_t is_spell;
|
uint8_t is_spell;
|
||||||
uint8_t is_disc;
|
uint8_t is_disc;
|
||||||
uint32_t spell_id;
|
int32_t spell_id;
|
||||||
uint8_t is_item;
|
uint8_t is_item;
|
||||||
uint32_t item_id;
|
uint32_t item_id;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
struct CharacterBuffs {
|
struct CharacterBuffs {
|
||||||
uint32_t character_id;
|
uint32_t character_id;
|
||||||
uint8_t slot_id;
|
uint8_t slot_id;
|
||||||
uint16_t spell_id;
|
int32_t spell_id;
|
||||||
uint8_t caster_level;
|
uint8_t caster_level;
|
||||||
std::string caster_name;
|
std::string caster_name;
|
||||||
int32_t ticsremaining;
|
int32_t ticsremaining;
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
struct CharacterMemmedSpells {
|
struct CharacterMemmedSpells {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint16_t slot_id;
|
uint16_t slot_id;
|
||||||
uint16_t spell_id;
|
int32_t spell_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string PrimaryKey()
|
static std::string PrimaryKey()
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
struct CharacterSpells {
|
struct CharacterSpells {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint16_t slot_id;
|
uint16_t slot_id;
|
||||||
uint16_t spell_id;
|
int32_t spell_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string PrimaryKey()
|
static std::string PrimaryKey()
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
class BaseDamageshieldtypesRepository {
|
class BaseDamageshieldtypesRepository {
|
||||||
public:
|
public:
|
||||||
struct Damageshieldtypes {
|
struct Damageshieldtypes {
|
||||||
uint32_t spellid;
|
int32_t spellid;
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
struct LdonTrapTemplates {
|
struct LdonTrapTemplates {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
uint16_t spell_id;
|
int32_t spell_id;
|
||||||
uint16_t skill;
|
uint16_t skill;
|
||||||
uint8_t locked;
|
uint8_t locked;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
struct MercBuffs {
|
struct MercBuffs {
|
||||||
uint32_t MercBuffId;
|
uint32_t MercBuffId;
|
||||||
uint32_t MercId;
|
uint32_t MercId;
|
||||||
uint32_t SpellId;
|
int32_t SpellId;
|
||||||
uint32_t CasterLevel;
|
uint32_t CasterLevel;
|
||||||
uint32_t DurationFormula;
|
uint32_t DurationFormula;
|
||||||
int32_t TicsRemaining;
|
int32_t TicsRemaining;
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public:
|
|||||||
struct MercSpellListEntries {
|
struct MercSpellListEntries {
|
||||||
uint32_t merc_spell_list_entry_id;
|
uint32_t merc_spell_list_entry_id;
|
||||||
uint32_t merc_spell_list_id;
|
uint32_t merc_spell_list_id;
|
||||||
uint32_t spell_id;
|
int32_t spell_id;
|
||||||
uint32_t spell_type;
|
uint32_t spell_type;
|
||||||
uint8_t stance_id;
|
uint8_t stance_id;
|
||||||
uint8_t minlevel;
|
uint8_t minlevel;
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public:
|
|||||||
struct NpcSpellsEntries {
|
struct NpcSpellsEntries {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
int32_t npc_spells_id;
|
int32_t npc_spells_id;
|
||||||
uint16_t spellid;
|
int32_t spellid;
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
uint8_t minlevel;
|
uint8_t minlevel;
|
||||||
uint8_t maxlevel;
|
uint8_t maxlevel;
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
class BaseSpellBucketsRepository {
|
class BaseSpellBucketsRepository {
|
||||||
public:
|
public:
|
||||||
struct SpellBuckets {
|
struct SpellBuckets {
|
||||||
uint32_t spell_id;
|
int32_t spell_id;
|
||||||
std::string bucket_name;
|
std::string bucket_name;
|
||||||
std::string bucket_value;
|
std::string bucket_value;
|
||||||
uint8_t bucket_comparison;
|
uint8_t bucket_comparison;
|
||||||
|
|||||||
+2
-2
@@ -1425,7 +1425,7 @@ struct CZSpell_Struct {
|
|||||||
uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name
|
uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name
|
||||||
uint8 update_subtype; // 0 - Cast Spell, 1 - Remove Spell
|
uint8 update_subtype; // 0 - Cast Spell, 1 - Remove Spell
|
||||||
int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name
|
int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
char client_name[64]; // Only used by Character Name Type, else empty
|
char client_name[64]; // Only used by Character Name Type, else empty
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1498,7 +1498,7 @@ struct WWSignal_Struct {
|
|||||||
|
|
||||||
struct WWSpell_Struct {
|
struct WWSpell_Struct {
|
||||||
uint8 update_type; // 0 - Cast Spell, 1 - Remove Spell
|
uint8 update_type; // 0 - Cast Spell, 1 - Remove Spell
|
||||||
uint32 spell_id;
|
int32 spell_id;
|
||||||
uint8 min_status;
|
uint8 min_status;
|
||||||
uint8 max_status;
|
uint8 max_status;
|
||||||
};
|
};
|
||||||
|
|||||||
+148
-148
File diff suppressed because it is too large
Load Diff
+152
-153
@@ -21,9 +21,8 @@
|
|||||||
#include "common/item_data.h"
|
#include "common/item_data.h"
|
||||||
#include "common/skills.h"
|
#include "common/skills.h"
|
||||||
|
|
||||||
#define SPELL_UNKNOWN 0xFFFF
|
#define SPELL_UNKNOWN -1
|
||||||
#define POISON_PROC 0xFFFE
|
#define POISON_PROC -2
|
||||||
#define SPELLBOOK_UNKNOWN 0xFFFFFFFF //player profile spells are 32 bit
|
|
||||||
|
|
||||||
//some spell IDs which will prolly change, but are needed
|
//some spell IDs which will prolly change, but are needed
|
||||||
#define SPELL_COMPLETE_HEAL 13
|
#define SPELL_COMPLETE_HEAL 13
|
||||||
@@ -914,10 +913,10 @@ bool BotSpellTypeRequiresTarget(uint16 spell_type);
|
|||||||
bool BotSpellTypeRequiresAEChecks(uint16 spell_type);
|
bool BotSpellTypeRequiresAEChecks(uint16 spell_type);
|
||||||
bool IsCommandedBotSpellType(uint16 spell_type);
|
bool IsCommandedBotSpellType(uint16 spell_type);
|
||||||
bool IsPullingBotSpellType(uint16 spell_type);
|
bool IsPullingBotSpellType(uint16 spell_type);
|
||||||
uint16 GetCorrectBotSpellType(uint16 spell_type, uint16 spell_id);
|
uint16 GetCorrectBotSpellType(uint16 spell_type, int32 spell_id);
|
||||||
uint16 GetPetBotSpellType(uint16 spell_type);
|
uint16 GetPetBotSpellType(uint16 spell_type);
|
||||||
bool IsBotBuffSpellType(uint16 spell_type);
|
bool IsBotBuffSpellType(uint16 spell_type);
|
||||||
bool BotRequiresLoSToCast(uint16 spell_type, uint16 spell_id);
|
bool BotRequiresLoSToCast(uint16 spell_type, int32 spell_id);
|
||||||
|
|
||||||
// These should not be used to determine spell category..
|
// These should not be used to determine spell category..
|
||||||
// They are a graphical affects (effects?) index only
|
// They are a graphical affects (effects?) index only
|
||||||
@@ -1762,157 +1761,157 @@ struct SPDat_Spell_Struct
|
|||||||
extern const SPDat_Spell_Struct* spells;
|
extern const SPDat_Spell_Struct* spells;
|
||||||
extern int32 SPDAT_RECORDS;
|
extern int32 SPDAT_RECORDS;
|
||||||
|
|
||||||
bool IsTargetableAESpell(uint16 spell_id);
|
bool IsTargetableAESpell(int32 spell_id);
|
||||||
bool IsSacrificeSpell(uint16 spell_id);
|
bool IsSacrificeSpell(int32 spell_id);
|
||||||
bool IsLifetapSpell(uint16 spell_id);
|
bool IsLifetapSpell(int32 spell_id);
|
||||||
bool IsMesmerizeSpell(uint16 spell_id);
|
bool IsMesmerizeSpell(int32 spell_id);
|
||||||
bool SpellBreaksMez(uint16 spell_id);
|
bool SpellBreaksMez(int32 spell_id);
|
||||||
bool IsStunSpell(uint16 spell_id);
|
bool IsStunSpell(int32 spell_id);
|
||||||
bool IsSlowSpell(uint16 spell_id);
|
bool IsSlowSpell(int32 spell_id);
|
||||||
bool IsHasteSpell(uint16 spell_id);
|
bool IsHasteSpell(int32 spell_id);
|
||||||
bool IsHarmonySpell(uint16 spell_id);
|
bool IsHarmonySpell(int32 spell_id);
|
||||||
bool IsPercentalHealSpell(uint16 spell_id);
|
bool IsPercentalHealSpell(int32 spell_id);
|
||||||
bool IsGroupOnlySpell(uint16 spell_id);
|
bool IsGroupOnlySpell(int32 spell_id);
|
||||||
bool IsBeneficialSpell(uint16 spell_id);
|
bool IsBeneficialSpell(int32 spell_id);
|
||||||
bool IsDetrimentalSpell(uint16 spell_id);
|
bool IsDetrimentalSpell(int32 spell_id);
|
||||||
bool IsInvisibleSpell(uint16 spell_id);
|
bool IsInvisibleSpell(int32 spell_id);
|
||||||
bool IsInvulnerabilitySpell(uint16 spell_id);
|
bool IsInvulnerabilitySpell(int32 spell_id);
|
||||||
bool IsCompleteHealDurationSpell(uint16 spell_id);
|
bool IsCompleteHealDurationSpell(int32 spell_id);
|
||||||
bool IsPoisonCounterSpell(uint16 spell_id);
|
bool IsPoisonCounterSpell(int32 spell_id);
|
||||||
bool IsDiseaseCounterSpell(uint16 spell_id);
|
bool IsDiseaseCounterSpell(int32 spell_id);
|
||||||
bool IsSummonItemSpell(uint16 spell_id);
|
bool IsSummonItemSpell(int32 spell_id);
|
||||||
bool IsSummonSkeletonSpell(uint16 spell_id);
|
bool IsSummonSkeletonSpell(int32 spell_id);
|
||||||
bool IsSummonPetSpell(uint16 spell_id);
|
bool IsSummonPetSpell(int32 spell_id);
|
||||||
bool IsSummonPCSpell(uint16 spell_id);
|
bool IsSummonPCSpell(int32 spell_id);
|
||||||
bool IsPetSpell(uint16 spell_id);
|
bool IsPetSpell(int32 spell_id);
|
||||||
bool IsCharmSpell(uint16 spell_id);
|
bool IsCharmSpell(int32 spell_id);
|
||||||
bool IsResurrectionSicknessSpell(uint16 spell_id);
|
bool IsResurrectionSicknessSpell(int32 spell_id);
|
||||||
bool IsBlindSpell(uint16 spell_id);
|
bool IsBlindSpell(int32 spell_id);
|
||||||
bool IsHealthSpell(uint16 spell_id);
|
bool IsHealthSpell(int32 spell_id);
|
||||||
bool IsCastTimeReductionSpell(uint16 spell_id);
|
bool IsCastTimeReductionSpell(int32 spell_id);
|
||||||
bool IsIncreaseDurationSpell(uint16 spell_id);
|
bool IsIncreaseDurationSpell(int32 spell_id);
|
||||||
bool IsManaCostReductionSpell(uint16 spell_id);
|
bool IsManaCostReductionSpell(int32 spell_id);
|
||||||
bool IsIncreaseRangeSpell(uint16 spell_id);
|
bool IsIncreaseRangeSpell(int32 spell_id);
|
||||||
bool IsImprovedHealingSpell(uint16 spell_id);
|
bool IsImprovedHealingSpell(int32 spell_id);
|
||||||
bool IsImprovedDamageSpell(uint16 spell_id);
|
bool IsImprovedDamageSpell(int32 spell_id);
|
||||||
bool IsAEDurationSpell(uint16 spell_id);
|
bool IsAEDurationSpell(int32 spell_id);
|
||||||
bool IsPureNukeSpell(uint16 spell_id);
|
bool IsPureNukeSpell(int32 spell_id);
|
||||||
bool IsAENukeSpell(uint16 spell_id);
|
bool IsAENukeSpell(int32 spell_id);
|
||||||
bool IsPBAENukeSpell(uint16 spell_id);
|
bool IsPBAENukeSpell(int32 spell_id);
|
||||||
bool IsAERainNukeSpell(uint16 spell_id);
|
bool IsAERainNukeSpell(int32 spell_id);
|
||||||
bool IsAnyNukeOrStunSpell(uint16 spell_id);
|
bool IsAnyNukeOrStunSpell(int32 spell_id);
|
||||||
bool IsAnyAESpell(uint16 spell_id);
|
bool IsAnyAESpell(int32 spell_id);
|
||||||
bool IsAESpell(uint16 spell_id);
|
bool IsAESpell(int32 spell_id);
|
||||||
bool IsPBAESpell(uint16 spell_id);
|
bool IsPBAESpell(int32 spell_id);
|
||||||
bool IsAERainSpell(uint16 spell_id);
|
bool IsAERainSpell(int32 spell_id);
|
||||||
bool IsPartialResistableSpell(uint16 spell_id);
|
bool IsPartialResistableSpell(int32 spell_id);
|
||||||
bool IsResistableSpell(uint16 spell_id);
|
bool IsResistableSpell(int32 spell_id);
|
||||||
bool IsGroupSpell(uint16 spell_id);
|
bool IsGroupSpell(int32 spell_id);
|
||||||
bool IsTGBCompatibleSpell(uint16 spell_id);
|
bool IsTGBCompatibleSpell(int32 spell_id);
|
||||||
bool IsBardSong(uint16 spell_id);
|
bool IsBardSong(int32 spell_id);
|
||||||
bool IsEffectInSpell(uint16 spell_id, int effect_id);
|
bool IsEffectInSpell(int32 spell_id, int effect_id);
|
||||||
uint16 GetSpellTriggerSpellID(uint16 spell_id, int effect_id);
|
int32 GetSpellTriggerSpellID(int32 spell_id, int effect_id);
|
||||||
bool IsBlankSpellEffect(uint16 spell_id, int effect_index);
|
bool IsBlankSpellEffect(int32 spell_id, int effect_index);
|
||||||
bool IsValidSpell(uint32 spell_id);
|
bool IsValidSpell(int32 spell_id);
|
||||||
bool IsSummonSpell(uint16 spell_id);
|
bool IsSummonSpell(int32 spell_id);
|
||||||
bool IsDamageSpell(uint16 spell_id);
|
bool IsDamageSpell(int32 spell_id);
|
||||||
bool IsAnyDamageSpell(uint16 spell_id);
|
bool IsAnyDamageSpell(int32 spell_id);
|
||||||
bool IsDamageOverTimeSpell(uint16 spell_i);
|
bool IsDamageOverTimeSpell(int32 spell_id);
|
||||||
bool IsFearSpell(uint16 spell_id);
|
bool IsFearSpell(int32 spell_id);
|
||||||
bool IsCureSpell(uint16 spell_id);
|
bool IsCureSpell(int32 spell_id);
|
||||||
bool IsHarmTouchSpell(uint16 spell_id);
|
bool IsHarmTouchSpell(int32 spell_id);
|
||||||
int GetSpellEffectIndex(uint16 spell_id, int effect_id);
|
int GetSpellEffectIndex(int32 spell_id, int effect_id);
|
||||||
uint8 GetSpellMinimumLevel(uint16 spell_id);
|
uint8 GetSpellMinimumLevel(int32 spell_id);
|
||||||
uint8 GetSpellLevel(uint16 spell_id, uint8 class_id);
|
uint8 GetSpellLevel(int32 spell_id, uint8 class_id);
|
||||||
int CalcBuffDuration_formula(int level, int formula, int duration);
|
int CalcBuffDuration_formula(int level, int formula, int duration);
|
||||||
int32 CalculatePoisonCounters(uint16 spell_id);
|
int32 CalculatePoisonCounters(int32 spell_id);
|
||||||
int32 CalculateDiseaseCounters(uint16 spell_id);
|
int32 CalculateDiseaseCounters(int32 spell_id);
|
||||||
int32 CalculateCurseCounters(uint16 spell_id);
|
int32 CalculateCurseCounters(int32 spell_id);
|
||||||
int32 CalculateCorruptionCounters(uint16 spell_id);
|
int32 CalculateCorruptionCounters(int32 spell_id);
|
||||||
int32 CalculateCounters(uint16 spell_id);
|
int32 CalculateCounters(int32 spell_id);
|
||||||
bool IsDisciplineBuff(uint16 spell_id);
|
bool IsDisciplineBuff(int32 spell_id);
|
||||||
bool IsDiscipline(uint16 spell_id);
|
bool IsDiscipline(int32 spell_id);
|
||||||
bool IsCombatSkill(uint16 spell_id);
|
bool IsCombatSkill(int32 spell_id);
|
||||||
bool IsResurrectionEffects(uint16 spell_id);
|
bool IsResurrectionEffects(int32 spell_id);
|
||||||
int8 GetSpellResurrectionSicknessCheck(uint16 spell_id_one, uint16 spell_id_two);
|
int8 GetSpellResurrectionSicknessCheck(int32 spell_id_one, int32 spell_id_two);
|
||||||
bool IsRuneSpell(uint16 spell_id);
|
bool IsRuneSpell(int32 spell_id);
|
||||||
bool IsMagicRuneSpell(uint16 spell_id);
|
bool IsMagicRuneSpell(int32 spell_id);
|
||||||
bool IsManaTapSpell(uint16 spell_id);
|
bool IsManaTapSpell(int32 spell_id);
|
||||||
bool IsAllianceSpell(uint16 spell_id);
|
bool IsAllianceSpell(int32 spell_id);
|
||||||
bool IsDeathSaveSpell(uint16 spell_id);
|
bool IsDeathSaveSpell(int32 spell_id);
|
||||||
bool IsFullDeathSaveSpell(uint16 spell_id);
|
bool IsFullDeathSaveSpell(int32 spell_id);
|
||||||
bool IsPartialDeathSaveSpell(uint16 spell_id);
|
bool IsPartialDeathSaveSpell(int32 spell_id);
|
||||||
bool IsShadowStepSpell(uint16 spell_id);
|
bool IsShadowStepSpell(int32 spell_id);
|
||||||
bool IsSuccorSpell(uint16 spell_id);
|
bool IsSuccorSpell(int32 spell_id);
|
||||||
bool IsTeleportSpell(uint16 spell_id);
|
bool IsTeleportSpell(int32 spell_id);
|
||||||
bool IsTranslocateSpell(uint16 spell_id);
|
bool IsTranslocateSpell(int32 spell_id);
|
||||||
bool IsGateSpell(uint16 spell_id);
|
bool IsGateSpell(int32 spell_id);
|
||||||
bool IsIllusionSpell(uint16 spell_id);
|
bool IsIllusionSpell(int32 spell_id);
|
||||||
bool IsLDoNObjectSpell(uint16 spell_id);
|
bool IsLDoNObjectSpell(int32 spell_id);
|
||||||
int GetSpellResistType(uint16 spell_id);
|
int GetSpellResistType(int32 spell_id);
|
||||||
int GetSpellTargetType(uint16 spell_id);
|
int GetSpellTargetType(int32 spell_id);
|
||||||
bool IsHealOverTimeSpell(uint16 spell_id);
|
bool IsHealOverTimeSpell(int32 spell_id);
|
||||||
bool IsCompleteHealSpell(uint16 spell_id);
|
bool IsCompleteHealSpell(int32 spell_id);
|
||||||
bool IsFastHealSpell(uint16 spell_id);
|
bool IsFastHealSpell(int32 spell_id);
|
||||||
bool IsVeryFastHealSpell(uint16 spell_id);
|
bool IsVeryFastHealSpell(int32 spell_id);
|
||||||
bool IsRegularSingleTargetHealSpell(uint16 spell_id);
|
bool IsRegularSingleTargetHealSpell(int32 spell_id);
|
||||||
bool IsRegularPetHealSpell(uint16 spell_id);
|
bool IsRegularPetHealSpell(int32 spell_id);
|
||||||
bool IsRegularGroupHealSpell(uint16 spell_id);
|
bool IsRegularGroupHealSpell(int32 spell_id);
|
||||||
bool IsGroupCompleteHealSpell(uint16 spell_id);
|
bool IsGroupCompleteHealSpell(int32 spell_id);
|
||||||
bool IsGroupHealOverTimeSpell(uint16 spell_id);
|
bool IsGroupHealOverTimeSpell(int32 spell_id);
|
||||||
bool IsAnyHealSpell(uint16 spell_id);
|
bool IsAnyHealSpell(int32 spell_id);
|
||||||
bool IsAnyBuffSpell(uint16 spell_id);
|
bool IsAnyBuffSpell(int32 spell_id);
|
||||||
bool IsDispelSpell(uint16 spell_id);
|
bool IsDispelSpell(int32 spell_id);
|
||||||
bool IsEscapeSpell(uint16 spell_id);
|
bool IsEscapeSpell(int32 spell_id);
|
||||||
bool IsDebuffSpell(uint16 spell_id);
|
bool IsDebuffSpell(int32 spell_id);
|
||||||
bool IsHateReduxSpell(uint16 spell_id);
|
bool IsHateReduxSpell(int32 spell_id);
|
||||||
bool IsResistDebuffSpell(uint16 spell_id);
|
bool IsResistDebuffSpell(int32 spell_id);
|
||||||
bool IsSelfConversionSpell(uint16 spell_id);
|
bool IsSelfConversionSpell(int32 spell_id);
|
||||||
bool IsBuffSpell(uint16 spell_id);
|
bool IsBuffSpell(int32 spell_id);
|
||||||
bool IsPersistDeathSpell(uint16 spell_id);
|
bool IsPersistDeathSpell(int32 spell_id);
|
||||||
bool IsSuspendableSpell(uint16 spell_id);
|
bool IsSuspendableSpell(int32 spell_id);
|
||||||
bool IsCastOnFadeDurationSpell(uint16 spell_id);
|
bool IsCastOnFadeDurationSpell(int32 spell_id);
|
||||||
bool IsDistanceModifierSpell(uint16 spell_id);
|
bool IsDistanceModifierSpell(int32 spell_id);
|
||||||
int GetSpellPartialMeleeRuneReduction(uint16 spell_id);
|
int GetSpellPartialMeleeRuneReduction(int32 spell_id);
|
||||||
int GetSpellPartialMagicRuneReduction(uint16 spell_id);
|
int GetSpellPartialMagicRuneReduction(int32 spell_id);
|
||||||
int GetSpellPartialMeleeRuneAmount(uint16 spell_id);
|
int GetSpellPartialMeleeRuneAmount(int32 spell_id);
|
||||||
int GetSpellPartialMagicRuneAmount(uint16 spell_id);
|
int GetSpellPartialMagicRuneAmount(int32 spell_id);
|
||||||
bool IsNoDetrimentalSpellAggroSpell(uint16 spell_id);
|
bool IsNoDetrimentalSpellAggroSpell(int32 spell_id);
|
||||||
bool IsStackableDOT(uint16 spell_id);
|
bool IsStackableDOT(int32 spell_id);
|
||||||
bool IsBardOnlyStackEffect(int effect_id);
|
bool IsBardOnlyStackEffect(int effect_id);
|
||||||
bool IsCastWhileInvisibleSpell(uint16 spell_id);
|
bool IsCastWhileInvisibleSpell(int32 spell_id);
|
||||||
bool IsEffectIgnoredInStacking(int effect_id);
|
bool IsEffectIgnoredInStacking(int effect_id);
|
||||||
bool IsFocusLimit(int effect_id);
|
bool IsFocusLimit(int effect_id);
|
||||||
bool IsTargetRequiredForSpell(uint16 spell_id);
|
bool IsTargetRequiredForSpell(int32 spell_id);
|
||||||
bool IsVirusSpell(uint16 spell_id);
|
bool IsVirusSpell(int32 spell_id);
|
||||||
int GetSpellViralMinimumSpreadTime(uint16 spell_id);
|
int GetSpellViralMinimumSpreadTime(int32 spell_id);
|
||||||
int GetSpellViralMaximumSpreadTime(uint16 spell_id);
|
int GetSpellViralMaximumSpreadTime(int32 spell_id);
|
||||||
int GetSpellViralSpreadRange(uint16 spell_id);
|
int GetSpellViralSpreadRange(int32 spell_id);
|
||||||
bool IsInstrumentModifierAppliedToSpellEffect(uint16 spell_id, int effect_id);
|
bool IsInstrumentModifierAppliedToSpellEffect(int32 spell_id, int effect_id);
|
||||||
bool IsPulsingBardSong(uint16 spell_id);
|
bool IsPulsingBardSong(int32 spell_id);
|
||||||
int GetSpellProcLimitTimer(uint16 spell_id, int proc_type);
|
int GetSpellProcLimitTimer(int32 spell_id, int proc_type);
|
||||||
bool IsCastNotStandingSpell(uint16 spell_id);
|
bool IsCastNotStandingSpell(int32 spell_id);
|
||||||
int GetSpellEffectDescriptionNumber(uint16 spell_id);
|
int GetSpellEffectDescriptionNumber(int32 spell_id);
|
||||||
DmgShieldType GetDamageShieldType(uint16 spell_id, int damage_shield_type = 0);
|
DmgShieldType GetDamageShieldType(int32 spell_id, int damage_shield_type = 0);
|
||||||
bool IsRestAllowedSpell(uint16 spell_id);
|
bool IsRestAllowedSpell(int32 spell_id);
|
||||||
int GetSpellNimbusEffect(uint16 spell_id);
|
int GetSpellNimbusEffect(int32 spell_id);
|
||||||
int GetSpellFuriousBash(uint16 spell_id);
|
int GetSpellFuriousBash(int32 spell_id);
|
||||||
bool IsShortDurationBuff(uint16 spell_id);
|
bool IsShortDurationBuff(int32 spell_id);
|
||||||
bool IsSpellUsableInThisZoneType(uint16 spell_id, uint8 zone_type);
|
bool IsSpellUsableInThisZoneType(int32 spell_id, uint8 zone_type);
|
||||||
const char *GetSpellName(uint16 spell_id);
|
const char *GetSpellName(int32 spell_id);
|
||||||
int GetSpellStatValue(uint16 spell_id, const char* stat_identifier, uint8 slot = 0);
|
int GetSpellStatValue(int32 spell_id, const char* stat_identifier, uint8 slot = 0);
|
||||||
bool IsCastRestrictedSpell(uint16 spell_id);
|
bool IsCastRestrictedSpell(int32 spell_id);
|
||||||
bool IsAegolismSpell(uint16 spell_id);
|
bool IsAegolismSpell(int32 spell_id);
|
||||||
bool AegolismStackingIsSymbolSpell(uint16 spell_id);
|
bool AegolismStackingIsSymbolSpell(int32 spell_id);
|
||||||
bool AegolismStackingIsArmorClassSpell(uint16 spell_id);
|
bool AegolismStackingIsArmorClassSpell(int32 spell_id);
|
||||||
int8 SpellEffectsCount(uint16 spell_id);
|
int8 SpellEffectsCount(int32 spell_id);
|
||||||
bool IsLichSpell(uint16 spell_id);
|
bool IsLichSpell(int32 spell_id);
|
||||||
bool IsInstantHealSpell(uint32 spell_id);
|
bool IsInstantHealSpell(int32 spell_id);
|
||||||
bool IsResurrectSpell(uint16 spell_id);
|
bool IsResurrectSpell(int32 spell_id);
|
||||||
bool RequiresStackCheck(uint16 spell_type);
|
bool RequiresStackCheck(uint16 spell_type);
|
||||||
bool IsResistanceBuffSpell(uint16 spell_id);
|
bool IsResistanceBuffSpell(int32 spell_id);
|
||||||
bool IsResistanceOnlySpell(uint16 spell_id);
|
bool IsResistanceOnlySpell(int32 spell_id);
|
||||||
bool IsDamageShieldOnlySpell(uint16 spell_id);
|
bool IsDamageShieldOnlySpell(int32 spell_id);
|
||||||
bool IsDamageShieldAndResistSpell(uint16 spell_id);
|
bool IsDamageShieldAndResistSpell(int32 spell_id);
|
||||||
bool IsHateSpell(uint16 spell_id);
|
bool IsHateSpell(int32 spell_id);
|
||||||
bool IsDisciplineTome(const EQ::ItemData* item);
|
bool IsDisciplineTome(const EQ::ItemData* item);
|
||||||
|
|||||||
@@ -432,7 +432,7 @@ bool IsPullingBotSpellType(uint16 spell_type) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16 GetCorrectBotSpellType(uint16 spell_type, uint16 spell_id) {
|
uint16 GetCorrectBotSpellType(uint16 spell_type, int32 spell_id) {
|
||||||
if (!IsValidSpell(spell_id)) {
|
if (!IsValidSpell(spell_id)) {
|
||||||
return UINT16_MAX;
|
return UINT16_MAX;
|
||||||
}
|
}
|
||||||
@@ -504,7 +504,7 @@ bool IsBotBuffSpellType(uint16 spell_type) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BotRequiresLoSToCast(uint16 spell_type, uint16 spell_id) {
|
bool BotRequiresLoSToCast(uint16 spell_type, int32 spell_id) {
|
||||||
if (!BotSpellTypeRequiresTarget(spell_type)) {
|
if (!BotSpellTypeRequiresTarget(spell_type)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -38,6 +38,6 @@
|
|||||||
* Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
* Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define CURRENT_BINARY_DATABASE_VERSION 9328
|
#define CURRENT_BINARY_DATABASE_VERSION 9329
|
||||||
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9055
|
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9056
|
||||||
#define CUSTOM_BINARY_DATABASE_VERSION 0
|
#define CUSTOM_BINARY_DATABASE_VERSION 0
|
||||||
|
|||||||
+5
-5
@@ -68,9 +68,8 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_BlockedBuffs` | 🟢 Verified | | |
|
| `OP_BlockedBuffs` | 🟢 Verified | | |
|
||||||
| `OP_BoardBoat` | 🟡 Unverified | | |
|
| `OP_BoardBoat` | 🟡 Unverified | | |
|
||||||
| `OP_BookButton` | 🟡 Unverified | | |
|
| `OP_BookButton` | 🟡 Unverified | | |
|
||||||
| `OP_Buff` | 🟡 Unverified | | |
|
| `OP_BuffDefinition` | 🟢 Verified | | |
|
||||||
| `OP_BuffCreate` | 🟡 Unverified | | |
|
| `OP_BuffRemoveRequest` | 🟢 Verified | | |
|
||||||
| `OP_BuffRemoveRequest` | 🟡 Unverified | | |
|
|
||||||
| `OP_Bug` | 🟡 Unverified | | |
|
| `OP_Bug` | 🟡 Unverified | | |
|
||||||
| `OP_BuyerItems` | 🔴 Not-Set | | |
|
| `OP_BuyerItems` | 🔴 Not-Set | | |
|
||||||
| `OP_CameraEffect` | 🟡 Unverified | | |
|
| `OP_CameraEffect` | 🟡 Unverified | | |
|
||||||
@@ -395,7 +394,6 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_OpenInventory` | 🔴 Not-Set | | |
|
| `OP_OpenInventory` | 🔴 Not-Set | | |
|
||||||
| `OP_OpenTributeMaster` | 🔴 Not-Set | | |
|
| `OP_OpenTributeMaster` | 🔴 Not-Set | | |
|
||||||
| `OP_PDeletePetition` | 🔴 Not-Set | | |
|
| `OP_PDeletePetition` | 🔴 Not-Set | | |
|
||||||
| `OP_PetBuffWindow` | 🔴 Not-Set | | |
|
|
||||||
| `OP_PetCommands` | 🔴 Not-Set | | |
|
| `OP_PetCommands` | 🔴 Not-Set | | |
|
||||||
| `OP_PetCommandState` | 🔴 Not-Set | | |
|
| `OP_PetCommandState` | 🔴 Not-Set | | |
|
||||||
| `OP_PetHoTT` | 🔴 Not-Set | | |
|
| `OP_PetHoTT` | 🔴 Not-Set | | |
|
||||||
@@ -451,6 +449,9 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_RecipesFavorite` | 🟡 Unverified | | |
|
| `OP_RecipesFavorite` | 🟡 Unverified | | |
|
||||||
| `OP_RecipesSearch` | 🟡 Unverified | | |
|
| `OP_RecipesSearch` | 🟡 Unverified | | |
|
||||||
| `OP_ReclaimCrystals` | 🔴 Not-Set | | |
|
| `OP_ReclaimCrystals` | 🔴 Not-Set | | |
|
||||||
|
| `OP_RefreshBuffs` | 🟢 Verified | | |
|
||||||
|
| `OP_RefreshPetBuffs` | 🟢 Verified | | |
|
||||||
|
| `OP_RefreshTargetBuffs` | 🟢 Verified | | |
|
||||||
| `OP_ReloadUI` | 🔴 Not-Set | | |
|
| `OP_ReloadUI` | 🔴 Not-Set | | |
|
||||||
| `OP_RemoveAllDoors` | 🟡 Unverified | | |
|
| `OP_RemoveAllDoors` | 🟡 Unverified | | |
|
||||||
| `OP_RemoveBlockedBuffs` | 🟢 Verified | | |
|
| `OP_RemoveBlockedBuffs` | 🟢 Verified | | |
|
||||||
@@ -551,7 +552,6 @@ Below is a status list for the 450 opcodes we currently use on the server for th
|
|||||||
| `OP_Surname` | 🔴 Not-Set | | |
|
| `OP_Surname` | 🔴 Not-Set | | |
|
||||||
| `OP_SwapSpell` | 🟢 Verified | | |
|
| `OP_SwapSpell` | 🟢 Verified | | |
|
||||||
| `OP_SystemFingerprint` | 🔴 Not-Set | | |
|
| `OP_SystemFingerprint` | 🔴 Not-Set | | |
|
||||||
| `OP_TargetBuffs` | 🔴 Not-Set | | |
|
|
||||||
| `OP_TargetCommand` | 🟡 Unverified | | |
|
| `OP_TargetCommand` | 🟡 Unverified | | |
|
||||||
| `OP_TargetHoTT` | 🔴 Not-Set | | |
|
| `OP_TargetHoTT` | 🔴 Not-Set | | |
|
||||||
| `OP_TargetMouse` | 🟡 Unverified | | |
|
| `OP_TargetMouse` | 🟡 Unverified | | |
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ OP_CastSpell=0x3f6d
|
|||||||
OP_Consider=0x3815
|
OP_Consider=0x3815
|
||||||
OP_FormattedMessage=0x52c0
|
OP_FormattedMessage=0x52c0
|
||||||
OP_SimpleMessage=0x0e29
|
OP_SimpleMessage=0x0e29
|
||||||
OP_Buff=0x0dd5
|
OP_BuffDefinition=0x0dd5
|
||||||
OP_Illusion=0x1182
|
OP_Illusion=0x1182
|
||||||
OP_MoneyOnCorpse=0x05e8
|
OP_MoneyOnCorpse=0x05e8
|
||||||
OP_RandomReply=0x4b1a
|
OP_RandomReply=0x4b1a
|
||||||
@@ -231,8 +231,8 @@ OP_TargetHoTT=0x2baa
|
|||||||
OP_XTargetResponse=0x0be2
|
OP_XTargetResponse=0x0be2
|
||||||
OP_XTargetRequest=0x024c
|
OP_XTargetRequest=0x024c
|
||||||
OP_XTargetAutoAddHaters=0x3729
|
OP_XTargetAutoAddHaters=0x3729
|
||||||
OP_TargetBuffs=0x241c
|
OP_RefreshTargetBuffs=0x241c
|
||||||
OP_BuffCreate=0x6878
|
OP_RefreshBuffs=0x6878
|
||||||
OP_BuffRemoveRequest=0x78ab
|
OP_BuffRemoveRequest=0x78ab
|
||||||
OP_DeleteSpawn=0x5279
|
OP_DeleteSpawn=0x5279
|
||||||
OP_AutoAttack=0x1bf5
|
OP_AutoAttack=0x1bf5
|
||||||
@@ -298,7 +298,7 @@ OP_SendFindableNPCs=0x743b
|
|||||||
OP_FindPersonRequest=0x3560
|
OP_FindPersonRequest=0x3560
|
||||||
OP_FindPersonReply=0x0844
|
OP_FindPersonReply=0x0844
|
||||||
OP_Sound=0x1b73
|
OP_Sound=0x1b73
|
||||||
OP_PetBuffWindow=0x56c0
|
OP_RefreshPetBuffs=0x56c0
|
||||||
OP_LevelAppearance=0x6698
|
OP_LevelAppearance=0x6698
|
||||||
OP_Translocate=0x091a
|
OP_Translocate=0x091a
|
||||||
OP_Sacrifice=0x5b22
|
OP_Sacrifice=0x5b22
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ OP_CastSpell=0x7286 #
|
|||||||
OP_Consider=0x0000 #
|
OP_Consider=0x0000 #
|
||||||
OP_FormattedMessage=0x32c6 #
|
OP_FormattedMessage=0x32c6 #
|
||||||
OP_SimpleMessage=0x0000 # C 0x0000
|
OP_SimpleMessage=0x0000 # C 0x0000
|
||||||
OP_Buff=0x0000 #
|
OP_BuffDefinition=0x0000 #
|
||||||
OP_Illusion=0x0000 #
|
OP_Illusion=0x0000 #
|
||||||
OP_MoneyOnCorpse=0x0000 #
|
OP_MoneyOnCorpse=0x0000 #
|
||||||
OP_RandomReply=0x0000 #
|
OP_RandomReply=0x0000 #
|
||||||
@@ -224,8 +224,8 @@ OP_TargetMouse=0x5f5e #
|
|||||||
OP_MobHealth=0x0000 #
|
OP_MobHealth=0x0000 #
|
||||||
OP_InitialMobHealth=0x0000 #
|
OP_InitialMobHealth=0x0000 #
|
||||||
OP_TargetHoTT=0x0000 #
|
OP_TargetHoTT=0x0000 #
|
||||||
OP_TargetBuffs=0x0000 #
|
OP_RefreshTargetBuffs=0x0000 #
|
||||||
OP_BuffCreate=0x0000
|
OP_RefreshBuffs=0x0000
|
||||||
OP_DeleteSpawn=0x725a #
|
OP_DeleteSpawn=0x725a #
|
||||||
OP_AutoAttack=0x1df9 #
|
OP_AutoAttack=0x1df9 #
|
||||||
OP_AutoAttack2=0x0000 #
|
OP_AutoAttack2=0x0000 #
|
||||||
@@ -290,7 +290,7 @@ OP_SendFindableNPCs=0x0786 #
|
|||||||
OP_FindPersonRequest=0x0000 #
|
OP_FindPersonRequest=0x0000 #
|
||||||
OP_FindPersonReply=0x0000 #
|
OP_FindPersonReply=0x0000 #
|
||||||
OP_Sound=0x0000 #
|
OP_Sound=0x0000 #
|
||||||
OP_PetBuffWindow=0x0000 #
|
OP_RefreshPetBuffs=0x0000 #
|
||||||
OP_LevelAppearance=0x0000 #
|
OP_LevelAppearance=0x0000 #
|
||||||
OP_Translocate=0x0000 #
|
OP_Translocate=0x0000 #
|
||||||
OP_Sacrifice=0x0000 #
|
OP_Sacrifice=0x0000 #
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ OP_CastSpell=0x0000 #
|
|||||||
OP_Consider=0x0000 #
|
OP_Consider=0x0000 #
|
||||||
OP_FormattedMessage=0x0000 #
|
OP_FormattedMessage=0x0000 #
|
||||||
OP_SimpleMessage=0x0000 #
|
OP_SimpleMessage=0x0000 #
|
||||||
OP_Buff=0x0000 #
|
OP_BuffDefinition=0x0000 #
|
||||||
OP_Illusion=0x0000 #
|
OP_Illusion=0x0000 #
|
||||||
OP_MoneyOnCorpse=0x0000 #
|
OP_MoneyOnCorpse=0x0000 #
|
||||||
OP_RandomReply=0x0000 #
|
OP_RandomReply=0x0000 #
|
||||||
@@ -234,8 +234,8 @@ OP_TargetMouse=0x0000 #
|
|||||||
OP_MobHealth=0x0000 #
|
OP_MobHealth=0x0000 #
|
||||||
OP_InitialMobHealth=0x0000 #
|
OP_InitialMobHealth=0x0000 #
|
||||||
OP_TargetHoTT=0x0000 #
|
OP_TargetHoTT=0x0000 #
|
||||||
OP_TargetBuffs=0x0000 #
|
OP_RefreshTargetBuffs=0x0000 #
|
||||||
OP_BuffCreate=0x0000 #
|
OP_RefreshBuffs=0x0000 #
|
||||||
OP_BuffRemoveRequest=0x0000
|
OP_BuffRemoveRequest=0x0000
|
||||||
OP_DeleteSpawn=0x0000 #
|
OP_DeleteSpawn=0x0000 #
|
||||||
OP_AutoAttack=0x0000 #
|
OP_AutoAttack=0x0000 #
|
||||||
@@ -302,7 +302,7 @@ OP_SendFindableNPCs=0x6c36 #
|
|||||||
OP_FindPersonRequest=0x0000 #
|
OP_FindPersonRequest=0x0000 #
|
||||||
OP_FindPersonReply=0x0000 #
|
OP_FindPersonReply=0x0000 #
|
||||||
OP_Sound=0x0000 #
|
OP_Sound=0x0000 #
|
||||||
OP_PetBuffWindow=0x0000 #
|
OP_RefreshPetBuffs=0x0000 #
|
||||||
OP_LevelAppearance=0x0000 #
|
OP_LevelAppearance=0x0000 #
|
||||||
OP_Translocate=0x0000 #
|
OP_Translocate=0x0000 #
|
||||||
OP_Sacrifice=0x0000 #
|
OP_Sacrifice=0x0000 #
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ OP_CastSpell=0x1cb5
|
|||||||
OP_Consider=0x4d8d
|
OP_Consider=0x4d8d
|
||||||
OP_FormattedMessage=0x6afe
|
OP_FormattedMessage=0x6afe
|
||||||
OP_SimpleMessage=0x02a5
|
OP_SimpleMessage=0x02a5
|
||||||
OP_Buff=0x08ed
|
OP_BuffDefinition=0x08ed
|
||||||
OP_Illusion=0x6c43
|
OP_Illusion=0x6c43
|
||||||
OP_MoneyOnCorpse=0x1837
|
OP_MoneyOnCorpse=0x1837
|
||||||
OP_RandomReply=0x6525
|
OP_RandomReply=0x6525
|
||||||
@@ -231,8 +231,8 @@ OP_TargetHoTT=0x3af5
|
|||||||
OP_XTargetResponse=0x7f64
|
OP_XTargetResponse=0x7f64
|
||||||
OP_XTargetRequest=0x6753
|
OP_XTargetRequest=0x6753
|
||||||
OP_XTargetAutoAddHaters=0x5f51
|
OP_XTargetAutoAddHaters=0x5f51
|
||||||
OP_TargetBuffs=0x1c71
|
OP_RefreshTargetBuffs=0x1c71
|
||||||
OP_BuffCreate=0x71f5
|
OP_RefreshBuffs=0x71f5
|
||||||
OP_BuffRemoveRequest=0x7efd
|
OP_BuffRemoveRequest=0x7efd
|
||||||
OP_DeleteSpawn=0x3b06
|
OP_DeleteSpawn=0x3b06
|
||||||
OP_AutoAttack=0x0d14
|
OP_AutoAttack=0x0d14
|
||||||
@@ -298,7 +298,7 @@ OP_SendFindableNPCs=0x34c3
|
|||||||
OP_FindPersonRequest=0x2f3b
|
OP_FindPersonRequest=0x2f3b
|
||||||
OP_FindPersonReply=0x44f7
|
OP_FindPersonReply=0x44f7
|
||||||
OP_Sound=0x3cec
|
OP_Sound=0x3cec
|
||||||
OP_PetBuffWindow=0x7197
|
OP_RefreshPetBuffs=0x7197
|
||||||
OP_LevelAppearance=0x7c4d
|
OP_LevelAppearance=0x7c4d
|
||||||
OP_Translocate=0x6f01
|
OP_Translocate=0x6f01
|
||||||
OP_Sacrifice=0x76ab
|
OP_Sacrifice=0x76ab
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ OP_CastSpell=0x7286 # C
|
|||||||
OP_Consider=0x0000 # C
|
OP_Consider=0x0000 # C
|
||||||
OP_FormattedMessage=0x0000 # C
|
OP_FormattedMessage=0x0000 # C
|
||||||
OP_SimpleMessage=0x0000 # C 0x0000
|
OP_SimpleMessage=0x0000 # C 0x0000
|
||||||
OP_Buff=0x0000 # C
|
OP_BuffDefinition=0x0000 # C
|
||||||
OP_Illusion=0x0000 # C
|
OP_Illusion=0x0000 # C
|
||||||
OP_MoneyOnCorpse=0x0000 # C
|
OP_MoneyOnCorpse=0x0000 # C
|
||||||
OP_RandomReply=0x0000 # C
|
OP_RandomReply=0x0000 # C
|
||||||
@@ -224,8 +224,8 @@ OP_TargetMouse=0x36f8 # C 0x0000
|
|||||||
OP_MobHealth=0x0000 # C
|
OP_MobHealth=0x0000 # C
|
||||||
OP_InitialMobHealth=0x0000 # C
|
OP_InitialMobHealth=0x0000 # C
|
||||||
OP_TargetHoTT=0x0000 # C
|
OP_TargetHoTT=0x0000 # C
|
||||||
OP_TargetBuffs=0x0000 # C
|
OP_RefreshTargetBuffs=0x0000 # C
|
||||||
OP_BuffCreate=0x6bfb # V
|
OP_RefreshBuffs=0x6bfb # V
|
||||||
OP_DeleteSpawn=0x7434 # was 0x7434
|
OP_DeleteSpawn=0x7434 # was 0x7434
|
||||||
OP_AutoAttack=0x0000 # C
|
OP_AutoAttack=0x0000 # C
|
||||||
OP_AutoAttack2=0x0000 # C
|
OP_AutoAttack2=0x0000 # C
|
||||||
@@ -290,7 +290,7 @@ OP_SendFindableNPCs=0x49f6 # C
|
|||||||
OP_FindPersonRequest=0x0000 # C
|
OP_FindPersonRequest=0x0000 # C
|
||||||
OP_FindPersonReply=0x0000 # C
|
OP_FindPersonReply=0x0000 # C
|
||||||
OP_Sound=0x0000 # C
|
OP_Sound=0x0000 # C
|
||||||
OP_PetBuffWindow=0x0000 # C
|
OP_RefreshPetBuffs=0x0000 # C
|
||||||
OP_LevelAppearance=0x0000 # C
|
OP_LevelAppearance=0x0000 # C
|
||||||
OP_Translocate=0x0000 # C
|
OP_Translocate=0x0000 # C
|
||||||
OP_Sacrifice=0x0000 # C
|
OP_Sacrifice=0x0000 # C
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ OP_CastSpell=0x0e18
|
|||||||
OP_Consider=0x0fcd
|
OP_Consider=0x0fcd
|
||||||
OP_FormattedMessage=0x748e
|
OP_FormattedMessage=0x748e
|
||||||
OP_SimpleMessage=0x3ecd
|
OP_SimpleMessage=0x3ecd
|
||||||
OP_Buff=0x1a9b
|
OP_BuffDefinition=0x1a9b
|
||||||
OP_Illusion=0x359a
|
OP_Illusion=0x359a
|
||||||
OP_MoneyOnCorpse=0x1107
|
OP_MoneyOnCorpse=0x1107
|
||||||
OP_RandomReply=0x5cc5
|
OP_RandomReply=0x5cc5
|
||||||
@@ -231,8 +231,8 @@ OP_TargetHoTT=0x1fd6
|
|||||||
OP_XTargetResponse=0x6d47
|
OP_XTargetResponse=0x6d47
|
||||||
OP_XTargetRequest=0x2603
|
OP_XTargetRequest=0x2603
|
||||||
OP_XTargetAutoAddHaters=0x5fe3
|
OP_XTargetAutoAddHaters=0x5fe3
|
||||||
OP_TargetBuffs=0x4c77
|
OP_RefreshTargetBuffs=0x4c77
|
||||||
OP_BuffCreate=0x20ee
|
OP_RefreshBuffs=0x20ee
|
||||||
OP_BuffRemoveRequest=0x7ca3
|
OP_BuffRemoveRequest=0x7ca3
|
||||||
OP_DeleteSpawn=0x0ead
|
OP_DeleteSpawn=0x0ead
|
||||||
OP_AutoAttack=0x12fb
|
OP_AutoAttack=0x12fb
|
||||||
@@ -298,7 +298,7 @@ OP_SendFindableNPCs=0x7b8a
|
|||||||
OP_FindPersonRequest=0x5d79
|
OP_FindPersonRequest=0x5d79
|
||||||
OP_FindPersonReply=0x2b23
|
OP_FindPersonReply=0x2b23
|
||||||
OP_Sound=0x03fa
|
OP_Sound=0x03fa
|
||||||
OP_PetBuffWindow=0x1e1c
|
OP_RefreshPetBuffs=0x1e1c
|
||||||
OP_LevelAppearance=0x0442
|
OP_LevelAppearance=0x0442
|
||||||
OP_Translocate=0x2e84
|
OP_Translocate=0x2e84
|
||||||
OP_Sacrifice=0x0d88
|
OP_Sacrifice=0x0d88
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ OP_CastSpell=0x7286 # C
|
|||||||
OP_Consider=0x0000 # C
|
OP_Consider=0x0000 # C
|
||||||
OP_FormattedMessage=0x0000 # C
|
OP_FormattedMessage=0x0000 # C
|
||||||
OP_SimpleMessage=0x0000 # C 0x0000
|
OP_SimpleMessage=0x0000 # C 0x0000
|
||||||
OP_Buff=0x0000 # C
|
OP_BuffDefinition=0x0000 # C
|
||||||
OP_Illusion=0x0000 # C
|
OP_Illusion=0x0000 # C
|
||||||
OP_MoneyOnCorpse=0x0000 # C
|
OP_MoneyOnCorpse=0x0000 # C
|
||||||
OP_RandomReply=0x0000 # C
|
OP_RandomReply=0x0000 # C
|
||||||
@@ -224,8 +224,8 @@ OP_TargetMouse=0x36f8 # C 0x0000
|
|||||||
OP_MobHealth=0x0000 # C
|
OP_MobHealth=0x0000 # C
|
||||||
OP_InitialMobHealth=0x0000 # C
|
OP_InitialMobHealth=0x0000 # C
|
||||||
OP_TargetHoTT=0x0000 # C
|
OP_TargetHoTT=0x0000 # C
|
||||||
OP_TargetBuffs=0x0000 # C
|
OP_RefreshTargetBuffs=0x0000 # C
|
||||||
OP_BuffCreate=0x6bfb # V
|
OP_RefreshBuffs=0x6bfb # V
|
||||||
OP_DeleteSpawn=0x7434 # was 0x7434
|
OP_DeleteSpawn=0x7434 # was 0x7434
|
||||||
OP_AutoAttack=0x0000 # C
|
OP_AutoAttack=0x0000 # C
|
||||||
OP_AutoAttack2=0x0000 # C
|
OP_AutoAttack2=0x0000 # C
|
||||||
@@ -290,7 +290,7 @@ OP_SendFindableNPCs=0x7eeb # C
|
|||||||
OP_FindPersonRequest=0x0000 # C
|
OP_FindPersonRequest=0x0000 # C
|
||||||
OP_FindPersonReply=0x0000 # C
|
OP_FindPersonReply=0x0000 # C
|
||||||
OP_Sound=0x0000 # C
|
OP_Sound=0x0000 # C
|
||||||
OP_PetBuffWindow=0x0000 # C
|
OP_RefreshPetBuffs=0x0000 # C
|
||||||
OP_LevelAppearance=0x0000 # C
|
OP_LevelAppearance=0x0000 # C
|
||||||
OP_Translocate=0x0000 # C
|
OP_Translocate=0x0000 # C
|
||||||
OP_Sacrifice=0x0000 # C
|
OP_Sacrifice=0x0000 # C
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ OP_CastSpell=0x6bd3
|
|||||||
OP_Consider=0x1184
|
OP_Consider=0x1184
|
||||||
OP_FormattedMessage=0x1bc4
|
OP_FormattedMessage=0x1bc4
|
||||||
OP_SimpleMessage=0x4926
|
OP_SimpleMessage=0x4926
|
||||||
OP_Buff=0x3526
|
OP_BuffDefinition=0x3526
|
||||||
OP_Illusion=0x02e6
|
OP_Illusion=0x02e6
|
||||||
OP_MoneyOnCorpse=0x2a0f
|
OP_MoneyOnCorpse=0x2a0f
|
||||||
OP_RandomReply=0x0b4b
|
OP_RandomReply=0x0b4b
|
||||||
@@ -231,8 +231,8 @@ OP_TargetHoTT=0x43ec
|
|||||||
OP_XTargetResponse=0x18c5
|
OP_XTargetResponse=0x18c5
|
||||||
OP_XTargetRequest=0x47bc
|
OP_XTargetRequest=0x47bc
|
||||||
OP_XTargetAutoAddHaters=0x48f8
|
OP_XTargetAutoAddHaters=0x48f8
|
||||||
OP_TargetBuffs=0x0a99
|
OP_RefreshTargetBuffs=0x0a99
|
||||||
OP_BuffCreate=0x1cc2
|
OP_RefreshBuffs=0x1cc2
|
||||||
OP_BuffRemoveRequest=0x1338
|
OP_BuffRemoveRequest=0x1338
|
||||||
OP_DeleteSpawn=0x781f
|
OP_DeleteSpawn=0x781f
|
||||||
OP_AutoAttack=0x1740
|
OP_AutoAttack=0x1740
|
||||||
@@ -298,7 +298,7 @@ OP_SendFindableNPCs=0x5de1
|
|||||||
OP_FindPersonRequest=0x4150
|
OP_FindPersonRequest=0x4150
|
||||||
OP_FindPersonReply=0x65f0
|
OP_FindPersonReply=0x65f0
|
||||||
OP_Sound=0x797b
|
OP_Sound=0x797b
|
||||||
OP_PetBuffWindow=0x12cd
|
OP_RefreshPetBuffs=0x12cd
|
||||||
OP_LevelAppearance=0x34b9
|
OP_LevelAppearance=0x34b9
|
||||||
OP_Translocate=0x7121
|
OP_Translocate=0x7121
|
||||||
OP_Sacrifice=0x609b
|
OP_Sacrifice=0x609b
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ OP_CastSpell=0x8543 #
|
|||||||
OP_Consider=0x70c6 #
|
OP_Consider=0x70c6 #
|
||||||
OP_FormattedMessage=0x4675 #
|
OP_FormattedMessage=0x4675 #
|
||||||
OP_SimpleMessage=0x0698 #
|
OP_SimpleMessage=0x0698 #
|
||||||
OP_Buff=0x4658 #
|
OP_BuffDefinition=0x4658 #
|
||||||
OP_Illusion=0x10b7 #
|
OP_Illusion=0x10b7 #
|
||||||
OP_MoneyOnCorpse=0x4074 #
|
OP_MoneyOnCorpse=0x4074 #
|
||||||
OP_RandomReply=0x07fb #
|
OP_RandomReply=0x07fb #
|
||||||
@@ -234,8 +234,8 @@ OP_TargetMouse=0x3edc #
|
|||||||
OP_MobHealth=0x5cb0 #
|
OP_MobHealth=0x5cb0 #
|
||||||
OP_InitialMobHealth=0x0000 #
|
OP_InitialMobHealth=0x0000 #
|
||||||
OP_TargetHoTT=0x460e #
|
OP_TargetHoTT=0x460e #
|
||||||
OP_TargetBuffs=0x7c24 #
|
OP_RefreshTargetBuffs=0x7c24 #
|
||||||
OP_BuffCreate=0x0c98 #
|
OP_RefreshBuffs=0x0c98 #
|
||||||
OP_BuffRemoveRequest=0x3567
|
OP_BuffRemoveRequest=0x3567
|
||||||
OP_DeleteSpawn=0x3164 #
|
OP_DeleteSpawn=0x3164 #
|
||||||
OP_AutoAttack=0x2257 #
|
OP_AutoAttack=0x2257 #
|
||||||
@@ -302,7 +302,7 @@ OP_SendFindableNPCs=0x50c1 #
|
|||||||
OP_FindPersonRequest=0x19a8 #
|
OP_FindPersonRequest=0x19a8 #
|
||||||
OP_FindPersonReply=0x7e45 #
|
OP_FindPersonReply=0x7e45 #
|
||||||
OP_Sound=0x2d1d #
|
OP_Sound=0x2d1d #
|
||||||
OP_PetBuffWindow=0x4895 #
|
OP_RefreshPetBuffs=0x4895 #
|
||||||
OP_LevelAppearance=0x78b9 #
|
OP_LevelAppearance=0x78b9 #
|
||||||
OP_Translocate=0x42ef #
|
OP_Translocate=0x42ef #
|
||||||
OP_Sacrifice=0x2dc6 #
|
OP_Sacrifice=0x2dc6 #
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ OP_CastSpell=0x8543 #
|
|||||||
OP_Consider=0x70c6 #
|
OP_Consider=0x70c6 #
|
||||||
OP_FormattedMessage=0x4675 #
|
OP_FormattedMessage=0x4675 #
|
||||||
OP_SimpleMessage=0x0698 #
|
OP_SimpleMessage=0x0698 #
|
||||||
OP_Buff=0x4658 #
|
OP_BuffDefinition=0x4658 #
|
||||||
OP_Illusion=0x10b7 #
|
OP_Illusion=0x10b7 #
|
||||||
OP_MoneyOnCorpse=0x4074 #
|
OP_MoneyOnCorpse=0x4074 #
|
||||||
OP_RandomReply=0x07fb #
|
OP_RandomReply=0x07fb #
|
||||||
@@ -234,8 +234,8 @@ OP_TargetMouse=0x3edc #
|
|||||||
OP_MobHealth=0x5cb0 #
|
OP_MobHealth=0x5cb0 #
|
||||||
OP_InitialMobHealth=0x0000 #
|
OP_InitialMobHealth=0x0000 #
|
||||||
OP_TargetHoTT=0x460e #
|
OP_TargetHoTT=0x460e #
|
||||||
OP_TargetBuffs=0x7c24 #
|
OP_RefreshTargetBuffs=0x7c24 #
|
||||||
OP_BuffCreate=0x0c98 #
|
OP_RefreshBuffs=0x0c98 #
|
||||||
OP_BuffRemoveRequest=0x3567
|
OP_BuffRemoveRequest=0x3567
|
||||||
OP_DeleteSpawn=0x3164 #
|
OP_DeleteSpawn=0x3164 #
|
||||||
OP_AutoAttack=0x2257 #
|
OP_AutoAttack=0x2257 #
|
||||||
@@ -302,7 +302,7 @@ OP_SendFindableNPCs=0x099e #
|
|||||||
OP_FindPersonRequest=0x19a8 #
|
OP_FindPersonRequest=0x19a8 #
|
||||||
OP_FindPersonReply=0x7e45 #
|
OP_FindPersonReply=0x7e45 #
|
||||||
OP_Sound=0x2d1d #
|
OP_Sound=0x2d1d #
|
||||||
OP_PetBuffWindow=0x4895 #
|
OP_RefreshPetBuffs=0x4895 #
|
||||||
OP_LevelAppearance=0x78b9 #
|
OP_LevelAppearance=0x78b9 #
|
||||||
OP_Translocate=0x42ef #
|
OP_Translocate=0x42ef #
|
||||||
OP_Sacrifice=0x2dc6 #
|
OP_Sacrifice=0x2dc6 #
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ OP_CastSpell=0x56ab
|
|||||||
OP_Consider=0x476f
|
OP_Consider=0x476f
|
||||||
OP_FormattedMessage=0x69aa
|
OP_FormattedMessage=0x69aa
|
||||||
OP_SimpleMessage=0x0e87
|
OP_SimpleMessage=0x0e87
|
||||||
OP_Buff=0x2acd
|
OP_BuffDefinition=0x2acd
|
||||||
OP_Illusion=0x739c
|
OP_Illusion=0x739c
|
||||||
OP_MoneyOnCorpse=0x43c4
|
OP_MoneyOnCorpse=0x43c4
|
||||||
OP_RandomReply=0x467d
|
OP_RandomReply=0x467d
|
||||||
@@ -231,8 +231,8 @@ OP_TargetHoTT=0x72b0
|
|||||||
OP_XTargetResponse=0x38c9
|
OP_XTargetResponse=0x38c9
|
||||||
OP_XTargetRequest=0x616b
|
OP_XTargetRequest=0x616b
|
||||||
OP_XTargetAutoAddHaters=0x0ef7
|
OP_XTargetAutoAddHaters=0x0ef7
|
||||||
OP_TargetBuffs=0x0aa5
|
OP_RefreshTargetBuffs=0x0aa5
|
||||||
OP_BuffCreate=0x3e45
|
OP_RefreshBuffs=0x3e45
|
||||||
OP_BuffRemoveRequest=0x063f
|
OP_BuffRemoveRequest=0x063f
|
||||||
OP_DeleteSpawn=0x49e0
|
OP_DeleteSpawn=0x49e0
|
||||||
OP_AutoAttack=0x18e2
|
OP_AutoAttack=0x18e2
|
||||||
@@ -298,7 +298,7 @@ OP_SendFindableNPCs=0x6788
|
|||||||
OP_FindPersonRequest=0x6ccd
|
OP_FindPersonRequest=0x6ccd
|
||||||
OP_FindPersonReply=0x1f1c
|
OP_FindPersonReply=0x1f1c
|
||||||
OP_Sound=0x6957
|
OP_Sound=0x6957
|
||||||
OP_PetBuffWindow=0x66a7
|
OP_RefreshPetBuffs=0x66a7
|
||||||
OP_LevelAppearance=0x3714
|
OP_LevelAppearance=0x3714
|
||||||
OP_Translocate=0x4613
|
OP_Translocate=0x4613
|
||||||
OP_Sacrifice=0x1502
|
OP_Sacrifice=0x1502
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ OP_CastSpell=0x8543 #
|
|||||||
OP_Consider=0x70c6 #
|
OP_Consider=0x70c6 #
|
||||||
OP_FormattedMessage=0x4675 #
|
OP_FormattedMessage=0x4675 #
|
||||||
OP_SimpleMessage=0x0698 #
|
OP_SimpleMessage=0x0698 #
|
||||||
OP_Buff=0x4658 #
|
OP_BuffDefinition=0x4658 #
|
||||||
OP_Illusion=0x10b7 #
|
OP_Illusion=0x10b7 #
|
||||||
OP_MoneyOnCorpse=0x4074 #
|
OP_MoneyOnCorpse=0x4074 #
|
||||||
OP_RandomReply=0x07fb #
|
OP_RandomReply=0x07fb #
|
||||||
@@ -232,8 +232,8 @@ OP_TargetMouse=0x3edc #
|
|||||||
OP_MobHealth=0x5cb0 #
|
OP_MobHealth=0x5cb0 #
|
||||||
OP_InitialMobHealth=0x0000 #
|
OP_InitialMobHealth=0x0000 #
|
||||||
OP_TargetHoTT=0x460e #
|
OP_TargetHoTT=0x460e #
|
||||||
OP_TargetBuffs=0x7c24 #
|
OP_RefreshTargetBuffs=0x7c24 #
|
||||||
OP_BuffCreate=0x0c98 #
|
OP_RefreshBuffs=0x0c98 #
|
||||||
OP_BuffRemoveRequest=0x3567
|
OP_BuffRemoveRequest=0x3567
|
||||||
OP_DeleteSpawn=0x3164 #
|
OP_DeleteSpawn=0x3164 #
|
||||||
OP_AutoAttack=0x2257 #
|
OP_AutoAttack=0x2257 #
|
||||||
@@ -300,7 +300,7 @@ OP_SendFindableNPCs=0x3015 #
|
|||||||
OP_FindPersonRequest=0x19a8 #
|
OP_FindPersonRequest=0x19a8 #
|
||||||
OP_FindPersonReply=0x7e45 #
|
OP_FindPersonReply=0x7e45 #
|
||||||
OP_Sound=0x2d1d #
|
OP_Sound=0x2d1d #
|
||||||
OP_PetBuffWindow=0x4895 #
|
OP_RefreshPetBuffs=0x4895 #
|
||||||
OP_LevelAppearance=0x78b9 #
|
OP_LevelAppearance=0x78b9 #
|
||||||
OP_Translocate=0x42ef #
|
OP_Translocate=0x42ef #
|
||||||
OP_Sacrifice=0x2dc6 #
|
OP_Sacrifice=0x2dc6 #
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ OP_CastSpell=0x7286 # C
|
|||||||
OP_Consider=0x0000 # C
|
OP_Consider=0x0000 # C
|
||||||
OP_FormattedMessage=0x0000 # C
|
OP_FormattedMessage=0x0000 # C
|
||||||
OP_SimpleMessage=0x0000 # C 0x0000
|
OP_SimpleMessage=0x0000 # C 0x0000
|
||||||
OP_Buff=0x0000 # C
|
OP_BuffDefinition=0x0000 # C
|
||||||
OP_Illusion=0x0000 # C
|
OP_Illusion=0x0000 # C
|
||||||
OP_MoneyOnCorpse=0x0000 # C
|
OP_MoneyOnCorpse=0x0000 # C
|
||||||
OP_RandomReply=0x0000 # C
|
OP_RandomReply=0x0000 # C
|
||||||
@@ -224,8 +224,8 @@ OP_TargetMouse=0x36f8 # C 0x0000
|
|||||||
OP_MobHealth=0x0000 # C
|
OP_MobHealth=0x0000 # C
|
||||||
OP_InitialMobHealth=0x0000 # C
|
OP_InitialMobHealth=0x0000 # C
|
||||||
OP_TargetHoTT=0x0000 # C
|
OP_TargetHoTT=0x0000 # C
|
||||||
OP_TargetBuffs=0x0000 # C
|
OP_RefreshTargetBuffs=0x0000 # C
|
||||||
OP_BuffCreate=0x6bfb # V
|
OP_RefreshBuffs=0x6bfb # V
|
||||||
OP_DeleteSpawn=0x7434 # was 0x7434
|
OP_DeleteSpawn=0x7434 # was 0x7434
|
||||||
OP_AutoAttack=0x0000 # C
|
OP_AutoAttack=0x0000 # C
|
||||||
OP_AutoAttack2=0x0000 # C
|
OP_AutoAttack2=0x0000 # C
|
||||||
@@ -290,7 +290,7 @@ OP_SendFindableNPCs=0x7eeb # C
|
|||||||
OP_FindPersonRequest=0x0000 # C
|
OP_FindPersonRequest=0x0000 # C
|
||||||
OP_FindPersonReply=0x0000 # C
|
OP_FindPersonReply=0x0000 # C
|
||||||
OP_Sound=0x0000 # C
|
OP_Sound=0x0000 # C
|
||||||
OP_PetBuffWindow=0x0000 # C
|
OP_RefreshPetBuffs=0x0000 # C
|
||||||
OP_LevelAppearance=0x0000 # C
|
OP_LevelAppearance=0x0000 # C
|
||||||
OP_Translocate=0x0000 # C
|
OP_Translocate=0x0000 # C
|
||||||
OP_Sacrifice=0x0000 # C
|
OP_Sacrifice=0x0000 # C
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ OP_CastSpell=0x50c2 # C
|
|||||||
OP_Consider=0x3c2d # C
|
OP_Consider=0x3c2d # C
|
||||||
OP_FormattedMessage=0x3b52 # C
|
OP_FormattedMessage=0x3b52 # C
|
||||||
OP_SimpleMessage=0x1f4d # C 0x5448
|
OP_SimpleMessage=0x1f4d # C 0x5448
|
||||||
OP_Buff=0x0d1d # C
|
OP_BuffDefinition=0x0d1d # C
|
||||||
OP_Illusion=0x231f # C
|
OP_Illusion=0x231f # C
|
||||||
OP_MoneyOnCorpse=0x4a83 # C
|
OP_MoneyOnCorpse=0x4a83 # C
|
||||||
OP_RandomReply=0x6d5d # C
|
OP_RandomReply=0x6d5d # C
|
||||||
@@ -225,8 +225,8 @@ OP_TargetMouse=0x5f5e # C 0x7bbb
|
|||||||
OP_MobHealth=0x15de # C
|
OP_MobHealth=0x15de # C
|
||||||
OP_InitialMobHealth=0x5cb0 # C
|
OP_InitialMobHealth=0x5cb0 # C
|
||||||
OP_TargetHoTT=0x4d56 # C
|
OP_TargetHoTT=0x4d56 # C
|
||||||
OP_TargetBuffs=0x3f24 # C
|
OP_RefreshTargetBuffs=0x3f24 # C
|
||||||
OP_BuffCreate=0x2121 # V
|
OP_RefreshBuffs=0x2121 # V
|
||||||
OP_DeleteSpawn=0x58c5 # C
|
OP_DeleteSpawn=0x58c5 # C
|
||||||
OP_AutoAttack=0x1df9 # C
|
OP_AutoAttack=0x1df9 # C
|
||||||
OP_AutoAttack2=0x517b # C
|
OP_AutoAttack2=0x517b # C
|
||||||
@@ -291,7 +291,7 @@ OP_SendFindableNPCs=0x6193 # C
|
|||||||
OP_FindPersonRequest=0x1e04 # C
|
OP_FindPersonRequest=0x1e04 # C
|
||||||
OP_FindPersonReply=0x7cae # C
|
OP_FindPersonReply=0x7cae # C
|
||||||
OP_Sound=0x737a # C
|
OP_Sound=0x737a # C
|
||||||
OP_PetBuffWindow=0x7b87 # C
|
OP_RefreshPetBuffs=0x7b87 # C
|
||||||
OP_LevelAppearance=0x1bd4 # C
|
OP_LevelAppearance=0x1bd4 # C
|
||||||
OP_Translocate=0x3d9c # C
|
OP_Translocate=0x3d9c # C
|
||||||
OP_Sacrifice=0x301b # C
|
OP_Sacrifice=0x301b # C
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ OP_CastSpell=0x7286 # C
|
|||||||
OP_Consider=0x0000 # C
|
OP_Consider=0x0000 # C
|
||||||
OP_FormattedMessage=0x0000 # C
|
OP_FormattedMessage=0x0000 # C
|
||||||
OP_SimpleMessage=0x0000 # C 0x0000
|
OP_SimpleMessage=0x0000 # C 0x0000
|
||||||
OP_Buff=0x0000 # C
|
OP_BuffDefinition=0x0000 # C
|
||||||
OP_Illusion=0x0000 # C
|
OP_Illusion=0x0000 # C
|
||||||
OP_MoneyOnCorpse=0x0000 # C
|
OP_MoneyOnCorpse=0x0000 # C
|
||||||
OP_RandomReply=0x0000 # C
|
OP_RandomReply=0x0000 # C
|
||||||
@@ -224,8 +224,8 @@ OP_TargetMouse=0x36f8 # C 0x0000
|
|||||||
OP_MobHealth=0x0000 # C
|
OP_MobHealth=0x0000 # C
|
||||||
OP_InitialMobHealth=0x0000 # C
|
OP_InitialMobHealth=0x0000 # C
|
||||||
OP_TargetHoTT=0x0000 # C
|
OP_TargetHoTT=0x0000 # C
|
||||||
OP_TargetBuffs=0x0000 # C
|
OP_RefreshTargetBuffs=0x0000 # C
|
||||||
OP_BuffCreate=0x6bfb # V
|
OP_RefreshBuffs=0x6bfb # V
|
||||||
OP_DeleteSpawn=0x7434 # was 0x7434
|
OP_DeleteSpawn=0x7434 # was 0x7434
|
||||||
OP_AutoAttack=0x0000 # C
|
OP_AutoAttack=0x0000 # C
|
||||||
OP_AutoAttack2=0x0000 # C
|
OP_AutoAttack2=0x0000 # C
|
||||||
@@ -290,7 +290,7 @@ OP_SendFindableNPCs=0x390c # C
|
|||||||
OP_FindPersonRequest=0x0000 # C
|
OP_FindPersonRequest=0x0000 # C
|
||||||
OP_FindPersonReply=0x0000 # C
|
OP_FindPersonReply=0x0000 # C
|
||||||
OP_Sound=0x0000 # C
|
OP_Sound=0x0000 # C
|
||||||
OP_PetBuffWindow=0x0000 # C
|
OP_RefreshPetBuffs=0x0000 # C
|
||||||
OP_LevelAppearance=0x0000 # C
|
OP_LevelAppearance=0x0000 # C
|
||||||
OP_Translocate=0x0000 # C
|
OP_Translocate=0x0000 # C
|
||||||
OP_Sacrifice=0x0000 # C
|
OP_Sacrifice=0x0000 # C
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ OP_CastSpell=0x7286 #
|
|||||||
OP_Consider=0x70c6 #c
|
OP_Consider=0x70c6 #c
|
||||||
OP_FormattedMessage=0x32c6 #
|
OP_FormattedMessage=0x32c6 #
|
||||||
OP_SimpleMessage=0x0000 # C 0x0000
|
OP_SimpleMessage=0x0000 # C 0x0000
|
||||||
OP_Buff=0x0000 #
|
OP_BuffDefinition=0x0000 #
|
||||||
OP_Illusion=0x4843 #c
|
OP_Illusion=0x4843 #c
|
||||||
OP_MoneyOnCorpse=0x0000 #
|
OP_MoneyOnCorpse=0x0000 #
|
||||||
OP_RandomReply=0x0000 #
|
OP_RandomReply=0x0000 #
|
||||||
@@ -215,8 +215,8 @@ OP_TargetMouse=0x3edc #
|
|||||||
OP_MobHealth=0x5cb0 #c
|
OP_MobHealth=0x5cb0 #c
|
||||||
OP_InitialMobHealth=0x0000 #
|
OP_InitialMobHealth=0x0000 #
|
||||||
OP_TargetHoTT=0x0000 #
|
OP_TargetHoTT=0x0000 #
|
||||||
OP_TargetBuffs=0x0000 #
|
OP_RefreshTargetBuffs=0x0000 #
|
||||||
OP_BuffCreate=0x0000
|
OP_RefreshBuffs=0x0000
|
||||||
OP_DeleteSpawn=0x58c5 #c
|
OP_DeleteSpawn=0x58c5 #c
|
||||||
OP_AutoAttack=0x1df9 #
|
OP_AutoAttack=0x1df9 #
|
||||||
OP_AutoAttack2=0x0000 #
|
OP_AutoAttack2=0x0000 #
|
||||||
@@ -281,7 +281,7 @@ OP_SendFindableNPCs=0x3015 #
|
|||||||
OP_FindPersonRequest=0x0000 #
|
OP_FindPersonRequest=0x0000 #
|
||||||
OP_FindPersonReply=0x0000 #
|
OP_FindPersonReply=0x0000 #
|
||||||
OP_Sound=0x0000 #
|
OP_Sound=0x0000 #
|
||||||
OP_PetBuffWindow=0x0000 #
|
OP_RefreshPetBuffs=0x0000 #
|
||||||
OP_LevelAppearance=0x0000 #
|
OP_LevelAppearance=0x0000 #
|
||||||
OP_Translocate=0x0000 #
|
OP_Translocate=0x0000 #
|
||||||
OP_Sacrifice=0x0000 #
|
OP_Sacrifice=0x0000 #
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ OP_CastSpell=0x7286 # C
|
|||||||
OP_Consider=0x0000 # C
|
OP_Consider=0x0000 # C
|
||||||
OP_FormattedMessage=0x0000 # C
|
OP_FormattedMessage=0x0000 # C
|
||||||
OP_SimpleMessage=0x0000 # C 0x0000
|
OP_SimpleMessage=0x0000 # C 0x0000
|
||||||
OP_Buff=0x0000 # C
|
OP_BuffDefinition=0x0000 # C
|
||||||
OP_Illusion=0x0000 # C
|
OP_Illusion=0x0000 # C
|
||||||
OP_MoneyOnCorpse=0x0000 # C
|
OP_MoneyOnCorpse=0x0000 # C
|
||||||
OP_RandomReply=0x0000 # C
|
OP_RandomReply=0x0000 # C
|
||||||
@@ -225,8 +225,8 @@ OP_TargetMouse=0x36f8 # C 0x0000
|
|||||||
OP_MobHealth=0x0000 # C
|
OP_MobHealth=0x0000 # C
|
||||||
OP_InitialMobHealth=0x0000 # C
|
OP_InitialMobHealth=0x0000 # C
|
||||||
OP_TargetHoTT=0x0000 # C
|
OP_TargetHoTT=0x0000 # C
|
||||||
OP_TargetBuffs=0x0000 # C
|
OP_RefreshTargetBuffs=0x0000 # C
|
||||||
OP_BuffCreate=0x0000 # V
|
OP_RefreshBuffs=0x0000 # V
|
||||||
OP_DeleteSpawn=0x7434 # C
|
OP_DeleteSpawn=0x7434 # C
|
||||||
OP_AutoAttack=0x0000 # C
|
OP_AutoAttack=0x0000 # C
|
||||||
OP_AutoAttack2=0x0000 # C
|
OP_AutoAttack2=0x0000 # C
|
||||||
@@ -291,7 +291,7 @@ OP_SendFindableNPCs=0x162d # C
|
|||||||
OP_FindPersonRequest=0x0000 # C
|
OP_FindPersonRequest=0x0000 # C
|
||||||
OP_FindPersonReply=0x0000 # C
|
OP_FindPersonReply=0x0000 # C
|
||||||
OP_Sound=0x0000 # C
|
OP_Sound=0x0000 # C
|
||||||
OP_PetBuffWindow=0x0000 # C
|
OP_RefreshPetBuffs=0x0000 # C
|
||||||
OP_LevelAppearance=0x0000 # C
|
OP_LevelAppearance=0x0000 # C
|
||||||
OP_Translocate=0x0000 # C
|
OP_Translocate=0x0000 # C
|
||||||
OP_Sacrifice=0x0000 # C
|
OP_Sacrifice=0x0000 # C
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ OP_CastSpell=0x0000 # C
|
|||||||
OP_Consider=0x0000 # C
|
OP_Consider=0x0000 # C
|
||||||
OP_FormattedMessage=0x0000 # C
|
OP_FormattedMessage=0x0000 # C
|
||||||
OP_SimpleMessage=0x0000 # C 0x0000
|
OP_SimpleMessage=0x0000 # C 0x0000
|
||||||
OP_Buff=0x0000 # C
|
OP_BuffDefinition=0x0000 # C
|
||||||
OP_Illusion=0x0000 # C
|
OP_Illusion=0x0000 # C
|
||||||
OP_MoneyOnCorpse=0x0000 # C
|
OP_MoneyOnCorpse=0x0000 # C
|
||||||
OP_RandomReply=0x0000 # C
|
OP_RandomReply=0x0000 # C
|
||||||
@@ -225,8 +225,8 @@ OP_TargetMouse=0x36f8 # C 0x0000
|
|||||||
OP_MobHealth=0x0000 # C
|
OP_MobHealth=0x0000 # C
|
||||||
OP_InitialMobHealth=0x0000 # C
|
OP_InitialMobHealth=0x0000 # C
|
||||||
OP_TargetHoTT=0x0000 # C
|
OP_TargetHoTT=0x0000 # C
|
||||||
OP_TargetBuffs=0x0000 # C
|
OP_RefreshTargetBuffs=0x0000 # C
|
||||||
OP_BuffCreate=0x0000 # V
|
OP_RefreshBuffs=0x0000 # V
|
||||||
OP_DeleteSpawn=0x7434 # was 0x7434
|
OP_DeleteSpawn=0x7434 # was 0x7434
|
||||||
OP_AutoAttack=0x0000 # C
|
OP_AutoAttack=0x0000 # C
|
||||||
OP_AutoAttack2=0x0000 # C
|
OP_AutoAttack2=0x0000 # C
|
||||||
@@ -291,7 +291,7 @@ OP_SendFindableNPCs=0x6b67 # was 0x162d
|
|||||||
OP_FindPersonRequest=0x0000 # C
|
OP_FindPersonRequest=0x0000 # C
|
||||||
OP_FindPersonReply=0x0000 # C
|
OP_FindPersonReply=0x0000 # C
|
||||||
OP_Sound=0x0000 # C
|
OP_Sound=0x0000 # C
|
||||||
OP_PetBuffWindow=0x0000 # C
|
OP_RefreshPetBuffs=0x0000 # C
|
||||||
OP_LevelAppearance=0x0000 # C
|
OP_LevelAppearance=0x0000 # C
|
||||||
OP_Translocate=0x0000 # C
|
OP_Translocate=0x0000 # C
|
||||||
OP_Sacrifice=0x0000 # C
|
OP_Sacrifice=0x0000 # C
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ OP_CastSpell=0x3582 # C
|
|||||||
OP_Consider=0x6024 # C
|
OP_Consider=0x6024 # C
|
||||||
OP_FormattedMessage=0x1318 # C
|
OP_FormattedMessage=0x1318 # C
|
||||||
OP_SimpleMessage=0x5448 # C
|
OP_SimpleMessage=0x5448 # C
|
||||||
OP_Buff=0x7ea8 # C
|
OP_BuffDefinition=0x7ea8 # C
|
||||||
OP_Illusion=0x48f9 # C
|
OP_Illusion=0x48f9 # C
|
||||||
OP_MoneyOnCorpse=0x6546 # C
|
OP_MoneyOnCorpse=0x6546 # C
|
||||||
OP_RandomReply=0x6cdc # C
|
OP_RandomReply=0x6cdc # C
|
||||||
@@ -227,7 +227,7 @@ OP_TargetMouse=0x7bbb # C
|
|||||||
OP_MobHealth=0x47ea # C
|
OP_MobHealth=0x47ea # C
|
||||||
OP_InitialMobHealth=0x2d25 # C
|
OP_InitialMobHealth=0x2d25 # C
|
||||||
OP_TargetHoTT=0x3ec7 # C
|
OP_TargetHoTT=0x3ec7 # C
|
||||||
OP_TargetBuffs=0x3df8
|
OP_RefreshTargetBuffs=0x3df8
|
||||||
OP_DeleteSpawn=0x3164 # C
|
OP_DeleteSpawn=0x3164 # C
|
||||||
OP_AutoAttack=0x3d86 # C
|
OP_AutoAttack=0x3d86 # C
|
||||||
OP_AutoAttack2=0x4ca1 # C
|
OP_AutoAttack2=0x4ca1 # C
|
||||||
@@ -293,7 +293,7 @@ OP_SendFindableNPCs=0x5360
|
|||||||
OP_FindPersonRequest=0x3168 # C
|
OP_FindPersonRequest=0x3168 # C
|
||||||
OP_FindPersonReply=0x1ac8 # C
|
OP_FindPersonReply=0x1ac8 # C
|
||||||
OP_Sound=0x303e # C
|
OP_Sound=0x303e # C
|
||||||
OP_PetBuffWindow=0x2dd3 # C
|
OP_RefreshPetBuffs=0x2dd3 # C
|
||||||
OP_LevelAppearance=0x6dc3 # C
|
OP_LevelAppearance=0x6dc3 # C
|
||||||
OP_Translocate=0x2042 # C
|
OP_Translocate=0x2042 # C
|
||||||
OP_Sacrifice=0x5805 # C
|
OP_Sacrifice=0x5805 # C
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ OP_CastSpell=0x568e
|
|||||||
OP_Consider=0x0ea4
|
OP_Consider=0x0ea4
|
||||||
OP_FormattedMessage=0x7cd3
|
OP_FormattedMessage=0x7cd3
|
||||||
OP_SimpleMessage=0x4a83
|
OP_SimpleMessage=0x4a83
|
||||||
OP_Buff=0x3c26
|
OP_BuffDefinition=0x3c26
|
||||||
OP_Illusion=0x25dd
|
OP_Illusion=0x25dd
|
||||||
OP_MoneyOnCorpse=0x6fbd
|
OP_MoneyOnCorpse=0x6fbd
|
||||||
OP_RandomReply=0x3939
|
OP_RandomReply=0x3939
|
||||||
@@ -231,8 +231,8 @@ OP_TargetHoTT=0x042a
|
|||||||
OP_XTargetResponse=0x5473
|
OP_XTargetResponse=0x5473
|
||||||
OP_XTargetRequest=0x45a9
|
OP_XTargetRequest=0x45a9
|
||||||
OP_XTargetAutoAddHaters=0x5af8
|
OP_XTargetAutoAddHaters=0x5af8
|
||||||
OP_TargetBuffs=0x156f
|
OP_RefreshTargetBuffs=0x156f
|
||||||
OP_BuffCreate=0x2013
|
OP_RefreshBuffs=0x2013
|
||||||
OP_BuffRemoveRequest=0x718c
|
OP_BuffRemoveRequest=0x718c
|
||||||
OP_DeleteSpawn=0x69b2
|
OP_DeleteSpawn=0x69b2
|
||||||
OP_AutoAttack=0x702f
|
OP_AutoAttack=0x702f
|
||||||
@@ -298,7 +298,7 @@ OP_SendFindableNPCs=0x6516
|
|||||||
OP_FindPersonRequest=0x4e65
|
OP_FindPersonRequest=0x4e65
|
||||||
OP_FindPersonReply=0x5e04
|
OP_FindPersonReply=0x5e04
|
||||||
OP_Sound=0x6ad4
|
OP_Sound=0x6ad4
|
||||||
OP_PetBuffWindow=0x5be1
|
OP_RefreshPetBuffs=0x5be1
|
||||||
OP_LevelAppearance=0x7a6f
|
OP_LevelAppearance=0x7a6f
|
||||||
OP_Translocate=0x3a61
|
OP_Translocate=0x3a61
|
||||||
OP_Sacrifice=0x18a6
|
OP_Sacrifice=0x18a6
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ OP_CastSpell=0x5c4b
|
|||||||
OP_Consider=0x0e31
|
OP_Consider=0x0e31
|
||||||
OP_FormattedMessage=0x3735
|
OP_FormattedMessage=0x3735
|
||||||
OP_SimpleMessage=0x4645
|
OP_SimpleMessage=0x4645
|
||||||
OP_Buff=0x7fb5
|
OP_BuffDefinition=0x7fb5
|
||||||
OP_Illusion=0x3772
|
OP_Illusion=0x3772
|
||||||
OP_MoneyOnCorpse=0x4ab0
|
OP_MoneyOnCorpse=0x4ab0
|
||||||
OP_RandomReply=0x76ea
|
OP_RandomReply=0x76ea
|
||||||
@@ -231,8 +231,8 @@ OP_TargetHoTT=0x1be6
|
|||||||
OP_XTargetResponse=0x0ad9
|
OP_XTargetResponse=0x0ad9
|
||||||
OP_XTargetRequest=0x3034
|
OP_XTargetRequest=0x3034
|
||||||
OP_XTargetAutoAddHaters=0x7efd
|
OP_XTargetAutoAddHaters=0x7efd
|
||||||
OP_TargetBuffs=0x5e3b
|
OP_RefreshTargetBuffs=0x5e3b
|
||||||
OP_BuffCreate=0x51da
|
OP_RefreshBuffs=0x51da
|
||||||
OP_BuffRemoveRequest=0x6ce2
|
OP_BuffRemoveRequest=0x6ce2
|
||||||
OP_DeleteSpawn=0x0ef8
|
OP_DeleteSpawn=0x0ef8
|
||||||
OP_AutoAttack=0x577f
|
OP_AutoAttack=0x577f
|
||||||
@@ -298,7 +298,7 @@ OP_SendFindableNPCs=0x62da
|
|||||||
OP_FindPersonRequest=0x41fb
|
OP_FindPersonRequest=0x41fb
|
||||||
OP_FindPersonReply=0x23e2
|
OP_FindPersonReply=0x23e2
|
||||||
OP_Sound=0x622a
|
OP_Sound=0x622a
|
||||||
OP_PetBuffWindow=0x53f8
|
OP_RefreshPetBuffs=0x53f8
|
||||||
OP_LevelAppearance=0x5b03
|
OP_LevelAppearance=0x5b03
|
||||||
OP_Translocate=0x5e10
|
OP_Translocate=0x5e10
|
||||||
OP_Sacrifice=0x2ee4
|
OP_Sacrifice=0x2ee4
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ OP_SetRunMode=0x4aba # ShowEQ 10/27/05
|
|||||||
OP_SimpleMessage=0x673c # ShowEQ 10/27/05
|
OP_SimpleMessage=0x673c # ShowEQ 10/27/05
|
||||||
OP_SaveOnZoneReq=0x1540 # ShowEQ 10/27/05
|
OP_SaveOnZoneReq=0x1540 # ShowEQ 10/27/05
|
||||||
OP_SenseHeading=0x05ac # ShowEQ 10/27/05
|
OP_SenseHeading=0x05ac # ShowEQ 10/27/05
|
||||||
OP_Buff=0x6a53 # ShowEQ 10/27/05
|
OP_BuffDefinition=0x6a53 # ShowEQ 10/27/05
|
||||||
OP_LootComplete=0x0a94 # ShowEQ 10/27/05
|
OP_LootComplete=0x0a94 # ShowEQ 10/27/05
|
||||||
OP_EnvDamage=0x31b3 # ShowEQ 10/27/05
|
OP_EnvDamage=0x31b3 # ShowEQ 10/27/05
|
||||||
OP_Split=0x4848 # ShowEQ 10/27/05
|
OP_Split=0x4848 # ShowEQ 10/27/05
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ OP_CastSpell=0x1cb5
|
|||||||
OP_Consider=0x4d8d
|
OP_Consider=0x4d8d
|
||||||
OP_FormattedMessage=0x6afe
|
OP_FormattedMessage=0x6afe
|
||||||
OP_SimpleMessage=0x02a5
|
OP_SimpleMessage=0x02a5
|
||||||
OP_Buff=0x08ed
|
OP_BuffDefinition=0x08ed
|
||||||
OP_Illusion=0x6c43
|
OP_Illusion=0x6c43
|
||||||
OP_MoneyOnCorpse=0x1837
|
OP_MoneyOnCorpse=0x1837
|
||||||
OP_RandomReply=0x6525
|
OP_RandomReply=0x6525
|
||||||
@@ -241,8 +241,8 @@ OP_XTargetRequest=0x6753
|
|||||||
OP_XTargetAutoAddHaters=0x5f51
|
OP_XTargetAutoAddHaters=0x5f51
|
||||||
OP_XTargetOpen=0x7423
|
OP_XTargetOpen=0x7423
|
||||||
OP_XTargetOpenResponse=0x27e8
|
OP_XTargetOpenResponse=0x27e8
|
||||||
OP_TargetBuffs=0x1c71
|
OP_RefreshTargetBuffs=0x1c71
|
||||||
OP_BuffCreate=0x71f5
|
OP_RefreshBuffs=0x71f5
|
||||||
OP_BuffRemoveRequest=0x7efd
|
OP_BuffRemoveRequest=0x7efd
|
||||||
OP_DeleteSpawn=0x3b06
|
OP_DeleteSpawn=0x3b06
|
||||||
OP_AutoAttack=0x0d14
|
OP_AutoAttack=0x0d14
|
||||||
@@ -312,7 +312,7 @@ OP_FindPersonRequest=0x2f3b
|
|||||||
OP_FindPersonReply=0x44f7
|
OP_FindPersonReply=0x44f7
|
||||||
OP_Sound=0x3cec
|
OP_Sound=0x3cec
|
||||||
OP_CashReward=0x17a5
|
OP_CashReward=0x17a5
|
||||||
OP_PetBuffWindow=0x7197
|
OP_RefreshPetBuffs=0x7197
|
||||||
OP_LevelAppearance=0x7c4d
|
OP_LevelAppearance=0x7c4d
|
||||||
OP_Translocate=0x6f01
|
OP_Translocate=0x6f01
|
||||||
OP_Sacrifice=0x76ab
|
OP_Sacrifice=0x76ab
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ OP_CastSpell=0x1287
|
|||||||
OP_Consider=0x742b
|
OP_Consider=0x742b
|
||||||
OP_FormattedMessage=0x1024
|
OP_FormattedMessage=0x1024
|
||||||
OP_SimpleMessage=0x213f
|
OP_SimpleMessage=0x213f
|
||||||
OP_Buff=0x659c
|
OP_BuffDefinition=0x659c
|
||||||
OP_Illusion=0x312a
|
OP_Illusion=0x312a
|
||||||
OP_MoneyOnCorpse=0x5f44
|
OP_MoneyOnCorpse=0x5f44
|
||||||
OP_RandomReply=0x106b
|
OP_RandomReply=0x106b
|
||||||
@@ -241,13 +241,13 @@ OP_TargetMouse=0x075d
|
|||||||
OP_MobHealth=0x37b1
|
OP_MobHealth=0x37b1
|
||||||
OP_InitialMobHealth=0x0000 # Unused?
|
OP_InitialMobHealth=0x0000 # Unused?
|
||||||
OP_TargetHoTT=0x0272
|
OP_TargetHoTT=0x0272
|
||||||
OP_TargetBuffs=0x4f4b
|
OP_RefreshTargetBuffs=0x4f4b
|
||||||
OP_XTargetResponse=0x4d59
|
OP_XTargetResponse=0x4d59
|
||||||
OP_XTargetRequest=0x3763
|
OP_XTargetRequest=0x3763
|
||||||
OP_XTargetAutoAddHaters=0x672f
|
OP_XTargetAutoAddHaters=0x672f
|
||||||
OP_XTargetOpen=0x61df
|
OP_XTargetOpen=0x61df
|
||||||
OP_XTargetOpenResponse=0x3ef8
|
OP_XTargetOpenResponse=0x3ef8
|
||||||
OP_BuffCreate=0x3377
|
OP_RefreshBuffs=0x3377
|
||||||
OP_BuffRemoveRequest=0x64f2
|
OP_BuffRemoveRequest=0x64f2
|
||||||
OP_DeleteSpawn=0x7280
|
OP_DeleteSpawn=0x7280
|
||||||
OP_AutoAttack=0x109d
|
OP_AutoAttack=0x109d
|
||||||
@@ -316,7 +316,7 @@ OP_FindPersonRequest=0x5cea
|
|||||||
OP_FindPersonReply=0x7e58
|
OP_FindPersonReply=0x7e58
|
||||||
OP_Sound=0x1a30
|
OP_Sound=0x1a30
|
||||||
OP_CashReward=0x5f7a
|
OP_CashReward=0x5f7a
|
||||||
OP_PetBuffWindow=0x5882
|
OP_RefreshPetBuffs=0x5882
|
||||||
OP_LevelAppearance=0x3bc9
|
OP_LevelAppearance=0x3bc9
|
||||||
OP_Translocate=0x6580
|
OP_Translocate=0x6580
|
||||||
OP_Sacrifice=0x1821
|
OP_Sacrifice=0x1821
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ OP_CastSpell=0x3582 # C
|
|||||||
OP_Consider=0x6024 # C
|
OP_Consider=0x6024 # C
|
||||||
OP_FormattedMessage=0x1318 # C
|
OP_FormattedMessage=0x1318 # C
|
||||||
OP_SimpleMessage=0x5448 # C
|
OP_SimpleMessage=0x5448 # C
|
||||||
OP_Buff=0x7ea8 # C
|
OP_BuffDefinition=0x7ea8 # C
|
||||||
OP_Illusion=0x48f9 # C
|
OP_Illusion=0x48f9 # C
|
||||||
OP_MoneyOnCorpse=0x6546 # C
|
OP_MoneyOnCorpse=0x6546 # C
|
||||||
OP_RandomReply=0x6cdc # C
|
OP_RandomReply=0x6cdc # C
|
||||||
@@ -236,7 +236,7 @@ OP_TargetMouse=0x7bbb # C
|
|||||||
OP_MobHealth=0x47ea # C
|
OP_MobHealth=0x47ea # C
|
||||||
OP_InitialMobHealth=0x2d25 # C
|
OP_InitialMobHealth=0x2d25 # C
|
||||||
OP_TargetHoTT=0x3ec7 # C
|
OP_TargetHoTT=0x3ec7 # C
|
||||||
OP_TargetBuffs=0x3df8
|
OP_RefreshTargetBuffs=0x3df8
|
||||||
OP_BuffRemoveRequest=0x6f9d
|
OP_BuffRemoveRequest=0x6f9d
|
||||||
OP_DeleteSpawn=0x3164 # C
|
OP_DeleteSpawn=0x3164 # C
|
||||||
OP_AutoAttack=0x3d86 # C
|
OP_AutoAttack=0x3d86 # C
|
||||||
@@ -308,7 +308,7 @@ OP_FindPersonRequest=0x3168 # C
|
|||||||
OP_FindPersonReply=0x1ac8 # C
|
OP_FindPersonReply=0x1ac8 # C
|
||||||
OP_Sound=0x303e # C
|
OP_Sound=0x303e # C
|
||||||
OP_CashReward=0x3703
|
OP_CashReward=0x3703
|
||||||
OP_PetBuffWindow=0x2dd3 # C
|
OP_RefreshPetBuffs=0x2dd3 # C
|
||||||
OP_LevelAppearance=0x6dc3 # C
|
OP_LevelAppearance=0x6dc3 # C
|
||||||
OP_Translocate=0x2042 # C
|
OP_Translocate=0x2042 # C
|
||||||
OP_Sacrifice=0x5805 # C
|
OP_Sacrifice=0x5805 # C
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ OP_CastSpell=0x7F5D #SEQ 12/04/08
|
|||||||
OP_Consider=0x32E1 #SEQ 12/04/08
|
OP_Consider=0x32E1 #SEQ 12/04/08
|
||||||
OP_FormattedMessage=0x5B9E #SEQ 12/04/08
|
OP_FormattedMessage=0x5B9E #SEQ 12/04/08
|
||||||
OP_SimpleMessage=0x553E #SEQ 12/04/08
|
OP_SimpleMessage=0x553E #SEQ 12/04/08
|
||||||
OP_Buff=0x7BD6 #SEQ 12/04/08
|
OP_BuffDefinition=0x7BD6 #SEQ 12/04/08
|
||||||
OP_Illusion=0x7F86 #SEQ 12/04/08
|
OP_Illusion=0x7F86 #SEQ 12/04/08
|
||||||
OP_MoneyOnCorpse=0x51C9 #SEQ 12/04/08
|
OP_MoneyOnCorpse=0x51C9 #SEQ 12/04/08
|
||||||
OP_RandomReply=0x649C #SEQ 12/04/08
|
OP_RandomReply=0x649C #SEQ 12/04/08
|
||||||
@@ -300,7 +300,7 @@ OP_FindPersonRequest=0x07F0 #Derision 2009
|
|||||||
OP_FindPersonReply=0x7770 #Derision 2009
|
OP_FindPersonReply=0x7770 #Derision 2009
|
||||||
OP_Sound=0x2B02 #Derision 2009
|
OP_Sound=0x2B02 #Derision 2009
|
||||||
OP_CashReward=0x5e80
|
OP_CashReward=0x5e80
|
||||||
OP_PetBuffWindow=0x124A #Derision 2009
|
OP_RefreshPetBuffs=0x124A #Derision 2009
|
||||||
OP_LevelAppearance=0x3EC8 #Derision 2009
|
OP_LevelAppearance=0x3EC8 #Derision 2009
|
||||||
OP_Translocate=0x1F0F #Derision 2009
|
OP_Translocate=0x1F0F #Derision 2009
|
||||||
OP_Sacrifice=0x55C9 #Derision 2009
|
OP_Sacrifice=0x55C9 #Derision 2009
|
||||||
|
|||||||
@@ -178,7 +178,10 @@ OP_CastSpell=0x1d63
|
|||||||
OP_Consider=0x4568
|
OP_Consider=0x4568
|
||||||
OP_FormattedMessage=0x29b4
|
OP_FormattedMessage=0x29b4
|
||||||
OP_SimpleMessage=0x5b2d
|
OP_SimpleMessage=0x5b2d
|
||||||
OP_Buff=0x2427
|
OP_BuffDefinition=0x2427
|
||||||
|
OP_RefreshBuffs=0x754c
|
||||||
|
OP_RefreshTargetBuffs=0x197f
|
||||||
|
OP_RefreshPetBuffs=0x4f42
|
||||||
OP_Illusion=0x7fb0
|
OP_Illusion=0x7fb0
|
||||||
OP_MoneyOnCorpse=0x6f63
|
OP_MoneyOnCorpse=0x6f63
|
||||||
OP_RandomReply=0x1234
|
OP_RandomReply=0x1234
|
||||||
@@ -236,13 +239,11 @@ OP_TargetMouse=0x7f48
|
|||||||
OP_MobHealth=0x445e
|
OP_MobHealth=0x445e
|
||||||
OP_InitialMobHealth=0x0000 # Unused?
|
OP_InitialMobHealth=0x0000 # Unused?
|
||||||
OP_TargetHoTT=0x0000
|
OP_TargetHoTT=0x0000
|
||||||
OP_TargetBuffs=0x0000
|
|
||||||
OP_XTargetResponse=0x0000
|
OP_XTargetResponse=0x0000
|
||||||
OP_XTargetRequest=0x0000
|
OP_XTargetRequest=0x0000
|
||||||
OP_XTargetAutoAddHaters=0x0000
|
OP_XTargetAutoAddHaters=0x0000
|
||||||
OP_XTargetOpen=0x0000
|
OP_XTargetOpen=0x0000
|
||||||
OP_XTargetOpenResponse=0x0000
|
OP_XTargetOpenResponse=0x0000
|
||||||
OP_BuffCreate=0x754c
|
|
||||||
OP_BuffRemoveRequest=0x0c06
|
OP_BuffRemoveRequest=0x0c06
|
||||||
OP_DeleteSpawn=0x33fa
|
OP_DeleteSpawn=0x33fa
|
||||||
OP_AutoAttack=0x3ced
|
OP_AutoAttack=0x3ced
|
||||||
@@ -310,7 +311,6 @@ OP_FindPersonRequest=0x0000
|
|||||||
OP_FindPersonReply=0x0000
|
OP_FindPersonReply=0x0000
|
||||||
OP_Sound=0x5949
|
OP_Sound=0x5949
|
||||||
OP_CashReward=0x3237
|
OP_CashReward=0x3237
|
||||||
OP_PetBuffWindow=0x0000
|
|
||||||
OP_LevelAppearance=0x5eb5
|
OP_LevelAppearance=0x5eb5
|
||||||
OP_Translocate=0x0611
|
OP_Translocate=0x0611
|
||||||
OP_Sacrifice=0x4b76
|
OP_Sacrifice=0x4b76
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ OP_AutoFire=0x6c53
|
|||||||
OP_Consider=0x65ca # ShowEQ 10/27/05
|
OP_Consider=0x65ca # ShowEQ 10/27/05
|
||||||
OP_Emote=0x547a # ShowEQ 10/27/05
|
OP_Emote=0x547a # ShowEQ 10/27/05
|
||||||
OP_PetCommands=0x10a1 # ShowEQ 10/27/05
|
OP_PetCommands=0x10a1 # ShowEQ 10/27/05
|
||||||
OP_PetBuffWindow=0x4e31
|
OP_RefreshPetBuffs=0x4e31
|
||||||
OP_SpawnAppearance=0x7c32 # ShowEQ 10/27/05
|
OP_SpawnAppearance=0x7c32 # ShowEQ 10/27/05
|
||||||
OP_DeleteSpawn=0x55bc # ShowEQ 10/27/05
|
OP_DeleteSpawn=0x55bc # ShowEQ 10/27/05
|
||||||
OP_FormattedMessage=0x5a48 # ShowEQ 10/27/05
|
OP_FormattedMessage=0x5a48 # ShowEQ 10/27/05
|
||||||
@@ -199,7 +199,7 @@ OP_SetRunMode=0x4aba # ShowEQ 10/27/05
|
|||||||
OP_SimpleMessage=0x673c # ShowEQ 10/27/05
|
OP_SimpleMessage=0x673c # ShowEQ 10/27/05
|
||||||
OP_SaveOnZoneReq=0x1540 # ShowEQ 10/27/05
|
OP_SaveOnZoneReq=0x1540 # ShowEQ 10/27/05
|
||||||
OP_SenseHeading=0x05ac # ShowEQ 10/27/05
|
OP_SenseHeading=0x05ac # ShowEQ 10/27/05
|
||||||
OP_Buff=0x6a53 # ShowEQ 10/27/05
|
OP_BuffDefinition=0x6a53 # ShowEQ 10/27/05
|
||||||
OP_LootComplete=0x0a94 # ShowEQ 10/27/05
|
OP_LootComplete=0x0a94 # ShowEQ 10/27/05
|
||||||
OP_EnvDamage=0x31b3 # ShowEQ 10/27/05
|
OP_EnvDamage=0x31b3 # ShowEQ 10/27/05
|
||||||
OP_Split=0x4848 # ShowEQ 10/27/05
|
OP_Split=0x4848 # ShowEQ 10/27/05
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ OP_CastSpell=0x50c2 # C
|
|||||||
OP_Consider=0x3c2d # C
|
OP_Consider=0x3c2d # C
|
||||||
OP_FormattedMessage=0x3b52 # C
|
OP_FormattedMessage=0x3b52 # C
|
||||||
OP_SimpleMessage=0x1f4d # C 0x5448
|
OP_SimpleMessage=0x1f4d # C 0x5448
|
||||||
OP_Buff=0x0d1d # C
|
OP_BuffDefinition=0x0d1d # C
|
||||||
OP_Illusion=0x231f # C
|
OP_Illusion=0x231f # C
|
||||||
OP_MoneyOnCorpse=0x4a83 # C
|
OP_MoneyOnCorpse=0x4a83 # C
|
||||||
OP_RandomReply=0x6d5d # C
|
OP_RandomReply=0x6d5d # C
|
||||||
@@ -252,8 +252,8 @@ OP_XTargetRequest=0x4750 #
|
|||||||
OP_XTargetAutoAddHaters=0x1a28 #
|
OP_XTargetAutoAddHaters=0x1a28 #
|
||||||
OP_XTargetOpen=0x11ae
|
OP_XTargetOpen=0x11ae
|
||||||
OP_XTargetOpenResponse=0x45d3
|
OP_XTargetOpenResponse=0x45d3
|
||||||
OP_TargetBuffs=0x3f24 # C
|
OP_RefreshTargetBuffs=0x3f24 # C
|
||||||
OP_BuffCreate=0x2121 # V
|
OP_RefreshBuffs=0x2121 # V
|
||||||
OP_BuffRemoveRequest=0x4065
|
OP_BuffRemoveRequest=0x4065
|
||||||
OP_DeleteSpawn=0x58c5 # C
|
OP_DeleteSpawn=0x58c5 # C
|
||||||
OP_AutoAttack=0x1df9 # C
|
OP_AutoAttack=0x1df9 # C
|
||||||
@@ -324,7 +324,7 @@ OP_FindPersonRequest=0x1e04 # C
|
|||||||
OP_FindPersonReply=0x7cae # C
|
OP_FindPersonReply=0x7cae # C
|
||||||
OP_Sound=0x737a # C
|
OP_Sound=0x737a # C
|
||||||
OP_CashReward=0x039d
|
OP_CashReward=0x039d
|
||||||
OP_PetBuffWindow=0x7b87 # C
|
OP_RefreshPetBuffs=0x7b87 # C
|
||||||
OP_LevelAppearance=0x1bd4 # C
|
OP_LevelAppearance=0x1bd4 # C
|
||||||
OP_Translocate=0x3d9c # C
|
OP_Translocate=0x3d9c # C
|
||||||
OP_Sacrifice=0x301b # C
|
OP_Sacrifice=0x301b # C
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ OP_CastSpell=0x1287
|
|||||||
OP_Consider=0x742b
|
OP_Consider=0x742b
|
||||||
OP_FormattedMessage=0x1024
|
OP_FormattedMessage=0x1024
|
||||||
OP_SimpleMessage=0x213f
|
OP_SimpleMessage=0x213f
|
||||||
OP_Buff=0x659c
|
OP_BuffDefinition=0x659c
|
||||||
OP_Illusion=0x312a
|
OP_Illusion=0x312a
|
||||||
OP_MoneyOnCorpse=0x5f44
|
OP_MoneyOnCorpse=0x5f44
|
||||||
OP_RandomReply=0x106b
|
OP_RandomReply=0x106b
|
||||||
@@ -232,8 +232,8 @@ OP_TargetHoTT=0x0272
|
|||||||
OP_XTargetResponse=0x672f
|
OP_XTargetResponse=0x672f
|
||||||
OP_XTargetRequest=0x45be
|
OP_XTargetRequest=0x45be
|
||||||
OP_XTargetAutoAddHaters=0x792c
|
OP_XTargetAutoAddHaters=0x792c
|
||||||
OP_TargetBuffs=0x4f4b
|
OP_RefreshTargetBuffs=0x4f4b
|
||||||
OP_BuffCreate=0x3377
|
OP_RefreshBuffs=0x3377
|
||||||
OP_BuffRemoveRequest=0x64f2
|
OP_BuffRemoveRequest=0x64f2
|
||||||
OP_DeleteSpawn=0x7280
|
OP_DeleteSpawn=0x7280
|
||||||
OP_AutoAttack=0x109d
|
OP_AutoAttack=0x109d
|
||||||
@@ -301,7 +301,7 @@ OP_SendFindableNPCs=0x4613
|
|||||||
OP_FindPersonRequest=0x5cea
|
OP_FindPersonRequest=0x5cea
|
||||||
OP_FindPersonReply=0x7e58
|
OP_FindPersonReply=0x7e58
|
||||||
OP_Sound=0x1a30
|
OP_Sound=0x1a30
|
||||||
OP_PetBuffWindow=0x5882
|
OP_RefreshPetBuffs=0x5882
|
||||||
OP_LevelAppearance=0x3bc9
|
OP_LevelAppearance=0x3bc9
|
||||||
OP_Translocate=0x6580
|
OP_Translocate=0x6580
|
||||||
OP_Sacrifice=0x1821
|
OP_Sacrifice=0x1821
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ OP_CastSpell=0x1287
|
|||||||
OP_Consider=0x742b
|
OP_Consider=0x742b
|
||||||
OP_FormattedMessage=0x1024
|
OP_FormattedMessage=0x1024
|
||||||
OP_SimpleMessage=0x213f
|
OP_SimpleMessage=0x213f
|
||||||
OP_Buff=0x659c
|
OP_BuffDefinition=0x659c
|
||||||
OP_Illusion=0x312a
|
OP_Illusion=0x312a
|
||||||
OP_MoneyOnCorpse=0x5f44
|
OP_MoneyOnCorpse=0x5f44
|
||||||
OP_RandomReply=0x106b
|
OP_RandomReply=0x106b
|
||||||
@@ -232,8 +232,8 @@ OP_TargetHoTT=0x0272
|
|||||||
OP_XTargetResponse=0x672f
|
OP_XTargetResponse=0x672f
|
||||||
OP_XTargetRequest=0x45be
|
OP_XTargetRequest=0x45be
|
||||||
OP_XTargetAutoAddHaters=0x792c
|
OP_XTargetAutoAddHaters=0x792c
|
||||||
OP_TargetBuffs=0x4f4b
|
OP_RefreshTargetBuffs=0x4f4b
|
||||||
OP_BuffCreate=0x3377
|
OP_RefreshBuffs=0x3377
|
||||||
OP_BuffRemoveRequest=0x64f2
|
OP_BuffRemoveRequest=0x64f2
|
||||||
OP_DeleteSpawn=0x7280
|
OP_DeleteSpawn=0x7280
|
||||||
OP_AutoAttack=0x109d
|
OP_AutoAttack=0x109d
|
||||||
@@ -301,7 +301,7 @@ OP_SendFindableNPCs=0x3897
|
|||||||
OP_FindPersonRequest=0x5cea
|
OP_FindPersonRequest=0x5cea
|
||||||
OP_FindPersonReply=0x7e58
|
OP_FindPersonReply=0x7e58
|
||||||
OP_Sound=0x1a30
|
OP_Sound=0x1a30
|
||||||
OP_PetBuffWindow=0x5882
|
OP_RefreshPetBuffs=0x5882
|
||||||
OP_LevelAppearance=0x3bc9
|
OP_LevelAppearance=0x3bc9
|
||||||
OP_Translocate=0x6580
|
OP_Translocate=0x6580
|
||||||
OP_Sacrifice=0x1821
|
OP_Sacrifice=0x1821
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ CREATE TABLE `merc_buffs`
|
|||||||
(
|
(
|
||||||
`MercBuffId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
`MercBuffId` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
`MercId` int(10) UNSIGNED NOT NULL DEFAULT 0,
|
`MercId` int(10) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
`SpellId` int(10) UNSIGNED NOT NULL DEFAULT 0,
|
`SpellId` int(10) NOT NULL DEFAULT 0,
|
||||||
`CasterLevel` int(10) UNSIGNED NOT NULL DEFAULT 0,
|
`CasterLevel` int(10) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
`DurationFormula` int(10) UNSIGNED NOT NULL DEFAULT 0,
|
`DurationFormula` int(10) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
`TicsRemaining` int(11) NOT NULL DEFAULT 0,
|
`TicsRemaining` int(11) NOT NULL DEFAULT 0,
|
||||||
@@ -941,7 +941,7 @@ CREATE TABLE `merc_spell_list_entries`
|
|||||||
(
|
(
|
||||||
`merc_spell_list_entry_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
`merc_spell_list_entry_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
`merc_spell_list_id` int(10) UNSIGNED NOT NULL,
|
`merc_spell_list_id` int(10) UNSIGNED NOT NULL,
|
||||||
`spell_id` int(10) UNSIGNED NOT NULL,
|
`spell_id` int(10) NOT NULL,
|
||||||
`spell_type` int(10) UNSIGNED NOT NULL DEFAULT 0,
|
`spell_type` int(10) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
`stance_id` tinyint(3) UNSIGNED NOT NULL DEFAULT 0,
|
`stance_id` tinyint(3) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
`minlevel` tinyint(3) UNSIGNED NOT NULL DEFAULT 1,
|
`minlevel` tinyint(3) UNSIGNED NOT NULL DEFAULT 1,
|
||||||
|
|||||||
+2
-2
@@ -45,7 +45,7 @@
|
|||||||
extern WorldServer worldserver;
|
extern WorldServer worldserver;
|
||||||
extern QueryServ* QServ;
|
extern QueryServ* QServ;
|
||||||
|
|
||||||
void Mob::TemporaryPets(uint16 spell_id, Mob *targ, const char *name_override, uint32 duration_override, bool followme, bool sticktarg, uint16 *eye_id) {
|
void Mob::TemporaryPets(int32 spell_id, Mob *targ, const char *name_override, uint32 duration_override, bool followme, bool sticktarg, uint16 *eye_id) {
|
||||||
|
|
||||||
//It might not be a bad idea to put these into the database, eventually..
|
//It might not be a bad idea to put these into the database, eventually..
|
||||||
|
|
||||||
@@ -288,7 +288,7 @@ void Mob::TypesTemporaryPets(uint32 typesid, Mob *targ, const char *name_overrid
|
|||||||
delete made_npc;
|
delete made_npc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mob::WakeTheDead(uint16 spell_id, Corpse *corpse_to_use, Mob *tar, uint32 duration) {
|
void Mob::WakeTheDead(int32 spell_id, Corpse *corpse_to_use, Mob *tar, uint32 duration) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SPA 299 Wake The Dead, 'animateDead' should be temp pet, always spawns 1 pet from corpse, max value is duration
|
SPA 299 Wake The Dead, 'animateDead' should be temp pet, always spawns 1 pet from corpse, max value is duration
|
||||||
|
|||||||
+3
-3
@@ -1348,7 +1348,7 @@ bool Mob::CheckPositioningLosFN(Mob* other, float x, float y, float z) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//offensive spell aggro
|
//offensive spell aggro
|
||||||
int32 Mob::CheckAggroAmount(uint16 spell_id, Mob *target, bool is_proc)
|
int32 Mob::CheckAggroAmount(int32 spell_id, Mob *target, bool is_proc)
|
||||||
{
|
{
|
||||||
if (IsNoDetrimentalSpellAggroSpell(spell_id)) {
|
if (IsNoDetrimentalSpellAggroSpell(spell_id)) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1536,7 +1536,7 @@ int32 Mob::CheckAggroAmount(uint16 spell_id, Mob *target, bool is_proc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//healing and buffing aggro
|
//healing and buffing aggro
|
||||||
int32 Mob::CheckHealAggroAmount(uint16 spell_id, Mob *target, uint32 heal_possible)
|
int32 Mob::CheckHealAggroAmount(int32 spell_id, Mob *target, uint32 heal_possible)
|
||||||
{
|
{
|
||||||
int32 AggroAmount = 0;
|
int32 AggroAmount = 0;
|
||||||
auto target_level = target ? target->GetLevel() : 1;
|
auto target_level = target ? target->GetLevel() : 1;
|
||||||
@@ -1662,7 +1662,7 @@ bool Mob::IsOnFeignMemory(Mob *attacker) const
|
|||||||
return feign_memory_list.find(attacker->GetID()) != feign_memory_list.end();
|
return feign_memory_list.find(attacker->GetID()) != feign_memory_list.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Mob::PassCharismaCheck(Mob* caster, uint16 spell_id) {
|
bool Mob::PassCharismaCheck(Mob* caster, int32 spell_id) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Charm formula is correct based on over 50 hours of personal live parsing - Kayen
|
Charm formula is correct based on over 50 hours of personal live parsing - Kayen
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user