Files
JJBB/Assets/Project/Script/GUI/Other/TargetFrameLogic.cs

490 lines
17 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using Games.GlobeDefine;
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using Games.LogicObj;
using System;
using GCGame;
using GCGame.Table;
using Games.ImpactModle;
public class TargetFrameLogic : MonoBehaviour {
private static TargetFrameLogic m_Instance = null;
public static TargetFrameLogic Instance()
{
return m_Instance;
}
public Text Level;
public Text Blood;
public Text m_TargetLevelText;
public Text m_TargetName;
public Text m_TargetType;
public Slider _HPSlider;
public Text m_TargetHPText;
public Slider _MPSlider;
public Text m_TargetMPText;
public Image m_TargetHeadSprite;
public GameObject m_BelongSprite;
public GameObject m_TargetTypeObj;
//保存目标的某些信息
private UInt64 m_TargetGuid = GlobeVar.INVALID_GUID;
public System.UInt64 TargetGuid
{
get { return m_TargetGuid; }
set { m_TargetGuid = value; }
}
private string m_strTargetName = "";
public string StrTargetName
{
get { return m_strTargetName; }
set { m_strTargetName = value; }
}
private int m_TargetServerID = GlobeVar.INVALID_ID;
public int TargetServerID
{
get { return m_TargetServerID; }
set { m_TargetServerID = value; }
}
public bool isShowThis = false;
public void OnEnable()
{
if (GameManager.gameManager.m_RunningScene == 658 && isShowThis == false )
{
this.gameObject.SetActive(false);
}
}
void Awake()
{
m_Instance = this;
Games.Events.EventDispatcher.Instance.Add(Games.Events.EventId.ChangeTarget, ChangeTarget);
Games.Events.EventDispatcher.Instance.Add(Games.Events.EventId.TargetMP, ChangeMP);
Games.Events.EventDispatcher.Instance.Add(Games.Events.EventId.TargetHP, ChangeHP);
Games.Events.EventDispatcher.Instance.Add(Games.Events.EventId.CancleTarget, CancelTarget);
Games.Events.EventDispatcher.Instance.Add(Games.Events.EventId.UpdateTargetBuff, UpdateBuffIcon);
Games.Events.EventDispatcher.Instance.Add(Games.Events.EventId.CreateTargetHealth, CreateShield);
Games.Events.EventDispatcher.Instance.Add(Games.Events.EventId.UpdateTargetHealth, UpdateShield);
Games.Events.EventDispatcher.Instance.Add(Games.Events.EventId.RemoveTargetHealth, RemoveShield);
ShieldOnAwake();
}
// Use this for initialization
void Start () {
HideTargetFrame();
m_TargetLevelText.text = "0";
m_TargetHPText.text = "0/0";
_HPSlider.value = 0;
_MPSlider.value = 0;
UpdateBuffIcon(TargetServerID);
}
// Update is called once per frame
void OnDestroy()
{
m_Instance = null;
Games.Events.EventDispatcher.Instance.Remove(Games.Events.EventId.ChangeTarget, ChangeTarget);
Games.Events.EventDispatcher.Instance.Remove(Games.Events.EventId.TargetMP, ChangeMP);
Games.Events.EventDispatcher.Instance.Remove(Games.Events.EventId.TargetHP, ChangeHP);
Games.Events.EventDispatcher.Instance.Remove(Games.Events.EventId.TargetLevel, ChangeLevel);
Games.Events.EventDispatcher.Instance.Remove(Games.Events.EventId.CancleTarget, CancelTarget);
Games.Events.EventDispatcher.Instance.Remove(Games.Events.EventId.UpdateTargetBuff, UpdateBuffIcon);
Games.Events.EventDispatcher.Instance.Remove(Games.Events.EventId.CreateTargetHealth, CreateShield);
Games.Events.EventDispatcher.Instance.Remove(Games.Events.EventId.UpdateTargetHealth, UpdateShield);
Games.Events.EventDispatcher.Instance.Remove(Games.Events.EventId.RemoveTargetHealth, RemoveShield);
}
/// <summary>
/// 切换目标
/// </summary>
/// <param name="targetObj">目标obj</param>
public void ChangeTarget(object obj)
{
if (Singleton<ObjManager>.Instance.MainPlayer == null)
return;
if (Singleton<ObjManager>.Instance.MainPlayer.targetId == null)
return;
Obj_Character character = Singleton<ObjManager>.Instance.FindObjCharacterInScene(Singleton<ObjManager>.Instance.MainPlayer.targetId.Value);
if (character == null)
return;
if ((m_TargetServerID != GlobeVar.INVALID_ID || (BossFramUI.Instance()!=null && BossFramUI.Instance().gameObject.activeSelf)) && character.ServerID == Singleton<ObjManager>.Instance.MainPlayer.ServerID)
return;
var roleTab = TableManager.GetRoleBaseAttrByID(character.BaseAttr.RoleBaseID, 0);
if (roleTab == null || roleTab.IsShowHeadIcon != 1 || roleTab.BossBloodShowTimes > 0)
{
HideTargetFrame();
m_TargetServerID = GlobeVar.INVALID_ID;
return;
}
if (roleTab.IsShowHeadIcon != 1 || roleTab.BossBloodShowTimes >= 1)
{
HideTargetFrame();
m_TargetServerID = GlobeVar.INVALID_ID;
return;
}
gameObject.SetActive(true);
m_TargetType.text = "";
m_TargetTypeObj.SetActive(true);
switch (roleTab.NpcType)
{
case 2:
case 5:
m_TargetType.text = "BOSS";
break;
case 3:
m_TargetType.text = Utils.GetDicByID(20156);
break;
case 4:
m_TargetType.text = "NPC";
break;
case 0:
case 1:
if (CharacterDefine.NPCTypeTable.ContainsKey(roleTab.Group))
m_TargetType.text = Utils.GetDicByID(CharacterDefine.NPCTypeTable[roleTab.Group]);
break;
}
m_TargetLevelText.text = character.BaseAttr.Level.ToString();
m_TargetHPText.text = Utils.ConvertLargeNumToString(character.BaseAttr.HP) + "/" +
Utils.ConvertLargeNumToString(character.BaseAttr.MaxHP);
if (character.BaseAttr.MaxHP > 0)
_HPSlider.value = character.BaseAttr.HP * 1.0f / character.BaseAttr.MaxHP;
else
_HPSlider.value = 0;
if (character.BaseAttr.MaxMP > 0)
_MPSlider.value = character.BaseAttr.MP * 1.0f / character.BaseAttr.MaxMP;
else
_MPSlider.value = 0;
m_TargetServerID = character.ServerID;
UpdateBuffIcon(character.ServerID);
var otherPlayer = character as Obj_OtherPlayer;
if (null != otherPlayer)
{
m_TargetGuid = otherPlayer.GUID;
if (!string.IsNullOrEmpty(otherPlayer.BaseAttr.RoleName))
{
char firstChar = otherPlayer.BaseAttr.RoleName[0];
if (firstChar == '#' && StrDictionary.IsServerDictionaryFormatString(otherPlayer.BaseAttr.RoleName))
{
otherPlayer.BaseAttr.RoleName = StrDictionary.GetServerDictionaryFormatString(otherPlayer.BaseAttr.RoleName);
}
}
m_strTargetName = otherPlayer.BaseAttr.RoleName;
}
else
{
m_TargetGuid = GlobeVar.INVALID_GUID;
m_strTargetName = "";
}
if(character.BaseAttr.Level <= 0 && roleTab != null)
{
m_TargetLevelText.text = roleTab.Level.ToString();
Level.text = roleTab.Level.ToString();
}
else
{
m_TargetLevelText.text = character.BaseAttr.Level.ToString();
Level.text = character.BaseAttr.Level.ToString();
}
SetTargetName(character);
Blood.text = character.BaseAttr.HP.ToString();
// 特殊处理护盾情况
var npc = character as Obj_NPC;
if (npc != null && npc.shieldData != null)
{
CreateShield(null);
UpdateShield(npc);
}
else
RemoveShield(character);
ChangeMP(character);
LoadAssetBundle.Instance.SetImageSprite(m_TargetHeadSprite,
otherPlayer != null ? Utils.GetProfessionSpriteName(otherPlayer.Profession) : character.BaseAttr.HeadPic);
}
public void ChangeMP(object obj)
{
Obj_Character targetObj = obj as Obj_Character;
if (targetObj == null || targetObj.ServerID != m_TargetServerID || gameObject.activeSelf==false)
return;
if (targetObj.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_MAIN_PLAYER ||
targetObj.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_OTHER_PLAYER ||
targetObj.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_ZOMBIE_PLAYER)
{
Obj_OtherPlayer _Player = targetObj as Obj_OtherPlayer;
if (_Player)
{
_MPSlider.gameObject.SetActive(true);
m_TargetMPText.gameObject.SetActive(true);
if (targetObj.BaseAttr.MaxMP > 0)
{
_MPSlider.value = (float)targetObj.BaseAttr.MP / (float)targetObj.BaseAttr.MaxMP;
}
else
{
_MPSlider.value = 0;
}
m_TargetMPText.text = Utils.ConvertLargeNumToString(targetObj.BaseAttr.MP) + "/" + Utils.ConvertLargeNumToString(targetObj.BaseAttr.MaxMP);
}
m_TargetTypeObj.SetActive(false);
}
else
{
_MPSlider.gameObject.SetActive(false);
m_TargetMPText.gameObject.SetActive(false);
}
}
public void ChangeLevel(object obj)
{
Obj_Character targetObj = obj as Obj_Character;
if (targetObj == null || targetObj.ServerID != m_TargetServerID || gameObject.activeSelf == false)
return;
Level.text = targetObj.BaseAttr.Level.ToString();
}
public void ChangeHP(object obj)
{
Obj_Character targetObj = obj as Obj_Character;
if (targetObj == null || targetObj.ServerID != m_TargetServerID || gameObject.activeSelf==false)
return;
if (!_healthAsShield)
{
m_TargetHPText.text = Utils.ConvertLargeNumToString(targetObj.BaseAttr.HP) + "/" +
Utils.ConvertLargeNumToString(targetObj.BaseAttr.MaxHP);
if (targetObj.BaseAttr.MaxHP > 0)
{
_HPSlider.value = (float) targetObj.BaseAttr.HP / (float) targetObj.BaseAttr.MaxHP;
}
else
{
_HPSlider.value = 0;
}
}
}
public void CancelTarget(object obj)
{
var serverId = (int) obj;
if (m_TargetServerID != GlobeVar.INVALID_ID && serverId != -1 && serverId != m_TargetServerID)
return;
if (gameObject.activeSelf)
HideTargetFrame();
m_TargetGuid = GlobeVar.INVALID_GUID;
m_TargetServerID = GlobeVar.INVALID_ID;
m_strTargetName = "";
m_TargetLevelText.text = "0";
m_TargetHPText.text = "0/0";
_HPSlider.value = 0;
_MPSlider.value = 0;
}
void ShowTargetFrame()
{
gameObject.SetActive(true);
}
void HideTargetFrame()
{
gameObject.SetActive(false);
}
public void OnClickTargetFrame()
{
//只有玩家可以弹出菜单所以发现guid非法则不弹
if (m_TargetGuid == GlobeVar.INVALID_GUID || m_strTargetName == "")
{
return;
}
Obj_Character targetObj = Singleton<ObjManager>.Instance.FindObjCharacterInScene(m_TargetServerID);
//特殊的:关宁不弹出玩家信息
if (GameManager.gameManager.RunningScene == (int)Games.GlobeDefine.GameDefine_Globe.SCENE_DEFINE.SCENE_GUANNING)
{
if(targetObj.BaseAttr.Force != GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Force)
return;
}
if (m_TargetGuid != Singleton<ObjManager>.Instance.MainPlayer.GUID)
{
PlayerTooltipsLogic.ShowPlayerTooltip(m_TargetGuid, m_strTargetName, targetObj.BaseAttr.HeadPic, targetObj.BaseAttr.Level, -1, targetObj.BaseAttr.CombatValue, Vector3.zero);
}
return;
}
void SetTargetName(Obj_Character targetObj)
{
if (GameManager.gameManager.RunningScene == (int)GameDefine_Globe.SCENE_DEFINE.SCENE_GUANNING)
{
if (targetObj.BaseAttr.Force == 6)
{
m_TargetName.text = (StrDictionary.GetClientDictionaryString("#{9210}"));
}
else if (targetObj.BaseAttr.Force == 7)
{
m_TargetName.text = (StrDictionary.GetClientDictionaryString("#{9211}"));
}
else
{
m_TargetName.text = targetObj.BaseAttr.RoleName;
}
}
else
{
m_TargetName.text = targetObj.BaseAttr.RoleName;
}
}
bool IsGuildBossNpc(Obj_Character targetObj)
{
if (targetObj.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_NPC)
{
Obj_NPC rNpc = targetObj as Obj_NPC;
if (rNpc != null)
{
return rNpc.IsGuildActivityBoss;
}
}
return false;
}
//目标BUFFIcon相关
public Image[] m_BuffShowIcon = new Image[(int)BUFFICON.MAX_BUFFICONUM];
public void OnClick_BuffIcon()
{
UIManager.ShowUI(UIInfo.ImpactInfoWnd, OnOpenSuccess);
}
public void OnOpenSuccess(bool success, object param)
{
Hashtable hash = new Hashtable();
hash.Add("targetId", m_TargetServerID);
Games.Events.EventDispatcher.Instance.SendMessage(Games.Events.EventId.OpenImpactInfoWndSuccess, hash);
}
//更新头像的BUFF位
public void UpdateBuffIcon(object obj)
{
if (gameObject.activeSelf == false)
return;
int TargetId = (int)obj;
if (TargetId != m_TargetServerID)
return;
Obj_Character targetObj = Singleton<ObjManager>.Instance.FindObjCharacterInScene(TargetId);
if (targetObj == null || targetObj.ClientImpactInfos == null)
return;
int nBuffShowIndex = 0;
for (int i = 0; i < targetObj.ClientImpactInfos.Count; ++i)
{
if (nBuffShowIndex >= m_BuffShowIcon.Length)
break;
m_BuffShowIcon[nBuffShowIndex].gameObject.SetActive(false);
if (targetObj.ClientImpactInfos[i].IsVaild())
{
Tab_Impact _tabImpact = TableManager.GetImpactByID(targetObj.ClientImpactInfos[i].ImpactId, 0);
if (_tabImpact != null)
{
if ( _tabImpact.BuffIcon != "-1" && _tabImpact.IsNeedNoticeClient==1)
{
if (nBuffShowIndex >= 0 && nBuffShowIndex < (int)BUFFICON.MAX_BUFFICONUM)
{
m_BuffShowIcon[nBuffShowIndex].gameObject.SetActive(true);
LoadAssetBundle.Instance.SetImageSprite(m_BuffShowIcon[nBuffShowIndex], _tabImpact.BuffIcon);
nBuffShowIndex++;
}
else
{
break;
}
}
}
}
}
for (int i = nBuffShowIndex; i < (int)BUFFICON.MAX_BUFFICONUM; i++)
{
m_BuffShowIcon[i].gameObject.SetActive(false);
}
}
#region
private Image _healthBar;
private Image _shieldBar;
private bool _healthAsShield;
private void ShieldOnAwake()
{
_healthBar = _HPSlider.fillRect.GetComponent<Image>();
_shieldBar = _HPSlider.fillRect.transform.GetChild(0).GetComponent<Image>();
_healthBar.enabled = true;
_shieldBar.enabled = false;
}
public void CreateShield(object obj)
{
Obj_NPC targetObj = obj as Obj_NPC;
if (targetObj == null || targetObj.ServerID != m_TargetServerID || targetObj.shieldData == null)
return;
if (!_healthAsShield)
{
_healthAsShield = true;
_healthBar.enabled = false;
_shieldBar.enabled = true;
_shieldBar.color = Utils.GetColorByString(StrDictionary.GetClientDictionaryString(GlobeVar.shieldColorKey));
m_TargetName.text = StrDictionary.GetClientDictionaryString(GlobeVar.shieldNameKey);
}
}
public void UpdateShield(object obj)
{
Obj_NPC targetObj = obj as Obj_NPC;
if (targetObj == null || targetObj.ServerID != m_TargetServerID || targetObj.shieldData == null)
return;
if (_healthAsShield)
{
m_TargetHPText.text = string.Format("{0}/{1}", Utils.ConvertLargeNumToString(targetObj.shieldData.health), Utils.ConvertLargeNumToString(targetObj.shieldData.maxHealth));
_HPSlider.value = (float)targetObj.shieldData.health / targetObj.shieldData.maxHealth;
}
}
public void RemoveShield(object obj)
{
Obj_NPC targetObj = obj as Obj_NPC;
if (targetObj == null || targetObj.ServerID != m_TargetServerID || targetObj.shieldData == null)
return;
if (_healthAsShield)
{
_healthAsShield = false;
_healthBar.enabled = true;
_shieldBar.enabled = false;
}
SetTargetName(targetObj);
ChangeHP(targetObj);
}
#endregion
}