Exemplo n.º 1
0
    /** Network command handling */

    private void HandleJoinRequest(NetCommand.JoinRequest cmd, NetPeer peer)
    {
        // TODO: Validation should occur here, if any.
        var playerName = cmd.PlayerSetupData.Name;

        Debug.Log($"{playerName} connected to the server.");
        var metadata = new PlayerMetadata {
            Name = playerName,
        };

        // Initialize the server player model - Peer ID is used as player ID always.
        var existingPlayers = playerManager.GetPlayers();
        var player          = CreateServerPlayer(peer, metadata);

        // Transmit existing player state to new player and new player state to
        // existing clients. Separate RPCs with the same payload are used so that
        // the joining player can distinguish their own player ID.
        var joinAcceptedCmd = new NetCommand.JoinAccepted {
            YourPlayerState      = player.ToInitialPlayerState(),
            ExistingPlayerStates = existingPlayers.Select(p => p.ToInitialPlayerState()).ToArray(),
            WorldTick            = simulation.WorldTick,
        };
        var playerJoinedCmd = new NetCommand.PlayerJoined {
            PlayerState = player.ToInitialPlayerState(),
        };

        netChannel.SendCommand(peer, joinAcceptedCmd);
        netChannel.BroadcastCommand(playerJoinedCmd, peer);
    }
Exemplo n.º 2
0
 public void Deserialize(NetDataReader reader)
 {
     PlayerId           = reader.GetByte();
     Metadata           = reader.Get <PlayerMetadata>();
     PlayerState        = reader.Get <PlayerState>();
     NetworkObjectState = reader.Get <NetworkObjectState>();
 }
Exemplo n.º 3
0
    public void ReplacePlayer(PlayerMetadata newMetadata)
    {
        var index     = GameComponentsLookup.Player;
        var component = CreateComponent <PlayerComponent>(index);

        component.metadata = newMetadata;
        ReplaceComponent(index, component);
    }
 public static Player CreatePlayer(this PlayerMetadata playerMetedata)
 {
     return(new Player(
                colour: playerMetedata.Colour,
                name: playerMetedata.Name,
                resources: null
                ));
 }
Exemplo n.º 5
0
    public void ReplaceClientStartConnection(System.Net.IPEndPoint newServerEP, PlayerMetadata newPlayerMetadata)
    {
        var index     = NetworkComponentsLookup.ClientStartConnection;
        var component = CreateComponent <ClientStartConnectionComponent>(index);

        component.serverEP       = newServerEP;
        component.playerMetadata = newPlayerMetadata;
        ReplaceComponent(index, component);
    }
Exemplo n.º 6
0
    public Player AddPlayer(byte playerId, PlayerMetadata metadata, GameObject playerGameObject)
    {
        var player = new Player {
            Id            = playerId,
            Metadata      = metadata,
            GameObject    = playerGameObject,
            NetworkObject = playerGameObject.GetComponent <NetworkObject>(),
            Controller    = playerGameObject.GetComponent <IPlayerController>(),
        };

        players.Add(playerId, player);
        CachePlayerIds();
        return(player);
    }
Exemplo n.º 7
0
        public void Setup()
        {
            Players = new List <PlayerMetadata>();

            PlayerOne   = new PlayerMetadata(1, new DefaultPlayer());
            PlayerTwo   = new PlayerMetadata(2, new DefaultPlayer());
            PlayerThree = new PlayerMetadata(3, new DefaultPlayer());
            PlayerFour  = new PlayerMetadata(4, new DefaultPlayer());

            Players.Add(PlayerOne);
            Players.Add(PlayerTwo);
            Players.Add(PlayerThree);
            Players.Add(PlayerFour);
        }
        public PlayerMetadata[] GetPlayersMetadata()
        {
            var playerNames   = textBoxes.Select(t => t.Text.DisplayedString).ToArray();
            var playerColours = buttons.Select(b => b.Colour).ToArray();
            var players       = new PlayerMetadata[playerNames.Length];

            for (int i = 0; i < textBoxes.Count; i++)
            {
                players[i] = new PlayerMetadata
                {
                    Colour = playerColours[i],
                    Name   = playerNames[i],
                    Id     = Math.Abs(textBoxes.Count - 1 - i)
                };
            }

            return(players.OrderBy(p => p.Id).ToArray());
        }
Exemplo n.º 9
0
 private void PlayerMetadataUpdateUpdateHandler(string action, PlayerMetadata playerMetadata)
 {
     using (_logger.BeginScope(nameof(PlayerMetadataUpdateUpdateHandler)))
     {
         _logger.LogDebug(LoggingEvents.PlayerMetadataReceived, $"Player update: {action} {playerMetadata.ID}");
         if (action == PlayerActions.Add)
         {
             //this.others.set(playerMetadata.id, playerMetadata);
         }
         else if (action == PlayerActions.Delete)
         {
             //this.others.delete(playerMetadata.id);
         }
         else if (action == PlayerActions.Self)
         {
             _playerMetadata = playerMetadata;
         }
     }
 }
Exemplo n.º 10
0
    /// Setup all server authoritative state for a new player.
    private Player CreateServerPlayer(NetPeer peer, PlayerMetadata metadata)
    {
        // Setup the serverside object for the player.
        var position            = Vector3.zero;
        var playerNetworkObject = networkObjectManager.CreatePlayerGameObject(0, position, false);
        var player = playerManager.AddPlayer((byte)peer.Id, metadata, playerNetworkObject.gameObject);

        player.Peer = peer;

        // Let the simulation initialize any state for the player.
        simulation.InitializePlayerState(player);

        // Inject the attack handler.
        player.Controller.SetPlayerAttackDelegate(
            (NetworkObjectType type, Vector3 attackPosition, Quaternion orientation) => {
            HandlePlayerAttack(player, type, attackPosition, orientation);
        });

        return(player);
    }
