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

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

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

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

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

Выбор точек спавна игроков по UID из файла

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




1 час назад, BorizzK сказал:

вот то что внутри {} класса я называю телом класса

То есть

{	
	void SetRandomHealth(EntityAI itemEnt)
	{
		if ( itemEnt )
		{
			int rndHlt = Math.RandomInt(55,100);
			itemEnt.SetHealth("","",rndHlt);
		}
	}

	override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName)
	{
		Entity playerEnt;
		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)
	{
		EntityAI itemTop;
		EntityAI itemEnt;
		ItemBase itemBs;
		float rand;
		
		itemTop = player.FindAttachmentBySlotName("Body");
		
		if ( itemTop )
		{
			itemEnt = itemTop.GetInventory().CreateInInventory("Rag");
			if ( Class.CastTo(itemBs, itemEnt ) )
				itemBs.SetQuantity(4);

			SetRandomHealth(itemEnt);
			
			itemEnt = itemTop.GetInventory().CreateInInventory("RoadFlare");
			SetRandomHealth(itemEnt);
			
			rand = Math.RandomFloatInclusive(0.0, 1.0);
			if ( rand < 0.35 )
				itemEnt = player.GetInventory().CreateInInventory("Apple");
			else if ( rand > 0.65 )
				itemEnt = player.GetInventory().CreateInInventory("Pear");
			else
				itemEnt = player.GetInventory().CreateInInventory("Plum");
		
			SetRandomHealth(itemEnt);
		}
	}
};

это тело класса CustomMission: MissionServer или проще говоря класса миссии, верно?

А "void SetRandomHealth(EntityAI itemEnt)" - функция класса миссии? И

{
		if ( itemEnt )
		{
			int rndHlt = Math.RandomInt(55,100);
			itemEnt.SetHealth("","",rndHlt);
		}
	}

 - тело фнкции (или исполняемый код функции) класса миссии void SetRandomHealth(EntityAI itemEnt) ,так?

А вот это:

override void StartingEquipSetup(PlayerBase player, bool clothesChosen)

-переопределенные переменные (PlayerBase player, bool clothesChosen), используемые функцией класса миссии StartingEquipSetup?

А это

{
		EntityAI itemTop;
		EntityAI itemEnt;
		ItemBase itemBs;
		float rand;
		
		itemTop = player.FindAttachmentBySlotName("Body");
		
		if ( itemTop )
		{
			itemEnt = itemTop.GetInventory().CreateInInventory("Rag");
			if ( Class.CastTo(itemBs, itemEnt ) )
				itemBs.SetQuantity(4);

			SetRandomHealth(itemEnt);
			
			itemEnt = itemTop.GetInventory().CreateInInventory("RoadFlare");
			SetRandomHealth(itemEnt);
			
			rand = Math.RandomFloatInclusive(0.0, 1.0);
			if ( rand < 0.35 )
				itemEnt = player.GetInventory().CreateInInventory("Apple");
			else if ( rand > 0.65 )
				itemEnt = player.GetInventory().CreateInInventory("Pear");
			else
				itemEnt = player.GetInventory().CreateInInventory("Plum");
		
			SetRandomHealth(itemEnt);
		}
	}

собственно, исполняемый код, при вызове функции класса миссии StartingEquipSetup?

...Ну у Вас и язык, ребятушки! Фух!..

Осталось совсем тьфу - научиться отличать функции класса от функций исполняемого кода внутри функции, а потом ещё уяснить какая функция чего делает, и какие у неё должны быть определены переменные. Ах да! Всё это ещё надо отполировать синтаксисом. 

 

Вы, блин, это всё вообще серьёзно?! Это ж сколько лет на это нада угробить ваще?! BorizzK , теперь Вы у меня где-то на одной полке с Юрой, нашим героическим Гагариным!.. Сымаю шляпу!:blink:

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

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


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

PJIIOxa Вижу что подгружается все норм

CRIPT       : ::: Init.c ::: LoadPlayersSpawnPoints() ::: Read File: $CurrentDir:\mpmissions\dayzOffline.chernarusplus\_CONF\playersSpawnPoints.lst :::
SCRIPT       : ::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c1 Add UID 76561198015929553 spawnpoint: 13582.91 0 12216.39 to m_playersSpawnPoints
SCRIPT       : ::: Init.c ::: LoadPlayersSpawnPoints() ::: Read Line c2 Add UID 76561998116927209 spawnpoint: 3000 0 3000 to m_playersSpawnPoints
SCRIPT       : ::: Init.c ::: LoadPlayersSpawnPoints() ::: Players personal spawn points count: 2 :::

 

А  вот где игроку что-то там присваивается не вижу

 

Эта

Выложи весь файл init.c

 

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


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

BorizzK 

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

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


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

VIRrusR 

 

Смотри

 

class myclass //это класс
{

  //Это  тело класс

 void function() //это функция в классе без параметров
 {
  //Это тело функции
  //Тут код который выполняется при вызове функции
 }

 void function2( string a, int b) //это функция в классе c параметрами строковым и челочисленным
 {
  //Это тело функции
  //Тут код который выполняется при вызове функции
   Print(a); //выведет в лог строку а
   Print(b.ToString()); //выведет в лог число b приобразованное в строку
 }

}

Однако

Это созданный нами класс

 

А класс миссии ЭТО расширения щтатного класса MissionServer который используется сервером во время его работы - те икспользуются его штатные функции

 

class CustomMission : MissionServer

 

