[RE] Talisman

[RE] Talisman 1.4.2

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

AXM

Сообщения
73
Реакции
1
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");
}
Попробуй, отпишешь, если все нормально, то внесу как фикс
Вообще всё заглохло.. В первом раунде появляется инфо что выпал талисман , после смерти не пишет что потерял , и в последующем не выдает и вовсе
 
Сообщения
938
Реакции
187
Помог
4 раз(а)
Code_0xABC, Тогда скажи, где тут видишь получение имени?
g_iPlayerId = apPlayers[random_num(0, iPlayers-1)];
 
Сообщения
964
Реакции
51
Помог
10 раз(а)
BiZaJe, client_print(0, print_chat, "Имя игрока %n", g_iPlayerId);, ты сначала проверь
14 Ноя 2022
BiZaJe, зачем это?
Код:
    if(!iPlayers){
        return;
    }
Если есть уже проверка
Код:
get_playersnum() < g_eCvars[MIN_PLAYERS]
 
Сообщения
964
Реакции
51
Помог
10 раз(а)
И использования static, ты хорошо придумал
 
Сообщения
938
Реакции
187
Помог
4 раз(а)
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);
}
Пробуй
 
Сообщения
964
Реакции
51
Помог
10 раз(а)
BiZaJe, нет слов))) Действуй.
Твои значения переменных меняются каждый раз, а теперь подумай нужен ли тебе static?
 
Сообщения
938
Реакции
187
Помог
4 раз(а)
Code_0xABC, В чем разница между создание и перезаписью?
Либо я возьму создам по новой, либо возьму массив со значениями и перезапишу его на новые значения
В чем разница new и static ?
 
Сообщения
964
Реакции
51
Помог
10 раз(а)
Прочти 31 раз и найдешь ответ
http://amxxmodx.ru/lessons-on-pawn/414-urok-19-otlichie-new-ot-static-pri-sozdanii-peremennyh.html
И вообще, тебе по 10 раз повторяешь, до тебя не доходит, три вопроса тебе прозвучало, ты не на один не ответил
 
Сообщения
964
Реакции
51
Помог
10 раз(а)
Неужели до сих пор тебе не обьяснили, что get_user_name уже не актуален??? Дстаточно указать в строке '%n' и дальше index игрока
 
Сообщения
938
Реакции
187
Помог
4 раз(а)
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% никогда не видел в использовании
 
Сообщения
964
Реакции
51
Помог
10 раз(а)
В последней версии amxmodx есть ещё:
%n - Выводит имя переданного игрока
 
Сообщения
938
Реакции
187
Помог
4 раз(а)
Code_0xABC, Да я понял, что по индексу можно вывести через %n, почему даже под конец 22 года, мало кто этим пользуется?
 
Сообщения
964
Реакции
51
Помог
10 раз(а)
На чем основан этот вывод? Что мало кто пользуется?
 
Сообщения
938
Реакции
187
Помог
4 раз(а)
Code_0xABC, Вывод не в том, что мало кто пользуется, а имеет ли это какие-то недостатки?
 

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

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