Exemplo n.º 11
0
 private Player ClonePlayer(PlayerMetadata playerMetadata)
 {
     return(new Player
     {
         ID = playerMetadata.Player.ID,
         X = playerMetadata.Player.X,
         Y = playerMetadata.Player.Y,
         Top = playerMetadata.Player.Top,
         Left = playerMetadata.Player.Left,
         Right = playerMetadata.Player.Right,
         Bottom = playerMetadata.Player.Bottom,
         Animation = playerMetadata.Player.Animation,
         AnimationTiming = playerMetadata.Player.AnimationTiming,
         Fire1 = playerMetadata.Player.Fire1,
         Fire2 = playerMetadata.Player.Fire2,
         Rotation = playerMetadata.Player.Rotation,
         ShotUpdateFrequency = playerMetadata.Player.ShotUpdateFrequency,
         Speed = playerMetadata.Player.Speed,
         Time = playerMetadata.Player.Time
     });
 }
Exemplo n.º 12
0
        public Tuple <PlayerMetadata, Constant> RemotePlayerConnected(string connectionId)
        {
            using (_logger.BeginScope(nameof(RemotePlayerConnected)))
            {
                _logger.LogInformation(LoggingEvents.PlayerConnected, $"Player Connected {connectionId}");
                if (string.IsNullOrEmpty(connectionId))
                {
                    throw new ArgumentException($"{nameof(connectionId)} is not correctly set.");
                }

                var id = Interlocked.Increment(ref _runningPlayerCount);

                double x = 10000;
                double y = 10000;

                FindAvailableLocation(ref x, ref y);

                var playerMetadata = new PlayerMetadata
                {
                    ID     = id,
                    Color  = _colors[id % _colors.Count],
                    Player = new Player()
                    {
                        ID       = id,
                        X        = x,
                        Y        = y,
                        Rotation = Math.PI * 3 / 2
                    },
                    ServerTimestamp = _time.ElapsedTicks
                };

                _players.AddOrUpdate(connectionId, playerMetadata, (keyUpdate, playerUpdate) =>
                {
                    throw new ArgumentException($"Duplicate value '{connectionId}' found for parameter {nameof(connectionId)}.");
                });

                return(Tuple.Create(playerMetadata, GameEngineConstants));
            }
        }
Exemplo n.º 13
0
        public void ExampleJoining()
        {
            var numbersAlpha          = new int[] { 1, 2, 3 };
            var numbersBravo          = new int[] { 2, 4 };
            var numbersExcludingBravo = numbersAlpha.Except(numbersBravo);
            var products = new Product[]
            {
                new Product()
                {
                    Id = 1, Name = "One"
                },
                new Product()
                {
                    Id = 2, Name = "Two"
                }
            };
            var productsDiscontinued = new Product[]
            {
                new Product()
                {
                    Id = 2, Name = "Two"
                }
            };
            var productsAvailable = products.Except(productsDiscontinued);
            var numbersInBothSets = numbersAlpha.Intersect(numbersBravo);

            var infos = new PlayerInfo[]
            {
                new PlayerInfo()
                {
                    PlayerId = 1, Name = "Name1", CreatedDate = DateTime.Parse("01/01/2001")
                },
                new PlayerInfo()
                {
                    PlayerId = 2, Name = "Name2", CreatedDate = DateTime.Parse("02/02/2002")
                },
                new PlayerInfo()
                {
                    PlayerId = 7, Name = "Name7", CreatedDate = DateTime.Parse("07/07/2007")
                }
            };
            var metadatas = new PlayerMetadata[]
            {
                new PlayerMetadata()
                {
                    PlayerId = 1, Tags = new string[] { "strong slow" }
                },
                new PlayerMetadata()
                {
                    PlayerId = 2, Tags = new string[] { "weak fast" }
                },
                new PlayerMetadata()
                {
                    PlayerId = 8, Tags = new string[] { "tall smart" }
                }
            };
            var joinedPlayers = infos.Join(metadatas, i => i.PlayerId, m => m.PlayerId, (i, m) => new Player()
            {
                Id          = i.PlayerId,
                Name        = i.Name,
                CreatedDate = i.CreatedDate,
                Tags        = m.Tags
            });

            var parents = new ParentRow[]
            {
                new ParentRow()
                {
                    ParentId = 1, ParentName = "Parent1"
                },
                new ParentRow()
                {
                    ParentId = 2, ParentName = "Parent2"
                }
            };
            var children = new ChildRow[]
            {
                new ChildRow()
                {
                    ChildId = 1, ParentId = 1, ChildName = "Child1"
                },
                new ChildRow()
                {
                    ChildId = 2, ParentId = 1, ChildName = "Child2"
                },
                new ChildRow()
                {
                    ChildId = 3, ParentId = 2, ChildName = "Child3"
                },
                new ChildRow()
                {
                    ChildId = 4, ParentId = 2, ChildName = "Child4"
                }
            };

            var joinedFamily = parents.Join(children, p => p.ParentId, c => c.ParentId, (p, c) => new
            {
                Parent = p,
                Child  = c
            });
            var joinedFamilyMessageBuilder = new StringBuilder();

            foreach (var relationship in joinedFamily)
            {
                var line = relationship.Parent.ParentName + ":" + relationship.Child.ChildName;
                joinedFamilyMessageBuilder.AppendLine(line);
            }
            var joinedFamilyMessage = joinedFamilyMessageBuilder.ToString();

            var groupJoinedFamily = parents.GroupJoin(children, p => p.ParentId, c => c.ParentId, (p, c) => new
            {
                Parent   = p,
                Children = c
            });
            var groupJoinedFamilyMessageBuilder = new StringBuilder();

            foreach (var parent in groupJoinedFamily)
            {
                var childrensNames = String.Join(",", parent.Children.Select(c => c.ChildName));
                var line           = parent.Parent.ParentName + ":" + childrensNames;
                groupJoinedFamilyMessageBuilder.AppendLine(line);
            }
            var groupJoinedFamilyMessage = groupJoinedFamilyMessageBuilder.ToString();

            var numbers             = new int[] { 1, 2, 3, 4, 5 };
            var groups              = numbers.GroupBy(n => n % 2 == 0);
            var groupMessageBuilder = new StringBuilder();

            foreach (var group in groups)
            {
                var line = (group.Key ? "Even" : "Odd") + ":" + String.Join(",", group);
                groupMessageBuilder.AppendLine(line);
            }
            var groupMessage = groupMessageBuilder.ToString();

            var animals = new Animal[]
            {
                new Animal()
                {
                    Id = 1, Species = "Dog", Age = 7
                },
                new Animal()
                {
                    Id = 2, Species = "Cat", Age = 3
                },
                new Animal()
                {
                    Id = 3, Species = "Cat", Age = 6
                },
                new Animal()
                {
                    Id = 4, Species = "Cat", Age = 3
                },
                new Animal()
                {
                    Id = 5, Species = "Dog", Age = 6
                }
            };
            var animalSummaryBuilder = new StringBuilder();
            var animalsByAge         = animals.GroupBy(a => a.Age);

            foreach (var ageGroup in animalsByAge)
            {
                animalSummaryBuilder.AppendLine($"Animals Age {ageGroup.Key}");
                foreach (var animal in ageGroup)
                {
                    var line = $"\tId:{animal.Id}:Species:{animal.Species}";
                    animalSummaryBuilder.AppendLine(line);
                }
            }
            var animalsBySpecies = animals.GroupBy(a => a.Species);

            foreach (var speciesGroup in animalsBySpecies)
            {
                animalSummaryBuilder.AppendLine($"{speciesGroup.Key}s");
                foreach (var animal in speciesGroup)
                {
                    var line = $"\tId:{animal.Id}:Age:{animal.Age}";
                    animalSummaryBuilder.AppendLine(line);
                }
            }
            var animalSummary = animalSummaryBuilder.ToString();
        }
