Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • OPG PROJECT

    Группа ВК

    По-настоящему хороший сервер с уникальным модом! 
     Заходи к нам,тебе тут понравится!
  • 0
BorizzK

Сделать паузу между выводами сообщений в чат

Как бы в цикле сделать задержку 3-5 сек между выводами сообщений в чат

вывелось 2 строки

задержка 3 сек

вывелось еще 2 строки

снова задержка

 

Нужно для скана обьектов и вывода в чат обнаруженных

int radius = cData.ToInt();
array<Object> nearest_objects = new array<Object>;
array<CargoBase> proxy_cargos = new array<CargoBase>;
Object object;
string className;
if (radius > 0 && radius <= 120)
{
	GetGame().GetObjectsAtPosition(AdminPosition, radius, nearest_objects, proxy_cargos);
	for ( int chk = 0; chk < nearest_objects.Count(); chk++ )
	{
		object = nearest_objects.Get(chk);
		className = object.GetType();
		if (className)
		{
				string Msg1 = "Obj:" + chk + ":" + className;
		}
		else
		{
				Msg1 = "Obj:" + chk + ":" + object.ToString();
		}
		string Msg2 = "Pos:" + chk + ":" + object.GetPosition().ToString();
												
		Msgparam = new Param1<string>(Msg1); 
		Msgparam1 = new Param1<string>(Msg2); 
		GetGame().RPCSingleParam(playerAdmin, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, playerAdmin.GetIdentity());
		GetGame().RPCSingleParam(playerAdmin, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam1, true, playerAdmin.GetIdentity());
		Print("::: AdminMod.c ::: /check ::: " + Msg1);
		Print("::: AdminMod.c ::: /check ::: " + Msg2);
												
		//Тут бы придумать задержку, что бы между выводом в чат инфо по каждому обьекту проходило 2-3 сек...
  		//это не работает
		float wt0 = 0.00;
		while (wt0 < 36000 )
		{
			wt0 = wt0 + 0.01;
            
		}
											
	}
}

если их много то слишком быстро выводятся (((

 

Share this post


Link to post
Share on other sites

Recommended Posts




  • 0

BorizzK а если слать инфу через

GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater({имя функции}, {через сколько выполнить}, false); 

где будет вызываться отдельная функция, которая будет в чат сообщения писать?

Т.е. скажем первые 2 отправить через пол секунды, следующие 2 и до конца с временем +2 секунды?

Share this post


Link to post
Share on other sites
  • 0

123new Как раз пришел к этому
Как раз сейчас пишу функцию с контролем ее выполнения извне

Возможно интересная штука выходит

 

Share this post


Link to post
Share on other sites
  • 0
В 27.11.2018 в 11:08, BorizzK сказал:

Как бы в цикле сделать задержку 3-5 сек между выводами сообщений в чат

if ( (GetGame().GetTime() - cv_TimeStamp) > 3000 )

Share this post


Link to post
Share on other sites
  • 0

BorizzK Что тебя удивляет? Наличие событий OnEachFrame или OnUpdate ? Или религия не позволяет, создать свой класс, унаследоваться от другого, перекрыть событие подходящее, и внутри использовать счетчик в мс?

Share this post


Link to post
Share on other sites
  • 0

NoNameUltima его не удивляет, его пугает. Пугает неизвестность, того что должно быть дальше после этого условия. Вопрос был в том как сделать задержку отправки сообщений. Условия мы все умеем ставить, а вот саму задержку...

Share this post


Link to post
Share on other sites
  • 0

NoNameUltima Ты не умничай ))) Ты пальцем покажи :relaxed:
И класс бы не хотелось пока

В класс потом оформить не проблема

 

 

 

Share this post


Link to post
Share on other sites
  • 0

BorizzK В данном случае, в принципе и calllater подойдет... Даже скорее я был не прав, что велосипед получится. - Если именно в чат с задержкой и одному игроку, то - да. Тупо класс, со строками, интервалом, и приватную переменную наращивать внутри выполняемой процедуры. И по переменной, выводить строки из массива.

Share this post


Link to post
Share on other sites
  • 0

NoNameUltima Что ток не делал
Любая задержка игнорится

 

Передаю массив с данными в функцию

 

Мне в цикле в выборке из массива надо задержку

Хрен

 

Идея...

 

Устроить ожидание в цикле по системным часам

GetHourMinuteSecond(hour, minute, second);

Получаем секунды

 

ну а дальше.. чет как-то

 

нужно забирать секунды в цикле

сравнивать и ... вобщем завтра ченить придумаю

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

BorizzK получить секунды и т.п. это все ерунда. Саму задержку по известным секундам как будешь делать то?

Share this post


Link to post
Share on other sites
  • 0

123new 

Я как то делал чтот такое на фортране для ес, тк там то же не было sleep итп

И секунды брал именно системные

Давно это было правда

Вобщем попробую

 

 

 

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

123new нет

Идея связана с циклом

На входе текущие секунды

И преобразование

А полезным действием внутрях будет какойнить Get...

Ща с тела

Вечером буду дежурить а цод, накатаю идейку

 

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Не было времени

Попробовал втупую

 

	int sleep(int w_time)
	{
		int w_ticktime = GetGame().GetTickTime();
		int w_sleep = w_ticktime + w_time;
		while (w_ticktime <  w_sleep)
		{
			w_ticktime = GetGame().GetTickTime();
		}
		return w_ticktime;
	}

 

и в цикле после каждого сообщения вызываю

 

int w_time = sleep(5);

 

хрена лысого

 

сначала отрабатывает весь цикл с паузами
вывод в лог, он действительно идет через паузы

 

а потом все сообщения скопом летят в чат

видно они в буфере накапливаются

 

идиотизьм тля

 

	int radius = cData.ToInt();
	array<Object> nearest_objects = new array<Object>;
	array<CargoBase> proxy_cargos = new array<CargoBase>;
	Object object;
	string className;
	if (radius > 0 && radius <= maxCheckRadius)
	{
		GetGame().GetObjectsAtPosition(AdminPosition, radius, nearest_objects, proxy_cargos); //ВНИМАНИЕ! БОЛЬШОЙ РАДИУС ГРУЗИТ СЕРВЕР!!!
		for ( int chk = 0; chk < nearest_objects.Count(); chk++ )
		{
			object = nearest_objects.Get(chk);
			className = object.GetType();
			if (className)
			{
				string Msg1 = "Obj:" + chk + ":" + className;
			}
			else
			{
				Msg1 = "Obj:" + chk + ":" + object.ToString();
			}
			string Msg2 = "Pos:" + chk + ":" + object.GetPosition().ToString();
			Msgparam = new Param1<string>(Msg1); 
			Msgparam1 = new Param1<string>(Msg2); 
			GetGame().RPCSingleParam(PlayerAdmin, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, PlayerAdmin.GetIdentity());
			GetGame().RPCSingleParam(PlayerAdmin, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam1, true, PlayerAdmin.GetIdentity());
			Print("::: AdminMod.c ::: /check ::: :" + GetGame().GetTickTime() + ": Msg1: " + Msg1);
			Print("::: AdminMod.c ::: /check ::: :" + GetGame().GetTickTime() + ": Msg2: " + Msg2);
			
			int w_time = sleep(5);
		}
		nearest_objects.Debug();
		proxy_cargos.Debug();
	}
	else
	{
		Msgparam = new Param1<string>("Parameter error!");
		GetGame().RPCSingleParam(PlayerAdmin, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, PlayerAdmin.GetIdentity());
	}

 

 

 

 

Share this post


Link to post
Share on other sites
  • 0
5 часов назад, BorizzK сказал:

идиотизьм тля

В чем идиотизм? Ты взял и в основном потоке, вместо нормальных пропусков по таймеру, сделал велосипед - т.к. sleep в основном потоке не допустим*с оговорками(а уж тем более как ни крути VCL потоке, пусть и 3D), а ты взял и добавил цикл, который не являясь по факту задержкой, не был проигнорирован движком(в арме той же тебе бы выдало not allow suspend in main thread). т.е. вместо нормального подхода попробовал использовать уязвимость движка. и подвесил его...

