Русское сообщество по скриптингу

Скрыть чекпоинты

Все вопросы по работе и настройке AMXX и его плагинов.

Модератор: liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только вопросов по AMX Mod X и его плагинам.

Скрыть чекпоинты

Сообщение dvahitov95 » 19 авг 2017, 14:26

Всем привет. Как можно скрыть чекпоинты на сервере? Чтобы моделька стала невидимой. Например написал в чате команду /cpoff и чекпоинты скрываются у игрока, кто написал эту команду.

Код: Выделить всё
/**================================================================================
 * (\ ============= Версии ============= /)
 * 
 * 0.1 - Релиз.
 * 0.2 - Добавлены новые модели.
 * 0.3 - Добавлен финишных чекпоинт.
 * 0.4 - Добавлено меню.
 * 0.5 - Теперь пишет в чат время за которое игрок достигнул финиш. 
 * 0.6 - Добавлены еффекты.
 * 0.7 - Добавлено сохранение по файлу.
===================================================================================*/

/**================================================================================
    Инклуды
===================================================================================*/
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <cstrike>

/**================================================================================
    Информация плагина
===================================================================================*/
#define P "CheckPoints_by_BlackSmoke"
#define V "0.7"
#define A "BlackSmoke"

/**================================================================================
    Данные плагина
===================================================================================*/
#define ClassName "info_checkpoint" // Имя класса чекпоинтов
#define stn(%1) str_to_num(%1)
#define MaxCheckOnTheMap 15 // Максимальное кол-во чекпоинтов на карте
#define MoneyOneCheck 100 // Деньги за первый чекпоинт
#define MoneyNextCheck 200 // Деньги за последующий чекпоинт
#define MoneyFinishCheck 5000 // Деньги за финишных чекпоинт

/**================================================================================
    Константы
===================================================================================*/
new bool:bTouchPlayerCheck[33][512]
new iNumCheckRoundPl[33], bool:LastCheck, bool:bOffCheck
new BeaconSprite
new Float
:fTimeStartRound[33]

new szFile[127], OriginFile[MaxCheckOnTheMap][512]

new const szSoundCheck[3][] = 
{
    "CheckPoints_by_BlackSmoke/Cp_Take_1.wav",
    "CheckPoints_by_BlackSmoke/Cp_Take_2.wav",
    "CheckPoints_by_BlackSmoke/Cp_Take_3.wav"
}

new const szModelCheck[6][] = 
{
    "models/CheckPoints_by_BlackSmoke/Blue.mdl",
    "models/CheckPoints_by_BlackSmoke/Gray.mdl",
    "models/CheckPoints_by_BlackSmoke/Green.mdl",
    "models/CheckPoints_by_BlackSmoke/Red.mdl",
    "models/CheckPoints_by_BlackSmoke/Yellow.mdl",
    "models/CheckPoints_by_BlackSmoke/Purple.mdl"
}
new const szColorCheck[6][] = {/*Синий*/"0 0 255",/*Серый*/"100 100 100",/*Зелёный*/"0 255 0",/*Красный*/"255 0 0",/*Жёлтый*/"255 255 0",/*Пурпурный*/"255 0 255"}

/**================================================================================
    Инициализация
===================================================================================*/
public plugin_init()
{
    register_plugin(P,V,A)
    register_touch(ClassName, "player", "TouchTarget")
    register_think(ClassName, "FwdThinkCheck")
    register_think("info_checkpoint_finish", "FwdThinkCheck")
    register_touch("info_checkpoint_finish", "player", "TouchTargetFinish")
    register_clcmd("cp_menu", "MenuCheck")
    register_event("HLTV", "logevent_round_start", "a", "1=0", "2=0")
    register_menucmd(register_menuid("MenuCheckPointsAdd"), 1023, "ActionMenuCheckPointsAdd")
}

