Иконка ресурса

CS 1.6 admin_life_new 0.0.1

b0t.

Новенький
Скриптер
14.05.2024
8
3
OneV
0
Очень обидно...
Плагин писался с нуля, т.к. перво источник был так себе.

Ну уже ни чего не поделаешь...
 

b0t.

Новенький
Скриптер
14.05.2024
8
3
OneV
0
AdminLife.ini:
;Команда для возрождения без меню
; note: Регистрируется во всех чатах + консоль
cl_cmd = adminlife_on

;Игрок имеющий этот флаг доступа будет возрождаться всегда (-1 - Отключить)
;Счётчик возрождений уменьшаться не будет
all_access = -1

;Задерка перед открытием меню
open_menu_delay = 2.5

;Минимальное кол-во игроков для работы плагина
min_players = 5

;Разница в кол-ве живых противников, при которой нельзя будет возродится
alive_team_diff = 2

;Минимальное кол-во живых игроков при котором можно будет возродится
alive_players = 2

;Доступы
;"Флаг(и) доступа" "кол-во возрождений" "С какого раунда доступно"
"o" "1" "1"

admin_life_new.txt:
[ru]

MENU_TITLE = \wВозродимся?
MENU_ITEM_YES = Да
MENU_ITEM_NO = Нет
MENU_NUMBER_COLOR = \y

CHAT_USER_ALIVE = ^3[^4Respawn^3]^1 Вы и так живы^4!
CHAT_RESPAWN_QUANTITY = ^3[^4Respawn^3]^1 У вас закончился лимит возрождений^4!
CHAT_FROM_ROUND = ^3[^4Respawn^3]^1 Возрождение доступно с^4 %i ^1раунда^4!
CHAT_MIN_PLAYERS = ^3[^4Respawn^3]^1 Необходимо минимальное кол-во игроков ^3[^4%i^3]
CHAT_BOMB_PLANTED = ^3[^4Respawn^3]^1 Нельзя возродится, если установлена бомба^4!
CHAT_ALIVE_PLAYERS = ^3[^4Respawn^3]^1 Нельзя возродится если в живых осталось меньше ^4%i ^1игроков^4!
CHAT_ALIVE_TEAM_DIFF = ^3[^4Respawn^3]^1 Нельзя возродится, если в живых осталось меньше ^4%i ^1противников^4!

admin_life_api.inc:
#if defined _admin_life_api_included
    #endinput
#endif

#define _admin_life_api_included

/**
 * Вызывается всякий раз когда игрок пытается возродится
 *
 * @note:                AdminLife_Respawn(const pPlayer,const iPost)
 *
 *                       Чтобы заблокировать возрождение используйте iPost = 0 + return PLUGIN_HANDLED;
 *
 * @param pPlayer        Игрок, что пытается возродится
 * @param iPost          0 - До момента возрождения(до всех стандартных условий плагина)
 *
 * @noreturn
*/
forward AdminLife_Respawn(const pPlayer,const iPost);

/**
 * Вернёт кол-во возрождений игрока
 *
 * @param pPlayer       Игрок
 * @param iType         0 - Оставшееся | 1 - Общее
 *
 * @return              int
*/
native get_user_life(const pPlayer,const iType);

/**
 * Добавит/отнимет кол-во возрождений игрока
 *
 * @param pPlayer       Игрок
 * @param iNum          Кол-во
 * @param iType         0 - Оставшееся | 1 - Общее
 *
 * @noreturn
*/
native add_user_life(const pPlayer,const iNum,const iType);

/**
 * Насильно откроет меню возрождений игроку
 *
 * @param pPlayer       Игрок
 *
 * @noreturn
*/
native display_respawn_menu(const pPlayer);

/**
 * Насильно попытается возродить игрока
 *
 * @note:               С соблюдением всех условий
 *
 * @param pPlayer       Игрок
 *
 * @noreturn
*/
native user_respawn(const pPlayer);

admin_life_new.sma:
/**
    История изменений:
        0.1.0 (03.05.2024) by b0t.
            - Релиз;
*/
new const VERSION[] = "0.1.0";

#include <amxmodx>
#include <reapi>

#define rg_get_current_round()              (get_member_game(m_iTotalRoundsPlayed)+1)
#define rg_get_players()                    (get_member_game(m_iNumTerrorist)+get_member_game(m_iNumCT))
#define rg_get_valid_team(%0)               (TEAM_TERRORIST <= TeamName:get_member(%0,m_iTeam) <= TEAM_CT)

const TASK_ID__OPEN_MENU = 0xA323;

enum _:FileStruct {
    FLAG_ACCESS,
    RESPAWN_QUANTITY,
    FROM_ROUND
};

new
    Array:g_a_RespawnData;

enum _:SettingsStruct {
    ALL_FLAG_ACCESS,
    Float:OPEN_MENU_DELAY,
    MIN_PLAYERS,
    ALIVE_TEAM_DIFF,
    ALIVE_PLAYERS
};

new
    gSettings[SettingsStruct];

enum _:PlayersDataStruct {
    P_RESPAWN_QUANTITY_DEFAULT,
    P_RESPAWN_QUANTITY,
    P_FROM_ROUND
};

new
    pData[33][PlayersDataStruct];

new
    g_fwdForward,
    g_iMenuId,
    bool:g_bRoundEnd;   // Костыль, чтобы не возраждались когда был анонс конца раунда;

public plugin_init() {
    register_plugin("Admin Life",VERSION,"b0t.");

    RegisterHookChain(RG_CBasePlayer_Killed,"CBasePlayer_Killed_Post", .post = true);
    RegisterHookChain(RG_CSGameRules_RestartRound,"CSGameRules_RestartRound_Post", .post = true);
    RegisterHookChain(RG_RoundEnd,"RoundEnd_Post", .post = true);

    g_fwdForward = CreateMultiForward("AdminLife_Respawn",ET_STOP,FP_CELL,FP_CELL);

    Func__CreateMultiLang();
    register_dictionary("admin_life_new.txt");

    Func__CreateMenu();
    Func__ReadFile();
}

public CBasePlayer_Killed_Post(const pVictim,pAttacker) {
    if(get_user_flags(pVictim) & gSettings[ALL_FLAG_ACCESS] && gSettings[ALL_FLAG_ACCESS] != -1) {
        remove_task(pVictim+TASK_ID__OPEN_MENU);
        set_task(gSettings[OPEN_MENU_DELAY],"TaskFunc__OpenMenu",pVictim+TASK_ID__OPEN_MENU);

        return;
    }
    
    if(!pData[pVictim][P_RESPAWN_QUANTITY_DEFAULT] || !pData[pVictim][P_RESPAWN_QUANTITY])
        return;
    
    if(rg_get_players() < gSettings[MIN_PLAYERS])
        return;

    if(rg_get_current_round() < pData[pVictim][P_FROM_ROUND])
        return;

    remove_task(pVictim+TASK_ID__OPEN_MENU);
    set_task(gSettings[OPEN_MENU_DELAY],"TaskFunc__OpenMenu",pVictim+TASK_ID__OPEN_MENU);
}

public CSGameRules_RestartRound_Post() {
    for(new id=1;id<=MaxClients;++id) {
        if(!is_user_connected(id) || is_user_bot(id) || is_user_hltv(id))
            continue;
        
        if(!rg_get_valid_team(id))
            continue;

        if(!pData[id][P_RESPAWN_QUANTITY_DEFAULT])
            continue;

        pData[id][P_RESPAWN_QUANTITY] = pData[id][P_RESPAWN_QUANTITY_DEFAULT];
    }

    g_bRoundEnd = false;
}

public RoundEnd_Post() {
    g_bRoundEnd = true;
}

public TaskFunc__OpenMenu(id) {
    id -= TASK_ID__OPEN_MENU;

    if(!is_user_connected(id) || is_user_alive(id) || g_bRoundEnd)
        return;
    
    menu_display(id,g_iMenuId);
}

public RespawnMenu__Handler(const id,const iMenu,const iItem) {
    if(iItem == MENU_EXIT)
        return PLUGIN_HANDLED;
    
    switch(iItem) {
        case 0: Func__Respawn(id);
    }

    return PLUGIN_HANDLED;
}

public Func__Respawn(const id) {
    if(UTIL__CanUserRespawn(id)) {
        rg_round_respawn(id);
    }
}

public client_putinserver(id) {
    new iBitFlagAccess = get_user_flags(id);

    new iSize = ArraySize(g_a_RespawnData);

    pData[id][P_RESPAWN_QUANTITY_DEFAULT] = pData[id][P_RESPAWN_QUANTITY] = pData[id][P_FROM_ROUND] = 0;

    for(new i,aData[FileStruct];i<iSize;++i) {
        ArrayGetArray(g_a_RespawnData,i,aData);

        if(iBitFlagAccess & aData[FLAG_ACCESS] == aData[FLAG_ACCESS]) {
            pData[id][P_RESPAWN_QUANTITY_DEFAULT] = aData[RESPAWN_QUANTITY];
            pData[id][P_FROM_ROUND] = aData[FROM_ROUND];

            break;
        }
    }
}

public Func__CreateMenu() {
    new iMenu = menu_create(fmt("%l","MENU_TITLE"),"RespawnMenu__Handler");

    menu_additem(iMenu,fmt("%l","MENU_ITEM_YES"));
    menu_additem(iMenu,fmt("%l","MENU_ITEM_NO"));

    menu_setprop(iMenu,MPROP_NUMBER_COLOR,fmt("%l","MENU_NUMBER_COLOR"));
    menu_setprop(iMenu,MPROP_EXIT,MEXIT_NEVER);

    g_iMenuId = iMenu;
}

public Func__ReadFile() {
    new szData[512];
    formatex(szData,charsmax(szData),"addons/amxmodx/configs/AdminLife.ini");

    if(!file_exists(szData)) {
        write_file(szData,";Команда для возрождения без меню");
        write_file(szData,"; note: Регистрируется во всех чатах + консоль");
        write_file(szData,"cl_cmd = adminlife_on");
        write_file(szData,"");
        write_file(szData,";Игрок имеющий этот флаг доступа будет возрождаться всегда (-1 - Отключить)");
        write_file(szData,";Счётчик возрождений уменьшаться не будет");
        write_file(szData,"all_access = -1");
        write_file(szData,"");
        write_file(szData,";Задерка перед открытием меню");
        write_file(szData,"open_menu_delay = 2.5");
        write_file(szData,"");
        write_file(szData,";Минимальное кол-во игроков для работы плагина");
        write_file(szData,"min_players = 5");
        write_file(szData,"");
        write_file(szData,";Разница в кол-ве живых противников, при которой нельзя будет возродится");
        write_file(szData,"alive_team_diff = 2");
        write_file(szData,"");
        write_file(szData,";Минимальное кол-во живых игроков при котором можно будет возродится");
        write_file(szData,"alive_players = 2");
        write_file(szData,"");
        write_file(szData,";Доступы");
        write_file(szData,";^"Флаг(и) доступа^" ^"кол-во возрождений^" ^"С какого раунда доступно^"");
        write_file(szData,"^"o^" ^"1^" ^"1^"");
    }

    new f = fopen(szData,"r");

    g_a_RespawnData = ArrayCreate(FileStruct);
    new aData[FileStruct];

    while(fgets(f,szData,charsmax(szData))) {
        trim(szData);
    
        switch(szData[0]) {
            case EOS,';': {
                continue;
            }
            case '"': {
                static szFlagAccess[64],szRespawnQuantity[5],szFromRound[5];
                
                parse(szData,
                    szFlagAccess,charsmax(szFlagAccess),
                    szRespawnQuantity,charsmax(szRespawnQuantity),
                    szFromRound,charsmax(szFromRound)
                );

                aData[FLAG_ACCESS] = read_flags(szFlagAccess);
                aData[RESPAWN_QUANTITY] = str_to_num(szRespawnQuantity);
                aData[FROM_ROUND] = str_to_num(szFromRound);

                ArrayPushArray(g_a_RespawnData,aData);
            }
            default: {
                static szLeft[256],szRight[256];
                
                strtok(szData,szLeft,charsmax(szLeft),szRight,charsmax(szRight),'=');
                trim(szLeft);
                trim(szRight);

                if(equal(szLeft,"cl_cmd")) {
                    register_clcmd(szRight,"Func__Respawn");
                    register_clcmd(fmt("say /%s",szRight),"Func__Respawn");
                    register_clcmd(fmt("say_team /%s",szRight),"Func__Respawn");
                }
                else if(equal(szLeft,"all_access"))
                    gSettings[ALL_FLAG_ACCESS] = szRight[0] == '-' ? -1 : read_flags(szRight);
                else if(equal(szLeft,"open_menu_delay"))
                    gSettings[OPEN_MENU_DELAY] = str_to_float(szRight);
                else if(equal(szLeft,"min_players"))
                    gSettings[MIN_PLAYERS] = str_to_num(szRight);
                else if(equal(szLeft,"alive_team_diff"))
                    gSettings[ALIVE_TEAM_DIFF] = str_to_num(szRight);
                else if(equal(szLeft,"alive_players"))
                    gSettings[ALIVE_PLAYERS] = str_to_num(szRight);
            }
        }

        continue;
    }
    fclose(f);
}

