mirror of
https://github.com/EQEmu/Server.git
synced 2026-06-21 06:28:22 +00:00
Added component-based patch system and applied it to interrupt packets
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
set(message_component_sources
|
||||
titanium.cpp
|
||||
rof2.cpp
|
||||
tob.cpp
|
||||
)
|
||||
|
||||
set(message_component_headers
|
||||
IMessage.h
|
||||
titanium.h
|
||||
sof.h
|
||||
sod.h
|
||||
uf.h
|
||||
rof.h
|
||||
rof2.h
|
||||
tob.h
|
||||
)
|
||||
|
||||
source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" PREFIX "Source Files" FILES ${message_component_sources})
|
||||
source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" PREFIX "Header Files" FILES ${message_component_headers})
|
||||
|
||||
target_sources(zone PRIVATE ${message_component_sources} ${message_component_headers})
|
||||
@@ -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 <stdint.h>
|
||||
|
||||
// Migration path: replace string_ids.h usage with ID enum values one call site at a time.
|
||||
|
||||
class Client;
|
||||
class Mob;
|
||||
class EQApplicationPacket;
|
||||
|
||||
namespace ZoneClient::Message {
|
||||
|
||||
class IMessage {
|
||||
public:
|
||||
constexpr IMessage() {}
|
||||
constexpr virtual ~IMessage() {}
|
||||
|
||||
virtual void Simple(Client* c, uint32_t color, uint32_t id, uint32_t distance = 0) const = 0;
|
||||
|
||||
virtual void Formatted(Client* c, uint32_t color, uint32_t id,
|
||||
const char* a1 = nullptr, const char* a2 = nullptr, const char* a3 = nullptr,
|
||||
const char* a4 = nullptr, const char* a5 = nullptr, const char* a6 = nullptr,
|
||||
const char* a7 = nullptr, const char* a8 = nullptr, const char* a9 = nullptr,
|
||||
uint32_t distance = 0) const = 0;
|
||||
|
||||
// These aren't technically messages, but they use the same format and are similar enough to include here
|
||||
virtual EQApplicationPacket* InterruptSpell(Client* c, uint32_t message, uint32_t spawn_id, uint32_t spell_id,
|
||||
const char* spell_name_override = "") const = 0;
|
||||
virtual EQApplicationPacket* InterruptSpellOther(Mob* m, uint32_t message, uint32_t spawn_id, uint32_t spell_id,
|
||||
const char* spell_name_override = "") const = 0;
|
||||
|
||||
virtual EQApplicationPacket* Fizzle(Mob* m, uint32_t type, uint32_t message, uint32_t spell_id) const = 0;
|
||||
|
||||
protected:
|
||||
virtual uint32_t ResolveID(uint32_t id) const = 0;
|
||||
virtual void SendSimple(Client* c, uint32_t color, uint32_t string_id, uint32_t distance) const = 0;
|
||||
virtual void SendFormatted(Client* c, uint32_t color, uint32_t string_id, uint32_t distance,
|
||||
const char* a1 = nullptr, const char* a2 = nullptr, const char* a3 = nullptr,
|
||||
const char* a4 = nullptr, const char* a5 = nullptr, const char* a6 = nullptr,
|
||||
const char* a7 = nullptr, const char* a8 = nullptr, const char* a9 = nullptr) const = 0;
|
||||
};
|
||||
|
||||
} // namespace Zone::Message
|
||||
@@ -0,0 +1,30 @@
|
||||
/* 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 "zone/patch/components/message/uf.h"
|
||||
|
||||
namespace ZoneClient::Message {
|
||||
|
||||
class RoF : public UF {
|
||||
public:
|
||||
constexpr RoF() {}
|
||||
constexpr ~RoF() override {}
|
||||
};
|
||||
|
||||
} // namespace Zone::Message
|
||||
@@ -0,0 +1,22 @@
|
||||
/* 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/>.
|
||||
*/
|
||||
#include "zone/patch/components/message/rof2.h"
|
||||
|
||||
namespace ZoneClient::Message {
|
||||
|
||||
} // namespace Zone::Message
|
||||
@@ -0,0 +1,30 @@
|
||||
/* 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 "zone/patch/components/message/rof.h"
|
||||
|
||||
namespace ZoneClient::Message {
|
||||
|
||||
class RoF2 : public RoF {
|
||||
public:
|
||||
constexpr RoF2() {}
|
||||
constexpr ~RoF2() override {}
|
||||
};
|
||||
|
||||
} // namespace Zone::Message
|
||||
@@ -0,0 +1,30 @@
|
||||
/* 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 "zone/patch/components/message/sof.h"
|
||||
|
||||
namespace ZoneClient::Message {
|
||||
|
||||
class SoD : public SoF {
|
||||
public:
|
||||
constexpr SoD() {}
|
||||
constexpr ~SoD() override {}
|
||||
};
|
||||
|
||||
} // namespace Zone::Message
|
||||
@@ -0,0 +1,30 @@
|
||||
/* 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 "zone/patch/components/message/titanium.h"
|
||||
|
||||
namespace ZoneClient::Message {
|
||||
|
||||
class SoF : public Titanium {
|
||||
public:
|
||||
constexpr SoF() {}
|
||||
constexpr ~SoF() override {}
|
||||
};
|
||||
|
||||
} // namespace Zone::Message
|
||||
@@ -0,0 +1,123 @@
|
||||
/* 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/>.
|
||||
*/
|
||||
#include "zone/patch/components/message/titanium.h"
|
||||
|
||||
#include "client.h"
|
||||
|
||||
#include "common/eq_packet.h"
|
||||
#include "common/eq_packet_structs.h"
|
||||
#include "common/serialize_buffer.h"
|
||||
|
||||
namespace ZoneClient::Message {
|
||||
void Titanium::Simple(Client* c, uint32_t color, uint32_t id, uint32_t distance) const {
|
||||
uint32_t string_id = ResolveID(id);
|
||||
if (string_id > 0)
|
||||
SendSimple(c, color, string_id, distance);
|
||||
}
|
||||
|
||||
void Titanium::Formatted(Client* c, uint32_t color, uint32_t id,
|
||||
const char* a1, const char* a2, const char* a3,
|
||||
const char* a4, const char* a5, const char* a6,
|
||||
const char* a7, const char* a8, const char* a9,
|
||||
uint32_t distance) const {
|
||||
uint32_t string_id = ResolveID(id);
|
||||
if (string_id > 0)
|
||||
SendFormatted(c, color, string_id, distance, a1, a2, a3, a4, a5, a6, a7, a8, a9);
|
||||
}
|
||||
|
||||
EQApplicationPacket* Titanium::InterruptSpell(Client* c, uint32_t message, uint32_t spawn_id, uint32_t spell_id,
|
||||
const char* spell_name_override) const {
|
||||
auto outapp = new EQApplicationPacket(OP_InterruptCast, sizeof(InterruptCast_Struct));
|
||||
auto ic = reinterpret_cast<InterruptCast_Struct*>(outapp->pBuffer);
|
||||
ic->messageid = ResolveID(message);
|
||||
ic->spawnid = spawn_id;
|
||||
outapp->priority = 5;
|
||||
|
||||
return outapp;
|
||||
}
|
||||
|
||||
EQApplicationPacket* Titanium::InterruptSpellOther(Mob* m, uint32_t message, uint32_t spawn_id, uint32_t spell_id,
|
||||
const char* spell_name_override) const {
|
||||
auto name = m->GetCleanName();
|
||||
auto outapp = new EQApplicationPacket(OP_InterruptCast, sizeof(InterruptCast_Struct) + strlen(name) + 1);
|
||||
auto ic = reinterpret_cast<InterruptCast_Struct*>(outapp->pBuffer);
|
||||
ic->messageid = ResolveID(message);
|
||||
ic->spawnid = spawn_id;
|
||||
fmt::format_to_n(ic->message, strlen(name) + 1, "{}\0", name);
|
||||
return outapp;
|
||||
}
|
||||
|
||||
EQApplicationPacket* Titanium::Fizzle(Mob* m, uint32_t type, uint32_t message, uint32_t spell_id) const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// 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 {
|
||||
// passthrough — string IDs are defined at the base client level;
|
||||
// override in patches where IDs need remapping
|
||||
return id;
|
||||
}
|
||||
|
||||
// Could override these in patches if the format of the packets differ, but they are all compatible
|
||||
void Titanium::SendSimple(Client* c, uint32_t color, uint32_t string_id, uint32_t distance) const {
|
||||
auto outapp = new EQApplicationPacket(OP_SimpleMessage, sizeof(SimpleMessage_Struct));
|
||||
auto* sms = reinterpret_cast<SimpleMessage_Struct*>(outapp->pBuffer);
|
||||
sms->string_id = string_id;
|
||||
sms->color = color;
|
||||
sms->unknown8 = 0;
|
||||
|
||||
if (distance > 0)
|
||||
entity_list.QueueCloseClients(c, outapp, false, distance);
|
||||
else
|
||||
c->QueuePacket(outapp);
|
||||
|
||||
safe_delete(outapp);
|
||||
}
|
||||
|
||||
void Titanium::SendFormatted(
|
||||
Client* c, uint32_t color, uint32_t string_id, uint32_t distance,
|
||||
const char* a1, const char* a2, const char* a3,
|
||||
const char* a4, const char* a5, const char* a6,
|
||||
const char* a7, const char* a8, const char* a9) const {
|
||||
if (!a1) {
|
||||
SendSimple(c, color, string_id, distance);
|
||||
} else {
|
||||
const char* args[] = {a1, a2, a3, a4, a5, a6, a7, a8, a9};
|
||||
|
||||
SerializeBuffer buf(20);
|
||||
buf.WriteInt32(0);
|
||||
buf.WriteInt32(string_id);
|
||||
buf.WriteInt32(color);
|
||||
|
||||
for (const auto* arg : args) {
|
||||
if (!arg)
|
||||
break;
|
||||
buf.WriteString(arg);
|
||||
}
|
||||
|
||||
buf.WriteInt8(0);
|
||||
|
||||
auto outapp = std::make_unique<EQApplicationPacket>(OP_FormattedMessage, std::move(buf));
|
||||
|
||||
if (distance > 0)
|
||||
entity_list.QueueCloseClients(c, outapp.get(), false, distance);
|
||||
else
|
||||
c->QueuePacket(outapp.get());
|
||||
}
|
||||
}
|
||||
} // namespace ZoneClient::Message
|
||||
@@ -0,0 +1,53 @@
|
||||
/* 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 "zone/patch/components/message/IMessage.h"
|
||||
|
||||
namespace ZoneClient::Message {
|
||||
|
||||
class Titanium : public IMessage {
|
||||
public:
|
||||
constexpr Titanium() {}
|
||||
constexpr ~Titanium() override {}
|
||||
|
||||
void Simple(Client* c, uint32_t color, uint32_t id, uint32_t distance = 0) const override;
|
||||
|
||||
void Formatted(Client* c, uint32_t color, uint32_t id,
|
||||
const char* a1 = nullptr, const char* a2 = nullptr, const char* a3 = nullptr,
|
||||
const char* a4 = nullptr, const char* a5 = nullptr, const char* a6 = nullptr,
|
||||
const char* a7 = nullptr, const char* a8 = nullptr, const char* a9 = nullptr,
|
||||
uint32_t distance = 0) const override;
|
||||
|
||||
EQApplicationPacket* InterruptSpell(Client* c, uint32_t message, uint32_t spawn_id, uint32_t spell_id,
|
||||
const char* spell_name_override = "") const override;
|
||||
EQApplicationPacket* InterruptSpellOther(Mob* m, uint32_t message, uint32_t spawn_id, uint32_t spell_id,
|
||||
const char* spell_name_override = "") const override;
|
||||
|
||||
EQApplicationPacket* Fizzle(Mob* m, uint32_t type, uint32_t message, uint32_t spell_id) const override;
|
||||
|
||||
protected:
|
||||
uint32_t ResolveID(uint32_t id) const override;
|
||||
void SendSimple(Client* c, uint32_t color, uint32_t string_id, uint32_t distance) const override;
|
||||
void SendFormatted(Client* c, uint32_t color, uint32_t string_id, uint32_t distance,
|
||||
const char* a1 = nullptr, const char* a2 = nullptr, const char* a3 = nullptr,
|
||||
const char* a4 = nullptr, const char* a5 = nullptr, const char* a6 = nullptr,
|
||||
const char* a7 = nullptr, const char* a8 = nullptr, const char* a9 = nullptr) const override;
|
||||
};
|
||||
|
||||
} // namespace Zone::Message
|
||||
@@ -0,0 +1,110 @@
|
||||
/* 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/>.
|
||||
*/
|
||||
#include "zone/patch/components/message/tob.h"
|
||||
|
||||
#include "common/links.h"
|
||||
|
||||
namespace ZoneClient::Message {
|
||||
|
||||
struct TOBStringIDs {
|
||||
static constexpr uint32_t DisarmedTrap = 1458; // You successfully disarmed the trap
|
||||
};
|
||||
|
||||
uint32_t TOB::ResolveID(uint32_t id) const {
|
||||
switch (id) {
|
||||
case YOU_FLURRY:
|
||||
case BOW_DOUBLE_DAMAGE:
|
||||
case NO_INSTRUMENT_SKILL:
|
||||
case DISCIPLINE_CONLOST:
|
||||
case TGB_ON:
|
||||
case TGB_OFF:
|
||||
case DISCIPLINE_RDY:
|
||||
case SONG_NEEDS_DRUM:
|
||||
case SONG_NEEDS_WIND:
|
||||
case SONG_NEEDS_STRINGS:
|
||||
case SONG_NEEDS_BRASS:
|
||||
case YOU_CRIT_HEAL:
|
||||
case YOU_CRIT_BLAST:
|
||||
case SPELL_WORN_OFF:
|
||||
case PET_TAUNTING:
|
||||
case DISC_LEVEL_ERROR:
|
||||
case MALE_SLAYUNDEAD:
|
||||
case FEMALE_SLAYUNDEAD:
|
||||
case FINISHING_BLOW:
|
||||
case ASSASSINATES:
|
||||
case CRIPPLING_BLOW:
|
||||
case CRITICAL_HIT:
|
||||
case DEADLY_STRIKE:
|
||||
case OTHER_CRIT_HEAL:
|
||||
case OTHER_CRIT_BLAST:
|
||||
case NPC_RAMPAGE:
|
||||
case NPC_FLURRY:
|
||||
case DISCIPLINE_FEARLESS:
|
||||
case CORPSE_ITEM_LOST:
|
||||
case FATAL_BOW_SHOT:
|
||||
case CURRENT_SPELL_EFFECTS:
|
||||
case NOT_DELEGATED_MARKER:
|
||||
case STRIKETHROUGH_STRING:
|
||||
case AE_RAMPAGE:
|
||||
case DISC_LEVEL_USE_ERROR:
|
||||
case SPLIT_FAIL:
|
||||
// removed from the client
|
||||
return 0;
|
||||
case DISARMED_TRAP:
|
||||
return TOBStringIDs::DisarmedTrap;
|
||||
default:
|
||||
return RoF2::ResolveID(id);
|
||||
}
|
||||
}
|
||||
|
||||
EQApplicationPacket* TOB::InterruptSpell(Client* c, uint32_t message, uint32_t spawn_id, uint32_t spell_id, const char* spell_name_override) const {
|
||||
std::string spell_name = spell_name_override == nullptr || *spell_name_override == '\0'
|
||||
? GetSpellName(spell_id)
|
||||
: spell_name_override;
|
||||
|
||||
std::string spell_link = Links::FormatSpellLink(spell_id, spell_name);
|
||||
|
||||
auto outapp = new EQApplicationPacket(OP_InterruptCast, sizeof(InterruptCast_Struct) + spell_link.size() + 1);
|
||||
auto ic = reinterpret_cast<InterruptCast_Struct*>(outapp->pBuffer);
|
||||
ic->messageid = ResolveID(message);
|
||||
ic->spawnid = spawn_id;
|
||||
fmt::format_to_n(ic->message, spell_link.size(), "{}", spell_link);
|
||||
outapp->priority = 5;
|
||||
|
||||
return outapp;
|
||||
}
|
||||
|
||||
EQApplicationPacket* TOB::InterruptSpellOther(Mob* m, uint32_t message, uint32_t spawn_id, uint32_t spell_id,
|
||||
const char* spell_name_override) const {
|
||||
std::string spell_name = spell_name_override == nullptr || *spell_name_override == '\0'
|
||||
? GetSpellName(spell_id)
|
||||
: spell_name_override;
|
||||
|
||||
std::string spell_link = Links::FormatSpellLink(spell_id, spell_name);
|
||||
|
||||
auto name = m->GetCleanName();
|
||||
auto outapp = new EQApplicationPacket(OP_InterruptCast, sizeof(InterruptCast_Struct) + strlen(name) + spell_link.size() + 2);
|
||||
auto ic = reinterpret_cast<InterruptCast_Struct*>(outapp->pBuffer);
|
||||
ic->messageid = ResolveID(message);
|
||||
ic->spawnid = spawn_id;
|
||||
fmt::format_to_n(ic->message, strlen(name) + spell_link.size() + 2, "{}\0{}\0", name, spell_link);
|
||||
|
||||
return outapp;
|
||||
}
|
||||
|
||||
} // namespace Zone::Message
|
||||
@@ -0,0 +1,37 @@
|
||||
/* 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 "zone/patch/components/message/rof2.h"
|
||||
|
||||
namespace ZoneClient::Message {
|
||||
class TOB : public RoF2 {
|
||||
public:
|
||||
constexpr TOB() {}
|
||||
constexpr ~TOB() override {}
|
||||
|
||||
EQApplicationPacket* InterruptSpell(Client* c, uint32_t message, uint32_t spawn_id, uint32_t spell_id,
|
||||
const char* spell_name_override) const override;
|
||||
EQApplicationPacket* InterruptSpellOther(Mob* m, uint32_t message, uint32_t spawn_id, uint32_t spell_id,
|
||||
const char* spell_name_override) const override;
|
||||
|
||||
protected:
|
||||
uint32_t ResolveID(uint32_t id) const override;
|
||||
};
|
||||
|
||||
} // namespace Zone::Message
|
||||
@@ -0,0 +1,30 @@
|
||||
/* 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 "patch/components/message/sod.h"
|
||||
|
||||
namespace ZoneClient::Message {
|
||||
|
||||
class UF : public SoD {
|
||||
public:
|
||||
constexpr UF() {}
|
||||
constexpr ~UF() override {}
|
||||
};
|
||||
|
||||
} // namespace Zone::Message
|
||||
Reference in New Issue
Block a user