using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using Util; public class PlayerManager : MonoBehaviour { public static PlayerManager Instance { get; private set; } private List players; private Dictionary VoiceIDDict = new Dictionary(); private void Awake() { Instance = this; } // Start is called before the first frame update void Start() { players = new List(); } public Dictionary GetVoiceIDDictionary() => VoiceIDDict; public void ProcessUpdate(int entityId, float x, float y, float z, float rotationY, float lookAngle, int hitPoints, string name, float animX, float animZ, float magnitude, int flags, string forceAnim, string voiceID) { //Debug.Log("Entity update id " + entityId + ", x " + x + " y " + y + " z " + z + ", hitpoints: " + hitPoints.ToString()); if (entityId == Player.Instance.GetID()) { name = Misc.uppercaseFirst(name); Player.Instance.ProcessEntityUpdate(entityId, x, y, z, hitPoints, name, rotationY); return; } bool entityFound = false; foreach (PlayerEntity player in players) { if (player.GetID() == entityId) { entityFound = true; player.ProcessUpdateMessage(entityId, x, y, z, rotationY, lookAngle, name, animX, animZ, magnitude, flags, forceAnim); if(voiceID != "null" && !VoiceIDDict.ContainsKey(voiceID)) { player.SetVoiceID(voiceID); VoiceIDDict.Add(voiceID, player); } return; } } if (!entityFound) { //create new entity here CreatePlayer(entityId, name, voiceID); } } public void ProcessProjectileUpdate(int entityId, Vector3 direction, string projectile) { if (entityId == Player.Instance.GetID()) { return; } foreach (PlayerEntity player in players) { if (player.GetID() == entityId) { StartCoroutine(player.processWeaponFire(direction, projectile)); } } } public void ProcessAppearenceUpdate(int entityId, string skinName, int weapon) { //Debug.Log("skin change " + entityId + " " + skin); //mainPlayer Debugger.Logger($"skinName from server: {skinName}"); skinName = CharacterPool.ServerToClientNameMap[skinName]; Debugger.Logger($"skinName re-worked: {skinName}"); if (entityId == Player.Instance.GetID()) { PlayerEntity playerEntity = Player.Instance.PlayerEntity; var skins = playerEntity.transform.Find("Skins"); PlayableCharacterSkin newSkin = null; try { newSkin = skins.Find(skinName).GetComponent(); if (playerEntity.CurrentlyEquippedSkin != newSkin && newSkin != null) { playerEntity.SetSkin(skinName); } Player.Instance.SetWeapon(weapon); } catch (Exception e) { Debugger.Logger(e.Message, Process.TrashHold); } return; } foreach (PlayerEntity player in players) { if (player.GetID() == entityId) { var skins = player.transform.Find("Skins"); PlayableCharacterSkin newSkin = skins.Find(skinName).GetComponent(); if (player.CurrentlyEquippedSkin != newSkin) { player.SetSkin(skinName); } player.setWeapon(weapon); } } } public bool TryGetPlayerFromVoiceID(string voiceID, out PlayerEntity playerEntity) { return VoiceIDDict.TryGetValue(voiceID, out playerEntity); } private void CreatePlayer(int id, string name, string voiceID) { GameObject playerPrefab = OnDemandLoader.Load("Prefabs/Player/Player"); GameObject playerObject = Instantiate(playerPrefab, Vector3.zero, Quaternion.identity); PlayerEntity player = playerObject.GetComponent(); // set ID of the entity player.SetID(id); player.name = $"Player_{name}_{id}"; players.Add(player); } public List GetPlayerList() { return players; } public void RemovePlayer(PlayerEntity player) { VoiceIDDict.Remove(player.GetVoiceID()); players.Remove(player); Destroy(player.gameObject); } public void RemovePlayerWithID(int uuid) { PlayerEntity player = GetPlayer(uuid); if (player != null) { RemovePlayer(player); } } public PlayerEntity GetPlayer(int uuid) { if (uuid == Client.Instance.playerId) { return Player.Instance.PlayerEntity; } else { foreach (PlayerEntity player in players) { if (player.GetID() == uuid) { return player; } } } return null; } }