Files
JJBB/Assets/Project/Script/GUI/Other/TargetFrameLogic.cs
2024-08-23 15:49:34 +08:00

490 lines
17 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}