Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
123new

[1.0][KillFeed] Логи, сообщения о смерти, счетчик убийств игроков

Рекомендованные сообщения






44 минуты назад, 123new сказал:

угу как вариант

308351277_.png.3a6712d5e7fb65a3f5478788ef4069b5.png

Заметил если после двоеточие делаеш пробел оно выводится другим цветом

Изменено пользователем MAXILIVE (история изменений)

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


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, MAXILIVE сказал:

308351277_.png.3a6712d5e7fb65a3f5478788ef4069b5.png

Заметил если после двоеточие делаеш пробел оно выводится другим цветом

это уже ваши моды меняют цвет сообщений, скрипт от сервера его не может никак переопределять

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


Ссылка на сообщение
Поделиться на других сайтах
Скрытый текст

if ( itemInHands.IsItemBase() )
								{
									ItemBase item  = ItemBase.Cast(itemInHands);
									string className = item.GetType();
									deathMsg   = killer_name + " убил: " + Player_Name;
									deathMsgDist        =   " с растояния: " + dist.ToString() + "м с " + className + " убийств: " + p_Killer.killscore.ToString();
									
									message_logs = killer_name + "(steam64id=" + k_UID + ",pos=" + position_killer.ToString() + ") kill: " + Player_Name + "(steam64id=" + p_UID + ",pos=" + p_pos + ")" + deathMsgDist + ", " + deathMsgKillScore;
								}
								else
								{
									deathMsg         = killer_name + " убил: " + Player_Name;
									deathMsgDist        = " с растояния: " + dist.ToString() + "m.";
									deathMsgKillScore = killer_name + " убийств: " + p_Killer.killscore.ToString();
									message_logs = killer_name + "(steam64id=" + k_UID + ",pos=" + position_killer.ToString() + ") kill: " + Player_Name + "(steam64id=" + p_UID + ",pos=" + p_pos + ")" + deathMsgDist + ", " + deathMsgKillScore;					
								}

 

Скажи это как я понял либо руками убил либо оружием код

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


Ссылка на сообщение
Поделиться на других сайтах
12 минут назад, MAXILIVE сказал:
  Скрыть содержимое

 



if ( itemInHands.IsItemBase() )
								{
									ItemBase item  = ItemBase.Cast(itemInHands);
									string className = item.GetType();
									deathMsg   = killer_name + " убил: " + Player_Name;
									deathMsgDist        =   " с растояния: " + dist.ToString() + "м с " + className + " убийств: " + p_Killer.killscore.ToString();
									
									message_logs = killer_name + "(steam64id=" + k_UID + ",pos=" + position_killer.ToString() + ") kill: " + Player_Name + "(steam64id=" + p_UID + ",pos=" + p_pos + ")" + deathMsgDist + ", " + deathMsgKillScore;
								}
								else
								{
									deathMsg         = killer_name + " убил: " + Player_Name;
									deathMsgDist        = " с растояния: " + dist.ToString() + "m.";
									deathMsgKillScore = killer_name + " убийств: " + p_Killer.killscore.ToString();
									message_logs = killer_name + "(steam64id=" + k_UID + ",pos=" + position_killer.ToString() + ") kill: " + Player_Name + "(steam64id=" + p_UID + ",pos=" + p_pos + ")" + deathMsgDist + ", " + deathMsgKillScore;					
								}

 

Скажи это как я понял либо руками убил либо оружием код

угу, т.е. если не определилися предмет в руках - он не выдается в сообщение

Изменено пользователем 123new (история изменений)

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


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте, а не подскажите можно ли изменить положение выводимой информации на экран например в левый верхний угол или правый чтобы информация об убийствах не сливалась с чатом ? 

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


Ссылка на сообщение
Поделиться на других сайтах

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

Поумолчанию такого не предусмотрено здесь, т.е. если хотите такое сделать - пишите нехватающее сами.

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


Ссылка на сообщение
Поделиться на других сайтах

Возник вАпрос.

Не могу найти обьект player_obj и еще один если данный обьект не задается не где что выдает в таком случае IF( player_obj )

IF принимает в себя только bool значения как я понял, а как обьект не заданый может дать его?

Сори ток начинаю разбираться в скриптинге)

image.png.46f941d880d15a0482dc33f50ff37eda.png

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


Ссылка на сообщение
Поделиться на других сайтах
8 минут назад, kkac9kk сказал:

Возник вАпрос.

Не могу найти обьект player_obj и еще один если данный обьект не задается не где что выдает в таком случае IF( player_obj )

IF принимает в себя только bool значения как я понял, а как обьект не заданый может дать его?

Сори ток начинаю разбираться в скриптинге)

image.png.46f941d880d15a0482dc33f50ff37eda.png

это объекты, передаваемые в эту функцию при ее вызове. Соответственно будут ли они зависит лишь оттого, что в вызов функции попадает.

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


Ссылка на сообщение
Поделиться на других сайтах

@123new понял, спасибо.

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


Ссылка на сообщение
Поделиться на других сайтах

Hi. Love the script.

 

Only what to do so this shows in one line.

And why my chat is in red ?

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

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


Ссылка на сообщение
Поделиться на других сайтах

Because this is the color of the chat channel to which your message is sent.
If there is a mod for the ShanaGlobalChat chat, then it has the ability to customize the color of messages in these channels.

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


Ссылка на сообщение
Поделиться на других сайтах
On 6/20/2022 at 7:59 AM, 123new said:

Because this is the color of the chat channel to which your message is sent.
If there is a mod for the ShanaGlobalChat chat, then it has the ability to customize the color of messages in these channels.

 

Can text color output can be edited in PlayerBase.c ?

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


Ссылка на сообщение
Поделиться на других сайтах
11.07.2022 в 15:27, Shal3R сказал:

 

Can text color output can be edited in PlayerBase.c ?

serach chat class in scripts.pbo and searct constants for chat messages color with argb data

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


Ссылка на сообщение
Поделиться на других сайтах
class ChatLine
{
	// Consts
	const float FADE_TIMEOUT = 30;
	const float FADE_OUT_DURATION = 3;
	const float FADE_IN_DURATION = 0.5;
	
	private const string RADIO_PREFIX = "(" + "#str_radio" + ") ";
	private const string GAME_PREFIX = "(" + "#layout_chat_game" + ") ";
	private const string ADMIN_PREFIX = "(" + "#STR_MP_MASTER" + ") ";
	private const int 	 DEFAULT_COLOUR = ARGB(255, 255, 255, 255);
	private const int 	 GAME_TEXT_COLOUR = ARGB(255, 255, 255, 0);
	private const int 	 ADMIN_TEXT_COLOUR = ARGB(255, 255, 0, 0);
	
	// Widgets
	Widget							m_RootWidget;
	TextWidget						m_NameWidget;
	TextWidget						m_TextWidget;
	
	private ref WidgetFadeTimer 	m_FadeTimer;
	private ref Timer 				m_TimeoutTimer;

	void ChatLine(Widget root_widget)
	{
		m_RootWidget	= GetGame().GetWorkspace().CreateWidgets("gui/layouts/day_z_chat_item.layout", root_widget);
	
		m_NameWidget	= TextWidget.Cast( m_RootWidget.FindAnyWidget( "ChatItemSenderWidget" ) );
		m_TextWidget	= TextWidget.Cast( m_RootWidget.FindAnyWidget( "ChatItemTextWidget" ) );
		
		m_FadeTimer		= new WidgetFadeTimer;
		m_TimeoutTimer	= new Timer(CALL_CATEGORY_GUI);
	}

	void ~ChatLine()
	{
		delete m_TextWidget;
	}

	void Set(ChatMessageEventParams params)	// Param 1 --> Channel, Param 2 --> sender name, Param 3 --> message, Param 4 ?? 
	{
		int channel; 
		
		m_NameWidget.SetText("");
		m_TextWidget.SetText("");
		
		SetColour(DEFAULT_COLOUR);
		m_RootWidget.Show(true);
		
		channel = params.param1; // 0 = Survior   1 = Game/System   2 = Admin 

		/*
		if (params.param2 != "")
		{
			m_NameWidget.SetText( params.param2 + " : "); 
		}
		
		if( channel & CCSystem )
 		{
			if(params.param2 != "")
			{
				m_NameWidget.SetText(GAME_PREFIX + ": " );
			} 
			SetColour(GAME_TEXT_COLOUR);
 		}
		else if( channel & CCAdmin )
		{
			m_NameWidget.SetText(ADMIN_PREFIX + ": ");
			SetColour(ADMIN_TEXT_COLOUR);			
		}
		else if( channel & CCTransmitter )
		{
			m_NameWidget.SetText(RADIO_PREFIX + params.param2 + " : ");
		}		
		*/
		
		if ( channel & CCSystem )
		{
			// Game
			if (params.param2 != "")
			{
				m_NameWidget.SetText(GAME_PREFIX + ": " );
			} 
			SetColour(GAME_TEXT_COLOUR);
		}
		else if ( channel & CCAdmin )
		{
			// Admin
			m_NameWidget.SetText(ADMIN_PREFIX + ": ");
			SetColour(ADMIN_TEXT_COLOUR);			
		}
		else if ( channel & CCTransmitter )
		{
			// Radio - Trasnmitter
			m_NameWidget.SetText(RADIO_PREFIX + params.param2 + " : ");
		}
		else if ( channel == 0 || channel & CCDirect )
		{
			// Player
			if (params.param2 != "")
			{
				m_NameWidget.SetText(params.param2 + " : ");
			}
		}
		
		
		m_TextWidget.SetText(params.param3);
		
		m_FadeTimer.FadeIn(m_RootWidget, FADE_IN_DURATION);
		m_TimeoutTimer.Run(FADE_TIMEOUT, m_FadeTimer, "FadeOut", new Param2<Widget, float>(m_RootWidget, FADE_OUT_DURATION));
	}
	
