• Уважаемые посетители!

    Информируем вас о том, что в настоящий момент регистрация на форуме с использованием адресов электронной почты в домене @gmail.com (включая все корпоративные и персональные аккаунты Google) невозможна.

    Письма, отправленные с нашего сервера (подтверждение регистрации, ссылки для восстановления доступа), не доставляются на почтовые сервисы Google по техническим причинам, не зависящим от администрации форума.

    К сожалению, сроки устранения данной проблемы неизвестны.

    Для регистрации на форуме, пожалуйста, используйте адреса электронной почты других сервисов (Yandex, Mail.ru, Rambler и др.).
[GreyPanel API] GiftBox

Addons [GreyPanel API] GiftBox 1.0.0

Нет прав для скачивания
Модуль
Автор
BiZaJe
Исходный код
code:
#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;
}
Требования
ReAPI, GreyPanel API
Требование ReAPI
Да
Поддержка русского языка
Да
Совместимость
  1. REHLDS
Сверху Снизу