rendered paste bodyIndex: 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_listIndex: 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+#endifIndex: src/Client/DefScript/DefScriptWPFunctions.cpp===================================================================--- src/Client/DefScript/DefScriptWPFunctions.cpp (revision 0)+++ src/Client/DefScript/DefScriptWPFunctions.cpp (revision 0)@@ -0,0 +1,136 @@+#include <stdio.h>+#include <stdlib.h>+#include <string>+#include <algorithm>+#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 <string>+#include <map>+#include "WorldPacket.h"++typedef std::map<std::string,WorldPacket*> 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;+};++#endifIndex: 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; }