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

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

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • Не хотите БАН?

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

    Там вы можете продать или купить
    Всё что касается игровых серверов
BorizzK

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

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

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

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

 

Ну дык

 

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

 

 

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

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


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

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

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

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

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

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


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

NoNameUltima 

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

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

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

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

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

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


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

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

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


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

123new 
Принтовал

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

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


 

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

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


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

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

player.GetIdentity().GetName()

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

PlayerIdentity identity

 

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


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

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

 

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


Ссылка на сообщение
Поделиться на других сайтах
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);
    }   

 

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

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


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

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

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

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

    • Автор: NoNameUltima
      Автор:
      Я
       
      Цена:
      1500
       
      Тип:
      Клиент+Сервер(2 мода, - клиентский есть в стиме)
       
      Описание работы:
       
      Торговец появляется в определенном месте, с определенным товаром. По истечении определенного времени, торговец перемещается на другую точку.
      Точки торговца, товар, время перемещения задаются в конфигурации.
       
      Пример конфигурации:
      В профиль копируем пример конфига.
       
      Открываем файл:
      UST_SERVER_STRING_TRADERS_FILE.txt
       
      Добавляем конфиги с файлами торговцев
      300|Ultima_Trader_Plus_Black_Market_0.txt
      600|Ultima_Trader_Plus_Black_Market_1.txt
      *тут - время в секундах, которое торговец стоит на месте. И файл с координатами торговца.
       
      Открываем папку
      UST_SERVER_STRING_TRADERS_FOLDER
      Создаем в ней 2 файла указанных выше, и наполняем их координатами:
       
      Пример:
      Ultima_Trader_Plus_Black_Market_0.txt
      6123.73 299.331 7616.21
      6130.73 299.331 7616.21
      6115.73 299.331 7616.21
       
      *ВАЖНО - ВЕРХНЯЯ КООРДИНАТА(ПЕРВАЯ) ОБЯЗАТЕЛЬНО ДОЛЖНА СОВПАДАТЬ С КООРДИНАТОЙ ТОРГОВЦА ИЗ МОДА ТРЕЙДЕРА!
       
      Торговец будет телепортироваться по данным координатам, случайным образом, каждые 5мин(300с).
    • Автор: NoNameUltima
      Автор: NoNameUltima
      v R5
      Стоимость: 9500
       
      Мод предоставляется в нескольких частях:
      Со стима:
      Клиентский мод со стима Ultima(для игроков). Ключи и подписи, присутствуют.   Клиентский мод со стима UltimaClientAdmin(для игроков). Ключи и подписи, присутствуют.   Клиентский мод для Вашего сервера! Данный мод необходимо будет переименовать(в любое имя - это Ваш мод, модифицирующий конфиг). Необходимо будет создать к нему ключи и подписи, и выложить от себя в стим. Ссылку на данный мод вы и выкладываете в стим. Серверные мод(только для сервера). Кол-во: 2. *Моды связанны между собой.
       
      Что присутствует:
      Стартовое меню:
      Добавлена ссылка на группу в ВК. Добавлена ссылка на Дискорд. Добавлен выбор для прямого захода на Ваши сервера!(возможно добавление множества серверов в одно меню). Добавлен логотип. Добавлен экран(картинка) загрузки. Добавлен экран(картинка) возрождения\захода на сервер. *Все описанные выше параметры настраиваются под Ваш сервер! Дебаг монитор:
      Донат Наличные Банк Убито людей Убито зомби Фракция Репутация Игроков онлайн ФПС Время старта миссии Время до рестарта Собственная валюта:
      Можно забрать из трупа по экшену мышки(обыскать карманы) Можно положить в банк(Размер банковской ячейки - настраивается). Можно перевести другому игроку Можно совершать покупки *Валюта виртуальная. Фракции:
      Возможность создать фракцию, за валюту, или чеки(донат).(Ценники настраиваются в конфигурации). Возможность удалить фракцию. Возможность приглашения игроков во фракцию.(Ограничение на кол-во игроков во фракции задается в конфигурации). Возможность выгнать игрока из фракции. Возможность отклонить приглашение во фракцию. Возможность принять приглашение во фракцию. Отображение имени игрока над головой, если он в одной фракции с вами, и на дистанции менее 100м. Возможность создавать точки возрождения для членов фракции.(Кол-во точек и стоимость создания настраиваются в конфигурации). Безопасные зоны:
      Удалены зомби из безопасных зон Удалены волки из безопасных зон Отключен урон по игрокам внутри безопасных зон Нельзя перейти в боевой режим внутри безопасных зон Отображение имен игроков внутри торговых зон Оповещение при входе Оповещение при выходе Торговые зоны:
      Над торговцами присутствует надпись(чем торгует) Взаимодействие с торговцами через экшен мышки(торговля) Зона запрета строительства:
      Нельзя строить. Торговля:
      Торговля может быть настроена на определенную фракцию При продаже учитывается процент повреждения объекта, и торговец даст за него сумму с учетом повреждений! Владельцем техники считается тот игрок, кто последний сидел за рулем, и именно она и  отображается в продаже. Продаваемая техника должна быть в пределах 10м от игрока. При покупке техники, ключ выдается автоматически. Нельзя продать технику если в ней кто то находится. Нельзя вести торговлю находясь внутри техники. При продаже объекта, весь инвентарь, в т.ч. и обвес который находился внутри объекта(к примеру рюкзака, или техники), будет автоматически сложен под ноги. Есть возможность создать "бродячего" торговца. - Файл с конфигурацией прилагается.( Настраивается время перемещения, и список случайных позиции для торговца) Техника:
      Есть возможность привязать технику к ключу, предварительно купив его у торговца. Есть возможность закрывать технику на ключ. Владельцем техники считается тот, кто последним сидел за рулем. После рестарта, вся техника которая привязана к ключам создается закрытой. Экшен перевернутой техники (постановка на колеса), при наличии монтировки. Только тому игроку который последним сидел за рулем. Карта:
      Добавлена карта для игроков, открытие на CTRL+M Установка маркера на карту Дабл.клик ЛКМ.(Будет отображен и в ESP)*При наличии компаса в инвентаре Удаление маркера с карты Дабл клик ПКМ.*при наличии компаса в инвентаре Отображение азимута при наличии компаса в инвентаре. Монитор возрождения:
      Добавлены точки для выбора места возрождения. Возможность добавлять стандартные точки возрождения. Возможность добавлять точки возрождения за валюту в банке. Возможность добавлять точки возрождения за чеки(донат). Возможность добавлять точки возрождения зависящие от репутации(-+) *Данные точки отображаются у игроков в мониторе возрождения. Так же отображаются фракционные точки, если игрок состоит во фракции, и у фракции они созданы. Оповещения о смертях:
      Отдельное уведомление в окошке. Стартовый инвентарь:
      Есть возможность выдавать инвентарь как по 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'а. Игроки для которых не создан конфиг возрождения, возрождаются из общего конфига. Журналы:
      Торговля Посадка\Высадка в\из технику(и) Установка\деммонтаж(стройка) Смерти игроков АДМИНКА (ВКЛЮЧЕНА В МОД):
      Все пункты описывать не буду, - могу сказать только то, что все работает, и множество пунктов, такие как выдача наличных, смена фракции и т.п. сделанны специально под модификацию. СЕРВЕРНЫЕ МОДЫ:
      Настраиваются под Ваш сервер, и имею богатый функционал. доп. процедуры и функции.  
       
      В остальном смотрите видео по ссылке:
      *В данный момент, сервер с данным модом работает по адресам:
       
      185.247.140.7:2312
      *Версия R5
      **Для входа необходим мод сервера
      https://steamcommunity.com/sharedfiles/filedetails/?id=1735075579
       
      skype: hf-trade
      discord: https://discord.gg/T9YAJDm
       
      P.S. Обновления платные, если они вносят доп. функционал(для тех кто приобретал мод ранее: 25% от общей стоимости, до актуальной версии).
      P.S.P.S. Весь функционал является БЕТА-ВЕРСИЕЙ!
    • Автор: Serdce
      Ссылка на первоисточник - https://github.com/BrettNordin/Exile
      Я всего лишь перевёл
      Собственно переходим по ссылке, и скачиваем архив.
      Для тех, кто не знает как качать с хаба скрин 
      И так, едем дальше
      Скачанный архив распаковываем в удобное место для работы,
      Идём в ваш @ExileServer, там нас интересуют файлы - extDB2.dll , extDB2.so , extDB2-conf.ini , XM8.dll , XM8.so Удаляем эти файлы
      Далее идём в @ExileServer которую мы скачали, всё её содержимое копируем в аналогичную папку на сервере.
      Теперь идём в вашу MPmissions и там распаковываем вашу миссию "Exile.название карты",
      Туда мы копируем содержимое папки Exile.MapName из архива,
      Далее открываем ваш config.cpp и ищем там class CfgExileCustomCode 
      В него мы добавляем - #include "CfgExileCustomCode.cpp"
      Должно получится так
      Запаковываем обратно)
      Ну и теперь из архива мы копируем tbbmalloc.dll, tbbmalloc_x64.dll в папку расположения вашего Arma3_server.exe
      Не забываем поменять в вашем файле запуска сервера с arma3server.exe на arma3server_x64.exe 
      Ну и финишная прямая, открываем вашу базу данных ( желательно с название exile ) и добавляем файл Exile_Database_Update_64x.sql
      Далее настройте под себя ваш extdb3-conf.ini
       
    • Автор: NoNameUltima
      Автор:
      NoNameUltima  
      Цена:
      2000  
      Описание:
      Клиентский и серверный мод, для добавления системы уведомлений.  
      Конфигурация уведомления:
      Задать заголовок уведомления. Цвет заголовка уведомления. Иконку уведомления. Текст уведомления. Уведомления можно вызывать как со стороны клиента, так и со стороны сервера.  
      Пример отправки уведомления с сервера, конкретному игроку:
      USC_StaticFunctions.SendPacket( v_Player, US_INT_REQUEST_MANAGER, US_INT_STC_PCK_NOTIFY, string.Format( "icon_notify|Заголовок уведомления|%1|Текст уведомления", US_INT_COLOR_GREEN ), NULL, false );  
      Пример отправки уведомления с сервера, всем игрокам:
      USC_StaticFunctions.SendPacket( NULL, US_INT_REQUEST_MANAGER, US_INT_STC_PCK_NOTIFY, string.Format( "icon_notify|Заголовок уведомления|%1|Текст уведомления", US_INT_COLOR_GREEN ), NULL, true ); *Вместо icon_notify вы можете вставить путь с собственной иконке.
      **Вместо USN_INT_COLOR_GREEN - Можно выбрать другой цвет.
      Доступные цвета со стороны сервера(заранее подготовленные для удобства):
      USN_INT_COLOR_WHITE    Белый USN_INT_COLOR_GREEN    Зеленый USN_INT_COLOR_RED    Красный USN_INT_COLOR_YELLOW    Желтый USN_INT_COLOR_BLUE    Синий USN_INT_COLOR_ICE    Лед  
      Пример вызова уведомления из клиентского скрипта:
      AddNotifyMessage( icon_notify, "Заголовок", UCN_INT_COLOR_GREEN, "Текст" ); *Вместо icon_notify вы можете вставить путь с собственной иконке.
      **Вместо USN_INT_COLOR_GREEN - Можно выбрать другой цвет.
      Доступные цвета со стороны клиента(заранее подготовленные для удобства):
      UСN_INT_COLOR_WHITE    Белый UСN_INT_COLOR_GREEN    Зеленый UСN_INT_COLOR_RED    Красный UСN_INT_COLOR_YELLOW    Желтый UСN_INT_COLOR_BLUE    Синий UСN_INT_COLOR_ICE    Лед  
      В данном видео, продемонстрированы уведомления о входе в торговую зону, и уведомления при торговле.
       
    • Автор: NoNameUltima
      Автор:
      Я. Версия админки:
      R3  
      Описание:
      Админка поставляется с ключами, и подписями. Админка разделена на 2 части - клиентская, и серверная. Так же работает в оффлайн режиме.  
      Для установки админки, необходимо:
      На сервере подключить серверный мод. На сервере подключить клиентский мод. На сервере скопировать ключ из клиентского мода, и поместить в папку keys сервера. На клиенте добавить клиентский мод. В конфигурационный файл администрации прописать UID(ы) администраторов и модераторов.  
      Рабочие пункты админки:
       
      Отображение в 3D(ESP от 0 до 1000м)
      Настройки радиуса отображения Игроки. Зомби. Техника. Постройки. Объекты.  
      Отображение на карте(в радиусе игрока от 0 до 1000м):
      Настройки радиуса отображения Игроки. Зомби. Техника. Постройки. Объекты. НПЦ.  
      Сервер:
      Установка времени на сервере. Установка погоды на сервере(В бете).  
      Собственные:
      Телепорт по векторам(4 - по направлению взгляда. 5 - вверх). Телепорт по карте. Неуязвимость. Бесконечный БК. Невидимость. Защита от зомби. Свободная камера.  
      Игроки:
      Телепорт игрока к администратору. Телепорт администратора к игроку. Телепорт в заданные координаты. Лечение. Очистка инвентаря. Выдача БК к текущему оружию(в руках). Заблокировать. Разблокировать. Убить. Отсоединить. Забанить(свой файл банов по UID) Создание перед игроком объектов из заранее подготовленных файлов на сервере. Игроки(доп.  пункты для мода Ultima):
      Изменить баланс наличных Изменить банковский баланс Изменить репутацию Изменить фракцию Изменить кол-во убийств зомби Изменить кол-во убийств людей  
      Создание объектов:
      Фильтр при выборе раздела создания предметов(поиск по имени класса). Пресеты для создания авто, из аддонов(авто с обвесом, - колеса и т.п., так же можно добавлять и для стандартной техники, если нет желания ее создавать в сборе).  
      Удаление объектов:
      Все все объекты в радиусе X(не более 100м). Все объекты в радиусе X, по классу(не более 100м). Объект в прицеле по горячей клавише.  
      Другое:
      Карта администратора. Монитор отладки. Информационный виджет. Наблюдение за игроком.  
      Горячие клавиши:
      [        -     Вызов панели администратора. HOME     -     Вкл\Выкл отображения полосы отладки. DELETE   -    Удаление объекта в прицеле. 4  -    Телепорт по направлению взгляда. 5  -    Телепорт вверх. SHIFT+M - Карта администратора. F11 - Дебаг администратора.  
      Сообщения:
      Вывод сообщений игрокам, о действиях модератора(если в админке UID указан, как UID модератора).  
      Журналы:
      Действия администрации.  
      Стоимость:
      3500  
      Видео:( ВНИМАНИЕ! В ВИДЕО, ВНУТРИ ПАНЕЛИ АДМИНИСТРАТОРА, РАБОТАЮТ ТОЛЬКО ТЕ ПУНКТЫ КОТОРЫЕ УКАЗАНЫ ВЫШЕ! ОСТАЛЬНЫЕ ПУНКТЫ ДОБАВЛЕНЫ НА БУДУЩЕЕ, И МОГУТ БЫТЬ ИЗМЕНЕНЫ)
      P.S. Обновления платные - 25% от стоимости админки.
      Скайп: hf-trade
×
×
  • Создать...