Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 26

Тема: Убираем стрелки и кнопку "Spawn" при заходе на сервер.

  1. #1
    Джентльмен лжец Аватар для Fallen A.
    Регистрация
    03.09.2011
    Адрес
    Минск, БССР
    Возраст
    29
    Сообщений
    2,409
    Репутация: 337

    Звание: как роза среди колючек

    Сообщение Убираем стрелки и кнопку "Spawn" при заходе на сервер.

    Итак, некогда делал регистрацию с использованием MySQL и столкнулся с такой проблемой, как "выбор класса игрока". В простонародье это "стрелки и кнопка Spawn". Разберемся же откуда эта кнопка берется:
    некогда "всемиуважаемый" мистер Kalcor создал, незвестно из каких побуждений, функцию, с помощью которой игрок сможет выбирать себе class и после этого по нажатию кнопки Spawn без труда спавнится. В чем собственно суть этой проблемы: сейчас, исходя из форума, люди делают или пытаются делать сервера-проекты с режимом RP в 90% случаев, где эта функция и не нужна вовсе. Самое интересное, что данная вещь вызывается всего в 3 случаях:

    1. При Connect'е игрока к серверу.
    2. При "смерти" игрового персонажа в игре.
    3. При принудительной смене class'а нажатием клавиши F3 в игре ( не столь важный случай ).

    Итак, чем же нам мешает данная "полезная" функция: все дело в том, что когда игрок заходит на сервер, то практически у всех вызывается в public OnPlayerConnect проверка на регистрацию и вне зависимости от результата проверки, снизу будут эти самые весьма не полезные клавиши.
    Кому-то они мешают просто интуитивно, а кому-то и тем, что даже если игрок не прошел успешно PlayerLogin, он сможет "бегать по серверу" ( если были не вызваны проверки на Logged игрока ).

    В интернете множество уроков и решений по этому поводу, но ни один из них не идеален и ни один из них не описывает такую ситуацию в полной мере.
    В связи с этим я попытался разобраться и пришел к своему решению.
    Лично в своем коде я использую такую последовательность: connect player -> check name player on register ( register/login ) -> выбор скина игрока -> spawn. Естественно, что эти кнопки я видеть не хочу, поэтому решил поступить вот так:


    В public OnPlayerRequestClass вставляем такое значение:
    PHP код:
    SetSpawnInfo(playerid00000000000); // Задаем информацию о спавне
    TogglePlayerSpectating(playeridtrue); // Как ни странно, но эта функция сразу же спавнит игрока, но об этом чуть позже 
    После многих споров, я решил протестировать и подтвердить свои слова, что использование true в OnPlayerRequestClass вызывает Spawn игрока - да, действительно, так оно и есть. Безусловно, это интересный случай, но об этом я подумаю позже.
    После public OnPlayerConnect вызывается public OnPlayerRequesClass, вероятно, практически у всех там вызывается проверка на регистрацию пользователя, зашедшего на сервер, поэтому в CheckPlayerRegister ( лично у меня такое название public'а ) вставляем:
    PHP код:
    TogglePlayerSpectating(playerid0);
    SetPlayerCameraPos(playerid, -2625.4807122251.55224612.997936); // Устанавливаем нужное нам положение камеры
    SetPlayerCameraLookAt(playerid, -2620.9748532249.39404212.796076); // Устанавливаем нужное нам положение камеры 
    И после всех проверок, когда необходимо произвести Spawn игрока: поскольку у нас игрок уже заспавнен при вызове класса, то нам только осталось установить виртуальный мир ( если это необходимо ), координаты для спавна и, если это нужно, угол поворота камеры.

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

  2. 2 пользователей сказали cпасибо Fallen A. за это полезное сообщение:

    Dominik_48 (06.08.2015), Vetalll (08.06.2015)

  3. #2
    Почетный пользователь LC Аватар для ziggi
    Регистрация
    15.07.2010
    Адрес
    St. Petersburg
    Возраст
    29
    Сообщений
    370
    Репутация: 151

    Звание: - весьма и весьма положительная личность

    Re: Убираем стрелки и кнопку "Spawn" при заходе на сервер.

    Цитата Сообщение от Fallen A. Посмотреть сообщение
    После public OnPlayerRequesClass вызывается public OnPlayerConnect
    Наоборот.

    Цитата Сообщение от Fallen A. Посмотреть сообщение
    И после всех проверок, когда необходимо произвести Spawn игрока, вставляем: SpawnPlayer(playerid);
    Нет, TogglePlayerSpectating(playerid, 0); заспавнит игрока.

    Вот более удачный способ:
    PHP код:
    public OnPlayerRequestClass(playeridclassid)
    {
        if (
    player_IsLogin(playerid)) {
            
    TogglePlayerSpectating(playerid1);
            
    SetSpawnInfo(playerid000000000000);
            
    TogglePlayerSpectating(playerid0);
            return 
    0;
        }

        
    TogglePlayerSpectating(playerid1);

        
    SetPlayerCameraPos(playerid, -2625.4807122251.55224612.997936); // Устанавливаем нужное нам положение камеры 
        
    SetPlayerCameraLookAt(playerid, -2620.9748532249.39404212.796076); // Устанавливаем нужное нам положение камеры  
        
    return 1;

    И тогда, когда нужно будет заспавнить игрока, нужно вызывать TogglePlayerSpectating(playerid, 0);.

    Таким образом, OnPlayerSpawn будет вызван столько раз, сколько нужно.

  4. 2 пользователей сказали cпасибо ziggi за это полезное сообщение:

    Nash_Brigers (17.05.2015), ReDDy (27.08.2015)

  5. #3
    Джентльмен лжец Аватар для Fallen A.
    Регистрация
    03.09.2011
    Адрес
    Минск, БССР
    Возраст
    29
    Сообщений
    2,409
    Репутация: 337

    Звание: как роза среди колючек

    Re: Убираем стрелки и кнопку "Spawn" при заходе на сервер.

    Цитата Сообщение от ziggi Посмотреть сообщение
    Наоборот.


    Нет, TogglePlayerSpectating(playerid, 0); заспавнит игрока.

    Вот более удачный способ:
    PHP код:
    public OnPlayerRequestClass(playeridclassid)
    {
        if (
    player_IsLogin(playerid)) {
            
    TogglePlayerSpectating(playerid1);
            
    SetSpawnInfo(playerid000000000000);
            
    TogglePlayerSpectating(playerid0);
            return 
    0;
        }

        
    TogglePlayerSpectating(playerid1);

        
    SetPlayerCameraPos(playerid, -2625.4807122251.55224612.997936); // Устанавливаем нужное нам положение камеры 
        
    SetPlayerCameraLookAt(playerid, -2620.9748532249.39404212.796076); // Устанавливаем нужное нам положение камеры  
        
    return 1;

    И тогда, когда нужно будет заспавнить игрока, нужно вызывать TogglePlayerSpectating(playerid, 0);.

    Таким образом, OnPlayerSpawn будет вызван столько раз, сколько нужно.
    В моем способе OnPlayerSpawn вызывается ровно 2 раза и проверок я делаю меньше, и TogglePlayerSpectating вызывается меньше раз.
    И да, спавнит игрока именно TogglePlayerSpectating(playerid, true);. Это уже проверено.

  6. #4
    Почетный пользователь LC Аватар для ziggi
    Регистрация
    15.07.2010
    Адрес
    St. Petersburg
    Возраст
    29
    Сообщений
    370
    Репутация: 151

    Звание: - весьма и весьма положительная личность

    Re: Убираем стрелки и кнопку "Spawn" при заходе на сервер.

    Цитата Сообщение от Fallen A. Посмотреть сообщение
    В моем способе OnPlayerSpawn вызывается ровно 2 раза и проверок я делаю меньше, и TogglePlayerSpectating вызывается меньше раз.
    И да, спавнит игрока именно TogglePlayerSpectating(playerid, true);. Это уже проверено.
    А в моём способе OnPlayerSpawn вызывается 1 раз и это именно столько, сколько нужно. Проверок у тебя нет вообще, у меня всего одна, она нужна для нормального спавна после нажатия F3, этот момент у тебя вообще не учтён. У меня TogglePlayerSpectating вызывается столько раз, сколько и у тебя, а именно - 2. И спавнит игрока не TogglePlayerSpectating(playerid, true);, а TogglePlayerSpectating(playerid, false);.

  7. #5
    Джентльмен лжец Аватар для Fallen A.
    Регистрация
    03.09.2011
    Адрес
    Минск, БССР
    Возраст
    29
    Сообщений
    2,409
    Репутация: 337

    Звание: как роза среди колючек

    Re: Убираем стрелки и кнопку "Spawn" при заходе на сервер.

    Цитата Сообщение от ziggi Посмотреть сообщение
    А в моём способе OnPlayerSpawn вызывается 1 раз и это именно столько, сколько нужно. Проверок у тебя нет вообще, у меня всего одна, она нужна для нормального спавна после нажатия F3, этот момент у тебя вообще не учтён. У меня TogglePlayerSpectating вызывается столько раз, сколько и у тебя, а именно - 2. И спавнит игрока не TogglePlayerSpectating(playerid, true);, а TogglePlayerSpectating(playerid, false);.
    Вызывается именно 3 раза, поскольку у тебя return 0 = return false, а при false код читается дальше. Спавнит игрока именно true, это уже проверено. С вариантом F3 пока не боролся, поскольку не нуждаюсь.

  8. #6
    Почетный пользователь LC Аватар для ziggi
    Регистрация
    15.07.2010
    Адрес
    St. Petersburg
    Возраст
    29
    Сообщений
    370
    Репутация: 151

    Звание: - весьма и весьма положительная личность

    Re: Убираем стрелки и кнопку "Spawn" при заходе на сервер.

    Цитата Сообщение от Fallen A. Посмотреть сообщение
    Вызывается именно 3 раза, поскольку у тебя return 0 = return false, а при false код читается дальше. Спавнит игрока именно true, это уже проверено. С вариантом F3 пока не боролся, поскольку не нуждаюсь.
    Ты серьёзно? При любом значении return дальнейший код, расположенный в этом паблике/функции не будет исполняться. Зачем вообще выкладывать такие "туториалы", в которых изначально полно проблем (F3, двойной вызов OnPlayerSpawn) и утверждения в которых не соответствуют действительности ("После public OnPlayerRequesClass вызывается public OnPlayerConnect")?

  9. #7
    Джентльмен лжец Аватар для Fallen A.
    Регистрация
    03.09.2011
    Адрес
    Минск, БССР
    Возраст
    29
    Сообщений
    2,409
    Репутация: 337

    Звание: как роза среди колючек

    Re: Убираем стрелки и кнопку "Spawn" при заходе на сервер.

    Цитата Сообщение от ziggi Посмотреть сообщение
    Ты серьёзно? При любом значении return дальнейший код, расположенный в этом паблике/функции не будет исполняться. Зачем вообще выкладывать такие "туториалы", в которых изначально полно проблем (F3, двойной вызов OnPlayerSpawn) и утверждения в которых не соответствуют действительности ("После public OnPlayerRequesClass вызывается public OnPlayerConnect")?
    Можешь и с OnPlayerConnect я и перепутал, но в остальном все нормально, кроме как двойной вызов. Как сделаю - поправлю.

    ________________ Сообщение добавлено в [21:40] ________ Предыдущее сообщение в [19:48] ________________

    UPD: изменил принцип кода и провел небольшую оптимизацию.

  10. #8
    Ясно, понятно. Аватар для Jekazzz
    Регистрация
    08.01.2011
    Сообщений
    1,830
    Репутация: 188

    Звание: - весьма и весьма положительная личность

    Re: Убираем стрелки и кнопку "Spawn" при заходе на сервер.

    Ни один из вышеперечисленных способов до конца не работоспособен.
    ziggi, в твоем варианте камера не встанет куда надо, если не будет задержки между входом в спек и установкой положения камеры. Про способ падшего вообще молчу.


    // Команды для тестирования
    public OnPlayerCommandText(playerid, cmdtext[]) {
    if(!strcmp(cmdtext, "/kill", true)) {
    SetPlayerHealth(playerid, 0.0);
    } else if(!strcmp(cmdtext, "/login", true)) {
    SetPVarInt(playerid, "player_logged", true);
    // Авторизация
    TogglePlayerSpectating(playerid, false);
    }
    return true;
    }

    public OnPlayerRequestClass(playerid, classid) {
    SetSpawnInfo(playerid, 255, 0, 0.0, 0.0, 2.5, 0.0, 0, 0, 0, 0, 0, 0);
    TogglePlayerSpectating(playerid, true);


    if(GetPVarInt(playerid, "player_logged")) {
    TogglePlayerSpectating(playerid, false);
    // Спавним игрока, если он авторизован
    } else {
    // Здесь можно показать диалог авторизации
    // (Я решил не использовать таймеры)
    SetPVarInt(playerid, "toggle_player", GetTickCount() + 200);
    }
    return 1;
    }


    public OnPlayerRequestSpawn(playerid) {
    // Кнопка "Spawn" перестает реагировать на нажатия, если вернуть 0
    return 0;
    }


    public OnPlayerUpdate(playerid) {
    if(GetPVarInt(playerid, "toggle_player") && GetPVarInt(playerid, "toggle_player") < GetTickCount()) {
    DeletePVar(playerid, "toggle_player");


    SetPlayerCameraPos(playerid, 1000.0, 1000.0, 40.0);
    SetPlayerCameraLookAt(playerid, 950.0, 950.0, 30.0);
    // Здесь можно показать диалог авторизации
    }
    return 1;
    }

  11. 1 пользователь сказал cпасибо Jekazzz за это полезное сообщение:

    ProG (03.04.2015)

  12. #9
    Джентльмен лжец Аватар для Fallen A.
    Регистрация
    03.09.2011
    Адрес
    Минск, БССР
    Возраст
    29
    Сообщений
    2,409
    Репутация: 337

    Звание: как роза среди колючек

    Re: Убираем стрелки и кнопку "Spawn" при заходе на сервер.

    Цитата Сообщение от Jekazzz Посмотреть сообщение
    Ни один из вышеперечисленных способов до конца не работоспособен.
    ziggi, в твоем варианте камера не встанет куда надо, если не будет задержки между входом в спек и установкой положения камеры. Про способ падшего вообще молчу.


    // Команды для тестирования
    public OnPlayerCommandText(playerid, cmdtext[]) {
    if(!strcmp(cmdtext, "/kill", true)) {
    SetPlayerHealth(playerid, 0.0);
    } else if(!strcmp(cmdtext, "/login", true)) {
    SetPVarInt(playerid, "player_logged", true);
    // Авторизация
    TogglePlayerSpectating(playerid, false);
    }
    return true;
    }

    public OnPlayerRequestClass(playerid, classid) {
    SetSpawnInfo(playerid, 255, 0, 0.0, 0.0, 2.5, 0.0, 0, 0, 0, 0, 0, 0);
    TogglePlayerSpectating(playerid, true);


    if(GetPVarInt(playerid, "player_logged")) {
    TogglePlayerSpectating(playerid, false);
    // Спавним игрока, если он авторизован
    } else {
    // Здесь можно показать диалог авторизации
    // (Я решил не использовать таймеры)
    SetPVarInt(playerid, "toggle_player", GetTickCount() + 200);
    }
    return 1;
    }


    public OnPlayerRequestSpawn(playerid) {
    // Кнопка "Spawn" перестает реагировать на нажатия, если вернуть 0
    return 0;
    }


    public OnPlayerUpdate(playerid) {
    if(GetPVarInt(playerid, "toggle_player") && GetPVarInt(playerid, "toggle_player") < GetTickCount()) {
    DeletePVar(playerid, "toggle_player");


    SetPlayerCameraPos(playerid, 1000.0, 1000.0, 40.0);
    SetPlayerCameraLookAt(playerid, 950.0, 950.0, 30.0);
    // Здесь можно показать диалог авторизации
    }
    return 1;
    }
    Прежде чем лезть в ж..., протестируй мой способ.

  13. #10
    Ясно, понятно. Аватар для Jekazzz
    Регистрация
    08.01.2011
    Сообщений
    1,830
    Репутация: 188

    Звание: - весьма и весьма положительная личность

    Re: Убираем стрелки и кнопку "Spawn" при заходе на сервер.

    Цитата Сообщение от Fallen A. Посмотреть сообщение
    Прежде чем лезть в ж..., протестируй мой способ.
    Пробовать способ, который подходит исключительно для одного мода, нет никакого смысла.
    Во многих модах существование аккаунта проверяется в OnPlayerRequestClass, а порой и в OnPlayerConnect.

    PHP код:
    TogglePlayerSpectating(playerid0);
    SetPlayerCameraPos(playerid, -2625.4807122251.55224612.997936); // Устанавливаем нужное нам положение камеры
    SetPlayerCameraLookAt(playerid, -2620.9748532249.39404212.796076); // Устанавливаем нужное нам положение камеры 
    Если отправить игрока в спек, а затем вывести из спека, то его заспавнит.

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

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

Похожие темы

  1. Как грамотно убрать кнопки ">>" "<<" "Spawn"
    от bla в разделе Вопросы по скриптингу
    Ответов: 3
    Последнее сообщение: 30.03.2015, 16:56
  2. Ответов: 8
    Последнее сообщение: 17.12.2013, 21:10
  3. Ответов: 6
    Последнее сообщение: 02.08.2013, 12:40
  4. Как убрать "<<" ">>" "spawn"
    от DeepCode в разделе Вопросы по скриптингу
    Ответов: 2
    Последнее сообщение: 19.06.2013, 00:42
  5. Как убрать (игнорировать) "Spawn".
    от LMapper в разделе Вопросы по скриптингу
    Ответов: 1
    Последнее сообщение: 17.05.2013, 17:57

Ваши права

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