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

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

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

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

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

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

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

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


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

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

  • 0

Вобщем со обработкой скидки из рук проблем как бы нет

Проблема с обработкой выкладывания из инвентаря на землю колес

Там целая последовательность вызовов в нативном классе

Нативные классы не отмодить

 

Основная обработка в 4_World\Systems\Inventory\DayZPlayerInventory.c

 

привем данных о перемещении предмета из инвентаря в HandleInputData

в условном выборе InventoryCommandType.SYNC_MOVE:

 

после вызова

LocationSyncMoveEntity(src, dst);

 и обзательной проверки dst на GROUND что бы не двигать что переместилось между инвентарем/руками

 

Это не проблема в принципе

 

Но как-то криво...

 

Есть идеи?

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

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


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



  • 0

BorizzK я вот пока рыл, нарыл тока кучу функций

например, в PlayerBase есть функция DropItem

в Inventory.c и HumanInventory.c есть взаимосвязанные функции DropEntity

в Man.c есть ServerDropEntity и DropEntityImpl

но все они либо не работают, либо работают только на клиенте.

Для интереса, сравнил по логам клиента функцию взятия с земли в инвентарь.
Функция TakeEntityToInventory в HumanInventory.c наприер вызывается при взятии на клиенте. А вот аналогичная функция DropEntity при скидывании так не пашет, хотя видно что предусмотрена.

Разумеется переписать Inventory.c и Man.c не выйдет, т.к. функции объявлены движком игры, разве что в живом коде пытаться переписывать в самих скриптах.

 

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


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

123new с рук на землю я выше написал, моддится без проблем

Сеня обкатал, как со сканом обьектов в сфре у ног, так и с raycastrv, все ок

Осталось разобраться с перетаскиванием из инвентаря

 

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

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

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


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

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

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


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

123new добавлю вызов своей  функции и все

scripts все равно распакованы

 

 

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


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

123new я вот все понять не могу (пока, тк не тзучал)

Некоторые моды активно юзают рпц, значит гдет еще обработки есть, откуда данные дальше переползают в обработки  этих нативных классов или из нативных в модовые

Значит решаемо в теории

 

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


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

BorizzK надо искать событие OnItemDropped или че-нить типа такого, типа совершено.

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
//MOD AUTHOR: BORIZZ.K s-platoon.ru
//01.05.2019.0111

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 (player)
		{	
			Print("::: SERVER: [HandActionDrop DEBUG]: Raycast begin.");
			// Raycasts world by given parameters
			vector 		begPos 				= player.GetPosition(); 							// begPos \p vector 	Begin position of raycast (e.g. player position)
			vector 		endPos 				= Vector(begPos[0], begPos[1] - 0.5, begPos[2]); 	//begPos + (player.GetDirection() * 100); // endPos \p vector 	End position of raycast (e.g. player direction)
			
			vector 		contactPos; 															// contactPos \p vector out, 	world position of first contact
			vector 		contactDir; 															// contactDir \p vector out, 	direction of first contact (available only when object is hitted)
			int 		contactComponent; 														// contactComponent \p int out, object 	component index (available only when object is hitted)

			int 		iType				= 4; 												// iType \p int, 	type of intersection, possible values ObjIntersectFire(0), ObjIntersectView(1), ObjIntersectGeom(2), ObjIntersectIFire(3), ObjIntersectNone(4) 
			float 		radius 				= 1.0;												// radius \p float 	Radius of the ray, default value set to 0 
			//returns \p bool return true if raycast hits ground or object		
			
			DayZPhysics.RaycastRV( begPos, endPos, contactPos, contactDir, contactComponent, NULL, NULL, NULL, false, false, iType, radius);
			
			Print("Begin pos:   " + begPos);
			Print("End pos:     " + endPos);
			
			Print("Contact pos: " + contactPos);
			Print("Contact dir: " + contactDir);
			Print("Component:   " + contactComponent);
			
			Print("iType:       " + iType);
			Print("Ray radius:  " + radius);

			Print("::: SERVER: [HandActionDrop DEBUG]: Raycast end.");
		}

		
		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);
			GetGame().GetObjectsAtPosition3D(Vector(dropPosition[0],dropPosition[1] - 0.05,dropPosition[2]),1.01,nearest_objects,proxy_cargos);
			if (nearest_objects.Count() > 1)
			{
				for ( int i = 0; i < nearest_objects.Count(); i++ )
				{
					if (nearest_objects[i].GetType() != player.GetType() || nearest_objects[i].GetPosition()[1] > (dropPosition[1] - 0.10))
					{
						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];
							Print("::: SERVER: [HandActionDrop DEBUG]: Correct dropPosition[1] =  " + dropPosition[1] + " to object " + nearest_objects[i].GetType());
						}
					}
				}
				dropPosition[1] = 	dropPosition[1] + 0.01;
				dropPosition[0]	=	dropPosition[0] + Math.RandomFloatInclusive(-0.1,0.1);
				dropPosition[1] =	dropPosition[1] + Math.RandomFloatInclusive(-0.010,0.010);
				dropPosition[2]	=	dropPosition[2] + Math.RandomFloatInclusive(-0.1,0.1);
				Print("::: SERVER: [HandActionDrop DEBUG]: Finally correct dropPosition[1] =  " + dropPosition[1]);
				item.SetPosition(dropPosition);
				item.SetOrientation(item.GetOrientation());
				Print("::: SERVER: [HandActionDrop DEBUG]: new dropPosition = " + dropPosition.ToString());
			}
		}
	}
}

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

