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.0.0.2  
      Описание:
      Админка поставляется с ключами, и подписями. Админка разделена на 2 части - клиентская, и серверная. Так же работает в оффлайн режиме.  
      Для установки админки, необходимо:
      На сервере подключить серверный мод. На сервере подключить клиентский мод. На сервере скопировать ключ из клиентского мода, и поместить в папку keys сервера. На клиенте добавить клиентский мод. В конфигурационный файл администрации прописать UID(ы) администраторов и модераторов.  
      Рабочие пункты админки:
       
      Отображение в 3D(ESP до 100м)
      Игроки. Зомби. Техника. Постройки. Объекты. Отображение на карте(в радиусе игрока до 100м):
      Игроки. Зомби. Техника. Постройки. Объекты. НПЦ. Сервер:
      Установка времени на сервере. Установка погоды на сервере(В бете). Собственные:
      Телепорт по векторам(4 - по направлению взгляда. 5 - вверх). Телепорт по карте. Неуязвимость. Бесконечный БК. Невидимость. Защита от зомби. Игроки:
      Телепорт игрока к администратору. Телепорт администратора к игроку. Телепорт в заданные координаты. Лечение. Очистка инвентаря. Выдача БК к текущему оружию(в руках). Заблокировать. Разблокировать. Убить. Отсоединить. Забанить(свой файл банов по UID) Создание объектов:.
      Фильтр при выборе раздела создания предметов(поиск по имени класса).  
      Другое:
      Админская карта. Дебаг монитор. Информационный виджет. Удаление объектов.(только при включенном дебаге - отображающем объект в прицеле).  
      Горячие клавиши:
      [        -     Вызов панели администратора. HOME     -     Вкл\Выкл отображения полосы отладки. DELETE    -    Удаление объекта в прицеле. 4        -    Телепорт по направлению взгляда. 5        -    Телепорт вверх.  
      Сообщения:
      Вывод сообщений игрокам, о действиях модератора(если в админке UID указан, как UID модератора).  
      Журналы:
      Действия администрации.  
      Стоимость:
      3500  
      Видео:( ВНИМАНИЕ! В ВИДЕО, ВНУТРИ ПАНЕЛИ АДМИНИСТРАТОРА, РАБОТАЮТ ТОЛЬКО ТЕ ПУНКТЫ КОТОРЫЕ УКАЗАНЫ ВЫШЕ! ОСТАЛЬНЫЕ ПУНКТЫ ДОБАВЛЕНЫ НА БУДУЩЕЕ, И МОГУТ БЫТЬ ИЗМЕНЕНЫ)
      P.S. Обновления платные - 25% от стоимости админки.
      Скайп: hf-trade
    • Автор: BorizzK
      Накатал по быстрому для себя и своих ребят от нефиг делать, тк в командировке и дейзить возможности нет, только удаленно ковырять сервер
      Внутри настройки через переменные
      путь к базе сервера и инстанс ид берет из конфига сервера (нужно настроить имя файла и путь в файле)
      Мониторит сервер по названию окна, сохранив pid
      При вылете в 90% случаев корректно убивает процесс
      При перезапуске так же
      При каждом старте с 0 и при перезапусках делает бэкапы баз/настроек/логов в папку !Backup в корне сервера
      Можно настроть кол-во хранимых бэкпов для базы сервера и логов

      Вобщем заглянете внутрь и все поймете
       
      Вдруг кому пригодится
       
      Закрепляю тут краний боевой вариант
      Что к чему - прочтите всю тему и все станет ясно
       
      Сцыл на стрницу темы с крайней версией заточенной на использование с версией 1.04 и параметром -servermod
       
      Крайнюю версию всегда ищите в конце темы
    • Автор: NoNameUltima
      Автор: NoNameUltima
      v. 0.1.7
      Стоимость: 2500
       
      Мод предоставляется в двух частях:
      Клиентский мод(для игроков). Ключи и подписи, присутствуют(При необходимости изменения содержимого - ключ и подписи можно переделать). Серверный мод(только для сервера). *Моды связанны между собой.
       
      Что присутствует:
       
      Дебаг монитор *Есть настройка в конфигурации - отображать, или нет монитор при заходе на сервер.
      **Кнопка вкл\выкл настраивается в конфигурации
      За убийство зомби, повышается счетчик убийств зомби. За убийство зомби, начисляются наличные(кол-во настраивается в конфигурации). При смерти игрока, наличные остаются в трупе.(Забрать можно). За убийство игрока, повышается счетчик убийств людей. Метки на карте с указанием торговых зон. Стартовое приветствие игроков. ПНВ работающий от батарейки. Панель игрока Зараженные зоны. Стартовый инвентарь для игроков(по UID'ам, и общий). Стартовые позиции для игроков(по UID'ам, и случайные для тех кого нет в списке). Статичные постройки на карте(загрузка из класса). Создание коробок с содержимым. Команды чата:  
      Доп. статичные функции:  
      skype: hf-trade
       
      P.S. Обновления платные(для тех кто приобретал мод ранее: 25% от общей стоимости, до актуальной версии).
      P.S.P.S. Весь функционал является БЕТА-ВЕРСИЕЙ!
    • Автор: BorizzK
      Все вопросы на этот счет сюда
      Все решения, если есть, то же можно сюда
      Начало обсуждения тут
       
       
    • Автор: BorizzK
      Есть игрок
      Есть его координаты X и Y
      Нужно получить координаты точки X1 и X2 на расстоянии 2м слева от игрока
       
      ...
      Угол (из GetOrientation()) мы знаем
       
      Те банально надо получить координаты точки на окружности зная угол, радиус и координаты центра окружности
       
      мне видится следующее решение
       
      float dist = 2;
      float A = player.GetOrientation()[0] - 45;
      float x1 = dist * Math.Cos(A);
      float y1 = dist * Math.Sin(A);
       
      vector finpos = Vector(player.GetPosition()[0] + x1, player.GetPosition()[1], player.GetPosition()[2] + y1);
       
      или я не прав?
       
      может в Math enscript'а есть готовая функция?
       
       
      Спасибо!