static void UpdatePlayerStatus(UdpClient client, uint pid, PlayerStatus status) { NetWerewolfPlayer ap = ConnectedPlayers.Find(p => p.PlayerID == pid); ap.Status = status; UpdatePlayerList.Invoke(pid, status == PlayerStatus.Dead); }
static void RemoteClientDisconnected(UdpClient client, uint pid) { if (LocalPlayer.PlayerID == pid) { CloseClientInstance(); } if (ServerInstance == null) { ConnectedPlayers.Remove(ConnectedPlayers.Find(p => p.PlayerID == pid)); } // TODO: GameInfo removal (Maybe make dead if alive, and then remove once spectator?) UpdatePlayerList.Invoke(pid, true); }
public void OnClose(IWebSocketConnection socket) { // Remove disconnected player from manager. var player = ConnectedPlayers.Find(x => x.Socket == socket); if (player != null) { ConnectedPlayers.Remove(player); Logger.Log(this, "Player {0} disconnected", player.Data.Name); NotifyPlayerEvent(player, PlayerAction.Disconnected); if (PlayerDisconnected != null) { PlayerDisconnected(this, player); } } }
static void ReceivedChatMessage(UdpClient client, uint pid, string message) { ChatMessageReceived.Invoke(ConnectedPlayers.Find(p => p.PlayerID == pid), message); }
static void RequestActionOnPlayer(UdpClient sender, uint pid) { NetWerewolfPlayer player = sender.GetPlayer(); NetWerewolfPlayer target = ConnectedPlayers.Find(p => p.PlayerID == pid); switch (player.Status) { case PlayerStatus.Dead: sender.Send(5, 0u, $"You are dead and cannot perform any more actions!"); return; case PlayerStatus.Spectating: sender.Send(5, 0u, $"Spectators cannot perform in-game actions."); return; } if (target == null) { sender.Send(5, 0u, $"Targeted player with ID {pid} not found."); return; } if (CurrentDay == 0 && CurrentGameState == GameState.Discussion) { sender.Send(5, 0u, $"No votes for execution will be considered until the first night is over!"); return; } switch (CurrentGameState) { case GameState.Dawn: sender.Send(5, 0u, $"Please wait until dawn is over to begin voting."); break; case GameState.Discussion: // TODO: Vote against player if (target.PlayerID == player.PlayerID) { sender.Send(5, 0u, $"You cannot vote yourself onto trial!"); break; } if (player.TrialTargetPID != target.PlayerID) { player.TrialTargetPID = target.PlayerID; target.TrialVotes++; ServerInstance.Send(5, 0u, $"{player.Name} has voted to trial {target.Name}! ({target.TrialVotes}/2)"); if (target.TrialVotes >= 2 && PlayerOnTrial == null) { PlayerOnTrial = target; CurrentGameState = GameState.Trial; StateChanged = true; StateTime = 20; } } else if (player.TrialTargetPID == target.PlayerID) { player.TrialTargetPID = 0u; target.TrialVotes--; ServerInstance.Send(5, 0u, $"{player.Name} has revoked their vote to trial {target.Name}. ({target.TrialVotes}/2)"); } break; case GameState.Trial: if (PlayerOnTrial != null && PlayerOnTrial.Status != PlayerStatus.Dead) { if (player.PlayerID == PlayerOnTrial.PlayerID) { sender.Send(5, 0u, $"You are on trial and cannot vote to execute yourself!"); break; } player.VotedForKill = !player.VotedForKill; if (player.VotedForKill) { sender.Send(5, 0u, $"You have voted to kill {PlayerOnTrial.Name}."); } else { sender.Send(5, 0u, $"You have decided to revoke your vote to kill {PlayerOnTrial.Name}."); } } else { sender.Send(5, 0u, $"The player who was on trial can no longer be voted against."); } break; case GameState.Night: // TODO: Night abilities if (player.Role.NightEvent == null) { sender.Send(5, 0u, $"The {player.Role.Name} role does not have a night ability!"); break; } if (player.Role.NightEvent.EventTargets == 0) { sender.Send(5, 0u, $"Your night ability is passive and does not require a target."); break; } if (player.Role.NightEvent.TargetPlayers[0] == null || player.Role.NightEvent.TargetPlayers[0].PlayerID != target.PlayerID) { player.Role.NightEvent.TargetPlayers[0] = target; sender.Send(5, 0u, $"You have decided to target {target.Name}."); // TODO: custom action text } else { player.Role.NightEvent.TargetPlayers[0] = null; sender.Send(5, 0u, $"You have instead decided not to perform your night ability."); } break; case GameState.End: sender.Send(5, 0u, $"The game is already over!"); break; } }
// Return Player reference of invoker private Player GetCurrentPlayer() { return(ConnectedPlayers.Find(player => player.ConnectionId == Context.ConnectionId)); }