В итоге имеешь, то что имеешь - подвесив VCL (визуальную часть), ты потом удивляешься, а почему это у тебя все сообщения приходят скопом...

 

Все задержки зависят от конкретной задачи.

В данном случае, тебе никто не мешает создать массив, в него добавлять сообщения необходимые выводить в чат.

Банальщина -
 

class ChatMessage
	{
		private	string	cv_Message	=	"";
		private	int		cv_Interval	=	1;
		private	bool	cv_Repeat	=	false;
		
		void ChatMessage(v_Message, v_Interval, v_Repeat)
			{
				cv_Message	=	v_Message;
				cv_Interval	=	v_Interval;
				cv_Repeat	=	v_Repeat;
			}
			
		string Message()
			{ return cv_Message; }
			
		int Interval()
			{ return cv_Interval; }
			
		bool Repeat()
			{ return cv_Repeat; }
			
	}

class DelayChatMessage
	{
		private ref array<ref ChatMessage>	cv_ArrayChatMessage		=	new array<ref ChatMessage>;
		private		int						cv_Iterator				=	0;
		private		int						cv_I					=	0;
		
		void DelayChatMessage()
			{
				cv_ArrayChatMessage	=	new array<ref ChatMessage>;
				cv_Iterator			=	0;
				GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.Timer, 1000, true);
			}
			
		void ~DelayChatMessage()
			{
				GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).Remove(this.Timer);
			}
		
		void Timer()
			{
				for ( cv_I = cv_ArrayChatMessage.Count() - 1; cv_I >= 0; cv_I-- )
					{
						if ( cv_Iterator % cv_ArrayChatMessage[cv_I].Interval() == 0 )
							{
								Print( cv_ArrayChatMessage[cv_I].Message() );
								if ( !cv_ArrayChatMessage[cv_I].Repeat() )
									{ cv_ArrayChatMessage.Remove(v_I); }
							}
					}
				cv_Iterator++;
			}
			
		void AddMessage(string v_Message, int v_Interval, bool v_Repeat)
			{ cv_ArrayChatMessage.Insert( new ChatMessage(v_Message, v_Interval, v_Repeat) ); }

	}
	
ref DelayChatMessage cv_DelayChatMessage	=	new DelayChatMessage();
cv_DelayChatMessage.AddMessage("Тест1", 5, true);	//	Сообщение каждые 5с
cv_DelayChatMessage.AddMessage("Тест2", 15, false);	//	Сообщение через 15с, один раз

P.S. И тут менеджер сообщений имеет не совсем чОткую временную итерацию, т.к. время еще уходит на пробежку по массиву.

Хочешь большей четкости, заноси в класс сообщения - время добавления(время последнего вывода). Таймер поставь на обработку каждую 0.1с, и пробегаясь по массиву, сравнивай не итератор по модулю, а сохраненное время. И если отличие более чем задано в интервале - выводи сообщение, изменяй время в классе сообщения, - если установлен повтор, или попросту удаляй, если повтор не нужен.

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Вариант со сравнением времени:

class ChatMessage
	{
		private	string	cv_Message		=	"";
		private	int		cv_Interval		=	1;
		private	int		cv_TimeStamp	=	GetGame().GetTime();
		private	bool	cv_Repeat		=	false;
		
		void ChatMessage(v_Message, v_Interval, v_Repeat)
			{
				cv_Message		=	v_Message;
				cv_Interval		=	v_Interval;
				cv_Repeat		=	v_Repeat;
			}
			
		string Message()
			{ return cv_Message; }
			
		int Interval()
			{ return cv_Interval; }
			
		int GetTimeStamp()
			{ return cv_TimeStamp; }
			
		void SetTimeStamp()
			{ cv_TimeStamp	=	GetGame().GetTime(); }
			
		bool Repeat()
			{ return cv_Repeat; }
			
		
			
	}

