[RE] Talisman

[RE] Talisman 1.5

Нет прав для скачивания

AXM

Сообщения
85
Реакции
2
AXM, Поднять его не могут другие игроки или сам повторно?
14 Ноя 2022
AXM,
Код:
#include <amxmodx>
#include <reapi>

enum CVARS
{
    SCREENFADE,
    SCREENFADE_COLOR_R,
    SCREENFADE_COLOR_G,
    SCREENFADE_COLOR_B,
    MIN_PLAYERS,
    ROUND_ACCESS,
    Float:GIVE_HEALTH,
    Float:INTERVAL_REGENERATION
};

new g_eCvars[CVARS];

new const g_szModel[] = "models/talisman.mdl";

new g_iPlayerId, g_iRoundCounter, szName[32];
new g_ModelInDexTalisman;

public plugin_init()
{
    register_plugin("[RE] Talisman", "1.0", "BiZaJe");

    register_dictionary("talisman.txt");
   
    RegisterHookChain(RG_CSGameRules_RestartRound, "HC_CSGameRules_RestartRound_Pre", .post = false);
    RegisterHookChain(RG_CBasePlayer_Killed, "HC_CBasePlayer_Killed_Post", .post = true);

    RegisterCvars();
   
    set_task(g_eCvars[INTERVAL_REGENERATION], "RegenerationHealth", .flags="b");
}

public plugin_precache()
{
    g_ModelInDexTalisman = precache_model(g_szModel);
}

public client_disconnected(id)
{
    if(g_iPlayerId == id)
        TalismanSpawn(id);
}

public HC_CSGameRules_RestartRound_Pre()
{
    if(get_member_game(m_bCompleteReset)){
        g_iRoundCounter = 0;
    }
    g_iRoundCounter++;

    if(g_iRoundCounter < g_eCvars[ROUND_ACCESS] || get_playersnum() < g_eCvars[MIN_PLAYERS] || g_iPlayerId){
        return;
    }
       
    static iEnt;
   
    while((iEnt = rg_find_ent_by_class(iEnt, "talisman"))){
        set_entvar(iEnt, var_flags, get_entvar(iEnt, var_flags) | FL_KILLME);
        set_entvar(iEnt, var_nextthink, get_gametime());
    }
       
    static apPlayers[32], iPlayers;
    get_players(apPlayers, iPlayers, "ah");
   
    if(!iPlayers){
        return;
    }

    g_iPlayerId = apPlayers[random_num(0, iPlayers-1)];
    get_user_name(g_iPlayerId, szName, charsmax(szName));
   
    client_print_color(0, print_team_default, "%L %L", 0, "TALISMAN_PREFIX", 0, "TALISMAN_DROPPED_OUT", szName);
}

public HC_CBasePlayer_Killed_Post(const this, pevAttacker, iGib)
{
    if(this == g_iPlayerId)
        TalismanSpawn(g_iPlayerId);
}

public Talisman_Think(iEnt, id)
{
    if(!is_entity(iEnt) || g_iPlayerId)
        return 1;
       
    set_entvar(iEnt, var_flags, get_entvar(iEnt, var_flags) | FL_KILLME);
    set_entvar(iEnt, var_nextthink, get_gametime());
    get_user_name(g_iPlayerId = id, szName, charsmax(szName));
    client_print_color(0, print_team_default, "%L %L", 0, "TALISMAN_PREFIX", 0, "TALISMAN_RAISED" ,szName);
    return 1;
}

