Просмотр полной версии : [Вопрос] Проверка
Здравствуйте уважаемые пользователи 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]);
}
Паблик OnPlayerStateChange как раз-таки должен срабатывать.
После того как игрок упал с транспорта проверяйте его текущую анимацию с помощью функции GetPlayerAnimationIndex.
Паблик OnPlayerStateChange как раз-таки должен срабатывать.
После того как игрок упал с транспорта проверяйте его текущую анимацию с помощью функции GetPlayerAnimationIndex.
можете подробнее с этого места??....
Вам понадобится параметр 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 анимации падения с мотоцикла.
Вам понадобится параметр 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 анимации падения с мотоцикла.
Ну спасибо щас пойду проверять
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]);
}
}
не помогло..
if(oldstate == PLAYER_STATE_DRIVER) printf("%d", GetPlayerAnimationIndex(playerid));
Посмотрите ID анимации и уже от этих данных пляшите (может просто надо с запозданием проверку делать, а не сразу)
if(oldstate == PLAYER_STATE_DRIVER) printf("%d", GetPlayerAnimationIndex(playerid));
Посмотрите ID анимации и уже от этих данных пляшите (может просто надо с запозданием проверку делать, а не сразу)
если с запозданием сделать запишет те координаты где стоит машина а я хочу совсем по другому..
В общем, я решил вникнуть за Вас и выяснилось, что при падении с мотоцикла (именно падении. То бишь при ударе об объект, например) вызывается не только анимация под ID 2108, но и анимация с ID 1203. Я бы ещё проверил ID анимации, когда игрока сбивают с транспорта при аварии с другим игроком. Вы бы уже давно решили проблему, если бы просто взяли и самостоятельно сделали логирование (код я Вам давал. Нужно было лишь его вставить)
В общем, я решил вникнуть за Вас и выяснилось, что при падении с мотоцикла (именно падении. То бишь при ударе об объект, например) вызывается не только анимация под ID 2108, но и анимация с ID 1203. Я бы ещё проверил ID анимации, когда игрока сбивают с транспорта при аварии с другим игроком. Вы бы уже давно решили проблему, если бы просто взяли и самостоятельно сделали логирование (код я Вам давал. Нужно было лишь его вставить)
Значит нужно сделать 2 проверки на анимацию? на 2108 и 1203
Значит нужно сделать 2 проверки на анимацию? на 2108 и 1203
А может и не только две и не только на анимации. Тестируйте, проверяйте, дорабатывайте. Или нам за Вас это сделать?
А может и не только две и не только на анимации. Тестируйте, проверяйте, дорабатывайте. Или нам за Вас это сделать?
Да нет думал какие либо *конкретные* идеи подадите..
Да нет думал какие либо *конкретные* идеи подадите..
Вам уже дали всё, что нужно. Осталось лишь следовать инструкциям и включить мозги. За более конкретными "идеями" обращайтесь в стол заказов
Вам уже дали всё, что нужно. Осталось лишь следовать инструкциям и включить мозги. За более конкретными "идеями" обращайтесь в стол заказов
DemioS а почему в вас столько злости?
DemioS а почему в вас столько злости?
Какая злость? Вполне адекватный ответ.
Какая злость? Вполне адекватный ответ.
Возможно человеку со стороны кажется так а вот лично мне показалось что какая то ненависть в выше написанном.
PS - Возможно я стал параноиком...
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{
}
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot