* added bbGetPackedGUID, bbPutPackedGUID script funcs. thx bLuma for patch!

* added datatype "strnz" (non-zero-terminated string) to bytebuffer read/write script funcs.
This commit is contained in:
False.Genesis 2007-11-20 16:24:39 +00:00
parent 74bb1a8a42
commit 1452efa4e8
3 changed files with 79 additions and 1 deletions

View File

@ -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);

View File

@ -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<<i) )
{
if (bb->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<<i);
bbmask << ((uint8)(guid & 0xFF));
}
guid >>= 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)

View File

@ -44,5 +44,7 @@ DefReturnResult SCGetClass(CmdSet&);
DefReturnResult SCSendWorldPacket(CmdSet&);
DefReturnResult SCGetOpcodeName(CmdSet&);
DefReturnResult SCGetOpcodeID(CmdSet&);
DefReturnResult SCBBGetPackedGuid(CmdSet&);
DefReturnResult SCBBPutPackedGuid(CmdSet&);
#endif
#endif