Files
test/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs
T

590 lines
20 KiB
C#

using BrewMonster.Network;
using BrewMonster.Scripts.Managers;
using BrewMonster.UI;
using PerfectWorld.Scripts.Managers;
using System;
using System.Collections.Generic;
using BrewMonster.Scripts;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace BrewMonster
{
public class DlgInstall : AUIDialog
{
public enum InstallMode
{
Enchase,
Disenchase
}
[Header("Mode")][SerializeField] private InstallMode m_Mode = InstallMode.Enchase;
[Header("Slot First")]
[SerializeField]
private Transform m_SlotFirstParent;
[SerializeField] private TextMeshProUGUI m_TxtFirstName;
[Header("Slot Second")]
[SerializeField]
private Transform m_SlotSecondParent;
[SerializeField] private TextMeshProUGUI m_TxtSecondName;
[Header("Buttons and Money")]
[SerializeField]
private TextMeshProUGUI m_TxtMoney;
[SerializeField] private Button m_useItem;
[SerializeField] private Button m_BtnMergeOrReset;
[SerializeField] private Button m_BtnCancel;
[SerializeField] private Button m_BtnClose;
[SerializeField] private Sprite khung_item;
[SerializeField] private GameObject itemInventoryRoot;
private EC_IvtrItem m_SelectedEquip;
private EC_IvtrItem m_SelectedMaterial;
private int m_FirstInvSlot = -1;
private int m_SecondInvSlot = -1;
private int m_install_price = -1;
public InstallMode GetInstallMode => m_Mode;
public EC_IvtrItem SelectedEquip => m_SelectedEquip;
public int FirstSlotIndex => m_FirstInvSlot;
public override void Awake()
{
base.Awake();
RegisterClick(m_SlotFirstParent, OnClickEquipSlot);
if (m_Mode == InstallMode.Enchase && m_SlotSecondParent != null)
{
RegisterClick(m_SlotSecondParent, OnClickMaterialSlot);
}
}
public override void OnEnable()
{
base.OnEnable();
//todo need to set from other class
// SetName("Win_Enchase");
m_BtnMergeOrReset.onClick.AddListener(OnClickedMergeOrReset);
m_BtnCancel.onClick.AddListener(OnCommandCancel);
m_BtnClose.onClick.AddListener(OnCommandCancel);
m_useItem.onClick.AddListener(OnUseItemClicked);
m_install_price = -1;
if (m_SlotSecondParent != null)
m_SlotSecondParent.gameObject.SetActive(m_Mode == InstallMode.Enchase);
ClearEquiment();
ClearStone();
}
public override void OnDisable()
{
base.OnDisable();
m_BtnMergeOrReset.onClick.RemoveListener(OnClickedMergeOrReset);
m_BtnCancel.onClick.RemoveListener(OnCommandCancel);
m_BtnClose.onClick.RemoveListener(OnCommandCancel);
m_useItem.onClick.RemoveListener(OnUseItemClicked);
}
private void RestoreInventoryColors()
{
var canvas = FindFirstObjectByType<Canvas>();
if (canvas == null)
return;
if (m_FirstInvSlot >= 0)
{
var btn = FindInventoryButtonBySlot(m_FirstInvSlot);
SetInventorySlotGray(btn, false);
m_FirstInvSlot = -1;
}
if (m_SecondInvSlot >= 0)
{
var btn = FindInventoryButtonBySlot(m_SecondInvSlot);
SetInventorySlotGray(btn, false);
m_SecondInvSlot = -1;
}
}
private Button FindInventoryButtonBySlot(int slot)
{
var inventoryUI = FindFirstObjectByType<EC_InventoryUI>();
if (inventoryUI == null)
return null;
var field = typeof(EC_InventoryUI)
.GetField("inventoryPackButtons",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (field == null)
return null;
var list = field.GetValue(inventoryUI) as List<Button>;
if (list == null || slot < 0 || slot >= list.Count)
return null;
return list[slot];
}
private void RegisterClick(Transform target, Action<PointerEventData> callback)
{
if (target == null) return;
var trigger = target.GetComponent<EventTrigger>();
if (trigger == null)
trigger = target.gameObject.AddComponent<EventTrigger>();
var entry = new EventTrigger.Entry
{
eventID = EventTriggerType.PointerClick
};
entry.callback.AddListener((data) => { callback((PointerEventData)data); });
trigger.triggers.Add(entry);
}
private void OnClickEquipSlot(PointerEventData eventData)
{
if (m_SelectedEquip != null)
{
ReturnItemToInventory(m_FirstInvSlot);
ClearEquiment();
}
}
private void OnClickMaterialSlot(PointerEventData eventData)
{
if (m_SelectedMaterial != null)
{
ReturnItemToInventory(m_SecondInvSlot);
ClearStone();
}
}
private void CalculateUninstallPrice(EC_IvtrItem equipment)
{
if (equipment == null || !equipment.IsEquipment())
return;
EC_IvtrEquip pEquip = (EC_IvtrEquip)equipment;
int nAmount = 0;
for (int i = 0; i < pEquip.GetHoleNum(); i++)
{
int idIten = pEquip.GetHoleItem(i);
if (idIten <= 0)
continue;
EC_IvtrStone pStone = EC_IvtrItem.CreateItem(idIten, 0, 1) as EC_IvtrStone;
if (pStone != null)
{
STONE_ESSENCE pEssence = pStone.GetDBEssence();
nAmount += pEssence.uninstall_price;
}
}
m_install_price = nAmount;
m_TxtMoney.text = nAmount.ToString();
}
private void SetInventorySlotGray(Button btn, bool gray)
{
if (btn == null)
return;
var img = btn.GetComponent<Image>();
if (img == null)
return;
img.color = gray
? new Color(0.3f, 0.3f, 0.3f, 1f)
: Color.white;
}
private void SetSlotIcon(Transform slot, EC_IvtrItem item)
{
if (slot == null || item == null)
return;
var img = slot.GetComponentInChildren<Image>(true);
if (img == null)
return;
img.sprite = EC_IvtrItemUtils.Instance.ResolveItemIconSprite(item.m_tid);
img.enabled = img.sprite != null;
img.color = Color.white;
img.SetNativeSize();
// GetGameUIMan()?.PlayItemSound(item, true);
}
private void ReturnItemToInventory(int slotIndex)
{
if (slotIndex < 0)
return;
var btn = FindInventoryButtonBySlot(slotIndex);
SetInventorySlotGray(btn, false);
}
private void ClearEquiment()
{
if (m_FirstInvSlot >= 0)
{
ReturnItemToInventory(m_FirstInvSlot);
}
m_SelectedEquip?.Freeze(false);
m_SelectedEquip = null;
m_FirstInvSlot = -1;
m_TxtFirstName.text = "___";
ClearSlotIcon(m_SlotFirstParent);
if (m_Mode == InstallMode.Disenchase)
{
m_install_price = -1;
m_TxtMoney.text = "0";
}
}
private void ClearStone()
{
if (m_SecondInvSlot >= 0)
{
ReturnItemToInventory(m_SecondInvSlot);
}
m_SelectedMaterial?.Freeze(false);
m_SelectedMaterial = null;
m_SecondInvSlot = -1;
m_TxtSecondName.text = "___";
ClearSlotIcon(m_SlotSecondParent);
m_TxtMoney.text = "0";
m_install_price = -1;
}
private void ClearSlotIcon(Transform slot)
{
if (slot == null)
return;
var img = slot.GetComponentInChildren<Image>(true);
if (img == null)
return;
img.sprite = khung_item;
}
private void OnClickedMergeOrReset()
{
CECHostPlayer pHost = GetHostPlayer();
string message = "";
int nMoney = m_install_price;
if (nMoney > pHost.GetMoneyAmount())
{
message = GetGameUIMan().GetStringFromTable(226);
CECUIManager.Instance.ShowMessageBoxGeneral("", message, this);
return;
}
EC_IvtrItem pIvtrA = m_SelectedEquip;
if (!pIvtrA.IsEquipment())
{
message = GetGameUIMan().GetStringFromTable(223);
CECUIManager.Instance.ShowMessageBoxGeneral("", message, this);
return;
}
EC_IvtrEquip pEquipA = (EC_IvtrEquip)pIvtrA;
if (pHost != null && m_Mode == InstallMode.Enchase)
{
if (pEquipA.GetEmptyHoleNum() <= 0)
{
message = GetGameUIMan().GetStringFromTable(224);
CECUIManager.Instance.ShowMessageBoxGeneral("", message, this);
return;
}
EC_IvtrItem pIvtrB = m_SelectedMaterial;
if (pIvtrB == null || !pIvtrB.IsEmbeddable())
{
message = GetGameUIMan().GetStringFromTable(225);
CECUIManager.Instance.ShowMessageBoxGeneral("", message, this);
return;
}
if (pIvtrB.GetClassID() != (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_STONE)
return;
int nStoneLevel = ((EC_IvtrStone)pIvtrB).GetDBEssence().level;
int nEquipLevel = -1;
switch (pEquipA.GetClassID())
{
case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_WEAPON:
nEquipLevel = ((CECIvtrWeapon)pEquipA).GetDBEssence().level;
break;
case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_ARMOR:
nEquipLevel = ((EC_IvtrArmor)pEquipA).GetDBEssence().level;
break;
case (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_DECORATION:
nEquipLevel = ((EC_IvtrDecoration)pEquipA).GetDBEssence().level;
break;
}
if (nStoneLevel > nEquipLevel)
{
message = GetGameUIMan().GetStringFromTable(300);
CECUIManager.Instance.ShowMessageBoxGeneral("", message, this);
return;
}
//pr
UnityGameSession.c2s_CmdNPCSevEmbed(
(ushort)m_SecondInvSlot, (ushort)m_FirstInvSlot,
pIvtrB.GetTemplateID(), pIvtrA.GetTemplateID());
ClearEquiment();
ClearStone();
pHost.GetPack(InventoryConst.IVTRTYPE_PACK).UnfreezeAllItems();
message = GetGameUIMan().GetStringFromTable(228);
CECUIManager.Instance.ShowMessageBoxGeneral("", message, this);
}
else if (pHost != null && m_Mode == InstallMode.Disenchase)
{
if (pEquipA.GetEmptyHoleNum() == pEquipA.GetHoleNum())
{
message = GetGameUIMan().GetStringFromTable(227);
CECUIManager.Instance.ShowMessageBoxGeneral("", message, this);
return;
}
message = GetGameUIMan().GetStringFromTable(229);
CECUIManager.Instance.ShowMessageBoxYesAndNo("", message, this,
() =>
{
UnityGameSession.c2s_CmdNPCSevClearEmbeddedChip((ushort)m_FirstInvSlot, pIvtrA.GetTemplateID());
ClearEquiment();
pHost.GetPack(InventoryConst.IVTRTYPE_PACK).UnfreezeAllItems();
string successMessage = GetGameUIMan().GetStringFromTable(230);
CECUIManager.Instance.ShowMessageBoxGeneral("", message, this);
}, null);
}
else
{
BMLogger.LogError("Something go wrong with merge/reset");
}
}
private void OnCommandCancel()
{
m_SelectedEquip?.Freeze(false);
m_SelectedMaterial?.Freeze(false);
RestoreInventoryColors();
m_SelectedEquip = null;
m_SelectedMaterial = null;
m_TxtFirstName.text = "___";
m_TxtMoney.text = "0";
if (m_Mode == InstallMode.Enchase)
m_TxtSecondName.text = "___";
ClearSlotIcon(m_SlotFirstParent);
if (m_Mode == InstallMode.Enchase)
{
ClearSlotIcon(m_SlotSecondParent);
}
m_install_price = -1;
var host = GetHostPlayer();
host?.EndNPCService();
host?.GetPack(InventoryConst.IVTRTYPE_PACK).UnfreezeAllItems();
CloseDialogue();
}
private void OnUseItemClicked()
{
itemInventoryRoot.SetActive(false);
if (!TryGetSelectedInventoryItem(out var selectedItem, out var selectedSlot))
return;
if (m_Mode == InstallMode.Disenchase)
{
if (!selectedItem.IsEquipment())
{
var message = GetGameUIMan().GetStringFromTable(223);
CECUIManager.Instance.ShowMessageBoxGeneral("", message, this);
return;
}
AssignEquipItem(selectedItem, selectedSlot);
return;
}
if (m_SelectedEquip == null)
{
if (!selectedItem.IsEquipment())
{
var msg = GetGameUIMan().GetStringFromTable(223);
CECUIManager.Instance.ShowMessageBoxGeneral("", msg, this);
return;
}
AssignEquipItem(selectedItem, selectedSlot);
return;
}
if (selectedItem.IsEquipment())
{
AssignEquipItem(selectedItem, selectedSlot);
return;
}
if(!selectedItem.IsEmbeddable() ||
selectedItem.GetClassID() != (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_STONE)
{
var msg = GetGameUIMan().GetStringFromTable(225);
CECUIManager.Instance.ShowMessageBoxGeneral("", msg, this);
return;
}
AssginMaterialItem(selectedItem, selectedSlot);
}
private bool TryGetSelectedInventoryItem(out EC_IvtrItem item, out int slot)
{
item = null;
slot = -1;
var inventoryUI = FindFirstObjectByType<EC_InventoryUI>();
if(inventoryUI == null)
return false;
var type = typeof(EC_InventoryUI);
var packageField = type.GetField("currentSelectedPackage", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var slotField = type.GetField("currentSelectedSlot", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var itemField = type.GetField("currentSelectedItem", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (packageField == null ||slotField == null || itemField == null)
{
return false;
}
var selectedPackage = (byte)packageField.GetValue(inventoryUI);
if(selectedPackage != 0)
return false;
slot = (int)slotField.GetValue(inventoryUI);
item = itemField.GetValue(inventoryUI) as EC_IvtrItem;
return item != null && slot >= 0;
}
private void AssignEquipItem(EC_IvtrItem item, int slot)
{
if(m_FirstInvSlot >= 0 && m_FirstInvSlot != slot)
{
ReturnItemToInventory(m_FirstInvSlot);
}
m_SelectedEquip?.Freeze(false);
m_SelectedEquip = item;
m_SelectedEquip.Freeze(true);
m_FirstInvSlot = slot;
m_TxtFirstName.text = EC_IvtrItemUtils.Instance.ResolveItemName(item.m_tid);
SetSlotIcon(m_SlotFirstParent, item);
SetInventorySlotGray(FindInventoryButtonBySlot(slot), true);
if(m_Mode == InstallMode.Disenchase)
{
CalculateUninstallPrice(item);
}
else
{
UpdateResourceInfo();
}
}
private void AssginMaterialItem(EC_IvtrItem item, int slot)
{
if(m_SecondInvSlot >= 0 && m_SecondInvSlot != slot)
{
ReturnItemToInventory(m_SecondInvSlot);
}
m_SelectedMaterial?.Freeze(false);
m_SelectedMaterial = item;
m_SelectedMaterial.Freeze(true);
m_SecondInvSlot = slot;
m_TxtSecondName.text = EC_IvtrItemUtils.Instance.ResolveItemName(item.m_tid);
SetSlotIcon(m_SlotSecondParent, item);
SetInventorySlotGray(FindInventoryButtonBySlot(slot), true);
if (item is EC_IvtrStone stone)
{
var essence = stone.GetDBEssence();
m_install_price = essence.install_price;
}
UpdateResourceInfo();
}
private void UpdateResourceInfo()
{
// GetGameUIMan().PlayItemSound(pIvtrSrc, true);
EC_IvtrStone stone;
STONE_ESSENCE pEssence;
// ACHAR szText[40] = _AL("0");
//check if material is stone and show price to merge
if (m_Mode == InstallMode.Enchase)
{
if (m_SelectedMaterial != null && m_SelectedMaterial is EC_IvtrStone)
{
stone = (EC_IvtrStone)m_SelectedMaterial;
pEssence = stone.GetDBEssence();
m_TxtMoney.text = $"{pEssence.install_price}";
// a_sprintf(szText, _AL("%d"), pEssence->install_price);
// m_pTxtGold->SetText(szText);
}
else
{
m_install_price = 0;
m_TxtMoney.text = $"{0}";
}
}
else if (m_Mode == InstallMode.Disenchase)
{
int i, nAmount = 0, idItem;
if (m_SelectedEquip is EC_IvtrEquip pEquip)
{
for (i = 0; i < pEquip.GetHoleNum(); i++)
{
idItem = pEquip.GetHoleItem(i);
if (idItem <= 0) continue;
stone = (EC_IvtrStone)EC_IvtrItem.CreateItem(idItem, 0, 1);
pEssence = stone.GetDBEssence();
nAmount += pEssence.uninstall_price;
stone = null;
}
m_install_price = nAmount;
m_TxtMoney.text = $"{nAmount}";
}
else
{
m_install_price = 0;
m_TxtMoney.text = $"{0}";
}
}
}
}
}