32 const UUID commandingGroup = GetSystem().GetId(group.
GetMaster());
34 array<UUID> aiMembers();
35 array<AIAgent> outAgents();
36 group.GetAgents(outAgents);
37 foreach (
auto agent : outAgents)
39 const IEntity character = agent.GetControlledEntity();
43 const UUID uuid = GetSystem().GetId(character);
45 aiMembers.Insert(uuid);
48 set<UUID> waypoints();
49 array<AIWaypoint> outWaypoints();
50 group.GetWaypoints(outWaypoints);
51 foreach (
auto waypoint : outWaypoints)
53 const UUID uuid = GetSystem().GetId(waypoint);
55 waypoints.Insert(uuid);
61 factionKey = faction.GetFactionKey();
71 context.WriteValue(
"version", 1);
72 context.Write(factionKey);
75 context.WriteDefault(commandingGroup,
UUID.NULL_UUID);
77 if (!aiMembers.IsEmpty() || !context.CanSeekMembers())
78 context.Write(aiMembers);
80 if (!waypoints.IsEmpty() || !context.CanSeekMembers())
81 context.Write(waypoints);
105 rallyBase = GetSystem().GetId(
base.GetOwner());
109 context.Write(radioFrequency);
110 context.WriteDefault(preset,
string.Empty);
112 context.Write(groupId);
115 context.WriteDefault(flag,
string.Empty);
116 context.WriteDefault(isPrivate,
false);
117 context.WriteDefault(isPrivateChangeable,
false);
118 context.WriteDefault(customName,
string.Empty);
119 context.WriteDefault(customDesc,
string.Empty);
120 context.WriteDefault(maxMembers, 0);
121 context.WriteDefault(requiredRank, SCR_ECharacterRank.PRIVATE);
122 context.WriteDefault(deleteIfNoPlayer,
true);
123 context.WriteDefault(rallyBase,
UUID.NULL_UUID);
124 if (!rallyBase.IsNull())
125 context.WriteDefault(rallyForced,
false);
129 if (playerIds.RemoveItem(leaderId))
130 playerIds.InsertAt(leaderId, 0);
132 array<UUID> playerIdentities();
133 foreach (
auto playerId : playerIds)
136 if (!playerIdentity.IsNull())
137 playerIdentities.Insert(playerIdentity);
140 if (!playerIdentities.IsEmpty() || !context.CanSeekMembers())
141 context.Write(playerIdentities);
169 context.Read(version);
172 context.Read(factionKey);
173 Faction faction =
GetGame().GetFactionManager().GetFactionByKey(factionKey);
175 group.SetFaction(faction);
177 UUID commandingGroup =
UUID.NULL_UUID;
181 context.ReadDefault(commandingGroup,
UUID.NULL_UUID);
182 if (!commandingGroup.IsNull())
186 GetSystem().WhenAvailable(commandingGroup, commandingTask);
191 array<UUID> aiMembers();
192 context.Read(aiMembers);
193 foreach (
int idx,
auto member : aiMembers)
195 Tuple2<SCR_AIGroup, bool> memberContext(group,
idx == 0);
197 GetSystem().WhenAvailable(member, memberTask);
201 array<AIWaypoint> outWaypoints();
202 group.GetWaypoints(outWaypoints);
203 foreach (
auto waypoint : outWaypoints)
205 group.RemoveWaypoint(waypoint);
208 array<UUID> waypoints();
209 context.Read(waypoints);
210 foreach (
int idx,
auto waypoint : waypoints)
212 Tuple2<SCR_AIGroup, int> waypointContext(group,
idx);
214 GetSystem().WhenAvailable(waypoint, waypointTask);
217 if (group.IsPlayable())
220 context.Read(radioFrequency);
221 group.SetRadioFrequency(radioFrequency);
224 if (context.Read(preset))
226 group.SetPresetResource(preset);
230 context.Read(groupId);
231 group.SetGroupID(groupId);
236 if (context.Read(role))
237 group.SetGroupRole(role);
240 context.ReadDefault(flag,
string.Empty);
243 group.SetCustomGroupFlag(flag);
244 if (!flag.StartsWith(
"{"))
245 group.SetFlagIsFromImageSet(
true);
249 if (context.Read(isPrivate))
250 group.SetPrivate(isPrivate);
252 bool isPrivateChangeable;
253 if (context.Read(isPrivateChangeable))
254 group.SetPrivacyChangeable(isPrivateChangeable);
257 context.ReadDefault(customName,
string.Empty);
260 context.ReadDefault(customDesc,
string.Empty);
263 if (context.Read(maxMembers))
264 group.SetMaxGroupMembers(maxMembers);
266 SCR_ECharacterRank requiredRank;
267 if (context.Read(requiredRank))
268 group.SetRequiredRank(requiredRank);
270 bool deleteIfNoPlayer;
271 context.ReadDefault(deleteIfNoPlayer,
true);
272 group.SetCanDeleteIfNoPlayer(deleteIfNoPlayer);
275 context.ReadDefault(rallyBase,
UUID.NULL_UUID);
276 if (!rallyBase.IsNull())
279 context.ReadDefault(rallyForced,
false);
281 Tuple2<SCR_AIGroup, bool> rallyContext(group, rallyForced);
283 GetSystem().WhenAvailable(rallyBase, rallyTask);
289 groupsManager.AssignGroupID(group);
290 groupsManager.RegisterGroup(group);
291 groupsManager.ClaimFrequency(radioFrequency, faction);
292 groupsManager.OnGroupCreated(group);
295 array<UUID> playerIdentities();
296 context.Read(playerIdentities);
297 foreach (
int idx,
auto playerIdentity : playerIdentities)
299 Tuple4<SCR_AIGroup, bool, string, string> playerContext(group,
idx == 0,
string.Empty,
string.Empty);
300 if (playerContext.param2)
303 playerContext.param3 = customName;
304 playerContext.param4 = customDesc;
319 if (!playerController)
322 auto playerContext = Tuple4<SCR_AIGroup, bool, string, string>.Cast(context);
323 if (!playerContext.param1)
326 auto playerGroupController = SCR_PlayerControllerGroupComponent.Cast(playerController.FindComponent(SCR_PlayerControllerGroupComponent));
327 if (!playerGroupController)
330 const int groupId = playerContext.param1.GetGroupID();
331 playerGroupController.RPC_AskJoinGroup(groupId);
332 if (playerGroupController.GetGroupID() != groupId)
335 if (playerContext.param2 || playerContext.param1.GetLeaderID() == -1)
337 const int playerId = playerController.GetPlayerId();
338 playerContext.param1.SetGroupLeader(playerId);
340 if (!playerContext.param3.IsEmpty())
341 playerContext.param1.SetCustomName(playerContext.param3, playerId);
343 if (!playerContext.param4.IsEmpty())
344 playerContext.param1.SetCustomDescription(playerContext.param4, playerId);
351 auto member = SCR_ChimeraCharacter.Cast(instance);
359 aiAgent.ActivateAI();
361 auto groupContext = Tuple2<SCR_AIGroup, bool>.Cast(context);
362 if (!groupContext.param1)
365 groupContext.param1.AddAgent(aiAgent);
367 if (groupContext.param2)
368 groupContext.param1.SetNewLeader(aiAgent);
371 if (groupContext.param1.GetMaster())
373 auto aiMembers = groupContext.param1.GetAIMembers();
374 if (!aiMembers.Contains(member))
376 aiMembers.Insert(member);
377 member.SetRecruited(
true);
402 if (!commandingContext.param1)
405 auto masterRpl = RplComponent.Cast(masterGroup.FindComponent(RplComponent));
406 auto slaveRpl = RplComponent.Cast(commandingContext.param1.FindComponent(RplComponent));
407 if (!masterRpl || !slaveRpl)
411 groupsManager.RequestSetGroupSlave(masterRpl.Id(), slaveRpl.Id());
415 array<AIAgent> outAgents();
416 commandingContext.param1.GetAgents(outAgents);
417 auto aiMembers = commandingContext.param1.GetAIMembers();
418 foreach (
auto agent : outAgents)
420 auto member = SCR_ChimeraCharacter.Cast(agent.GetControlledEntity());
421 if (!aiMembers.Contains(member))
423 aiMembers.Insert(member);
424 member.SetRecruited(
true);