PDA

Просмотр полной версии : [Мануал] Обход стандартного выбора скина (скрыть кнопки "<<", ">>" и "Spawn")



DeimoS
25.02.2016, 01:31
Вариант #1:
При нажатии на F4 и смерти игрока отправляет на пол секунды в режим слежки (для исправления бага с появлением бутылки/сигары на спавне)
В OnPlayerConnect вставим


SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
TogglePlayerSpectating(playerid, true);//Собстно, начало обхода
SetTimerEx("SetPlayerCameraPosForReqClass", 100, 0, "i", playerid);//А это для того, чтоб камера изменилась при начале слежки


И в OnPlayerRequestClass вставим

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);

Ну и в OnPlayerSpawn нужно обязательно указать координаты, куда будет отправлен игрок. Например:

DeletePVar(playerid, "OnPlayerRequestClass_F4_Bug");
SetPlayerPos(playerid, 2026.1704, 1343.6394, 10.8203);//Можете вставить свои, если вы брезгуете моими координатами

+ функции, вызываемые таймерами

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);//Чпок
}

А так же во все места, после которых нужно спавнить игрока при первом входе (регистрация/авторизация)

TogglePlayerSpectating(playerid, false);


#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:

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);

OnPlayerConnect:

TogglePlayerSpectating(playerid, true);//Собстно, начало обхода
SetTimerEx("SetPlayerCameraPosForReqClass", 100, 0, "i", playerid);//А это для того, чтоб камера изменилась при начале слежки

OnPlayerSpawn:

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 должен быть обязательно!

Функция, вызываемая таймером, для смены позиции камеры при входе:

forward SetPlayerCameraPosForReqClass(playerid);
public SetPlayerCameraPosForReqClass(playerid)
{
SetPlayerCameraPos(playerid, 2026.7704, 1343.6394, 10.8203);
SetPlayerCameraLookAt(playerid, 2027.7704, 1343.6394, 10.8203);
}

И в момент, когда нужно заспавнить игрока (при авторизации, например), добавьте:

TogglePlayerSpectating(playerid, false);



#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 вставим


SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
TogglePlayerSpectating(playerid, true);//Собстно, начало обхода
SetTimerEx("SetPlayerCameraPosForReqClass", 100, 0, "i", playerid);//А это для того, чтоб камера изменилась при начале слежки


И в OnPlayerRequestClass вставим

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);

Ну и координаты спавна в OnPlayerSpawn, дабы ваш мод не перерезал всю вашу семью и не утопил ваших рыбок в их же аквариуме в приступе бешенства

SetPlayerPos(playerid, 2026.1704, 1343.6394, 10.8203);//Можете вставить свои, если вы брезгуете моими координатами

+ функции, вызываемые таймерами

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);

А так же во все места, после которых нужно спавнить игрока при первом входе (регистрация/авторизация)

TogglePlayerSpectating(playerid, false);

Кто решит придраться к названиям функций, тот вообще не очень и я на него обиделся. Код писался в условиях максимальной лени, как и эта тема, так что вот. Всем спасибо, все свободны

P.S. Вот мой pwn, с которого я тестировал

#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 и отписаться по поводу того, как всё будет работать (я позже сам проверю, если нормальных пацанов не найдётся на нашем районе)

$continue$
25.02.2016, 01:37
Плохой, мальчик!

http://pix.toile-libre.org/upload/original/1456349810.png

DeimoS
25.02.2016, 01:45
Плохой, мальчик!

http://pix.toile-libre.org/upload/original/1456349810.png


Опять у тебя переизбыток запятых в крови :с

https://www.youtube.com/watch?v=wMMaxT3a2xg

P.S. Это не я, меня подставили!

DeimoS
25.02.2016, 01:53
ВСЁ, ДОВОЛЬНЫ!?

$continue$
25.02.2016, 02:10
Нет!

ВСЁ, ДОВОЛЬНЫ!?

DeimoS
25.02.2016, 02:13
Тащемта, вот фикс подвисания при первом появлении (пока на pVar, ибо это первое, что пришло в голову. Потом мб ещё что придумаю)

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;
}


public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 1111)
{
TogglePlayerSpectating(playerid, false);
}
return 1;
}

$continue$
25.02.2016, 02:16
111/1111 - это же не спроста? (привет, magic number (https://en.wikipedia.org/wiki/Magic_number_%28programming%29))
Есть, конечно, подозрение, что это число, кхм сколько раз тебя, * кхм *. Ну ты понял вообщем

DeimoS
25.02.2016, 02:21
111/1111 - это же не спроста? (привет, magic number (https://en.wikipedia.org/wiki/Magic_number_%28programming%29))
Есть, конечно, подозрение, что это число, кхм сколько раз тебя, * кхм *. Ну ты понял вообщем

Для вечно молодых, вечно пьяных я в конце темы пояснил, что это набросок, накиданный за считанные минуты.

Я тоже хочу оставлять ссылки, поэтому вот тебе рандомная статья с лурка (http://lukomore.org/lurk/%D0%91%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D0%B1)

DeimoS
25.02.2016, 03:21
И ещё одна реализация подъехала. Тут всё работает через двойной спавн (собсно, обход кнопок остался тем же. Изменился только обход бага с появлением сигары/пива при смерти от нажатия F4)


#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 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);
if(IsPlayerInAnyVehicle(playerid)) SetPlayerHealth(playerid, 0.0);
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, 2026.1704, 1343.6394, 10.8203);
SendClientMessage(playerid, -1, "/kill | /spawn | /gmx");
}
else
{
SetPlayerPos(playerid, 0.0, 0.0, 0.0);
SetTimerEx("DoublePlayerSpawn", 50, 0, "i", playerid);
DeletePVar(playerid, "OnPlayerRequestClassFix");
}
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;
}
Спасибо Alexey_Nikiforov за предоставленную идею

Если кто-то займётся тестированием этого или предложит свои идеи, буду очень признателен

vovandolg
25.02.2016, 03:31
Ах, написал когда первее меня нашли баг) DEL.

DeimoS
25.02.2016, 03:39
Ах, написал когда первее меня нашли баг) DEL.

О чём же, если не секрет? :)

vovandolg
25.02.2016, 03:43
О чём же, если не секрет? :)

Не поверишь такой же баг сразу нашёл):pleasantry:(спавнился бесконечно вот и весь баг был)
Ну вообщем с этим фиксом что щяс пильнули прям таки фулл чётко, поставим на наш сервер посмотрим что будет)

DeimoS
25.02.2016, 03:44
Не поверишь такой же баг сразу нашёл):pleasantry:
Ну вообщем с этим фиксом что щяс пильнули прям таки фулл чётко, поставим на наш сервер посмотрим что будет)

А в предыдущем-то какой баг? Просто если ты про то сообщение, где повторный респ используется, то это, по-сути, совершенно иной вариант реализации той же системы.

vovandolg
25.02.2016, 03:48
Вот ещё вопрос почему SetPlayerCameraPosForReqClass этот кусок кода как таймер сделал, нельзя всё в коннект было посадить?
_________

А в предыдущем-то какой баг? Просто если ты про то сообщение, где повторный респ используется, то это, по-сути, совершенно иной вариант реализации той же системы.
Всё ок! Этот фикс что щяс сделали он помог.

DeimoS
25.02.2016, 03:56
Вот ещё вопрос почему SetPlayerCameraPosForReqClass этот кусок кода как таймер сделал, нельзя всё в коннект было посадить?
Нет. Без задержек камера не устанавливается на новое место, если поместить игрока в режим слежки


Всё ок! Этот фикс что щяс сделали он помог.

Так а в чём он помог? Я хочу узнать проблему, которая была...

vovandolg
25.02.2016, 04:07
Так а в чём он помог? Я хочу узнать проблему, которая была...

Нуу F4 более раза щёлкнуть и респа бесконечная(только выходить),
если раз щёлкнуть то был шанс появится бутылке, в общем то что и Алексей нашёл.

DeimoS
25.02.2016, 04:17
Нуу F4 более раза щёлкнуть и респа бесконечная(только выходить),
если раз щёлкнуть то был шанс появится бутылке, в общем то что и Алексей нашёл.

