From 0e26b1b2dca3c6f71792eb00d48fdb96868f5458 Mon Sep 17 00:00:00 2001 From: NguyenVanDat Date: Thu, 22 Jan 2026 10:02:58 +0700 Subject: [PATCH 01/10] update inventory --- Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs b/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs index 46d718d016..0480c3265f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_Inventory.cs @@ -305,5 +305,15 @@ namespace BrewMonster.Scripts.Managers { return m_aItems.Length; } + // Unfreeze all items + public void UnfreezeAllItems() + { + // Release all items + for (int i=0; i < m_aItems.Length; i++) + { + if (m_aItems[i] != null) + m_aItems[i].Freeze(false); + } + } } } From b64b08ab061c81434c1db02a142668536e156073 Mon Sep 17 00:00:00 2001 From: NguyenVanDat Date: Mon, 26 Jan 2026 09:51:10 +0700 Subject: [PATCH 02/10] show gold need to embed stone --- .../Managers/EC_IvtrItem/EC_IvtrStone.cs | 24 +++ .../Scripts/UI/Dialogs/DlgInstall.cs | 169 ++++++++++++++++-- .../PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs | 2 +- Assets/Prefabs/UI/DlgInstall.prefab | 2 +- 4 files changed, 185 insertions(+), 12 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrStone.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrStone.cs index 9b2c49e0f3..19a79ed787 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrStone.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrStone.cs @@ -1,8 +1,14 @@ +using BrewMonster; using BrewMonster.Scripts.Managers; +using ModelRenderer.Scripts.GameData; + namespace PerfectWorld.Scripts.Managers { public class EC_IvtrStone : EC_IvtrItem { + // Data in database + private STONE_ESSENCE m_pDBEssence; + /// /// Not create logic yet (add summary later) /// @@ -10,11 +16,29 @@ namespace PerfectWorld.Scripts.Managers /// Expire date public EC_IvtrStone(int tid, int expire_date) : base(tid, expire_date) { + m_iCID = (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_STONE; + +// Get database data + elementdataman pDB = ElementDataManProvider.GetElementDataMan(); + DATA_TYPE DataType = default; + m_pDBEssence = (STONE_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE,ref DataType); + // m_pDBSubType = (STONE_SUB_TYPE*)pDB->get_data_ptr(m_pDBEssence->id_sub_type, ID_SPACE_ESSENCE, DataType); + + m_iPileLimit = m_pDBEssence.pile_num_max; + m_iPrice = m_pDBEssence.price; + m_iShopPrice = m_pDBEssence.shop_price; + m_iProcType = (int)m_pDBEssence.proc_type; + m_i64EquipMask = 0; + m_bEmbeddable = true; + + m_bNeedUpdate = false; } public EC_IvtrStone(EC_IvtrStone other) : base(other) { } + + public STONE_ESSENCE GetDBEssence() { return m_pDBEssence; } } } diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs index 6f306b8923..6be24cec71 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs @@ -28,7 +28,7 @@ namespace BrewMonster [Header("Buttons and Money")] [SerializeField] private TextMeshProUGUI m_TxtMoney; - [SerializeField] private Button m_BtnInstall; + [SerializeField] private Button m_BtnMerge; [SerializeField] private Button m_BtnCancel; [SerializeField] private Sprite khung_item; @@ -48,7 +48,19 @@ namespace BrewMonster RegisterClick(m_SlotSecondlParent, OnClickMaterialSlot); } - public void OnpenInstall(uint npcId) + public override void OnEnable() + { + base.OnEnable(); + m_BtnMerge.onClick.AddListener(OnClickedMerge); + } + + public override void OnDisable() + { + base.OnDisable(); + m_BtnMerge.onClick.RemoveListener(OnClickedMerge); + } + + public void OpenInstall(uint npcId) { } @@ -98,9 +110,7 @@ namespace BrewMonster return list[slot]; } - - - + private void RegisterDrop(Transform target, Action callback) { var trigger = target.GetComponent(); @@ -156,8 +166,7 @@ namespace BrewMonster ClearMaterialSlot(); } } - - + private EC_IvtrItem GetItemFromDrag(PointerEventData eventData) { if (eventData.pointerDrag == null) @@ -203,6 +212,7 @@ namespace BrewMonster else detailedItem.GetDetailDataFromLocal(); + m_SelectedEquip?.Freeze(false); m_SelectedEquip = detailedItem; m_FirstInvSlot = slotIndex; @@ -210,11 +220,12 @@ namespace BrewMonster SetSlotIcon(m_SlotFirstParent, detailedItem); SetInventorySlotGray(btn, true); + + detailedItem.Freeze(true); Debug.Log($"[Install] Equipment: {detailedItem.m_tid} from slot {slotIndex}"); } - - + private void OnDropMaterial(PointerEventData eventData) { if (eventData.pointerDrag == null) @@ -236,13 +247,51 @@ namespace BrewMonster else detailedItem.GetDetailDataFromLocal(); + m_SelectedMaterial?.Freeze(false); m_SelectedMaterial = detailedItem; + m_SelectedMaterial?.Freeze(true); m_SecondInvSlot = slotIndex; m_TxtSecondName.text = detailedItem.GetName(); SetSlotIcon(m_SlotSecondlParent, detailedItem); SetInventorySlotGray(btn, true); + + // GetGameUIMan().PlayItemSound(pIvtrSrc, true); + EC_IvtrStone pStone = null; + STONE_ESSENCE pEssence; + // ACHAR szText[40] = _AL("0"); + + //check if material is stone and show price to merge + if(m_SelectedMaterial.GetClassID() == (int)EC_IvtrEquip.EQUIP_CLASS_ID.ICID_STONE) + { + pStone = (EC_IvtrStone)m_SelectedMaterial; + pEssence = pStone.GetDBEssence(); + m_TxtMoney.text = $"{pEssence.install_price}"; + // a_sprintf(szText, _AL("%d"), pEssence->install_price); + // m_pTxtGold->SetText(szText); + } + // else if( 0 == stricmp(this->GetName(), "Win_Disenchase") + // && pIvtrSrc->IsEquipment() ) + // { + // a_LogOutput(1, "[Dat Embed] OnItemDragDrop stricmp(this->GetName(), Win_Disenchase"); + // int i, nAmount = 0, idItem; + // CECIvtrEquip *pEquip = (CECIvtrEquip *)pIvtrSrc; + // + // for( i = 0; i < pEquip->GetHoleNum(); i++ ) + // { + // idItem = pEquip->GetHoleItem(i); + // if( idItem <= 0 ) continue; + // + // pStone = (CECIvtrStone *)CECIvtrItem::CreateItem(idItem, 0, 1); + // pEssence = (STONE_ESSENCE *)pStone->GetDBEssence(); + // nAmount += pEssence->uninstall_price; + // delete pStone; + // } + // + // a_sprintf(szText, _AL("%d"), nAmount); + // m_pTxtGold->SetText(szText); + // } Debug.Log($"[Install] Material: {detailedItem.m_tid} from slot {slotIndex}"); } @@ -261,7 +310,6 @@ namespace BrewMonster : Color.white; } - private void SetSlotIcon(Transform slot, EC_IvtrItem item) { if (slot == null || item == null) @@ -289,6 +337,8 @@ namespace BrewMonster private void ClearEquipSlot() { + m_SelectedEquip?.Freeze(false); + m_SelectedMaterial?.Freeze(false); m_SelectedEquip = null; m_FirstInvSlot = -1; m_TxtFirstName.text = "___"; @@ -318,5 +368,104 @@ namespace BrewMonster img.sprite = khung_item; } + private void OnClickedMerge() + { + // PAUIDIALOG pMsgBox; + // CECHostPlayer pHost = GetHostPlayer(); + // + // // if( !m_pItema->GetDataPtr("ptr_CECIvtrItem") ) return; + // + // int nMoney = a_atoi(m_pTxtGold->GetText()); + // if( nMoney > pHost.GetMoneyAmount() ) + // { + // Debug.LogError(GetGameUIMan().GetStringFromTable(226)); + // // GetGameUIMan()->MessageBox("", GetGameUIMan().GetStringFromTable(226), MB_OK, + // // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // // pMsgBox->SetLife(3); + // return; + // } + + // CECIvtrItem *pIvtrA = (CECIvtrItem *)m_pItema->GetDataPtr("ptr_CECIvtrItem"); + // if( !pIvtrA->IsEquipment() ) + // { + // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(223), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox->SetLife(3); + // return; + // } + // + // CECIvtrEquip *pEquipA = (CECIvtrEquip *)pIvtrA; + // a_LogOutput(1, "[Dat Embed] Send protocol here"); + // if( 0 == stricmp(GetName(), "Win_Enchase") ) + // { + // if( pEquipA->GetEmptyHoleNum() <= 0 ) + // { + // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(224), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox->SetLife(3); + // return; + // } + // + // CECIvtrItem *pIvtrB = (CECIvtrItem *)m_pItemb->GetDataPtr("ptr_CECIvtrItem"); + // if( !pIvtrB || !pIvtrB->IsEmbeddable() ) + // { + // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(225), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox->SetLife(3); + // return; + // } + // + // if( pIvtrB->GetClassID() != CECIvtrItem::ICID_STONE) + // return; + // + // int nStoneLevel = ((CECIvtrStone*)pIvtrB)->GetDBEssence()->level; + // int nEquipLevel = -1; + // switch( pEquipA->GetClassID() ) + // { + // case CECIvtrItem::ICID_WEAPON: + // nEquipLevel = ((CECIvtrWeapon*)pEquipA)->GetDBEssence()->level; + // break; + // case CECIvtrItem::ICID_ARMOR: + // nEquipLevel = ((CECIvtrArmor*)pEquipA)->GetDBEssence()->level; + // break; + // case CECIvtrItem::ICID_DECORATION: + // nEquipLevel = ((CECIvtrDecoration*)pEquipA)->GetDBEssence()->level; + // break; + // } + // + // if( nStoneLevel > nEquipLevel ) + // { + // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(300), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox->SetLife(3); + // return; + // } + // //pr + // GetGameSession()->c2s_CmdNPCSevEmbed( + // (WORD)m_pItemb->GetData(), (WORD)m_pItema->GetData(), + // pIvtrB->GetTemplateID(), pIvtrA->GetTemplateID()); + // ClearEquipment(); + // ClearStone(); + // pHost->GetPack(IVTRTYPE_PACK)->UnfreezeAllItems(); + // + // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(228), + // MB_OK, A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox->SetLife(3); + // } + // else if( 0 == stricmp(GetName(), "Win_Disenchase") ) + // { + // a_LogOutput(1, "[Dat Embed] Win_Disenchase"); + // if( pEquipA->GetEmptyHoleNum() == pEquipA->GetHoleNum() ) + // { + // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(227), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox->SetLife(3); + // return; + // } + // + // GetGameUIMan()->MessageBox("Game_Disenchase", GetGameUIMan()->GetStringFromTable(229), + // MB_OKCANCEL, A3DCOLORRGBA(255, 255, 255, 160)); + // } + } } } \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs index a309b97e8f..a546e83502 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgNPC.cs @@ -3425,7 +3425,7 @@ namespace BrewMonster.UI if(dlgInstall != null) { - dlgInstall.OnpenInstall(npcID); + dlgInstall.OpenInstall(npcID); } } //pShow1 = m_pAUIManager.GetDialog("Win_Enchase"); diff --git a/Assets/Prefabs/UI/DlgInstall.prefab b/Assets/Prefabs/UI/DlgInstall.prefab index b0618fd0d7..9862a017dd 100644 --- a/Assets/Prefabs/UI/DlgInstall.prefab +++ b/Assets/Prefabs/UI/DlgInstall.prefab @@ -6125,7 +6125,7 @@ MonoBehaviour: m_SlotSecondlParent: {fileID: 7151360590639773519} m_TxtSecondName: {fileID: 4492084240745408081} m_TxtMoney: {fileID: 6140428454487430115} - m_BtnInstall: {fileID: 8208092408021918524} + m_BtnMerge: {fileID: 8208092408021918524} m_BtnCancel: {fileID: 4503836757578509720} khung_item: {fileID: 21300000, guid: a5366f3bce011c046902e39b6bd3a077, type: 3} --- !u!1 &5644241573758805168 From ee5e123b13bc8b093a6f3054b98724b6e2cce8c4 Mon Sep 17 00:00:00 2001 From: NguyenVanDat Date: Tue, 27 Jan 2026 11:35:03 +0700 Subject: [PATCH 03/10] update logic embed stone --- .../Managers/EC_IvtrItem/EC_IvtrArmor.cs | 2 + .../Managers/EC_IvtrItem/EC_IvtrDecoration.cs | 2 + .../Managers/EC_IvtrItem/EC_IvtrItem.cs | 14 ++ .../Managers/EC_IvtrItem/EC_IvtrWeapon.cs | 1 + .../Scripts/UI/Dialogs/DlgInstall.cs | 193 ++++++++++-------- 5 files changed, 124 insertions(+), 88 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmor.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmor.cs index 7f6124202b..db680f2a08 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmor.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrArmor.cs @@ -76,6 +76,8 @@ namespace PerfectWorld.Scripts.Managers protected ARMOR_MAJOR_TYPE m_pDBMajorType; protected ARMOR_SUB_TYPE m_pDBSubType; protected ARMOR_ESSENCE m_pDBEssence; + + public ARMOR_ESSENCE GetDBEssence() { return m_pDBEssence; } /// /// Constructor for armor item (Mu + Ao + Quan + Giay) / Constructor for armor item (Helmet + Armor + Pants + Boots) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDecoration.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDecoration.cs index 0bf3a45000..ad175bdd60 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDecoration.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrDecoration.cs @@ -48,6 +48,8 @@ namespace PerfectWorld.Scripts.Managers protected DECORATION_MAJOR_TYPE m_pDBMajorType; protected DECORATION_SUB_TYPE m_pDBSubType; protected DECORATION_ESSENCE m_pDBEssence; + + public DECORATION_ESSENCE GetDBEssence() { return m_pDBEssence; } /// /// Constructor for decoration item (cac loai trang suc) / Constructor for decoration item (various types of decorations) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs index e3f462fe8f..6e055d220f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrItem.cs @@ -705,6 +705,9 @@ namespace BrewMonster.Scripts.Managers public bool m_bLocalDetailData; // true, data from GetDetailDataFromLocal public EC_Inventory m_pDescIvtr; // Inventory only used to get item description + + private ushort m_dwData; + private string m_strDataName; #region Constructors @@ -2114,6 +2117,17 @@ namespace BrewMonster.Scripts.Managers } #endregion + // public ushort GetData(string strName = "") + // { + // // if (0 != m_dwData && strName != m_strDataName) + // // AUI_ReportError(__LINE__, 1, "AUIObject::GetData(), data name not match"); + // return m_dwData; + // } + // public void SetData(ushort dwData, string strName) + // { + // m_strDataName = strName; + // m_dwData = dwData; + // } } /// diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs index 7236b8ed82..63ecbb8407 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_IvtrItem/EC_IvtrWeapon.cs @@ -76,6 +76,7 @@ namespace PerfectWorld.Scripts.Managers protected WEAPON_MAJOR_TYPE m_pDBMajorType; protected WEAPON_SUB_TYPE m_pDBSubType; protected WEAPON_ESSENCE m_pDBEssence; + public WEAPON_ESSENCE GetDBEssence() { return m_pDBEssence; } /// /// Constructor for weapon item (cac loai vu khi) diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs index 6be24cec71..79da4965a0 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgInstall.cs @@ -9,6 +9,7 @@ using PerfectWorld.Scripts.Task; using System; using System.Collections.Generic; using System.Text; +using BrewMonster.Scripts; using TMPro; using UnityEngine; using UnityEngine.EventSystems; @@ -38,6 +39,7 @@ namespace BrewMonster private int m_FirstInvSlot = -1; private int m_SecondInvSlot = -1; + private int m_install_price = -1; public override void Awake() { @@ -51,7 +53,10 @@ namespace BrewMonster public override void OnEnable() { base.OnEnable(); + //todo need to set from other class + // SetName("Win_Enchase"); m_BtnMerge.onClick.AddListener(OnClickedMerge); + m_install_price = -1; } public override void OnDisable() @@ -371,100 +376,112 @@ namespace BrewMonster private void OnClickedMerge() { // PAUIDIALOG pMsgBox; - // CECHostPlayer pHost = GetHostPlayer(); - // - // // if( !m_pItema->GetDataPtr("ptr_CECIvtrItem") ) return; - // - // int nMoney = a_atoi(m_pTxtGold->GetText()); - // if( nMoney > pHost.GetMoneyAmount() ) - // { - // Debug.LogError(GetGameUIMan().GetStringFromTable(226)); - // // GetGameUIMan()->MessageBox("", GetGameUIMan().GetStringFromTable(226), MB_OK, - // // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); - // // pMsgBox->SetLife(3); - // return; - // } + CECHostPlayer pHost = GetHostPlayer(); + + // if( !m_pItema->GetDataPtr("ptr_CECIvtrItem") ) return; + string message = ""; + + int nMoney = m_install_price; + if( nMoney > pHost.GetMoneyAmount() ) + { + message = GetGameUIMan().GetStringFromTable(226); + Debug.LogError(message); + // GetGameUIMan()->MessageBox("", GetGameUIMan().GetStringFromTable(226), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox->SetLife(3); + return; + } - // CECIvtrItem *pIvtrA = (CECIvtrItem *)m_pItema->GetDataPtr("ptr_CECIvtrItem"); - // if( !pIvtrA->IsEquipment() ) - // { - // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(223), MB_OK, - // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); - // pMsgBox->SetLife(3); - // return; - // } - // - // CECIvtrEquip *pEquipA = (CECIvtrEquip *)pIvtrA; + EC_IvtrItem pIvtrA = m_SelectedEquip; + if( !pIvtrA.IsEquipment() ) + { + message = GetGameUIMan().GetStringFromTable(223); + Debug.LogError(message); + // GetGameUIMan().MessageBox("", GetGameUIMan().GetStringFromTable(223), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox.SetLife(3); + return; + } + + EC_IvtrEquip pEquipA = (EC_IvtrEquip)pIvtrA; // a_LogOutput(1, "[Dat Embed] Send protocol here"); - // if( 0 == stricmp(GetName(), "Win_Enchase") ) + // if( 0 == string.CompareOrdinal(GetName(), "Win_Enchase") ) // { - // if( pEquipA->GetEmptyHoleNum() <= 0 ) - // { - // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(224), MB_OK, - // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); - // pMsgBox->SetLife(3); - // return; - // } - // - // CECIvtrItem *pIvtrB = (CECIvtrItem *)m_pItemb->GetDataPtr("ptr_CECIvtrItem"); - // if( !pIvtrB || !pIvtrB->IsEmbeddable() ) - // { - // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(225), MB_OK, - // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); - // pMsgBox->SetLife(3); - // return; - // } - // - // if( pIvtrB->GetClassID() != CECIvtrItem::ICID_STONE) - // return; - // - // int nStoneLevel = ((CECIvtrStone*)pIvtrB)->GetDBEssence()->level; - // int nEquipLevel = -1; - // switch( pEquipA->GetClassID() ) - // { - // case CECIvtrItem::ICID_WEAPON: - // nEquipLevel = ((CECIvtrWeapon*)pEquipA)->GetDBEssence()->level; - // break; - // case CECIvtrItem::ICID_ARMOR: - // nEquipLevel = ((CECIvtrArmor*)pEquipA)->GetDBEssence()->level; - // break; - // case CECIvtrItem::ICID_DECORATION: - // nEquipLevel = ((CECIvtrDecoration*)pEquipA)->GetDBEssence()->level; - // break; - // } - // - // if( nStoneLevel > nEquipLevel ) - // { - // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(300), MB_OK, - // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); - // pMsgBox->SetLife(3); - // return; - // } - // //pr - // GetGameSession()->c2s_CmdNPCSevEmbed( - // (WORD)m_pItemb->GetData(), (WORD)m_pItema->GetData(), - // pIvtrB->GetTemplateID(), pIvtrA->GetTemplateID()); - // ClearEquipment(); - // ClearStone(); - // pHost->GetPack(IVTRTYPE_PACK)->UnfreezeAllItems(); - // - // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(228), - // MB_OK, A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); - // pMsgBox->SetLife(3); + if( pEquipA.GetEmptyHoleNum() <= 0 ) + { + message = GetGameUIMan().GetStringFromTable(224); + Debug.LogError(message); + // GetGameUIMan().MessageBox("", GetGameUIMan()->GetStringFromTable(224), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox.SetLife(3); + return; + } + + EC_IvtrItem pIvtrB = m_SelectedMaterial; + if(pIvtrB == null || !pIvtrB.IsEmbeddable() ) + { + message = GetGameUIMan().GetStringFromTable(225); + Debug.LogError(message); + // GetGameUIMan().MessageBox("", GetGameUIMan().GetStringFromTable(225), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox.SetLife(3); + 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 = ((EC_IvtrWeapon)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); + Debug.LogError(message); + // GetGameUIMan().MessageBox("", GetGameUIMan().GetStringFromTable(300), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox.SetLife(3); + return; + } + //pr + UnityGameSession.c2s_CmdNPCSevEmbed( + (ushort)m_SecondInvSlot, (ushort)m_FirstInvSlot, + pIvtrB.GetTemplateID(), pIvtrA.GetTemplateID()); + // ClearEquipment(); + // ClearStone(); + pHost.GetPack(InventoryConst.IVTRTYPE_PACK).UnfreezeAllItems(); + + message = GetGameUIMan().GetStringFromTable(228); + Debug.LogError(message); + // GetGameUIMan().MessageBox("", GetGameUIMan().GetStringFromTable(228), + // MB_OK, A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox.SetLife(3); // } // else if( 0 == stricmp(GetName(), "Win_Disenchase") ) // { - // a_LogOutput(1, "[Dat Embed] Win_Disenchase"); - // if( pEquipA->GetEmptyHoleNum() == pEquipA->GetHoleNum() ) - // { - // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(227), MB_OK, - // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); - // pMsgBox->SetLife(3); - // return; - // } - // - // GetGameUIMan()->MessageBox("Game_Disenchase", GetGameUIMan()->GetStringFromTable(229), - // MB_OKCANCEL, A3DCOLORRGBA(255, 255, 255, 160)); + // a_LogOutput(1, "[Dat Embed] Win_Disenchase"); + // if( pEquipA->GetEmptyHoleNum() == pEquipA->GetHoleNum() ) + // { + // GetGameUIMan()->MessageBox("", GetGameUIMan()->GetStringFromTable(227), MB_OK, + // A3DCOLORRGBA(255, 255, 255, 160), &pMsgBox); + // pMsgBox->SetLife(3); + // return; + // } + + // GetGameUIMan()->MessageBox("Game_Disenchase", GetGameUIMan()->GetStringFromTable(229), + // MB_OKCANCEL, A3DCOLORRGBA(255, 255, 255, 160)); // } } } From 8f916ee88cc382db1f96a60729484dc873a98eb3 Mon Sep 17 00:00:00 2001 From: VuNgocHaiC7 Date: Thu, 29 Jan 2026 13:58:15 +0700 Subject: [PATCH 04/10] use item but cooldown don't active --- .../Scripts/Managers/EC_HPWork.cs | 2 +- .../Scripts/Managers/EC_HPWorkUse.cs | 189 + .../Scripts/Managers/EC_HPWorkUse.cs.meta | 2 + .../Scripts/Managers/EC_InventoryUI.cs | 317 +- .../Managers/EC_IvtrItem/EC_IvtrDoubleExp.cs | 8 + .../Managers/EC_IvtrItem/EC_IvtrTargetItem.cs | 33 + .../Managers/EC_IvtrItem/EC_IvtrTossMat.cs | 8 + Assets/PerfectWorld/Scripts/Move/CECPlayer.cs | 6 + .../CSNetwork/C2SCommand/C2SCommandFactory.cs | 20 + .../Scripts/Network/CSNetwork/GPDataType.cs | 9 + .../Scripts/Network/CSNetwork/GameSession.cs | 9 + .../Scripts/Network/UnityGameSession.cs | 4 + .../Scripts/Objet/Shortcut/CECShortcutSet.cs | 11 + .../Scripts/UI/Dialogs/AUIDialog.cs | 17 + .../Scripts/UI/GamePlay/AUIImagePicture.cs | 28 +- .../Scripts/UI/GamePlay/CdlgQuickBar.cs | 124 + .../UI/GamePlay/SkillUI/AUIClockIcon.cs | 6 + .../Scripts/UI/Inventory/CECSCItem.cs | 242 + .../Scripts/UI/Inventory/CECSCItem.cs.meta | 2 + .../Scripts/UI/Inventory/CECSCPet.cs | 197 + .../Scripts/UI/Inventory/CECSCPet.cs.meta | 2 + Assets/PerfectWorld/UI/TaskIcon/whitebox.png | Bin 0 -> 2097 bytes .../UI/TaskIcon/whitebox.png.meta | 173 + Assets/Prefabs/UI/InventoryUI.prefab | 11568 +++++++++++++--- Assets/Scripts/CECGameRun.cs | 178 + Assets/Scripts/CECHostPlayer.cs | 539 +- 26 files changed, 11735 insertions(+), 1959 deletions(-) create mode 100644 Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs create mode 100644 Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/UI/Inventory/CECSCItem.cs create mode 100644 Assets/PerfectWorld/Scripts/UI/Inventory/CECSCItem.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/UI/Inventory/CECSCPet.cs create mode 100644 Assets/PerfectWorld/Scripts/UI/Inventory/CECSCPet.cs.meta create mode 100644 Assets/PerfectWorld/UI/TaskIcon/whitebox.png create mode 100644 Assets/PerfectWorld/UI/TaskIcon/whitebox.png.meta diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs index 74af8952da..b98021b878 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs @@ -601,7 +601,7 @@ namespace BrewMonster.Scripts case CECHPWork.Host_work_ID.WORK_TRACEOBJECT: pWork = new CECHPWorkTrace(this); break; case CECHPWork.Host_work_ID.WORK_HACKOBJECT: pWork = new CECHPWorkMelee(this); break; case CECHPWork.Host_work_ID.WORK_SPELLOBJECT: pWork = new CECHPWorkSpell(this); break; - //case CECHPWork.Host_work_ID.WORK_USEITEM: pWork = new CECHPWorkUse(this); break; + case CECHPWork.Host_work_ID.WORK_USEITEM: pWork = new CECHPWorkUse(this); break; //case CECHPWork.Host_work_ID.WORK_DEAD: pWork = new CECHPWorkDead(this); break; //case CECHPWork.Host_work_ID.WORK_FOLLOW: pWork = new CECHPWorkFollow(this); break; case CECHPWork.Host_work_ID.WORK_FLYOFF: pWork = new CECHPWorkFly(this); break; diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs new file mode 100644 index 0000000000..32631d021e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs @@ -0,0 +1,189 @@ +using BrewMonster.Scripts; +using BrewMonster.Scripts.Managers; +using CSNetwork.GPDataType; +using UnityEngine; + +namespace BrewMonster.Scripts +{ + /// + /// Host player work: Use item + /// 主角玩家工作:使用物品 + /// + public class CECHPWorkUse : CECHPWork + { + // Fields / 字段 + private int m_idItem; // Item template ID / 物品模板ID + private int m_idTarget; // Target object ID / 目标对象ID + private bool m_bWorkForMonsterSpirit; // Is this work for monster spirit gathering? / 是否为命轮采集工作 + private CECCounter m_UseTimeCnt; // Use time counter / 使用时间计数器 + + /// + /// Constructor / 构造函数 + /// + public CECHPWorkUse(CECHPWorkMan pWorkMan) : base(Host_work_ID.WORK_USEITEM, pWorkMan) + { + m_dwMask = Work_mask.MASK_USEITEM; + m_dwTransMask = Work_mask.MASK_STAND | Work_mask.MASK_MOVETOPOS; + Reset(); + } + + /// + /// Reset work / 重置工作 + /// + public override void Reset() + { + base.Reset(); + + m_idItem = 0; + m_idTarget = 0; + m_bWorkForMonsterSpirit = false; + + if (m_UseTimeCnt == null) + m_UseTimeCnt = new CECCounter(); + + m_UseTimeCnt.SetPeriod(100); + m_UseTimeCnt.Reset(); + } + + /// + /// Copy work data / 复制工作数据 + /// + public override bool CopyData(CECHPWork pWork) + { + if (!base.CopyData(pWork)) + return false; + + CECHPWorkUse pSrc = pWork as CECHPWorkUse; + if (pSrc == null) + return false; + + m_idItem = pSrc.m_idItem; + m_idTarget = pSrc.m_idTarget; + m_bWorkForMonsterSpirit = pSrc.m_bWorkForMonsterSpirit; + + m_UseTimeCnt.SetPeriod(pSrc.m_UseTimeCnt.GetPeriod()); + m_UseTimeCnt.SetCounter(pSrc.m_UseTimeCnt.GetCounter()); + + return true; + } + + /// + /// On first tick / 第一帧执行 + /// + protected override void OnFirstTick() + { + if (m_pHost == null) + return; + + m_pHost.m_iMoveMode = (int)MoveMode.MOVE_STAND; + + EC_IvtrItem pItem = EC_IvtrItem.CreateItem(m_idItem, 0, 1); + if (pItem == null) + return; + + if (m_bWorkForMonsterSpirit) + { + // Play gather monster spirit action / 播放采集命轮动作 + // TODO: Implement PlayGatherMonsterSpiritAction if needed + // m_pHost.PlayGatherMonsterSpiritAction(); + Debug.Log($"[CECHPWorkUse] Playing gather monster spirit action for item {m_idItem}"); + } + else + { + // Play start use item action / 播放开始使用物品动作 + // TODO: Implement PlayStartUseItemAction if needed + // m_pHost.PlayStartUseItemAction(m_idItem); + Debug.Log($"[CECHPWorkUse] Playing start use item action for item {m_idItem}"); + } + } + + /// + /// Work is cancelled / 工作被取消 + /// + public override void Cancel() + { + if (m_idTarget != 0 && m_pHost != null) + { + m_pHost.TurnFaceTo(0); + } + + base.Cancel(); + + // TODO: Implement AP_ActionEvent if needed + // AP_ActionEvent(AP_EVENT_STOPUSEITEM); + Debug.Log("[CECHPWorkUse] Work cancelled - STOPUSEITEM event"); + } + + /// + /// Set parameters / 设置参数 + /// + /// Item template ID / 物品模板ID + /// Use time in milliseconds / 使用时间(毫秒) + /// Target object ID / 目标对象ID + /// Is for monster spirit gathering / 是否为命轮采集 + public void SetParams(int idItem, float dwUseTime, int idTarget, bool bWorkForMonsterSpirit) + { + m_idItem = idItem; + m_idTarget = idTarget; + m_bWorkForMonsterSpirit = bWorkForMonsterSpirit; + + m_UseTimeCnt.SetPeriod(dwUseTime); + m_UseTimeCnt.Reset(); + } + + /// + /// Tick routine / 每帧更新 + /// + public override bool Tick(float dwDeltaTime) + { + base.Tick(dwDeltaTime); + + // Update use time counter / 更新使用时间计数器 + if (m_UseTimeCnt.IncCounter(dwDeltaTime)) + { + m_UseTimeCnt.Reset(true); + m_bFinished = true; + } + + // Turn face to target if needed / 如果有目标则面向目标 + if (m_idTarget != 0 && m_pHost != null) + { + m_pHost.TurnFaceTo(m_idTarget); + } + + return true; + } + + /// + /// Get item template ID / 获取物品模板ID + /// + public int GetItem() + { + return m_idItem; + } + + /// + /// Get target object ID / 获取目标对象ID + /// + public int GetTarget() + { + return m_idTarget; + } + + /// + /// Is this work for monster spirit gathering? / 是否为命轮采集工作 + /// + public bool IsWorkForMonsterSpirit() + { + return m_bWorkForMonsterSpirit; + } + + /// + /// Get use time counter / 获取使用时间计数器 + /// + public CECCounter GetUseTimeCnt() + { + return m_UseTimeCnt; + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs.meta b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs.meta new file mode 100644 index 0000000000..025f99e9b7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 965c8f617755486429a9f1bb88521065 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs b/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs index 8b0b0af771..b8b3e9b0f9 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs @@ -134,6 +134,71 @@ namespace BrewMonster.Scripts.Managers { RefreshAll(); } + + UpdateCooldownOverlays(); + } + + /// + /// Update all cooldown overlays + /// 更新所有冷却遮罩 + /// + public void UpdateCooldownOverlays() + { + // Update inventory pack cooldowns + // 更新背包冷却 + UpdatePackageCooldowns(inventoryPackButtons, PKG_INVENTORY); + + // Equipment pack doesn't typically have cooldowns but update anyway + // 装备栏通常没有冷却但也更新 + UpdatePackageCooldowns(equipmentPackButtons, PKG_EQUIPMENT); + } + + /// + /// Update cooldown overlays for a specific package + /// 更新特定包裹的冷却遮罩 + /// + private void UpdatePackageCooldowns(List