PDA

Просмотр полной версии : [Вопрос] Проверка



#Jason
30.12.2015, 17:17
Здравствуйте уважаемые пользователи pro-pawn.
Сегодня я хотел узнать существует ли Функция которая срабатывает если игрок упадет с мотика.
OnPlayerStateChange и OnPlayerExitVehicle не предлагать они не срабатывают когда игрок падает с мотика..
Помогите буду очень благодарен..

Наверное уже кто то понял для чего это


if(newstate == PLAYER_STATE_ONFOOT) // когда игрок падает с мотика оно не сохраняет координаты и спавнит машину на том месте где выходил
{
new Veh = GetPlayerVehicleID(playerid);
GetVehiclePos(Veh,AutoInfo[Veh][cPos][0],AutoInfo[Veh][cPos][1],AutoInfo[Veh][cPos][2]);
GetVehicleZAngle(Veh,AutoInfo[Veh][cPos][3]);

}

L0ndl3m
30.12.2015, 17:22
Паблик OnPlayerStateChange как раз-таки должен срабатывать.
После того как игрок упал с транспорта проверяйте его текущую анимацию с помощью функции GetPlayerAnimationIndex.

#Jason
30.12.2015, 17:23
Паблик OnPlayerStateChange как раз-таки должен срабатывать.
После того как игрок упал с транспорта проверяйте его текущую анимацию с помощью функции GetPlayerAnimationIndex.

можете подробнее с этого места??....

L0ndl3m
30.12.2015, 17:33
Вам понадобится параметр oldstate из паблика OnPlayerStateChange. С помощью его вы проверяете: если в последний раз игрок находился в транспорте, то сравниваем его текущую анимацию, с помощью GetPlayerAnimationIndex.

Как проверять?


if(oldstate == PLAYER_STATE_DRIVER)
{
if(GetPlayerAnimationIndex(playerid) == <ID>) // вместо ID вписываете тот ID, который вам нужен
{
// если игрок упал с транспорта
}
}


Как же узнать этот "ID" ?

Код:


public OnPlayerUpdate(playerid)
{
new
tmp_str[13];

format(tmp_str, sizeof(str), "%i", GetPlayerAnimationIndex(playerid));
SendClientMessage(playerid, -1, tmp_str);
return 1;
}


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

Попробуйте упасть, допустим, с мотоцикла и сразу уйти в AFK ( в режиме AFK паблик OnPlayerUpdate не вызывается ). После этого зайдите в чат-лог и вы увидите в чате последнее выведенное сообщение на сервере, то есть ID анимации падения с мотоцикла.

#Jason
30.12.2015, 18:25
Вам понадобится параметр oldstate из паблика OnPlayerStateChange. С помощью его вы проверяете: если в последний раз игрок находился в транспорте, то сравниваем его текущую анимацию, с помощью GetPlayerAnimationIndex.

Как проверять?


if(oldstate == PLAYER_STATE_DRIVER)
{
if(GetPlayerAnimationIndex(playerid) == <ID>) // вместо ID вписываете тот ID, который вам нужен
{
// если игрок упал с транспорта
}
}


Как же узнать этот "ID" ?

Код:


public OnPlayerUpdate(playerid)
{
new
tmp_str[13];

format(tmp_str, sizeof(str), "%i", GetPlayerAnimationIndex(playerid));
SendClientMessage(playerid, -1, tmp_str);
return 1;
}


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

Попробуйте упасть, допустим, с мотоцикла и сразу уйти в AFK ( в режиме AFK паблик OnPlayerUpdate не вызывается ). После этого зайдите в чат-лог и вы увидите в чате последнее выведенное сообщение на сервере, то есть ID анимации падения с мотоцикла.

Ну спасибо щас пойду проверять

#Jason
01.01.2016, 20:23
Londlem та же самая история


if(oldstate == PLAYER_STATE_DRIVER)
{
if(GetPlayerAnimationIndex(playerid) == 1208)
{
car_ex[car] = true;
GetVehiclePos(car,AutoInfo[car][cPos][0],AutoInfo[car][cPos][1],AutoInfo[car][cPos][2]);
GetVehicleZAngle(car,AutoInfo[car][cPos][3]);
}
}
не помогло..

DeimoS
01.01.2016, 20:32
if(oldstate == PLAYER_STATE_DRIVER) printf("%d", GetPlayerAnimationIndex(playerid));
Посмотрите ID анимации и уже от этих данных пляшите (может просто надо с запозданием проверку делать, а не сразу)

