Пикапы входа/выхода

Dmitriy Makarov

25.05.2021
Автор темы
Проверенный
2,478
1,113
Привет. Столкнулся с проблемой. Создал 2 пикапа, все нормально, отображаются. Встаю на пикап входа - ТПшит в интерьер, как и должно. Встаю на пикап выхода - ничего не происходит.
Вроде бы все нормально. Может я что-то упустил?
C++:
new AdminHouse[2]; // В начале


// OnGameModeInit{}
AdminHouse[0] = CreatePickup(1318, 1, 1123.3806, -2036.9662, 69.8873, 0);
AdminHouse[1] = CreatePickup(1318, 1, 2324.4653, -1149.2155, 1050.7101, 2);


// public OnPlayerPickUpPickup(playerid, pickupid)
if(pickupid == AdminHouse[0]) // Пикап входа
{
    SetPlayerVirtualWorld(playerid, 2); // Меняю вирт. мир на 2, так как второй пикап(выход) там
    SetPlayerInterior(playerid, 12); // Меняю интерьер на 12
    SetPlayerPos(playerid, 2324.5569, -1146.3953, 1050.7101); // Меняю свои координаты и ставлю их в 12 доме
    SetPlayerFacingAngle(playerid, 360); // Поворот игрока, чтобы прямо смотрел
    SetCameraBehindPlayer(playerid); // Чтобы камера в спину смотрела
}
if(pickupid == AdminHouse[1]) // Пикап выхода
{
    SetPlayerVirtualWorld(playerid, 0); // Вирт. мир должен измениться на 0 (основной который)
    SetPlayerInterior(playerid, 0); // Выход из интерьера (улица)
    SetPlayerPos(playerid, 1127.0104, -2036.7456, 69.8838); // Позиции где-то у входа в дом
    SetPlayerFacingAngle(playerid, 270); // Поворот игрока
    SetCameraBehindPlayer(playerid); // Камера в спину
}
Вроде делаю все правильно. Вход работает, выход - нет.
Смотрел еще чужие моды, там так же.
 
  • Вау
Реакции: qdIbp

Mavi_

Новичок
7
15
Эм... По коду все нормально, даже вставил у себя, нормально тпшит и в инту и на улицу.
Попробуй подключить crashdetect и скомпилировать под ключом -d3. Если в консоли появится информация об ошибке, кинь сюда (если сам не разберешься).
 
Последнее редактирование:

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
Не наблюдаю какой-либо ошибки, которая могла бы приводить к описанным последствиям, описанным в теме, но хотел бы дать рекомендацию касательно оптимизации кода. Если я буду не прав, надеюсь меня поправят люди с большим опытом, если здесь таковые имеются. Я бы рекомендовал проверять ID пикапов не просто через набор условных операторов IF, как это сделано у тебя в коде, а добавить конструкцию ELSE IF. При большом количестве пикапов подобная схема должна куда быстрее обрабатывать PUBLIC и переходить к другим задачам. Вряд ли это поможет добиться колоссальных успехов, но всё же станет немного легче.
 

Dmitriy Makarov

25.05.2021
Автор темы
Проверенный
2,478
1,113
Эм... По коду все нормально, даже вставил у себя, нормально тпшит и в инту и на улицу.
Попробуй подключить crashdetect и скомпилировать под ключом -d3. Если в консоли появится информация об ошибке, кинь сюда (если сам не разберешься).
crashdetect есть давно уже.)
Не работает.
Не наблюдаю какой-либо ошибки, которая могла бы приводить к описанным последствиям, описанным в теме, но хотел бы дать рекомендацию касательно оптимизации кода. Если я буду не прав, надеюсь меня поправят люди с большим опытом, если здесь таковые имеются. Я бы рекомендовал проверять ID пикапов не просто через набор условных операторов IF, как это сделано у тебя в коде, а добавить конструкцию ELSE IF. При большом количестве пикапов подобная схема должна куда быстрее обрабатывать PUBLIC и переходить к другим задачам. Вряд ли это поможет добиться колоссальных успехов, но всё же станет немного легче.
else if после первого if'a везде использовать надо? Или как в Lua, когда проверяешь определенное "что-то"? Я просто к Lua привык.
C++:
if(pickupid == AdminHouse[0])
    {
          SetPlayerVirtualWorld(playerid, 2);
        SetPlayerInterior(playerid, 12);
        SetPlayerPos(playerid, 2324.5569, -1146.3953, 1050.7101);
        SetPlayerFacingAngle(playerid, 360);
         SetCameraBehindPlayer(playerid);
    }
    else if(pickupid == AdminHouse[1])
    {
          SetPlayerVirtualWorld(playerid, 0);
        SetPlayerInterior(playerid, 0);
        SetPlayerPos(playerid, 1127.0104, -2036.7456, 69.8838);
        SetPlayerFacingAngle(playerid, 270);
         SetCameraBehindPlayer(playerid);
    }
    // return true - Это после if'ов.
Так пробовал - не работает. Сори за табуляю. У меня в коде нормальная она.
 

Mavi_

Новичок
7
15
else if после первого if'a везде использовать надо
Смотря что вам нужно. Конкретно в данной ситуации - да (желательно).
Ну тогда уж реально не знаю, точно этот код без никаких изменений работал у меня... Почекай плагины или не знаю уже.... И на всякий убеждайся, что крашдетект варнинги выносит в консоль, а не в отдельный файл, может их есть, но только не в консоли... (в server.cfg запись "crashdetect filename").
 

Dmitriy Makarov

25.05.2021
Автор темы
Проверенный
2,478
1,113
Смотря что вам нужно. Конкретно в данной ситуации - да (желательно).
Ну тогда уж реально не знаю, точно этот код без никаких изменений работал у меня... Почекай плагины или не знаю уже.... И на всякий убеждайся, что крашдетект варнинги выносит в консоль, а не в отдельный файл, может их есть, но только не в консоли... (в server.cfg запись "crashdetect filename").
Я тоже считаю, что проблема в каких-то файлах. Но в каких именно - без понятия.
1592338598931.png

Есть у меня еще 2 пикапа, помимо них, но они информационные. На ЖДЛС и АВЛС 2 пикапа
1592338715505.png

Вот такие вот, жёлтенькие.
Они работают нормально, что один, что второй.
 

_Benya_

Участник
82
37
Не наблюдаю какой-либо ошибки, которая могла бы приводить к описанным последствиям, описанным в теме, но хотел бы дать рекомендацию касательно оптимизации кода. Если я буду не прав, надеюсь меня поправят люди с большим опытом, если здесь таковые имеются. Я бы рекомендовал проверять ID пикапов не просто через набор условных операторов IF, как это сделано у тебя в коде, а добавить конструкцию ELSE IF. При большом количестве пикапов подобная схема должна куда быстрее обрабатывать PUBLIC и переходить к другим задачам. Вряд ли это поможет добиться колоссальных успехов, но всё же станет немного легче.
Если очень много пикапов входа/выхода, то лучше воспользоваться циклом for, массивом. Это сэкономит кучу пространства в коде, нежели обычные проверки if else. Да и в целом, у автора так же не используется стример, что тоже не есть хорошо. Всё что в Samp'e имеет огран, лучше использовать через стример.

Пример:

C#:
new pickups[3];
pickups[0] = CreateDynamicPickup(1318, 23, 333, 333, 333, 0, 0, -1);
pickups[1] = CreateDynamicPickup(1318, 23, 222, 222, 222, 0, 0, -1);
pickups[2] = CreateDynamicPickup(1318, 23, 333, 333, 333, 0,0 , -1);



enum PickupAct  {
    Float:pTPX, // Коорда Х
    Float:pTPY, // Коорда Y
    Float:pTPZ, // Коорда Z
    Float:pTPFacingAngle,  // FacingAngle
    pTPVirtualWorld, // VirtalWorld
    pTPInterior // Interior
};


new pickupsAct[3][PickupAct] = {
    {444.0, 444.0, 444.0, 360.0, 10, 2},
    {555.0, 555.0, 444.0, 360.0, 12, 3},
    {666.0, 666.0, 444.0, 360.0, 13, 3}
};



public OnPlayerPickUpDynamicPickup(playerid, pickupid)
{
    for (new i; i < 3; i++);
    {
        if (pickupid == pickups[i])
        {
            SetPlayerPos(playerid, pickupsAct[i][pTPX], pickupsAct[i][pTPY], pickupsAct[i][pTPZ]);
            SetPlayerVirtualWorld(playerid, pickupsAct[i][pTPVirtualWorld]);
            SetPlayerInterior(playerid, pickupsAct[i][pTPInterior])
            SetPlayerFacingAngle(playerid, pickupsAct[i][pTPFacingAngle]);
            SetCameraBehindPlayer(playerid);
        }
    }

    return 1;
}

Разумеется всё можно сделать еще практичней и по другому, но как пример сойдет.