예제 #1
0
        /// <summary>
        /// Обработчик события использования оружия (Для обновления UI)
        /// </summary>
        /// <param name="weaponType">Тип использованного оружия</param>
        /// <param name="durabilityProgress">Текущий прогресс до поломки</param>
        void UseWeaponHandler(DataTableItems.ItemTypes weaponType, float durabilityProgress)
        {
            Debug.Log("WeaponManager: USE WEAPON: " + weaponType + ". Durability: " + durabilityProgress);

            //Найти слот и обновить прогресс
            GameManager.Instance.Manager_UI.WeaponSlotController.UpdateItemProgress(weaponType, durabilityProgress);
        }
예제 #2
0
        /// <summary>
        /// Обработчик поломки используемого оружия (Для обновления UI)
        /// </summary>
        /// <param name="weaponType">Тип использованного оружия</param>
        void BrokeWeaponHandler(DataTableItems.ItemTypes weaponType)
        {
            Debug.LogWarning("WeaponManager: BROKE WEAPON: " + weaponType +
                             ". Total Amount: " + DataManager.Instance.PlayerAccount.Inventory.GetItemAmount(weaponType) +
                             ". Amount in Bag: " + DataManager.Instance.PlayerAccount.Inventory.BagsState.GetItemAmountInBag(weaponType));

            //Переключить на оружие по умолчанию
            if (!DataManager.Instance.PlayerAccount.Inventory.BagsState.HasItemInBag(weaponType))
            {
                //Найти слот с оружием, которое использовалось
                for (int i = 0; i < DataManager.Instance.PlayerAccount.Inventory.SelectedWeapon.Count; i++)
                {
                    //Заменить оружие в слоте на оружие по-умолчанию
                    if (DataManager.Instance.PlayerAccount.Inventory.SelectedWeapon[i].Equals(weaponType))
                    {
                        DataManager.Instance.PlayerAccount.Inventory.SelectedWeapon[i] = account.Account.AccountInventory.DEFAULT_ITEM;

                        //Найти UI слот и обновить оружие
                        GameManager.Instance.Manager_UI.WeaponSlotController.UpdateItemsState(DataManager.Instance.PlayerAccount.Inventory.SelectedWeapon.ToArray());
                    }
                }
            }
            else
            {
                //Найти UI слот и обновить количество предметов
                int amount = DataManager.Instance.PlayerAccount.Inventory.BagsState.GetItemAmountInBag(weaponType);
                GameManager.Instance.Manager_UI.WeaponSlotController.UpdateItemAmount(weaponType, amount);

                //Найти UI слот и обновить прочность
                float progress = DataManager.Instance.PlayerAccount.Inventory.WeaponState.GetDurabilityProgress(weaponType);
                GameManager.Instance.Manager_UI.WeaponSlotController.UpdateItemProgress(weaponType, progress);
            }
        }
예제 #3
0
 /// <summary>
 /// Задать прогресс тику автодобывания
 /// </summary>
 void SetAutoCraftTickProgress(DataTableItems.ItemTypes type, float progress)
 {
     if (m_Items.ContainsKey(type))
     {
         m_Items[type].SetAutoCraftProgress(progress);
     }
 }
예제 #4
0
        /// <summary>
        /// Вывести информацию о предмете
        /// </summary>
        /// <param name="type">Тип предмета</param>
        /// <param name="amount">Количество предмета</param>
        /// <param name="progress">Прогресс предмета</param>
        public void SetItem(DataTableItems.ItemTypes type, int amount, float progress, int bagSize)
        {
            Image_Icon.sprite = GameManager.Instance.AssetsLibrary.GetSprite_Item(type);

            if (type == DataTableItems.ItemTypes.Max)
            {
                Text_ItemName.text = string.Empty;
                SetAmount(0);
                SetSlotProgress(0);

                SelAlphaToImage(Image_Icon, 0.5f);
                return;
            }

            Text_ItemName.text = type.ToString();
            Type = type;

            CacheBagSize(bagSize);
            SetAmount(amount);
            SetSlotProgress(progress);

            if (Image_Icon.color.a < 0.9f)
            {
                SelAlphaToImage(Image_Icon, 1f);
            }
        }
예제 #5
0
        void UpdatePopulationItems()
        {
            if (m_PopulationUIIems == null)
            {
                m_PopulationUIIems = new Dictionary <DataTableItems.ItemTypes, UIElement_PopulationProgressItem>();
            }

            //Пройтись по всему доступному населению
            DataTableItems.ItemTypes[] population = DataManager.Instance.PlayerAccount.Inventory.GetItemsByFilterType(DataTableItems.ItemFilterTypes.Population);
            for (int i = 0; i < population.Length; i++)
            {
                DataTableItems.ItemTypes itemType = population[i];

                //Если такого типа населения еще нет - создать
                if (!m_PopulationUIIems.ContainsKey(population[i]))
                {
                    UIElement_PopulationProgressItem item = Instantiate(GameManager.Instance.Manager_UI.WindowsManager.UIElement_PopulationProgressItemPrefab, ProgressParent);
                    item.Init(population[i],
                              GameManager.Instance.Manager_Battle.PopulationManager.GetProgressForPopulation(population[i]),
                              GameManager.Instance.Manager_Battle.PopulationManager.GetMultiplayerForPopulation(population[i]));

                    m_PopulationUIIems.Add(population[i], item);
                }
                else //Если такой тип населения есть - обновить данные
                {
                    //Вывести текущий множитель скорости
                    m_PopulationUIIems[itemType].SetMultiplayer(GameManager.Instance.Manager_Battle.PopulationManager.GetMultiplayerForPopulation(itemType));

                    //Обновить состояние потребляемых ресурсов
                    m_PopulationUIIems[itemType].UpdateAbsorbedResourceItems();
                }
            }
        }
예제 #6
0
 void PopulationProgressChangedHandler(DataTableItems.ItemTypes itemType, float progress)
 {
     if (m_PopulationUIIems.ContainsKey(itemType))
     {
         m_PopulationUIIems[itemType].SetProgress(progress);
     }
 }
예제 #7
0
 /// <summary>
 /// Проигрыать анимацию ошибки автодобывания
 /// </summary>
 void PlayAutoCraftAnimation_Error(DataTableItems.ItemTypes type)
 {
     if (m_Items.ContainsKey(type))
     {
         m_Items[type].Toggle_AutoCraft.PlayErrorAnimation();
     }
 }
예제 #8
0
 /// <summary>
 /// Изменить состояние Toggle автодобывания
 /// </summary>
 void SetValueAutoCraftToggle(DataTableItems.ItemTypes type, bool isToggled)
 {
     if (m_Items.ContainsKey(type))
     {
         m_Items[type].Toggle_AutoCraft.SetValue(isToggled);
     }
 }
예제 #9
0
        void ItemCrafted_Handler(DataTableItems.ItemTypes type)
        {
            //Отнять предметы, необходимые для создания
            DataTableItems.Item itemData  = DataTableItems.GetItemDataByType(type);
            bool hasIgnorableItemsOnCraft = DataTableItems.HasIgnorableItemsOnCraft(type);

            for (int i = 0; i < itemData.RequiredItems.Length; i++)
            {
                if ((hasIgnorableItemsOnCraft && !DataTableItems.ItemShouldBeIgnoredForType(type, itemData.RequiredItems[i].Type)) || !hasIgnorableItemsOnCraft)
                {
                    //Удалить предмет из инвентаря (предмет, который необходим для создания другого предмета)
                    DataManager.Instance.PlayerAccount.Inventory.RemoveItem(itemData.RequiredItems[i].Type, itemData.RequiredItems[i].Amount);

                    //Обновить количество предметов в сумке
                    DataManager.Instance.PlayerAccount.Inventory.BagsState.UpdateItemAmountInBag(itemData.RequiredItems[i].Type);
                }
            }

            //Добавить созданный предмет
            DataManager.Instance.PlayerAccount.Inventory.AddItem(type);

            //Обновить состояние сумки если такой же предмет находился в сумке
            if (DataManager.Instance.PlayerAccount.Inventory.BagsState.HasItemInBag(type))
            {
                DataManager.Instance.PlayerAccount.Inventory.BagsState.AddItemToBag(type);
            }
        }