Что-то я как не пытался воспроизвести этот баг на версии без двойного респавна, так у меня и не получилось. Как можно больше одного раза активировать F4, если это исключительно функция клиента? Можно подробнее?

vovandolg
25.02.2016, 04:22
Надпись раз выскачит, но если так мысленно подумать что случайно задеть кнопку повторно то разница есть, будто можно несколько раз
+ новый баг возможно нашёл, тестирую ещё..

DeimoS
25.02.2016, 04:27
Надпись раз выскачит, но если так мысленно подумать что случайно задеть кнопку повторно то разница есть, будто можно несколько раз

Сколько бы ты раз на неё не нажал, сработает всё равно 1 раз. Она не срабатывает повторно пока не умрёшь

vovandolg
25.02.2016, 04:34
Сколько бы ты раз на неё не нажал, сработает всё равно 1 раз. Она не срабатывает повторно пока не умрёшь
Может из за того что тестирую на 0.3е:bomb:
Срабатывает один раз, но разница спавна от кол-ва нажатия есть, проверь.
Вот ещё попробуй умереть в машине, там непонятки с этим, камера не садиться или не понятно что..

DeimoS
25.02.2016, 05:38
Может из за того что тестирую на 0.3е:bomb:
Срабатывает один раз, но разница спавна от кол-ва нажатия есть, проверь.

Возможно. Я на 0.3.7 проверял и разницы от того, сколько раз нажал F4, нет.



Вот ещё попробуй умереть в машине, там непонятки с этим, камера не садиться или не понятно что..

А вот за это спасибо.
В OnPlayerStateChange вставь

if((oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER) && newstate == PLAYER_STATE_WASTED) OnPlayerExitVehicle(playerid, GetPlayerVehicleID(playerid));
Должно помочь

vovandolg
25.02.2016, 06:48
У меня такое ощущение что паблик вызывается когда мы выходим,
но когда мы не выходим и вызываем паблик для выхода это как то не правильно,
вообщем помог вариант спавна из инклуда fixes.inc от ziggi,
там есть такая фитча когда игрок в машине спавнится начинает такая же шелуха происходит
я этот код вместо вызова паблика сунул, выглядит чуток не очень что он из машины вышвырнут тпшкой,
но зато не будет больше бага!:dirol:
Вот в общем что должно быть:


if((oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER) && newstate == PLAYER_STATE_WASTED)
{
new vid = GetPlayerVehicleID(playerid);
if(vid)
{
new Float:x, Float:y, Float:z;
GetVehiclePos(vid, x, y, z),
SetPlayerPos(playerid, x, y, z);
}
}


- - - Добавлено - - -


Так же, если кому не лень, можете попробовать этот же код использовать с InterpolateCameraPos и отписаться по поводу того, как всё будет работать
Проверил полёт нормальный)

DeimoS
25.02.2016, 12:09
У меня такое ощущение что паблик вызывается когда мы выходим,
но когда мы не выходим и вызываем паблик для выхода это как то не правильно,

Эмм, посмотри макросы. Он вызывается когда игрок умирает или переходит к выбору скина, при этом находится в автомобиле.
У тебя этот вариант не работает?
UPD: И правда. Видимо, я что-то упустил :с Сейчас найду недочёт

UPD2: Опытным путём было выяснено, что если поиграться с таймерами на спавн (не спавнить так быстро), сей баг исчезает. Но этот костыль довольно хрупок и может вызвать сторонние баги в виде спавна под текстурами во время работы таймера на респавн и т.п. (я не особо разбирался с чем это связано. Просто быстро проверил идею по поводу того, что баг происходит из-за быстрого респавна). Ближе к вечеру опять попробую посидеть над системой.

DeimoS
26.02.2016, 14:44
Опять же, за идею спасибо Alexey_Nikiforov. Баг со смертью в авто с F4 фиксится вот так:


public OnPlayerRequestClass(playerid, classid)
{
SetSpawnInfo(playerid, 111, 0, 0.0, 0.0, 0.0, 0.0, 24, 330, 0, 0, 0, 0);
if(GetPlayerVehicleID(playerid)) SetPlayerHealth(playerid, 0.0);// Вот фикс
SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
SpawnPlayer(playerid);
return 1;
}
Обновил предыдущие посты

vovandolg
26.02.2016, 18:51
if(IsPlayerInAnyVehicle(playerid)) SetPlayerHealth(playerid, 0.0);// Вот фикс


С виду так должно решить проблему, но нет на 0.3е это не помогает..
В общем останусь на своём предлоге фикса спавна от Y_Less :blush2:

UPD: Паблик спавна вызывается когда игрок спавнится,
а баг начинается перед спавном, вот и надо применять до спавна,
то есть во время смерти игрока выталиквать из авто.

DeimoS
26.02.2016, 19:35
С виду так должно решить проблему, но нет на 0.3е это не помогает..
В общем останусь на своём предлоге фикса спавна от Y_Less :blush2:

UPD: Паблик спавна вызывается когда игрок спавнится,
а баг начинается перед спавном, вот и надо применять до спавна,
то есть во время смерти игрока выталиквать из авто.

Я обновил предыдущий пост, ибо IsPlayerInAnyVehicle не всегда срабатывала. C GetPlayerVehicleID дела, вроде, обстоят лучше, хоть и стоит протестировать лучше

vovandolg
26.02.2016, 20:09
Я обновил предыдущий пост, ибо IsPlayerInAnyVehicle не всегда срабатывала. C GetPlayerVehicleID дела, вроде, обстоят лучше, хоть и стоит протестировать лучше

Тут уже лучше, но всё равно один раз сигара проскочила, и смертей 1/3 бывала когда зареспался...
уже 50 на 50 что юзать не знаю)

DeimoS
26.02.2016, 20:36
Тут уже лучше, но всё равно один раз сигара проскочила, и смертей 1/3 бывала когда зареспался...
уже 50 на 50 что юзать не знаю)

Я уже даже не знаю стоит ли продолжать этим заниматься... Одним костылём исправляешь один баг и на его месте появляется 10 других =(
А первый вариант не пробовал? Там вообще проблем с автомобилем нет

vovandolg
26.02.2016, 21:34
Вот такой код я юзать буду в общем, в первый раз помирает и очень редко что то там видно в руке,
но это с нажатием F4 и один раз и то я на втором акке не заметил такого, значит уже не страшно.
Минус только в том что из авто сразу спавнить будет, не будет не каких помиралок полежалок у кара.
:crazy: Ну что поехали..

#include <a_samp>
//#include <fixes>

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);
SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
FIXES_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("/spawnkill", cmdtext, true))
{
SpawnPlayer(playerid);
SetPlayerHealth(playerid, '\0');
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;
}

//Взял из fixes.inc спасибо "ziggi" за то что сделал такой прекрасный сборник фиксов,
//которые не всегда знаешь где искать
//и ещё одно спасибо тому кто изобрёл этот фикс "Y_Less"
stock FIXES_SpawnPlayer(playerid)
{
new vid = GetPlayerVehicleID(playerid);
if(vid)
{
new Float:x, Float:y, Float:z;
GetVehiclePos(vid, x, y, z),
SetPlayerPos(playerid, x, y, z);
}
return SpawnPlayer(playerid);
}

Смерти тестировал по разному, разбивал авто,
стрелял со всего оружия по другому игроку,
в общем фулл садо-мазо с F4 и без))

DeimoS
26.02.2016, 22:52
Вот такой код я юзать буду в общем, в первый раз помирает и очень редко что то там видно в руке,
но это с нажатием F4 и один раз и то я на втором акке не заметил такого, значит уже не страшно.
Минус только в том что из авто сразу спавнить будет, не будет не каких помиралок полежалок у кара.
:crazy: Ну что поехали..

#include <a_samp>
//#include <fixes>

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);
SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
FIXES_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("/spawnkill", cmdtext, true))
{
SpawnPlayer(playerid);
SetPlayerHealth(playerid, '\0');
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;
}

//Взял из fixes.inc спасибо "ziggi" за то что сделал такой прекрасный сборник фиксов,
//которые не всегда знаешь где искать
//и ещё одно спасибо тому кто изобрёл этот фикс "Y_Less"
stock FIXES_SpawnPlayer(playerid)
{
new vid = GetPlayerVehicleID(playerid);
if(vid)
{
new Float:x, Float:y, Float:z;
GetVehiclePos(vid, x, y, z),
SetPlayerPos(playerid, x, y, z);
}
return SpawnPlayer(playerid);
}

Смерти тестировал по разному, разбивал авто,
стрелял со всего оружия по другому игроку,
в общем фулл садо-мазо с F4 и без))

Можешь то же самое проверить на первом варианте реализации? Уж очень интересно как он себя поведёт.

Я, в идеале, хочу найти минимальное время, на которое требуется помещать игрока в режим слежки для того, чтоб бутылка не появлялась (скорее всего формула будет выглядеть, примерно, так: "пинг игрока+число", хотя, в то же время, я сомневаюсь, что пинг тут играет какую-то роль) + это всё можно обыграть каким-нибудь текстдравом или же перемещать камеру на убийцу/труп, например (хотя тогда надо будет увеличить время нахождения в режиме слежки...).

В общем, первый вариант, как по мне, удачнее, ибо с ним можно создать больше всего интересного в промежутке между смертью и спавном (и, собственно, контролировать время, после которого игрока зареспит) + в нём нет бага с автомобилем и F4 (ну, по крайней мере, если убивать себя серверной командой/взрывом авто)

P.S. Спасибо за помощь

vovandolg
26.02.2016, 23:28
Можешь то же самое проверить на первом варианте реализации?

Думал тот баг о котором я говорил только на 0.3е, ах да нет оказалось и на 0.3.7 он присутствует,
Залезаем в кар, жмём несколько раз на F4
(изобразим из себя испугавшегося геймера будто ночь не чего не видно на клаве и мы напуганы):lol:
Потом умираем в каре и получаем баг на блюдечке, вот и не актуален оказался первый вариант,
но всё равно из него брался толчок к другим идеям которые всё таки удалось кое как реализовать к более играбельному состоянию..


MISSION COMPLETE
:victory:

DeimoS
26.02.2016, 23:53
Думал тот баг о котором я говорил только на 0.3е, ах да нет оказалось и на 0.3.7 он присутствует,
Залезаем в кар, жмём несколько раз на F4
(изобразим из себя испугавшегося геймера будто ночь не чего не видно на клаве и мы напуганы):lol:
Потом умираем в каре и получаем баг на блюдечке, вот и не актуален оказался первый вариант,
но всё равно из него брался толчок к другим идеям которые всё таки удалось кое как реализовать к более играбельному состоянию..


MISSION COMPLETE
:victory:

Я не понимаю о каком ты баге говоришь...
Вот, сидя в авто, нонстопом прожимаю F4
http://i.imgur.com/VAXuxu2.jpg
И после смерти нет никаких проблем
http://i.imgur.com/q5bqwYP.jpg

Даже если убивать себя серверной командой
http://i.imgur.com/UxSlzsd.jpg
Спавнит нормально
http://i.imgur.com/Z8lnrST.png

vovandolg
27.02.2016, 00:01
Нуу может быть из за клео, но опять же я убрал все скрипты та же байда, что то не даёт заспавниться игроку, его спавнит бесконечно...
Может сборка клиента такая? или сервер? Тогда есть вариант что я не один такой буду,
поэтому я выбрал второй вариант на котором твёрдо всё работает.

Одно нажатие F4 не даёт такой баг, а вот два и более и если убить себя в каре приводит к этому багу.

DeimoS
27.02.2016, 01:06
Нуу может быть из за клео, но опять же я убрал все скрипты та же байда, что то не даёт заспавниться игроку, его спавнит бесконечно...
Может сборка клиента такая? или сервер? Тогда есть вариант что я не один такой буду,
поэтому я выбрал второй вариант на котором твёрдо всё работает.

Одно нажатие F4 не даёт такой баг, а вот два и более и если убить себя в каре приводит к этому багу.

Эта проверка вшита в сам клиент ещё чёрт знает с какой версии, так что вряд ли дело в сервере/клиенте. А вот с клео могут быть проблемы. Попробуй их убрать на время теста и проверить

$continue$
27.02.2016, 01:11
http://blog.badata.net/wp-content/uploads/2015/07/bug-1200x705.png

А, все из одного, кхм, дурака. Который не может написать отключение кнопок (native HideButtonSelectionClass(bool status = false);, например).
Это же так трудно -_-

vovandolg
27.02.2016, 04:33
Баг и без клео остался, пришлось пообщаться с pawno по человечески:rofl:


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);
//опа-2 а тут тоже нету спавна вот и найден якобы баг который не спавнил меня

//А тем временем в таймере не на шутку бушует отключение наблюдения
forward TogglePlayerSpectatingOff(playerid);
public TogglePlayerSpectatingOff(playerid) TogglePlayerSpectating(playerid, false);
//но вот беда до сих пор я не нахожу SpawnPlayer(playerid);
//т.к. PVar OnPlayerRequestClassFix не где не юзается и я совершаю овер9000 повтор паблика
//и продолжаю дальше включать/выключать слежку пока хозяин не предложит мне спавн
//или PVar OnPlayerRequestClassFix

/* Паблик выбора скина был на паузе при условии что PVar OnPlayerRequestClassFix не юзается, вот и застревал в нём */


Вот так вообщем пофиксилась проблема и оба варианта работают одинаково,
только вот какой быстрее я так на глаз и не определил, вроде оба норм.


forward TogglePlayerSpectatingOff(playerid);
public TogglePlayerSpectatingOff(playerid)
{
SetPVarInt(playerid, "OnPlayerRequestClassFix", 1);
TogglePlayerSpectating(playerid, false);
}

DeimoS
27.02.2016, 13:45
Баг и без клео остался, пришлось пообщаться с pawno по человечески:rofl:

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);//опа в таймере и после него нету спавна
}

Спавном тут является вызов TogglePlayerSpectating(playerid, false); в TogglePlayerSpectatingOff, ибо выход из режима слежки сам по себе имеет внутри себя вызов OnPlayerSpawn



else DeletePVar(playerid, "OnPlayerRequestClassFix"), SpawnPlayer(playerid);
//опа-2 а тут тоже нету спавна вот и найден якобы баг который не спавнил меня
Эмм, а вот что? (выделил красным)


//А тем временем в таймере не на шутку бушует отключение наблюдения
Выход из режима слежки вызовется один раз, ибо таймер там не зацикленный.



forward TogglePlayerSpectatingOff(playerid);
public TogglePlayerSpectatingOff(playerid) TogglePlayerSpectating(playerid, false);
//но вот беда до сих пор я не нахожу SpawnPlayer(playerid);
Об этом я уже написал выше


//т.к. PVar OnPlayerRequestClassFix не где не юзается и я совершаю овер9000 повтор паблика

С чего ты это взял? При вызове TogglePlayerSpectating OnPlayerRequestClass не будет вызываться.



/* Паблик выбора скина был на паузе при условии что PVar OnPlayerRequestClassFix не юзается, вот и застревал в нём */

Ты не совсем понимаешь механику этого костыля. Вот как он работает:

Игрок вошёл

Вызов OnIncomingConnection (нам он не нужен)
Вызов OnPlayerConnect

Помещаем игрока в режим слежки
Присваиваем pVar единицу
Таймером вызываем SetPlayerCameraPos, ибо без таймера сия функция отказывается работать с TogglePlayerSpectating

Когда все нужные действия выполнены (авторизация, например), вызываем TogglePlayerSpectating(playerid, false)

TogglePlayerSpectating пытается самостоятельно вызвать OnPlayerSpawn (так заложено у неё внутри)
Так как выбор скина не произведён, сервер, вместо OnPlayerSpawn, вызывает для игрока OnPlayerRequestClass

В OnPlayerRequestClass мы задаём координаты для спавна, дабы сработала SpawnPlayer
Проверяем значение pVar, дабы повторно не помещать игрока в режим слежки, и удостоверившись, что pVar не равен нулю, вызываем SpawnPlayer (дабы выйти из OnPlayerRequestClass) и удаляем pVar (тем самым GetPVarInt теперь будет возвращать нуль)


Игрок нажал F4 и умер

