/// <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); }
/// <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); } }
/// <summary> /// Задать прогресс тику автодобывания /// </summary> void SetAutoCraftTickProgress(DataTableItems.ItemTypes type, float progress) { if (m_Items.ContainsKey(type)) { m_Items[type].SetAutoCraftProgress(progress); } }
/// <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); } }
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(); } } }
void PopulationProgressChangedHandler(DataTableItems.ItemTypes itemType, float progress) { if (m_PopulationUIIems.ContainsKey(itemType)) { m_PopulationUIIems[itemType].SetProgress(progress); } }
/// <summary> /// Проигрыать анимацию ошибки автодобывания /// </summary> void PlayAutoCraftAnimation_Error(DataTableItems.ItemTypes type) { if (m_Items.ContainsKey(type)) { m_Items[type].Toggle_AutoCraft.PlayErrorAnimation(); } }
/// <summary> /// Изменить состояние Toggle автодобывания /// </summary> void SetValueAutoCraftToggle(DataTableItems.ItemTypes type, bool isToggled) { if (m_Items.ContainsKey(type)) { m_Items[type].Toggle_AutoCraft.SetValue(isToggled); } }
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); } }
/// <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(); }
public void Init(DataTableItems.ItemTypes type, int index, int amount, float progress, int bagSize) { Index = index; SetItem(type, amount, progress, bagSize); base.Init(); }
/// <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); } }
/// <summary> /// Получить текущий множитель для населения /// </summary> public float GetMultiplayerForPopulation(DataTableItems.ItemTypes itemType) { if (m_PopulationPeriod.ContainsKey(itemType)) { return(m_PopulationPeriod[itemType].Multiplayer); } return(0); }
/// <summary> /// Получить текущий прогресс для типа населения (На старте окна) /// </summary> public float GetProgressForPopulation(DataTableItems.ItemTypes itemType) { if (m_PopulationPeriod.ContainsKey(itemType)) { return(m_PopulationPeriod[itemType].Progress); } return(0); }
/// <summary> /// Добавить слот /// </summary> public void AddSlot(DataTableItems.ItemTypes type) { CreateSlot(type, ItemSlots.Count, m_AllowClickable); if (m_SelectedSlotIndex >= 0) { StartCoroutine(WaitFrameToSelectItem(m_SelectedSlotIndex)); } }
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; }
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()); }
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(); }
/// <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; } } }
/// <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(); }
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)); } }
/// <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()); }
/// <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"); } }
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); } }
/// <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); }
/// <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)); } }
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); }
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; } } }