/** 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); }
public void Deserialize(NetDataReader reader) { PlayerId = reader.GetByte(); Metadata = reader.Get <PlayerMetadata>(); PlayerState = reader.Get <PlayerState>(); NetworkObjectState = reader.Get <NetworkObjectState>(); }
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 )); }
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); }
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); }
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()); }
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; } } }
/// 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); }
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 }); }
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)); } }
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(); }
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); }
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); } } }
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); } }
private void Start() { myPlayer = this.GetComponent <PlayerMetadata>(); myPlayerMgr = this.GetComponent <PlayerFormManager>(); }
// 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()); } }
// Use this for initialization void Start() { formmMngr = this.GetComponent <PlayerFormManager>(); meta = this.GetComponent <PlayerMetadata>(); agent = this.GetComponent <NavMeshAgent>(); }
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>"); } }
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."); } }
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); }
public PlayerClass() { playerPosition = new PlayerPosition(); animation = new AnimationState(); metadata = new PlayerMetadata(); }