core/smn_bitbuffer.cpp
author Scott Ehlert <ds@alliedmods.net>
Wed Aug 15 06:19:30 2007 +0000 (2007-08-15)
changeset 1330 ab94316bb52b
parent 1231 17badaf66ce4
child 1750 0f73390b01be
permissions -rw-r--r--
Updated license headers on virtually all files with extremely minor changes in the name of some sort of strange consistency.
All plugin and include file headers also have been changed to say about GPL3 instead of GPL2.

(This day shall henceforth be known as the Eighty Column Massacre of '07)
faluco@505
     1
/**
dvander@600
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1231
     4
 * SourceMod
dvander@1231
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
dvander@600
     7
 *
ds@1330
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    10
 * Free Software Foundation.
dvander@1231
    11
 * 
ds@1330
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    15
 * details.
dvander@1231
    16
 *
ds@1330
    17
 * You should have received a copy of the GNU General Public License along with
ds@1330
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1231
    19
 *
ds@1330
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@600
    28
 *
dvander@600
    29
 * Version: $Id$
dvander@600
    30
 */
faluco@505
    31
ds@511
    32
#include "sourcemod.h"
ds@511
    33
#include "HandleSys.h"
faluco@505
    34
#include <bitbuf.h>
faluco@505
    35
#include <vector.h>
faluco@505
    36
faluco@505
    37
static cell_t smn_BfWriteBool(IPluginContext *pCtx, const cell_t *params)
faluco@505
    38
{
faluco@505
    39
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
    40
	HandleError herr;
faluco@505
    41
	HandleSecurity sec;
faluco@505
    42
	bf_write *pBitBuf;
faluco@505
    43
faluco@505
    44
	sec.pOwner = NULL;
faluco@505
    45
	sec.pIdentity = g_pCoreIdent;
faluco@505
    46
faluco@505
    47
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
    48
		!= HandleError_None)
faluco@505
    49
	{
faluco@505
    50
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
    51
	}
faluco@505
    52
faluco@505
    53
	pBitBuf->WriteOneBit(params[2]);
faluco@505
    54
faluco@505
    55
	return 1;
faluco@505
    56
}
faluco@505
    57
faluco@505
    58
static cell_t smn_BfWriteByte(IPluginContext *pCtx, const cell_t *params)
faluco@505
    59
{
faluco@505
    60
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
    61
	HandleError herr;
faluco@505
    62
	HandleSecurity sec;
faluco@505
    63
	bf_write *pBitBuf;
faluco@505
    64
faluco@505
    65
	sec.pOwner = NULL;
faluco@505
    66
	sec.pIdentity = g_pCoreIdent;
faluco@505
    67
faluco@505
    68
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
    69
		!= HandleError_None)
faluco@505
    70
	{
faluco@505
    71
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
    72
	}
faluco@505
    73
faluco@505
    74
	pBitBuf->WriteByte(params[2]);
faluco@505
    75
faluco@505
    76
	return 1;
faluco@505
    77
}
faluco@505
    78
faluco@505
    79
static cell_t smn_BfWriteChar(IPluginContext *pCtx, const cell_t *params)
faluco@505
    80
{
faluco@505
    81
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
    82
	HandleError herr;
faluco@505
    83
	HandleSecurity sec;
faluco@505
    84
	bf_write *pBitBuf;
faluco@505
    85
faluco@505
    86
	sec.pOwner = NULL;
faluco@505
    87
	sec.pIdentity = g_pCoreIdent;
faluco@505
    88
faluco@505
    89
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
    90
		!= HandleError_None)
faluco@505
    91
	{
faluco@505
    92
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
    93
	}
faluco@505
    94
faluco@505
    95
	pBitBuf->WriteChar(params[2]);
faluco@505
    96
faluco@505
    97
	return 1;
faluco@505
    98
}
faluco@505
    99
faluco@505
   100
static cell_t smn_BfWriteShort(IPluginContext *pCtx, const cell_t *params)
faluco@505
   101
{
faluco@505
   102
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
   103
	HandleError herr;
faluco@505
   104
	HandleSecurity sec;
faluco@505
   105
	bf_write *pBitBuf;
faluco@505
   106
faluco@505
   107
	sec.pOwner = NULL;
faluco@505
   108
	sec.pIdentity = g_pCoreIdent;
faluco@505
   109
faluco@505
   110
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
   111
		!= HandleError_None)
faluco@505
   112
	{
faluco@505
   113
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
   114
	}
faluco@505
   115
faluco@505
   116
	pBitBuf->WriteShort(params[2]);
faluco@505
   117
faluco@505
   118
	return 1;
faluco@505
   119
}
faluco@505
   120
faluco@505
   121
static cell_t smn_BfWriteWord(IPluginContext *pCtx, const cell_t *params)
faluco@505
   122
{
faluco@505
   123
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
   124
	HandleError herr;
faluco@505
   125
	HandleSecurity sec;
faluco@505
   126
	bf_write *pBitBuf;
faluco@505
   127
faluco@505
   128
	sec.pOwner = NULL;
faluco@505
   129
	sec.pIdentity = g_pCoreIdent;
faluco@505
   130
faluco@505
   131
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
   132
		!= HandleError_None)
faluco@505
   133
	{
faluco@505
   134
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
   135
	}
faluco@505
   136
faluco@505
   137
	pBitBuf->WriteWord(params[2]);
faluco@505
   138
faluco@505
   139
	return 1;
faluco@505
   140
}
faluco@505
   141
faluco@505
   142
static cell_t smn_BfWriteNum(IPluginContext *pCtx, const cell_t *params)
faluco@505
   143
{
faluco@505
   144
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
   145
	HandleError herr;
faluco@505
   146
	HandleSecurity sec;
faluco@505
   147
	bf_write *pBitBuf;
faluco@505
   148
faluco@505
   149
	sec.pOwner = NULL;
faluco@505
   150
	sec.pIdentity = g_pCoreIdent;
faluco@505
   151
faluco@505
   152
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
   153
		!= HandleError_None)
faluco@505
   154
	{
faluco@505
   155
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
   156
	}
faluco@505
   157
faluco@505
   158
	pBitBuf->WriteLong(static_cast<long>(params[2]));
faluco@505
   159
faluco@505
   160
	return 1;
faluco@505
   161
}
faluco@505
   162
faluco@505
   163
static cell_t smn_BfWriteFloat(IPluginContext *pCtx, const cell_t *params)
faluco@505
   164
{
faluco@505
   165
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
   166
	HandleError herr;
faluco@505
   167
	HandleSecurity sec;
faluco@505
   168
	bf_write *pBitBuf;
faluco@505
   169
faluco@505
   170
	sec.pOwner = NULL;
faluco@505
   171
	sec.pIdentity = g_pCoreIdent;
faluco@505
   172
faluco@505
   173
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
   174
		!= HandleError_None)
faluco@505
   175
	{
faluco@505
   176
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
   177
	}
faluco@505
   178
faluco@505
   179
	pBitBuf->WriteFloat(sp_ctof(params[2]));
faluco@505
   180
faluco@505
   181
	return 1;
faluco@505
   182
}
faluco@505
   183
faluco@505
   184
static cell_t smn_BfWriteString(IPluginContext *pCtx, const cell_t *params)
faluco@505
   185
{
faluco@505
   186
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
   187
	HandleError herr;
faluco@505
   188
	HandleSecurity sec;
faluco@505
   189
	bf_write *pBitBuf;
faluco@505
   190
	int err;
faluco@505
   191
faluco@505
   192
	sec.pOwner = NULL;
faluco@505
   193
	sec.pIdentity = g_pCoreIdent;
faluco@505
   194
faluco@505
   195
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
   196
		!= HandleError_None)
faluco@505
   197
	{
faluco@505
   198
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
   199
	}
faluco@505
   200
faluco@505
   201
	char *str;
faluco@505
   202
	if ((err=pCtx->LocalToString(params[2], &str)) != SP_ERROR_NONE)
faluco@505
   203
	{
faluco@505
   204
		pCtx->ThrowNativeErrorEx(err, NULL);
faluco@505
   205
		return 0;
faluco@505
   206
	}
faluco@505
   207
faluco@505
   208
	pBitBuf->WriteString(str);
faluco@505
   209
faluco@505
   210
	return 1;
faluco@505
   211
}
faluco@505
   212
faluco@505
   213
