Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 10 из 10
  1. #1
    Аватар для BadPawn
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    165
    Репутация:
    7 ±

    По поводу автомобильных дверей

    Всем привет.
    Раньше никогда не связывался с автомобилями.

    Вот моя команда:
    PHP код:
    CMD:lock(playerid)
    {
        new
            
    vehicleid GetPlayerVehicleID(playerid),
            
    Float:vehicle_pos_x,
            
    Float:vehicle_pos_y,
            
    Float:vehicle_pos_z;
        
    GetVehiclePos(vehicleidvehicle_pos_xvehicle_pos_yvehicle_pos_z);
        
        if(!
    IsPlayerInRangeOfPoint(playerid3.0vehicle_pos_xvehicle_pos_yvehicle_pos_z))
            return 
    SendClientMessage(playerid, -1,
                
    "* Нет рядом машин.");
                
        if(
    doors_car{vehicleid} == true)
        {
            
    doors_car{vehicleid} = false;
            
    SetVehicleParamsForPlayer(vehicleidplayerid0doors_car{vehicleid});
            
    GameTextForPlayer(playerid"~w~Vehicle ~g~Unlocked"20001);
        }
        else
        {
            
    doors_car{vehicleid} = true;
            
    SetVehicleParamsForPlayer(vehicleidplayerid0doors_car{vehicleid});
            
    GameTextForPlayer(playerid"~w~Vehicle ~r~Locked"20001);
        }
        return 
    true;

    Ребят, подскажите, легонько подтолкните в нужное русло.

    Нужно сделать отлично команду /lock, закрытие\открытие автомобиля. Как ключи дать фракции от своих машин, это вторая проблема уже, но мне же, нужно, что бы я подошел к двери автомобиля, ввел команду, и если ключи у меня есть то открыл дверь, если нету, он напишет мол у тебя нет ключей от авто, ты чего дубина. :) и в таком духе.

  2. #2
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Ну во-первых у тебя /lock работает только для транспорта,в котором ты сидишь.Стоит разделить этот блок на 2 с соответствующей проверкой.Когда ты не за рулем, находишь ближайшую машину(алгоритм довольно простой) и изменяешь состояние замков на противоположенное.А про ключи,так это просто: делаешь проверку на нахождение данных ключей у игрока.Например,в массив игрока добавь одно поле, в котором будет хранится id транспорта,от которого у данного игрока ключи(или массив,если хочешь,чтобы игрок одновременно владел большим кол-ом ключей).Я не знаю как ты хочешь реализовать систему получения ключей,думаю,что сам разберешься.А в команде /lock проверяй if(PlayerInfo[playerid][pVehKey] == vehicleid) {} (пример).



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  3. Пользователь сказал cпасибо:
    BadPawn (10.02.2016)
  4. #3
    Аватар для BadPawn
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    165
    Репутация:
    7 ±
    да, точно. :) по другому не знаю, как сделать. сделал, как знаю, но теперь уверенно могу сказать, что открыть закрыть работает точно. :))

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


    я близко:
    PHP код:
    stock GetSearchVehicle(playeridFloat:distance)
    {
        new
            
    Float:vehicle_pos_x,
            
    Float:vehicle_pos_y,
            
    Float:vehicle_pos_z,
            
    search = -1;
            
        foreach(
    Vehiclevehicleid)
        {
            
    GetVehiclePos(vehicleidvehicle_pos_xvehicle_pos_yvehicle_pos_z);
            if(
    search == -1)
            {
                
    search vehicleid;
                 
    distance GetPlayerDistanceFromPoint(playeridvehicle_pos_xvehicle_pos_yvehicle_pos_z);
            }
              else if(
    GetPlayerDistanceFromPoint(playeridvehicle_pos_xvehicle_pos_yvehicle_pos_z) < distance)
              {
                   
    search vehicleid;
                 
    distance GetPlayerDistanceFromPoint(playeridvehicle_pos_xvehicle_pos_yvehicle_pos_z);
            }
        }
        return 
    search;

    С использованием инклуда от DC.

    использование простое:
    название_функции(ид, дистанция в округе)
    Последний раз редактировалось BadPawn; 10.02.2016 в 07:01.

  5. #4
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Ещё тут можно заюзать перебор каров от DC, чтобы быстрее работала функция.
    Клац


    //By DeimoS: Так же не стоит создавать переменные внутри циклов, ибо каждую итерацию такая переменная сначала будет создаваться, а потом уничтожаться. Стэк вам спасибо явно не скажет за это :3
    Последний раз редактировалось DeimoS; 10.02.2016 в 01:55.
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  6. Пользователь сказал cпасибо:
    BadPawn (10.02.2016)
  7. #5
    Аватар для BadPawn
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    165
    Репутация:
    7 ±
    Всем спасибо.

    Сложно, и времени не мало потратил, но сделал.
    Может кому пригодится:

    функция на ближайший авто в округе:
    PHP код:
    GetSearchVehicle(playeridFloat:distance)
    {
        new
            
    Float:vehicle_pos_x,
            
    Float:vehicle_pos_y,
            
    Float:vehicle_pos_z,
            
    Float:pos_veh,
            
    search_vehicle INVALID_VEHICLE_ID;

        foreach(
    Vehicleveh)
        {
            
    GetVehiclePos(vehvehicle_pos_xvehicle_pos_yvehicle_pos_z);
            
    pos_veh GetPlayerDistanceFromPoint(playeridvehicle_pos_xvehicle_pos_yvehicle_pos_z);
            
            if(
    pos_veh <= distance)
                
    search_vehicle veh,
                
    distance pos_veh;
        }
        return 
    search_vehicle;


    Команда DC_CMD:
    PHP код:
    CMD:lock(playerid)
    {
        new
            
    vehicleid GetPlayerVehicleID(playerid);

        if(
    vehicleid == 0vehicleid GetSearchVehicle(playerid3.0);
        if(
    vehicleid == INVALID_VEHICLE_ID)
            return 
    SendClientMessage(playerid, -1,
                
    "Далеко от машины");

        if(
    doors_car{vehicleid} == true)
            
    doors_car{vehicleid} = false,
            
    SetVehicleParamsForPlayer(vehicleidplayerid0doors_car{vehicleid});
        else
            
    doors_car{vehicleid} = true,
            
    SetVehicleParamsForPlayer(vehicleidplayerid0doors_car{vehicleid});
            
        
    SendClientMessage(playerid0xA9A9A9AAdoors_car{vehicleid} ? ("* Закрыли дверь.") : ("* Открыли дверь."));
        return 
    true;

    Спасибо за помощь.

    Создание переменной убрал, форич DC по скану всех авто.
    Последний раз редактировалось BadPawn; 10.02.2016 в 14:31. Причина: исправил код

  8. Пользователь сказал cпасибо:
    Wise (12.02.2016)
  9. #6
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от BadPawn Посмотреть сообщение
    Всем спасибо.

    Сложно, и времени не мало потратил, но сделал.
    Может кому пригодится:

    функция на ближайший авто в округе:
    PHP код:
    GetSearchVehicle(playeridFloat:distance)
    {
        new
            
    Float:vehicle_pos_x,
            
    Float:vehicle_pos_y,
            
    Float:vehicle_pos_z,
            
    Float:pos_veh,
            
    search_vehicle INVALID_VEHICLE_ID;

        foreach(
    Vehicleveh)
        {
            
    GetVehiclePos(vehvehicle_pos_xvehicle_pos_yvehicle_pos_z);
            
    pos_veh GetPlayerDistanceFromPoint(playeridvehicle_pos_xvehicle_pos_yvehicle_pos_z);
            
            if(
    pos_veh <= distance && veh != INVALID_VEHICLE_ID)
                
    search_vehicle veh,
                
    distance pos_veh;
        }
        return 
    search_vehicle;


    Команда DC_CMD:
    PHP код:
    CMD:lock(playerid)
    {
        new
            
    vehicleid GetPlayerVehicleID(playerid);

        if(
    vehicleid == 0vehicleid GetSearchVehicle(playerid3.0);
        if(
    vehicleid == INVALID_VEHICLE_ID)
            return 
    SendClientMessage(playerid, -1,
                
    "Далеко от машины");

        if(
    doors_car{vehicleid} == true)
            
    doors_car{vehicleid} = false,
            
    SetVehicleParamsForPlayer(vehicleidplayerid0doors_car{vehicleid});
        else
            
    doors_car{vehicleid} = true,
            
    SetVehicleParamsForPlayer(vehicleidplayerid0doors_car{vehicleid});
            
        
    SendClientMessage(playerid0xA9A9A9AAdoors_car{vehicleid} ? ("* Закрыли дверь.") : ("* Открыли дверь."));
        return 
    true;

    Спасибо за помощь.

    Создание переменной убрал, форич DC по скану всех авто.
    А разве нужна проверка на существования транспорта?(veh != INVALID_VEHICLE_ID)
    foreach проходит по уже существующему транспорту?!



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  10. #7
    Аватар для BadPawn
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    165
    Репутация:
    7 ±
    на знал, буду иметь ввиду. исправил.

    как закрыть двери при спавне каров? добавил в onvehiclespawn следующее:
    PHP код:
    doors_car{vehicleid} = true
    Эффект 0.

  11. #8
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    А разве нужна проверка на существования транспорта?(veh != INVALID_VEHICLE_ID)
    Функция SetVehicleParamsEx автоматически проверяет на наличие транспорта в игре. Для перехода к следующей итерации, вам, соответственно, понадобится оператор continue. (если это цикл)

    Цитата Сообщение от BadPawn Посмотреть сообщение
    как закрыть двери при спавне каров? добавил в onvehiclespawn следующее:
    PHP код:
    doors_car{vehicleid} = true
    Эффект 0.
    Вы обновляете только переменную, но не значение в игре.

      Открыть/закрыть
    PHP код:
    CMD:lock(playeridparams[])
    {
        new 
    vehicleid;
        if ((
    vehicleid GetSearchVehicle(playerid3.0)) == INVALID_VEHICLE_ID)
            return 
    SendClientMessage(playerid, -1, !"Вы далеко от своей машины!");
        
    SetVehicleParamsForPlayer(vehicleidplayerid0doors_car{playerid}
            ? 
    doors_car{playerid} = true
            
    doors_car{playerid} = false);
        
    SendClientMessage(playerid, -1,
            
    doors_car{playerid}
            ? (!
    "* Закрыли дверь.")
            : (!
    "* Открыли дверь."));
        return 
    1;


  12. Пользователь сказал cпасибо:
    BadPawn (10.02.2016)
  13. #9
    Аватар для BadPawn
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.01.2016
    Адрес
    Приморье, Спасск-Дальний
    Сообщений
    165
    Репутация:
    7 ±
    PHP код:
    SetVehicleParamsForPlayer(vehicleidplayerid0doors_car{vehicleid}); 
    Это не то? Вначале обновляю переменную, а потом значение самой переменной считываю в SetVehicleParamsForPlayer

  14. #10
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от BadPawn Посмотреть сообщение
    PHP код:
    SetVehicleParamsForPlayer(vehicleidplayerid0doors_car{vehicleid}); 
    Это не то? Вначале обновляю переменную, а потом значение самой переменной считываю в SetVehicleParamsForPlayer
    Вроде бы нельзя закрывать машины при их спавне.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •