BorizzK

скрипт
DayZ Standalone 0.63 Оповещение на сервере о входе игрока

36 сообщений в этой теме

Автор скрипта сообщения всем пользователям: Мизев
 

Код функции отправки сообщения всем игрокам
вставляется в OnInit () в init.c или в missionserver.c из scripts.pbo
Становится глобальной серверной функцией и можно использовать где угодно на сервере (вроде бы)

Что делает? Отправляет сообщение переданное в функцию всем игрокам на сервере
Использование: MessageAllPlayers ("ТЕКСТ");

void MessageAllPlayers(string message) 
	{ 
		ref array<Man> players = new array<Man>; 
		GetGame().GetPlayers( players );
		if ( players.Count() > 0 )
		{
			for ( int i = 0; i < players.Count(); i++ ) 
			{ 
				PlayerBase player; 
				Class.CastTo(player, players.Get(i)); 
				Param1<string> m_MessageParam = new Param1<string>(message); 
				GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
			} 
		}
	}

 

Код сообщения всем игрокам на сервере о входе НОВОГО игрока

вставляется в код создания персонажа, обработки его подключения или экипировки при входе - где Вам больше нравится

но после того как персонаж создастся и будет помещен в переменную к которой можно обратиться
В данном примере m_player


исполняется в контексте конкретного персонажа

 

Например init.c
 

	override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName)
	{

      //...... //тут еще разный код
      
      	playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");//Creates random player
		Class.CastTo(m_player, playerEnt);

		GetGame().SelectPlayer(identity, m_player);
		
		//inform all players about new player connected
		ref array<Man> players = new array<Man>; //define array for all players
		GetGame().GetPlayers( players ); //put all players in to array players
		if ( players.Count() > 0 ) // if players count > 0
		{			
			string Message = "NEW Player " + m_player.GetIdentity().GetName() + " connected!"; //message text
			MessageAllPlayers(Message); // call MessageAllPlayers function with Message param
		}

		return m_player;
	}

 

 

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

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


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


Однако!
В данном случае сообщение о новом игроке будет отправлено только если входит НОВЫЙ игрок
Если игрок входил и выходил, потом зашел заново и был загружен из базы сохранения сервера, сообщение отправлено не будет, тк будет обработано только подключение

 

Для того что бы сообщение отправлялось всегда во время подключения игрока

Функцию  MessageAllPlayers надо обьявить в missionServer.c

код отправки сообщения нужно поместить в функцию OnClientReadyEvent в в missionServer.c

после

 

вот так

	void OnClientReadyEvent(PlayerIdentity identity, PlayerBase player)
	{
		GetGame().SelectPlayer(identity, player);

		//inform all players about new player connected
		ref array<Man> players = new array<Man>; //define array for all players
		GetGame().GetPlayers( players ); //put all players in to array players
		if ( players.Count() > 0 ) // if players count > 0
		{			
			string Message = "Player " + m_player.GetIdentity().GetName() + " connected!"; //message text
			MessageAllPlayers(Message); // call MessageAllPlayers function with Message param
		}
    }

 

или переопределить  OnClientReadyEvent в классе CustomMission: MissionServer в init.c

тогда в missionServer.c эта функция будет игнорироваться и использоваться та, что Вы переопределили

и поместить код в нее, убрав или не убрав код из функции создания персонажа

 

	override void OnClientReadyEvent(PlayerIdentity identity, PlayerBase player)
	{
		GetGame().SelectPlayer(identity, player);
		
		//inform all players about player connected
		ref array<Man> players = new array<Man>; //define array for all players
		GetGame().GetPlayers( players ); //put all players in to array players
		if ( players.Count() > 0 ) // if players count > 0
		{			
			string Message = "Player " + m_player.GetIdentity().GetName() + " connected!"; //message text
			MessageAllPlayers(Message); // call MessageAllPlayers function with Message param
		}
	}	

 

 

 

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

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


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

Аналогично о

 

респавне игрока переопределяем/правим функцию OnClientRespawnEvent

выходе/отключении  переопределяем/правим функцию OnClientDisconnectedEvent

 

из missionServer.c

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


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

BorizzK Запутался чутка, первый код поместил в Mission, затем в инит..
Что нужно исправить?

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

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


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

AlexandrUA Я попрравил код (см выше)

Это потому как я не проверил, не было времени
Написал теоретически

Исправь

 

if ( GetGame().GetPlayers().Count() > 0 ) - так не работает почему-то (((( хотя по логике должно

 

Сделай так

ref array<Man> players = new array<Man>; //define array for all players

GetGame().GetPlayers( players ); //put all players in to array players

if ( players.Count() > 0 ) // if players count > 0

 

см init.с

 

#include "mpmissions\dayzOffline.chernarusplus\init_mod.c"
#include "mpmissions\dayzOffline.chernarusplus\AirDrop\V2\AirDrop.c"


//GLOBAL SERVER INIT ON START
void main()
{
	Print("::: init.c ::: main() ::: ");

		Hive ce = CreateHive();
	if ( ce )
		ce.InitOffline();

	Weather weather = g_Game.GetWeather();

	weather.GetOvercast().SetLimits( 0.0 , 1.0 );
	weather.GetRain().SetLimits( 0.0 , 1.0 );
	weather.GetFog().SetLimits( 0.0 , 0.25 );

	weather.GetOvercast().SetForecastChangeLimits( 0.0, 0.2 );
	weather.GetRain().SetForecastChangeLimits( 0.0, 0.1 );
	weather.GetFog().SetForecastChangeLimits( 0.15, 0.45 );

	weather.GetOvercast().SetForecastTimeLimits( 1800 , 1800 );
	weather.GetRain().SetForecastTimeLimits( 600 , 600 );
	weather.GetFog().SetForecastTimeLimits( 1800 , 1800 );

	weather.GetOvercast().Set( Math.RandomFloatInclusive(0.0, 0.3), 0, 0);
	weather.GetRain().Set( Math.RandomFloatInclusive(0.0, 0.2), 0, 0);
	weather.GetFog().Set( Math.RandomFloatInclusive(0.0, 0.1), 0, 0);
	
	weather.SetWindMaximumSpeed(15);
	weather.SetWindFunctionParams(0.1, 0.3, 50);
	
	//CUSTOM SPAWN CAR
	vector niva_pos = {6063.77, 0, 7871.36};
	EntityAI nivaCar = EntityAI.Cast(GetGame().CreateObject("OffroadHatchback", niva_pos, false, true));
	nivaCar.GetInventory().CreateAttachment( "HatchbackWheel" ); 
	nivaCar.GetInventory().CreateAttachment( "HatchbackWheel" ); 
	nivaCar.GetInventory().CreateAttachment( "HatchbackWheel" ); 
	nivaCar.GetInventory().CreateAttachment( "HatchbackWheel" ); 
	nivaCar.GetInventory().CreateAttachment( "CarBattery" ); 
	nivaCar.GetInventory().CreateAttachment( "SparkPlug" );  
	nivaCar.GetInventory().CreateAttachment( "EngineBelt" ); 
	nivaCar.GetInventory().CreateAttachment( "CarRadiator" );
	nivaCar.GetInventory().CreateAttachment( "HatchbackDoors_Driver" ); 
	nivaCar.GetInventory().CreateAttachment( "HatchbackDoors_CoDriver" ); 
	nivaCar.GetInventory().CreateAttachment( "HatchbackHood" ); 
	nivaCar.GetInventory().CreateAttachment( "HatchbackTrunk" ); 
	nivaCar.SetAllowDamage(false);
	Print("::: init.c ::: main() ::: CUSTOM SPAWN CAR: " + nivaCar.ToString() + ", POSITION: " + nivaCar.GetPosition().ToString());
	
}

class CustomMission: MissionServer
{	

	ref array<string> m_pointPlayerPVP = new array<string>;;
	ref map<string, int> m_playersSetUID = new map<string, int>;
	
	//SERVER INIT
	override void OnInit()
	{
		
		Print("::: init.c ::: OnInit() ::: ");
		
		//???
		//Print("PSOVIS: new player");
		PrintString( "isServer " + GetGame().IsServer().ToString() );
		PrintString( "isClient " + GetGame().IsClient().ToString() );
		PrintString( "isMultiplayer " + GetGame().IsMultiplayer().ToString() );

		string line_content; 
		
		//Выбор координат спавна
		//ФАЙЛ pointPlayerPVP.lst кладем в папку указанную в параметре запуска сервера -profiles=
		//Формат координат в файле: X Z Y
		//Любая ошибка приведет к крашу сервера
		//Например:
		//6010.40 0 7742.71
		//6386.92 0 7945.12
		//6478.50 0 7874.77
		//6044.73 0 7699.81
		//5966.05 0 7720.02
		//5912.13 0 7768.36
		//5945.08 0 7759.17

		FileHandle file = OpenFile("$profile:pointPlayerPVP.lst", FileMode.READ);
		Print("::: OpenFile : pointPlayerPVP.lst : $profile");
		
		if (file != 0)
		{ 
			while ( FGets( file,  line_content ) > 0 )    
			{
				m_pointPlayerPVP.Insert( line_content);
			}
			CloseFile(file);
		}	
		m_pointPlayerPVP.Debug();
		array<string> strFileParam;
	
		//ФАЙЛ playersSetUID.ini кладем в папку указанную в параметре запуска сервера -profiles=
		//Формат файла:
		//Steam UID в привычном виде|номер комплекта
		//Любая ошибка приведет к крашу сервера
		//Пример:
		// 76562298156537007|1
		// 76561998116927207|3
		//Ели UID в файле нет комплект выбирается рандомно
		
		file = OpenFile("$profile:playersSetUID.ini", FileMode.READ);
		Print("::: OpenFile : playersSetUID.ini : $profile");
		
		if (file != 0)
		{ 
			while ( FGets( file,  line_content ) > 0 )    
			{
				strFileParam = new array<string>;
				line_content.Split( "|", strFileParam );
				m_playersSetUID.Insert(strFileParam.Get(0), strFileParam.Get(1).ToInt());
			}
			CloseFile(file);
		}
		
		//MZ
		//Message to all players
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(MessagePlayerCounts, 60000, true); //300 seconds = 300000
	}	
	
	//MZ
	//Messaging all players
	//USAGE: MessageAllPlayers("TEXT");
	void MessageAllPlayers(string message) 
	{ 
		ref array<Man> players = new array<Man>; 
		GetGame().GetPlayers( players );
		if ( players.Count() > 0 )
		{
			for ( int i = 0; i < players.Count(); i++ ) 
			{ 
				PlayerBase player; 
				Class.CastTo(player, players.Get(i)); 
				Param1<string> m_MessageParam = new Param1<string>(message); 
				GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); 
			} 
			Print("::: init.c ::: MessageAllPlayers(string message) ::: m_MessageParam: " + message);
		}
	}
	
	//MZ
	//Message about players count
	void MessagePlayerCounts() 
	{
		ref array<Man> players = new array<Man>; 
		GetGame().GetPlayers( players ); 
		if ( players.Count() > 0 )
		{
			int count_pl = players.Count(); 
			string Message = "Players online: [" + count_pl.ToString() + "]";
			//MessageAllPlayers("Players online: [" + count_pl + "]");
			MessageAllPlayers(Message);
			Print("::: init.c ::: MessagePlayerCounts() ::: Message: " + Message);
		}
	}

	override void OnClientReadyEvent(PlayerIdentity identity, PlayerBase player)
	{
		GetGame().SelectPlayer(identity, player);
		
		//inform all players about player connected
		ref array<Man> players = new array<Man>;
		GetGame().GetPlayers( players );
		if ( players.Count() > 0 )
		{			
			string Message = "Player " + player.GetIdentity().GetName() + " connected!";
			MessageAllPlayers(Message);
			Print("::: init.c ::: OnClientReadyEvent(PlayerIdentity identity, PlayerBase player) ::: " + Message);
		}
	}	

	void SetRandomHealth(EntityAI itemEnt)
	{
		Print("::: init.c ::: SetRandomHealth(EntityAI itemEnt) ::: ");
		//int rndHlt = Math.RandomInt(40,100);
		//itemEnt.SetHealth("","",rndHlt);
		
		//MY - ЭТО ЭКСПЕРИМЕНТ
		itemEnt.SetHealth("","",1000);
	}

	//CREATE PLAYER CHARACTER IF NEW PLAYER CONNECT/RESPAWN
	override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName)
	{
		Print("::: init.c ::: CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName) ::: ");
		Entity playerEnt;
		if (m_pointPlayerPVP.Count()>0)
		{
			Print (m_pointPlayerPVP.Count());
			int maxNum = m_pointPlayerPVP.Count();
			int numPoint = Math.RandomInt(0, maxNum - 1);
			pos = m_pointPlayerPVP.Get(numPoint).ToVector();
		}
		
		playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");//Creates random player
		Class.CastTo(m_player, playerEnt);

		GetGame().SelectPlayer(identity, m_player);
		
		//inform all players about new player connected
		ref array<Man> players = new array<Man>; //define array for all players
		GetGame().GetPlayers( players ); //put all players in to array players
		if ( players.Count() > 0 ) // if players count > 0
		{			
			string Message = "NEW Player " + m_player.GetIdentity().GetName() + " connected!"; //message text
			MessageAllPlayers(Message); // call MessageAllPlayers function with Message param
			Print("::: init.c ::: OnClientReadyEvent(PlayerIdentity identity, PlayerBase player) ::: " + Message);
		}
	
		return m_player;
	}
	
	//CREATE EQUIPMENT FOR NEW PLAYER
	override void StartingEquipSetup(PlayerBase player, bool clothesChosen)
	{
		Print("::: StartingEquipSetup(PlayerBase player, bool clothesChosen) :::");
		
		//Номер комплекта выбирается рандомно
		int numSet = Math.RandomInt(2,6);  /// 1 - Админ сет, 2-6 сеты для всех

		EntityAI itemEnt;
		ItemBase itemBs;
		
		//Получаем UID
		//PlayerIdentity p_identity = player.GetIdentity();
		//p_identity.GetName(); // Получим имя игрока
		//p_identity.GetPlainId(); // UID в нашем знакомом виде 7656119**********
		//p_identity.GetId(); // получим UID в не знакомом виде Ue7dyagee34*********
		//p_identity.GetPlayerId(); // получим порядковый номер объекта типа игрок

		PlayerIdentity p_identity = player.GetIdentity();
		string p_name = p_identity.GetName();
		int p_id = p_identity.GetPlayerId();
		
		if( p_identity )
		{
			string uid_pl = p_identity.GetPlainId();
			
 			if (m_playersSetUID.Contains(uid_pl))
			{
				numSet = m_playersSetUID.Get(uid_pl);
			} 
 		}
		
		itemEnt = player.GetInventory().CreateInInventory("Rag");
		itemBs = ItemBase.Cast(itemEnt);
		itemBs.SetQuantity(4);
		SetRandomHealth(itemEnt);

		itemEnt = player.GetInventory().CreateInInventory("RoadFlare");
		itemBs = ItemBase.Cast(itemEnt);
		
		switch( numSet )
		{
			case 1: //ADMIN
			{
				Print("::: init.c ::: StartingEquipSetup ::: ADMIN ::: NAME:" + p_name + ", UID: " + uid_pl + ", ID: " + p_id.ToString() );

				//player.RemoveAllItems();

				player.GetInventory().CreateInInventory("CoyoteBag_Green");
				itemBs = ItemBase.Cast(itemEnt);
				player.GetInventory().CreateInInventory("TTSKOPants");
				itemBs = ItemBase.Cast(itemEnt);
				player.GetInventory().CreateInInventory("TTsKOJacket_Camo");
				itemBs = ItemBase.Cast(itemEnt);
				player.GetInventory().CreateInInventory("CombatBoots_Black");
				itemBs = ItemBase.Cast(itemEnt);
				player.GetInventory().CreateInInventory("CombatKnife");
				itemBs = ItemBase.Cast(itemEnt);
			
				player.GetInventory().CreateInInventory("FNX45");
				itemBs = ItemBase.Cast(itemEnt);
				player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd");
				itemBs = ItemBase.Cast(itemEnt);
				player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd");
				itemBs = ItemBase.Cast(itemEnt);	
				player.GetInventory().CreateInInventory("Mag_AKM_30Rnd");
				itemBs = ItemBase.Cast(itemEnt); 
				player.GetInventory().CreateInInventory("Mag_AKM_30Rnd");
				itemBs = ItemBase.Cast(itemEnt);
				
				itemEnt = player.GetInventory().CreateInInventory( "akm" ); 
				itemEnt.GetInventory().CreateAttachment( "PSO11Optic" ); 
				itemEnt.GetInventory().CreateAttachment( "AK_WoodBttstck" ); 
				itemEnt.GetInventory().CreateAttachment( "AK_WoodHndgrd" );
				itemEnt.GetInventory().CreateAttachment( "AK_Suppressor" );
				
				itemEnt = player.GetInventory().CreateInInventory("Rag");
				itemBs = ItemBase.Cast(itemEnt);
				itemBs.SetQuantity(6);
				
				itemEnt = player.GetInventory().CreateInInventory("RoadFlare");
				itemBs = ItemBase.Cast(itemEnt);

				player.SetHealth("","",1000); //ТЕСТ
				
				//SetAllowDamage НЕ РАБОТАЕТ ДЛЯ ОНЛАЙНА - БОГЕМЦЫ ВЫКЛЮЧИЛИ 
				//Тут обсуждение - https://forums.dayz.com/topic/240028-pve-server-disable-pvp-damage/
				//Есть идея насчет доработки кода обрабатывающего нанесение урона 
				//player.SetAllowDamage(false);
				
				break;
			}
			
			case 2:
			{
				itemEnt = player.GetInventory().CreateInInventory("VSS");
				itemBs = ItemBase.Cast(itemEnt);
				//Шаманим свое
				break;
			}
			
			case 3:
			{
				itemEnt = player.GetInventory().CreateInInventory("AKM");
				itemBs = ItemBase.Cast(itemEnt);
				//Шаманим свое
				break;
			}
			
			case 4:
			{
				itemEnt = player.GetInventory().CreateInInventory("AK74");
				itemBs = ItemBase.Cast(itemEnt);
				//Шаманим свое
				break;
			}
			
			case 5:
			{
					
					break;
			}
			
			case 6:
			{
					
					break;
			}
		}
	}
	
	//AIRDROP START
	ref AirDrop AirDropClass;//AirDrop class definition - #include "mpmissions\dayzOffline.chernarusplus\AirDrop\V2\AirDrop.c"

	void CustomMission()
	{
		AirDropClass = new AirDrop;		
	}

	float TimerSlice; // Timeslice
	override void OnUpdate( float timeslice )
	{
		super.OnUpdate( timeslice );

		// FPS Fix
		TimerSlice += timeslice;
		if (TimerSlice >= AirDropClass.TimesliceMultiplyier)
		{
			AirDropClass.CreateAirDrop();
			TimerSlice = 0;	
		}
	}
	//AIRDROP END
}	
  
Mission CreateCustomMission(string path)
{
	Print("::: init.c ::: CreateCustomMission(string path) ::: ");
	return new CustomMission();
}

 

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

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


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

AlexandrUA сделай сам

Ниже написано куда и что пихать )))