Вызывается OnPlayerRequestClass, в которой у нас строит проверка на значение pVar (он равен нулю)
Проверка срабатывает и игрок помещается в режим слежки + запускается таймер на отключение слежки, дабы обойти баг с появлением бутылки/сигары на спавне
Таймер вызывает функцию и срабатывает TogglePlayerSpectating(playerid, false), который выводит игрока из режима слежки и автоматически спавнит его, вызывая OnPlayerSpawn
Fin.




Нет никакого зацикливания. Даже если сделать логирование вот так:

public OnPlayerRequestClass(playerid, classid)
{
print("OnPlayerRequestClass - начало");
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);
print("OnPlayerRequestClass - Вызов таймера");
}
else DeletePVar(playerid, "OnPlayerRequestClassFix"), SpawnPlayer(playerid), print("OnPlayerRequestClass - SpawnPlayer");
print("OnPlayerRequestClass - конец");
return 1;
}

forward TogglePlayerSpectatingOff(playerid);
public TogglePlayerSpectatingOff(playerid) TogglePlayerSpectating(playerid, false), print("TogglePlayerSpectatingOff");
Вот что выдаст при входе на сервер:

http://i.imgur.com/rIi7mVV.png

И вот что выдаст при смерти с F4 (хоть в авто, хоть без авто):

http://i.imgur.com/s2mox3c.png


Вставь этот код себе и покажи какие логи выдаст твой сервер

vovandolg
27.02.2016, 15:23
Да ты логически подумай ты создаёшь 1 раз всего тот самый PVar который удаляется и спавнит нормально,
но дальше он его не где не берёт и из паблика OnPlayerRequestClass нет выхода, плюнь на то что тебе логи показывают,
логически подумай к это ведёт, у меня клео уже нету и не выходит из паблика как это и должно по коду произойти, как ещё объяснить?

DeimoS
27.02.2016, 15:35
плюнь на то что тебе логи показывают

Ты предлагаешь плюнуть на реальную картину, которую показывают логи, и придумывать какие-то свои варианты работы кода? Ты серьёзно? :crazy:


Да ты логически подумай ты создаёшь 1 раз всего тот самый PVar который удаляется и спавнит нормально,
но дальше он его не где не берёт и из паблика OnPlayerRequestClass нет выхода, плюнь на то что тебе логи показывают,
логически подумай к чечму это ведёт, у меня клео уже нету и не выходит из паблика как это и должно по коду произойти, как ещё объяснить?

Эмм, так его и не нужно больше создавать. Я написал выше для чего мы его создаём (для того, чтоб игрока не впихивать повторно в режим слежки). Больше он не нужен там. Когда мы его удаляем, функция GetPVarInt вернёт нуль и нужная нам проверка сработает. А выходом из коллбэка OnPlayerRequestClass является TogglePlayerSpectating... =\
Хорошо, если не веришь мне, прочти официальную страницу в wiki (https://wiki.sa-mp.com/wiki/TogglePlayerSpectating), посвящённую TogglePlayerSpectating.
А именно тебе нужно узреть вот это:
http://i.imgur.com/7bYjTJy.png

Если и это тебя не убедит в том, что проблема не в OnPlayerRequestClass, я не знаю чем тебе ещё помочь... Разве что видео записать и показать, что багов нет никаких


Да ты логически подумай
В том-то и дело, что код построен логически верно и выше я описал всю логику его работы.

- - - Добавлено - - -

Просто вставь вот этот код в свой мод, вызови свой баг и скинь мне логи

public OnPlayerRequestClass(playerid, classid)
{
print("OnPlayerRequestClass - начало");
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);
print("OnPlayerRequestClass - Вызов таймера");
}
else DeletePVar(playerid, "OnPlayerRequestClassFix"), SpawnPlayer(playerid), print("OnPlayerRequestClass - SpawnPlayer");
print("OnPlayerRequestClass - конец");
return 1;
}
forward TogglePlayerSpectatingOff(playerid);
public TogglePlayerSpectatingOff(playerid) TogglePlayerSpectating(playerid, false), print("TogglePlayerSpectatingOff");

public OnPlayerDeath(playerid, killerid, reason)
{
print("OnPlayerDeath");
return 1;
}
public OnPlayerSpawn(playerid)
{
print("OnPlayerSpawn");
return 1;
}

vovandolg
27.02.2016, 15:51
Ладно пусть будут логи, тоже как вариант, унмоменто

- - - Добавлено - - -

Вот пожалуйста всего 1 раз умер с двойным нажатием F4, и то там дальше засираются логи..


