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
Troy1

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

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

Share this post


Link to post
Share on other sites

9 answers to this question

Recommended Posts

  • 0

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

Share this post


Link to post
Share on other sites



  • 0

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

Share this post


Link to post
Share on other sites
  • 0

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

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

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

Share this post


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

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

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 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;
	}

 

Share this post


Link to post
Share on other sites
  • 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;
	}


 

Share this post


Link to post
Share on other sites
  • 0
16.09.2024 в 20:31, Troy1 сказал:

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

 

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

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

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

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

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

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

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.