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

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

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

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

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
BorizzK

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

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

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

 

Для начала в папке профиля сервера которая указана в параметре запуска сервера -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;
			}
			
		}
	}

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

 

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

 

 

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

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


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





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

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


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

Стим уид

зайти в стим

и в профиль

и взять id из url

вот например

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

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

 

ну или

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

 

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

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

 

 

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

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


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

BorizzK сорян оч поздно было уже глючело)

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


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

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

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


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

NoNameUltima 

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

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


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

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

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


Ссылка на сообщение
Поделиться на других сайтах
18 минут назад, mastaZz сказал:

NoNameUltima 

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

бред

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


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

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

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
Только что, mastaZz сказал:

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

 

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

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

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


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

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

 

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


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

BorizzK прописал всё в ванильном ините не работает может чтото отключили при обнове после написания данного гайда???

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


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

Хз че там вмванильном

У мну все работает

Значит чет не так прописали

 

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


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

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

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

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


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

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

 

 

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


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

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

 

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

 

int numSet = Math.RandomInt(2,6)

 

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

 

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

 

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


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

 

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


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

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

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

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

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


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

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

 

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

см перв пост

 

ну и как бы

 

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

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

 

ну и далее...

 

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


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

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

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

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

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

 

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

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

 

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

или еще лучше

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

 

 

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

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


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

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

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

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


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

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

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

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

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

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

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

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

 

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: 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. Решение для "заброшенной колонны" на севере-тоже в процессе.Кому надо-пишите)
    • Автор: AntonivkA
      Итак, господа. В 1.05 разрабы похоже сломали механику спавна лута. У меня предметы стали спавниться там, где их не должно быть. Заметил сразу, поскольку таблица лута у меня переделана основательно. Например, Песочный барьер у меня прописан только на Военках и Полиц.участке, и все работало корректно до 1.05. Теперь, песочный барьер я нахожу в гаражах, мастерских и жилых домах вокруг полиц. участка и в самом полиц. участке. Помимо этого, ребята стали замечать и скинули инфу, что на СЗ в гаражах и мастерских стал появлятся военный лут, хотя его там не должно быть.
      Кто-что скажет по этому поводу. Заметил ли кто-то подобное у себя?
       
    • Автор: 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 игрока на сервере ваш файл с данными по игрокам будет присутствовать и заполняться информацией, а в случае их отсутствия удаляться.
  • Наш выбор

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.