mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 16:51:29 +00:00
Lua packet handler dispatch
This commit is contained in:
parent
485fc2b2b7
commit
d472c05f5d
@ -29,6 +29,7 @@
|
||||
#include <assert.h>
|
||||
|
||||
extern Zone* zone;
|
||||
extern void MapOpcodes();
|
||||
|
||||
QuestParserCollection::QuestParserCollection() {
|
||||
_player_quest_status = QuestUnloaded;
|
||||
@ -66,6 +67,7 @@ void QuestParserCollection::ReloadQuests(bool reset_timers) {
|
||||
quest_manager.ClearAllTimers();
|
||||
}
|
||||
|
||||
MapOpcodes();
|
||||
_npc_quest_status.clear();
|
||||
_player_quest_status = QuestUnloaded;
|
||||
_global_player_quest_status = QuestUnloaded;
|
||||
|
||||
@ -388,6 +388,17 @@ void MapOpcodes() {
|
||||
ConnectedOpcodes[OP_OpenContainer] = &Client::Handle_OP_OpenContainer;
|
||||
}
|
||||
|
||||
void ClearMappedOpcode(EmuOpcode op) {
|
||||
if(op >= _maxEmuOpcode)
|
||||
return;
|
||||
|
||||
ConnectedOpcodes[op] = nullptr;
|
||||
auto iter = ConnectingOpcodes.find(op);
|
||||
if(iter != ConnectingOpcodes.end()) {
|
||||
ConnectingOpcodes.erase(iter);
|
||||
}
|
||||
}
|
||||
|
||||
int Client::HandlePacket(const EQApplicationPacket *app)
|
||||
{
|
||||
_ZP(Client_HandlePacket);
|
||||
@ -420,10 +431,14 @@ int Client::HandlePacket(const EQApplicationPacket *app)
|
||||
switch(client_state) {
|
||||
case CLIENT_CONNECTING: {
|
||||
if(ConnectingOpcodes.count(opcode) != 1) {
|
||||
//TODO: replace this 0 with the EQ opcode
|
||||
LogFile->write(EQEMuLog::Error, "HandlePacket() Opcode error: Unexpected packet during CLIENT_CONNECTING: opcode: %s (#%d eq=0x%04x), size: %i", OpcodeNames[opcode], opcode, 0, app->size);
|
||||
#if EQDEBUG >= 9
|
||||
std::cout << "Unexpected packet during CLIENT_CONNECTING: OpCode: 0x" << hex << setw(4) << setfill('0') << opcode << dec << ", size: " << app->size << std::endl;
|
||||
//Hate const cast but everything in lua needs to be non-const even if i make it non-mutable
|
||||
std::vector<void*> args;
|
||||
args.push_back(const_cast<EQApplicationPacket*>(app));
|
||||
parse->EventPlayer(EVENT_UNHANDLED_OPCODE, this, "", 1, &args);
|
||||
|
||||
#if EQDEBUG >= 10
|
||||
LogFile->write(EQEMuLog::Error, "HandlePacket() Opcode error: Unexpected packet during CLIENT_CONNECTING: opcode:"
|
||||
" %s (#%d eq=0x%04x), size: %i", OpcodeNames[opcode], opcode, 0, app->size);
|
||||
DumpPacket(app);
|
||||
#endif
|
||||
break;
|
||||
@ -446,11 +461,16 @@ int Client::HandlePacket(const EQApplicationPacket *app)
|
||||
ClientPacketProc p;
|
||||
p = ConnectedOpcodes[opcode];
|
||||
if(p == nullptr) {
|
||||
#if (EQDEBUG>=5)
|
||||
std::vector<void*> args;
|
||||
args.push_back(const_cast<EQApplicationPacket*>(app));
|
||||
parse->EventPlayer(EVENT_UNHANDLED_OPCODE, this, "", 0, &args);
|
||||
|
||||
#if (EQDEBUG >= 10)
|
||||
char buffer[64];
|
||||
app->build_header_dump(buffer);
|
||||
mlog(CLIENT__NET_ERR, "Unhandled incoming opcode: %s", buffer);
|
||||
if(app->size<1000)
|
||||
|
||||
if(app->size < 1000)
|
||||
DumpPacket(app->pBuffer, app->size);
|
||||
else{
|
||||
std::cout << "Dump limited to 1000 characters:\n";
|
||||
@ -476,28 +496,6 @@ int Client::HandlePacket(const EQApplicationPacket *app)
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*void Client::Handle_Connect_OP_SetDataRate(const EQApplicationPacket *app)
|
||||
{
|
||||
// Set client datarate
|
||||
//if (app->size != sizeof(float)) {
|
||||
//LogFile->write(EQEMuLog::Error,"Wrong size on OP_SetDatarate. Got: %i, Expected: %i", app->size, sizeof(float));
|
||||
//return;
|
||||
//}
|
||||
//LogFile->write(EQEMuLog::Debug, "HandlePacket() OP_SetDataRate request : %f", *(float*) app->pBuffer);
|
||||
//float tmpDR = *(float*) app->pBuffer;
|
||||
//if (tmpDR <= 0.0f) {
|
||||
//LogFile->write(EQEMuLog::Error,"HandlePacket() OP_SetDataRate INVALID request : %f <= 0", tmpDR);
|
||||
//LogFile->write(EQEMuLog::Normal,"WARNING: Setting datarate for client to 5.0 expect a client lock up =(");
|
||||
//tmpDR = 5.0f;
|
||||
//}
|
||||
//if (tmpDR > 25.0f)
|
||||
//tmpDR = 25.0f;
|
||||
//eqs->SetDataRate(tmpDR);
|
||||
return;
|
||||
}*/
|
||||
|
||||
void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app)
|
||||
{
|
||||
if(app->size != sizeof(ClientZoneEntry_Struct))
|
||||
|
||||
@ -111,7 +111,8 @@ const char *QuestEventSubroutines[_LargestEventID] = {
|
||||
"EVENT_ENTER_AREA",
|
||||
"EVENT_LEAVE_AREA",
|
||||
"EVENT_RESPAWN",
|
||||
"EVENT_DEATH_COMPLETE"
|
||||
"EVENT_DEATH_COMPLETE",
|
||||
"EVENT_UNHANDLED_OPCODE"
|
||||
};
|
||||
|
||||
PerlembParser::PerlembParser() : perl(nullptr) {
|
||||
|
||||
@ -80,6 +80,7 @@ typedef enum {
|
||||
EVENT_LEAVE_AREA,
|
||||
EVENT_RESPAWN,
|
||||
EVENT_DEATH_COMPLETE,
|
||||
EVENT_UNHANDLED_OPCODE,
|
||||
|
||||
_LargestEventID
|
||||
} QuestEventID;
|
||||
|
||||
@ -31,6 +31,8 @@ struct lua_registered_event {
|
||||
};
|
||||
|
||||
extern std::map<std::string, std::list<lua_registered_event>> lua_encounter_events_registered;
|
||||
extern void MapOpcodes();
|
||||
extern void ClearMappedOpcode(EmuOpcode op);
|
||||
|
||||
void load_encounter(std::string name) {
|
||||
parse->EventEncounter(EVENT_ENCOUNTER_LOAD, name, 0);
|
||||
@ -1009,6 +1011,14 @@ Lua_ItemInst lua_get_quest_item() {
|
||||
return quest_manager.GetQuestItem();
|
||||
}
|
||||
|
||||
void lua_map_opcodes() {
|
||||
MapOpcodes();
|
||||
}
|
||||
|
||||
void lua_clear_opcode(int op) {
|
||||
ClearMappedOpcode(static_cast<EmuOpcode>(op));
|
||||
}
|
||||
|
||||
luabind::scope lua_register_general() {
|
||||
return luabind::namespace_("eq")
|
||||
[
|
||||
@ -1168,7 +1178,9 @@ luabind::scope lua_register_general() {
|
||||
luabind::def("stop_follow", &lua_stop_follow),
|
||||
luabind::def("get_initiator", &lua_get_initiator),
|
||||
luabind::def("get_owner", &lua_get_owner),
|
||||
luabind::def("get_quest_item", &lua_get_quest_item)
|
||||
luabind::def("get_quest_item", &lua_get_quest_item),
|
||||
luabind::def("map_opcodes", &lua_map_opcodes),
|
||||
luabind::def("clear_opcode", &lua_clear_opcode)
|
||||
];
|
||||
}
|
||||
|
||||
@ -1247,7 +1259,8 @@ luabind::scope lua_register_events() {
|
||||
luabind::value("augment_remove", static_cast<int>(EVENT_AUGMENT_REMOVE)),
|
||||
luabind::value("enter_area", static_cast<int>(EVENT_ENTER_AREA)),
|
||||
luabind::value("leave_area", static_cast<int>(EVENT_LEAVE_AREA)),
|
||||
luabind::value("death_complete", static_cast<int>(EVENT_DEATH_COMPLETE))
|
||||
luabind::value("death_complete", static_cast<int>(EVENT_DEATH_COMPLETE)),
|
||||
luabind::value("unhandled_opcode", static_cast<int>(EVENT_UNHANDLED_OPCODE))
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@ -43,6 +43,11 @@ Lua_Packet::Lua_Packet(const Lua_Packet& o) {
|
||||
}
|
||||
}
|
||||
|
||||
int Lua_Packet::GetSize() {
|
||||
Lua_Safe_Call_Int();
|
||||
return static_cast<int>(self->size);
|
||||
}
|
||||
|
||||
int Lua_Packet::GetOpcode() {
|
||||
Lua_Safe_Call_Int();
|
||||
return static_cast<int>(self->GetOpcode());
|
||||
@ -241,6 +246,7 @@ luabind::scope lua_register_packet() {
|
||||
.def(luabind::constructor<int,int>())
|
||||
.property("null", &Lua_Packet::Null)
|
||||
.property("valid", &Lua_Packet::Valid)
|
||||
.def("GetSize", &Lua_Packet::GetSize)
|
||||
.def("GetOpcode", &Lua_Packet::GetOpcode)
|
||||
.def("SetOpcode", &Lua_Packet::SetOpcode)
|
||||
.def("WriteInt8", &Lua_Packet::WriteInt8)
|
||||
|
||||
@ -25,6 +25,7 @@ public:
|
||||
Lua_Packet(const Lua_Packet& o);
|
||||
virtual ~Lua_Packet() { if(owned_) { EQApplicationPacket *ptr = GetLuaPtrData(); if(ptr) { delete ptr; } } }
|
||||
|
||||
int GetSize();
|
||||
int GetOpcode();
|
||||
void SetOpcode(int op);
|
||||
void WriteInt8(int offset, int value);
|
||||
|
||||
@ -113,7 +113,8 @@ const char *LuaEvents[_LargestEventID] = {
|
||||
"event_enter_area",
|
||||
"event_leave_area",
|
||||
"event_respawn",
|
||||
"event_death_complete"
|
||||
"event_death_complete",
|
||||
"event_unhandled_opcode"
|
||||
};
|
||||
|
||||
extern Zone *zone;
|
||||
@ -190,6 +191,7 @@ LuaParser::LuaParser() {
|
||||
PlayerArgumentDispatch[EVENT_ENTER_AREA] = handle_player_area;
|
||||
PlayerArgumentDispatch[EVENT_LEAVE_AREA] = handle_player_area;
|
||||
PlayerArgumentDispatch[EVENT_RESPAWN] = handle_player_respawn;
|
||||
PlayerArgumentDispatch[EVENT_UNHANDLED_OPCODE] = handle_player_packet;
|
||||
|
||||
ItemArgumentDispatch[EVENT_ITEM_CLICK] = handle_item_click;
|
||||
ItemArgumentDispatch[EVENT_ITEM_CLICK_CAST] = handle_item_click;
|
||||
|
||||
@ -21,6 +21,7 @@
|
||||
#include "lua_corpse.h"
|
||||
#include "lua_door.h"
|
||||
#include "lua_object.h"
|
||||
#include "lua_packet.h"
|
||||
#include "zone.h"
|
||||
#include "lua_parser_events.h"
|
||||
|
||||
@ -472,6 +473,17 @@ void handle_player_respawn(QuestInterface *parse, lua_State* L, Client* client,
|
||||
lua_setfield(L, -2, "resurrect");
|
||||
}
|
||||
|
||||
void handle_player_packet(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data,
|
||||
std::vector<void*> *extra_pointers) {
|
||||
Lua_Packet l_packet(reinterpret_cast<EQApplicationPacket*>(extra_pointers->at(0)));
|
||||
luabind::object l_packet_o = luabind::object(L, l_packet);
|
||||
l_packet_o.push(L);
|
||||
lua_setfield(L, -2, "packet");
|
||||
|
||||
lua_pushboolean(L, extra_data == 1 ? true : false);
|
||||
lua_setfield(L, -2, "connecting");
|
||||
}
|
||||
|
||||
void handle_player_null(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data,
|
||||
std::vector<void*> *extra_pointers) {
|
||||
}
|
||||
|
||||
@ -88,6 +88,8 @@ void handle_player_area(QuestInterface *parse, lua_State* L, Client* client, std
|
||||
std::vector<void*> *extra_pointers);
|
||||
void handle_player_respawn(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data,
|
||||
std::vector<void*> *extra_pointers);
|
||||
void handle_player_packet(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data,
|
||||
std::vector<void*> *extra_pointers);
|
||||
void handle_player_null(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data,
|
||||
std::vector<void*> *extra_pointers);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user