예제 #1
0
        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;
        }
예제 #2
0
        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;
        }