2using System.Collections;
3using System.Collections.Generic;
6using NPOI.SS.UserModel;
7using NPOI.XSSF.UserModel;
14 public Dictionary<string, EMod>
fileProviders =
new Dictionary<string, EMod>(PathComparer.Default);
23 string[] array =
new string[3]
29 foreach (
string key
in array)
41 string sheetName = sheet.SheetName;
45 if ((
object)sourceData ==
null)
47 Debug.Log(
"#source skipping sheet " + sheetName);
53 list = sourceData.GetField<IList>(
"rows");
62 Debug.Log(
"#source loading sheet " + sheetName);
63 ExcelParser.path =
file;
64 ERROR.lastImported = 0;
65 string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(
file);
66 if (!sourceData.
ImportData(sheet, fileNameWithoutExtension, overwrite:
true))
68 throw new SourceParseException(
"#source failed to import data " + sourceData.GetType().Name +
":" + fileNameWithoutExtension +
"/" + sheetName);
75 return (sourceData,
item);
80 Debug.LogError(
$"#source failed to load sheet {sheetName}\n{arg}");
85 public IEnumerable<SourceData>
ImportFilesCached(IEnumerable<string> imports,
bool resetData =
true)
87 string[] prefetchSheetNames =
new string[2] {
"Element",
"Material" };
88 SourceCache[] array = imports.Select(SourceCache.GetOrCreate).Distinct().ToArray();
89 Dictionary<SourceCache, (string, ISheet[], ISheet[])> dictionary = (from c in array
90 where c.IsDirtyOrEmpty
91 select
PrefetchWorkbook(c.SheetFile.FullName, prefetchSheetNames)).ToArray().ToDictionary(((
string file, ISheet[]
sheets, ISheet[] fetched) p) => SourceCache.GetOrCreate(p.file));
93 HashSet<SourceData> hashSet =
new HashSet<SourceData> { elements };
94 SourceCache[] array2 = array;
95 foreach (SourceCache sourceCache
in array2)
97 string arg = sourceCache.SheetFile.ShortPath();
98 if (
fileProviders.TryGetValue(sourceCache.SheetFile.FullName, out var value))
100 sourceCache.SetMod(value);
102 if (sourceCache.IsDirtyOrEmpty)
104 if (!dictionary.TryGetValue(sourceCache, out var value2) || value2.Item3.Length == 0)
108 ISheet[]
item = value2.Item3;
109 foreach (ISheet sheet
in item)
111 ExcelParser.allowTrimming =
true;
115 if (!item2.IsEmpty())
117 sourceCache.EmplaceCache(sheet.SheetName, item2);
118 value?.sourceRows.UnionWith(item2);
119 Debug.Log(
$"#source workbook {arg}:{sheet.SheetName}:{item2.Length}");
124 ExcelParser.allowTrimming =
false;
129 string[] array3 = prefetchSheetNames;
130 foreach (
string text
in array3)
132 if (sourceCache.TryGetCache(text, out var rows))
134 int num3 = elements.ImportRows(rows);
135 value?.sourceRows.UnionWith(rows);
136 Debug.Log(
$"#source workbook-cache {arg}:{text}:{num3}");
141 foreach (SourceCache sourceCache2
in array2)
143 string text2 = sourceCache2.SheetFile.ShortPath();
145 if (sourceCache2.IsDirtyOrEmpty)
147 if (!dictionary.TryGetValue(sourceCache2, out var value3) || value3.Item2.Length == 0)
151 Debug.Log(
"#source workbook " + text2);
152 ISheet[]
item = value3.Item2;
153 foreach (ISheet sheet2
in item)
155 if (prefetchSheetNames.Contains(sheet2.SheetName))
159 key = sheet2.SheetName;
164 allowTrimming = ((!(key ==
"Word")) ? 1 : 0);
173 ExcelParser.allowTrimming = (byte)allowTrimming != 0;
177 if ((
object)sourceData !=
null)
179 int? num4 = array4?.Length;
180 if (num4.HasValue && num4.GetValueOrDefault() > 0)
182 sourceCache2.EmplaceCache(sheet2.SheetName, array4);
183 sourceCache2.Mod?.sourceRows.UnionWith(array4);
184 hashSet.Add(sourceData);
190 ExcelParser.allowTrimming =
false;
195 foreach (KeyValuePair<
string,
SourceData.
BaseRow[]> item3 in sourceCache2.Source)
197 item3.Deconstruct(out key, out var value4);
203 if (sourceData2 is
SourceElement || (
object)sourceData2 ==
null)
214 Debug.Log(
"#source cached rows are empty " + text2 +
":" + text3);
218 sourceCache2.Mod?.sourceRows.UnionWith(array5);
219 Debug.Log(
$"#source workbook-cache {text2}:{text3}:{num5}");
220 hashSet.Add(sourceData2);
230 public static void HotInit(IEnumerable<SourceData> sourceData)
232 Debug.Log(
"#source resetting data...");
243 List<SourceData> list = sourceData.Distinct().OrderBy(delegate(
SourceData s)
245 int num = Array.IndexOf(order, s);
246 return (num >= 0) ? num : order.Length;
248 if (list.Any((
SourceData s) => Array.IndexOf(order, s) > 0))
270 catch (Exception arg)
272 Debug.LogError(
$"#source failed to reset dirty data {item.GetType().Name}\n{arg}");
287 RecipeManager.rebuild =
true;
288 Debug.Log(
"#source initialized data");
293 using FileStream @is = File.Open(
file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
294 XSSFWorkbook xSSFWorkbook =
new XSSFWorkbook((Stream)@is);
295 List<ISheet> list =
new List<ISheet>();
296 List<ISheet> list2 =
new List<ISheet>();
297 for (
int i = 0; i < xSSFWorkbook.NumberOfSheets; i++)
299 ISheet sheetAt = xSSFWorkbook.GetSheetAt(i);
300 if (
FindSourceByName(sheetAt.SheetName) !=
null && prefetchNames.Contains(sheetAt.SheetName))
309 Debug.Log(
"#source workbook-prefetch " +
file.ShortPath());
310 return (
file:
file,
sheets: list.ToArray(), fetched: list2.ToArray());
static SourceManager sources
override bool ImportData(ISheet sheet, string bookname, bool overwrite=false)
override int ImportRows(IEnumerable< BaseRow > sourceRows)
IEnumerable< SourceData > ImportFilesCached(IEnumerable< string > imports, bool resetData=true)
static void HotInit(IEnumerable< SourceData > sourceData)
Dictionary< string, EMod > fileProviders
SourceImporter(IReadOnlyDictionary< string, SourceData > sourceMapping)
SourceData FindSourceByName(string name)
readonly IReadOnlyDictionary< string, SourceData > _sourceMapping
string ISheet[] ISheet[] fetched PrefetchWorkbook(string file, string[] prefetchNames)
SourceData.BaseRow[] LoadBySheetName(ISheet sheet, string file)
SourceCellEffect cellEffects
static void ReapplyRows()