Working start and game stop on mafia leave

This commit is contained in:
Ilya 2021-01-19 21:01:38 +03:00
parent eb23f27364
commit 6d99b0bbee
18 changed files with 544 additions and 28 deletions

27
MafiaCommon/ArrayUtils.cs Normal file
View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
namespace MafiaCommon
{
public static class ListUtils
{
public static void Shuffle<T> (this Random rng, T[] array)
{
int n = array.Length;
while (n > 1)
{
int k = rng.Next(n--);
T temp = array[n];
array[n] = array[k];
array[k] = temp;
}
}
public static T[] RemoveFromArray<T> (this T[] original, int numIdx) {
if (numIdx == -1) return original;
List<T> tmp = new List<T>(original);
tmp.RemoveAt(numIdx);
return tmp.ToArray();
}
}
}

8
MafiaCommon/ChatType.cs Normal file
View File

@ -0,0 +1,8 @@
namespace MafiaCommon
{
public enum ChatType
{
Queue=1,
Active=2,
}
}

10
MafiaCommon/GameState.cs Normal file
View File

@ -0,0 +1,10 @@
namespace MafiaCommon
{
public enum GameState
{
NotStarted=1,
VotingNight=2,
Day=3,
VotingDay=4
}
}

View File

@ -1,7 +0,0 @@
namespace MafiaCommon.Packets
{
public enum ChatType
{
Queue=1
}
}

View File

@ -0,0 +1,10 @@
namespace MafiaCommon.Packets
{
public class DisconnectPlayerPacket : Packet
{
public DisconnectPlayerPacket() : base(PacketType.DisconnectPlayer)
{
}
}
}

View File

@ -0,0 +1,16 @@
using System.Collections.Generic;
namespace MafiaCommon.Packets
{
public class EndGamePacket : Packet
{
public readonly bool IsWon;
public readonly List<PlayerRole> PlayerRoles;
public EndGamePacket(bool isWon, List<PlayerRole> playerRoles) : base(PacketType.EndGame)
{
IsWon = isWon;
PlayerRoles = playerRoles;
}
}
}

View File

@ -0,0 +1,12 @@
namespace MafiaCommon.Packets
{
public class GameStartPacket : Packet
{
public readonly Role Role;
public GameStartPacket(Role role) : base(PacketType.GameStartPacket)
{
Role = role;
}
}
}

View File

@ -43,6 +43,12 @@ namespace MafiaCommon.Packets
case PacketType.MessageSendPacket:
packet = JsonConvert.DeserializeObject<MessageSendPacket>(json);
break;
case PacketType.GameStartPacket:
packet = JsonConvert.DeserializeObject<GameStartPacket>(json);
break;
case PacketType.EndGame:
packet = JsonConvert.DeserializeObject<EndGamePacket>(json);
break;
}
return packet;

View File

@ -9,6 +9,9 @@
PlayerDisconnected=5,
MessageReceivePacket=6,
MessageSendPacket=7,
GameStartPacket=8,
EndGame=9,
DisconnectPlayer=10,
ServerShutdown=99
}
}

14
MafiaCommon/PlayerRole.cs Normal file
View File

@ -0,0 +1,14 @@
namespace MafiaCommon
{
public class PlayerRole
{
public readonly string Name;
public readonly Role Role;
public PlayerRole(string name, Role role)
{
Name = name;
Role = role;
}
}
}

21
MafiaCommon/Role.cs Normal file
View File

@ -0,0 +1,21 @@
namespace MafiaCommon
{
public enum Role
{
Citizen=1,
Commissar=2,
Don=3,
Doctor=4,
Sheriff=5,
Mafia=6,
Deathless=7,
Putana=8,
BlackJudge=9,
BlackLawyer=10,
YakuzaFighter=11,
Ninja=12,
Maniac=13,
Werewolf=14,
RedJudge=15
}
}

View File

