#include <amxmodx>
#include <reapi>
#include <fakemeta>
#include <engine>
#include <cstrike>
#include <aes_v>
#include <greypanel>
#pragma semicolon 1
#define CLASSNAME_GIFT "gift_box_entity"
#define DEFAULT_MODEL "models/PNV/gift.mdl"
#define DEFAULT_SOUND "PNV/gift_pickup.wav"
new g_cvarInterval;
new g_cvarModel;
new g_cvarSound;
new g_szModel[64];
new g_szSound[64];
new Float:g_fInterval;
new Array:g_SpawnPoints;
new bool:g_hasDoubleJump[33];
public plugin_precache() {
g_cvarModel = register_cvar("gift_model", DEFAULT_MODEL);
g_cvarSound = register_cvar("gift_sound", DEFAULT_SOUND);
g_cvarInterval = register_cvar("gift_interval", "2.0");
get_pcvar_string(g_cvarModel, g_szModel, charsmax(g_szModel));
get_pcvar_string(g_cvarSound, g_szSound, charsmax(g_szSound));
precache_sound(g_szSound);
}
public plugin_init() {
register_plugin("[GreyPanel API] GiftBox", "1.0", "BiZaJe");
RegisterHookChain(RG_CBasePlayer_PreThink, "CBasePlayer_PreThink_Post", 1);
g_fInterval = get_pcvar_float(g_cvarInterval) * 60.0;
set_task(g_fInterval, "Task_SpawnGift", _, _, _, "b");
set_task(5.0, "Task_SpawnGift");
g_SpawnPoints = ArrayCreate(1);
set_task(1.0, "Task_CacheSpawnPoints");
}
public Task_CacheSpawnPoints() {
new ent = -1;
while ((ent = rg_find_ent_by_class(ent, "info_player_deathmatch", true)) > 0) {
ArrayPushCell(g_SpawnPoints, ent);
}
ent = -1;
while ((ent = rg_find_ent_by_class(ent, "info_player_start", true)) > 0) {
ArrayPushCell(g_SpawnPoints, ent);
}
server_print("[GiftBox] Found %d spawn points on map.", ArraySize(g_SpawnPoints));
}
public client_connect(id) {
g_hasDoubleJump[id] = false;
}
public Task_SpawnGift() {
SpawnGift();
}
SpawnGift() {
new size = ArraySize(g_SpawnPoints);
if (size == 0) {
server_print("[GiftBox] Error: No spawn points found on map!");
return;
}
new Float:start[3], Float:end[3], Float:origin[3], Float:normal[3], Float:angles[3], Float:baseOrigin[3];
new ptr = create_tr2();
new bool:found = false;
for (new i = 0; i < 15; i++) {
new randomEnt = ArrayGetCell(g_SpawnPoints, random_num(0, size - 1));
get_entvar(randomEnt, var_origin, baseOrigin);
start[0] = baseOrigin[0] + random_float(-1000.0, 1000.0);
start[1] = baseOrigin[1] + random_float(-1000.0, 1000.0);
start[2] = baseOrigin[2] + 100.0;
end[0] = start[0];
end[1] = start[1];
end[2] = start[2] - 2000.0;
rg_trace_line(start, end, IGNORE_MONSTERS, 0, ptr);
new Float:fraction;
get_tr2(ptr, TR_flFraction, fraction);
if (fraction >= 1.0 || get_tr2(ptr, TR_StartSolid) || get_tr2(ptr, TR_AllSolid)) {
continue;
}
get_tr2(ptr, TR_vecEndPos, origin);
get_tr2(ptr, TR_vecPlaneNormal, normal);
if (normal[2] < 0.7) {
continue;
}
new contents = engfunc(EngFunc_PointContents, origin);
if (contents == CONTENTS_WATER || contents == CONTENTS_SKY) {
continue;
}
found = true;
break;
}
free_tr2(ptr);
if (!found) {
return;
}
origin[2] += 1.0;
engfunc(EngFunc_VecToAngles, normal, angles);
angles[0] -= 90.0;
if (angles[0] > 180.0) angles[0] -= 360.0;
if (angles[0] < -180.0) angles[0] += 360.0;
angles[2] = 0.0;
new ent = rg_create_entity("info_target");
if (is_nullent(ent)) return;
engfunc(EngFunc_SetModel, ent, g_szModel);
set_entvar(ent, var_skin, random_num(0, 5));
set_entvar(ent, var_solid, SOLID_TRIGGER);
set_entvar(ent, var_movetype, MOVETYPE_FLY);
set_entvar(ent, var_origin, origin);
set_entvar(ent, var_angles, angles);
set_entvar(ent, var_sequence, 0);
set_entvar(ent, var_framerate, 0.33);
set_entvar(ent, var_classname, CLASSNAME_GIFT);
set_entvar(ent, var_mins, Float:{-16.0, -16.0, 0.0});
set_entvar(ent, var_maxs, Float:{16.0, 16.0, 32.0});
SetTouch(ent, "Fwd_TouchGift");
}
public Fwd_TouchGift(const ent, const other) {
if (!is_user_alive(other)) return;
if (!gpapi_is_user_member(other)) {
set_hudmessage(255, 50, 50, -1.0, 0.3, 0, 6.0, 3.0, 0.1, 0.1);
show_hudmessage(other, "Вы не зарегистрированы на сайте!^nПодарки доступны только пользователям сайта.");
return;
}
GiveRandomReward(other);
client_cmd(other, "spk %s", g_szSound);
rg_remove_entity(ent);
}
GiveRandomReward(id) {
new reward = random_num(1, 7);
new msg[128];
switch (reward) {
case 1: {
new amount = random_num(1000, 5000);
rg_add_account(id, amount, AS_ADD);
formatex(msg, charsmax(msg), "Вы получили %d$!", amount);
}
case 2: {
new amount = random_num(1, 20);
aes_add_player_bonus_f(id, amount);
formatex(msg, charsmax(msg), "Вы получили %d очков Anew!", amount);
}
case 3: {
new amount = random_num(1, 50);
aes_add_player_exp_f(id, float(amount));
formatex(msg, charsmax(msg), "Вы получили %d очков опыта!", amount);
}
case 4: {
rg_give_item(id, "weapon_grenade");
rg_give_item(id, "weapon_flashbang");
rg_give_item(id, "weapon_flashbang");
rg_give_item(id, "weapon_smokegrenade");
formatex(msg, charsmax(msg), "Вы получили набор гранат!");
}
case 5: {
new Float:maxspeed = get_entvar(id, var_maxspeed);
set_entvar(id, var_maxspeed, maxspeed * 1.05);
formatex(msg, charsmax(msg), "Вы получили ускорение +5%%!");
}
case 6: {
g_hasDoubleJump[id] = true;
formatex(msg, charsmax(msg), "Вы получили двойной прыжок!");
}
case 7: {
set_entvar(id, var_health, 100.0);
formatex(msg, charsmax(msg), "Ваше здоровье полностью восстановлено!");
}
}
client_print_color(id, print_team_default, "^4[Подарок] ^1%s", msg);
}
public CBasePlayer_PreThink_Post(const id) {
if (!g_hasDoubleJump[id]) return HC_CONTINUE;
new Float:velocity[3];
get_entvar(id, var_velocity, velocity);
new buttons = get_entvar(id, var_button);
new oldbuttons = get_entvar(id, var_oldbuttons);
new flags = get_entvar(id, var_flags);
if ((buttons & IN_JUMP) && !(oldbuttons & IN_JUMP) && !(flags & FL_ONGROUND)) {
if (velocity[2] < 0.0) {
velocity[2] = 300.0;
set_entvar(id, var_velocity, velocity);
g_hasDoubleJump[id] = false;
}
}
return HC_CONTINUE;
}