public RegenerationHealth()
{
    if(!g_iPlayerId || get_playersnum() < g_eCvars[MIN_PLAYERS])
        return;
   
    static Float:fHealth, MsgId_Health; fHealth = get_entvar(g_iPlayerId, var_health);
   
    if(!MsgId_Health) MsgId_Health = get_user_msgid("Health");
   
    if(fHealth < 100 && is_user_alive(g_iPlayerId))
    {
        static Float:giveHealth; giveHealth = (fHealth + g_eCvars[GIVE_HEALTH]) < 100 ? g_eCvars[GIVE_HEALTH] : (100 - fHealth);
       
        set_entvar(g_iPlayerId, var_health, fHealth + giveHealth);
       
        message_begin(MSG_ONE_UNRELIABLE, MsgId_Health, _, g_iPlayerId);
        write_byte(floatround(fHealth + giveHealth));
        message_end();
       
        if(g_eCvars[SCREENFADE]){
            message_begin(MSG_ONE_UNRELIABLE, 98, _, g_iPlayerId);
            write_short(1<<10);
            write_short(1<<10);
            write_short(0x0000);
            write_byte(g_eCvars[SCREENFADE_COLOR_R]);
            write_byte(g_eCvars[SCREENFADE_COLOR_G]);
            write_byte(g_eCvars[SCREENFADE_COLOR_B]);
            write_byte(40);
            message_end();
        }
    }
}

public RegisterCvars(){
    bind_pcvar_num(create_cvar(
        "talisman_screenfede",
        "1",
        FCVAR_NONE,
        "Darken the screen when regenerating health"),
        g_eCvars[SCREENFADE]
    );
    bind_pcvar_num(create_cvar(
        "talisman_screenfede_color_r",
        "0",
        FCVAR_NONE,
        "screen darkening color (red shade)"),
        g_eCvars[SCREENFADE_COLOR_G]
    );
    bind_pcvar_num(create_cvar(
        "talisman_screenfede_color_g",
        "255",
        FCVAR_NONE,
        "screen darkening color (green shade)"),
        g_eCvars[SCREENFADE_COLOR_G]
    );
    bind_pcvar_num(create_cvar(
        "talisman_screenfede_color_b",
        "0",
        FCVAR_NONE,
        "screen darkening color (blue shade)"),
        g_eCvars[SCREENFADE_COLOR_B]
    );
    bind_pcvar_num(create_cvar(
        "talisman_min_player",
        "2",
        FCVAR_NONE,
        "Minimum number of players to include"),
        g_eCvars[MIN_PLAYERS]
    );
    bind_pcvar_float(create_cvar(
        "talisman_give_health",
        "5.0",
        FCVAR_NONE,
        "How much will restore health"),
        g_eCvars[GIVE_HEALTH]
    );
    bind_pcvar_float(create_cvar(
        "talisman_reg_interval",
        "3.0",
        FCVAR_NONE,
        "After how many seconds will health be added"),
        g_eCvars[INTERVAL_REGENERATION]
    );
    AutoExecConfig(true, "talisman");
}

stock TalismanSpawn(id)
{
    static Float:fOrigin[3];
    get_entvar(id, var_origin, fOrigin);
   
    new iEnt = rg_create_entity("info_target", false);
   
    if(!is_entity(iEnt))
        return;

    set_entvar(iEnt, var_origin, fOrigin);
    set_entvar(iEnt, var_classname, "talisman");
    set_entvar(iEnt, var_model, g_szModel);
    set_entvar(iEnt, var_modelindex, g_ModelInDexTalisman);
    set_entvar(iEnt, var_skin, random_num(0, 5));
    set_entvar(iEnt, var_solid, SOLID_TRIGGER);
    set_entvar(iEnt, var_movetype, MOVETYPE_BOUNCEMISSILE);
    set_entvar(iEnt, var_effects, 8);
    set_entvar(iEnt, var_mins, Float:{-16.0,-16.0,-16.0})
    set_entvar(iEnt, var_maxs, Float:{16.0,16.0,16.0})
    client_print_color(g_iPlayerId = 0, print_team_default, "%L %L", 0, "TALISMAN_PREFIX", 0, "TALISMAN_LOST", szName);
    SetTouch(iEnt, "Talisman_Think");
}
Попробуй, отпишешь, если все нормально, то внесу как фикс
Вообще всё заглохло.. В первом раунде появляется инфо что выпал талисман , после смерти не пишет что потерял , и в последующем не выдает и вовсе
 
