gmcl_usermessages_win32/nekobuf.cpp
2017-07-19 23:36:28 +03:00

248 lines
No EOL
4.9 KiB
C++

#include "nekobuf.h"
static int ud_type = 253;
static char* ud_name = "NekoBuf";
void NekoBuf_Create(CLuaState* L,bf_write* buf)
{
userdata_t* ud = L->NewUserData();
ud->data = buf;
ud->type = ud_type;
L->GetMetaFromRegistry(ud_name);
L->SetMetaTable(-2);
}
bf_write* NekoBuf_Check(CLuaState* L,int idx)
{
userdata_t* ud = L->GetUserData(idx);
if(ud->type==ud_type)
return (bf_write*)ud->data;
return NULL;
}
void* MetaCheck(CLuaState* L,int idx,int type)
{
userdata_t* ud = L->GetUserData(idx);
if(ud->type==type)
return ud->data;
return NULL;
}
int NekoBuf_tostring(CLuaState* L)
{
L->PushFString("%s: %p",ud_name,NekoBuf_Check(L,1));
return 1;
}
int NekoBuf_eq(CLuaState* L)
{
L->PushBool((NekoBuf_Check(L,1) == NekoBuf_Check(L,2)));
return 1;
}
int NekoBuf_gc(CLuaState* L)
{
return 0;
}
int NekoBuf_WriteByte(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,NUMBER);
buf->WriteByte(L->GetInteger(2) & 0xFF);
return 0;
}
int NekoBuf_WriteChar(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,NUMBER);
buf->WriteChar(L->GetInteger(2) & 0xFF);
return 0;
}
int NekoBuf_WriteShort(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,NUMBER);
buf->WriteShort(L->GetInteger(2) & 0xFFFF);
return 0;
}
int NekoBuf_WriteWord(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,NUMBER);
buf->WriteWord(L->GetInteger(2));
return 0;
}
int NekoBuf_WriteLong(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,NUMBER);
buf->WriteLong(L->GetInteger(2));
return 0;
}
int NekoBuf_WriteFloat(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,NUMBER);
buf->WriteFloat((float)L->GetNumber(2));
return 0;
}
int NekoBuf_WriteAngle(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,NUMBER);
L->CheckType(3,NUMBER);
buf->WriteBitAngle((float)L->GetNumber(2),L->GetInteger(3));
return 0;
}
int NekoBuf_WriteAngles(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
QAngle* ang = (QAngle*)MetaCheck(L,2,11); //Angle
if(ang)
buf->WriteBitAngles((const QAngle&)ang);
return 0;
}
int NekoBuf_WriteCoord(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,NUMBER);
buf->WriteBitCoord((float)L->GetNumber(2));
return 0;
}
int NekoBuf_WriteVec3Coord(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
Vector* vec = (Vector*)MetaCheck(L,2,12); //Vector
if(vec)
buf->WriteBitVec3Coord((const Vector&)vec);
return 0;
}
int NekoBuf_WriteVec3Normal(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
Vector* vec = (Vector*)MetaCheck(L,2,12); //Vector
if(vec)
buf->WriteBitVec3Normal((const Vector&)vec);
return 0;
}
int NekoBuf_WriteString(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,STRING);
buf->WriteString(L->GetString(2));
return 0;
}
int NekoBuf_WriteEHandle(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
CBasePlayer* pEntity = GetEntityByLuaEntity(L,2);
CBaseHandle hEntity;
long EncodedEHandle;
if(pEntity)
{
hEntity = pEntity->GetRefEHandle();
int iSerialNum = (hEntity.m_Index >> NUM_ENT_ENTRY_BITS)
& ( (1 << NUM_NETWORKED_EHANDLE_SERIAL_NUMBER_BITS) - 1 );
EncodedEHandle = (hEntity.m_Index & ENT_ENTRY_MASK) | (iSerialNum << MAX_EDICT_BITS);
}
else EncodedEHandle = INVALID_NETWORKED_EHANDLE_VALUE;
buf->WriteLong(EncodedEHandle);
return 0;
}
int NekoBuf_WriteBool(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,TBOOLEAN);
buf->WriteOneBit(L->GetBool(2) ? 1 : 0);
return 0;
}
int NekoBuf_WriteUBitLong(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,NUMBER);
L->CheckType(3,NUMBER);
buf->WriteUBitLong(L->GetInteger(2),L->GetInteger(3));
return 0;
}
int NekoBuf_WriteSBitLong(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,NUMBER);
L->CheckType(3,NUMBER);
buf->WriteSBitLong(L->GetInteger(2),L->GetInteger(3));
return 0;
}
int NekoBuf_WriteBits(CLuaState* L)
{
bf_write* buf = NekoBuf_Check(L,1);
L->CheckType(2,STRING);
L->CheckType(3,NUMBER);
buf->WriteBits(L->GetString(2),L->GetInteger(3));
return 0;
}
#define REG_FUNC(n) \
L->PushCFunction(NekoBuf_##n); \
L->SetField(-2,#n)
void NekoBuf_Open(CLuaState* L)
{
L->CreateMetaTable(ud_name);
L->PushCFunction(NekoBuf_tostring);
L->SetField(-2,"__tostring");
L->PushCFunction(NekoBuf_eq);
L->SetField(-2,"__eq");
L->PushCFunction(NekoBuf_gc);
L->SetField(-2,"__gc");
REG_FUNC(WriteByte);
REG_FUNC(WriteChar);
REG_FUNC(WriteShort);
REG_FUNC(WriteWord);
REG_FUNC(WriteLong);
REG_FUNC(WriteFloat);
REG_FUNC(WriteAngle);
REG_FUNC(WriteAngles);
REG_FUNC(WriteCoord);
REG_FUNC(WriteVec3Coord);
REG_FUNC(WriteVec3Normal);
REG_FUNC(WriteString);
L->PushCFunction(NekoBuf_WriteShort);
L->SetField(-2,"WriteEntity");
REG_FUNC(WriteEHandle);
REG_FUNC(WriteBool);
REG_FUNC(WriteUBitLong);
REG_FUNC(WriteSBitLong);
REG_FUNC(WriteBits);
L->Push(-1);
L->SetField(-2,"__index");
}
void NekoBuf_Close(CLuaState* L)
{
}