using UnityEngine; using System.Collections.Generic; using Sfs2X.Core; using Sfs2X.Entities; using Sfs2X.Requests; using Sfs2X.Entities.Variables; public class PlazaRoomManager { public class PlazaRoomPlayer { public Player Player; public List TweenRoots; public PlazaRoomPlayer(Player player) { Player = player; TweenRoots = new List(); } public void Save() { foreach (var tweenRoot in TweenRoots) { tweenRoot.Pause(); } ManaReso.Save(Player); } public float Speed = 1; public void MoveTo(Vector3 destination) { if (destination.Equal(Player.transform.position)) { return; } if (destination.x > Player.transform.position.x) { Player.Flip(PlayerDirection.Right); } else { Player.Flip(PlayerDirection.Left); } float duration = Mathf.Clamp(Vector3.Magnitude(destination - Player.transform.position) / 1.5f, 0.25f, 10f) / Speed; TweenRoot tweenRoot = Player.transform.CreateTweenVec3D(destination, duration, false, true, true, Curve.EaseOutQuad); tweenRoot.StartForward(); tweenRoot.AddEventOnetime(EventType.ForwardFinish, StopMove); TweenRoots.Add(tweenRoot); Player.PlayAnim(Player.WalkAnimationName); } public void StopMove() { Player.PlayAnim(Player.IdleAnimationName); } } #region Variable public GardenSmartFox GardenSmartFox; public User SelfUser; public PlazaRoomPlayer 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("V_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("V_BlackMask").TweenForCG();},null,false); } else if (GardenSmartFox.PlazaRoomManager.JoinRoomStatus == RequestStatus.Succeed) { EnterPlazaRoom(); } } public void EnterPlazaRoom() { GardenSmartFox.PlazaRoomManager.PlazaRoomCamera = ManaReso.Get("MainCamera"); GardenSmartFox.PlazaRoomManager.CameraOriginPosition = PlazaRoomCamera.transform.position; GardenSmartFox.PlazaRoomManager.CameraLeftBorder = ManaReso.Get("PlazaRoomCameraLeftBorder").position.x; GardenSmartFox.PlazaRoomManager.CameraRightBorder = ManaReso.Get("PlazaRoomCameraRightBorder").position.x; ManaReso.Get("V_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("V_BlackMask").TweenBacCG(); tweenRoot.AddEventOnetime ( EventType.BackwardFinish, () => { PlazaRoomCamera.transform.position = CameraOriginPosition; ManaReso.SetActive("C_Main", true); ManaReso.SetActive("Garden", true); ManaReso.SetActive("PlazaRoom", false); ManaReso.Get("V_BlackMask").TweenForCG(); foreach (var kv in UserInstanceDictionary) { kv.Value.Save(); } 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.Player.transform.hasChanged) SyncTransform(); //if (CloseDirty) // SyncClose(); if (SelfInstance.Player.DirectionDirty) SyncDirection(); if (SelfInstance.Player.AnimationDirty) SyncAnimation(); KeepAliveThread(); CameraControllThread(); } public void SyncDirection() { List userVariables = new List(); userVariables.Add(new SFSUserVariable("direction", $"{SelfInstance.Player.PlayerDirection.ToString()}")); GardenSmartFox.SmartFox.Send(new SetUserVariablesRequest(userVariables)); SelfInstance.Player.DirectionDirty = false; } public void SyncTransform() { List userVariables = new List(); userVariables.Add(new SFSUserVariable("transform", $"{SelfInstance.Player.transform.position.x} {SelfInstance.Player.transform.position.y} {SelfInstance.Player.transform.position.z} {SelfInstance.Player.transform.eulerAngles.x} {SelfInstance.Player.transform.eulerAngles.y} {SelfInstance.Player.transform.eulerAngles.z}")); GardenSmartFox.SmartFox.Send(new SetUserVariablesRequest(userVariables)); SelfInstance.Player.transform.hasChanged = false; } public void SyncAnimation() { List userVariables = new List(); userVariables.Add(new SFSUserVariable("animation", $"{SelfInstance.Player.CurrentAnimationName}")); GardenSmartFox.SmartFox.Send(new SetUserVariablesRequest(userVariables)); SelfInstance.Player.AnimationDirty = 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 float CameraLeftBorder; public float CameraRightBorder; public Vector3 CameraOriginPosition; public Camera PlazaRoomCamera; public void CameraControllThread() { if (PlazaRoomCamera == null) { return; } float x; if (SelfInstance.Player.transform.position.x <= CameraLeftBorder) { x = Mathf.Lerp(PlazaRoomCamera.transform.position.x, CameraLeftBorder, Time.deltaTime); } else if (SelfInstance.Player.transform.position.x >= CameraRightBorder) { x = Mathf.Lerp(PlazaRoomCamera.transform.position.x, CameraRightBorder, Time.deltaTime); } else { x = Mathf.Lerp(PlazaRoomCamera.transform.position.x, SelfInstance.Player.transform.position.x, Time.deltaTime); } PlazaRoomCamera.transform.SetX(x); } public void ChangeUserClose(User user, List dressData) { ManaPlayer.BuildPlayer(dressData, UserInstanceDictionary[user].Player); } public void ChangeUserDirection(User user, PlayerDirection direction) { UserInstanceDictionary[user].Player.Flip(direction); } public void ChangeUserTransform(User user, Vector3 position, Vector3 eulerAngles) { Player player = UserInstanceDictionary[user].Player; TweenRoot tweenPosition = player.CreateTweenVec3D(position, 0.1f, false, true, true, Curve.Linear); TweenRoot tweenEuler = player.CreateTweenEuler(eulerAngles, 0.1f, false, true, true, Curve.Linear); tweenPosition.StartForward(); tweenEuler.StartForward(); UserInstanceDictionary[user].TweenRoots.Add(tweenPosition); UserInstanceDictionary[user].TweenRoots.Add(tweenEuler); //UserInstanceDictionary[user].transform.position = position; //UserInstanceDictionary[user].transform.eulerAngles = eulerAngles; } public void ChangeUserAnimation(User user, string animationName) { UserInstanceDictionary[user].Player.PlayAnim(animationName); } public void OnConectionLost(BaseEvent baseEvent) { OnExitPlazaRoom(); } public void OnExitPlazaRoom() { CurrentPlazaRoom = null; ExitPlazaRoom(); } public void OnJoinPlazaRoom(Room room) { CurrentPlazaRoom = room; SelfUser = GardenSmartFox.User; Player selfPlayer = InstanciatePlayer(SelfUser); SelfInstance = new PlazaRoomPlayer(selfPlayer); UserInstanceDictionary.Add(SelfUser, SelfInstance); for (int i = 0; i < CurrentPlazaRoom.UserList.Count; i++) { if (CurrentPlazaRoom.UserList[i] == SelfUser) { continue; } UserInstanceDictionary.Add(CurrentPlazaRoom.UserList[i], new PlazaRoomPlayer(InstanciatePlayer(CurrentPlazaRoom.UserList[i]))); } JoinRoomStatus = RequestStatus.Succeed; TryEnterPlazaRoom(); } public void OnUserExitCurrentPlazaRoom(User user) { UserInstanceDictionary[user].Save(); UserInstanceDictionary.Remove(user); } public void OnUserEnterCurrentPlazaRoom(User user) { UserInstanceDictionary.Add(user, new PlazaRoomPlayer(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); } else if (changeVars[i] == "animation") { ChangeUserAnimation(user, user.GetVariable(changeVars[i]).Value as string); } } } } public Player InstanciatePlayer(User user) { string animationName = Player.IdleAnimationName; 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(); } if (user.ContainsVariable("animation")) { animationName = user.GetVariable("animation").Value as string; } dressData = ManaData.GetDressData(user); return InstanciatePlayer(position, eulerAngles, playerDirection, animationName, dressData); } public Player InstanciatePlayer(Vector3 position, Vector3 eulerAngles, PlayerDirection direction, string animationName, List dressData) { Transform tra = ManaReso.Get("Player", Folder.Scene, false, ManaReso.Get("PlazaRoom"), false, ObjType.Player); Player player = tra.GetComponent(); if (player == null) { player = tra.AddScript(); player.Build(); } ManaPlayer.BuildPlayer(dressData, player); player.SetAllCollider(false); player.Flip(direction); player.transform.position = position; player.PlayAnim(animationName); tra.localScale = new Vector3(0.5f, 0.5f, 0.5f); return player; } }