Код
#include <amxmodx>
#include <fakemeta>
#define VERSION "1.0"
#define OFFSET_TEAM 114
#define OFFSET_MONEY 115
#define OFFSET_LINUX 5
#define fm_get_user_team(%0) get_pdata_int(%0, OFFSET_TEAM)
#define fm_get_user_money(%0) get_pdata_int(%0, OFFSET_MONEY)
static cvar_money, cvar_money_max, cvar_health, cvar_time_menu;
static id_money, id_saytext, maxplayers, bool:menu_block[33];
static bool:tryder[33], model[33][64];
public plugin_precache() {
engfunc(EngFunc_PrecacheModel, "models/player/sb_steam_ct/sb_steam_ct.mdl");
engfunc(EngFunc_PrecacheModel, "models/player/sb_steam_te/sb_steam_te.mdl");
}
public plugin_init() {
register_plugin("Steam bonus", VERSION, "OverGame");
register_event("HLTV", "event_round_hltv", "a", "1=0", "2=0");
register_forward(FM_SetClientKeyValue, "fmKeyValue");
register_forward(FM_ClientUserInfoChanged, "fmClientUserInfoChanged");
register_concmd("say /sb", "cmd_steam_bonus");
register_concmd("say_team /sb", "cmd_steam_bonus");
register_cvar("amx_sb_money", "300");
register_cvar("amx_sb_money_max", "16000");
register_cvar("amx_sb_health", "10");
register_cvar("amx_time_menu", "10");
register_menucmd(register_menuid("show_steam_menu"), (1<<0|1<<1|1<<2|1<<9), "handle_steam_menu");
maxplayers = get_maxplayers();
id_money = get_user_msgid("Money");
id_saytext = get_user_msgid("SayText");
}
public plugin_cfg() {
cvar_money = get_cvar_num("amx_sb_money");
cvar_money_max = get_cvar_num("amx_sb_money_max");
cvar_health = get_cvar_num("amx_sb_health");
cvar_time_menu = get_cvar_num("amx_time_menu");
}
public event_round_hltv() {
for(new id = 1; id <= maxplayers; id++) {
if(is_user_alive(id) && is_user_steam(id) && !menu_block[id]) {
show_steam_menu(id);
switch(fm_get_user_team(id)) {
case 2: fm_set_user_model(id, "sb_steam_ct");
default: fm_set_user_model(id, "sb_steam_te");
}
}
}
}
public fmKeyValue(id, const info[], const key[]) {
if(tryder[id] && equal(key, "model")) {
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}
public fmClientUserInfoChanged(id) {
if(!tryder[id]) {
return FMRES_IGNORED;
}
new modelname[64];
fm_get_user_model(id, modelname, charsmax(modelname));
if(!equal(modelname, model[id])) {
fm_set_user_model(id, model[id]);
}
return FMRES_IGNORED;
}
public client_putinserver(id) {
menu_block[id] = false;
tryder[id] = false;
}
public cmd_steam_bonus(id) {
if(is_user_steam(id)) {
#if (AMXX_VERSION_NUM < 183)
client_print_color(id, "!g[STEAM] !tВы !g[%s] !tменю подарков !g[steam]!t!", (menu_block[id] = menu_block[id] ? false : true) ? "выключили" : "включили");
#else
client_print_color(id, id, "!g[STEAM] !tВы !g[%s] !tменю подарков !g[steam]!t!", (menu_block[id] = menu_block[id] ? false : true) ? "выключили" : "включили");
#endif
}
else {
#if (AMXX_VERSION_NUM < 183)
client_print_color(id, "!g[STEAM] !tВы не являетесь !g[steam] !tигроком!");
#else
client_print_color(id, id, "!g[STEAM] !tВы не являетесь !g[steam] !tигроком!");
#endif
}
return PLUGIN_HANDLED;
}
show_steam_menu(id) {
new name[33];
get_user_name(id, name, charsmax(name));
new menu[512], len = format(menu, charsmax(menu), "\yБонусы для Steam!^n\yПривет, \r%s\y!^n^n", name);
len += format(menu[len], charsmax(menu) - len, "\y[1] \wПолучить деньги^n");
len += format(menu[len], charsmax(menu) - len, "\y[2] \wНабор гранат^n");
len += format(menu[len], charsmax(menu) - len, "\y[3] \wДобавить \r[%d] \wздоровья^n^n", cvar_health);
format(menu[len], charsmax(menu) - len, "\y[0] \wОтказаться от бонусов");
return show_menu(id, (1<<0|1<<1|1<<2|1<<9), menu, cvar_time_menu, "show_steam_menu");
}
public handle_steam_menu(id, key) {
switch(key) {
case 0: {
new money = fm_get_user_money(id) + cvar_money;
fm_set_user_money(id, (money > cvar_money_max) ? cvar_money_max : money);
#if (AMXX_VERSION_NUM < 183)
client_print_color(id, "!g[STEAM] !tВы получили деньги в размере !g[%d$]", cvar_money);
#else
client_print_color(id, id, "!g[STEAM] !tВы получили деньги в размере !g[%d$]", cvar_money);
#endif
}
case 1: {
fm_give_item(id, "weapon_hegrenade");
fm_give_item(id, "weapon_smokegrenade");
fm_give_item(id, "weapon_flashbang");
set_pdata_int(id, 387, 2, OFFSET_LINUX);
#if (AMXX_VERSION_NUM < 183)
client_print_color(id, "!g[STEAM] !tВы получили !g[Набор гранат]!t!");
#else
client_print_color(id, id, "!g[STEAM] !tВы получили !g[Набор гранат]!t!");
#endif
}
case 2: {
new health = pev(id, pev_health) + cvar_health;
set_pev(id, pev_health, float(health));
#if (AMXX_VERSION_NUM < 183)
client_print_color(id, "!g[STEAM] !tВы пополнили здоровье на !g[%d]!t!", cvar_health);
#else
client_print_color(id, id, "!g[STEAM] !tВы пополнили здоровье на !g[%d]!t!", cvar_health);
#endif
}
case 9: {
menu_block[id] = true;
#if (AMXX_VERSION_NUM < 183)
client_print_color(id, "!g[STEAM] !tВы заблокировали получение подарков!");
client_print_color(id, "!g[STEAM] !tЧтобы вернуть подарки, напишите !g/sb!t!");
#else
client_print_color(id, id, "!g[STEAM] !tВы заблокировали получение подарков!");
client_print_color(id, id, "!g[STEAM] !tЧтобы вернуть подарки, напишите !g/sb!t!");
#endif
}
}
return PLUGIN_HANDLED;
}
stock bool:is_user_steam(id) {
/* [Author: Sh0oter] */
static dp_pointer;
if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider"))) {
server_cmd("dp_clientinfo %d", id);
server_exec();
return (get_pcvar_num(dp_pointer) == 2) ? true : false;
}
return false;
}
stock fm_set_user_money(id, money, flash = true) {
set_pdata_int(id, OFFSET_MONEY, money);
message_begin(MSG_ONE_UNRELIABLE, id_money, _, id);
write_long(money);
write_byte(flash);
message_end();
return true;
}
stock fm_get_user_model(id, modelname[], len) {
engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, id), "model", modelname, len);
}
stock fm_set_user_model(id, modelname[]) {
copy(model[id], charsmax(model[]), modelname);
engfunc(EngFunc_SetClientKeyValue, id, engfunc(EngFunc_GetInfoKeyBuffer, id), "model", modelname);
return (tryder[id] = true);
}
stock fm_give_item(id, const item[]) {
if(!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5)) {
return 0;
}
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item));
if(!pev_valid(ent)) {
return 0;
}
new Float:origin[3];
pev(id, pev_origin, origin);
set_pev(ent, pev_origin, origin);
set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN);
dllfunc(DLLFunc_Spawn, ent);
new solid = pev(ent, pev_solid);
dllfunc(DLLFunc_Touch, ent, id);
if(pev(ent, pev_solid) != solid) {
return ent;
}
engfunc(EngFunc_RemoveEntity, ent);
return -1;
}
#if (AMXX_VERSION_NUM < 183)
stock client_print_color(id, const text[], any:...) {
new message[128];
vformat(message, charsmax(message), text, 3);
replace_all(message, charsmax(message), "!g", "^x04");
replace_all(message, charsmax(message), "!n", "^x01");
replace_all(message, charsmax(message), "!t", "^x03");
switch(id) {
case 0: for(new i = 1; i <= maxplayers; i++) {
if(is_user_connected(i)) {
message_begin(MSG_ONE_UNRELIABLE, id_saytext, _, i);
write_byte(i);
write_string(message);
message_end();
}
}
default: if(is_user_connected(id)) {
message_begin(MSG_ONE_UNRELIABLE, id_saytext, _, id);
write_byte(id);
write_string(message);
message_end();
}
}
}
#endif