Exemplo n.º 14
0
        public void ExampleConversionItems()
        {
            var numbersAsObjects = new object[] { 1, 2, 3, 4, 5 };
            var numbersAsInts    = numbersAsObjects.Cast <int>();
            var customers        = new CustomerGenerator().Generate(5);
            var users            = customers.Select(c => new User()
            {
                Id              = c.Id,
                Name            = c.FirstName + " " + c.LastName,
                FavoriteNumbers = new int[0]
            });
            var inactivePeople = customers
                                 .Where(c => !c.IsActive)
                                 .Select(c => new { c.Id, Name = c.LastName + ", " + c.FirstName })
                                 .OrderBy(p => p.Name);

            var usersWithFavoriteNumbers = new User[]
            {
                new User()
                {
                    Id = 1, Name = "User1", FavoriteNumbers = new int[] { 7 }
                },
                new User()
                {
                    Id = 2, Name = "User2", FavoriteNumbers = new int[] { 1, 3, 7 }
                },
                new User()
                {
                    Id = 3, Name = "User3", FavoriteNumbers = new int[] { 2, 3, 5, 7, 11 }
                },
                new User()
                {
                    Id = 4, Name = "User4", FavoriteNumbers = new int[] { 1, 2 }
                }
            };
            var allFavoriteNumbers             = usersWithFavoriteNumbers.SelectMany(u => u.FavoriteNumbers);
            var distinctOrderedFavoriteNumbers = usersWithFavoriteNumbers
                                                 .SelectMany(u => u.FavoriteNumbers)
                                                 .Distinct()
                                                 .OrderBy(n => n);

            var infos = new PlayerInfo[]
            {
                new PlayerInfo()
                {
                    PlayerId = 1, Name = "Name1", CreatedDate = DateTime.Parse("01/01/2001")
                },
                new PlayerInfo()
                {
                    PlayerId = 2, Name = "Name2", CreatedDate = DateTime.Parse("02/02/2002")
                }
            };
            var metadatas = new PlayerMetadata[]
            {
                new PlayerMetadata()
                {
                    PlayerId = 1, Tags = new string[] { "strong slow" }
                },
                new PlayerMetadata()
                {
                    PlayerId = 2, Tags = new string[] { "weak fast" }
                }
            };
            var players = infos.Zip(metadatas, (i, m) => new Player()
            {
                Id          = i.PlayerId == m.PlayerId ? i.PlayerId : Int32.MinValue,
                Name        = i.Name,
                CreatedDate = i.CreatedDate,
                Tags        = m.Tags
            });
        }
    public void AddClientConnection(float newStateTime, float newPacketUnreceivedTime, System.Net.IPEndPoint newServerEP, PlayerMetadata newPlayerMetadata, float newTimeoutCounter, float newKeepAliveCounter, int newRetryTime, ClientConnectionComponent.State newState)
    {
        var index     = NetworkComponentsLookup.ClientConnection;
        var component = CreateComponent <ClientConnectionComponent>(index);

        component.stateTime            = newStateTime;
        component.packetUnreceivedTime = newPacketUnreceivedTime;
        component.serverEP             = newServerEP;
        component.playerMetadata       = newPlayerMetadata;
        component.timeoutCounter       = newTimeoutCounter;
        component.keepAliveCounter     = newKeepAliveCounter;
        component.retryTime            = newRetryTime;
        component.state = newState;
        AddComponent(index, component);
    }
