eqemu-server/common/patches/template.cpp
2013-02-16 16:14:39 -08:00

174 lines
3.3 KiB
C++

#include "TEMPLATE.h"
#include "../opcodemgr.h"
#include "../logsys.h"
#include "../EQStreamIdent.h"
#include "../eq_packet_structs.h"
#include "TEMPLATE_structs.h"
namespace TEMPLATE {
static const char *name = "CHANGEME";
static OpcodeManager *opcodes = NULL;
static Strategy struct_strategy;
void Register(EQStreamIdentifier &into) {
//create our opcode manager if we havent already
if(opcodes == NULL) {
string opfile = "patch_";
opfile += name;
opfile += ".conf";
//load up the opcode manager.
//TODO: figure out how to support shared memory with multiple patches...
opcodes = new RegularOpcodeManager();
if(!opcodes->LoadOpcodes(opfile.c_str())) {
_log(NET__OPCODES, "Error loading opcodes file %s. Not registering patch %s.", opfile.c_str(), name);
return;
}
}
//ok, now we have what we need to register.
EQStream::Signature signature;
//register our world signature.
signature.first_length = sizeof(structs::LoginInfo_Struct);
signature.first_eq_opcode = opcodes->EmuToEQ(OP_SendLoginInfo);
into.RegisterPatch(signature, name, &opcodes, &struct_strategy);
//register our zone signature.
signature.first_length = sizeof(structs::ClientZoneEntry_Struct);
signature.first_eq_opcode = opcodes->EmuToEQ(OP_ZoneEntry);
into.RegisterPatch(signature, name, &opcodes, &struct_strategy);
}
void Reload() {
//we have a big problem to solve here when we switch back to shared memory
//opcode managers because we need to change the manager pointer, which means
//we need to go to every stream and replace it's manager.
if(opcodes != NULL) {
//TODO: get this file name from the config file
string opfile = "patch_";
opfile += name;
opfile += ".conf";
if(!opcodes->ReloadOpcodes(opfile.c_str())) {
_log(NET__OPCODES, "Error reloading opcodes file %s for patch %s.", opfile.c_str(), name);
return;
}
_log(NET__OPCODES, "Reloaded opcodes for patch %s", name);
}
}
Strategy::Strategy()
: StructStrategy()
{
//all opcodes default to passthrough.
#include "SSRegister.h"
#include "TEMPLATE_ops.h"
}
std::string Strategy::Describe() const {
std::string r;
r += "Patch ";
r += name;
return(r);
}
#include "SSDefine.h"
/*ENCODE(OP_PlayerProfile) {
SETUP_DIRECT(PlayerProfile_Struct, structs::PlayerProfile_Struct);
FINISH_DIRECT();
}
ENCODE(OP_NewZone) {
SETUP_DIRECT(PlayerProfile_Struct, structs::PlayerProfile_Struct);
FINISH_DIRECT();
}*/
ENCODE(OP_SendAATable) {
SETUP_DIRECT_ENCODE(SendAA_Struct, structs::SendAA_Struct);
OUT(id);
OUT(hotkey_sid);
OUT(hotkey_sid2);
OUT(title_sid);
OUT(desc_sid);
OUT(cost);
OUT(seq);
OUT(current_level);
OUT(prereq_skill);
OUT(prereq_minpoints);
OUT(type);
OUT(spellid);
OUT(spell_type);
OUT(spell_refresh);
OUT(classes);
OUT(berserker);
OUT(max_level);
OUT(last_id);
OUT(next_id);
OUT(cost2);
OUT(unknown80[0]);
OUT(unknown80[1]);
OUT(total_abilities);
unsigned int r;
for(r = 0; r < emu->total_abilities; r++) {
OUT(abilities[r].skill_id);
OUT(abilities[r].increase_amt);
OUT(abilities[r].unknown08);
OUT(abilities[r].last_level);
}
FINISH_DIRECT_ENCODE();
}
DECODE(OP_SetServerFilter) {
SETUP_DIRECT_DECODE(SetServerFilter_Struct, structs::SetServerFilter_Struct);
int r;
for(r = 0; r < 25; r++) {
IN(filters[r]);
}
emu->filters[25] = 1;
FINISH_DIRECT_DECODE();
}
} //end namespace TEMPLATE