faraday.
Эксперт
Есть стандартная функция
Необходимо в OnPlayerConnect подключить наведение камеры.
Мы рассмотрим более лучший вариант, чем предлагает wiki sa-mp.
Ко всем new добавим:
Подключим таймер в OnPlayerConnect
Создадим объект в OnGameModeInit:
И создадим каллбэк с функционалом (с уже включенным на него таймером):
Готово.
Мы установили таймер с обновлением в одну секунду, т.е посмотрев только на объект созданный вами (target_object) вам выдаст сообщение с iD объекта.
Примечание: Не обязательно запускать таймер в OnPlayerConnect, можно создавать при допустим устройстве на работу, и отключать при увольнение (создав для него отдельную переменную)
Пример функционала с взаимодействием удара по нему (в данном примере кулаком):
Зададим объект состояние на 100, при ударе отнимаем 25, после 4 ударов объект Destroy.
Для визуализации, что можно сделать после просмотра урока:
GetPlayerCameraTargetObject(playerid);
в этом уроке расскажу как можно c помощью этой функции улучшить работу шахтера или любой другой функционал, на который хватит фантазии.Необходимо в OnPlayerConnect подключить наведение камеры.
C++:
EnablePlayerCameraTarget(playerid, 1);
Ко всем new добавим:
C++:
new target_object;
player_target_object[MAX_PLAYERS];
C++:
SetTimerEx("PlayerTimerTargetObject", 1_000, false, "i", playerid);
player_target_object[playerid] = INVALID_OBJECT_ID;//и зададим значение для подключаемых игроков
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;
}
Для визуализации, что можно сделать после просмотра урока:
Последнее редактирование: