Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
NoyName

Логи сервера выбивают Null

Сервер выбивает :

NULL pointer to instance
Class:      'DayZPlayerInventory'
Function: 'ProccessInputData'
Stack trace:
scripts/4_World/systems\inventory\dayzplayerinventory.c:546
scripts/4_World/systems\inventory\dayzplayerinventory.c:1102
scripts/4_World/systems\inventory\dayzplayerinventory.c:482

Из за функции (проверка предмета в слотах игрока):
 

bool test1()
	{
		
		
		for ( int att_i = 0; att_i < GetInventory().AttachmentCount(); ++att_i )
		{
			EntityAI attachment = GetInventory().GetAttachmentFromIndex( att_i );
			ref CargoBase attachment_cargo = attachment.GetInventory().GetCargo();
			
			if ( attachment_cargo )
			{
				for ( int cgo_i = 0; cgo_i < attachment_cargo.GetItemCount(); ++cgo_i )
				{
					EntityAI cargo_item = attachment_cargo.GetItem( cgo_i );
					

					if ( cargo_item.GetType() == "WoodAxe" )
					{
						return true;						
					}
				}
			}
		}
		return false;
	}

Пробовал функцию закидывать на сервер, на клиент и сразу на клиент и сервер. Есть варианты решения?

Edited by NoyName (see edit history)

Share this post


Link to post
Share on other sites

18 answers to this question

Recommended Posts

  • 0

EnumerateInventory и GetEntityInHands в помощь

 

	bool IsItemInInventory(string className)
	{
		array<EntityAI> itemsArray = new array<EntityAI>;
		GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER, itemsArray);
		
		for (int i = 0; i < itemsArray.Count(); i++)
		{
			if (itemsArray[i].IsKindOf(className)) return true;
		}
		if (GetEntityInHands() && GetEntityInHands().IsKindOf(className)) return true;
		return false;
	}


 

Share this post


Link to post
Share on other sites



  • 0

И все это нагромождение, что бы узнать есть топор в инвентаре или нет?

А
Понял

Ищем топор в инвентаре предметов что лежать в инвентаре

Ну и как бы цикл с ошибкой
https://code-live.ru/forum/cpp/7/

Нужно
att_i++ и cgo_i++

Ибо - см ВЫШЕ


 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0
1 минуту назад, BorizzK сказал:

И все это нагромождение, что бы узнать есть топор в инвентаре или нет?

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

Share this post


Link to post
Share on other sites
  • 0
Только что, NoyName сказал:

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

Выше поправил

Не надо в циклах ++переменная
Произойдет выход за пределы массива

инкремент  - переменная++

 

Share this post


Link to post
Share on other sites
  • 0
9 минут назад, BorizzK сказал:

Выше поправил

Не надо в циклах ++переменная
Произойдет выход за пределы массива

инкремент  - переменная++

 

Поправил, но краш это не исправило

Share this post


Link to post
Share on other sites
  • 0
14 минут назад, NoyName сказал:

Поправил, но краш это не исправило

знач логгируем
Я бы на самом деле по другому сделал

Так
Еще раз
Что надо в итоге?

Share this post


Link to post
Share on other sites
  • 0
10 минут назад, BorizzK сказал:

знач логгируем
Я бы на самом деле по другому сделал

Так
Еще раз
Что надо в итоге?

Мне нужно проверить есть предмет в инвентаре у игрока (в руках или в слотах одежды). Если есть то значение функции bool будет правда и следовательно я потом смогу использовать в других функциях на примере :
 

if (test1())
{
 //
}

Если есть способ сделать по другому, это не важно. Главное это результат, а не путь в данном случае!

P.s функцию я закинул кст в PlayerBase

Edited by NoyName (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Ща поглядел -  есть штатная функция

Так прям и называется

 

	bool IsItemInInventory(EntityAI entity)
	{
		return GetInventory().HasEntityInInventory(entity);
	}

Но она проверяет именно обьект, а не класснейм

 

Share this post


Link to post
Share on other sites
  • 0
37 минут назад, BorizzK сказал:

Ща поглядел -  есть штатная функция

Так прям и называется

 

bool IsItemInInventory(EntityAI entity) { return GetInventory().HasEntityInInventory(entity); }


	bool IsItemInInventory(EntityAI entity)
	{
		return GetInventory().HasEntityInInventory(entity);
	}

Но она проверяет именно обьект, а не класснейм

 

Это конечно интересно, но разве можно конвертировать предметы из  ItemBase в EntityAI?

Share this post


Link to post
Share on other sites
  • 0
19 минут назад, NoyName сказал:

Это конечно интересно, но разве можно конвертировать предметы из  ItemBase в EntityAI?

ItemBase наследуется от EntityAI
Это не конвертация - это  downкастинг

Что в принципе лишено смысла

Тк если предмет наследован от ItemBase то все свойства и методы класса EntityAI присущи и ему

ЗЫ штатная функция -она есть в игре - потому что я выше накидал - там просто название совпало )))

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0
1 час назад, BorizzK сказал:

EnumerateInventory и GetEntityInHands в помощь

 

bool IsItemInInventory(string className) { array<EntityAI> itemsArray = new array<EntityAI>; GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER, itemsArray); for (int i = 0; i < itemsArray.Count(); i++) { if (itemsArray.IsKindOf(className)) return true; } if (GetEntityInHands() && GetEntityInHands().IsKindOf(className)) return true; return false; }


	bool IsItemInInventory(string className)
	{
		array<EntityAI> itemsArray = new array<EntityAI>;
		GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER, itemsArray);
		
		for (int i = 0; i < itemsArray.Count(); i++)
		{
			if (itemsArray[i].IsKindOf(className)) return true;
		}
		if (GetEntityInHands() && GetEntityInHands().IsKindOf(className)) return true;
		return false;
	}


 

Может я конечно что то не догоняю, но использование GetEntityInHands выдает Undefined function

Share this post


Link to post
Share on other sites
  • 0
4 минуты назад, NoyName сказал:

Может я конечно что то не догоняю, но использование GetEntityInHands выдает Undefined function

player.GetEntityInHands()
если ты используешь функцию вне PlayerBase и переменная player содержит в себе указатель на персонажа

Я же написал для использования в классе PlayerBase там this (текущий экземпляр) подставляется автоматом

Изучайте object oriented programming - базового понимания C# будет вполне

для простоты - https://community.bistudio.com/wiki/DayZ:Enforce_Script_Syntax

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0
37 минут назад, BorizzK сказал:

player.GetEntityInHands()
если ты используешь функцию вне PlayerBase и переменная player содержит в себе указатель на персонажа

Я же написал для использования в классе PlayerBase там this (текущий экземпляр) подставляется автоматом

Изучайте object oriented programming - базового понимания C# будет вполне

для простоты - https://community.bistudio.com/wiki/DayZ:Enforce_Script_Syntax

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

Edited by NoyName (see edit history)

Share this post


Link to post
Share on other sites
  • 0
18 минут назад, NoyName сказал:

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

EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();

3_Game\Systems\Inventory\HumanInventory.c: proto native EntityAI GetEntityInHands ();

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 0
2 минуты назад, 123new сказал:

EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();


EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();

3_Game\Systems\Inventory\HumanInventory.c: proto native EntityAI GetEntityInHands ();

К сожалению эта информация не приблизила меня к решению моей проблемы *3*

Share this post


Link to post
Share on other sites
  • 0
7 минут назад, NoyName сказал:

К сожалению эта информация не приблизила меня к решению моей проблемы *3*

В смысле????

Ты походу даж не пытаешься понять как ЭТО ВСЕ работает

 

Share this post


Link to post
Share on other sites
  • 0
4 часа назад, BorizzK сказал:

EnumerateInventory и GetEntityInHands в помощь

 

bool IsItemInInventory(string className) { array<EntityAI> itemsArray = new array<EntityAI>; GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER, itemsArray); for (int i = 0; i < itemsArray.Count(); i++) { if (itemsArray.IsKindOf(className)) return true; } if (GetEntityInHands() && GetEntityInHands().IsKindOf(className)) return true; return false; }


	bool IsItemInInventory(string className)
	{
		array<EntityAI> itemsArray = new array<EntityAI>;
		GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER, itemsArray);
		
		for (int i = 0; i < itemsArray.Count(); i++)
		{
			if (itemsArray[i].IsKindOf(className)) return true;
		}
		if (GetEntityInHands() && GetEntityInHands().IsKindOf(className)) return true;
		return false;
	}


 

	bool test1()
	{
		
	    array<EntityAI> itemsArray = new array<EntityAI>;
		GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER, itemsArray);
		
		for (int i = 0; i < itemsArray.Count(); i++)
		{
			if (itemsArray[i].IsKindOf("Apple"))
			{
				return true;
			}
		}
		if (GetHumanInventory().GetEntityInHands().GetType() == "Apple")
		{
			return true;
		}
		return false;
	}

Вот так у меня заработало. Спасибо за помощь

Share this post


Link to post
Share on other sites
  • 0
11 часов назад, NoyName сказал:

К сожалению эта информация не приблизила меня к решению моей проблемы *3*

на будущее, рекоммендую к изучению

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.