Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AISettingsBaseComponent.c
Go to the documentation of this file.
1//---------------------------------------------------------------------------------------------------
2[ComponentEditorProps(visible: false)]
6
23class SCR_AISettingsBaseComponent : ScriptComponent
24{
26 protected AIBaseUtilityComponent m_UtilityComp;
27
28 //------------------------------------------------------------------------------------------------
29 override void OnPostInit(IEntity owner)
30 {
31 super.OnPostInit(owner);
32 m_UtilityComp = AIBaseUtilityComponent.Cast(owner.FindComponent(AIBaseUtilityComponent));
33 }
34
35 //------------------------------------------------------------------------------------------------
42 bool AddSetting(notnull SCR_AISettingBase setting, bool createCopy, bool removeSameTypeAndOrigin = false)
43 {
44 #ifdef AI_DEBUG
45 string strDebugText = string.Format("AddSetting: %1, Origin: %2, Priority: %3, %4",
46 setting,
47 typename.EnumToString(SCR_EAISettingOrigin, setting.GetOrigin()),
48 setting.GetPriority(),
49 setting.GetDebugText());
50 AddDebugMessage(strDebugText);
51 #endif
52
53 typename t = setting.GetCategorizationType();
54 // Remove same type and origin?
55 if (removeSameTypeAndOrigin)
56 RemoveSettingsOfTypeAndOrigin(t, setting.GetOrigin());
57
58 // Create copy of the setting if needed
59 SCR_AISettingBase settingToAdd;
60 if (createCopy)
61 {
62 SCR_AISettingBase settingCopy = setting.CreateCopy();
63 settingCopy.Internal_InitCopyFrom(setting);
64 settingToAdd = settingCopy;
65 }
66 else
67 settingToAdd = setting;
68
69 array<ref SCR_AISettingBase> settingsOfType = m_mSettings.Get(t);
70 if (!settingsOfType)
71 {
72 settingsOfType = {};
73 m_mSettings.Set(t, settingsOfType);
74 }
75 else
76 {
77 // Bail if we have already added exactly this setting
78 if (settingsOfType.Contains(settingToAdd))
79 return false;
80 }
81
82 settingToAdd.Internal_SetFlag(SCR_EAISettingFlags.SETTINGS_COMPONENT); // Now setting is registered here
83 settingsOfType.Insert(settingToAdd);
84 settingsOfType.Sort(true); // Sorted by priority, biggest priority first
85
86 OnSettingAdded(settingToAdd);
87 settingToAdd.OnAdded(this);
88
89 // Call setting with highest priority to apply its effects
90 settingsOfType[0].ApplyEffects(this);
91
92 return true;
93 }
94
95 //---------------------------------------------------------------------------------------------------
96 bool RemoveSetting(notnull SCR_AISettingBase setting)
97 {
98 #ifdef AI_DEBUG
99 string strDebugText = string.Format("RemoveSetting: %1, Origin: %2, Priority: %3, %4",
100 setting,
101 typename.EnumToString(SCR_EAISettingOrigin, setting.GetOrigin()),
102 setting.GetPriority(),
103 setting.GetDebugText());
104 AddDebugMessage(strDebugText);
105 #endif
106
107 typename t = setting.GetCategorizationType();
108 array<ref SCR_AISettingBase> settingsOfType = m_mSettings.Get(t);
109 if (!settingsOfType)
110 return false;
111
112 if (!settingsOfType.Contains(setting))
113 return false;
114
115 settingsOfType.RemoveItemOrdered(setting);
116
117 OnSettingRemoved(setting);
118 setting.OnRemoved(this);
119
120 return true;
121 }
122
123 //---------------------------------------------------------------------------------------------------
125 bool RemoveChildSettingsOfParent(notnull SCR_AISettingBase parentSetting)
126 {
127 #ifdef AI_DEBUG
128 string strDebugText = string.Format("RemoveChildSettingsOfParent: %1, %2",
129 parentSetting,
130 parentSetting.GetDebugText());
131
132 AddDebugMessage(strDebugText);
133 #endif
134
135 typename t = parentSetting.GetCategorizationType();
136 array<ref SCR_AISettingBase> settingsOfType = m_mSettings.Get(t);
137 if (!settingsOfType)
138 return false;
139
140 int id = -1;
141 foreach (int i, auto s : settingsOfType)
142 {
143 if (s.GetParentSetting() == parentSetting)
144 {
145 id = i;
146 break;
147 }
148 }
149
150 if (id == -1)
151 return false;
152
153 SCR_AISettingBase setting = settingsOfType[id]; // Hold strong reference
154 settingsOfType.RemoveOrdered(id);
155 OnSettingRemoved(setting);
156
157 return true;
158 }
159
160 //---------------------------------------------------------------------------------------------------
162 void RemoveSettingsWithFlag(SCR_EAISettingFlags f)
163 {
164 #ifdef AI_DEBUG
165 string strDebugText = string.Format("RemoveSettingsWithFlag: %1", typename.EnumToString(SCR_EAISettingFlags, f));
166 AddDebugMessage(strDebugText);
167 #endif
168
169 foreach (typename t, array<ref SCR_AISettingBase> a : m_mSettings)
170 {
171 for (int i = a.Count()-1; i >= 0; i--)
172 {
173 auto s = a[i];
174 if (s.HasFlag(f))
175 {
176 a.RemoveOrdered(i);
178 }
179 }
180 }
181 }
182
183 //---------------------------------------------------------------------------------------------------
186 {
187 #ifdef AI_DEBUG
188 string strDebugText = string.Format("RemoveSetingsOfTypeAndOrigin: %1, %2", t, typename.EnumToString(SCR_EAISettingOrigin, origin));
189 AddDebugMessage(strDebugText);
190 #endif
191
192 array<ref SCR_AISettingBase> settingsOfType = m_mSettings.Get(t);
193 if (!settingsOfType)
194 return;
195
196 for (int i = settingsOfType.Count()-1; i >= 0; i--)
197 {
198 auto s = settingsOfType[i];
199 if (s.GetOrigin() == origin)
200 {
201 settingsOfType.RemoveOrdered(i);
203 }
204 }
205 }
206
207 //---------------------------------------------------------------------------------------------------
210 SCR_AISettingBase GetCurrentSetting(typename settingType)
211 {
212 SCR_AIActionBase currentAction;
213
214 if (m_UtilityComp)
215 currentAction = SCR_AIActionBase.Cast(m_UtilityComp.GetCurrentAction());
216
217 int actionCause = 0;
218 if (currentAction)
219 actionCause = currentAction.GetCause();
220
221 return GetCurrentSetting(settingType, actionCause);
222 }
223
224 //---------------------------------------------------------------------------------------------------
227 SCR_AISettingBase GetCurrentSetting(typename settingType, int currentActionCause)
228 {
229 array<ref SCR_AISettingBase> settingsOfType = m_mSettings.Get(settingType);
230
231 if (!settingsOfType || settingsOfType.IsEmpty())
232 return null;
233
234 // Settings are already ordered by priority, return first matching behavior type
235 foreach (SCR_AISettingBase setting : settingsOfType)
236 {
237 if (currentActionCause <= setting.GetMaxActionCause())
238 return setting;
239 }
240
241 return null;
242 }
243
244 //---------------------------------------------------------------------------------------------------
246 void GetAllSettings(notnull array<SCR_AISettingBase> outSettings)
247 {
248 outSettings.Clear();
249
250 foreach (typename t, array<ref SCR_AISettingBase> settingsOfType : m_mSettings)
251 {
252 foreach (auto s : settingsOfType)
253 outSettings.Insert(s);
254 }
255 }
256
257 //-------------------------------------------------------------------------------------------------------------
258 // Protected / Internal
259
260 //------------------------------------------------------------------------------------------------
261 protected void OnSettingRemoved(notnull SCR_AISettingBase setting);
262 protected void OnSettingAdded(notnull SCR_AISettingBase setting);
263
264 #ifdef AI_DEBUG
265 //------------------------------------------------------------------------------------------------
266 protected void AddDebugMessage(string str, EAIDebugMsgType messageType = EAIDebugMsgType.SETTINGS)
267 {
268 SCR_AIInfoBaseComponent infoComp = SCR_AIInfoBaseComponent.Cast(GetOwner().FindComponent(SCR_AIInfoBaseComponent));
269 infoComp.AddDebugMessage(str, msgType: messageType);
270 }
271 #endif
272}
AddonBuildInfoTool id
bool AddSetting(notnull SCR_AISettingBase setting, bool createCopy, bool removeSameTypeAndOrigin=false)
It's overridden as protected. This way SCR_AICharacterSettingsComponent accepts only character settin...
EAIDebugMsgType
void OnSettingAdded(notnull SCR_AISettingBase setting)
void OnSettingRemoved(notnull SCR_AISettingBase setting)
enum EAIGroupCombatMode ComponentEditorProps(category:"GameScripted/AI", description:"Component for utility AI system for groups")
SCR_EAISettingOrigin
SCR_AISettingsBaseComponentClass m_mSettings
void RemoveSettingsWithFlag(SCR_EAISettingFlags f)
Iterates all settings, removes all which have given flag.
void RemoveSettingsOfTypeAndOrigin(typename t, SCR_EAISettingOrigin origin)
typename t - must be one of those returned by GetCategorizationType
bool RemoveSetting(notnull SCR_AISettingBase setting)
SCR_AISettingBase GetCurrentSetting(typename settingType)
void GetAllSettings(notnull array< SCR_AISettingBase > outSettings)
Returns all setting objects held by this component.
AIBaseUtilityComponent m_UtilityComp
bool RemoveChildSettingsOfParent(notnull SCR_AISettingBase parentSetting)
Removes setting which has provided setting object as parent.
proto external GenericComponent FindComponent(typename typeName)
proto external Managed FindComponent(typename typeName)
proto external GenericEntity GetOwner()
Get owner entity.
Definition Types.c:486