	private void SetColour(int colour)
	{
		m_NameWidget.SetColor(colour);
		m_TextWidget.SetColor(colour);
	}

	void Clear()
	{
		m_RootWidget.Show( false );
		m_TimeoutTimer.Stop();
		m_FadeTimer.Stop();
	}
}

After editing scripts.pbo and packing it back it gives me error when connecting to server. shows that scripts.pbo doesent exist or smt.

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Shal3R сказал:

class ChatLine { // Consts const float FADE_TIMEOUT = 30; const float FADE_OUT_DURATION = 3; const float FADE_IN_DURATION = 0.5; private const string RADIO_PREFIX = "(" + "#str_radio" + ") "; private const string GAME_PREFIX = "(" + "#layout_chat_game" + ") "; private const string ADMIN_PREFIX = "(" + "#STR_MP_MASTER" + ") "; private const int DEFAULT_COLOUR = ARGB(255, 255, 255, 255); private const int GAME_TEXT_COLOUR = ARGB(255, 255, 255, 0); private const int ADMIN_TEXT_COLOUR = ARGB(255, 255, 0, 0); // Widgets Widget m_RootWidget; TextWidget m_NameWidget; TextWidget m_TextWidget; private ref WidgetFadeTimer m_FadeTimer; private ref Timer m_TimeoutTimer; void ChatLine(Widget root_widget) { m_RootWidget = GetGame().GetWorkspace().CreateWidgets("gui/layouts/day_z_chat_item.layout", root_widget); m_NameWidget = TextWidget.Cast( m_RootWidget.FindAnyWidget( "ChatItemSenderWidget" ) ); m_TextWidget = TextWidget.Cast( m_RootWidget.FindAnyWidget( "ChatItemTextWidget" ) ); m_FadeTimer = new WidgetFadeTimer; m_TimeoutTimer = new Timer(CALL_CATEGORY_GUI); } void ~ChatLine() { delete m_TextWidget; } void Set(ChatMessageEventParams params) // Param 1 --> Channel, Param 2 --> sender name, Param 3 --> message, Param 4 ?? { int channel; m_NameWidget.SetText(""); m_TextWidget.SetText(""); SetColour(DEFAULT_COLOUR); m_RootWidget.Show(true); channel = params.param1; // 0 = Survior 1 = Game/System 2 = Admin /* if (params.param2 != "") { m_NameWidget.SetText( params.param2 + " : "); } if( channel & CCSystem ) { if(params.param2 != "") { m_NameWidget.SetText(GAME_PREFIX + ": " ); } SetColour(GAME_TEXT_COLOUR); } else if( channel & CCAdmin ) { m_NameWidget.SetText(ADMIN_PREFIX + ": "); SetColour(ADMIN_TEXT_COLOUR); } else if( channel & CCTransmitter ) { m_NameWidget.SetText(RADIO_PREFIX + params.param2 + " : "); } */ if ( channel & CCSystem ) { // Game if (params.param2 != "") { m_NameWidget.SetText(GAME_PREFIX + ": " ); } SetColour(GAME_TEXT_COLOUR); } else if ( channel & CCAdmin ) { // Admin m_NameWidget.SetText(ADMIN_PREFIX + ": "); SetColour(ADMIN_TEXT_COLOUR); } else if ( channel & CCTransmitter ) { // Radio - Trasnmitter m_NameWidget.SetText(RADIO_PREFIX + params.param2 + " : "); } else if ( channel == 0 || channel & CCDirect ) { // Player if (params.param2 != "") { m_NameWidget.SetText(params.param2 + " : "); } } m_TextWidget.SetText(params.param3); m_FadeTimer.FadeIn(m_RootWidget, FADE_IN_DURATION); m_TimeoutTimer.Run(FADE_TIMEOUT, m_FadeTimer, "FadeOut", new Param2<Widget, float>(m_RootWidget, FADE_OUT_DURATION)); } private void SetColour(int colour) { m_NameWidget.SetColor(colour); m_TextWidget.SetColor(colour); } void Clear() { m_RootWidget.Show( false ); m_TimeoutTimer.Stop(); m_FadeTimer.Stop(); } }


class ChatLine
{
	// Consts
	const float FADE_TIMEOUT = 30;
	const float FADE_OUT_DURATION = 3;
	const float FADE_IN_DURATION = 0.5;
	