static cell_t smn_BfWriteEntity(IPluginContext *pCtx, const cell_t *params)
faluco@505
   214
{
faluco@505
   215
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
   216
	HandleError herr;
faluco@505
   217
	HandleSecurity sec;
faluco@505
   218
	bf_write *pBitBuf;
faluco@505
   219
faluco@505
   220
	sec.pOwner = NULL;
faluco@505
   221
	sec.pIdentity = g_pCoreIdent;
faluco@505
   222
faluco@505
   223
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
   224
		!= HandleError_None)
faluco@505
   225
	{
faluco@505
   226
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
   227
	}
faluco@505
   228
faluco@505
   229
	pBitBuf->WriteShort(params[2]);
faluco@505
   230
faluco@505
   231
	return 1;
faluco@505
   232
}
faluco@505
   233
faluco@505
   234
static cell_t smn_BfWriteAngle(IPluginContext *pCtx, const cell_t *params)
faluco@505
   235
{
faluco@505
   236
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
   237
	HandleError herr;
faluco@505
   238
	HandleSecurity sec;
faluco@505
   239
	bf_write *pBitBuf;
faluco@505
   240
faluco@505
   241
	sec.pOwner = NULL;
faluco@505
   242
	sec.pIdentity = g_pCoreIdent;
faluco@505
   243
faluco@505
   244
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
   245
		!= HandleError_None)
faluco@505
   246
	{
faluco@505
   247
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
   248
	}
faluco@505
   249
faluco@505
   250
	pBitBuf->WriteBitAngle(sp_ctof(params[2]), params[3]);
faluco@505
   251
faluco@505
   252
	return 1;
faluco@505
   253
}
faluco@505
   254
faluco@505
   255
static cell_t smn_BfWriteCoord(IPluginContext *pCtx, const cell_t *params)
faluco@505
   256
{
faluco@505
   257
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
   258
	HandleError herr;
faluco@505
   259
	HandleSecurity sec;
faluco@505
   260
	bf_write *pBitBuf;
faluco@505
   261
faluco@505
   262
	sec.pOwner = NULL;
faluco@505
   263
	sec.pIdentity = g_pCoreIdent;
faluco@505
   264
faluco@505
   265
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
   266
		!= HandleError_None)
faluco@505
   267
	{
faluco@505
   268
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
   269
	}
faluco@505
   270
faluco@505
   271
	pBitBuf->WriteBitCoord(sp_ctof(params[2]));
faluco@505
   272
faluco@505
   273
	return 1;
faluco@505
   274
}
faluco@505
   275
faluco@505
   276
static cell_t smn_BfWriteVecCoord(IPluginContext *pCtx, const cell_t *params)
faluco@505
   277
{
faluco@505
   278
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
   279
	HandleError herr;
faluco@505
   280
	HandleSecurity sec;
faluco@505
   281
	bf_write *pBitBuf;
faluco@505
   282
faluco@505
   283
	sec.pOwner = NULL;
faluco@505
   284
	sec.pIdentity = g_pCoreIdent;
faluco@505
   285
faluco@505
   286
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
   287
		!= HandleError_None)
faluco@505
   288
	{
faluco@505
   289
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
   290
	}
faluco@505
   291
faluco@505
   292
	cell_t *pVec;
faluco@505
   293
	pCtx->LocalToPhysAddr(params[2], &pVec);
faluco@505
   294
	Vector vec(sp_ctof(pVec[0]), sp_ctof(pVec[1]), sp_ctof(pVec[2]));
faluco@505
   295
	pBitBuf->WriteBitVec3Coord(vec);
faluco@505
   296
faluco@505
   297
	return 1;
faluco@505
   298
}
faluco@505
   299
faluco@505
   300
static cell_t smn_BfWriteVecNormal(IPluginContext *pCtx, const cell_t *params)
faluco@505
   301
{
faluco@505
   302
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
   303
	HandleError herr;
faluco@505
   304
	HandleSecurity sec;
faluco@505
   305
	bf_write *pBitBuf;
faluco@505
   306
faluco@505
   307
	sec.pOwner = NULL;
faluco@505
   308
	sec.pIdentity = g_pCoreIdent;
faluco@505
   309
faluco@505
   310
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
   311
		!= HandleError_None)
faluco@505
   312
	{
faluco@505
   313
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
   314
	}
faluco@505
   315
faluco@505
   316
	cell_t *pVec;
faluco@505
   317
	pCtx->LocalToPhysAddr(params[2], &pVec);
faluco@505
   318
	Vector vec(sp_ctof(pVec[0]), sp_ctof(pVec[1]), sp_ctof(pVec[2]));
faluco@505
   319
	pBitBuf->WriteBitVec3Normal(vec);
faluco@505
   320
faluco@505
   321
	return 1;
faluco@505
   322
}
faluco@505
   323
faluco@505
   324
static cell_t smn_BfWriteAngles(IPluginContext *pCtx, const cell_t *params)
faluco@505
   325
{
faluco@505
   326
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@505
   327
	HandleError herr;
faluco@505
   328
	HandleSecurity sec;
faluco@505
   329
	bf_write *pBitBuf;
faluco@505
   330
faluco@505
   331
	sec.pOwner = NULL;
faluco@505
   332
	sec.pIdentity = g_pCoreIdent;
faluco@505
   333
faluco@505
   334
	if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
faluco@505
   335
		!= HandleError_None)
faluco@505
   336
	{
faluco@505
   337
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@505
   338
	}
faluco@505
   339
faluco@505
   340
	cell_t *pAng;
faluco@505
   341
	pCtx->LocalToPhysAddr(params[2], &pAng);
faluco@505
   342
	QAngle ang(sp_ctof(pAng[0]), sp_ctof(pAng[1]), sp_ctof(pAng[2]));
faluco@505
   343
	pBitBuf->WriteBitAngles(ang);
faluco@505
   344
faluco@505
   345
	return 1;
faluco@505
   346
}
faluco@505
   347
faluco@598
   348
static cell_t smn_BfReadBool(IPluginContext *pCtx, const cell_t *params)
faluco@598
   349
{
faluco@598
   350
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   351
	HandleError herr;
faluco@598
   352
	HandleSecurity sec;
faluco@598
   353
	bf_read *pBitBuf;
faluco@598
   354
faluco@598
   355
	sec.pOwner = NULL;
faluco@598
   356
	sec.pIdentity = g_pCoreIdent;
faluco@598
   357
faluco@598
   358
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   359
		!= HandleError_None)
faluco@598
   360
	{
faluco@598
   361
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   362
	}
faluco@598
   363
faluco@598
   364
	return pBitBuf->ReadOneBit() ? 1 : 0;
faluco@598
   365
}
faluco@598
   366
faluco@598
   367
static cell_t smn_BfReadByte(IPluginContext *pCtx, const cell_t *params)
faluco@598
   368
{
faluco@598
   369
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   370
	HandleError herr;
faluco@598
   371
	HandleSecurity sec;
faluco@598
   372
	bf_read *pBitBuf;
faluco@598
   373
faluco@598
   374
	sec.pOwner = NULL;
faluco@598
   375
	sec.pIdentity = g_pCoreIdent;
faluco@598
   376
faluco@598
   377
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   378
		!= HandleError_None)
faluco@598
   379
	{
faluco@598
   380
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   381
	}
faluco@598
   382
faluco@598
   383
	return pBitBuf->ReadByte();
faluco@598
   384
}
faluco@598
   385
faluco@598
   386
static cell_t smn_BfReadChar(IPluginContext *pCtx, const cell_t *params)
faluco@598
   387
{
faluco@598
   388
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   389
	HandleError herr;
faluco@598
   390
	HandleSecurity sec;
faluco@598
   391
	bf_read *pBitBuf;
faluco@598
   392
faluco@598
   393
	sec.pOwner = NULL;
faluco@598
   394
	sec.pIdentity = g_pCoreIdent;
faluco@598
   395
faluco@598
   396
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   397
		!= HandleError_None)
faluco@598
   398
	{
faluco@598
   399
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   400
	}
faluco@598
   401
faluco@598
   402
	return pBitBuf->ReadChar();
faluco@598
   403
}
faluco@598
   404
faluco@598
   405
static cell_t smn_BfReadShort(IPluginContext *pCtx, const cell_t *params)
faluco@598
   406
{
faluco@598
   407
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   408
	HandleError herr;
faluco@598
   409
	HandleSecurity sec;
faluco@598
   410
	bf_read *pBitBuf;
faluco@598
   411
faluco@598
   412
	sec.pOwner = NULL;
faluco@598
   413
	sec.pIdentity = g_pCoreIdent;
faluco@598
   414
faluco@598
   415
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   416
		!= HandleError_None)