class DelayChatMessage
	{
		private ref array<ref ChatMessage>	cv_ArrayChatMessage		=	new array<ref ChatMessage>;
		private		int						cv_I					=	0;
		
		void DelayChatMessage()
			{
				cv_ArrayChatMessage	=	new array<ref ChatMessage>;
				cv_Iterator			=	0;
				GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.Timer, 100, true);
			}
			
		void ~DelayChatMessage()
			{
				GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).Remove(this.Timer);
			}
		
		void Timer()
			{
				cv_TimeStamp	=	GetGame().GetTime();
				for ( cv_I = cv_ArrayChatMessage.Count() - 1; cv_I >= 0; cv_I-- )
					{
						if ( (GetGame().GetTime() - cv_ArrayChatMessage[cv_I].GetTimeStamp()) > cv_ArrayChatMessage[cv_I].Interval() )
							{
								Print( cv_ArrayChatMessage[cv_I].Message() );
								if ( !cv_ArrayChatMessage[cv_I].Repeat() )
									{ cv_ArrayChatMessage.Remove(v_I); }
								else
									{ cv_ArrayChatMessage[cv_I].SetTimeStamp(); }
							}
					}
			}
			
		void AddMessage(string v_Message, int v_Interval, bool v_Repeat)
			{ cv_ArrayChatMessage.Insert( new ChatMessage(v_Message, v_Interval, v_Repeat) ); }

	}
	
ref DelayChatMessage cv_DelayChatMessage	=	new DelayChatMessage();
cv_DelayChatMessage.AddMessage("Тест1", 5, true);	//	Сообщение каждые 5с
cv_DelayChatMessage.AddMessage("Тест2", 15, false);	//	Сообщение через 15с, один раз

 

Share this post


Link to post
Share on other sites
  • 0

NoNameUltima это не то что мне нужно

Про арму

В вызванной через  spawn функции sleep работал прекрасно

 

Мне то нужно

Массив каждый раз разный по размеру и содержимому

От 1 обьекта до 100

Нужно В ЦИКЛЕ проходить массив и делать паузу между обработкой каждого элемента

Элементарно же

Но нет...

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0
12 минуты назад, BorizzK сказал:

Вообще то sleep, моя функция

Штатной нет в природе

чо внатуре?) ну ок)

А это наверное мираж(регистрозависимость) -

Sleep( 0.01 );

 

11 минуту назад, BorizzK сказал:

В вызванной через  spawn

Ты через строку читаешь? spawn - не main thread

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Sleep и sleep разные вещи, ты согласен?

Короче я понял о чем ты ведешь речь

 

Попробую подойти к решению твоим способом

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

BorizzK тупо:

void Send_Message_chat_after_time(string Message, int time)
{
	Print(GetRealDateTime() + " [Send_Message_Time_Wait] GETTED Message: '" + Message + "' time: '" + time.ToString() + "'");
	if ((Message != "") && (time > -1))
	{
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(Send_Message_chat, (time * 1000), false,Message,5);
	}
}
void Send_Message_chat(string Message, int Channel)
{
	if (Message != "")
	{
		GetGame().ChatPlayer(Channel, Message);
		Print(GetRealDateTime() + " [Send_Message_Time_Wait] Send Message: '" + Message + "'");
	}
}

и добавление в нужном месте вызова:

Send_Message_chat_after_time("TEST STROKA", 10);

например, в конце функции Main в init.c

Результат после старта сервера:

SCRIPT       : 03.12.2018_11.11.09 [Send_Message_Time_Wait] GETTED Message: 'TEST STROKA' time: '10'
SCRIPT       : 03.12.2018_11.11.21 [Send_Message_Time_Wait] Send Message: 'TEST STROKA'

