Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_FactionManagerSerializer.c
Go to the documentation of this file.
2{
3 FactionKey m_sKey;
4 bool m_bPlayable;
5 ref array<FactionKey> m_aFriendlies;
6 ref array<FactionKey> m_aHostiles;
7}
8
9class SCR_FactionManagerSerializer : ScriptedEntitySerializer
10{
11 //------------------------------------------------------------------------------------------------
12 override static typename GetTargetType()
13 {
15 }
17 //------------------------------------------------------------------------------------------------
18 override protected ESerializeResult Serialize(notnull IEntity entity, notnull SaveContext context)
19 {
20 const SCR_FactionManager factionManager = SCR_FactionManager.Cast(entity);
21 array<Faction> factions();
22 factionManager.GetFactionsList(factions);
23
24 array<ref SCR_PersistentFaction> changedFactions();
25
26 map<FactionKey, ref set<FactionKey>> friendlyDefaultMapping();
27 foreach (auto faction : factions)
28 {
29 friendlyDefaultMapping.Insert(faction.GetFactionKey(), new set<FactionKey>);
30 }
31
32 for (int i = 0, count = factions.Count(); i < count; ++i)
33 {
34 const SCR_Faction faction = SCR_Faction.Cast(factions[i]);
35 if (!faction)
36 continue;
37
38 const FactionKey key = faction.GetFactionKey();
39 auto defaultFriendlies = faction.GetDefaultFriendlyFactions();
40 bool defaultFriendlySelf = faction.IsDefaultSelfFriendly();
41
42 set<FactionKey> friendlies = friendlyDefaultMapping.Get(key);
43
44 if (defaultFriendlySelf)
45 friendlies.Insert(key);
46
47 foreach (auto friendly : defaultFriendlies)
48 {
49 friendlies.Insert(friendly);
50
51 // defaultFriendlies Can contain a faction key from old config not known to faction manager.
52 set<FactionKey> reverseMapping = friendlyDefaultMapping.Get(friendly);
53 if (reverseMapping)
54 reverseMapping.Insert(key);
55 }
56 }
57
58 for (int i = 0, count = factions.Count(); i < count; ++i)
59 {
60 const SCR_Faction faction = SCR_Faction.Cast(factions[i]);
61 if (!faction)
62 continue;
63
64 const FactionKey key = faction.GetFactionKey();
65
66 array<FactionKey> friendlyFactions();
67 foreach (int idx, auto otherFaction : factions)
68 {
69 if (faction.IsFactionFriendly(otherFaction))
70 friendlyFactions.Insert(otherFaction.GetFactionKey());
71 }
72
73 bool isPlayable = faction.IsPlayable();
74 bool isPlayableDefault = faction.IsDefaultPlayable();
75
76 array<FactionKey> hostileFactions();
77 foreach (auto defaultFriendly : friendlyDefaultMapping.Get(key))
78 {
79 if (!friendlyFactions.RemoveItem(defaultFriendly))
80 hostileFactions.Insert(defaultFriendly);
81 }
82
83 if (isPlayable == isPlayableDefault && friendlyFactions.IsEmpty() && hostileFactions.IsEmpty())
84 continue;
85
86 SCR_PersistentFaction changedFaction();
87 changedFaction.m_sKey = faction.GetFactionKey();
88 changedFaction.m_bPlayable = isPlayable;
89 changedFaction.m_aFriendlies = friendlyFactions;
90 changedFaction.m_aHostiles = hostileFactions;
91 changedFactions.Insert(changedFaction);
92 }
93
94 if (changedFactions.IsEmpty())
95 return ESerializeResult.DEFAULT;
96
97 context.WriteValue("version", 1);
98 const bool prev = context.EnableTypeDiscriminator(false);
99 context.WriteValue("factions", changedFactions);
100 context.EnableTypeDiscriminator(prev);
101 return ESerializeResult.OK;
102 }
103
104 //------------------------------------------------------------------------------------------------
105 override protected bool Deserialize(notnull IEntity entity, notnull LoadContext context)
106 {
107 SCR_FactionManager factionManager = SCR_FactionManager.Cast(entity);
109
110 int version;
111 context.Read(version);
112
113 array<ref SCR_PersistentFaction> changedFactions();
114 const bool prev = context.EnableTypeDiscriminator(false);
115 context.ReadValue("factions", changedFactions);
116 context.EnableTypeDiscriminator(prev);
117
118 array<Faction> factions();
119 factionManager.GetFactionsList(factions);
120
121 foreach (SCR_PersistentFaction changedFaction : changedFactions)
122 {
123 SCR_Faction faction = SCR_Faction.Cast(factionManager.GetFactionByKey(changedFaction.m_sKey));
124 if (!faction)
125 continue;
126
127 if (faction.IsPlayable() != changedFaction.m_bPlayable)
128 {
129 faction.SetIsPlayable(changedFaction.m_bPlayable, false);
130 if (delegateFactionManager)
131 {
132 // Make visible for GM editing UI
133 SCR_EditableFactionComponent delegate = delegateFactionManager.GetFactionDelegate(faction);
134 if (delegate)
135 delegate.SetVisible(changedFaction.m_bPlayable);
136 }
137 }
138
139 bool anyChanged = false;
140 foreach (auto otherFaction : factions)
141 {
142 const SCR_Faction scrOtherFaction = SCR_Faction.Cast(otherFaction);
143 if (!scrOtherFaction)
144 continue;
145
146 const FactionKey otherKey = scrOtherFaction.GetFactionKey();
147 const bool currentFriendly = faction.IsFactionFriendly(scrOtherFaction);
148 if (changedFaction.m_aFriendlies.Contains(otherKey) && !currentFriendly)
149 {
150 anyChanged = true;
151 factionManager.SetFactionsFriendly(faction, scrOtherFaction, updateAIs: false);
152 }
153 else if (changedFaction.m_aHostiles.Contains(otherKey) && currentFriendly)
154 {
155 anyChanged = true;
156 factionManager.SetFactionsHostile(faction, scrOtherFaction, updateAIs: false);
157 }
158 }
159
160 if (anyChanged)
161 SCR_FactionManager.RequestUpdateAllTargetsFactions();
162 }
163
164 return true;
165 }
166}
class SCR_PersistentThreatSector GetTargetType()
void SCR_FactionManager(IEntitySource src, IEntity parent)
SCR_EditableFactionComponent GetFactionDelegate(Faction faction)
static SCR_DelegateFactionManagerComponent GetInstance()
bool IsDefaultSelfFriendly()
bool IsDefaultPlayable()
void SetIsPlayable(bool isPlayable, bool killPlayersIfNotPlayable=false)
bool IsPlayable()
array< FactionKey > GetDefaultFriendlyFactions()
bool Deserialize(notnull IEntity entity, notnull LoadContext context)
ESerializeResult Serialize(notnull IEntity entity, notnull SaveContext context)
Definition Types.c:486
ESerializeResult