	private const string RADIO_PREFIX = "(" + "#str_radio" + ") ";
	private const string GAME_PREFIX = "(" + "#layout_chat_game" + ") ";
	private const string ADMIN_PREFIX = "(" + "#STR_MP_MASTER" + ") ";
	private const int 	 DEFAULT_COLOUR = ARGB(255, 255, 255, 255);
	private const int 	 GAME_TEXT_COLOUR = ARGB(255, 255, 255, 0);
	private const int 	 ADMIN_TEXT_COLOUR = ARGB(255, 255, 0, 0);
	
	// Widgets
	Widget							m_RootWidget;
	TextWidget						m_NameWidget;
	TextWidget						m_TextWidget;
	
	private ref WidgetFadeTimer 	m_FadeTimer;
	private ref Timer 				m_TimeoutTimer;

	void ChatLine(Widget root_widget)
	{
		m_RootWidget	= GetGame().GetWorkspace().CreateWidgets("gui/layouts/day_z_chat_item.layout", root_widget);
	
		m_NameWidget	= TextWidget.Cast( m_RootWidget.FindAnyWidget( "ChatItemSenderWidget" ) );
		m_TextWidget	= TextWidget.Cast( m_RootWidget.FindAnyWidget( "ChatItemTextWidget" ) );
		
		m_FadeTimer		= new WidgetFadeTimer;
		m_TimeoutTimer	= new Timer(CALL_CATEGORY_GUI);
	}

	void ~ChatLine()
	{
		delete m_TextWidget;
	}

	void Set(ChatMessageEventParams params)	// Param 1 --> Channel, Param 2 --> sender name, Param 3 --> message, Param 4 ?? 
	{
		int channel; 
		
		m_NameWidget.SetText("");
		m_TextWidget.SetText("");
		
		SetColour(DEFAULT_COLOUR);
		m_RootWidget.Show(true);
		
		channel = params.param1; // 0 = Survior   1 = Game/System   2 = Admin 

		/*
		if (params.param2 != "")
		{
			m_NameWidget.SetText( params.param2 + " : "); 
		}
		
		if( channel & CCSystem )
 		{
			if(params.param2 != "")
			{
				m_NameWidget.SetText(GAME_PREFIX + ": " );
			} 
			SetColour(GAME_TEXT_COLOUR);
 		}
		else if( channel & CCAdmin )
		{
			m_NameWidget.SetText(ADMIN_PREFIX + ": ");
			SetColour(ADMIN_TEXT_COLOUR);			
		}
		else if( channel & CCTransmitter )
		{
			m_NameWidget.SetText(RADIO_PREFIX + params.param2 + " : ");
		}		
		*/
		
		if ( channel & CCSystem )
		{
			// Game
			if (params.param2 != "")
			{
				m_NameWidget.SetText(GAME_PREFIX + ": " );
			} 
			SetColour(GAME_TEXT_COLOUR);
		}
		else if ( channel & CCAdmin )
		{
			// Admin
			m_NameWidget.SetText(ADMIN_PREFIX + ": ");
			SetColour(ADMIN_TEXT_COLOUR);			
		}
		else if ( channel & CCTransmitter )
		{
			// Radio - Trasnmitter
			m_NameWidget.SetText(RADIO_PREFIX + params.param2 + " : ");
		}
		else if ( channel == 0 || channel & CCDirect )
		{
			// Player
			if (params.param2 != "")
			{
				m_NameWidget.SetText(params.param2 + " : ");
			}
		}
		
		
		m_TextWidget.SetText(params.param3);
		
		m_FadeTimer.FadeIn(m_RootWidget, FADE_IN_DURATION);
		m_TimeoutTimer.Run(FADE_TIMEOUT, m_FadeTimer, "FadeOut", new Param2<Widget, float>(m_RootWidget, FADE_OUT_DURATION));
	}
	
	private void SetColour(int colour)
	{
		m_NameWidget.SetColor(colour);
		m_TextWidget.SetColor(colour);
	}

