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

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

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

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

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

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

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

	//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 (история изменений)

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


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

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 файл?

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

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


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

В самом верху 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 секунд при старте

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


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

guyfromgarlem это для тех что на карте - при старте - неважно куплены они или нет
однако

этот фикс НЕАКТУАЛЕН в текущий момент - от слова совсем

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

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


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

Актуально ли на сегодняшний день?  не могу победить пропадание автомобилей после рестарта и не только бывает просто пропадают 

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


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

Актуально ли на сегодняшний день?  не могу победить пропадание автомобилей после рестарта и не только бывает просто пропадают 

Нет

Это для другого случая

Был момент когда авты спавнились провалившись колесами или частью кузова под землю

Сейчас авты не паркуйте ближе 1-2м к обьектам - любым - и пропадать не будут

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


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

Нет

Это для другого случая

Был момент когда авты спавнились провалившись колесами или частью кузова под землю

Сейчас авты не паркуйте ближе 1-2м к обьектам - любым - и пропадать не будут

спасибо за информацию!

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


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

И не ставте в тенты, под навесы

Впрочем шанс пропади все равно сохраняется

Надеюсь в тайпсе время жизни тачек 3888000 установили?

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: Makliion
      Всем добрый вечер..
      У меня такой вопрос где найти или заказать скрипт для обыска зомбей & игроков 
      что-бы каждую вещь снимать через действие а не тупо через таб
      Шлем отдельно
      Рюкзак отдельно
      ну и на все остальные слоты
      искал долго не нашёл ничего
      есть мод на обыск но он просто открывает  инвентарь и все 
       
    • Автор: Troy1
      Всем привет. Подскжите ну или помогите пожалуйста решить вопрос.
      Вопрос звучит так. На сервере есть трейдер зоны и базы игроков. 
      Если в течение определённого времени, на пример 1 - 2 часа с машиной не кто не взаимодействует и машина не находится в зоне трейдера или на теретории базы, то машина отлетает в гараж или на штраф стоянку.
      На сервере используется TraderPlus.
       
      Есть такие решения у кого?
      За ранние благодарю.
    • Автор: Troy1
      Всем привет. Подскжите ну или помогите пожалуйста решить вопрос.
      Вопрос звучит так. Нужно сделать так, что бы на всей карте был запрет на строительство. 
      Если нужно построить например базу с палатками, то нужно установить верстак или флаг, который установит зону для строительства с радиусом примерно 20-25 метров от центра и желательно что бы зона была квадратной.
      Есть такие решения у кого?
      За ранние благодарю.
    • Автор: BR0wi
      Подскажите где найти людей, которые делаю моды на заказ. К кому вообще обращаться? Или что бы реализовать свои идеи нужно самому "год" сидеть и изучать все механики модинга?
    • Автор: CubeIn
      Приветствую господа, хочу создать новый проект, уникальный, но для этого нужен маппер.
      Я оставлю здесь свой дискрод, напишите в лс, кто готов взяться за крупный проект.
      4me#4542
  • Наш выбор

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

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

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