716 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			716 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * vim: set ts=4 :
 | |
|  * =============================================================================
 | |
|  * SourceMod
 | |
|  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
 | |
|  * =============================================================================
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify it under
 | |
|  * the terms of the GNU General Public License, version 3.0, as published by the
 | |
|  * Free Software Foundation.
 | |
|  * 
 | |
|  * This program is distributed in the hope that it will be useful, but WITHOUT
 | |
|  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | |
|  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 | |
|  * details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License along with
 | |
|  * this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  * As a special exception, AlliedModders LLC gives you permission to link the
 | |
|  * code of this program (as well as its derivative works) to "Half-Life 2," the
 | |
|  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
 | |
|  * by the Valve Corporation.  You must obey the GNU General Public License in
 | |
|  * all respects for all other code used.  Additionally, AlliedModders LLC grants
 | |
|  * this exception to all derivative works.  AlliedModders LLC defines further
 | |
|  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
 | |
|  * or <http://www.sourcemod.net/license.php>.
 | |
|  *
 | |
|  * Version: $Id$
 | |
|  */
 | |
| 
 | |
| #include "sourcemod.h"
 | |
| #include "HandleSys.h"
 | |
| #include <bitbuf.h>
 | |
| #include <vector.h>
 | |
| #include <HalfLife2.h>
 | |
| 
 | |
| static cell_t smn_BfWriteBool(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	pBitBuf->WriteOneBit(params[2]);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteByte(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	pBitBuf->WriteByte(params[2]);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteChar(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	pBitBuf->WriteChar(params[2]);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteShort(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	pBitBuf->WriteShort(params[2]);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteWord(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	pBitBuf->WriteWord(params[2]);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteNum(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	pBitBuf->WriteLong(static_cast<long>(params[2]));
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteFloat(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	pBitBuf->WriteFloat(sp_ctof(params[2]));
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteString(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 	int err;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	char *str;
 | |
| 	if ((err=pCtx->LocalToString(params[2], &str)) != SP_ERROR_NONE)
 | |
| 	{
 | |
| 		pCtx->ThrowNativeErrorEx(err, NULL);
 | |
| 		return 0;
 | |
| 	}
 | |
| 
 | |
| 	pBitBuf->WriteString(str);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteEntity(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	int index = g_HL2.ReferenceToIndex(params[2]);
 | |
| 
 | |
| 	if (index == -1)
 | |
| 	{
 | |
| 		return 0;
 | |
| 	}
 | |
| 
 | |
| 	pBitBuf->WriteShort(index);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteAngle(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	pBitBuf->WriteBitAngle(sp_ctof(params[2]), params[3]);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteCoord(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	pBitBuf->WriteBitCoord(sp_ctof(params[2]));
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteVecCoord(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	cell_t *pVec;
 | |
| 	pCtx->LocalToPhysAddr(params[2], &pVec);
 | |
| 	Vector vec(sp_ctof(pVec[0]), sp_ctof(pVec[1]), sp_ctof(pVec[2]));
 | |
| 	pBitBuf->WriteBitVec3Coord(vec);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteVecNormal(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	cell_t *pVec;
 | |
| 	pCtx->LocalToPhysAddr(params[2], &pVec);
 | |
| 	Vector vec(sp_ctof(pVec[0]), sp_ctof(pVec[1]), sp_ctof(pVec[2]));
 | |
| 	pBitBuf->WriteBitVec3Normal(vec);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfWriteAngles(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_write *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	cell_t *pAng;
 | |
| 	pCtx->LocalToPhysAddr(params[2], &pAng);
 | |
| 	QAngle ang(sp_ctof(pAng[0]), sp_ctof(pAng[1]), sp_ctof(pAng[2]));
 | |
| 	pBitBuf->WriteBitAngles(ang);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadBool(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	return pBitBuf->ReadOneBit() ? 1 : 0;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadByte(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	return pBitBuf->ReadByte();
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadChar(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	return pBitBuf->ReadChar();
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadShort(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	return pBitBuf->ReadShort();
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadWord(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	return pBitBuf->ReadWord();
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadNum(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	return static_cast<cell_t>(pBitBuf->ReadLong());
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadFloat(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	return sp_ftoc(pBitBuf->ReadFloat());
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadString(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 	int numChars = 0;
 | |
| 	char *buf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	pCtx->LocalToPhysAddr(params[2], (cell_t **)&buf);
 | |
| 	pBitBuf->ReadString(buf, params[3], params[4] ? true : false, &numChars);
 | |
| 
 | |
| 	if (pBitBuf->IsOverflowed())
 | |
| 	{
 | |
| 		return -numChars - 1;
 | |
| 	}
 | |
| 
 | |
| 	return numChars;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadEntity(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	int ref = g_HL2.IndexToReference(pBitBuf->ReadShort());
 | |
| 
 | |
| 	return g_HL2.ReferenceToBCompatRef(ref);
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadAngle(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	return sp_ftoc(pBitBuf->ReadBitAngle(params[2]));
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadCoord(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	return sp_ftoc(pBitBuf->ReadBitCoord());
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadVecCoord(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	cell_t *pVec;
 | |
| 	pCtx->LocalToPhysAddr(params[2], &pVec);
 | |
| 
 | |
| 	Vector vec;
 | |
| 	pBitBuf->ReadBitVec3Coord(vec);
 | |
| 
 | |
| 	pVec[0] = sp_ftoc(vec.x);
 | |
| 	pVec[1] = sp_ftoc(vec.y);
 | |
| 	pVec[2] = sp_ftoc(vec.z);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadVecNormal(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	cell_t *pVec;
 | |
| 	pCtx->LocalToPhysAddr(params[2], &pVec);
 | |
| 
 | |
| 	Vector vec;
 | |
| 	pBitBuf->ReadBitVec3Normal(vec);
 | |
| 
 | |
| 	pVec[0] = sp_ftoc(vec.x);
 | |
| 	pVec[1] = sp_ftoc(vec.y);
 | |
| 	pVec[2] = sp_ftoc(vec.z);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfReadAngles(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	cell_t *pAng;
 | |
| 	pCtx->LocalToPhysAddr(params[2], &pAng);
 | |
| 
 | |
| 	QAngle ang;
 | |
| 	pBitBuf->ReadBitAngles(ang);
 | |
| 
 | |
| 	pAng[0] = sp_ftoc(ang.x);
 | |
| 	pAng[1] = sp_ftoc(ang.y);
 | |
| 	pAng[2] = sp_ftoc(ang.z);
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| static cell_t smn_BfGetNumBytesLeft(IPluginContext *pCtx, const cell_t *params)
 | |
| {
 | |
| 	Handle_t hndl = static_cast<Handle_t>(params[1]);
 | |
| 	HandleError herr;
 | |
| 	HandleSecurity sec;
 | |
| 	bf_read *pBitBuf;
 | |
| 
 | |
| 	sec.pOwner = NULL;
 | |
| 	sec.pIdentity = g_pCoreIdent;
 | |
| 
 | |
| 	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
 | |
| 		!= HandleError_None)
 | |
| 	{
 | |
| 		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
 | |
| 	}
 | |
| 
 | |
| 	return pBitBuf->GetNumBitsLeft() >> 3;
 | |
| }
 | |
| 
 | |
| REGISTER_NATIVES(bitbufnatives)
 | |
| {
 | |
| 	{"BfWriteBool",				smn_BfWriteBool},
 | |
| 	{"BfWriteByte",				smn_BfWriteByte},
 | |
| 	{"BfWriteChar",				smn_BfWriteChar},
 | |
| 	{"BfWriteShort",			smn_BfWriteShort},
 | |
| 	{"BfWriteWord",				smn_BfWriteWord},
 | |
| 	{"BfWriteNum",				smn_BfWriteNum},
 | |
| 	{"BfWriteFloat",			smn_BfWriteFloat},
 | |
| 	{"BfWriteString",			smn_BfWriteString},
 | |
| 	{"BfWriteEntity",			smn_BfWriteEntity},
 | |
| 	{"BfWriteAngle",			smn_BfWriteAngle},
 | |
| 	{"BfWriteCoord",			smn_BfWriteCoord},
 | |
| 	{"BfWriteVecCoord",			smn_BfWriteVecCoord},
 | |
| 	{"BfWriteVecNormal",		smn_BfWriteVecNormal},
 | |
| 	{"BfWriteAngles",			smn_BfWriteAngles},
 | |
| 	{"BfReadBool",				smn_BfReadBool},
 | |
| 	{"BfReadByte",				smn_BfReadByte},
 | |
| 	{"BfReadChar",				smn_BfReadChar},
 | |
| 	{"BfReadShort",				smn_BfReadShort},
 | |
| 	{"BfReadWord",				smn_BfReadWord},
 | |
| 	{"BfReadNum",				smn_BfReadNum},
 | |
| 	{"BfReadFloat",				smn_BfReadFloat},
 | |
| 	{"BfReadString",			smn_BfReadString},
 | |
| 	{"BfReadEntity",			smn_BfReadEntity},
 | |
| 	{"BfReadAngle",				smn_BfReadAngle},
 | |
| 	{"BfReadCoord",				smn_BfReadCoord},
 | |
| 	{"BfReadVecCoord",			smn_BfReadVecCoord},
 | |
| 	{"BfReadVecNormal",			smn_BfReadVecNormal},
 | |
| 	{"BfReadAngles",			smn_BfReadAngles},
 | |
| 	{"BfGetNumBytesLeft",		smn_BfGetNumBytesLeft},
 | |
| 	{NULL,						NULL}
 | |
| };
 |