Exemplo n.º 16
0
        internal void UpdatePlayer(PlayerMetadata playerMetadata, double delta)
        {
            var player = playerMetadata.Player;

            using (_logger.BeginScope(nameof(UpdatePlayer)))
            {
                _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} Before player.X: {player.X}");
                _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} Before player.Y: {player.Y}");
                _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} Before player.Speed: {player.Speed}");
                _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} Before player.Rotation: {player.Rotation}");

                var sendPlayerUpdate = false;
                if (player.Animation != null)
                {
                    player.AnimationTiming -= delta * ConstantValues.AnimationConstantValues.ExplosionAnimationDuration;
                    if (player.AnimationTiming <= 0)
                    {
                        _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} animation {player.Animation} ended.");

                        double x = 10000;
                        double y = 10000;

                        FindAvailableLocation(ref x, ref y);

                        player.X               = x;
                        player.Y               = y;
                        player.Rotation        = Math.PI * 3 / 2;
                        player.Speed           = 0;
                        player.Animation       = null;
                        player.AnimationTiming = 0;
                        sendPlayerUpdate       = true;
                    }
                }
                else
                {
                    UpdatePlayerFromInput(player, player, delta);

                    var deltaX = delta * player.Speed * Math.Cos(player.Rotation);
                    var deltaY = delta * player.Speed * Math.Sin(player.Rotation);

                    _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} delta:  {delta}");
                    _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} deltaX: {deltaX}");
                    _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} deltaY: {deltaY}");

                    player.X += deltaX;
                    player.Y += deltaY;

                    _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} After player.X: {player.X}");
                    _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} After player.Y: {player.Y}");
                    _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} After player.Speed: {player.Speed}");
                    _logger.LogDebug(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} After player.Rotation: {player.Rotation}");

                    if (player.Fire1 && player.ShotUpdateFrequency <= 0)
                    {
                        var id = Interlocked.Increment(ref _runningShotCount);
                        _logger.LogDebug($"Player{player.ID} fired a Shot{id}.");
                        var shot = new Shot
                        {
                            ID       = id,
                            Parent   = player.ID,
                            Rotation = player.Rotation,
                            Speed    = ConstantValues.ShootingConstantValues.SpeedPerSecond + player.Speed,
                            Time     = ConstantValues.ShootingConstantValues.ShotDuration,
                            X        = player.X + (ConstantValues.WorldConstantValues.RocketWidth) * Math.Cos(player.Rotation),
                            Y        = player.Y + (ConstantValues.WorldConstantValues.ShotWidth + ConstantValues.WorldConstantValues.RocketHeight) * Math.Sin(player.Rotation)
                        };

                        ShotManager.SendShot(shot);
                        _shots.Enqueue(shot);

                        player.ShotUpdateFrequency = 0.2;
                    }
                }

                player.ShotUpdateFrequency -= delta;
                if (player.ShotUpdateFrequency < 0)
                {
                    player.ShotUpdateFrequency = 0;
                }

                // Collision with shots
                foreach (var shot in _shots)
                {
                    if (player.ID != shot.Parent &&
                        shot.Time > 0 &&
                        player.X - ConstantValues.WorldConstantValues.RocketWidth <= shot.X &&
                        player.X + ConstantValues.WorldConstantValues.RocketWidth >= shot.X &&
                        player.Y - ConstantValues.WorldConstantValues.RocketWidth <= shot.Y &&
                        player.Y + ConstantValues.WorldConstantValues.RocketWidth >= shot.Y &&
                        player.Animation == null)
                    {
                        player.Animation       = ConstantValues.AnimationConstantValues.ExplosionAnimationName;
                        player.AnimationTiming = ConstantValues.AnimationConstantValues.ExplosionAnimationDuration;
                        _logger.LogInformation(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} Shot{shot.ID} by Player{shot.Parent} hit Player{player.ID}");
                        shot.Time = 0;

                        sendPlayerUpdate = true;
                        ShotManager.SendShot(shot);
                    }
                }

                // Collision with players
                foreach (var other in _players)
                {
                    var otherPlayer = other.Value.Player;
                    if (player.ID != otherPlayer.ID &&
                        player.X - ConstantValues.WorldConstantValues.RocketWidth <= otherPlayer.X &&
                        player.X + ConstantValues.WorldConstantValues.RocketWidth >= otherPlayer.X &&
                        player.Y - ConstantValues.WorldConstantValues.RocketWidth <= otherPlayer.Y &&
                        player.Y + ConstantValues.WorldConstantValues.RocketWidth >= otherPlayer.Y &&
                        player.Animation == null && otherPlayer.Animation == null)
                    {
                        _logger.LogInformation(LoggingEvents.UpdatePlayerDebug, $"Player{player.ID} Collision between players Player{player.ID} and Player{otherPlayer.ID}");
                        player.Animation            = ConstantValues.AnimationConstantValues.ExplosionAnimationName;
                        player.AnimationTiming      = ConstantValues.AnimationConstantValues.ExplosionAnimationDuration;
                        otherPlayer.Animation       = ConstantValues.AnimationConstantValues.ExplosionAnimationName;
                        otherPlayer.AnimationTiming = ConstantValues.AnimationConstantValues.ExplosionAnimationDuration;

                        PlayerManager.SendPlayer(otherPlayer);
                        sendPlayerUpdate = true;
                    }
                }

                playerMetadata.ServerTimestamp = _time.ElapsedTicks;
                if (sendPlayerUpdate)
                {
                    PlayerManager.SendPlayer(player);
                }
            }
        }
