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

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

Recommended Posts

Автор: Виталий Мизев

 

Для начала в папке профиля сервера которая указана в параметре запуска сервера -profile=

создаем 2 файла

pointPlayerPVP.lst - координаты спавна нового персонажа в формате vector

playersSetUID.ini - Steam UID игроков | номер комплекта стартового лута для выбора

 

Пример формата файла pointPlayerPVP.lst

6010.40 0 7742.71
6386.92 0 7945.12
6478.50 0 7874.77
6044.73 0 7699.81
 

Пример формата playersSetUID.ini - STEAMUID|номер

76531195156927007|1
76561838156127001|2


 

Игроку с Steam UID 6531195156927007 будет выдат комплект 1, 76561838156127001 комплект 2, если в файле UID нет, то рандомно из остальных комплектов

 

В файле init.c

 

в теле класса: class CustomMission: MissionServer

 

сначала обьявим массивы

 

ref array<string> m_pointPlayerPVP = new array<string>;;
ref map<string, int> m_playersSetUID = new map<string, int>;
 

это массивы глобальны в классе и могут использоваться во всех функциях класса

 

в теле override void OnInit() (выполняется при запуске сервера)

 

Чтение координат спавна из файла в массив m_pointPlayerPVP

		string line_content; 
		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();

 

Чтение Steam UID и номера из файла в массив m_playersSetUID

		array<string> strFileParam;
		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);
		}
	

 

Далее
При создании НОВОГО обьекта игрока

 

сначала ему задаются координаты рандомно выбираясь из массива m_pointPlayerPVP

см как идет работа с этим массивом

	override PlayerBase 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);
		
		return m_player;
	}

 

Затем при создании стартового комплекта лута комплект выдается в зависимости от наличия в файле UID и номера после | (комплекта) (в данном случае для номера 1 набор собран (см case :1) , для остальных ничего)

	override void 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
			{

				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(4);
				
				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:
			{
				break;
			}
			
			case 3:
			{
				break;
			}
			
			case 4:
			{
				break;
			}
			
			case 5:
			{
				break;
			}
			
			case 6:
			{
				break;
			}
			
		}
	}

Вот как-то так

 

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

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites



BorizzK  Это круто!!! а как и где узнать Steam UID и где прописывать сам сет для конкретного Steam UID?

Share this post


Link to post
Share on other sites

Стим уид

зайти в стим

и в профиль

и взять id из url

вот например

https://steamcommunity.com/profiles/75561197156927107/

75561197156927107 - Это и есть стим ид

 

ну или

https://yandex.ru/yandsearch?text=узнать steamuid&lr=213&redircnt=1540098483.1

 

По осатльному

В коде есть комментарии вообще-то, я их специально тудой написал )))

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

NoNameUltima 

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

Share this post


Link to post
Share on other sites

BorizzK 
на строчке
        file = OpenFile("$profile:playersSetUID.ini", FileMode.READ);
выдаёт ошибку что не может найти файл переменной
но я создал его и закинул в профиль путь на профиль указан в батнике
уже  10 раз проверил название файла и закинул его уже почти в каждую папку сервера всёравно ошибку выдаёт.
в чём может быть причина?

Share this post


Link to post
Share on other sites
18 минут назад, mastaZz сказал:

NoNameUltima 

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

бред

Share this post


Link to post
Share on other sites

NoNameUltima яб не стал такой на свой комп ставить

 

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

Share this post


Link to post
Share on other sites
Только что, mastaZz сказал:

NoNameUltima яб не стал такой на свой комп ставить

 

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

Ну не ставь. Программа мной написана. И никакого гавна там быть не может.

Share this post


Link to post
Share on other sites

BorizzK я пытаюсь объединить админку с этим методоб обявления стартового лучту может дело в этом???вот полный файл DayZSurvival.c
 

#include "$CurrentDir:\\mpmissions\\DayZSurvival.chernarusplus\\ScriptedMods\\ModuleManager.c"
#include "$CurrentDir:\\mpmissions\\DayZSurvival.chernarusplus\\ScriptedMods\\Tunables.c"
#include "$CurrentDir:\\mpmissions\\DayZSurvival.chernarusplus\\ScriptedMods\\Modules\\AdminTool\\AdminTool.c"
#include "$CurrentDir:\\mpmissions\\DayZSurvival.chernarusplus\\ScriptedMods\\Modules\\AdvancedLoadouts\\AdvancedLoadouts.c"
#include "$CurrentDir:\\mpmissions\\DayZSurvival.chernarusplus\\ScriptedMods\\Modules\\Misc\\BuildingSpawner.c"
#include "$CurrentDir:\\mpmissions\\DayZSurvival.chernarusplus\\ScriptedMods\\Modules\\SafeZone\\SafeZoneFunctions.c"
#include "$CurrentDir:\\mpmissions\\DayZSurvival.chernarusplus\\ScriptedMods\\Modules\\ServerEvents\\InfectedHordes.c"

