PHP Code:
/* Sublime AMXX Editor v2.2 */
/*
Credits to OciXCrom: took his way of configuring everything without hardcoding.
*/
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <cromchat>
#define PLUGIN "Advanced Glow Menu [AGM]"
#define VERSION "2.1.2"
#define AUTHOR "NapoleoN#"
#if AMXX_VERSION_NUM < 183
const MAX_PLAYERS = 32;
const MAX_NAME_LENGTH = 32;
const MAX_FMT_LENGTH = 256;
#endif
enum _:g_eSettings
{
PREFIX_STR[MAX_PLAYERS + 1],
ACCESS_FLAGS_BIT,
ACCESS_FLAGS_STR[MAX_PLAYERS + 1],
AIM_FLAGS_BIT,
AIM_FLAGS_STR[MAX_PLAYERS + 1],
bool:CHAT_MSG_ENABLED,
bool:RESET_GLOW_ROUNDSTART,
bool:SIMON_ONLY
};
native is_user_simon(id);
new const g_szSimonNative[] = "is_user_simon";
new bool:g_bSimonNativeExists;
new g_szSettings[g_eSettings];
new Array:g_aColorInfo;
new g_iColorSize;
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_dictionary("AGMML.txt");
register_logevent("roundStart", 2, "1=Round_Start");
g_aColorInfo = ArrayCreate(50);
readConfigFile(); // Changing any settings requires the map to be changed or the server to be restarted.
readColors(); // Changing any settings requires the map to be changed or the server to be restarted.
}
public plugin_end()
{
ArrayDestroy(g_aColorInfo);
}
public plugin_natives()
{
set_native_filter("nativeFilter");
}
public nativeFilter(const szNative[], id, iTrap)
{
if(!iTrap)
{
if((equal(szNative, g_szSimonNative)))
{
g_bSimonNativeExists = true
return PLUGIN_HANDLED;
}
}
return PLUGIN_CONTINUE;
}
public setGlowTarget(id)
{
if(!has_agm_access(id))
{
ColorChat(id, GREEN, "%L", id, "MSG_NO_ACCESS", g_szSettings[PREFIX_STR]);
return PLUGIN_HANDLED;
}
if(g_szSettings[SIMON_ONLY] && (g_bSimonNativeExists && is_user_simon(id)))
{
new iTarget, iBody;
get_user_aiming(id, iTarget, iBody);
log_amx("Access granted.");
if(iTarget)
{
log_amx("Valid target found.");
switch(get_user_team(iTarget))
{
case 1: set_user_rendering(iTarget, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25); // Terrorists
case 2: set_user_rendering(iTarget, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25); // CT
}
}
}
return PLUGIN_HANDLED;
}
public removeGlowTarget(id)
{
if(!has_aim_access(id))
{
ColorChat(id, GREEN, "%L", id, "MSG_NO_ACCESS", g_szSettings[PREFIX_STR]);
return PLUGIN_HANDLED;
}
if(g_szSettings[SIMON_ONLY] && (g_bSimonNativeExists && is_user_simon(id)))
{
new iTarget, iBody;
get_user_aiming(id, iTarget, iBody);
if(iTarget)
{
set_user_rendering(iTarget);
}
}
return PLUGIN_HANDLED;
}
public openGlowMenu(id)
{
if(!has_agm_access(id))
{
ColorChat(id, GREEN, "%L", id, "MSG_NO_ACCESS", g_szSettings[PREFIX_STR]);
return PLUGIN_HANDLED;
}
if(g_szSettings[SIMON_ONLY] && ( g_bSimonNativeExists && is_user_simon(id) ))
{
displayColorMenu(id);
}
return PLUGIN_HANDLED;
}
displayColorMenu(id)
{
new szTemp[64];
formatex(szTemp, charsmax(szTemp), "%s Set glow color", g_szSettings[PREFIX_STR]);
new iColorMenu = menu_create(szTemp, "colorMenuHandler");
new szColor[32], szCode[32], szColorData[MAX_FMT_LENGTH];
for(new i; i < g_iColorSize; i++) {
ArrayGetString(g_aColorInfo, i, szColorData, charsmax(szColorData));
split(szColorData, szColor, charsmax(szColor), szCode, charsmax(szCode), " ");
remove_quotes(szColor);
formatex(szColorData, charsmax(szColorData), "%s %s", szCode, szColor);
menu_additem(iColorMenu, szColor, szColorData);
}
menu_display(id, iColorMenu);
}
public colorMenuHandler(id, iMenu, iItem)
{
if(is_user_alive(id))
{
new szCode[50], szR[4], szG[4], szB[4], szItem[38], iRed, iGreen, iBlue;
new iAccess, iCallBack;
menu_item_getinfo(iMenu, iItem, iAccess, szCode, charsmax(szCode), _, _, iCallBack);
parse(szCode, szR, charsmax(szR), szG, charsmax(szG), szB, charsmax(szB), szItem, charsmax(szItem));
iRed = str_to_num(szR);
iGreen = str_to_num(szG);
iBlue = str_to_num(szB);
set_user_rendering(id, kRenderFxGlowShell, iRed, iGreen, iBlue, kRenderNormal, 25);
if(g_szSettings[CHAT_MSG_ENABLED] && (iItem != MENU_EXIT))
{
new szName[32]; get_user_name(id, szName, charsmax(szName));
ColorChat(id, GREEN, "%L", id, "MSG_SET_GLOW", g_szSettings[PREFIX_STR], szName, szItem);
}
}
menu_destroy(iMenu);
}
public roundStart()
{
if(g_szSettings[RESET_GLOW_ROUNDSTART])
{
new iPlayers[MAX_PLAYERS], iNum;
get_players(iPlayers, iNum, "ch");
for(new i; i < iNum; i++)
{
set_user_rendering(iPlayers[i]);
}
}
}
bool:has_agm_access(const id)
{
return ((get_user_flags(id) & g_szSettings[ACCESS_FLAGS_BIT]) == g_szSettings[ACCESS_FLAGS_BIT]);
}
bool:has_aim_access(const id)
{
return ((get_user_flags(id) & g_szSettings[AIM_FLAGS_BIT]) == g_szSettings[AIM_FLAGS_BIT]);
}
readConfigFile()
{
new szConfigsDir[MAX_FMT_LENGTH], szFileName[MAX_FMT_LENGTH];
get_configsdir(szConfigsDir, charsmax(szConfigsDir));
formatex(szFileName, charsmax(szFileName), "%s/AGMConfig.ini", szConfigsDir);
new iPointer = fopen(szFileName, "rt");
if(iPointer)
{
new szData[96], szValue[64], szKey[32];
while(!feof(iPointer))
{
fgets(iPointer, szData, charsmax(szData));
trim(szData);
switch(szData[0])
{
case EOS, '#', ';': continue;
default:
{
strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=');
trim(szKey);
trim(szValue);
if(equal(szKey, "CHAT_PREFIX"))
{
copy(g_szSettings[PREFIX_STR], charsmax(g_szSettings[PREFIX_STR]), szValue);
}
else if(equal(szKey, "ACCESS_FLAGS"))
{
copy(g_szSettings[ACCESS_FLAGS_STR], charsmax(g_szSettings[ACCESS_FLAGS_STR]), szValue);
g_szSettings[ACCESS_FLAGS_BIT] = read_flags(szValue);
}
else if(equal(szKey, "AIM_FLAGS"))
{
copy(g_szSettings[AIM_FLAGS_STR], charsmax(g_szSettings[AIM_FLAGS_STR]), szValue);
g_szSettings[AIM_FLAGS_BIT] = read_flags(szValue);
}
else if(equal(szKey, "CHAT_MSG_ENABLED"))
{
g_szSettings[CHAT_MSG_ENABLED] = bool:str_to_num(szValue);
}
else if(equal(szKey, "RESET_GLOW"))
{
g_szSettings[RESET_GLOW_ROUNDSTART] = bool:str_to_num(szValue);
}
else if(equal(szKey, "SIMON_ONLY"))
{
g_szSettings[SIMON_ONLY] = bool:str_to_num(szValue);
}
if(equal(szKey, "GLOWMENU_COMMANDS"))
{
while(szValue[0] != 0 && strtok(szValue, szKey, charsmax(szKey), szValue, charsmax(szValue), ','))
{
trim(szKey);
trim(szValue);
if(szKey[0] == '/' || szKey[0] == '!')
{
formatex(szData, charsmax(szData), "say %s", szKey);
register_clcmd(szData, "openGlowMenu");
formatex(szData, charsmax(szData), "say_team %s", szKey);
register_clcmd(szData, "openGlowMenu");
}
else
{
register_clcmd(szData, "openGlowMenu");
}
}
}
if(equal(szKey, "TARGET_AIM_SET_GLOW"))
{
while(szValue[0] != 0 && strtok(szValue, szKey, charsmax(szKey), szValue, charsmax(szValue), ','))
{
trim(szKey);
trim(szValue);
formatex(szData, charsmax(szData), "%s", szKey);
register_clcmd(szData, "setGlowTarget");
}
}
if(equal(szKey, "TARGET_AIM_REMOVE_GLOW"))
{
while(szValue[0] != 0 && strtok(szValue, szKey, charsmax(szKey), szValue, charsmax(szValue), ','))
{
trim(szKey);
trim(szValue);
formatex(szData, charsmax(szData), "%s", szKey);
register_clcmd(szData, "removeGlowTarget");
}
}
}
}
}
fclose(iPointer);
}
}
readColors()
{
new szConfigsDir[MAX_FMT_LENGTH], szFileName[MAX_FMT_LENGTH];
get_configsdir(szConfigsDir, charsmax(szConfigsDir));
formatex(szFileName, charsmax(szFileName), "%s/AGMColors.ini", szConfigsDir);
new iPointer = fopen(szFileName, "rt");
new szLine[50];
while(fgets(iPointer, szLine, charsmax(szLine)))
{
trim(szLine);
if(szLine[0] == EOS || szLine[0] == ';' || (szLine[0] == '/' && szLine[1] == '/') || szLine[0] == '#')
{
continue;
}
ArrayPushString(g_aColorInfo, szLine);
g_iColorSize = ArraySize(g_aColorInfo);
log_amx(szLine);
}
fclose(iPointer);
}