faluco@1031: /** faluco@1031: * vim: set ts=4 : ds@1330: * ============================================================================= dvander@1233: * SourceMod SDKTools Extension ds@1947: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. ds@1330: * ============================================================================= faluco@1031: * ds@1330: * This program is free software; you can redistribute it and/or modify it under ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the ds@1330: * Free Software Foundation. dvander@1233: * ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ds@1330: * details. dvander@1233: * ds@1330: * You should have received a copy of the GNU General Public License along with ds@1330: * this program. If not, see . dvander@1233: * ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants ds@1330: * this exception to all derivative works. AlliedModders LLC defines further ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), ds@1330: * or . faluco@1031: * faluco@1031: * Version: $Id$ faluco@1031: */ faluco@1031: dvander@950: #ifndef _INCLUDE_SOURCEMOD_VDECODER_H_ dvander@950: #define _INCLUDE_SOURCEMOD_VDECODER_H_ dvander@950: dvander@950: #include dvander@950: #include dvander@950: #include dvander@950: dvander@950: using namespace SourceMod; dvander@950: using namespace SourcePawn; dvander@950: dvander@950: /** dvander@950: * @brief Encapsulates types from the SDK dvander@950: */ dvander@950: enum ValveType dvander@950: { dvander@950: Valve_CBaseEntity, /**< CBaseEntity */ dvander@950: Valve_CBasePlayer, /**< CBasePlayer (disallow normal ents) */ dvander@950: Valve_Vector, /**< Vector */ dvander@950: Valve_QAngle, /**< QAngle */ dvander@950: Valve_POD, /**< Plain old data */ dvander@950: Valve_Float, /**< Float */ dvander@950: Valve_Edict, /**< Edict */ dvander@950: Valve_String, /**< String */ dvander@954: Valve_Bool, /**< Boolean */ dvander@950: }; dvander@950: dvander@950: enum DataStatus dvander@950: { dvander@950: Data_Fail = 0, dvander@950: Data_Okay = 1, dvander@950: }; dvander@950: dvander@950: #define VDECODE_FLAG_ALLOWNULL (1<<0) /**< Allow NULL for pointers */ dvander@950: #define VDECODE_FLAG_ALLOWNOTINGAME (1<<1) /**< Allow players not in game */ dvander@950: #define VDECODE_FLAG_ALLOWWORLD (1<<2) /**< Allow World entity */ dvander@950: #define VDECODE_FLAG_BYREF (1<<3) /**< Floats/ints by reference */ dvander@950: dvander@950: #define VENCODE_FLAG_COPYBACK (1<<0) /**< Copy back data */ dvander@950: dvander@954: #define PASSFLAG_ASPOINTER (1<<30) /**< Not an actual passflag, used internally */ dvander@954: dvander@954: /** dvander@954: * @brief Valve pre-defined calling types dvander@954: */ dvander@954: enum ValveCallType dvander@954: { ds@1065: ValveCall_Static, /**< Static call */ ds@1065: ValveCall_Entity, /**< Thiscall (CBaseEntity implicit first parameter) */ ds@1065: ValveCall_Player, /**< Thiscall (CBasePlayer implicit first parameter) */ ds@1065: ValveCall_GameRules, /**< Thiscall (CGameRules implicit first paramater) */ ds@1240: ValveCall_EntityList, /**< Thiscall (CGlobalEntityList implicit first paramater) */ dvander@954: }; dvander@954: dvander@954: /** dvander@954: * @brief Valve parameter info dvander@954: */ dvander@954: struct ValvePassInfo dvander@954: { dvander@954: ValveType vtype; /**< IN: Valve type */ dvander@954: unsigned int decflags; /**< IN: VDECODE_FLAG_* */ dvander@954: unsigned int encflags; /**< IN: VENCODE_FLAG_* */ dvander@954: PassType type; /**< IN: Pass information */ dvander@954: unsigned int flags; /**< IN: Pass flags */ dvander@954: size_t offset; /**< OUT: stack offset */ dvander@987: size_t obj_offset; /**< OUT: object offset at end of the stack */ dvander@954: }; dvander@954: dvander@987: struct ValveCall; dvander@987: dvander@950: /** dvander@950: * @brief Converts a valve parameter to a bintools parameter. dvander@950: * dvander@950: * @param type Valve type. dvander@950: * @param pass Either basic or object. dvander@950: * @param flags Either BYVAL or BYREF. dvander@950: * @param info Buffer to store param info in. dvander@950: * @return Number of bytes this will use in the virtual stack, dvander@950: * or 0 if conversion was impossible. dvander@950: */ dvander@950: size_t ValveParamToBinParam(ValveType type, dvander@950: PassType pass, dvander@950: unsigned int flags, dvander@987: PassInfo *info, dvander@987: bool &needs_extra); dvander@950: dvander@950: /** dvander@950: * @brief Decodes data from a plugin to native data. dvander@950: * dvander@950: * Note: If you're going to return false, make sure to dvander@950: * throw an error. dvander@950: * dvander@950: * @param pContext Plugin context. dvander@950: * @param param Parameter value from params array. dvander@950: * @param buffer Buffer space in the virutal stack. dvander@950: * @return True on success, false otherwise. dvander@950: */ dvander@950: DataStatus DecodeValveParam(IPluginContext *pContext, dvander@950: cell_t param, dvander@987: const ValveCall *pCall, dvander@954: const ValvePassInfo *vdata, dvander@950: void *buffer); dvander@950: dvander@950: /** dvander@950: * @brief Encodes native data back into a plugin. dvander@950: * dvander@950: * Note: If you're going to return false, make sure to dvander@950: * throw an error. dvander@950: * dvander@950: * @param pContext Plugin context. dvander@950: * @param param Parameter value from params array. dvander@950: * @param buffer Buffer space in the virutal stack. dvander@950: * @return True on success, false otherwise. dvander@950: */ dvander@950: DataStatus EncodeValveParam(IPluginContext *pContext, dvander@950: cell_t param, dvander@987: const ValveCall *pCall, dvander@954: const ValvePassInfo *vdata, dvander@950: const void *buffer); dvander@950: dvander@950: #endif //_INCLUDE_SOURCEMOD_VDECODER_H_