player_spawn не действует на всех игроков

Тема в разделе "Программирование / Скриптинг", создана пользователем Danyas, 22 авг 2016.

  1. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.718
    Симпатии:
    455
    Код ниже.

    В раунде спавнится 30 игроков за ТТ и 1 за КТ.

    Со мной (КТ) - всё в порядке, всё выдается, а вот на нескольких (0-6 игроков) игроков ТТ бывает код не срабатывает.

    Это, последняя версия кода, уже 3 часа не могу исправить проблему.
    Что делал:
    1) Добавлял таймер (стало еще хуже)
    2) менял свичи на if и наоборот
    3) таскал куски кода туда-обратно


    PHP:
    public OnPluginStart()
    {
        
    HookEvent("player_spawn",        Event_PlayerSpawn);
    }
    ...

    public 
    Action:Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));

        new 
    team GetClientTeam(client);
      
        if (
    team != && team != 3)
        {
            return;
        }
      
        if(
    team == 2)
        {
            new 
    cCount GetTeamClientCount(3);
            new Class;
          
            if(
    dayseting_Boss[iDay])
            {
                Class = 
    GetRandomInt(0iBossesCount);
                
    SetEntPropFloat(clientProp_Send"m_flLaggedMovementValue"GetRandomFloat(boss_SpeedMin[Class], boss_SpeedMax[Class]) * dayseting_Speed[iDay]);
                
    SetEntData(clientg_iHealth,  RoundToNearest(((GetRandomInt(boss_HealthMin[Class], boss_HealthMax[Class]) + dayseting_HealthBoost[iDay]) + (dayseting_PerPlayerBoost[iDay] == cCount dayseting_PerPlayerBoost[iDay])) * (dayseting_PerPlayerRatio[iDay] == 0.0 1.0 dayseting_PerPlayerRatio[iDay] * cCount)));
                
    SetEntityModel(clientboss_Model[Class]);
            }
            else
            {
                Class = 
    GetRandomInt(0iClassCount);
                
    SetEntPropFloat(clientProp_Send"m_flLaggedMovementValue"GetRandomFloat(class_SpeedMin[Class], class_SpeedMax[Class]) * dayseting_Speed[iDay]);
                
    SetEntData(clientg_iHealth,     RoundToNearest(((GetRandomInt(class_HealthMin[Class],class_HealthMax[Class]) + dayseting_HealthBoost[iDay]) + (dayseting_PerPlayerBoost[iDay] == cCount dayseting_PerPlayerBoost[iDay])) * (dayseting_PerPlayerRatio[iDay] == 0.0 1.0 dayseting_PerPlayerRatio[iDay] * cCount)));
                
    SetEntityModel(client,    class_Model[Class]);
            }
          
            new 
    knife GetPlayerWeaponSlot(client2);
            if (
    knife != -1)
            {
                
    SetEntityRenderMode(knifeRENDER_TRANSALPHA);
                
    SetEntityRenderColor(knife2552552550);
            }
          
            new 
    glock GetPlayerWeaponSlot(client1);
            if (
    glock != -1)
            {
                
    RemovePlayerItem(clientglock);
                
    AcceptEntityInput(glock"Kill");
            }
        }
        else
        {
            
    SetEntData(clientg_offsCollisionGroup24true);
          
            if (
    g_stats[rank][client] <= 15)
            {
                if (
    g_stats[rank][client] <= 10)
                {
                    new 
    bool:w[2];
                  
                    new 
    usp GetPlayerWeaponSlot(client1);
                    if (
    usp != -1)
                    {
                        new 
    String:sWeapon[32];
                        
    GetEdictClassname(uspsWeaponsizeof(sWeapon));
                      
                        if(
    StrEqual(sWeapon"weapon_usp") || (Engine_Version == GAME_CSGO && StrEqual(sWeapon"weapon_p2000")))
                        {
                            
    RemovePlayerItem(clientusp);
                            
    AcceptEntityInput(usp"Kill");
                            
    GivePlayerItem(client"weapon_elite");
                            
    w[0] = true;
                        }
                    }
                  
                    if(
    g_stats[rank][client] <= 5)
                    {
                        if(
    GetPlayerWeaponSlot(client0) == -1)
                        {
                            
    GivePlayerItem(client"weapon_ak47");
                            
    w[1] = true;
                        }
                      
                        switch(
    Engine_Version)
                        {
                            case 
    GAME_CSS_34:    PrintToChat(client"\x04[\x03TOP5\x03]\x01 Вы получили \x04увеличеный урон\x01 на \x0350%%\x01 %s%s и \x03+100 HP\x01."w[1] ? ", \x04AK-47\x01" ""w[0] ? ", \x04двойные берреты\x01 " "");
                            case 
    GAME_CSS:        PrintToChat(client"\x05[\x04TOP5\x05]\x01 Вы получили \x03увеличеный урон\x01 на \x0550%%\x01 %s%s и \x05+100 HP\x01."w[1] ? ", \x04AK-47\x01" ""w[0] ? ", \x04двойные берреты\x01 " "");
                            case 
    GAME_CSGO:        PrintToChat(client"\x0E[\x10TOP5\x0E]\x01 Вы получили \x08увеличеный урон\x01 на \x0450%%\x01 %s%s и \x04+100 HP\x01."w[1] ? ", \x08AK-47\x01" ""w[0] ? ", \x08двойные берреты\x01 " "");
                        }
                        
    SetEntData(clientg_iHealth,  200);
                    }
                    else
                    {
                        switch(
    Engine_Version)
                        {
                            case 
    GAME_CSS_34:    PrintToChat(client"\x04[\x03TOP10\x03]\x01 Вы получили \x04увеличеный урон\x01 на \x0325%%\x01%s и\x03+50 HP\x01."w[0] ? ", \x04двойные берреты\x01" "");
                            case 
    GAME_CSS:        PrintToChat(client"\x05[\x04TOP10\x05]\x01 Вы получили \x03увеличеный урон\x01 на \x0525%%\x01%s и\x05+50 HP\x01."w[0] ? ", \x04двойные берреты\x01" "");
                            case 
    GAME_CSGO:        PrintToChat(client"\x0E[\x10TOP10\x0E]\x01 Вы получили \x08увеличеный урон\x01 на \x0425%%\x01%s и\x04+50 HP\x01."w[0] ? ", \x08двойные берреты\x01" "");
                        }
                        
    SetEntData(clientg_iHealth,  150);
                    }
                }
                else
                {
                  
                    if(
    GetPlayerWeaponSlot(client0) == -1)
                    {
                        switch(
    Engine_Version)
                        {
                            case 
    GAME_CSS_34:    PrintToChat(client"\x04[\x03TOP15\x03]\x01 Вы получили \x04увеличеный урон\x01 на \x0310%%\x01 и оружие \x04TMP\x01.");
                            case 
    GAME_CSS:        PrintToChat(client"\x05[\x04TOP15\x05]\x01 Вы получили \x03увеличеный урон\x01 на \x0510%%\x01 и оружие \x04TMP\x01.");
                            case 
    GAME_CSGO:        PrintToChat(client"\x0E[\x10TOP15\x0E]\x01 Вы получили \x08увеличеный урон\x01 на \x0410%%\x01 и оружие \x08TMP\x01.");
                        }
                      
                        
    GivePlayerItem(client"weapon_tmp");
                    }
                }
            }
        }
    }
     
  2. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Оффтоп
     
  3. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.964
    PHP:
    if (team 2)
    Команда 1 (спектатор) не может спавниться, поэтому, можно просто:
    PHP:
    if (!team)
    Невидимый нож? Если только выкинешь.
    Остаются с пистолетом? Нужен таймер в этой части.
    Это уже интересно, в чём хуже?)
     
    Danyas нравится это.
  4. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.718
    Симпатии:
    455
    Проблема в том, что PlayerSpawn не срабатывает по всех игроках TT.

    zriot_zlab_050001.jpg

    Код такой же, что и в первом посте.
    Если добавить инкремент после if(team == 2) { , то он насчитывает 25-29, а должно ровно 30.

    На скрине и по коду видно, что 2 ТТ без скина и HP.

    Раньше свич стоят на 2 и 3, это я его уже в if перекинул (как в оригинальном моде было сделано).

    Вот как раз и нефига, оружие в руках пропадает. За ТТ играют только боты с bot_knives_only, они не меняют оружие на другое.

    Хорошо, учту.

    Выставлял 0.15, 0.5 таймеры, в первом случае Player_Spawn сработал на ~27 игроков, во втором на ~22. После этого завершил тесты.
    --- Добавлено позже ---
    @Саша Шеин, немного мимо, мне их нужно именно убирать.
     
  5. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.964
    Убери весь код, оставь лишь само событие и сделай вывод в консоль сервера с подсчётом игроков. Возможно, баг твоего SM.
    Волшебный SM? Почему тогда на это дело существует целая тема: Можно ли визуально убрать ножик у игрока ? и плагины, типа [ZR&CSGO] Invisible Knife v1.1? Пробовали твой вариант, не работает.
     
    Danyas нравится это.
  6. Drumanid

    Drumanid Дилетант

    Сообщения:
    568
    Симпатии:
    194
    Оффтоп
     
  7. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.964
    Всё равно, не хотело. Оффтоп Правда, я не с самого спавна, а вроде просто консольной командой устанавливал. Неужто такая разница...
     
    Danyas нравится это.
  8. Drumanid

    Drumanid Дилетант

    Сообщения:
    568
    Симпатии:
    194
    Оффтоп
     
  9. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.718
    Симпатии:
    455
    @AlmazON с ножиком всё впорядке, он правильно скрывается, только от третьего лица.
    На счёт SM-a, сейчас проверю
    --- Добавлено позже ---
    PHP:


    new ps_count;

    public 
    OnPluginStart()
    {
        
    HookEvent("player_spawn",        Event_PlayerSpawn);
        
    HookEvent("round_freeze_end",    Event_RoundFreezeEnd,    EventHookMode_PostNoCopy);
        
    HookEvent("round_end",            Event_RoundEnd);
    }

    public 
    Action:Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));

        switch (
    GetClientTeam(client))
        {
            case 
    2:
            {
                
    ps_count++
            }
        }
    }

    public 
    Action:Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        
    ps_count 0;
    }


    public 
    Action:Event_RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        
    PrintToServer("TT Players spawned: %i (lite code)"ps_count);
    }

    Такой код использовать буду.
    Сейчас встрою его в код, а потом отдельным плагином попробую
     
    Последнее редактирование: 22 авг 2016
  10. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.964
    Тогда ясно. Речь была "от первого лица". Код там же, кстати, если нужно.
     
    Danyas нравится это.
  11. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.718
    Симпатии:
    455
    TT Players spawned: 30 (full code)
    TT Players spawned: 30 (lite code)

    Инкремент прошел, но по левому игроку видно что код не применился (нож не исчез, модель не изменилась, хп не выдалось, в отличии от правого игрока)

    zriot_zlab_050002.jpg
     
  12. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.964
    Значит, все? SM не виноват, только кодер.
    Такие дела конечно делают через таймер 0.1, чтобы наверняка.
    Проверь лог ошибок, спам в консолях.
     
    Danyas нравится это.
  13. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.718
    Симпатии:
    455
    Спасибо большое, я в логи не смотрел.
    Почему то был уверен что проблема не в этом...

    L 08/22/2016 - 11:02:09: [SM] Displaying call stack trace for plugin "zriot_reloaded.smx":
    L 08/22/2016 - 11:02:09: [SM] [0] Line 1159, zriot_reloaded.sp::Event_PlayerSpawn()
    L 08/22/2016 - 11:02:20: [SM] Plugin encountered error 30: Script execution timed out

    L 08/22/2016 - 11:53:05: [SM] Plugin encountered error 15: Array index is out of bounds
    L 08/22/2016 - 11:53:05: [SM] Displaying call stack trace for plugin "zriot_reloaded.smx":
    L 08/22/2016 - 11:53:05: [SM] [0] Line 1159, zriot_reloaded.sp::Event_PlayerSpawn()

    Со второй разобрался, -1 нужно было при рандоме выставить...

    А вот первая проходит реже, но почему - не понятно.
     
  14. AlmazON

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

    Сообщения:
    4.512
    Симпатии:
    1.964
    Обычно возникает в бесконечных циклах. Скинь саму строку и с нею внутри связанный код.
     
    Danyas нравится это.
  15. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.718
    Симпатии:
    455
    Потерять ~5 часов времени из-за того , что logecho был выключен и папка с логами не просматривалась.


    Если возникнет еще раз - скину, сейчас просто код съехал по строкам.
     
    Последнее редактирование: 22 авг 2016