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

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Код ниже.

В раунде спавнится 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 != 2 && team != 3)
    {
        return;
    }
  
    if(team == 2)
    {
        new cCount = GetTeamClientCount(3);
        new Class;
      
        if(dayseting_Boss[iDay])
        {
            Class = GetRandomInt(0, iBossesCount);
            SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", GetRandomFloat(boss_SpeedMin[Class], boss_SpeedMax[Class]) * dayseting_Speed[iDay]);
            SetEntData(client, g_iHealth,  RoundToNearest(((GetRandomInt(boss_HealthMin[Class], boss_HealthMax[Class]) + dayseting_HealthBoost[iDay]) + (dayseting_PerPlayerBoost[iDay] == 0 ? 0 : cCount + dayseting_PerPlayerBoost[iDay])) * (dayseting_PerPlayerRatio[iDay] == 0.0 ? 1.0 : dayseting_PerPlayerRatio[iDay] * cCount)));
            SetEntityModel(client, boss_Model[Class]);
        }
        else
        {
            Class = GetRandomInt(0, iClassCount);
            SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", GetRandomFloat(class_SpeedMin[Class], class_SpeedMax[Class]) * dayseting_Speed[iDay]);
            SetEntData(client, g_iHealth,     RoundToNearest(((GetRandomInt(class_HealthMin[Class],class_HealthMax[Class]) + dayseting_HealthBoost[iDay]) + (dayseting_PerPlayerBoost[iDay] == 0 ? 0 : cCount + dayseting_PerPlayerBoost[iDay])) * (dayseting_PerPlayerRatio[iDay] == 0.0 ? 1.0 : dayseting_PerPlayerRatio[iDay] * cCount)));
            SetEntityModel(client,    class_Model[Class]);
        }
      
        new knife = GetPlayerWeaponSlot(client, 2);
        if (knife != -1)
        {
            SetEntityRenderMode(knife, RENDER_TRANSALPHA);
            SetEntityRenderColor(knife, 255, 255, 255, 0);
        }
      
        new glock = GetPlayerWeaponSlot(client, 1);
        if (glock != -1)
        {
            RemovePlayerItem(client, glock);
            AcceptEntityInput(glock, "Kill");
        }
    }
    else
    {
        SetEntData(client, g_offsCollisionGroup, 2, 4, true);
      
        if (0 < g_stats[rank][client] <= 15)
        {
            if (g_stats[rank][client] <= 10)
            {
                new bool:w[2];
              
                new usp = GetPlayerWeaponSlot(client, 1);
                if (usp != -1)
                {
                    new String:sWeapon[32];
                    GetEdictClassname(usp, sWeapon, sizeof(sWeapon));
                  
                    if(StrEqual(sWeapon, "weapon_usp") || (Engine_Version == GAME_CSGO && StrEqual(sWeapon, "weapon_p2000")))
                    {
                        RemovePlayerItem(client, usp);
                        AcceptEntityInput(usp, "Kill");
                        GivePlayerItem(client, "weapon_elite");
                        w[0] = true;
                    }
                }
              
                if(g_stats[rank][client] <= 5)
                {
                    if(GetPlayerWeaponSlot(client, 0) == -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(client, g_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(client, g_iHealth,  150);
                }
            }
            else
            {
              
                if(GetPlayerWeaponSlot(client, 0) == -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");
                }
            }
        }
    }
}
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
Оффтоп
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
PHP:
if (team < 2)
Команда 1 (спектатор) не может спавниться, поэтому, можно просто:
PHP:
if (!team)
SetEntityRenderColor(knife, 255, 255, 255, 0);
Невидимый нож? Если только выкинешь.
ТТ бывает код не срабатывает
Остаются с пистолетом? Нужен таймер в этой части.
1) Добавлял таймер (стало еще хуже)
Это уже интересно, в чём хуже?)
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Проблема в том, что PlayerSpawn не срабатывает по всех игроках TT.

zriot_zlab_050001.jpg

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

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

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

Невидимый нож? Если только выкинешь.

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

Остаются с пистолетом? Нужен таймер в этой части.

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

Это уже интересно, в чём хуже?)

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
PlayerSpawn не срабатывает по всех игроках TT
Убери весь код, оставь лишь само событие и сделай вывод в консоль сервера с подсчётом игроков. Возможно, баг твоего SM.
оружие в руках пропадает
Волшебный SM? Почему тогда на это дело существует целая тема: Можно ли визуально убрать ножик у игрока ? и плагины, типа [ZR&CSGO] Invisible Knife v1.1? Пробовали твой вариант, не работает.
 

Drumanid

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Всё равно, не хотело. Оффтоп
Оффтоп
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
@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);
}

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

Danyas

Участник
Сообщения
2,173
Реакции
1,072
TT Players spawned: 30 (full code)
TT Players spawned: 30 (lite code)

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

zriot_zlab_050002.jpg
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Значит, все? SM не виноват, только кодер.Такие дела конечно делают через таймер 0.1, чтобы наверняка.
Проверь лог ошибок, спам в консолях.

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

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 нужно было при рандоме выставить...

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

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Потерять ~5 часов времени из-за того , что logecho был выключен и папка с логами не просматривалась.


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