Сообщения
1,063
Реакции
223
Предупреждения
9
Помог
6 раз(а)
Code_0xABC, Тогда скажи, где тут видишь получение имени?
g_iPlayerId = apPlayers[random_num(0, iPlayers-1)];
 
Сообщения
1,063
Реакции
223
Предупреждения
9
Помог
6 раз(а)
Сообщения
1,083
Реакции
59
Помог
11 раз(а)
BiZaJe, client_print(0, print_chat, "Имя игрока %n", g_iPlayerId);, ты сначала проверь
14 Ноя 2022
BiZaJe, зачем это?
Код:
    if(!iPlayers){
        return;
    }
Если есть уже проверка
Код:
get_playersnum() < g_eCvars[MIN_PLAYERS]
 
Сообщения
1,083
Реакции
59
Помог
11 раз(а)
И использования static, ты хорошо придумал
 
Сообщения
1,063
Реакции
223
Предупреждения
9
Помог
6 раз(а)
Code_0xABC,

Код:
get_players(apPlayers, iPlayers, "ah");

if(!iPlayers){
        return;
 }
Давай объясни мне.
А что new брать? постоянно пересоздавать массив? или проще перезаписать его в static?
14 Ноя 2022
AXM,
Код:
#include <amxmodx>
#include <engine>
#include <reapi>

enum CVARS
{
    SCREENFADE,
    SCREENFADE_COLOR_R,
    SCREENFADE_COLOR_G,
    SCREENFADE_COLOR_B,
    MIN_PLAYERS,
    ROUND_ACCESS,
    Float:GIVE_HEALTH,
    Float:INTERVAL_REGENERATION
};

new g_eCvars[CVARS];

new const g_szModel[] = "models/talisman.mdl";

new g_iPlayerId, g_iRoundCounter, szName[32];
new g_ModelInDexTalisman;

public plugin_init()
{
    register_plugin("[RE] Talisman", "1.0", "BiZaJe");

    register_touch("talisman", "player", "Func_TalismanTouch");

    register_dictionary("talisman.txt");
    
    RegisterHookChain(RG_CSGameRules_RestartRound, "HC_CSGameRules_RestartRound_Pre", .post = false);
    RegisterHookChain(RG_CBasePlayer_Killed, "HC_CBasePlayer_Killed_Post", .post = true);

    RegisterCvars();
    
    set_task(g_eCvars[INTERVAL_REGENERATION], "RegenerationHealth", .flags="b");
}

public plugin_precache()
{
    g_ModelInDexTalisman = precache_model(g_szModel);
}

public client_disconnected(id)
{
    if(g_iPlayerId == id)
        TalismanSpawn(id);
}

public HC_CSGameRules_RestartRound_Pre()
{
    if(get_member_game(m_bCompleteReset)){
        g_iRoundCounter = 0;
    }
    g_iRoundCounter++;

    if(g_iRoundCounter < g_eCvars[ROUND_ACCESS] || get_playersnum() < g_eCvars[MIN_PLAYERS] || g_iPlayerId){
        return;
    }
        
    static iEnt;
    
    while((iEnt = rg_find_ent_by_class(iEnt, "talisman"))){
        set_entvar(iEnt, var_flags, get_entvar(iEnt, var_flags) | FL_KILLME);
        set_entvar(iEnt, var_nextthink, get_gametime());
    }
        
    static apPlayers[32], iPlayers;
    get_players(apPlayers, iPlayers, "ah");
    
    if(!iPlayers){
        return;
    }

    g_iPlayerId = apPlayers[random_num(0, iPlayers-1)];
    get_user_name(g_iPlayerId, szName, charsmax(szName));
    
    client_print_color(0, print_team_default, "%L %L", 0, "TALISMAN_PREFIX", 0, "TALISMAN_DROPPED_OUT", szName);
}

