Вариант #1:
При нажатии на F4 и смерти игрока отправляет на пол секунды в режим слежки (для исправления бага с появлением бутылки/сигары на спавне)
В OnPlayerConnect вставим
И в OnPlayerRequestClass вставимPHP код:
SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
TogglePlayerSpectating(playerid, true);//Собстно, начало обхода
SetTimerEx("SetPlayerCameraPosForReqClass", 100, 0, "i", playerid);//А это для того, чтоб камера изменилась при начале слежки
Ну и в OnPlayerSpawn нужно обязательно указать координаты, куда будет отправлен игрок. Например:PHP код:
SetSpawnInfo(playerid, 111, 0, 2026.1704, 1343.6394, 10.8203, 266.7928, 24, 330, 0, 0, 0, 0);
if(!GetPVarInt(playerid, "OnPlayerRequestClassFix"))
{
if(GetPVarInt(playerid, "OnPlayerRequestClass_F4_Bug")) return SpawnPlayer(playerid);
TogglePlayerSpectating(playerid, true);
SetTimerEx("TogglePlayerSpectatingOff", 500, 0, "i", playerid);
}
else DeletePVar(playerid, "OnPlayerRequestClassFix"), SpawnPlayer(playerid);
+ функции, вызываемые таймерамиPHP код:
DeletePVar(playerid, "OnPlayerRequestClass_F4_Bug");
SetPlayerPos(playerid, 2026.1704, 1343.6394, 10.8203);//Можете вставить свои, если вы брезгуете моими координатами
А так же во все места, после которых нужно спавнить игрока при первом входе (регистрация/авторизация)PHP код:
forward SetPlayerCameraPosForReqClass(playerid);
public SetPlayerCameraPosForReqClass(playerid)
{
SetPlayerCameraPos(playerid, 2026.7704, 1343.6394, 10.8203);
SetPlayerCameraLookAt(playerid, 2027.7704, 1343.6394, 10.8203);
}
forward TogglePlayerSpectatingOff(playerid);
public TogglePlayerSpectatingOff(playerid)
{
TogglePlayerSpectating(playerid, false),
SetPVarInt(playerid, "OnPlayerRequestClass_F4_Bug", GetPVarInt(playerid, "OnPlayerRequestClass_F4_Bug")+1);//Чпок
}
PHP код:
TogglePlayerSpectating(playerid, false);
PHP код:
#include <a_samp>
main()
{
print("\n----------------------------------");
print(" Blank Gamemode by your name here");
print("----------------------------------\n");
}
public OnGameModeInit()
{
// Don't use these lines if it's a filterscript
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
AddStaticVehicle(560,1958.3876,2163.6729,10.5250,259.9205,9,39); // car
return 1;
}
public OnGameModeExit()
{
return 1;
}
public OnPlayerRequestClass(playerid, classid)
{
SetSpawnInfo(playerid, 111, 0, 2026.1704, 1343.6394, 10.8203, 266.7928, 24, 330, 0, 0, 0, 0);
if(!GetPVarInt(playerid, "OnPlayerRequestClassFix"))
{
if(GetPVarInt(playerid, "OnPlayerRequestClass_F4_Bug")) return SpawnPlayer(playerid);
TogglePlayerSpectating(playerid, true);
SetTimerEx("TogglePlayerSpectatingOff", 500, 0, "i", playerid);
}
else DeletePVar(playerid, "OnPlayerRequestClassFix"), SpawnPlayer(playerid);
return 1;
}
public OnPlayerConnect(playerid)
{
SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
TogglePlayerSpectating(playerid, true);//Собстно, начало обхода
SetTimerEx("SetPlayerCameraPosForReqClass", 100, 0, "i", playerid);//А это для того, чтоб камера изменилась при начале слежки
return 1;
}
forward SetPlayerCameraPosForReqClass(playerid);
public SetPlayerCameraPosForReqClass(playerid)
{
SetPlayerCameraPos(playerid, 2026.7704, 1343.6394, 10.8203);
SetPlayerCameraLookAt(playerid, 2027.7704, 1343.6394, 10.8203);
ShowPlayerDialog(playerid, 1111, DIALOG_STYLE_MSGBOX, "Привет. Как дела?", "Войти на сервер?", "Да", "Нет (Да)");
}
forward TogglePlayerSpectatingOff(playerid);
public TogglePlayerSpectatingOff(playerid)
{
TogglePlayerSpectating(playerid, false),
SetPVarInt(playerid, "OnPlayerRequestClass_F4_Bug", GetPVarInt(playerid, "OnPlayerRequestClass_F4_Bug")+1);//Чпок
}
public OnPlayerSpawn(playerid)
{
DeletePVar(playerid, "OnPlayerRequestClass_F4_Bug");
SetPlayerPos(playerid, 1957.2458,2169.8950,10.8203);
SetPlayerFacingAngle(playerid, 231.6659);
GivePlayerMoney(playerid, 10000);
GivePlayerWeapon(playerid, 24, 1000);
SendClientMessage(playerid, -1, "/kill | /spawn | /gmx");
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if (!strcmp("/kill", cmdtext, true))
{
SetPlayerHealth(playerid, '\0');
SendClientMessage(playerid, -1, "ЮАР Дед");
return 1;
}
else if (!strcmp("/spawn", cmdtext, true))
{
SpawnPlayer(playerid);
SendClientMessage(playerid, -1, "ЮАР Спавн");
return 1;
}
else if (!strcmp("/gmx", cmdtext, true))
{
SendRconCommand("gmx");
SendClientMessage(playerid, -1, "Рестарто");
return 1;
}
return 0;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 1111)
{
TogglePlayerSpectating(playerid, false);
}
return 1;
}
Вариант #2:
Подал идею - Alexey_Nikiforov
Реализация - DS
При нажатии на F4 игрок будет заспавнен 2 раза подряд с небольшим интервалом (для исправления того же самого бага):
OnPlayerRequestClass:
OnPlayerConnect:PHP код:
SetSpawnInfo(playerid, 111, 0, 0.0, 0.0, 0.0, 0.0, 24, 330, 0, 0, 0, 0);
new vid = GetPlayerVehicleID(playerid);
if (vid)
{
new Float:x,
Float:y,
Float:z;
GetVehiclePos(vid, x, y, z),
SetPlayerPos(playerid, x, y, z-5);
}
SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
SpawnPlayer(playerid);
OnPlayerSpawn:PHP код:
TogglePlayerSpectating(playerid, true);//Собстно, начало обхода
SetTimerEx("SetPlayerCameraPosForReqClass", 100, 0, "i", playerid);//А это для того, чтоб камера изменилась при начале слежки
Функция, вызываемая таймером, для смены позиции камеры при входе:PHP код:
if(GetPVarInt(playerid, "OnPlayerRequestClassFix"))
{
SetPlayerPos(playerid, 0.0, 0.0, 0.0);
SetTimerEx("DoublePlayerSpawn", 50, 0, "i", playerid);
DeletePVar(playerid, "OnPlayerRequestClassFix");
return 1;
}
SetPlayerPos(playerid, 1957.2458,2169.8950,10.8203);//Вот тут уже свои координаты
//И далее нужные настройки, типа оружия, скина и т.п. (SetPlayerPos должен быть обязательно!
И в момент, когда нужно заспавнить игрока (при авторизации, например), добавьте:PHP код:
forward SetPlayerCameraPosForReqClass(playerid);
public SetPlayerCameraPosForReqClass(playerid)
{
SetPlayerCameraPos(playerid, 2026.7704, 1343.6394, 10.8203);
SetPlayerCameraLookAt(playerid, 2027.7704, 1343.6394, 10.8203);
}
PHP код:
TogglePlayerSpectating(playerid, false);
PHP код:
#include <a_samp>
main()
{
print("\n----------------------------------");
print(" Blank Gamemode by your name here");
print("----------------------------------\n");
}
public OnGameModeInit()
{
// Don't use these lines if it's a filterscript
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
AddStaticVehicle(560,1958.3876,2163.6729,10.5250,259.9205,9,39); // car
return 1;
}
public OnGameModeExit()
{
return 1;
}
public OnPlayerConnect(playerid)
{
TogglePlayerSpectating(playerid, true);//Собстно, начало обхода
SetTimerEx("SetPlayerCameraPosForReqClass", 100, 0, "i", playerid);//А это для того, чтоб камера изменилась при начале слежки
return 1;
}
forward SetPlayerCameraPosForReqClass(playerid);
public SetPlayerCameraPosForReqClass(playerid)
{
SetPlayerCameraPos(playerid, 2026.7704, 1343.6394, 10.8203);
SetPlayerCameraLookAt(playerid, 2027.7704, 1343.6394, 10.8203);
ShowPlayerDialog(playerid, 1111, DIALOG_STYLE_MSGBOX, "Привет. Как дела?", "Войти на сервер?", "Да", "Нет (Да)");
}
public OnPlayerRequestClass(playerid, classid)
{
SetSpawnInfo(playerid, 111, 0, 0.0, 0.0, 0.0, 0.0, 24, 330, 0, 0, 0, 0);
new vid = GetPlayerVehicleID(playerid);
if (vid)
{
new Float:x,
Float:y,
Float:z;
// Remove them without the animation.
GetVehiclePos(vid, x, y, z),
SetPlayerPos(playerid, x, y, z-5);
}
SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
SpawnPlayer(playerid);
return 1;
}
forward DoublePlayerSpawn(playerid);
public DoublePlayerSpawn(playerid) SpawnPlayer(playerid);
public OnPlayerSpawn(playerid)
{
if(GetPVarInt(playerid, "OnPlayerRequestClassFix"))
{
SetPlayerPos(playerid, 0.0, 0.0, 0.0);
SetTimerEx("DoublePlayerSpawn", 50, 0, "i", playerid);
DeletePVar(playerid, "OnPlayerRequestClassFix");
return 1;
}
SetPlayerPos(playerid, 1957.2458,2169.8950,10.8203);
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if (!strcmp("/kill", cmdtext, true))
{
SetPlayerHealth(playerid, '\0');
SendClientMessage(playerid, -1, "ЮАР Дед");
return 1;
}
else if (!strcmp("/spawn", cmdtext, true))
{
SpawnPlayer(playerid);
SendClientMessage(playerid, -1, "ЮАР Спавн");
return 1;
}
else if (!strcmp("/gmx", cmdtext, true))
{
SendRconCommand("gmx");
SendClientMessage(playerid, -1, "Рестарто");
return 1;
}
return 0;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 1111)
{
TogglePlayerSpectating(playerid, false);
}
return 1;
}
Дело было вечером. Делать было нечего.
В общем, решил я разобраться с этой проблемой для себя раз и навсегда (ибо забыл как я это делал когда-то, когда ещё держал сервер SA-MP, лол), а заодно и поделиться с вами.
Если кто не понял, данный код позволяет обойти стандартный выбор скина, при этом спокойно работать с установкой камеры для игрока и не вызывает багов, типа появления на Грув Стрит или артефактов в виде сигары/пива на месте смерти/спавна игрока.
Пишу в данный раздел, да и особо не заморачиваюсь с оформлением, я потому, что пока ещё не уверен в 100% работоспособности данного кода, ибо нет возможности его проверить на онлайне больше, чем я и мой воображаемый друг Витя, у которого, на его воображаемом компьютере, не идёт воображаемая GTA. Да и вообще не ясно как этот код поведёт себя в боевых условиях. Но всё (или почти всё), что касается работы кода для одного человека, я проверил полностью и код работает отлично... В общем, если кому не трудно, протестируйте этот код. Позже, если он окажется рабочим, создам мануал и увековечу ваши имена в нём.
Собстно, код:
В OnPlayerConnect вставим
И в OnPlayerRequestClass вставимPHP код:
SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
TogglePlayerSpectating(playerid, true);//Собстно, начало обхода
SetTimerEx("SetPlayerCameraPosForReqClass", 100, 0, "i", playerid);//А это для того, чтоб камера изменилась при начале слежки
Ну и координаты спавна в OnPlayerSpawn, дабы ваш мод не перерезал всю вашу семью и не утопил ваших рыбок в их же аквариуме в приступе бешенстваPHP код:
SetSpawnInfo(playerid, 111, 0, 2026.1704, 1343.6394, 10.8203, 266.7928, 24, 330, 0, 0, 0, 0);
if(!GetPVarInt(playerid, "OnPlayerRequestClassFix"))
{
TogglePlayerSpectating(playerid, true);
SetTimerEx("TogglePlayerSpectatingOff", 500, 0, "i", playerid);
}
else DeletePVar(playerid, "OnPlayerRequestClassFix"), SpawnPlayer(playerid);
+ функции, вызываемые таймерамиPHP код:
SetPlayerPos(playerid, 2026.1704, 1343.6394, 10.8203);//Можете вставить свои, если вы брезгуете моими координатами
А так же во все места, после которых нужно спавнить игрока при первом входе (регистрация/авторизация)PHP код:
forward SetPlayerCameraPosForReqClass(playerid);
public SetPlayerCameraPosForReqClass(playerid)
{
SetPlayerCameraPos(playerid, 2026.7704, 1343.6394, 10.8203);
SetPlayerCameraLookAt(playerid, 2027.7704, 1343.6394, 10.8203);
}
forward TogglePlayerSpectatingOff(playerid);
public TogglePlayerSpectatingOff(playerid) TogglePlayerSpectating(playerid, false);
PHP код:
TogglePlayerSpectating(playerid, false);
Кто решит придраться к названиям функций, тот вообще не очень и я на него обиделся. Код писался в условиях максимальной лени, как и эта тема, так что вот. Всем спасибо, все свободны
P.S. Вот мой pwn, с которого я тестировал
PHP код:
#include <a_samp>
main()
{
print("\n----------------------------------");
print(" Blank Gamemode by your name here");
print("----------------------------------\n");
}
public OnGameModeInit()
{
// Don't use these lines if it's a filterscript
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
return 1;
}
public OnGameModeExit()
{
return 1;
}
public OnPlayerRequestClass(playerid, classid)
{
SetSpawnInfo(playerid, 111, 0, 2026.1704, 1343.6394, 10.8203, 266.7928, 24, 330, 0, 0, 0, 0);
if(!GetPVarInt(playerid, "OnPlayerRequestClassFix"))
{
TogglePlayerSpectating(playerid, true);
SetTimerEx("TogglePlayerSpectatingOff", 500, 0, "i", playerid);
}
else DeletePVar(playerid, "OnPlayerRequestClassFix"), SpawnPlayer(playerid);
return 1;
}
public OnPlayerConnect(playerid)
{
SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
TogglePlayerSpectating(playerid, true);//Собстно, начало обхода
SetTimerEx("SetPlayerCameraPosForReqClass", 100, 0, "i", playerid);//А это для того, чтоб камера изменилась при начале слежки
return 1;
}
forward SetPlayerCameraPosForReqClass(playerid);
public SetPlayerCameraPosForReqClass(playerid)
{
SetPlayerCameraPos(playerid, 2026.7704, 1343.6394, 10.8203);
SetPlayerCameraLookAt(playerid, 2027.7704, 1343.6394, 10.8203);
ShowPlayerDialog(playerid, 1111, DIALOG_STYLE_MSGBOX, "Привет. Как дела?", "Войти на сервер?", "Да", "Нет (Да)");
}
forward TogglePlayerSpectatingOff(playerid);
public TogglePlayerSpectatingOff(playerid) TogglePlayerSpectating(playerid, false);
public OnPlayerSpawn(playerid)
{
SetPlayerPos(playerid, 2026.1704, 1343.6394, 10.8203);
SendClientMessage(playerid, -1, "/kill | /spawn | /gmx");
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if (!strcmp("/kill", cmdtext, true))
{
SetPlayerHealth(playerid, '\0');
SendClientMessage(playerid, -1, "ЮАР Дед");
return 1;
}
else if (!strcmp("/spawn", cmdtext, true))
{
SpawnPlayer(playerid);
SendClientMessage(playerid, -1, "ЮАР Спавн");
return 1;
}
else if (!strcmp("/gmx", cmdtext, true))
{
SendRconCommand("gmx");
SendClientMessage(playerid, -1, "Рестарто");
return 1;
}
return 0;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 1111)
{
TogglePlayerSpectating(playerid, false);
}
return 1;
}
Протестировать надо:
- Правильность смены камеры при входе на сервер (у меня её не меняло только если в АФК сидеть во время смены камеры)
- Появление сигар при смерти (в том числе и при прожатии F4)
- Общее качество спавна (задержки могут быть только при прожатии F4, ибо если не делать задержек, появляется сигара на месте спавна)
- - - Добавлено - - -
Так же, если кому не лень, можете попробовать этот же код использовать с InterpolateCameraPos и отписаться по поводу того, как всё будет работать (я позже сам проверю, если нормальных пацанов не найдётся на нашем районе)