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

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

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

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

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 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;
	}

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

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

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


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

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

  • 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;
	}


 

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


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



  • 0

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

А
Понял

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

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

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

Ибо - см ВЫШЕ


 

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

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


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

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

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

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


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

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

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

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

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

 

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


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

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

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

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

 

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

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


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

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

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

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

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


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

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

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

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

if (test1())
{
 //
}

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

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

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

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


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

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

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

 

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

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

 

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


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

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

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

 

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


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

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

 

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

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


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

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

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

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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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


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

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

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

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


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

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

В смысле????

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

 

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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;
	}

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
11 часов назад, NoyName сказал:

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

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

 

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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