forked from FabianTerhorst/coreclr-module
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEntityThreadRepository.cs
More file actions
91 lines (73 loc) · 3.06 KB
/
EntityThreadRepository.cs
File metadata and controls
91 lines (73 loc) · 3.06 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
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Channels;
namespace AltV.Net.EntitySync
{
public class EntityThreadRepository : IEntityThreadRepository
{
private readonly ConcurrentDictionary<(ulong, ulong), IEntity> entities =
new ConcurrentDictionary<(ulong, ulong), IEntity>();
private readonly Channel<(IEntity, byte)> entitiesChannel =
Channel.CreateUnbounded<(IEntity, byte)>(new UnboundedChannelOptions {SingleReader = true});
internal readonly ChannelReader<(IEntity, byte)> EntitiesChannelReader;
private readonly ChannelWriter<(IEntity, byte)> entitiesChannelWriter;
private readonly Channel<(IEntity, string, object, bool)> entitiesDataChannel =
Channel.CreateUnbounded<(IEntity, string, object, bool)>(new UnboundedChannelOptions {SingleReader = true});
internal readonly ChannelReader<(IEntity, string, object, bool)> EntitiesDataChannelReader;
private readonly ChannelWriter<(IEntity, string, object, bool)> entitiesDataChannelWriter;
public EntityThreadRepository()
{
EntitiesDataChannelReader = entitiesDataChannel.Reader;
entitiesDataChannelWriter = entitiesDataChannel.Writer;
EntitiesChannelReader = entitiesChannel.Reader;
entitiesChannelWriter = entitiesChannel.Writer;
}
public void Add(IEntity entity)
{
if (!entities.TryAdd(entity.HashKey, entity)) return;
entitiesChannelWriter.TryWrite((entity, 0));
}
public void Remove(IEntity entity)
{
if (!entities.Remove(entity.HashKey, out _)) return;
entitiesChannelWriter.TryWrite((entity, 1));
}
public void Remove(ulong id, ulong type)
{
if (!entities.Remove((id, type), out var entity)) return;
entitiesChannelWriter.TryWrite((entity, 1));
}
public void Remove(IList<IEntity> entities)
{
for (int i = 0, length = entities.Count; i < length; i++)
{
var entity = entities[i];
if (!this.entities.Remove(entity.HashKey, out _)) return;
entitiesChannelWriter.TryWrite((entity, 1));
}
}
public void Update(IEntity entity)
{
entitiesChannelWriter.TryWrite((entity, 2));
}
public void UpdateData(IEntity entity, string key, object value)
{
entitiesDataChannelWriter.TryWrite((entity, key, value, true));
}
public void ResetData(IEntity entity, string key)
{
entitiesDataChannelWriter.TryWrite((entity, key, null, false));
}
public bool TryGet(ulong id, ulong type, out IEntity entity)
{
return entities.TryGetValue((id, type), out entity);
}
public IEnumerable<IEntity> GetAll()
{
foreach (var (_, entity) in entities)
{
yield return entity;
}
}
}
}