	void Clear()
	{
		m_RootWidget.Show( false );
		m_TimeoutTimer.Stop();
		m_FadeTimer.Stop();
	}
}

After editing scripts.pbo and packing it back it gives me error when connecting to server. shows that scripts.pbo doesent exist or smt.

Don't pack scripts.pbo back. Use the method of modifying the native files and scripts of the game with your modification to change the native classes and constants of the game.

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


Ссылка на сообщение
Поделиться на других сайтах
1 hour ago, 123new said:

Don't pack scripts.pbo back. Use the method of modifying the native files and scripts of the game with your modification to change the native classes and constants of the game.

How much you want to do this for me ?

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


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, Shal3R сказал:

How much you want to do this for me ?

You need to describe in as much detail and more precisely as possible the terms of reference of everything that you want to implement. The amount requested for the implementation of this will depend on the time spent on it. Also, I remind you in advance that payment methods to Russia on MIR cards or KIWI wallet should work for you.

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


Ссылка на сообщение
Поделиться на других сайтах

Приветствую! Подскажите пожалуйста, что сделать, что бы в чате у игрока отображалась информация о количестве убийств? 

На сервере киллфид установлен, работает!! Нужно в чате периодически сообщение!! Спасибо!! 

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


Ссылка на сообщение
Поделиться на других сайтах

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, 123new сказал:

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

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

 

можно просто что бы в течении игры у игрока в чате выскакивала его статистика по убийствам!! например КД , убийства, смерти с интервалом например 10 мин!! 

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


Ссылка на сообщение
Поделиться на других сайтах
10 минут назад, Paylik88 сказал:

 

можно просто что бы в течении игры у игрока в чате выскакивала его статистика по убийствам!! например КД , убийства, смерти с интервалом например 10 мин!! 

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

 

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


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, 123new сказал:

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

 

мне бы сам код!! 

Я не так силен в скриптах, чтобы сам сделать!! 

Да и времени нет столько, что бы это изучить!! 

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


Ссылка на сообщение
Поделиться на других сайтах
34 минуты назад, Paylik88 сказал:

мне бы сам код!! 

Я не так силен в скриптах, чтобы сам сделать!! 

Да и времени нет столько, что бы это изучить!! 

ну тут уже ваши проблемы. Все проблемы и хотелки хотящего - дело рук и ума самого хотящего. (c) здравый смысл.

То что вы хотите в 2 скрипта не делается, тут прямо таки надо покоддить. Так что  при всем желании, тут даже вариант ответа вам с ходу не дашь.

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

image.png.4fcb246ffa66f9444987de0cd7820432.png

Так что я вполне вправе выдать за такое, но пока воздержусь. Все мы все понимаем.

Все что я вам могу посоветовать - или учиться писать самому, или найти того кто вам это сделает, дождаться и заплатить за результат полученного кода.

Я за то, что вы хотите, в близжайший месяц не возьмусь 100%, т.к. мне буквально не хватает времени разобрать то что у меня есть в наличии уже, этак с апреля-мая месяца (да да, именно столько). Так что при всем желании, если не готовы 3-4 месяца ждать в лучшем случае, советую поискать кого-то еще.  

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


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: fedotovyasha
      Хочу немного изменить сообщения перед отправкой клиенту
    • Автор: BorizzK
      Как и обещал выкладываю код и небольшой гайд
       
      Собственно речь о функции загрузки UID и координат из файла в массив m_playersSpawnPoints класса миссии, который в последствии можно исполдьзовать в других функциях в классе миссии
       
      Отступление
      массив m_playersSpawnPoints это массив типа map
      В данном случае <string,string> где и индекс и значение текстовые строки
      индексом выступает записанный UID,  а значением координаты, которые перед использованием преобразуются из текста в vector c помощью функции ToVector()
      Но об этом позже
       
      Раздел 1. Подключение
       
