Files
test/Assets/PerfectWorld/Scripts/Task/UI/DlgNameLink.cs
2026-04-16 17:04:44 +07:00

276 lines
8.7 KiB
C#

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<string, LinkCommand>;
[Serializable]
public class StringRef
{
public string Value;
}
public class DlgNameLink : AUIDialog
{
public string m_TargetName;
public Vector3 m_TargetPos;
public List<Vector3> m_Targets;
public int m_TargetId;
public int m_TaskId;
private CommandMap m_Commands = new Dictionary<string, LinkCommand>();
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<OBJECT_COORD> 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, out m_Targets, ref bInTable);
//todo: add map feature here.
if(!bInTable /*&& MAJOR_MAP== CECGameRun.Instance.GetWorld().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);
}
/// <summary>
/// Get the first position from the targets list
/// </summary>
/// <param name="targets"></param>
/// <param name="targetName"></param>
public MoveToLinkCommand(List<OBJECT_COORD> 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("<color=#FFA500><u>{0}</u></color>", m_TargetName);
return szNameLink;
}
}
public override LinkCommand Clone() => new MoveToLinkCommand(this);
public override bool Execute(TMP_Text pLink)
{
if (pLink)
{
// Prefer task+npc route first so FollowCoord(int id, int taskId) can apply debug teleport.
if (m_TargetId > 0 && m_TaskId > 0)
{
DlgTask.SetTraceNpc(m_TargetId, m_TaskId);
return true;
}
if (!m_TargetPos.IsZero())
{
// show the flag on worldmap
DlgTask.SetTracePosition(m_Targets, m_TargetName);
return true;
}
//EC_Game.GetGameRun().AddFixedMessage(FIXMSG_ERR_FC_INVALID_OPERATION);
return false;
}
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("<color=#FF0000>{0}", m_TaskName);//red
if (m_bError)
szNameLink = string.Format("<color=#FF0000>{0}", m_TaskName);//red
else
szNameLink = string.Format("<color=#FFFF00>{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;
}
}
}