Exemplo n.º 17
0
        public RemoteUpdatePlayerResult RemoteUpdatePlayer(string connectionId, Player player, out PlayerMetadata playerMetadata)
        {
            using (_logger.BeginScope(nameof(RemoteUpdatePlayer)))
            {
                if (_players.TryGetValue(connectionId, out var playerMetadataStored))
                {
                    // If player is in animation then it cannot be updated.
                    if (playerMetadataStored.Player.Animation != null)
                    {
                        _logger.LogWarning(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} has still animation {playerMetadataStored.Player.Animation} running for {playerMetadataStored.Player.AnimationTiming}.");
                        playerMetadata = playerMetadataStored;
                        return(RemoteUpdatePlayerResult.UpdateSelf);
                    }

                    var now         = _time.ElapsedTicks;
                    var deltaClient = (player.Time - playerMetadataStored.Player.Time) / 1000;
                    var deltaServer = (now - playerMetadataStored.ServerTimestamp) / TimeSpan.TicksPerSecond;
                    var delta       = Math.Min(deltaClient, deltaServer);

                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} now: {now}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} player.Time: {player.Time}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} playerMetadataStored.Player.Time: {playerMetadataStored.Player.Time}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} playerMetadataStored.ServerTimestamp: {playerMetadataStored.ServerTimestamp}");

                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} deltaClient: {deltaClient}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} deltaServer: {deltaServer}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} delta: {delta}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} Before player.X: {player.X}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} Before player.Y: {player.Y}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} Before player.Speed: {player.Speed}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} Before player.Rotation: {player.Rotation}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} Before playerMetadataStored.Player.X: {playerMetadataStored.Player.X}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} Before playerMetadataStored.Player.Y: {playerMetadataStored.Player.Y}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} Before playerMetadataStored.Player.Speed: {playerMetadataStored.Player.Speed}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} Before playerMetadataStored.Player.Rotation: {playerMetadataStored.Player.Rotation}");

                    UpdatePlayerFromInput(playerMetadataStored.Player, playerMetadataStored.Player, delta);
                    playerMetadataStored.Player.X += delta * playerMetadataStored.Player.Speed * Math.Cos(playerMetadataStored.Player.Rotation);
                    playerMetadataStored.Player.Y += delta * playerMetadataStored.Player.Speed * Math.Sin(playerMetadataStored.Player.Rotation);

                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} After playerMetadataStored.Player.X: {playerMetadataStored.Player.X}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} After playerMetadataStored.Player.Y: {playerMetadataStored.Player.Y}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} After playerMetadataStored.Player.Speed: {playerMetadataStored.Player.Speed}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} After playerMetadataStored.Player.Rotation: {playerMetadataStored.Player.Rotation}");

                    var deltaX   = playerMetadataStored.Player.X - player.X;
                    var deltaY   = playerMetadataStored.Player.Y - player.Y;
                    var distance = Math.Sqrt(deltaX * deltaX + deltaY * deltaY);

                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} deltaX: {deltaX}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} deltaY: {deltaY}");

                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} distance from existing location {distance}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} playerMetadataStored.Player.Left: {playerMetadataStored.Player.Left} vs player.Left: {player.Left}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} playerMetadataStored.Player.Right: {playerMetadataStored.Player.Right} vs player.Right: {player.Right}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} playerMetadataStored.Player.Top: {playerMetadataStored.Player.Top} vs player.Top: {player.Top}");
                    _logger.LogDebug(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} playerMetadataStored.Player.Bottom: {playerMetadataStored.Player.Bottom} vs player.Bottom: {player.Bottom}");

                    if (distance > 10)
                    {
                        _logger.LogInformation(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} distance from existing location {distance}");
                        if (distance > 150)
                        {
                            _logger.LogWarning(LoggingEvents.RemoteUpdatePlayerDebug, $"Player{player.ID} distance {distance} too high.");

                            playerMetadataStored.ServerTimestamp = now;
                            player.Speed           = 0;
                            player.X               = playerMetadataStored.Player.X;
                            player.Y               = playerMetadataStored.Player.Y;
                            player.Animation       = PlayerAnimations.Explosion;
                            player.AnimationTiming = PlayerAnimations.ExplosionTime;
                            playerMetadata         = playerMetadataStored;

                            _players.AddOrUpdate(connectionId, playerMetadataStored, (keyUpdate, playerUpdate) => playerMetadataStored);

                            return(RemoteUpdatePlayerResult.UpdateAll);
                        }
                    }

                    // Only update if inputs has changed
                    var inputsChanged =
                        playerMetadataStored.Player.Left != player.Left ||
                        playerMetadataStored.Player.Right != player.Right ||
                        playerMetadataStored.Player.Top != player.Top ||
                        playerMetadataStored.Player.Bottom != player.Bottom ||
                        playerMetadataStored.Player.Fire1 != player.Fire1;

                    playerMetadataStored.ServerTimestamp = now;
                    playerMetadataStored.Player.X        = player.X;
                    playerMetadataStored.Player.Y        = player.Y;
                    playerMetadataStored.Player.Speed    = player.Speed;
                    playerMetadataStored.Player.Rotation = player.Rotation;
                    playerMetadataStored.Player.Top      = player.Top;
                    playerMetadataStored.Player.Left     = player.Left;
                    playerMetadataStored.Player.Right    = player.Right;
                    playerMetadataStored.Player.Bottom   = player.Bottom;
                    playerMetadataStored.Player.Fire1    = player.Fire1;
                    playerMetadataStored.Player.Fire2    = player.Fire2;
                    playerMetadataStored.Player.Time     = player.Time;

                    _players.AddOrUpdate(connectionId, playerMetadataStored, (keyUpdate, playerUpdate) => playerMetadataStored);
                    playerMetadata = playerMetadataStored;

                    return(inputsChanged ?
                           RemoteUpdatePlayerResult.UpdateOthers :
                           RemoteUpdatePlayerResult.DoNotUpdate);
                }
                else
                {
                    _logger.LogError(LoggingEvents.RemoteUpdatePlayerDebug, $"Player not found {connectionId}");
                    playerMetadata = null;
                }

                return(RemoteUpdatePlayerResult.Failed);
            }
        }
