Initial commit
This commit is contained in:
commit
77e0f60987
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
bin/
|
||||||
|
obj/
|
||||||
|
/packages/
|
||||||
|
riderModule.iml
|
||||||
|
/_ReSharper.Caches/
|
11
MafiaCommon/MafiaCommon.csproj
Normal file
11
MafiaCommon/MafiaCommon.csproj
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
7
MafiaCommon/Packets/ChatType.cs
Normal file
7
MafiaCommon/Packets/ChatType.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public enum ChatType
|
||||||
|
{
|
||||||
|
Queue=1
|
||||||
|
}
|
||||||
|
}
|
14
MafiaCommon/Packets/ConnectPacket.cs
Normal file
14
MafiaCommon/Packets/ConnectPacket.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public class ConnectPacket : Packet
|
||||||
|
{
|
||||||
|
public readonly String Name;
|
||||||
|
|
||||||
|
public ConnectPacket(String name) : base(PacketType.Connect)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
12
MafiaCommon/Packets/DisconnectPacket.cs
Normal file
12
MafiaCommon/Packets/DisconnectPacket.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public class DisconnectPacket : Packet
|
||||||
|
{
|
||||||
|
public readonly string Reason;
|
||||||
|
|
||||||
|
public DisconnectPacket(string reason) : base(PacketType.Disconnect)
|
||||||
|
{
|
||||||
|
Reason = reason;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
MafiaCommon/Packets/MessageReceivePacket.cs
Normal file
18
MafiaCommon/Packets/MessageReceivePacket.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public class MessageReceivePacket : Packet
|
||||||
|
{
|
||||||
|
public readonly ChatType ChatType;
|
||||||
|
public readonly bool IsSystem;
|
||||||
|
public readonly string Author;
|
||||||
|
public readonly string Text;
|
||||||
|
|
||||||
|
public MessageReceivePacket(ChatType chatType, bool isSystem, string author, string text) : base(PacketType.MessageReceivePacket)
|
||||||
|
{
|
||||||
|
ChatType = chatType;
|
||||||
|
IsSystem = isSystem;
|
||||||
|
Author = author;
|
||||||
|
Text = text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
MafiaCommon/Packets/MessageSendPacket.cs
Normal file
14
MafiaCommon/Packets/MessageSendPacket.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public class MessageSendPacket : Packet
|
||||||
|
{
|
||||||
|
public readonly ChatType ChatType;
|
||||||
|
public readonly string Text;
|
||||||
|
|
||||||
|
public MessageSendPacket(ChatType chatType, string text) : base(PacketType.MessageSendPacket)
|
||||||
|
{
|
||||||
|
ChatType = chatType;
|
||||||
|
Text = text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
12
MafiaCommon/Packets/Packet.cs
Normal file
12
MafiaCommon/Packets/Packet.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public class Packet
|
||||||
|
{
|
||||||
|
public readonly PacketType PacketType;
|
||||||
|
|
||||||
|
public Packet(PacketType type)
|
||||||
|
{
|
||||||
|
PacketType = type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
51
MafiaCommon/Packets/PacketConverter.cs
Normal file
51
MafiaCommon/Packets/PacketConverter.cs
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public class PacketConverter
|
||||||
|
{
|
||||||
|
public static byte[] toBytes(Packet packet)
|
||||||
|
{
|
||||||
|
return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(packet));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Packet toPacket(String json)
|
||||||
|
{
|
||||||
|
PacketType packetType = ((JObject)JsonConvert.DeserializeObject(json)).GetValue("PacketType").ToObject<PacketType>();
|
||||||
|
Packet packet = null;
|
||||||
|
|
||||||
|
switch (packetType)
|
||||||
|
{
|
||||||
|
case PacketType.ServerShutdown:
|
||||||
|
packet = JsonConvert.DeserializeObject<ServerShutdownPacket>(json);
|
||||||
|
break;
|
||||||
|
case PacketType.Connect:
|
||||||
|
packet = JsonConvert.DeserializeObject<ConnectPacket>(json);
|
||||||
|
break;
|
||||||
|
case PacketType.Welcome:
|
||||||
|
packet = JsonConvert.DeserializeObject<WelcomePacket>(json);
|
||||||
|
break;
|
||||||
|
case PacketType.Disconnect:
|
||||||
|
packet = JsonConvert.DeserializeObject<DisconnectPacket>(json);
|
||||||
|
break;
|
||||||
|
case PacketType.PlayerConnected:
|
||||||
|
packet = JsonConvert.DeserializeObject<PlayerConnectedPacket>(json);
|
||||||
|
break;
|
||||||
|
case PacketType.PlayerDisconnected:
|
||||||
|
packet = JsonConvert.DeserializeObject<PlayerDisconnectedPacket>(json);
|
||||||
|
break;
|
||||||
|
case PacketType.MessageReceivePacket:
|
||||||
|
packet = JsonConvert.DeserializeObject<MessageReceivePacket>(json);
|
||||||
|
break;
|
||||||
|
case PacketType.MessageSendPacket:
|
||||||
|
packet = JsonConvert.DeserializeObject<MessageSendPacket>(json);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
MafiaCommon/Packets/PacketType.cs
Normal file
14
MafiaCommon/Packets/PacketType.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public enum PacketType
|
||||||
|
{
|
||||||
|
Connect=1,
|
||||||
|
Welcome=2,
|
||||||
|
Disconnect=3,
|
||||||
|
PlayerConnected=4,
|
||||||
|
PlayerDisconnected=5,
|
||||||
|
MessageReceivePacket=6,
|
||||||
|
MessageSendPacket=7,
|
||||||
|
ServerShutdown=99
|
||||||
|
}
|
||||||
|
}
|
16
MafiaCommon/Packets/PlayerConnectedPacket.cs
Normal file
16
MafiaCommon/Packets/PlayerConnectedPacket.cs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public class PlayerConnectedPacket : Packet
|
||||||
|
{
|
||||||
|
public readonly string Name;
|
||||||
|
public readonly int Players;
|
||||||
|
public readonly int MaxPlayers;
|
||||||
|
|
||||||
|
public PlayerConnectedPacket(string name, int players, int maxPlayers) : base(PacketType.PlayerConnected)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
Players = players;
|
||||||
|
MaxPlayers = maxPlayers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
MafiaCommon/Packets/PlayerDisconnectedPacket.cs
Normal file
18
MafiaCommon/Packets/PlayerDisconnectedPacket.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public class PlayerDisconnectedPacket : Packet
|
||||||
|
{
|
||||||
|
public readonly bool IsByError;
|
||||||
|
public readonly int Id;
|
||||||
|
public readonly int Players;
|
||||||
|
public readonly int MaxPlayers;
|
||||||
|
|
||||||
|
public PlayerDisconnectedPacket(bool isByError, int id, int players, int maxPlayers) : base(PacketType.PlayerDisconnected)
|
||||||
|
{
|
||||||
|
IsByError = isByError;
|
||||||
|
Id = id;
|
||||||
|
Players = players;
|
||||||
|
MaxPlayers = maxPlayers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
MafiaCommon/Packets/ServerShutdownPacket.cs
Normal file
14
MafiaCommon/Packets/ServerShutdownPacket.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public class ServerShutdownPacket : Packet
|
||||||
|
{
|
||||||
|
public readonly String Reason;
|
||||||
|
|
||||||
|
public ServerShutdownPacket(String reason) : base(PacketType.ServerShutdown)
|
||||||
|
{
|
||||||
|
Reason = reason;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
MafiaCommon/Packets/WelcomePacket.cs
Normal file
18
MafiaCommon/Packets/WelcomePacket.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MafiaCommon.Packets
|
||||||
|
{
|
||||||
|
public class WelcomePacket : Packet
|
||||||
|
{
|
||||||
|
public readonly String ServerName;
|
||||||
|
public readonly int Players;
|
||||||
|
public readonly int MaxPlayers;
|
||||||
|
|
||||||
|
public WelcomePacket(String serverName, int players, int maxPlayers) : base(PacketType.Welcome)
|
||||||
|
{
|
||||||
|
ServerName = serverName;
|
||||||
|
Players = players;
|
||||||
|
MaxPlayers = maxPlayers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
28
MafiaGame.sln
Normal file
28
MafiaGame.sln
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MafiaGame", "MafiaGame\MafiaGame.csproj", "{5A612B5D-831A-420F-AAE2-C0CA0CB8ADB4}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MafiaServer", "MafiaServer\MafiaServer.csproj", "{89353158-42E7-44A3-81E9-F0BD9A00259A}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MafiaCommon", "MafiaCommon\MafiaCommon.csproj", "{F2F93699-D38E-4416-84C3-7455BAEEB5E0}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{5A612B5D-831A-420F-AAE2-C0CA0CB8ADB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{5A612B5D-831A-420F-AAE2-C0CA0CB8ADB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{5A612B5D-831A-420F-AAE2-C0CA0CB8ADB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{5A612B5D-831A-420F-AAE2-C0CA0CB8ADB4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{89353158-42E7-44A3-81E9-F0BD9A00259A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{89353158-42E7-44A3-81E9-F0BD9A00259A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{89353158-42E7-44A3-81E9-F0BD9A00259A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{89353158-42E7-44A3-81E9-F0BD9A00259A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{F2F93699-D38E-4416-84C3-7455BAEEB5E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{F2F93699-D38E-4416-84C3-7455BAEEB5E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{F2F93699-D38E-4416-84C3-7455BAEEB5E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{F2F93699-D38E-4416-84C3-7455BAEEB5E0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
11
MafiaGame/App.xaml
Normal file
11
MafiaGame/App.xaml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<Application x:Class="MafiaGame.App"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:local="clr-namespace:MafiaGame"
|
||||||
|
Startup="App_OnStartup"
|
||||||
|
Exit="App_OnExit"
|
||||||
|
StartupUri="MainWindow.xaml">
|
||||||
|
<Application.Resources>
|
||||||
|
|
||||||
|
</Application.Resources>
|
||||||
|
</Application>
|
69
MafiaGame/App.xaml.cs
Normal file
69
MafiaGame/App.xaml.cs
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Configuration;
|
||||||
|
using System.Data;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using DiscordRPC;
|
||||||
|
using DiscordRPC.Logging;
|
||||||
|
using DiscordRPC.Message;
|
||||||
|
|
||||||
|
namespace MafiaGame
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for App.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
public App()
|
||||||
|
{
|
||||||
|
App.Instance = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static App Instance;
|
||||||
|
|
||||||
|
private DiscordRpcClient _rpcClient;
|
||||||
|
|
||||||
|
public ServerConnection Connection;
|
||||||
|
|
||||||
|
public DiscordRpcClient GetRpcClient()
|
||||||
|
{
|
||||||
|
return _rpcClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void App_OnStartup(object sender, StartupEventArgs e)
|
||||||
|
{
|
||||||
|
_rpcClient = new DiscordRpcClient("800016130097152000", autoEvents: true);
|
||||||
|
_rpcClient.RegisterUriScheme();
|
||||||
|
_rpcClient.Logger = new ConsoleLogger() { Level = LogLevel.Warning };
|
||||||
|
_rpcClient.OnJoinRequested += RpcClientOnOnJoinRequested;
|
||||||
|
_rpcClient.OnJoin += RpcClientOnOnJoin;
|
||||||
|
_rpcClient.SetSubscription(EventType.Join | EventType.JoinRequest);
|
||||||
|
_rpcClient.Initialize();
|
||||||
|
_rpcClient.SetPresence(new RichPresence()
|
||||||
|
{
|
||||||
|
State = "Запуск игры..."
|
||||||
|
});
|
||||||
|
|
||||||
|
Settings.Initialize();
|
||||||
|
Settings.Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RpcClientOnOnJoin(object sender, JoinMessage args)
|
||||||
|
{
|
||||||
|
string secret = args.Secret;
|
||||||
|
Connection = new ServerConnection(secret.Replace("/join", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RpcClientOnOnJoinRequested(object sender, JoinRequestMessage args)
|
||||||
|
{
|
||||||
|
_rpcClient.Respond(args, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void App_OnExit(object sender, ExitEventArgs e)
|
||||||
|
{
|
||||||
|
_rpcClient.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
10
MafiaGame/AssemblyInfo.cs
Normal file
10
MafiaGame/AssemblyInfo.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
[assembly: ThemeInfo(
|
||||||
|
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
||||||
|
//(used if a resource is not found in the page,
|
||||||
|
// or application resource dictionaries)
|
||||||
|
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
||||||
|
//(used if a resource is not found in the page,
|
||||||
|
// app, or any theme specific resource dictionaries)
|
||||||
|
)]
|
17
MafiaGame/MafiaGame.csproj
Normal file
17
MafiaGame/MafiaGame.csproj
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
<UseWPF>true</UseWPF>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="DiscordRichPresence" Version="1.0.169" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\MafiaCommon\MafiaCommon.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
7
MafiaGame/MainConfig.cs
Normal file
7
MafiaGame/MainConfig.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
namespace MafiaGame
|
||||||
|
{
|
||||||
|
public class MainConfig
|
||||||
|
{
|
||||||
|
public string Nick = "the Player";
|
||||||
|
}
|
||||||
|
}
|
156
MafiaGame/MainWindow.xaml
Normal file
156
MafiaGame/MainWindow.xaml
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
<Window x:Class="MafiaGame.MainWindow"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
Title="RMafia" Height="450" Width="800">
|
||||||
|
<Grid>
|
||||||
|
<Grid x:Name="MainMenu">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="10*"></ColumnDefinition>
|
||||||
|
<ColumnDefinition Width="30*"></ColumnDefinition>
|
||||||
|
<ColumnDefinition Width="20*"></ColumnDefinition>
|
||||||
|
<ColumnDefinition Width="30*"></ColumnDefinition>
|
||||||
|
<ColumnDefinition Width="10*"></ColumnDefinition>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="10*"></RowDefinition>
|
||||||
|
<RowDefinition Height="15*"></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="20*"></RowDefinition>
|
||||||
|
<RowDefinition Height="10*"></RowDefinition>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<TextBlock Grid.Row="1" Grid.Column="2" Text="RMafia" FontSize="45" HorizontalAlignment="Center"></TextBlock>
|
||||||
|
<Button Grid.Row="3" Grid.Column="2" Content="Играть" Click="Play_OnClick" FontSize="25"></Button>
|
||||||
|
<Button Grid.Row="5" Grid.Column="2" Content="Параметры" FontSize="25" Click="Settings_OnClick"></Button>
|
||||||
|
<Button Grid.Row="7" Grid.Column="2" Content="Выход" Click="Exit_OnClick" FontSize="25"></Button>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid x:Name="IpInput" Visibility="Hidden">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="30*"></ColumnDefinition>
|
||||||
|
<ColumnDefinition Width="40*"></ColumnDefinition>
|
||||||
|
<ColumnDefinition Width="30*"></ColumnDefinition>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="10*"></RowDefinition>
|
||||||
|
<RowDefinition Height="30*"></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="15*"></RowDefinition>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<TextBlock Grid.Column="1" Grid.Row="1" Text="Введите IP" FontSize="35" HorizontalAlignment="Center"></TextBlock>
|
||||||
|
<TextBox Grid.Column="1" Grid.Row="3" x:Name="IpBox" FontSize="30"></TextBox>
|
||||||
|
<Button Grid.Column="1" Grid.Row="5" Click="ConnectToServer_OnClick" Content="Подключится" FontSize="25" x:Name="IpInputGUIConnect"></Button>
|
||||||
|
<Button Grid.Column="1" Grid.Row="7" Click="Back_OnClick" Content="Назад" FontSize="25" x:Name="IpInputGUIBack"></Button>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid x:Name="SettingsGUI" 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.Column="1" Grid.Row="1" Text="Ник:" FontSize="25" HorizontalAlignment="Right"></TextBlock>
|
||||||
|
<TextBox Grid.Column="2" Grid.ColumnSpan="2" Grid.Row="1" FontSize="25" x:Name="NickBox" TextChanged="NickBox_OnTextInput"></TextBox>
|
||||||
|
<Button Grid.Column="4" Grid.ColumnSpan="3" Grid.Row="11" Click="SettingsBack_OnClick" Content="Назад" FontSize="25"></Button>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid x:Name="GameQueue" Visibility="Hidden" KeyUp="GameQueue_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="5*"></RowDefinition>
|
||||||
|
<RowDefinition Height="10*"></RowDefinition>
|
||||||
|
<RowDefinition Height="5*"></RowDefinition>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
|
<TextBlock Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="1" Text="Ожидаем старта" FontSize="30" HorizontalAlignment="Center"></TextBlock>
|
||||||
|
<TextBlock Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="3" FontSize="40" HorizontalAlignment="Center" x:Name="QueueOnline"></TextBlock>
|
||||||
|
<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>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid x:Name="DisconnectScreen" 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" Text="Отключён от сервера" FontSize="30" HorizontalAlignment="Center"></TextBlock>
|
||||||
|
<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>
|
||||||
|
</Window>
|
147
MafiaGame/MainWindow.xaml.cs
Normal file
147
MafiaGame/MainWindow.xaml.cs
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Documents;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Shapes;
|
||||||
|
using DiscordRPC;
|
||||||
|
using MafiaCommon.Packets;
|
||||||
|
|
||||||
|
namespace MafiaGame
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for MainWindow.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class MainWindow : Window
|
||||||
|
{
|
||||||
|
private static MainWindow _mainWindow;
|
||||||
|
|
||||||
|
public static MainWindow Instance => _mainWindow;
|
||||||
|
|
||||||
|
public MainWindow()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
_mainWindow = this;
|
||||||
|
|
||||||
|
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
||||||
|
{
|
||||||
|
State = "В главном меню"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Exit_OnClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
App.Current.Shutdown(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Play_OnClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
IpInputGUIBack.IsEnabled = true;
|
||||||
|
IpInputGUIConnect.IsEnabled = true;
|
||||||
|
IpBox.IsEnabled = true;
|
||||||
|
MainMenu.Visibility = Visibility.Hidden;
|
||||||
|
IpInput.Visibility = Visibility.Visible;
|
||||||
|
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
||||||
|
{
|
||||||
|
State = "Выбирает сервер"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ConnectToServer_OnClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
String ip = IpBox.Text;
|
||||||
|
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
||||||
|
{
|
||||||
|
State = "Присоединяется к серверу"
|
||||||
|
});
|
||||||
|
IpInputGUIBack.IsEnabled = false;
|
||||||
|
IpInputGUIConnect.IsEnabled = false;
|
||||||
|
IpBox.IsEnabled = false;
|
||||||
|
Thread thread = new Thread(() =>
|
||||||
|
{
|
||||||
|
App.Instance.Connection = new ServerConnection(ip);
|
||||||
|
});
|
||||||
|
thread.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Back_OnClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
IpInput.Visibility = Visibility.Hidden;
|
||||||
|
DisconnectScreen.Visibility = Visibility.Hidden;
|
||||||
|
MainMenu.Visibility = Visibility.Visible;
|
||||||
|
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
||||||
|
{
|
||||||
|
State = "В главном меню"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SettingsBack_OnClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Settings.Save();
|
||||||
|
SettingsGUI.Visibility = Visibility.Hidden;
|
||||||
|
MainMenu.Visibility = Visibility.Visible;
|
||||||
|
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
||||||
|
{
|
||||||
|
State = "В главном меню"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Settings_OnClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
MainMenu.Visibility = Visibility.Hidden;
|
||||||
|
SettingsGUI.Visibility = Visibility.Visible;
|
||||||
|
NickBox.Text = Settings.Config().Nick;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void NickBox_OnTextInput(object sender, TextChangedEventArgs e)
|
||||||
|
{
|
||||||
|
Settings.Config().Nick = NickBox.Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ShowGameQueueScreen()
|
||||||
|
{
|
||||||
|
MainMenu.Visibility = Visibility.Hidden;
|
||||||
|
IpInput.Visibility = Visibility.Hidden;
|
||||||
|
SettingsGUI.Visibility = Visibility.Hidden;
|
||||||
|
DisconnectScreen.Visibility = Visibility.Hidden;
|
||||||
|
GameQueue.Visibility = Visibility.Visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ShowDisconnectScreen(string reason)
|
||||||
|
{
|
||||||
|
ReasonText.Text = reason;
|
||||||
|
MainMenu.Visibility = Visibility.Hidden;
|
||||||
|
IpInput.Visibility = Visibility.Hidden;
|
||||||
|
SettingsGUI.Visibility = Visibility.Hidden;
|
||||||
|
GameQueue.Visibility = Visibility.Hidden;
|
||||||
|
DisconnectScreen.Visibility = Visibility.Visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GameQueue_OnKeyUp(object sender, KeyEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Key == Key.Enter)
|
||||||
|
{
|
||||||
|
GameQueueChatSend_OnClick(null, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GameQueueChatSend_OnClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (QueueChatInput.Text.Trim() != "")
|
||||||
|
{
|
||||||
|
App.Instance.Connection.SendMessage(ChatType.Queue, QueueChatInput.Text);
|
||||||
|
QueueChatInput.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
154
MafiaGame/ServerConnection.cs
Normal file
154
MafiaGame/ServerConnection.cs
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
using System;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
using DiscordRPC;
|
||||||
|
using MafiaCommon.Packets;
|
||||||
|
|
||||||
|
namespace MafiaGame
|
||||||
|
{
|
||||||
|
public class ServerConnection
|
||||||
|
{
|
||||||
|
private String _host = "localhost";
|
||||||
|
private int _port = 25743;
|
||||||
|
private Socket _socket;
|
||||||
|
private Thread _thread;
|
||||||
|
private bool _breakFlag = false;
|
||||||
|
|
||||||
|
public ServerConnection(String ip)
|
||||||
|
{
|
||||||
|
if (ip.Contains(':'))
|
||||||
|
{
|
||||||
|
_host = ip.Split(":")[0];
|
||||||
|
_port = Convert.ToInt32(ip.Split(":")[1]);
|
||||||
|
}
|
||||||
|
else if (_host.Length != 0)
|
||||||
|
{
|
||||||
|
_host = ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
_thread = new Thread(serverListener);
|
||||||
|
|
||||||
|
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_socket.Connect(_host, _port);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendMessage(ChatType chatType, string text)
|
||||||
|
{
|
||||||
|
_socket.Send(PacketConverter.toBytes(new MessageSendPacket(chatType, text)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void serverListener()
|
||||||
|
{
|
||||||
|
while (!_breakFlag)
|
||||||
|
{
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
int bytes = 0;
|
||||||
|
byte[] data = new byte[256];
|
||||||
|
do
|
||||||
|
{
|
||||||
|
bytes = _socket.Receive(data);
|
||||||
|
builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
|
||||||
|
}
|
||||||
|
while (_socket.Available>0);
|
||||||
|
|
||||||
|
Console.WriteLine(builder.ToString());
|
||||||
|
|
||||||
|
Packet packet = PacketConverter.toPacket(builder.ToString());
|
||||||
|
switch (packet.PacketType)
|
||||||
|
{
|
||||||
|
case PacketType.Welcome:
|
||||||
|
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||||
|
{
|
||||||
|
MainWindow.Instance.QueueOnline.Text = ((WelcomePacket) packet).Players + "/" +
|
||||||
|
((WelcomePacket) packet).MaxPlayers;
|
||||||
|
MainWindow.Instance.ShowGameQueueScreen();
|
||||||
|
Party party = new Party();
|
||||||
|
party.ID = _host + ":" + _port;
|
||||||
|
party.Size = ((WelcomePacket) packet).Players;
|
||||||
|
party.Max = ((WelcomePacket) packet).MaxPlayers;
|
||||||
|
Secrets secrets = new Secrets();
|
||||||
|
secrets.JoinSecret = _host + ":" + _port + "/join";
|
||||||
|
secrets.SpectateSecret = _host + ":" + _port + "/spectate";
|
||||||
|
App.Instance.GetRpcClient().SetPresence(new RichPresence()
|
||||||
|
{
|
||||||
|
State = ((WelcomePacket)packet).ServerName,
|
||||||
|
Party = party,
|
||||||
|
Secrets = secrets,
|
||||||
|
Timestamps = Timestamps.Now
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
break;
|
||||||
|
case PacketType.Disconnect:
|
||||||
|
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||||
|
{
|
||||||
|
MainWindow.Instance.ShowDisconnectScreen(((DisconnectPacket)packet).Reason);
|
||||||
|
}));
|
||||||
|
_breakFlag = true;
|
||||||
|
break;
|
||||||
|
case PacketType.PlayerConnected:
|
||||||
|
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||||
|
{
|
||||||
|
MainWindow.Instance.QueueOnline.Text = ((PlayerConnectedPacket) packet).Players + "/" +
|
||||||
|
((PlayerConnectedPacket) packet).MaxPlayers;
|
||||||
|
}));
|
||||||
|
App.Instance.GetRpcClient().UpdatePartySize(((PlayerConnectedPacket) packet).Players);
|
||||||
|
break;
|
||||||
|
case PacketType.PlayerDisconnected:
|
||||||
|
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||||
|
{
|
||||||
|
MainWindow.Instance.QueueOnline.Text = ((PlayerDisconnectedPacket) packet).Players + "/" +
|
||||||
|
((PlayerDisconnectedPacket) packet).MaxPlayers;
|
||||||
|
}));
|
||||||
|
App.Instance.GetRpcClient().UpdatePartySize(((PlayerDisconnectedPacket) packet).Players);
|
||||||
|
break;
|
||||||
|
case PacketType.ServerShutdown:
|
||||||
|
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||||
|
{
|
||||||
|
MainWindow.Instance.ShowDisconnectScreen("Сервер выключен: "+((ServerShutdownPacket)packet).Reason);
|
||||||
|
}));
|
||||||
|
_breakFlag = true;
|
||||||
|
break;
|
||||||
|
case PacketType.MessageReceivePacket:
|
||||||
|
App.Current.Dispatcher.Invoke((Action)(() =>
|
||||||
|
{
|
||||||
|
ListBoxItem message = new ListBoxItem();
|
||||||
|
if (((MessageReceivePacket) packet).IsSystem)
|
||||||
|
{
|
||||||
|
message.Content = ((MessageReceivePacket) packet).Text;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message.Content = ((MessageReceivePacket) packet).Author + ": " +
|
||||||
|
((MessageReceivePacket) packet).Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (((MessageReceivePacket)packet).ChatType)
|
||||||
|
{
|
||||||
|
case ChatType.Queue:
|
||||||
|
MainWindow.Instance.QueueChat.Items.Add(message);
|
||||||
|
MainWindow.Instance.QueueChat.ScrollIntoView(message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
35
MafiaGame/Settings.cs
Normal file
35
MafiaGame/Settings.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
namespace MafiaGame
|
||||||
|
{
|
||||||
|
public class Settings
|
||||||
|
{
|
||||||
|
private static MainConfig _config;
|
||||||
|
|
||||||
|
public static MainConfig Config()
|
||||||
|
{
|
||||||
|
return _config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Initialize()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_config = JsonConvert.DeserializeObject<MainConfig>(File.ReadAllText("config.json"));
|
||||||
|
}
|
||||||
|
catch (FileNotFoundException e)
|
||||||
|
{
|
||||||
|
_config = new MainConfig();
|
||||||
|
File.Create("config.json").Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Save()
|
||||||
|
{
|
||||||
|
File.WriteAllText("config.json",JsonConvert.SerializeObject(_config,Formatting.Indented));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
4
MafiaServer/Events/OnDisconnectByErrorEvent.cs
Normal file
4
MafiaServer/Events/OnDisconnectByErrorEvent.cs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
namespace MafiaServer.Events
|
||||||
|
{
|
||||||
|
public delegate void OnDisconnectByErrorEvent(PlayerSocketWorker player);
|
||||||
|
}
|
6
MafiaServer/Events/OnPlayerSendMessageEvent.cs
Normal file
6
MafiaServer/Events/OnPlayerSendMessageEvent.cs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
using MafiaCommon.Packets;
|
||||||
|
|
||||||
|
namespace MafiaServer.Events
|
||||||
|
{
|
||||||
|
public delegate void OnPlayerSendMessageEvent(PlayerSocketWorker sender, ChatType chatType, string text);
|
||||||
|
}
|
72
MafiaServer/Game.cs
Normal file
72
MafiaServer/Game.cs
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using MafiaCommon.Packets;
|
||||||
|
|
||||||
|
namespace MafiaServer
|
||||||
|
{
|
||||||
|
public class Game
|
||||||
|
{
|
||||||
|
private List<PlayerSocketWorker> _players = new List<PlayerSocketWorker>();
|
||||||
|
private bool isStarted = false;
|
||||||
|
|
||||||
|
public Game()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ConnectPlayer(PlayerSocketWorker player)
|
||||||
|
{
|
||||||
|
if (isStarted)
|
||||||
|
{
|
||||||
|
player.sendPacket(new DisconnectPacket("Game already started!"));
|
||||||
|
player.disconnect();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (PlayerSocketWorker othPlayer in _players)
|
||||||
|
{
|
||||||
|
othPlayer.sendPacket(new PlayerConnectedPacket(player.PlayerName,_players.Count+1,Settings.Config().MaxPlayers));
|
||||||
|
}
|
||||||
|
_players.Add(player);
|
||||||
|
player.Id = _players.LastIndexOf(player);
|
||||||
|
player.OnDisconnectByErrorEvent += OnDisconnectByError;
|
||||||
|
player.OnPlayerSendMessageEvent += PlayerOnOnPlayerSendMessageEvent;
|
||||||
|
player.sendPacket(new WelcomePacket(Settings.Config().ServerName,_players.Count,Settings.Config().MaxPlayers));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Start()
|
||||||
|
{
|
||||||
|
if (_players.Count < 2)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Not Enough Players");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDisconnectByError(PlayerSocketWorker sender)
|
||||||
|
{
|
||||||
|
_players.Remove(sender);
|
||||||
|
foreach (PlayerSocketWorker player in _players)
|
||||||
|
{
|
||||||
|
player.sendPacket(new PlayerDisconnectedPacket(true,sender.Id,_players.Count,Settings.Config().MaxPlayers));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PlayerOnOnPlayerSendMessageEvent(PlayerSocketWorker sender, ChatType chatType, string text)
|
||||||
|
{
|
||||||
|
switch (chatType)
|
||||||
|
{
|
||||||
|
case ChatType.Queue:
|
||||||
|
if (!isStarted)
|
||||||
|
{
|
||||||
|
foreach (PlayerSocketWorker player in _players)
|
||||||
|
{
|
||||||
|
player.sendPacket(new MessageReceivePacket(ChatType.Queue,false,sender.PlayerName,text));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
16
MafiaServer/MafiaServer.csproj
Normal file
16
MafiaServer/MafiaServer.csproj
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\MafiaCommon\MafiaCommon.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
11
MafiaServer/MainConfig.cs
Normal file
11
MafiaServer/MainConfig.cs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MafiaServer
|
||||||
|
{
|
||||||
|
public class MainConfig
|
||||||
|
{
|
||||||
|
public int Port = 25743;
|
||||||
|
public String ServerName = "Test server";
|
||||||
|
public int MaxPlayers = 20;
|
||||||
|
}
|
||||||
|
}
|
83
MafiaServer/PlayerSocketWorker.cs
Normal file
83
MafiaServer/PlayerSocketWorker.cs
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
using System;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
using MafiaCommon.Packets;
|
||||||
|
using MafiaServer.Events;
|
||||||
|
|
||||||
|
namespace MafiaServer
|
||||||
|
{
|
||||||
|
public class PlayerSocketWorker
|
||||||
|
{
|
||||||
|
private Socket _socket;
|
||||||
|
public readonly string PlayerName;
|
||||||
|
public event OnDisconnectByErrorEvent OnDisconnectByErrorEvent;
|
||||||
|
public event OnPlayerSendMessageEvent OnPlayerSendMessageEvent;
|
||||||
|
public int Id;
|
||||||
|
public PlayerSocketWorker(Socket socket)
|
||||||
|
{
|
||||||
|
_socket = socket;
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
int bytes = 0;
|
||||||
|
byte[] data = new byte[256];
|
||||||
|
do
|
||||||
|
{
|
||||||
|
bytes = _socket.Receive(data);
|
||||||
|
builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
|
||||||
|
}
|
||||||
|
while (_socket.Available>0);
|
||||||
|
|
||||||
|
var packet = PacketConverter.toPacket(builder.ToString());
|
||||||
|
if (packet.GetType() == typeof(ConnectPacket))
|
||||||
|
{
|
||||||
|
PlayerName = ((ConnectPacket) packet).Name;
|
||||||
|
MafiaServer.Game.ConnectPlayer(this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_socket.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendPacket(Packet packet)
|
||||||
|
{
|
||||||
|
_socket.Send(PacketConverter.toBytes(packet));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disconnect()
|
||||||
|
{
|
||||||
|
_socket.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
while (_socket.Connected)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
int bytes = 0;
|
||||||
|
byte[] data = new byte[256];
|
||||||
|
do
|
||||||
|
{
|
||||||
|
bytes = _socket.Receive(data);
|
||||||
|
builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
|
||||||
|
} while (_socket.Available > 0);
|
||||||
|
|
||||||
|
Console.WriteLine(builder.ToString());
|
||||||
|
|
||||||
|
Packet packet = PacketConverter.toPacket(builder.ToString());
|
||||||
|
switch (packet.PacketType)
|
||||||
|
{
|
||||||
|
case PacketType.MessageSendPacket:
|
||||||
|
OnPlayerSendMessageEvent.Invoke(this,((MessageSendPacket)packet).ChatType,((MessageSendPacket)packet).Text);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (SocketException e)
|
||||||
|
{
|
||||||
|
OnDisconnectByErrorEvent.Invoke(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
35
MafiaServer/Program.cs
Normal file
35
MafiaServer/Program.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace MafiaServer
|
||||||
|
{
|
||||||
|
class MafiaServer
|
||||||
|
{
|
||||||
|
private static Server server;
|
||||||
|
private static Boolean breakFlag = false;
|
||||||
|
public static Game Game;
|
||||||
|
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
Settings.Initialize();
|
||||||
|
Settings.Save();
|
||||||
|
Game = new Game();
|
||||||
|
server = new Server();
|
||||||
|
while (!breakFlag)
|
||||||
|
{
|
||||||
|
String input = Console.ReadLine();
|
||||||
|
switch (input.Split(" ")[0].ToLower())
|
||||||
|
{
|
||||||
|
case "stop":
|
||||||
|
server.stop("Manual stop");
|
||||||
|
breakFlag = true;
|
||||||
|
break;
|
||||||
|
case "start":
|
||||||
|
Game.Start();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
60
MafiaServer/Server.cs
Normal file
60
MafiaServer/Server.cs
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Threading;
|
||||||
|
using MafiaCommon.Packets;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace MafiaServer
|
||||||
|
{
|
||||||
|
public class Server
|
||||||
|
{
|
||||||
|
private Socket _socket;
|
||||||
|
private Thread _acceptor;
|
||||||
|
private List<Socket> _clientSockets = new List<Socket>();
|
||||||
|
private List<Thread> _clientThreads = new List<Thread>();
|
||||||
|
|
||||||
|
public Server()
|
||||||
|
{
|
||||||
|
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
_socket.Bind(new IPEndPoint(IPAddress.Any, Settings.Config().Port));
|
||||||
|
_socket.Listen(10);
|
||||||
|
|
||||||
|
_acceptor = new Thread(new ThreadStart(acceptor));
|
||||||
|
_acceptor.IsBackground = true;
|
||||||
|
_acceptor.Start();
|
||||||
|
|
||||||
|
Console.WriteLine("Server started!");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop(String reason)
|
||||||
|
{
|
||||||
|
_acceptor.Interrupt();
|
||||||
|
foreach (Thread thread in _clientThreads)
|
||||||
|
{
|
||||||
|
thread.Interrupt();
|
||||||
|
}
|
||||||
|
foreach (Socket socket in _clientSockets)
|
||||||
|
{
|
||||||
|
if (socket.Connected)
|
||||||
|
{
|
||||||
|
socket.Send(PacketConverter.toBytes(new ServerShutdownPacket(reason)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void acceptor()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
Socket playerSocket = _socket.Accept();
|
||||||
|
PlayerSocketWorker playerSocketWorker = new PlayerSocketWorker(playerSocket);
|
||||||
|
Thread thread = new Thread(playerSocketWorker.run);
|
||||||
|
_clientSockets.Add(playerSocket);
|
||||||
|
_clientThreads.Add(thread);
|
||||||
|
thread.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
35
MafiaServer/Settings.cs
Normal file
35
MafiaServer/Settings.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
namespace MafiaServer
|
||||||
|
{
|
||||||
|
public class Settings
|
||||||
|
{
|
||||||
|
private static MainConfig _config;
|
||||||
|
|
||||||
|
public static MainConfig Config()
|
||||||
|
{
|
||||||
|
return _config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Initialize()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_config = JsonConvert.DeserializeObject<MainConfig>(File.ReadAllText("config.json"));
|
||||||
|
}
|
||||||
|
catch (FileNotFoundException e)
|
||||||
|
{
|
||||||
|
_config = new MainConfig();
|
||||||
|
File.Create("config.json").Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Save()
|
||||||
|
{
|
||||||
|
File.WriteAllText("config.json",JsonConvert.SerializeObject(_config,Formatting.Indented));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user