у меня виснет spectate
#1

pawn Code:
public OnPlayerDisconnect(playerid, reason)
{
    for(new x = 0; x < MAX_PLAYERS; x++)
    {
        if(GetPlayerState(x) == PLAYER_STATE_SPECTATING && Player[x][gSpectateID] == playerid)
        {
            if(Player[x][pTeam] == T_REF)
                AdvanceSpectate(x);
            else
                AdvanceTeamSpectate(x);
        }
    }
    return true;
}
public OnPlayerDeath(playerid, killerid, reason)
{
    for(new x = 0; x < MAXPLAYER; x++)
    {
        if(GetPlayerState(x) == PLAYER_STATE_SPECTATING && Player[x][gSpectateID] == playerid)
        {
            if(Player[x][pTeam] == T_REF)
                AdvanceSpectate(x);
            else
                AdvanceTeamSpectate(x);
        }
    }
    return true;
}
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    for (new x; x != MAXPLAYER; ++x)
    {
        if(IsPlayerConnected(x) && GetPlayerState(x) == PLAYER_STATE_SPECTATING && Player[x][gSpectateID] == playerid)
            SetPlayerInterior(x, newinteriorid);
    }
    return true;
}
public OnPlayerEnterVehicle(playerid, vehicleid)
{
    for (new x; x != MAXPLAYER; ++x)
    {
        if(GetPlayerState(x) == PLAYER_STATE_SPECTATING && Player[x][gSpectateID] == playerid)
        {
            TogglePlayerSpectating(x, 1);
            PlayerSpectateVehicle(x, vehicleid);
        }
    }
    return true;
}
public OnPlayerExitVehicle(playerid, vehicleid)
{
    for (new x; x != MAXPLAYER; ++x)
    {
        if(GetPlayerState(x) == PLAYER_STATE_SPECTATING && Player[x][gSpectateID] == playerid )
        {
            TogglePlayerSpectating(x, 1);
            PlayerSpectatePlayer(x, playerid);
        }
    }
    return true;
}
public StartSpectate(playerid, specid)
{
    SetPlayerInterior(playerid, GetPlayerInterior(specid));
    SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(specid));
    TogglePlayerSpectating(playerid, 1);
    if(IsPlayerInAnyVehicle(specid))
        PlayerSpectateVehicle(playerid, GetPlayerVehicleID(specid));
    else
        PlayerSpectatePlayer(playerid, specid);
    Player[playerid][gSpectateID] = specid;
    Player[playerid][Specing]     = true;
    Player[playerid][pPlaying]    = false;
    TextDrawShowForPlayer(playerid, Player[playerid][SpecText]);
    UpdatePlayer(playerid);
    return true;
}
stock StopSpectate(playerid)
{
    KillTimer(SUT[playerid]);
    TogglePlayerSpectating(playerid, 0);
    Player[playerid][Specing]    = false;
    Player[playerid][gSpectateID] = INVALID_PLAYER_ID;
    TextDrawHideForPlayer(playerid, Player[playerid][SpecText]);
    return true;
}
stock adminspec_strtok(const string[], &index)
{
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
        index++;

    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
        result[index - offset] = string[index];
        index++;
    }
    result[index - offset] = EOS;
    return result;
}
AdvanceTeamSpectate(playerid)
{
    if(GetActivePlayersOnTeam(Player[playerid][pTeam]) < 1)return StopSpectate(playerid);
    if(GetPlayerState(playerid) == PLAYER_STATE_SPECTATING && Player[playerid][gSpectateID] != INVALID_PLAYER_ID)
    {
        for (new x = Player[playerid][gSpectateID] + 1; x <= MAXPLAYER; x++)
        {
            if(x >= MAXPLAYER)x = 0;
            if (IsPlayerConnected(x) && x != playerid && Player[x][pPlaying] == true && Player[x][pTeam] == Player[playerid][pTeam])
            {
                if (GetPlayerState(x) == PLAYER_STATE_SPECTATING && Player[x][gSpectateID] != INVALID_PLAYER_ID && Player[x][pPlaying] == true || (GetPlayerState(x) != 1 && GetPlayerState(x) != 2 && GetPlayerState(x) != 3))
                {
                    continue;
                }
                else
                {
                    StartSpectate(playerid, x);
                    return true;
                }
            }
        }
    }
    return StopSpectate(playerid);
}
GetActivePlayersOnTeam(team)
{
    new players = 0;
    foreach(i)
    {
        if(Player[i][pTeam] == team && Player[i][pPlaying] == true)
            players++;
    }
    return players;
}
AdvanceSpectate(playerid)
{
    if(PlayersAvailable() < 1){StopSpectate(playerid); return true;}
    if(GetPlayerState(playerid) == PLAYER_STATE_SPECTATING && Player[playerid][gSpectateID] != INVALID_PLAYER_ID)
    {
        for(new x = Player[playerid][gSpectateID]+1; x <= MAXPLAYER; x++)
        {
            if(x == MAXPLAYER)x = 0;
            if(IsPlayerConnected(x) && x != playerid && Player[x][pPlaying] == true)
            {
                if(GetPlayerState(x) == PLAYER_STATE_SPECTATING && Player[x][gSpectateID] != INVALID_PLAYER_ID || (GetPlayerState(x) != 1 && GetPlayerState(x) != 2 && GetPlayerState(x) != 3))
                {
                    continue;
                }
                else
                {
                    StartSpectate(playerid, x);
                    break;

                }
            }
        }
    }
    return true;
}
PlayersAvailable()
{
    new players = 0;
    foreach(i) if(Player[i][pPlaying] == true && Player[i][pSpawned] && Player[i][Specing] == false && GetPlayerState(i) != PLAYER_STATE_SPECTATING && Player[i][pTeam] != T_REF)
        players++;
    return players;
}
Здравствуйте! Помогите разобраться почему у меня виснет спек. Он виснет не сразу и в какой момент именно, я понять не могу. Но когда его вообще нет в моде, работает все хорошо. Прошу вашей помощи. Что именно заставляет его повиснуть понять.
Reply
#2

