using System;
using System.Collections;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using DG.Tweening;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
///
/// 公会基础界面
///
public class GuildBaseWin : UIBase
{
[SerializeField] Button guildBtn;
[SerializeField] Button guildHawkerBtn; //行商
[SerializeField] Text guildHawkerTimeText;
[SerializeField] Text guildHawkerInfo; //备货
[SerializeField] GuildEmblemCell emblemCell;
[SerializeField] Text guildNameText;
[SerializeField] Text guildMemberCountText;
[SerializeField] Button rankBtn;
[SerializeField] Button storeBtn;
[SerializeField] RichText talkInfoText;
[SerializeField] Button talkBtn;
[SerializeField] Button talkBtn1;
[SerializeField] Button requestBtn;
[SerializeField] ImageEx guildBattleLockImg;
[SerializeField] Text guildBattleTitleText;
[SerializeField] Button guildBattleBtn;
[SerializeField] Text guildBattleState;
[SerializeField] Image guildBattleStateImg;
[SerializeField] Text GuildBattleCountDownTime;
[SerializeField] ImageEx guildBattleImg;
[SerializeField] UIEffectPlayer guildBattleEffect;
[SerializeField] Color32 guildBattleState1;//未参战
[SerializeField] Color32 guildBattleState2;//对战失败
[SerializeField] Color32 guildBattleState3;//备战中
[SerializeField] Color32 guildBattleState4;//激战中
[SerializeField] Color32 guildBattleState5;//对战胜利
//NPC对话相关
[Header("行商必须放第一个")]
[SerializeField] HeroSkinModel[] funcNPCs;
[SerializeField] Transform[] talkRects;
[SerializeField] Text[] talkTexts;
//行商特殊处理
[SerializeField] Transform hawkerRect;
[SerializeField] Transform pos1;
[SerializeField] Transform pos2;
[SerializeField] UIHeroController hawkerModel;
protected override void InitComponent()
{
guildBtn.AddListener(() =>
{
UIManager.Instance.OpenWindow();
});
requestBtn.AddListener(() =>
{
UIManager.Instance.OpenWindow();
});
guildHawkerBtn.AddListener(OpenHawker);
storeBtn.AddListener(() =>
{
StoreModel.Instance.selectStoreFuncType = StoreFunc.Guild;
UIManager.Instance.OpenWindow();
});
rankBtn.AddListener(() =>
{
UIManager.Instance.OpenWindow();
});
guildBattleBtn.AddListener(() =>
{
if (!GuildAtkDefBatManager.Instance.IsOpen(true))
return;
UIManager.Instance.OpenWindow();
});
InitHawker();
talkBtn.AddListener(OnClickTalkButton);
talkBtn1.AddListener(OnClickTalkButton);
}
protected override void OnPreOpen()
{
if (PlayerDatas.Instance.fairyData.fairy == null)
return;
GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
GlobalTimeEvent.Instance.fiveSecondEvent += OnFiveSecondEvent;
ChatManager.Instance.OnUpdateTalkEvent += OnUpdateTalkEvent;
PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
GuildAtkDefBatManager.Instance.OnUpdateAtkDefBatInfoEvent += OnUpdateAtkDefBatInfoEvent;
Display();
}
protected override void OnPreClose()
{
GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
GlobalTimeEvent.Instance.fiveSecondEvent -= OnFiveSecondEvent;
ChatManager.Instance.OnUpdateTalkEvent -= OnUpdateTalkEvent;
PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
GuildAtkDefBatManager.Instance.OnUpdateAtkDefBatInfoEvent -= OnUpdateAtkDefBatInfoEvent;
}
private void OnUpdateAtkDefBatInfoEvent()
{
ShowGuildBattleInfo();
}
private void OnFuncStateChangeEvent(int funcId)
{
if (funcId == (int)FuncOpenEnum.GuildAtkDefBat)
ShowGuildBattleInfo();
}
void OnRefreshFairyInfo()
{
ShowGuildInfo();
}
private void OnUpdateTalkEvent(ChatChannel channel, TalkData data, bool isSendBullet)
{
if (channel != ChatChannel.Guild)
return;
ShowTalkInfo();
}
void Display()
{
ShowGuildInfo();
ShowHawkerTime();
ShowTalkInfo();
ShowGuildBattleInfo();
}
void OnSecondEvent()
{
ShowHawkerTime(true);
UpdateGuildBattleCountdown();
}
///
/// 刷新攻防战的当前状态及对应描边颜色
///
void ShowGuildBattleInfo()
{
bool isOpen = GuildAtkDefBatManager.Instance.IsOpen();
guildBattleLockImg.SetActive(!isOpen);
guildBattleTitleText.color = isOpen ? new Color32(222, 212, 200, 255) : UIHelper.GetUIColor(TextColType.Gray);
guildBattleStateImg.SetActive(isOpen);
guildBattleImg.SetActive(isOpen);
guildBattleEffect.SetActive(false);
if (!isOpen)
return;
// 状态标识:1-未参战, 2-备战中, 3-激战中, 4-胜利(休战中), 5-失败(休战中)
int displayState = GuildAtkDefBatManager.Instance.GetGuildBattleDisplayState();
switch (displayState)
{
case 1: // 未参战
guildBattleState.text = Language.Get("GuildAtkDefBat27");
guildBattleState.color = guildBattleState1;
break;
case 2: // 备战中
guildBattleState.text = Language.Get("GuildAtkDefBat25");
guildBattleState.color = guildBattleState3;
break;
case 3: // 激战中
guildBattleState.text = Language.Get("GuildAtkDefBat24");
guildBattleState.color = guildBattleState4;
guildBattleImg.SetActive(false);
guildBattleEffect.SetActive(true);
break;
case 4: // 胜利(休战中)
guildBattleState.text = Language.Get("GuildAtkDefBat23");
guildBattleState.color = guildBattleState5;
break;
case 5: // 失败(休战中)
guildBattleState.text = Language.Get("GuildAtkDefBat26");
guildBattleState.color = guildBattleState2;
break;
}
UpdateGuildBattleCountdown();
}
///
/// 刷新倒计时文本 (每秒调用), 仅备战期/激战期显示
///
void UpdateGuildBattleCountdown()
{
int state = GuildAtkDefBatManager.Instance.BatState;
bool show = state == 2 || state == 3;
GuildBattleCountDownTime.SetActive(show);
if (!show) return;
GuildBattleCountDownTime.text = GuildAtkDefBatManager.Instance.GetGetCountdownToCurrentPeriodEndString();
}
void ShowGuildInfo()
{
requestBtn.SetActive(PlayerDatas.Instance.fairyData.HasFairy && PlayerDatas.Instance.fairyData.IsCanFunc(LimitFunc.CanCall));
emblemCell.Display(PlayerDatas.Instance.fairyData.fairy.EmblemID, PlayerDatas.Instance.fairyData.fairy.EmblemWord, 0.8f);
guildNameText.text = PlayerDatas.Instance.fairyData.fairy.FamilyName;
var config = FamilyConfig.Get(PlayerDatas.Instance.fairyData.fairy.FamilyLV);
guildMemberCountText.text = PlayerDatas.Instance.fairyData.fairy.MemberCount + "/" + config.MemberMax;
}
void OpenHawker()
{
if (TimeUtility.GetToTheHourSeconds() > 0)
{
SysNotifyMgr.Instance.ShowTip("GuildSys17");
return;
}
UIManager.Instance.OpenWindow();
}
void ShowHawkerTime(bool modelPlay = false)
{
var toTenSeconds = TimeUtility.GetToTheHourSeconds();
if (toTenSeconds > 0)
{
guildHawkerTimeText.text = TimeUtility.SecondsToHMS(toTenSeconds);
guildHawkerInfo.SetActive(true);
var addStr = new string('.', (int)Time.time % 4);
guildHawkerInfo.text = Language.Get("Guild_72") + addStr;
if (modelPlay)
HawkerMove(false);
}
else
{
guildHawkerTimeText.text = TimeUtility.SecondsToHMS((int)(TimeUtility.GetTodayEndTime() - TimeUtility.ServerNow).TotalSeconds);
guildHawkerInfo.SetActive(false);
if (modelPlay)
HawkerMove(true);
}
}
void InitHawker()
{
if (FuncNPCManager.Instance.isHawkerStandBy)
{
hawkerRect.localPosition = pos1.localPosition;
}
else
{
hawkerRect.localPosition = pos2.localPosition;
}
// hawkerModel.PlayAnimation("zoulu", true);
}
//isShow true走出来,false走出去
void HawkerMove(bool isShow)
{
if (isShow == FuncNPCManager.Instance.isHawkerShowNow)
{
return;
}
FuncNPCManager.Instance.isHawkerShowNow = isShow;
hawkerModel.PlayAnimation("zoulu", true);
FuncNPCManager.Instance.isHawkerStandBy = false;
hawkerModel.transform.localScale = new Vector3(isShow ? Math.Abs(hawkerModel.transform.localScale.x) : -Math.Abs(hawkerModel.transform.localScale.x), hawkerModel.transform.localScale.y, hawkerModel.transform.localScale.z);
hawkerRect.DOLocalMove(isShow ? pos1.localPosition : pos2.localPosition, 1f).onComplete = () =>
{
hawkerModel.PlayAnimation("idle", true);
FuncNPCManager.Instance.isHawkerStandBy = isShow;
};
}
//NPC对话相关
void OnFiveSecondEvent()
{
var index = FuncNPCManager.Instance.GetRandomGuildNpcTalk();
if (index == -1)
{
return;
}
var talk = FuncNPCManager.Instance.GetGuildTalk(funcNPCs[index].heroSkinID);
if (talk != null)
{
talkTexts[index].text = Language.Get(talk);
talkRects[index].SetActive(true);
}
var npc = funcNPCs[index].GetModel();
npc.PlayAnimation("hanhua", true);
Talk(index).Forget();
}
async UniTask Talk(int index)
{
await UniTask.Delay(5000);
talkRects[index].SetActive(false);
var npc = funcNPCs[index].GetModel();
npc.PlayAnimation("idle", true);
}
public void OnClickTalkButton()
{
ChatManager.Instance.nowChatTab = ChatChannel.Guild;
ChatManager.Instance.nowChatChannel = ChatChannel.Guild;
UIManager.Instance.OpenWindow();
}
public string GetGuildChatAreaContent(TalkData talkData)
{
int type = ChatManager.Instance.GetTalkDataType(talkData);
if (type == 0)
{
return Language.Get("L1100", Language.Get("Chat13"), talkData.Content);
}
else if (type == 1)
{
return Language.Get("L1100", Language.Get("Chat13"), talkData.Content);
}
else
{
return Language.Get("L1100", talkData.Name, talkData.Content);
}
}
public Color32 GetGuildChatAreaColor(TalkData talkData)
{
int type = ChatManager.Instance.GetTalkDataType(talkData);
if (type == 2)
{
return ChatManager.Instance.areaMyColor;
}
else
{
return ChatManager.Instance.areaOtherColor;
}
}
List showTalkDatas = new List();
void ShowTalkInfo()
{
if (!ChatManager.Instance.TryGetTalkData(ChatChannel.Guild, out List datas) || datas.IsNullOrEmpty())
{
talkInfoText.text = string.Empty;
return;
}
showTalkDatas.Clear();
// 从后向前遍历,找到最后两条玩家消息(过滤掉系统消息和日期消息)
int count = 0;
for (int i = datas.Count - 1; i >= 0 && count < 2; i--)
{
TalkData data = datas[i];
// 只保留玩家消息:非系统消息且非日期消息
if (!data.isSystem && !data.isDate)
{
showTalkDatas.Insert(0, data); // 插入到列表开头以保持时间顺序
count++;
}
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < showTalkDatas.Count; i++)
{
TalkData data = showTalkDatas[i];
stringBuilder.Append(UIHelper.AppendColor(GetGuildChatAreaColor(data), GetGuildChatAreaContent(data)));
stringBuilder.AppendLine();
}
talkInfoText.text = stringBuilder.ToString();
}
}