      КОд функции:
      //Players personal spawn points (for new connected players) ref map<string,string> m_playersSpawnPoints = new map<string,string>; void LoadPlayersSpawnPoints() { /* Файл playersSpawnPoints.lst кладем в папку указанную в параметре запуска сервера -profiles= тогда путь будет "$Profile:" или если кладем в файл в mpmissions\dayzOffline.chernarusplus\_CONF путь будет "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\" Путь меняется в переменной m_SettingsPath - "$Profile:" или "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\" Можете указать свой путь, но он должен быть либо в $Profiles: либо в $CurrentDir:\\mpmissions\\dayzOffline.chernarusplus Формат файла: Steam UID в привычном виде 17 цифр Координаты Комментарий (через пробелы) Помните любая ошибка может привести к крашу сервера Не желательны пустые строки! Пример: 76562298156537008 1300 0 5600 Дима 76561998116927209 3000 0 3000 Вася из Новороссийска Про массив: ref map<string, string> m_playersSpawnPoints = new map<string, string>; m_playersSpawnPoints тут массив типа map, где каждый элемент массива состоит из 2х ячеек. 1. Индекс - тип string 2. Значение - тип string Пример работы с массивом типа map Запись в массив m_playersSpawnPoints.Insert("76562298156537008", "1300 0 5600"); //записываем первый элемент - индекс dayz, значение 10 m_playersSpawnPoints.Insert("76561998116927209", "3000 0 3000"); //записываем второй элемент - индекс dayzf, значение 17 Чтение из массива: Получаем значение 0го элемента string m = m_playersSpawnPoints.GetElement(0); // = "1300 0 5600" Получаем индекс 0го элемента string name = m_playersSpawnPoints.GetKey(0); / /= "76562298156537008" Получаем значение по индексу (в данном случае нас интерисует именно ЭТО) string n = m_playersSpawnPoints.Get("76561998116927209"); // = "3000 0 3000" //затем n переводим в вектор Usage in CreateCharacter function for change default spawn position: string PlayerUID = identity.GetPlainId(); if (PlayerUID) { if (m_playersSpawnPoints.Contains(PlayerUID) { pos = m_playersSpawnPoints.Get(PlayerUID).ToVector(); } } */ string FileName = "playersSpawnPoints.lst"; string m_SettingsPath = "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\"; //Folder with config files - .ini or .lst // Or "$Profiles:\\" FileHandle file; string file_line; array<string> read_line; int linecount = 0; //Comments check bool skipline = false; bool skipblock = false; //Comments check file = OpenFile(m_SettingsPath + FileName, FileMode.READ); if (file != 0) { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read File: " + m_SettingsPath + FileName + " :::"); while (FGets(file, file_line) >= 0) { linecount++; //Comments check and skip if (file_line.IndexOfFrom(0,"//") == 0 || file_line.IndexOfFrom(0,"#") == 0 || file_line.IndexOfFrom(0," ") == 0 || file_line.Length() <= 0) { skipline = true; } else { skipline = false; } if (file_line.IndexOfFrom(0,"/*") == 0) { skipblock = true; } else if (file_line.IndexOfFrom(0,"*/") == 0) { skipblock = false; skipline = true; } //Comments check if (!skipline && !skipblock) { read_line = new array<string>; file_line.Split(" ",read_line); if (read_line.Count() >= 4) { if (read_line.Get(0).Length() == 17) { if (read_line.Get(1).ToFloat() > 0 && read_line.Get(3).ToFloat() > 0) { if (!m_playersSpawnPoints.Contains(read_line.Get(0))) { m_playersSpawnPoints.Insert(read_line.Get(0), read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3)); // UID, Position Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Add UID " + read_line.Get(0) + " spawnpoint: " + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + " to m_playersSpawnPoints"); } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID " + read_line.Get(0) + " duplicated, check file!"); } } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Position error: '" + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + "' :::"); } } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID error: " + file_line + " :::"); } } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " have errors: " + file_line + " :::"); } } } CloseFile(file); if (m_playersSpawnPoints.Count() > 0) { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Players personal spawn points count: " + m_playersSpawnPoints.Count() + " :::"); } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Players personal spawn points is not loaded! :::"); } } else { Print("::: Init.c ::: LoadPlayersSpawnPoints() ::: Error open file: " + m_SettingsPath + FileName + " :::"); } } Комментарии, а так же диагностические принты в лог не убираю сознательно
       
      ПОдключение и использование.
       
