diff --git a/Assets/PerfectWorld/Scripts/GameData/ExpTypes.cs b/Assets/PerfectWorld/Scripts/GameData/ExpTypes.cs index d2c06bdf3b..59a8cac0b2 100644 --- a/Assets/PerfectWorld/Scripts/GameData/ExpTypes.cs +++ b/Assets/PerfectWorld/Scripts/GameData/ExpTypes.cs @@ -3729,6 +3729,39 @@ namespace BrewMonster public uint id_equipundestroy_service; // equipment undestroy service ID public uint id_goblin_skill_service; // goblin skill service ID public uint combined_services; // combined services mask + // Simple service combination: each bit represents a parameterless service. Possible services include: + // 0: Forget production skills + // 1: Socket (drilling) service + // 2: Empty (unused) + // 3: Warehouse discovery service + // 4: Guild service + // 5: Pet fusion service + // 6: Mail service + // 7: Auction service + // 8: Double EXP check-in service + // 9: Pet egg division service + // 10: Pet egg restoration service + // 11: Territory war management service + // 12: Leave battlefield service + // 13: Point card exchange + // 14: Equipment upgrade service + // 15: Dyeing (coloring) service + // 16: Spirit transformation service + // 17: Sprite attribute reset + // 18: Sprite skill reset + // 19: Sprite forget skill + // 20: Sprite refinement service + // 21: Sprite separation service + // 22: Sprite equipment dismantling + // 23: Repair damaged equipment + // 24: Trade platform service + // 25: Demon conversion service + // 26: Marriage-related service + // 27: Base activation service + // 28: Base upgrade and contribution + // 29: Base material exchange + // 30: View warehouse without password + // 31: View inventory ranking list public uint id_mine; // mine ID public uint no_collision; // no collision with NPC public uint id_engrave_service; // engrave service ID @@ -3736,6 +3769,7 @@ namespace BrewMonster public uint combined_services2; // combined services mask 2 public uint id_force_service; // force service ID public uint combined_switch; // combined switch, see NPC_COMBINED_SWITCH + } public enum NPC_COMBINED_SWITCH diff --git a/Assets/PerfectWorld/Scripts/MainFiles/CECGameRun.cs b/Assets/PerfectWorld/Scripts/MainFiles/CECGameRun.cs index a9c86dc519..2d2ba56fda 100644 --- a/Assets/PerfectWorld/Scripts/MainFiles/CECGameRun.cs +++ b/Assets/PerfectWorld/Scripts/MainFiles/CECGameRun.cs @@ -7,6 +7,8 @@ using UnityEngine; public class CECGameRun { private CECWorld m_pWorld; + + protected CECUIManager m_pUIManager; // UI manager public CECWorld GetWorld() { return m_pWorld; } public bool StartGame(int idInst, Vector3 vHostPos) { @@ -22,4 +24,12 @@ public class CECGameRun { return true; } + + public void Init() + { + m_pUIManager = new CECUIManager(); + } + + // Get UI manager + public CECUIManager GetUIManager() { return m_pUIManager; } } diff --git a/Assets/PerfectWorld/Scripts/MainFiles/EC_Game.cs b/Assets/PerfectWorld/Scripts/MainFiles/EC_Game.cs index ec08f8f7ca..cd7e0b3843 100644 --- a/Assets/PerfectWorld/Scripts/MainFiles/EC_Game.cs +++ b/Assets/PerfectWorld/Scripts/MainFiles/EC_Game.cs @@ -65,7 +65,7 @@ namespace BrewMonster.Network BMLogger.LogError("CECGame::Init"); return false; } - + // Initialize string tables InitializeStringTables(); @@ -126,6 +126,8 @@ namespace BrewMonster.Network { Debug.LogError($"[EC_Game] Error initializing string tables: {ex.Message}"); } + + m_pGameRun.Init(); } private struct ItemMsgMapEntry diff --git a/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs b/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs index 45ac186c69..10c828f823 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs @@ -58,4 +58,14 @@ public class CECNPCServer : CECNPC StartWork((int)WorkType.WT_NOTHING, (int)WorkID.WORK_STAND); return true; } + + // Get way point ID bound with this NPC + public uint? GetWayPointID() + { + uint? dwID = 0; + if ((m_pDBEssence?.combined_services & 0x08) != 0) + dwID = m_pDBEssence?.id_to_discover; + + return dwID; + } } diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs index ff45bdc481..dd132f1d4e 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommand.cs @@ -1354,6 +1354,12 @@ namespace CSNetwork.S2CCommand { public int id; }; + + public struct cmd_sevnpc_serve + { + public int service_type; + public uint len; + }; } // 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 41fef5a589..939da489d5 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/C2SCommand/C2SCommandFactory.cs @@ -453,5 +453,15 @@ namespace CSNetwork.C2SCommand { return SerializeCommand(iCmd); } + + public static Octets CreateNPCSevWaypointCmd(int serviceType, uint len) + { + var cmd = new cmd_sevnpc_serve + { + service_type = serviceType, + len = len + }; + return SerializeCommand(CommandID.SEVNPC_SERVE, cmd); + } } } diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs index 97337eab02..e90f062360 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GPDataType.cs @@ -518,6 +518,126 @@ namespace CSNetwork.GPDataType public const int PRAY_DISTANCE_CHANGE = 396; // Ò÷³ª¾àÀë²ÎÊý } + // NPC service type + public static class NPC_service_type + { + public const int GP_NPCSEV_SELL = 1, // 1, NPC sell to player + GP_NPCSEV_BUY = 2, // 2, NPC buy from player + GP_NPCSEV_REPAIR = 3, // 3 + GP_NPCSEV_HEAL = 4, // 4 + GP_NPCSEV_TRANSMIT = 5, // 5, Transmit to somewhere + + GP_NPCSEV_TASK_RETURN = 6, // 6, Return task + GP_NPCSEV_TASK_ACCEPT = 7, // 7, Accept task + GP_NPCSEV_TASK_MATTER = 8, // 8, Task matter + GP_NPCSEV_LEARN = 9, // 9, Learn skill + GP_NPCSEV_EMBED = 10, // 10, Embed stone + + GP_NPCSEV_CLEAR_TESSERA = 11, // 11, Clear tessear + GP_NPCSEV_MAKEITEM = 12, // 12 + GP_NPCSEV_BREAKITEM = 13, // 13 + GP_NPCSEV_TRASHPSW = 14, // 14, Change trash password + GP_NPCSEV_OPENTRASH = 15, // 15, Open trash + + GP_NPCSEV_RESERVED = 16, // 16 + GP_NPCSEV_IDENTIFY = 17, // 17, Identify item + GP_NPCSEV_FACTION = 18, // 18, About faction + GP_NPCSEV_BOOTHSELL = 19, // 19, Player booth sell + GP_NPCSEV_TRAVEL = 20, // 20, Travel + + GP_NPCSEV_BOOTHBUY = 21, // 21, Player booth buy + GP_NPCSEV_WAYPOINT = 22, // 22 + GP_NPCSEV_FORGETSKILL = 23, // 23 + GP_NPCSEV_FACECHANGE = 24, // 24 + GP_NPCSEV_MAIL = 25, // 25 + + GP_NPCSEV_VENDUE = 26, // 26 + GP_NPCSEV_DBLEXPTIME = 27, // 27 + GP_NPCSEV_HATCHPET = 28, // 28 + GP_NPCSEV_RESTOREPET = 29, // 29 + GP_NPCSEV_BATTLE = 30, // 30 + + GP_NPCSEV_BUILDTOWER = 31, // 31 + GP_NPCSEV_LEAVEBATTLE = 32, // 32 + GP_NPCSEV_RETURNSTATUSPT = 33, // 33 + GP_NPCSEV_ACCOUNTPOINT = 34, // 34 + GP_NPCSEV_REFINE = 35, // 35 + + GP_NPCSEV_PETNAME = 36, // 36, change pet name + GP_NPCSEV_PETSKILL_DEL = 37, // 37, Delete pet skill + GP_NPCSEV_PETSKILL_LEARN = 38, // 38, Learn pet skill + GP_NPCSEV_BIND_ITEM = 39, // 39, Bind item + GP_NPCSEV_DESTROY_BIND = 40, // 40, Destroy bind item + + CP_NPCSEV_CANCEL_DESTROY = 41, // 41, Cancel destroy bind item + GP_NPCSEV_STOCK_TRANSACTION = 42,// 42 + GP_NPCSEV_STOCK_OPERATION = 43, // 43 + GP_NPCSEV_DYE = 44, // 44 + GP_NPCSEV_REFINE_TRANS = 45, // 45 + + GP_NPCSEV_COMPOSE = 46, // 46 + GP_NPCSEV_MAKE_SLOT = 47, // 47 + GP_NPCSEV_GOBLIN_RETURNSTATUSPT = 48, // 48, Return goblin status point + GP_NPCSEV_GOBLIN_RETURNGENIUSPT = 49, // 49, Return goblin genius point + GP_NPCSEV_GOBLINSKILL_LEARN = 50, // 50, Learn goblin skill + + GP_NPCSEV_GOBLINSKILL_DEL = 51, // 51, delete goblin skill + GP_NPCSEV_GOBLIN_REFINE = 52, // 52, Refine goblin + GP_NPCSEV_GOBLIN_REFINETRANSFER = 53, // 53, Transfer refine level + GP_NPCSEV_GOBLIN_DESTROY = 54, // 54, Destroy goblin + GP_NPCSEV_GOBLINEQUIP_DESTROY = 55, // 55, Destroy goblin's equipment + + GP_NPCSEV_DYE_BY_SUIT = 56, // 56, Dye by suit + GP_NPCSEV_REPAIR_DESTROYING_ITEM = 57, // 57, Repair destroying item + GP_NPCSEV_LEVELUP_PRODUCE = 58, // 58, Level up produce + GP_NPCSEV_OPEN_ACCOUNT_BOX = 59, // 59, Open account box + GP_NPCSEV_WEBTRADE = 60, // 60, Web trade + + GP_NPCSEV_GODEVILCONVERT = 61, // 61, Convert between god and evil + GP_NPCSEV_WEDDING_BOOK = 62, // 62 + GP_NPCSEV_WEDDING_INVITE = 63, // 63 + GP_NPCSEV_FACTION_FORTRESS_SERVICE_1 = 64, // 64 + GP_NPCSEV_FACTION_FORTRESS_SERVICE_2 = 65, // 65 + + GP_NPCSEV_FACTION_FORTRESS_SERVICE_3 = 66, // 66 + GP_NPCSEV_PET_DYE = 67, // 67 + GP_NPCSEV_VIEW_TRASHBOX = 68, // 68, check the trash box without password + GP_NPCSEV_ENGRAVE = 69, // 69 + GP_NCPSEV_DPS_DPH_RANK = 70, // 70 + + GP_NPCSEV_ADDONREGEN = 71, // 71 + GP_NPCSEV_FORCE = 72, // 72 + GP_NPCSEV_TRANSMIT_DIRECT = 73, // 73 + GP_NPCSEV_PREVIEW_PRODUCE = 74, // 74 + GP_NPCSEV_COUNTRY_JOINLEAVE = 75,// 75 + + GP_NPCSEV_COUNTRY_LEAVEWAR = 76, // 76 + GP_NPCSEV_MARK = 77, // 77 + GP_NPCSEV_CROSSSERVER_GETIN = 78,// 78 + GP_NPCSEV_CROSSSERVER_GETOUT = 79,// 79 + + GP_NPCSEV_PLAYER_RENAME = 80, // 80 + GP_NPCSEV_STONE_TRANSFER = 81, // 81 + GP_NPCSEV_STONE_REPLACE = 82, // 82 + GP_NPCSEV_KINGSEV = 83, // 83 + GP_NPCSEV_SPLIT_FASHION = 84, // 84 + + GP_NPCSEV_OFFLINESHOP = 85, // 85 + GP_NPCSEV_REINCARNATION = 86, // 86 + GP_NPCSEV_GIFTCARD = 87, // 87 + + GP_NPCSEV_TRICKBATTLE = 88, // 88 + GP_NPCSEV_CARDRESPAWN = 89, // 89 + GP_NPCSEV_FLYSWORDIMPROVE = 90, // 90 + GP_NPCSEV_OPEN_FACTION_PVP = 91, // 91 + + GP_NPCSEV_ADVANCED_PRODUCE = 92, // 92 + GP_NPCSEV_GOLD_SHOP = 93, // 93 + GP_NPCSEV_DIVIDEND_GOLD_SHOP = 94, // 94 + GP_NPCSEV_PLAYER_CHANGE_GENDER = 95; // 95 + } + + // Constants used in moving control public struct MOVECONST { @@ -609,7 +729,7 @@ namespace CSNetwork.GPDataType } [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct cmd_host_attacked + public struct cmd_host_attacked { public int idAttacker; public int iDamage; @@ -772,19 +892,19 @@ namespace CSNetwork.GPDataType //TO DO: Check Valid } [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct cmd_self_info_00 + public struct cmd_self_info_00 { - public short sLevel; - public byte State; - public byte Level2; - public int iHP; - public int iMaxHP; - public int iMP; - public int iMaxMP; - public int iExp; - public int iSP; - public int iAP; - public int iMaxAP; + public short sLevel; + public byte State; + public byte Level2; + public int iHP; + public int iMaxHP; + public int iMP; + public int iMaxMP; + public int iExp; + public int iSP; + public int iAP; + public int iMaxAP; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -940,7 +1060,7 @@ namespace CSNetwork.GPDataType { public int cash_amount; } - + [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct cmd_unfreeze_ivtr_slot { @@ -993,8 +1113,8 @@ namespace CSNetwork.GPDataType public int expire_date; public uint amount; public uint slot_amount; - public byte where; - public byte index; + public byte where; + public byte index; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct cmd_pickup_item diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs index 20b9f25ac1..43ed7ba600 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -612,6 +612,11 @@ namespace CSNetwork EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_NPCGREETING, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader); break; } + case CommandID.ACTIVATE_WAYPOINT: + case CommandID.WAYPOINT_LIST: + + EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_WAYPOINT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader); + break; } } @@ -948,5 +953,12 @@ namespace CSNetwork m_idLastSelTarget = idTarget; } } + + public void c2s_SendCmdNPCSevWaypoint() + { + gamedatasend gamedatasend = new gamedatasend(); + gamedatasend.Data = C2SCommandFactory.CreateNPCSevWaypointCmd(NPC_service_type.GP_NPCSEV_WAYPOINT, 0); + 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 d493a1d2ba..19960bba58 100644 --- a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs @@ -243,6 +243,11 @@ namespace BrewMonster.Network Instance._gameSession.c2s_CmdSelectTarget(idTarget); } + public static void c2s_CmdNPCSevWaypoint() + { + Instance._gameSession.c2s_SendCmdNPCSevWaypoint(); + } + #region Task public static void c2s_CmdGetAllData(bool byPack, bool byEquip, bool byTask) { diff --git a/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_GameUIMan.cs b/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_GameUIMan.cs new file mode 100644 index 0000000000..f466d200d1 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_GameUIMan.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace BrewMonster +{ + public class CECGameUIMan + { + void PopupNPCDialog(NPC_ESSENCE pEssence) + { + m_pDlgNPC.PopupDialog(pEssence); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_GameUIMan.cs.meta b/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_GameUIMan.cs.meta new file mode 100644 index 0000000000..ed6da608b3 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_GameUIMan.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 450eac8e68388db418e23a6896c839c1 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_UIManager.cs b/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_UIManager.cs new file mode 100644 index 0000000000..1196f0595c --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_UIManager.cs @@ -0,0 +1,9 @@ +using UnityEngine; + +namespace BrewMonster +{ + public class CECUIManager + { + + } +} diff --git a/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_UIManager.cs.meta b/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_UIManager.cs.meta new file mode 100644 index 0000000000..d1a6164e42 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/GamePlay/EC_UIManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a73c9a2a2f66ce74d8141221c0f16e71 \ No newline at end of file diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index dc694730e5..e03cd4b5be 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -5,23 +5,15 @@ using BrewMonster.Scripts; using BrewMonster.Scripts.Managers; using BrewMonster.Scripts.Player; using CSNetwork; -using CSNetwork.Common; using CSNetwork.GPDataType; -using CSNetwork.Protocols; using CSNetwork.Protocols.RPCData; -using NUnit.Framework; -using PerfectWorld.Scripts.Managers; -using PerfectWorld.Scripts.Managers.BrewMonster.Managers; using PerfectWorld.Scripts.Player; using System; using System.Collections.Generic; -using System.IO; using System.Runtime.InteropServices; using System.Text; using TMPro; -using UnityEditor.Experimental.GraphView; using UnityEngine; -using UnityEngine.InputSystem; using UnityEngine.SceneManagement; using UnityEngine.UI; using Scene = UnityEngine.SceneManagement.Scene; @@ -65,6 +57,9 @@ public class CECHostPlayer : CECPlayer public GNDINFO m_GndInfo; int m_idUCSelTarget; // Uncertificately selected object's ID public float m_fVertSpeed = 0f; + int m_idSevNPC = 0; // Current service NPC + bool m_bTalkWithNPC = false; // true, is talking with NPC + List m_aWayPoints = new List(); // Active way points // ====== Ground cast config ====== [Header("Ground Cast")] @@ -394,6 +389,7 @@ public class CECHostPlayer : CECPlayer case int value when value == EC_MsgDef.MSG_HST_HURTRESULT: OnMsgHstHurtResult(Msg); break; case int value when value == EC_MsgDef.MSG_HST_INFO00: OnMsgHstInfo00(Msg); break; case int value when value == EC_MsgDef.MSG_HST_NPCGREETING: OnMsgHstNPCGreeting(Msg); break; + case int value when value == EC_MsgDef.MSG_HST_WAYPOINT: OnMsgHstWayPoint(Msg); break; } } @@ -1796,69 +1792,138 @@ public class CECHostPlayer : CECPlayer { cmd_npc_greeting pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); - //if (GPDataTypeHelper.ISNPCID(pCmd.idObject)) - //{ - // // רÃÅ´¦Àíѧϰ¼¼ÄܵÄÒþ²ØNPC - // if (CECHostSkillModel::Instance().IsSkillLearnNPC(pCmd.idObject)) - // { - // CECGameUIMan* pGameUI = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan(); - // //m_idSevNPC = pCmd.idObject; - // //m_bTalkWithNPC = true; - // //pGameUI.GetDialog("Win_SkillAction").Show(true); - // //CDlgSkillAction* dlg = dynamic_cast(pGameUI.GetDialog("Win_SkillAction")); - // //dlg.ForceShowDialog(); - // CDlgSkillAction* dlg = dynamic_cast(pGameUI.GetDialog("Win_SkillAction")); - // dlg.SetReceivedNPCGreeting(true); - // return; - // } + if (GPDataTypeHelper.ISNPCID(pCmd.idObject)) + { + // רÃÅ´¦Àíѧϰ¼¼ÄܵÄÒþ²ØNPC + //if (CECHostSkillModel::Instance().IsSkillLearnNPC(pCmd.idObject)) + //{ + // CECGameUIMan* pGameUI = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan(); + // //m_idSevNPC = pCmd.idObject; + // //m_bTalkWithNPC = true; + // //pGameUI.GetDialog("Win_SkillAction").Show(true); + // //CDlgSkillAction* dlg = dynamic_cast(pGameUI.GetDialog("Win_SkillAction")); + // //dlg.ForceShowDialog(); + // CDlgSkillAction* dlg = dynamic_cast(pGameUI.GetDialog("Win_SkillAction")); + // dlg.SetReceivedNPCGreeting(true); + // return; + //} - // CECNPC* pNPC = g_pGame.GetGameRun().GetWorld().GetNPCMan().GetNPC(pCmd.idObject); - // if (!pNPC || !pNPC.IsServerNPC()) - // { - // return; - // } + CECNPC pNPC = EC_ManMessageMono.Instance._CECNPCMan.GetNPC(pCmd.idObject); + if (!pNPC || !pNPC.IsServerNPC()) + { + return; + } - // // Check distance again - // if (!CanTouchTarget(pNPC.GetPos(), pNPC.GetTouchRadius(), 3)) - // return; + // Check distance again + if (!CanTouchTarget(pNPC.GetPos(), pNPC.GetTouchRadius(), 3)) + return; - // m_idSevNPC = pCmd.idObject; - // m_bTalkWithNPC = true; + m_idSevNPC = pCmd.idObject; + m_bTalkWithNPC = true; - // // Check way point service on NPC - // DWORD dwID = ((CECNPCServer*)pNPC).GetWayPointID(); - // if (dwID && !HasWayPoint((WORD)dwID)) - // g_pGame.GetGameSession().c2s_CmdNPCSevWaypoint(); + // Check way point service on NPC + var dwID = (pNPC as CECNPCServer).GetWayPointID(); + if (dwID != null && !HasWayPoint(dwID)) + UnityGameSession.c2s_CmdNPCSevWaypoint(); + //g_pGame.GetGameSession().c2s_CmdNPCSevWaypoint(); - // CECGameUIMan* pGameUI = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan(); - // pGameUI.PopupNPCDialog(((CECNPCServer*)pNPC).GetDBEssence()); - //} - //else if (ISPLAYERID(pCmd.idObject)) - //{ - // CECElsePlayer* pPlayer = m_pPlayerMan.GetElsePlayer(pCmd.idObject); + CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan(); + pGameUI.PopupNPCDialog(((CECNPCServer*)pNPC).GetDBEssence()); + } + else if (GPDataTypeHelper.ISPLAYERID(pCmd.idObject)) + { + CECElsePlayer* pPlayer = m_pPlayerMan.GetElsePlayer(pCmd.idObject); - // // Check distance again - // if (!pPlayer || !CanTouchTarget(pPlayer.GetPos(), 0.0f, 3)) - // return; + // Check distance again + if (!pPlayer || !CanTouchTarget(pPlayer.GetPos(), 0.0f, 3)) + return; - // m_idSevNPC = pCmd.idObject; - // m_bTalkWithNPC = true; - // m_iBoothState = 3; + m_idSevNPC = pCmd.idObject; + m_bTalkWithNPC = true; + m_iBoothState = 3; - // g_pGame.GetGameSession().c2s_CmdNPCSevGetContent(GP_NPCSEV_BOOTHSELL); + g_pGame.GetGameSession().c2s_CmdNPCSevGetContent(GP_NPCSEV_BOOTHSELL); - // m_pBuyPack.RemoveAllItems(); - // m_pSellPack.RemoveAllItems(); - // m_pEPBoothBPack.RemoveAllItems(); - // m_pEPBoothSPack.RemoveAllItems(); + m_pBuyPack.RemoveAllItems(); + m_pSellPack.RemoveAllItems(); + m_pEPBoothBPack.RemoveAllItems(); + m_pEPBoothSPack.RemoveAllItems(); - // CECGameUIMan* pGameUI = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan(); - // pGameUI.PopupBoothDialog(true, false, pCmd.idObject); - //} - //else - //{ - // return; - //} + CECGameUIMan* pGameUI = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan(); + pGameUI.PopupBoothDialog(true, false, pCmd.idObject); + } + else + { + return; + } + } + + // Does host player have specified way point ? + bool HasWayPoint(uint? wID) + { + if (wID == null) + { + return false; + } + for (int i = 0; i < m_aWayPoints.Count; i++) + { + if (m_aWayPoints[i] == wID) + return true; + } + + return false; + } + + void OnMsgHstWayPoint(ECMSG Msg) + { + CECGameUIMan pGameUI = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan(); + + if (Convert.ToInt32(Msg.dwParam2) == CommandID.ACTIVATE_WAYPOINT) + { + cmd_activate_waypoint* pCmd = (cmd_activate_waypoint*)Msg.dwParam1; + m_aWayPoints.Add(pCmd.waypoint); + + // add to waypoints array + pGameUI.GetMapDlgsMgr().UpdateWayPoints(&pCmd.waypoint, 1, false); + + // Print a notify message + const CECMapDlgsMgr::PointMap& aWayPoints = pGameUI.GetMapDlgsMgr().GetTransPoint(); + CECMapDlgsMgr::PointMap::const_iterator itr = aWayPoints.find(pCmd.waypoint); + if(itr != aWayPoints.end()) + { + g_pGame.GetGameRun().AddFixedMessage(FIXMSG_NEWWAYPOINT, (itr.second).strName); + + bool bCanPopUITips = true; + int count = CECUIConfig::Instance().GetGameUI().GetTaskIDDisableWayPointsUITipsCount(); + // ¼ì²éÉíÉÏÊÇ·ñÓнûÖ¹µ¯³ötipsµÄÈÎÎñ + for (int i=0;i [SerializeField] private HUDNPC npsUI; + CECGameUIMan gameUI; + protected override void Awake() { base.Awake(); @@ -96,4 +98,14 @@ public class CECUIManager : MonoSingleton kv.Value.SetActive(false); } } + + // If current UI manager is INGAME manager, this function return it's interface + public CECGameUIMan GetInGameUIMan() + { + if(gameUI == null) + { + gameUI = new CECGameUIMan(); + } + return gameUI; + } } \ No newline at end of file