diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs index fc89bfc0a0..397c4817c6 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs @@ -1625,6 +1625,12 @@ namespace CSNetwork.S2CCommand public int iIvtrIdx; public int idEgg; }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct CONTENTNPCSevRestorePet + { + public int iPetIdx; + }; } // Player and NPC state \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs index 4454386567..b4e93c6fac 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs @@ -1081,5 +1081,19 @@ namespace CSNetwork.C2SCommand }; return SerializeCommand(CommandID.SEVNPC_SERVE, cmd, content); } + + public static Octets CreateNPCSevRestorePetCmd(int i_PetIdx) + { + var cmd = new cmd_sevnpc_serve + { + service_type = NPC_service_type.GP_NPCSEV_RESTOREPET, + len = (uint)Marshal.SizeOf() + }; + CONTENTNPCSevRestorePet content = new CONTENTNPCSevRestorePet() + { + iPetIdx = i_PetIdx, + }; + return SerializeCommand(CommandID.SEVNPC_SERVE, cmd, content); + } } } diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs index 3a6791e8d4..150e1d6898 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -2000,5 +2000,12 @@ namespace CSNetwork gamedatasend.Data = C2SCommandFactory.CreateNPCSevHatchPetCmd(iIvtrIdx, idEgg); SendProtocol(gamedatasend); } + + public void c2s_SendCmdNPCSevRestorePet(int iPetIdx) + { + gamedatasend gamedatasend = new gamedatasend(); + gamedatasend.Data = C2SCommandFactory.CreateNPCSevRestorePetCmd(iPetIdx); + SendProtocol(gamedatasend); + } } } \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs index b691ce7962..2ea519aff2 100644 --- a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs @@ -783,6 +783,10 @@ namespace BrewMonster.Network { Instance._gameSession.c2s_SendCmdNPCSevHatchPet(iIvtrIdx, idEgg); } + public static void c2s_CmdNPCSevRestorePet(int iPetIdx) + { + Instance._gameSession.c2s_SendCmdNPCSevRestorePet(iPetIdx); + } } /// diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetList.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetList.cs index ed09a913fe..9a37420569 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetList.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetList.cs @@ -27,6 +27,8 @@ namespace BrewMonster.UI [SerializeField] private TextMeshProUGUI[] m_pTxt_Level = new TextMeshProUGUI[CDLGPETLIST_SLOT_MAX]; [SerializeField] private Button m_pBtnClose; [SerializeField] private Sprite m_spriteDefault_Icon; + [SerializeField] private Button[] m_pBtn_Tab; + [SerializeField] private GameObject[] m_mask_off_pBtn_Tab; int m_nPageIndex; string strFile = ""; string strText = ""; @@ -146,7 +148,25 @@ namespace BrewMonster.UI { Show(false); }); - UpdateList(); + for(int i = 0; i < m_pBtn_Tab.Length; i++) + { + m_pBtn_Tab[i].onClick.RemoveAllListeners(); + if(i == 0) + { + m_pBtn_Tab[i].onClick.AddListener(() => + { + OnClickBtnTab(0); + }); + } + else if(i == 1) + { + m_pBtn_Tab[i].onClick.AddListener(() => + { + OnClickBtnTab(1); + }); + } + } + OnClickBtnTab(0); } bool IsPetDye(int nSlot) @@ -273,5 +293,15 @@ namespace BrewMonster.UI { GetHostPlayer().RecallPet(); } + + public void OnClickBtnTab(int index) + { + m_nPageIndex = index; + for(int i = 0; i < m_pBtn_Tab.Length; i++) + { + m_mask_off_pBtn_Tab[i].SetActive(i != m_nPageIndex); + } + UpdateList(); + } } } diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetRec.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetRec.cs index 19a08232a3..f03a7f9db7 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetRec.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetRec.cs @@ -345,7 +345,13 @@ namespace BrewMonster.UI private void OnCommandConfirm() { - // TODO + if (m_nSlot >= 0) + { + GetHostPlayer().RestorePet(m_nSlot); + GetGameUIMan()?.EndNPCService(); + Show(false); + //GetGameUIMan()->m_pDlgPetList->Show(false); + } } private void SetPet(int nSlot) diff --git a/Assets/PerfectWorld/UI/Pet/DlgPetList.prefab b/Assets/PerfectWorld/UI/Pet/DlgPetList.prefab index 8882512d58..619f3c525c 100644 --- a/Assets/PerfectWorld/UI/Pet/DlgPetList.prefab +++ b/Assets/PerfectWorld/UI/Pet/DlgPetList.prefab @@ -3218,6 +3218,81 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &1563131212404254231 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1367151585653230994} + - component: {fileID: 4002396222024976400} + - component: {fileID: 5927240598748978092} + m_Layer: 5 + m_Name: MaskOff + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1367151585653230994 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1563131212404254231} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2427007445932155897} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4002396222024976400 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1563131212404254231} + m_CullTransparentMesh: 1 +--- !u!114 &5927240598748978092 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1563131212404254231} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.69803923} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &1598487822700303523 GameObject: m_ObjectHideFlags: 0 @@ -3945,6 +4020,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 878817954833932422} + - {fileID: 7306643221236935726} m_Father: {fileID: 628038525523165487} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -8960,6 +9036,12 @@ MonoBehaviour: - {fileID: 5057683854687741650} m_pBtnClose: {fileID: 8122086289517642079} m_spriteDefault_Icon: {fileID: 21300000, guid: 1356336560449e54a921e7243886103d, type: 3} + m_pBtn_Tab: + - {fileID: 7762720709650526177} + - {fileID: 6105035509064218572} + m_mask_off_pBtn_Tab: + - {fileID: 8218472400492161409} + - {fileID: 1563131212404254231} --- !u!1 &4205984255684239874 GameObject: m_ObjectHideFlags: 0 @@ -12301,6 +12383,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 674781935163886888} + - {fileID: 1367151585653230994} m_Father: {fileID: 628038525523165487} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -15527,6 +15610,81 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8218472400492161409 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7306643221236935726} + - component: {fileID: 4273877355682388422} + - component: {fileID: 5328584516814327022} + m_Layer: 5 + m_Name: MaskOff + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7306643221236935726 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8218472400492161409} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2711780913503914813} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4273877355682388422 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8218472400492161409} + m_CullTransparentMesh: 1 +--- !u!114 &5328584516814327022 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8218472400492161409} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.69803923} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &8232183239187098781 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/CECHostPlayer.Pet.cs b/Assets/Scripts/CECHostPlayer.Pet.cs index 2d06e810a0..05d203bedf 100644 --- a/Assets/Scripts/CECHostPlayer.Pet.cs +++ b/Assets/Scripts/CECHostPlayer.Pet.cs @@ -215,5 +215,40 @@ namespace BrewMonster return true; } + + // Restore pet + public bool RestorePet(int iPetIdx) + { + CECPetData pPet = m_pPetCorral.GetPetData(iPetIdx); + if (pPet == null || iPetIdx == m_pPetCorral.GetActivePetIndex()) + return false; + + CECGameRun pGameRun = EC_Game.GetGameRun(); + + // Check money + DATA_TYPE DataType = DATA_TYPE.DT_INVALID; + object ob_pdbe = ElementDataManProvider.GetElementDataMan().get_data_ptr((uint)pPet.GetEggID(), ID_SPACE.ID_SPACE_ESSENCE,ref DataType); + if (DataType != DATA_TYPE.DT_PET_EGG_ESSENCE || ob_pdbe == null) + return false; + + PET_EGG_ESSENCE pdbe = (PET_EGG_ESSENCE)ob_pdbe; + + if (GetMoneyAmount() < pdbe.money_restored) + { + pGameRun.AddFixedMessage((int)FixedMsg.FIXMSG_NEEDMONEY); + return false; + } + + // Check package space + if (m_pPack.GetEmptySlotNum() == 0) + { + pGameRun.AddFixedMessage((int)FixedMsg.FIXMSG_PACKISFULL); + return false; + } + + UnityGameSession.c2s_CmdNPCSevRestorePet(iPetIdx); + + return true; + } } } \ No newline at end of file