AntiBots
05-25-2009, 02:31
Only have a little problem with Some Float Returns, Example you put 220.1 the plugin return 220.09999999
PLUGIN:
// #define USE_FAKEMETA
#include <amxmodx>
#if defined USE_FAKEMETA
#include <fakemeta>
#else
#include <engine>
#endif
new Array:g_CvarHolds
new Array:g_CvarType
new Array:g_CvarFwd
new Array:g_CvarData
public plugin_precache()
{
register_plugin("Cvars Change", "1.0", "ReymonARG")
g_CvarHolds = ArrayCreate(1, 1)
g_CvarType = ArrayCreate(1, 1)
g_CvarData = ArrayCreate(128, 1)
g_CvarFwd = ArrayCreate(1, 1)
#if defined USE_FAKEMETA
register_forward(FM_StartFrame, "server_frame")
#endif
}
public plugin_natives()
{
register_library("ReymonARG_Cvars")
register_native("register_cvar_change", "__cvar_change_add")
register_native("unregister_cvar_change", "__cvar_change_delete")
}
public __cvar_change_add( iPlugin, iParams )
{
if( iParams != 3 )
return log_error(AMX_ERR_NATIVE, "Invalid Params Nums %d", iParams)
static szCvar[64]; get_string(2, szCvar, 63)
if( !cvar_exists(szCvar) )
return log_error(AMX_ERR_NATIVE, "Cvar: %s No Exists", szCvar)
static fwd_id, iType; iType = get_param(1)
static szCallBack[32]; get_string(3, szCallBack, 31)
switch( iType )
{
case 1: fwd_id = CreateOneForward(iPlugin, szCallBack, FP_CELL, FP_CELL, FP_CELL)
case 2: fwd_id = CreateOneForward(iPlugin, szCallBack, FP_CELL, FP_FLOAT, FP_FLOAT)
case 3: fwd_id = CreateOneForward(iPlugin, szCallBack, FP_CELL, FP_STRING, FP_STRING)
default: return log_error(AMX_ERR_NATIVE, "%d Dont is a Correct Type Cvar", iType)
}
if( fwd_id < 0 )
return log_error(AMX_ERR_NATIVE, "Correct the CallBack Funcion")
static pCvar; pCvar = get_cvar_pointer(szCvar)
ArrayPushCell(g_CvarHolds, pCvar)
ArrayPushCell(g_CvarType, iType)
switch( iType )
{
case 1:
{
static iResult; iResult = get_pcvar_num(pCvar)
ArrayPushCell(g_CvarData, iResult)
}
case 2:
{
static Float:fResult; fResult = get_pcvar_float(pCvar)
ArrayPushCell(g_CvarData, fResult)
}
case 3:
{
static szResult[128]; get_pcvar_string(pCvar, szResult, 127)
ArrayPushString(g_CvarData, szResult)
}
}
ArrayPushCell(g_CvarFwd, fwd_id)
return fwd_id
}
public __cvar_change_delete( iPlugin, iParams )
{
if( iParams != 1 )
return log_error(AMX_ERR_NATIVE, "Invalid Params Nums %d", iParams)
static i, fwd_id, len; len = ArraySize(g_CvarFwd)
fwd_id = get_param(1)
for( i = 0; i < len; i++)
{
if( ArrayGetCell(g_CvarFwd, i) == fwd_id )
{
ArrayDeleteItem(g_CvarHolds, i)
ArrayDeleteItem(g_CvarType, i)
ArrayDeleteItem(g_CvarData, i)
ArrayDeleteItem(g_CvarFwd, i)
DestroyForward(fwd_id)
return 1
}
}
return 0
}
public server_frame()
{
static i, type, idCvar, iReturn, len; len = ArraySize(g_CvarFwd)
static iResult[2], Float:fResult[2], szResult[2][128]
for( i = 0; i < len; i++)
{
type = ArrayGetCell(g_CvarType, i)
idCvar = ArrayGetCell(g_CvarHolds, i)
switch( type )
{
case 1:
{
iResult[0] = ArrayGetCell(g_CvarData, i)
iResult[1] = get_pcvar_num(idCvar)
if( iResult[0] != iResult[1] )
{
static id; id = ArrayGetCell(g_CvarFwd, i)
ExecuteForward(id, iReturn, id, iResult[0], iResult[1])
if( iReturn )
{
set_pcvar_num(idCvar, iResult[0])
iReturn = 0
}
else
{
ArraySetCell(g_CvarData, i, iResult[1])
}
}
}
case 2:
{
fResult[0] = ArrayGetCell(g_CvarData, i)
fResult[1] = get_pcvar_float(idCvar)
if( fResult[0] != fResult[1] )
{
static id; id = ArrayGetCell(g_CvarFwd, i)
ExecuteForward(id, iReturn, id, fResult[0], fResult[1])
if( iReturn )
{
set_pcvar_float(idCvar, fResult[0])
iReturn = 0
}
else
{
ArraySetCell(g_CvarData, i, fResult[1])
}
}
}
case 3:
{
ArrayGetString(g_CvarData, i, szResult[0], 127)
get_pcvar_string(idCvar, szResult[1], 127)
if( !equal(szResult[0], szResult[1]) )
{
static id; id = ArrayGetCell(g_CvarFwd, i)
ExecuteForward(id, iReturn, id, szResult[0], szResult[1])
if( iReturn )
{
set_pcvar_string(idCvar, szResult[0])
iReturn = 0
}
else
{
ArraySetString(g_CvarData, i, szResult[1])
}
}
}
}
}
}
INC:
#if defined _cvarchange_included
#endinput
#endif
#define _cvarchange_included
#if AMXX_VERSION_NUM >= 175
#pragma reqlib ReymonARG_Cvars
#if !defined AMXMODX_NOAUTOLOAD
#pragma loadlib ReymonARG_Cvars
#endif
#else
#pragma library ReymonARG_Cvars
#endif
enum Type
{
cvarINT = 1,
cvarFL = 2,
cvarSZ = 3
}
native register_cvar_change(Type:type, const Cvar[], const CallBack[])
native unregister_cvar_change(fwd_id)
EXAMPLE:
#include <amxmodx>
#include <cvarchange>
#define PLUGIN "Cvar xD"
#define VERSION "1.0"
#define AUTHOR "ReymonARG"
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar_change(cvarINT, "mp_friendlyfire", "ffback")
register_cvar_change(cvarFL, "kz_min_lj", "ljmin")
register_cvar_change(cvarSZ, "amx_nextmap", "nextmap")
}
public ffback( id, pre, post)
{
server_print("%d %d %d", id, pre, post)
return 1
}
public ljmin( id, Float:pre, Float:post)
{
server_print("%d %f %f", id, pre, post)
}
public nextmap(id, const pre[], const post[])
{
server_print("%d %s %s", id, pre, post)
}
Thanks, Correct me if I do something wrong
PLUGIN:
// #define USE_FAKEMETA
#include <amxmodx>
#if defined USE_FAKEMETA
#include <fakemeta>
#else
#include <engine>
#endif
new Array:g_CvarHolds
new Array:g_CvarType
new Array:g_CvarFwd
new Array:g_CvarData
public plugin_precache()
{
register_plugin("Cvars Change", "1.0", "ReymonARG")
g_CvarHolds = ArrayCreate(1, 1)
g_CvarType = ArrayCreate(1, 1)
g_CvarData = ArrayCreate(128, 1)
g_CvarFwd = ArrayCreate(1, 1)
#if defined USE_FAKEMETA
register_forward(FM_StartFrame, "server_frame")
#endif
}
public plugin_natives()
{
register_library("ReymonARG_Cvars")
register_native("register_cvar_change", "__cvar_change_add")
register_native("unregister_cvar_change", "__cvar_change_delete")
}
public __cvar_change_add( iPlugin, iParams )
{
if( iParams != 3 )
return log_error(AMX_ERR_NATIVE, "Invalid Params Nums %d", iParams)
static szCvar[64]; get_string(2, szCvar, 63)
if( !cvar_exists(szCvar) )
return log_error(AMX_ERR_NATIVE, "Cvar: %s No Exists", szCvar)
static fwd_id, iType; iType = get_param(1)
static szCallBack[32]; get_string(3, szCallBack, 31)
switch( iType )
{
case 1: fwd_id = CreateOneForward(iPlugin, szCallBack, FP_CELL, FP_CELL, FP_CELL)
case 2: fwd_id = CreateOneForward(iPlugin, szCallBack, FP_CELL, FP_FLOAT, FP_FLOAT)
case 3: fwd_id = CreateOneForward(iPlugin, szCallBack, FP_CELL, FP_STRING, FP_STRING)
default: return log_error(AMX_ERR_NATIVE, "%d Dont is a Correct Type Cvar", iType)
}
if( fwd_id < 0 )
return log_error(AMX_ERR_NATIVE, "Correct the CallBack Funcion")
static pCvar; pCvar = get_cvar_pointer(szCvar)
ArrayPushCell(g_CvarHolds, pCvar)
ArrayPushCell(g_CvarType, iType)
switch( iType )
{
case 1:
{
static iResult; iResult = get_pcvar_num(pCvar)
ArrayPushCell(g_CvarData, iResult)
}
case 2:
{
static Float:fResult; fResult = get_pcvar_float(pCvar)
ArrayPushCell(g_CvarData, fResult)
}
case 3:
{
static szResult[128]; get_pcvar_string(pCvar, szResult, 127)
ArrayPushString(g_CvarData, szResult)
}
}
ArrayPushCell(g_CvarFwd, fwd_id)
return fwd_id
}
public __cvar_change_delete( iPlugin, iParams )
{
if( iParams != 1 )
return log_error(AMX_ERR_NATIVE, "Invalid Params Nums %d", iParams)
static i, fwd_id, len; len = ArraySize(g_CvarFwd)
fwd_id = get_param(1)
for( i = 0; i < len; i++)
{
if( ArrayGetCell(g_CvarFwd, i) == fwd_id )
{
ArrayDeleteItem(g_CvarHolds, i)
ArrayDeleteItem(g_CvarType, i)
ArrayDeleteItem(g_CvarData, i)
ArrayDeleteItem(g_CvarFwd, i)
DestroyForward(fwd_id)
return 1
}
}
return 0
}
public server_frame()
{
static i, type, idCvar, iReturn, len; len = ArraySize(g_CvarFwd)
static iResult[2], Float:fResult[2], szResult[2][128]
for( i = 0; i < len; i++)
{
type = ArrayGetCell(g_CvarType, i)
idCvar = ArrayGetCell(g_CvarHolds, i)
switch( type )
{
case 1:
{
iResult[0] = ArrayGetCell(g_CvarData, i)
iResult[1] = get_pcvar_num(idCvar)
if( iResult[0] != iResult[1] )
{
static id; id = ArrayGetCell(g_CvarFwd, i)
ExecuteForward(id, iReturn, id, iResult[0], iResult[1])
if( iReturn )
{
set_pcvar_num(idCvar, iResult[0])
iReturn = 0
}
else
{
ArraySetCell(g_CvarData, i, iResult[1])
}
}
}
case 2:
{
fResult[0] = ArrayGetCell(g_CvarData, i)
fResult[1] = get_pcvar_float(idCvar)
if( fResult[0] != fResult[1] )
{
static id; id = ArrayGetCell(g_CvarFwd, i)
ExecuteForward(id, iReturn, id, fResult[0], fResult[1])
if( iReturn )
{
set_pcvar_float(idCvar, fResult[0])
iReturn = 0
}
else
{
ArraySetCell(g_CvarData, i, fResult[1])
}
}
}
case 3:
{
ArrayGetString(g_CvarData, i, szResult[0], 127)
get_pcvar_string(idCvar, szResult[1], 127)
if( !equal(szResult[0], szResult[1]) )
{
static id; id = ArrayGetCell(g_CvarFwd, i)
ExecuteForward(id, iReturn, id, szResult[0], szResult[1])
if( iReturn )
{
set_pcvar_string(idCvar, szResult[0])
iReturn = 0
}
else
{
ArraySetString(g_CvarData, i, szResult[1])
}
}
}
}
}
}
INC:
#if defined _cvarchange_included
#endinput
#endif
#define _cvarchange_included
#if AMXX_VERSION_NUM >= 175
#pragma reqlib ReymonARG_Cvars
#if !defined AMXMODX_NOAUTOLOAD
#pragma loadlib ReymonARG_Cvars
#endif
#else
#pragma library ReymonARG_Cvars
#endif
enum Type
{
cvarINT = 1,
cvarFL = 2,
cvarSZ = 3
}
native register_cvar_change(Type:type, const Cvar[], const CallBack[])
native unregister_cvar_change(fwd_id)
EXAMPLE:
#include <amxmodx>
#include <cvarchange>
#define PLUGIN "Cvar xD"
#define VERSION "1.0"
#define AUTHOR "ReymonARG"
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar_change(cvarINT, "mp_friendlyfire", "ffback")
register_cvar_change(cvarFL, "kz_min_lj", "ljmin")
register_cvar_change(cvarSZ, "amx_nextmap", "nextmap")
}
public ffback( id, pre, post)
{
server_print("%d %d %d", id, pre, post)
return 1
}
public ljmin( id, Float:pre, Float:post)
{
server_print("%d %f %f", id, pre, post)
}
public nextmap(id, const pre[], const post[])
{
server_print("%d %s %s", id, pre, post)
}
Thanks, Correct me if I do something wrong