1. kupidon Пользователь

    Регистрация:
    17.11.15
    Сообщения:
    312
    Симпатии:
    27
    Пол:
    Мужской
    Хочу добавить в свой плагин разминки вот такую же надпись, не худом, а как здесь.

    Напишите код как сделать такое оповещение?[​IMG]
     
  2. kratos_01 Пользователь

    Регистрация:
    17.01.16
    Сообщения:
    21
    Симпатии:
    2
    Пол:
    Мужской
    client_print(index, print_center, "сообщение")
     
  3. kupidon Пользователь

    Регистрация:
    17.11.15
    Сообщения:
    312
    Симпатии:
    27
    Пол:
    Мужской
    мне нужно с таймером, вот к этому плагину сафетиста. Добавить сообщение по центру экрана с отсчетом
    Uncommon Knife Warmup
     
  4. kratos_01 Пользователь

    Регистрация:
    17.01.16
    Сообщения:
    21
    Симпатии:
    2
    Пол:
    Мужской
    с чего ты взял что это худ?! нет!
     
  5. kupidon Пользователь

    Регистрация:
    17.11.15
    Сообщения:
    312
    Симпатии:
    27
    Пол:
    Мужской
    мне нужно с таймером, вот к этому плагину сафетиста. Добавить сообщение по центру экрана с отсчетом

    Uncommon Knife Warmup
     
  6. kratos_01 Пользователь

    Регистрация:
    17.01.16
    Сообщения:
    21
    Симпатии:
    2
    Пол:
    Мужской
    добавь, только сообщение такого рода висит вроде 3 секунды, после его вызова.
     
  7. kupidon Пользователь

    Регистрация:
    17.11.15
    Сообщения:
    312
    Симпатии:
    27
    Пол:
    Мужской
    на скриншоте - на сервере висит нормально, отсчет ведется и все четко видно. мне нужно так же
    --- добавлено 22.06.16 ---
     
  8. kratos_01 Пользователь

    Регистрация:
    17.01.16
    Сообщения:
    21
    Симпатии:
    2
    Пол:
    Мужской
    разве я сказал что это невозможно?
    прикрепиприкрепил исходник, гляну.
     
  9. kupidon Пользователь

    Регистрация:
    17.11.15
    Сообщения:
    312
    Симпатии:
    27
    Пол:
    Мужской
    вот мой чистый исходник, вот к нему хочу такой отсчет сделать как на скрине
    Код:
    /**
    *    Warmup plugin for the Kings but only knifes are permitted ;)
    *      Created by Oper's request.
    *
    *    Support forum:
    *      http://goldsrc.ru/
    *
    *    Last update:
    *      3/7/2016
    */
    
    /*    Copyright 2016 Safety1st
    
        Uncommon Knife Warmup is free software;
        you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation; either version 2 of the License, or
        (at your option) any later version.
    
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
    
        You should have received a copy of the GNU General Public License
        along with this program; if not, write to the Free Software
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    */
    
    #include <amxmodx>
    #include <cstrike>
    #include <engine>
    #include <hamsandwich>
    
    #define PLUGIN "Uncommon Knife Warmup"
    #define VERSION "0.5"
    #define AUTHOR "Safety1st"
    
    /*------------------EDIT ME------------------*/
    // INTEGERS
    #define WARMUP_TIME  40  // in seconds
    #define MP3_BEFORE   11  // the delay BEFORE warmup end to start the music; 0 means no delay (start right in the end); comment to disable
    
    // FLOATS
    #define RESPAWN_DELAY    1.0       // in seconds
    #define CUSTOM_GRAVITY   0.5   // 1.0 - normal gravity; comment to disable
    #define CUSTOM_HEALTH      35.0      // uncomment to enable
    
    // STRINGS
    #define MP3_FILE "sound/arenasound/warmup_b.mp3"  // full path here starting from mod directory; means nothing when MP3_BEFORE is commented
    /*---------------STOP EDIT HERE--------------*/
    
    const DELAY_RESTART  = 1    // normal game delay after end round messages
    const HIDE_ICON      = 0
    
    #define PLAYER_CLASS "player"
    
    enum {
        WARMUP_OFF,
        WARMUP_START,
        WARMUP_ON,
        WARMUP_END
    }
    new giWarmupState
    
    const WARMUP_TASK_ID = 782491247    // arbitrary value
    
    // macro; %1 - variable being modified, %2 - player index
    #define CheckFlag(%1,%2)  (%1 &   (1 << (%2 & 31)))
    #define SetFlag(%1,%2)    (%1 |=  (1 << (%2 & 31)))
    #define ClearFlag(%1,%2)  (%1 &= ~(1 << (%2 & 31)))
    new gbAlive
    
    new HamHook:giHhCBasePlayerSpawn, HamHook:giHhCBasePlayerKilled, HamHook:giHhCBasePlayerAddItem, HamHook:giHhCBasePlayerGiveAmmo,
        gMsgRoundTime, hMsgRoundTime,
        gMsgScenarioIcon,
        giTimeRemaining,
        pCvarRestart
    
    public plugin_init() {
        register_plugin( PLUGIN, VERSION, AUTHOR )
    
        register_event( "TextMsg", "Event_NewGame", "a", "1=4" /* print_center */, "2=#Game_Commencing" )
        register_event( "HLTV", "Event_NewRound", "a", "1=0", "2=0" )
        register_event( "TextMsg", "Event_GameScoring", "a", "1=2" /* print_console */, "2=#Game_scoring" )
    
        gMsgRoundTime = get_user_msgid( "RoundTime" )
        gMsgScenarioIcon = get_user_msgid( "Scenario" )
    
        pCvarRestart = get_cvar_pointer( "sv_restart" )
    
        DisableHamForward( giHhCBasePlayerSpawn = RegisterHam( Ham_Spawn, PLAYER_CLASS, "OnCBasePlayer_Spawn_Post", .Post = 1 ) )
        DisableHamForward( giHhCBasePlayerKilled = RegisterHam( Ham_Killed, PLAYER_CLASS, "OnCBasePlayer_Killed_Post", 1 ) )
        DisableHamForward( giHhCBasePlayerAddItem = RegisterHam( Ham_AddPlayerItem, PLAYER_CLASS, "OnCBasePlayer_AddItem_Pre", 0 ) )
        DisableHamForward( giHhCBasePlayerGiveAmmo = RegisterHam( Ham_GiveAmmo, PLAYER_CLASS, "OnCBasePlayer_GiveAmmo_Pre", 0 ) )
    }
    
    public Event_NewGame() {
        giWarmupState = WARMUP_START
    }
    
    public Event_NewRound() {
        // such msg is fired at new round only; see CHalfLifeMultiplay::RestartRound() for more info
        switch( giWarmupState ) {
            case WARMUP_START : Warmup_Start()
            case WARMUP_END   : Warmup_End()
        }
    }
    
    public Event_GameScoring() {
        switch( giWarmupState ) {
            case WARMUP_START : {
                // some team became empty right after warmup had been planned to run
                giWarmupState = WARMUP_OFF
            }
            case WARMUP_ON : {
                // some team became empty during warmup
                remove_task(WARMUP_TASK_ID)
                SendScenarioIcon(HIDE_ICON)
                Warmup_End()
                // decided to don't reset custom gravity & health
            }
            case WARMUP_END : {
                // some team became empty right after warmup had been planned to finish
                Warmup_End()
            }
        }
    }
    
    Warmup_Start() {
        hMsgRoundTime = register_message( gMsgRoundTime, "Message_RoundTime" )
    
        EnableHamForward( giHhCBasePlayerSpawn )
        EnableHamForward( giHhCBasePlayerKilled )
        EnableHamForward( giHhCBasePlayerAddItem )
        EnableHamForward( giHhCBasePlayerGiveAmmo )
    
        giTimeRemaining = WARMUP_TIME
    
        set_task( 1.0, "Warmup_Counter", WARMUP_TASK_ID, .flags = "a", .repeat = WARMUP_TIME )    // it is suggested don't loop tasks
    
        gbAlive = 0     // players will be spawned in the next moment
    
        giWarmupState = WARMUP_ON
    }
    
    public Warmup_Counter() {
        if( --giTimeRemaining == 0 ) {
            giWarmupState = WARMUP_END
            set_pcvar_num( pCvarRestart, max( DELAY_RESTART, floatround( RESPAWN_DELAY ) ) )    // let all possible respawn tasks to finish
        }
    
    #if defined MP3_BEFORE
        if( giTimeRemaining == MP3_BEFORE )
            client_cmd( 0, "mp3 play %s", MP3_FILE )
    #endif
    }
    
    Warmup_End() {
        /* It seems that unreg produces msg sending which could lead to re-entrancy or even infinite loop.
           That's why I reg 'HLTV' msg as event & unreg 'RoundTime' msg later than I could. */
        unregister_message( gMsgRoundTime, hMsgRoundTime )
    
        DisableHamForward( giHhCBasePlayerSpawn )
        DisableHamForward( giHhCBasePlayerKilled )
        DisableHamForward( giHhCBasePlayerAddItem )
        DisableHamForward( giHhCBasePlayerGiveAmmo )
    
        giWarmupState = WARMUP_OFF
    
    #if defined MP3_BEFORE
        // in case music is still playing
        client_cmd( 0, "mp3 stop" )
    #endif
    }
    
    public Message_RoundTime( msgid, dest, receiver ) {
        const ARG_TIME_REMAINING = 1
    
        /* Msg is sent at player spawn, Round_Start and during HUD initialization in UpdateClientData().
           Just fake the timer, it is easier than adjusting of 'mp_roundtime' cvar */
        set_msg_arg_int( ARG_TIME_REMAINING, ARG_SHORT, giTimeRemaining )
    }
    
    public OnCBasePlayer_Spawn_Post(id) {
        if( !is_user_alive(id) )
            return
    
        SetFlag( gbAlive, id )
    
        SendScenarioIcon(id)
    
    #if defined CUSTOM_HEALTH
        entity_set_float( id, EV_FL_health, CUSTOM_HEALTH )
    #endif
    #if defined CUSTOM_GRAVITY
        entity_set_float( id, EV_FL_gravity, CUSTOM_GRAVITY )
    #endif
    }
    
    SendScenarioIcon(id) {
        static szKnifeIcon[] = "d_knife"
    
        const ICON_OFF =  0
        const ICON_ON  =  1
    
        if( id ) {
            // to show icon I use per player msgs to make sure every player will get msg
            message_begin( MSG_ONE_UNRELIABLE, gMsgScenarioIcon, _, id )
            write_byte(ICON_ON)
            write_string( szKnifeIcon )
            write_byte(0)    // no alpha value
            message_end()
        }
        else {
            // it is 'global' msg that I use to hide icon only
            message_begin( MSG_BROADCAST, gMsgScenarioIcon )
            write_byte(ICON_OFF)
            message_end()
        }
    }
    
    public OnCBasePlayer_AddItem_Pre( id, weapon ) {
        if( cs_get_weapon_id(weapon) != CSW_KNIFE ) {
            // only knifes are allowed. it is the most simple (but smart) way to prevent using all toher weapons
            entity_set_int( weapon, EV_INT_flags, entity_get_int( weapon, EV_INT_flags ) | FL_KILLME )
            SetHamReturnInteger(0)
            return HAM_SUPERCEDE
        }
    
        return HAM_IGNORED
    }
    
    public OnCBasePlayer_GiveAmmo_Pre() {
        const NO_AMMO_STOP_PROCESSING = -1    // exactly as gamedll does
    
        SetHamReturnInteger(NO_AMMO_STOP_PROCESSING)
        return HAM_SUPERCEDE
    }
    
    public OnCBasePlayer_Killed_Post(id) {
        ClearFlag( gbAlive, id )
    
        set_task( RESPAWN_DELAY, "RespawnPlayer", id )
    }
    
    public RespawnPlayer(id) {
        switch( cs_get_user_team(id) ) {
            case CS_TEAM_T, CS_TEAM_CT : {
                if( !CheckFlag( gbAlive, id ) )
                    ExecuteHam( Ham_CS_RoundRespawn, id )
            }
        }
    }
    
    #if defined MP3_BEFORE
    public plugin_precache() {
        precache_generic( MP3_FILE )
    }
    #endif
    
    public client_disconnect(id) {
        // there is no need to remove a task since it is executed against in-team players only
        ClearFlag( gbAlive, id )
    }
     
  10. kratos_01 Пользователь

    Регистрация:
    17.01.16
    Сообщения:
    21
    Симпатии:
    2
    Пол:
    Мужской
    замени весь public.
    Код:
    public Warmup_Counter() {
        if( --giTimeRemaining == 0 ) {
            giWarmupState = WARMUP_END
            set_pcvar_num( pCvarRestart, max( DELAY_RESTART, floatround( RESPAWN_DELAY ) ) )    // let all possible respawn tasks to finish
        }
        else {
            client_print( 0, print_center, "Осталось: %d секунд", giTimeRemaining )
        }
    
    #if defined MP3_BEFORE
        if( giTimeRemaining == MP3_BEFORE )
            client_cmd( 0, "mp3 play %s", MP3_FILE )
    #endif
    }
     
  11. kupidon Пользователь

    Регистрация:
    17.11.15
    Сообщения:
    312
    Симпатии:
    27
    Пол:
    Мужской
    понял попробую
    --- добавлено 23.06.16 ---
    каковы ограничения в русских символах для этого сообщения?
     
  12. pUzzlik Пользователь

    Регистрация:
    06.05.15
    Сообщения:
    848
    Симпатии:
    286
    Пол:
    Мужской
    @kratos_01, Ты хоть сам то понял что посоветовал?
     
  13. kupidon Пользователь

    Регистрация:
    17.11.15
    Сообщения:
    312
    Симпатии:
    27
    Пол:
    Мужской
    а что? надпись есть, работает
    --- добавлено 23.06.16 ---

    Как пофиксить это?
    Отсчет на надписи отстает от таймера на 1 секунду.
    От начала отсчета до самого конца
     

    Вложения:

  14. pUzzlik Пользователь

    Регистрация:
    06.05.15
    Сообщения:
    848
    Симпатии:
    286
    Пол:
    Мужской
    PHP:
    public Warmup_Counter() {
        if( --
    giTimeRemaining == ) {
            
    giWarmupState WARMUP_END
            set_pcvar_num
    pCvarRestartmaxDELAY_RESTARTfloatroundRESPAWN_DELAY ) ) )    // let all possible respawn tasks to finish
        
    }

    #if defined MP3_BEFORE
        
    if( giTimeRemaining == MP3_BEFORE )
            
    client_cmd0"mp3 play %s"MP3_FILE )
    #endif
      
        
    client_print0print_center"Осталось: %d секунд", (giTimeRemaining 1) )
    }
     
  15. kupidon Пользователь

    Регистрация:
    17.11.15
    Сообщения:
    312
    Симпатии:
    27
    Пол:
    Мужской
    Благодарю, чем этот вариант лучше?
     
  16. kratos_01 Пользователь

    Регистрация:
    17.01.16
    Сообщения:
    21
    Симпатии:
    2
    Пол:
    Мужской
    Фиксит отставание 1 секунды.)
     
    Последнее редактирование: 23.06.16
  17. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.594
    Симпатии:
    4.169
    Пол:
    Мужской
    @pUzzlik,
    Код:
    giTimeRemaining + 1
    ШТО?!

    почему минусить таймер в конце функции не вариант?
    все равно тоже самое будет, только без этого говна
     
  18. kupidon Пользователь

    Регистрация:
    17.11.15
    Сообщения:
    312
    Симпатии:
    27
    Пол:
    Мужской
    тестировал одинаковую версию на двух своих серверах. На одном видно отставание на 1 секунду сообщения от таймера, а на другом нет)))
    Но на том где отстает побольше плагинов запущено.
     
  19. pUzzlik Пользователь

    Регистрация:
    06.05.15
    Сообщения:
    848
    Симпатии:
    286
    Пол:
    Мужской
    @kupidon, Что ты за ахинею несешь? Количество плагинов не влияет на выполнения кода.
    @neygomon,
    PHP:
    Warmup_Start() {
        
    hMsgRoundTime register_messagegMsgRoundTime"Message_RoundTime" )

        
    EnableHamForwardgiHhCBasePlayerSpawn )
        
    EnableHamForwardgiHhCBasePlayerKilled )
        
    EnableHamForwardgiHhCBasePlayerAddItem )
        
    EnableHamForwardgiHhCBasePlayerGiveAmmo )

        
    giTimeRemaining WARMUP_TIME

        set_task
    1.0"Warmup_Counter"WARMUP_TASK_ID, .flags "a", .repeat WARMUP_TIME )    // it is suggested don't loop tasks

        
    gbAlive 0     // players will be spawned in the next moment

        
    giWarmupState WARMUP_ON
    }

    public 
    Warmup_Counter() {

        
    client_print0print_center"Осталось: %d секунд"giTimeRemaining )

        if( --
    giTimeRemaining == ) {
            
    giWarmupState WARMUP_END
            set_pcvar_num
    pCvarRestartmaxDELAY_RESTARTfloatroundRESPAWN_DELAY ) ) )    // let all possible respawn tasks to finish
        
    }

    #if defined MP3_BEFORE
        
    if( giTimeRemaining == MP3_BEFORE )
            
    client_cmd0"mp3 play %s"MP3_FILE )
    #endif
    }
    Ну как я понял, таск выполняеться пять раз с промижутком в секунду, тобишь когда он выполниться в первой то giTimeRemaining должно равняться 4.
    Вообщем в идеале вариант должен быть таков.
    PHP:
    public Warmup_Counter() {
        --
    giTimeRemaining
     
        client_print
    0print_center"Осталось: %d секунд"giTimeRemaining )
     
        if( 
    giTimeRemaining == ) {
            
    giWarmupState WARMUP_END
            set_pcvar_num
    pCvarRestartmaxDELAY_RESTARTfloatroundRESPAWN_DELAY ) ) )    // let all possible respawn tasks to finish
        
    }

    #if defined MP3_BEFORE
        
    if( giTimeRemaining == MP3_BEFORE )
            
    client_cmd0"mp3 play %s"MP3_FILE )
    #endif
    }
    --- добавлено 23.06.16 ---
    @neygomon, И я так написал, потому что ТС сбил меня с толку. В идеале без условий просто в конце сообщения надо было добавить и должно было работать, самый сок в том что мой вариант в любом случаи должен был отставать от таймера. А ТС говорит раз да раз нет.
     
  20. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.594
    Симпатии:
    4.169
    Пол:
    Мужской
    @pUzzlik, ну вообще, по идее последний варик норм.
    ну а лучше, чекни мой автор рестарт. там все торт с отсчетом