а значит мы можем переопределять в этом классе штатные функции из класса MissionServer

 

тем самым вместо шататных функций будут выполняться переопределенные НАШИ

 

override void StartingEquipSetup(PlayerBase player, bool clothesChosen)

 

переопределяет штатную функцию и мы можем добавить в нее свой функционал

 

если штатная функция большая не надо тащить весь ее код в свой

 

просто сделаем так

 

override void OnInit()

{

 

свой код

 

super.OnInt();

 

}

 

сначала выполнится наш код

затем код из штатной функции

 

Но есть ограничения!

 

на серверной стороне в init.c и его включениях так можно обращаться только с серверным классом из Mission

 

с классом PlayerBase из World и тп не прокатит

 

потому распаковывают scripts в корень сервера и переопределяют куски класса в добавленных в соответствующие папки файлах .c так

 

например

modded class PlayerBase extends ManBase

{

 override void EEKilled( Object killer )

{

 //свой код

 super.EEKilled( killer ); //теперь вызов штатной функции

}

}

 

и запускают сервер с ключем -filepatching

 

 

 

 

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

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


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

PJIIOxa 

 

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

 

Ты забыл

 

		if (identity.GetPlainId())
		{
			string p_UID = identity.GetPlainId();
			if (m_playersSpawnPoints.Contains(p_UID))
			{
				vector p_SpawnPoint = m_playersSpawnPoints.Get(p_UID).ToVector();
				Print ("::: init.c ::: PlayerBase CreateCharacter ::: Selected personal spawn point Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: "+ p_UID);
			}
		}

 

вот это следом

 

if (p_SpawnPoint) pos = p_SpawnPoint;

 

Я там специально про перезапись pos написал, но в код не добавил, что бы посмотреть на Вашу внимательность

 

или можно сделать так

 

		if (identity.GetPlainId())
		{
			string p_UID = identity.GetPlainId();
			if (m_playersSpawnPoints.Contains(p_UID))
			{
				pos = m_playersSpawnPoints.Get(p_UID).ToVector();
				Print ("::: init.c ::: PlayerBase CreateCharacter ::: Selected personal spawn point Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: "+ p_UID);
			}
		}

 

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

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


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

Вобщем юзайте класс

Так удобнее и проще

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


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

BorizzK спасибо переделал юзаю класс
все работает идеально

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


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

BorizzK а экипировку по UID не подскажите как прописать отдельным файлом

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


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

PJIIOxa Нужно переделать код этого скрипта и использовать для лута

Попробуете сами справится

И в этой теме это не обсуждаем

Вопросы в разделе ПОМОЩЬ

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


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

BorizzK , большое спасибо за проделанную работу, разъяснения и проявленное терпение! 

Всё работает!:laugh:

Специально для дремучих и безграмотных, типа меня, рассказываю как делать пошагово, ибо в теме много слов, вопросов и т.д.:

1. Вписываем в самое начало файла init.c  строки:

#include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\SpawnPoints\\SpawnPointsClass.c" //Server_SpawnPoints_Class
ref Server_SpawnPoints_Class Server_SpawnPoints = new Server_SpawnPoints_Class();

Если там у Вас уже есть какие-то подключения через #include, то прямо под ними, следующей строкой.

Далее, после строки "override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName)" , вместо того, что там есть вписываем вот это:

{
      	//Координаты по UID
		vector p_SpawnPoint = Server_SpawnPoints.GetPlayerSpawnPoint(identity); //See Server_SpawnPoints_Class
		if (p_SpawnPoint)
		{
			pos = p_SpawnPoint;
			Print ("::: init.c ::: PlayerBase CreateCharacter ::: Selected personal spawn point: Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: " + identity.GetPlainId());
		}
      	//Координаты по UID

        Entity playerEnt;
		playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");//Creates random player
		Class.CastTo(m_player, playerEnt);
		
		GetGame().SelectPlayer(identity, m_player);
		
		return m_player;
	}

Для "ванильного" init.c должно получится так:

#include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\SpawnPoints\\SpawnPointsClass.c" //Server_SpawnPoints_Class
ref Server_SpawnPoints_Class Server_SpawnPoints = new Server_SpawnPoints_Class();

void main()
{
	//INIT WEATHER BEFORE ECONOMY INIT------------------------
	Weather weather = g_Game.GetWeather();

	weather.MissionWeather(false);    // false = use weather controller from Weather.c

	weather.GetOvercast().Set( Math.RandomFloatInclusive(0.4, 0.6), 1, 0);
	weather.GetRain().Set( 0, 0, 1);
	weather.GetFog().Set( Math.RandomFloatInclusive(0.05, 0.1), 1, 0);

	//INIT ECONOMY--------------------------------------
	Hive ce = CreateHive();
	if ( ce )
		ce.InitOffline();

	//DATE RESET AFTER ECONOMY INIT-------------------------
	int year, month, day, hour, minute;
	int reset_month = 9, reset_day = 20;
	GetGame().GetWorld().GetDate(year, month, day, hour, minute);

    if ((month == reset_month) && (day < reset_day))
    {
        GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute);
    }
    else
    {
        if ((month == reset_month + 1) && (day > reset_day))
        {
            GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute);
        }
        else
        {
            if ((month < reset_month) || (month > reset_month + 1))
            {
                GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute);
            }
        }
    }
}

class CustomMission: MissionServer
{	
	void SetRandomHealth(EntityAI itemEnt)
	{
		if ( itemEnt )
		{
			int rndHlt = Math.RandomInt(55,100);
			itemEnt.SetHealth("","",rndHlt);
		}
	}

	override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName)
	{
      	//Координаты по UID
		vector p_SpawnPoint = Server_SpawnPoints.GetPlayerSpawnPoint(identity); //See Server_SpawnPoints_Class
		if (p_SpawnPoint)
		{
			pos = p_SpawnPoint;
			Print ("::: init.c ::: PlayerBase CreateCharacter ::: Selected personal spawn point: Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: " + identity.GetPlainId());
		}
      	//Координаты по UID

        Entity playerEnt;
		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)
	{
		EntityAI itemTop;
		EntityAI itemEnt;
		ItemBase itemBs;
		float rand;
		
		itemTop = player.FindAttachmentBySlotName("Body");
		
		if ( itemTop )
		{
			itemEnt = itemTop.GetInventory().CreateInInventory("Rag");
			if ( Class.CastTo(itemBs, itemEnt ) )
				itemBs.SetQuantity(4);

			SetRandomHealth(itemEnt);
			
			itemEnt = itemTop.GetInventory().CreateInInventory("RoadFlare");
			SetRandomHealth(itemEnt);
			
			rand = Math.RandomFloatInclusive(0.0, 1.0);
			if ( rand < 0.35 )
				itemEnt = player.GetInventory().CreateInInventory("Apple");
			else if ( rand > 0.65 )
				itemEnt = player.GetInventory().CreateInInventory("Pear");
			else
				itemEnt = player.GetInventory().CreateInInventory("Plum");
		
			SetRandomHealth(itemEnt);
		}
	}
};
  
Mission CreateCustomMission(string path)
{
	return new CustomMission();
}

 

2. Создаём по пути "/serverfiles/mpmissions/dayzOffline.chernarusplus" на Вашем сервере папку \_MOD\

3. В папке \_MOD\  создаём ещё одну папку \SpawnPoints\

4. В папку \SpawnPoints\ помещаем файл "SpawnPointsClass.c" следующего содержания:

//Version 06.03.2019.2035
//Author: Borizz.K aka [G.P.]NOIZZ(MC2) (s-platoon.ru)

class Server_SpawnPoints_Class
{	
	ref map<string,string> m_playersSpawnPoints = new map<string,string>;
	
	//Конструктор - выполняется всегда при инициализации класса
	void Server_SpawnPoints_Class()
	{
		Print("::: [Server_SpawnPoints_Class] ::: Init :::");
		LoadPlayersSpawnPointsByUid();
	}
	
	//Деструктор - выполняется всегда при деинициализации класса (например при корректной остановке сервера)
	void ~Server_SpawnPoints_Class()
	{
		Print("::: [Server_SpawnPoints_Class] ::: UnInit :::");
	}

	void LoadPlayersSpawnPointsByUid()
	{
		/*
			Файл playersSpawnPoints.lst кладем в папку указанную в параметре запуска сервера -profiles= тогда путь будет "$Profiles:\\"
			или если кладем в файл в mpmissions\dayzOffline.chernarusplus\_CONF путь будет "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\"
			Путь меняется в переменной m_SettingsPath - "$Profiles:\\" или "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\"
			Можете указать свой путь, но он должен быть либо в $Profiles: либо в $CurrentDir:
			Формат файла:
			Steam UID в привычном виде 17 цифр Координаты Комментарий (через пробелы)
			Помните любая ошибка может привести к крашу сервера
			Не желательны пустые строки!
			Пример:
			
			76562298156537008 1300 0 5600 Дима
			76561998116927209 3000 0 3000 Вася из Новороссийска
			
			Про массив: ref map<string, string> m_playersSpawnPoints = new map<string, string>;
			m_playersSpawnPoints тут массив типа map, где каждый элемент массива состоит из 2х ячеек.
			1. Индекс - тип string
			2. Значение - тип string
		
			Пример работы с массивом типа map
			Запись в массив
			m_playersSpawnPoints.Insert("76562298156537008", "1300 0 5600"); //записываем первый элемент - индекс dayz, значение 10
			m_playersSpawnPoints.Insert("76561998116927209", "3000 0 3000"); //записываем второй элемент - индекс dayzf, значение 17
			Чтение из массива:
			Получаем значение 0го элемента
			string m = m_playersSpawnPoints.GetElement(0); // = "1300 0 5600"
			Получаем индекс 0го элемента
			string name = m_playersSpawnPoints.GetKey(0); / /= "76562298156537008" 
			Получаем значение по индексу (в данном случае нас интерисует именно ЭТО)
			string n = m_playersSpawnPoints.Get("76561998116927209"); // = "3000 0 3000" //затем n переводим в вектор
			
			Usage in CreateCharacter function for change default spawn position:
			
			string PlayerUID = identity.GetPlainId();
			if (PlayerUID)
			{
				if (m_playersSpawnPoints.Contains(PlayerUID)
				{
					pos = m_playersSpawnPoints.Get(PlayerUID).ToVector();
				}
			}
			
		*/

		string 			FileName		= "playersSpawnPoints.lst";
		string			m_SettingsPath 	= "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\"; //Folder with config files - .ini or .lst // Or "$Profiles:\\"
		FileHandle		file;
		string			file_line;
		array<string> 	read_line;	
		int 			linecount		= 0;	
		
		//Comments check
		bool skipline = false;
		bool skipblock = false;
		//Comments check

		file = OpenFile(m_SettingsPath + FileName, FileMode.READ);
		if (file != 0)
		{
			Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read File: " + m_SettingsPath + FileName + " :::");
			
			while (FGets(file, file_line) >= 0)   
			{
				linecount++;

				//Comments check and skip
				if (file_line.IndexOfFrom(0,"//") == 0 || file_line.IndexOfFrom(0,"#") == 0 || file_line.IndexOfFrom(0," ") == 0 || file_line.Length() <= 0)
				{
					skipline = true;
				}
				else
				{
					skipline = false;
				}
				if (file_line.IndexOfFrom(0,"/*") == 0)
				{
					skipblock = true;
				}
				else if (file_line.IndexOfFrom(0,"*/") == 0)
				{
					skipblock = false;
					skipline = true;
				}
				//Comments check

				if (!skipline && !skipblock)
				{
					read_line = new array<string>;
					file_line.Split(" ",read_line);
					if (read_line.Count() >= 4)
					{
						if (read_line.Get(0).Length() == 17)
						{
							if (read_line.Get(1).ToFloat() > 0 && read_line.Get(3).ToFloat() > 0)
							{
								if (!m_playersSpawnPoints.Contains(read_line.Get(0)))
								{
									m_playersSpawnPoints.Insert(read_line.Get(0), read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3)); // UID, Position
									Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Add UID " + read_line.Get(0) + " spawnpoint: " + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + " to m_playersSpawnPoints");
								}
								else
								{
									Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID " + read_line.Get(0) + " duplicated, check file!");
								}
							}
							else
							{
							Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Position error: '" + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + "' :::");
							}
						}
						else
						{
							Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID error: " + file_line + " :::");
						}
					}
					else
					{
					Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " have errors: " + file_line + " :::");
					}
				}
			}
			CloseFile(file);
			if (m_playersSpawnPoints.Count() > 0)
			{
				Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Players personal spawn points count: " + m_playersSpawnPoints.Count() + " :::");
			}
			else
			{
				Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Players personal spawn points is not loaded! :::");
			}
		}
		else
		{
			Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Error open file: " + m_SettingsPath + FileName + " :::");
		}
	}
	
	vector GetPlayerSpawnPoint(PlayerIdentity identity)
	{
		vector pos;
		
		if (identity.GetPlainId())
		{
			string p_UID = identity.GetPlainId();
			if (m_playersSpawnPoints.Contains(p_UID))
			{
				pos = m_playersSpawnPoints.Get(p_UID).ToVector();
				Print ("::: [Server_SpawnPoints_Class] ::: GetPlayerSpawnPoint ::: Selected personal spawn point Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: "+ p_UID);
				return pos;
			}
		}
		return "0 0 0";
	}
}

5. Создаём по пути "/serverfiles/mpmissions/dayzOffline.chernarusplus" на Вашем сервере папку \_CONF\

6. В папку \_CONF\ помещаем файл "playersSpawnPoints.lst" следующего содержания:

6561198156923007 2698.36 0 5989.59 ПЕТЯ
//Тут комментарий

Где: 

6561198156923007 - Steam ID игрока

2698.36 0 5989.59 - координаты точки возрождения в формате X, Z, Y (долгота, высота , широта), если высота равна нулю, то заспавнит на поверхность            земли или ближайшую твёрдую поверхность.

ПЕТЯ - имя игрока для Вас (ни на что не влияет), после "//" можете вписать любое пояснение (// противный тип из клана чумазеков)

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

 

Запускаем сервер, убиваем персонажа, наслаждаемся респавном по заданным координатам.

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


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

Давайте разберем как это все работает по строкам, что бы новичкам было понятно

Описал как мог - тк немного не трезв и все такое )))

Многим так станет понятней

 

//Version 06.03.2019.1030
//Author: Borizz.K aka [G.P.]NOIZZ(MC2) (s-platoon.ru)

class Server_SpawnPoints_Class //Это класс
{	//Это открывающая скобка - начало тела класса

	 //Определяем переменную в классе - в данном случае массив типа map каждый элемент которого состоит из двух строк
	 //Первая строка это индекс, вторая значение
	 //Переменная заданная в классе дотсупна всем функциям в классе.
	 //Так же к ней можно обращаться из других классов
	 //Вот так - Server_SpawnPoints_Class.m_playersSpawnPoints
	ref map<string,string> m_playersSpawnPoints = new map<string,string>;
	
	void Server_SpawnPoints_Class() //Это определение функциии-конструктора класса - выполняется всегда при инициализации/определении класса.
	{
		Print("::: [Server_SpawnPoints_Class] ::: Init :::"); //Это выполнится при выполнении конструктора  //печать в лог
		LoadPlayersSpawnPointsByUid(); //Это выполнится при выполнении клнструктора
	}
	
	void ~Server_SpawnPoints_Class() //Это определение функциии-деструктора класса - выполняется всегда при деинициализации класса. Например при корректном завершении работы сервера.
	{
		Print("::: [Server_SpawnPoints_Class] ::: UnInit :::"); //Это выполнится при выполнении деструктора  //печать в лог
	}

	void LoadPlayersSpawnPointsByUid() //Это определение функциии
	{ //Это открывающая скобка - начало тела функции
		//Это определение переменных функции. Получить к ним доступ можно только в пределах функции
		string 			FileName		= "playersSpawnPoints.lst"; // Переменная типа строка
		string			m_SettingsPath 	= "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\"; //Folder with config files - .ini or .lst // Or "$Profiles:\\" // Переменная типа строка
		FileHandle		file; // Переменная типа файл, в нее помещается указатель на открытыфй файл
		string			file_line; //Переменная типа строка - в нашем случае сюда будет помещяться строка прочитанная из файла
		array<string> 	read_line; //Строковой массив каждый элемент которого - строка - в нашем случае сюда будет помещяться подстроки из прочтенной строки файла
		int 			linecount		= 0; //Целочисленная переменная типа - может содержать в себе только целые числа. В нашем случае счетчик строк.
		
		//Comments check
		bool skipline = false; //Логическая переменная которая может принимать значение true или false
		bool skipblock = false; //Логическая переменная которая может принимать значение true или false
		//Comments check

		file = OpenFile(m_SettingsPath + FileName, FileMode.READ); //Пытаемся открыть файл с именем из переменной FileName по пути из переменной m_SettingsPath в режиме для чтения
		if (file != 0) //Условие. Если файл открылся в переменую file попадет числовой указатель на файл, если не открылся то переменная будет содержать 0
		{ //Это открывающая скобка - начало тела условия - ЕСЛИ файл открыт
			Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read File: " + m_SettingsPath + FileName + " :::"); //печать в лог
			
			//While - это условный цикл. Цикл будет выполняться пока из файла будут читаться строки, как только будет достигнут конец файла значение функции FGets(file, file_line) станет -1 и цикла прервется 
			//Тут условие цикла совмещено с чтением строки из файла - фнкция FGets(file, file_line) читает строку из файла file и помещает ее в переменную file_line если строки кончились возвращает -1
			while (FGets(file, file_line) >= 0) 
			{ //Это открывающая скобка - начало тела цикла ПОКА
				linecount++; //Увеличиваем счетчик строк на 1. Можно так же записать как linecount = linecount + 1; но linecount++; короче

				//Comments check and skip
				//Тут мы проверям строку на наличие в ней определенных символов или их последовательностей - IndexOfFrom возвращает true или false
				// file_line.IndexOfFrom(0,"//") == 0 - если file_line содержит в 0 позиции последовательность "//" то IndexOfFrom вернет true 
				// или  file_line.IndexOfFrom(0,"#") == 0 если file_line содержит в 0 позиции "#" то IndexOfFrom вернет true 
				// или file_line.IndexOfFrom(0," ") == 0 если file_line содержит в 0 позиции " "
				// или file_line.Length() <= 0 если длинна строки file_line <= 0 Length() вернет true
				//Вобщем если хоть одно условие = true (верно) то выполнится код внутри условия
				if (file_line.IndexOfFrom(0,"//") == 0 || file_line.IndexOfFrom(0,"#") == 0 || file_line.IndexOfFrom(0," ") == 0 || file_line.Length() <= 0) //Если одно из условий верно
				{//Это открывающая скобка - начало тела условия ЕСЛИ
					skipline = true; // логическая переменная skipline примет значение true //в последствии если skipline == true то обработка текущей строки выполнена не будет
					//(в условиях сравнения всегда используется двойной знак =, одинарный используется в присвоении)
				}//Это закрывающая скобка - начало тела условия ЕСЛИ
				else //ИЛИ Если одно из условий НЕ верно
				{//Это открывающая скобка - условие ИЛИ
					skipline = false; // логическая переменная skipline примет значение false //в последствии если skipline == false то обработка текущей строки будет выполнена
				}//Это закрывающая скобка - конец тела условия ИЛИ
				
				if (file_line.IndexOfFrom(0,"/*") == 0) //file_line.IndexOfFrom(0,"/*") == 0 - если file_line содержит в 0 позиции последовательность "/*" то IndexOfFrom вернет true 
				{//Это открывающая скобка - начало тела условия ЕСЛИ
					skipblock = true; // логическая переменная skipblock примет значение true //в последствии если skipblock == true то обработка строк не будет выполняться до тех пор пока не встретится */ (см ниже условие else if (file_line.IndexOfFrom(0,"*/") >= 0)
				}//Это закрывающая скобка - конец тела условия ЕСЛИ
				else if (file_line.IndexOfFrom(0,"*/") >= 0) //file_line.IndexOfFrom(0,"*/") >= 0 - если file_line содержит в позиции 0 или дальше последовательность "*/" то IndexOfFrom вернет true
				{//Это открывающая скобка - условие ИЛИ ЕСЛИ
					skipblock = false; // логическая переменная skipblock примет значение false //в последствии если skipblock == false то обработка строк будет продолжена
					skipline = true; //логическая переменная skipline примет значение true //в последствии если skipline == true то обработка ntreotq строки не будет выполнена
				}//Это закрывающая скобка - конец тела условия ИЛИ ЕСЛИ
				//Comments check

				if (!skipline && !skipblock) //Если skipline == false и skipblock == false - то обрабатываем строку
				{//Это открывающая скобка - начало тела условия ЕСЛИ
					read_line = new array<string>; //(очищаем) массив read_line
					file_line.Split(" ",read_line); //file_line (в нее была считана строка из файла) делится на подстроки (разделителем является пробел) и каждая подстрока загоняется последовательно в элементы массива read_line
													//Если скажем file_line содержит в себе "Вася Ваня Петя" то элемент 0 массива read_line будет содержать Вася, элемент 1 Ваня, элемент 2 Петя, а элемент 3 будет пуст. итд итп
													//Чем больше подстрок через пробел тем больше элементов массива будет заполнено
													//в нашем случае на интерисуют 4 подстроки и 4 элемента массива
													//Тк в файле каждая строка состоит из UID и координат вида X Z Y - например - 76561198156937127 2698.36 23.2 5989.59
													//То элемент 0 массива read_line будет содержать 76561198156937127, элемент 1 2698.36, элемент 2 23.2, элемент 3 5989.59
													//Если в строке будет еще текст через пробелы, то и остальные эелементы будут заполнены, но мы их будем игнорировать
													//Дальнейшее описание будет отталкиваться именно от этого содержания - 76561198156937127 2698.36 23.2 5989.59
					if (read_line.Count() >= 4)	//Если кол-во элементов массива read_line больше или равно 4м условие будет выполнено
					{
						if (read_line.Get(0).Length() == 17) //если элемент 0 массива read_line имеет длинну 17 символов (Steam UID имеет 17 цифр) то условие будет выполнено - в нашем случае это 76561198156937127
						{
							if (read_line.Get(1).ToFloat() > 0 && read_line.Get(3).ToFloat() > 0) //Если элемент 1 массива read_line (содержит координату X - 2698.36) переведенное в число с плавающей точкой больше 0 И Если элемент 3 массива read_line (содержит координату Y - 5989.59) переведенное в число с плавающей точкой больше 0 (Z мы в условии игнорируем) условие будет выполнено
							{
								if (!m_playersSpawnPoints.Contains(read_line.Get(0))) //Если массив m_playersSpawnPoints НЕ содержит UID (те в него еще не записывался элемент 0 массива read_line) //Зачем нам в массиве дублирование UID - условие будет выполнено
								{
									m_playersSpawnPoints.Insert(read_line.Get(0), read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3)); // В элемент массива m_playersSpawnPoints, будет вставлена строка - read_line.Get(0) содержащая UID (перая часть элемента - индекс), следом будет вставлена собранная из трех частей строка содержащая координаты (это значение)
									Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Add UID " + read_line.Get(0) + " spawnpoint: " + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + " to m_playersSpawnPoints"); //вывод в лог
								}
								else //Если массив m_playersSpawnPoints одержит UID (те в него УЖЕ записывался элемент 0 массива read_line) //Зачем нам в массиве дублирование UID то просто вывод в лог инфы о дублировании UID в файле
								{
									Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID " + read_line.Get(0) + " duplicated, check file!");
								}
							}
							else //ИЛИ - ОШИБКА
							{
							Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Position error: '" + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + "' :::");
							}
						}
						else //ИЛИ read_line.Get(0).Length() != 17 - не равно  17 - А UID всегда = 17 символам - ОШИБКА
						{
							Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID error: " + file_line + " :::");
						}
					}
					else //read_line.Count() < 4 - ОШИБКА
					{
					Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " have errors: " + file_line + " :::");
					}
				}
			}//Это закрывающая скобка - конец тела цикла ПОКА
			//Строки в файле закончились
			CloseFile(file); //Закрываем файл
			if (m_playersSpawnPoints.Count() > 0) //Диагностика - если кол-во элементов массива m_playersSpawnPoints > 0
			{
				Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Players personal spawn points count: " + m_playersSpawnPoints.Count() + " :::"); //Выводим в лог инфу о кол-ве
			}
			else
			{
				Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Players personal spawn points is not loaded! :::"); //Выводим в лог инфу что массив не загружен
			}
		}//Это открывающая скобка - начало тела условия - ЕСЛИ файл открыт
		else //Файл не открыт - ошибка (либо файла нет либо еще что-то)
		{
			Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Error open file: " + m_SettingsPath + FileName + " :::");
		}
	}//Это закрывающая скобка - конец тела функции
	
	//Эта функция вызывается нами для получения координат по UID из функции CreateCharacter класса миссии
	vector GetPlayerSpawnPoint(PlayerIdentity identity) //Функция возвращающая данные типа vector и принимающая в качестве параметров в переменную identity типа PlayerIdentity ссылку на личность подключившегося игрока
	{
		vector pos; //определяем переменную типа vector
		
		if (identity.GetPlainId()) //Проверка на всякий случай - если ссылка на личность вернет Steam UID то
		{
			string p_UID = identity.GetPlainId(); //В строковую переменную p_UID штатная функция GetPlainId() вернет Steam UID
			if (m_playersSpawnPoints.Contains(p_UID)) //Если в массиве m_playersSpawnPoints есть UID который мы получили выше в переменную p_UID
			{
				pos = m_playersSpawnPoints.Get(p_UID).ToVector(); //Получаем из массива m_playersSpawnPoints значение по индексу p_UID и сразу переводим его в vector и загоняем его в переменую pos
				Print ("::: [Server_SpawnPoints_Class] ::: GetPlayerSpawnPoint ::: Selected personal spawn point Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: "+ p_UID); //пишем в лог результат
				return pos; //функция возвращает значение содержащееся в переменной pos и завершает работу
			}
		}
		return "0 0 0"; //во всех остальных случаях функция возвращает 0 0 0 по завершению работы
	}
} //Это закрывающая скобка - конец тела класса

 

 

 

 

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


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

Извните,вы когда трезвый-операционные системы пишите?

 

Спасибо,занёс в колендарь "попробовать на сервере"....новое наказание теперь можно делать.

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

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


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

paranoyk Да
С дверями разобрались

потом суммирую и выложу

или см в разделе ПОМОЩЬ где деври обсуждали

 

ЗЫ Я когда трезвый писал микропрограммы для контроллеров и микроконтроллеров

 

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

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


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

Перевыкладываю

Чуть улучшил

 

1 вынес переменные с путем и именем файла из функции загрузки в класс, что бы можно было использовать в других функциях этого класса

2 в функции проверки уид на наличие его в массиве и загрузки координат для игрока с этим уид добавил проверку на наличие файла-флага в каталоге

 если файл есть происходит перезагрузка массива из файла - таким образом можно не перегружая сервер добавлять уид координаты в файл для новых игроков и они будут подгружены при первом их входе

 

//Version 07.03.2019.1634
//Author: Borizz.K aka [G.P.]NOIZZ(MC2) (s-platoon.ru)

class Server_SpawnPoints_Class
{	
	ref map<string,string> m_playersSpawnPoints = new map<string,string>;
	
	string 			FileName			= "playersSpawnPoints.lst";
	string			m_SettingsPath 		= "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\"; //Folder with config files - .ini or .lst // Or "$Profiles:\\"
	string			m_autoReloadFlag	= "playersSpawnPointsAutoReload";

	void Server_SpawnPoints_Class()
	{
		Print("::: [Server_SpawnPoints_Class] ::: Init :::");
		LoadPlayersSpawnPointsByUid();
	}
	
	void ~Server_SpawnPoints_Class()
	{
		Print("::: [Server_SpawnPoints_Class] ::: UnInit :::");
	}

	void LoadPlayersSpawnPointsByUid()
	{
		/*
			Файл playersSpawnPoints.lst кладем в папку указанную в параметре запуска сервера -profiles= тогда путь будет "$Profiles:\\"
			или если кладем в файл в mpmissions\dayzOffline.chernarusplus\_CONF путь будет "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\"
			Путь меняется в переменной m_SettingsPath - "$Profiles:\\" или "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_CONF\\"
			Можете указать свой путь, но он должен быть либо в $Profiles: либо в $CurrentDir:
			Формат файла:
			Steam UID в привычном виде 17 цифр Координаты Комментарий (через пробелы)
			Помните любая ошибка может привести к крашу сервера
			Не желательны пустые строки!
			Пример:
			
			76562298156537008 1300 0 5600 Дима
			76561998116927209 3000 0 3000 Вася из Новороссийска
			
			Про массив: ref map<string, string> m_playersSpawnPoints = new map<string, string>;
			m_playersSpawnPoints тут массив типа map, где каждый элемент массива состоит из 2х ячеек.
			1. Индекс - тип string
			2. Значение - тип string
		
			Пример работы с массивом типа map
			Запись в массив
			m_playersSpawnPoints.Insert("76562298156537008", "1300 0 5600"); //записываем первый элемент - индекс dayz, значение 10
			m_playersSpawnPoints.Insert("76561998116927209", "3000 0 3000"); //записываем второй элемент - индекс dayzf, значение 17
			Чтение из массива:
			Получаем значение 0го элемента
			string m = m_playersSpawnPoints.GetElement(0); // = "1300 0 5600"
			Получаем индекс 0го элемента
			string name = m_playersSpawnPoints.GetKey(0); / /= "76562298156537008" 
			Получаем значение по индексу (в данном случае нас интерисует именно ЭТО)
			string n = m_playersSpawnPoints.Get("76561998116927209"); // = "3000 0 3000" //затем n переводим в вектор
			
			Usage in CreateCharacter function for change default spawn position:
			
			string PlayerUID = identity.GetPlainId();
			if (PlayerUID)
			{
				if (m_playersSpawnPoints.Contains(PlayerUID)
				{
					pos = m_playersSpawnPoints.Get(PlayerUID).ToVector();
				}
			}
			
		*/

		FileHandle		file;
		string			file_line;
		array<string> 	read_line;	
		int 			linecount		= 0;	
		
		//Comments check
		bool skipline = false;
		bool skipblock = false;
		//Comments check

		file = OpenFile(m_SettingsPath + FileName, FileMode.READ);
		if (file != 0)
		{
			Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read File: " + m_SettingsPath + FileName + " :::");
			
			while (FGets(file, file_line) >= 0)   
			{
				linecount++;

				//Comments check and skip
				if (file_line.IndexOfFrom(0,"//") == 0 || file_line.IndexOfFrom(0,"#") == 0 || file_line.IndexOfFrom(0," ") == 0 || file_line.Length() <= 0)
				{
					skipline = true;
				}
				else
				{
					skipline = false;
				}
				if (file_line.IndexOfFrom(0,"/*") == 0)
				{
					skipblock = true;
				}
				else if (file_line.IndexOfFrom(0,"*/") == 0)
				{
					skipblock = false;
					skipline = true;
				}
				//Comments check

				if (!skipline && !skipblock)
				{
					read_line = new array<string>;
					file_line.Split(" ",read_line);
					if (read_line.Count() >= 4)
					{
						if (read_line.Get(0).Length() == 17)
						{
							if (read_line.Get(1).ToFloat() > 0 && read_line.Get(3).ToFloat() > 0)
							{
								if (!m_playersSpawnPoints.Contains(read_line.Get(0)))
								{
									m_playersSpawnPoints.Insert(read_line.Get(0), read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3)); // UID, Position
									Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Add UID " + read_line.Get(0) + " spawnpoint: " + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + " to m_playersSpawnPoints");
								}
								else
								{
									Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID " + read_line.Get(0) + " duplicated, check file!");
								}
							}
							else
							{
							Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " Position error: '" + read_line.Get(1) + " " + read_line.Get(2) + " " + read_line.Get(3) + "' :::");
							}
						}
						else
						{
							Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " UID error: " + file_line + " :::");
						}
					}
					else
					{
					Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Read Line c" + linecount + " have errors: " + file_line + " :::");
					}
				}
			}
			CloseFile(file);
			if (m_playersSpawnPoints.Count() > 0)
			{
				Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Players personal spawn points count: " + m_playersSpawnPoints.Count() + " :::");
			}
			else
			{
				Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Players personal spawn points is not loaded! :::");
			}
		}
		else
		{
			Print("::: [Server_SpawnPoints_Class] ::: LoadPlayersSpawnPoints() ::: Error open file: " + m_SettingsPath + FileName + " :::");
		}
	}
	
	vector GetPlayerSpawnPoint(PlayerIdentity identity)
	{
		vector pos;
		
		if ( FileExist(m_SettingsPath + m_autoReloadFlag) ) LoadPlayersSpawnPointsByUid();
		
		if (identity.GetPlainId())
		{
			string p_UID = identity.GetPlainId();
			if (m_playersSpawnPoints.Contains(p_UID))
			{
				pos = m_playersSpawnPoints.Get(p_UID).ToVector();
				Print ("::: [Server_SpawnPoints_Class] ::: GetPlayerSpawnPoint ::: Selected personal spawn point Pos: " + pos.ToString() + " for player: " + identity.GetName() + " with UID: "+ p_UID);
				return pos;
			}
		}
		return "0 0 0";
	}
}

 

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: 123new
      За основу взята наработка автора скрипта: http://s-platoon.ru/profile/14721-borizzk/
      И немного доработана по своим соображениям.
      Использование мода клиенту игры НЕ ТРЕБУЕТСЯ!!!
       
      И так, установка:
      1. Первым делом нам необходим чистый стандартный сервер DayZ (без модов, поскольку моды могу приводить к неработоспособности частей гайда). Установить его можно по инструкции, например, так:
      2. Добавляем в папку сервера игры мод из архива:
      3. Добавляем в параметры запуска сервера:
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      -Filepatching "-servermod=@KillFeed_ServerMod" Если ваш сервер уже имеет серверные моды, просто добавьте папку с модом в список используемых сервером модов.
      ВАЖНО: не добавляйте данный мод в параметр запуска сервера -mod=, иначе это может стать проблемой заходи игроков с параметрами verifysignatures=2; equalmodrequired=1;
      4. В 'config-файле' сервера (там где названием сервера и прочие настройки) добавляем настройки для мода:
      //KillFeed_mod KillFeed_enableSaveKills = 1; // Включение сохранения счетчика убийств по игрокам KillFeed_enableSaveDies = 1; // Включение сохранения счетчика смертей по игрокам KillFeed_enableCustomTimeLog = 1; // Включение записи модом 'Кастомных' логов смертей игроков KillFeed_enableDefaultLog = 1; // Включение записи сервером стандартных логов сервера в scripts.log KillFeed_enableDebugLog = 1; // Включение записи сервером отладочных логов сервера в scripts.log (работает при KillFeed_enableDefaultLog = 1) KillFeed_enableMessages = 1; // Включение отправки сообщений в чат сервера о смертях игроков Пояснения к настройкам, как видите, имеются.
      Напомню, активный профиль сервера обозначается параметром '-profiles={имя папки или путь до папки}'
      Например, при указании:
      -profiles=Instance_1 папка профиля сервера будет выглядеть вот так:
      5. Запускаем сервер, умираем от зомби и радуемся. Сообщения о смертях игроков будут в чате у других игроков (если в настройках игры они не отключены), так и в script.log.

      Где хранятся счетчики убийств и смертей? Ответ:
      Они хранятся в profile сервера игры. Т.е. после 1-го запуска создаются 2 файла (как у клиента игры в документах windows в папку dayz) в файлах с расширениями ".vars.DayZProfile" и ".DayZProfile". При удалении этих файлов счетчики сбросятся!
       
      P.S. Чтобы увидеть сообщения в чате, нужно быть 2-м игрокам на сервере, и умереть одному из двух. тот, кто умирает, сообщения с чата не видит!!!
       
    • Автор: AntonivkA
      Итак, господа. В 1.05 разрабы похоже сломали механику спавна лута. У меня предметы стали спавниться там, где их не должно быть. Заметил сразу, поскольку таблица лута у меня переделана основательно. Например, Песочный барьер у меня прописан только на Военках и Полиц.участке, и все работало корректно до 1.05. Теперь, песочный барьер я нахожу в гаражах, мастерских и жилых домах вокруг полиц. участка и в самом полиц. участке. Помимо этого, ребята стали замечать и скинули инфу, что на СЗ в гаражах и мастерских стал появлятся военный лут, хотя его там не должно быть.
      Кто-что скажет по этому поводу. Заметил ли кто-то подобное у себя?
       
    • Автор: ZizionarD
      Здравствуйте! Как отключить выбор пола в ESS v3? Спасибо
    • Автор: Karmagedon
      Всем привет! Ребят. Подскажите где кавырнуть что бы к примеру определенный вид оружия спавнился только на тисах! Заранее спасибо!
    • Автор: PJIIOxa
      Help! очень нужен скрипт отдельным файлом на экипировку для определенных игроков по UID.
  • Наш выбор

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

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

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