• 0

[закрыто] Таймер не останавливается при посадке в авто

Вопросы

Sergey_Turner
Освоившийся

И снова здравствуйте.

Стоит система на прекращение аренды транспорта. Если игрок находился за пределами машины более 2-х минут, но если игрок садится в авто, система всё ещё думает что игрок не в авто и по завершению таймера авто пропадает. Как можно завершить работу таймера при условии что игрок уже в авто? ( Без использования паблика OnPlayerStateChange, т.к. выход из авто у меня в палике - OnPlayerExitVehicle(playerid, vehicleid) )

 

Этот вопрос задал @Jawn в прошлой теме, но я в тот момент не придавал этому значения.

Поделиться сообщением


Ссылка на сообщение

4 ответа на этот вопрос

  • 0
Cawfee
Великий Гуру

Смотрите, какая ситуация.

 

В OnPlayerExitVehicle, то есть при выходе игрока из транспорта, при выполнении определенных условий (ну, игрок кем-то там работает и в данный момент осуществляет доставку) осуществляется запуск таймера на 2 минуты, в течение которых игрок должен вернуться в автомобиль (иначе автомобиль респавнится). Собственно внутри таймера и реализован алгоритм респавна автомобиля.

 

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

  1. Использовать OnPlayerEnterVehicle. Это такая же стандартная функция, вызывающаяся при посадке игрока в автомобиль. Правда работа с ней, если мне не изменяет память, порождает одну проблему: функция вызывается, когда вы нажимаете на кнопку, чтобы сесть в автомобиль (по умолчанию F). Но это не гарантирует, что вы сядете в него. Вполне возможно, в момент анимации посадки игрока кто-нибудь убьет, в результате чего работа будет возобновлена и функция OnPlayerExitVehicle не будет вызвана, что сделает игрока все еще работающим, но находящимся в автомобиле. Но лучше это перепроверить.
  2. В функции, которая будет вызвана таймером спустя 2 минуты, проверить, вернулся ли игрок в тот самый вариант. Вариант, конечно, не самый хороший, но достаточно простой. Проверить, находится ли конкретный игрок в конкретном автомобиле, можно с помощью IsPlayerInVehicle.
  3. В OnPlayerStateChange, которая вам не симпатизирует. Пропускаю этот вариант.

Учитывая все вышесказанное, наверное, самое просто - прибегнуть ко второму варианту. То есть внутри цикла необходимо проверить, находится ли игрок в своем рабочем автомобиле. Находится? Замечательно, ничего не делаем, пусть дальше работает. Нет? Ну, значит пишем ему, что работа окончена, и отправляем автомобиль на респавн.

 

Тогда в функции, обрабатывающей условие выхода работающего игрока из автомобиля, следует написать примерно следующее:

if(DostavCC[playerid] >= 1) {
	if(ArendaDostavCar[playerid] == 1) {
		SCM(playerid,-1,"{FF0000}[Информация]{FFFFFF} Вы вышли из транспорта! У вас есть {FF0000}2 минуты{FFFFFF} чтобы вернуться обратно!");
		SCM(playerid,-1,"{FF0000}[Информация]{FFFFFF} В противном случае ваша работа будет {FF0000}завершена{FFFFFF)!");
		SetTimerEx("ExitVehicleCC", 10000, false, "ii", playerid, vehicleid);
	}
}

То есть используем SetTimerEx, функцию создания таймера, вызывающего функцию с некоторыми параметрами. И параметрами этой функции станут ID игрока, который покинул автомобиль, и ID автомобиля.

 

Код таймера в таком случае примет следующей вид:

forward ExitVehicleCC(playerid, vehicleid);
public ExitVehicleCC(playerid, vehicleid) {
	if (IsPlayerInVehicle(playerid, vehicleid)) {
		// все, игрок уже вернулся в автомобиль
		// ничего не делаем, из функции выходим
		return 0;
	}
	
	// если игрок все еще не вернулся в тот автомобиль	
	SetVehicleToRespawn(vehicleid);
	SCM(playerid,-1,"{FF0000}[Информация] {FFFFFF}Вас небыло в транспорте более {FF0000}2-х минут{FFFFFF}. Работа {FF0000}окончена{FFFFFF}!");
	return 1;
}

Вообще хочу вам предложить попробовать изменить свой подход к написанию систем. Думайте не о том, как это будет выглядеть в коде, а об алгоритмах. Попытайтесь сначала продумать алгоритм, как это должно выглядеть абстрактно, не думайте о различных функций и callback-ах.

 

