Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AccessKeysEditorComponent.c
Go to the documentation of this file.
1//#define DISABLE_ADMIN_ACCESS //--- Enable this to prevent admin from seeing all entities
2
3[ComponentEditorProps(category: "GameScripted/Editor", description: "Attribute for managing access keys. Works only with SCR_EditorBaseEntity!", icon: "WBData/ComponentEditorProps/componentEditor.png")]
7
9
13class SCR_AccessKeysEditorComponent : SCR_BaseEditorComponent
14{
15 [Attribute("1", UIWidgets.Flags, "", enums: ParamEnumArray.FromEnum(EEditableEntityAccessKey))]
16 private EEditableEntityAccessKey m_AccessKey;
17
19
20 #ifdef WORKBENCH
21 private bool m_bIsAdmin = true;
22 #endif
23
24 //------------------------------------------------------------------------------------------------
28 {
29 Rpc(AddAccessKeyServer, accessKey);
30 }
31
32 //------------------------------------------------------------------------------------------------
37 {
38 Rpc(RemoveAccessKeyServer, accessKey);
39 }
40
41 //------------------------------------------------------------------------------------------------
42 //--- Manipulate access keys of the editor
43 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
45 {
46 if (HasAccess(accessKey) || IsAdmin())
47 return;
48
49 m_AccessKey = m_AccessKey | accessKey;
50 Rpc(AccessKeyChangedOwner, m_AccessKey);
51 }
52
53 //------------------------------------------------------------------------------------------------
54 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
56 {
57 if (!HasAccess(accessKey) || IsAdmin())
58 return;
59
60 m_AccessKey = m_AccessKey &~ accessKey;
61 Rpc(AccessKeyChangedOwner, m_AccessKey);
62 }
63
64 //------------------------------------------------------------------------------------------------
65 [RplRpc(RplChannel.Reliable, RplRcver.Owner)]
67 {
68 m_AccessKey = accessKey;
69 Event_OnChanged.Invoke();
70 }
71
72 //------------------------------------------------------------------------------------------------
76 {
77 return m_AccessKey;
78 }
79
80 //------------------------------------------------------------------------------------------------
85 {
86 return m_AccessKey & accessKey;
87 }
88
89 //--- Manipulate access key of an entity
90 //------------------------------------------------------------------------------------------------
95 {
96 Rpc(AddEntityAccessKeyServer, Replication.FindItemId(entity), accessKey);
97 }
98 //------------------------------------------------------------------------------------------------
103 {
104 Rpc(RemoveEntityAccessKeyServer, Replication.FindItemId(entity), accessKey);
105 }
106
107 //------------------------------------------------------------------------------------------------
108 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
109 protected void AddEntityAccessKeyServer (int entityID, EEditableEntityAccessKey accessKey)
110 {
112 if (entity)
113 entity.AddAccessKey(accessKey);
114 }
115
116 //------------------------------------------------------------------------------------------------
117 [RplRpc(RplChannel.Reliable, RplRcver.Server)]
118 protected void RemoveEntityAccessKeyServer (int entityID, EEditableEntityAccessKey accessKey)
119 {
121 if (entity)
122 entity.RemoveAccessKey(accessKey);
123 }
124
125 //--- Debug
126 //------------------------------------------------------------------------------------------------
127 protected string GetKeyDebug()
128 {
129 string output = "";
130 if (IsAdmin())
131 {
132 output = "<ADMIN>";
133 }
134 else
135 {
136 typename enumType = EEditableEntityAccessKey;
137 int enumCount = enumType.GetVariableCount();
138 for (int i = 0; i < enumCount; i++)
139 {
140 int val;
141 if (enumType.GetVariableType(i) == int && enumType.GetVariableValue(null, i, val))
142 {
143 if (HasAccess(val))
144 {
145 if (!output.IsEmpty())
146 output += ", ";
147
148 output += enumType.GetVariableName(i);
149 }
150 }
151 }
152 }
153 return string.Format("Editor access keys: %1", output);
154 }
155
156 //------------------------------------------------------------------------------------------------
159 {
161 if (!core)
162 return;
163
164 Print("--------------------------------------------------", LogLevel.DEBUG);
165 set<SCR_EditableEntityComponent> entities = new set<SCR_EditableEntityComponent>();
166 core.GetAllEntities(entities, true);
167 foreach (SCR_EditableEntityComponent entity: entities)
168 {
169 if (entity.IsLayer())
170 entity.Log("", m_AccessKey);
171 }
172 Print("--------------------------------------------------", LogLevel.DEBUG);
173 }
174
175 //------------------------------------------------------------------------------------------------
178 {
179 Print(GetKeyDebug(), LogLevel.DEBUG);
180 }
181
182 #ifdef WORKBENCH
183 //------------------------------------------------------------------------------------------------
184 override bool IsAdmin()
185 {
186 return m_bIsAdmin && super.IsAdmin();
187 }
188 #endif
189
190 //------------------------------------------------------------------------------------------------
191 override void EOnEditorDebug(array<string> debugTexts)
192 {
193 debugTexts.Insert(GetKeyDebug());
194 }
195
196 //------------------------------------------------------------------------------------------------
197 override void EOnFrame(IEntity owner, float timeSlice)
198 {
199 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_LOG_AVAILABLE))
200 {
202 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_LOG_AVAILABLE, false);
203 }
204
205 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_LOG_ACCESS_KEYS))
206 {
207 LogAccessKey();
208 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_LOG_ACCESS_KEYS, false);
209 }
210
211 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY_TOGGLE))
212 {
213 typename keysType = EEditableEntityAccessKey;
214 int keyValue;
215 keysType.GetVariableValue(null, DiagMenu.GetRangeValue(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY), keyValue);
216 if (!HasAccess(keyValue))
217 {
218 AddAccessKey(keyValue);
219 }
220 else
221 {
222 RemoveAccessKey(keyValue);
223 }
224 LogAccessKey();
225 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY_TOGGLE, false);
226 }
227
228 #ifdef WORKBENCH
229 if (DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY_ADMIN) != m_bIsAdmin)
230 {
231 m_bIsAdmin = DiagMenu.GetBool(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY_ADMIN);
232 if (m_bIsAdmin)
233 m_AccessKey = int.MAX;
234 else
235 m_AccessKey = EEditableEntityAccessKey.DEFAULT;
236
237 Event_OnChanged.Invoke();
238 }
239 #endif
240 }
241
242 //------------------------------------------------------------------------------------------------
243 //--- JIP on server
244 override bool RplSave(ScriptBitWriter writer)
245 {
246 writer.Write(m_AccessKey, 32);
247 return true;
248 }
249
250 //------------------------------------------------------------------------------------------------
251 //--- JIP on client
252 override bool RplLoad(ScriptBitReader reader)
253 {
254 reader.Read(m_AccessKey, 32);
255 return true;
256 }
257
258 //------------------------------------------------------------------------------------------------
259 override protected void EOnEditorActivate()
260 {
262 }
263
264 //------------------------------------------------------------------------------------------------
265 override void EOnEditorInit()
266 {
267 if (SCR_EditableEntityCore.GetInstance(SCR_EditableEntityCore) == null)
268 return;
269
270 typename keysType = EEditableEntityAccessKey;
271 int keysCount = keysType.GetVariableCount();
272
273 //--- Unlock everything for admin
274 if (IsAdmin())
275 m_AccessKey = int.MAX;
276
277 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_LOG_AVAILABLE, "", "Log Available", "Editable Entities");
278 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_LOG_ACCESS_KEYS, "", "Log Access Keys", "Editable Entities");
279 DiagMenu.RegisterRange(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY, "", "Access Key", "Editable Entities", string.Format("0, %1, 0, 1", keysCount - 1));
280 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY_TOGGLE, "", "Access Key: Toggle", "Editable Entities");
281 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_LOG_ACCESS_KEYS, false);
282 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY_TOGGLE, false);
283
284#ifdef WORKBENCH
285 m_bIsAdmin = IsAdmin();
286 if (m_bIsAdmin)
287 {
288 DiagMenu.RegisterBool(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY_ADMIN, "", "Admin Access", "Editable Entities");
289 DiagMenu.SetValue(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY_ADMIN, m_bIsAdmin);
290 }
291#endif
292 }
293
294 //------------------------------------------------------------------------------------------------
295 override protected void EOnEditorDelete()
296 {
297 DiagMenu.Unregister(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_LOG_AVAILABLE);
298 DiagMenu.Unregister(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_LOG_ACCESS_KEYS);
299 DiagMenu.Unregister(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY);
300 DiagMenu.Unregister(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY_TOGGLE);
301 DiagMenu.Unregister(SCR_DebugMenuID.DEBUGUI_EDITOR_ENTITIES_ACCESS_KEY_ADMIN);
302 Event_OnChanged = null;
303 }
304}
SCR_DebugMenuID
This enum contains all IDs for DiagMenu entries added in script.
Definition DebugMenuID.c:4
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
void LogAccessKey()
Print out access keys.
void AddEntityAccessKey(SCR_EditableEntityComponent entity, EEditableEntityAccessKey accessKey)
void LogAvailableEntities()
Print out all entities with compatible access keys.
EEditableEntityAccessKey GetAccessKey()
void AddAccessKeyServer(EEditableEntityAccessKey accessKey)
bool HasAccess(EEditableEntityAccessKey accessKey)
void RemoveAccessKeyServer(EEditableEntityAccessKey accessKey)
void RemoveEntityAccessKey(SCR_EditableEntityComponent entity, EEditableEntityAccessKey accessKey)
void RemoveEntityAccessKeyServer(int entityID, EEditableEntityAccessKey accessKey)
void AccessKeyChangedOwner(EEditableEntityAccessKey accessKey)
ref ScriptInvoker Event_OnChanged
void AddEntityAccessKeyServer(int entityID, EEditableEntityAccessKey accessKey)
void RemoveAccessKey(EEditableEntityAccessKey accessKey)
void AddAccessKey(EEditableEntityAccessKey accessKey)
string GetKeyDebug()
Diagnostic and developer menu system.
Definition DiagMenu.c:18
proto external int SetEventMask(notnull IEntity owner, int mask)
void Rpc(func method, void p0=NULL, void p1=NULL, void p2=NULL, void p3=NULL, void p4=NULL, void p5=NULL, void p6=NULL, void p7=NULL)
Main replication API.
Definition Replication.c:14
void EOnEditorDelete()
When the entity is destroyed.
void EOnEditorInit()
When the entity is created.
void EOnEditorDebug(array< string > debugTexts)
Every frame while the editor is opened and debug menu is shown.
void RemoveAccessKey(EEditableEntityAccessKey accessKey)
void AddAccessKey(EEditableEntityAccessKey accessKey)
void GetAllEntities(out notnull set< SCR_EditableEntityComponent > entities, bool onlyDirect=false, bool skipIgnored=false)
void EOnFrame(IEntity owner, float timeSlice)
proto external GenericEntity GetOwner()
Get owner entity.
bool RplLoad(ScriptBitReader reader)
bool RplSave(ScriptBitWriter writer)
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14
EEditableEntityAccessKey
SCR_FieldOfViewSettings Attribute
EntityEvent
Various entity events.
Definition EntityEvent.c:14
void RplRpc(RplChannel channel, RplRcver rcver, RplCondition condition=RplCondition.None, string customConditionName="")
Definition EnNetwork.c:95
RplRcver
Definition RplRcver.c:59
RplChannel
Communication channel. Reliable is guaranteed to be delivered. Unreliable not.
Definition RplChannel.c:14
ScriptInvokerBase< func > ScriptInvoker
Definition tools.c:134