Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
BorizzK

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

Recommended Posts

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

Код функции отправки сообщения всем игрокам
вставляется в 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;
	}

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites









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

 

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

Функцию  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
		}
	}	

 

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

Аналогично о

 

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

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

 

из missionServer.c

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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();
}

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

AlexandrUA сделай сам

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

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

 

Найди в missioserver.c   

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

 

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

{

Тут ее код ее

}

 

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

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

 

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

 

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

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

   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);
		}
	}	

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

NoNameUltima 

 

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

 

Вопрос

 

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

NULL pointer to instance

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

 

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

 

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

 

 

 

 

 

 

Share this post


Link to post
Share on other sites

NoNameUltima 

 

Ну дык

 

	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);
		}
	}	

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

BorizzK Поставь принты да посмотри после какой строки, точно выдает что нулл.

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

А если новый игрок еще не в списке, то и объекта быть не может, и функция гетНэйм не должна ниче выдать.

Ну а если все ок и он уже в массиве, то читай выше - игроков всегда больше нуля.

Share this post


Link to post
Share on other sites

NoNameUltima 

Да это понятно теперь

Использовал наработку Мизева, у него было так

Однако, "А если новый игрок еще не в списке  то и объекта быть не может, и функция гетНэйм не должна ниче выдать"

Но ведь выдает же

Но ругается
Чуть позже по другому попробую ))

Share this post


Link to post
Share on other sites

BorizzK запринтуй весь массив игроков и посмотри что в нике, что в самом object находится, что в id

Share this post


Link to post
Share on other sites

123new 
Принтовал

Все на месте и ругань на NULL в этой строке

Чуть позже проверю еще раз и выложу лог в эту тему


 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

BorizzK а нафига тебе

player.GetIdentity().GetName()

делать когда у тебя это значение и так в функцию приходит?

PlayerIdentity identity

 

Share this post


Link to post
Share on other sites

123new Дя это понятно
делал по аналогии вчера еще переделал и отправку сообшений упростил по наводки Ультимы

 

Share this post


Link to post
Share on other sites
override void OnClientReadyEvent(PlayerIdentity identity, PlayerBase player)
    {
        super.OnClientReadyEvent(PlayerIdentity identity, PlayerBase player);
        string Message = "Player " + identity.GetName() + " connected!";
        MessageAllPlayers(Message);
        Print("::: init.c ::: OnClientReadyEvent(PlayerIdentity identity, PlayerBase player) ::: " + Message);
    }    


   
или так

override void OnClientReadyEvent(PlayerIdentity identity, PlayerBase player)
    {
        super.OnClientReadyEvent(PlayerIdentity identity, PlayerBase player);
        string Message = "Player " + identity.GetName() + " connected!";
        GetGame().ChatPlayer(0, Message);
        Print("::: init.c ::: OnClientReadyEvent(PlayerIdentity identity, PlayerBase player) ::: " + Message);
    }   

 

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites

NoNameUltima 

 

super.OnClientReadyEvent - а это что?

и что это за магическое super ?

что-то как-то рекурсию напоминает )))

Share this post


Link to post
Share on other sites

