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

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

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

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

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

Запрет вложение батарейки в аттачмент

Всем привет. Осмелюсь попросить о помощи с аттачментами.
Суть. Допустим есть бочка и в бочке есть аттачмент для оружия, рюкзака и шмоток.
У некоторых предметов, например у рюкзака Алисы есть аттачмент для рации.
Вопрос: Как запретить класть рацию именно с батарейкой или батарейку в рацию (Если рация уже находится в рюкзаке) в слоте рюкзака, если рюкзак уже в слоте бочки?
То есть, если кладём в аттачмент бочки рюкзак, а потом нужно сделать проверку на добавление в аттачмент рюкзака рации с батарейкой или батарейку в рацию (Если рация уже находится в рюкзаке)
Пробовал сделать в CanReceiveAttachment и CanReceiveItemIntoCargo Не фига не работает. 
Если класть рюкзак с рацией и с батарейкой в аттачмент бочки, я реализовал проверку и запрет, а вот как сделать запрет вложение рации с батарейкой когда рюкзак уже в бочке, не получается. ПОМОГИТЕ!
За ранние благодарю.

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


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

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

  • 0

Попробуй сделать проверку если рюкзак прикреплен как аттачмент тоесть имеет родителя то запретить присоединение батарейки. Или замодить класс рации той же проверкой. если она имеет родителя то запретить прикреплять батарейку

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


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

@WiLDman Не рарик модить рацию, это был пример.
В бочке есть аттачменты с оружием, разгрузки, рюкзаки и т...д.
Мне что каждый предмет где есть слот под батарейку модить? 
Мне просто нужно запретить класть предметы которые имеют батарейку в слоте или класть батарейку в слот предмета который уже находится в дочерним аттачменте.
 

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


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

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

по аналогии с кодом этого класса (убрав ест ественно лишнее) запрещаем что-либо класть в нужную нам вещь, разумеется, добавив эту проверку в класс этой вещи.

На вопрос 'а что делать с аттачментами' отвечаю - сканим все содержимое (т.е. если надо проверять именно слоты аттачментов то все возможные слоты аттачменты), ищем в списке найденного батареечку, и если нашли, то радуемся жизни и запрещаем соответствующее действие. Логика прямая.

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


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

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

по аналогии с кодом этого класса (убрав ест ественно лишнее) запрещаем что-либо класть в нужную нам вещь, разумеется, добавив эту проверку в класс этой вещи.

На вопрос 'а что делать с аттачментами' отвечаю - сканим все содержимое (т.е. если надо проверять именно слоты аттачментов то все возможные слоты аттачменты), ищем в списке найденного батареечку, и если нашли, то радуемся жизни и запрещаем соответствующее действие. Логика прямая.

@123new  Уважаемый 123new. Как найти батареечку, я это реализовал. 
Просто не могу найти функцию которая блокируюет вложение дочерного предмета в аттачменте другого аттачмента.
Погляжу на Вашь rar. благодарю за отклик о помощи ?

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


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

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

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


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

Можно пример?

 

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


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

@123new Корочей. Вот так когда ложу в Аттачмент и если есть батарейка, всё блочится.

SCRIPT       : Что я помещаю в Attachment - AKM
SCRIPT       : Обвесы на предмете - Mag_AKM_Drum75Rnd
SCRIPT       : Обвесы на предмете - PSO1Optic
SCRIPT       : Что есть в дочерним Аттачменте предмета - Battery9V

Но если ствол уже висит в Аттачменте и я навешиваю прицел с батарейкой, прицел спокайно крепится к стволу и мне в логи пишет что я не в Аттачмент креплю а в Item override bool CanReceiveItemIntoCargo(EntityAI item)  а override bool CanReceiveAttachment(EntityAI attachment, int slotId) не срабатывает.
В override bool CanReceiveItemIntoCargo(EntityAI item) у меня есть проверка есть ли у предмета Attachment и что попадает туда.

SCRIPT       : Что есть в Аттачменте предмета - Battery9V

Не знаю что делать. Перебор предметов в override bool CanReceiveItemIntoCargo(EntityAI item) и в override bool CanReceiveAttachment(EntityAI attachment, int slotId) Вроде сделал а блочить не хочет.
Вот сами проверки.

override bool CanReceiveAttachment(EntityAI attachment, int slotId) // можно ли положить что-то к этой вещи в слот аттачмента
	{
		if (GetHealthLevel() == GameConstants.STATE_RUINED)
			return false;
		
		if(!super.CanReceiveAttachment(attachment, slotId))
			return false;
		
		if(itemBl)
			return false;
		
		foreach(string mainAtt : m_Bl) {
			if(mainAtt == attachment.GetType()) {
				return false;
			}
		}
		
		Print("Что я помещаю в Attachment - " + attachment.GetType());
		
		for(int i = 0; i < attachment.GetInventory().AttachmentCount(); i++) {
			EntityAI att = attachment.GetInventory().GetAttachmentFromIndex(i);
			Print("Обвесы на предмете - " + att.GetType());
			
			foreach(string itemAtt : m_Bl) {
				if(itemAtt == att.GetType()) {
					return false;
				}
			}
			
			for(int a = 0; a < att.GetInventory().AttachmentCount(); a++) {
				EntityAI attItem = att.GetInventory().GetAttachmentFromIndex(a);
				foreach(string childAtt : m_Bl) {
					if(childAtt == attItem.GetType()) {
						Print("Что есть в дочерним Аттачменте предмета - " + attItem.GetType());
						return false;
					}
				}
			}
		}
		return true;
	}

вторая проверка.
 

override bool CanReceiveItemIntoCargo(EntityAI item) // можно ли положить в инвентарь этой вещи
	{
		if (item.GetHealthLevel() == GameConstants.STATE_RUINED)
			return false;
		
		if(!super.CanReceiveItemIntoCargo(item))
			return false;
		
		if(item.GetInventory().GetCargo()) {	
			while((item.GetInventory().GetCargo().GetItemCount()) > 0) {
				return false;
			}
		}
		
		// Print("Что я помещаю в карго - " + item.GetType());
		
		foreach(string itemInbl : m_Bl)
		{
			if(itemInbl == item.GetType()) {
				Print("Что я помещаю в карго - " + itemInbl);
				itemBl = true;
				return false;
			} else {
				itemBl = false;
			}
			
			for(int a = 0; a < item.GetInventory().AttachmentCount(); a++) {
				EntityAI attItem = item.GetInventory().GetAttachmentFromIndex(a);
				
				if(itemInbl == attItem.GetType()) {
					int slotItem = item.GetInventory().GetAttachmentSlotId(a);
					Print("Что есть в Аттачменте предмета " + item.GetType() + " -> " + itemInbl);
					itemBl = true;
					CanReceiveAttachment(attItem, slotItem);
					return false;
				} else {
					itemBl = false;
				}
			}
		}
		return true;
	}

 

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


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

Нашёл в ваниле class EntityAI extends Entity и class DamageSystem взял куски кода и собрал вот такую проверку и тоже самое. Неработает как надо.

protected bool FBLI(EntityAI entity)
	{
		if(!m_Bl || m_Bl.Count() == 0)
			return false;
		
		foreach(string itemInBl: m_Bl) {
			if(entity.GetType() == itemInBl || entity.IsKindOf(itemInBl) || entity.IsInherited(itemInBl.ToType())) {
				// Print("Что я помещаю в карго или в Аттачмент - " + type);
				return true;
			}
		}
		
		for(int i = 0; i < entity.GetInventory().AttachmentCount(); i++) {
			EntityAI att = entity.GetInventory().GetAttachmentFromIndex(i);
			foreach(string itemAtt : m_Bl) {
				if(att.IsKindOf(itemAtt)) {
					Print("Обвесы на предмете - " + att.GetType());
					return true;
				}
			}
			
			for(int a = 0; a < att.GetInventory().AttachmentCount(); a++) {
				EntityAI attItem = att.GetInventory().GetAttachmentFromIndex(a);
				foreach(string childAtt : m_Bl) {
					if(attItem.IsKindOf(childAtt)) {
						// Print("Что есть в Аттачменте предмета - " + att.GetType() + " -> " + attItem.GetType());
						return true;
					}
				}
			}
		} return false;
	}


 

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


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

Можно пример?

 

примера нет, надо собирать на коленке буквально.  Там нет ничего нового, как уже сказал, просто проверяем предмет и все в него входящее по слотам и инвентарю с соответствующей повторной проверкой каждого входящего внутрь. Условная проверка элементов из массива в слотах инвентаря с вложенной проверкой каждого объекта внутри этого массива по тому же сценарию.

В качестве примера для сканирования можно взять скрипт

Script.c функция GetItemListinobject и RemoveAllItems

буквально поиск всего что есть на игроке. С любым предметом и объектом работает также, т.к. функция универсальная.

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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

Поддержка