Exemplo n.º 18
0
 private void Start()
 {
     myPlayer    = this.GetComponent <PlayerMetadata>();
     myPlayerMgr = this.GetComponent <PlayerFormManager>();
 }
Exemplo n.º 19
0
        // todo: refactor
        // this logic must be encapsulated in separated entity
        public async Task SendShape(int gameId, int roundNumber, int shapeId)
        {
            try
            {
                var       currentUserName = HttpContext.Current.User.Identity.Name;
                var       context = HttpContext.Current.GetOwinContext().Get <RoshamboContext>();
                var       currentShape = context.Set <GameShape>().Single(s => s.ShapeId.Equals(shapeId));
                GameShape ownerShape = null, oppShape = null;


                var game = context.Games.First(g => g.GameId.Equals(gameId));
                var lobbyOwnerName = game.LobbyOwner.UserName;
                // problem place - how to add round only once?
                var round = game.Rounds.Single(gr => gr.IdGame.Equals(gameId) && gr.RoundNumber.Equals(roundNumber));

                var lobbyName = game.Lobby.LobbyName;

                if (currentUserName.Equals(lobbyOwnerName))
                {
                    round.LobbyOwnerShapeName = currentShape.ShapeName;
                    ownerShape = currentShape;
                }
                else
                {
                    round.OpponentShapeName = currentShape.ShapeName;
                    oppShape = currentShape;
                }
                await context.SaveChangesAsync();

                Clients.Caller.shapeWasSent(gameId, roundNumber, shapeId, null);

                // round winner can be resolved now
                if (round.OpponentShapeName != null && round.LobbyOwnerShapeName != null)
                {
                    if (oppShape == null)
                    {
                        oppShape = context.Set <GameShape>().Single(s => s.ShapeName.Equals(round.OpponentShapeName));
                    }
                    if (ownerShape == null)
                    {
                        ownerShape = context.Set <GameShape>().Single(s => s.ShapeName.Equals(round.LobbyOwnerShapeName));
                    }

                    PlayerMetadata owner = new PlayerMetadata(lobbyOwnerName, ownerShape.ShapeName);

                    // todo: fix: exception raises here sometimes
                    PlayerMetadata opponent = new PlayerMetadata(game.Lobby.Players.First().User.UserName, round.OpponentShapeName);

                    // define round results, winner
                    var winnerUsername = WinnerDeterminant.DetermineWinner(owner, opponent);
                    round.IdRoundWinner = GetIdRoundWinner(winnerUsername, context);
                    await context.SaveChangesAsync();

                    // define info about tips using and send to client
                    var data = new { OwnerShapeId = ownerShape.ShapeId, OpponentShapeId = oppShape.ShapeId, WinnerUsername = winnerUsername };
                    Clients.Group(lobbyName).roundEnded(data);
                }
            }
            catch (Exception e)
            {
                Clients.Caller.shapeWasSent(null, null, null, e.ToString());
            }
        }
Exemplo n.º 20
0
 // Use this for initialization
 void Start()
 {
     formmMngr = this.GetComponent <PlayerFormManager>();
     meta      = this.GetComponent <PlayerMetadata>();
     agent     = this.GetComponent <NavMeshAgent>();
 }