public Func__CreateMultiLang() {
    new szData[512];
    formatex(szData,charsmax(szData),"addons/amxmodx/data/lang/admin_life_new.txt");

    if(file_exists(szData))
        return;
    
    write_file(szData,"[ru]");
    write_file(szData,"");
    write_file(szData,"MENU_TITLE = \wВозродимся?");
    write_file(szData,"MENU_ITEM_YES = Да");
    write_file(szData,"MENU_ITEM_NO = Нет");
    write_file(szData,"MENU_NUMBER_COLOR = \y");
    write_file(szData,"");
    write_file(szData,"CHAT_USER_ALIVE = ^^3[^^4Respawn^^3]^^1 Вы и так живы^^4!");
    write_file(szData,"CHAT_RESPAWN_QUANTITY = ^^3[^^4Respawn^^3]^^1 У вас закончился лимит возрождений^^4!");
    write_file(szData,"CHAT_FROM_ROUND = ^^3[^^4Respawn^^3]^^1 Возрождение доступно с^^4 %i ^^1раунда^^4!");
    write_file(szData,"CHAT_MIN_PLAYERS = ^^3[^^4Respawn^^3]^^1 Необходимо минимальное кол-во игроков ^^3[^^4%i^^3]");
    write_file(szData,"CHAT_BOMB_PLANTED = ^^3[^^4Respawn^^3]^^1 Нельзя возродится, если установлена бомба^^4!");
    write_file(szData,"CHAT_ALIVE_PLAYERS = ^^3[^^4Respawn^^3]^^1 Нельзя возродится если в живых осталось меньше ^^4%i ^^1игроков^^4!");
    write_file(szData,"CHAT_ALIVE_TEAM_DIFF = ^^3[^^4Respawn^^3]^^1 Нельзя возродится, если в живых осталось меньше ^^4%i ^^1противников^^4!");
}

public plugin_natives() {
    register_native("get_user_life","native_get_user_life");
    register_native("add_user_life","native_add_user_life");

    register_native("display_respawn_menu","native_display_respawn_menu");
    register_native("user_respawn","native_user_respawn");
}

public native_get_user_life() {
    enum {
        _id = 1,
        _iType
    };
    
    new id = get_param(_id);
    new iType = get_param(_iType);

    return pData[id][iType == 0 ? P_RESPAWN_QUANTITY : P_RESPAWN_QUANTITY_DEFAULT];
}

public native_add_user_life() {
    enum {
        _id = 1,
        _iNum,
        _iType
    };
    
    new id = get_param(_id);
    new iNum = get_param(_iNum);
    new iType = get_param(_iType);

    pData[id][iType == 0 ? P_RESPAWN_QUANTITY : P_RESPAWN_QUANTITY_DEFAULT] += iNum;
}

public native_display_respawn_menu() {
    new id = get_param(1);

    remove_task(id+TASK_ID__OPEN_MENU);
    menu_display(id,g_iMenuId);
}

public native_user_respawn() {
    Func__Respawn(get_param(1));
}

stock bool:UTIL__CanUserRespawn(const pPlayer) {
    if(get_user_flags(pPlayer) & gSettings[ALL_FLAG_ACCESS] && gSettings[ALL_FLAG_ACCESS] != -1)
        return true;
    
    new iRet;
    ExecuteForward(g_fwdForward,iRet,pPlayer,0);

    if(iRet == PLUGIN_HANDLED)
        return false;

    if(!pData[pPlayer][P_RESPAWN_QUANTITY_DEFAULT])
        return false;
    
    if(g_bRoundEnd)
        return false;

    if(rg_get_players() < gSettings[MIN_PLAYERS])
        return false;

    if(!rg_get_valid_team(pPlayer))
        return false;

    if(is_user_alive(pPlayer)) {
        client_print_color(pPlayer,print_team_default,"%l","CHAT_USER_ALIVE");
        return false;
    }

    if(pData[pPlayer][P_RESPAWN_QUANTITY] <= 0) {
        client_print_color(pPlayer,print_team_default,"%l","CHAT_RESPAWN_QUANTITY");
        return false;
    }

    if(rg_get_current_round() < pData[pPlayer][P_FROM_ROUND]) {
        client_print_color(pPlayer,print_team_default,"%l","CHAT_FROM_ROUND",pData[pPlayer][P_FROM_ROUND]);
        return false;
    }

    if(rg_get_players() < gSettings[MIN_PLAYERS]) {
        client_print_color(pPlayer,print_team_default,"%l","CHAT_MIN_PLAYERS",gSettings[MIN_PLAYERS]);
        return false;
    }

    if(rg_is_bomb_planted()) {
        client_print_color(pPlayer,print_team_default,"%l","CHAT_BOMB_PLANTED");
        return false;
    }

    new iAliveCt,iAliveTe;
    rg_initialize_player_counts(iAliveTe,iAliveCt);

    if((iAliveTe+iAliveCt) < gSettings[ALIVE_PLAYERS]) {
        client_print_color(pPlayer,print_team_default,"%l","CHAT_ALIVE_PLAYERS",gSettings[ALIVE_PLAYERS]);
        return false;
    }

    new iAlive;
    switch(TeamName:get_member(pPlayer,m_iTeam)) {
        case TEAM_CT:           iAlive = iAliveTe;
        case TEAM_TERRORIST:    iAlive = iAliveCt;
    }

    if(iAlive < gSettings[ALIVE_TEAM_DIFF]) {
        client_print_color(pPlayer,print_team_default,"%l","CHAT_ALIVE_TEAM_DIFF",gSettings[ALIVE_TEAM_DIFF]);
        return false;
    }

    pData[pPlayer][P_RESPAWN_QUANTITY]--;

    ExecuteForward(g_fwdForward,iRet,pPlayer,1);

    return true;
}
 

