forked from CodeSpartan/MMOKitPersistenceServer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGuild.cs
More file actions
135 lines (118 loc) · 3.67 KB
/
Copy pathGuild.cs
File metadata and controls
135 lines (118 loc) · 3.67 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PersistenceServer
{
public class GuildJson
{
[JsonProperty]
public GuildMember[] Members { get; set; }
public GuildJson(GuildMember[] members) { Members = members; }
}
public class GuildMember
{
[JsonProperty]
public int Id { get; set; }
[JsonProperty]
public string MemberName { get; set; }
[JsonProperty]
public int GuildRank { get; set; }
[JsonProperty]
public bool Online { get; set; }
public GuildMember(int id, string name, int guildRank, bool online)
{
Id = id;
MemberName = name;
GuildRank = guildRank;
Online = online;
}
}
public class Guild
{
public int Id;
public string Name;
readonly Dictionary<int, GuildMember> Members;
readonly HashSet<Player> OnlineMembers; // it duplicates the information, but it's easy to retreive online members this way without iterating over collections every time
public Guild(int id, string name)
{
Id = id;
Name = name;
Members = new();
OnlineMembers = new();
}
public int MembersCount { get => Members.Count; }
// adds a member when guilds are retrieved from db on startup
public void PopulateMember(int memberId, string memberName, int guildRank)
{
Members.Add(memberId, new GuildMember(memberId, memberName, guildRank, false));
}
public HashSet<Player> GetOnlineMembers()
{
return OnlineMembers;
}
public HashSet<Player> GetOnlineOfficers(int officerRankRequired)
{
return OnlineMembers.Where(x => x.GuildRank <= officerRankRequired).ToHashSet();
}
public void UpdateMemberRank(int charId, int newRank)
{
Members[charId].GuildRank = newRank;
}
public Dictionary<int, GuildMember> GetGuildMembers()
{
return Members;
}
public GuildMember? GetGuildMemberByName(string name)
{
foreach (var pair in Members)
{
if (pair.Value.MemberName == name) return pair.Value;
}
return null;
}
public void OnPlayerConnected(Player newPlayer)
{
Members[newPlayer.CharId].Online = true;
OnlineMembers.Add(newPlayer);
}
public void OnPlayerDisconnected(Player player)
{
Members[player.CharId].Online = false;
OnlineMembers.Remove(player);
}
public void RemoveMember(Player player)
{
Members.Remove(player.CharId);
OnlineMembers.Remove(player);
}
// assumes the player isn't online, so we only need to remove from Members
public void RemoveMemberById(int id)
{
Members.Remove(id);
}
public GuildMember[] GetAllMembers()
{
return Members.Values.ToArray();
}
public int GuildMastersCount
{
get
{
int result = 0;
foreach (var member in Members)
{
if (member.Value.GuildRank == 0)
result++;
}
return result;
}
}
public string GetGuildMembersJson()
{
return JsonConvert.SerializeObject(new GuildJson(GetAllMembers()));
}
}
}