Exemplo n.º 21
0
 public Team(PlayerMetadata playerOne, PlayerMetadata playerTwo)
 {
     PlayerOne = playerOne;
     PlayerTwo = PlayerTwo;
 }
        private void UsCommandHandler(CommandArgs e)
        {
            var player = e.Player;

            if (e.Parameters.Count < 1)
            {
                player.SendErrorMessage($"Invalid syntax! Use {Commands.Specifier}us help for help.");
                return;
            }

            var command = e.Parameters[0];

            if (command.Equals("color", StringComparison.CurrentCultureIgnoreCase))
            {
                if (e.Parameters.Count != 3)
                {
                    player.SendErrorMessage(
                        $"Invalid syntax! Proper syntax: {Commands.Specifier}us color <player name> <rrr,ggg,bbb>");
                    return;
                }

                var username = e.Parameters[1];
                var user     = TShock.Users.GetUserByName(username);
                if (user == null)
                {
                    player.SendErrorMessage($"Couldn't find any users under the name of '{username}'.");
                    return;
                }
                if (user.Name != player.User?.Name && !e.Player.HasPermission("us.setother"))
                {
                    e.Player.SendErrorMessage("You do not have permission to modify another user's chat data.");
                    return;
                }

                var color  = e.Parameters[2].Split(',');
                var target = _database.Get(user);
                if (color.Length != 3 || !byte.TryParse(color[0], out byte _) || !byte.TryParse(color[1], out byte _) ||
                    !byte.TryParse(color[2], out byte _))
                {
                    player.SendErrorMessage("Invalid color format.");
                    return;
                }

                if (target == null)
                {
                    target = new PlayerMetadata(user.ID, new ChatInformation(color: e.Parameters[2]), new PermissionCollection());
                    _database.Add(target);
                }
                else
                {
                    target.ChatData.Color = e.Parameters[2];
                    _database.Update(target);
                }

                player.SendSuccessMessage($"Successfully set {user.Name}'s color.");
            }
            else if (command.Equals("prefix", StringComparison.CurrentCultureIgnoreCase))
            {
                if (e.Parameters.Count != 3)
                {
                    player.SendErrorMessage(
                        $"Invalid syntax! Proper syntax: {Commands.Specifier}us prefix <player name> <prefix>");
                    return;
                }

                var username = e.Parameters[1];
                var user     = TShock.Users.GetUserByName(username);
                if (user == null)
                {
                    player.SendErrorMessage($"Couldn't find any users under the name of '{username}'.");
                    return;
                }
                if (user.Name != player.User?.Name && !e.Player.HasPermission("us.setother"))
                {
                    e.Player.SendErrorMessage("You do not have permission to modify another user's chat data.");
                    return;
                }

                e.Parameters.RemoveRange(0, 2);
                var prefix = string.Join(" ", e.Parameters);
                if (prefix.Length > _config.MaximumPrefixLength)
                {
                    player.SendErrorMessage(
                        $"The prefix cannot contain more than {_config.MaximumPrefixLength} characters.");
                    return;
                }

                if (_config.ProhibitedWords.Any(prefix.Contains))
                {
                    player.SendErrorMessage(
                        $"The prefix cannot contain the following words: {string.Join(", ", from w in _config.ProhibitedWords where prefix.Contains(w) select w)}");
                    return;
                }

                var target = _database.Get(user);
                if (target == null)
                {
                    target = new PlayerMetadata(user.ID, new ChatInformation(prefix), new PermissionCollection());
                    _database.Add(target);
                }
                else
                {
                    target.ChatData.Prefix = prefix;
                    _database.Update(target);
                }

                player.SendSuccessMessage($"Successfully set {user.Name}'s prefix.");
            }
            else if (command.Equals("read", StringComparison.CurrentCultureIgnoreCase))
            {
                if (e.Parameters.Count != 2)
                {
                    player.SendErrorMessage(
                        $"Invalid syntax! Proper syntax: {Commands.Specifier}us read <player name>");
                    return;
                }

                var username = e.Parameters[1];
                var user     = TShock.Users.GetUserByName(username);
                if (user == null)
                {
                    player.SendErrorMessage($"Couldn't find any users under the name of '{username}'.");
                    return;
                }

                var target = _database.Get(user);
                if (target == null)
                {
                    player.SendErrorMessage("This user has no chat data to display.");
                    return;
                }

                player.SendInfoMessage($"Username: {user.Name}");
                player.SendMessage($"  * Prefix: {target.ChatData.Prefix ?? "None"}", Color.LawnGreen);
                player.SendMessage($"  * Suffix: {target.ChatData.Suffix ?? "None"}", Color.LawnGreen);
                player.SendMessage($"  * Chat color: {target.ChatData.Color ?? "None"}", Color.LawnGreen);
            }
            else if (command.Equals("remove", StringComparison.CurrentCultureIgnoreCase))
            {
                if (e.Parameters.Count != 3)
                {
                    player.SendErrorMessage(
                        $"Invalid syntax! Proper syntax: {Commands.Specifier}us remove <player name> <prefix/suffix/color/all>");
                    return;
                }

                var inputOption = e.Parameters[2];
                var username    = e.Parameters[1];
                var user        = TShock.Users.GetUserByName(username);
                if (user == null)
                {
                    player.SendErrorMessage($"Couldn't find any users under the name of '{username}'.");
                    return;
                }
                if (user.Name != player.User?.Name && !player.HasPermission("us.setother"))
                {
                    player.SendErrorMessage("You do not have permission to modify another user's chat data.");
                    return;
                }

                var target = _database.Get(user);
                if (target == null)
                {
                    player.SendErrorMessage($"No information found for user '{user.Name}'.");
                    return;
                }

                switch (inputOption.ToLowerInvariant())
                {
                case "all":
                    if (!player.HasPermission("us.resetall"))
                    {
                        player.SendErrorMessage("You do not have access to this command.");
                        return;
                    }

                    target.ChatData = new ChatInformation();
                    player.SendSuccessMessage("Reset successful.");
                    break;

                case "color":
                    if (!player.HasPermission("us.remove.color"))
                    {
                        player.SendErrorMessage("You do not have access to this command.");
                        return;
                    }

                    target.ChatData.Color = null;
                    player.SendSuccessMessage($"Modified {user.Name}'s chat color successfully.");
                    break;

                case "prefix":
                    if (!player.HasPermission("us.remove.prefix"))
                    {
                        player.SendErrorMessage("You do not have access to this command.");
                        return;
                    }

                    target.ChatData.Prefix = null;
                    player.SendSuccessMessage($"Modified {user.Name}'s chat prefix successfully.");
                    break;

                case "suffix":
                    if (!player.HasPermission("us.remove.suffix"))
                    {
                        player.SendErrorMessage("You do not have access to this command.");
                        return;
                    }

                    target.ChatData.Suffix = null;
                    player.SendSuccessMessage($"Modified {user.Name}'s chat suffix successfully.");
                    break;

                default:
                    player.SendErrorMessage("Invalid option!");
                    break;
                }
                _database.Update(target);
            }
            else if (command.Equals("suffix", StringComparison.CurrentCultureIgnoreCase))
            {
                if (e.Parameters.Count != 3)
                {
                    player.SendErrorMessage(
                        $"Invalid syntax! Proper syntax: {Commands.Specifier}us suffix <player name> <suffix>");
                    return;
                }

                var username = e.Parameters[1];
                var user     = TShock.Users.GetUserByName(username);
                if (user == null)
                {
                    player.SendErrorMessage($"Couldn't find any users under the name of '{username}'.");
                    return;
                }
                if (user.Name != player.User.Name && !player.HasPermission("us.setother"))
                {
                    player.SendErrorMessage("You do not have permission to modify another user's chat data.");
                    return;
                }

                e.Parameters.RemoveRange(0, 2);
                var suffix = string.Join(" ", e.Parameters);
                if (suffix.Length > _config.MaximumSuffixLength)
                {
                    player.SendErrorMessage(
                        $"The suffix cannot contain more than {_config.MaximumSuffixLength} characters.");
                    return;
                }
                if (_config.ProhibitedWords.Any(suffix.Contains))
                {
                    player.SendErrorMessage(
                        $"The suffix cannot contain the following words: {string.Join(", ", from w in _config.ProhibitedWords where suffix.Contains(w) select w)}");
                    return;
                }

                var target = _database.Get(user);
                if (target == null)
                {
                    target = new PlayerMetadata(user.ID, new ChatInformation(suffix: suffix), new PermissionCollection());
                    _database.Add(target);
                }
                else
                {
                    target.ChatData.Suffix = suffix;
                    _database.Update(target);
                }

                player.SendSuccessMessage($"Successfully set {user.Name}'s suffix.");
            }
            else
            {
                player.SendInfoMessage("Available commands:");
                player.SendInfoMessage($"{Commands.Specifier}us prefix <player name> <prefix>");
                player.SendInfoMessage($"{Commands.Specifier}us suffix <player name> <suffix>");
                player.SendInfoMessage($"{Commands.Specifier}us color <player name> <color>");
                player.SendInfoMessage($"{Commands.Specifier}us read <player name>");
                player.SendInfoMessage($"{Commands.Specifier}us remove <player name> <prefix/suffix/color/all>");
            }
        }
