diff --git a/src/Client/DefScript/DefScriptBBFunctions.cpp b/src/Client/DefScript/DefScriptBBFunctions.cpp index 0f70e1e..8ec820f 100644 --- a/src/Client/DefScript/DefScriptBBFunctions.cpp +++ b/src/Client/DefScript/DefScriptBBFunctions.cpp @@ -50,6 +50,11 @@ DefReturnResult DefScriptPackage::func_bbappend(CmdSet& Set) *bb << Set.defaultarg; return true; } + else if(dtype == "strnz") + { + bb->append(Set.defaultarg.c_str(), Set.defaultarg.length()); // append the string skipping \0 + return true; + } BB_MACRO_INSERT(bb, dtype, uint8); BB_MACRO_INSERT(bb, dtype, uint16); @@ -77,6 +82,20 @@ DefReturnResult DefScriptPackage::func_bbread(CmdSet& Set) *bb >> g; return g; } + else if(dtype == "strnz") // extract some amount of bytes not terminated by \0 + { + uint32 bytes = (uint32)toUint64(Set.arg[1]); + if(bytes) + { + std::string g; + char *buf = new char[bytes]; + bb->read((uint8*)buf,bytes); + g = buf; + delete [] buf; + return g; + } + return ""; + } BB_MACRO_EXTRACT_I(bb, dtype, uint8); BB_MACRO_EXTRACT_I(bb, dtype, uint16); diff --git a/src/Client/DefScriptInterface.cpp b/src/Client/DefScriptInterface.cpp index 6e4dd4f..7977bee 100644 --- a/src/Client/DefScriptInterface.cpp +++ b/src/Client/DefScriptInterface.cpp @@ -53,6 +53,8 @@ void DefScriptPackage::_InitDefScriptInterface(void) AddFunc("sendworldpacket",&DefScriptPackage::SCSendWorldPacket); AddFunc("getopcodename",&DefScriptPackage::SCGetOpcodeName); AddFunc("getopcodeid",&DefScriptPackage::SCGetOpcodeID); + AddFunc("bbgetpackedguid",&DefScriptPackage::SCBBGetPackedGuid); + AddFunc("bbputpackedguid",&DefScriptPackage::SCBBPutPackedGuid); } DefReturnResult DefScriptPackage::SCshdn(CmdSet& Set) @@ -899,7 +901,61 @@ DefReturnResult DefScriptPackage::SCGetOpcodeName(CmdSet &Set) return GetOpcodeName((uint32)DefScriptTools::toUint64(Set.defaultarg)); } +DefReturnResult DefScriptPackage::SCBBGetPackedGuid(CmdSet &Set) +{ + ByteBuffer *bb = bytebuffers.GetNoCreate(_NormalizeVarName(Set.defaultarg,Set.myname)); + if (!bb) + return false; + if (bb->size() - bb->rpos() < sizeof(uint8)) + return false; + + uint8 mask; + *bb >> mask; + uint64 guid=0; + for(uint8 i=0;i<8;i++) + { + if(mask & (1<size() - bb->rpos() < sizeof(uint8)) + return false; + + *bb >> ((uint8*)&guid)[i]; + } + } + + return toString(guid); +} + +DefReturnResult DefScriptPackage::SCBBPutPackedGuid(CmdSet &Set) +{ + ByteBuffer *bb = bytebuffers.Get(_NormalizeVarName(Set.arg[0],Set.myname)); + + uint64 guid = DefScriptTools::toUint64(Set.defaultarg); + if (!guid) // fast check if guid is empty (in this case mask must be 0 with no extra data) + { + *bb << uint8(0); + return false; + } + + ByteBuffer bbmask; + uint8 mask = 0; + + for(uint8 i = 0; i < 8; i++) + { + if(guid & 0xFF) + { + mask |= (1<>= 8; + } + + *bb << mask; + bb->append(bbmask); + + return true; +} void DefScriptPackage::My_LoadUserPermissions(VarSet &vs) { @@ -973,3 +1029,4 @@ void DefScriptPackage::My_Run(std::string line, std::string username) + diff --git a/src/Client/DefScriptInterfaceInclude.h b/src/Client/DefScriptInterfaceInclude.h index c03e81a..666a316 100644 --- a/src/Client/DefScriptInterfaceInclude.h +++ b/src/Client/DefScriptInterfaceInclude.h @@ -44,5 +44,7 @@ DefReturnResult SCGetClass(CmdSet&); DefReturnResult SCSendWorldPacket(CmdSet&); DefReturnResult SCGetOpcodeName(CmdSet&); DefReturnResult SCGetOpcodeID(CmdSet&); +DefReturnResult SCBBGetPackedGuid(CmdSet&); +DefReturnResult SCBBPutPackedGuid(CmdSet&); -#endif \ No newline at end of file +#endif