Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 3 ПерваяПервая 1 2 3 ПоследняяПоследняя
Показано с 11 по 20 из 21
  1. #11
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Alexey_Nikiforov Посмотреть сообщение
    Ладно хорошо все сделали вроде бы все хорошо, но у нас еще есть несчастная кнопка F4 которая принудительно после смерти игрока вызывает:
    public OnPlayerRequestClass(playerid, classid)

    И тут начинаются проблемы...
    public OnPlayerRequestClass(playerid, classid) вызывается по 3 причинам:
    1) При подключении к серверу
    2) После смерти игрока
    3) После нажатия F4.

    Искал смотрел так и не нашел решения, не пишу мод дальше пока не устраню эту проблему уже много чего перепробовал.
    Все варианты рабочие но неидеальные, везде есть свои минусы.

    Ходил на офф сайт там баг репорт завален рассказами про OnPlayerRequestClass (F4) bug но везде одно и тоже, не чего толкового.
    Где то даже ответил сам Кай что это не баг у вас не правильный код.
    Привел бы сам пример как это отключить.

    В общем мне уже начинает надоедать это...
    Это учтено, смотри внимательнее.
    Вот, немного обновил эту часть:
    PHP код:
        // если игрок нажал F4 и умер, то просто спавним его
        
    if (IsPlayerLogin(playerid)) {
            
    TogglePlayerSpectating(playerid1);
            
    SpawnPlayerEx(playerid00.00.00.00.0);
            return 
    0;
        } 

  2. #12
    Аватар для Alexey_Nikiforov
    Уровень знаний 1

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    61
    Репутация:
    1 ±
    Щас попробую.

  3. #13
    Аватар для Alexey_Nikiforov
    Уровень знаний 1

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    61
    Репутация:
    1 ±
    Цитата Сообщение от Alexey_Nikiforov Посмотреть сообщение
    Щас попробую.
    Вот нацарапал код.
    В нем куча багов.
    Я что то не так сделал?
    PHP код:
    #include <a_samp>

    #define IsPlayerAuthorized(%0)                player_is_authorized{%0}
    #define SetPlayerAuthorized(%0,%1)            player_is_authorized{%0} = %1
    #define PLAYER_OFFLINE                        0
    #define PLAYER_ONLINE                        1

    new player_is_authorized[MAX_PLAYERS char];

    main()
    {}

    public 
    OnGameModeInit()
    {
        return 
    1;
    }
    public 
    OnPlayerCommandText(playeridcmdtext[])
    {
        if(
    strcmp("/kill"cmdtexttrue10) == 0)
        {
            
    SetPlayerHealth(playerid0.0 );
            return 
    1;
        }
        else if(
    strcmp("/login"cmdtexttrue10) == 0)
        {
            
    SetPlayerAuthorized(playeridPLAYER_ONLINE);
            
    SpawnPlayerEx(playerid1242499.8, -2129.600123.592.0);
            return 
    1;
        }
        else if(
    strcmp("/spawn"cmdtexttrue10) == 0)
        {
            
    TogglePlayerSpectating(playerid1);
            
    SpawnPlayerEx(playerid1242499.8, -2129.600123.592.0);    
            return 
    1;
        }
        
    SendClientMessage(playerid,0xFFFFFFFF"Неверная команда.");
        return 
    1;
    }
    stock SpawnPlayerEx(playeridskinFloat:xFloat:yFloat:zFloat:rotation)
    {
        
    SetSpawnInfo(playerid0skinxyzrotation1013899999934999999);
        
    TogglePlayerSpectating(playerid0);

    forward SetClassCameraPos(playerid);
    public 
    SetClassCameraPos(playerid)
    {
        
    SetPlayerCameraPos(playerid,1879.984252, -2908.6101071.996365);
        
    SetPlayerCameraLookAt(playerid,1879.666870, -2913.4873040.941269);
    }
    public 
    OnPlayerRequestSpawn(playerid)//Вызывается когда игрок нажимает кнопку Spawn.
    {
        return 
    0;// Тут ставим 0 что бы отключить кнопку Spawn.
    }  
    public 
    OnPlayerRequestClass(playeridclassid)
    {
         
    // если игрок нажал F4 и умер, то просто спавним его
        
    if(IsPlayerAuthorized(playerid))
        {
            
    TogglePlayerSpectating(playerid1);
            
    SpawnPlayerEx(playerid1242499.8, -2129.600123.592.0);
            return 
    0;
        }
        
    // скрыть кнопки 
        
    TogglePlayerSpectating(playerid1);
        
    // установить позицию камеры (без задержки после TogglePlayerSpectating не работает)
        
    SetTimerEx("SetClassCameraPos"2000"i"playerid);

        
    #if defined Spawn_OnPlayerRequestClass
            
    return Spawn_OnPlayerRequestClass(playeridclassid);
        
    #else
            
    return 1;
        
    #endif
    }
    #if defined _ALS_OnPlayerRequestClass
        #undef OnPlayerRequestClass
    #else
        #define _ALS_OnPlayerRequestClass
    #endif
     
    #define OnPlayerRequestClass Spawn_OnPlayerRequestClass
    #if defined Spawn_OnPlayerRequestClass
        
    forward Spawn_OnPlayerRequestClass(playeridclassid);
    #endif 
    Последний раз редактировалось Alexey_Nikiforov; 17.02.2016 в 18:29.

  4. #14
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Какие баги?
    В OnPlayerRequestSpawn, наверное, нужно так написать:
    PHP код:
    public OnPlayerRequestSpawn(playerid)
    {
        if (
    IsPlayerAuthorized(playerid)) {
            return 
    1;
        }
        return 
    0;


  5. #15
    Аватар для Alexey_Nikiforov
    Уровень знаний 1

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    61
    Репутация:
    1 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Какие баги?
    В OnPlayerRequestSpawn, наверное, нужно так написать:
    PHP код:
    public OnPlayerRequestSpawn(playerid)
    {
        if (
    IsPlayerAuthorized(playerid)) {
            return 
    1;
        }
        return 
    0;

    Если использовать такой код.
    PHP код:
        if(IsPlayerAuthorized(playerid))
        {
            
    TogglePlayerSpectating(playerid1);
            
    SpawnPlayerEx(playerid1242499.8, -2129.600123.592.0);
            return 
    0;
        } 
    Баги следующие:
    1) После нажатия F4 и /kill, попадет в режим "выбор класса".
    И не выходит из него.
    После каждом использовании /kill создается бутылка или сигарета, рандомно.
    2) Если нажать F4 и /spawn, вылазят несчастный кнопки а так как они отключены игрок зависает в режиме "выбор класса"

    Если использовать такой код.
    PHP код:
        if(IsPlayerAuthorized(playerid))
        {
            
    TogglePlayerSpectating(playerid1);
            
    SpawnPlayerEx(playerid1242499.8, -2129.600123.592.0);
            return 
    1;
        } 
    Баги следующие:
    1) После нажатия F4 и /kill, попадет в режим "выбор класса".
    После смерти отлично выходит из этого режима.
    Но при выходе из режима забирает оружие и спавнит бутылку, при повтор использовании /kill(без F4) все хорошо(оружие не забирает).
    2) Если нажать F4 и /spawn, вылазят несчастный кнопки а так как они отключены игрок зависает в режиме "выбор класса" (тоже самое).
    3) При повторном подключении к серверу игрока сразу спавнит без авторизации (/login). ( при первом подключении через /login)

    Вот эта целая куча багов. только что я не делал.
    перебрал уже около 100 разных вариантов.
    В каждом из них остается 1 из багов.
    Не могу добиться идеального варианта.

    HELP

  6. #16
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Идеального варианта наверное не получится, вот кое-что получше, но багов тоже хватает:

    PHP код:
    #include <a_samp>

    #define IsPlayerAuthorized(%0)                player_is_authorized{%0}
    #define SetPlayerAuthorized(%0,%1)            player_is_authorized{%0} = %1
    #define PLAYER_OFFLINE                        0
    #define PLAYER_ONLINE                         1

    new player_is_authorized[MAX_PLAYERS char];

    main()
    {}

    public 
    OnGameModeInit()
    {
        return 
    1;
    }

    public 
    OnPlayerConnect(playerid)
    {
        
    SetPlayerAuthorized(playeridPLAYER_OFFLINE);
        return 
    1;
    }

    public 
    OnPlayerCommandText(playeridcmdtext[])
    {
        if (
    strcmp("/kill"cmdtexttrue10) == 0)
        {
            
    SetPlayerHealth(playerid0.0 );
            return 
    1;
        }
        
        if (
    strcmp("/login"cmdtexttrue10) == 0)
        {
            
    SetPlayerAuthorized(playeridPLAYER_ONLINE);
            
    TogglePlayerSpectating(playerid0);
            return 
    1;
        }
        
        if (
    strcmp("/spawn"cmdtexttrue10) == 0)
        {
            
    SpawnPlayer(playerid);
            return 
    1;
        }

        
    SendClientMessage(playerid,0xFFFFFFFF"Неверная команда.");
        return 
    1;
    }

    public 
    OnPlayerSpawn(playerid)
    {
        if (
    GetPVarInt(playerid"is_after_f4") == 1) {
            
    DeletePVar(playerid"is_after_f4");
            return 
    1;
        }
        
    // код спавна здесь
        
    return 1;
    }

    public 
    OnPlayerRequestSpawn(playerid)
    {
        if (
    IsPlayerAuthorized(playerid)) {
            return 
    1;
        }
        return 
    0;
    }

    public 
    OnPlayerRequestClass(playeridclassid)
    {
        
    TogglePlayerSpectating(playerid1);
        
    SetSpawnInfo(playerid01242499.8, -2129.600123.592.01013899999934999999);

        if (
    IsPlayerAuthorized(playerid)) {
            
    SetPVarInt(playerid"is_after_f4"1);
            
    TogglePlayerSpectating(playerid0);
            
    SpawnPlayer(playerid);
        } else {
            
    SetTimerEx("SetClassCameraPos"2000"i"playerid);
        }

        return 
    1;
    }

    forward SetClassCameraPos(playerid);
    public 
    SetClassCameraPos(playerid)
    {
        
    SetPlayerCameraPos(playerid1879.984252, -2908.6101071.996365);
        
    SetPlayerCameraLookAt(playerid1879.666870, -2913.4873040.941269);


  7. #17
    Аватар для Alexey_Nikiforov
    Уровень знаний 1

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    61
    Репутация:
    1 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Идеального варианта наверное не получится, вот кое-что получше, но багов тоже хватает:

    PHP код:
    #include <a_samp>

    #define IsPlayerAuthorized(%0)                player_is_authorized{%0}
    #define SetPlayerAuthorized(%0,%1)            player_is_authorized{%0} = %1
    #define PLAYER_OFFLINE                        0
    #define PLAYER_ONLINE                         1

    new player_is_authorized[MAX_PLAYERS char];

    main()
    {}

    public 
    OnGameModeInit()
    {
        return 
    1;
    }

    public 
    OnPlayerConnect(playerid)
    {
        
    SetPlayerAuthorized(playeridPLAYER_OFFLINE);
        return 
    1;
    }

    public 
    OnPlayerCommandText(playeridcmdtext[])
    {
        if (
    strcmp("/kill"cmdtexttrue10) == 0)
        {
            
    SetPlayerHealth(playerid0.0 );
            return 
    1;
        }
        
        if (
    strcmp("/login"cmdtexttrue10) == 0)
        {
            
    SetPlayerAuthorized(playeridPLAYER_ONLINE);
            
    TogglePlayerSpectating(playerid0);
            return 
    1;
        }
        
        if (
    strcmp("/spawn"cmdtexttrue10) == 0)
        {
            
    SpawnPlayer(playerid);
            return 
    1;
        }

        
    SendClientMessage(playerid,0xFFFFFFFF"Неверная команда.");
        return 
    1;
    }

    public 
    OnPlayerSpawn(playerid)
    {
        if (
    GetPVarInt(playerid"is_after_f4") == 1) {
            
    DeletePVar(playerid"is_after_f4");
            return 
    1;
        }
        
    // код спавна здесь
        
    return 1;
    }

    public 
    OnPlayerRequestSpawn(playerid)
    {
        if (
    IsPlayerAuthorized(playerid)) {
            return 
    1;
        }
        return 
    0;
    }

    public 
    OnPlayerRequestClass(playeridclassid)
    {
        
    TogglePlayerSpectating(playerid1);
        
    SetSpawnInfo(playerid01242499.8, -2129.600123.592.01013899999934999999);

        if (
    IsPlayerAuthorized(playerid)) {
            
    SetPVarInt(playerid"is_after_f4"1);
            
    TogglePlayerSpectating(playerid0);
            
    SpawnPlayer(playerid);
        } else {
            
    SetTimerEx("SetClassCameraPos"2000"i"playerid);
        }

        return 
    1;
    }

    forward SetClassCameraPos(playerid);
    public 
    SetClassCameraPos(playerid)
    {
        
    SetPlayerCameraPos(playerid1879.984252, -2908.6101071.996365);
        
    SetPlayerCameraLookAt(playerid1879.666870, -2913.4873040.941269);

    Нашел тут 2 бага.
    1) После F4 вводишь /kill забирает оружие.
    2) После F4 вводишь /spawn затем /kill появляются кнопки. ( если кнопки отключить то только перезаход).

  8. #18
    Аватар для Alexey_Nikiforov
    Уровень знаний 1

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    61
    Репутация:
    1 ±
    Вот это работает нормально но код выглядит не ахти.
    Можешь оптимизировать?
    Если код будет нормальный можно будет почистить и прилепить, так как это очень тяжело сделать особенно новичкам на начальном этапе.

    PHP код:
    #include <a_samp>

    #define IsPlayerAuthorized(%0)                player_is_authorized{%0}
    #define SetPlayerAuthorized(%0,%1)            player_is_authorized{%0} = %1
    #define PLAYER_OFFLINE                        0
    #define PLAYER_ONLINE                        1

    new player_is_authorized[MAX_PLAYERS char];

    main()
    {}

    public 
    OnGameModeInit()
    {
        return 
    1;
    }
    public 
    OnPlayerCommandText(playeridcmdtext[])
    {
        if(
    strcmp("/login"cmdtexttrue10) == 0)
        {
            if(!
    IsPlayerAuthorized(playerid))
            {
                
    SetPlayerAuthorized(playeridPLAYER_ONLINE);
                
    SpawnPlayerEx(playerid1242499.8, -2129.600123.592.0);
                return 
    1;
            }
            
    SendClientMessage(playerid,0xFFFFFFFF"Вы уже авторизированы.");
            return 
    1;
        }
        else if(
    strcmp("/kill"cmdtexttrue10) == 0)
        {
            if(
    IsPlayerAuthorized(playerid))
            {    
                
    SetPlayerHealth(playerid0.0 );
                return 
    1;
            }
            
    SendClientMessage(playerid,0xFFFFFFFF"Вы не авторизированы.");
            return 
    1;
        }
        else if(
    strcmp("/spawn"cmdtexttrue10) == 0)
        {
            if(
    IsPlayerAuthorized(playerid))
            {
                
    SpawnPlayer(playerid);
                return 
    1;
            }
            
    SendClientMessage(playerid,0xFFFFFFFF"Вы не авторизированы.");
            return 
    1;
        }
        
    SendClientMessage(playerid,0xFFFFFFFF"Неверная команда.");
        return 
    1;
    }

    forward SetClassCameraPos(playerid);
    public 
    SetClassCameraPos(playerid)
    {
        
    SetPlayerCameraPos(playerid,1879.984252, -2908.6101071.996365);
        
    SetPlayerCameraLookAt(playerid,1879.666870, -2913.4873040.941269);
    }
    stock SpawnPlayerEx(playeridskinFloat:xFloat:yFloat:zFloat:rotation)
    {
        
    SendClientMessage(playerid,0xFFFFFFFF"SpawnPlayerEx");
        
    TogglePlayerSpectating(playerid1);
        
    SetSpawnInfo(playerid0skinxyzrotation1013899999934999999);
        
    TogglePlayerSpectating(playerid0);
        return 
    1;
    }
    forward ExitRequestClass(playerid);
    public 
    ExitRequestClass(playerid)
    {
        
    TogglePlayerSpectating(playerid1);
        
    SendClientMessage(playerid,0xFFFFFFFF"ExitRequestClass");
        
    SpawnPlayer(playerid);
        
    SpawnPlayerEx(playerid1242499.8, -2129.600123.592.0);
        return 
    1;
    }
    public 
    OnPlayerRequestSpawn(playerid)//Вызывается когда игрок нажимает кнопку Spawn.
    {
        return 
    0;// Тут ставим 0 что бы отключить кнопку Spawn.
    }  
    public 
    OnPlayerRequestClass(playeridclassid)
    {
        if(
    IsPlayerAuthorized(playerid))
        {
            
    TogglePlayerSpectating(playerid1);
            
    SetTimerEx("ExitRequestClass"1000"i"playerid);
            
    TogglePlayerSpectating(playerid0);
            
    SendClientMessage(playerid,0xFFFFFFFF"OnPlayerRequestClass");
            return 
    1;
        }
        
    TogglePlayerSpectating(playerid1);
        
    SetTimerEx("SetClassCameraPos"2000"i"playerid);
        return 
    1;


  9. #19
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Ну раз уж тут увидел эту функцию, то задам вопрос в этой теме,
    Допустим у меня РП мод под боком лежит, нужно ли в нём юзать SetSpawnInfo или можно убрать эту функцию,
    Я так понял эта функция для работы с кнопками "<< >> spawn", в коннекте прописана, вот не знаю нужна ли она там.
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  10. #20
    Аватар для Alexey_Nikiforov
    Уровень знаний 1

    Статус
    Оффлайн
    Регистрация
    12.02.2016
    Сообщений
    61
    Репутация:
    1 ±
    SetSpawnInfo задает координаты спавна и 3х слотов оружия.
    Далее вызывается SpawnPlayer(playerid);

 

 
Страница 2 из 3 ПерваяПервая 1 2 3 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •