Нижеследующее для продвинутых. Если не понимаете что почём то лучше дождаться нормального релиза мода.
Итак, будем лечить ошибку:
Связана она с тем что разрабы удалили функцию loadRecursive, переведя всё на асинхрон. Значит будем её возвращать.
Вот сама функция в виде класса:
Можно вставить почти в любом месте в том файле где используется "loadRecursive".
Теперь просто нужно заменить вызов databaseImporter.loadRecursive на нашу функцию. Вот небольшой пример:
Было:
Стало:
Итак, будем лечить ошибку:
Код:
TypeError: databaseImporter.loadRecursive is not a function
Вот сама функция в виде класса:
Код:
class RDclass
{
public loadRecursiveOld<T>(
filepath: string,
onReadCallback: (fileWithPath: string, data: string) => void = () => {},
onObjectDeserialized: (fileWithPath: string, object: any) => void = () => {},
): T {
const result = {} as T;
const files = this.getFiles(filepath);
const directories = this.getDirs(filepath);
for (const file of files)
{
if (this.getFileExtension(file) === "json")
{
const filename = this.stripExtension(file);
const filePathAndName = `${filepath}${file}`;
const fileData = this.readFile(filePathAndName);
onReadCallback(filePathAndName, fileData);
const fileDeserialized = JSON.parse( fileData );
onObjectDeserialized(filePathAndName, fileDeserialized);
result[filename] = fileDeserialized;
}
}
for (const dir of directories)
{
result[dir] = this.loadRecursiveOld(`${filepath}${dir}/`);
}
return result;
}
private getFiles(filepath: string): string[]
{
return fs.readdirSync(filepath).filter((item) =>
{
return fs.statSync(path.join(filepath, item)).isFile();
});
}
private getDirs(filepath: string): string[]
{
return fs.readdirSync(filepath).filter((item) =>
{
return fs.statSync(path.join(filepath, item)).isDirectory();
});
}
private getFileExtension(filepath: string): string | undefined
{
return filepath.split(".").pop();
}
private stripExtension(filepath: string): string
{
return filepath.split(".").slice(0, -1).join(".");
}
private readFile(...args: Parameters<typeof fs.readFileSync>): string
{
const read = fs.readFileSync(...args);
if (this.isBuffer(read))
{
return read.toString();
}
return read;
}
private isBuffer(value: any): value is Buffer
{
return value?.write && value.toString && value.toJSON && value.equals;
}
}
Можно вставить почти в любом месте в том файле где используется "loadRecursive".
Теперь просто нужно заменить вызов databaseImporter.loadRecursive на нашу функцию. Вот небольшой пример:
Было:
Код:
this.mydb = databaseImporter.loadRecursive(`${modLoader.getModPath(modFolderName)}database/`);
Код:
//this.mydb = databaseImporter.loadRecursive(`${modLoader.getModPath(modFolderName)}database/`);
const RD = new RDclass;
this.mydb = RD.loadRecursiveOld(`${modLoader.getModPath(modFolderName)}database/`);