      Функцию размещаем в теле класса миссии в init.c или если она вынесена в другой файл (и файл подключени через #include) в том самом файле в теле класса миссии
       
      Вот как-то так:
       
      class CustomMission : MissionServer { //Тут разные функции и определение переменных класса... //Вот тут переопределенный штатно OnInit override void OnInit () { //тут его код ) //Тут определяем наш массив и функцию //Players personal spawn points (for new connected players) ref map<string,string> m_playersSpawnPoints = new map<string,string>; void LoadPlayersSpawnPoints() { //тут ее код } //Тут разные функции... }  
      Ну Вы поняли...
       
      Далее нам надо при запуске и инициализации сервера эту функцию выполнить
      Но прежде надо создать файл по нужному пути в котором будут UID'ы и координаты
      В данной редакции используется путь "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\" и имя файла "playersSpawnPoints.lst"
      те в папке mpmissions\dayzOffline.chernarusplus нужно создать папку _CONF и поместить в нее этот файл
      Но вы можете это переделать как Вам больше нравится
       
      Формат файла:
       
      6561198156925007 2698.36 0 5989.59 USER
      6561198156924007 2698.36 0 5989.59 ВАСЯ
       
      6561198156923007 2698.36 0 5989.59 ПЕТЯ
      //Тут комментарий
      /*
      6561193356923001 3698.36 30 5189.59 ПЕТЯ
      */
       
      //Тут комментарий
      #Тут комментарий
       
      Первое поле - позиция - Это Steam UID (17 цифирь)
      2,3,4 поля позиции числа это координаты X Z Y (Z = высота) - если 0 система поставит перса на землю или ближайшую твердую поверхность под ним
      все что дальше игнорится
       
      Можно каментить строки с помощью // , #
      Можно каментить блоки
      /*
      */
       
      Если первый символ в строке пробел, все остальное то же игнорится
      Пустые строки то же игнорятся
       
      Если в строке с UID и координатами ошибка об этом напишет в лог с указанием номера строки
      Если UID дублируется об этом то же напишет в лог
       
      Ок
      Файл создали
       
      Теперь добавим вызов этой функции в тело функции OnInit в классе миссии (про нее речь шла Выше)
      Функция OnInit ВСЕГДА выполняется при запуске сервера
      Внутрь мы добавим вызов LoadPlayersSpawnPoints()
      В итоге при запуске сервера LoadPlayersSpawnPoints() выполнется и запишет в массив m_playersSpawnPoints UID'ы и координат
       
      Добавляем как-то так:
       
      override void OnInit() { //Тут может быть различный код //Тут вызов нашей функции //Load players personal spawn poins LoadPlayersSpawnPoints(); // => m_playersSpawnPoints // "UID", "Position" //Тут может быть различный код }  
      Запустили  сервер и увидели в логе что файл прочитался и все ок
      .... LoadPlayersSpawnPoints() ::: Players personal spawn points count: итд итп
      Или ошибки
      Если ошибки - читаем все еще раз и/или задаем вопросы в теме (НЕ В ЛИЧКЕ!!!) показывая что куда и как Вы прописали
       
      Отлично
      Тормозим в сервер
       
      Продолжение следует минут через 15
       
       
       
       
    • Автор: 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. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
       
    • Автор: 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. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
       
    • Автор: 123new
      Автор скрипта: http://s-platoon.ru/profile/14721-borizzk/
      Все благодарности за этот скрипт непосредственно автору скрипта, не мне!
       
      И так, установка:
      1. Первым делом нам необходим чистый стандартный сервер DayZ (без модов, поскольку моды могу приводить к неработоспособности частей гайда). Установить его можно по инструкции, например, так:
      Замечу сразу, гайд сделан для версии игры 0.63.149525
      2. Заходим в папку 'DTA' и распаковываем с 'PBO-MANAGER' архив 'scripts.pbo', получив папку 'scripts'.
      3. Перемещаем папку 'scripts с' папки 'DTA' в корень папки сервера
      4. Переходим по следующему пути:
      scripts\4_World\Entities\ManBase\PlayerBase.c и открываем файл.
      В самом его начале после кода
      class PlayerBase extends ManBase { добавляем код
      // BY BORIZZ.K, s-platoon.ru (ThX Mizev, NoNameUltima, 123New and DaOne) //MY --- //PLAYER DEATH with MESSAGES START //MY int killscore = 0; // usage p_killer.killscore = p_killer.killscore + 1; // for kills count in EEKilled function. //p_killer must be PlayerBase - use p_killer = PlayerBase.Cast(killer) //See EEKilled function int diescore = 0; // usage Player.diescore = Player.diescore + 1; // for death count in EEKilled function. //Player must be playerbase void Message_PlayerKilled(Object player_obj, Object killer) { //MY --- PlayerBase p_Killer = NULL; // Killer PlayerBase Player = player_obj; // Killed player PlayerIdentity Player_Identity = Player.GetIdentity(); //Killed player Identity string Player_Name = Player_Identity.GetName(); //Killed player name string p_UID = Player_Identity.GetPlainId(); // Killed player UID bool enableSaveKills = true; // enable/disable save kill count to profile/file by Killer UID bool enableSaveDies = true; // enable/disable save death count to profile/file by Player UID if ( GetGame().ServerConfigGetInt("enableSaveKills") == 0 ) //place parameter enableSaveKills = 0; for disable SaveKills to server profile { enableSaveKills = false; } if ( GetGame().ServerConfigGetInt("enableSaveDies") == 0 )//place parameter enableSaveDies = 0; for disable SaveDies to server profile { enableSaveDies = false; } string deathMsg = ""; string deathMsgDist = ""; string deathMsgKillScore = ""; string DebugMessage; Print("::: EEKilled: Debug: Input: killer " + killer.ToString() + " => Class: " + killer.GetType() + ", Player " + Player.ToString() + " => Class: " + Player.GetType()); //DEBUG //Phase #1 if ( killer.IsMan() ) { if ( killer.IsKindOf("SurvivorBase") ) { p_Killer = PlayerBase.Cast(killer); DebugMessage = "killer.IsMan(): killer.IsKindOf('SurvivorBase'): killer " + p_Killer.ToString() + " kill player " + Player.ToString(); //DEBUG } } else { if ( killer.IsItemBase() ) { ItemBase bitem = ItemBase.Cast(killer); p_Killer = PlayerBase.Cast(bitem.GetHierarchyRootPlayer()); DebugMessage = "killer.IsItemBase(): killer " + p_Killer.ToString() + " => " + bitem.ToString() + " kill player " + Player.ToString(); //DEBUG } else { DebugMessage = "killer " + killer.ToString() + " kill player " + Player.ToString(); //DEBUG } } Print("::: EEKilled Debug: " + DebugMessage); //DEBUG //Phase #2 if (p_Killer) { if (Player == p_Killer) { deathMsg = Player_Name + " committed suicide."; } else { PlayerIdentity Killer_Identity = p_Killer.GetIdentity(); string killer_name = Killer_Identity.GetName(); string k_UID = Killer_Identity.GetPlainId(); //Get killer UID vector position_killer = p_Killer.GetPosition(); vector position_player = Player.GetPosition(); int dist = vector.Distance(position_player, position_killer); EntityAI itemInHands = p_Killer.GetHumanInventory().GetEntityInHands(); if (enableSaveKills) { string strkillscore; g_Game.GetProfileString("killscore"+k_UID,strkillscore); if (strkillscore) { Print("::: EEKilled Debug: LoadKills: Killer: " + killer_name + ", loaded killscore: " + strkillscore); //DEBUG p_Killer.killscore = strkillscore.ToInt(); } } p_Killer.killscore = p_Killer.killscore + 1; //You must declare a variable: int KillScore = 0; in PlayerBase class if (enableSaveKills) { g_Game.SetProfileString("killscore"+k_UID,p_Killer.killscore.ToString()); g_Game.SaveProfile(); Print("::: EEKilled Debug: SaveKills: Killer: " + killer_name + ", killscore: " + diescore.ToString()); //DEBUG } if ( itemInHands.IsItemBase() ) { ItemBase item = ItemBase.Cast(itemInHands); string className = item.GetType(); deathMsg = killer_name + " kill: " + Player_Name; deathMsgDist = " from a distance: " + dist.ToString() + "m by " + className; deathMsgKillScore = killer_name + " kills: " + p_Killer.killscore.ToString(); } else { deathMsg = killer_name + " kill: " + Player_Name; deathMsgDist = " from a distance: " + dist.ToString() + "m."; deathMsgKillScore = killer_name + " kills: " + p_Killer.killscore.ToString(); } } } else { if ( killer.IsKindOf("AnimalBase") ) { deathMsg = Player_Name + " killed by animal."; } else { if ( killer.IsKindOf("ZombieBase") ) { deathMsg = Player_Name + " killed by zombie."; } else { deathMsg = Player_Name + " died for an unknown reason."; } } } //Phase #3 GetGame().ChatPlayer(5, deathMsg); Print("::: EEKilled Debug: killer: " + killer.ToString () + " ::: " + deathMsg); //DEBUG if (deathMsgDist) { GetGame().ChatPlayer(5, deathMsgDist); Print("::: EEKilled Debug: killer: " + killer.ToString () + " ::: " + deathMsgDist); //DEBUG } if (deathMsgKillScore) { GetGame().ChatPlayer(5, deathMsgKillScore); Print("::: EEKilled Debug: killer: " + killer.ToString () + " ::: " + deathMsgKillScore); //DEBUG } if (enableSaveDies) { string strdiescore; g_Game.GetProfileString("diescore"+p_UID,strdiescore); if (strdiescore) { Print("::: EEKilled Debug: Load Die's: Player: " + Player_Name + ", loaded diescore: " + strdiescore); //DEBUG Player.diescore = strdiescore.ToInt(); } } Player.diescore = Player.diescore + 1; if (enableSaveDies) { g_Game.SetProfileString("diescore"+p_UID,Player.diescore.ToString()); g_Game.SaveProfile(); Print("::: EEKilled Debug: SaveDeath: Player: " + Player_Name + ", diescore: " + diescore.ToString()); //DEBUG } //MY --- if( GetHumanInventory().GetEntityInHands() ) { if( CanDropEntity(player_obj) ) { if( !IsRestrained() ) { GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(ServerDropEntity,1000,false,( GetHumanInventory().GetEntityInHands())); } } } }  затем находим функцию
      override void EEKilled( Object killer ) { и перед строкой
      Print("EEKilled, you have died"); добавляем
      Message_PlayerKilled(this, killer); 4. В параметры запуска сервера добавляем:
      -FilePatching 5. В 'config-файл' сервера (тот файл где название сервера) добавляем:
      enableSaveKills = 1; // Включение сохранения счетчика убийств по игрокам enableSaveDies = 1; // Включение сохранения счетчика смертей по игрокам где 1 - включено, 0 - выключено
       
      6. Сохраняем, запускаем сервер и радуемся. Сообщения о смертях игроков будут у вас как в чате, так и в script.log.

      Где хранятся счетчики убийств и смертей? Ответ:
      Они хранятся в profile сервера игры. Т.е. после 1-го запуска создаются 2 файла (как у клиента игры в документах windows в папку dayz) в файлах с расширениями ".vars.DayZProfile" и ".DayZProfile". При удалении этих файлов счетчики сбросятся!
       
      ВАЖНО:
      Скажу сразу, добавить систему кастомного логирования вместо базового можно, но добавлять ее вам прийдется до иницилизации данного файла playerbase.c, поскольку уже в  playerbase.c вы будете вызывать функцию, которая должна быть заранее определена и известна серверу!
      Добавлю, что сейчас масса модов, которые в своем составе имеют данный класс. Они также могут переписывать его, там самым приводя данный гайд в неработоспособность. Самый лучший вариант проверки гайда - на чистом сервере игры без модов.
       
      P.S. Данная тема является копией утраченной темы на нашем форуме, восстановлена по просьбам 'трудящихся'. Надеюсь, она вам поможет.
       
  • Наш выбор

×
×
  • Создать...

Важная информация

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