Например. Я хочу написать систему, которая будет респавнить рабочий автомобиль в случае, если игрок, работающий на этом автомобиле, вышел из него и не вернулся в течение двух минут. Что для этого нужно?

  1. Отследить, что нужный нам игрок вышел из нужного нам автомобиля. То есть нужно как-то определить выход игрока из автомобиля, а затем проверить, работает ли он вообще в данный момент. Ибо покинуть автомобиль может кто угодно, необязательно работающий игрок.
  2. Как только возникла нужная ситуация, надо начать отсчет двух минут, по истечении которых будем либо ничего не делать, либо возвращать автомобиль на свое начальное место.
  3. Прошло две минуты? Проверяем, находится ли игрок в рабочем автомобиле. Находится? Отлично, все, ничего не делаем. Иначе - пишем ему, что работа закончена, автомобиль возвращаем на место.

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Daf
      От Daf
      Здравствуйте, сливаю вам cef спидометр! 
      Автор: я
       
      pawn код
      CEF. Создайте текстовый файл с любым названием, но добавьте расширение .html. Затем вставьте в него код, который приведен ниже.
      отдельно индикаторы
      cef_execute_js(playerid, browser, "samp.updateIndicators({left: 0, right: 1, highbeam: 0})"); cef_execute_js(playerid, browser, "samp.updateIndicators({left: 0, right: 1, highbeam: 0})");  
    • Lipsi
      От Lipsi
      Здравствуйте! 
       
      Я ищю людей мапперов скриптеров и так далее! 
       
       Плата будет но не сразу
       
      Связь со мной: 
      ВК - https://vk.ru/lipsi_den
      Тг- @Lipsi_den4ik
      Вконтакте обязательно должен быть у вас! 
       
       
    • grall758
      От grall758
      ищу добровольных ребят которые готовы принять свое участие в развитии масштабного крмп проекта, и заложить свою работу в наш проект. Обязательно предоставляется возможность карьерного роста и получения новых знаний. 
       
      ВСЕ КТО ЗА ИНТЕРЕСОВАН В РОСТЕ ПРОЕКТА ПИШИТЕ:
      телеграмм - @grall758
      дискорд - @grallchik758
       
      желательно когда пишите сразу уточняйте свою направленность.
    • KAIF HOST
      От KAIF HOST
      Если вы ищете надежный, стабильный и бюджетный хостинг для ваших серверов SAMP или CRMP, то KAIF-HOST.RU - лучший выбор для вас. Мы молодая компания среди игровых хостингов, но мы гарантируем стабильность и безопасность вашего сервера.
       
      Мы предлагаем защиту от TCP SYN и UDP флуда, а также от Spoofing атак. Мы также обеспечиваем защиту на уровнях L3, L4 и L7.
       
      Наши преимущества включают автоподнятие серверов после падения, удобную панель управления сервером и автоматическую установку сервера. Мы также гарантируем быструю техническую поддержку для всех наших клиентов.
       
       
       
      Наши серверы доступны всего от 20 рублей в месяц, что делает нас одним из самых доступных хостингов на рынке.
       
       
       
       
       
       Ссылки:
       
      Сайт kaif-host.ru
      Панель управления lk.kaif-host.ru
      Группа ВКонтакте https://vk.com/kaif_host_official
       
      P.s Промокод #pawnorus даст тебе скидку в размере 20%

    • Hunter Wright
      От Hunter Wright
          Large-Host - Предоставляем услуги профессионального дешевого игрового хостинга и самую удобную панель управления.

      — Защита от DDoS-атак
      — Техническая поддержка работает для вас 24/7
      — Быстрый доступ в панель управления и личный кабинет
      — Быстрая переустановка игрового сервера в любое время суток  
      — Редактирование конфигурационных файлов игрового сервера 
      — FTP доступ к файлам игрового сервера
      — Изменение количества слотов игрового сервера 
      — Система управления счетами и оплаты услуг
      — Большое количество всех возможных платежных систем
      — Бесплатная MySQL база данных — Автоустановка модов, есть как бесплатные моды, так и платные моды — У нас есть услуги, где вы можете заказать, установку мода, смену названия и т.д
      — Предоставляется доступ к firewall для блокировки злоумышленников   Тарифные планы (на данный момент): — GTA: SA-MP 0.3.7 - от 20р / месяц — GTA: CR-MP 0.3e - от 20р / месяц — GTA: CR-MP 0.3.7 - от 20р / месяц   Ссылки на хостинг и социальные сети: Сайт хостинга - Перейти на сайт хостинга Группа во ВКонтакте - Перейти в группу во ВКонтакте Группа тех.поддержки во ВКонтакте - Перейти в группу во ВКонтакте
      Телеграм канал хостинга - Перейти в телеграм YouTube канал хостинга - Перейти на YouTube канал
      Почта тех.поддержки - support@large-hosting.ru