diff --git a/OpenRA.Game/FieldLoader.cs b/OpenRA.Game/FieldLoader.cs index d93089c1aa..66c868730e 100644 --- a/OpenRA.Game/FieldLoader.cs +++ b/OpenRA.Game/FieldLoader.cs @@ -429,6 +429,18 @@ namespace OpenRA ret.SetValue(GetValue(fieldName, fieldType.GetElementType(), parts[i].Trim(), field), i); return ret; } + else if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(HashSet<>)) + { + var set = Activator.CreateInstance(fieldType); + if (value == null) + return set; + + var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + var addMethod = fieldType.GetMethod("Add", fieldType.GetGenericArguments()); + for (var i = 0; i < parts.Length; i++) + addMethod.Invoke(set, new[] { GetValue(fieldName, fieldType.GetGenericArguments()[0], parts[i].Trim(), field) }); + return set; + } else if (fieldType == typeof(Size)) { if (value != null) diff --git a/OpenRA.Game/FieldSaver.cs b/OpenRA.Game/FieldSaver.cs index b1facbbe36..70b17ca936 100644 --- a/OpenRA.Game/FieldSaver.cs +++ b/OpenRA.Game/FieldSaver.cs @@ -91,8 +91,12 @@ namespace OpenRA if (t.IsArray && t.GetArrayRank() == 1) { - var elems = ((Array)v).OfType(); - return elems.JoinWith(", "); + return ((Array)v).Cast().JoinWith(", "); + } + + if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(HashSet<>)) + { + return ((System.Collections.IEnumerable)v).Cast().JoinWith(", "); } if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(OpenRA.Primitives.Cache<,>))