@ -6,7 +6,7 @@
mc:Ignorable="d"
Title="RMafia" Height="450" Width="800">
<Grid>
<Grid x:Name="MainMenu">
<Grid x:Name="MainMenu" Visibility="Visible">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="30*"></ColumnDefinition>
@ -127,6 +127,7 @@
<ListBox Grid.Column="5" Grid.ColumnSpan="5" Grid.Row="1" Grid.RowSpan="8" x:Name="QueueChat"></ListBox>
<TextBox Grid.Column="5" Grid.ColumnSpan="4" Grid.Row="9" TextWrapping="Wrap" x:Name="QueueChatInput"></TextBox>
<Button Grid.Column="9" Grid.Row="9" Content="Отправить!" Click="GameQueueChatSend_OnClick"></Button>
<Button Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="9" Content="Выйти" Click="GameQueueLeave_OnClick"></Button>
</Grid>
<Grid x:Name="DisconnectScreen" Visibility="Hidden">
@ -152,5 +153,99 @@
<TextBlock Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="3" HorizontalAlignment="Center" x:Name="ReasonText" FontSize="25" TextWrapping="Wrap"></TextBlock>
<Button Grid.Column="2" Grid.Row="6" Click="Back_OnClick" Content="Назад" FontSize="25"></Button>
</Grid>
<Grid x:Name="GameVotingPassive" Visibility="Hidden">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="5*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="7" HorizontalAlignment="Center" FontSize="30" x:Name="GameVotingPassiveRole"></TextBlock>
<TextBlock Grid.Row="5" Grid.Column="2" Grid.ColumnSpan="7" Text="Спи спокойно, пока можешь" HorizontalAlignment="Center" FontSize="30"></TextBlock>
</Grid>
<Grid x:Name="GameVotingActive" Visibility="Hidden" KeyUp="GameVotingActive_OnKeyUp">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="10*"></ColumnDefinition>
<ColumnDefinition Width="5*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="7" HorizontalAlignment="Center" FontSize="30" x:Name="GameVotingActiveRole"></TextBlock>
<ListBox Grid.Column="5" Grid.ColumnSpan="5" Grid.Row="2" Grid.RowSpan="8" x:Name="GameVotingActiveChat"></ListBox>
<TextBox Grid.Column="5" Grid.ColumnSpan="4" Grid.Row="10" TextWrapping="Wrap" x:Name="GameVotingActiveChatInput"></TextBox>
<Button Grid.Column="9" Grid.Row="10" Content="Отправить!" Click="GameVotingActiveChatSend_OnClick"></Button>
<ListBox Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="2" Grid.RowSpan="8" x:Name="GameVotingActiveSelect"></ListBox>
</Grid>
<Grid x:Name="GameEndScreen" Visibility="Hidden">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*"></ColumnDefinition>
<ColumnDefinition Width="25*"></ColumnDefinition>
<ColumnDefinition Width="40*"></ColumnDefinition>
<ColumnDefinition Width="25*"></ColumnDefinition>
<ColumnDefinition Width="5*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="35*"></RowDefinition>
<RowDefinition Height="5*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
<RowDefinition Height="10*"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Grid.Column="2" Grid.Row="1" FontSize="30" HorizontalAlignment="Center" x:Name="GameEndScreenWon"></TextBlock>
<TextBlock Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="3" HorizontalAlignment="Center" x:Name="GameEndScreenRoles" FontSize="25" TextWrapping="Wrap"></TextBlock>
<Button Grid.Column="2" Grid.Row="6" Click="GameEndScreenBack_OnClick" Content="Назад" FontSize="25"></Button>
</Grid>
</Grid>
</Window>

View File

@ -14,7 +14,7 @@ using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using DiscordRPC;
using MafiaCommon.Packets;
using MafiaCommon;
namespace MafiaGame
{
@ -143,5 +143,92 @@ namespace MafiaGame
QueueChatInput.Clear();
}
}
public void ShowVotingPassive(string name)
{
GameQueue.Visibility = Visibility.Hidden;
GameVotingPassive.Visibility = Visibility.Visible;
GameVotingPassiveRole.Text = name;
}
public void ShowVotingActive(string name)
{
GameQueue.Visibility = Visibility.Hidden;
GameVotingActive.Visibility = Visibility.Visible;
GameVotingActiveRole.Text = name;
}
private void GameVotingActiveChatSend_OnClick(object sender, RoutedEventArgs e)
{
if (GameVotingActiveChatInput.Text.Trim() != "")
{
App.Instance.Connection.SendMessage(ChatType.Active, GameVotingActiveChatInput.Text);
GameVotingActiveChatInput.Clear();
}
}
private void GameVotingActive_OnKeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
GameVotingActiveChatSend_OnClick(null, null);
}
}
public void ShowGameEnd(bool isWon, List<PlayerRole> playerRoles)
{
if (isWon)
{
GameEndScreenWon.Text = "Ты победил!";
}
else
{
GameEndScreenWon.Text = "Ты проиграл!";
}
string text = "";
foreach (PlayerRole playerRole in playerRoles)
{
string role = "Роль";
switch (playerRole.Role)
{
case Role.Citizen:
role = "Мирный житель";
break;
case Role.Mafia:
role = "Мафия";
break;
case Role.Don:
role = "Дон";
break;
}
text += playerRole.Name + " - " + role + Environment.NewLine;
}
GameEndScreenRoles.Text = text;
GameVotingActive.Visibility = Visibility.Hidden;
GameVotingPassive.Visibility = Visibility.Hidden;
GameEndScreen.Visibility = Visibility.Visible;
}
private void GameEndScreenBack_OnClick(object sender, RoutedEventArgs e)
{
GameEndScreen.Visibility = Visibility.Hidden;
GameQueue.Visibility = Visibility.Visible;
}
private void GameQueueLeave_OnClick(object sender, RoutedEventArgs e)
{
App.Instance.Connection.Disconnect();
GameQueue.Visibility = Visibility.Hidden;
MainMenu.Visibility = Visibility.Visible;
App.Instance.GetRpcClient().SetPresence(new RichPresence()
{
State = "В главном меню"
});
}
}
}

