private void ReceiveMatchStateMessage(object sender, IMatchState e) { var diffTime = (float)(DateTime.Now - _timeOfLastState).TotalSeconds; PublicMatchState state = PublicMatchState.Parser.ParseFrom(e.State); var cl = state.Combatlog.ToArray(); OnCombatLogUpdate?.Invoke(cl, diffTime); OnNewWorldUpdate?.Invoke(state, diffTime); _timeOfLastState = DateTime.Now; }
private void OnNewWorldUpdate(PublicMatchState state, float diffTime) { //remove destroyed foreach (var player in _gameObjects.Where(x => !(x.Key.StartsWith("p_") || x.Key.StartsWith("a_")) && !state.Interactable.ContainsKey(x.Key))) { UnityThread.executeInUpdate(() => DestroyWorldObject(player.Key)); } //player & NPCs foreach (var entry in state.Combatlog) { if (entry.TypeCase == PublicMatchState.Types.CombatLogEntry.TypeOneofCase.Cast) { switch (entry.Cast.Event) { case PublicMatchState.Types.CombatLogEntry.Types.CombatLogEntry_Cast.Types.CombatLogEntry_Cast_Event.Start: _gameObjects[entry.SourceId].StartCast(entry.SourceSpellId); break; case PublicMatchState.Types.CombatLogEntry.Types.CombatLogEntry_Cast.Types.CombatLogEntry_Cast_Event.Interrupted: _gameObjects[entry.SourceId].InterruptCast(); break; } } } foreach (var player in state.Interactable) { if (!UserNames.ContainsKey(player.Key)) { UserNames.Add(player.Key, player.Value.Username); } if (UserNames[player.Key] != player.Value.Username) { UserNames[player.Key] = player.Value.Username; } //handle player character if (player.Key == NakamaManager.Instance.Session.UserId) { //spawn player if (!Spawned) { Spawned = true; ClassName = player.Value.Classname; UnityThread.executeInUpdate(() => { var p = Player.gameObject; p.transform.Find("Mesh").gameObject.SetActive(true); _gameObjects.Add(player.Key, p.GetComponent <PlayerController>()); p.name = player.Key; }); } _notAcknowledgedPackages.RemoveAll(x => x.ClientTick <= player.Value.LastProcessedClientTick); if (Player.ShowGhost) { ServerShadow.SetLastServerAck(null, diffTime, player.Value); } Player.SetLastServerAck(_notAcknowledgedPackages, diffTime, player.Value); } else { if (_gameObjects.ContainsKey(player.Key)) { if (player.Value?.Position != null) { _gameObjects[player.Key].SetLastServerAck(null, diffTime, player.Value); } else { UnityThread.executeInUpdate(() => DestroyWorldObject(player.Key)); } } else { if (player.Value?.Position != null) { UnityThread.executeInUpdate(() => InstantiateWorldObject(PrefabNPC, player.Key, new Vector3(player.Value.Position.X, 0f, player.Value.Position.Y), player.Value.Rotation)); } } } } //remove destroyed foreach (var projectile in _gameObjects.Where(x => x.Key.StartsWith("p_") && !state.Projectile.ContainsKey(x.Key))) { UnityThread.executeInUpdate(() => DestroyWorldObject(projectile.Key)); } //update projectiles foreach (var projectile in state.Projectile) { if (_gameObjects.ContainsKey(projectile.Key)) { if (projectile.Value != null && projectile.Value?.Position != null) { _gameObjects[projectile.Key].SetLastServerAck(null, diffTime, null); } else { UnityThread.executeInUpdate(() => DestroyWorldObject(projectile.Key)); } } //redundant else if (projectile.Value?.Position != null) { UnityThread.executeInUpdate(() => InstantiateWorldObject(PrefabBullet, projectile.Key, new Vector3(projectile.Value.Position.X, 0f, projectile.Value.Position.Y), projectile.Value.Rotation)); } } //remove destroyed foreach (var area in _gameObjects.Where(x => x.Key.StartsWith("a_") && !state.Area.ContainsKey(x.Key))) { UnityThread.executeInUpdate(() => DestroyWorldObject(area.Key)); } //update area foreach (var area in state.Area) { if (_gameObjects.ContainsKey(area.Key)) { if (area.Value != null && area.Value?.Position != null) { } else { UnityThread.executeInUpdate(() => DestroyWorldObject(area.Key)); } } //redundant else if (area.Value?.Position != null) { UnityThread.executeInUpdate(() => { var prefab = PrefabArea; var radius = ((GameDB_Lib.GameDB_Effect_Persistent_Area_Aura)(GameManager.Instance.GameDB.Effects[area.Value.EffectId].Type)).Radius; prefab.transform.localScale = new Vector3(radius * 2, 0.1f, radius * 2); InstantiateWorldObject(prefab, area.Key, new Vector3(area.Value.Position.X, 0.52f, area.Value.Position.Y), 0); }); } } _lastConfirmedServerTick = state.Tick; }