public HC_CBasePlayer_Killed_Post(const this, pevAttacker, iGib)
{
    if(this == g_iPlayerId)
        TalismanSpawn(g_iPlayerId);
}

public Func_TalismanTouch(iEnt, iPlayer)
{
    if(!is_entity(iEnt) || g_iPlayerId)
        return 1;
        
    set_entvar(iEnt, var_flags, get_entvar(iEnt, var_flags) | FL_KILLME);
    set_entvar(iEnt, var_nextthink, get_gametime());
    get_user_name(g_iPlayerId = iPlayer, szName, charsmax(szName));
    client_print_color(0, print_team_default, "%L %L", 0, "TALISMAN_PREFIX", 0, "TALISMAN_RAISED" ,szName);
    return 1;
}

public RegenerationHealth()
{
    if(!g_iPlayerId || get_playersnum() < g_eCvars[MIN_PLAYERS])
        return;
    
    static Float:fHealth, MsgId_Health; fHealth = get_entvar(g_iPlayerId, var_health);
    
    if(!MsgId_Health) MsgId_Health = get_user_msgid("Health");
    
    if(fHealth < 100 && is_user_alive(g_iPlayerId))
    {
        static Float:giveHealth; giveHealth = (fHealth + g_eCvars[GIVE_HEALTH]) < 100 ? g_eCvars[GIVE_HEALTH] : (100 - fHealth);
        
        set_entvar(g_iPlayerId, var_health, fHealth + giveHealth);
        
        message_begin(MSG_ONE_UNRELIABLE, MsgId_Health, _, g_iPlayerId);
        write_byte(floatround(fHealth + giveHealth));
        message_end();
        
        if(g_eCvars[SCREENFADE]){
            message_begin(MSG_ONE_UNRELIABLE, 98, _, g_iPlayerId);
            write_short(1<<10);
            write_short(1<<10);
            write_short(0x0000);
            write_byte(g_eCvars[SCREENFADE_COLOR_R]);
            write_byte(g_eCvars[SCREENFADE_COLOR_G]);
            write_byte(g_eCvars[SCREENFADE_COLOR_B]);
            write_byte(40);
            message_end();
        }
    }
}

public RegisterCvars(){
    bind_pcvar_num(create_cvar(
        "talisman_screenfede",
        "1",
        FCVAR_NONE,
        "Darken the screen when regenerating health"),
        g_eCvars[SCREENFADE]
    );
    bind_pcvar_num(create_cvar(
        "talisman_screenfede_color_r",
        "0",
        FCVAR_NONE,
        "screen darkening color (red shade)"),
        g_eCvars[SCREENFADE_COLOR_G]
    );
    bind_pcvar_num(create_cvar(
        "talisman_screenfede_color_g",
        "255",
        FCVAR_NONE,
        "screen darkening color (green shade)"),
        g_eCvars[SCREENFADE_COLOR_G]
    );
    bind_pcvar_num(create_cvar(
        "talisman_screenfede_color_b",
        "0",
        FCVAR_NONE,
        "screen darkening color (blue shade)"),
        g_eCvars[SCREENFADE_COLOR_B]
    );
    bind_pcvar_num(create_cvar(
        "talisman_min_player",
        "2",
        FCVAR_NONE,
        "Minimum number of players to include"),
        g_eCvars[MIN_PLAYERS]
    );
    bind_pcvar_float(create_cvar(
        "talisman_give_health",
        "5.0",
        FCVAR_NONE,
        "How much will restore health"),
        g_eCvars[GIVE_HEALTH]
    );
    bind_pcvar_float(create_cvar(
        "talisman_reg_interval",
        "3.0",
        FCVAR_NONE,
        "After how many seconds will health be added"),
        g_eCvars[INTERVAL_REGENERATION]
    );
    AutoExecConfig(true, "talisman");
}

