skamonkey@3743: /** skamonkey@3743: * vim: set ts=4 : skamonkey@3743: * ============================================================================= skamonkey@3743: * SourceMod skamonkey@3743: * Copyright (C) 2013 AlliedModders LLC. All rights reserved. skamonkey@3743: * ============================================================================= skamonkey@3743: * skamonkey@3743: * This program is free software; you can redistribute it and/or modify it under skamonkey@3743: * the terms of the GNU General Public License, version 3.0, as published by the skamonkey@3743: * Free Software Foundation. skamonkey@3743: * skamonkey@3743: * This program is distributed in the hope that it will be useful, but WITHOUT skamonkey@3743: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS skamonkey@3743: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more skamonkey@3743: * details. skamonkey@3743: * skamonkey@3743: * You should have received a copy of the GNU General Public License along with skamonkey@3743: * this program. If not, see . skamonkey@3743: * skamonkey@3743: * As a special exception, AlliedModders LLC gives you permission to link the skamonkey@3743: * code of this program (as well as its derivative works) to "Half-Life 2," the skamonkey@3743: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software skamonkey@3743: * by the Valve Corporation. You must obey the GNU General Public License in skamonkey@3743: * all respects for all other code used. Additionally, AlliedModders LLC grants skamonkey@3743: * this exception to all derivative works. AlliedModders LLC defines further skamonkey@3743: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), skamonkey@3743: * or . skamonkey@3743: * skamonkey@3743: * Version: $Id$ skamonkey@3743: */ skamonkey@3743: dvander@3875: #include "logic_bridge.h" skamonkey@3895: #include "UserMessages.h" skamonkey@3743: #include "UserMessagePBHelpers.h" skamonkey@3743: #include "smn_usermsgs.h" skamonkey@3743: skamonkey@3743: // Assumes pbuf message handle is param 1, gets message as msg skamonkey@3743: #define GET_MSG_FROM_HANDLE_OR_ERR() \ skamonkey@3743: Handle_t hndl = static_cast(params[1]); \ skamonkey@3743: HandleError herr; \ skamonkey@3743: HandleSecurity sec; \ skamonkey@3743: SMProtobufMessage *msg; \ skamonkey@3743: \ skamonkey@3743: sec.pOwner = NULL; \ skamonkey@3743: sec.pIdentity = g_pCoreIdent; \ skamonkey@3743: \ dvander@3872: if ((herr=handlesys->ReadHandle(hndl, g_ProtobufType, &sec, (void **)&msg)) \ skamonkey@3743: != HandleError_None) \ skamonkey@3743: { \ skamonkey@3743: return pCtx->ThrowNativeError("Invalid protobuf message handle %x (error %d)", hndl, herr); \ skamonkey@3743: } skamonkey@3743: skamonkey@3743: // Assumes message field name is param 2, gets as strField skamonkey@3743: #define GET_FIELD_NAME_OR_ERR() \ skamonkey@3743: int err; \ skamonkey@3743: char *strField; \ skamonkey@3743: if ((err=pCtx->LocalToString(params[2], &strField)) != SP_ERROR_NONE) \ skamonkey@3743: { \ skamonkey@3743: pCtx->ThrowNativeErrorEx(err, NULL); \ skamonkey@3743: return 0; \ skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbReadInt(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: int ret; skamonkey@3813: skamonkey@3813: int index = params[0] >= 3 ? params[3] : -1; skamonkey@3813: if (index < 0) skamonkey@3743: { skamonkey@3896: if (!msg->GetInt32OrUnsignedOrEnum(strField, &ret)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3813: } skamonkey@3813: else skamonkey@3813: { skamonkey@3896: if (!msg->GetRepeatedInt32OrUnsignedOrEnum(strField, index, &ret)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return ret; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbReadFloat(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: float ret; skamonkey@3813: skamonkey@3813: int index = params[0] >= 3 ? params[3] : -1; skamonkey@3813: if (index < 0) skamonkey@3743: { skamonkey@3813: if (!msg->GetFloatOrDouble(strField, &ret)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3813: } skamonkey@3813: else skamonkey@3813: { skamonkey@3813: if (!msg->GetRepeatedFloatOrDouble(strField, index, &ret)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return sp_ftoc(ret); skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbReadBool(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: bool ret; skamonkey@3813: skamonkey@3813: int index = params[0] >= 3 ? params[3] : -1; skamonkey@3813: if (index < 0) skamonkey@3743: { skamonkey@3813: if (!msg->GetBool(strField, &ret)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3813: } skamonkey@3813: else skamonkey@3813: { skamonkey@3813: if (!msg->GetRepeatedBool(strField, index, &ret)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return ret ? 1 : 0; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbReadString(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: char *buf; skamonkey@3743: pCtx->LocalToPhysAddr(params[3], (cell_t **)&buf); skamonkey@3743: skamonkey@3813: int index = params[0] >= 5 ? params[5] : -1; skamonkey@3813: skamonkey@3813: if (index < 0) skamonkey@3743: { skamonkey@3813: if (!msg->GetString(strField, buf, params[4])) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3813: } skamonkey@3813: else skamonkey@3813: { skamonkey@3813: if (!msg->GetRepeatedString(strField, index, buf, params[4])) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbReadColor(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *out; skamonkey@3743: pCtx->LocalToPhysAddr(params[3], &out); skamonkey@3743: skamonkey@3743: Color clr; skamonkey@3813: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3813: if (index < 0) skamonkey@3743: { skamonkey@3813: if (!msg->GetColor(strField, &clr)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3813: } skamonkey@3813: else skamonkey@3813: { skamonkey@3813: if (!msg->GetRepeatedColor(strField, index, &clr)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: out[0] = clr.r(); skamonkey@3743: out[1] = clr.g(); skamonkey@3743: out[2] = clr.b(); skamonkey@3743: out[3] = clr.a(); skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbReadAngle(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *out; skamonkey@3743: pCtx->LocalToPhysAddr(params[3], &out); skamonkey@3743: skamonkey@3743: QAngle ang; skamonkey@3813: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3813: if (index < 0) skamonkey@3743: { skamonkey@3813: if (!msg->GetQAngle(strField, &ang)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3813: } skamonkey@3813: else skamonkey@3813: { skamonkey@3813: if (!msg->GetRepeatedQAngle(strField, index, &ang)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: out[0] = sp_ftoc(ang.x); skamonkey@3743: out[1] = sp_ftoc(ang.y); skamonkey@3743: out[2] = sp_ftoc(ang.z); skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbReadVector(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *out; skamonkey@3743: pCtx->LocalToPhysAddr(params[3], &out); skamonkey@3743: skamonkey@3743: Vector vec; skamonkey@3813: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3813: if (index < 0) skamonkey@3743: { skamonkey@3813: if (!msg->GetVector(strField, &vec)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3813: } skamonkey@3813: else skamonkey@3813: { skamonkey@3813: if (!msg->GetRepeatedVector(strField, index, &vec)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: out[0] = sp_ftoc(vec.x); skamonkey@3743: out[1] = sp_ftoc(vec.y); skamonkey@3743: out[2] = sp_ftoc(vec.z); skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbReadVector2D(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *out; skamonkey@3743: pCtx->LocalToPhysAddr(params[3], &out); skamonkey@3743: skamonkey@3743: Vector2D vec; skamonkey@3813: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3813: if (index < 0) skamonkey@3743: { skamonkey@3813: if (!msg->GetVector2D(strField, &vec)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3813: } skamonkey@3813: else skamonkey@3813: { skamonkey@3813: if (!msg->GetRepeatedVector2D(strField, index, &vec)) skamonkey@3813: { skamonkey@3813: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3813: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: out[0] = sp_ftoc(vec.x); skamonkey@3743: out[1] = sp_ftoc(vec.y); skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbGetRepeatedFieldCount(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: int cnt = msg->GetRepeatedFieldCount(strField); skamonkey@3743: if (cnt == -1) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: skamonkey@3743: return cnt; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbSetInt(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3814: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3814: if (index < 0) skamonkey@3743: { skamonkey@3896: if (!msg->SetInt32OrUnsignedOrEnum(strField, params[3])) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3814: } skamonkey@3814: else skamonkey@3814: { skamonkey@3896: if (!msg->SetRepeatedInt32OrUnsignedOrEnum(strField, index, params[3])) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbSetFloat(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3814: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3814: if (index < 0) skamonkey@3743: { skamonkey@3814: if (!msg->SetFloatOrDouble(strField, sp_ctof(params[3]))) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3814: } skamonkey@3814: else skamonkey@3814: { skamonkey@3814: if (!msg->SetRepeatedFloatOrDouble(strField, index, sp_ctof(params[3]))) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbSetBool(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: bool value = (params[3] == 0 ? false : true); skamonkey@3814: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3814: if (index < 0) skamonkey@3743: { skamonkey@3814: if (!msg->SetBool(strField, value)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3814: } skamonkey@3814: else skamonkey@3814: { skamonkey@3814: if (!msg->SetRepeatedBool(strField, index, value)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbSetString(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: char *strValue; skamonkey@3743: if ((err=pCtx->LocalToString(params[3], &strValue)) != SP_ERROR_NONE) skamonkey@3743: { skamonkey@3743: pCtx->ThrowNativeErrorEx(err, NULL); skamonkey@3743: return 0; skamonkey@3743: } skamonkey@3743: skamonkey@3814: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3814: if (index < 0) skamonkey@3743: { skamonkey@3814: if (!msg->SetString(strField, strValue)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3814: } skamonkey@3814: else skamonkey@3814: { skamonkey@3814: if (!msg->SetRepeatedString(strField, index, strValue)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbSetColor(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *clrParams; skamonkey@3743: if ((err=pCtx->LocalToPhysAddr(params[3], &clrParams)) != SP_ERROR_NONE) skamonkey@3743: { skamonkey@3743: pCtx->ThrowNativeErrorEx(err, NULL); skamonkey@3743: return 0; skamonkey@3743: } skamonkey@3743: skamonkey@3743: Color clr( skamonkey@3743: clrParams[0], skamonkey@3743: clrParams[1], skamonkey@3743: clrParams[2], skamonkey@3743: clrParams[3]); skamonkey@3743: skamonkey@3814: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3814: if (index < 0) skamonkey@3743: { skamonkey@3814: if (!msg->SetColor(strField, clr)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3814: } skamonkey@3814: else skamonkey@3814: { skamonkey@3814: if (!msg->SetRepeatedColor(strField, index, clr)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbSetAngle(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *angParams; skamonkey@3743: if ((err=pCtx->LocalToPhysAddr(params[3], &angParams)) != SP_ERROR_NONE) skamonkey@3743: { skamonkey@3743: pCtx->ThrowNativeErrorEx(err, NULL); skamonkey@3743: return 0; skamonkey@3743: } skamonkey@3743: skamonkey@3743: QAngle ang( skamonkey@3743: sp_ctof(angParams[0]), skamonkey@3743: sp_ctof(angParams[1]), skamonkey@3743: sp_ctof(angParams[2])); skamonkey@3743: skamonkey@3814: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3814: if (index < 0) skamonkey@3743: { skamonkey@3814: if (!msg->SetQAngle(strField, ang)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3814: } skamonkey@3814: else skamonkey@3814: { skamonkey@3814: if (!msg->SetRepeatedQAngle(strField, index, ang)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbSetVector(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *vecParams; skamonkey@3743: if ((err=pCtx->LocalToPhysAddr(params[3], &vecParams)) != SP_ERROR_NONE) skamonkey@3743: { skamonkey@3743: pCtx->ThrowNativeErrorEx(err, NULL); skamonkey@3743: return 0; skamonkey@3743: } skamonkey@3743: skamonkey@3743: Vector vec( skamonkey@3743: sp_ctof(vecParams[0]), skamonkey@3743: sp_ctof(vecParams[1]), skamonkey@3743: sp_ctof(vecParams[2])); skamonkey@3743: skamonkey@3814: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3814: if (index < 0) skamonkey@3743: { skamonkey@3814: if (!msg->SetVector(strField, vec)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3814: } skamonkey@3814: else skamonkey@3814: { skamonkey@3814: if (!msg->SetRepeatedVector(strField, index, vec)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbSetVector2D(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *vecParams; skamonkey@3743: if ((err=pCtx->LocalToPhysAddr(params[3], &vecParams)) != SP_ERROR_NONE) skamonkey@3743: { skamonkey@3743: pCtx->ThrowNativeErrorEx(err, NULL); skamonkey@3743: return 0; skamonkey@3743: } skamonkey@3743: skamonkey@3743: Vector2D vec( skamonkey@3743: sp_ctof(vecParams[0]), skamonkey@3743: sp_ctof(vecParams[1])); skamonkey@3743: skamonkey@3814: int index = params[0] >= 4 ? params[4] : -1; skamonkey@3814: if (index < 0) skamonkey@3743: { skamonkey@3814: if (!msg->SetVector2D(strField, vec)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3814: } skamonkey@3814: else skamonkey@3814: { skamonkey@3814: if (!msg->SetRepeatedVector2D(strField, index, vec)) skamonkey@3814: { skamonkey@3814: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, index, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3814: } skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbAddInt(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3896: if (!msg->AddInt32OrUnsignedOrEnum(strField, params[3])) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbAddFloat(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: if (!msg->AddFloatOrDouble(strField, sp_ctof(params[3]))) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbAddBool(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: bool value = (params[3] == 0 ? false : true); skamonkey@3743: if (!msg->AddBool(strField, value)) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbAddString(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: char *strValue; skamonkey@3743: if ((err=pCtx->LocalToString(params[3], &strValue)) != SP_ERROR_NONE) skamonkey@3743: { skamonkey@3743: pCtx->ThrowNativeErrorEx(err, NULL); skamonkey@3743: return 0; skamonkey@3743: } skamonkey@3743: skamonkey@3743: if (!msg->AddString(strField, strValue)) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbAddColor(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *clrParams; skamonkey@3743: if ((err=pCtx->LocalToPhysAddr(params[3], &clrParams)) != SP_ERROR_NONE) skamonkey@3743: { skamonkey@3743: pCtx->ThrowNativeErrorEx(err, NULL); skamonkey@3743: return 0; skamonkey@3743: } skamonkey@3743: skamonkey@3743: Color clr( skamonkey@3743: clrParams[0], skamonkey@3743: clrParams[1], skamonkey@3743: clrParams[2], skamonkey@3743: clrParams[3]); skamonkey@3743: skamonkey@3743: if (!msg->AddColor(strField, clr)) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbAddAngle(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *angParams; skamonkey@3743: if ((err=pCtx->LocalToPhysAddr(params[3], &angParams)) != SP_ERROR_NONE) skamonkey@3743: { skamonkey@3743: pCtx->ThrowNativeErrorEx(err, NULL); skamonkey@3743: return 0; skamonkey@3743: } skamonkey@3743: skamonkey@3743: QAngle ang( skamonkey@3743: sp_ctof(angParams[0]), skamonkey@3743: sp_ctof(angParams[1]), skamonkey@3743: sp_ctof(angParams[2])); skamonkey@3743: skamonkey@3743: if (!msg->AddQAngle(strField, ang)) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbAddVector(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *vecParams; skamonkey@3743: if ((err=pCtx->LocalToPhysAddr(params[3], &vecParams)) != SP_ERROR_NONE) skamonkey@3743: { skamonkey@3743: pCtx->ThrowNativeErrorEx(err, NULL); skamonkey@3743: return 0; skamonkey@3743: } skamonkey@3743: skamonkey@3743: Vector vec( skamonkey@3743: sp_ctof(vecParams[0]), skamonkey@3743: sp_ctof(vecParams[1]), skamonkey@3743: sp_ctof(vecParams[2])); skamonkey@3743: skamonkey@3743: if (!msg->AddVector(strField, vec)) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbAddVector2D(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: cell_t *vecParams; skamonkey@3743: if ((err=pCtx->LocalToPhysAddr(params[3], &vecParams)) != SP_ERROR_NONE) skamonkey@3743: { skamonkey@3743: pCtx->ThrowNativeErrorEx(err, NULL); skamonkey@3743: return 0; skamonkey@3743: } skamonkey@3743: skamonkey@3743: Vector2D vec( skamonkey@3743: sp_ctof(vecParams[0]), skamonkey@3743: sp_ctof(vecParams[1])); skamonkey@3743: skamonkey@3743: if (!msg->AddVector2D(strField, vec)) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: skamonkey@3743: return 1; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbReadMessage(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: protobuf::Message *innerMsg; skamonkey@3743: if (!msg->GetMessage(strField, &innerMsg)) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: dvander@3872: Handle_t outHndl = handlesys->CreateHandle(g_ProtobufType, new SMProtobufMessage(innerMsg), NULL, g_pCoreIdent, NULL); skamonkey@3743: msg->AddChildHandle(outHndl); skamonkey@3743: skamonkey@3743: return outHndl; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbReadRepeatedMessage(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: const protobuf::Message *innerMsg; skamonkey@3743: if (!msg->GetRepeatedMessage(strField, params[3], &innerMsg)) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\"[%d] for message \"%s\"", strField, params[3], msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: dvander@3872: Handle_t outHndl = handlesys->CreateHandle(g_ProtobufType, new SMProtobufMessage(const_cast(innerMsg)), NULL, g_pCoreIdent, NULL); skamonkey@3743: msg->AddChildHandle(outHndl); skamonkey@3743: skamonkey@3743: return outHndl; skamonkey@3743: } skamonkey@3743: skamonkey@3743: static cell_t smn_PbAddMessage(IPluginContext *pCtx, const cell_t *params) skamonkey@3743: { skamonkey@3743: GET_MSG_FROM_HANDLE_OR_ERR(); skamonkey@3743: GET_FIELD_NAME_OR_ERR(); skamonkey@3743: skamonkey@3743: protobuf::Message *innerMsg; skamonkey@3743: if (!msg->AddMessage(strField, &innerMsg)) skamonkey@3743: { skamonkey@3747: return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str()); skamonkey@3743: } skamonkey@3743: dvander@3872: Handle_t outHndl = handlesys->CreateHandle(g_ProtobufType, new SMProtobufMessage(innerMsg), NULL, g_pCoreIdent, NULL); skamonkey@3743: msg->AddChildHandle(outHndl); skamonkey@3743: skamonkey@3743: return outHndl; skamonkey@3743: } skamonkey@3743: skamonkey@3743: REGISTER_NATIVES(protobufnatives) skamonkey@3743: { skamonkey@3743: {"PbReadInt", smn_PbReadInt}, skamonkey@3743: {"PbReadFloat", smn_PbReadFloat}, skamonkey@3743: {"PbReadBool", smn_PbReadBool}, skamonkey@3743: {"PbReadString", smn_PbReadString}, skamonkey@3743: {"PbReadColor", smn_PbReadColor}, skamonkey@3743: {"PbReadAngle", smn_PbReadAngle}, skamonkey@3743: {"PbReadVector", smn_PbReadVector}, skamonkey@3743: {"PbReadVector2D", smn_PbReadVector2D}, skamonkey@3743: {"PbGetRepeatedFieldCount", smn_PbGetRepeatedFieldCount}, skamonkey@3743: {"PbSetInt", smn_PbSetInt}, skamonkey@3743: {"PbSetFloat", smn_PbSetFloat}, skamonkey@3743: {"PbSetBool", smn_PbSetBool}, skamonkey@3743: {"PbSetString", smn_PbSetString}, skamonkey@3743: {"PbSetColor", smn_PbSetColor}, skamonkey@3743: {"PbSetAngle", smn_PbSetAngle}, skamonkey@3743: {"PbSetVector", smn_PbSetVector}, skamonkey@3743: {"PbSetVector2D", smn_PbSetVector2D}, skamonkey@3743: {"PbAddInt", smn_PbAddInt}, skamonkey@3743: {"PbAddFloat", smn_PbAddFloat}, skamonkey@3743: {"PbAddBool", smn_PbAddBool}, skamonkey@3743: {"PbAddString", smn_PbAddString}, skamonkey@3743: {"PbAddColor", smn_PbAddColor}, skamonkey@3743: {"PbAddAngle", smn_PbAddAngle}, skamonkey@3743: {"PbAddVector", smn_PbAddVector}, skamonkey@3743: {"PbAddVector2D", smn_PbAddVector2D}, skamonkey@3743: {"PbReadMessage", smn_PbReadMessage}, skamonkey@3743: {"PbReadRepeatedMessage", smn_PbReadRepeatedMessage}, skamonkey@3743: {"PbAddMessage", smn_PbAddMessage}, skamonkey@3743: {NULL, NULL} skamonkey@3743: }; skamonkey@3743: skamonkey@3743: /* skamonkey@3743: @@@@@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@@@@@ skamonkey@3743: @@@@@@@@ @@@@@@@@@@@@@ skamonkey@3743: @@@@@@@@ @@@@@@@@@@@@@ skamonkey@3743: @@@@@@ @@@@@@@@@@@@@@@ skamonkey@3743: 0000 @@@@@@@@@@@@@@@@@@@@@ skamonkey@3743: 000000000 @@@@@@@@@@@@@@@@@@@ skamonkey@3743: 0000000000000000000 @@@@@@@@@@@@@@@ skamonkey@3743: 00000000000000000000 @@@@@@@@@@@@@@@ skamonkey@3743: 000000000 @@@@@@@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@ @@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@ @@@@@@@ skamonkey@3743: @@@ @@@@ @@@ @@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ @@@@@@@@ @@ @@@@@@@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@@@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@@ @@@@ @@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@ @@@ @@@@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @@@@ @@@@@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ @@@@@ @@@@@@ skamonkey@3743: @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@ @@ @@@@@ @@@@@@@@ skamonkey@3743: @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@ @@@@ @@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @@@@@@ @@@@@@ @@@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ @@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @ @@@@@ skamonkey@3743: @@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ @@@@@ @@@@ //// skamonkey@3743: //////////// @@@@@@@@@@@ @@@@@@ @@@@@@@@@@@@@@@@@@@@ @@ @@@@@@@@@ @@@@ //// //////////// skamonkey@3743: ///////////////// /// @@@@@ @@@@ @@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@ ///// /////// ///////// skamonkey@3743: ///////////////////// ///// @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ @@@@@@@ @ @@@@ ////// /////// /////////////// skamonkey@3743: ///////////////////////// /////// @@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@ @@@@ ////// //////// //////////////////// skamonkey@3743: //////////////////////////// ////////// @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@ @@@ ////// ////////// //////////////////////// skamonkey@3743: //////////////////// ////////// /////////// @@@@@@@@@@@@@@@@@ @@@@@@@@ @@@ @@@@@@ ////// //////////// ////////////////////////// skamonkey@3743: //////////////////// //////////// /////////// @@@@@@@@@@@@@@@@ @@@@ ///////////////////// ///////////////////////////// skamonkey@3743: ///////////////////// ////////////// ////// @@@@@@@@@ /////////////////////////////////////////////////////////// skamonkey@3743: //////////////////// ///////////////////////////////////// /////////////////////////////////////////////////////////////////////// skamonkey@3743: ///////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////// skamonkey@3743: //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// skamonkey@3743: ////////////////////////////////////////////////////////////////////////////////////////////////////////////// skamonkey@3743: ///////////////////////////////////////////////////////////////////////////////////////// skamonkey@3743: ////////////////////////////////////////////////////////// skamonkey@3743: */