faluco@598
   417
	{
faluco@598
   418
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   419
	}
faluco@598
   420
faluco@598
   421
	return pBitBuf->ReadShort();
faluco@598
   422
}
faluco@598
   423
faluco@598
   424
static cell_t smn_BfReadWord(IPluginContext *pCtx, const cell_t *params)
faluco@598
   425
{
faluco@598
   426
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   427
	HandleError herr;
faluco@598
   428
	HandleSecurity sec;
faluco@598
   429
	bf_read *pBitBuf;
faluco@598
   430
faluco@598
   431
	sec.pOwner = NULL;
faluco@598
   432
	sec.pIdentity = g_pCoreIdent;
faluco@598
   433
faluco@598
   434
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   435
		!= HandleError_None)
faluco@598
   436
	{
faluco@598
   437
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   438
	}
faluco@598
   439
faluco@598
   440
	return pBitBuf->ReadWord();
faluco@598
   441
}
faluco@598
   442
faluco@598
   443
static cell_t smn_BfReadNum(IPluginContext *pCtx, const cell_t *params)
faluco@598
   444
{
faluco@598
   445
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   446
	HandleError herr;
faluco@598
   447
	HandleSecurity sec;
faluco@598
   448
	bf_read *pBitBuf;
faluco@598
   449
faluco@598
   450
	sec.pOwner = NULL;
faluco@598
   451
	sec.pIdentity = g_pCoreIdent;
faluco@598
   452
faluco@598
   453
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   454
		!= HandleError_None)
faluco@598
   455
	{
faluco@598
   456
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   457
	}
faluco@598
   458
faluco@598
   459
	return static_cast<cell_t>(pBitBuf->ReadLong());
faluco@598
   460
}
faluco@598
   461
faluco@598
   462
static cell_t smn_BfReadFloat(IPluginContext *pCtx, const cell_t *params)
faluco@598
   463
{
faluco@598
   464
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   465
	HandleError herr;
faluco@598
   466
	HandleSecurity sec;
faluco@598
   467
	bf_read *pBitBuf;
faluco@598
   468
faluco@598
   469
	sec.pOwner = NULL;
faluco@598
   470
	sec.pIdentity = g_pCoreIdent;
faluco@598
   471
faluco@598
   472
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   473
		!= HandleError_None)
faluco@598
   474
	{
faluco@598
   475
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   476
	}
faluco@598
   477
faluco@598
   478
	return sp_ftoc(pBitBuf->ReadFloat());
faluco@598
   479
}
faluco@598
   480
faluco@598
   481
static cell_t smn_BfReadString(IPluginContext *pCtx, const cell_t *params)
faluco@598
   482
{
faluco@598
   483
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   484
	HandleError herr;
faluco@598
   485
	HandleSecurity sec;
faluco@598
   486
	bf_read *pBitBuf;
faluco@598
   487
	char *buf;
faluco@598
   488
faluco@598
   489
	sec.pOwner = NULL;
faluco@598
   490
	sec.pIdentity = g_pCoreIdent;
faluco@598
   491
faluco@598
   492
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   493
		!= HandleError_None)
faluco@598
   494
	{
faluco@598
   495
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   496
	}
faluco@598
   497
faluco@598
   498
	pCtx->LocalToPhysAddr(params[2], (cell_t **)&buf);
faluco@598
   499
	if (!pBitBuf->ReadString(buf, params[3], params[4] ? true : false))
faluco@598
   500
	{
faluco@598
   501
		return pCtx->ThrowNativeError("Destination string buffer is too short, try increasing its size");
faluco@598
   502
	}
faluco@598
   503
faluco@598
   504
	return 1;
faluco@598
   505
}
faluco@598
   506
faluco@598
   507
static cell_t smn_BfReadEntity(IPluginContext *pCtx, const cell_t *params)
faluco@598
   508
{
faluco@598
   509
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   510
	HandleError herr;
faluco@598
   511
	HandleSecurity sec;
faluco@598
   512
	bf_read *pBitBuf;
faluco@598
   513
faluco@598
   514
	sec.pOwner = NULL;
faluco@598
   515
	sec.pIdentity = g_pCoreIdent;
faluco@598
   516
faluco@598
   517
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   518
		!= HandleError_None)
