269 lines
8.5 KiB
C#
269 lines
8.5 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, 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);
|
|
}
|
|
|
|
/// <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=#00FF00><u>{0}</u></color><color=#FFFFFF>", 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("<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;
|
|
}
|
|
}
|
|
} |