А не пускает ли это цикл в рекурсию - if(x == MAXPLAYER)x = 0; ?
Reply
#3

Quote:

А не пускает ли это цикл в рекурсию - if(x == MAXPLAYER)x = 0;

Может вы имели в виду "не делает ли это цикл бесконечным"
Reply
#4

Code:
MAXPLAYER = GetMaxPlayers()+1;
забыл добавить
Reply
#5

Quote:
Originally Posted by jhonyxakep
View Post
Может вы имели в виду "не делает ли это цикл бесконечным"
А ведь по сути, это одно и тоже.
Reply
#6

Quote:
Originally Posted by iEnemY
View Post
А ведь по сути, это одно и тоже.
нет.
Рекурсия - вызов функции из самой себя.
"Зацикливание" - цикл, написанный таким образом, что условие выхода из него никогда не выполняется.
Reply
#7

Подскажете как бы решить эту проблему?
Reply
#8

Может уже переделаеш
for (new x; x != MAXPLAYER; ++x)
в
for (new x; x < MAXPLAYER; x++)

Чую я, где то в этом проблема...
===
По поводу рекурсии: цикл ведь вызывает себя, каждый раз проверяя параметры. Так вот, если он вызывает себя бесконечно - то это ж получается рекурсия.
Reply
#9

Спасибо большое!
Reply
#10

Quote:
Originally Posted by iEnemY
View Post
По поводу рекурсии: цикл ведь вызывает себя, каждый раз проверяя параметры. Так вот, если он вызывает себя бесконечно - то это ж получается рекурсия.
прочитай внимательно определения. И цикл никогда не вызывает сам себя, он выполняется.
Reply
#11

Ну вообще, я думал о том, что что-то, что выполняется бесконечно (а так и происходит в бесконечных циклах), и есть рекурсия. Ну, вероятно немного неправ.
Reply
#12

Все равно виснет, использовал printf показали, последний раз использовали AdvanceTeamSpectate и сервер повис
Reply
#13

PHP код:
AdvanceTeamSpectate(playerid)
{
    if(
Online <= || Current == -1) return true;//Думаю поймешь что такое Online.
    
for (new Player[playerid][gSpectateID] + 1<= MAXPLAYERx++)
    {
    if(
== MAXPLAYER)0;
    if (
IsPlayerConnected(x) && != playerid && Player[x][gSpectateID] != INVALID_PLAYER_ID && GetPlayerState(specid) != && Player[x][pPlaying] == true && (Player[x][pTeam] == Player[playerid][pTeam] || Player[playerid][Team] == T_REF))
    {
    
StartSpectate(playeridx);
    break;
    }
    }
    return 
true;

Оптимизировал, потому что сам сталкивался и знаю как это неприятно..
Сделал так, что если игрок судья он может кликать на любого, если нет , то только на свою команду.
Reply
#14

От оптимизации, разве исправится баг?
Gameyer при использование твоего способа, спек вообще сразу виснет
Reply
#15

Чуть подправил, попробуй, из-за моего способа не может виснуть, он стоит у меня, ищи причину вернее.
Reply
#16

Виснет Сразу же.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)