faluco@598
   519
	{
faluco@598
   520
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   521
	}
faluco@598
   522
faluco@598
   523
	return pBitBuf->ReadShort();
faluco@598
   524
}
faluco@598
   525
faluco@598
   526
static cell_t smn_BfReadAngle(IPluginContext *pCtx, const cell_t *params)
faluco@598
   527
{
faluco@598
   528
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   529
	HandleError herr;
faluco@598
   530
	HandleSecurity sec;
faluco@598
   531
	bf_read *pBitBuf;
faluco@598
   532
faluco@598
   533
	sec.pOwner = NULL;
faluco@598
   534
	sec.pIdentity = g_pCoreIdent;
faluco@598
   535
faluco@598
   536
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   537
		!= HandleError_None)
faluco@598
   538
	{
faluco@598
   539
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   540
	}
faluco@598
   541
faluco@598
   542
	return sp_ftoc(pBitBuf->ReadBitAngle(params[2]));
faluco@598
   543
}
faluco@598
   544
faluco@598
   545
static cell_t smn_BfReadCoord(IPluginContext *pCtx, const cell_t *params)
faluco@598
   546
{
faluco@598
   547
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   548
	HandleError herr;
faluco@598
   549
	HandleSecurity sec;
faluco@598
   550
	bf_read *pBitBuf;
faluco@598
   551
faluco@598
   552
	sec.pOwner = NULL;
faluco@598
   553
	sec.pIdentity = g_pCoreIdent;
faluco@598
   554
faluco@598
   555
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   556
		!= HandleError_None)
faluco@598
   557
	{
faluco@598
   558
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   559
	}
faluco@598
   560
faluco@598
   561
	return sp_ftoc(pBitBuf->ReadBitCoord());
faluco@598
   562
}
faluco@598
   563
faluco@598
   564
static cell_t smn_BfReadVecCoord(IPluginContext *pCtx, const cell_t *params)
faluco@598
   565
{
faluco@598
   566
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   567
	HandleError herr;
faluco@598
   568
	HandleSecurity sec;
faluco@598
   569
	bf_read *pBitBuf;
faluco@598
   570
faluco@598
   571
	sec.pOwner = NULL;
faluco@598
   572
	sec.pIdentity = g_pCoreIdent;
faluco@598
   573
faluco@598
   574
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   575
		!= HandleError_None)
faluco@598
   576
	{
faluco@598
   577
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   578
	}
faluco@598
   579
faluco@598
   580
	cell_t *pVec;
faluco@598
   581
	pCtx->LocalToPhysAddr(params[2], &pVec);
faluco@598
   582
faluco@598
   583
	Vector vec;
faluco@598
   584
	pBitBuf->ReadBitVec3Coord(vec);
faluco@598
   585
faluco@598
   586
	pVec[0] = sp_ftoc(vec.x);
faluco@598
   587
	pVec[1] = sp_ftoc(vec.y);
faluco@598
   588
	pVec[2] = sp_ftoc(vec.z);
faluco@598
   589
faluco@598
   590
	return 1;
faluco@598
   591
}
faluco@598
   592
faluco@598
   593
static cell_t smn_BfReadVecNormal(IPluginContext *pCtx, const cell_t *params)
faluco@598
   594
{
faluco@598
   595
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   596
	HandleError herr;
faluco@598
   597
	HandleSecurity sec;
faluco@598
   598
	bf_read *pBitBuf;
faluco@598
   599
faluco@598
   600
	sec.pOwner = NULL;
faluco@598
   601
	sec.pIdentity = g_pCoreIdent;
faluco@598
   602
faluco@598
   603
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   604
		!= HandleError_None)
faluco@598
   605
	{
faluco@598
   606
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   607
	}
faluco@598
   608
faluco@598
   609
	cell_t *pVec;
faluco@598
   610
	pCtx->LocalToPhysAddr(params[2], &pVec);
faluco@598
   611
faluco@598
   612
	Vector vec;
faluco@598
   613
	pBitBuf->ReadBitVec3Normal(vec);
faluco@598
   614
faluco@598
   615
	pVec[0] = sp_ftoc(vec.x);
faluco@598
   616
	pVec[1] = sp_ftoc(vec.y);
faluco@598
   617
	pVec[2] = sp_ftoc(vec.z);
faluco@598
   618
faluco@598
   619
	return 1;
faluco@598
   620
}
faluco@598
   621
faluco@598
   622
static cell_t smn_BfReadAngles(IPluginContext *pCtx, const cell_t *params)
faluco@598
   623
{
faluco@598
   624
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@598
   625
	HandleError herr;
faluco@598
   626
	HandleSecurity sec;
faluco@598
   627
	bf_read *pBitBuf;
faluco@598
   628
faluco@598
   629
	sec.pOwner = NULL;
faluco@598
   630
	sec.pIdentity = g_pCoreIdent;
faluco@598
   631
faluco@598
   632
	if ((herr=g_HandleSys.ReadHandle(hndl, g_RdBitBufType, &sec, (void **)&pBitBuf))
faluco@598
   633
		!= HandleError_None)
faluco@598
   634
	{
faluco@598
   635
		return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
faluco@598
   636
	}
faluco@598
   637
faluco@598
   638
	cell_t *pAng;
faluco@598
   639
	pCtx->LocalToPhysAddr(params[2], &pAng);
faluco@598
   640
faluco@598
   641
	QAngle ang;
faluco@598
   642
	pBitBuf->ReadBitAngles(ang);
faluco@598
   643
faluco@598
   644
	pAng[0] = sp_ftoc(ang.x);
faluco@598
   645
	pAng[1] = sp_ftoc(ang.y);
faluco@598
   646
	pAng[2] = sp_ftoc(ang.z);
faluco@598
   647
faluco@598
   648
	return 1;
faluco@598
   649
}
faluco@598
   650
faluco@598
   651
REGISTER_NATIVES(bitbufnatives)
faluco@505
   652
{
faluco@505
   653
	{"BfWriteBool",				smn_BfWriteBool},
faluco@505
   654
	{"BfWriteByte",				smn_BfWriteByte},
faluco@505
   655
	{"BfWriteChar",				smn_BfWriteChar},
faluco@505
   656
	{"BfWriteShort",			smn_BfWriteShort},
faluco@505
   657
	{"BfWriteWord",				smn_BfWriteWord},
faluco@505
   658
	{"BfWriteNum",				smn_BfWriteNum},
faluco@505
   659
	{"BfWriteFloat",			smn_BfWriteFloat},
faluco@505
   660
	{"BfWriteString",			smn_BfWriteString},
faluco@505
   661
	{"BfWriteEntity",			smn_BfWriteEntity},
faluco@505
   662
	{"BfWriteAngle",			smn_BfWriteAngle},
faluco@505
   663
	{"BfWriteCoord",			smn_BfWriteCoord},
faluco@505
   664
	{"BfWriteVecCoord",			smn_BfWriteVecCoord},
faluco@505
   665
	{"BfWriteVecNormal",		smn_BfWriteVecNormal},
faluco@505
   666
	{"BfWriteAngles",			smn_BfWriteAngles},
faluco@598
   667
	{"BfReadBool",				smn_BfReadBool},
faluco@598
   668
	{"BfReadByte",				smn_BfReadByte},
faluco@598
   669
	{"BfReadChar",				smn_BfReadChar},
faluco@598
   670
	{"BfReadShort",				smn_BfReadShort},
faluco@598
   671
	{"BfReadWord",				smn_BfReadWord},
faluco@598
   672
	{"BfReadNum",				smn_BfReadNum},
faluco@598
   673
	{"BfReadFloat",				smn_BfReadFloat},
faluco@598
   674
	{"BfReadString",			smn_BfReadString},
faluco@598
   675
	{"BfReadEntity",			smn_BfReadEntity},
faluco@598
   676
	{"BfReadAngle",				smn_BfReadAngle},
faluco@598
   677
	{"BfReadCoord",				smn_BfReadCoord},
faluco@598
   678
	{"BfReadVecCoord",			smn_BfReadVecCoord},
faluco@598
   679
	{"BfReadVecNormal",			smn_BfReadVecNormal},
faluco@598
   680
	{"BfReadAngles",			smn_BfReadAngles},
faluco@505
   681
	{NULL,						NULL}
faluco@505
   682
};