This repository has been archived by the owner on Jan 18, 2022. It is now read-only.
/
ComponentConstraintsCallbackSystem.cs
125 lines (103 loc) · 4.69 KB
/
ComponentConstraintsCallbackSystem.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
123
124
125
using System;
using System.Collections.Generic;
using Improbable.Gdk.Core;
using Unity.Entities;
namespace Improbable.Gdk.Subscriptions
{
// todo consider if these callbacks should be entity specific or not
// todo if entity specific then registering a callback here would be called immediately if conditions are met
[DisableAutoCreation]
public class ComponentConstraintsCallbackSystem : ComponentSystem
{
private readonly GuardedCallbackManagerSet<uint, ComponentAddedCallbackManager> componentAdded =
new GuardedCallbackManagerSet<uint, ComponentAddedCallbackManager>();
private readonly GuardedCallbackManagerSet<uint, ComponentRemovedCallbackManager> componentRemoved =
new GuardedCallbackManagerSet<uint, ComponentRemovedCallbackManager>();
private readonly GuardedCallbackManagerSet<uint, AuthorityConstraintCallbackManager> authority =
new GuardedCallbackManagerSet<uint, AuthorityConstraintCallbackManager>();
private EntityAddedCallbackManager entityAdded;
private EntityRemovedCallbackManager entityRemoved;
private readonly Dictionary<ulong, (ulong, ICallbackManager)> keyToInternalKeyAndManager =
new Dictionary<ulong, (ulong, ICallbackManager)>();
private ulong callbacksRegistered = 1;
internal ulong RegisterComponentRemovedCallback(uint componentId, Action<EntityId> callback)
{
if (!componentRemoved.TryGetManager(componentId, out var manager))
{
manager = new ComponentRemovedCallbackManager(componentId, World);
componentRemoved.AddCallbackManager(componentId, manager);
}
var key = manager.RegisterCallback(callback);
keyToInternalKeyAndManager.Add(callbacksRegistered, (key, manager));
return callbacksRegistered++;
}
internal ulong RegisterComponentAddedCallback(uint componentId, Action<EntityId> callback)
{
if (!componentAdded.TryGetManager(componentId, out var manager))
{
manager = new ComponentAddedCallbackManager(componentId, World);
componentAdded.AddCallbackManager(componentId, manager);
}
var key = manager.RegisterCallback(callback);
keyToInternalKeyAndManager.Add(callbacksRegistered, (key, manager));
return callbacksRegistered++;
}
// todo should possibly be separate auth an non-auth ones
internal ulong RegisterAuthorityCallback(uint componentId, Action<AuthorityChangeReceived> callback)
{
if (!authority.TryGetManager(componentId, out var manager))
{
manager = new AuthorityConstraintCallbackManager(componentId, World);
authority.AddCallbackManager(componentId, manager);
}
var key = manager.RegisterCallback(callback);
keyToInternalKeyAndManager.Add(callbacksRegistered, (key, manager));
return callbacksRegistered++;
}
internal ulong RegisterEntityAddedCallback(Action<EntityId> callback)
{
if (entityAdded == null)
{
entityAdded = new EntityAddedCallbackManager(World);
}
var key = entityAdded.RegisterCallback(callback);
keyToInternalKeyAndManager.Add(callbacksRegistered, (key, entityAdded));
return callbacksRegistered++;
}
internal ulong RegisterEntityRemovedCallback(Action<EntityId> callback)
{
if (entityRemoved == null)
{
entityRemoved = new EntityRemovedCallbackManager(World);
}
var key = entityRemoved.RegisterCallback(callback);
keyToInternalKeyAndManager.Add(callbacksRegistered, (key, entityRemoved));
return callbacksRegistered++;
}
internal bool UnregisterCallback(ulong callbackKey)
{
if (!keyToInternalKeyAndManager.TryGetValue(callbackKey, out var keyAndManager))
{
return false;
}
return keyAndManager.Item2.UnregisterCallback(callbackKey);
}
internal void Invoke()
{
componentRemoved.InvokeCallbacks();
entityRemoved?.InvokeCallbacks();
entityAdded?.InvokeCallbacks();
componentAdded.InvokeCallbacks();
authority.InvokeCallbacks();
}
protected override void OnCreateManager()
{
base.OnCreateManager();
entityAdded = new EntityAddedCallbackManager(World);
Enabled = false;
}
protected override void OnUpdate()
{
}
}
}