Post by zerotwo12 on Mar 11, 2022 9:48:12 GMT
Hello Guys This Is A Pick Up Gift Plugin I Need Help
I Want It Like This The Gift Should Appear Only After the first gift collected
Telling in Easy way: iwant it like this The gift should appear after one minute when the first gift is collected then the second gift should appear
smaa here
#include <amxmodx>
#include <amxmisc>
#include <fakemeta_util>
#include <hamsandwich>
#include <fun>
#include <WPMGPrintChatColor>
#define PLUGIN "Нация Ножей"
#define VERSION "0.8.1"
#define AUTHOR "Psycrow"
#define is_entity_player(%1) (1<=%1<=g_maxPlayers)
#define PRESENT_CLASSNAME "next21_gift"
#define pev_lifes pev_euser1
#define MODEL_PRESENT "models/present/w_present.mdl"
#define MODEL_SKINS 3
#define MODEL_SUBMODELS 5
#define MAX_MONEY 20000 // Максимальное кол-во денег у игрока
#if cellbits == 32
#define OFFSET_CSMONEY 115
#else
#define OFFSET_CSMONEY 140
#endif
new
g_msgMoney,
g_infoTarget,
g_maxPlayers,
g_menuId = -1,
bool: g_registration,
g_totalGifts, //Кол-во загруженных подарков на карте
g_get_round_times[33], //Сколько раз игрок поднял подарков за раунд
g_get_game_times[33], //Сколько раз игрок поднял подарков за игру
g_disconnections, //Сколько игроков покинуло сервер
bool: g_have_speed[33], //Имеет ли игрок добавленную скорость
bool: g_have_gravity[33], //Имеет ли игрок добавленную гравитацию
bool: g_have_sw[33], //Имеет ли игрок заглушенные шаги
bool: g_save_cpl, //Изменения в расположении подарков
Float: g_massage_rate[33], //Ограничение оповещений о попытке собрать подарок ограниченному игроку
Array:g_gift_id, //Индексы подарков
Array:g_gift_x,
Array:g_gift_y,
Array:g_gift_z,
Array:g_plr_steamid,
Array:g_plr_times
public plugin_precache()
{
precache_model(MODEL_PRESENT)
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar("cv_gift_access","l") // Menu access flag
register_cvar("cv_gift_money_min","500") // Minimum reward for collected gift
register_cvar("cv_gift_money_max","8000") // The maximum reward for the collected gift
register_cvar("cv_gift_silent_walk","0") // Whether to add silent running to gifts
register_cvar("cv_gift_gravitation","0.5") // The meaning of gravity. 0.0 - remove this type of gift
register_cvar("cv_gift_speed","300.0") // Speed value. 0.0 - remove this type of gift
register_cvar("cv_gift_HE","2") // How many HE grenades can be obtained as gifts. 0 - remove this type of gift
register_cvar("cv_gift_health","35") // How much HP can be obtained in gifts. 0 - remove this type of gift
register_cvar("cv_gift_timerate","500.0") // How many seconds before the gift appears
register_cvar("cv_gift_get_times_round","0") // How many gifts can be collected per round. 0 - removes the restriction
register_cvar("cv_gift_get_times_game","0") // How many gifts can be collected per game (card). 0 - removes the restriction
register_cvar("cv_gift_lifes","0") // How many times a gift can appear in the same place (0 - unlimited, 1 - after collecting it does not appear again ...)
register_clcmd("say /gift", "gift_menu")
register_clcmd("say_team /gift", "gift_menu" )
register_clcmd("say /gifts", "gift_menu" )
register_clcmd("say_team /gifts", "gift_menu" )
g_infoTarget = engfunc(EngFunc_AllocString, "info_target")
}
public plugin_cfg()
{
new map[32]
get_mapname(map, charsmax(map))
formatex(map, charsmax(map),"%s.ini",map)
new cfgDir[64], iDir, iFile[128]
get_configsdir(cfgDir, charsmax(cfgDir))
formatex(cfgDir, charsmax(cfgDir), "%s/next21_gifts", cfgDir)
iDir = open_dir(cfgDir, iFile, charsmax(iFile))
if(iDir)
{
while(next_file(iDir, iFile, charsmax(iFile)))
{
if (iFile[0] == '.')
continue
if(equal(map, iFile))
{
format(iFile, 128, "%s/%s", cfgDir, iFile)
get_gifts(iFile)
break
}
}
}
else server_print("[%s] Gifts was not loaded", PLUGIN)
}
public client_putinserver(id)
{
if(!g_registration) return
if(get_cvar_num("cv_gift_get_times_game"))
{
new steamId[32], arraySteamId[32]
get_user_authid(id, steamId, 31)
for(new i = 0; i < g_disconnections; i++)
{
ArrayGetString(g_plr_steamid, i, arraySteamId, 31)
if(equal(steamId, arraySteamId))
{
g_get_game_times[id] = ArrayGetCell(g_plr_times, i)
return
}
}
g_get_game_times[id] = 0
}
}
public client_disconnect(id)
{
if(!g_registration) return
if(get_cvar_num("cv_gift_get_times_game"))
{
new steamId[32], arraySteamId[32]
get_user_authid(id, steamId, 31)
for(new i = 0; i < g_disconnections; i++)
{
ArrayGetString(g_plr_steamid, i, arraySteamId, 31)
if(equal(steamId, arraySteamId))
{
ArraySetCell(g_plr_times, i, g_get_game_times[id])
return
}
}
ArrayPushString(g_plr_steamid, steamId)
ArrayPushCell(g_plr_times, g_get_game_times[id])
g_disconnections++
}
}
public fw_PlayerSpawn(id)
{
if(!is_user_alive(id)) return;
if(g_have_gravity[id])
{
set_user_gravity(id)
g_have_gravity[id] = false
}
if(g_have_sw[id])
{
set_user_footsteps(id, 0)
g_have_sw[id] = false
}
g_have_speed[id] = false
}
public CurWeapon(id)
{
if(g_have_speed[id])
set_user_maxspeed(id, get_cvar_float("cv_gift_speed"))
}
public fw_RoundStart()
{
for(new i = 1; i <= g_maxPlayers; i++)
g_get_round_times = 0
new lifes = get_cvar_num("cv_gift_lifes")
if(lifes)
{
new ent
while((ent = fm_find_ent_by_class(ent, PRESENT_CLASSNAME)))
set_pev(ent, pev_lifes, lifes)
}
}
public fw_TouchGift(ent, id)
{
if(!is_entity_player(id))
return
if(g_massage_rate[id] > get_gametime() || !is_user_alive(id) || !pev_valid(ent))
return
static className[32]
pev(ent, pev_classname, className, 31)
if(!equal(className, PRESENT_CLASSNAME))
return
new times = get_cvar_num("cv_gift_get_times_round")
if(times && g_get_round_times[id] >= times)
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou have exceeded the limit of collecting gifts for the round", PLUGIN)
g_massage_rate[id] = get_gametime() + 3.0
return
}
times = get_cvar_num("cv_gift_get_times_game")
if(times && g_get_game_times[id] >= times)
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou have exceeded the limit for collecting gifts for the game", PLUGIN)
g_massage_rate[id] = get_gametime() + 3.0
return
}
engfunc(EngFunc_SetModel, ent, MODEL_PRESENT)
set_pev(ent, pev_skin, random_num(0, MODEL_SKINS - 1))
set_pev(ent, pev_body, random_num(0, MODEL_SUBMODELS - 1))
hide_gift(ent)
give_gift(id)
if(get_cvar_num("cv_gift_get_times_game")) g_get_game_times[id]++
if(get_cvar_num("cv_gift_get_times_round")) g_get_round_times[id]++
if(get_cvar_num("cv_gift_lifes")) set_pev(ent, pev_lifes, pev(ent, pev_lifes) - 1)
}
public set_gift()
{
if(!g_totalGifts) return
new valid_gifts_count = 0
new ent, lifes_active = get_cvar_num("cv_gift_lifes")
while((ent = fm_find_ent_by_class(ent, PRESENT_CLASSNAME)))
{
if(pev(ent, pev_solid) != SOLID_NOT || (lifes_active && !pev(ent, pev_lifes)))
valid_gifts_count++
}
if(valid_gifts_count == g_totalGifts) return
new bool: check = false, id
while(check == false)
{
id = random_num(0, g_totalGifts - 1)
ent = ArrayGetCell(g_gift_id ,id)
if(pev(ent, pev_solid) == SOLID_NOT && (!lifes_active || pev(ent, pev_lifes)))
{
set_pev(ent, pev_solid, SOLID_TRIGGER)
unhide_gift(ent)
check = true
}
}
}
public gift_menu(id)
{
if(!is_user_access(id))
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou do not have rights to this feature", PLUGIN)
return
}
new menu_name[90]
format(menu_name, 89, "\rArrangement Of Gifts^n\dCurrent Gifts: %d", g_totalGifts + 1)
g_menuId = menu_create(menu_name, "menu_handler")
menu_additem(g_menuId, "\wSet Gift", "1", 0)
if(!g_totalGifts)
{
menu_additem(g_menuId, "\dDelete Previous Gift", "2", 0)
menu_additem(g_menuId, "\dDelete all Gifts", "3", 0)
}
else
{
menu_additem(g_menuId, "\wDelete Previous Gift", "2", 0)
menu_additem(g_menuId, "\wDelete all Gifts", "3", 0)
}
if(!g_save_cpl)
menu_additem(g_menuId, "\dSave Changes", "4", 0)
else menu_additem(g_menuId, "\wSave Changes", "4", 0)
menu_setprop(g_menuId, MPROP_EXIT, MEXIT_ALL)
menu_setprop(g_menuId, MPROP_EXITNAME, "\yEXIT")
menu_display(id, g_menuId, 0)
new keys
get_user_menu(id, g_menuId, keys)
for(new i = 0; i < g_totalGifts; i++)
unhide_gift(ArrayGetCell(g_gift_id, i))
}
public menu_handler(id, menu, item)
{
if(item == MENU_EXIT)
{
new ent
for(new i = 0; i < g_totalGifts; i++)
{
ent = ArrayGetCell(g_gift_id, i)
if(pev(ent, pev_solid) == SOLID_NOT) hide_gift(ent)
}
menu_destroy(menu)
return PLUGIN_HANDLED
}
switch(item)
{
case 0:
{
new Float:fOrigin[3]
fm_get_aim_origin(id, fOrigin)
if(create_gift(fOrigin))
g_save_cpl = true
menu_destroy(menu)
gift_menu(id)
}
case 1:
{
if(!g_totalGifts)
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tThere Are no Gifts On the Card", PLUGIN)
menu_destroy(menu)
gift_menu(id)
return PLUGIN_HANDLED
}
g_save_cpl = true
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tGift Removed", PLUGIN)
g_totalGifts--
engfunc(EngFunc_RemoveEntity, ArrayGetCell(g_gift_id, g_totalGifts))
ArrayDeleteItem(g_gift_id, g_totalGifts)
ArrayDeleteItem(g_gift_x, g_totalGifts)
ArrayDeleteItem(g_gift_y, g_totalGifts)
ArrayDeleteItem(g_gift_z, g_totalGifts)
menu_destroy(menu)
gift_menu(id)
}
case 2:
{
if(!g_totalGifts)
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tThere Are No Gifts On The Card", PLUGIN)
menu_destroy(menu)
gift_menu(id)
return PLUGIN_HANDLED
}
g_save_cpl = true
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tHas Been Removed !g%d !tGifts", PLUGIN, g_totalGifts)
new ent
while((ent = fm_find_ent_by_class(ent, PRESENT_CLASSNAME)))
engfunc(EngFunc_RemoveEntity, ent)
g_totalGifts = 0
ArrayClear(g_gift_id)
ArrayClear(g_gift_x)
ArrayClear(g_gift_y)
ArrayClear(g_gift_z)
menu_destroy(menu)
gift_menu(id)
}
case 3:
{
if(!g_save_cpl)
{
menu_destroy(menu)
gift_menu(id)
return PLUGIN_HANDLED
}
g_save_cpl = false
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !t%s", PLUGIN, save_gifts() ? "Saved" : "Not Saved")
menu_destroy(menu)
gift_menu(id)
}
}
return PLUGIN_HANDLED
}
bool: save_gifts()
{
new map[32]
get_mapname(map, charsmax(map))
formatex(map, charsmax(map), "%s.ini", map)
new cfgDir[64], iFile[128]
get_configsdir(cfgDir, charsmax(cfgDir))
formatex(cfgDir, charsmax(cfgDir), "%s/next21_gifts", cfgDir)
formatex(iFile, charsmax(iFile), "%s/%s", cfgDir, map)
if(!dir_exists(cfgDir))
if(!mkdir(cfgDir))
return false
delete_file(iFile)
if(!g_totalGifts)
return true
for(new i = 0; i < g_totalGifts; i++)
{
new text[128], Float:fOrigin[3], ent = ArrayGetCell(g_gift_id, i)
pev(ent, pev_origin, fOrigin)
format(text, charsmax(text),"^"%f^" ^"%f^" ^"%f^"",fOrigin[0], fOrigin[1], fOrigin[2])
write_file(iFile, text, i)
}
return true
}
get_gifts(const iFile[128])
{
new file = fopen(iFile, "rt")
if(!file)
{
server_print("[%s] Gifts was not loaded", PLUGIN)
return
}
while(file && !feof(file))
{
new sfLineData[512]
fgets(file, sfLineData, charsmax(sfLineData))
if(sfLineData[0] == ';')
continue
if(equal(sfLineData, ""))
continue
new origins[3][32], Float: fOrigin[3]
parse(sfLineData, origins[0], 31, origins[1], 31, origins[2], 31)
fOrigin[0] = str_to_float(origins[0])
fOrigin[1] = str_to_float(origins[1])
fOrigin[2] = str_to_float(origins[2])
create_gift(fOrigin)
}
fclose(file)
if(!g_totalGifts)
server_print("[%s] Gifts was not loaded", PLUGIN)
else if(g_totalGifts == 1)
server_print("[%s] Loaded one gift", PLUGIN)
else
server_print("[%s] Loaded %d gifts", PLUGIN, g_totalGifts)
}
bool: create_gift(const Float: fOrigin[3])
{
new ent = engfunc(EngFunc_CreateNamedEntity, g_infoTarget)
if(!pev_valid(ent)) return false
if(!g_registration)
{
register_event("CurWeapon", "CurWeapon", "be","1=1")
register_event("HLTV", "fw_RoundStart", "a", "1=0", "2=0")
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn", 1)
RegisterHamFromEntity(Ham_Touch, ent, "fw_TouchGift")
set_task(get_cvar_float("cv_gift_timerate"), "set_gift", _, _, _, "b")
g_gift_id = ArrayCreate()
g_gift_x = ArrayCreate()
g_gift_y = ArrayCreate()
g_gift_z = ArrayCreate()
if(get_cvar_num("cv_gift_get_times_game"))
{
g_plr_steamid = ArrayCreate(32)
g_plr_times = ArrayCreate(32)
}
g_maxPlayers = get_maxplayers()
g_msgMoney = get_user_msgid("Money")
g_registration = true
fw_RoundStart()
}
ArrayPushCell(g_gift_id, ent)
ArrayPushCell(g_gift_x, fOrigin[0])
ArrayPushCell(g_gift_y, fOrigin[1])
ArrayPushCell(g_gift_z, fOrigin[2])
engfunc(EngFunc_SetModel, ent, MODEL_PRESENT)
set_pev(ent, pev_origin, fOrigin)
set_pev(ent, pev_solid, SOLID_NOT)
set_pev(ent, pev_movetype, MOVETYPE_FLY)
set_pev(ent, pev_gravity, 1.0)
set_pev(ent, pev_classname, PRESENT_CLASSNAME)
set_pev(ent, pev_skin, random_num(0, MODEL_SKINS - 1))
set_pev(ent, pev_body, random_num(0, MODEL_SUBMODELS - 1))
engfunc(EngFunc_SetSize, ent, Float:{-15.0, -15.0, 0.0}, Float:{15.0, 15.0, 30.0})
hide_gift(ent)
g_totalGifts++
return true
}
hide_gift(ent)
{
set_pev(ent, pev_solid, SOLID_NOT)
for(new i = 1; i <= g_maxPlayers; i++)
{
new mid, keys
get_user_menu(i, mid, keys)
if(mid == g_menuId)
{
fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 150)
return
}
}
fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0)
}
unhide_gift(ent)
{
if(pev(ent, pev_solid) == SOLID_NOT)
fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 150)
else
fm_set_rendering(ent, kRenderFxGlowShell, random_num(0,255), random_num(0,255), random_num(0,255), kRenderNormal, 15)
}
give_gift(id) //Выдает случайный бонус с подарка. Добавьте case, если хотите доавить свой.
{
static loopDestroy
loopDestroy++
if(loopDestroy > 20)
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tThe Gift Was Empty", PLUGIN)
loopDestroy = 0
return
}
new max_random_gift = 6//Сколько видов бонусов в подарках
switch(random_num(1, max_random_gift))
{
case 1:
{
new reward = random_num(get_cvar_num("cv_gift_money_min"), get_cvar_num("cv_gift_money_max"))
new curr_money = get_pdata_int(id, OFFSET_CSMONEY)
if(curr_money + reward > MAX_MONEY)
reward = MAX_MONEY - curr_money
if(reward)
{
set_pdata_int(id, OFFSET_CSMONEY, curr_money + reward)
message_begin(MSG_ONE, g_msgMoney, _, id)
write_long(curr_money + reward)
write_byte(1)
message_end()
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou Got !g%d$", PLUGIN, reward)
loopDestroy = 0
}
else give_gift(id)
}
case 2:
{
if(!g_have_sw[id] && !get_user_footsteps(id) && get_cvar_num("cv_gift_silent_walk"))
{
g_have_sw[id] = true
set_user_footsteps(id)
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou Got Silent FootSteps", PLUGIN)
loopDestroy = 0
}
else give_gift(id)
}
case 3:
{
new Float: gravity = get_cvar_float("cv_gift_gravitation")
if(!g_have_gravity[id] && get_user_gravity(id) > gravity && gravity)
{
g_have_gravity[id] = true
set_user_gravity(id, gravity)
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou Got Gravity", PLUGIN)
loopDestroy = 0
}
else give_gift(id)
}
case 4:
{
new Float: speed = get_cvar_float("cv_gift_speed")
if(!g_have_speed[id] && get_user_maxspeed(id) < speed && speed)
{
g_have_speed[id] = true
set_user_maxspeed(id, speed)
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou Got Speed", PLUGIN)
loopDestroy = 0
}
else give_gift(id)
}
case 5:
{
new hes = get_cvar_num("cv_gift_HE")
if(hes)
{
if(!user_has_weapon(id, CSW_HEGRENADE))
{
fm_give_item(id, "weapon_hegrenade")
cs_set_user_bpammo(id, CSW_HEGRENADE, hes)
}
else cs_set_user_bpammo(id, CSW_HEGRENADE, cs_get_user_bpammo(id, CSW_HEGRENADE) + hes)
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou Got Grenade (%d HE)", PLUGIN, hes)
loopDestroy = 0
}
else give_gift(id)
}
case 6:
{
new hp = get_cvar_num("cv_gift_health")
if(hp)
{
fm_set_user_health(id, pev(id, pev_health) + hp)
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou got (%d hp)", PLUGIN, hp)
loopDestroy = 0
}
else give_gift(id)
}
//case 7: тут по примерам выше
}
}
bool: is_user_access(id)
{
new flag_access[24]
get_cvar_string("cv_gift_access", flag_access, charsmax(flag_access))
new flags = get_user_flags(id)
if(contain(flag_access, "a") > -1 && (flags & ADMIN_IMMUNITY))
return true
if(contain(flag_access, "b") > -1 && (flags & ADMIN_RESERVATION))
return true
if(contain(flag_access, "c") > -1 && (flags & ADMIN_KICK))
return true
if(contain(flag_access, "d") > -1 && (flags & ADMIN_BAN))
return true
if(contain(flag_access, "e") > -1 && (flags & ADMIN_SLAY))
return true
if(contain(flag_access, "f") > -1 && (flags & ADMIN_MAP))
return true
if(contain(flag_access, "g") > -1 && (flags & ADMIN_CVAR))
return true
if(contain(flag_access, "h") > -1 && (flags & ADMIN_CFG))
return true
if(contain(flag_access, "i") > -1 && (flags & ADMIN_CHAT))
return true
if(contain(flag_access, "j") > -1 && (flags & ADMIN_VOTE))
return true
if(contain(flag_access, "k") > -1 && (flags & ADMIN_PASSWORD))
return true
if(contain(flag_access, "l") > -1 && (flags & ADMIN_RCON))
return true
if(contain(flag_access, "m") > -1 && (flags & ADMIN_LEVEL_A))
return true
if(contain(flag_access, "n") > -1 && (flags & ADMIN_LEVEL_B))
return true
if(contain(flag_access, "o") > -1 && (flags & ADMIN_LEVEL_C))
return true
if(contain(flag_access, "p") > -1 && (flags & ADMIN_LEVEL_D))
return true
if(contain(flag_access, "q") > -1 && (flags & ADMIN_LEVEL_E))
return true
if(contain(flag_access, "r") > -1 && (flags & ADMIN_LEVEL_F))
return true
if(contain(flag_access, "s") > -1 && (flags & ADMIN_LEVEL_G))
return true
if(contain(flag_access, "t") > -1 && (flags & ADMIN_LEVEL_H))
return true
if(contain(flag_access, "u") > -1 && (flags & ADMIN_MENU))
return true
if(contain(flag_access, "y") > -1 && (flags & ADMIN_ADMIN))
return true
if(contain(flag_access, "z") > -1 && (flags & ADMIN_USER))
return true
return false
}
I Want It Like This The Gift Should Appear Only After the first gift collected
Telling in Easy way: iwant it like this The gift should appear after one minute when the first gift is collected then the second gift should appear
smaa here
#include <amxmodx>
#include <amxmisc>
#include <fakemeta_util>
#include <hamsandwich>
#include <fun>
#include <WPMGPrintChatColor>
#define PLUGIN "Нация Ножей"
#define VERSION "0.8.1"
#define AUTHOR "Psycrow"
#define is_entity_player(%1) (1<=%1<=g_maxPlayers)
#define PRESENT_CLASSNAME "next21_gift"
#define pev_lifes pev_euser1
#define MODEL_PRESENT "models/present/w_present.mdl"
#define MODEL_SKINS 3
#define MODEL_SUBMODELS 5
#define MAX_MONEY 20000 // Максимальное кол-во денег у игрока
#if cellbits == 32
#define OFFSET_CSMONEY 115
#else
#define OFFSET_CSMONEY 140
#endif
new
g_msgMoney,
g_infoTarget,
g_maxPlayers,
g_menuId = -1,
bool: g_registration,
g_totalGifts, //Кол-во загруженных подарков на карте
g_get_round_times[33], //Сколько раз игрок поднял подарков за раунд
g_get_game_times[33], //Сколько раз игрок поднял подарков за игру
g_disconnections, //Сколько игроков покинуло сервер
bool: g_have_speed[33], //Имеет ли игрок добавленную скорость
bool: g_have_gravity[33], //Имеет ли игрок добавленную гравитацию
bool: g_have_sw[33], //Имеет ли игрок заглушенные шаги
bool: g_save_cpl, //Изменения в расположении подарков
Float: g_massage_rate[33], //Ограничение оповещений о попытке собрать подарок ограниченному игроку
Array:g_gift_id, //Индексы подарков
Array:g_gift_x,
Array:g_gift_y,
Array:g_gift_z,
Array:g_plr_steamid,
Array:g_plr_times
public plugin_precache()
{
precache_model(MODEL_PRESENT)
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar("cv_gift_access","l") // Menu access flag
register_cvar("cv_gift_money_min","500") // Minimum reward for collected gift
register_cvar("cv_gift_money_max","8000") // The maximum reward for the collected gift
register_cvar("cv_gift_silent_walk","0") // Whether to add silent running to gifts
register_cvar("cv_gift_gravitation","0.5") // The meaning of gravity. 0.0 - remove this type of gift
register_cvar("cv_gift_speed","300.0") // Speed value. 0.0 - remove this type of gift
register_cvar("cv_gift_HE","2") // How many HE grenades can be obtained as gifts. 0 - remove this type of gift
register_cvar("cv_gift_health","35") // How much HP can be obtained in gifts. 0 - remove this type of gift
register_cvar("cv_gift_timerate","500.0") // How many seconds before the gift appears
register_cvar("cv_gift_get_times_round","0") // How many gifts can be collected per round. 0 - removes the restriction
register_cvar("cv_gift_get_times_game","0") // How many gifts can be collected per game (card). 0 - removes the restriction
register_cvar("cv_gift_lifes","0") // How many times a gift can appear in the same place (0 - unlimited, 1 - after collecting it does not appear again ...)
register_clcmd("say /gift", "gift_menu")
register_clcmd("say_team /gift", "gift_menu" )
register_clcmd("say /gifts", "gift_menu" )
register_clcmd("say_team /gifts", "gift_menu" )
g_infoTarget = engfunc(EngFunc_AllocString, "info_target")
}
public plugin_cfg()
{
new map[32]
get_mapname(map, charsmax(map))
formatex(map, charsmax(map),"%s.ini",map)
new cfgDir[64], iDir, iFile[128]
get_configsdir(cfgDir, charsmax(cfgDir))
formatex(cfgDir, charsmax(cfgDir), "%s/next21_gifts", cfgDir)
iDir = open_dir(cfgDir, iFile, charsmax(iFile))
if(iDir)
{
while(next_file(iDir, iFile, charsmax(iFile)))
{
if (iFile[0] == '.')
continue
if(equal(map, iFile))
{
format(iFile, 128, "%s/%s", cfgDir, iFile)
get_gifts(iFile)
break
}
}
}
else server_print("[%s] Gifts was not loaded", PLUGIN)
}
public client_putinserver(id)
{
if(!g_registration) return
if(get_cvar_num("cv_gift_get_times_game"))
{
new steamId[32], arraySteamId[32]
get_user_authid(id, steamId, 31)
for(new i = 0; i < g_disconnections; i++)
{
ArrayGetString(g_plr_steamid, i, arraySteamId, 31)
if(equal(steamId, arraySteamId))
{
g_get_game_times[id] = ArrayGetCell(g_plr_times, i)
return
}
}
g_get_game_times[id] = 0
}
}
public client_disconnect(id)
{
if(!g_registration) return
if(get_cvar_num("cv_gift_get_times_game"))
{
new steamId[32], arraySteamId[32]
get_user_authid(id, steamId, 31)
for(new i = 0; i < g_disconnections; i++)
{
ArrayGetString(g_plr_steamid, i, arraySteamId, 31)
if(equal(steamId, arraySteamId))
{
ArraySetCell(g_plr_times, i, g_get_game_times[id])
return
}
}
ArrayPushString(g_plr_steamid, steamId)
ArrayPushCell(g_plr_times, g_get_game_times[id])
g_disconnections++
}
}
public fw_PlayerSpawn(id)
{
if(!is_user_alive(id)) return;
if(g_have_gravity[id])
{
set_user_gravity(id)
g_have_gravity[id] = false
}
if(g_have_sw[id])
{
set_user_footsteps(id, 0)
g_have_sw[id] = false
}
g_have_speed[id] = false
}
public CurWeapon(id)
{
if(g_have_speed[id])
set_user_maxspeed(id, get_cvar_float("cv_gift_speed"))
}
public fw_RoundStart()
{
for(new i = 1; i <= g_maxPlayers; i++)
g_get_round_times = 0
new lifes = get_cvar_num("cv_gift_lifes")
if(lifes)
{
new ent
while((ent = fm_find_ent_by_class(ent, PRESENT_CLASSNAME)))
set_pev(ent, pev_lifes, lifes)
}
}
public fw_TouchGift(ent, id)
{
if(!is_entity_player(id))
return
if(g_massage_rate[id] > get_gametime() || !is_user_alive(id) || !pev_valid(ent))
return
static className[32]
pev(ent, pev_classname, className, 31)
if(!equal(className, PRESENT_CLASSNAME))
return
new times = get_cvar_num("cv_gift_get_times_round")
if(times && g_get_round_times[id] >= times)
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou have exceeded the limit of collecting gifts for the round", PLUGIN)
g_massage_rate[id] = get_gametime() + 3.0
return
}
times = get_cvar_num("cv_gift_get_times_game")
if(times && g_get_game_times[id] >= times)
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou have exceeded the limit for collecting gifts for the game", PLUGIN)
g_massage_rate[id] = get_gametime() + 3.0
return
}
engfunc(EngFunc_SetModel, ent, MODEL_PRESENT)
set_pev(ent, pev_skin, random_num(0, MODEL_SKINS - 1))
set_pev(ent, pev_body, random_num(0, MODEL_SUBMODELS - 1))
hide_gift(ent)
give_gift(id)
if(get_cvar_num("cv_gift_get_times_game")) g_get_game_times[id]++
if(get_cvar_num("cv_gift_get_times_round")) g_get_round_times[id]++
if(get_cvar_num("cv_gift_lifes")) set_pev(ent, pev_lifes, pev(ent, pev_lifes) - 1)
}
public set_gift()
{
if(!g_totalGifts) return
new valid_gifts_count = 0
new ent, lifes_active = get_cvar_num("cv_gift_lifes")
while((ent = fm_find_ent_by_class(ent, PRESENT_CLASSNAME)))
{
if(pev(ent, pev_solid) != SOLID_NOT || (lifes_active && !pev(ent, pev_lifes)))
valid_gifts_count++
}
if(valid_gifts_count == g_totalGifts) return
new bool: check = false, id
while(check == false)
{
id = random_num(0, g_totalGifts - 1)
ent = ArrayGetCell(g_gift_id ,id)
if(pev(ent, pev_solid) == SOLID_NOT && (!lifes_active || pev(ent, pev_lifes)))
{
set_pev(ent, pev_solid, SOLID_TRIGGER)
unhide_gift(ent)
check = true
}
}
}
public gift_menu(id)
{
if(!is_user_access(id))
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou do not have rights to this feature", PLUGIN)
return
}
new menu_name[90]
format(menu_name, 89, "\rArrangement Of Gifts^n\dCurrent Gifts: %d", g_totalGifts + 1)
g_menuId = menu_create(menu_name, "menu_handler")
menu_additem(g_menuId, "\wSet Gift", "1", 0)
if(!g_totalGifts)
{
menu_additem(g_menuId, "\dDelete Previous Gift", "2", 0)
menu_additem(g_menuId, "\dDelete all Gifts", "3", 0)
}
else
{
menu_additem(g_menuId, "\wDelete Previous Gift", "2", 0)
menu_additem(g_menuId, "\wDelete all Gifts", "3", 0)
}
if(!g_save_cpl)
menu_additem(g_menuId, "\dSave Changes", "4", 0)
else menu_additem(g_menuId, "\wSave Changes", "4", 0)
menu_setprop(g_menuId, MPROP_EXIT, MEXIT_ALL)
menu_setprop(g_menuId, MPROP_EXITNAME, "\yEXIT")
menu_display(id, g_menuId, 0)
new keys
get_user_menu(id, g_menuId, keys)
for(new i = 0; i < g_totalGifts; i++)
unhide_gift(ArrayGetCell(g_gift_id, i))
}
public menu_handler(id, menu, item)
{
if(item == MENU_EXIT)
{
new ent
for(new i = 0; i < g_totalGifts; i++)
{
ent = ArrayGetCell(g_gift_id, i)
if(pev(ent, pev_solid) == SOLID_NOT) hide_gift(ent)
}
menu_destroy(menu)
return PLUGIN_HANDLED
}
switch(item)
{
case 0:
{
new Float:fOrigin[3]
fm_get_aim_origin(id, fOrigin)
if(create_gift(fOrigin))
g_save_cpl = true
menu_destroy(menu)
gift_menu(id)
}
case 1:
{
if(!g_totalGifts)
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tThere Are no Gifts On the Card", PLUGIN)
menu_destroy(menu)
gift_menu(id)
return PLUGIN_HANDLED
}
g_save_cpl = true
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tGift Removed", PLUGIN)
g_totalGifts--
engfunc(EngFunc_RemoveEntity, ArrayGetCell(g_gift_id, g_totalGifts))
ArrayDeleteItem(g_gift_id, g_totalGifts)
ArrayDeleteItem(g_gift_x, g_totalGifts)
ArrayDeleteItem(g_gift_y, g_totalGifts)
ArrayDeleteItem(g_gift_z, g_totalGifts)
menu_destroy(menu)
gift_menu(id)
}
case 2:
{
if(!g_totalGifts)
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tThere Are No Gifts On The Card", PLUGIN)
menu_destroy(menu)
gift_menu(id)
return PLUGIN_HANDLED
}
g_save_cpl = true
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tHas Been Removed !g%d !tGifts", PLUGIN, g_totalGifts)
new ent
while((ent = fm_find_ent_by_class(ent, PRESENT_CLASSNAME)))
engfunc(EngFunc_RemoveEntity, ent)
g_totalGifts = 0
ArrayClear(g_gift_id)
ArrayClear(g_gift_x)
ArrayClear(g_gift_y)
ArrayClear(g_gift_z)
menu_destroy(menu)
gift_menu(id)
}
case 3:
{
if(!g_save_cpl)
{
menu_destroy(menu)
gift_menu(id)
return PLUGIN_HANDLED
}
g_save_cpl = false
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !t%s", PLUGIN, save_gifts() ? "Saved" : "Not Saved")
menu_destroy(menu)
gift_menu(id)
}
}
return PLUGIN_HANDLED
}
bool: save_gifts()
{
new map[32]
get_mapname(map, charsmax(map))
formatex(map, charsmax(map), "%s.ini", map)
new cfgDir[64], iFile[128]
get_configsdir(cfgDir, charsmax(cfgDir))
formatex(cfgDir, charsmax(cfgDir), "%s/next21_gifts", cfgDir)
formatex(iFile, charsmax(iFile), "%s/%s", cfgDir, map)
if(!dir_exists(cfgDir))
if(!mkdir(cfgDir))
return false
delete_file(iFile)
if(!g_totalGifts)
return true
for(new i = 0; i < g_totalGifts; i++)
{
new text[128], Float:fOrigin[3], ent = ArrayGetCell(g_gift_id, i)
pev(ent, pev_origin, fOrigin)
format(text, charsmax(text),"^"%f^" ^"%f^" ^"%f^"",fOrigin[0], fOrigin[1], fOrigin[2])
write_file(iFile, text, i)
}
return true
}
get_gifts(const iFile[128])
{
new file = fopen(iFile, "rt")
if(!file)
{
server_print("[%s] Gifts was not loaded", PLUGIN)
return
}
while(file && !feof(file))
{
new sfLineData[512]
fgets(file, sfLineData, charsmax(sfLineData))
if(sfLineData[0] == ';')
continue
if(equal(sfLineData, ""))
continue
new origins[3][32], Float: fOrigin[3]
parse(sfLineData, origins[0], 31, origins[1], 31, origins[2], 31)
fOrigin[0] = str_to_float(origins[0])
fOrigin[1] = str_to_float(origins[1])
fOrigin[2] = str_to_float(origins[2])
create_gift(fOrigin)
}
fclose(file)
if(!g_totalGifts)
server_print("[%s] Gifts was not loaded", PLUGIN)
else if(g_totalGifts == 1)
server_print("[%s] Loaded one gift", PLUGIN)
else
server_print("[%s] Loaded %d gifts", PLUGIN, g_totalGifts)
}
bool: create_gift(const Float: fOrigin[3])
{
new ent = engfunc(EngFunc_CreateNamedEntity, g_infoTarget)
if(!pev_valid(ent)) return false
if(!g_registration)
{
register_event("CurWeapon", "CurWeapon", "be","1=1")
register_event("HLTV", "fw_RoundStart", "a", "1=0", "2=0")
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn", 1)
RegisterHamFromEntity(Ham_Touch, ent, "fw_TouchGift")
set_task(get_cvar_float("cv_gift_timerate"), "set_gift", _, _, _, "b")
g_gift_id = ArrayCreate()
g_gift_x = ArrayCreate()
g_gift_y = ArrayCreate()
g_gift_z = ArrayCreate()
if(get_cvar_num("cv_gift_get_times_game"))
{
g_plr_steamid = ArrayCreate(32)
g_plr_times = ArrayCreate(32)
}
g_maxPlayers = get_maxplayers()
g_msgMoney = get_user_msgid("Money")
g_registration = true
fw_RoundStart()
}
ArrayPushCell(g_gift_id, ent)
ArrayPushCell(g_gift_x, fOrigin[0])
ArrayPushCell(g_gift_y, fOrigin[1])
ArrayPushCell(g_gift_z, fOrigin[2])
engfunc(EngFunc_SetModel, ent, MODEL_PRESENT)
set_pev(ent, pev_origin, fOrigin)
set_pev(ent, pev_solid, SOLID_NOT)
set_pev(ent, pev_movetype, MOVETYPE_FLY)
set_pev(ent, pev_gravity, 1.0)
set_pev(ent, pev_classname, PRESENT_CLASSNAME)
set_pev(ent, pev_skin, random_num(0, MODEL_SKINS - 1))
set_pev(ent, pev_body, random_num(0, MODEL_SUBMODELS - 1))
engfunc(EngFunc_SetSize, ent, Float:{-15.0, -15.0, 0.0}, Float:{15.0, 15.0, 30.0})
hide_gift(ent)
g_totalGifts++
return true
}
hide_gift(ent)
{
set_pev(ent, pev_solid, SOLID_NOT)
for(new i = 1; i <= g_maxPlayers; i++)
{
new mid, keys
get_user_menu(i, mid, keys)
if(mid == g_menuId)
{
fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 150)
return
}
}
fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0)
}
unhide_gift(ent)
{
if(pev(ent, pev_solid) == SOLID_NOT)
fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 150)
else
fm_set_rendering(ent, kRenderFxGlowShell, random_num(0,255), random_num(0,255), random_num(0,255), kRenderNormal, 15)
}
give_gift(id) //Выдает случайный бонус с подарка. Добавьте case, если хотите доавить свой.
{
static loopDestroy
loopDestroy++
if(loopDestroy > 20)
{
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tThe Gift Was Empty", PLUGIN)
loopDestroy = 0
return
}
new max_random_gift = 6//Сколько видов бонусов в подарках
switch(random_num(1, max_random_gift))
{
case 1:
{
new reward = random_num(get_cvar_num("cv_gift_money_min"), get_cvar_num("cv_gift_money_max"))
new curr_money = get_pdata_int(id, OFFSET_CSMONEY)
if(curr_money + reward > MAX_MONEY)
reward = MAX_MONEY - curr_money
if(reward)
{
set_pdata_int(id, OFFSET_CSMONEY, curr_money + reward)
message_begin(MSG_ONE, g_msgMoney, _, id)
write_long(curr_money + reward)
write_byte(1)
message_end()
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou Got !g%d$", PLUGIN, reward)
loopDestroy = 0
}
else give_gift(id)
}
case 2:
{
if(!g_have_sw[id] && !get_user_footsteps(id) && get_cvar_num("cv_gift_silent_walk"))
{
g_have_sw[id] = true
set_user_footsteps(id)
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou Got Silent FootSteps", PLUGIN)
loopDestroy = 0
}
else give_gift(id)
}
case 3:
{
new Float: gravity = get_cvar_float("cv_gift_gravitation")
if(!g_have_gravity[id] && get_user_gravity(id) > gravity && gravity)
{
g_have_gravity[id] = true
set_user_gravity(id, gravity)
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou Got Gravity", PLUGIN)
loopDestroy = 0
}
else give_gift(id)
}
case 4:
{
new Float: speed = get_cvar_float("cv_gift_speed")
if(!g_have_speed[id] && get_user_maxspeed(id) < speed && speed)
{
g_have_speed[id] = true
set_user_maxspeed(id, speed)
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou Got Speed", PLUGIN)
loopDestroy = 0
}
else give_gift(id)
}
case 5:
{
new hes = get_cvar_num("cv_gift_HE")
if(hes)
{
if(!user_has_weapon(id, CSW_HEGRENADE))
{
fm_give_item(id, "weapon_hegrenade")
cs_set_user_bpammo(id, CSW_HEGRENADE, hes)
}
else cs_set_user_bpammo(id, CSW_HEGRENADE, cs_get_user_bpammo(id, CSW_HEGRENADE) + hes)
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou Got Grenade (%d HE)", PLUGIN, hes)
loopDestroy = 0
}
else give_gift(id)
}
case 6:
{
new hp = get_cvar_num("cv_gift_health")
if(hp)
{
fm_set_user_health(id, pev(id, pev_health) + hp)
PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tYou got (%d hp)", PLUGIN, hp)
loopDestroy = 0
}
else give_gift(id)
}
//case 7: тут по примерам выше
}
}
bool: is_user_access(id)
{
new flag_access[24]
get_cvar_string("cv_gift_access", flag_access, charsmax(flag_access))
new flags = get_user_flags(id)
if(contain(flag_access, "a") > -1 && (flags & ADMIN_IMMUNITY))
return true
if(contain(flag_access, "b") > -1 && (flags & ADMIN_RESERVATION))
return true
if(contain(flag_access, "c") > -1 && (flags & ADMIN_KICK))
return true
if(contain(flag_access, "d") > -1 && (flags & ADMIN_BAN))
return true
if(contain(flag_access, "e") > -1 && (flags & ADMIN_SLAY))
return true
if(contain(flag_access, "f") > -1 && (flags & ADMIN_MAP))
return true
if(contain(flag_access, "g") > -1 && (flags & ADMIN_CVAR))
return true
if(contain(flag_access, "h") > -1 && (flags & ADMIN_CFG))
return true
if(contain(flag_access, "i") > -1 && (flags & ADMIN_CHAT))
return true
if(contain(flag_access, "j") > -1 && (flags & ADMIN_VOTE))
return true
if(contain(flag_access, "k") > -1 && (flags & ADMIN_PASSWORD))
return true
if(contain(flag_access, "l") > -1 && (flags & ADMIN_RCON))
return true
if(contain(flag_access, "m") > -1 && (flags & ADMIN_LEVEL_A))
return true
if(contain(flag_access, "n") > -1 && (flags & ADMIN_LEVEL_B))
return true
if(contain(flag_access, "o") > -1 && (flags & ADMIN_LEVEL_C))
return true
if(contain(flag_access, "p") > -1 && (flags & ADMIN_LEVEL_D))
return true
if(contain(flag_access, "q") > -1 && (flags & ADMIN_LEVEL_E))
return true
if(contain(flag_access, "r") > -1 && (flags & ADMIN_LEVEL_F))
return true
if(contain(flag_access, "s") > -1 && (flags & ADMIN_LEVEL_G))
return true
if(contain(flag_access, "t") > -1 && (flags & ADMIN_LEVEL_H))
return true
if(contain(flag_access, "u") > -1 && (flags & ADMIN_MENU))
return true
if(contain(flag_access, "y") > -1 && (flags & ADMIN_ADMIN))
return true
if(contain(flag_access, "z") > -1 && (flags & ADMIN_USER))
return true
return false
}