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

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

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

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

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

Крафт с учетом ингридиентов

Всем привет. Уже несколько дней вчитываюсь в форумы и не могу найти ответ на свой вопрос.

Представим крафт колбасы, где нужно кишки соединить с мясом. По самому принципу крафта вопрос только один. Как получить количество колбасы на основе количества мяса? 

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

Второй момент, как принудить игру к использованию только сырого или только жаренного продукта, возможно ли это сделать на уровне

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

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


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

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

  • 0

Попробуйте изучить функцию в том же классе:

void SpawnItems(ItemBase ingredients[], PlayerBase player, array<ItemBase> spawned_objects/*out*/)
	{
		//vector item_position = player.GetPosition() + ( player.GetDirection() * 1 );
		Debug.Log("SpawnItems called","recipes");
		spawned_objects.Clear();//just to make sure
		EntityAI object = NULL;
		
		for(int i = 0; i < m_NumberOfResults; i++)
		{
			string item_to_spawn = m_ItemsToCreate[i];
			
			if( m_ResultInheritsColor[i] != -1 )
			{
				ItemBase item = ingredients[m_ResultInheritsColor[i]];
				string class_name = item.GetType();
				string color = item.ConfigGetString("color");
				string new_class_name = m_ItemsToCreate[i] + color;
				item_to_spawn = new_class_name;
			}
			
			if( m_ResultToInventory[i] == -1 ) 
			{
				Debug.Log("  = "+m_ResultToInventory[i].ToString(),"recipes");
				/*
				InventoryLocation inv_loc = new InventoryLocation;
				if (player.GetInventory().FindFirstFreeLocationForNewEntity(item_to_spawn, FindInventoryLocationType.ANY, inv_loc))
				{
					object = SpawnItemOnLocation(item_to_spawn, inv_loc, false);
				}
				*/
				object = player.GetInventory().CreateInInventory(item_to_spawn);
			}
			else if (m_ResultToInventory[i] >= 0)
			{
				/*
				object = player.SpawnEntityOnGroundOnCursorDir(item_to_spawn, 0.5);

				ItemBase item_swap_with = ingredients[m_ResultToInventory[i]];
				player.SwapEntities(true, item_swap_with, EntityAI.Cast(object));
				*/
			}
			else if ( m_ResultToInventory[i] == -2 )
			{
				object = player.GetInventory().CreateEntityInCargo(item_to_spawn);
			}
			if( !object )
			{
				//spawning in inventory failed, spawning on the ground instead.....
				object = player.SpawnEntityOnGroundOnCursorDir(item_to_spawn, 0.5);
				if( !object)
				{
					Error("failed to spawn entity "+item_to_spawn+" , make sure the classname exists and item can be spawned");
				}
			}
			spawned_objects.Insert(ItemBase.Cast(object));
			Debug.Log("spawning item "+item_to_spawn,"recipes");
		}

	}

и прицепиться к ней. В переменной-массиве spawned_objects объекты класса ItemBase записываются, которые спавнятся как результат рецепта, насколько я понял. Как вариант поиграться с ними и дописать quanity нужное (образец вызова в init у вас есть)

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


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

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


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

@OskarDallas в коде ниже у меня просто соединение двух одинаковых классов, по сути это тоже крафт из двух ингридиентов с случайным quantity в результате которого получаем quantity равный сумме quantity обоих ингридиентов. Думаю догадаетесь как переделать, как нужно именно вам)

class MergeBandageDressing extends RecipeBase
{
    override void Init()
    {
        m_Name = "Merge Bandage Dressing";
        m_IsInstaRecipe = false;//should this recipe be performed instantly without animation
        m_AnimationLength = 0.25;//animation length in relative time units
        m_Specialty = 0.02;// value > 0 for roughness, value < 0 for precision

        //conditions
        m_MinDamageIngredient[0] = -1;//-1 = disable check
        m_MaxDamageIngredient[0] = 3;//-1 = disable check

        m_MinQuantityIngredient[0] = 1;//-1 = disable check
        m_MaxQuantityIngredient[0] = -1;//-1 = disable check

        m_MinDamageIngredient[1] = -1;//-1 = disable check
        m_MaxDamageIngredient[1] = 3;//-1 = disable check

        m_MinQuantityIngredient[1] = 1;//-1 = disable check
        m_MaxQuantityIngredient[1] = -1;//-1 = disable check
        //----------------------------------------------------------------------------------------------------------------------

        //INGREDIENTS
        //ingredient 1
        InsertIngredient(0,"BandageDressing");//you can insert multiple ingredients this way

        m_IngredientAddHealth[0] = 0;// 0 = do nothing
        m_IngredientSetHealth[0] = -1; // -1 = do nothing
        m_IngredientAddQuantity[0] = 0;// 0 = do nothing
        m_IngredientDestroy[0] = false;//true = destroy, false = do nothing
        m_IngredientUseSoftSkills[0] = false;// set 'true' to allow modification of the values by softskills on this ingredient

        //ingredient 2
        InsertIngredient(1,"BandageDressing");//you can insert multiple ingredients this way

        m_IngredientAddHealth[1] = 0;// 0 = do nothing
        m_IngredientSetHealth[1] = -1; // -1 = do nothing
        m_IngredientAddQuantity[1] = -1;// 0 = do nothing
        m_IngredientDestroy[1] = false;// false = do nothing
        m_IngredientUseSoftSkills[1] = false;// set 'true' to allow modification of the values by softskills on this ingredient
        //----------------------------------------------------------------------------------------------------------------------

        //result1

        m_ResultSetFullQuantity[0] = false;//true = set full quantity, false = do nothing
        m_ResultSetQuantity[0] = -1;//-1 = do nothing
        m_ResultSetHealth[0] = -1;//-1 = do nothing
        m_ResultInheritsHealth[0] = -2;// (value) == -1 means do nothing; a (value) >= 0 means this result will inherit health from ingredient number (value);(value) == -2 means this result will inherit health from all ingredients averaged(result_health = combined_health_of_ingredients / number_of_ingredients)
        m_ResultInheritsColor[0] = -1;// (value) == -1 means do nothing; a (value) >= 0 means this result classname will be a composite of the name provided in AddResult method and config value "color" of ingredient (value)
        m_ResultToInventory[0] = -2;//(value) == -2 spawn result on the ground;(value) == -1 place anywhere in the players inventory, (value) >= 0 means switch position with ingredient number(value)
        m_ResultUseSoftSkills[0] = false;// set 'true' to allow modification of the values by softskills on this result
        m_ResultReplacesIngredient[0] = -1;// value == -1 means do nothing; a value >= 0 means this result will transfer item propertiesvariables, attachments etc.. from an ingredient value
    }

    override bool CanDo(ItemBase ingredients[], PlayerBase player)//final check for recipe's validity
    {
        ItemBase ingredient1 = ItemBase.Cast(ingredients[0]);
        ItemBase ingredient2 = ItemBase.Cast(ingredients[1]);
        if (ingredient1.IsRuined() || ingredient2.IsRuined())
            return false;
        return true;
    }

    override void Do(ItemBase ingredients[], PlayerBase player,array<ItemBase> results, float specialty_weight)//gets called upon recipe's completion
    {
        // ItemBase result;
        ItemBase ingredient1 = ItemBase.Cast(ingredients[0]);
        ItemBase ingredient2 = ItemBase.Cast(ingredients[1]);
        int iq1 = ingredient1.GetQuantity();
        int iq2 = ingredient2.GetQuantity();
        int qm  = ingredient1.GetQuantityMax();
        int delta = qm-iq2;
        if ( iq1>delta )
        {
            ingredient1.SetQuantity((iq1-delta));
            ingredient2.SetQuantity((iq2+delta));
        }
        else if (iq1<delta)
        {
            ingredient1.SetQuantity(0);
            ingredient2.SetQuantity(iq2+iq1);
        }

        // vector pos = player.GetPosition();
        // result = GetGame().CreateObject("Matchbox", pos);


        Debug.Log("Recipe Do method called","recipes");
    }
};

 

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


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

Подскажите, что не так написано, из-за чего ошибка? 

override void Do(ItemBase ingredients[], PlayerBase player,array<ItemBase> results, float specialty_weight)//gets called upon recipe's completion
    {
        // ItemBase result;
        ItemBase ingredient1 = ItemBase.Cast(ingredients[0]);
        ItemBase ingredient2 = ItemBase.Cast(ingredients[1]);
        int iq1 = ingredient1.GetQuantity();
        int iq2 = ingredient2.GetQuantity();
        
        result = GetGame().CreateObject("FP4_Kolbasa", pos);
        result.SetQuantity(iq1+iq2);

        Debug.Log("Recipe Do method called","recipes");
    }

Screenshot_2.png.00c01432d1e31479c13ca2f08ab4c503.png

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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

Поддержка