Добрый ночи всем!
Прошу не пинать, я первый день на вашем форуме (поиск пробовал, но возможно не правильно что-то, но не нашел ответа)
Как можно убрать кнопки внизу экрана "<< >> ВОЙТИ "
http://i66.tinypic.com/j77u6g.jpg
Спасибо заранее...!!!
Вид для печати
Добрый ночи всем!
Прошу не пинать, я первый день на вашем форуме (поиск пробовал, но возможно не правильно что-то, но не нашел ответа)
Как можно убрать кнопки внизу экрана "<< >> ВОЙТИ "
http://i66.tinypic.com/j77u6g.jpg
Спасибо заранее...!!!
Вот, тут учтены некоторые особенности. Координаты спавна лучше задавать в SetSpawnInfo, а не использовать SetPlayerPos в OnPlayerSpawn. Тогда не будет никаких проблем со спавном.
Не забудь IsPlayerLogin заменить на свою функцию.
PHP код:
stock SpawnPlayerEx(playerid, skin, Float:x, Float:y, Float:z, Float:rotation)
{
SetSpawnInfo(playerid, 0, skin, x, y, z, rotation, 0, 0, 0, 0, 0, 0);
TogglePlayerSpectating(playerid, 0);
}
forward SetClassCameraPos(playerid);
public SetClassCameraPos(playerid)
{
SetPlayerCameraPos(playerid, ...);
SetPlayerCameraLookAt(playerid, ...);
}
public OnPlayerRequestClass(playerid, classid)
{
// если игрок нажал F4 и умер, то просто спавним его
if (IsPlayerLogin(playerid)) {
TogglePlayerSpectating(playerid, 1);
// лучше установить действительный скин и координаты спавна
SetSpawnInfo(playerid, 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
TogglePlayerSpectating(playerid, 0);
return 0;
}
// скрыть кнопки
TogglePlayerSpectating(playerid, 1);
// установить позицию камеры (без задержки после TogglePlayerSpectating не работает)
SetTimerEx("SetClassCameraPos", 200, 0, "i", playerid);
#if defined Spawn_OnPlayerRequestClass
return Spawn_OnPlayerRequestClass(playerid, classid);
#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(playerid, classid);
#endif
Спасибо УВАЖАЕМЫЕ ДРУЗЬЯ!
Помог вариант с TogglePlayerSpectating(playerid, 1)
Правда пока искал начитал и использовал вариант типа: TogglePlayerSpectating(playerid, true);
Но в любом случае БОЛЬШОЕ СПАСИБО ЧТО ОТКЛИКНУЛИСЬ!!!!!
Если я сделаю так то это будет хуже?
PHP код:
public OnPlayerConnect(playerid)
{
TogglePlayerSpectating(playerid, true);
SetTimerEx("SetClassCameraPos", 10, 0, "i", playerid);
return 1;
}
public SetClassCameraPos(playerid)
{
SetPlayerCameraPos(playerid,508.7362,-83.4335,998.9609);
SetPlayerCameraLookAt(playerid,508.7362,-87.4335,998.9609);
}
public OnPlayerRequestClass(playerid, classid)
{
if(IsPlayerAuthorized(playerid))
{
TogglePlayerSpectating(playerid, true);
SetSpawnInfo(playerid, 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
TogglePlayerSpectating(playerid, false);
return 0;
}
return 0;
}
Да.
В new.pwn проверял.
Если можешь выложи чистый код.
Я вроде понимаю как это работает.
При подключении игрока вызывается:
public OnPlayerConnect(playerid)
Следом вызывается:
public OnPlayerRequestClass(playerid, classid).
Который должен вернуть classid что бы выйти из режима "Выбора класса"
У тебя же в коде используется return 0; значит после выполнения функции не чего не вернется.
И сервер будет думать что игрок не выбрал класс.
Едем дальше.
Что бы кнопки перестали работать пишем тут вот так:
Хорошо кнопки не работают.PHP код:
public OnPlayerRequestSpawn(playerid)//Вызывается когда игрок нажимает кнопку Spawn.
{
return 0;// Тут ставим 0 что бы отключить кнопку Spawn.
}
Что бы их вообще спрятать нам в этом поможет функция:
TogglePlayerSpectating(playerid, 1);
Работает как то не корректно, если не использовать таймер то не работают вот эти функции:
SetPlayerCameraPos(playerid, ...);
SetPlayerCameraLookAt(playerid, ...);
Ладно хорошо все сделали вроде бы все хорошо, но у нас еще есть несчастная кнопка F4 которая принудительно после смерти игрока вызывает:
public OnPlayerRequestClass(playerid, classid)
И тут начинаются проблемы...
public OnPlayerRequestClass(playerid, classid) вызывается по 3 причинам:
1) При подключении к серверу
2) После смерти игрока
3) После нажатия F4.
Искал смотрел так и не нашел решения, не пишу мод дальше пока не устраню эту проблему уже много чего перепробовал.
Все варианты рабочие но неидеальные, везде есть свои минусы.
Ходил на офф сайт там баг репорт завален рассказами про OnPlayerRequestClass (F4) bug но везде одно и тоже, не чего толкового.
Где то даже ответил сам Кай что это не баг у вас не правильный код.
http://forum.sa-mp.com/showthread.php?t=324137&page=4
Привел бы сам пример как это отключить.
В общем мне уже начинает надоедать это...
Щас попробую.
Вот нацарапал код.
В нем куча багов.
Я что то не так сделал?
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(playerid, cmdtext[])
{
if(strcmp("/kill", cmdtext, true, 10) == 0)
{
SetPlayerHealth(playerid, 0.0 );
return 1;
}
else if(strcmp("/login", cmdtext, true, 10) == 0)
{
SetPlayerAuthorized(playerid, PLAYER_ONLINE);
SpawnPlayerEx(playerid, 124, 2499.8, -2129.6001, 23.5, 92.0);
return 1;
}
else if(strcmp("/spawn", cmdtext, true, 10) == 0)
{
TogglePlayerSpectating(playerid, 1);
SpawnPlayerEx(playerid, 124, 2499.8, -2129.6001, 23.5, 92.0);
return 1;
}
SendClientMessage(playerid,0xFFFFFFFF, "Неверная команда.");
return 1;
}
stock SpawnPlayerEx(playerid, skin, Float:x, Float:y, Float:z, Float:rotation)
{
SetSpawnInfo(playerid, 0, skin, x, y, z, rotation, 10, 1, 38, 999999, 34, 999999);
TogglePlayerSpectating(playerid, 0);
}
forward SetClassCameraPos(playerid);
public SetClassCameraPos(playerid)
{
SetPlayerCameraPos(playerid,1879.984252, -2908.610107, 1.996365);
SetPlayerCameraLookAt(playerid,1879.666870, -2913.487304, 0.941269);
}
public OnPlayerRequestSpawn(playerid)//Вызывается когда игрок нажимает кнопку Spawn.
{
return 0;// Тут ставим 0 что бы отключить кнопку Spawn.
}
public OnPlayerRequestClass(playerid, classid)
{
// если игрок нажал F4 и умер, то просто спавним его
if(IsPlayerAuthorized(playerid))
{
TogglePlayerSpectating(playerid, 1);
SpawnPlayerEx(playerid, 124, 2499.8, -2129.6001, 23.5, 92.0);
return 0;
}
// скрыть кнопки
TogglePlayerSpectating(playerid, 1);
// установить позицию камеры (без задержки после TogglePlayerSpectating не работает)
SetTimerEx("SetClassCameraPos", 200, 0, "i", playerid);
#if defined Spawn_OnPlayerRequestClass
return Spawn_OnPlayerRequestClass(playerid, classid);
#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(playerid, classid);
#endif
Какие баги?
В OnPlayerRequestSpawn, наверное, нужно так написать:
PHP код:
public OnPlayerRequestSpawn(playerid)
{
if (IsPlayerAuthorized(playerid)) {
return 1;
}
return 0;
}
Если использовать такой код.
Баги следующие:PHP код:
if(IsPlayerAuthorized(playerid))
{
TogglePlayerSpectating(playerid, 1);
SpawnPlayerEx(playerid, 124, 2499.8, -2129.6001, 23.5, 92.0);
return 0;
}
1) После нажатия F4 и /kill, попадет в режим "выбор класса".
И не выходит из него.
После каждом использовании /kill создается бутылка или сигарета, рандомно.
2) Если нажать F4 и /spawn, вылазят несчастный кнопки а так как они отключены игрок зависает в режиме "выбор класса"
Если использовать такой код.
Баги следующие:PHP код:
if(IsPlayerAuthorized(playerid))
{
TogglePlayerSpectating(playerid, 1);
SpawnPlayerEx(playerid, 124, 2499.8, -2129.6001, 23.5, 92.0);
return 1;
}
1) После нажатия F4 и /kill, попадет в режим "выбор класса".
После смерти отлично выходит из этого режима.
Но при выходе из режима забирает оружие и спавнит бутылку, при повтор использовании /kill(без F4) все хорошо(оружие не забирает).
2) Если нажать F4 и /spawn, вылазят несчастный кнопки а так как они отключены игрок зависает в режиме "выбор класса" (тоже самое).
3) При повторном подключении к серверу игрока сразу спавнит без авторизации (/login). ( при первом подключении через /login)
Вот эта целая куча багов. только что я не делал.
перебрал уже около 100 разных вариантов.
В каждом из них остается 1 из багов.
Не могу добиться идеального варианта.
HELP
Идеального варианта наверное не получится, вот кое-что получше, но багов тоже хватает:
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(playerid, PLAYER_OFFLINE);
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/kill", cmdtext, true, 10) == 0)
{
SetPlayerHealth(playerid, 0.0 );
return 1;
}
if (strcmp("/login", cmdtext, true, 10) == 0)
{
SetPlayerAuthorized(playerid, PLAYER_ONLINE);
TogglePlayerSpectating(playerid, 0);
return 1;
}
if (strcmp("/spawn", cmdtext, true, 10) == 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(playerid, classid)
{
TogglePlayerSpectating(playerid, 1);
SetSpawnInfo(playerid, 0, 124, 2499.8, -2129.6001, 23.5, 92.0, 10, 1, 38, 999999, 34, 999999);
if (IsPlayerAuthorized(playerid)) {
SetPVarInt(playerid, "is_after_f4", 1);
TogglePlayerSpectating(playerid, 0);
SpawnPlayer(playerid);
} else {
SetTimerEx("SetClassCameraPos", 200, 0, "i", playerid);
}
return 1;
}
forward SetClassCameraPos(playerid);
public SetClassCameraPos(playerid)
{
SetPlayerCameraPos(playerid, 1879.984252, -2908.610107, 1.996365);
SetPlayerCameraLookAt(playerid, 1879.666870, -2913.487304, 0.941269);
}
Вот это работает нормально но код выглядит не ахти.
Можешь оптимизировать?
Если код будет нормальный можно будет почистить и прилепить, так как это очень тяжело сделать особенно новичкам на начальном этапе.
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(playerid, cmdtext[])
{
if(strcmp("/login", cmdtext, true, 10) == 0)
{
if(!IsPlayerAuthorized(playerid))
{
SetPlayerAuthorized(playerid, PLAYER_ONLINE);
SpawnPlayerEx(playerid, 124, 2499.8, -2129.6001, 23.5, 92.0);
return 1;
}
SendClientMessage(playerid,0xFFFFFFFF, "Вы уже авторизированы.");
return 1;
}
else if(strcmp("/kill", cmdtext, true, 10) == 0)
{
if(IsPlayerAuthorized(playerid))
{
SetPlayerHealth(playerid, 0.0 );
return 1;
}
SendClientMessage(playerid,0xFFFFFFFF, "Вы не авторизированы.");
return 1;
}
else if(strcmp("/spawn", cmdtext, true, 10) == 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.610107, 1.996365);
SetPlayerCameraLookAt(playerid,1879.666870, -2913.487304, 0.941269);
}
stock SpawnPlayerEx(playerid, skin, Float:x, Float:y, Float:z, Float:rotation)
{
SendClientMessage(playerid,0xFFFFFFFF, "SpawnPlayerEx");
TogglePlayerSpectating(playerid, 1);
SetSpawnInfo(playerid, 0, skin, x, y, z, rotation, 10, 1, 38, 999999, 34, 999999);
TogglePlayerSpectating(playerid, 0);
return 1;
}
forward ExitRequestClass(playerid);
public ExitRequestClass(playerid)
{
TogglePlayerSpectating(playerid, 1);
SendClientMessage(playerid,0xFFFFFFFF, "ExitRequestClass");
SpawnPlayer(playerid);
SpawnPlayerEx(playerid, 124, 2499.8, -2129.6001, 23.5, 92.0);
return 1;
}
public OnPlayerRequestSpawn(playerid)//Вызывается когда игрок нажимает кнопку Spawn.
{
return 0;// Тут ставим 0 что бы отключить кнопку Spawn.
}
public OnPlayerRequestClass(playerid, classid)
{
if(IsPlayerAuthorized(playerid))
{
TogglePlayerSpectating(playerid, 1);
SetTimerEx("ExitRequestClass", 100, 0, "i", playerid);
TogglePlayerSpectating(playerid, 0);
SendClientMessage(playerid,0xFFFFFFFF, "OnPlayerRequestClass");
return 1;
}
TogglePlayerSpectating(playerid, 1);
SetTimerEx("SetClassCameraPos", 200, 0, "i", playerid);
return 1;
}
Ну раз уж тут увидел эту функцию, то задам вопрос в этой теме,
Допустим у меня РП мод под боком лежит, нужно ли в нём юзать SetSpawnInfo или можно убрать эту функцию,
Я так понял эта функция для работы с кнопками "<< >> spawn", в коннекте прописана, вот не знаю нужна ли она там.
SetSpawnInfo задает координаты спавна и 3х слотов оружия.
Далее вызывается SpawnPlayer(playerid);
Есть еще у кого то варианты как нормально реализовать процесс регистрации!
Проблемы:
1)
Установка позиции игрока во время установки камеры.
При использовании
Координаты игрока раны p_x и p_y но с другой высотой.PHP код:
SetPlayerCameraPos(playerid,p_x, p_y,p_z);SetPlayerCameraLookAt(playerid,l_x, l_y, l_z);
Не зависимо что будет прописано тут:
Она просто перестает работать видимо из за того что игрок отправляется в слежку.PHP код:
SetPlayerPos(playerid, x, y, z);
И при спавне игрока не подгружается карта там где это нужно.
2)Не возможности нормально выйти и режима выбора класса.
Постоянно нужно писать какие то костыли.
Которые не всегда срабатывают с первого раза.
3) Все работает через одно место.
Кто то встречал по настоящему грамотное решение?
Или все только делают вид что большие специалисты и все пишут мод с нуля. :rtfm: :lol:
- - - Добавлено - - -
Есть варианты задать позицию игрока после использования TogglePlayerSpectating(playerid, 1);?