/**================================================================================
    Меню
===================================================================================*/
public MenuCheck(id)
{
    if(!(get_user_flags(id) & ADMIN_IMMUNITY))
    {
        client_print(id, print_console, "У вас не достаточно прав. ~%s~", P)
        return PLUGIN_HANDLED
    
}
    new szMenu[1024], iLen, ikey = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_0
    iLen 
= format(szMenu[iLen], charsmax(szMenu)-iLen, "\yЧекпоинты^n\yКол-во: \r%d \w| \yФинишный: \r%sпоставлен^n^n", GetNumEntity(ClassName), LastCheck ? "" : "Не ")
    iLen += format(szMenu[iLen], charsmax(szMenu)-iLen, "\y1. \wДобавить \d[\yОсталось\d: \r%d\d]^n", (MaxCheckOnTheMap - GetNumEntity(ClassName)))
    iLen += format(szMenu[iLen], charsmax(szMenu)-iLen, "\y2. \wДобавить Финишный \d[\yОсталось\d: \r%d\d]^n", LastCheck ? 0 : 1)
    iLen += format(szMenu[iLen], charsmax(szMenu)-iLen, "\y3. \wУдалить все^n^n")
    iLen += format(szMenu[iLen], charsmax(szMenu)-iLen, "\y4. \wЧекпоинты \d[\y%s\d]^n", bOffCheck ? "Выкл" : "Вкл")
    
    iLen 
+= format(szMenu[iLen], charsmax(szMenu)-iLen, "^n\r0. \wВыход^n")
    
    show_menu
(id, ikey, szMenu, -1, "MenuCheckPointsAdd")
    return PLUGIN_HANDLED
}

/**================================================================================
    Игрок нажал пункт меню
===================================================================================*/
public ActionMenuCheckPointsAdd(id, key)
{
    switch(key)
    {
        case 0: 
        
{
            if(GetNumEntity(ClassName) >= 15)
            {
                Color_Print(id, "!teamВы поставили !gМакс. !teamкол-во !yчекпоинтов.")
                return PLUGIN_CONTINUE
            
}
            new iOrigin[3], Float:fOrigin[3]
            get_user_origin(id, iOrigin, 3)
            IVecFVec(iOrigin, fOrigin)
            fOrigin[2] += 60.0
            AddCheck
(0, fOrigin)
            
            MenuCheck
(id)
        }
        case 1:
        {
            if(LastCheck)
            {
                Color_Print(id, "!teamВы !gуже !teamпоставили !gпоследний !yчекпоинт.")
                return PLUGIN_CONTINUE
            
}
            new iOrigin[3], Float:fOrigin[3]
            get_user_origin(id, iOrigin, 3)
            IVecFVec(iOrigin, fOrigin)
            fOrigin[2] += 60.0
            AddCheck
(1, fOrigin)
            
            MenuCheck
(id)
        }
        case 2:
        {
            remove_entity_name(ClassName)
            remove_entity_name("info_checkpoint_finish")
            LastCheck = false
            delete_file
(szFile)
            MenuCheck(id)
        }
        case 3:
        {
            bOffCheck = bOffCheck ? false : true
            MenuCheck
(id)
        }
    }
    return PLUGIN_HANDLED
}

/**================================================================================
    Новый раунд
===================================================================================*/
public logevent_round_start()
{
    new iPlayers[32], iNum, q[33]
    get_players(iPlayers, iNum)
    for(new i; i < iNum; i++)
    {
        fTimeStartRound[iPlayers[i]] = get_gametime()
        iNumCheckRoundPl[iPlayers[i]] = 0
        while
(q[iPlayers[i]] < 510)
        {
            q[iPlayers[i]]++
            bTouchPlayerCheck[iPlayers[i]][q[iPlayers[i]]] = false
        
}
    }
}

/**================================================================================
    Игрок пересёк чекпоинт
===================================================================================*/
public TouchTarget(ent,id)
{
    if(!is_valid_ent(ent) || !is_user_connected(id))
        return PLUGIN_CONTINUE
        
    if
(bTouchPlayerCheck[id][ent])
        return PLUGIN_CONTINUE
    
    iNumCheckRoundPl
[id]++
    Color_Print(id, "!teamВы пересекли !g%d-ый !teamчекпоинт !yНаграда: !g+ $%d", iNumCheckRoundPl[id], (MoneyOneCheck + (MoneyNextCheck*(iNumCheckRoundPl[id]-1))))
    cs_set_user_money(id, cs_get_user_money(id) + (MoneyOneCheck + (MoneyNextCheck*(iNumCheckRoundPl[id]-1))))
    bTouchPlayerCheck[id][ent] = true
    client_cmd
(id, "spk ^"%s^"", szSoundCheck[random_num(0,sizeof szSoundCheck - 1)])
    
    return PLUGIN_CONTINUE
}

/**================================================================================
    Игрок пересёк финишный чекпоинт
===================================================================================*/
public TouchTargetFinish(ent,id)
{
    if(!is_valid_ent(ent) || !is_user_connected(id))
        return PLUGIN_CONTINUE
        
    if
(bTouchPlayerCheck[id][ent])
        return PLUGIN_CONTINUE
    
    new szName
[32]
    get_user_name(id, szName, charsmax(szName))
    
    Color_Print
(id, "!teamВы пересекли !gпоследний !teamчекпоинт !yНаграда: !g+ $%d", MoneyFinishCheck)
    Color_Print(0, "!teamИгрок !g%s !teamпрошёл карту за !y%d!g:!y%02d", szName, floatround(get_gametime() - fTimeStartRound[id]) / 60, floatround(get_gametime() - fTimeStartRound[id]) % 60)
    cs_set_user_money(id, cs_get_user_money(id) + MoneyFinishCheck)
    bTouchPlayerCheck[id][ent] = true
    client_cmd
(id, "spk ^"%s^"", szSoundCheck[random_num(0,sizeof szSoundCheck - 1)])
    
    return PLUGIN_CONTINUE
}

/**================================================================================
    Загрузки плагина
===================================================================================*/
public plugin_precache()
{
    for(new i; i < sizeof szModelCheck; i++)
        precache_model(szModelCheck[i])
    for(new y; y < sizeof szSoundCheck; y++)
        precache_sound(szSoundCheck[y])
        
    BeaconSprite 
= precache_model("sprites/shockwave.spr")
    
    new CheckFolder
[127]
    format(CheckFolder, charsmax(CheckFolder), "addons/amxmodx/configs/CheckPoints_by_BlackSmoke")
    if(!dir_exists(CheckFolder))
    mkdir(CheckFolder)
    
    new Map
[32]
    get_mapname(Map, 31)
    format(szFile, charsmax(szFile), "%s/%s.ini", CheckFolder,Map)
    new q, Len, iNumString,p[5][32], Float:origin[3]
    if(file_exists(szFile))
    {
        while(< MaxCheckOnTheMap && read_file(szFile, q ,OriginFile[iNumString], 511, Len))
        {
            q++
            if(OriginFile[iNumString][0] == ';' || Len == 0 || !OriginFile[iNumString][0])
            {
                continue
            
}
            parse(OriginFile[iNumString], p[1], 31,p[2], 31,p[3], 31,p[4],31)
            origin[0] = str_to_float(p[1])
            origin[1] = str_to_float(p[2])
            origin[2] = str_to_float(p[3])
            AddCheck(str_to_num(p[4]), origin, 0)
            iNumString++
        }
    }
}
    

/**================================================================================
    Синк
===================================================================================*/
public FwdThinkCheck(ent)
{
    if(!is_valid_ent(ent))
        return;
    
    if
(!bOffCheck)
        UTIL_PlayAnimation(ent, 50)
    else
        set_rendering
(ent)
        
    entity_set_float
(ent, EV_FL_nextthink, get_gametime() + 1.90)
    entity_set_int(ent, EV_INT_solid, bOffCheck ? SOLID_NOT : SOLID_TRIGGER)
}