//#include "$CurrentDir:\\mpmissions\\DayZSurvival.chernarusplus\\ScriptedMods\\Modules\\Misc\\MOTDMessages.c"

class DayZSurvival : MissionServer
{
    ref map<string, int> m_playersSetUID = new map<string, int>;
	private ref set<ref ModuleManager> m_Modules;
	ref InfectedHordes m_ZombieEvents;
	protected float m_LogInTimerLength = 1;     //in seconds the spawn timer when players login!
	bool m_StaminaStatus = false;

	void DayZSurvival()
	{
		Print("VANILLA PLUS PLUS IS ALIVE!!");
		m_Modules = new set<ref ModuleManager>;
		RegisterModules();
	}
	
	void ~DayZSurvival()
	{
		
	}
	
	void RegisterModules()
	{
		m_Modules.Insert(new ModTunables(this));
		
		if (ModTunables.Cast(GetModule(ModTunables)).IsActive("AdminTools"))
		{
			m_Modules.Insert(new AdminTool(this));
		}

		if (ModTunables.Cast(GetModule(ModTunables)).IsActive("AdvancedLoadouts"))
		{
			m_Modules.Insert(new AdvancedLoadouts(this));
		}

		if (ModTunables.Cast(GetModule(ModTunables)).IsActive("SafeZone"))
		{
			m_Modules.Insert(new SafeZone(this));
		}
	}
	
	void InitModules()
	{
		for ( int i = 0; i < m_Modules.Count(); ++i)
		{
			m_Modules.Get(i).Init();
		}
	}
	
