cyclops-infobook-html 3.1.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +2 -0
- package/bin/generate-mod-metadata.js +1 -1
- package/lib/infobook/IItem.d.ts +1 -1
- package/lib/modloader/ModLoader.d.ts +8 -2
- package/lib/modloader/ModLoader.js +39 -16
- package/lib/resource/ResourceHandler.js +2 -2
- package/lib/resource/ResourceLoader.js +1 -1
- package/lib/serialize/HtmlInfoBookSerializer.js +1 -1
- package/package.json +7 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
|
3
3
|
|
|
4
|
+
<a name="v4.0.0"></a>
|
|
5
|
+
## [v4.0.0](https://github.com/CyclopsMC/infobook-html/compare/v3.0.0...v4.0.0) - 2024-07-23
|
|
6
|
+
|
|
7
|
+
### BREAKING CHANGE
|
|
8
|
+
* [Update to NeoForge 1.21](https://github.com/CyclopsMC/infobook-html/commit/bec55a8a0d2049a07cc3dafee2276c94ed738e73)
|
|
9
|
+
The most notable change here is that "nbt" on items and fluids is replaced by "components".
|
|
10
|
+
|
|
4
11
|
<a name="v3.1.0"></a>
|
|
5
12
|
## [v3.1.0](https://github.com/CyclopsMC/infobook-html/compare/v3.0.0...v3.1.0) - 2024-01-31
|
|
6
13
|
|
package/README.md
CHANGED
|
@@ -54,6 +54,8 @@ Before you can execute this phase, you need a `modpack.json` file with contents
|
|
|
54
54
|
}
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
*The "forge" entry may be replaced by "neoforge".*
|
|
58
|
+
|
|
57
59
|
To start this phase, simply run `generate-mod-metadata modpack.json generate`.
|
|
58
60
|
|
|
59
61
|
Optionally, you can delete the resulting server files afterwards using `generate-mod-metadata modpack.json clean`.
|
|
@@ -18,7 +18,7 @@ function run(command, configPath) {
|
|
|
18
18
|
const modLoader = new ModLoader_1.ModLoader({
|
|
19
19
|
mods: config.mods,
|
|
20
20
|
path: path_1.join(process.cwd(), 'server'),
|
|
21
|
-
versionForge: config.forge,
|
|
21
|
+
loader: 'forge' in config ? { versionForge: config.forge } : { versionNeoForge: config.neoforge },
|
|
22
22
|
versionMinecraft: config.minecraft,
|
|
23
23
|
});
|
|
24
24
|
switch (command) {
|
package/lib/infobook/IItem.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { ChildProcess } from "child_process";
|
|
|
6
6
|
export declare class ModLoader {
|
|
7
7
|
private readonly mods;
|
|
8
8
|
private readonly path;
|
|
9
|
-
private readonly
|
|
9
|
+
private readonly loader;
|
|
10
10
|
private readonly versionMinecraft;
|
|
11
11
|
constructor(args: IModLoaderArgs);
|
|
12
12
|
/**
|
|
@@ -76,14 +76,20 @@ export declare class ModLoader {
|
|
|
76
76
|
export interface IModLoaderArgs {
|
|
77
77
|
mods: IMod[];
|
|
78
78
|
path: string;
|
|
79
|
-
|
|
79
|
+
loader: ILoader;
|
|
80
80
|
versionMinecraft: string;
|
|
81
81
|
}
|
|
82
|
+
export declare type ILoader = {
|
|
83
|
+
versionForge: string;
|
|
84
|
+
} | {
|
|
85
|
+
versionNeoForge: string;
|
|
86
|
+
};
|
|
82
87
|
export declare type IMod = IModMaven | IModCurseforge | IModRaw;
|
|
83
88
|
export interface IModMaven {
|
|
84
89
|
type: 'maven';
|
|
85
90
|
artifact: string;
|
|
86
91
|
repo: string;
|
|
92
|
+
name?: string;
|
|
87
93
|
}
|
|
88
94
|
export interface IModCurseforge {
|
|
89
95
|
type: 'curseforge';
|
|
@@ -20,7 +20,7 @@ class ModLoader {
|
|
|
20
20
|
constructor(args) {
|
|
21
21
|
this.mods = args.mods;
|
|
22
22
|
this.path = args.path;
|
|
23
|
-
this.
|
|
23
|
+
this.loader = args.loader;
|
|
24
24
|
this.versionMinecraft = args.versionMinecraft;
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
@@ -37,22 +37,41 @@ class ModLoader {
|
|
|
37
37
|
if (!fs.existsSync(this.path)) {
|
|
38
38
|
yield fs.promises.mkdir(this.path);
|
|
39
39
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
let installerFile;
|
|
41
|
+
if ('versionForge' in this.loader) {
|
|
42
|
+
// Download Forge installer
|
|
43
|
+
process.stdout.write('Downloading Forge...\n');
|
|
44
|
+
const forgeInstaller = `https://files.minecraftforge.net/maven/net/minecraftforge/forge/${this.versionMinecraft}-${this.loader.versionForge}/forge-${this.versionMinecraft}-${this.loader.versionForge}-installer.jar`;
|
|
45
|
+
const res = yield node_fetch_1.default(forgeInstaller);
|
|
46
|
+
if (!res.ok) {
|
|
47
|
+
throw new Error(`Failed to fetch (${res.statusText}): ${forgeInstaller}`);
|
|
48
|
+
}
|
|
49
|
+
installerFile = path_1.join(this.path, 'forge-installer.jar');
|
|
50
|
+
yield new Promise((resolve, reject) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
return fs.writeFile(installerFile, yield res.buffer(), (err) => err ? reject(err) : resolve());
|
|
52
|
+
}));
|
|
53
|
+
// Install Forge
|
|
54
|
+
process.stdout.write('Installing Forge...\n');
|
|
55
|
+
yield new Promise((resolve, reject) => child_process_1.exec(`cd ${this.path} && java -jar forge-installer.jar --installServer`).on('exit', resolve));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Download NeoForge installer
|
|
59
|
+
process.stdout.write('Downloading NeoForge...\n');
|
|
60
|
+
const installer = `https://maven.neoforged.net/releases/net/neoforged/neoforge/${this.loader.versionNeoForge}/neoforge-${this.loader.versionNeoForge}-installer.jar`;
|
|
61
|
+
const res = yield node_fetch_1.default(installer);
|
|
62
|
+
if (!res.ok) {
|
|
63
|
+
throw new Error(`Failed to fetch (${res.statusText}): ${installer}`);
|
|
64
|
+
}
|
|
65
|
+
installerFile = path_1.join(this.path, 'neoforge-installer.jar');
|
|
66
|
+
yield new Promise((resolve, reject) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
return fs.writeFile(installerFile, yield res.buffer(), (err) => err ? reject(err) : resolve());
|
|
68
|
+
}));
|
|
69
|
+
// Install Forge
|
|
70
|
+
process.stdout.write('Installing NeoForge...\n');
|
|
71
|
+
yield new Promise((resolve, reject) => child_process_1.exec(`cd ${this.path} && java -jar neoforge-installer.jar --installServer`).on('exit', resolve));
|
|
46
72
|
}
|
|
47
|
-
const installerFile = path_1.join(this.path, 'forge-installer.jar');
|
|
48
|
-
yield new Promise((resolve, reject) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
49
|
-
return fs.writeFile(installerFile, yield res.buffer(), (err) => err ? reject(err) : resolve());
|
|
50
|
-
}));
|
|
51
|
-
// Install Forge
|
|
52
|
-
process.stdout.write('Installing Forge...\n');
|
|
53
|
-
yield new Promise((resolve, reject) => child_process_1.exec(`cd ${this.path} && java -jar forge-installer.jar --installServer`).on('exit', resolve));
|
|
54
73
|
// Wait a bit, because otherwise some files don't exist yet (while they should...)
|
|
55
|
-
process.stdout.write('Wait a bit after
|
|
74
|
+
process.stdout.write('Wait a bit after mod loader installation...\n');
|
|
56
75
|
yield new Promise((resolve) => setTimeout(resolve, 10000));
|
|
57
76
|
// Cleanup
|
|
58
77
|
process.stdout.write('Cleaning up...\n');
|
|
@@ -95,7 +114,11 @@ class ModLoader {
|
|
|
95
114
|
}
|
|
96
115
|
else if (mod.type === 'maven') {
|
|
97
116
|
process.stdout.write(` - ${mod.artifact} from ${mod.repo}...\n`);
|
|
98
|
-
yield mvn_artifact_download_1.default(mod.artifact, modsDir, mod.repo);
|
|
117
|
+
const name = yield mvn_artifact_download_1.default(mod.artifact, modsDir, mod.repo);
|
|
118
|
+
// Rename file if needed
|
|
119
|
+
if ('name' in mod) {
|
|
120
|
+
fs.renameSync(name, path_1.join(modsDir, mod.name));
|
|
121
|
+
}
|
|
99
122
|
}
|
|
100
123
|
else if (mod.type === 'raw') {
|
|
101
124
|
process.stdout.write(` - ${mod.name} from ${mod.url}...\n`);
|
|
@@ -179,7 +179,7 @@ class ResourceHandler {
|
|
|
179
179
|
*/
|
|
180
180
|
addItemTranslationKey(item, translationKey) {
|
|
181
181
|
const { namespace, path } = ResourceHandler.splitItemId(item.item);
|
|
182
|
-
ResourceHandler.addItemKeyedRegistryEntry(this.itemTranslationKeys, namespace, path, item.
|
|
182
|
+
ResourceHandler.addItemKeyedRegistryEntry(this.itemTranslationKeys, namespace, path, item.components, translationKey);
|
|
183
183
|
}
|
|
184
184
|
/**
|
|
185
185
|
* Get an item translation key.
|
|
@@ -188,7 +188,7 @@ class ResourceHandler {
|
|
|
188
188
|
*/
|
|
189
189
|
getItemTranslationKey(item) {
|
|
190
190
|
const { namespace, path } = ResourceHandler.splitItemId(item.item);
|
|
191
|
-
return ResourceHandler.getItemKeyedRegistryEntry(this.itemTranslationKeys, namespace, path, item.
|
|
191
|
+
return ResourceHandler.getItemKeyedRegistryEntry(this.itemTranslationKeys, namespace, path, item.components);
|
|
192
192
|
}
|
|
193
193
|
/**
|
|
194
194
|
* Add an fluid translation key.
|
|
@@ -126,7 +126,7 @@ class ResourceLoader {
|
|
|
126
126
|
// Ignore mods without language files
|
|
127
127
|
}
|
|
128
128
|
// Handle advancements
|
|
129
|
-
const advancementsDir = path_1.join(fullPath, '
|
|
129
|
+
const advancementsDir = path_1.join(fullPath, 'advancement');
|
|
130
130
|
try {
|
|
131
131
|
if ((yield fs_1.promises.stat(langDir)).isDirectory()) {
|
|
132
132
|
yield this.loadAssetsAdvancements(modid, advancementsDir, '');
|
|
@@ -177,7 +177,7 @@ class HtmlInfoBookSerializer {
|
|
|
177
177
|
if (item.item === 'minecraft:air') {
|
|
178
178
|
return slot ? '<div class="item item-slot"> </div>' : '<div class="item"> </div>';
|
|
179
179
|
}
|
|
180
|
-
const icon = resourceHandler.getItemIconFile(item.item, item.
|
|
180
|
+
const icon = resourceHandler.getItemIconFile(item.item, item.components);
|
|
181
181
|
if (!icon) {
|
|
182
182
|
throw new Error(`Could not find an icon for item ${JSON.stringify(item)}`);
|
|
183
183
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cyclops-infobook-html",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "Output Cyclops infobooks as HTML",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"repository": "git@github.com:CyclopsMC/infobook-html.git",
|
|
@@ -50,13 +50,13 @@
|
|
|
50
50
|
"testEnvironment": "node"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@types/jest": "^
|
|
53
|
+
"@types/jest": "^28.0.0",
|
|
54
54
|
"@types/minimist": "^1.2.0",
|
|
55
55
|
"coveralls": "^3.0.3",
|
|
56
|
-
"jest": "^
|
|
56
|
+
"jest": "^28.0.0",
|
|
57
57
|
"manual-git-changelog": "^1.0.1",
|
|
58
58
|
"pre-commit": "^1.2.2",
|
|
59
|
-
"ts-jest": "^
|
|
59
|
+
"ts-jest": "^28.0.0",
|
|
60
60
|
"tslint": "^6.0.0",
|
|
61
61
|
"tslint-eslint-rules": "^5.4.0",
|
|
62
62
|
"typescript": "^4.0.0"
|
|
@@ -90,5 +90,8 @@
|
|
|
90
90
|
"rimraf": "^3.0.0",
|
|
91
91
|
"xml2js": "^0.4.19",
|
|
92
92
|
"yauzl": "^2.10.0"
|
|
93
|
+
},
|
|
94
|
+
"resolutions": {
|
|
95
|
+
"@types/istanbul-reports": "3.0.0"
|
|
93
96
|
}
|
|
94
97
|
}
|