mc-assets 0.1.0 → 0.1.2

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/dist/index.d.ts CHANGED
@@ -2,4 +2,4 @@ export * from './stores';
2
2
  export { AtlasParser } from './atlasParser';
3
3
  export { makeTextureAtlas, JsonAtlas } from './atlasCreator';
4
4
  export * from './types';
5
- export { AssetsParser, BlockElement, QueriedBlock } from './parser';
5
+ export { AssetsParser, BlockElement, QueriedBlock } from './assetsParser';
package/dist/index.js CHANGED
@@ -2,4 +2,4 @@ export * from './stores';
2
2
  export { AtlasParser } from './atlasParser';
3
3
  export { makeTextureAtlas } from './atlasCreator';
4
4
  export * from './types';
5
- export { AssetsParser } from './parser';
5
+ export { AssetsParser } from './assetsParser';
@@ -0,0 +1,63 @@
1
+ import { AtlasParser } from './atlasParser';
2
+ import { AssetsParser } from './assetsParser';
3
+ import { BlockModelsStore, BlockStatesStore } from './stores';
4
+ export declare class ItemsRenderer {
5
+ version: string;
6
+ itemsAtlasParser: AtlasParser;
7
+ blocksAtlasParser?: AtlasParser | undefined;
8
+ blockStatesStore: BlockStatesStore;
9
+ modelsStore: BlockModelsStore;
10
+ assetsParser: AssetsParser;
11
+ constructor(version: string, blockstatesModels: any, itemsAtlasParser: AtlasParser, blocksAtlasParser?: AtlasParser | undefined);
12
+ resolveTexture(texture: string): {
13
+ slice: [number, number, number, number];
14
+ /** @deprecated */
15
+ path: string;
16
+ type: string;
17
+ };
18
+ tryGetFullBlock(blockName: string, properties?: Record<string, string | boolean>): {
19
+ top: {
20
+ slice: [number, number, number, number];
21
+ /** @deprecated */
22
+ path: string;
23
+ type: string;
24
+ };
25
+ left: {
26
+ slice: [number, number, number, number];
27
+ /** @deprecated */
28
+ path: string;
29
+ type: string;
30
+ };
31
+ right: {
32
+ slice: [number, number, number, number];
33
+ /** @deprecated */
34
+ path: string;
35
+ type: string;
36
+ };
37
+ } | undefined;
38
+ getItemTexture(itemName: string, properties?: Record<string, string | boolean>): {
39
+ slice: [number, number, number, number];
40
+ /** @deprecated */
41
+ path: string;
42
+ type: string;
43
+ } | {
44
+ top: {
45
+ slice: [number, number, number, number];
46
+ /** @deprecated */
47
+ path: string;
48
+ type: string;
49
+ };
50
+ left: {
51
+ slice: [number, number, number, number];
52
+ /** @deprecated */
53
+ path: string;
54
+ type: string;
55
+ };
56
+ right: {
57
+ slice: [number, number, number, number];
58
+ /** @deprecated */
59
+ path: string;
60
+ type: string;
61
+ };
62
+ } | undefined;
63
+ }
@@ -0,0 +1,78 @@
1
+ import { AssetsParser } from './assetsParser';
2
+ import { getLoadedBlockstatesStore, getLoadedModelsStore } from './stores';
3
+ export class ItemsRenderer {
4
+ version;
5
+ itemsAtlasParser;
6
+ blocksAtlasParser;
7
+ blockStatesStore;
8
+ modelsStore;
9
+ assetsParser;
10
+ constructor(version, blockstatesModels, itemsAtlasParser, blocksAtlasParser) {
11
+ this.version = version;
12
+ this.itemsAtlasParser = itemsAtlasParser;
13
+ this.blocksAtlasParser = blocksAtlasParser;
14
+ this.blockStatesStore = getLoadedBlockstatesStore(blockstatesModels);
15
+ this.modelsStore = getLoadedModelsStore(blockstatesModels);
16
+ this.assetsParser = new AssetsParser(version, this.blockStatesStore, this.modelsStore);
17
+ }
18
+ resolveTexture(texture) {
19
+ const atlasParser = texture.startsWith('block/') ? this.blocksAtlasParser : this.itemsAtlasParser;
20
+ const type = texture.startsWith('block/') ? 'blocks' : 'items';
21
+ const textureInfo = atlasParser.getTextureInfo(texture.replace('block/', '').replace('item/', ''), this.version);
22
+ const atlas = atlasParser.atlas[textureInfo.imageType];
23
+ return {
24
+ slice: [
25
+ textureInfo.u * atlas.width,
26
+ textureInfo.v * atlas.height,
27
+ textureInfo.su * atlas.width,
28
+ textureInfo.sv * atlas.height
29
+ ],
30
+ /** @deprecated */
31
+ path: type,
32
+ type: type
33
+ };
34
+ }
35
+ tryGetFullBlock(blockName, properties = {}) {
36
+ if (!this.blocksAtlasParser)
37
+ return;
38
+ const resolvedModel = this.assetsParser.getResolvedModel({
39
+ name: blockName,
40
+ properties,
41
+ }, true);
42
+ if (resolvedModel.elements?.length !== 1)
43
+ return;
44
+ const elem = resolvedModel.elements[0];
45
+ if (elem.from[0] !== 0 || elem.from[1] !== 0 || elem.from[2] !== 0)
46
+ return;
47
+ if (elem.to[0] !== 16 || elem.to[1] !== 16 || elem.to[2] !== 16)
48
+ return;
49
+ const topTexture = elem.faces.up?.texture ?? elem.faces.top?.texture;
50
+ const leftTexture = elem.faces.east?.texture ?? elem.faces.left?.texture ?? elem.faces.side?.texture;
51
+ const rightTexture = elem.faces.north?.texture ?? elem.faces.right?.texture ?? elem.faces.side?.texture;
52
+ return {
53
+ top: this.resolveTexture(topTexture),
54
+ left: this.resolveTexture(leftTexture),
55
+ right: this.resolveTexture(rightTexture),
56
+ };
57
+ }
58
+ getItemTexture(itemName, properties = {}) {
59
+ let model;
60
+ if (itemName.includes('/')) {
61
+ model = this.modelsStore.get(this.version, itemName);
62
+ }
63
+ else {
64
+ model = this.modelsStore.get(this.version, `item/${itemName}`);
65
+ if (!model || model.parent?.startsWith('block/')) {
66
+ return this.tryGetFullBlock(itemName, properties);
67
+ }
68
+ }
69
+ if (!model)
70
+ return;
71
+ const layer0 = model.textures?.layer0;
72
+ if (!layer0)
73
+ return;
74
+ return this.resolveTexture(layer0);
75
+ // const {resolvedModel} = this.assetsParser.getResolvedModelByModelName('item/' + itemName, itemName) ?? {}
76
+ // resolvedModel?.textures['layer0']
77
+ }
78
+ }
package/dist/types.d.ts CHANGED
@@ -34,11 +34,19 @@ export type BlockModel = {
34
34
  elements?: {
35
35
  from: BlockElementPos;
36
36
  to: BlockElementPos;
37
+ rotation?: {
38
+ origin: [number, number, number];
39
+ axis: string;
40
+ angle: number;
41
+ rescale?: boolean;
42
+ };
37
43
  faces: {
38
44
  [name: string]: {
39
45
  texture: string;
40
46
  uv?: number[];
41
47
  cullface?: string;
48
+ rotation?: number;
49
+ tintindex?: number;
42
50
  };
43
51
  };
44
52
  }[];
@@ -1,9 +1,11 @@
1
- import { QueriedBlock } from './parser';
1
+ import { QueriedBlock } from './assetsParser';
2
2
  export default function worldBlockProvider(blockstatesModels: any, blocksAtlas: any, version: string): {
3
3
  getResolvedModel0_1(block: Omit<QueriedBlock, "stateId">, fallbackVariant?: boolean): {
4
+ x?: number;
5
+ y?: number;
6
+ z?: number;
7
+ ao?: boolean;
4
8
  elements: {
5
- from: import("./types").BlockElementPos;
6
- to: import("./types").BlockElementPos;
7
9
  faces: {
8
10
  [k: string]: {
9
11
  texture: {
@@ -11,24 +13,33 @@ export default function worldBlockProvider(blockstatesModels: any, blocksAtlas:
11
13
  v: number;
12
14
  su: number;
13
15
  sv: number;
14
- imageName: string;
15
- version: string;
16
+ tileIndex: number;
17
+ debugName: string;
16
18
  };
17
- cullface: string | undefined;
19
+ uv?: number[];
20
+ cullface?: string;
21
+ rotation?: number;
22
+ tintindex?: number;
18
23
  };
19
24
  };
25
+ from: import("./types").BlockElementPos;
26
+ to: import("./types").BlockElementPos;
27
+ rotation?: {
28
+ origin: [number, number, number];
29
+ axis: string;
30
+ angle: number;
31
+ rescale?: boolean;
32
+ };
20
33
  }[] | undefined;
21
- ao: boolean | undefined;
22
- x: number | undefined;
23
- y: number | undefined;
24
- z: number | undefined;
25
34
  };
26
35
  getTextureInfo(textureName: string): {
27
36
  su: number;
28
37
  sv: number;
38
+ getLoadedImage: () => Promise<HTMLImageElement>;
29
39
  u: number;
30
40
  v: number;
31
- imageName: string;
41
+ tileIndex: number;
42
+ imageType: "latest" | "legacy";
32
43
  version: string;
33
44
  } | undefined;
34
45
  };
@@ -1,5 +1,5 @@
1
1
  import { AtlasParser } from './atlasParser';
2
- import { AssetsParser } from './parser';
2
+ import { AssetsParser } from './assetsParser';
3
3
  import { getLoadedBlockstatesStore, getLoadedModelsStore } from './stores';
4
4
  export default function worldBlockProvider(blockstatesModels, blocksAtlas, version) {
5
5
  const blockStatesStore = getLoadedBlockstatesStore(blockstatesModels);
@@ -10,15 +10,14 @@ export default function worldBlockProvider(blockstatesModels, blocksAtlas, versi
10
10
  getResolvedModel0_1(block, fallbackVariant = false) {
11
11
  const model = assetsParser.getResolvedModel(block, fallbackVariant);
12
12
  const interestedFaces = ['north', 'east', 'south', 'west', 'up', 'down'];
13
+ const { elements, textures, ...rest } = model;
13
14
  return {
14
15
  // todo validate elements
15
- elements: model.elements?.map((elem) => {
16
+ elements: elements?.map((elem) => {
16
17
  return {
17
- from: elem.from,
18
- to: elem.to,
18
+ ...elem,
19
19
  faces: Object.fromEntries(Object.entries(elem.faces).map(([faceName, face]) => {
20
- const texture = model.textures[face.texture.replace('#', '')];
21
- // TODO validate at the validation stage
20
+ const texture = face.texture;
22
21
  if (!texture)
23
22
  throw new Error(`Missing resolved texture ${texture} for face ${faceName} of ${block.name}`);
24
23
  const finalTexture = this.getTextureInfo(texture);
@@ -41,26 +40,24 @@ export default function worldBlockProvider(blockstatesModels, blocksAtlas, versi
41
40
  const su = (uv[2] - uv[0]) / COORDINATE_MAX * finalTexture.su;
42
41
  const sv = (uv[3] - uv[1]) / COORDINATE_MAX * finalTexture.sv;
43
42
  return [faceName, {
43
+ ...face,
44
44
  texture: {
45
- ...finalTexture,
46
45
  u: finalTexture.u + uv[0] / 16 * finalTexture.su,
47
46
  v: finalTexture.v + uv[1] / 16 * finalTexture.sv,
48
47
  su,
49
- sv
48
+ sv,
49
+ tileIndex: finalTexture.tileIndex,
50
+ debugName: texture,
50
51
  },
51
- cullface: face.cullface
52
52
  }];
53
53
  }))
54
54
  };
55
55
  }),
56
- ao: model.ao,
57
- x: model.x,
58
- y: model.y,
59
- z: model.z,
56
+ ...rest
60
57
  };
61
58
  },
62
59
  getTextureInfo(textureName) {
63
- return atlasParser.getTextureInfo(version, textureName.replace('block/', ''));
60
+ return atlasParser.getTextureInfo(textureName.replace('block/', ''), version);
64
61
  }
65
62
  };
66
63
  }
Binary file
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "mc-assets",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "author": "Vitaly Turovsky <vital2580@icloud.com>",
5
5
  "license": "MIT",
6
6
  "files": [
7
- "dist"
7
+ "dist",
8
+ "docs-assets"
8
9
  ],
9
10
  "main": "./dist/index.js",
10
11
  "types": "./dist/index.d.ts",
@@ -31,6 +32,9 @@
31
32
  "version": "0.1.0"
32
33
  }
33
34
  },
35
+ "engines": {
36
+ "node": ">=18.0.0"
37
+ },
34
38
  "keywords": [
35
39
  "minecraft",
36
40
  "assets",
@@ -47,13 +51,11 @@
47
51
  "minecraft extracter"
48
52
  ],
49
53
  "repository": "https://github.com/zardoy/mc-assets",
50
- "engines": {
51
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
52
- },
53
54
  "scripts": {
54
- "build": "tsx src/datapaths-builder.ts && tsx src/newAssetsBuilder.ts && tsx src/genItems.ts && tsx src/genParticles.ts && tsx src/genBlocks.ts && tsx src/copyOtherTextures.ts && tsx src/compressImages.ts && pnpm type-check && pnpm build-consumer && pnpm build-web && tsx src/buildEndChecks.ts",
55
+ "build": "tsx src/datapaths-builder.ts && tsx src/newAssetsBuilder.ts && tsx src/genItems.ts && tsx src/genParticles.ts && tsx src/genBlocks.ts && tsx src/copyOtherTextures.ts && tsx src/compressImages.ts && pnpm type-check && pnpm build-consumer && pnpm build-web && tsx src/buildEndChecks.ts && tsx src/changeReadme.ts",
55
56
  "type-check": "tsc --noEmit",
56
57
  "build-consumer": "tsc -p tsconfig.consumer.json",
58
+ "watch-dist": "tsc -p tsconfig.consumer.json -w",
57
59
  "build-web": "cd web-demo/ && pnpm build"
58
60
  }
59
61
  }
@@ -1,6 +0,0 @@
1
- export declare class ItemsProvider {
2
- version: string;
3
- itemsModelsLatest: Record<string, string>;
4
- constructor(version: string, itemsModelsLatest: Record<string, string>);
5
- getItemTexture(itemName: string): void;
6
- }
@@ -1,12 +0,0 @@
1
- // todo
2
- export class ItemsProvider {
3
- version;
4
- itemsModelsLatest;
5
- constructor(version, itemsModelsLatest) {
6
- this.version = version;
7
- this.itemsModelsLatest = itemsModelsLatest;
8
- }
9
- getItemTexture(itemName) {
10
- // return this.itemsAtlases[this.version][itemName]
11
- }
12
- }