Подгон RES под GunGame сервер

Тема в разделе "Запросы", создана пользователем trueattack, 24 май 2015.

  1. trueattack

    trueattack

    Сообщения:
    148
    Симпатии:
    32
    Сейчас MapEndSound из RES не срабатывает, когда игрок выигрывает игру. Нужно подогнать так, чтобы функции OnRoundEnd() или же CheckMapEnd() из RES учитывали не только события конца раунда, lastround и timelimit, но и событие из GunGame GG_OnWinner()

    OnRoundEnd()

    PHP:
    public OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        
    g_TotalRounds++;
        
        if (!
    enabled)
        {
            return;
        }
        
        
    decl String:sound[PLATFORM_MAX_PATH];
        
        if (
    mepenable && MapendMaxSounds && CheckMapEnd())
        {
            
    Number MapendQueue++;
            
            
    GetArrayString(array_MapEndSoundsNumbersoundsizeof(sound));
            
            
    TriggerSound(falsesound);
            
            if (
    MapendQueue MapendMaxSounds)
            {
                
    MapendQueue 0;
            }
            
            return;
        }
        
        switch (
    iGame)
        {
            case 
    GAME_TF2GAME_DOD :
            {
                
    winner GetEventInt(event"team");
            }
            
    /*case GAME_CSTRIKE, GAME_CSGO, GAME_OTHER :
            {
                winner = GetEventInt(event, "winner");
            }*/
            
    default :
            {
                
    winner GetEventInt(event"winner");
            }
        }
            
        if (
    winner 2)
        {
            return;
        }
        
        if (
    rndsnd)
        {
            if (!
    common)
            {
                switch (
    winner)
                {
                    case 
    :
                    {
                        
    Number Math_GetRandomInt(0MaxSounds1-1);
                        
    GetArrayString(array_SoundList1Numbersoundsizeof(sound));
                    }
                    case 
    :
                    {
                        
    Number Math_GetRandomInt(0MaxSounds2-1);
                        
    GetArrayString(array_SoundList2Numbersoundsizeof(sound));
                    }
                }
            }
            else
            {
                new 
    Math_GetRandomInt(0MaxSounds1+MaxSounds2-2);
                if (
    >= MaxSounds1)
                {
                    
    MaxSounds1;
                    
    GetArrayString(array_SoundList2isoundsizeof(sound));
                    
    Number MaxSounds1;
                }
                else
                {
                    
    GetArrayString(array_SoundList1isoundsizeof(sound));
                    
    Number i;
                }
            }
        }
        
        else
        {
            if (
    Queue1 >= MaxSounds1)
            {
                
    Queue1 0;
            }
            if (
    Queue2 >= MaxSounds2)
            {
                
    Queue2 0;
            }
            if (
    CommonQueue >= MaxSounds1+MaxSounds2)
            {
                
    CommonQueue 0;
            }
            
            if (!
    common)
            {
                switch (
    winner)
                {
                    case 
    :
                    {
                        
    Number Queue1++;
                        
    GetArrayString(array_SoundList1Numbersoundsizeof(sound));
                    }
                    case 
    :
                    {
                        
    Number Queue2++;
                        
    GetArrayString(array_SoundList2Numbersoundsizeof(sound));
                    }
                }
            }
            else
            {
                new 
    CommonQueue++;
                if (
    >= MaxSounds1)
                {
                    
    MaxSounds1;
                    
    GetArrayString(array_SoundList2isoundsizeof(sound));
                    
    Number MaxSounds1;
                }
                else
                {
                    
    GetArrayString(array_SoundList1isoundsizeof(sound));
                    
    Number i;
                }
            }
        }
        if (
    MaxSounds1+MaxSounds2 0)
        {
            
    TriggerSound(truesound);
            if (
    endmsg && clientpref)
            {
                
    PrintToChatAll("\x01\x0B\x04[\x01RoundEndSound\x04] %t""Announce Message"YELLOWGREENYELLOWGREEN);
            }
        }
        
        
    roundEnded true;
    }

    CheckMapEnd()

    PHP:
    bool:CheckMapEnd()
    {
        new 
    bool:lastround false;
        new 
    bool:notimelimit false;
        new 
    timeleft;
        
        if (
    GetMapTimeLeft(timeleft))
        {
            new 
    timelimit;
            
            if (
    timeleft 0)
            {
                return 
    false;
            }
            else if (
    GetMapTimeLimit(timelimit) && !timelimit)
            {
                
    notimelimit true;
            }
            else
            {
                
    lastround true;
            }
        }
        
        if (!
    lastround)
        {
            if (
    g_Cvar_WinLimit != INVALID_HANDLE)
            {
                new 
    winlimit GetConVarInt(g_Cvar_WinLimit);
                
                if (
    winlimit 0)
                {
                    if (
    GetTeamScore(2) >= winlimit || GetTeamScore(3) >= winlimit)
                    {
                        
    lastround true;
                    }
                }
            }
            
            if (
    g_Cvar_MaxRounds != INVALID_HANDLE)
            {
                new 
    maxrounds GetConVarInt(g_Cvar_MaxRounds);
                
                if (
    maxrounds 0)
                {
                    new 
    remaining maxrounds g_TotalRounds;
                    
                    if (!
    remaining)
                    {
                        
    lastround true;
                    }
                }        
            }
        }
        
        if (
    lastround)
        {
            return 
    true;
        }
            
        else if (
    notimelimit)
        {
            return 
    false;
        }
        
        return 
    true;
    }

    GG_OnWinner()

    PHP:
    /**
     * Called when a client won the game.
     *
     * @param client        Player index.
     * @param Weapon        The player weapon they won with.
     * @param victim        Player index of victim (or 0 if there was no victim).
     * @noreturn
     */
    forward GG_OnWinner(client, const String:Weapon[], victim);
     
  2. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Если понятным видом, то:
    PHP:
    public GG_OnWinner(client, const String:Weapon[], victim) for(new i=1i<=MaxClientsi++) ClientCommand(i"playgamesound ПутьКЗвуку");
    Звук должен быть уже кэширован (бери тот, что уже использует RES).
     
    trueattack нравится это.
  3. trueattack

    trueattack

    Сообщения:
    148
    Симпатии:
    32
    Я в SourcePawn не силен. Ты хочешь, чтобы я использовал функцию GG_OnWinner в самом GunGame и воспроизводил из него звуки? Я же хочу чтобы RES делал проверку о наступлении события "игрок победил", а не конец раунда, времени и т.п. и воспроизводил уже имеющийся список звуков.
     
  4. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Из списка конца карты по победе команды (того, кто победил):
    PHP:
    #include <gungame>
    public GG_OnWinner(client, const String:Weapon[], victim)
    {
        
    decl String:sound[PLATFORM_MAX_PATH];
        
    Number MapendQueue++;
        
    GetArrayString(array_MapEndSoundsNumbersoundsizeof(sound));
        
    TriggerSound(falsesound);
        if (
    MapendQueue MapendMaxSoundsMapendQueue 0;
        
    winner GetClientTeam(client);
    }
    Код вставлять в сам RES.
     
    Последнее редактирование: 28 май 2015
    trueattack нравится это.
  5. trueattack

    trueattack

    Сообщения:
    148
    Симпатии:
    32
    Возникла проблемка, переменная не обнуляется:

    L 05/24/2015 - 15:51:40: [SM] Native "GetArrayString" reported: Invalid index 15 (count: 12)
    L 05/24/2015 - 15:51:40: [SM] Displaying call stack trace for plugin "res.smx":
     
  6. trueattack

    trueattack

    Сообщения:
    148
    Симпатии:
    32
    Оффтоп
     
  7. ☆★☆БАТЯ☆★☆™

    ☆★☆БАТЯ☆★☆™

    Сообщения:
    2.585
    Симпатии:
    1.341
    Я может что не так понял, но стандартное проигрывание музыки в конце игры в Gungame нормально работает, даже если ставить свои треки. Зачем тогда ставить RES?
     
  8. trueattack

    trueattack

    Сообщения:
    148
    Симпатии:
    32
    Один трек играет уже 2 месяца, он честно поднадоел. Поэтому появилась такая надобность. Теперь их 12 :D
     
  9. ☆★☆БАТЯ☆★☆™

    ☆★☆БАТЯ☆★☆™

    Сообщения:
    2.585
    Симпатии:
    1.341
    trueattack, Ну, имхо конечно, не проще было бы попросить чуть подправить исходник ГГ, чтобы можно было ставить несколько треков на конец карты, чем ставить лишний плагин... Хотя, хозяин - барин.
     
  10. trueattack

    trueattack

    Сообщения:
    148
    Симпатии:
    32
    Ну я думаю не многие захотят возиться с исходниками огромного плагина, дабы расширить его возможности, когда можно воспользоваться тем, что есть, добавив лишь новую функцию. В любом случае, нагрузка от RES не критическая.
     
  11. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    А выйдет обновление GG (совместимое с новыми версиями SM, например), то опять править... А RES уже, считай не обновляется - раз сделано и всё.