	ModuleManager GetModule(typename moduleType)
	{
		for ( int i = 0; i < m_Modules.Count(); ++i)
		{
			ModuleManager module = m_Modules.Get(i);
			if (module.GetModuleType() == moduleType) 
			{
				return module;
			}
		}
		return NULL;
	}
	
	
	override void OnInit()
		array<string> strFileParam;
		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);
		}		
		super.OnInit();
		InitModules();
		
		if (!ModTunables.Cast(GetModule(ModTunables)).IsActiveMisc("Debugmode"))
		{
			Hive ce = CreateHive();
			if (ce)
			ce.InitOffline();
		}

		if (ModTunables.Cast(GetModule(ModTunables)).IsActiveMisc("ProxyExportMode"))
		{
			CETesting TestHive = GetTesting();
			TestHive.ExportProxyProto();
			TestHive.ExportProxyData( "7500 0 7500", 15000 );
		}

		if (ModTunables.Cast(GetModule(ModTunables)).IsActiveMisc("SessionFeed"))
		{
			g_Game.SetProfileString("SessionFeed", "true");
		}
		else
		{
			g_Game.SetProfileString("SessionFeed", "false");
		}

		if (ModTunables.Cast(GetModule(ModTunables)).IsActiveMisc("CustomBuildings"))
		{
			ref BuildingSpawner bldspnwer = new BuildingSpawner;
			bldspnwer.Init();
		}

		if (ModTunables.Cast(GetModule(ModTunables)).IsActiveMisc("StaminaStatus"))
		{
			m_StaminaStatus = true; //Disable Stamina
		}
		
		if (ModTunables.Cast(GetModule(ModTunables)).IsActive("InfectedHordes"))
		{
			m_ZombieEvents = new InfectedHordes;
		}
		
		//-----------
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.PlayerCounter, 110000, true);  //Default 120000 2 mins Looped
		//GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.CustomMOTD, TIME_INTERVAL, true);  //Default 120000 2 mins Looped
		//-----------
	}

	override void OnPreloadEvent(PlayerIdentity identity, out bool useDB, out vector pos, out float yaw, out int queueTime)
	{
		if (GetHive())
		{
			useDB = true;
			queueTime = m_LogInTimerLength;
		}
		else
		{
			useDB = false;
			pos = "7500 0 7500";
			yaw = 0;
			queueTime = m_LogInTimerLength;
		}
	}

	override void TickScheduler(float timeslice)
	{
		GetGame().GetWorld().GetPlayerList(m_Players);
		if( m_Players.Count() == 0 ) return;
		for(int i = 0; i < SCHEDULER_PLAYERS_PER_TICK; i++)
		{
			if(m_currentPlayer >= m_Players.Count() )
			{
				m_currentPlayer = 0;
			}

			PlayerBase currentPlayer = PlayerBase.Cast(m_Players.Get(m_currentPlayer));
			currentPlayer.OnTick();

			if (m_StaminaStatus) {
			currentPlayer.GetStaminaHandler().SyncStamina(1000,1000);
            currentPlayer.GetStatStamina().Set(currentPlayer.GetStaminaHandler().GetStaminaCap());
			}
			if (GetModule(SafeZone)) { SafeZone.Cast(GetModule(SafeZone)).SafeZoneHandle(currentPlayer); }
			m_currentPlayer++;
		}
	}

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

		playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");
		Class.CastTo(m_player, playerEnt);
		
		GetGame().SelectPlayer(identity, m_player);
		return m_player;
	}
	
	override void OnEvent(EventType eventTypeId, Param params) 
	{
		super.OnEvent(eventTypeId,params);
		
		switch(eventTypeId)
		{
			case ChatMessageEventTypeID:
				 ChatMessageEventParams chat_params = ChatMessageEventParams.Cast(params);
				 if (chat_params.param1 == 0 && chat_params.param2 != "") //trigger only when channel is Global == 0 and Player Name does not equal to null
					{
						Param4<int,string,string,string> request_info = new Param4<int,string,string,string>(chat_params.param1, chat_params.param2, chat_params.param3, chat_params.param4);
						AdminTool.Cast(GetModule(AdminTool)).RequestHandler(request_info); //Send the param to Admintools
					}
			break;
		}
	}
	
	void GlobalMessage(int Channel, string Message)
	{
		if (Message != "")
		{
			GetGame().ChatPlayer(Channel,Message);
		}
	}

	void PlayerCounter()
	{
		array<Man> players = new array<Man>;
	    GetGame().GetPlayers( players );
	    int numbOfplayers = players.Count();
	    GlobalMessage(1,"Online Players: "+ numbOfplayers.ToString());
	}
	
	override void 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
			{

				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(4);
				
				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:
			{
				break;
			}
			
			case 3:
			{
				break;
			}
			
			case 4:
			{
				break;
			}
			
			case 5:
			{
				break;
			}
			
			case 6:
			{
				break;
			}
			
		}
	}
}

 

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

BorizzK  блин не получается даже на ваниль поставить(((челик стартует в обычном луте(((
посмотри пожалуйста мой инит файл


void 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.5, 0.8 );
	weather.GetRain().SetForecastChangeLimits( 0.1, 0.3 );
	weather.GetFog().SetForecastChangeLimits( 0.05, 0.10 );

	weather.GetOvercast().SetForecastTimeLimits( 3600 , 3600 );
	weather.GetRain().SetForecastTimeLimits( 300 , 300 );
	weather.GetFog().SetForecastTimeLimits( 3600 , 3600 );

	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(30);
	weather.SetWindFunctionParams(0.1, 1.0, 50);
}

class CustomMission: MissionServer
{
	
ref array<string> m_pointPlayerPVP = new array<string>;;
ref map<string, int> m_playersSetUID = new map<string, int>;

override void OnInit()
    {
		string line_content; 
		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;
		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);
		}		
    }	
	void SetRandomHealth(EntityAI itemEnt)
	{
		int rndHlt = Math.RandomInt(40,100);
		itemEnt.SetHealth("","",rndHlt);
	}

	override PlayerBase 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);
		
		return m_player;
	}
	
	override void 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
			{

				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(4);
				
				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:
			{
				break;
			}
			
			case 3:
			{
				break;
			}
			
			case 4:
			{
				break;
			}
			
			case 5:
			{
				break;
			}
			
			case 6:
			{
				break;
			}
			
		}
	}
};
  
Mission CreateCustomMission(string path)
{
	return new CustomMission();
}