View File

@ -5,6 +5,7 @@ using System.Threading;
using System.Windows.Controls;
using DiscordRPC;
using MafiaCommon.Packets;
using MafiaCommon;
namespace MafiaGame
{
@ -37,12 +38,13 @@ namespace MafiaGame
}
catch (Exception e)
{
App.Current.Dispatcher.Invoke((Action)(() =>
App.Current.Dispatcher.Invoke((Action) (() =>
{
MainWindow.Instance.ShowDisconnectScreen(e.Message);
}));
return;
}
_socket.Send(PacketConverter.toBytes(new ConnectPacket(Settings.Config().Nick)));
_thread.IsBackground = true;
_thread.Start();
@ -53,6 +55,13 @@ namespace MafiaGame
_socket.Send(PacketConverter.toBytes(new MessageSendPacket(chatType, text)));
}
public void Disconnect()
{
_socket.Send(PacketConverter.toBytes(new DisconnectPlayerPacket()));
_thread.Interrupt();
_socket.Close();
}
private void serverListener()
{
while (!_breakFlag)
@ -64,8 +73,7 @@ namespace MafiaGame
{
bytes = _socket.Receive(data);
builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
}
while (_socket.Available>0);
} while (_socket.Available > 0);
Console.WriteLine(builder.ToString());
@ -73,7 +81,7 @@ namespace MafiaGame
switch (packet.PacketType)
{
case PacketType.Welcome:
App.Current.Dispatcher.Invoke((Action)(() =>
App.Current.Dispatcher.Invoke((Action) (() =>
{
MainWindow.Instance.QueueOnline.Text = ((WelcomePacket) packet).Players + "/" +
((WelcomePacket) packet).MaxPlayers;
@ -87,7 +95,7 @@ namespace MafiaGame
secrets.SpectateSecret = _host + ":" + _port + "/spectate";
App.Instance.GetRpcClient().SetPresence(new RichPresence()
{
State = ((WelcomePacket)packet).ServerName,
State = ((WelcomePacket) packet).ServerName,
Party = party,
Secrets = secrets,
Timestamps = Timestamps.Now,
@ -96,37 +104,54 @@ namespace MafiaGame
}));
break;
case PacketType.Disconnect:
App.Current.Dispatcher.Invoke((Action)(() =>
App.Current.Dispatcher.Invoke((Action) (() =>
{
MainWindow.Instance.ShowDisconnectScreen(((DisconnectPacket)packet).Reason);
MainWindow.Instance.ShowDisconnectScreen(((DisconnectPacket) packet).Reason);
}));
_breakFlag = true;
break;
case PacketType.PlayerConnected:
App.Current.Dispatcher.Invoke((Action)(() =>
App.Current.Dispatcher.Invoke((Action) (() =>
{
MainWindow.Instance.QueueOnline.Text = ((PlayerConnectedPacket) packet).Players + "/" +
((PlayerConnectedPacket) packet).MaxPlayers;
}));
App.Instance.GetRpcClient().UpdatePartySize(((PlayerConnectedPacket) packet).Players);
try
{
App.Instance.GetRpcClient().UpdatePartySize(((PlayerConnectedPacket) packet).Players);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
break;
case PacketType.PlayerDisconnected:
App.Current.Dispatcher.Invoke((Action)(() =>
App.Current.Dispatcher.Invoke((Action) (() =>
{
MainWindow.Instance.QueueOnline.Text = ((PlayerDisconnectedPacket) packet).Players + "/" +
((PlayerDisconnectedPacket) packet).MaxPlayers;
}));
App.Instance.GetRpcClient().UpdatePartySize(((PlayerDisconnectedPacket) packet).Players);
try
{
App.Instance.GetRpcClient().UpdatePartySize(((PlayerDisconnectedPacket) packet).Players);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
break;
case PacketType.ServerShutdown:
App.Current.Dispatcher.Invoke((Action)(() =>
App.Current.Dispatcher.Invoke((Action) (() =>
{
MainWindow.Instance.ShowDisconnectScreen("Сервер выключен: "+((ServerShutdownPacket)packet).Reason);
MainWindow.Instance.ShowDisconnectScreen("Сервер выключен: " +
((ServerShutdownPacket) packet).Reason);
}));
_breakFlag = true;
break;
case PacketType.MessageReceivePacket:
App.Current.Dispatcher.Invoke((Action)(() =>
App.Current.Dispatcher.Invoke((Action) (() =>
{
ListBoxItem message = new ListBoxItem();
if (((MessageReceivePacket) packet).IsSystem)
@ -139,15 +164,51 @@ namespace MafiaGame
((MessageReceivePacket) packet).Text;
}
switch (((MessageReceivePacket)packet).ChatType)
switch (((MessageReceivePacket) packet).ChatType)
{
case ChatType.Queue:
MainWindow.Instance.QueueChat.Items.Add(message);
MainWindow.Instance.QueueChat.ScrollIntoView(message);
break;
case ChatType.Active:
MainWindow.Instance.GameVotingActiveChat.Items.Add(message);
MainWindow.Instance.GameVotingActiveChat.ScrollIntoView(message);
break;
}
}));
break;
case PacketType.GameStartPacket:
switch (((GameStartPacket) packet).Role)
{
case Role.Citizen:
App.Current.Dispatcher.Invoke((Action) (() =>
{
MainWindow.Instance.ShowVotingPassive("Ты Мирный Житель");
}));
break;
case Role.Don:
App.Current.Dispatcher.Invoke((Action) (() =>
{
MainWindow.Instance.ShowVotingActive("Ты Дон, выбери кого убить!");
}));
break;
case Role.Mafia:
App.Current.Dispatcher.Invoke((Action) (() =>
{
MainWindow.Instance.ShowVotingActive("Ты Мафия, выбери кого убить!");
}));
break;
}
App.Instance.GetRpcClient().UpdateDetails("Голосование");
break;
case PacketType.EndGame:
App.Current.Dispatcher.Invoke((Action) (() =>
{
MainWindow.Instance.ShowGameEnd(((EndGamePacket)packet).IsWon,((EndGamePacket)packet).PlayerRoles);
}));
App.Instance.GetRpcClient().UpdateDetails("Ожидание старта");
break;
}
}
}

View File

@ -0,0 +1,4 @@
namespace MafiaServer.Events
{
public delegate void OnDisconnectEvent(PlayerSocketWorker player);
}

View File

@ -1,4 +1,4 @@
using MafiaCommon.Packets;
using MafiaCommon;
namespace MafiaServer.Events
{

View File

@ -1,13 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using MafiaCommon.Packets;
using MafiaCommon;
namespace MafiaServer
{
public class Game
{
private List<PlayerSocketWorker> _players = new List<PlayerSocketWorker>();
private List<PlayerRole> _playerRolesAtStart = new List<PlayerRole>();
private bool isStarted = false;
private GameState _gameState = GameState.NotStarted;
List<PlayerSocketWorker> _mafia = new List<PlayerSocketWorker>();
public Game()
{
@ -31,17 +37,112 @@ namespace MafiaServer
player.Id = _players.LastIndexOf(player);
player.OnDisconnectByErrorEvent += OnDisconnectByError;
player.OnPlayerSendMessageEvent += PlayerOnOnPlayerSendMessageEvent;
player.OnDisconnectEvent += PlayerOnOnDisconnectEvent;
player.sendPacket(new WelcomePacket(Settings.Config().ServerName,_players.Count,Settings.Config().MaxPlayers));
}
}
private void PlayerOnOnDisconnectEvent(PlayerSocketWorker sender)
{
_players.Remove(sender);
foreach (PlayerSocketWorker player in _players)
{
player.sendPacket(new PlayerDisconnectedPacket(true,sender.Id,_players.Count,Settings.Config().MaxPlayers));
}
if (sender.Role == Role.Don)
{
_mafia.Remove(sender);
if (_mafia.Count == 0)
{
foreach (PlayerSocketWorker player in _players)
{
player.sendPacket(new EndGamePacket(true,_playerRolesAtStart));
}
isStarted = false;
_gameState = GameState.NotStarted;
}
else
{
_mafia[0].Role = Role.Don;
if (_gameState == GameState.VotingNight)
{
_mafia[0].sendPacket(new MessageReceivePacket(ChatType.Active,true,"System","Дон покинул игру, ты новый дон!"));
}
}
}
}
public void Start()
{
if (isStarted)
{
return;
}
if (_players.Count < 2)
{
Console.WriteLine("Not Enough Players");
return;
}
foreach (PlayerSocketWorker player in _players)
{
player.Role = Role.Citizen;
}
_playerRolesAtStart.Clear();
Random random = new Random();
PlayerSocketWorker[] empty = _players.ToArray();
random.Shuffle(empty);
int mafiasNeed = 1;
if (empty.Length > 5)
{
mafiasNeed = empty.Length / 3;
}
while (mafiasNeed!=0)
{
for (var i = 0; i < empty.Length; i++)
{
switch (random.Next(2))
{
case 0: //Мирный
break;
case 1: //Мафия
empty[i].Role = Role.Mafia;
mafiasNeed--;
_mafia.Add(empty[i]);
empty = empty.RemoveFromArray(i);
break;
}
}
}
PlayerSocketWorker don = _mafia[0];
don.Role = Role.Don;
_mafia.RemoveAt(0);
don.sendPacket(new GameStartPacket(Role.Don));
foreach (PlayerSocketWorker player in empty)
{
player.sendPacket(new GameStartPacket(Role.Citizen));
}
foreach (PlayerSocketWorker player in _mafia)
{
player.sendPacket(new GameStartPacket(Role.Mafia));
}
foreach (PlayerSocketWorker player in _players)
{
_playerRolesAtStart.Add(new PlayerRole(player.PlayerName,player.Role));
}
isStarted = true;
_gameState = GameState.VotingNight;
}
private void OnDisconnectByError(PlayerSocketWorker sender)
@ -51,6 +152,28 @@ namespace MafiaServer
{
player.sendPacket(new PlayerDisconnectedPacket(true,sender.Id,_players.Count,Settings.Config().MaxPlayers));
}
if (sender.Role == Role.Don)
{
_mafia.Remove(sender);
if (_mafia.Count == 0)
{
foreach (PlayerSocketWorker player in _players)
{
player.sendPacket(new EndGamePacket(true,_playerRolesAtStart));
}
isStarted = false;
_gameState = GameState.NotStarted;
}
else
{
_mafia[0].Role = Role.Don;
if (_gameState == GameState.VotingNight)
{
_mafia[0].sendPacket(new MessageReceivePacket(ChatType.Active,true,"System","Дон покинул игру, ты новый дон!"));
}
}
}
}
private void PlayerOnOnPlayerSendMessageEvent(PlayerSocketWorker sender, ChatType chatType, string text)
@ -66,6 +189,25 @@ namespace MafiaServer
}
}
break;
case ChatType.Active:
if (isStarted)
{
switch (sender.Role)
{
case Role.Mafia:
case Role.Don:
foreach (PlayerSocketWorker player in _players)
{
if (player.Role == Role.Mafia || player.Role == Role.Don)
{
player.sendPacket(new MessageReceivePacket(ChatType.Active, false, sender.PlayerName,
text));
}
}
break;
}
}
break;
}
}
}

View File

@ -3,6 +3,7 @@ using System.Net.Sockets;
using System.Text;
using MafiaCommon.Packets;
using MafiaServer.Events;
using MafiaCommon;
namespace MafiaServer
{
@ -12,7 +13,9 @@ namespace MafiaServer
public readonly string PlayerName;
public event OnDisconnectByErrorEvent OnDisconnectByErrorEvent;
public event OnPlayerSendMessageEvent OnPlayerSendMessageEvent;
public event OnDisconnectEvent OnDisconnectEvent;
public int Id;
public Role Role = Role.Citizen;
public PlayerSocketWorker(Socket socket)
{
_socket = socket;
@ -71,6 +74,10 @@ namespace MafiaServer
case PacketType.MessageSendPacket:
OnPlayerSendMessageEvent.Invoke(this,((MessageSendPacket)packet).ChatType,((MessageSendPacket)packet).Text);
break;
case PacketType.DisconnectPlayer:
_socket.Close();
OnDisconnectEvent.Invoke(this);
break;
}
}
catch (SocketException e)