BorizzK

Фикс положения дефолтно заспавленных машин на сервере релиза 1.0

13 сообщений в этой теме

	//AUTHOR: BORIZZ.K
	//Version 20.12.2018.0011
	
	void PlaceAllCarsToGround()
	{
		array<Object> nearest_objects = new array<Object>;
		array<CargoBase> proxy_cargos = new array<CargoBase>;
		Object object;
		string className;
		int objectcount = 0;
		vector mapcenter = "7500 0 7500";
		int radius = 20000;
		vector foundcar_pos;
		mapcenter[1] = GetGame().SurfaceY( mapcenter[0], mapcenter[2] );
		GetGame().GetObjectsAtPosition(mapcenter, radius, nearest_objects, proxy_cargos); 
		for ( int i = 0; i < nearest_objects.Count(); i++ )
		{
			object = nearest_objects.Get(i);
			className = object.GetType();
			if ( GetGame().IsKindOf(className, "Car" ) ) //if ( className == "OffroadHatchback" || className == "V3SVehicle" || className == "V3SChassis" || className == "CivilianSedan")
			{
				EntityAI objectEnt = EntityAI.Cast(object);
				if (objectEnt)
				{
					foundcar_pos = objectEnt.GetPosition();
					Print("::: PlaceAllCarsToGround() ::: Found car: " + className + ", objectEnt: " + objectEnt  + ", Position: " + foundcar_pos.ToString() + ", SurfaceGetNormal: " + GetGame().SurfaceGetNormal(foundcar_pos[0], foundcar_pos[2]).ToString());

					//Check surface under car
					/*
					string surface_type;
					int liquidType;
					GetGame().SurfaceUnderObject(object, surface_type, liquidType);
					Print("::: PlaceAllCarsToGround() ::: Found car: " + className + ", objectEnt: " + objectEnt  + ", surface_type: " + surface_type + ", liquidType: " + liquidType);
					*/
					
					if ( foundcar_pos[1] < (GetGame().SurfaceY(foundcar_pos[0], foundcar_pos[2])) - 0.1 || foundcar_pos[1] > (GetGame().SurfaceY(foundcar_pos[0], foundcar_pos[2])) + 0.1 )
					{
						foundcar_pos[1] = GetGame().SurfaceY(foundcar_pos[0], foundcar_pos[2]);
						objectEnt.SetPosition(foundcar_pos);
						objectEnt.SetOrientation(objectEnt .GetOrientation());
						objectEnt.SetDirection(objectEnt .GetDirection());
						Print("::: PlaceAllCarsToGround() ::: Position changed for car : " + className + ", objectEnt: " + objectEnt  + ", Position: " + foundcar_pos.ToString());
					}
					else
					{
						Print("::: PlaceAllCarsToGround() ::: No position change required for car : " + className + ", objectEnt: " + objectEnt);
					}
				}
			}
		}
	}

Добавить код в init.c (ВНЕ КЛАССА)

Вызывать в конце функции main()

Просто вставив в конце
PlaceAllCarsToGround();

 

P.S. Поправил код, + учел рекомендации Ультимы
У меня на сервере с машинами все ок

 

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

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


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


BorizzK

1. ты так не шути. тебя когда нить за яйца подвесят, так же как сервак подвесит данная функция.

2. вот это,

if ( className == "OffroadHatchback" || className == "V3SVehicle" || className == "V3SChassis" || className == "CivilianSedan")

можно смело заменить на

if ( GetGame().IsKindOf(v_ClassName, "Car" ) )

 

PS

Что касается расположения объектов, то либо ждать пока добавят массивы которые будут в дайзе создаваться при загрузке БД, что то типа АллКарс и т.п.

Либо ждать пока дадут доступ к скриптам срабатывающим при загрузке БД

Либо вешать на тачку экшен (перевернуть) как это было в арме. - Подбегает игрок к технике, - и если техника в текстурах, то ставит ее на землю.

Если у кого то там в воздухе зависают, то эт чет не то с дайзом. у меня нет такого...

 

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


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

NoNameUltima не вешало ни разу пока

Тестил с 200 засеавленными нивами

Ну и как бы

Самое жрущее, это сбор обьектов в массив, 12 гиг памяти выжирает

 

За замечание спасибо

 

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


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

Чуть переделал и учел замечание Ультимы

 

	void PlaceAllCarsToGround()
	{
		array<Object> nearest_objects = new array<Object>;
		array<CargoBase> proxy_cargos = new array<CargoBase>;
		Object object;
		string className;
		int objectcount = 0;
		vector mapcenter = "6250 0 9000";
		int radius = 16000;
		vector foundcar_pos;
		mapcenter[1] = GetGame().SurfaceY( mapcenter[0], mapcenter[2] );
		GetGame().GetObjectsAtPosition(mapcenter, radius, nearest_objects, proxy_cargos); 
		for ( int i = 0; i < nearest_objects.Count(); i++ )
		{
			object = nearest_objects.Get(i);
			className = object.GetType();
			if ( GetGame().IsKindOf(className, "Car" ) ) //if ( className == "OffroadHatchback" || className == "V3SVehicle" || className == "V3SChassis" || className == "CivilianSedan")
			{
				EntityAI objectEnt = EntityAI.Cast(object);
				if (objectEnt)
				{
					foundcar_pos = objectEnt.GetPosition();
					Print("::: PlaceAllCarsToGround() ::: Found car: " + className + ", objectEnt: " + objectEnt  + ", Position: " + foundcar_pos.ToString() + ", SurfaceGetNormal: " + GetGame().SurfaceGetNormal(foundcar_pos[0], foundcar_pos[2]).ToString());

					//Check surface under car
					/*
					string surface_type;
					int liquidType;
					GetGame().SurfaceUnderObject(object, surface_type, liquidType);
					Print("::: PlaceAllCarsToGround() ::: Found car: " + className + ", objectEnt: " + objectEnt  + ", surface_type: " + surface_type + ", liquidType: " + liquidType);
					*/
					
					if ( foundcar_pos[1] < (GetGame().SurfaceY(foundcar_pos[0], foundcar_pos[2])) - 0.1 || foundcar_pos[1] > (GetGame().SurfaceY(foundcar_pos[0], foundcar_pos[2])) + 0.1 )
					{
						foundcar_pos[1] = GetGame().SurfaceY(foundcar_pos[0], foundcar_pos[2]);
						objectEnt.SetPosition(foundcar_pos);
						objectEnt.SetOrientation(objectEnt .GetOrientation());
						objectEnt.SetDirection(objectEnt .GetDirection());
						Print("::: PlaceAllCarsToGround() ::: Position changed for car : " + className + ", objectEnt: " + objectEnt  + ", Position: " + foundcar_pos.ToString());
					}
					else
					{
						Print("::: PlaceAllCarsToGround() ::: No position change required for car : " + className + ", objectEnt: " + objectEnt);
					}
				}
			}
		}
	}
	

Думаю еще проверять на чем стоит машина и в зависимости от этого корректировать ее положение, но думаю со след обновой богемы пофиксят фигню с дефолтными машинами... 

 

Изменил центр

Изменил радиус

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

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


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

В самом верху init.c подключаешь файл с этой функцией

 

#include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\SpawnCars\\PlaceAllCarsToGround.c"

 

путь меняешь на свой. ($CurrentDir - это корень/папка где расположен сервер Дейза)

 

далее в функции main() которая в init.c вставляешь вызов функции

 

PlaceAllCarsToGround();

 

вот дефолтный init.c  подключением и вызовом

 

#include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\_MOD\\SpawnCars\\PlaceAllCarsToGround.c"

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;
	int month;
	int day;
	int hour;
	int minute;

	GetGame().GetWorld().GetDate(year, month, day, hour, minute);

    if (((month <= 9) && (day < 20)) || ((month >= 10) && (day > 20)))
    {
        month = 9;
        day = 20;
		
		GetGame().GetWorld().SetDate(year, month, day, hour, minute);
	}
	
	PlaceAllCarsToGround();
}

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)
	{
		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)
	{
/*
		player.RemoveAllItems();

		EntityAI item = player.GetInventory().CreateInInventory(topsMissionArray.GetRandomElement());
		EntityAI item2 = player.GetInventory().CreateInInventory(pantsArray.GetRandomElement());
		EntityAI item3 = player.GetInventory().CreateInInventory(shoesArray.GetRandomElement());
*/
		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);
		
			itemEnt = itemTop.GetInventory().CreateInInventory("StoneKnife");
			SetRandomHealth(itemEnt);
		}

		rand = Math.RandomFloatInclusive(0.0, 1.0);
		if ( rand < 0.25 )
			itemEnt = player.GetInventory().CreateInInventory("SodaCan_Cola");
		else if ( rand > 0.75 )
			itemEnt = player.GetInventory().CreateInInventory("SodaCan_Spite");
		else
			itemEnt = player.GetInventory().CreateInInventory("SodaCan_Pipsi");
		
		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();
}


 

 

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


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

А можно для линивых уже готовое решение. И вообще я не понял что это дополнение реально делает и какая проблема вообще с машинами ??? 

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


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

да

кстати

после второго запуска сервера (те перед третьим функцию можно отключить)

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

но тогда вместе с вайпом (удалением базы в инстансе) придется еще и файл профиля с серверными переменными грохать

имя файла на всяк случай profile.vars.DayZProfile

лежит в пвпке Users\имя внутри папки указанной в параметре -profile строки запуска сервера

очень пользительный кстати файл


небольшое отступление
 

вобщем все что пишется в профиль сервера таким макаром:

GetGame().SetProfileString("имя переменной", строка);

окажется в этом файле

при записи

где имя переменной - переменная которая запишется в профиль

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

 

и ее всегда можно прочитать

string stringVAR;
GetGame().GetProfileString("имя переменной", stringVar);

 

в итоге Вы запишете в строковую переменную stringVar значение переменной "имя переменной" из этого файла

 

если переменной в файл нет функция вернет пустую строку

 

я так храню вайтлист и некоторые настройки сервера
но это уже отдельная история

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
В 18.12.2018 в 09:05, NoNameUltima сказал:

BorizzK

1. ты так не шути. тебя когда нить за яйца подвесят, так же как сервак подвесит данная функция.

2. вот это,

if ( className == "OffroadHatchback" || className == "V3SVehicle" || className == "V3SChassis" || className == "CivilianSedan")

можно смело заменить на

if ( GetGame().IsKindOf(v_ClassName, "Car" ) )

 

PS

Что касается расположения объектов, то либо ждать пока добавят массивы которые будут в дайзе создаваться при загрузке БД, что то типа АллКарс и т.п.

Либо ждать пока дадут доступ к скриптам срабатывающим при загрузке БД

Либо вешать на тачку экшен (перевернуть) как это было в арме. - Подбегает игрок к технике, - и если техника в текстурах, то ставит ее на землю.

Если у кого то там в воздухе зависают, то эт чет не то с дайзом. у меня нет такого...

 

ошибочное мнение 

IsKindOF это цикл где проходят от агента до подкласса car в среднем это

1 OffroadHatchback -> OffroadHatchback_base -> Car 

в итоге 3 цикла с кучей ифов

если же сравнить класс OffroadHatchback с 4 условиями затрат будет явно меньше при том что если выставлять от частых с лева и от редких с права.

да по сути затраты не значительны но при условии что техники всего 4 эффективней будет использовать иф как не странно это звучит.

 

вот так кстати выглядит функция искиндоф

bool EntityType::IsKindOf(const char *typeName) const
{
  const EntityType *cur = this;
  while (cur)
  {
    if (!strcmpi(cur->GetName(),typeName))
      return true;
    cur = cur->_parentType;
  }
  return false;
}
посчитай сколько тут ифов... а + затраты на strcmpi

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


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

ошибочное мнение 

Это не мнение.

 

Быстрее - да. Но при добавлении классов техники, либо будешь впихивать их все как в примере выше, либо пользоваться тем что дали.

*по быстроте if - плевать сколько их там(в разумном пределе) - самая быстрая операция.

сравнение строк не замерял. Но даже с этим - никак не скажется.

А если добавят еще единиц 10, 20.. техники,  - строка сравнения превратится в нечитабельную. А выхлоп почти нулевой.

 

P.S. и при копировании пункты разделяй. В 1ом пункте речь шла о совершенно другом, а именно о переборе нескольких лямов объектов на карте.

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


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

NoNameUltima Ну вот, началось )))

Отлично перебирается ВООБЩЕ все на обжитом сервере со средним онлйном в 20-30 рыл

Я подобным способом вайплю что не нужно и тд итп

Ну а поиск и перебор 150 машин на сервере в нормальной виртуалке занимает - порядка 30 секунд при старте

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: 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 игрока на сервере ваш файл с данными по игрокам будет присутствовать и заполняться информацией, а в случае их отсутствия удаляться.
    • Автор: NoNameUltima
      Автор: Я.
      Модификация банка, для DayZ Standalone для мода торговли(Trader)
       
      Мод позволяет:
      Снимать деньги со счета. Вносить деньги на счет.  
      Настройки серверной части:
      Точки в которых доступен банк. Радиус в котором доступен банк(от центра точки - см. выше). Горячая клавиша вызывающая на клиентской стороне меню банкомата. Папку профиля для хранения данных о банковских балансах игроков.  
      *Мод автоматически производит обмен валюты по номиналу, при внесении, или изъятии денежных средств.
      *Клиентскую часть можно скачать в STEAM.
      *Для подключения серверной части, - достаточно закинуть ее в папку сервера, и указать папку для хранения баланса.
       
      Цена: 1500
       
      Контакты:
      Skype: hf-trade  
      STEAM: https://steamcommunity.com/sharedfiles/filedetails/?id=1714035636
      Видео работы:
      Серверная часть, подключается как -serverMod=
    • Автор: NoNameUltima
      Автор:
      Я. Описание:
      Система уведомлений, создающая всплывающие окошки.(см. видео ниже) Цена:
      500р. Конфигурация:
      Путь к иконке уведомлений. Размер иконки. Позиция вывода уведомлений по оси X. Позиция вывода уведомлений по оси Y. Ширина окошек уведомлений. Видео:
       
    • Автор: BorizzK
      Накатал по быстрому для себя и своих ребят от нефиг делать, тк в командировке и дейзить возможности нет, только удаленно ковырять сервер
      Внутри настройки через переменные
      путь к базе сервера и инстанс ид берет из конфига сервера (нужно настроить имя файла и путь в файле)
      Мониторит сервер по названию окна, сохранив pid
      При вылете в 90% случаев корректно убивает процесс
      При перезапуске так же
      При каждом старте с 0 и при перезапусках делает бэкапы баз/настроек/логов в папку !Backup в корне сервера
      Можно настроть кол-во хранимых бэкпов для базы сервера и логов

      Вобщем заглянете внутрь и все поймете
       
      Вдруг кому пригодится
       
      Закрепляю тут краний боевой вариант
      Что к чему - прочтите всю тему и все станет ясно
       
      Сцыл на стрницу темы с крайней версией заточенной на использование с версией 1.04 и параметром -servermod
       
       
    • Автор: BorizzK
      Палатки пофикшены
      Ну разве что не ставятся на крест на церкви, ставятся чуть ниже
      Все чисто серверное
       
      Выложу завтра днем после небольшой доработки - что бы красиво было
       
      Вот резалт
       
       

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

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

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