BorizzK Вызов базы, - той что ты перекрыл override'ом. а уж потом все твое. Можно и не вызывать, если не надо базу. можно и откропировать с базы, можно и где то в другом месте вызвать))) ну дело ситуации)

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 123new
      Много вопросов на данную тему наблюдаю от новичков, попробую прояснить немного сей вопрос.
       
      Предположим. что вы уже знаете на каких координатах вам надо спавнить определенное здание или объект\животное\бота, с каким углом поворота. И так. эта тема для вас.
       
      Сразу делаю пометку, метод, который добавили нам разработчики игры в патче 1.15, очень хорошо описал наш товарищ в сообщении форума:
      Рекоммендую вам использовать именно его!
      Ниже опубликованы старые методы.
       
      Если вы с расставили их с модифицированной версии Offline (Offline by Arksenor это называется), то вы получили и нашли код вида:
      GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13251.875000 0.0 3748.525879").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13254.599609 0.0 3722.703613").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13257.344727 0.0 3696.718750").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13260.040039 0.0 3670.984131").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13262.756836 0.0 3645.180176").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13265.441406 0.0 3619.531982").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13268.124023 0.0 3593.995361").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13270.844727 0.0 3568.186523").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13273.514648 0.0 3542.561279").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13276.195313 0.0 3517.048828").SetOrientation("-96.000000 0.000000 0.000000"); GetGame().CreateObject("Land_CementWorks_ExpeditionB", "13278.399414 0.0 3496.097900").SetOrientation("-96.000000 0.000000 0.000000"); Здесь (по примеру первой строки) 1 значение в скобках - id постройки/объекта, 2 значение - координаты в формате X Y Z, разделенные пробелом, 3 - значение поворота примерно в том же формате.
      Как это делать в Offline - статья от автора Offine:
      https://github.com/Arkensor/DayZCommunityOfflineMode/wiki/Add-custom-objects-to-your-server-or-mission
       
      И так, инструкция:
      1. Добавляем в начало init.c файла в вашей mpmissions следующий код:
      #include "$CurrentDir:mpmissions\dayzOffline.chernarusplus\spawn_buildings.c" 2. Создаем в папке вашей активной mpmissions файлик spawn_buildings.c и заполняем его следующей информацией.
      void SpawnObject( string type, vector position, vector orientation ) { private string NameBlockLog = "[CreateObject] "; private string InfoLog = ""; if(type != "") { auto obj = GetGame().CreateObject( type, "0 0 0" ); if(obj) { if ((position[0] != 0) && (position[1] != 0) && (position[2] != 0)) { obj.SetPosition( position ); obj.SetOrientation( orientation ); obj.Update(); if (obj.CanAffectPathgraph()) { obj.SetAffectPathgraph(true, false); GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(GetGame().UpdatePathgraphRegionByObject, 100, false, obj); } InfoLog = "[Type: '" + obj.GetType() + "' Position: '" + obj.GetPosition().ToString() + "' Orientation: '" + obj.GetOrientation().ToString() + "']"; Write_Log(NameBlockLog + " Object has been created successfully! Info " + InfoLog); } else { InfoLog = "[Type: '" + type + "' Position: '" + position + "' Orientation: '" + orientation + "']"; Write_Log(NameBlockLog + " Object can't be created! Incorrect writed position. Info " + InfoLog); } } else { InfoLog = "[Type: '" + type + "' Position: '" + position + "' Orientation: '" + orientation + "']"; Write_Log(NameBlockLog + " Object can't be created! Info " + InfoLog); } } else { InfoLog = "[Type: '" + type + "' Position: '" + position + "' Orientation: '" + orientation + "']"; Write_Log(NameBlockLog + " Object can't be created! Incorrect writed type. Info " + InfoLog); } } void Write_Log(string message) { Print(String(message)); } 3. Открываем созданный нами файл,  и в конце файла дописываем следующее:
      void SpawnAirfeeldBuildings() { SpawnObject( "Land_CementWorks_ExpeditionB", "13251.875000 0.0 3748.525879", "-96.000000 0.000000 0.000000"); SpawnObject( "Land_CementWorks_ExpeditionB", "13254.599609 0.0 3722.703613", "-96.000000 0.000000 0.000000"); SpawnObject( "Land_CementWorks_ExpeditionB", "13257.344727 0.0 3696.718750", "-96.000000 0.000000 0.000000"); } void SpawnKrasnoBuildings() { SpawnObject( "Land_CementWorks_ExpeditionB", "13251.875000 0.0 3748.525879", "-96.000000 0.000000 0.000000"); SpawnObject( "Land_CementWorks_ExpeditionB", "13254.599609 0.0 3722.703613", "-96.000000 0.000000 0.000000"); SpawnObject( "Land_CementWorks_ExpeditionB", "13257.344727 0.0 3696.718750", "-96.000000 0.000000 0.000000"); } Где после void - название функции идет, а между открытыми скобками вызов спавна самих зданий на указанных координатах.
      На примере 1 строки:
      Land_CementWorks_ExpeditionB - id постройки (type)
      13251.875000 0.0 3748.525879 - координаты в формате X Y Z
      -96.000000 0.000000 0.000000 - значение поворота в формате X Y Z
      Внимание: id постройки и координаты в примере указаны не верные и требуют подключения дополнительной модификации для корректной работы!!! Координаты не соответствуют названию функции!!!
      4. открываем в MpMissions в папке с вашей активной миссией init.c и перед ЗАКРЫВАЮЩЕЙ скобкой '}' дописываем нужную нам функцию (это будет активация спавна на карте):
      SpawnAirfeeldBuildings(); 5. Готово, Запускайте сервер, и в scripts.log вы увидите процедуру спавна ваших зданий и увидите, спавнятся ли они на карте или нет.
      Можно написать конечно и более готовую, универсальную систему спавна на карте со считыванием конфигурации из файла, но я считаю это лишним.
       
      Как заполнить добавленные здания лутом на карте:
      вариант 1:
      https://github.com/Arkensor/DayZCommunityOfflineMode/wiki/Enable-loot-for-custom-placed-objects
      вариант 2: вручную заполнить xml-файл  mapgrouppos.xml в mpmssions данными о местоположении зданий, где rpy - значение поворота здания в формате Z Y X
       
      С помощью данной статьи вы можете разместить любой элемент игры(постройку, животное, зомби, бота), доступный к спавну через любую модификацию-админ. панель. Очень полезный мод в этом смысле BuilderItems, с его помощью можно творить поистину интересные локации!
    • By Venom21
      Появилась такая проблема, нужно закрыть некоторые слоты под одежду, когда на определённый слот одет предмет…
      пример: возьмём экзоскелет от Фидова, там есть две версии которая одеваеться как на тело и ноги, и есть которая одеваться на разгрузку и пояс, так вот, нужно например чтобы при одетом экзаче на тело и ноги слоты под пояс и разгрузку блокировались, либо только под определенные предметы, если есть интерес то цену можем в личке обсудить…
      P.S. Разрешение от Фидова на переделку и переупаковку есть)
    • By CubeIn
      Здарова, уважаемые знатоки, вопрос.
      Мне скриптер скинул скрипт и сказал закинуть её в северную часть, но не указал куда именно. Подскажите пожалуйста, куда мне её деть? 
    • By CubeIn
      Здарова всем!
      У меня срочный вопрос опытным хозяинам серверостроения. Есть ли возможность настроить холод на карте Namalsk? А то слишком холодновато игрокам, а где это настраивать...
    • By BorizzK
      Накатал по быстрому для себя и своих ребят от нефиг делать, тк в командировке и дейзить возможности нет, только удаленно ковырять сервер
      Внутри настройки через переменные
      путь к базе сервера и инстанс ид берет из конфига сервера (нужно настроить имя файла и путь в файле)
      Мониторит сервер по названию окна, сохранив pid
      При вылете в 90% случаев корректно убивает процесс
      При перезапуске так же
      При каждом старте с 0 и при перезапусках делает бэкапы баз/настроек/
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
  • Our picks

×
×
  • 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.