615 lines
20 KiB
C#
615 lines
20 KiB
C#
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using GCGame.Table;
|
||
using Module.Log;
|
||
using System;
|
||
using Games.Scene;
|
||
using Games.LogicObj;
|
||
|
||
// 夺旗奖励结构
|
||
public class ScoreAward : IComparable<ScoreAward>
|
||
{
|
||
// 具体含义根据使用场景决定
|
||
public int minLimit; // 最底要求
|
||
public int maxLimit; // 最高要求
|
||
|
||
public List<AwardItemInfo> awards = new List<AwardItemInfo>();
|
||
|
||
public int CompareTo(ScoreAward other)
|
||
{
|
||
if(this.minLimit < other.minLimit)
|
||
{
|
||
return -1;
|
||
}
|
||
else if(this.minLimit > other.minLimit)
|
||
{
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 夺旗左上战况面板控制
|
||
// 字典配置
|
||
//5812 跨服据点_天_颜色 <color=#ff3e6b>
|
||
//5813 跨服据点_地_颜色 <color=#ff3e6b>
|
||
//5814 跨服据点_人_颜色 <color=#ff3e6b>
|
||
//5815 跨服据点_提示 击杀守卫怪后方能对据点进行攻击。
|
||
//5816 跨服据点_占领据点公告 {0}阵营的玩家{1}占领了{2}据点{3}!
|
||
//5817 跨服据点_击杀人数格式 (击杀{0}人)
|
||
//5818 跨服据点_分数增长格式 ({0}/分)
|
||
//5819 跨服据点_未上榜描述 未上榜
|
||
//5823 跨服据点_奖励排名格式_单 第 {0}名
|
||
//5824 跨服据点_奖励排名格式_多 第 {0}-{1}名
|
||
//5825 跨服据点_参与奖励 参与奖励
|
||
//5826 跨服据点_积分描述 {0}积分完成奖励
|
||
//5827 跨服据点_积分奖励完成描述 (可领取)
|
||
//5828 跨服据点_游戏倒计时 倒计时
|
||
//5829 跨服据点_离开倒计时 离开
|
||
//5830 跨服据点_自身排行榜描述 我的排名
|
||
//5831 跨服据点_据点积分描述 据点积分
|
||
//5832 跨服据点_阵营据点数格式({0}个)
|
||
//5833 跨服据点_阵营 中立
|
||
//5834 跨服据点_阵营 天
|
||
//5835 跨服据点_阵营 地
|
||
//5836 跨服据点_阵营 人
|
||
public class CaptureFlagStatePanelCtr : MonoBehaviour {
|
||
|
||
public static int GetCurCamp()
|
||
{
|
||
switch (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Force)
|
||
{
|
||
case 6:
|
||
{
|
||
return 1;
|
||
}
|
||
case 7:
|
||
{
|
||
return 2;
|
||
}
|
||
case 27:
|
||
{
|
||
return 3;
|
||
}
|
||
default:
|
||
return -1;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
public delegate void voidVector2Del(Vector2 data);
|
||
|
||
private static CaptureFlagStatePanelCtr instance;
|
||
public static CaptureFlagStatePanelCtr Instance
|
||
{
|
||
get { return instance; }
|
||
}
|
||
|
||
public GameObject flagPanel; // 旗面板
|
||
public GameObject RankPanel; // 奖励/排行榜面板
|
||
|
||
public UIContainerBase CaptureFlag;
|
||
public UIContainerBase ranks; // 排行榜
|
||
public UIContainerBase awards; // 积分奖励
|
||
public Text awardDesc; // 奖励
|
||
public Text rankTitle; // 排行榜
|
||
public Text rankNum; // 排行榜名次
|
||
public Text killNum; // 击杀人数
|
||
public Text scoreTitle; // 积分
|
||
public Text scoreNum; // 积分数量
|
||
public Text scoreNum1; // 积分数量
|
||
public Text scoreDelta; // 积分增长速度
|
||
|
||
public Text scoreAwardLevel;
|
||
|
||
public Button hideBtn;
|
||
public Toggle flagsStateBtn;
|
||
public Toggle rankBtn;
|
||
public Button awardDisplayBtn;
|
||
public Button ruleBtn;
|
||
public Button exitBtn;
|
||
public GameObject countDownCtr;
|
||
public Text countDownDesc;
|
||
public TimeDownText countDownt;
|
||
public float calculateDelta; // 计算积分计算间隔
|
||
private Coroutine countDownC;
|
||
|
||
public Animator panelAnimator;
|
||
|
||
public List<ScoreAward> killAwards = new List<ScoreAward>(); // 击杀奖励
|
||
public List<ScoreAward> joinAwards = new List<ScoreAward>(); // 参与奖励
|
||
private List<ScoreAward> scoreAwards = new List<ScoreAward>(); // 积分奖励
|
||
public Text[] captureFlagText; // 各阵营占领数文字
|
||
Dictionary<int, List<int>> _CaptureFalgDic = new Dictionary<int, List<int>>();
|
||
private int currentScore = 0; // 当前积分
|
||
private List<CaptureFlagRankData> rankDatas = new List<CaptureFlagRankData>();
|
||
|
||
// 夺旗排行榜数据结构
|
||
public class CaptureFlagRankData
|
||
{
|
||
public int rank;
|
||
public CrossSerFlagRankInfo packInfo;
|
||
}
|
||
|
||
private List<CaptureFlagItem.CaptureFlagData> _captureFlagItems = new List<CaptureFlagItem.CaptureFlagData>();
|
||
|
||
private void Awake()
|
||
{
|
||
if(instance == null)
|
||
{
|
||
instance = this;
|
||
Init();
|
||
}
|
||
}
|
||
|
||
private void Init()
|
||
{
|
||
_captureFlagItems.Clear();
|
||
var tabs = TableManager.GetCrossSerFlagPoint().Values;
|
||
foreach(var kv in tabs)
|
||
{
|
||
if(kv != null)
|
||
{
|
||
CaptureFlagItem.CaptureFlagData captureFlagData = new CaptureFlagItem.CaptureFlagData();
|
||
captureFlagData.tabCrossSerFlagPoint = kv;
|
||
captureFlagData.State = 0;
|
||
captureFlagData.CampIndex = 0;
|
||
captureFlagData.CDTime = -1;
|
||
_captureFlagItems.Add(captureFlagData);
|
||
}
|
||
}
|
||
CaptureFlag.InitContentItem(_captureFlagItems, OnFlagClick);
|
||
flagsStateBtn.onValueChanged.AddListener(OnFlagsStateBtnClick);
|
||
rankBtn.onValueChanged.AddListener(OnRankBtnClick);
|
||
awardDisplayBtn.onClick.AddListener(OnAwardDisplayBtnClick);
|
||
ruleBtn.onClick.AddListener(OnRuleBtnClick);
|
||
exitBtn.onClick.AddListener(OnExitBtnClick);
|
||
hideBtn.onClick.AddListener(OnAnimBtnClick);
|
||
|
||
// 初始显示阵营分布
|
||
OnFlagsStateBtnClick(true);
|
||
|
||
InitAward();
|
||
_CaptureFalgDic = new Dictionary<int, List<int>>();
|
||
UpdateCampFlagCount();
|
||
|
||
panelAnimator.Play("Show");
|
||
GCGame.Utils.HideMainTopRightUI();
|
||
}
|
||
|
||
private void InitAward()
|
||
{
|
||
scoreAwards.Clear();
|
||
joinAwards.Clear();
|
||
killAwards.Clear();
|
||
|
||
// 初始化奖励
|
||
var tabAward = TableManager.GetCrossSerFlagAward().Values;
|
||
foreach (var tempTab in tabAward)
|
||
{
|
||
ScoreAward newOne = new ScoreAward();
|
||
newOne.minLimit = tempTab.LimitMin;
|
||
newOne.maxLimit = tempTab.LimitMax;
|
||
int awardCount = tempTab.getItemIDCount();
|
||
for (int i = 0; i < awardCount; ++i)
|
||
{
|
||
if (tempTab.GetItemIDbyIndex(i) > 0)
|
||
{
|
||
AwardItemInfo newAward = new AwardItemInfo();
|
||
newAward.itemid = tempTab.GetItemIDbyIndex(i);
|
||
newAward.count = tempTab.GetItemNumbyIndex(i);
|
||
newAward.bind = tempTab.GetItemBindbyIndex(i) == 1 ? true : false;
|
||
newOne.awards.Add(newAward);
|
||
}
|
||
else
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
switch (tempTab.Type)
|
||
{
|
||
case 0:
|
||
joinAwards.Add(newOne);
|
||
break;
|
||
case 1:
|
||
scoreAwards.Add(newOne);
|
||
break;
|
||
case 2:
|
||
killAwards.Add(newOne);
|
||
break;
|
||
}
|
||
}
|
||
|
||
joinAwards.Sort();
|
||
scoreAwards.Sort();
|
||
killAwards.Sort();
|
||
|
||
rankTitle.gameObject.SetActive(true);
|
||
SetText(rankTitle, StrDictionary.GetClientDictionaryString("#{5830}"));
|
||
scoreTitle.gameObject.SetActive(true);
|
||
SetText(scoreTitle, StrDictionary.GetClientDictionaryString("#{5831}"));
|
||
}
|
||
|
||
private void OnFlagsStateBtnClick(bool isOn)
|
||
{
|
||
if (!isOn)
|
||
return;
|
||
flagPanel.SetActive(true);
|
||
RankPanel.SetActive(false);
|
||
}
|
||
|
||
private void OnRankBtnClick(bool isOn)
|
||
{
|
||
if (!isOn)
|
||
return;
|
||
flagPanel.SetActive(false);
|
||
RankPanel.SetActive(true);
|
||
}
|
||
|
||
private void OnAwardDisplayBtnClick()
|
||
{
|
||
UIManager.ShowUI(UIInfo.CaptureFlagAwardPanel);
|
||
}
|
||
|
||
public void OnRuleBtnClick()
|
||
{
|
||
MessageHelpLogic.ShowHelpMessage(61);
|
||
}
|
||
|
||
public void OnExitBtnClick()
|
||
{
|
||
if (Singleton<ObjManager>.Instance.MainPlayer != null)
|
||
{
|
||
Singleton<ObjManager>.Instance.MainPlayer.AskLeaveCopy();
|
||
}
|
||
}
|
||
|
||
public void OnAnimBtnClick()
|
||
{
|
||
var state = panelAnimator.GetCurrentAnimatorStateInfo(0);
|
||
if (state.IsName("Show"))
|
||
{
|
||
panelAnimator.Play("Hide");
|
||
}
|
||
else
|
||
{
|
||
panelAnimator.Play("Show");
|
||
}
|
||
}
|
||
|
||
private void OnFlagClick(object obj)
|
||
{
|
||
CaptureFlagItem.CaptureFlagData captureFlagData = obj as CaptureFlagItem.CaptureFlagData;
|
||
if (captureFlagData == null)
|
||
return;
|
||
|
||
Vector3 targetPos = new Vector3();
|
||
targetPos.x = captureFlagData.tabCrossSerFlagPoint.BornPosX;
|
||
targetPos.z = captureFlagData.tabCrossSerFlagPoint.BornPosZ;
|
||
var point = new AutoSearchPoint(GameManager.gameManager.RunningScene, targetPos.x, targetPos.z);
|
||
if (GameManager.gameManager && GameManager.gameManager.AutoSearch)
|
||
{
|
||
GameManager.gameManager.AutoSearch.BuildPath(point);
|
||
if (null != GameManager.gameManager.AutoSearch.Path)
|
||
{
|
||
GameManager.gameManager.AutoSearch.Path.autoSearchRadius = 2;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
public void OnRecPacket(SynCrossSerFlagInfo datas)
|
||
{
|
||
if (datas.pointInfo.Count != 0)
|
||
{
|
||
UpdateCampFlagCount(datas);
|
||
if (_captureFlagItems.Count<=0)
|
||
Init();
|
||
for (int i = 0; i < datas.pointInfo.Count; ++i)
|
||
{
|
||
for(int j=0;j<_captureFlagItems.Count;j++)
|
||
{
|
||
if(_captureFlagItems[j].tabCrossSerFlagPoint.Id == datas.pointInfo[i].Index)
|
||
{
|
||
_captureFlagItems[j].CampIndex = datas.pointInfo[i].CampIndex;
|
||
_captureFlagItems[j].PointID = datas.pointInfo[i].PointID;
|
||
_captureFlagItems[j].GuardID = datas.pointInfo[i].GuardID;
|
||
_captureFlagItems[j].CDTime = datas.pointInfo[i].LastChangeCampTime;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
CaptureFlag.RefreshItems();
|
||
// 同步时间
|
||
switch (datas.timetype)
|
||
{
|
||
case -1:
|
||
/* do nothing */
|
||
break;
|
||
case 0:
|
||
countDownCtr.SetActive(true);
|
||
SetText(countDownDesc, StrDictionary.GetClientDictionaryString("#{5828}"));
|
||
countDownt.Init("",datas.time,timeFormat:TimeDownText.TimeFormat.english);
|
||
break;
|
||
case 1:
|
||
countDownCtr.SetActive(true);
|
||
SetText(countDownDesc, StrDictionary.GetClientDictionaryString("#{5829}"));
|
||
countDownt.Init("",datas.time, timeFormat: TimeDownText.TimeFormat.english);
|
||
break;
|
||
default:
|
||
countDownCtr.SetActive(false);
|
||
break;
|
||
}
|
||
|
||
int myRank = 0;
|
||
|
||
rankDatas.Clear();
|
||
if (datas.rankInfo.Count != 0)
|
||
{
|
||
for (int i = 0; i < datas.rankInfo.Count; ++i)
|
||
{
|
||
CaptureFlagRankData rankItem = new CaptureFlagRankData();
|
||
rankItem.rank = i + 1;
|
||
rankItem.packInfo = datas.rankInfo[i];
|
||
|
||
if (datas.rankInfo[i].guid == (long)GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid)
|
||
{
|
||
myRank = i + 1;
|
||
}
|
||
|
||
rankDatas.Add(rankItem);
|
||
}
|
||
ranks.InitContentItem(rankDatas);
|
||
|
||
// 更新自身数据并刷新积分奖励
|
||
if (myRank > 0)
|
||
{
|
||
SetText(rankNum, myRank.ToString());
|
||
}
|
||
else
|
||
{
|
||
SetText(rankNum, StrDictionary.GetClientDictionaryString("#{5819}"));
|
||
}
|
||
}
|
||
|
||
SetText(killNum, StrDictionary.GetClientDictionaryString("#{5817}", datas.killnum.ToString()));
|
||
SetText(scoreNum, datas.score.ToString());
|
||
SetText(scoreNum1,datas.score.ToString());
|
||
|
||
int foundIndex = -1;
|
||
// 永远显示后一档奖励,当前没找到后一档奖励,则显示 "可领取"
|
||
if (datas.score > currentScore)
|
||
{
|
||
for(int i = 0; i < scoreAwards.Count; ++i)
|
||
{
|
||
if(datas.score < scoreAwards[i].minLimit)
|
||
{
|
||
foundIndex = i;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if(foundIndex == -1)
|
||
{
|
||
int maxIndex = scoreAwards.Count - 1;
|
||
awards.InitContentItem(scoreAwards[maxIndex].awards);
|
||
// 显示可领取
|
||
SetText(awardDesc, StrDictionary.GetClientDictionaryString("#{5826}", scoreAwards[maxIndex].minLimit) + StrDictionary.GetClientDictionaryString("#{5827}"));
|
||
scoreAwardLevel.text = StrDictionary.GetClientDictionaryString("#{59016}");
|
||
}
|
||
else
|
||
{
|
||
awards.InitContentItem(scoreAwards[foundIndex].awards);
|
||
SetText(awardDesc, StrDictionary.GetClientDictionaryString("#{5826}", scoreAwards[foundIndex].minLimit));
|
||
scoreAwardLevel.text = StrDictionary.GetClientDictionaryString("#{5844}", scoreAwards[foundIndex].minLimit);
|
||
}
|
||
|
||
CalculateScoreDelta(datas);
|
||
}
|
||
|
||
private void OnEnable()
|
||
{
|
||
SetCampMark();
|
||
}
|
||
|
||
public void SetCampMark()
|
||
{
|
||
CaptureFlag.RefreshItems();
|
||
}
|
||
|
||
private void CalculateScoreDelta(SynCrossSerFlagInfo datas)
|
||
{
|
||
if(!_CaptureFalgDic.ContainsKey(GetCurCamp()))
|
||
{
|
||
SetText(scoreDelta, "0");
|
||
return;
|
||
}
|
||
|
||
var totalAddScore = 0;
|
||
for(int index = 0; index < _CaptureFalgDic[GetCurCamp()].Count; index++)
|
||
{
|
||
var tab = TableManager.GetCrossSerFlagPointByID(_CaptureFalgDic[GetCurCamp()][index], 0);
|
||
if (tab != null)
|
||
{
|
||
totalAddScore += 60 / tab.AddScoreTime * tab.AddScore;
|
||
}
|
||
}
|
||
|
||
string resultStr = StrDictionary.GetClientDictionaryString("#{5818}", totalAddScore);
|
||
SetText(scoreDelta, resultStr);
|
||
}
|
||
|
||
private void UpdateCampFlagCount(SynCrossSerFlagInfo info = null)
|
||
{
|
||
if (info != null)
|
||
{
|
||
//变化的全部删除
|
||
for(int index = 0; index < info.pointInfo.Count; index++)
|
||
{
|
||
foreach(var flagInfo in _CaptureFalgDic)
|
||
{
|
||
if (flagInfo.Value.Contains(info.pointInfo[index].Index))
|
||
flagInfo.Value.Remove(info.pointInfo[index].Index);
|
||
}
|
||
}
|
||
|
||
//重新添加变化后的数据
|
||
for (int index = 0; index < info.pointInfo.Count; ++index)
|
||
{
|
||
if (_CaptureFalgDic.ContainsKey(info.pointInfo[index].CampIndex))
|
||
{
|
||
if (!_CaptureFalgDic[info.pointInfo[index].CampIndex].Contains(info.pointInfo[index].Index))
|
||
_CaptureFalgDic[info.pointInfo[index].CampIndex].Add(info.pointInfo[index].Index);
|
||
}
|
||
else
|
||
{
|
||
List<int> indexList = new List<int>();
|
||
indexList.Add(info.pointInfo[index].Index);
|
||
_CaptureFalgDic.Add(info.pointInfo[index].CampIndex, indexList);
|
||
}
|
||
}
|
||
}
|
||
|
||
var totalCount = 0;
|
||
foreach (var flag in _CaptureFalgDic)
|
||
{
|
||
totalCount += flag.Value.Count;
|
||
}
|
||
|
||
if(totalCount > 15)
|
||
foreach (var flag in _CaptureFalgDic)
|
||
{
|
||
Debug.LogError("CampIndex : " + flag.Key);
|
||
string _All = "";
|
||
for(int index = 0; index < flag.Value.Count; index++)
|
||
{
|
||
_All += flag.Value[index] + "\t";
|
||
}
|
||
Debug.LogError("Index : " + _All);
|
||
}
|
||
|
||
}
|
||
|
||
private void OnDestroy()
|
||
{
|
||
if(instance != null)
|
||
{
|
||
instance = null;
|
||
}
|
||
}
|
||
|
||
private void SetText(Text text, string info)
|
||
{
|
||
if(text.text.Equals(info))
|
||
{
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
text.text = info;
|
||
}
|
||
}
|
||
|
||
// 与服务器一致的规则,通过索引获得阵营名称
|
||
public static string GetCampNameByIndex(int campIndex)
|
||
{
|
||
string campName = "";
|
||
switch (campIndex)
|
||
{
|
||
case 0:
|
||
campName = StrDictionary.GetClientDictionaryString("#{5833}");
|
||
break;
|
||
case 1:
|
||
campName = StrDictionary.GetClientDictionaryString("#{5834}");
|
||
break;
|
||
case 2:
|
||
campName = StrDictionary.GetClientDictionaryString("#{5835}");
|
||
break;
|
||
case 3:
|
||
campName = StrDictionary.GetClientDictionaryString("#{5836}");
|
||
break;
|
||
}
|
||
|
||
if(string.IsNullOrEmpty(campName))
|
||
{
|
||
LogModule.ErrorLog("Can't get camp name with index : " + campIndex);
|
||
}
|
||
|
||
return campName;
|
||
}
|
||
|
||
// 通过阵营索引获得对应玩家真实的势力值
|
||
public static int GetWarForceByIndex()
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
// 通过阵营索引获得阵营名称
|
||
public static string GetSpriteNameByCamp(int campIndex, bool isBigFlag)
|
||
{
|
||
string spriteName = "";
|
||
switch(campIndex)
|
||
{
|
||
case 0:
|
||
spriteName = "zhong";
|
||
break;
|
||
case 1:
|
||
spriteName = "tian";
|
||
break;
|
||
case 2:
|
||
spriteName = "di";
|
||
break;
|
||
case 3:
|
||
spriteName = "ren";
|
||
break;
|
||
}
|
||
|
||
if(string.IsNullOrEmpty(spriteName))
|
||
{
|
||
LogModule.ErrorLog("Can't find sprite name by index:" + campIndex);
|
||
}
|
||
else if (isBigFlag && campIndex != 0)
|
||
{
|
||
spriteName += "Big";
|
||
}
|
||
|
||
return spriteName;
|
||
}
|
||
|
||
public void OnNpcObjBeAttacked(Obj_Character npc)
|
||
{
|
||
var tab = TableManager.GetCrossSerFlagConfigByID(0);
|
||
|
||
for(int i=0;i<_captureFlagItems.Count;i++)
|
||
{
|
||
if(_captureFlagItems[i].PointID == npc.ServerID)
|
||
{
|
||
for (int j = 0; j < npc.ClientImpactInfos.Count; ++j)
|
||
{
|
||
if (npc.ClientImpactInfos[j].ImpactId == tab.BuffID)
|
||
{
|
||
GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{5838}"));
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (_captureFlagItems[i].GuardID != -1)
|
||
{
|
||
GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{5815}"));
|
||
}
|
||
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
}
|