/**================================================================================
    Функция добавляет чекпоинт.
===================================================================================*/
stock AddCheck(type=0,Float:fOrigin[3]={0.0,0.0,0.0},save = 1)
{
    static iNumber
    if
(save)
    {
        new szSave[512]
        format(szSave, 511, "%f %f %f %d", fOrigin[0], fOrigin[1], fOrigin[2], type)
        write_file(szFile, szSave)
    }
    if(type)
        LastCheck = true
    
    iNumber
++    
    new iEnt
, rnd = random_num(0,sizeof szModelCheck - 1),p[4][32]
    iEnt = create_entity("info_target")
    parse(szColorCheck[rnd], p[1],5,p[2],5,p[3],5)
    if(is_valid_ent(iEnt))
    {
        entity_set_string(iEnt, EV_SZ_classname, type ? "info_checkpoint_finish" : ClassName)
        entity_set_float(iEnt, EV_FL_nextthink, get_gametime() + 0.1)
        entity_set_origin(iEnt, fOrigin)
        DispatchSpawn(iEnt)
        entity_set_model(iEnt, szModelCheck[rnd])
        set_rendering(iEnt, kRenderFxGlowShell, stn(p[1]),stn(p[2]),stn(p[3]))
        entity_set_int(iEnt, EV_INT_solid, SOLID_TRIGGER)
        entity_set_size(iEnt, Float:{ -40.0, -40.0, -40.0 },  Float:{ 40.0, 40.0, 40.0 }) 
    
}
}

/**================================================================================
    Анимация + Еффекты объекта
===================================================================================*/
stock UTIL_PlayAnimation( const entity, const sequence, const Float:framerate = 1.0 )
{
    entity_set_float(entity, EV_FL_animtime, get_gametime());
    entity_set_float(entity, EV_FL_framerate, framerate);
    entity_set_float(entity, EV_FL_frame, 0.0);
    entity_set_int(entity, EV_INT_sequence, sequence);
    
    new Float
:origin[3], c[4][6], szModel[127]
    entity_get_string(entity, EV_SZ_model, szModel, charsmax(szModel))
    for(new i; i < sizeof szModelCheck; i++)
    {
        if(equal(szModel, szModelCheck[i]))
        {
            parse(szColorCheck[i], c[1],5,c[2],5,c[3],5)
            break;
        }
    }
    set_rendering(entity, kRenderFxGlowShell, stn(c[1]),stn(c[2]),stn(c[3])) 
    entity_get_vector
(entity, EV_VEC_origin, origin)
    origin[2] -= 50.0
    engfunc
(EngFunc_MessageBegin, MSG_BROADCAST, SVC_TEMPENTITY, origin, 0) 
    write_byte
(TE_BEAMCYLINDER)
    engfunc(EngFunc_WriteCoord, origin[0]) //start x
    engfunc(EngFunc_WriteCoord, origin[1]) //start y
    engfunc(EngFunc_WriteCoord, origin[2]) //start z
    engfunc(EngFunc_WriteCoord, origin[0]+50) //end x
    engfunc(EngFunc_WriteCoord, origin[1]) //end y
    engfunc(EngFunc_WriteCoord, origin[2]+135) //end z
    write_short(BeaconSprite)
    write_byte(0)
    write_byte(1)
    write_byte(6)
    write_byte(1)  //hight
    write_byte(1) 
    write_byte
(stn(c[1])) //red
    write_byte(stn(c[2])) //green
    write_byte(stn(c[3])) //blue
    write_byte(255)
    write_byte(0)
    message_end()
}

/**================================================================================
    Цветной чат
===================================================================================*/
stock Color_Print(const id, const input[], any:...)
{
    new count = 1, players[32]
    static msg[191]
    new pr[32]
    format(pr,31,P), pr[11] = '^0'
    vformat(msg, 190, input, 3)
    format(msg, sizeof(msg), "^1[^4%s^1] %s", pr,msg)
    replace_all(msg, 190, "!g", "^4") // Green Color
    replace_all(msg, 190, "!y", "^1") // Default Color
    replace_all(msg, 190, "!team", "^3") // Team Color
    
    if 
(id) players[0] = id; else get_players(players, count, "ch")
    {
        for (new i = 0; i < count; i++)
        {
            if (is_user_connected(players[i]))
            {
                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
                write_byte(players[i]);
                write_string(msg); 
                message_end
();
            }
        }
    }
}

