forked from MUnique/OpenMU
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ClientAttribute.cs
122 lines (106 loc) · 3.93 KB
/
ClientAttribute.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// <copyright file="ClientAttribute.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
namespace MUnique.OpenMU.GameServer;
using MUnique.OpenMU.GameLogic.Views;
using MUnique.OpenMU.Network.PlugIns;
/// <summary>
/// Attribute to mark an implemented <see cref="IViewPlugIn"/> with a specific client version.
/// </summary>
public class ClientAttribute : Attribute, IComparable<ClientAttribute>, IComparable, IEquatable<ClientAttribute>
{
/// <summary>
/// Initializes a new instance of the <see cref="ClientAttribute"/> class.
/// </summary>
/// <param name="season">The minimum season of compatible clients.</param>
/// <param name="episode">The minimum episode of compatible clients.</param>
/// <param name="language">The language of compatible clients.</param>
protected ClientAttribute(byte season, byte episode, ClientLanguage language)
{
this.Client = new ClientVersion(season, episode, language);
}
/// <summary>
/// Gets the client.
/// </summary>
/// <value>
/// The client.
/// </value>
public ClientVersion Client { get; }
/// <summary>
/// Implements the operator >.
/// </summary>
/// <param name="left">The left.</param>
/// <param name="right">The right.</param>
/// <returns>
/// The result of the operator.
/// </returns>
public static bool operator >(ClientAttribute left, ClientAttribute right) => Compare(left, right) > 0;
/// <summary>
/// Implements the operator >=.
/// </summary>
/// <param name="left">The left.</param>
/// <param name="right">The right.</param>
/// <returns>
/// The result of the operator.
/// </returns>
public static bool operator >=(ClientAttribute left, ClientAttribute right) => Compare(left, right) >= 0;
/// <summary>
/// Implements the operator <.
/// </summary>
/// <param name="left">The left.</param>
/// <param name="right">The right.</param>
/// <returns>
/// The result of the operator.
/// </returns>
public static bool operator <(ClientAttribute left, ClientAttribute right) => Compare(left, right) < 0;
/// <summary>
/// Implements the operator <=.
/// </summary>
/// <param name="left">The left.</param>
/// <param name="right">The right.</param>
/// <returns>
/// The result of the operator.
/// </returns>
public static bool operator <=(ClientAttribute left, ClientAttribute right) => Compare(left, right) <= 0;
/// <summary>
/// Implements the operator !=.
/// </summary>
/// <param name="left">The left.</param>
/// <param name="right">The right.</param>
/// <returns>
/// The result of the operator.
/// </returns>
public static bool operator !=(ClientAttribute left, ClientAttribute right) => !(left == right);
/// <summary>
/// Implements the operator ==.
/// </summary>
/// <param name="left">The left.</param>
/// <param name="right">The right.</param>
/// <returns>
/// The result of the operator.
/// </returns>
public static bool operator ==(ClientAttribute left, ClientAttribute right) => Compare(left, right) == 0;
/// <inheritdoc />
public int CompareTo(ClientAttribute? other)
{
return this.Client.CompareTo(other?.Client ?? default);
}
/// <inheritdoc />
public int CompareTo(object? obj)
{
return this.CompareTo(obj as ClientAttribute);
}
/// <inheritdoc />
public override bool Equals(object? obj)
{
return this.Equals(obj as ClientAttribute);
}
/// <inheritdoc />
public bool Equals(ClientAttribute? other)
{
return this.CompareTo(other) == 0;
}
/// <inheritdoc/>
public override int GetHashCode() => this.Client.GetHashCode();
private static int Compare(ClientAttribute left, ClientAttribute right) => left.CompareTo(right);
}