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
Sign in to follow this  
Михей

Использовать класс несколько раз

Вечер добрый, друзья 🙂
Подскажите пожалуйста, может кто-то сталкивался?!
У меня в конфиге есть класс "Resources", содержит в себе:

class Resources
		{
			class AM_1_AmmoBox_545x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
			class AM_2_AmmoBox_545x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
};

Суть в том, что нельзя использовать один и тот же класс, к примеру я не могу 2 раза использовать "AmmoBox_545x39_20Rnd", приходится всячески изворачиваться создавая дублирующие классы, просто переназывая их. Можно как то по другому обойти данную систему? Или сразу задать количество
Заранее благодарю кто поможет, доброй ночи

Edited by Mixxe73 (see edit history)

Share this post


Link to post
Share on other sites

21 answers to this question

Recommended Posts

  • 0

Обновил код! Данный код позволяет выдавать вещи в ранд. количестве

modded class ActionUnpackBox
{
    override void OnFinishProgressServer( ActionData action_data )
	{
		if ( action_data.m_MainItem && action_data.m_MainItem.GetHierarchyRootPlayer() == action_data.m_Player )
		{
			string path = "CfgVehicles " + action_data.m_MainItem.GetType();
			string box = action_data.m_MainItem.GetType();
			string child_name = "";
			int count;
			float rand;
			rand = Math.RandomInt(5,10); //КОЛИЧЕСТВО ВЫДОВАЕМЫХ ПАТРОН(ОТ 5 ДО 10)
			array<string> resources = new array<string>;
			
			if( GetGame().ConfigIsExisting( path ) && GetGame().ConfigIsExisting( path + " Resources") )
			{
				path = path + " Resources";
				count = GetGame().ConfigGetChildrenCount ( path );
				for (int i = 0; i < count; i++)
				{
					GetGame().ConfigGetChildName ( path, i, child_name );
					
					if ( GetGame().ConfigGetInt( path + " " + child_name + " value" ) )
					{
						resources.Insert( child_name );
					}
				}
                //GetGame().ObjectDelete(action_data.m_Player.GetItemInHands());
				//TODO modify to allow for multiple ammo types spawning (if needed??)
				string itemType = resources.Get(0);
				int itemCount = GetGame().ConfigGetInt( path + " " + itemType + " value" );
				
				UnboxLambda lambda = new UnboxLambda(action_data.m_MainItem, itemType, action_data.m_Player, itemCount);
				action_data.m_Player.ServerReplaceItemInHandsWithNew(lambda);

                for (int j=1;j<resources.Count();j++)
                {
                    itemType = resources.Get(j);
                    itemCount = GetGame().ConfigGetInt( path + " " + itemType + " value" );
					
									ItemBase itm2 = ItemBase.Cast(GetGame().CreateObject(itemType,action_data.m_Player.GetPosition(),false));
									if (itemCount)
									itm2.SetQuantity(itemCount);
                }
				if (box.IndexOf("SU_AmmoBox") > -1)
								{
									for (int y = 0; y < rand; y++)
										{
											ItemBase itm = ItemBase.Cast(GetGame().CreateObject(itemType,action_data.m_Player.GetPosition(),false));
											if (itemCount)
											itm.SetQuantity(itemCount);
										}
										ItemBase itemsukapadla = ItemBase.Cast( GetGame().CreateObject("SU_Zinc", action_data.m_Player.GetPosition(), false) );
								}
								else
								{
								//spawns wrapping Paper
									ItemBase paper = ItemBase.Cast( GetGame().CreateObject("Paper", action_data.m_Player.GetPosition(), false) );	
								}
				
				action_data.m_Player.GetSoftSkillsManager().AddSpecialty( m_SpecialtyWeight );
			}
		}
	}
}

 

Share this post


Link to post
Share on other sites



  • 0

Впоподробней плиз - как делаешь что делаешь как ругается итд итп

с примерами и тп

а то нихрена не понятно

Share this post


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

Впоподробней плиз - как делаешь что делаешь как ругается итд итп

с примерами и тп

а то нихрена не понятно

Делаю так:

class AmmoBox_545x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
class AmmoBox_545x39_20Rnd
			{
				value=330;
				variable="quantity";
			};

Вывод - Никак не ругается, но выдается всего в количестве 1, хоть и 2 класса(1 Класс = 1 предмет)

Share this post


Link to post
Share on other sites
  • 0

Понятно что так не выйдет

Да и непонятно, для чего это нужно

Что хочешь в итоге?

Share this post


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

Понятно что так не выйдет

Да и непонятно, для чего это нужно

Что хочешь в итоге?