P.S. Функция 'GetRealDateTime()' у меня просто возвращает текущее время и дату в формате для логов.

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Miduznya
      Как сделать стартовый лут на сервере???
    • By BorizzK
      Автор я
      На основе наработок комьюнити, на основе идей DaOne
       
      Мучайте
      P.S. Так же там есть доп функционал - для вызовов из класса миссии
      P.S.2. Инструкция (на англ) внутрях
       
       

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
    • By Alex39
      Прописал скрипт, серверные сообщение, вроде как работают, но есть косяки, может кто подскажет в чем проблема,
      override void OnInit() { GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(NumPlayersOnServer, 30000, true); // 30 seconds } void NumPlayersOnServer() { ref array<Man> players = new array<Man>; GetGame().GetPlayers( players ); int numPlayers = players.Count(); for( int i=0; i < players.Count(); ++i ) { Man player = players.Get(i); if( player ) { string messPlayers = "Players on the server: " + numPlayers.ToString(); Param1<string> m_MessageParam = new Param1<string>(messPlayers); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); } } }
       
      Проблема пропадание трейдера, админ тулз из за этого скрипта
       
      override void OnInit() { GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(NumPlayersOnServer, 30000, true); // 30 seconds }  
    • By 123new
      В данной теме мы с вами научимся создавать простой скрипт, который позволит выводить в чат объявления о количестве игроков.
       
      Нам понадобится:
      1. Сервер DayZ 1.0, сделанный по одному из гайдов:
      2. Notepad++
      3. Немножечко трезвого ума
       
      Приступим:
      1. Открываем Mpmissions - dayzOffline.chernarusplus - init.c
      2. В самом начале файла добавляем:
      #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\PlayersMessagesCount.c" Находим функцию
      void main() и перед ее закрывающей скобкой "}"добавляем:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(SendPlayersCount, CountPlayers_TIME_InfoPlayers_Repeat, true); 3. Помещаем в папку файл
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Либо создаем вручную этот файл с именем "PlayersMessagesCount.c" и заполняем его следующим текстом:
      int CountPlayers_TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) string Message_Chat = "Online Players: "; void SendPlayersCount() { array<Man> players = new array<Man>; GetGame().GetPlayers( players ); int numbOfplayers = players.Count(); if( numbOfplayers > 0 ) { foreach(Man player: players) { CountPlayers_SendPersonalMessage(Message_Chat + numbOfplayers.ToString(), player); } // GetGame().ChatPlayer(0,Message_Chat + numbOfplayers.ToString()); } } void CountPlayers_SendPersonalMessage(string message, Man player) { if(( player ) && (message != "")) { Param1<string> m_GlobalMessage = new Param1<string>(message); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_GlobalMessage, true, player.GetIdentity()); } } 4. Настраиваем файл как нам нужно. Т.е. в строке
      int CountPlayers_TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) указываем время повтора вывода сообщений в чат (поумолчанию стоит 2 минуты)
      и текст сообщений в переменной
      string Message_Chat = "Online Players: ";  
      P.S. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
       
    • By 123new
      В данной теме мы с вами научимся создавать простой скрипт, который позволит выводить в чат объявления о количестве игроков.
       
      Нам понадобится:
      1. Сервер DayZ 0.63, сделанный по одному из гайдов:
      2. Notepad++
      3. Немножечко трезвого ума
       
      Приступим:
      1. Открываем Mpmissions - dayzOffline.chernarusplus - init.c
      2. В самом начале файла добавляем:
      #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\PlayersMessagesCount.c" И после строки
      weather.SetWindFunctionParams(0, 0, 0); добавляем:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(SendPlayersCount, TIME_InfoPlayers_Repeat, true); Пример:

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

      3. Помещаем в папку файл Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Либо создаем вручную этот файл с именем "PlayersMessagesCount.c" и заполняем его следующим текстом:
      int TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) string Message_Chat = "Online Players: "; void SendPlayersCount() { array<Man> players = new array<Man>; GetGame().GetPlayers( players ); int numbOfplayers = players.Count(); if( numbOfplayers > 0 ) { GetGame().ChatPlayer(0,Message_Chat + numbOfplayers.ToString()); } } 4. Настраиваем файл как нам нужно. Т.е. в строке
      int TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) указываем время повтора вывода сообщений в чат (поумолчанию стоит 2 минуты)
      и текст сообщений в переменной
      string Message_Chat = "Online Players: ";  
      P.S. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
       
×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.