[14:49:30] [join] Vovka_Nonsens has joined the server (0:85.115.248.13)
[14:49:32] OnPlayerRequestClass - начало
[14:49:32] OnPlayerRequestClass - SpawnPlayer
[14:49:32] OnPlayerRequestClass - конец
[14:49:32] OnPlayerSpawn
[14:49:43] OnPlayerDeath
[14:49:43] [death] Vovka_Nonsens died 255
[14:49:43] OnPlayerRequestClass - начало
[14:49:43] OnPlayerRequestClass - Вызов таймера
[14:49:43] OnPlayerRequestClass - конец
[14:49:43] TogglePlayerSpectatingOff
[14:49:43] OnPlayerRequestClass - начало
[14:49:43] OnPlayerRequestClass - Вызов таймера
[14:49:43] OnPlayerRequestClass - конец
[14:49:44] TogglePlayerSpectatingOff
[14:49:44] OnPlayerRequestClass - начало
[14:49:44] OnPlayerRequestClass - Вызов таймера
[14:49:44] OnPlayerRequestClass - конец
[14:49:45] TogglePlayerSpectatingOff
[14:49:45] OnPlayerRequestClass - начало
[14:49:45] OnPlayerRequestClass - Вызов таймера
[14:49:45] OnPlayerRequestClass - конец
[14:49:45] TogglePlayerSpectatingOff
[14:49:45] OnPlayerRequestClass - начало
[14:49:45] OnPlayerRequestClass - Вызов таймера
[14:49:45] OnPlayerRequestClass - конец
[14:49:46] TogglePlayerSpectatingOff
[14:49:46] OnPlayerRequestClass - начало
[14:49:46] OnPlayerRequestClass - Вызов таймера
[14:49:46] OnPlayerRequestClass - конец
[14:49:47] TogglePlayerSpectatingOff
[14:49:47] OnPlayerRequestClass - начало
[14:49:47] OnPlayerRequestClass - Вызов таймера
[14:49:47] OnPlayerRequestClass - конец
[14:49:47] TogglePlayerSpectatingOff
[14:49:47] OnPlayerRequestClass - начало
[14:49:47] OnPlayerRequestClass - Вызов таймера
[14:49:47] OnPlayerRequestClass - конец
[14:49:48] TogglePlayerSpectatingOff
[14:49:48] OnPlayerRequestClass - начало
[14:49:48] OnPlayerRequestClass - Вызов таймера
[14:49:48] OnPlayerRequestClass - конец
[14:49:49] TogglePlayerSpectatingOff
[14:49:49] OnPlayerRequestClass - начало
[14:49:49] OnPlayerRequestClass - Вызов таймера
[14:49:49] OnPlayerRequestClass - конец
[14:49:49] TogglePlayerSpectatingOff
[14:49:49] OnPlayerRequestClass - начало
[14:49:49] OnPlayerRequestClass - Вызов таймера
[14:49:49] OnPlayerRequestClass - конец
[14:49:50] TogglePlayerSpectatingOff
[14:49:50] OnPlayerRequestClass - начало
[14:49:50] OnPlayerRequestClass - Вызов таймера
[14:49:50] OnPlayerRequestClass - конец
[14:49:51] TogglePlayerSpectatingOff
[14:49:51] OnPlayerRequestClass - начало
[14:49:51] OnPlayerRequestClass - Вызов таймера
[14:49:51] OnPlayerRequestClass - конец
[14:49:51] TogglePlayerSpectatingOff
[14:49:51] OnPlayerRequestClass - начало
[14:49:51] OnPlayerRequestClass - Вызов таймера
[14:49:51] OnPlayerRequestClass - конец
[14:49:52] TogglePlayerSpectatingOff
[14:49:52] OnPlayerRequestClass - начало
[14:49:52] OnPlayerRequestClass - Вызов таймера
[14:49:52] OnPlayerRequestClass - конец
[14:49:53] TogglePlayerSpectatingOff
[14:49:53] OnPlayerRequestClass - начало
[14:49:53] OnPlayerRequestClass - Вызов таймера
[14:49:53] OnPlayerRequestClass - конец
[14:49:53] [chat] [Vovka_Nonsens]: ?
[14:49:53] TogglePlayerSpectatingOff
[14:49:53] OnPlayerRequestClass - начало
[14:49:53] OnPlayerRequestClass - Вызов таймера
[14:49:53] OnPlayerRequestClass - конец
[14:49:54] TogglePlayerSpectatingOff
[14:49:54] OnPlayerRequestClass - начало
[14:49:54] OnPlayerRequestClass - Вызов таймера
[14:49:54] OnPlayerRequestClass - конец
[14:49:55] TogglePlayerSpectatingOff
[14:49:55] OnPlayerRequestClass - начало
[14:49:55] OnPlayerRequestClass - Вызов таймера
[14:49:55] OnPlayerRequestClass - конец
[14:49:55] TogglePlayerSpectatingOff
[14:49:55] OnPlayerRequestClass - начало
[14:49:55] OnPlayerRequestClass - Вызов таймера
[14:49:55] OnPlayerRequestClass - конец
[14:49:56] TogglePlayerSpectatingOff
[14:49:56] OnPlayerRequestClass - начало
[14:49:56] OnPlayerRequestClass - Вызов таймера
[14:49:56] OnPlayerRequestClass - конец
[14:49:56] TogglePlayerSpectatingOff
[14:49:57] OnPlayerRequestClass - начало
[14:49:57] OnPlayerRequestClass - Вызов таймера
[14:49:57] OnPlayerRequestClass - конец
[14:49:57] TogglePlayerSpectatingOff
[14:49:57] OnPlayerRequestClass - начало
[14:49:57] OnPlayerRequestClass - Вызов таймера
[14:49:57] OnPlayerRequestClass - конец
[14:49:58] TogglePlayerSpectatingOff
[14:49:58] OnPlayerRequestClass - начало
[14:49:58] OnPlayerRequestClass - Вызов таймера
[14:49:58] OnPlayerRequestClass - конец
[14:49:58] TogglePlayerSpectatingOff
[14:49:59] OnPlayerRequestClass - начало
[14:49:59] OnPlayerRequestClass - Вызов таймера
[14:49:59] OnPlayerRequestClass - конец
[14:49:59] [chat] [Vovka_Nonsens]: ??
[14:49:59] TogglePlayerSpectatingOff
[14:49:59] OnPlayerRequestClass - начало
[14:49:59] OnPlayerRequestClass - Вызов таймера
[14:49:59] OnPlayerRequestClass - конец
[14:50:00] TogglePlayerSpectatingOff
[14:50:00] OnPlayerRequestClass - начало
[14:50:00] OnPlayerRequestClass - Вызов таймера
[14:50:00] OnPlayerRequestClass - конец
[14:50:00] TogglePlayerSpectatingOff
[14:50:01] OnPlayerRequestClass - начало
[14:50:01] OnPlayerRequestClass - Вызов таймера
[14:50:01] OnPlayerRequestClass - конец
[14:50:01] TogglePlayerSpectatingOff
[14:50:01] OnPlayerRequestClass - начало
[14:50:01] OnPlayerRequestClass - Вызов таймера
[14:50:01] OnPlayerRequestClass - конец
[14:50:02] TogglePlayerSpectatingOff
[14:50:02] OnPlayerRequestClass - начало
[14:50:02] OnPlayerRequestClass - Вызов таймера
[14:50:02] OnPlayerRequestClass - конец
[14:50:02] TogglePlayerSpectatingOff
[14:50:03] OnPlayerRequestClass - начало
[14:50:03] OnPlayerRequestClass - Вызов таймера
[14:50:03] OnPlayerRequestClass - конец
[14:50:03] TogglePlayerSpectatingOff
[14:50:03] OnPlayerRequestClass - начало
[14:50:03] OnPlayerRequestClass - Вызов таймера
[14:50:03] OnPlayerRequestClass - конец
[14:50:04] TogglePlayerSpectatingOff
[14:50:04] OnPlayerRequestClass - начало
[14:50:04] OnPlayerRequestClass - Вызов таймера
[14:50:04] OnPlayerRequestClass - конец
[14:50:04] TogglePlayerSpectatingOff
[14:50:04] OnPlayerRequestClass - начало
[14:50:04] OnPlayerRequestClass - Вызов таймера
[14:50:04] OnPlayerRequestClass - конец
[14:50:05] TogglePlayerSpectatingOff
[14:50:05] OnPlayerRequestClass - начало
[14:50:05] OnPlayerRequestClass - Вызов таймера
[14:50:05] OnPlayerRequestClass - конец
[14:50:06] TogglePlayerSpectatingOff
[14:50:06] OnPlayerRequestClass - начало
[14:50:06] OnPlayerRequestClass - Вызов таймера
[14:50:06] OnPlayerRequestClass - конец
[14:50:06] TogglePlayerSpectatingOff
[14:50:06] OnPlayerRequestClass - начало
[14:50:06] OnPlayerRequestClass - Вызов таймера
[14:50:06] OnPlayerRequestClass - конец
[14:50:07] TogglePlayerSpectatingOff


Пока не заюзал PVar не заспавнило, даже просто спавн без PVar не помогал.

DeimoS
27.02.2016, 16:02
Ладно пусть будут логи, тоже как вариант, унмоменто

- - - Добавлено - - -

Вот пожалуйста всего 1 раз умер с двойным нажатием F4, и то там дальше засираются логи..


