Щас попробую.
Вот нацарапал код.
В нем куча багов.
Я что то не так сделал?
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
Последний раз редактировалось Alexey_Nikiforov; 17.02.2016 в 18:29.
Какие баги?
В 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", в коннекте прописана, вот не знаю нужна ли она там.
[Anticheat]___Invisible Fly Hack
[Anticheat]____Weapon/Ammo Hack
[Function]______ResetPlayerWeaponSlot
[Function]_______FIX_SetPlayerAmmo
[ServerMod]______TDM | Zombie Apokalypse
SetSpawnInfo задает координаты спавна и 3х слотов оружия.
Далее вызывается SpawnPlayer(playerid);
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)