#Jason
02.01.2016, 13:40
if(oldstate == PLAYER_STATE_DRIVER) printf("%d", GetPlayerAnimationIndex(playerid));
Посмотрите ID анимации и уже от этих данных пляшите (может просто надо с запозданием проверку делать, а не сразу)

если с запозданием сделать запишет те координаты где стоит машина а я хочу совсем по другому..

DeimoS
02.01.2016, 14:21
В общем, я решил вникнуть за Вас и выяснилось, что при падении с мотоцикла (именно падении. То бишь при ударе об объект, например) вызывается не только анимация под ID 2108, но и анимация с ID 1203. Я бы ещё проверил ID анимации, когда игрока сбивают с транспорта при аварии с другим игроком. Вы бы уже давно решили проблему, если бы просто взяли и самостоятельно сделали логирование (код я Вам давал. Нужно было лишь его вставить)

#Jason
02.01.2016, 14:39
В общем, я решил вникнуть за Вас и выяснилось, что при падении с мотоцикла (именно падении. То бишь при ударе об объект, например) вызывается не только анимация под ID 2108, но и анимация с ID 1203. Я бы ещё проверил ID анимации, когда игрока сбивают с транспорта при аварии с другим игроком. Вы бы уже давно решили проблему, если бы просто взяли и самостоятельно сделали логирование (код я Вам давал. Нужно было лишь его вставить)

Значит нужно сделать 2 проверки на анимацию? на 2108 и 1203

DeimoS
02.01.2016, 15:10
Значит нужно сделать 2 проверки на анимацию? на 2108 и 1203

А может и не только две и не только на анимации. Тестируйте, проверяйте, дорабатывайте. Или нам за Вас это сделать?

#Jason
02.01.2016, 15:30
А может и не только две и не только на анимации. Тестируйте, проверяйте, дорабатывайте. Или нам за Вас это сделать?

Да нет думал какие либо *конкретные* идеи подадите..

DeimoS
02.01.2016, 19:17
Да нет думал какие либо *конкретные* идеи подадите..

Вам уже дали всё, что нужно. Осталось лишь следовать инструкциям и включить мозги. За более конкретными "идеями" обращайтесь в стол заказов

#Jason
02.01.2016, 20:23
Вам уже дали всё, что нужно. Осталось лишь следовать инструкциям и включить мозги. За более конкретными "идеями" обращайтесь в стол заказов

DemioS а почему в вас столько злости?

Sp1ke
02.01.2016, 20:30
DemioS а почему в вас столько злости?

Какая злость? Вполне адекватный ответ.

#Jason
02.01.2016, 20:32
Какая злость? Вполне адекватный ответ.

Возможно человеку со стороны кажется так а вот лично мне показалось что какая то ненависть в выше написанном.
PS - Возможно я стал параноиком...

^_^
03.01.2016, 01:09
new IsOnBike[MAX_PLAYERS char];
public OnPlayerExitVehicle(playerid, vehicleid)
{
IsOnBike{playerid} = 0;
return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate)
{
new tmp;
if newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER *then
if((tmp = GetVehicleModel(GetPlayerVehicleID(playerid))) == 448 || tmp == 461 || tmp == 462 ||
tmp == 463 || tmp == 468 || tmp == 471 || tmp == 481 || tmp == 509 || tmp == 510 || tmp == 521
|| tmp == 522 || tmp == 523 || tmp == 581 || tmp == 586) IsOnBike{playerid} = 1;
if oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER *then if IsOnBike{playerid} *then{
SendClientMessage(playerid, -1, "Ты упал с байка");
IsOnBike{playerid} = 0;
}
}
Примечания:
1. Проверка срабатывает моментально в момент падения.
2. Проверка работает для всех видах байков.
3. Проверка срабатывает как для водителя, так и для пассажира который упал с байка.
4. Проверка не срабатывает, если игрок сам слез с байка.
5. Проверка срабатывает, если игрока уберут из автомобиля (SetPlayerPos, RemovePlayerFromVehicle).

$continue$
03.01.2016, 03:04
Зачем использовать Пасцаль прибомбасы в Си подобном языке? (Я про оператор *then)



if newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER *then

Мне на секунду показалось, что тут лучше использовать switch?



if((tmp = GetVehicleModel(GetPlayerVehicleID(playerid))) == 448 || tmp == 461 || tmp == 462 ||
tmp == 463 || tmp == 468 || tmp == 471 || tmp == 481 || tmp == 509 || tmp == 510 || tmp == 521
|| tmp == 522 || tmp == 523 || tmp == 581 || tmp == 586) IsOnBike{playerid} = 1;
if oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER *then if IsOnBike{playerid} *then{
}