Пишу с телефона

 

Найди в missioserver.c   

(Где искать знаешь?)

 

Void OnClientDisconnectedEvent (...тут ее входные параметры.)

{

Тут ее код ее

}

 

 Всю функцию скопируй в init.c

Послкэе функции OnClientReadyEvent

 

Перед void начепятай override, как в предыдушем случае

 

И в конце ее родного кода межлу {} вставь код вызова оповещения как в предылушем случае заменив в тексте переменной Message  = "........connect" на disconnect ))))

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

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


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

BorizzK Правильно заменил?

 

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

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


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

Условие забыл

Зачем отпраалять мессагу если игроков нет

 

Кстати стрелочку в качестве спасибо то же можно щелкнуть ))

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


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

Ты невнимателен, а я ошибся когда копипастил код из файла ))))

 

Если в функции ВЫШЕ где мы вызываем

 

   string Message = "Player " + m_player.GetIdentity().GetName() + " connected!"; //message text
   MessageAllPlayers(Message); // call MessageAllPlayers function with Message param

 

обьект игрока  в переменной m_player

 

то на скрине что ты привел игрок в переменной player

 

и надо вот так

 

   string Message = "Player " + player.GetIdentity().GetName() + " connected!"; //message text
   MessageAllPlayers(Message); // call MessageAllPlayers function with Message param

 

