/*
Here is the original Cheer Plugin that I modified to allow purchasing and other enhancements :) :) :)
Original Cheer Plugin: https://www.csplague.com/plugin-cs-1-6-eklentiler/1174-cheer-plugini-gulucuk-plugini.html
*/
#include <amxmodx>
#include <amxmisc>
#include <fakemeta_util>
#include <colorchat>
#include <nvault>
#include <cstrike>
#define PLUGIN "Cheer System"
#define VERSION "2.0"
#define AUTHOR "Nanosuit"
#define MAX_EMOJI 5
#define LANG_FILE "CheerSystem.txt"
new const PREFIX[] = "^1[^4Cheer System^1]"
new const SPRITE[] = "sprites/cheer/sprite_cheer.spr"
enum _:INFO {
File[128],
Name[128],
Price
};
new const Cheer[][INFO] = {
{ "cheer/GoblinLaugh.wav", "CHEER1", 1000 },
{ "cheer/HuhCatMeme.wav", "CHEER2", 2000 },
{ "cheer/DoorStuck.wav", "CHEER3", 3000 },
{ "cheer/Bruh.wav", "CHEER4", 4000 },
{ "cheer/Skibidi.wav", "CHEER5", 5000 }
};
new g_PurchaseEmoji[33][5],
bool:g_activeEmoji[33][MAX_EMOJI],
sprites,
g_nVault,
iSteamID[33][32];
// CS Player PData Offsets (win32)
const OFFSET_CSMENUCODE = 205
// Menu keys (Here i use Zombie Plague Menu Style Not The New Style Because The Keys Doesn't Work)
const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0
public plugin_init()
{
register_plugin(PLUGIN , VERSION, AUTHOR)
register_clcmd("+startcheer", "_StartEmoji")
register_clcmd("-stopcheer", "_StopEmoji")
register_clcmd("say /cheer", "_ShowCheerMenu")
register_dictionary(LANG_FILE)
register_menu("Cheers Menu", KEYSMENU, "_ShowCheerMenuHandle")
}
public plugin_precache()
{
for(new i; i < sizeof(Cheer); i++) precache_sound(Cheer[i][File])
sprites = precache_model(SPRITE)
}
public client_putinserver(id) {
if (is_user_bot(id)) return
get_user_authid(id, iSteamID[id], charsmax(iSteamID))
if (containi(iSteamID[id], "_ID_LAN") != -1 || containi(iSteamID[id], "HLTV") != -1) get_user_ip(id, iSteamID[id], charsmax(iSteamID), 1)
LoadData(id)
}
public client_disconnect(id) {
if (is_user_bot(id)) return
SaveData(id)
}
public _ShowCheerMenu(id)
{
new String[121]
format(String, charsmax(String), "%L", id , "CHEER_MAIN_MENU")
new menu = menu_create(String, "_ShowCheerMenuHandle")
for(new i; i < sizeof(Cheer); i++){
new item[128]
if (g_PurchaseEmoji[id][i] == 0) {
format(item, charsmax(item), "\w%L \d| \r$%i", id, Cheer[i][Name], Cheer[i][Price])
} else {
format(item, charsmax(item), "\d%L [\r%L\d]", id, Cheer[i][Name], id, g_activeEmoji[id][i] ? "ENABLED" : "DISABLED")
}
menu_additem(menu, item, fmt("%i", i + 1))
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
menu_setprop(menu, MPROP_BACKNAME, "Back")
menu_setprop(menu, MPROP_NEXTNAME, "Next")
menu_setprop(menu, MPROP_EXITNAME, "Exit")
menu_display(id, menu, 0)
return PLUGIN_HANDLED
}
public _ShowCheerMenuHandle(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return
}
new data[9], szName[64]
new access, callback
menu_item_getinfo(menu, item, access, data, charsmax(data), szName, charsmax(szName), callback)
new key = str_to_num(data) - 1
if(g_PurchaseEmoji[id][key] == 0)
{
if(cs_get_user_money(id) >= Cheer[key][Price])
{
g_PurchaseEmoji[id][key] = 1
cs_set_user_money(id, cs_get_user_money(id) - Cheer[key][Price])
ColorChat(id, GREEN, "%s %L ^"%L^"", PREFIX, id, "BUY_CHEER_CHAT", id, Cheer[key][Name])
client_cmd(id, "spk items/gunpickup2.wav")
}
else
{
ColorChat(id, GREEN, "%s %L", PREFIX, id, "DONT_HAVE_ENOUGH", Cheer[key][Price] - cs_get_user_money(id))
}
}
else
{
g_activeEmoji[id][key] = !g_activeEmoji[id][key]
if(g_activeEmoji[id][key])
{
for (new i = 0; i < MAX_EMOJI; i++) {
if (i != key) g_activeEmoji[id][i] = false
}
}
set_task(0.3, "_ShowCheerMenu", id)
}
_ShowCheerMenu(id)
}
public _StartEmoji(id)
{
if (!is_user_alive(id))
return PLUGIN_HANDLED;
_PlayEmoji(id);
return PLUGIN_HANDLED;
}
public _StopEmoji(id)
{
_MuteEmoji(id);
return PLUGIN_HANDLED;
}
public _PlayEmoji(id)
{
if (!is_user_connected(id))
return;
for (new i = 0; i < MAX_EMOJI; i++) {
if (g_activeEmoji[id][i] == true) {
_ShowEmojiEffect(id);
_PlayCheerSound(id, i);
return;
}
}
ColorChat(id, GREEN, "%s %L", PREFIX, id, "NO_ACTIVE_CHEER");
}
stock _ShowEmojiEffect(id)
{
message_begin(MSG_ALL, SVC_TEMPENTITY);
write_byte(TE_PLAYERATTACHMENT); // Attach effect to player
write_byte(id); // Player ID
write_coord(50); // Position (X)
write_short(sprites); // Sprite to attach
write_short(25); // Attachment type (id)
message_end();
}
stock _PlayCheerSound(id, index)
{
// Retrieve the sound file name and play the cheer sound
new soundFile[128];
format(soundFile, charsmax(soundFile), Cheer[index][File]);
emit_sound(id, CHAN_VOICE, soundFile, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
}
stock _MuteEmoji(id)
{
message_begin(MSG_ALL, SVC_TEMPENTITY);
write_byte(125); // Message type for mute
write_byte(id); // Player ID
message_end();
}
public plugin_cfg()
{
g_nVault = nvault_open( "SaveCheers")
if(g_nVault == INVALID_HANDLE) set_fail_state("ERROR Cheer System nVault Data cannot be opened, the file does not exist!")
}
SaveData(id)
{
if (g_nVault == INVALID_HANDLE)
{
server_print("ERROR: Could not save data for player %d - nVault handle is invalid", id);
return;
}
new szAuthid[32]
get_user_authid(id, szAuthid, charsmax(szAuthid))
new szVaultKey[128], szVaultData[512]
formatex(szVaultKey, 127, "EMOJI_%s", szAuthid)
formatex(szVaultData, 511, "%i %i %i %i %i %i %i %i %i %i",
g_PurchaseEmoji[id][0], g_PurchaseEmoji[id][1], g_PurchaseEmoji[id][2],
g_PurchaseEmoji[id][3], g_PurchaseEmoji[id][4],
g_activeEmoji[id][0], g_activeEmoji[id][1],
g_activeEmoji[id][2], g_activeEmoji[id][3], g_activeEmoji[id][4])
nvault_set(g_nVault, szVaultKey, szVaultData)
}
LoadData(id)
{
if (g_nVault == INVALID_HANDLE)
{
server_print("ERROR: Could not load data for player %d - nVault handle is invalid", id);
return;
}
new szAuthid[32]
get_user_authid(id, szAuthid, charsmax(szAuthid))
new szVaultKey[128], szVaultData[512]
formatex(szVaultKey, 127, "EMOJI_%s", szAuthid)
nvault_get(g_nVault, szVaultKey, szVaultData, 511)
new SavePurchase[MAX_EMOJI][64], Active[MAX_EMOJI][64]
parse(szVaultData, SavePurchase[0], 63, SavePurchase[1], 63, SavePurchase[2], 63,
SavePurchase[3], 63, SavePurchase[4], 63,
Active[0], 63, Active[1], 63, Active[2], 63,
Active[3], 63, Active[4], 63)
for (new i = 0; i < MAX_EMOJI; i++) {
g_PurchaseEmoji[id][i] = str_to_num(SavePurchase[i]);
g_activeEmoji[id][i] = str_to_num(Active[i]);
}
server_print("Data loaded for player with ID: %d", id);
}
public plugin_end() {
if (g_nVault != INVALID_HANDLE) {
nvault_close(g_nVault)
}
}