Exemplo n.º 23
0
 public Team(PlayerMetadata playerOne, PlayerMetadata playerTwo)
 {
     PlayerOne = playerOne;
     PlayerTwo = PlayerTwo;
 }
        private void UsPermissionCommandHandler(CommandArgs e)
        {
            var player = e.Player;

            if (e.Parameters.Count < 1)
            {
                player.SendErrorMessage("Invalid syntax! Proper syntax:");
                player.SendErrorMessage($"{Commands.Specifier}permission add <player name> <permissions>");
                player.SendErrorMessage($"{Commands.Specifier}permission delete <player name> <permissions>");
                player.SendErrorMessage($"{Commands.Specifier}permission list <player name> [page]");
                return;
            }

            var command = e.Parameters[0];

            if (command.Equals("add", StringComparison.CurrentCultureIgnoreCase))
            {
                if (e.Parameters.Count < 3)
                {
                    player.SendErrorMessage(
                        $"Invalid syntax! Proper syntax: {Commands.Specifier}permission add <player name> <permission1 permission2 permissionN>");
                    return;
                }

                var username = e.Parameters[1];
                var user     = TShock.Users.GetUserByName(username);
                if (user == null)
                {
                    player.SendErrorMessage($"Couldn't find any users under the name of '{username}'.");
                    return;
                }

                e.Parameters.RemoveRange(0, 2);
                var target = _database.Get(user);
                if (target == null)
                {
                    target = new PlayerMetadata(user.ID, new ChatInformation(), new PermissionCollection(e.Parameters));
                    _database.Add(target);
                }
                else
                {
                    e.Parameters.ForEach(p => target.Permissions.Add(p));
                    _database.Update(target);
                }

                player.SendSuccessMessage($"Modified '{user.Name}''s permissions successfully.");
            }
            else if (command.Equals("list", StringComparison.CurrentCultureIgnoreCase))
            {
                if (e.Parameters.Count != 2)
                {
                    player.SendErrorMessage(
                        $"Invalid syntax! Proper syntax: {Commands.Specifier}permission list <player name>");
                    return;
                }

                var username = e.Parameters[1];
                var user     = TShock.Users.GetUserByName(username);
                if (user == null)
                {
                    player.SendErrorMessage($"Couldn't find any users under the name of '{username}'.");
                    return;
                }

                var target = _database.Get(user);
                if (target == null || target.Permissions.Count == 0)
                {
                    player.SendInfoMessage("This player has no permissions to list.");
                    return;
                }

                player.SendInfoMessage($"{user.Name}'s permissions: {target.Permissions}");
            }
            else if (command.Equals("remove", StringComparison.CurrentCultureIgnoreCase))
            {
                if (e.Parameters.Count < 3)
                {
                    player.SendErrorMessage(
                        $"Invalid syntax! Proper syntax: {Commands.Specifier}permission remove <player name> <permission1 permission2 permissionN>");
                    return;
                }

                var username = e.Parameters[1];
                var user     = TShock.Users.GetUserByName(username);
                if (user == null)
                {
                    player.SendErrorMessage($"Couldn't find any users under the name of '{username}'.");
                    return;
                }

                e.Parameters.RemoveRange(0, 2);
                var target = _database.Get(user);
                if (target == null || target.Permissions.Count == 0)
                {
                    player.SendInfoMessage("This user has no permissions to remove.");
                    return;
                }

                e.Parameters.ForEach(p => target.Permissions.Remove(p));
                _database.Update(target);
                player.SendSuccessMessage($"Modified '{user.Name}''s permissions successfully.");
            }
            else
            {
                player.SendErrorMessage("Invalid sub-command.");
            }
        }
Exemplo n.º 25
0
    public void ReplaceServerConnection(float newStateTime, float newPacketUnreceivedTime, float newTimeoutCounter, int newRetryTime, float newKeepAliveCounter, PlayerMetadata newPlayerMetadata, System.Net.IPEndPoint newClientEP, GameEntity newPlayerView, ServerConnectionComponent.State newState)
    {
        var index     = NetworkComponentsLookup.ServerConnection;
        var component = CreateComponent <ServerConnectionComponent>(index);

        component.stateTime            = newStateTime;
        component.packetUnreceivedTime = newPacketUnreceivedTime;
        component.timeoutCounter       = newTimeoutCounter;
        component.retryTime            = newRetryTime;
        component.keepAliveCounter     = newKeepAliveCounter;
        component.playerMetadata       = newPlayerMetadata;
        component.clientEP             = newClientEP;
        component.playerView           = newPlayerView;
        component.state = newState;
        ReplaceComponent(index, component);
    }
Exemplo n.º 26
0
 public PlayerClass()
 {
     playerPosition = new PlayerPosition();
     animation      = new AnimationState();
     metadata       = new PlayerMetadata();
 }