// -------------------------------------------------------------------------------------------------------------------- // // Part of: Pun Cockpit // // developer@exitgames.com // -------------------------------------------------------------------------------------------------------------------- using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using Photon.Realtime; using Photon.Pun.UtilityScripts; using Hashtable = ExitGames.Client.Photon.Hashtable; namespace Photon.Pun.Demo.Cockpit { /// /// Controller for the Playerdetails UI view /// public class PlayerDetailsController : MonoBehaviourPunCallbacks { public GameObject ContentPanel; public PropertyCell PropertyCellPrototype; public Text UpdateStatusText; public Transform BuiltInPropertiesPanel; public Transform PlayerNumberingExtensionPanel; public Transform ScoreExtensionPanel; public Transform TeamExtensionPanel; public Transform TurnExtensionPanel; public Transform CustomPropertiesPanel; public GameObject MasterClientToolBar; public GameObject NotInRoomLabel; Dictionary builtInPropsCellList = new Dictionary(); Player _player; void Awake() { this.PropertyCellPrototype.gameObject.SetActive(false); } public override void OnEnable() { base.OnEnable(); // as this inherits from MonoBehaviourPunCallbacks, we need to call base UpdateStatusText.text = string.Empty; NotInRoomLabel.SetActive(false); PlayerNumbering.OnPlayerNumberingChanged += OnPlayerNumberingChanged; } public override void OnDisable() { base.OnDisable(); // as this inherits from MonoBehaviourPunCallbacks, we need to call base PlayerNumbering.OnPlayerNumberingChanged -= OnPlayerNumberingChanged; } public void SetPlayerTarget(Player player) { //Debug.Log("SetPlayerTarget " + player); this._player = player; ContentPanel.SetActive(true); NotInRoomLabel.SetActive(false); this.ResetList(); foreach (DictionaryEntry item in this.GetAllPlayerBuiltIntProperties()) { this.AddProperty(ParseKey(item.Key), item.Value.ToString(), this.BuiltInPropertiesPanel); } // PlayerNumbering extension this.AddProperty("Player Number", "#" + player.GetPlayerNumber().ToString("00"), this.PlayerNumberingExtensionPanel); // Score extension this.AddProperty(PunPlayerScores.PlayerScoreProp, player.GetScore().ToString(), this.ScoreExtensionPanel); foreach (DictionaryEntry item in _player.CustomProperties) { this.AddProperty(ParseKey(item.Key), item.Value.ToString(), this.CustomPropertiesPanel); } MasterClientToolBar.SetActive(PhotonNetwork.CurrentRoom.PlayerCount>1 && PhotonNetwork.LocalPlayer.IsMasterClient); } void AddProperty(string property, string value, Transform parent) { PropertyCell _cell = Instantiate(PropertyCellPrototype); builtInPropsCellList.Add(property, _cell); _cell.transform.SetParent(parent, false); _cell.gameObject.SetActive(true); _cell.AddToList(property, value, false); } string ParseKey(object key) { if (key.GetType() == typeof(byte)) { byte _byteKey = (byte)key; switch (_byteKey) { case (byte)255: return "PlayerName"; case (byte)254: return "Inactive"; case (byte)253: return "UserId"; } } return key.ToString(); } public void KickOutPlayer() { PhotonNetwork.CloseConnection(_player); } public void SetAsMaster() { PhotonNetwork.SetMasterClient(_player); } #region Photon CallBacks public override void OnPlayerLeftRoom(Player otherPlayer) { NotInRoomLabel.SetActive(otherPlayer == _player); ContentPanel.SetActive(otherPlayer != _player); } public override void OnMasterClientSwitched(Player newMasterClient) { MasterClientToolBar.SetActive(_player == newMasterClient); } public override void OnPlayerPropertiesUpdate(Player target, ExitGames.Client.Photon.Hashtable changedProps) { //Debug.Log("OnPlayerPropertiesUpdate " + target.ActorNumber + " " + target.ToStringFull() + " " + changedProps.ToStringFull()); //Debug.Log("_player.ID " + _player.ActorNumber); if (_player.ActorNumber == target.ActorNumber) { foreach (DictionaryEntry entry in changedProps) { string _key = this.ParseKey(entry.Key); if (this.builtInPropsCellList.ContainsKey(_key)) { this.builtInPropsCellList[_key].UpdateInfo(entry.Value.ToString()); } else { this.AddProperty(_key, entry.Value.ToString(), this.CustomPropertiesPanel); } } } StartCoroutine("UpdateUIPing"); } #endregion private void OnPlayerNumberingChanged() { if (_player != null) { // we might be called before player is setup this.builtInPropsCellList["Player Number"].UpdateInfo("#" + _player.GetPlayerNumber().ToString("00")); } } IEnumerator UpdateUIPing() { UpdateStatusText.text = "Updated"; yield return new WaitForSeconds(1f); UpdateStatusText.text = string.Empty; } public void ResetList() { foreach (KeyValuePair entry in builtInPropsCellList) { if (entry.Value != null) { Destroy(entry.Value.gameObject); } } builtInPropsCellList = new Dictionary(); } Hashtable GetAllPlayerBuiltIntProperties() { Hashtable allProps = new Hashtable(); if (_player != null) { allProps["ID"] = _player.ActorNumber; allProps[ActorProperties.UserId] = _player.UserId != null ? _player.UserId : string.Empty; allProps["NickName"] = _player.NickName != null ? _player.NickName : string.Empty; allProps["IsLocal"] = _player.IsLocal; allProps[ActorProperties.IsInactive] = _player.IsInactive; allProps["IsMasterClient"] = _player.IsMasterClient; } Debug.Log(allProps.ToStringFull()); return allProps; } } }