From ec632f192c797714a242b68643279241f9228d3d Mon Sep 17 00:00:00 2001 From: Le Duc Anh Date: Mon, 6 Apr 2026 17:53:25 +0700 Subject: [PATCH 01/10] show equipment --- .../Scripts/Players/PlayerModelPreview.cs | 203 +++++++++++++++++- 1 file changed, 202 insertions(+), 1 deletion(-) diff --git a/Assets/PerfectWorld/Scripts/Players/PlayerModelPreview.cs b/Assets/PerfectWorld/Scripts/Players/PlayerModelPreview.cs index 7724b5e1d1..d6a9a17567 100644 --- a/Assets/PerfectWorld/Scripts/Players/PlayerModelPreview.cs +++ b/Assets/PerfectWorld/Scripts/Players/PlayerModelPreview.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using BrewMonster.Scripts.Managers; using CSNetwork.Protocols.RPCData; +using Cysharp.Threading.Tasks; using UnityEngine; namespace BrewMonster.Scripts @@ -42,7 +43,10 @@ namespace BrewMonster.Scripts for (int i = 0; i < roleInfos.Count; i++) { RoleInfo role = roleInfos[i]; - GameObject model = await NPCManager.Instance.GetModelPlayer(role.occupation, role.gender); + GameObject model = await LoadPlayerModel(role); + + if (model == null) + continue; if (version != _loadVersion) { @@ -104,5 +108,202 @@ namespace BrewMonster.Scripts playerModels.Clear(); playerModelIds.Clear(); } + + private async UniTask LoadPlayerModel(RoleInfo role) + { + var elemendataman = BrewMonster.ElementDataManProvider.GetElementDataMan(); + GameObject prefab = await NPCManager.Instance.GetModelPlayer(role.occupation, role.gender); + if (prefab == null) + { + return null; + } + GameObject model = Instantiate(prefab); + var playerDefaultEquipments = model.GetComponentInChildren(); + if (playerDefaultEquipments == null) + { + return null; + } + DATA_TYPE DataType = default; + bool useDefaultUpper = true; + bool useDefaultLower = true; + bool useDefaultWrist = true; + bool useDefaultFoot = true; + + GRoleInventory equipment; + + for(int i = 0; i < role.equipment.Count; i++) + { + equipment = role.equipment[i]; + + var equipData = elemendataman.get_data_ptr((uint)equipment.id, ID_SPACE.ID_SPACE_ESSENCE, ref DataType); + + switch (DataType) + { + case DATA_TYPE.DT_WEAPON_ESSENCE: + var weaponData = (WEAPON_ESSENCE)equipData; + + string fileModelRight = AFile.NormalizePath(weaponData.FileModelRight, true).ToLower(); + string fileModelLeft = AFile.NormalizePath(weaponData.FileModelLeft, true).ToLower(); + + GameObject weaponPrefab = null; + if (!string.IsNullOrEmpty(fileModelRight)) + { + weaponPrefab = await AddressableManager.Instance.LoadPrefabAsync(fileModelRight); + var weaponObject = Instantiate(weaponPrefab); + if (weaponObject != null) + { + weaponObject.transform.SetParent(FindChildObjectRecursive(model.transform, CECPlayer._hh_right_hand_weapon).transform); + weaponObject.transform.localPosition = weaponPrefab.transform.localPosition; + weaponObject.transform.localRotation = weaponPrefab.transform.localRotation; + weaponObject.transform.localScale = Vector3.one; + weaponObject.SetActive(true); + } + } + + if (!string.IsNullOrEmpty(fileModelLeft)) + { + weaponPrefab = await AddressableManager.Instance.LoadPrefabAsync(fileModelLeft); + var weaponObject = Instantiate(weaponPrefab); + if (weaponObject != null) + { + weaponObject.transform.SetParent(FindChildObjectRecursive(model.transform, CECPlayer._hh_left_hand_weapon).transform); + weaponObject.transform.localPosition = weaponPrefab.transform.localPosition; + weaponObject.transform.localRotation = weaponPrefab.transform.localRotation; + weaponObject.transform.localScale = Vector3.one; + weaponObject.SetActive(true); + } + } + break; + case DATA_TYPE.DT_ARMOR_ESSENCE: + var pArmor = (ARMOR_ESSENCE)equipData; + var nLocation = pArmor.equip_location; + // BMLogger.Log($"ShowEquipments():: Armor Essence: {pArmor.RealName}"); + + var armorSkinPath = CECPlayer._GenEquipmentSkinPath(role.occupation, role.gender, pArmor.RealName); + if (!armorSkinPath.EndsWith(".ecm")) + { + armorSkinPath += ".ecm"; + } + var armorPrefab = await AddressableManager.Instance.LoadPrefabAsync(armorSkinPath); + if (armorPrefab != null) + { + var armorObject = Instantiate(armorPrefab); + armorObject.transform.SetParent(GetSkeletonBuilder(model)?.transform); + armorObject.transform.localPosition = Vector3.zero; + armorObject.transform.localRotation = Quaternion.identity; + armorObject.transform.localScale = Vector3.one; + + var skinnedMeshRenderer = armorObject.GetComponent(); + var skinnedMeshRenderereFromDataList = armorObject.GetComponentsInChildren(); + foreach (var skinnedMeshRenderereFromData in skinnedMeshRenderereFromDataList) + { + if (skinnedMeshRenderereFromData != null) + { + skinnedMeshRenderereFromData._skinnedMeshRenderer.bones = GetSkeletonBuilder(model).GetBones(skinnedMeshRenderereFromData.BoneNames); + skinnedMeshRenderereFromData._skinnedMeshRenderer.rootBone = skinnedMeshRenderereFromData._skinnedMeshRenderer.bones[^1]; + } + } + + // disable/enable the default equipment + switch (nLocation) + { + case (uint)CECPlayer.SkinIndex.SKIN_UPPER_BODY_INDEX: + useDefaultUpper = false; + break; + case (uint)CECPlayer.SkinIndex.SKIN_LOWER_INDEX: + useDefaultLower = false; + break; + case (uint)CECPlayer.SkinIndex.SKIN_WRIST_INDEX: + useDefaultWrist = false; + break; + case (uint)CECPlayer.SkinIndex.SKIN_FOOT_INDEX: + useDefaultFoot = false; + break; + } + } + break; + //TODO: Handle Wings later + // case DATA_TYPE.DT_WINGMANWING_ESSENCE: + // m_wingType = enumWingType.WINGTYPE_WING; + // //ChangeWing(pResult, static_cast(pEquip)->file_model); + // var pWingData = (WINGMANWING_ESSENCE)equipData; + // //string path1 = "models/players/通用装备/翅膀/天鹅之翼/天鹅之翼_Test.ecm"; + // //var pWingPrefab = await AddressableManager.Instance.LoadPrefabAsync(path1); + // var pWingPrefab = await AddressableManager.Instance.LoadPrefabAsync(pWingData.FileModel.ToLower().Replace('\\', '/')); + // //Transform parentWing = FindChildRecursive(_pPlayerModel.transform, "HH_chibang"); + // if(pWingPrefab != null) + // { + // var pflySwordObject = Instantiate(pWingPrefab).transform; + // pflySwordObject.parent = m_pPlayerCECModel.m_skeletonBuilder.GetHook("HH_chibang").transform; + // pflySwordObject.localPosition = Vector3.zero; + // pflySwordObject.localRotation = Quaternion.identity; + // pflySwordObject.localScale = Vector3.one; + + // m_Wing = pflySwordObject.transform; + + // m_Wing.gameObject.SetActive(false); + // } + // BMLogger.Log($"ShowEquipments():: Wingman Wing Essence: {pWingData.id} {pWingData.Name} -- {pWingData.FileModel}"); + // break; + default: + break; + + + + switch (equipment.pos) + { + case InventoryConst.EQUIPIVTR_BODY: + useDefaultUpper = false; + break; + case InventoryConst.EQUIPIVTR_LEG: + useDefaultLower = false; + break; + case InventoryConst.EQUIPIVTR_WRIST: + useDefaultWrist = false; + break; + case InventoryConst.EQUIPIVTR_FOOT: + useDefaultFoot = false; + break; + } + } + } + + playerDefaultEquipments.DefaultUpper.SetActive(useDefaultUpper); + playerDefaultEquipments.DefaultLower.SetActive(useDefaultLower); + playerDefaultEquipments.DefaultWirst.SetActive(useDefaultWrist); + playerDefaultEquipments.DefaultFoot.SetActive(useDefaultFoot); + return model; + } + + private GameObject FindChildObjectRecursive(Transform parent, string name) + { + foreach (Transform child in parent) + { + if (child.name == name) + { + return child.gameObject; + } + var childObject = FindChildObjectRecursive(child, name); + if (childObject != null) + { + return childObject; + } + } + return null; + } + + private SkeletonBuilder GetSkeletonBuilder(GameObject characterModel) + { + if (characterModel == null) + { + return null; + } + SkeletonBuilder skeletonBuilder = null; + if (skeletonBuilder == null) + { + skeletonBuilder = characterModel.GetComponentInChildren(); + } + return skeletonBuilder; + } } } From d6eb7f00ebdfbba47396d1529a7ba0906a0e2cdf Mon Sep 17 00:00:00 2001 From: Tungdv Date: Mon, 6 Apr 2026 18:39:48 +0700 Subject: [PATCH 02/10] fix: Update UI name EP. --- Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs index 8b7cbe0ea4..6b697df049 100644 --- a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs +++ b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs @@ -19,6 +19,9 @@ using PerfectWorld.Scripts.Managers; using UnityEngine; using BrewMonster.Scripts.Managers; using System.Collections.Generic; +using static BrewMonster.CECHostPlayer; +using TMPro; +using BrewMonster.PerfectWorld.Scripts.UI; namespace BrewMonster { @@ -995,6 +998,7 @@ namespace BrewMonster m_bBaseInfoReady = true; SetPlayerName(szName ?? ""); EC_Game.GetGameRun().AddPlayerName(m_PlayerInfo.cid, szName, true); + GetComponentInChildren().RefreshName(); } // Level up public void LevelUp() From 1227e0c5388be83f2fb7a33ebcdde8740ee66e49 Mon Sep 17 00:00:00 2001 From: HungDK <> Date: Mon, 6 Apr 2026 19:07:16 +0700 Subject: [PATCH 03/10] Show name of matter --- .../PerfectWorld/Scripts/Objet/CECMatter.cs | 130 ++++++++++++++++-- 1 file changed, 116 insertions(+), 14 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs b/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs index f96cae980d..ae4f5c1308 100644 --- a/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs +++ b/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs @@ -6,12 +6,16 @@ using BrewMonster.Scripts; using CSNetwork.GPDataType; using ModelRenderer.Scripts.Common; using PerfectWorld.Scripts.Managers; +using TMPro; using UnityEngine; namespace PerfectWorld.Scripts { public class CECMatter : CECObject { + private static Mesh s_itemNameQuadMesh; + private static Material s_itemNameBgMaterial; + // Matter information got from server public struct INFO { @@ -118,12 +122,12 @@ namespace PerfectWorld.Scripts public static async Task Init(info_matter Info) { INFO matterInfo = new INFO(); - matterInfo.mid = Info.mid; + matterInfo.mid = Info.mid; matterInfo.tid = Info.tid & 0x0000ffff; // get the matter template from elementdataman DATA_TYPE DataType = DATA_TYPE.DT_INVALID; var matterData = ElementDataManProvider.GetElementDataMan().get_data_ptr((uint)matterInfo.tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType); - + // Determine matter type based on DataType / Determine matter type based on DataType uint dwMatterType = MATTER_UNKNOWN; if (DataType == DATA_TYPE.DT_MINE_ESSENCE) @@ -142,7 +146,7 @@ namespace PerfectWorld.Scripts { dwMatterType = MATTER_MONEY; } - + if (matterData != null) { var matterDataType = matterData.GetType(); @@ -179,8 +183,8 @@ namespace PerfectWorld.Scripts collider.size = size; } // Create text object to display item name above the cube - // CreateItemNameText(matterObject, info.tid); - + CreateItemNameText(matterObject, Info.tid); + // Add a script to handle click events // MatterCubeClickHandler clickHandler = matterObject.AddComponent(); // clickHandler.Initialize(Info.mid, this); @@ -189,7 +193,7 @@ namespace PerfectWorld.Scripts matterScript.m_iCID = Class_ID.OCID_MATTER; matterScript.SetMatterInfo(matterInfo); matterScript.m_dwMatterType = dwMatterType; // Set matter type / Set matter type - + // Set level requirement and gather distance for mines / Set level requirement and gather distance for mines if (dwMatterType == MATTER_MINE && DataType == DATA_TYPE.DT_MINE_ESSENCE) { @@ -214,11 +218,11 @@ namespace PerfectWorld.Scripts // For non-mine items, set a default pickup distance / For non-mine items, set a default pickup distance matterScript.m_fGatherDist = 3.0f; // Default pickup distance / Default pickup distance } - + matterScript.SetUpCECObject(); // This will reset m_iCID, so we set it again after / This will reset m_iCID, so we set it again after // Force set CID again after SetUpCECObject (which resets it to OCID_OBJECT) / Force set CID again after SetUpCECObject (which resets it to OCID_OBJECT) matterScript.m_iCID = Class_ID.OCID_MATTER; - + // Store reference to the cube // matterGameObjects[info.mid] = matterObject; @@ -237,10 +241,108 @@ namespace PerfectWorld.Scripts return null; } + private static void CreateItemNameText(GameObject matterObject, int tid) + { + if (matterObject == null) + return; + + // Avoid duplicating if prefab already contains it (or Init called twice). + if (matterObject.transform.Find("ItemNameText") != null) + return; + + var textObject = new GameObject("ItemNameText"); + textObject.transform.SetParent(matterObject.transform, false); + textObject.transform.localPosition = new Vector3(0f, 0.6f, 0f); + + var textMesh = textObject.AddComponent(); + + string itemName = null; + if (EC_IvtrItemUtils.Instance != null) + itemName = EC_IvtrItemUtils.Instance.ResolveItemName(tid); + + if (string.IsNullOrEmpty(itemName)) + itemName = $"Item {tid}"; + + textMesh.text = itemName; + textMesh.fontSize = 3f; + textMesh.color = Color.white; + textMesh.alignment = TextAlignmentOptions.Center; + textMesh.textWrappingMode = TextWrappingModes.NoWrap; + textMesh.overflowMode = TextOverflowModes.Overflow; + + textObject.AddComponent(); + + var background = new GameObject("TextBackground"); + background.transform.SetParent(textObject.transform, false); + background.transform.localPosition = Vector3.zero; + background.transform.localScale = new Vector3(2f, 0.8f, 0.1f); + + var bgRenderer = background.AddComponent(); + var bgFilter = background.AddComponent(); + + bgFilter.sharedMesh = GetOrCreateItemNameQuadMesh(); + bgRenderer.sharedMaterial = GetOrCreateItemNameBgMaterial(); + } + + private static Mesh GetOrCreateItemNameQuadMesh() + { + if (s_itemNameQuadMesh != null) + return s_itemNameQuadMesh; + + var quadMesh = new Mesh { name = "CECMatter_ItemNameQuad" }; + quadMesh.vertices = new[] + { + new Vector3(-0.5f, -0.5f, 0), + new Vector3(0.5f, -0.5f, 0), + new Vector3(0.5f, 0.5f, 0), + new Vector3(-0.5f, 0.5f, 0) + }; + quadMesh.triangles = new[] { 0, 1, 2, 0, 2, 3 }; + quadMesh.uv = new[] + { + new Vector2(0, 0), + new Vector2(1, 0), + new Vector2(1, 1), + new Vector2(0, 1) + }; + quadMesh.RecalculateNormals(); + quadMesh.RecalculateBounds(); + + s_itemNameQuadMesh = quadMesh; + return s_itemNameQuadMesh; + } + + private static Material GetOrCreateItemNameBgMaterial() + { + if (s_itemNameBgMaterial != null) + return s_itemNameBgMaterial; + + var shader = Shader.Find("Unlit/Color"); + if (shader == null) + shader = Shader.Find("Sprites/Default"); + if (shader == null) + shader = Shader.Find("Standard"); + + if (shader == null) + return null; + + var mat = new Material(shader) { name = "CECMatter_ItemNameBg" }; + mat.color = new Color(0f, 0f, 0f, 0.7f); + + // Best-effort: make it transparent if the shader supports it. + if (mat.HasProperty("_Mode")) + mat.SetFloat("_Mode", 3f); + if (mat.HasProperty("_Surface")) + mat.SetFloat("_Surface", 1f); + + s_itemNameBgMaterial = mat; + return s_itemNameBgMaterial; + } + private new void Update() { base.Update(); - + // Recovery: after Unity domain reload, manager dictionaries reset but scene objects persist. // Keep trying until we successfully register. if (!m_registeredToManMatter) @@ -269,17 +371,17 @@ namespace PerfectWorld.Scripts // return; // // Ray ray = mainCamera.ScreenPointToRay(screenPosition); - // + // // RaycastHit[] hits = Physics.RaycastAll(ray); - // + // // foreach (RaycastHit hit in hits) // { - // if (hit.collider.gameObject == this.gameObject || + // if (hit.collider.gameObject == this.gameObject || // hit.collider.transform.IsChildOf(this.transform)) // { // Debug.Log($"CECMatter::RaycastHit():: mid: {m_MatterInfo.mid}"); // UnityGameSession.RequestPickupItem(m_MatterInfo.mid, m_MatterInfo.tid); - // break; + // break; // } // } // } @@ -290,4 +392,4 @@ namespace PerfectWorld.Scripts return m_MatterInfo.mid; } } -} \ No newline at end of file +} From bed971ebb4ccf7d33dead87810b6beae5a9b0a1b Mon Sep 17 00:00:00 2001 From: HungDK <> Date: Tue, 7 Apr 2026 09:24:05 +0700 Subject: [PATCH 04/10] Update logic to show the split button on item have quantity bigger than 2 or equal 2 --- .../Scripts/Managers/EC_InventoryUI.cs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs b/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs index f3773eb874..33ca375e57 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs @@ -211,6 +211,8 @@ namespace BrewMonster.Scripts.Managers { if (splitPanelRoot != null) splitPanelRoot.SetActive(show); + if (IsSplitCloseButtonOnModal() && splitCloseButton != null) + splitCloseButton.gameObject.SetActive(show); } /// @@ -1197,6 +1199,50 @@ namespace BrewMonster.Scripts.Managers private void ShowDetailPanel(bool show) { EC_UIUtility.ShowPanel(detailPanelRoot.gameObject, show); + if (!show) + RefreshSplitControlsVisibility(0, null); + } + + /// + /// Split affordance only for main bag stacks (same as ). + /// If splitCloseButton is parented under splitPanelRoot, its visibility follows the modal (not this rule). + /// + private bool IsSplitCloseButtonOnModal() + { + return splitPanelRoot != null && splitCloseButton != null && + splitCloseButton.transform.IsChildOf(splitPanelRoot.transform); + } + + private bool CanShowSplitControls(byte package, EC_IvtrItem item) + { + if (item == null) + return false; + if (package != PKG_INVENTORY) + return false; + int n = item.GetCount(); + if (n < 2 && item.m_iCount >= 2) + n = item.m_iCount; + return n >= 2; + } + + /// + /// splitOpenButton: show only when a splittable main-bag stack is selected (detail panel). + /// splitCloseButton: if it lives on the split modal, show only when modal is open; else same as open (detail-placed cancel). + /// + private void RefreshSplitControlsVisibility(byte package, EC_IvtrItem item) + { + bool canSplit = CanShowSplitControls(package, item); + + if (splitOpenButton != null) + splitOpenButton.gameObject.SetActive(canSplit); + + if (splitCloseButton != null) + { + if (IsSplitCloseButtonOnModal()) + splitCloseButton.gameObject.SetActive(splitPanelRoot != null && splitPanelRoot.activeSelf); + else + splitCloseButton.gameObject.SetActive(canSplit); + } } private Button GetButtonForSlot(byte package, int slot) @@ -1297,6 +1343,8 @@ namespace BrewMonster.Scripts.Managers // Show panel first // 先显示面板 ShowDetailPanel(true); + // After detail root is active so child buttons actually appear (fixes split controls under inactive parents). + RefreshSplitControlsVisibility(package, item); //Refresh the position of the description text. Used for UI logic purpose. descriptionText.tmp.gameObject.GetComponent()?.RefreshLayout(); From 564c7b40c54b7fd88f28b772615613641a5b85b2 Mon Sep 17 00:00:00 2001 From: NguyenVanDat Date: Tue, 7 Apr 2026 09:33:44 +0700 Subject: [PATCH 05/10] refactor short cut action --- .../Scripts/UI/Action/CDlgSkillSubAction.cs | 18 +- .../Scripts/UI/GamePlay/AUIToggle.cs | 34 +- .../UI/GamePlay/AUIToggleAssignSlot.cs | 15 +- .../UI/GamePlay/AUIToggleSkillAssign.cs | 2 +- .../Scripts/UI/SkillUI/AssignSkill.cs | 1 - .../Scripts/UI/SkillUI/DlgAssignSlots.cs | 88 +- Assets/Prefabs/UI/AssignSkill.prefab | 926 ++- Assets/Prefabs/UI/SkillUI.prefab | 7014 +++-------------- Assets/Prefabs/UI/Widget.meta | 8 + Assets/Prefabs/UI/Widget/Common.meta | 8 + .../Widget/Common/centerPanel_action.prefab | 6099 ++++++++++++++ .../Common/centerPanel_action.prefab.meta | 7 + 12 files changed, 8036 insertions(+), 6184 deletions(-) create mode 100644 Assets/Prefabs/UI/Widget.meta create mode 100644 Assets/Prefabs/UI/Widget/Common.meta create mode 100644 Assets/Prefabs/UI/Widget/Common/centerPanel_action.prefab create mode 100644 Assets/Prefabs/UI/Widget/Common/centerPanel_action.prefab.meta diff --git a/Assets/PerfectWorld/Scripts/UI/Action/CDlgSkillSubAction.cs b/Assets/PerfectWorld/Scripts/UI/Action/CDlgSkillSubAction.cs index f8659fc4ee..80dfd55700 100644 --- a/Assets/PerfectWorld/Scripts/UI/Action/CDlgSkillSubAction.cs +++ b/Assets/PerfectWorld/Scripts/UI/Action/CDlgSkillSubAction.cs @@ -37,7 +37,7 @@ namespace BrewMonster OnShowDialog(); } - public void Init() + private void Init() { int[] objCount = { 8, 2, 2, 27 }; @@ -53,17 +53,17 @@ namespace BrewMonster image = orderTP, pLabel = orderTP.GetComponentInChildren() }); - + } } for (int j = 0; j < 27; j++) { var actionTP = Instantiate(actionTemplate, actionContain); actionTP.gameObject.SetActive(true); - + // Set up click handler for action items / 为动作项设置点击处理程序 SetupActionClickHandler(actionTP); - + m_aActionInfo.Add(new ActionInfo { image = actionTP, @@ -73,7 +73,7 @@ namespace BrewMonster //force refresh layout orderContain anc actionContain //then refresh layout of this gameobject } - public void OnShowDialog() + private void OnShowDialog() { AUIImagePicture pImage; TextMeshProUGUI pLabel; @@ -129,14 +129,14 @@ namespace BrewMonster Debug.Log($"CDlgSkillSubAction::SetupActionClickHandler():: Setting up click handler for action item: {actionImage.name}"); // Get the button component / 获取按钮组件 var button = actionImage.GetComponentInChildren(); - if (button == null) + if (button == null) return; - + // Remove existing listeners and add our custom handler / 移除现有监听器并添加我们的自定义处理程序 button.onClick.RemoveAllListeners(); button.onClick.AddListener(() => OnActionClicked(actionImage)); } - + /// /// Handle action icon click, similar to wave hand logic / 处理动作图标点击,类似于挥手逻辑 /// @@ -147,7 +147,7 @@ namespace BrewMonster // Get the shortcut from the action image / 从动作图像获取快捷方式 actionImage.Execute(); } - + [Serializable] public struct ActionInfo { diff --git a/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggle.cs b/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggle.cs index 3df0df3674..74e88b5d45 100644 --- a/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggle.cs +++ b/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggle.cs @@ -41,29 +41,29 @@ namespace BrewMonster } } public struct CloseAssignSkillEvent - { + { public int skillID; public CloseAssignSkillEvent(int id) { skillID = id; } } - public struct OpenAssignSlotEvent - { - public int slotIndex; - public OpenAssignSlotEvent(int index) - { - slotIndex = index; - } - } - public struct CloseAssignSlotEvent - { - public int slotIndex; - public CloseAssignSlotEvent(int index) - { - slotIndex = index; - } - } + // public struct OpenAssignSlotEvent + // { + // public int slotIndex; + // public OpenAssignSlotEvent(int index) + // { + // slotIndex = index; + // } + // } + // public struct CloseAssignSlotEvent + // { + // public int slotIndex; + // public CloseAssignSlotEvent(int index) + // { + // slotIndex = index; + // } + // } public struct OnAssignSkillEvent { public int skillID; diff --git a/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggleAssignSlot.cs b/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggleAssignSlot.cs index b85c6f5b64..c470972970 100644 --- a/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggleAssignSlot.cs +++ b/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggleAssignSlot.cs @@ -1,3 +1,4 @@ +using System; using BrewMonster.Assets.PerfectWorld.Scripts.UI.GamePlay; using UnityEngine; using BrewMonster.UI; @@ -6,6 +7,7 @@ namespace BrewMonster { public class AUIToggleAssignSlot : AUIToggle { + public event Action OnSetSlot;//bool: is active, int: slot id // [Header("AssignSlotToggleUI")] // [SerializeField] int slotIndex; public override void Awake() @@ -31,12 +33,13 @@ namespace BrewMonster } private void OnToggleValueChanged(bool isOn) { - if (isOn) - { - EventBus.Publish(new OpenAssignSlotEvent(slotIndex)); - }else{ - EventBus.Publish(new CloseAssignSlotEvent(slotIndex)); - } + OnSetSlot?.Invoke(isOn, slotIndex); + // if (isOn) + // { + // EventBus.Publish(new OpenAssignSlotEvent(slotIndex)); + // }else{ + // EventBus.Publish(new CloseAssignSlotEvent(slotIndex)); + // } } private void OnAssignSlotEvent(OnAssignSkillEvent @event) { diff --git a/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggleSkillAssign.cs b/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggleSkillAssign.cs index 598255858a..1d09a27923 100644 --- a/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggleSkillAssign.cs +++ b/Assets/PerfectWorld/Scripts/UI/GamePlay/AUIToggleSkillAssign.cs @@ -31,7 +31,7 @@ namespace BrewMonster { if (isOn) { - EventBus.Publish(new OpenAssignSkillEvent(skillID)); + EventBus.Publish(new OpenAssignSkillEvent(skillID)); }else{ EventBus.Publish(new CloseAssignSkillEvent(skillID)); } diff --git a/Assets/PerfectWorld/Scripts/UI/SkillUI/AssignSkill.cs b/Assets/PerfectWorld/Scripts/UI/SkillUI/AssignSkill.cs index d3579a1e81..3fbb173687 100644 --- a/Assets/PerfectWorld/Scripts/UI/SkillUI/AssignSkill.cs +++ b/Assets/PerfectWorld/Scripts/UI/SkillUI/AssignSkill.cs @@ -23,7 +23,6 @@ namespace BrewMonster actionButton.onClick.AddListener(OnActionButtonClicked); itemSkillButton.onClick.AddListener(OnItemButtonClicked); buttonClose.onClick.AddListener(OnCloseButtonClicked); - actionButton.interactable = false; itemSkillButton.interactable = false; } void OnEnable() diff --git a/Assets/PerfectWorld/Scripts/UI/SkillUI/DlgAssignSlots.cs b/Assets/PerfectWorld/Scripts/UI/SkillUI/DlgAssignSlots.cs index 3845fc9d0c..8b87f2714d 100644 --- a/Assets/PerfectWorld/Scripts/UI/SkillUI/DlgAssignSlots.cs +++ b/Assets/PerfectWorld/Scripts/UI/SkillUI/DlgAssignSlots.cs @@ -10,6 +10,7 @@ using CSNetwork.GPDataType; using System.Collections.Generic; using System.Linq; using UnityEngine; +using UnityEngine.Serialization; using UnityEngine.UI; using static BrewMonster.PET_EGG_ESSENCE; @@ -20,7 +21,7 @@ namespace BrewMonster //[SerializeField] List m_aSkillImage = new List(); //[SerializeField] List