PDA

Просмотр полной версии : [Вопрос] Аренда трейлера для дальнобойщиков



MARVEL
06.11.2017, 20:43
Делаю аренду трейлеров для дальнобойщиков и столкнулся с некоторыми трудностями. Сама идея заключается в том, чтоб трейлер, который арендовал один игрок, не смог взять другой игрок, чтоб он отцеплялся от его трака, если он его, все таки, прицепил. И еще, если у игрока уже есть арендованный трейлер, то он не сможет подцепить другой трейлер, чтоб у него выводилось сообщение, типа "Вы уже арендуете трейлер" и он так-же отцеплялся. Так вот, суть в том, что не могу додуматься как такое реализовать правильно. Делал через ежесекундный таймер для игрока, но там после проверок и ретурнов таймер прекращает обновляться, ибо реализован так:



public OnPlayerConnect(playerid)
{
player_timer_ID[playerid] = SetTimerEx("@_OnPlayerTimer", 1000, false, "i", playerid);
return true;
}

@_OnPlayerTimer(playerid);
@_OnPlayerTimer(playerid)
{
player_timer_ID[playerid] = SetTimerEx("@_OnPlayerTimer", 1000, false, "i", playerid);
return true;
}


Но если сделать таймер цикличным, то тогда игроку будет флудить текстом, если он прицепит не свой трейлер и будет как-то криво отцепляться, то есть, отцепляется трейлер только раза с десятого.

Вот код аренды в таймере:


if(pInfo[playerid][pTruckVehicle] != -1 // Если арендован грузовик
&& GetPlayerVehicleID(playerid) == pInfo[playerid][pTruckVehicle] // Сидит ли игрок в арендованном грузовике
&& IsTrailerAttachedToVehicle(GetPlayerVehicleID(playerid))) // Прицеплен ли трейлер к грузовику
{
new vehicleid = GetPlayerVehicleID(playerid),
trailerid = GetVehicleTrailer(vehicleid);

if(trailerid >= trucker_trailer[0] && trailerid <= trucker_trailer[1]) // Если прицеплен определенный трейлер, то проходит дальше
{
if(GetPVarInt(playerid, !"rent_trucker_trailer") && GetPVarInt(playerid, !"rent_trucker_trailer") != trailerid)
{
SendErrorMessage(playerid, "У Вас уже есть трейлер, который Вы арендуете!");
return DetachTrailerFromVehicle(vehicleid);
} // Если есть арендованный трейлер, но прицеплен не он

foreach(new i: players_truckers)
{
if(GetPVarInt(i, "rent_trucker_trailer") == trailerid && i != playerid)
{
SendErrorMessage(playerid, "Данный трейлер уже арендуют!");
return DetachTrailerFromVehicle(vehicleid);
}
} // Если прицепленный трейлер уже кто-то арендует.

if(GetPVarInt(playerid, !"rent_trucker_trailer")
&& GetPVarInt(playerid, !"rent_trucker_trailer") == trailerid
) return true; // Если есть арендованный трейлер и прицеплен он

if(GetMoney(playerid) < 750)
{
SendErrorMessage(playerid, "У Вас недостаточно средств для аренды трейлера!");
return DetachTrailerFromVehicle(vehicleid);
} // Если недостаточно средств для аренды

Dialog_Open(playerid, Dialog:DLG_TRAILER_RENT, DIALOG_STYLE_MSGBOX,
!""C_WHITE"Аренда трейлера",
!"\n\
"C_WHITE"Вы желаете арендовать данный трейлер?\n\
- Стоимость аренды: "C_MONEY"$750",
!"Да", !"Отмена"
);
}
}


Прощу прощения, что, возможно, что-то плохо объяснил, но как смог. :)

KrutoyKrosch
07.11.2017, 04:40
Так вроде же есть колбек который вызывается когда трейлер прицеплен. Не?

http://wiki.sa-mp.com/wiki/OnTrailerUpdate
http://wiki.sa-mp.com/wiki/OnUnoccupiedVehicleUpdate

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

А таймер не обновляется потому что return возвращает и таймер новый в конце не создается. Делай тогда возврат таймера -

return player_timer_ID[playerid] = SetTimerEx(!"@_OnPlayerTimer", 1000, false, !"i", playerid);

MARVEL
07.11.2017, 14:17
Так вроде же есть колбек который вызывается когда трейлер прицеплен. Не?

http://wiki.sa-mp.com/wiki/OnTrailerUpdate
http://wiki.sa-mp.com/wiki/OnUnoccupiedVehicleUpdate

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

А таймер не обновляется потому что return возвращает и таймер новый в конце не создается. Делай тогда возврат таймера -

return player_timer_ID[playerid] = SetTimerEx(!"@_OnPlayerTimer", 1000, false, !"i", playerid);

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

DeimoS
07.11.2017, 18:02
У тебя какая-то каша из pVar, которые тут вообще не нужны. Всё, что тебе нужно - это один массив для хранения ID игрока у трейлера с количеством ячеек равным числу трейлеров.

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

KrutoyKrosch
08.11.2017, 11:40
Так отцепляй прицеп и телепортируй его немного дальше от машины (узнаешь корды машины в которой игрок, ставишь их прицепу только +20 к X или Y, там проверку поворота машины просто сделай (можно заморочиться и сделать cos + sin, но сложно), помню тоже когда-то такое делал.

MARVEL
08.11.2017, 22:22
Так отцепляй прицеп и телепортируй его немного дальше от машины (узнаешь корды машины в которой игрок, ставишь их прицепу только +20 к X или Y, там проверку поворота машины просто сделай (можно заморочиться и сделать cos + sin, но сложно), помню тоже когда-то такое делал.
Уже пробовал и такой вариант, немного кривовато все получалось, но получалось. Так что попробую заморочиться над этим вариантом, наверное.