работает вроде норм

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


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

1 Код на скидку из рук

на земле группируются предметы по типам

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

 

Установка

Создаем файл - например Hand_Actions_modded.c

Помещаем в 3_Game\Systems\Inventory

И помещаем в него следующий код:

//MOD AUTHOR: BORIZZ.K s-platoon.ru
//02.05.2019.0034

modded class HandActionDrop extends HandActionBase
{
	bool m_HandActionDropMyDebug = true;

	override void Action (HandEventBase e)
	{
		Man player 						= 	e.m_Player;
		EntityAI item 					= 	e.m_Entity;
		string myDebugString = "::: SERVER: [HandActionDrop DEBUG]: ";
		
		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(myDebugString + "Action: input: HandEventBase e = " + e.ToString() + ": player = " + player_Name + ", player pos: " + player.GetPosition() + " DROP: item = " + item.ToString() + " : item.GetPosition() = " + item.GetPosition() +", itemInHands = " + itemInHands.ToString());
			Print(myDebugString + "Current surface alt: " + GetGame().SurfaceY(player.GetPosition()[0], player.GetPosition()[2]));
			Print(myDebugString + "Current surface normal: " + GetGame().SurfaceGetNormal(player.GetPosition()[0], player.GetPosition()[2]).ToString());
			string SurfaceType, SurfaceType3D;
			GetGame().SurfaceGetType(player.GetPosition()[0], player.GetPosition()[2], SurfaceType);
			GetGame().SurfaceGetType3D(player.GetPosition()[0], player.GetPosition()[1], player.GetPosition()[2], SurfaceType3D);
			Print(myDebugString + "Current surface types: SurfaceType = " + SurfaceType + ", SurfaceType3D = " + SurfaceType3D);
		}

		if (item)
		{
			dBodyEnableGravity(item,true); //works with ItemBase/EntityAI items?
			if (m_HandActionDropMyDebug)
			{
				Print(myDebugString + "Raycast begin.");
				vector 		begPos 				= item.GetPosition(); 								// begPos \p vector 	Begin position of raycast (e.g. player position)
				vector 		endPos 				= Vector(begPos[0], begPos[1] - 0.55, begPos[2]); 	//begPos + (player.GetDirection() * 100); // endPos \p vector 	End position of raycast (e.g. player direction)
			
				vector 		contactPos; 															// contactPos \p vector out, 	world position of first contact
				vector 		contactDir; 															// contactDir \p vector out, 	direction of first contact (available only when object is hitted)
				int 		contactComponent; 														// contactComponent \p int out, object 	component index (available only when object is hitted)

				int 		iType				= 4; 												// iType \p int, 	type of intersection, possible values ObjIntersectFire(0), ObjIntersectView(1), ObjIntersectGeom(2), ObjIntersectIFire(3), ObjIntersectNone(4) 
				float 		radius 				= 1.0;												// radius \p float 	Radius of the ray, default value set to 0 
			
				DayZPhysics.RaycastRV( begPos, endPos, contactPos, contactDir, contactComponent, NULL, NULL, NULL, false, false, iType, radius);
			
				Print("::: Begin pos:   " + begPos);
				Print("::: End pos:     " + endPos);
			
				Print("::: Contact pos: " + contactPos);
				Print("::: Contact dir: " + contactDir);
				Print("::: Component:   " + contactComponent);
			
				Print("::: iType:       " + iType);
				Print("::: Ray radius:  " + radius);

				Print(myDebugString + "Raycast end.");
			}

			vector dropPosition = item.GetPosition();	
			bool mCorrectDropPos = false;
			array<Object> nearest_objects = new array<Object>;
			array<CargoBase> proxy_cargos = new array<CargoBase>;
			GetGame().GetObjectsAtPosition3D(Vector(dropPosition[0],dropPosition[1] - 0.10,dropPosition[2]),1.1,nearest_objects,proxy_cargos);
			if (nearest_objects.Count() > 2)
			{
				for ( int i = 0; i < nearest_objects.Count(); i++ )
				{
					//Print(myDebugString + "Found near object: nearest_objects[i] = " + nearest_objects[i].GetType() + ", nearest_objects[i].GetPosition() =  " +  nearest_objects[i].GetPosition() + " :needed dropPosition[1] = " + dropPosition[1]);
				if (nearest_objects[i] != player && nearest_objects[i] != item && nearest_objects[i].GetType() == item.GetType() && nearest_objects[i].GetPosition()[1] > item.GetPosition()[1] - 1)
					{
						Print(myDebugString + "Found a suitable near 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];
							Print(myDebugString + "Correct dropPosition[1] =  " + dropPosition[1] + " to object " + nearest_objects[i].GetType());
							mCorrectDropPos = true;
						}
					}
					
				}
				if (mCorrectDropPos)
				{
					Print(myDebugString + "Need drop position correct");
					dropPosition[1] = 	dropPosition[1] + 0.01;
					dropPosition[0]	=	dropPosition[0] + Math.RandomFloatInclusive(-0.050,0.050);
					dropPosition[1] =	dropPosition[1] + Math.RandomFloatInclusive(-0.001,0.020);
					dropPosition[2]	=	dropPosition[2] + Math.RandomFloatInclusive(-0.050,0.050);
					Print(myDebugString + "Finally correct dropPosition[1] =  " + dropPosition[1]);
					item.SetPosition(dropPosition);
					item.SetOrientation(item.GetOrientation());
					Print(myDebugString + "new dropPosition = " + dropPosition.ToString());
				}
			}
		}
	}
}

 

2 Код на перемещение из инвентаря на землю

 

находим в папке 4_World\Systems\Inventory файл DayZPlayerInventory.c

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

 

посему открываем и ищем функцию  bool HandleInputData (bool handling_juncture, bool remote, ParamsReadContext ctx)

 

в ней в выборе switch (type) ищем case - case InventoryCommandType.SYNC_MOVE:

в его теле ищем вызов LocationSyncMoveEntity(src, dst); и после него break;

 

и между ними помещаем следующий код:

 

				//MY --- place item from inventory to ground
				//01.05.2019.2005
				if (dst.GetType() == 1)
				{
					Print("::: SERVER: [DayZPlayerInventory DEBUG]: 5 HandleInputData: InventoryCommandType.SYNC_MOVE: src.GetType()=" + src.GetType() + ": src=" + src.DumpToString() + ", dst.GetType()=" + dst.GetType() + ": dst=" + dst.DumpToString());
					Print("::: SERVER: [DayZPlayerInventory DEBUG]: 5 HandleInputData: InventoryCommandType.SYNC_MOVE: item: " + dst.GetItem().GetType() + ", new position on ground: " + dst.GetItem().GetPosition().ToString());
					GetManOwner()
					//--- code ---//

					bool m_HandActionDropMyDebug = true;
					string myDebugString = "::: SERVER: [DayZPlayerInventory DEBUG]: ";
					
					EntityAI 	item	= NULL;
					item = dst.GetItem();
					if (!item) break;

					Print(myDebugString + "item GetManOwner() = " + GetManOwner());

					if (item)
					{
						dBodyEnableGravity(item,true); //works with ItemBase/EntityAI items?
						if (m_HandActionDropMyDebug)
						{
							Print(myDebugString + "Raycast begin.");
							vector 		begPos 				= item.GetPosition(); 								// begPos \p vector 	Begin position of raycast (e.g. player position)
							vector 		endPos 				= Vector(begPos[0], begPos[1] - 0.55, begPos[2]); 	//begPos + (player.GetDirection() * 100); // endPos \p vector 	End position of raycast (e.g. player direction)
			
							vector 		contactPos; 															// contactPos \p vector out, 	world position of first contact
							vector 		contactDir; 															// contactDir \p vector out, 	direction of first contact (available only when object is hitted)
							int 		contactComponent; 														// contactComponent \p int out, object 	component index (available only when object is hitted)

							int 		iType				= 4; 												// iType \p int, 	type of intersection, possible values ObjIntersectFire(0), ObjIntersectView(1), ObjIntersectGeom(2), ObjIntersectIFire(3), ObjIntersectNone(4) 
							float 		radius 				= 1.0;												// radius \p float 	Radius of the ray, default value set to 0 
			
							DayZPhysics.RaycastRV( begPos, endPos, contactPos, contactDir, contactComponent, NULL, NULL, NULL, false, false, iType, radius);
			
							Print("::: Begin pos:   " + begPos);
							Print("::: End pos:     " + endPos);

							Print("::: Contact pos: " + contactPos);
							Print("::: Contact dir: " + contactDir);
							Print("::: Component:   " + contactComponent);
			
							Print("::: iType:       " + iType);
							Print("::: Ray radius:  " + radius);

							Print(myDebugString + "Raycast end.");
						}

						vector dropPosition = item.GetPosition();	
						bool mCorrectDropPos = false;
						array<Object> nearest_objects = new array<Object>;
						array<CargoBase> proxy_cargos = new array<CargoBase>;
						GetGame().GetObjectsAtPosition3D(Vector(dropPosition[0],dropPosition[1] - 0.10,dropPosition[2]),1.1,nearest_objects,proxy_cargos);
						if (nearest_objects.Count() > 2)
						{
							for ( int i = 0; i < nearest_objects.Count(); i++ )
							{
								//Print(myDebugString + "Found near object: nearest_objects[i] = " + nearest_objects[i].GetType() + ", nearest_objects[i].GetPosition() =  " +  nearest_objects[i].GetPosition() + " :needed dropPosition[1] = " + dropPosition[1]);
								if (/* nearest_objects[i] != player && */ nearest_objects[i] != item && nearest_objects[i].GetType() == item.GetType() && nearest_objects[i].GetPosition()[1] > item.GetPosition()[1] - 1.1)
								{
									Print(myDebugString + "Found a suitable near 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];
										Print(myDebugString + "Correct dropPosition[1] =  " + dropPosition[1] + " to object " + nearest_objects[i].GetType());
										mCorrectDropPos = true;
									}
								}
					
							}
							if (mCorrectDropPos)
							{
								Print(myDebugString + "Need drop position correct:");
								dropPosition[1] = 	dropPosition[1] + 0.01;
								dropPosition[0]	=	dropPosition[0] + Math.RandomFloatInclusive(-0.050,0.050);
								dropPosition[1] =	dropPosition[1] + Math.RandomFloatInclusive(-0.001,0.020);
								dropPosition[2]	=	dropPosition[2] + Math.RandomFloatInclusive(-0.050,0.050);
								Print(myDebugString + "Finally correct dropPosition[1] =  " + dropPosition[1]);
								item.SetPosition(dropPosition);
								item.SetOrientation(item.GetOrientation());
								Print(myDebugString + "New dropPosition = " + dropPosition.ToString());
							}
						}
					}
					//--- code ---//
				}
				//MY --- place item from inventory to ground

Проверено

Работает

 

P.S. Логгирование и тп  оставлено - удаляйте самостаятельно

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

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


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

BorizzK 

Не работает, сделал все как ты сказал

	bool HandleInputData (bool handling_juncture, bool remote, ParamsReadContext ctx)
	{
		int type = -1;
		if (!ctx.Read(type))
			return false;

		switch (type)
		{
			case InventoryCommandType.SYNC_MOVE:
			{
				InventoryLocation src = new InventoryLocation;
				InventoryLocation dst = new InventoryLocation;
				src.ReadFromContext(ctx);
				dst.ReadFromContext(ctx);

				if (remote && (!src.GetItem() || !dst.GetItem()))
				{
					Error("[syncinv] HandleInputData remote input (cmd=SYNC_MOVE) dropped, item not in bubble! src=" + src.DumpToString() + " dst=" + dst.DumpToString());
					break; // not in bubble
				}
				
				if (false == GameInventory.CheckMoveToDstRequest(GetManOwner(), src.GetItem(), dst, GameInventory.c_MaxItemDistanceRadius))
				{
					Error("[cheat] HandleInputData man=" + GetManOwner() + " is cheating with cmd=" + typename.EnumToString(InventoryCommandType, type) + " src=" + src.DumpToString() + " dst=" + dst.DumpToString());
					return false; // cheater
				}
				
				syncDebugPrint("[syncinv] HandleInputData t=" + GetGame().GetTime() + "ms received cmd=" + typename.EnumToString(InventoryCommandType, type) + " src=" + src.DumpToString() + " dst=" + dst.DumpToString());

				if (!handling_juncture && GetDayZPlayerOwner().GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER)
				{
					JunctureRequestResult result_mv = TryAcquireInventoryJunctureFromServer(GetDayZPlayerOwner(), src, dst);
					if (result_mv == JunctureRequestResult.JUNCTURE_NOT_REQUIRED)
					{
						// ok, perform sync move
					}
					else if (result_mv == JunctureRequestResult.JUNCTURE_ACQUIRED)
					{
						GetDayZPlayerOwner().SendSyncJuncture(DayZPlayerSyncJunctures.SJ_INVENTORY, ctx); // ok, send juncture
						break; // and do NOT perform sync move
					}
					else if (result_mv == JunctureRequestResult.JUNCTURE_DENIED)
					{
						return true; // abort, do not send anything to remotes
					}
					else
					{
						Error("[syncinv] HandleInputData: unexpected return code from AcquireInventoryJunctureFromServer"); return true;
						return true; // abort, do not send anything to remotes
					}
				}

				LocationSyncMoveEntity(src, dst);
				//MY --- place item from inventory to ground
				//01.05.2019.2005
				if (dst.GetType() == 1)
				{
					Print("::: SERVER: [DayZPlayerInventory DEBUG]: 5 HandleInputData: InventoryCommandType.SYNC_MOVE: src.GetType()=" + src.GetType() + ": src=" + src.DumpToString() + ", dst.GetType()=" + dst.GetType() + ": dst=" + dst.DumpToString());
					Print("::: SERVER: [DayZPlayerInventory DEBUG]: 5 HandleInputData: InventoryCommandType.SYNC_MOVE: item: " + dst.GetItem().GetType() + ", new position on ground: " + dst.GetItem().GetPosition().ToString());
					GetManOwner()
					//--- code ---//

					bool m_HandActionDropMyDebug = true;
					string myDebugString = "::: SERVER: [DayZPlayerInventory DEBUG]: ";
					
					EntityAI 	item	= NULL;
					item = dst.GetItem();
					if (!item) break;

					Print(myDebugString + "item GetManOwner() = " + GetManOwner());

					if (item)
					{
						dBodyEnableGravity(item,true); //works with ItemBase/EntityAI items?
						if (m_HandActionDropMyDebug)
						{
							Print(myDebugString + "Raycast begin.");
							vector 		begPos 				= item.GetPosition(); 								// begPos \p vector 	Begin position of raycast (e.g. player position)
							vector 		endPos 				= Vector(begPos[0], begPos[1] - 0.55, begPos[2]); 	//begPos + (player.GetDirection() * 100); // endPos \p vector 	End position of raycast (e.g. player direction)
			
							vector 		contactPos; 															// contactPos \p vector out, 	world position of first contact
							vector 		contactDir; 															// contactDir \p vector out, 	direction of first contact (available only when object is hitted)
							int 		contactComponent; 														// contactComponent \p int out, object 	component index (available only when object is hitted)

							int 		iType				= 4; 												// iType \p int, 	type of intersection, possible values ObjIntersectFire(0), ObjIntersectView(1), ObjIntersectGeom(2), ObjIntersectIFire(3), ObjIntersectNone(4) 
							float 		radius 				= 1.0;												// radius \p float 	Radius of the ray, default value set to 0 
			
							DayZPhysics.RaycastRV( begPos, endPos, contactPos, contactDir, contactComponent, NULL, NULL, NULL, false, false, iType, radius);
			
							Print("::: Begin pos:   " + begPos);
							Print("::: End pos:     " + endPos);

							Print("::: Contact pos: " + contactPos);
							Print("::: Contact dir: " + contactDir);
							Print("::: Component:   " + contactComponent);
			
							Print("::: iType:       " + iType);
							Print("::: Ray radius:  " + radius);

							Print(myDebugString + "Raycast end.");
						}

						vector dropPosition = item.GetPosition();	
						bool mCorrectDropPos = false;
						array<Object> nearest_objects = new array<Object>;
						array<CargoBase> proxy_cargos = new array<CargoBase>;
						GetGame().GetObjectsAtPosition3D(Vector(dropPosition[0],dropPosition[1] - 0.10,dropPosition[2]),1.1,nearest_objects,proxy_cargos);
						if (nearest_objects.Count() > 2)
						{
							for ( int i = 0; i < nearest_objects.Count(); i++ )
							{
								//Print(myDebugString + "Found near object: nearest_objects[i] = " + nearest_objects[i].GetType() + ", nearest_objects[i].GetPosition() =  " +  nearest_objects[i].GetPosition() + " :needed dropPosition[1] = " + dropPosition[1]);
								if (/* nearest_objects[i] != player && */ nearest_objects[i] != item && nearest_objects[i].GetType() == item.GetType() && nearest_objects[i].GetPosition()[1] > item.GetPosition()[1] - 1.1)
								{
									Print(myDebugString + "Found a suitable near 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];
										Print(myDebugString + "Correct dropPosition[1] =  " + dropPosition[1] + " to object " + nearest_objects[i].GetType());
										mCorrectDropPos = true;
									}
								}
					
							}
							if (mCorrectDropPos)
							{
								Print(myDebugString + "Need drop position correct:");
								dropPosition[1] = 	dropPosition[1] + 0.01;
								dropPosition[0]	=	dropPosition[0] + Math.RandomFloatInclusive(-0.050,0.050);
								dropPosition[1] =	dropPosition[1] + Math.RandomFloatInclusive(-0.001,0.020);
								dropPosition[2]	=	dropPosition[2] + Math.RandomFloatInclusive(-0.050,0.050);
								Print(myDebugString + "Finally correct dropPosition[1] =  " + dropPosition[1]);
								item.SetPosition(dropPosition);
								item.SetOrientation(item.GetOrientation());
								Print(myDebugString + "New dropPosition = " + dropPosition.ToString());
							}
						}
					}
					//--- code ---//
				}
				//MY --- place item from inventory to ground
				break;
			}

Вот как вставил код во второй файлик

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


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

Доброго времени суток.

А если создать массив с ID-шками предметов с коллизиями и, при отработке эвента на сброс, брать предметы в радиусе 1-2 метров, проверять на совпадение и при первом же совпадении выставлять координаты бросаемому предмету идентичные, как у найденного? Да, будет выглядеть не красиво, но не надо будет физический движок напрягать. Другой вопрос, что будет с такими предметами после рестарта, не сделает ли их сервер стопочкой.

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


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

Zimulla зачем?

Один тип в одну кучку

 

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


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

dosserua с тела плохо видно

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

Лучше выложу файлы целиком с сохранением путей

Как до дома доеду

 

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

 

Зы походу из чернового варианта код вставил

 

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

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


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

Доброго времени суток. подскажите как решить проблему запустил сервер EPOCH v.1.3.1.0  но на карте нет техники и с админкы не спавнется

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


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

dosserua  архивчик

там готовые файлы просто открой и поверх папки scripts в корне

 

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

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


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

BorizzK спасибо, скрипт рабочий.

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


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

BorizzK тысяча благодарностей! Работает! Теперь не смогут залазить по колёсам, доскам и даже по гвоздям как это любили делать)

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


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

BorizzK Всетаки нашел косяк))) 

Скрытый текст

2109ef8f118c.png

Всеравно спасибо аз проделанную работу! Но если стакаешь разные колёса или другие предметы, то получится как на скрине выше

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


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

dosserua Ну я же еще не допилил все - все пока на уровне ТЕСТОВ

Былоп больше времени

Нужно время на поиск универсального решения

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

 

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

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


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

BorizzK Спасибо за то что уже сделал много и удивляет что бесплатно! Спасибо за всё!

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
В 04.05.2019 в 01:51, dosserua сказал:

BorizzK Спасибо за то что уже сделал много и удивляет что бесплатно! Спасибо за всё!

Ну вот зачем во всеуслышание ?! Надо было просто автору в личку и все. Тут же по любому есть те кто это будет абузить и разнесет по серверам(

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


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

Gizda финальный вариант не разнесут

Ибо там еще неск обработок, не ток на скидку но и на деление итп

И не ток досок

Да и сами смогут написать, направление же известно.

А еще там не все можно оформить в мод

Лично для себя я сделал, все, включая приземление сверху лежащих предметов если вынимать нижние

 

И я это опубликую, но чуть позже

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


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

BorizzK думаю все будут ждать с нетерпением, отличная работа.

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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