Вложения

  • AdnimLife.zip
    7 KB · Просмотры: 5

parliament

OneValve.ru
Пользователь
14.05.2021
2 026
4 548
onevalve.ru
OneV
3 256
  • Администратор
  • #23
@travka zelenaj, изначально я сомневался в том, что ресурсы были написаны автором.
Направил платный ресурс в беседу, чтобы ответили мне более понимающие пользователи.
Сейчас, я так понимаю, основа лежит на @b0t.
Бегло прочитал сообщения, вижу что ресурсы были написаны или изменены на платной основе автора ресурса?
 

b0t.

Новенький
Скриптер
14.05.2024
8
3
OneV
0
@parliament, Да. ТС заказывал у меня плагины.
В каждом его ресурсе я оставил док-ва в виде скриншотов, где видно, что он заказывает и оплачивает работу. Если скриншотов мало, могу предоставить видео, где скачаю файлы из переписки и открою их пролистав медленно весь код. Дабы не осталось сомнений, что ТС не написал ни единой строчки кода во всех его ресурсах.

С одной стороны мне всё равно, я получил деньги за свою работу, но с другой стороны немного обидно, что мои работы выставляют как свои изменяя там только авторство.

Просто хочу отметить, что все опубликованные его ресурсы тут написаны мною. Повторюсь, но человек не написал ни единой строчки кода.
Мною движет желание сохранить авторство.
 

parliament

OneValve.ru
Пользователь
14.05.2021
2 026
4 548
onevalve.ru
OneV
3 256
  • Администратор
  • #25
@b0t., я Вас понял.
Нет, записывать видео не нужно. Я Вам верю.
Мои сомнения подтвердились.
Ресурсы будут удалены или перемещены.
Если Вы желаете, можете опубликовать ресурсы со своего имени, сохраняя авторство.
 

travka zelenaj

Супер активный
Premium
10.04.2022
111
44
OneV
583
@travka zelenaj, изначально я сомневался в том, что ресурсы были написаны автором.
Направил платный ресурс в беседу, чтобы ответили мне более понимающие пользователи.
Сейчас, я так понимаю, основа лежит на @b0t.
Бегло прочитал сообщения, вижу что ресурсы были написаны или изменены на платной основе автора ресурса?
Да всё плагины которые данный человек закинул были написаны @b0t. Так же перепродажа написанного с нуля плагина. Смена авторства это пипец, так как этот человек ничего не соображает в серверах от слова совсем.
 

BiZaJe

Администрация
Команда форума
Модератор
06.05.2023
73
43
OneV
142
И каждый раз одно и тоже...

Продаете исходник людям с которыми отношения на честном слове, а потом удивляетесь , что сливают или перепродают
 

parliament

OneValve.ru
Пользователь
14.05.2021
2 026
4 548
onevalve.ru
OneV
3 256
  • Администратор
  • #28
@BiZaJe, а как продавать?
Без исходного кода?
И каждый раз одно и тоже будет всегда.
Каким образом продавать – исходный ли код или нет.
Проще тогда вообще ничего не продавать.
Каждый из сторон получил свое, если так подумать.
 

b0t.

Новенький
Скриптер
14.05.2024
8
3
OneV
0
@BiZaJe, я не удивлён, что мои работы перепродают или выкладывают.
Немного обидно, что выдают за своё.
Деньги за работу я получил
 

BiZaJe

Администрация
Команда форума
Модератор
06.05.2023
73
43
OneV
142
@BiZaJe, а как продавать?
Без исходного кода?
И каждый раз одно и тоже будет всегда.
Каким образом продавать – исходный ли код или нет.
Проще тогда вообще ничего не продавать.
Каждый из сторон получил свое, если так подумать.
Продаешь без исходника, привязываешь по IP
 
Сверху Снизу