Index: bin/scripts/__core_wp.def =================================================================== --- bin/scripts/__core_wp.def (revision 0) +++ bin/scripts/__core_wp.def (revision 0) @@ -0,0 +1,44 @@ +#script=_onworldpacket +#permission=255 +// @def - opcode +// recvpacket - received world packet + +processPacket ${@def} + +#script=processPacket +#permission=255 +// @def - opcode +// _onworldpacket::recvpacket - received world packet + +set,i 0 +set,len ?{llen opcode_list} +default,len 0 + +loop + if ?{equal,${i} ${len}} + exitloop + endif + + if ?{equal,${@def} ?{lindex,opcode_list ${i}}} + wprewind,recvpacket 0 + ?{lindex,script_list ${i}} {#_onworldpacket::recvpacket} + endif + + add,i 1 +endloop + +unset len +unset i +wpdelete #_onworldpacket::recvpacket + +#script=addPacketHandler +#permission=255 +// @def - script to handle +// @0 - opcode +lappend,#processpacket::opcode_list ${@0} +lappend,#processpacket::script_list ${@def} + +#script=FlushPacketHandlers +#permission=255 +lclean #processpacket::opcode_list +lclean #processpacket::script_list Index: bin/scripts/packetHandlerEx.def =================================================================== --- bin/scripts/packetHandlerEx.def (revision 0) +++ bin/scripts/packetHandlerEx.def (revision 0) @@ -0,0 +1,26 @@ +#script=HandleHeartbeat +#permission=255 +// @def - packet identifier +#onload + addPacketHandler,238 HandleHeartbeat +#/onload + +set,guid ?{wpread,${@def} packedguid} +set,guid ?{loguid ${guid}} + +// skip 2x uint32 +wpread,${@def} uint32 +wpread,${@def} uint32 + +out Guid ${guid} - X:?{wpread,${@def} float} Y:?{wpread,${@def} float} Z:?{wpread,${@def} float} + +unset guid + +#script=HandlePong +#permission=255 +// @def - packet identifier +#onload + addPacketHandler,477 HandlePong +#/onload + +out Received packet with PONG, data - ?{wpread,${@def} uint32} Index: src/Client/DefScript/DefScript.cpp =================================================================== --- src/Client/DefScript/DefScript.cpp (revision 180) +++ src/Client/DefScript/DefScript.cpp (working copy) @@ -145,6 +145,20 @@ AddFunc("lmclean",&DefScriptPackage::func_lmclean); AddFunc("lerase",&DefScriptPackage::func_lerase); AddFunc("lsort",&DefScriptPackage::func_lsort); + + //worldpackets + AddFunc("wpsetopcode",&DefScriptPackage::func_wpsetopcode); + AddFunc("wpsend",&DefScriptPackage::func_wpsend); + AddFunc("wpdelete",&DefScriptPackage::func_wpdelete); + AddFunc("wpinit",&DefScriptPackage::func_wpinit); + AddFunc("wpappend",&DefScriptPackage::func_wpappend); + AddFunc("wphexlike",&DefScriptPackage::func_wphexlike); + AddFunc("wpread",&DefScriptPackage::func_wpread); + AddFunc("wprewind",&DefScriptPackage::func_wprewind); + + AddFunc("loguid",&DefScriptPackage::func_loguid); + AddFunc("higuid",&DefScriptPackage::func_higuid); + } void DefScriptPackage::AddFunc(std::string n,DefReturnResult (DefScriptPackage::*f)(CmdSet& Set)) Index: src/Client/DefScript/DefScript.h =================================================================== --- src/Client/DefScript/DefScript.h (revision 180) +++ src/Client/DefScript/DefScript.h (working copy) @@ -10,6 +10,7 @@ #include "DynamicEvent.h" #include "ListStorage.h" #include "DefScriptTools.h" +#include "WPStorage.h" class DefScriptPackage; class DefScript; @@ -127,6 +128,7 @@ bool HasFunc(std::string); void DelFunc(std::string); ListStorage lists; + WPStorage worldpackets; std::string SecureString(std::string s); // own logging functions. default is printf. @@ -227,6 +229,18 @@ DefReturnResult func_lerase(CmdSet&); DefReturnResult func_lsort(CmdSet&); + DefReturnResult func_wpsetopcode(CmdSet&); + DefReturnResult func_wpsend(CmdSet&); + DefReturnResult func_wpdelete(CmdSet&); + DefReturnResult func_wpinit(CmdSet&); + DefReturnResult func_wpappend(CmdSet&); + DefReturnResult func_wphexlike(CmdSet&); + DefReturnResult func_wpread(CmdSet&); + DefReturnResult func_wprewind(CmdSet&); + + DefReturnResult func_loguid(CmdSet&); + DefReturnResult func_higuid(CmdSet&); + // setup own function declarations here # include "DefScriptInterfaceInclude.h" @@ -237,4 +251,4 @@ -#endif \ No newline at end of file +#endif Index: src/Client/DefScript/DefScriptWPFunctions.cpp =================================================================== --- src/Client/DefScript/DefScriptWPFunctions.cpp (revision 0) +++ src/Client/DefScript/DefScriptWPFunctions.cpp (revision 0) @@ -0,0 +1,136 @@ +#include +#include +#include +#include +#include "DefScript.h" +#include "DefScriptTools.h" +#include "PseuWoW.h" +#include "WorldSession.h" +#include "Opcodes.h" + +using namespace DefScriptTools; + +DefReturnResult DefScriptPackage::func_wpsetopcode(CmdSet& Set) +{ + WorldPacket *wp = worldpackets.GetNoCreate(_NormalizeVarName(Set.arg[0],Set.myname)); + if (!wp) + return false; + + unsigned int opcode = (unsigned int)toNumber(Set.arg[0]); + // so slow, use int number ! + if (!opcode && !Set.defaultarg.empty()) + { + for(int i = 0; i <= MAX_OPCODE_ID; i++) + if(GetOpcodeName(i) == Set.arg[0]) + { + opcode = i; + break; + } + } + + wp->SetOpcode( opcode ); + return true; +} + +DefReturnResult DefScriptPackage::func_wpsend(CmdSet& Set) +{ + WorldPacket *wp = worldpackets.GetNoCreate(_NormalizeVarName(Set.defaultarg,Set.myname)); + if (((PseuInstance*)parentMethod)->GetWSession() && wp) { + ((PseuInstance*)parentMethod)->GetWSession()->SendWorldPacket(*wp); + return true; + } + + return false; +} + +DefReturnResult DefScriptPackage::func_wpdelete(CmdSet& Set) +{ + worldpackets.Delete(_NormalizeVarName(Set.defaultarg,Set.myname)); + return true; +} + +DefReturnResult DefScriptPackage::func_wpinit(CmdSet& Set) +{ + WorldPacket *wp = worldpackets.Get(_NormalizeVarName(Set.defaultarg,Set.myname)); + unsigned int opcode = (unsigned int)toNumber(Set.arg[0]); + wp->SetOpcode(opcode); + return true; +} + +DefReturnResult DefScriptPackage::func_wphexlike(CmdSet& Set) +{ + WorldPacket *wp = worldpackets.GetNoCreate(_NormalizeVarName(Set.defaultarg,Set.myname)); + if (!wp) + return false; + + wp->hexlike(); + return true; +} + +#define WP_MACRO_INSERT(bytebuffer, type, dtype) if(type==#dtype ) {*bytebuffer << (dtype)toNumber(Set.defaultarg); return true;} +#define WP_MACRO_EXTRACT_I(bytebuffer, type, dtype) if(type==#dtype ) {dtype var; *bytebuffer >> var; return DefScriptTools::toString((uint64)var); } +#define WP_MACRO_EXTRACT_F(bytebuffer, type, dtype) if(type==#dtype ) {dtype var; *bytebuffer >> var; return DefScriptTools::toString((ldbl)var); } + +DefReturnResult DefScriptPackage::func_wpappend(CmdSet& Set) +{ + WorldPacket *wp = worldpackets.Get(_NormalizeVarName(Set.arg[0],Set.myname)); + + std::string dtype = DefScriptTools::stringToLower(Set.arg[1]); + + if (dtype == "string") + { + *wp << Set.defaultarg; + return true; + } + + WP_MACRO_INSERT(wp, dtype, uint8); + WP_MACRO_INSERT(wp, dtype, uint16); + WP_MACRO_INSERT(wp, dtype, uint32); + WP_MACRO_INSERT(wp, dtype, uint64); + WP_MACRO_INSERT(wp, dtype, float); + WP_MACRO_INSERT(wp, dtype, double); + + return false; +} + +DefReturnResult DefScriptPackage::func_wpread(CmdSet& Set) +{ + WorldPacket *wp = worldpackets.GetNoCreate(_NormalizeVarName(Set.arg[0],Set.myname)); + if (!wp) + return false; + + std::string dtype = DefScriptTools::stringToLower(Set.defaultarg); + + if (dtype == "string") { + std::string g; + *wp >> g; + return g; + } + + if (dtype == "packedguid") { + uint64 g; + g = wp->GetPackedGuid(); + return DefScriptTools::toString(g); + } + + WP_MACRO_EXTRACT_I(wp, dtype, uint8); + WP_MACRO_EXTRACT_I(wp, dtype, uint16); + WP_MACRO_EXTRACT_I(wp, dtype, uint32); + WP_MACRO_EXTRACT_I(wp, dtype, uint64); + WP_MACRO_EXTRACT_F(wp, dtype, float); + WP_MACRO_EXTRACT_F(wp, dtype, double); + + return false; +} + +DefReturnResult DefScriptPackage::func_wprewind(CmdSet& Set) +{ + WorldPacket *wp = worldpackets.GetNoCreate(_NormalizeVarName(Set.arg[0],Set.myname)); + if (!wp) + return false; + + wp->rpos( (unsigned int)toNumber(Set.defaultarg) ); + return true; +} + + Index: src/Client/DefScript/WPStorage.cpp =================================================================== --- src/Client/DefScript/WPStorage.cpp (revision 0) +++ src/Client/DefScript/WPStorage.cpp (revision 0) @@ -0,0 +1,62 @@ +#include "WPStorage.h" + +WPStorage::~WPStorage() +{ + for(DefWPMap::iterator it = _storage.begin(); it != _storage.end();) + { + delete it->second; + _storage.erase(it++); + } +} + +bool WPStorage::Exists(std::string s) +{ + for(DefWPMap::iterator it = _storage.begin(); it != _storage.end(); it++) + { + if(it->first == s) + return true; + } + return false; +} + +WorldPacket *WPStorage::_Create(std::string s) +{ + WorldPacket *l = new WorldPacket(); + _storage[s] = l; + return l; +} + +void WPStorage::Delete(std::string s) +{ + for(DefWPMap::iterator it = _storage.begin(); it != _storage.end(); it++) + { + if(it->first == s) + { + delete it->second; + _storage.erase(it); + return; + } + } +} + +WorldPacket *WPStorage::GetNoCreate(std::string s) +{ + for(DefWPMap::iterator it = _storage.begin(); it != _storage.end(); it++) + if(it->first == s) + return it->second; + return NULL; +} + +WorldPacket *WPStorage::Get(std::string s) +{ + WorldPacket *l = GetNoCreate(s); + return l ? l : _Create(s); +} + +void WPStorage::AddExisting(std::string s, WorldPacket *p) +{ + if (_storage[s]) + delete _storage[s]; + + _storage[s] = p; +} Index: src/Client/DefScript/WPStorage.h =================================================================== --- src/Client/DefScript/WPStorage.h (revision 0) +++ src/Client/DefScript/WPStorage.h (revision 0) @@ -0,0 +1,27 @@ +#ifndef DEFSCRIPT_WPSTORAGE_H +#define DEFSCRIPT_WPSTORAGE_H + +#include +#include +#include "WorldPacket.h" + +typedef std::map DefWPMap; + +class WPStorage +{ +public: + WPStorage::~WPStorage(); + + bool Exists(std::string); + void Delete(std::string); + WorldPacket *Get(std::string); + WorldPacket *GetNoCreate(std::string); + inline void Assign(std::string s,WorldPacket *l) { _storage[s] = l; } + void AddExisting(std::string, WorldPacket*); + +private: + WorldPacket *_Create(std::string); + DefWPMap _storage; +}; + +#endif Index: src/Client/World/WorldSession.cpp =================================================================== --- src/Client/World/WorldSession.cpp (revision 180) +++ src/Client/World/WorldSession.cpp (working copy) @@ -160,7 +160,16 @@ } } - delete packet; + if(GetInstance()->GetScripts()->GetScript("_onworldpacket")) + { + CmdSet Set; + Set.defaultarg = toString((uint64)packet->GetOpcode()); + packet->rpos(0); + GetInstance()->GetScripts()->worldpackets.AddExisting("_onworldpacket::recvpacket", packet); + GetInstance()->GetScripts()->RunScript("_onworldpacket",&Set); + } else + delete packet; + known=false; }