stock TalismanSpawn(iPlayer)
{
    static Float:fOrigin[3];
    get_entvar(iPlayer, var_origin, fOrigin);
    
    new iEnt = rg_create_entity("info_target", false);
    
    if(!is_entity(iEnt))
        return;

    set_entvar(iEnt, var_origin, fOrigin);
    set_entvar(iEnt, var_classname, "talisman");
    set_entvar(iEnt, var_model, g_szModel);
    set_entvar(iEnt, var_modelindex, g_ModelInDexTalisman);
    set_entvar(iEnt, var_skin, random_num(0, 5));
    set_entvar(iEnt, var_solid, SOLID_TRIGGER);
    set_entvar(iEnt, var_movetype, MOVETYPE_BOUNCEMISSILE);
    set_entvar(iEnt, var_effects, 8);
    set_entvar(iEnt, var_mins, Float:{-16.0,-16.0,-16.0})
    set_entvar(iEnt, var_maxs, Float:{16.0,16.0,16.0})
    client_print_color(g_iPlayerId = 0, print_team_default, "%L %L", 0, "TALISMAN_PREFIX", 0, "TALISMAN_LOST", szName);
}
Пробуй
 
Сообщения
1,083
Реакции
59
Помог
11 раз(а)
BiZaJe, нет слов))) Действуй.
Твои значения переменных меняются каждый раз, а теперь подумай нужен ли тебе static?
 
Сообщения
1,063
Реакции
223
Предупреждения
9
Помог
6 раз(а)
Code_0xABC, В чем разница между создание и перезаписью?
Либо я возьму создам по новой, либо возьму массив со значениями и перезапишу его на новые значения
В чем разница new и static ?
 
Сообщения
1,083
Реакции
59
Помог
11 раз(а)
Прочти 31 раз и найдешь ответ
http://amxxmodx.ru/lessons-on-pawn/414-urok-19-otlichie-new-ot-static-pri-sozdanii-peremennyh.html
И вообще, тебе по 10 раз повторяешь, до тебя не доходит, три вопроса тебе прозвучало, ты не на один не ответил
 
Сообщения
1,083
Реакции
59
Помог
11 раз(а)
Неужели до сих пор тебе не обьяснили, что get_user_name уже не актуален??? Дстаточно указать в строке '%n' и дальше index игрока
 
Сообщения
1,063
Реакции
223
Предупреждения
9
Помог
6 раз(а)
Code_0xABC, Не тестил с %n, поправлю
5 Дек 2022
Code_0xABC, Почему не актуально, а многие используют get_user_name? Или я чего-то не знаю

Код:
%c - Символ
%s - Строка символов
%d, i - Целое десятичное со знаком
%o - Целое восьмеричное
%u - Целое десятичное без знака
%x, X - Целое шестнадцатеричное
%f - Дробное число в фиксированном формате
%e, E - Дробное число в научном формате
%g, G - Дробное число в научном или фиксированном формате
%p - Указатель (в шестнадцатеричном виде)
%L - Зависимая от языка строка
%a - Как %s, только принимает StringHandle (пример здесь https://www.amxmodx.org/api/cellarray/ArrayGetStringHandle)
В последней версии amxmodx есть ещё:
%b - Вывод чисел в бинарном виде
%N - Выводит основную информацию о переданном игроке: name, userid, authid, teamname
%n - Выводит имя переданного игрока
Даже из этого 90% никогда не видел в использовании
 
Сообщения
1,083
Реакции
59
Помог
11 раз(а)
В последней версии amxmodx есть ещё:
%n - Выводит имя переданного игрока
 
Сообщения
1,063
Реакции
223
Предупреждения
9
Помог
6 раз(а)
Code_0xABC, Да я понял, что по индексу можно вывести через %n, почему даже под конец 22 года, мало кто этим пользуется?
 
Сообщения
1,083
Реакции
59
Помог
11 раз(а)
На чем основан этот вывод? Что мало кто пользуется?
 
Сообщения
1,063
Реакции
223
Предупреждения
9
Помог
6 раз(а)
Code_0xABC, Вывод не в том, что мало кто пользуется, а имеет ли это какие-то недостатки?
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу