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

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

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

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

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

Всем привет ребят. 
Задался я таким вопросом. Думаю у многих есть проблема на сервере с багом досок которые подвисают в воздухе. Тем самым так можно залезть на любую базу или лагерь игроков которые старательно строятся. Это явный баг. 
Может кто то в курсе, как все же побороть и сделать так что бы доски при выкладывание с рук персонажа не зависали в воздухе и ложились ровно на землю..

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

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


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

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




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

123new не доехал до дома я еще

уххх как ждееем)))

 

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


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

Gizda Я на даче

ноут дома забыл

хотел вчера сгонять

да чет выпил пива (((

с а ьелефона что-то сделать анрил

да и нет на нем удаленки

 

завтра порою что находил

проверю и поделюсь идеей

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


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

123new Gizda 

 

От оно

class HandActionDrop extends HandActionBase
{
	override void Action (HandEventBase e)
	{

Ща разгребу дела

понаставлю контрольных точек

и ченить наваяю

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


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

Gizda 123new 

 

modded class HandActionDrop extends HandActionBase
{
	bool m_HandActionDropMyDebug = true;

	override void Action (HandEventBase e)
	{
		Man player 						= 	e.m_Player;
		EntityAI item 					= 	e.m_Entity;
		vector dropPosition				=	player.GetPosition();
	
		super.Action(e);
		
		if (m_HandActionDropMyDebug)
		{
			PlayerIdentity	player_Identity =	player.GetIdentity();
			string	player_Name				=	player_Identity.GetName();
			string	player_UID 				=	player_Identity.GetPlainId();
			EntityAI itemInHands			=	NULL; 
			itemInHands	= player.GetHumanInventory().GetEntityInHands();
			Print("::: SERVER: [HandActionDrop DEBUG]: Action: input: HandEventBase e = " + e.ToString() + ": player = " + player_Name + " DROP: item = " + item.ToString() + " : item.GetPosition() = " + item.GetPosition() +", itemInHands = " + itemInHands.ToString());
		}
		
		if (item)
		{
			dropPosition[0]	=	dropPosition[0] + Math.RandomFloatInclusive(-0.3, 0.3);
			dropPosition[1] =	dropPosition[1] + Math.RandomFloatInclusive(0.1, 0.2);
			dropPosition[2]	=	dropPosition[2] + Math.RandomFloatInclusive(-0.2, 0.2);
			item.SetPosition(dropPosition);
			item.SetOrientation(item.GetOrientation());
		}
	}
}

Думаю смысл понятен

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

но если игрок встанет на предмет... вобщем те же яйца

 

А если класть на Surface иногда часть предмета может частично провалиться в текстуру или полностью

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

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


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

Пока лучше ничего не придумал

modded class HandActionDrop extends HandActionBase
{
	bool m_HandActionDropMyDebug = true;

	override void Action (HandEventBase e)
	{
		Man player 						= 	e.m_Player;
		EntityAI item 					= 	e.m_Entity;
		vector dropPosition				=	player.GetPosition();
	
		super.Action(e);
		
		if (m_HandActionDropMyDebug)
		{
			PlayerIdentity	player_Identity =	player.GetIdentity();
			string	player_Name				=	player_Identity.GetName();
			string	player_UID 				=	player_Identity.GetPlainId();
			EntityAI itemInHands			=	NULL; 
			itemInHands	= player.GetHumanInventory().GetEntityInHands();
			Print("::: SERVER: [HandActionDrop DEBUG]: Action: input: HandEventBase e = " + e.ToString() + ": player = " + player_Name + " DROP: item = " + item.ToString() + " : item.GetPosition() = " + item.GetPosition() +", itemInHands = " + itemInHands.ToString());
		}
		
		if (item)
		{
			dropPosition[0]	=	dropPosition[0] + Math.RandomFloatInclusive(-0.2, 0.2);
			dropPosition[1] =	dropPosition[1] + Math.RandomFloatInclusive(0.1, 0.2);
			dropPosition[2]	=	dropPosition[2] + Math.RandomFloatInclusive(-0.2, 0.2);
			if (item.GetType().Contains("Wheel"))
			{
				dropPosition[1] =	dropPosition[1] + Math.RandomFloatInclusive(1.0, 1.2);
				item.SetPosition(dropPosition);
				item.SetOrientation(Vector(0,0,0));
			}
			else
			{
				item.PlaceOnSurface();
			}
			item.SetOrientation(item.GetOrientation());
		}
	}
}

Кроме как усложнить жизнь колесникам

 

Если есть идеи - выдвигайте

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

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


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

BorizzK я как понял весь код этот в init.c кидать надо?

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


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

aspec7878 неее, вы что

это в scripts надо класс моддидь

да и не работает толком пока

я так, попытался подвигать что на землю скидывается

итд итп

 

не более

 

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

а еще и ее тип

и потом решать как класть

 

ибо если просто на точку земли - то под текстуры проваливается (под мост там и тп)

 

те на просто земле/дороге - норм

а если что-то другое

вот прикиньте Вы в здании автомат скидываете и он под текстуры улетает

во тот и оно

 

думаю имеет смысл проверять через SurfaceGetType и если земля/асфальт/трава и тп - то класть строго на нее
а если другое - то игнорить

потому как есл по ногам ориентироваться - теж яйца

встал на колесо - ноги поднялись выше и предмет выше скинулся

 

вобщем над поработать над этим

 

 

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


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

Karmagedon стрельнуть лучем в землю(рейкаст)

Если ничего нет - проверить высоту установки от поверхности - если она выше - положить на землю.

Если что то есть, - проверять - что именно - юниты и т.п. не в счет.

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


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

NoNameUltima опять ты со своими загадками )))

Ты не умничай, ты пальцем покажи :cool:

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


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

Спасибо Ультиме за наводку

 

class DayZPhysics

 

изучим

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


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

BorizzK расмотри идею проверки рядом с игроком объектов в небольшом радиусе, например, проверять наличие стенок или еще чего. Костыль, но может и сработать

 

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


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

123new Уже сделал, но проверку обьектов под ногами
Стены проверять не вижу смысла

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

modded class HandActionDrop extends HandActionBase
{
	bool m_HandActionDropMyDebug = true;

	override void Action (HandEventBase e)
	{
		Man player 						= 	e.m_Player;
		EntityAI item 					= 	e.m_Entity;
		vector dropPosition				=	player.GetPosition();
	
		super.Action(e);
		
		if (m_HandActionDropMyDebug)
		{
			PlayerIdentity	player_Identity =	player.GetIdentity();
			string	player_Name				=	player_Identity.GetName();
			string	player_UID 				=	player_Identity.GetPlainId();
			EntityAI itemInHands			=	NULL; 
			itemInHands	= player.GetHumanInventory().GetEntityInHands();
			Print("::: SERVER: [HandActionDrop DEBUG]: Action: input: HandEventBase e = " + e.ToString() + ": player = " + player_Name + ", player pos: " + dropPosition + " DROP: item = " + item.ToString() + " : item.GetPosition() = " + item.GetPosition() +", itemInHands = " + itemInHands.ToString());
			Print("::: SERVER: [HandActionDrop DEBUG]: Current surface alt: " + GetGame().SurfaceY(dropPosition[0], dropPosition[2]));
			Print("::: SERVER: [HandActionDrop DEBUG]: Current surface normal: " + GetGame().SurfaceGetNormal(dropPosition[0], dropPosition[2]).ToString());
			string SurfaceType, SurfaceType3D;
			GetGame().SurfaceGetType(dropPosition[0], dropPosition[2], SurfaceType);
			GetGame().SurfaceGetType3D(dropPosition[0], dropPosition[1], dropPosition[2], SurfaceType3D);
			Print("::: SERVER: [HandActionDrop DEBUG]: Current surface types: SurfaceType = " + SurfaceType + ", SurfaceType3D = " + SurfaceType3D);
		}
		
		if (item)
		{
			array<Object> nearest_objects = new array<Object>;
			array<CargoBase> proxy_cargos = new array<CargoBase>;
			GetGame().GetObjectsAtPosition(Vector(dropPosition[0],dropPosition[1] - 0.05,dropPosition[2]), 1.5, nearest_objects, proxy_cargos);
			for ( int i = 0; i < nearest_objects.Count(); i++ )
			{
					Print("::: SERVER: [HandActionDrop DEBUG]: Found neared object: nearest_objects[i] " + nearest_objects[i].GetType() + ", nearest_objects[i].GetPosition() =  " +  nearest_objects[i].GetPosition());
					if (dropPosition[1] > nearest_objects[i].GetPosition()[1]) dropPosition[1] = nearest_objects[i].GetPosition()[1];
			}
			dropPosition[0]	=	dropPosition[0] + Math.RandomFloatInclusive(-0.5, 0.5);
			dropPosition[1] =	dropPosition[1] + Math.RandomFloatInclusive(-0.02, 0.02);
			dropPosition[2]	=	dropPosition[2] + Math.RandomFloatInclusive(-0.5, 0.5);
			Print("::: SERVER: [HandActionDrop DEBUG]: new dropPosition = " + dropPosition.ToString());
			item.SetPosition(dropPosition);
			item.SetOrientation(item.GetOrientation());
		}
	}
}

логгирования напихал на первое время

пока импровизация

тк времени нет

но уже что-то

 

есть идея

ща передалаю

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

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


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

Без нормальной физики это все ерунда.

 

Вариант первый - добавить объектам стройки в онФрейм проверку фундамента - т..е. если объект не на поверхности земли, то периодически постреливать лучем в землю - нет (пропал) объект на котором лежал текущий, - положить его ниже(на уровень первого встреченного объекта).

 

Вариант второй - создать объект "база", - как столб в эпохе, и запрещать стройку в определенном радиусе всем кто не является владельцем(можно и друзьями) базы. - т.е. так как это было в эпоче.

 

*Второй вариант несет меньшую нагрузку. А в первом варианте - получится неплохая физика(если конечно сделать все как надо. К примеру не опускать сразу на уровень земли(или другого объекта), а в каждом фрейме на единичку занижать ось высоты - создастся эффект плавного падения объекта, если из под него выдернули фундамент)

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

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


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

Пофилософствую на данную тематику: В идеале бы запилить некий механизм гравитации для объектов выброшенных, где была бы проверка: висит в воздухе? и если да, то: падать до объекта_с_поверхностью(если он есть. пол дома, крыша дома, поверхность моста и т.д.) или земли. В идеале - если это будет происходить не только в момент выбрасывания предмета, но постоянно. например: положил доску на крышу тачки, тачку отогнал - доска упала на землю. но что-то мне подсказывает, что это если и реализуемо, то путём дичайших костылей и нагрузок на сервер. да и что делать с объектами типа ДОМ, которые прогружаются с полостями (комнаты, коридоры) только если игрок своим пузырём прогрузки его затронет (когда делал кастомные спавнпоинты свои в комнаты домов, пришлось два раза телепортировать тушку игрока, дабы на крышу не пихало )))) 

P.S.: Писал свой каммент одновременно с Ультимой, и не прочёл его. Впринципе там тоже самое. первый вариант.

Изменено пользователем ishkur
p.s. (история изменений)

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


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

ishkur бяда в том что оно может и не висеть в воздухе, а лежать на другом предмете

С этим я справился на 90%

 

Но вот еще одно есть

2 колеса

Кладем в рюкзак и куртку

Из инвентаря выкладываем одно, второе, затем первое кладем обратно и снова выкладываем (не через руки) итд

Вобщем за неск минут я поднялся на высоту 5 этажки

 

ну и гравитация тут есть только для Rigid Body

Хрен че выходит... (((((

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

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


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

BorizzK Ну вот и я о том же ж. Пока все объекты не станут "гравитировать" вниз - хрен мы чё тут сочиним. 

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


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

ishkur Ну кой-чего я уже сочинил - обработку скидки из рук

работает на 90% как надо

сейчас обкатываю

 

затем скидку из инвентаря буду пытаться обработать

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


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

BorizzK

Вот те для тестов

 

    private		vector						cv_Position					=	"0 0 0";
	private		vector						cv_EarthPosition			=	"0 0 0";
	private	ref RaycastRVParams 			cv_RaycastRVParams;
	private	ref	array<ref RaycastRVResult>	cv_RaycastRVResults;
	private		Object 						cv_RaycastObject;
	private		vector						cv_RaycastObjectPosition	=	"0 0 0";

	void CheckBasement()
	{
		if ( !ItemBase.Cast(this) )
		{ return; }
		if ( Object.Cast(this.parent) )
		{ return; }
		cv_Position			=	this.GetPosition();
		cv_EarthPosition	=	this.GetPosition();
		cv_EarthPosition[1]	=	GetGame().SurfaceY(cv_EarthPosition[0], cv_EarthPosition[2]);
		if ( cv_Position[1] <= cv_EarthPosition[1] )
		{ return; }
		cv_RaycastRVParams	=	new RaycastRVParams(cv_Position, cv_EarthPosition);
		cv_RaycastRVResults	=	new array<ref RaycastRVResult>;
		cv_RaycastObject	=	NULL;
		if ( DayZPhysics.RaycastRVProxy(cv_RaycastRVParams, cv_RaycastRVResults) )
		{
			if ( cv_RaycastRVResults.Count() > 0 )
			{
				cv_RaycastObject	=	cv_RaycastRVResults[0].obj;
				if ( cv_RaycastRVResults[0].hierLevel > 0 )
				{
					if ( cv_RaycastRVResults[0].parent.IsMan() )
					{ Object.CastTo(cv_RaycastObject, cv_RaycastRVResults[0].parent); }
					else
					{ cv_RaycastObject	=	NULL; }
				}
			}
		}
		if ( cv_RaycastObject )
		{
			cv_RaycastObjectPosition	=	cv_RaycastRVResults[0].pos;
			if ( cv_Position[1] > cv_RaycastObjectPosition[1] )
			{
				if ( (cv_Position[1] - 0.1) >= cv_RaycastObjectPosition[1] )
				{
					cv_Position[1]	=	cv_Position[1] - 0.1;
					this.SetPosition(cv_Position);
				}
			}
		}
		else
		{
			cv_Position[1]	=	cv_Position[1] - 0.1;
			this.SetPosition(cv_Position);
		}
	}

Не проверял!

 

Это надо бы запихать в EOnFrame EntityAI как есть, но его моддить нельзя.

Так что - как вариант - при создании объектов(в т.ч. и при загрузке из БД), проверять - если это ItemBase(я хз как там в дайзе, может еще какая проверка нужна) - то добавлять в массив - static

И по этому массиву раз в 1с пробегать в цикле во время работы сервера, и запускать - CheckBasement, для этого объекта.

*в скрипте - this - заменить на аргумент - т.е. переделать так -

void CheckBasement(EntityAI v_ChkObj)

....

cv_Position = v_ChkObj.GetPosition();

ну смысл ты понял..

 

и в цикле проверки уже будет так -

CheckBasement( EntityAI.Cast(объект_массива) );

 

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


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

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

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


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

//    Глобальная переменная(будет содержать все объекты, которые необходимо проверять)
static array<ref Object> gv_Objects    =    new array<ref Object>;

//    Добавление в массив элемента
MyObj    =    ....;
gv_Objects.Insert( Object.Cast(MyObj) );

//    Процедура проверки
for (int i=gv_Objects.Count() - 1; i>=0; i--)
{
    if ( !gv_Objects )
    { gv_Objects.Remove; }
    else
    { CheckBasement(gv_Objects); }
}

Все это дело расфасовать куда надо.
Процедуру проверки добавить в класс (к примеру миссии), и вызвать по таймеру.

 

чет тут срезало квадрадтные скобки... ну разберешся. - или как код надо было вставить...

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

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


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

EOnFrame EntityAI моддить нельзя... Why?

 

Ну как бы со скидкой из рук я разобрался - просто

Работает нормально

 

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

Ибо перетаскиванием из инвентаря и обратно колес можно на любую высоту подняться (((

 

Нашел где на серве обработка идет

Буду ковырять

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

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


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

EntityAI

BorizzK 

да, классы движка нельзя моддить.

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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