예제 #10
0
        /// <summary>
        /// Добавить предмет в слот
        /// </summary>
        /// <param name="index">Индекс слота</param>
        /// <param name="itemType">Тип предмета</param>
        public void AddItem(int index, DataTableItems.ItemTypes itemType)
        {
            try
            {
                //Если пытаемся добавить предмет, а такой же есть в другом слоте - убираем его с занятого слота
                for (int i = 0; i < GetTargetItemList().Count; i++)
                {
                    if (i != index && GetTargetItemList()[i].Equals(itemType))
                    {
                        GetTargetItemList()[i] = GetDefaultItem();
                        DataManager.Instance.PlayerAccount.Inventory.BagsState.RemoveItemFromBag(GetTargetItemList()[i], true);
                    }
                }

                //Изменить список выбранных предметов
                GetTargetItemList()[index] = itemType;

                //Добавить предмет в сумку
                DataManager.Instance.PlayerAccount.Inventory.BagsState.AddItemToBag(itemType);

                //Вызвать событие изменения списка
                OnAddItem?.Invoke(GetTargetItemList().ToArray());
            }
            catch (System.Exception e)
            {
                Debug.LogError("Exeption: " + e.Message);
            }
        }
        public void Init(DataTableItems.ItemTypes type, int amount)
        {
            Type   = type;
            Amount = amount;

            ShowAmountText(amount);
            UpdateState();
        }
예제 #12
0
        public void Init(DataTableItems.ItemTypes type, int index, int amount, float progress, int bagSize)
        {
            Index = index;

            SetItem(type, amount, progress, bagSize);

            base.Init();
        }
예제 #13
0
 /// <summary>
 /// Обработчик события добавления тиков предмету
 /// </summary>
 /// <param name="type">Тип предмета, которому были добавлены тики</param>
 /// <param name="progress">Текущий прогресс крафта</param>
 protected virtual void TickToItemAdded_Handler(DataTableItems.ItemTypes type, float progress)
 {
     //Обновить состояние предмета с учетом нового прогресса
     if (m_Items.ContainsKey(type))
     {
         m_Items[type].UpdateProgress(progress);
     }
 }
예제 #14
0
        /// <summary>
        /// Получить текущий множитель для населения
        /// </summary>
        public float GetMultiplayerForPopulation(DataTableItems.ItemTypes itemType)
        {
            if (m_PopulationPeriod.ContainsKey(itemType))
            {
                return(m_PopulationPeriod[itemType].Multiplayer);
            }

            return(0);
        }
예제 #15
0
        /// <summary>
        /// Получить текущий прогресс для типа населения (На старте окна)
        /// </summary>
        public float GetProgressForPopulation(DataTableItems.ItemTypes itemType)
        {
            if (m_PopulationPeriod.ContainsKey(itemType))
            {
                return(m_PopulationPeriod[itemType].Progress);
            }

            return(0);
        }
예제 #16
0
        /// <summary>
        /// Добавить слот
        /// </summary>
        public void AddSlot(DataTableItems.ItemTypes type)
        {
            CreateSlot(type, ItemSlots.Count, m_AllowClickable);

            if (m_SelectedSlotIndex >= 0)
            {
                StartCoroutine(WaitFrameToSelectItem(m_SelectedSlotIndex));
            }
        }
예제 #17
0
        void PointerDown_Handler(PointerEventData eventData, DataTableItems.ItemTypes type)
        {
            if (m_ItemDragIcon == null)
            {
                m_ItemDragIcon = Instantiate(GameManager.Instance.AssetsLibrary.ItemDragIconPrefab, transform);
                m_ItemDragIcon.Init(type);
            }

            m_ItemDragIcon.transform.position = eventData.position;
        }
예제 #18
0
        protected override void ItemCrafted_Handler(DataTableItems.ItemTypes craftedItemType)
        {
            base.ItemCrafted_Handler(craftedItemType);

            //Обновить UI количества оружия
            m_SlotsController.UpdateItemsState(DataManager.Instance.PlayerAccount.Inventory.SelectedFood.ToArray());

            //Обновить UI количества еды
            GameManager.Instance.Manager_UI.FoodSlotController.UpdateItemsState(DataManager.Instance.PlayerAccount.Inventory.SelectedFood.ToArray());
        }
예제 #19
0
        void RemoveAbsorbedItems(DataTableItems.Item itemData, DataTableItems.ItemTypes itemType)
        {
            for (int i = 0; i < itemData.RequiredItems.Length; i++)
            {
                DataManager.Instance.PlayerAccount.Inventory.RemoveItem(itemData.RequiredItems[i].Type,
                                                                        itemData.RequiredItems[i].Amount * DataManager.Instance.PlayerAccount.Inventory.GetItemAmount(itemType));
            }

            OnPeriodChangedItemsAmount?.Invoke();
        }
예제 #20
0
 /// <summary>
 /// Обновить прогресс указанного типа предмета
 /// </summary>
 /// <param name="type">Тип</param>
 /// <param name="progress">Прогресс</param>
 public void UpdateItemProgress(DataTableItems.ItemTypes type, float progress)
 {
     for (int i = 0; i < ItemSlots.Count; i++)
     {
         if (ItemSlots[i].Type.Equals(type))
         {
             ItemSlots[i].SetSlotProgress(progress);
             break;
         }
     }
 }
예제 #21
0
 /// <summary>
 /// Обновить количество указаннонр предмета
 /// </summary>
 /// <param name="type">Тип</param>
 /// <param name="amount">Количество</param>
 public void UpdateItemAmount(DataTableItems.ItemTypes type, int amount)
 {
     for (int i = 0; i < ItemSlots.Count; i++)
     {
         if (ItemSlots[i].Type.Equals(type))
         {
             ItemSlots[i].SetAmount(amount);
             break;
         }
     }
 }
        public void Init(DataTableItems.ItemTypes itemType, float progress, float multiplayer)
        {
            m_ItemType         = itemType;
            Text_ItemName.text = itemType.ToString();

            SetProgress(progress);
            SetMultiplayer(multiplayer);

            //Список потребляемых ресурсов
            ShowAbsorbedResources();
        }
예제 #23
0
        void PopulationPerdionFinished_PopulationReduce(DataTableItems.ItemTypes itemType)
        {
            Debug.Log(itemType + " PopulationPerdionFinished_PopulationReduce");

            UpdateTabState();

            if (m_PopulationUIIems.ContainsKey(itemType))
            {
                m_PopulationUIIems[itemType].SetMultiplayer(GameManager.Instance.Manager_Battle.PopulationManager.GetMultiplayerForPopulation(itemType));
            }
        }
예제 #24
0
        /// <summary>
        /// Удалить оружие из выбранного
        /// </summary>
        /// <param name="weaponType"></param>
        void RemoveWeaponHandler(DataTableItems.ItemTypes weaponType)
        {
            for (int i = 0; i < DataManager.Instance.PlayerAccount.Inventory.SelectedWeapon.Count; i++)
            {
                if (DataManager.Instance.PlayerAccount.Inventory.SelectedWeapon[i].Equals(weaponType))
                {
                    DataManager.Instance.PlayerAccount.Inventory.SelectedWeapon[i] = account.Account.AccountInventory.DEFAULT_ITEM;
                }
            }

            OnRemoveItem?.Invoke(DataManager.Instance.PlayerAccount.Inventory.SelectedWeapon.ToArray());
        }
예제 #25
0
 /// <summary>
 /// Нажатие на UI предмета
 /// </summary>
 /// <param name="type">Тип предмета, на который было нажато</param>
 protected virtual void Item_PressHanlder(DataTableItems.ItemTypes type)
 {
     //Если можно - добавить тики определенному предметму
     if (DataManager.Instance.PlayerAccount.Inventory.CanCraftItem(type))
     {
         GameManager.Instance.CraftItemFactory.AddTickToItem(type);
     }
     else
     {
         Debug.LogError("Cant craft item");
     }
 }
예제 #26
0
        void PopulationPerdionFinished_PopulationLose(DataTableItems.ItemTypes itemType)
        {
            Debug.Log(itemType + " PopulationPerdionFinished_PopulationLose");

            UpdateTabState();

            if (m_PopulationUIIems.ContainsKey(itemType))
            {
                Destroy(m_PopulationUIIems[itemType].gameObject);
                m_PopulationUIIems.Remove(itemType);
            }
        }
예제 #27
0
        /// <summary>
        /// Использовать выбранное оружие
        /// </summary>
        /// <returns>Урон от выбранного оружия</returns>
        public override int UseItem()
        {
            //Получить тип предмета
            DataTableItems.ItemTypes selectedWeaponType = GetItemTypeByIndex(m_SelectedIndex);

            //Если оружие было использовано
            if (DataManager.Instance.PlayerAccount.Inventory.WeaponState.UseWeapon(selectedWeaponType))
            {
                return(DataTableWeapons.GetWeaponDataByType(selectedWeaponType).Damage);
            }

            return(0);
        }
예제 #28
0
        /// <summary>
        /// Добавить население
        /// </summary>
        /// <param name="itemType">Тип предмета</param>
        public void AddPopulation(DataTableItems.ItemTypes itemType)
        {
            if (!m_PopulationPeriod.ContainsKey(itemType))
            {
                //Создать менеджер периода и подписаться на события
                PeriodicManager pManager = gameObject.AddComponent <PeriodicManager>();

                //Событие изменения прогресса периода
                pManager.OnProgress += (float progress) =>
                { OnPopulationProgressChanged?.Invoke(itemType, progress); };

                //Сообытие окончания периода
                pManager.OnPeriodFinished += () =>
                {
                    PeriodResultStates periodResult = PeriodFinishedHandler(itemType);

                    //Вызов событий для результатов завершения периода
                    switch (periodResult)
                    {
                    case PeriodResultStates.Success:
                        OnPeriodFinishedWithSuccess?.Invoke(itemType);
                        break;

                    case PeriodResultStates.PopulationReduce:
                        OnPeriodFinishedWithPopulationReduce?.Invoke(itemType);
                        break;

                    case PeriodResultStates.PopulationLoose:
                        OnPeriodFinishedWithPopulationLose?.Invoke(itemType);
                        break;
                    }
                };

                pManager.Init(m_PERIOD, true, GetMultiplayer(itemType));
                pManager.StartPeriod();

                //Добавить в словарь тип населения
                m_PopulationPeriod.Add(itemType, pManager);
            }
            else //Если такой тип населения уже есть
            {
                //Если период уже останавливался - запустить
                if (m_PopulationPeriod[itemType].WasStopped)
                {
                    m_PopulationPeriod[itemType].StartPeriod();
                }

                //Изменить множитель периода
                m_PopulationPeriod[itemType].SetMultiplyer(GetMultiplayer(itemType));
            }
        }
예제 #29
0
        PeriodResultStates PeriodFinishedHandler(DataTableItems.ItemTypes itemType)
        {
            bool hasEnoughtItems = true;

            DataTableItems.Item itemData = DataTableItems.GetItemDataByType(itemType);

            //Проверить, есть ли достаточное количество предметов для следующего периода для всего населения
            for (int i = 0; i < itemData.RequiredItems.Length; i++)
            {
                if (!DataManager.Instance.PlayerAccount.Inventory.HasAmountOfItem(itemData.RequiredItems[i].Type,
                                                                                  itemData.RequiredItems[i].Amount * DataManager.Instance.PlayerAccount.Inventory.GetItemAmount(itemType)))
                {
                    hasEnoughtItems = false;
                    break;
                }
            }

            //Если есть достаточное количество предметов, необходимых для поддержания периода - отнять
            if (hasEnoughtItems)
            {
                //Снять ресурсы, которые необходимы для поддержки текущего количества населения
                RemoveAbsorbedItems(itemData, itemType);

                return(PeriodResultStates.Success);
            }
            else
            {
                //Уменьшить количество населения
                DataManager.Instance.PlayerAccount.Inventory.RemoveItem(itemType);

                //Если еще есть население
                if (DataManager.Instance.PlayerAccount.Inventory.HasItem(itemType))
                {
                    //Снять ресурсы, которые необходимы для поддержки текущего количества населения
                    RemoveAbsorbedItems(itemData, itemType);

                    //Пересчитать множитель
                    m_PopulationPeriod[itemType].SetMultiplyer(GetMultiplayer(itemType));

                    return(PeriodResultStates.PopulationReduce);
                }
                else
                {
                    m_PopulationPeriod[itemType].StopPeriod(); //Остановить период
                }
            }

            return(PeriodResultStates.PopulationLoose);
        }
예제 #30
0
        void PointerUp_Handler(PointerEventData eventData, DataTableItems.ItemTypes type)
        {
            if (m_ItemDragIcon != null)
            {
                Destroy(m_ItemDragIcon.gameObject);
            }

            foreach (UIElement_ItemSlot item in m_SlotsController.ItemSlots)
            {
                if (RectTransformUtility.RectangleContainsScreenPoint(item.ItemRectTransform, Input.mousePosition))
                {
                    AddItemToSlot(item.Index, type);
                    break;
                }
            }
        }