уже сума схожу от бесконечного чила попыток исправить методом тыка((((

Share this post


Link to post
Share on other sites

mastaZz 
Ты не внимателен

 

file = OpenFile("$profile:playersSetUID.ini", FileMode.READ); видишь такое?

файл то сам есть где списочек

 

UID|номер

типа

01001001817|1

 

?

 

Ну и в функции StartingEquipSetup вызываемой сервером по умолчанию для навешивания лута на нового зверя

 

int numSet = Math.RandomInt(2,6)

 

ну и далее (обрати внимание на переменную numSet)

 

switch( numSet ) //Раздаем лут
  {
   case 1: //ADMIN
   { ...

 

читайте короче соответствующую тему

 

 

P.S. А то что далее (и то что в выборе пусто) не смущает

а теперь сравни что в теле case 1:

 

   case 2:
   {
    break;
   }
   
   case 3:
   {
    break;
   }
   
   case 4:
   {
    break;
   }
   
   case 5:
   {
    break;
   }
   
   case 6:
   {
    break;
   }
 

не смущает это все?

 

Считаю, надо основам программирования хотя бы обучиться

Ну или гуглом воспользоваться, почитать и тп

Тут не ресурс обучения программированию с 0

 

 

Share this post


Link to post
Share on other sites

BorizzK файл playersSetUID.ini внём всё прописанно мой айди | и цифра 1
какая разница если в кейсе 2-6 ничего нету.
функции player.RemoveAllItems(); тоже нету и как следствие падает  общий сет (тряпка фаер)

 

Ну и в функции StartingEquipSetup вызываемой сервером по умолчанию для навешивания лута на нового зверя

 

int numSet = Math.RandomInt(2,6)

 

ну и далее (обрати внимание на переменную numSet)

 

switch( numSet ) //Раздаем лут
  {
   case 1: //ADMIN
   { ...

 

читайте короче соответствующую тему


это не очень понятно??? и какую тему соотвецтвенно читать???
P.S. основы програмирования(С++) знаю циклы,итераторы, свичи, функции,масивы и т.д. просто покачто не очень понимаю отнасительно игры

 

Share this post


Link to post
Share on other sites

BorizzK Нафига давать расширения файлу - "ini", если он таковым не является?

псц, загрузить якобы ини(а на деле обычный текстовик) и сплитить его в коде для парсинга...

Поменяй в гайде хоть расширение, ото один накидал, а другие в тупую скопипастили.

Share this post


Link to post
Share on other sites

Ну так раз разбираетесь? )))

 

тема кстати эта и есть

см перв пост

 

ну и как бы

 

Пробегитесь по всему классу

CustomMission: MissionServer

 

Что мы видим?

 

Сначала

 

FileHandle file = OpenFile("$profile:pointPlayerPVP.lst", FileMode.READ); и далее

чтение координат для спавна

 

  if (file != 0) // если файл есть и открыт
  {
   while ( FGets( file,  line_content ) > 0 )   //пока строка прочитанная из файла больше 0 - те имеет содержимое
   {
    m_pointPlayerPVP.Insert( line_content); //запихнуть в ранее определенный массив типа строка (см начало функции OnInit)
   }
   CloseFile(file); //закрыть файл
  } 
 

то же самое ниже для других целей

 

file = OpenFile("$profile:playersSetUID.ini", FileMode.READ); //FileHandle (тип переменной для файла) не указываем тк уже определено выше

и ниже в цикле читаем

 

  if (file != 0)
  {
   while ( FGets( file,  line_content ) > 0 )   
   {
    strFileParam = new array<string>;
    line_content.Split( "|", strFileParam );  //тут прочитанный текст прочитанный в  line_content делится на 2 части - резделитель | и пишется в переменную типа массмв strFileParam
    m_playersSetUID.Insert(strFileParam.Get(0), strFileParam.Get(1).ToInt()); //m_playersSetUID массив типа map (отдельная тема для разговора ) определен выше для всего класса и тут пишется в него 
   }
   CloseFile(file);
  }  

 

ну и далее...

 

Share this post


Link to post
Share on other sites

NoNameUltima Всегда и везде использую ini для файлов в которых параметр = или | значение

а для списков lst

В винде кстати все ini изначально текстовые

да и не только в винде

 

Что такого в .ini или lst?

Какая разница какое расширение?

 

Давай я их .cfg или .conf как в линухе обзову

или еще лучше

как для постфикаса или сейдмайла .cf

 

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites

BorizzK у мизива в группе вк в подполье вот что написанно

Кроме того, что вчерашним обновлением "сломали" возможность открывать консервы и тому подобное, разработчики запретили команду OpenFile. Что как раз я активно использовал в написании модов.
И не понятно временный это запрет или нет....

Share this post


Link to post
Share on other sites

mastaZz OpenFile прекрасно работает  с  FileMode.READ

разрабы запретили по умочланию FileMode.WRITE

Но его можно включить параметром запуска сервера - -scrallowfilewrite

и все работает

просто дыра в серваке нашлась

и инфа у Виталия немного устарела

пост у Виталия от какого числа?

 

Edited by BorizzK (see edit history)

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 paranoyk
      Делается это немного нудно,но сравнительно просто (когда есть точки спавна).
      При спавне Land_Wreck_Uaz с помощью оффлайнера получим строку следующего вида.
      SpawnObject( "Land_Wreck_Uaz", "14348.268555 4.133186 13191.887695", "0.000000 0.000000 0.000000" );
      Нам необходимо задать точку для спавна "сетки лута".
      Для этого мы в файл по mapgrouppos.xml прописываем координаты взятые из строчки для спавна объекта (выше).
      <group name="Land_Wreck_Uaz" pos="14348.268555 4.133186 13191.887695" rpy="0.000000 0.000000 0.000000" a="0.000000" />
       
      group name="Land_Wreck_Uaz" pos="14348.268555 4.133186 13191.887695 - координаты запавненого УАЗика.
      rpy="0.000000 0.000000 0.000000" - числовые значения Yaw,Pitch,Roll соответственно. Берём их из всё той же строчки, но важно помнить что они там записаны в обратном порядке.
      a="0.000000"- угол порота сетки относительно угла поворота......короче! (Yaw-90) х (-1) Уже писал,что можно играться с 360 градусами,но пишу всегда полученное значение,проблем нет.

      И главное "сетка лута". Изначально её УАЗик не имеет, пишем её сами в файл mapGroupProto.xml .
       
      <group name="Land_Wreck_Uaz" lootmax="11"> <usage name="...класс вещей для спавна" /> <usage name="...класс вещей для спавна" /> <container name="lootfloor" lootmax="5"> -"контейнер" для описания спавна, максимальное колличество в спавне. <category name="...категория вещей для спавна" /> (возможен тэг- <tag name="floor" /> или <tag name="shelves" /> ) <point pos="0.511211 -0.372110 0.0254000" range="0.244141" height="0.513353" />-левое сиденье <point pos="-0.320921 -0.387334 -0.400000" range="0.310141" height="0.610353" />-правое переднее седение полик <point pos="-0.000921 -0.383194 0.301000" range="0.400186" height="0.590424" />-место за кпп середина <point pos="-0.211211 0.228620 -0.698000" range="0.360231" height="0.520142" />-правая часть капота возле стекла <point pos="0.681211 0.216190 -1.358000" range="0.262781" height="0.621102" />левая часть капота впереди </container> <container name="lootshelves" lootmax="3"> -"контейнер" для описания спавна, максимальное колличество в спавне. <category name="...категория вещей для спавна" /> (возможен тэг- <tag name="floor" /> или <tag name="shelves" /> ) <point pos="-0.406211 -0.098190 -1.131250" range="0.246819" height="0.620459" />-правое переднее крыло <point pos="0.306211 -0.436570 -1.651250" range="0.424141" height="0.810353" />- центр переднего бампера <point pos="0.906211 -0.359570 -1.664250" range="0.124141" height="0.100353" />-слева на бампере </container> <container name="lootweapons" lootmax="3">-"контейнер" для спавна длинногоствольного оружия, максимальное колличество в спавне, патронов и гранат. <category name="weapons" /> <category name="explosives" /> (возможен тэг- <tag name="floor" /> или <tag name="shelves" /> ) <point pos="0.256211 -0.372050 1.264250" range="0.724141" height="1.313353" /> -центр багажника <point pos="0.868211 -0.138190 1.398000" range="0.293625" height="0.605487" />-заднее левое крыло <point pos="-0.506211 -0.108190 1.431250" range="0.250879" height="0.582143" />-заднее правое крыло </container> </group> Вставляем нужные категории,классы и тэги,это практически конструктор.
      К примеру у меня пока выглядит так -
       
      <group name="Land_Wreck_Uaz" lootmax="11"> <usage name="Military" /> <usage name="Industrial" /> <usage name="Office" /> <container name="lootfloor" lootmax="5"> <category name="food" /> <category name="clothes" /> <point pos="0.511211 -0.372110 0.0254000" range="0.244141" height="0.513353" /> <point pos="-0.320921 -0.387334 -0.400000" range="0.310141" height="0.610353" /> <point pos="-0.000921 -0.383194 0.301000" range="0.400186" height="0.590424" /> <point pos="-0.211211 0.228620 -0.698000" range="0.360231" height="0.520142" /> <point pos="0.681211 0.216190 -1.358000" range="0.262781" height="0.621102" /> </container> <container name="lootshelves" lootmax="3"> <category name="tools" /> <category name="vehiclesparts" /> <point pos="-0.406211 -0.098190 -1.131250" range="0.246819" height="0.620459" /> <point pos="0.306211 -0.436570 -1.651250" range="0.424141" height="0.810353" /> <point pos="0.906211 -0.359570 -1.664250" range="0.124141" height="0.100353" /> </container> <container name="lootweapons" lootmax="3"> <category name="weapons" /> <category name="explosives" /> <point pos="0.256211 -0.372050 1.264250" range="0.724141" height="1.313353" /> <point pos="0.868211 -0.138190 1.398000" range="0.293625" height="0.605487" /> <point pos="-0.506211 -0.108190 1.431250" range="0.250879" height="0.582143" /> </container> </group> Также можно даже исключить полностью строчку lootmax="...". Большой разницы я не заметил.
      Сразу скажу,баги стандартные -длинноствол в багажнике может пробить ствол,иногда возможна "левитация" предметов.
      Во общем как то так.
      (возможно позже вылож сетку и для обломков V3S и С130. Решение для "заброшенной колонны" на севере-тоже в процессе.Кому надо-пишите)
    • By AntonivkA
      Итак, господа. В 1.05 разрабы похоже сломали механику спавна лута. У меня предметы стали спавниться там, где их не должно быть. Заметил сразу, поскольку таблица лута у меня переделана основательно. Например, Песочный барьер у меня прописан только на Военках и Полиц.участке, и все работало корректно до 1.05. Теперь, песочный барьер я нахожу в гаражах, мастерских и жилых домах вокруг полиц. участка и в самом полиц. участке. Помимо этого, ребята стали замечать и скинули инфу, что на СЗ в гаражах и мастерских стал появлятся военный лут, хотя его там не должно быть.
      Кто-что скажет по этому поводу. Заметил ли кто-то подобное у себя?
       
    • By 123new
      Нам понадобится:
      1. Сервер DayZ Standalone (см. тему вот эту)
      2. Notepad++: бесплатно на оф. сайте
      3. Немного времени и настойчивости (обычно бывает в комплекте и так)
       
      И так, начинаем:
      1. Открываем блокнотом mpmissions\dayzOffline.chernarusplus\init.c
      P.S. Имя папки dayzOffline.chernarusplus у вас может отличаться, будьте внимательны
      2. В начале файла добавляем:
      static int time_repeat_info_players = 10; //in seconds static string file_name_info_players = "$profile:PlayersLogFile.txt"; static void WriteFile(string file_name, string text) { private FileHandle fhandle; if ( !FileExist(file_name) ) { fhandle = OpenFile(file_name, FileMode.WRITE); } else { fhandle = OpenFile(file_name, FileMode.APPEND); } if ( fhandle == 0 ) { Print("[#Запись_в_файл]: Не удалось открыть файл для записи: " + file_name); Print("[#Запись_в_файл]: [Запись]: " + text); return; } FPrintln(fhandle, text); CloseFile(fhandle); } static void WritePlayersInfo() { array<Man> players = new array<Man>; Man player; Man player_test; GetGame().GetPlayers( players ); if (players.Count() > 0) { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } for ( int i = 0; i < players.Count(); ++i ) { player_test = players.Get(i); if( player_test ) { PlayerIdentity p_identity = player_test.GetIdentity(); private string coord_pl = player_test.GetPosition().ToString(); private string Name_P = p_identity.GetName(); private string UID_P = p_identity.GetPlainId(); WriteFile(file_name_info_players, "User name: " + Name_P + " UID: " + UID_P + " Coords: " + coord_pl); } } } else { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } } } Где 'PlayersLogFile.txt' меняем на нужное вам имя файла, а в 'time_repeat_info_players' настраиваем время повтора проверки списка игроков для перезаписи файла
      3. Находим в файле блок 'void main()' и в его конце перед закрывающей '}', поумолчанию это строка
      weather.SetWindFunctionParams(0.1, 0.3, 50); добавляем ниже строку:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(WritePlayersInfo, (time_repeat_info_players * 1000), true); 4. Готово, если не допустили ошибок, при наличии хотя бы 1 игрока на сервере ваш файл с данными по игрокам будет присутствовать и заполняться информацией, а в случае их отсутствия удаляться.
  • 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.