Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Взаимодействие с объектом + пример

faraday.

Эксперт
Регистрация
15 Окт 2015
Сообщения
1,667
Лучшие ответы
77
Репутация
1,008
Награды
1
Есть стандартная функция GetPlayerCameraTargetObject(playerid); в этом уроке расскажу как можно c помощью этой функции улучшить работу шахтера или любой другой функционал, на который хватит фантазии.

Необходимо в OnPlayerConnect подключить наведение камеры.


C++:
EnablePlayerCameraTarget(playerid, 1);
Мы рассмотрим более лучший вариант, чем предлагает wiki sa-mp.

Ко всем new добавим:


C++:
new    target_object;
    player_target_object[MAX_PLAYERS];
Подключим таймер в OnPlayerConnect
C++:
SetTimerEx("PlayerTimerTargetObject", 1_000, false, "i", playerid);
player_target_object[playerid] = INVALID_OBJECT_ID;//и зададим значение для подключаемых игроков
Создадим объект в OnGameModeInit:
C++:
target_object = CreateObject(3931, 0.0, 0.0, 3.5,0.000000,0.000000,0.000000); // Камень на нулевых координатах

И создадим каллбэк с функционалом (с уже включенным на него таймером):

C++:
forward PlayerTimerTargetObject(playerid);
public PlayerTimerTargetObject(playerid)
{
    new
        objectid = GetPlayerCameraTargetObject(playerid);//Для DynamicObject - GetPlayerCameraTargetDynObject(playerid);

    if(objectid == INVALID_OBJECT_ID) { // Если objectid = INVALID_OBJECT_ID т.е не смотрит
        if(player_target_object[playerid] != INVALID_OBJECT_ID) //И таргет был задействован ранее
            player_target_object[playerid] = INVALID_OBJECT_ID; //Выдаем 0xFFFF/INVALID_OBJECT_ID

    }
    if (objectid == target_object && IsPlayerInRangeOfPoint(playerid, 5.0,0.0, 0.5, 3.5)) { //Если нацелились на объект и находимся в радиусе 5.0
        new str[64];
        format(str, sizeof str, "Вы нацелились на объект %d", objectid);
        SendClientMessage(playerid, -1, str);
        player_target_object[playerid] = objectid; //Выдаем ID объекта в переменную персонажу
    }

    SetTimerEx("PlayerTimerTargetObject", 1_000, false, "i", playerid); //перезапускаем таймер
    return 1;
}
Готово.

Мы установили таймер с обновлением в одну секунду, т.е посмотрев только на объект созданный вами (target_object) вам выдаст сообщение с iD объекта.
Примечание: Не обязательно запускать таймер в OnPlayerConnect, можно создавать при допустим устройстве на работу, и отключать при увольнение (создав для него отдельную переменную)


Пример функционала с взаимодействием удара по нему (в данном примере кулаком):
Зададим объект состояние на 100, при ударе отнимаем 25, после 4 ударов объект Destroy.

C++:
//Вставить код из урока + заменить public timer_target_object()

new
    object_health = 100;

forward timer_target_object(playerid);
public timer_target_object(playerid)
{
    new
        objectid = GetPlayerCameraTargetObject(playerid);

    if(objectid == INVALID_OBJECT_ID) { // Если objectid = INVALID_OBJECT_ID т.е не смотрит
        if(player_target_object[playerid] != INVALID_OBJECT_ID) //И таргет был задействован ранее
            player_target_object[playerid] = INVALID_OBJECT_ID; //Выдаем 0xFFFF/INVALID_OBJECT_ID

    }
    if (objectid == target_object && IsPlayerInRangeOfPoint(playerid, 5.0,0.0, 0.5, 3.5)) { //Если нацелились на объект и находимся в радиусе 5.0
        new str[64];
        format(str, sizeof str, "Вы нацелились на объект %d Состояние: %d%", objectid, object_health);
        SendClientMessage(playerid, -1, str);
        player_target_object[playerid] = objectid; //Выдаем ID объекта в переменную персонажу
    }

    SetTimerEx("timer_target_object", 1_000, false, "i", playerid); //перезапускаем таймер
    return 1;
}


public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if(newkeys & KEY_FIRE && player_target_object[playerid] != INVALID_OBJECT_ID) {
        SendClientMessage(playerid, -1, "Вы ударили объект на который нацелены");
        object_health -= 25;
        if(object_health == 0) {
            SendClientMessage(playerid, -1, "Вы разбили камень");
            DestroyObject(target_object);
            player_target_object[playerid] = INVALID_OBJECT_ID;
        }
    }

    return 1;
}

Для визуализации, что можно сделать после просмотра урока:
 
Последнее редактирование:
Сверху Снизу