From 65dfd3cdd1bb258590f8a7cf978bd5543c2b1d0b Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sun, 9 Nov 2014 15:39:13 -0800 Subject: [PATCH] Add C++ definitions. --- core/smn_console.cpp | 86 +++++++++++-- plugins/include/convars.inc | 244 ++++++++++++++++++++++++++++-------- 2 files changed, 266 insertions(+), 64 deletions(-) diff --git a/core/smn_console.cpp b/core/smn_console.cpp index eda2529b..6d7e0b96 100644 --- a/core/smn_console.cpp +++ b/core/smn_console.cpp @@ -1182,28 +1182,19 @@ static cell_t SendConVarValue(IPluginContext *pContext, const cell_t *params) CPlayer *pPlayer = g_Players.GetPlayerByIndex(params[1]); if (!pPlayer) - { return pContext->ThrowNativeError("Client index %d is invalid", params[1]); - } if (!pPlayer->IsConnected()) - { return pContext->ThrowNativeError("Client %d is not connected", params[1]); - } if (pPlayer->IsFakeClient()) - { return pContext->ThrowNativeError("Client %d is fake and cannot be targeted", params[1]); - } INetChannel *netchan = static_cast(engine->GetPlayerNetInfo(params[1])); if (netchan == NULL) - { return 0; - } netchan->SendData(buffer); - return 1; } @@ -1247,6 +1238,59 @@ static cell_t RemoveCommandListener(IPluginContext *pContext, const cell_t *para return 1; } +static cell_t ConVar_BoolValue_set(IPluginContext *pContext, const cell_t *params) +{ + static cell_t new_params[5] = { + 4, + params[1], + params[2], + 0, /* Default replicate setting. */ + 0, /* Default replicate setting. */ + }; + + return sm_SetConVarNum(pContext, new_params); +} + +static cell_t ConVar_IntValue_set(IPluginContext *pContext, const cell_t *params) +{ + static cell_t new_params[5] = { + 4, + params[1], + params[2], + 0, /* Default replicate setting. */ + 0, /* Default replicate setting. */ + }; + + return sm_SetConVarNum(pContext, new_params); +} + +static cell_t ConVar_FloatValue_set(IPluginContext *pContext, const cell_t *params) +{ + static cell_t new_params[5] = { + 4, + params[1], + params[2], + 0, /* Default replicate setting. */ + 0, /* Default replicate setting. */ + }; + + return sm_SetConVarFloat(pContext, new_params); +} + +static cell_t ConVar_ReplicateToClient(IPluginContext *pContext, const cell_t *params) +{ + // Old version is (client, handle, value). + // New version is (handle, client, value). + static cell_t new_params[4] = { + 3, + params[2], + params[1], + params[3], + }; + + return SendConVarValue(pContext, new_params); +} + REGISTER_NATIVES(consoleNatives) { {"CreateConVar", sm_CreateConVar}, @@ -1287,5 +1331,29 @@ REGISTER_NATIVES(consoleNatives) {"SendConVarValue", SendConVarValue}, {"AddCommandListener", AddCommandListener}, {"RemoveCommandListener", RemoveCommandListener}, + + // Transitional syntax support. + {"ConVar.BoolValue.get", sm_GetConVarBool}, + {"ConVar.BoolValue.set", ConVar_BoolValue_set}, + {"ConVar.FloatValue.get", sm_GetConVarFloat}, + {"ConVar.FloatValue.set", ConVar_FloatValue_set}, + {"ConVar.IntValue.get", sm_GetConVarInt}, + {"ConVar.IntValue.set", ConVar_IntValue_set}, + {"ConVar.Flags.get", sm_GetConVarFlags}, + {"ConVar.Flags.set", sm_SetConVarFlags}, + {"ConVar.SetBool", sm_SetConVarNum}, + {"ConVar.SetInt", sm_SetConVarNum}, + {"ConVar.SetFloat", sm_SetConVarFloat}, + {"ConVar.GetString", sm_GetConVarString}, + {"ConVar.SetString", sm_SetConVarString}, + {"ConVar.RestoreDefault", sm_ResetConVar}, + {"ConVar.GetDefault", GetConVarDefault}, + {"ConVar.GetBounds", sm_GetConVarBounds}, + {"ConVar.SetBounds", sm_SetConVarBounds}, + {"ConVar.GetName", sm_GetConVarName}, + {"ConVar.ReplicateToClient", ConVar_ReplicateToClient}, + {"ConVar.AddChangeHook", sm_HookConVarChange}, + {"ConVar.RemoveChangeHook", sm_UnhookConVarChange}, + {NULL, NULL} }; diff --git a/plugins/include/convars.inc b/plugins/include/convars.inc index 6bad30d8..d938823d 100644 --- a/plugins/include/convars.inc +++ b/plugins/include/convars.inc @@ -44,12 +44,19 @@ enum ConVarBounds */ enum ConVarQueryResult { - ConVarQuery_Okay = 0, /**< Retrieval of client convar value was successful. */ - ConVarQuery_NotFound, /**< Client convar was not found. */ - ConVarQuery_NotValid, /**< A console command with the same name was found, but there is no convar. */ - ConVarQuery_Protected /**< Client convar was found, but it is protected. The server cannot retrieve its value. */ + ConVarQuery_Okay = 0, //< Retrieval of client convar value was successful. */ + ConVarQuery_NotFound, //< Client convar was not found. */ + ConVarQuery_NotValid, //< A console command with the same name was found, but there is no convar. */ + ConVarQuery_Protected //< Client convar was found, but it is protected. The server cannot retrieve its value. */ }; +// Called when a console variable's value is changed. +// +// @param convar Handle to the convar that was changed. +// @param oldValue String containing the value of the convar before it was changed. +// @param newValue String containing the new value of the convar. +typedef ConVarChanged = function void (ConVar convar, const char[] oldValue, const char[] newValue); + // Creates a new console variable. // // @param name Name of new convar. @@ -76,20 +83,156 @@ native ConVar CreateConVar( // @return A ConVar object if found; null otherwise. native ConVar FindConVar(const char[] name); - -// Most of these aren't properties because they're more complex +// A ConVar is a configurable, named setting in the srcds console. methodmap ConVar < Handle { -} + // Retrieves or sets a boolean value for the convar. + property bool BoolValue { + public native get(); + public native set(bool b); + } -/** - * Called when a console variable's value is changed. - * - * @param convar Handle to the convar that was changed. - * @param oldValue String containing the value of the convar before it was changed. - * @param newValue String containing the new value of the convar. - */ -typedef ConVarChanged = function void (ConVar convar, const char[] oldValue, const char[] newValue); + // Retrieves or sets an integer value for the convar. + property int IntValue { + public native get(); + public native set(int value); + } + + // Retrieves or sets a float value for the convar. + property float FloatValue { + public native get(); + public native set(float value); + } + + // Gets or sets the flag bits (FCVAR_*) on the convar. + property int Flags { + public native get(); + public native set(int flags); + } + + // Sets the boolean value of a console variable. + // + // Note: The replicate and notify params are only relevant for the + // original, Dark Messiah, and Episode 1 engines. Newer engines + // automatically do these things when the convar value is changed. + // + // @param value New boolean value. + // @param replicate If set to true, the new convar value will be set on all clients. + // This will only work if the convar has the FCVAR_REPLICATED flag + // and actually exists on clients. + // @param notify If set to true, clients will be notified that the convar has changed. + // This will only work if the convar has the FCVAR_NOTIFY flag. + public native void SetBool(bool value, bool replicate=false, bool notify=false); + + // Sets the integer value of a console variable. + // + // Note: The replicate and notify params are only relevant for the + // original, Dark Messiah, and Episode 1 engines. Newer engines + // automatically do these things when the convar value is changed. + // + // @param value New integer value. + // @param replicate If set to true, the new convar value will be set on all clients. + // This will only work if the convar has the FCVAR_REPLICATED flag + // and actually exists on clients. + // @param notify If set to true, clients will be notified that the convar has changed. + // This will only work if the convar has the FCVAR_NOTIFY flag. + public native void SetInt(int value, bool replicate=false, bool notify=false); + + // Sets the floating point value of a console variable. + // + // Note: The replicate and notify params are only relevant for the + // original, Dark Messiah, and Episode 1 engines. Newer engines + // automatically do these things when the convar value is changed. + // + // @param value New floating point value. + // @param replicate If set to true, the new convar value will be set on all clients. + // This will only work if the convar has the FCVAR_REPLICATED flag + // and actually exists on clients. + // @param notify If set to true, clients will be notified that the convar has changed. + // This will only work if the convar has the FCVAR_NOTIFY flag. + public native void SetFloat(float value, bool replicate=false, bool notify=false); + + // Retrieves the string value of a console variable. + // + // @param convar Handle to the convar. + // @param value Buffer to store the value of the convar. + // @param maxlength Maximum length of string buffer. + public native void GetString(char[] value, int maxlength); + + // Sets the string value of a console variable. + // + // Note: The replicate and notify params are only relevant for the + // original, Dark Messiah, and Episode 1 engines. Newer engines + // automatically do these things when the convar value is changed. + // + // @param value New string value. + // @param replicate If set to true, the new convar value will be set on all clients. + // This will only work if the convar has the FCVAR_REPLICATED flag + // and actually exists on clients. + // @param notify If set to true, clients will be notified that the convar has changed. + // This will only work if the convar has the FCVAR_NOTIFY flag. + public native void SetString(const char[] value, bool replicate=false, bool notify=false); + + // Resets the console variable to its default value. + // + // Note: The replicate and notify params are only relevant for the + // original, Dark Messiah, and Episode 1 engines. Newer engines + // automatically do these things when the convar value is changed. + // + // @param replicate If set to true, the new convar value will be set on all clients. + // This will only work if the convar has the FCVAR_REPLICATED flag + // and actually exists on clients. + // @param notify If set to true, clients will be notified that the convar has changed. + // This will only work if the convar has the FCVAR_NOTIFY flag. + public native void RestoreDefault(bool replicate=false, bool notify=false); + + // Retrieves the default string value of a console variable. + // + // @param value Buffer to store the default value of the convar. + // @param maxlength Maximum length of string buffer. + // @return Number of bytes written to the buffer (UTF-8 safe). + public native int GetDefault(char[] value, int maxlength); + + // Retrieves the specified bound of a console variable. + // + // @param type Type of bound to retrieve, ConVarBound_Lower or ConVarBound_Upper. + // @param value By-reference cell to store the specified floating point bound value. + // @return True if the convar has the specified bound set, false otherwise. + public native bool GetBounds(ConVarBounds type, float &value); + + // Sets the specified bound of a console variable. + // + // @param type Type of bound to set, ConVarBound_Lower or ConVarBound_Upper + // @param set If set to true, convar will use specified bound. If false, bound will be removed. + // @param value Floating point value to use as the specified bound. + public native void SetBounds(ConVarBounds type, bool set, float value=0.0); + + // Retrieves the name of a console variable. + // + // @param name Buffer to store the name of the convar. + // @param maxlength Maximum length of string buffer. + public native void GetName(char[] name, maxlength); + + // Replicates a convar value to a specific client. This does not change the actual convar value. + // + // @param client Client index + // @param value String value to send + // @return True on success, false on failure + // @error Invalid client index, client not in game, or client is fake + public native bool ReplicateToClient(int client, const char[] value); + + // Creates a hook for when a console variable's value is changed. + // + // @param callback An OnConVarChanged function pointer. + public native void AddChangeHook(ConVarChanged callback); + + // Removes a hook for when a console variable's value is changed. + // + // @param convar Handle to the convar. + // @param callback An OnConVarChanged function pointer. + // @error No active hook on convar. + public native void RemoveChangeHook(ConVarChanged callback); +} /** * Creates a hook for when a console variable's value is changed. @@ -142,7 +285,7 @@ native void SetConVarBool(Handle convar, bool value, bool replicate=false, bool * @return The integer value of the convar. * @error Invalid or corrupt Handle. */ -native GetConVarInt(Handle convar); +native int GetConVarInt(Handle convar); /** * Sets the integer value of a console variable. @@ -255,10 +398,9 @@ native int GetConVarFlags(Handle convar); * * @param convar Handle to the convar. * @param flags A bitstring containing the FCVAR_* flags to enable. - * @noreturn * @error Invalid or corrupt Handle. */ -native SetConVarFlags(Handle convar, flags); +native void SetConVarFlags(Handle convar, flags); /** * Retrieves the specified bound of a console variable. @@ -288,38 +430,42 @@ native void SetConVarBounds(Handle convar, ConVarBounds type, bool set, float va * @param convar Handle to the convar. * @param name Buffer to store the name of the convar. * @param maxlength Maximum length of string buffer. - * @noreturn * @error Invalid or corrupt Handle. */ -native GetConVarName(Handle convar, char[] name, maxlength); +native void GetConVarName(Handle convar, char[] name, maxlength); + +/** + * Replicates a convar value to a specific client. This does not change the actual convar value. + * + * @param client Client index + * @param convar ConVar handle + * @param value String value to send + * @return True on success, false on failure + * @error Invalid client index, client not in game, or client is fake + */ +native bool SendConVarValue(int client, Handle convar, const char[] value); union ConVarQueryFinished { - /** - * Called when a query to retrieve a client's console variable has finished. - * - * @param cookie Unique identifier of query. - * @param client Player index. - * @param result Result of query that tells one whether or not query was successful. - * See ConVarQueryResult enum for more details. - * @param convarName Name of client convar that was queried. - * @param convarValue Value of client convar that was queried if successful. This will be "" if it was not. - * @param value Value that was passed when query was started. - * @noreturn - */ + // Called when a query to retrieve a client's console variable has finished. + // + // @param cookie Unique identifier of query. + // @param client Player index. + // @param result Result of query that tells one whether or not query was successful. + // See ConVarQueryResult enum for more details. + // @param convarName Name of client convar that was queried. + // @param convarValue Value of client convar that was queried if successful. This will be "" if it was not. + // @param value Value that was passed when query was started. function void (QueryCookie cookie, int client, ConVarQueryResult result, const char[] cvarName, const char[] cvarValue, any value); - /** - * Called when a query to retrieve a client's console variable has finished. - * - * @param cookie Unique identifier of query. - * @param client Player index. - * @param result Result of query that tells one whether or not query was successful. - * See ConVarQueryResult enum for more details. - * @param convarName Name of client convar that was queried. - * @param convarValue Value of client convar that was queried if successful. This will be "" if it was not. - * @noreturn - */ + // Called when a query to retrieve a client's console variable has finished. + // + // @param cookie Unique identifier of query. + // @param client Player index. + // @param result Result of query that tells one whether or not query was successful. + // See ConVarQueryResult enum for more details. + // @param convarName Name of client convar that was queried. + // @param convarValue Value of client convar that was queried if successful. This will be "" if it was not. function void (QueryCookie cookie, int client, ConVarQueryResult result, const char[] cvarName, const char[] cvarValue); }; @@ -345,15 +491,3 @@ stock bool IsValidConVarChar(int c) { return (c == '_' || IsCharAlpha(c) || IsCharNumeric(c)); } - -/** - * Replicates a convar value to a specific client. This does not change the actual convar value. - * - * @param client Client index - * @param convar ConVar handle - * @param value String value to send - * @return True on success, false on failure - * @error Invalid client index, client not in game, or client is fake - */ -native bool SendConVarValue(int client, Handle convar, const char[] value); -