using UnityEngine; using System.Collections.Generic; using Sfs2X.Core; using Sfs2X.Entities; using Sfs2X.Requests; using Sfs2X.Entities.Variables; public class PlazaRoomManager { #region Variable public GardenSmartFox GardenSmartFox; public User SelfUser; public Player SelfInstance; public Room CurrentPlazaRoom; public bool InPlazaRoom { get { return CurrentPlazaRoom != null; } } public bool IsBlackMaskFinish; public RequestStatus JoinRoomStatus; public Dictionary UserInstanceDictionary = new Dictionary(); #endregion public void OnEnterPlazaButton() { IsBlackMaskFinish = false; ManaCenter.SceneSwitchLock = true; TweenRoot tweenRoot = ManaReso.Get("U_BlackMask").TweenBacCG(); tweenRoot.AddEventOnetime(EventType.BackwardFinish,() =>{IsBlackMaskFinish = true;TryEnterPlazaRoom();}); GardenSmartFox.ExecuteAfterCheckConection ( () => { GardenSmartFox.PlazaRoomManager.JoinRoomStatus = RequestStatus.Pending; GardenSmartFox.ExtensionManager.PlazaRoomExtension.JoinPlazaRoom(); }, (succeed, baseEvent) => { if (!succeed) { JoinRoomStatus = RequestStatus.Failed; TryEnterPlazaRoom(); } }, (succeed, baseEvent) => { if (!succeed) { JoinRoomStatus = RequestStatus.Failed; TryEnterPlazaRoom(); } else { GardenSmartFox.PlazaRoomManager.SyncClose(); } } ); } public void TryEnterPlazaRoom() { if (!IsBlackMaskFinish) { return; } if (GardenSmartFox.PlazaRoomManager.JoinRoomStatus == RequestStatus.Failed) { Bubble.Show(null, Language.GetStr("UI", "加入房间失败"), null, null, () => { ManaReso.Get("U_BlackMask").TweenForCG();},null,false); } else if (GardenSmartFox.PlazaRoomManager.JoinRoomStatus == RequestStatus.Succeed) { EnterPlazaRoom(); } } public void EnterPlazaRoom() { ManaReso.Get("U_BlackMask").TweenForCG(); ManaReso.SetActive("C_Main", false); ManaReso.SetActive("Garden", false); ManaReso.SetActive("PlazaRoom", true); } public void ExitPlazaRoom() { ManaCenter.SceneSwitchLock = false; TweenRoot tweenRoot = ManaReso.Get("U_BlackMask").TweenBacCG(); tweenRoot.AddEventOnetime ( EventType.BackwardFinish, () => { ManaReso.SetActive("C_Main", true); ManaReso.SetActive("Garden", true); ManaReso.SetActive("PlazaRoom", false); ManaReso.Get("U_BlackMask").TweenForCG(); foreach (var kv in UserInstanceDictionary) { ManaReso.Save(kv.Value); } UserInstanceDictionary = new Dictionary(); } ); } public PlazaRoomManager(GardenSmartFox gardenSmartFox) { GardenSmartFox = gardenSmartFox; GardenSmartFox.ExtensionManager.PlazaRoomExtension.onExitPlazaRoom += OnExitPlazaRoom; GardenSmartFox.ExtensionManager.PlazaRoomExtension.onJoinPlazaRoom += OnJoinPlazaRoom; GardenSmartFox.ExtensionManager.PlazaRoomExtension.onUserExitCurrentPlazaRoom += OnUserExitCurrentPlazaRoom; GardenSmartFox.ExtensionManager.PlazaRoomExtension.onUserEnterCurrentPlazaRoom += OnUserEnterCurrentPlazaRoom; GardenSmartFox.Connector.onConnectionLost += OnConectionLost; } public void Sync() { SyncCloseThread(); if (!InPlazaRoom) return; if (SelfInstance.transform.hasChanged) SyncTransform(); //if (CloseDirty) // SyncClose(); if (SelfInstance.DirectionDirty) SyncDirection(); KeepAliveThread(); } public void SyncDirection() { List userVariables = new List(); userVariables.Add(new SFSUserVariable("direction", $"{SelfInstance.PlayerDirection.ToString()}")); GardenSmartFox.SmartFox.Send(new SetUserVariablesRequest(userVariables)); SelfInstance.DirectionDirty = false; } public void SyncTransform() { List userVariables = new List(); userVariables.Add(new SFSUserVariable("transform", $"{SelfInstance.transform.position.x} {SelfInstance.transform.position.y} {SelfInstance.transform.position.z} {SelfInstance.transform.eulerAngles.x} {SelfInstance.transform.eulerAngles.y} {SelfInstance.transform.eulerAngles.z}")); GardenSmartFox.SmartFox.Send(new SetUserVariablesRequest(userVariables)); SelfInstance.transform.hasChanged = false; } public bool CloseDirty; public void SyncClose() { if (ManaPlayer.Player == null) return; List userVariables = new List(); userVariables.Add(new SFSUserVariable("dressData", $"{ManaPlayer.Player.Head} {ManaPlayer.Player.Dress} {ManaPlayer.Player.Shoe} {ManaPlayer.Player.HeadWear} {ManaPlayer.Player.Top} {ManaPlayer.Player.Eye} {ManaPlayer.Player.Mouse} {ManaPlayer.Player.Wing} {ManaPlayer.Player.LeftLongSleeve} {ManaPlayer.Player.LeftShortSleeve} {ManaPlayer.Player.RightLongSleeve} {ManaPlayer.Player.RightShortSleeve}")); GardenSmartFox.SmartFox.Send(new SetUserVariablesRequest(userVariables)); CloseDirty = false; } public float KeepAliveTime = 30; public float KeepAliveTimer; public void KeepAliveThread() { KeepAliveTimer += Time.deltaTime; if (KeepAliveTimer > KeepAliveTime) { KeepAliveTimer = 0; GardenSmartFox.ExtensionManager.BaseSFSExtension.SendRequest(Request.KeepAlive.GetHashCode()); } } public float SyncCloseTime = 10; public float SyncCloseTimer; public void SyncCloseThread() { SyncCloseTimer += Time.deltaTime; if (SyncCloseTimer > SyncCloseTime) { SyncCloseTimer = 0; GardenSmartFox.PlazaRoomManager.SyncClose(); } } public void ChangeUserClose(User user, List dressData) { ManaPlayer.BuildPlayer(dressData, UserInstanceDictionary[user]); } public void ChangeUserDirection(User user, PlayerDirection direction) { UserInstanceDictionary[user].Flip(direction); } public void ChangeUserTransform(User user, Vector3 position, Vector3 eulerAngles) { UserInstanceDictionary[user].transform.position = position; UserInstanceDictionary[user].transform.eulerAngles = eulerAngles; } public void OnConectionLost(BaseEvent baseEvent) { OnExitPlazaRoom(); } public void OnExitPlazaRoom() { CurrentPlazaRoom = null; ExitPlazaRoom(); } public void OnJoinPlazaRoom(Room room) { Debug.Log("succeed"); CurrentPlazaRoom = room; SelfUser = GardenSmartFox.User; SelfInstance = InstanciatePlayer(SelfUser); UserInstanceDictionary.Add(SelfUser, SelfInstance); for (int i = 0; i < CurrentPlazaRoom.UserList.Count; i++) { if (CurrentPlazaRoom.UserList[i] == SelfUser) { continue; } UserInstanceDictionary.Add(CurrentPlazaRoom.UserList[i], InstanciatePlayer(CurrentPlazaRoom.UserList[i])); } JoinRoomStatus = RequestStatus.Succeed; TryEnterPlazaRoom(); } public void OnUserExitCurrentPlazaRoom(User user) { ManaReso.Save(UserInstanceDictionary[user]); UserInstanceDictionary.Remove(user); } public void OnUserEnterCurrentPlazaRoom(User user) { UserInstanceDictionary.Add(user, InstanciatePlayer(user)); } public void OnUserVariablesUpdate(User user, List changeVars) { if (!user.IsItMe) { for (int i = 0; i < changeVars.Count; i++) { if (changeVars[i] == "transform") { Vector3[] vectors = (user.GetVariable(changeVars[i]).Value as string).StringToTransform(); Vector3 position = vectors[0]; Vector3 eulerAngles = vectors[1]; ChangeUserTransform(user, position, eulerAngles); } else if (changeVars[i] == "dressData") { List dressData = ManaData.GetDressData(user); ChangeUserClose(user, dressData); } else if (changeVars[i] == "direction") { PlayerDirection playerDirection = (user.GetVariable(changeVars[i]).Value as string).ToEnum(); ChangeUserDirection(user, playerDirection); } } } } public Player InstanciatePlayer(User user) { Vector3 position = ManaReso.Get("PlazaRoomDefaultPosition").position; Vector3 eulerAngles = new Vector3(); PlayerDirection playerDirection = PlayerDirection.Left; List dressData = new List(); if (user.ContainsVariable("transform")) { Vector3[] vectors = (user.GetVariable("transform").Value as string).StringToTransform(); position = vectors[0]; eulerAngles = vectors[1]; } if (user.ContainsVariable("direction")) { playerDirection = (user.GetVariable("direction").Value as string).ToEnum(); } dressData = ManaData.GetDressData(user); return InstanciatePlayer(position, eulerAngles, playerDirection, dressData); } public Player InstanciatePlayer(Vector3 position, Vector3 eulerAngles, PlayerDirection direction, List dressData) { Transform tra = ManaReso.Get("Player", Folder.Scene, false, ManaReso.Get("PlazaRoom"), position, ObjType.Player); Player player = tra.GetComponent(); if (player == null) { player = tra.AddScript(); player.Build(); } ManaPlayer.BuildPlayer(dressData, player); player.SetAllCollider(false); player.Flip(direction); tra.localScale = new Vector3(0.5f, 0.5f, 0.5f); return player; } }