[14:49:30] [join] Vovka_Nonsens has joined the server (0:85.115.248.13)
[14:49:32] OnPlayerRequestClass - начало
[14:49:32] OnPlayerRequestClass - SpawnPlayer
[14:49:32] OnPlayerRequestClass - конец
[14:49:32] OnPlayerSpawn
[14:49:43] OnPlayerDeath
[14:49:43] [death] Vovka_Nonsens died 255
[14:49:43] OnPlayerRequestClass - начало
[14:49:43] OnPlayerRequestClass - Вызов таймера
[14:49:43] OnPlayerRequestClass - конец
[14:49:43] TogglePlayerSpectatingOff
[14:49:43] OnPlayerRequestClass - начало
[14:49:43] OnPlayerRequestClass - Вызов таймера
[14:49:43] OnPlayerRequestClass - конец
[14:49:44] TogglePlayerSpectatingOff
[14:49:44] OnPlayerRequestClass - начало
[14:49:44] OnPlayerRequestClass - Вызов таймера
[14:49:44] OnPlayerRequestClass - конец
[14:49:45] TogglePlayerSpectatingOff
[14:49:45] OnPlayerRequestClass - начало
[14:49:45] OnPlayerRequestClass - Вызов таймера
[14:49:45] OnPlayerRequestClass - конец
[14:49:45] TogglePlayerSpectatingOff
[14:49:45] OnPlayerRequestClass - начало
[14:49:45] OnPlayerRequestClass - Вызов таймера
[14:49:45] OnPlayerRequestClass - конец
[14:49:46] TogglePlayerSpectatingOff
[14:49:46] OnPlayerRequestClass - начало
[14:49:46] OnPlayerRequestClass - Вызов таймера
[14:49:46] OnPlayerRequestClass - конец
[14:49:47] TogglePlayerSpectatingOff
[14:49:47] OnPlayerRequestClass - начало
[14:49:47] OnPlayerRequestClass - Вызов таймера
[14:49:47] OnPlayerRequestClass - конец
[14:49:47] TogglePlayerSpectatingOff
[14:49:47] OnPlayerRequestClass - начало
[14:49:47] OnPlayerRequestClass - Вызов таймера
[14:49:47] OnPlayerRequestClass - конец
[14:49:48] TogglePlayerSpectatingOff
[14:49:48] OnPlayerRequestClass - начало
[14:49:48] OnPlayerRequestClass - Вызов таймера
[14:49:48] OnPlayerRequestClass - конец
[14:49:49] TogglePlayerSpectatingOff
[14:49:49] OnPlayerRequestClass - начало
[14:49:49] OnPlayerRequestClass - Вызов таймера
[14:49:49] OnPlayerRequestClass - конец
[14:49:49] TogglePlayerSpectatingOff
[14:49:49] OnPlayerRequestClass - начало
[14:49:49] OnPlayerRequestClass - Вызов таймера
[14:49:49] OnPlayerRequestClass - конец
[14:49:50] TogglePlayerSpectatingOff
[14:49:50] OnPlayerRequestClass - начало
[14:49:50] OnPlayerRequestClass - Вызов таймера
[14:49:50] OnPlayerRequestClass - конец
[14:49:51] TogglePlayerSpectatingOff
[14:49:51] OnPlayerRequestClass - начало
[14:49:51] OnPlayerRequestClass - Вызов таймера
[14:49:51] OnPlayerRequestClass - конец
[14:49:51] TogglePlayerSpectatingOff
[14:49:51] OnPlayerRequestClass - начало
[14:49:51] OnPlayerRequestClass - Вызов таймера
[14:49:51] OnPlayerRequestClass - конец
[14:49:52] TogglePlayerSpectatingOff
[14:49:52] OnPlayerRequestClass - начало
[14:49:52] OnPlayerRequestClass - Вызов таймера
[14:49:52] OnPlayerRequestClass - конец
[14:49:53] TogglePlayerSpectatingOff
[14:49:53] OnPlayerRequestClass - начало
[14:49:53] OnPlayerRequestClass - Вызов таймера
[14:49:53] OnPlayerRequestClass - конец
[14:49:53] [chat] [Vovka_Nonsens]: ?
[14:49:53] TogglePlayerSpectatingOff
[14:49:53] OnPlayerRequestClass - начало
[14:49:53] OnPlayerRequestClass - Вызов таймера
[14:49:53] OnPlayerRequestClass - конец
[14:49:54] TogglePlayerSpectatingOff
[14:49:54] OnPlayerRequestClass - начало
[14:49:54] OnPlayerRequestClass - Вызов таймера
[14:49:54] OnPlayerRequestClass - конец
[14:49:55] TogglePlayerSpectatingOff
[14:49:55] OnPlayerRequestClass - начало
[14:49:55] OnPlayerRequestClass - Вызов таймера
[14:49:55] OnPlayerRequestClass - конец
[14:49:55] TogglePlayerSpectatingOff
[14:49:55] OnPlayerRequestClass - начало
[14:49:55] OnPlayerRequestClass - Вызов таймера
[14:49:55] OnPlayerRequestClass - конец
[14:49:56] TogglePlayerSpectatingOff
[14:49:56] OnPlayerRequestClass - начало
[14:49:56] OnPlayerRequestClass - Вызов таймера
[14:49:56] OnPlayerRequestClass - конец
[14:49:56] TogglePlayerSpectatingOff
[14:49:57] OnPlayerRequestClass - начало
[14:49:57] OnPlayerRequestClass - Вызов таймера
[14:49:57] OnPlayerRequestClass - конец
[14:49:57] TogglePlayerSpectatingOff
[14:49:57] OnPlayerRequestClass - начало
[14:49:57] OnPlayerRequestClass - Вызов таймера
[14:49:57] OnPlayerRequestClass - конец
[14:49:58] TogglePlayerSpectatingOff
[14:49:58] OnPlayerRequestClass - начало
[14:49:58] OnPlayerRequestClass - Вызов таймера
[14:49:58] OnPlayerRequestClass - конец
[14:49:58] TogglePlayerSpectatingOff
[14:49:59] OnPlayerRequestClass - начало
[14:49:59] OnPlayerRequestClass - Вызов таймера
[14:49:59] OnPlayerRequestClass - конец
[14:49:59] [chat] [Vovka_Nonsens]: ??
[14:49:59] TogglePlayerSpectatingOff
[14:49:59] OnPlayerRequestClass - начало
[14:49:59] OnPlayerRequestClass - Вызов таймера
[14:49:59] OnPlayerRequestClass - конец
[14:50:00] TogglePlayerSpectatingOff
[14:50:00] OnPlayerRequestClass - начало
[14:50:00] OnPlayerRequestClass - Вызов таймера
[14:50:00] OnPlayerRequestClass - конец
[14:50:00] TogglePlayerSpectatingOff
[14:50:01] OnPlayerRequestClass - начало
[14:50:01] OnPlayerRequestClass - Вызов таймера
[14:50:01] OnPlayerRequestClass - конец
[14:50:01] TogglePlayerSpectatingOff
[14:50:01] OnPlayerRequestClass - начало
[14:50:01] OnPlayerRequestClass - Вызов таймера
[14:50:01] OnPlayerRequestClass - конец
[14:50:02] TogglePlayerSpectatingOff
[14:50:02] OnPlayerRequestClass - начало
[14:50:02] OnPlayerRequestClass - Вызов таймера
[14:50:02] OnPlayerRequestClass - конец
[14:50:02] TogglePlayerSpectatingOff
[14:50:03] OnPlayerRequestClass - начало
[14:50:03] OnPlayerRequestClass - Вызов таймера
[14:50:03] OnPlayerRequestClass - конец
[14:50:03] TogglePlayerSpectatingOff
[14:50:03] OnPlayerRequestClass - начало
[14:50:03] OnPlayerRequestClass - Вызов таймера
[14:50:03] OnPlayerRequestClass - конец
[14:50:04] TogglePlayerSpectatingOff
[14:50:04] OnPlayerRequestClass - начало
[14:50:04] OnPlayerRequestClass - Вызов таймера
[14:50:04] OnPlayerRequestClass - конец
[14:50:04] TogglePlayerSpectatingOff
[14:50:04] OnPlayerRequestClass - начало
[14:50:04] OnPlayerRequestClass - Вызов таймера
[14:50:04] OnPlayerRequestClass - конец
[14:50:05] TogglePlayerSpectatingOff
[14:50:05] OnPlayerRequestClass - начало
[14:50:05] OnPlayerRequestClass - Вызов таймера
[14:50:05] OnPlayerRequestClass - конец
[14:50:06] TogglePlayerSpectatingOff
[14:50:06] OnPlayerRequestClass - начало
[14:50:06] OnPlayerRequestClass - Вызов таймера
[14:50:06] OnPlayerRequestClass - конец
[14:50:06] TogglePlayerSpectatingOff
[14:50:06] OnPlayerRequestClass - начало
[14:50:06] OnPlayerRequestClass - Вызов таймера
[14:50:06] OnPlayerRequestClass - конец
[14:50:07] TogglePlayerSpectatingOff


Пока не заюзал PVar не заспавнило, даже просто спавн без PVar не помогал.

Какая версия SA-MP?

vovandolg
27.02.2016, 16:03
0.3e-0.3.7 на обоих такая чихарда, другие не тестил, я для чего и хотел чтобы мы оба на 1 сервер зашли какой нибудь и проверили в чём же дело в сервере или клиенте..

DeimoS
27.02.2016, 17:04
0.3e-0.3.7 на обоих такая чихарда, другие не тестил, я для чего и хотел чтобы мы оба на 1 сервер зашли какой нибудь и проверили в чём же дело в сервере или клиенте..

Hamachi скачай
Идентификатор сети - "ddeimos"
Пароль - "deimos"

DeimoS
27.02.2016, 18:35
В общем, опытным путём выяснилось, что дело было не в бобине :)
http://i.imgur.com/2UJ2iOP.png

Люди добрые, помогите, кто чем может. Нужно проверить первый вариант, ибо либо у меня какой-то особенный клиент, который не позволяет данному багу быть, либо всё же у vovandolg.
P.S. Обновил второй вариант, добавив в него обход бага с смертью в авто от Y_LESS

DeimoS
27.02.2016, 19:57
Таки благодаря совместным усилиям с vovandolg, я придумал как "починить" первый способ обхода, если у вас такой же глюченный клиент и OnPlayerRequestClass вызывается несколько раз. Так же опытным путём узнали, что 500 миллисекунд для таймера - мало, ибо иногда всё же проскакивает баг с бутылкой (изменил на 1000мс. Пока полёт нормальный).