/**================================================================================
    Функция подсчитывает кол-во объектов
===================================================================================*/
stock GetNumEntity(const class[])
{
    new iEnt, iNum
    while
((iEnt = find_ent_by_class(iEnt, class)))
        iNum++
    
    return iNum
}


предположения, как это сделать:

с помощью события FM_AddToFullPack
+ создать булевую переменную
Аватара пользователя
dvahitov95
 
Сообщения: 133
Зарегистрирован: 07 авг 2017, 17:48
Благодарил (а): 16 раз.
Поблагодарили: 1 раз.
Языки программирования: Pawn
SourcePawn
C++
Php
Ruby
Python
C#

Re: Скрыть чекпоинты

Сообщение fl0wer » 19 авг 2017, 14:42

Да, отличная идея. Так и сделай.
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

Re: Скрыть чекпоинты

Сообщение dvahitov95 » 19 авг 2017, 15:11

fl0wer писал(а):Да, отличная идея. Так и сделай.

Как то подозрительно звучит....
Аватара пользователя
dvahitov95
 
Сообщения: 133
Зарегистрирован: 07 авг 2017, 17:48
Благодарил (а): 16 раз.
Поблагодарили: 1 раз.
Языки программирования: Pawn
SourcePawn
C++
Php
Ruby
Python
C#

Re: Скрыть чекпоинты

Сообщение артист666 » 19 авг 2017, 15:25

pev_effect FL_NODRAW

П.с. у определённого игрока, да, там фулл пак, там...
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Скрыть чекпоинты

Сообщение dvahitov95 » 19 авг 2017, 15:31

артист666 писал(а):pev_effect FL_NODRAW

П.с. у определённого игрока, да, там фулл пак, там...

там что?
Аватара пользователя
dvahitov95
 
Сообщения: 133
Зарегистрирован: 07 авг 2017, 17:48
Благодарил (а): 16 раз.
Поблагодарили: 1 раз.
Языки программирования: Pawn
SourcePawn
C++
Php
Ruby
Python
C#

Re: Скрыть чекпоинты

Сообщение артист666 » 19 авг 2017, 16:09

Ну да гововорю, set_es и no_draw ставишь...
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Скрыть чекпоинты

Сообщение dvahitov95 » 20 авг 2017, 12:59

не получается ... не могу понять, что именно скрывать в новой событии?
Аватара пользователя
dvahitov95
 
Сообщения: 133
Зарегистрирован: 07 авг 2017, 17:48
Благодарил (а): 16 раз.
Поблагодарили: 1 раз.
Языки программирования: Pawn
SourcePawn
C++
Php
Ruby
Python
C#

Re: Скрыть чекпоинты

Сообщение артист666 » 20 авг 2017, 13:19

classname info_checkpoint_finish
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Скрыть чекпоинты

Сообщение fl0wer » 20 авг 2017, 14:03

Ставишь чекпоинтам какое-нибудь уникальное значение, например импульс 1337.
Потому что фуллпак очень часто вызывается и каждый раз проверять класснейм не круто.
И лучше модулем это сделать.

Код: Выделить всё
register_forward( FM_AddToFullPack, "FM_Hook_AddToFullPack_Post", true );

public FM_Hook_AddToFullPack_Post( iState, iE, iEntity, iHost, iHostFlags, iPlayer, iSet )
{
    if( get_entvar( iEntity, var_impulse ) != 1337 )
        return;

    set_es( iState, ES_Effects, g_bShowCP[ iHost ] ? 0 : EF_NODRAW );
}
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

Re: Скрыть чекпоинты

Сообщение fl0wer » 26 авг 2017, 00:51

Ну что, сделали?
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

След.

Вернуться в Вопросы по AMXX и его плагинам

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11