PlazaRoomController.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. using System;
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using LitJson;
  6. using Sfs2X.Core;
  7. using Sfs2X.Entities;
  8. using Sfs2X.Entities.Data;
  9. using Sfs2X.Requests;
  10. using Sfs2X.Entities.Variables;
  11. using UnityEngine.UI;
  12. using Random = UnityEngine.Random;
  13. public enum JoinRoomResult
  14. {
  15. RoomFullError = 0,
  16. RoomExpireError = 1,
  17. Unknown = 2,
  18. Succeed = 3,
  19. Pending = 4,
  20. }
  21. public class PlazaRoomController
  22. {
  23. private static int MinMessageFontSize = 12;
  24. private static int MaxMessageFontSize = 20;
  25. private static Vector3 PlazaRoomPlayerScale = new Vector3(0.525f, 0.525f, 0.525f);
  26. public class PlazaRoomPlayer
  27. {
  28. #region Config
  29. public string NickName;
  30. public string SerialNumber;
  31. public DateTime JoinedTime;
  32. public Player Player;
  33. public Transform NickNameTransform;
  34. public List<TweenRoot> TweenRoots;
  35. public BestfitText MessageLab;
  36. public Transform MessageBox;
  37. #endregion
  38. public PlazaRoomPlayer(Player player, string nickname, string serialNumber, DateTime joinedTime)
  39. {
  40. Player = player;
  41. SerialNumber = serialNumber;
  42. JoinedTime = joinedTime;
  43. TweenRoots = new List<TweenRoot>();
  44. NickNameTransform = ResourceManager.Get(ResourceLabel.NickName, Folder.UI, false, ResourceManager.Get(CanvasLabel.W_HudParent), false, ObjType.NickName);
  45. HudTarget hudTarget = NickNameTransform.GetComponent<HudTarget>();
  46. if (hudTarget == null)
  47. {
  48. hudTarget = NickNameTransform.AddComponent<HudTarget>();
  49. }
  50. hudTarget.PosTra = Player.ChildDic[PlayerLabel.NickName];
  51. hudTarget.SetPosition();
  52. NickName = string.IsNullOrEmpty(nickname) ? Language.GetStr(LanguageLabel.UI__Unnamed) : nickname;
  53. NickNameTransform.GetComponent<Text>().text = NickName;
  54. if (serialNumber != HttpManager.SerialNumber)
  55. {
  56. PlazaroomMemberPanel.AddMemberItem(nickname, serialNumber, joinedTime);
  57. }
  58. MessageBox = ResourceManager.Get(ResourceLabel.MessageBox, Folder.UI, false, ResourceManager.Get(CanvasLabel.W_HudParent), false, ObjType.MessageBox);
  59. MessageLab = MessageBox.GetComponentInChildren<BestfitText>();
  60. MessageLab.VerticalMinSize = MinMessageFontSize;
  61. MessageLab.VerticalMaxSize = MaxMessageFontSize;
  62. hudTarget = MessageBox.GetComponent<HudTarget>();
  63. if (hudTarget == null)
  64. {
  65. hudTarget = MessageBox.AddComponent<HudTarget>();
  66. }
  67. hudTarget.PosTra = Player.ChildDic[PlayerLabel.MessageBox];
  68. MessageBox.CreateTweenCG(0, 1, 0.25f, true, true, Curve.EaseOutQuad).InOrigin = true;
  69. }
  70. public void Save()
  71. {
  72. foreach (var tweenRoot in TweenRoots)
  73. {
  74. tweenRoot.Pause();
  75. }
  76. ResourceManager.Save(Player);
  77. ResourceManager.Save(NickNameTransform);
  78. ResourceManager.Save(MessageBox);
  79. if (SerialNumber != HttpManager.SerialNumber)
  80. {
  81. PlazaroomMemberPanel.SaveMemberItem(SerialNumber);
  82. }
  83. Player.PlayAnim(Player.IdleAnimationName);
  84. Player.DeactiveShadow();
  85. Player.Shadow.SetLZ(0);
  86. Player.ExpressionMeshFilter.transform.parent = Player.transform;
  87. }
  88. public bool IsMoving;
  89. public float Speed = 1f;
  90. public Vector3 Destination;
  91. public TweenVec MoveTween;
  92. public void MoveTo(Vector3 destination)
  93. {
  94. if (destination.Equal(Player.transform.position))
  95. {
  96. return;
  97. }
  98. if (destination.x > Player.transform.position.x)
  99. {
  100. Player.Flip(PlayerDirection.Right);
  101. }
  102. else
  103. {
  104. Player.Flip(PlayerDirection.Left);
  105. }
  106. float offsetX = Mathf.Abs(destination.x - Player.transform.position.x);
  107. float offsetY = Mathf.Abs(destination.y - Player.transform.position.y);
  108. float offset = Mathf.Sqrt(offsetX*offsetX + offsetY*offsetY);
  109. float duration = Mathf.Clamp(offset/1.5f, 0.25f, 100f)/Speed;
  110. MoveTween = Player.transform.CreateTweenVec3D(destination, duration, false, true, true, Curve.EaseOutQuad);
  111. MoveTween.StartForward();
  112. MoveTween.AddEventOnetime(EventType.ForwardFinish, StopMove);
  113. TweenRoots.Add(MoveTween);
  114. IsMoving = true;
  115. Destination = destination;
  116. Player.PlayAnim(Player.WalkAnimationName);
  117. }
  118. public void StopMove()
  119. {
  120. IsMoving = false;
  121. Player.PlayAnim(Player.IdleAnimationName);
  122. }
  123. public float MessgeTime = 3f;
  124. public Coroutine MessgeCoroutine;
  125. public void ShowMessage(Color color, string message)
  126. {
  127. if (MessgeCoroutine != null)
  128. {
  129. Auxiliary.Instance.StopCoroutine(MessgeCoroutine);
  130. }
  131. MessageLab.text = message;
  132. MessageLab.color = color;
  133. MessageBox.TweenForCG();
  134. MessgeCoroutine = Auxiliary.Instance.DelayCall(() => { MessageBox.TweenBacCG(); }, MessgeTime);
  135. }
  136. }
  137. #region Config
  138. public GardenSmartFox GardenSmartFox;
  139. public PlazaRoomPlayer SelfInstance;
  140. public Room CurrentPlazaRoom;
  141. public RoomData CurrentRoomData;
  142. public bool JoinedPlazaRoom
  143. {
  144. get { return CurrentPlazaRoom != null; }
  145. }
  146. public bool InPlazaRoom;
  147. public bool IsBlackMaskFinish;
  148. public JoinRoomResult JoinRoomResult = JoinRoomResult.Pending;
  149. public Dictionary<int, PlazaRoomPlayer> UserInstanceDictionary = new Dictionary<int, PlazaRoomPlayer>();
  150. #endregion
  151. private Coroutine JoinRoomCoroutine;
  152. public void BeginEnterPlazaRoom(RoomData roomData)
  153. {
  154. CurrentRoomData = roomData;
  155. IsBlackMaskFinish = false;
  156. JoinRoomResult = JoinRoomResult.Pending;
  157. AudioManager.GardenThemeAudio.TweenBacAudio();
  158. ResourceManager.Get(CanvasLabel.B_SignIn0).TweenBacCG();
  159. ResourceManager.Get(CanvasLabel.T_NickName).TweenBacCG();
  160. Manager.SceneSwitchFlag = true;
  161. TweenRoot tweenRoot = ResourceManager.Get(CanvasLabel.V_BlackMask).TweenBacCG();
  162. tweenRoot.AddEventOnetime
  163. (
  164. EventType.BackwardFinish, () =>
  165. {
  166. IsBlackMaskFinish = true;
  167. TryEnterPlazaRoom();
  168. }
  169. );
  170. GardenSmartFox.ExecuteAfterCheckConection
  171. (
  172. null,
  173. (succeed, baseEvent) =>
  174. {
  175. if (!succeed)
  176. {
  177. JoinRoomResult = JoinRoomResult.Unknown;
  178. TryEnterPlazaRoom();
  179. }
  180. },
  181. (succeed, baseEvent) =>
  182. {
  183. if (!succeed)
  184. {
  185. JoinRoomResult = JoinRoomResult.Unknown;
  186. TryEnterPlazaRoom();
  187. }
  188. }
  189. );
  190. JoinRoomCoroutine = DelayCall.Call(5f, () => { OnJoinPlazaRoomError(JoinRoomResult.Unknown); });
  191. }
  192. public void TryEnterPlazaRoom()
  193. {
  194. if (!GardenSmartFox.PlazaRoomController.IsBlackMaskFinish)
  195. return;
  196. if (JoinRoomResult == JoinRoomResult.Pending)
  197. return;
  198. if (JoinRoomResult == JoinRoomResult.Succeed)
  199. {
  200. EnterPlazaRoom();
  201. }
  202. else
  203. {
  204. QuitPlazaRoom();
  205. if (JoinRoomResult == JoinRoomResult.RoomFullError)
  206. {
  207. Bubble.Show(null, Language.GetStr(LanguageLabel.UI__Z_RoomFull), null, null, () => { ResourceManager.Get(CanvasLabel.V_BlackMask).TweenForCG(); AudioManager.GardenThemeAudio.TweenForAudio(); }, null, false);
  208. }
  209. else if (JoinRoomResult == JoinRoomResult.RoomExpireError)
  210. {
  211. Bubble.Show(null, Language.GetStr(LanguageLabel.UI__Z_RoomExpire), null, null, () => { ResourceManager.Get(CanvasLabel.V_BlackMask).TweenForCG(); AudioManager.GardenThemeAudio.TweenForAudio(); }, null, false);
  212. }
  213. else
  214. {
  215. Bubble.Show(null, Language.GetStr(LanguageLabel.UI__Z_Unknown), null, null, () => { ResourceManager.Get(CanvasLabel.V_BlackMask).TweenForCG(); AudioManager.GardenThemeAudio.TweenForAudio(); }, null, false);
  216. }
  217. }
  218. }
  219. private Vector3 PlayerDefaultPosition;
  220. public void EnterPlazaRoom()
  221. {
  222. GardenSmartFox.EventManager.PlazaRoomEvent.GetAllChestData(CurrentRoomData.ID);
  223. foreach (var kv in UserInstanceDictionary)
  224. {
  225. if (kv.Value.Player.transform.parent == null)
  226. {
  227. kv.Value.Player.transform.parent = ResourceManager.Get(PlazaRoomLabel.PlazaRoom);
  228. kv.Value.Player.transform.localScale = PlazaRoomPlayerScale;
  229. }
  230. }
  231. AudioManager.PartyThemeAudio.TweenForAudio();
  232. InPlazaRoom = true;
  233. PlazaRoomManager.CloseJoinRoomPanel();
  234. GardenManager.RetrieveAllElf();
  235. IAPManager.RetrieveADChest();
  236. GardenSmartFox.PlazaRoomController.PlazaRoomSky = ResourceManager.Get(PlazaRoomLabel.PlazaRoomSky);
  237. SkyOriginPosition = GardenSmartFox.PlazaRoomController.PlazaRoomSky.position;
  238. GardenSmartFox.PlazaRoomController.PlazaRoomCamera = ResourceManager.Get<Camera>(ResourceLabel.MainCamera);
  239. GardenSmartFox.PlazaRoomController.CameraOriginPosition = GardenSmartFox.PlazaRoomController.PlazaRoomCamera.transform.position;
  240. GardenSmartFox.PlazaRoomController.CameraLeftBorder = ResourceManager.Get(PlazaRoomLabel.PlazaRoomCameraLeftBorder).position.x;
  241. GardenSmartFox.PlazaRoomController.CameraRightBorder = ResourceManager.Get(PlazaRoomLabel.PlazaRoomCameraRightBorder).position.x;
  242. GardenSmartFox.PlazaRoomController.PlazaRoomCamera.transform.SetX(GardenSmartFox.PlazaRoomController.CameraLeftBorder);
  243. ResourceManager.Get(CanvasLabel.V_BlackMask).TweenForCG();
  244. ResourceManager.SetActive(CanvasLabel.C_Main2, false);
  245. ResourceManager.SetActive(ResourceLabel.Garden, false);
  246. ResourceManager.SetActive(PlazaRoomLabel.PlazaRoom, true);
  247. ResourceManager.SetActive(CanvasLabel.W_HudParent, true);
  248. ResourceManager.SetActive(CanvasLabel.X_PlazaRoom, true);
  249. }
  250. public bool ExitToVisitFlag;
  251. public string VisiteeSerialNumber;
  252. public void ExitPlazaRoom()
  253. {
  254. QuitPlazaRoom();
  255. AudioManager.PartyThemeAudio.TweenBacAudio();
  256. TweenRoot tweenRoot = ResourceManager.Get(CanvasLabel.V_BlackMask).TweenBacCG();
  257. tweenRoot.AddEventOnetime
  258. (
  259. EventType.BackwardFinish,
  260. () =>
  261. {
  262. ResetScene();
  263. }
  264. );
  265. if (ExitToVisitFlag)
  266. {
  267. tweenRoot.AddEventOnetime
  268. (
  269. EventType.BackwardFinish,
  270. () =>
  271. {
  272. ExitToVisitFlag = false;
  273. VisitManager.Visit(ConfigSource.SerialNumber, VisiteeSerialNumber);
  274. }
  275. );
  276. }
  277. else
  278. {
  279. tweenRoot.AddEventOnetime
  280. (
  281. EventType.ForwardFinish,
  282. () =>
  283. {
  284. PlazaRoomManager.OpenJoinRoomPanel();
  285. }
  286. );
  287. }
  288. }
  289. public void QuitPlazaRoom()
  290. {
  291. PlazaRoomChest.SystemChest = null;
  292. Manager.SceneSwitchFlag = false;
  293. GardenSmartFox.SmartFox.Send(new LeaveRoomRequest(CurrentPlazaRoom));
  294. GardenSmartFox.PlazaRoomController.CurrentPlazaRoom = null;
  295. }
  296. public void LeavePlazaRoom()
  297. {
  298. SFSObject arg = new SFSObject();
  299. arg.PutInt(SFSLabel.CommandID, PlazaRoomReq.LeaveRoom.GetHashCode());
  300. arg.PutInt(SFSLabel.RoomID, SFSManager.GardenSmartFox.PlazaRoomController.CurrentPlazaRoom.Id);
  301. SFSManager.GardenSmartFox.AddRequest(arg, RequestType.Immediate);
  302. }
  303. private void ResetScene()
  304. {
  305. ChestManager.RetrieveAllChest();
  306. InPlazaRoom = false;
  307. AudioManager.GardenThemeAudio.TweenForAudio();
  308. PlazaRoomSky.position = SkyOriginPosition;
  309. PlazaRoomCamera.transform.position = CameraOriginPosition;
  310. ResourceManager.SetActive(CanvasLabel.C_Main2, true);
  311. ResourceManager.SetActive(ResourceLabel.Garden, true);
  312. ResourceManager.SetActive(PlazaRoomLabel.PlazaRoom, false);
  313. ResourceManager.SetActive(CanvasLabel.W_HudParent, false);
  314. ResourceManager.SetActive(CanvasLabel.X_PlazaRoom, false);
  315. ResourceManager.Get(CanvasLabel.V_BlackMask).TweenForCG();
  316. ResourceManager.Get(CanvasLabel.B_SignIn0).TweenForCG();
  317. ResourceManager.Get(CanvasLabel.T_NickName).TweenForCG();
  318. ResourceManager.Get<Text>(CanvasLabel.X_CurrentInfoLab).text = "";
  319. Transform tra = ResourceManager.Get(CanvasLabel.X_Info);
  320. while (tra.childCount > 0)
  321. {
  322. ResourceManager.Save(tra.GetChild(0));
  323. }
  324. foreach (var kv in UserInstanceDictionary)
  325. {
  326. kv.Value.Save();
  327. }
  328. UserInstanceDictionary = new Dictionary<int, PlazaRoomPlayer>();
  329. RobotManager.DeactivateAllRobots(true);
  330. }
  331. public PlazaRoomController(GardenSmartFox gardenSmartFox)
  332. {
  333. GardenSmartFox = gardenSmartFox;
  334. gardenSmartFox.Connector.onConnectionLost += OnConectionLost;
  335. }
  336. public void Update()
  337. {
  338. if (!JoinedPlazaRoom)
  339. return;
  340. if (!InPlazaRoom)
  341. return;
  342. //KeepAliveThread();
  343. //CheckDefautChestThread();
  344. CameraControllThread();
  345. }
  346. public float KeepAliveTime = 30;
  347. public float KeepAliveTimer;
  348. public void KeepAliveThread()
  349. {
  350. KeepAliveTimer += Time.deltaTime;
  351. if (KeepAliveTimer > KeepAliveTime)
  352. {
  353. KeepAliveTimer = 0;
  354. SFSObject parameter = new SFSObject();
  355. parameter.PutInt(SFSLabel.CommandID, PlazaRoomReq.KeepAlive.GetHashCode());
  356. GardenSmartFox.AddRequest(parameter, RequestType.Immediate);
  357. }
  358. }
  359. public float CameraLeftBorder;
  360. public float CameraRightBorder;
  361. public Vector3 CameraOriginPosition;
  362. public Camera PlazaRoomCamera;
  363. public void CameraControllThread()
  364. {
  365. float x;
  366. if (SelfInstance.Player.transform.position.x <= CameraLeftBorder)
  367. {
  368. x = Mathf.Lerp(PlazaRoomCamera.transform.position.x, CameraLeftBorder, Time.deltaTime);
  369. if (SkyTween != null)
  370. SkyTween.Pause();
  371. }
  372. else if (SelfInstance.Player.transform.position.x >= CameraRightBorder)
  373. {
  374. x = Mathf.Lerp(PlazaRoomCamera.transform.position.x, CameraRightBorder, Time.deltaTime);
  375. if (SkyTween != null)
  376. SkyTween.Pause();
  377. }
  378. else
  379. {
  380. x = Mathf.Lerp(PlazaRoomCamera.transform.position.x, SelfInstance.Player.transform.position.x, Time.deltaTime);
  381. }
  382. PlazaRoomCamera.transform.SetX(x);
  383. }
  384. private float CheckTime = 10;
  385. private float CheckTimer;
  386. public void CheckDefautChestThread()
  387. {
  388. CheckTimer += Time.deltaTime;
  389. if (CheckTimer >= CheckTime)
  390. {
  391. CheckTimer = 0;
  392. GardenSmartFox.EventManager.PlazaRoomEvent.CheckDefaultChestStatus(CurrentRoomData.ID);
  393. }
  394. }
  395. public void MoveTo(Vector3 destination)
  396. {
  397. SFSManager.GardenSmartFox.PlazaRoomController.SelfInstance.MoveTo(destination);
  398. SFSManager.GardenSmartFox.PlazaRoomController.SendSynchronizeDestination(destination);
  399. MoveSky(SelfInstance.MoveTween.Duration, SelfInstance.MoveTween.Delta);
  400. }
  401. private float SkyMoveRatio = 0.1f;
  402. private Vector3 SkyOriginPosition;
  403. private TweenRoot SkyTween;
  404. public Transform PlazaRoomSky;
  405. private void MoveSky(float duration, Vector3 offset)
  406. {
  407. offset *= -SkyMoveRatio;
  408. offset.y = 0;
  409. offset.z = 0;
  410. SkyTween = PlazaRoomSky.transform.CreateTweenVecOffset2D(offset, duration, false, true, true, Curve.Linear);
  411. SkyTween.StartForward();
  412. }
  413. public void OnConectionLost(BaseEvent baseEvent)
  414. {
  415. if (JoinedPlazaRoom)
  416. {
  417. ExitPlazaRoom();
  418. }
  419. }
  420. private float SelfInstanceOffset = 0.001f;
  421. public void OnJoinPlazaRoom(Room room, DateTime joinedTime)
  422. {
  423. if (JoinRoomResult == JoinRoomResult.Pending)
  424. {
  425. GardenSmartFox.PlazaRoomController.CurrentPlazaRoom = room;
  426. PlazaRoom.Initialize();
  427. PlayerDefaultPosition = GetDefaultPosition();
  428. SelfInstance = InstantiatePlayer(NickNameManager.NickName, HttpManager.SerialNumber, joinedTime, PlayerDefaultPosition, PlayerDirection.Left, ConfigManager.GetDressDataIDs(PlayerManager.Player));
  429. UserInstanceDictionary.Add(SFSManager.GardenSmartFox.User.Id, SelfInstance);
  430. SendInstantiateRequset(-1);
  431. SelfInstance.Player.transform.SetLZ(SelfInstance.Player.transform.localPosition.z - SelfInstanceOffset);
  432. JoinRoomResult = JoinRoomResult.Succeed;
  433. TryEnterPlazaRoom();
  434. DelayCall.stopCoroutine(JoinRoomCoroutine);
  435. }
  436. }
  437. public void OnJoinPlazaRoomError(JoinRoomResult joinRoomResult)
  438. {
  439. if (JoinRoomResult == JoinRoomResult.Pending)
  440. {
  441. JoinRoomResult = joinRoomResult;
  442. TryEnterPlazaRoom();
  443. DelayCall.stopCoroutine(JoinRoomCoroutine);
  444. }
  445. }
  446. public void OnUserExitPlazaRoom(int userID)
  447. {
  448. UserInstanceDictionary[userID].Save();
  449. UserInstanceDictionary.Remove(userID);
  450. }
  451. public void OnUserEnterPlazaRoom(int senderID)
  452. {
  453. SendInstantiateRequset(senderID);
  454. }
  455. public void Synchronize(int senderID, ISFSObject parameter)
  456. {
  457. if (!UserInstanceDictionary.ContainsKey(senderID))
  458. return;
  459. if (SFSManager.GardenSmartFox.User.Id == senderID)
  460. return;
  461. if (parameter.ContainsKey(InfoLabel.Destination.GetHashString()))
  462. {
  463. Vector3 destination = parameter.GetUtfString(InfoLabel.Destination.GetHashString()).ToVector();
  464. SynchronizeDestination(destination, senderID);
  465. }
  466. if (parameter.ContainsKey(InfoLabel.Close.GetHashString()))
  467. {
  468. List<int> closeIDs = parameter.GetIntArray(InfoLabel.Destination.GetHashString()).ToList();
  469. SynchronizeClose(closeIDs, senderID);
  470. }
  471. }
  472. public void SynchronizeClose(List<int> closeIDs, int senderID)
  473. {
  474. Player player = UserInstanceDictionary[senderID].Player;
  475. foreach (var closeID in closeIDs)
  476. {
  477. CloseItem closeItem = PlayerManager.CloseItemDictionary[closeID];
  478. player.ChangeClose(closeItem.BodyPart, closeItem.ArmatureName);
  479. }
  480. }
  481. public void SynchronizeDestination(Vector3 destination, int senderID)
  482. {
  483. UserInstanceDictionary[senderID].MoveTo(destination);
  484. }
  485. private float ExpressionDuration = 1;
  486. public void ReceiveExpression(int expressionID, int senderID)
  487. {
  488. PlazaRoomPlayer plazaRoomPlayer = UserInstanceDictionary[senderID];
  489. string expressionName = Enum.GetName(typeof(ExpressionID), expressionID);
  490. plazaRoomPlayer.Player.ChangeExpression(expressionName, ExpressionDuration);
  491. string senderName = senderID == SFSManager.GardenSmartFox.User.Id ? Language.GetStr(LanguageLabel.UI__X_Self) : plazaRoomPlayer.NickName;
  492. string message = $"{senderName}:\u3000<({expressionName}按钮)>";
  493. Color textColor = senderID == SFSManager.GardenSmartFox.User.Id ? Lib.SelfMessage : Lib.OtherMessage;
  494. InfoBoxManager.PlazaRoomInfoBox.Display(message, Mathf.Infinity, textColor, ResourceManager.LoadSprite(ResourceLabel.Expression, Folder.Scene));
  495. Text text = ResourceManager.Get<Text>(CanvasLabel.X_CurrentInfoLab);
  496. text.color = textColor;
  497. text.text = message;
  498. }
  499. public void ReceivePublicMessage(string message, int senderID)
  500. {
  501. Color textColor = senderID == SFSManager.GardenSmartFox.User.Id ? Lib.SelfMessage : Lib.OtherMessage;
  502. PlazaRoomPlayer plazaRoomPlayer = UserInstanceDictionary[senderID];
  503. plazaRoomPlayer.ShowMessage(textColor, message);
  504. string senderName = senderID == SFSManager.GardenSmartFox.User.Id ? Language.GetStr(LanguageLabel.UI__X_Self) : plazaRoomPlayer.NickName;
  505. message = $"{senderName}:\u3000{message}";
  506. InfoBoxManager.PlazaRoomInfoBox.Display(message, Mathf.Infinity, textColor, ResourceManager.LoadSprite(ResourceLabel.Expression, Folder.Scene));
  507. ResourceManager.SetText(CanvasLabel.X_CurrentInfoLab, message);
  508. Text text = ResourceManager.Get<Text>(CanvasLabel.X_CurrentInfoLab);
  509. text.color = textColor;
  510. text.text = message;
  511. }
  512. public void OnInstantiate(int senderID, ISFSObject parameter)
  513. {
  514. if (SFSManager.GardenSmartFox.User.Id == senderID)
  515. return;
  516. UserInstanceDictionary.Add(senderID, InstantiatePlayer(parameter));
  517. }
  518. public void SendExpression(ExpressionID expressionID)
  519. {
  520. SFSManager.GardenSmartFox.EventManager.PlazaRoomEvent.SendExpression(expressionID);
  521. }
  522. public bool SendPublicMessage(string message)
  523. {
  524. if (string.IsNullOrEmpty(message))
  525. {
  526. Bubble.Show(null, Language.GetStr(LanguageLabel.UI__CannotEmpty));
  527. return false;
  528. }
  529. else
  530. {
  531. message = StringFilter.GetFilteredString(message);
  532. SFSManager.GardenSmartFox.EventManager.PlazaRoomEvent.SendPublicMessage(message);
  533. return true;
  534. }
  535. }
  536. public void SendInstantiateRequset(int receiverID)
  537. {
  538. SFSManager.GardenSmartFox.EventManager.PlazaRoomEvent.SendInstantiateRequset(GardenSmartFox.User.Id, ConfigManager.GetDressDataIDs(SelfInstance.Player).ToArray(), HttpManager.SerialNumber, SelfInstance.JoinedTime, SelfInstance.Player.transform.position, SelfInstance.Player.PlayerDirection, NickNameManager.NickName, receiverID);
  539. if (SelfInstance.IsMoving)
  540. {
  541. SendSynchronizeDestination(SelfInstance.Destination);
  542. }
  543. }
  544. public void SendSynchronizeDestination(Vector3 destination)
  545. {
  546. SFSManager.GardenSmartFox.EventManager.PlazaRoomEvent.SendSynchronizeDestination(GardenSmartFox.User.Id, destination);
  547. }
  548. private float ShaowLocalZ = 3;
  549. public PlazaRoomPlayer InstantiatePlayer(string nickName, string serialNumber, DateTime joinedTime, Vector3 position, PlayerDirection direction, List<int> dressDataIDs)
  550. {
  551. Transform parent = ResourceManager.Get(PlazaRoomLabel.PlazaRoom, false);
  552. Transform tra = ResourceManager.Get(ResourceLabel.Player, Folder.Scene, false, parent, false, ObjType.Player);
  553. Player player = tra.GetComponent<Player>();
  554. if (player == null)
  555. {
  556. player = tra.AddScript<Player>();
  557. player.Build();
  558. }
  559. foreach (var id in dressDataIDs)
  560. {
  561. CloseItem closeItem = PlayerManager.CloseItemDictionary[id];
  562. closeItem.ChangeDress(player);
  563. }
  564. player.SetAllCollider(false);
  565. player.transform.position = position;
  566. player.Flip(direction);
  567. player.ActiveShadow();
  568. player.Shadow.SetLZ(ShaowLocalZ);
  569. tra.localScale = PlazaRoomPlayerScale;
  570. return new PlazaRoomPlayer(player, nickName, serialNumber, joinedTime);
  571. }
  572. public PlazaRoomPlayer InstantiatePlayer(ISFSObject parameter)
  573. {
  574. List<int> dressDatas = ConfigManager.GetDressDataIDs(parameter);
  575. Vector3 position = parameter.GetUtfString(InfoLabel.Position.GetHashString()).ToVector();
  576. PlayerDirection direction = (PlayerDirection) parameter.GetInt(InfoLabel.PlayerDirection.GetHashString());
  577. string nickName = parameter.GetUtfString(InfoLabel.NickName.GetHashString());
  578. string serialNumber = parameter.GetUtfString(InfoLabel.SerialNumber.GetHashString());
  579. DateTime joinedTime = new DateTime(parameter.GetLong(InfoLabel.JoinedTime.GetHashString()));
  580. PlazaRoomPlayer plazaRoomPlayer = InstantiatePlayer(nickName, serialNumber, joinedTime, position, direction, dressDatas);
  581. return plazaRoomPlayer;
  582. }
  583. private static float MinZOffset = 0.0001f;
  584. private static float MaxZOffset = 0.001f;
  585. public static PlayerDirection DefaultDirection = PlayerDirection.Left;
  586. public static Vector3 GetDefaultPosition()
  587. {
  588. float zOffset = Random.Range(MinZOffset, MaxZOffset);
  589. Vector3 position = ResourceManager.Get(PlazaRoomLabel.PlazaRoomDefaultPosition).position;
  590. position.z += zOffset;
  591. return position;
  592. }
  593. public void TryExitToVisit(string visiteeSerialNumber, Action onExitToVisit)
  594. {
  595. if (Manager.Coin < VisitManager.VisitCost)
  596. {
  597. Bubble.Show(Language.GetStr(LanguageLabel.Common__ShortCoin), null, null, Lib.GoldSprite);
  598. }
  599. else
  600. {
  601. Bubble.Show
  602. (
  603. null,
  604. Language.GetStr(LanguageLabel.PlazaroomMemberItem__VisitWarning),
  605. null,
  606. null,
  607. () =>
  608. {
  609. ExitToVisit(visiteeSerialNumber);
  610. onExitToVisit.Invoke();
  611. }
  612. );
  613. }
  614. }
  615. public void ExitToVisit(string visiteeSerialNumber)
  616. {
  617. SFSManager.GardenSmartFox.PlazaRoomController.ExitToVisitFlag = true;
  618. SFSManager.GardenSmartFox.PlazaRoomController.VisiteeSerialNumber = visiteeSerialNumber;
  619. SFSManager.GardenSmartFox.PlazaRoomController.LeavePlazaRoom();
  620. }
  621. }