Я там выше исправил )))

 

просто посмотри в какой переменной обьект игрока

GetGame().SelectPlayer(identity, m_player);

или

GetGame().SelectPlayer(identity, player);

итд итп

 

	override void OnClientReadyEvent(PlayerIdentity identity, PlayerBase player)
	{
		GetGame().SelectPlayer(identity, player);
		
		//inform all players about player connected
		ref array<Man> players = new array<Man>;
		GetGame().GetPlayers( players );
		if ( players.Count() > 0 )
		{			
			string Message = "Player " + player.GetIdentity().GetName() + " connected!";
			MessageAllPlayers(Message);
		}
	}	

 

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

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


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

BorizzK код сообщения всем игрокам, можно заменить на 1 строку -

GetGame().ChatPlayer(0, "сообщение");

где 0 - это ID канала чата.

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


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

NoNameUltima 

 

string Message = "Player " + player.GetIdentity().GetName() + " connected!"; 

 

Вопрос

 

Движок в script.log ругается на эту строку

NULL pointer to instance

Хотя сообщение формирует корректно

 

Интересно, это глюк движка или....

 

Не люблю когда в логах ошибки )))

 

 

 

 

 

 

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: NoNameUltima
      Автор:
      Я. Версия админки:
      v.R2  
      Описание:
      Админка поставляется с ключами, и подписями. Админка разделена на 2 части - клиентская, и серверная. Так же работает в оффлайн режиме.  
      Для установки админки, необходимо:
      На сервере подключить серверный мод. На сервере подключить клиентский мод. На сервере скопировать ключ из клиентского мода, и поместить в папку keys сервера. На клиенте добавить клиентский мод. В конфигурационный файл администрации прописать UID(ы) администраторов и модераторов.  
      Рабочие пункты админки:
       
      Отображение в 3D(ESP от 0 до 1000м)
      Настройки радиуса отображения Игроки. Зомби. Техника. Постройки. Объекты. Отображение на карте(в радиусе игрока от 0 до 1000м):
      Настройки радиуса отображения Игроки. Зомби. Техника. Постройки. Объекты. НПЦ. Сервер:
      Установка времени на сервере. Установка погоды на сервере(В бете). Собственные:
      Телепорт по векторам(4 - по направлению взгляда. 5 - вверх). Телепорт по карте. Неуязвимость. Бесконечный БК. Невидимость. Защита от зомби. Игроки:
      Телепорт игрока к администратору. Телепорт администратора к игроку. Телепорт в заданные координаты. Лечение. Очистка инвентаря. Выдача БК к текущему оружию(в руках). Заблокировать. Разблокировать. Убить. Отсоединить. Забанить(свой файл банов по UID) Создание объектов:.
      Фильтр при выборе раздела создания предметов(поиск по имени класса).  
      Другое:
      Админская карта. Дебаг монитор. Информационный виджет. Удаление объектов.(только при включенном дебаге - отображающем объект в прицеле).  
      Горячие клавиши:
      [        -     Вызов панели администратора. HOME     -     Вкл\Выкл отображения полосы отладки. DELETE   -    Удаление объекта в прицеле. 4  -    Телепорт по направлению взгляда. 5  -    Телепорт вверх. SHIFT+M - Карта администратора. F11 - Дебаг администратора.  
      Сообщения:
      Вывод сообщений игрокам, о действиях модератора(если в админке UID указан, как UID модератора).  
      Журналы:
      Действия администрации.  
      Стоимость:
      3500  
      Видео:( ВНИМАНИЕ! В ВИДЕО, ВНУТРИ ПАНЕЛИ АДМИНИСТРАТОРА, РАБОТАЮТ ТОЛЬКО ТЕ ПУНКТЫ КОТОРЫЕ УКАЗАНЫ ВЫШЕ! ОСТАЛЬНЫЕ ПУНКТЫ ДОБАВЛЕНЫ НА БУДУЩЕЕ, И МОГУТ БЫТЬ ИЗМЕНЕНЫ)
      P.S. Обновления платные - 25% от стоимости админки.
      Скайп: hf-trade
    • Автор: NoNameUltima
      Автор: NoNameUltima
      v. 0.2
      Стоимость: 7500
       
      Мод предоставляется в нескольких частях:
      Со стима:
      Клиентский мод со стима UltimaData (для игроков). Ключи и подписи, присутствуют. *https://steamcommunity.com/workshop/filedetails/?id=1845833890 Клиентский мод со стима Ultima(для игроков). Ключи и подписи, присутствуют. https://steamcommunity.com/sharedfiles/filedetails/?id=1845832254 Клиентский мод со стима UltimaClientAdmin(для игроков). Ключи и подписи, присутствуют. https://steamcommunity.com/workshop/filedetails/?id=1827015538 Клиентский мод для Вашего сервера! Данный мод необходимо будет переименовать(в любое имя - это Ваш мод, модифицирующий конфиг). Необходимо будет создать к нему ключи и подписи, и выложить от себя в стим. Ссылку на данный мод вы и выкладываете в стим. Серверные мод(только для сервера). Кол-во: 2. *Моды связанны между собой.
       
      Что присутствует:
      Стартовое меню:
      Добавлена ссылка на группу в ВК. Добавлена ссылка на Дискорд. Добавлен выбор для прямого захода на Ваши сервера!(возможно добавление множества серверов в одно меню). Добавлен логотип. Добавлен экран(картинка) загрузки. Добавлен экран(картинка) возрождения\захода на сервер. *Все описанные выше параметры настраиваются под Ваш сервер! Дебаг монитор:
      Наличные Банк Убито людей Убито зомби Фракция Репутация Игроков онлайн ФПС Время старта миссии Время до рестарта Собственная валюта:
      Можно забрать из трупа по экшену мышки(обыскать карманы) Можно положить в банк Можно перевести другому игроку Можно совершать покупки *Валюта виртуальная. Безопасные зоны:
      Удалены зомби из безопасных зон отключен урон по игрокам внтури безопасных зон Оповещение при входе Оповещение при выходе Торговые зоны:
      Над торговцами присутствует надпись(чем торгует) Взаимодействие с торговцами через экшен мышки(торговля) Торговля:
      Торговля может быть настроена на определенную фракцию При продаже учитывается процент повреждения объекта, и торговец даст за него сумму с учетом повреждений! Владельцем техники считается тот игрок, кто последний сидел за рулем, и именно она и  отображается в продаже. Продаваемая техника должна быть в пределах 10м от игрока. При покупке техники, ключ выдается автоматически. Нельзя продать технику если в ней кто то находится. Нельзя вести торговлю находясь внутри техники. При продаже объекта, весь инвентарь, в т.ч. и обвес который находился внутри объекта(к примеру рюкзака, или техники), будет автоматически сложен под ноги. Техника:
      Есть возможность привзяать технику к ключу, предварительно купив его у торговца. Есть возможность закрывать технику на ключ. Владельцем техники считается тот, кто последним сидел за рулем. После рестарта, вся техника которая привязана к ключам спавнится закрытой. Карта:
      Добавлена карта для игроков, открытие на CTRL+M Монитор возрождения:
      Добавлены точки для выбора места возрождения. Оповещения о смертях:
      Отдельное уведомление в окошке. Стартовый инвентарь:
      Есть возможность выдавать инвентарь как по UID, при чем случайным образом из списка доступных для данного UID'а. Игроки для которых не создан конфиг инвентаря, получают его из общего конфига. В конфиге можно указать одежду, вещи которые будут помещены в руки, вещи которые будут помещены горячие слоты, а так же есть возможность добавлять вещи сразу в комплектации(т.е. с обвесом, батарейками и т.п.) Репутация:
      При смерти с игрока снимается 200 репутации(до 0 в +-). т.е. Пример:
      Было +450, станет +250.
      Было -300, станет -100.
      Было +90, станет 0.
      Было -150, станет 0.
      За убийство игрока, репутация начисляется по 150 таким образом: Если с убитого снято менее 200 репутации(см. пример выше), то начисления нет! Если убийца был с отрицательной репутацией, то начисление идет в минус. Пример:
      Было -100, станет -250
      *Не играет роли, какая репутация была у убитого.
      Если убийца был с положительной репутацией, а убитый с отрицательной, то +150 Пример:
      Было 100, станет 250
      Если убийца был с положительной репутацией, и убитый с положительной , то -150 Пример:
      Было 100, станет -50
      Было 1000, станет 850
      Стартовые позиции игроков:
      Есть возможность возрождать игрока на точках прописанных специально под его UID, при чем случайным образом из списка доступных для данного UID'а. Игроки для которых не создан конфиг возрождения, возрождаются из общего конфига. АДМИНКА (ВКЛЮЧЕНА В МОД):
      Все пункты описывать не буду, - могу сказать только то, что все работает, и множество пунктов, такие как выдача наличных, смена фракции и т.п. сделанны специально под модификацию. СЕРВЕРНЫЕ МОДЫ:
      Настраиваются под Ваш сервер, и имею богатый функционал. доп. процедуры и функции.  
       
      В остальном смотрите видео по ссылке:
      *В данный момент, сервер с данным модом работает по адресу:
      109.68.189.18:2902
      *Для входа необходим мод сервера
      https://steamcommunity.com/sharedfiles/filedetails/?id=1860242928&searchtext=ru111&insideModal=0&requirelogin=1
       
      skype: hf-trade
       
      P.S. Обновления платные, если они вносят доп. функционал(для тех кто приобретал мод ранее: 25% от общей стоимости, до актуальной версии).
      P.S.P.S. Весь функционал является БЕТА-ВЕРСИЕЙ!
    • Автор: BorizzK
      Пишу мод для стримеров и сериальщиков (наши оч попросили и пара ютьюберов)
      Управление камерой с регулированием fov и тп включая углы итп
      Все почти отлично
      Столкнулись с проблемой
      С фрикамеры когда крупным планом беседу снимаешь не видно (нет анимации) движения губ. Жестикуляция и голос есть, а движения губ нет, только если перса оператора прям рядом поставить, тогда есть, но он в кадр в некоторых моментах попадает, а этого не нужно. Если удалить обьект перса оператора, то норм, но иногда сервак с ума сходит.
      А когда операторов 2 - 3, то ваще фигня иногда начинается вплоть до краша...
       
      Может кто в курсе, где расстояние, радиус синхры настроить можно?
       
       
    • Автор: 123new
      В данной теме мы с вами научимся создавать простой скрипт, который позволит выводить в чат объявления о присоединении и отсоединении игроков, а также логировать их данные.
       
      Нам понадобится:
      1. Сервер DayZ 1.0, сделанный по одному из гайдов:
      2. Notepad++
      3. Немножечко трезвого ума
       
      Приступим:
      1. Открываем Mpmissions - dayzOffline.chernarusplus - init.c
      2. В самом начале файла добавляем:
      #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\ConnectDisconnectMessagesInChat.c" Обратите внимание, имя папки с активной mpmissions сервера у вас может отличаться от стандартного названия  dayzOffline.chernarusplus - в таком случае в ссылке выше имя этой папки также надо заменить (это актуально в основном для серверов аренды)
      3. Помещаем в папку файл
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Либо создаем вручную этот файл с именем " "ConnectDisconnectMessagesInChat.c" и заполняем его следующим текстом:
      modded class CustomMission { void SendGlobalChatMessage(string message) { private array<Man> players = new array<Man>; GetGame().GetPlayers( players ); int numbOfplayers = players.Count(); if( numbOfplayers > 0 ) { foreach(Man player: players) { SendPersonalMessage(message, player); } //GetGame().ChatPlayer(message); } } void 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()); } } override void InvokeOnDisconnect( PlayerBase player ) { private PlayerIdentity identity = NULL; identity = player.GetIdentity(); if (player && identity) { private string Name_P = identity.GetName(); private string UID_P = identity.GetPlainId(); private string message = "[Информация] Игрок " + Name_P + " отключился от сервера."; private string log_message = "[Disconnect] Player " + Name_P + " with Steam64ID: " + UID_P + " disconnected from server."; //GetGame().ChatPlayer(message); SendGlobalChatMessage(message); Print(log_message); } super.InvokeOnDisconnect( player ); } override void InvokeOnConnect(PlayerBase player, PlayerIdentity identity) { super.InvokeOnConnect(player, identity); private string Name_P = identity.GetName(); private string UID_P = identity.GetPlainId(); private string message = "[Информация] Игрок " + Name_P + " Зашёл на сервер."; private string log_message = "[Connect] Player " + Name_P + " with Steam64ID: " + UID_P + "connected to server."; //GetGame().ChatPlayer(message); SendGlobalChatMessage(message); Print(log_message); } } 4. Настраиваем текст как нам нужно. Т.е. в строках для чата
      private string message = "[Информация] Игрок " + Name_P + " отключился от сервера."; и
      private string message = "[Информация] Игрок " + Name_P + " Зашёл на сервер."; а также для логов
      private string log_message = "[Disconnect] Player " + Name_P + " with Steam64ID: " + UID_P + " disconnected from server."; и
      private string log_message = "[Connect] Player " + Name_P + " with Steam64ID: " + UID_P + "connected to server."; P.S. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!