Професійний форум про pawn-скриптинга

Прибираємо стрілки і кнопку "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 вставляємо таке значення:

SetSpawnInfo (playerid. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0); // Задаємо інформацію про спавн
TogglePlayerSpectating (playerid. True); // Як не дивно, але ця функція відразу ж спавн гравця, але про це трохи пізніше

Після багатьох суперечок, я вирішив протестувати і підтвердити свої слова, що використання true в OnPlayerRequestClass викликає Spawn гравця - так, дійсно, так воно і є. Безумовно, це цікавий випадок, але про це я подумаю пізніше.
Після public OnPlayerConnect викликається public OnPlayerRequesClass, ймовірно, практично у всіх там викликається перевірка на реєстрацію користувача, який зайшов на сервер, тому в CheckPlayerRegister (особисто у мене таку назву public'а) вставляємо:

TogglePlayerSpectating (playerid. 0);
SetPlayerCameraPos (playerid. - 2625.480712. 2251.552246. 12.997936); // Встановлюємо потрібне нам положення камери
SetPlayerCameraLookAt (playerid. - 2620.974853. 2249.394042. 12.796076); // Встановлюємо потрібне нам положення камери

І після всіх перевірок, коли необхідно провести Spawn гравця: оскільки у нас гравець вже заспавнен при виклику класу, то нам тільки залишилося встановити віртуальний світ (якщо це необхідно), координати для спавна і, якщо це потрібно, кут повороту камери.

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

Ні, TogglePlayerSpectating (playerid, 0); заспавніт гравця.

Ось більш вдалий спосіб:

public OnPlayerRequestClass (playerid. classid)
<
if (player_IsLogin (playerid)) <
TogglePlayerSpectating (playerid. 1);
SetSpawnInfo (playerid. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0);
TogglePlayerSpectating (playerid. 0);
return 0;
>

TogglePlayerSpectating (playerid. 1);

SetPlayerCameraPos (playerid. - 2625.480712. 2251.552246. 12.997936); // Встановлюємо потрібне нам положення камери
SetPlayerCameraLookAt (playerid. - 2620.974853. 2249.394042. 12.796076); // Встановлюємо потрібне нам положення камери
return 1;
>

І тоді, коли потрібно буде заспавніть гравця, потрібно викликати TogglePlayerSpectating (playerid, 0) ;.

Таким чином, OnPlayerSpawn буде викликаний стільки раз, скільки потрібно.

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

Повідомлення від ziggi


Ні, TogglePlayerSpectating (playerid, 0); заспавніт гравця.

Ось більш вдалий спосіб:

public OnPlayerRequestClass (playerid. classid)
if (player_IsLogin (playerid)) TogglePlayerSpectating (playerid. 1);
SetSpawnInfo (playerid. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0);
TogglePlayerSpectating (playerid. 0);
return 0;
>

TogglePlayerSpectating (playerid. 1);

SetPlayerCameraPos (playerid. - 2625.480712. 2251.552246. 12.997936); // Встановлюємо потрібне нам положення камери
SetPlayerCameraLookAt (playerid. - 2620.974853. 2249.394042. 12.796076); // Встановлюємо потрібне нам положення камери
return 1;
>

І тоді, коли потрібно буде заспавніть гравця, потрібно викликати TogglePlayerSpectating (playerid, 0) ;.

Таким чином, OnPlayerSpawn буде викликаний стільки раз, скільки потрібно.

У моєму способі OnPlayerSpawn викликається рівно 2 рази і перевірок я роблю менше, і TogglePlayerSpectating викликається менше раз.
І так, спавн гравця саме TogglePlayerSpectating (playerid, true) ;. Це вже перевірено.

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

Повідомлення від Fallen A.

У моєму способі OnPlayerSpawn викликається рівно 2 рази і перевірок я роблю менше, і TogglePlayerSpectating викликається менше раз.
І так, спавн гравця саме TogglePlayerSpectating (playerid, true) ;. Це вже перевірено.

А в моєму способі OnPlayerSpawn викликається 1 раз і це саме стільки, скільки потрібно. Перевірок у тебе немає взагалі, у мене всього одна, вона потрібна для нормального спавна після натискання F3, цей момент у тебе взагалі не врахований. У мене TogglePlayerSpectating викликається стільки раз, скільки і у тебе, а саме - 2. І спавн гравця не TogglePlayerSpectating (playerid, true) ;, а TogglePlayerSpectating (playerid, false) ;.

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

Повідомлення від ziggi

А в моєму способі OnPlayerSpawn викликається 1 раз і це саме стільки, скільки потрібно. Перевірок у тебе немає взагалі, у мене всього одна, вона потрібна для нормального спавна після натискання F3, цей момент у тебе взагалі не врахований. У мене TogglePlayerSpectating викликається стільки раз, скільки і у тебе, а саме - 2. І спавн гравця не TogglePlayerSpectating (playerid, true) ;, а TogglePlayerSpectating (playerid, false) ;.

Викликається саме 3 рази, оскільки у тебе return 0 = return false, а при false код Новомосковскется далі. Спавн гравця саме true, це вже перевірено. З варіантом F3 поки не боровся, оскільки не потребую.

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

Повідомлення від Fallen A.

Викликається саме 3 рази, оскільки у тебе return 0 = return false, а при false код Новомосковскется далі. Спавн гравця саме true, це вже перевірено. З варіантом F3 поки не боровся, оскільки не потребую.

Ти серйозно? При будь-якому значенні return подальший код, розташований в цьому паблік / функції не буде виконуватися. Навіщо взагалі викладати такі "туторіали", в яких спочатку повно проблем (F3, подвійний виклик OnPlayerSpawn) і затвердження в яких не відповідають дійсності ( "Після public OnPlayerRequesClass викликається public OnPlayerConnect")?

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

Повідомлення від ziggi

Ти серйозно? При будь-якому значенні return подальший код, розташований в цьому паблік / функції не буде виконуватися. Навіщо взагалі викладати такі "туторіали", в яких спочатку повно проблем (F3, подвійний виклик OnPlayerSpawn) і затвердження в яких не відповідають дійсності ( "Після public OnPlayerRequesClass викликається public OnPlayerConnect")?

Можеш і з OnPlayerConnect я і переплутав, але в іншому все нормально, крім як подвійний виклик. Як зроблю - поправлю.

________________ Повідомлення додано в [21:40] ________ Попереднє повідомлення в [19:48] ________________

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

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

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

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

Повідомлення від Jekazzz

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

Перш ніж лізти в ж. протестуй мій спосіб.

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

Повідомлення від Fallen A.

Перш ніж лізти в ж. протестуй мій спосіб.

TogglePlayerSpectating (playerid. 0);
SetPlayerCameraPos (playerid. - 2625.480712. 2251.552246. 12.997936); // Встановлюємо потрібне нам положення камери
SetPlayerCameraLookAt (playerid. - 2620.974853. 2249.394042. 12.796076); // Встановлюємо потрібне нам положення камери

Якщо відправити гравця в спік, а потім вивести з спека, то його заспавніт.

Взагалі, весь код слід тестувати на чистому моді. Він може в тебе і працює, але тільки тому, що крім цього напхане ще багато всячини.

Схожі статті