Внёс изменения в первый способ, а именно:

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", 1000, 0, "i", playerid);
}
else DeletePVar(playerid, "OnPlayerRequestClassFix"), SpawnPlayer(playerid);
return 1;
}


public OnPlayerSpawn(playerid)
{
DeletePVar(playerid, "OnPlayerRequestClass_F4_Bug");//Чпок
SetPlayerPos(playerid, 2026.1704, 1343.6394, 10.8203);
return 1;
}


forward TogglePlayerSpectatingOff(playerid);
public TogglePlayerSpectatingOff(playerid)
{
TogglePlayerSpectating(playerid, false),
SetPVarInt(playerid, "OnPlayerRequestClass_F4_Bug", GetPVarInt(playerid, "OnPlayerRequestClass_F4_Bug")+1);//Чпок
}

denis01
28.05.2016, 13:23
Использовал КОД под Вариантом #1 он не выбирает скин игрока сразу попадает под координаты

SetSpawnInfo( playerid, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );

А хотя должен направлять на выбор скина

public OnPlayerSpawn(playerid)
{
DeletePVar( playerid, "OnPlayerRequestClass_F4_Bug" );
if(Clothes{playerid} == 1)
{
SetPlayerVirtualWorld(playerid, playerid);
SetPlayerInterior(playerid, 18);
SetPlayerPos(playerid, 146.1254, -83.2891, 1001.8047);
SetPlayerFacingAngle(playerid, 270.0000);
SetPlayerCameraPos(playerid, 149.560501, -83.233757, 1002.191223);
SetPlayerCameraLookAt(playerid, 144.564575, -83.229248, 1001.989379);
TogglePlayerControllable(playerid, 0);
SetPlayerAttachedObject(playerid, 0, 19624, 6, 0.066999, 0.019999, 0.006000, 7.499997, -104.699996, 0.000000, 1.000000, 1.000000, 1.000000);
TextDrawShowForPlayer(playerid, Left_Right_box[0]);
TextDrawShowForPlayer(playerid, Left_Right_box[1]);
TextDrawShowForPlayer(playerid, Select_box);
TextDrawShowForPlayer(playerid, Left_Right_arrow[0]);
TextDrawShowForPlayer(playerid, Left_Right_arrow[1]);
TextDrawShowForPlayer(playerid, Prev_Next[0]);
TextDrawShowForPlayer(playerid, Prev_Next[1]);
TextDrawShowForPlayer(playerid, Select);
SelectTextDraw(playerid, 0x5C86B5AA);
}
return 1;
}

vovandolg
30.07.2016, 02:55
Выложи код с пабликами которые правил по теме

$continue$
25.12.2016, 01:39
Начал писать свой ДМ, чтобы не строить велосипеды и не вставлять потом в них костыли, решил взять данный код, но у меня замечание: почему тут не inc?

DeimoS
25.12.2016, 13:43
Начал писать свой ДМ, чтобы не строить велосипеды и не вставлять потом в них костыли, решил взять данный код, но у меня замечание: почему тут не inc?

Потому что в данном виде код нельзя реализовать в виде инклуда, ибо он слишком "привязан" к той реализации входа на сервер, для которой я его писал (а писал я всё в пустом скрипте и не учитывал, что, например, спавнить нужно не сразу, а только после авторизации игрока и т.п.).

Буквально на днях я думал превратить оба варианта обхода в удобный инклуд, в котором бы учитывались все возможные варианты авторизации (кто-то показывает диалог с авторизацией прямо в OnPlayerConnect, кто-то в OnPlayerRequestClass/кто-то меняет положение камеры, а кто-то не меняет и т.п.) и сам обход настраивался бы с помощью пары функций (когда и как спавнить/убирать ли баг с бутылкой/убирать ли повторный выбор скина на F4/убирать ли вообще выбор скина или лишь временно его отключать, а включать, например, после авторизации), но пока руки не дошли. Как только добью все заказы (а это уже ближе к январю), постараюсь взяться и за эту тему

$continue$
25.12.2016, 18:16
Написал хуки для 2 варианта (перехваты), если надо могу выложить. И такая поправка на счет 2 варианта: в готовом скрипте разморозка есть (после нажатие на диалог), а вот если не открывать спойлер, то в объяснениях (куда, что вставлять) - разморозки нет. Стоит указать, что игрок не будет спавнится, если не разморозить его.

Ещё, наверное стоит создать массив или 3 константы (x, y, z) для координат камеры. (чтобы не ковыряться в самом скрипте)

DeimoS
25.12.2016, 21:49
Написал хуки для 2 варианта (перехваты), если надо могу выложить.

Хочешь - выкладывай.
Если ты конкретно у меня спрашиваешь, то я собираюсь полностью перерабатывать код обоих вариантов, чтоб и гибкости подвезти, и скорости, и возможности переключения между двумя реализациями. В общем, я в любом случае буду всё изобретать по новой.



И такая поправка на счет 2 варианта: в готовом скрипте разморозка есть (после нажатие на диалог), а вот если не открывать спойлер, то в объяснениях (куда, что вставлять) - разморозки нет. Стоит указать, что игрок не будет спавнится, если не разморозить его.

Благодарю, добавил


Ещё, наверное стоит создать массив или 3 константы (x, y, z) для координат камеры. (чтобы не ковыряться в самом скрипте)

Я, вероятнее всего, сделаю отдельный коллбэк, который будет либо аналогом OnPlayerConnect (маловероятно), либо как раз для смены позиции камеры.
Или же вообще сделаю отдельную функцию, которая таймером будет вызывать смену позиции камеры.
В общем, уже как займусь реализацией, буду накидывать идеи

DeimoS
21.03.2017, 01:56
pastebin.com (http://pastebin.com/tQg8zWwK)
Первая версия инклуда, реализованная по принципу первого способа. Код пока очень сырой, поэтому не советую его использовать на готовых проектах.
Выкладываю исключительно для тех, кто согласен помочь с тестированием кода. Заодно и советы по реализации готовы послушать, ибо что-то совсем мозг плавится и пока получилось реализовать задуманное только путём нереальных костылей (я уверен, что всё можно гораздо проще реализовать).

Использование простое:

ToggleSkinSelectionButtons(playerid, true);// Включение отображения кнопок
ToggleSkinSelectionButtons(playerid, false);// Отключение отображения кнопок
SpawnPlayer(playerid);// Отправка игрока на спавн при отключённом отображении кнопок (указывать, например, после авторизации)

Включать/отключать кнопки можно как и при подключении к серверу (например, можно отключить кнопки при входе на сервер и включить при отображении определённого диалога), так и во время игры (включение кнопок позволяет перейти к выбору скина при нажатии на F4 и смерти или при вызове ForceClassSelection. Отключение кнопок предотвратит переход к выбору скина: то бишь, игрока просто заспавнит).
Всё это идеально работает лишь в теории и проверялось пока только на пустом моде.

Любые предложения/пожелания прошу оставлять при себе в этой теме :hi:

Logan Jacskon
22.03.2017, 04:08
Спасибо чувак

DeimoS
22.03.2017, 06:59
pastebin.com (http://pastebin.com/tQg8zWwK)
Первая версия инклуда, реализованная по принципу первого способа. Код пока очень сырой, поэтому не советую его использовать на готовых проектах.
Выкладываю исключительно для тех, кто согласен помочь с тестированием кода. Заодно и советы по реализации готовы послушать, ибо что-то совсем мозг плавится и пока получилось реализовать задуманное только путём нереальных костылей (я уверен, что всё можно гораздо проще реализовать).

Использование простое:

ToggleSkinSelectionButtons(playerid, true);// Включение отображения кнопок
ToggleSkinSelectionButtons(playerid, false);// Отключение отображения кнопок
SpawnPlayer(playerid);// Отправка игрока на спавн при отключённом отображении кнопок (указывать, например, после авторизации)

Включать/отключать кнопки можно как и при подключении к серверу (например, можно отключить кнопки при входе на сервер и включить при отображении определённого диалога), так и во время игры (включение кнопок позволяет перейти к выбору скина при нажатии на F4 и смерти или при вызове ForceClassSelection. Отключение кнопок предотвратит переход к выбору скина: то бишь, игрока просто заспавнит).
Всё это идеально работает лишь в теории и проверялось пока только на пустом моде.

Любые предложения/пожелания прошу оставлять при себе в этой теме :hi:

Дабы понимали: сейчас меня интересует то, не ломает ли мой алгоритм другие системы и если ломает, то какие (может, например, что-то не вызывается в нужный момент из-за этого инклуда или наоборот вызывается лишний раз). Я и сам бы это со временем проверил, но с вашей помощью дело пошло бы явно быстрее :)
Моей целью является написание алгоритма, который бы позволил полностью контролировать момент скрытия/показа кнопок выбора скина и, при этом, не создающего никаких дополнительных проблем.

$continue$
18.07.2017, 02:44
Для себя написал перехваты для 2 варианта. Конечно, такие костыли и выглядит не лучшим образом (когда спавнит, все равно кнопки появляются - оно и понятно почему, но выглядит КРАЙНЕ убого). С 1 вариантом такая же ситуация: кнопки показываются на пару секунд (когда вызывается SpawnPlayer -> OnPlayerSpawn).

Вообще пишу сюда не из этого. Сейчас занялся одним ДМом и убирал кнопки выбора. Там у тебя есть функция для установки камеры, но добавь опционально параметры x_camera_pos, y_camera_pos, z_camera_pos. Если в функцию не переданы координаты, то ставь какие указаны по умолчанию (лучше всего взять координаты стандартной камеры SA-MP, которая при входе в игру).

P.S: почему Kye не добавил скрытие кнопок из коробки? -_-

Fallen A.
18.07.2017, 16:09
P.S: почему Kye не добавил скрытие кнопок из коробки? -_-

Потому что КАЛкор.

DeimoS
18.07.2017, 21:40
Для себя написал перехваты для 2 варианта. Конечно, такие костыли и выглядит не лучшим образом (когда спавнит, все равно кнопки появляются - оно и понятно почему, но выглядит КРАЙНЕ убого). С 1 вариантом такая же ситуация: кнопки показываются на пару секунд (когда вызывается SpawnPlayer -> OnPlayerSpawn).

Вообще пишу сюда не из этого. Сейчас занялся одним ДМом и убирал кнопки выбора. Там у тебя есть функция для установки камеры, но добавь опционально параметры x_camera_pos, y_camera_pos, z_camera_pos. Если в функцию не переданы координаты, то ставь какие указаны по умолчанию (лучше всего взять координаты стандартной камеры SA-MP, которая при входе в игру).

P.S: почему Kye не добавил скрытие кнопок из коробки? -_-

Я, как только разберусь со всеми своими текущими делами, возьмусь за инклуд и постараюсь до идеала откалибровать всё, сделав самые важные для обхода действия автоматическими (дабы уж точно ни у кого проблем с этим не было).

Тема для того и находится в разделе "Прочее", что код в ней далеко не идеален.

SteveStage
23.11.2019, 22:29
Я тоже хочу оставлять ссылки, поэтому вот тебе рандомная статья с лурка (http://lukomore.org/lurk/%D0%91%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D0%B1)

Ахапхапхахп, проорал)

DeimoS
25.11.2019, 09:47
pastebin.com (http://pastebin.com/tQg8zWwK)
Первая версия инклуда, реализованная по принципу первого способа. Код пока очень сырой, поэтому не советую его использовать на готовых проектах.
Выкладываю исключительно для тех, кто согласен помочь с тестированием кода. Заодно и советы по реализации готовы послушать, ибо что-то совсем мозг плавится и пока получилось реализовать задуманное только путём нереальных костылей (я уверен, что всё можно гораздо проще реализовать).

Использование простое:

ToggleSkinSelectionButtons(playerid, true);// Включение отображения кнопок
ToggleSkinSelectionButtons(playerid, false);// Отключение отображения кнопок
SpawnPlayer(playerid);// Отправка игрока на спавн при отключённом отображении кнопок (указывать, например, после авторизации)

Включать/отключать кнопки можно как и при подключении к серверу (например, можно отключить кнопки при входе на сервер и включить при отображении определённого диалога), так и во время игры (включение кнопок позволяет перейти к выбору скина при нажатии на F4 и смерти или при вызове ForceClassSelection. Отключение кнопок предотвратит переход к выбору скина: то бишь, игрока просто заспавнит).
Всё это идеально работает лишь в теории и проверялось пока только на пустом моде.

Любые предложения/пожелания прошу оставлять при себе в этой теме :hi:

Если кто-то пользовался этим инклудом или алгоритмами из шапки - буду благодарен за фидбек

punkochel
11.11.2020, 09:26
Как по мне, можно сделать все гораздо проще.
Предложу свой вариант, который уже был проверен в работе на реальном сервере с онлайном 100+:


public OnPlayerRequestClass(playerid, classid) {

// pInfo[playerid][pLogin] - это массив, который хранит истинность авторизации игрока на сервере
if(pInfo[playerid][pLogin] != 0) {

SetSpawnInfo(playerid, NO_TEAM, 1, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
}
else {

TogglePlayerSpectating(playerid, 1);
/* Ну и тут все манипуляции с выводом окна регистрации/авторизации...
Так-же, не забудьте вывести игрока из режима Spectating в конце авторизации/регистрации,
На заметку: Функция TogglePlayerSpectating(playerid, 0); - спавнит игрока сама; */
}
return 1;
}

DeimoS
11.11.2020, 13:59
Как по мне, можно сделать все гораздо проще.
Предложу свой вариант, который уже был проверен в работе на реальном сервере с онлайном 100+:


public OnPlayerRequestClass(playerid, classid) {

// pInfo[playerid][pLogin] - это массив, который хранит истинность авторизации игрока на сервере
if(pInfo[playerid][pLogin] != 0) {

SetSpawnInfo(playerid, NO_TEAM, 1, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
}
else {

TogglePlayerSpectating(playerid, 1);
/* Ну и тут все манипуляции с выводом окна регистрации/авторизации...
Так-же, не забудьте вывести игрока из режима Spectating в конце авторизации/регистрации,
На заметку: Функция TogglePlayerSpectating(playerid, 0); - спавнит игрока сама; */
}
return 1;
}


А теперь вернись к первому сообщению этой темы и внимательно прочти текст в скобках, описывающий баги, которые вызывает твой вариант обхода :)

punkochel
11.11.2020, 18:03
А теперь вернись к первому сообщению этой темы и внимательно прочти текст в скобках, описывающий баги, которые вызывает твой вариант обхода :)

Вообще ничего подобного не было, никаких ни сигар, ни бутылок.
Стоит еще наверное указать, что данный метод используется в сочетании с библиотекой fixes (https://github.com/pawn-lang/sa-mp-fixes)

DeimoS
11.11.2020, 18:39
Попробуй в горящем авто умереть, например. Так же попробуй умереть перед этим нажав F4.

punkochel
14.11.2020, 07:33
Попробуй в горящем авто умереть, например. Так же попробуй умереть перед этим нажав F4.

DeimoS, Я знаю про этот баг, тестировал его как только можно. И отключение выбора класса при спавне так-же было. Хотя перед тем как добиться целевого для меня результата (убрать бутылку и сигару), я перепробовал десятки способов (не из этой темы), и провел не меньше тестов уж точно :)
Лично у меня, данный способ работает как задумано.

DeimoS
16.11.2020, 13:29
Ну если ты подключаешь fixes.inc, то да, там есть исправления этого. Правда, вряд ли тогда можно назвать этот метод более простым.
Да и с исправлением появления бутылки можно получить проблемы в виде крашей игроков из-за того, что там используется RemoveBuildingForPlayer (1000 вызовов RemoveBuildingForPlayer = краш игрока). Ну и у игроков всё равно останется шанс появится посреди Grove Streen в костюме CJ с текущим кодом.

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

tnc
25.03.2021, 03:20
Хотел бы поделиться координатами оригинальной камеры (которая смотрит на Santa Maria).

SetPlayerCameraPos(playerid, 1093.0, -2036.0, 90.0);
SetPlayerCameraLookAt(playerid, 384.0, -1557.0, 20.0, CAMERA_CUT);


P.S: Возможно где-то оно есть и наверное было на оф.форуме, но он сдох(