Mavi (10 ноября 2020 - 22:34) писал:
На пассажирское сиденье, да, но только если сел именно в задние сиденья. Чувак, который сядет рядом с шофером, его не трогаю.
А второе условие...
else if(PlayerVehicleID[playerid] > 0 && GetPlayerInterior(playerid) != COMPARTMENT_INT_ID)
Это для водителя и пассажира с переднего салона, которые если вдруг выйдут из машины (ведь их надо будет удалить из итератора). newstate == PLAYER_STATE_ONFOOT && oldstate == PLAYER_STATE_PASSENGER не катит, потому что если делать так, то такое условие так же сработает, когда я тпну игрока из задних сидений в инту, а мне нужно затронуть только водителя и переднего пассажира.
Это всё здорово, но повторяю - сейчас твой код срабатывает вообще во всех случаях: и когда игрок спавнится, и когда игрок переходит в режим слежки, и когда игрок умирает. Именно поэтому я тебе и предлагаю добавить проверки, при которых всякие переменные и прочие проверки из твоего кода будут срабатывать только для тех состояний, для которых они предназначены.
Суть тех условий, которые я предлагаю добавить, не в том, чтоб какие-то из твоих проверок заменить ими, а в том, чтоб твой код не срабатывал всякий вызов OnPlayerStateChange. Сам по себе код, при этом, не изменится. Просто добавится проверка, которая будет отсекать твой код от лишних срабатываний.
UPD: В общем, я имею ввиду подобный код
public OnPlayerStateChange(playerid, newstate, oldstate) { switch(newstate) { case PLAYER_STATE_PASSENGER, PLAYER_STATE_DRIVER: { new vehicleid = GetPlayerVehicleID(playerid); if(vehicleid > 0) { new model = GetVehicleModel(vehicleid); if(IsModelTruck(model)) { if(GetPlayerVehicleSeat(playerid) >= REAR_SEAT_ID) { switch(model) { case CAR_ENFORCER: { SetPlayerPos(playerid, InteriorPositions[0][0], InteriorPositions[0][1], InteriorPositions[0][2]); } case CAR_AMBULANCE: { SetPlayerPos(playerid, InteriorPositions[1][0], InteriorPositions[1][1], InteriorPositions[1][2]); } default: { SetPlayerPos(playerid, InteriorPositions[2][0], InteriorPositions[2][1], InteriorPositions[2][2]); } } SetPlayerInterior(playerid, COMPARTMENT_INT_ID); SetPlayerVirtualWorld(playerid, vehicleid); SetPlayerFacingAngle(playerid, 180.00); SetCameraBehindPlayer(playerid); } PlayerVehicleID[playerid] = vehicleid; Iter_Add(TruckPassengers[vehicleid], playerid); SendClientMessage(playerid, COLOR_GREY, VEHICLE_ENTER_MSG); return 1; } } } default: { switch(oldstate) { case PLAYER_STATE_PASSENGER, PLAYER_STATE_DRIVER: { if(PlayerVehicleID[playerid] > 0 && GetPlayerInterior(playerid) != COMPARTMENT_INT_ID) { Iter_Remove(TruckPassengers[PlayerVehicleID[playerid]], playerid); PlayerVehicleID[playerid] = 0; } } } } } return 1; }
Ну и да: лучше сделай названия глобальных переменных более уникальными. Ибо если кто-то решит твой код вставить в мод или реализовать его в виде инклуда - у него могут начаться проблемы с совпадением имён.
Сообщение отредактировал DeimoS: 11 ноября 2020 - 11:39