Что бы выдало 10-20 пачек патронов

Share this post


Link to post
Share on other sites
  • 0

Использовать один и тот же класс нельзя, это запрещено игровым ограничение движка игры и скриптами.
А вот использовать другой класс но с другим именем можно, игра ничего не скажет в итоге.
То что ты делаешь  сделать из одной и той же пачки патронов 5,45 чтобы выпало 2 раза по 330 патронов ни к чему не приведет, только к логической ошибки.

Задать количество выпадаемых патронов сразу можно и просто.
class AmmoBox_545x39_20Rnd : Box_Base {

class Resources {
            class Ammo_545x39 {
                value = 330;
                variable = "quantity";
            };
        };

};

Edited by AKuznecov (see edit history)

Share this post


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

Использовать один и тот же класс нельзя, это запрещено игровым ограничение движка игры и скриптами.
А вот использовать другой класс но с другим именем можно, игра ничего не скажет в итоге.
То что ты делаешь  сделать из одной и той же пачки патронов 5,45 чтобы выпало 2 раза по 330 патронов ни к чему не приведет, только к логической ошибки.

Задать количество выпадаемых патронов сразу можно и просто.
class AmmoBox_545x39_20Rnd : Box_Base {

class Resources {
            class Ammo_545x39 {
                value = 330;
                variable = "quantity";
            };
        };

};

Значение value - это не количество!

Вы не правильно поняли тему

Share this post


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

То что ты делаешь  сделать из одной и той же пачки патронов 5,45 чтобы выпало 2 раза по 330 патронов ни к чему не приведет, только к логической ошибки.

 

7 часов назад, Mixxe73 сказал:

 

class AmmoBox_545x39_20Rnd { value=330; variable="quantity"; }; class AmmoBox_545x39_20Rnd { value=330; variable="quantity"; };

Вывод - Никак не ругается, но выдается всего в количестве 1, хоть и 2 класса(1 Класс = 1 предмет)

 

-----------НЕМНОГО ПОЯСНЮ-----------

1.Что бы сделать выдачу 10 пачек, мне приходится делать такие же классы с другим названием

Вот как это выглядит

class SU_AmmoBox_762x39_200Rnd: Box_Base
	{
		scope=2;
		displayName="ТЕСТ";
		descriptionShort="ТЕСТ";
		model="\dz\gear\containers\300RoundBox.p3d";
		weight=3100;
		absorbency=0.80000001;
		itemSize[]={6,4};
		class Resources
		{
			class AmmoBox_762x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
			class AM_2_AmmoBox_762x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
			class AM_3_AmmoBox_762x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
			class AM_4_AmmoBox_762x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
			class AM_5_AmmoBox_762x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
			class AM_6_AmmoBox_762x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
			class AM_7_AmmoBox_762x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
			class AM_8_AmmoBox_762x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
			class AM_9_AmmoBox_762x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
			class AM_10_AmmoBox_762x39_20Rnd
			{
				value=330;
				variable="quantity";
			};
		};
		class AnimEvents
		{
			class SoundWeapon
			{
				class interact
				{
					soundset="ammoboxUnpack_SoundSet";
					id=70;
				};
			};
		};
	};
	class AM_2_AmmoBox_762x39_20Rnd: AmmoBox_762x39_20Rnd
	{
		scope=2;
	};
	class AM_3_AmmoBox_762x39_20Rnd: AmmoBox_762x39_20Rnd
	{
		scope=2;
	};
	class AM_4_AmmoBox_762x39_20Rnd: AmmoBox_762x39_20Rnd
	{
		scope=2;
	};
	class AM_5_AmmoBox_762x39_20Rnd: AmmoBox_762x39_20Rnd
	{
		scope=2;
	};
	class AM_6_AmmoBox_762x39_20Rnd: AmmoBox_762x39_20Rnd
	{
		scope=2;
	};
	class AM_7_AmmoBox_762x39_20Rnd: AmmoBox_762x39_20Rnd
	{
		scope=2;
	};
	class AM_8_AmmoBox_762x39_20Rnd: AmmoBox_762x39_20Rnd
	{
		scope=2;
		
	};
	class AM_9_AmmoBox_762x39_20Rnd: AmmoBox_762x39_20Rnd
	{
		scope=2;
		
	};
	class AM_10_AmmoBox_762x39_20Rnd: AmmoBox_762x39_20Rnd
	{
		scope=2;
		
	};

 

Edited by Mixxe73 (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Если пороетесть в оригинальных конфигах игры, то сделаете маленькое открытие. Суть существования некой конфигурации есть в том, что бы объявить игре о том что вы создаёте некую сущность, в данном случае контейнер который содержит нечто, в неком кол-ве. Движок не бабушка Ванга, что бы угадывать ваши желания, ему нужны конкретные и корректные данные. Если вы создаёте бокс на 200 патронов, то и нужно создать бокс в конфиге на 200 патронов, если нужен ещё и на 100 патронов, то естественно придётся создавать ещё один конфигурационный класс определяющий бокс на 100 патронов, и его имя естественно должно иметь отличие. И это не какие то там ограничения движка, а вполне адекватное требование, в противном случае как вы себе представляете выбор движком чего то из двух под одним и тем же именем, так не бывает.

Edited by SteelRat (see edit history)

Share this post


Link to post
Share on other sites
  • 0

PS

Вообще то что вы хотите, обычно, реализуется из скриптовой части, спавните пустой бокс, и кидаете в него всего что нужно и в требуемом кол-ве.

Share this post


Link to post
Share on other sites
  • 0

PS 2

А вообще если я правильно понял замысел автора данного топика, то реализуется желаемое подобным образом.

 

class CfgMagazines
{
	class Magazine_Base;
	class Ammunition_Base : Magazine_Base {};
	class Ammo_556x45 : Ammunition_Base {};
	
	class Ammo_556x45_2000Rnd : Ammo_556x45
	{
		displayName = "Стак патронов 556x45";
		weight = 40; // здесь я не понял самих разработчиков, распакованный стак патронов весит не соизмеримо меньше чем упакованный, что они имели этим сказать, моя не понимает)
		count = 2000;
	};
};

class CfgVehicles
{
	class Box_Base;
	class AmmoBox_556x45_20Rnd : Box_Base {};
	
	class AmmoBox_556x45_2000Rnd : AmmoBox_556x45_20Rnd
	{
		displayName = "Коробка патронов 556x45 2000шт";
		weight = 850;
		
		class Resources
		{
			class Ammo_556x45_2000Rnd
			{
				value = 2000;
				variable = "quantity";
			};
		};
	};
};

 

Share this post


Link to post
Share on other sites
  • 0

PS 3

Ну и на десерт.

И это чисто моё мнение.

Я бы в данном случае прошёл бы более правильным и профитным путём, то есть, модифицировал бы сам экшен распаковки боксов, на предмет добавить в код учёт параметра в классе Resources указывающего не только кол-во патронов в стаке, а так же и кол-во самих стаков после распаковки, о чём собственно и говорит коментарий разработчиков в самом коде экшена.

 

 

 

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

Edited by SteelRat (see edit history)

Share this post


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

PS 2

А вообще если я правильно понял замысел автора данного топика, то реализуется желаемое подобным образом.

 

class CfgMagazines { class Magazine_Base; class Ammunition_Base : Magazine_Base {}; class Ammo_556x45 : Ammunition_Base {}; class Ammo_556x45_2000Rnd : Ammo_556x45 { displayName = "Стак патронов 556x45"; weight = 40; // здесь я не понял самих разработчиков, распакованный стак патронов весит не соизмеримо меньше чем упакованный, что они имели этим сказать, моя не понимает) count = 2000; }; }; class CfgVehicles { class Box_Base; class AmmoBox_556x45_20Rnd : Box_Base {}; class AmmoBox_556x45_2000Rnd : AmmoBox_556x45_20Rnd { displayName = "Коробка патронов 556x45 2000шт"; weight = 850; class Resources { class Ammo_556x45_2000Rnd { value = 2000; variable = "quantity"; }; }; }; };


class CfgMagazines
{
	class Magazine_Base;
	class Ammunition_Base : Magazine_Base {};
	class Ammo_556x45 : Ammunition_Base {};
	
	class Ammo_556x45_2000Rnd : Ammo_556x45
	{
		displayName = "Стак патронов 556x45";
		weight = 40; // здесь я не понял самих разработчиков, распакованный стак патронов весит не соизмеримо меньше чем упакованный, что они имели этим сказать, моя не понимает)
		count = 2000;
	};
};

class CfgVehicles
{
	class Box_Base;
	class AmmoBox_556x45_20Rnd : Box_Base {};
	
	class AmmoBox_556x45_2000Rnd : AmmoBox_556x45_20Rnd
	{
		displayName = "Коробка патронов 556x45 2000шт";
		weight = 850;
		
		class Resources
		{
			class Ammo_556x45_2000Rnd
			{
				value = 2000;
				variable = "quantity";
			};
		};
	};
};

 

Мне нужно не патроны а именно пачки патронов, а с ними такое не прокатит

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


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

Мне нужно не патроны а именно пачки патронов, а с ними такое не прокатит

это надо делать в скрипте

 

я, честно говоря нихрена не понял что Вы хотите

 

давайте в форме алгоритма распишем желаемое

 

есть то-то
делаем то-то

получаем то-то

 

 

Edited by BorizzK (see edit history)

Share this post


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

это надо делать в скрипте

 

я, честно говоря нихрена не понял что Вы хотите

 

давайте в форме алгоритма распишем желаемое

 

есть то-то
делаем то-то

получаем то-то

 

 

Я так и сделал

Share this post


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

ТЕМА ЗАКРЫТА! РЕШЕНИЕ ЕСТЬ!

Решение публиковать будем?

Share this post


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

Решение публиковать будем?

modded class ActionUnpackBox
{
    override void OnFinishProgressServer( ActionData action_data )
	{
		if ( action_data.m_MainItem && action_data.m_MainItem.GetHierarchyRootPlayer() == action_data.m_Player )
		{
			string path = "CfgVehicles " + action_data.m_MainItem.GetType();
			string box = action_data.m_MainItem.GetType();
			string child_name = "";
			int count;
			array<string> resources = new array<string>;
			
			if( GetGame().ConfigIsExisting( path ) && GetGame().ConfigIsExisting( path + " Resources") )
			{
				path = path + " Resources";
				count = GetGame().ConfigGetChildrenCount ( path );
				for (int i = 0; i < count; i++)
				{
					GetGame().ConfigGetChildName ( path, i, child_name );
					
					if ( GetGame().ConfigGetInt( path + " " + child_name + " value" ) )
					{
						resources.Insert( child_name );
					}
				}
                //GetGame().ObjectDelete(action_data.m_Player.GetItemInHands());
				//TODO modify to allow for multiple ammo types spawning (if needed??)
				string itemType = resources.Get(0);
				int itemCount = GetGame().ConfigGetInt( path + " " + itemType + " value" );
				
				UnboxLambda lambda = new UnboxLambda(action_data.m_MainItem, itemType, action_data.m_Player, itemCount);
				action_data.m_Player.ServerReplaceItemInHandsWithNew(lambda);

				//string message = itemType;
				//SendGlobalChatMessage(box);	
				//COTCreateLocalAdminNotification( new StringLocaliser( message ) );
                for (int j=1;j<resources.Count();j++)
                {
                    itemType = resources.Get(j);
					//SendGlobalChatMessage(itemType);	
					//COTCreateLocalAdminNotification( new StringLocaliser( itemType ) );
                    itemCount = GetGame().ConfigGetInt( path + " " + itemType + " value" );
					
							//	else
							//	{
									ItemBase itm2 = ItemBase.Cast(GetGame().CreateObject(itemType,action_data.m_Player.GetPosition(),false));
									if (itemCount)
									itm2.SetQuantity(itemCount);
									//spawns wrapping Paper
									//ItemBase paper = ItemBase.Cast( GetGame().CreateObject("Paper", action_data.m_Player.GetPosition(), false) );
							//	}
                }
				if (box.IndexOf("SU_AmmoBox") > -1)
								{
									for (int y = 0; y < 10; y++)
										{
											ItemBase itm = ItemBase.Cast(GetGame().CreateObject(itemType,action_data.m_Player.GetPosition(),false));
											if (itemCount)
											itm.SetQuantity(itemCount);
										}
										ItemBase itemsukapadla = ItemBase.Cast( GetGame().CreateObject("AmmoBox", action_data.m_Player.GetPosition(), false) );
								}
								else
								{
								//spawns wrapping Paper
									ItemBase paper = ItemBase.Cast( GetGame().CreateObject("Paper", action_data.m_Player.GetPosition(), false) );	
								}
				
				action_data.m_Player.GetSoftSkillsManager().AddSpecialty( m_SpecialtyWeight );
			}
		}
	}
}

 

Share this post


Link to post
Share on other sites
  • 0

Ну вот

Что и требовалось доказать

Share this post


Link to post
Share on other sites
  • 0

Стоило, на будущее, не привязывать конкретное число в самом скрипте, а всё таки вывести параметр указывающий сколько стаков должно распаковаться в конфиг бокса. А в скрипте описывающим экшен получать этот параметр и делать соответствующее число итераций.

Это даст на выходе модифицированный вариант экшена, который сможет работать уже с любым боксом чего либо, всё что нужно будет сделать это указать возвращаемое кол-во стаков.

Универсально одним словом.

Edited by SteelRat (see edit history)

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
Sign in to follow this  

×
×
  • 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.