All pastes #751523 Raw Edit

Anonymous

public diff v1 · immutable
#751523 ·published 2007-10-27 14:28 UTC
rendered paste body
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_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;         }