using UnityEngine; using UnityEngine.EventSystems; using System.Collections.Generic; using TMPro; using CSNetwork.Protocols; using System; using CSNetwork.GPDataType; using BrewMonster.Network; using BrewMonster.Scripts.Task; using BrewMonster.Scripts.Task.UI; using BrewMonster.Scripts.World; namespace BrewMonster.UI { using CommandMap = Dictionary; [Serializable] public class StringRef { public string Value; } public class DlgNameLink : AUIDialog { public string m_TargetName; public Vector3 m_TargetPos; public List m_Targets; public int m_TargetId; public int m_TaskId; private CommandMap m_Commands = new Dictionary(); public bool BindLinkCommand(TMP_Text pArea, string pName, LinkCommand pCmdType) { // pAres's name combined with input name to make the key if(pArea == null || string.IsNullOrEmpty(pName)) return false; string key=""; if(pArea) key = pArea.name; if(!string.IsNullOrEmpty(pName)) key += pName; bool isDuplicated = false; if(m_Commands.TryGetValue(key, out LinkCommand pTmp)) { m_Commands.Remove(key); isDuplicated = true; } if(pCmdType != null) { pTmp = pCmdType.Clone(); pTmp.m_pArea = pArea; pTmp.AppendText(); m_Commands[key] = pTmp; } return isDuplicated; } public LinkCommand GetLinkCommand(TMP_Text pArea, string pName) { if(pArea != null && !string.IsNullOrEmpty(pName)) { string key = pArea.name; key += pName; if(m_Commands.TryGetValue(key, out LinkCommand pTmp)) { return m_Commands[key]; } } if(pArea != null) { string key = pArea.name; if(m_Commands.TryGetValue(key, out LinkCommand pTmp)) { return m_Commands[key]; } } if(pName != null) { string key = pName; if(m_Commands.TryGetValue(key, out LinkCommand pTmp)) { return m_Commands[key]; } } return null; } public void ClearCommands() { foreach(var cmd in m_Commands) { cmd.Value.m_pArea = null; } m_Commands.Clear(); } public override void Release() { ClearCommands(); base.Release(); } } // command pattern for click a hyper link in textarea public abstract class LinkCommand { public TMP_Text m_pArea =null; public abstract bool Execute(TMP_Text pArea); public TMP_Text GetTxtArea() {return m_pArea;} public virtual void AppendText(){ m_pArea.text += GetLinkText(); } public abstract LinkCommand Clone(); public abstract string GetLinkText(); public LinkCommand(TMP_Text pArea) { m_pArea = pArea; } public LinkCommand() { m_pArea = null; } } // click this textarea will cause player move to the specific target public class MoveToLinkCommand : LinkCommand { public string m_TargetName; public A3DVECTOR3 m_TargetPos; public List m_Targets; public int m_TargetId; public int m_TaskId; public MoveToLinkCommand(int idTarget, string targetName, int idTask = 0){ m_TargetId = idTarget; m_TargetName = targetName; m_TaskId = idTask; m_TargetPos = new A3DVECTOR3(0, 0, 0); bool bInTable = false; m_TargetPos = EC_Game.GetGameRun().GetHostPlayer().GetObjectCoordinates( idTarget, ref m_Targets, ref bInTable); //todo: add map feature here. if(!bInTable && /*MAJOR_MAP*/1 == CECWorld.Instance.GetInstanceID()) { ATaskTemplMan pMan = EC_Game.GetTaskTemplateMan(); if(pMan.TryGetTaskNPCInfo((uint)idTarget, out NPC_INFO pInfo)) { m_TargetPos.Set(pInfo.x, pInfo.z, pInfo.y); } } } public MoveToLinkCommand(int idTarget, A3DVECTOR3 targetPos, string targetName, int idTask = 0){ m_TargetId = idTarget; m_TargetName = targetName; m_TaskId = idTask; m_TargetPos = targetPos; OBJECT_COORD coor = new OBJECT_COORD(); coor.vPos = m_TargetPos; m_Targets.Add(coor); } /// /// Get the first position from the targets list /// /// /// public MoveToLinkCommand(List targets, string targetName){ m_TargetName = targetName; m_Targets = targets; m_TargetPos = new A3DVECTOR3(0, 0, 0); m_TargetId = 0; m_TaskId = 0; if(targets.Count > 0) { m_TargetPos = m_Targets[0].vPos; } } public MoveToLinkCommand(MoveToLinkCommand rhs){ m_TargetId = rhs.m_TargetId; m_TargetName = rhs.m_TargetName; m_TaskId = rhs.m_TaskId; m_TargetPos = rhs.m_TargetPos; m_Targets = rhs.m_Targets; } public override string GetLinkText() { if(m_TargetPos.IsZero()) { return m_TargetName; } else { string szNameLink = string.Format("{0}", m_TargetName); return szNameLink; } } public override LinkCommand Clone() => new MoveToLinkCommand(this); public override bool Execute(TMP_Text pLink){ if (pLink) { if (!m_TargetPos.IsZero()) { // show the flag on worldmap DlgTask.SetTracePosition(m_Targets, m_TargetName); return true; } else { Debug.LogError("MoveToLinkCommand: Invalid target position"); //EC_Game.GetGameRun().AddFixedMessage(FIXMSG_ERR_FC_INVALID_OPERATION); } } return false; } } ////////////////////////////////////////////////////////////////////////// // TaskNameHoverCommand ////////////////////////////////////////////////////////////////////////// // ����ȷ������������ĸ������� public class TaskNameHoverCommand : LinkCommand { public StringRef m_Buffer; public string m_TaskName; public bool m_bError; public int m_iTaskID; public bool m_bCanContributionFinish; public TaskNameHoverCommand(StringRef buffer, string strName, int task_id, bool bError, bool bCanContributionFinish) { m_Buffer = buffer; m_TaskName = strName; m_iTaskID = task_id; m_bError = bError; m_bCanContributionFinish = bCanContributionFinish; } public TaskNameHoverCommand(TaskNameHoverCommand rhs) { m_Buffer = rhs.m_Buffer; m_TaskName = rhs.m_TaskName; m_iTaskID = rhs.m_iTaskID; m_bError = rhs.m_bError; m_bCanContributionFinish = rhs.m_bCanContributionFinish; } public override string GetLinkText() { string szNameLink = string.Format("{0}", m_TaskName);//red if (m_bError) szNameLink = string.Format("{0}", m_TaskName);//red else szNameLink = string.Format("{0}", m_TaskName);//yellow return szNameLink; } public override void AppendText() { m_Buffer.Value += GetLinkText(); } public override LinkCommand Clone() { return new TaskNameHoverCommand(this); } public override bool Execute(TMP_Text pLink) { return true; } } }