-
Notifications
You must be signed in to change notification settings - Fork 0
/
script.js
168 lines (142 loc) · 6.44 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import { fileMappings } from './mappings.js';
document.getElementById('fileInput').addEventListener('change', function () {
const outputDiv = document.getElementById('output');
const fileInput = document.getElementById('fileInput');
if (fileInput.files.length > 0) {
const fileName = fileInput.files[0].name;
outputDiv.textContent = `Selected file: ${fileName}`;
console.log(`File selected: ${fileName}`);
}
});
async function convertPack() {
const fileInput = document.getElementById('fileInput');
const outputDiv = document.getElementById('output');
if (fileInput.files.length === 0) {
outputDiv.textContent = "Please upload a Java Texture Pack first.";
console.log("No file uploaded.");
return;
}
const file = fileInput.files[0];
if (!file.name.endsWith('.zip')) {
outputDiv.textContent = "Invalid file format. Please upload a .zip file.";
console.log("Invalid file format: " + file.name);
return;
}
const zip = new JSZip();
const startTime = performance.now();
try {
const contents = await zip.loadAsync(file);
updateOutput("ZIP file loaded successfully.");
console.log("ZIP file loaded successfully.");
const bedrockZip = new JSZip();
let manifestDescription = "";
let foundAssets = false;
for (let fileName in contents.files) {
if (fileName.includes("assets/minecraft/textures/")) {
foundAssets = true;
break;
}
}
if (!foundAssets) {
outputDiv.textContent = "The assets/minecraft/textures folder was not found in the ZIP.";
console.log("assets/minecraft/textures folder not found.");
return;
}
for (let fileName in contents.files) {
const file = contents.files[fileName];
if (!file.dir) {
if (fileName.includes("assets/minecraft/textures/entity/") ||
fileName.includes("assets/minecraft/textures/gui/") ||
fileName.includes("assets/minecraft/textures/font/")) {
continue;
}
if (fileName.endsWith("pack.png")) {
const data = await file.async("blob");
bedrockZip.file("pack_icon.png", data);
console.log("pack.png file added as pack_icon.png");
} else if (fileName.endsWith("pack.mcmeta")) {
const mcmetaContent = await file.async("text");
const mcmeta = JSON.parse(mcmetaContent);
manifestDescription = mcmeta.pack.description;
console.log("pack.mcmeta file found and description updated.");
} else if (fileName.includes("assets/minecraft/textures/")) {
let newFileName = fileName.replace(/.*assets\/minecraft\/textures\//, "textures/");
// Handle block, item, and entity path changes
newFileName = newFileName.replace("/block/", "/blocks/").replace("/item/", "/items/").replace("/entity/", "/entity/");
// Handle specific file name changes using mappings from mappings.js
for (const [javaName, bedrockName] of Object.entries(fileMappings)) {
if (newFileName.includes(javaName)) {
newFileName = newFileName.replace(javaName, bedrockName);
break;
}
}
const data = await file.async("blob");
bedrockZip.file(newFileName, data);
console.log(`File converted: ${fileName} -> ${newFileName}`);
}
}
}
// Process entity folder separately
for (let fileName in contents.files) {
if (fileName.includes("assets/minecraft/textures/entity/")) {
let newFileName = fileName.replace(/.*assets\/minecraft\/textures\/entity\//, "textures/entity/");
for (const [javaName, bedrockName] of Object.entries(fileMappings)) {
if (newFileName.includes(javaName)) {
newFileName = newFileName.replace(javaName, bedrockName);
break;
}
}
const data = await contents.files[fileName].async("blob");
bedrockZip.file(newFileName, data);
console.log(`Entity File converted: ${fileName} -> ${newFileName}`);
}
}
const packName = file.name.replace('.zip', '');
const fullDescription = `${manifestDescription}\nPorted by Pepe's Pack Porter.`;
const manifest = generateManifest(packName, fullDescription);
bedrockZip.file("manifest.json", JSON.stringify(manifest, null, 4));
console.log("manifest.json file created.");
const blob = await bedrockZip.generateAsync({ type: "blob" });
const endTime = performance.now();
const duration = ((endTime - startTime) / 1000).toFixed(2);
const newFileName = file.name.replace('.zip', ' [Converted].zip');
saveAs(blob, newFileName);
updateOutput(`Conversion complete! Your download should start shortly. Time taken: ${duration} seconds.`);
console.log(`Conversion complete! Time taken: ${duration} seconds.`);
} catch (error) {
updateOutput("Error loading ZIP file: " + error);
console.error("Error loading ZIP file: " + error);
}
}
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
const r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
function generateManifest(name, description) {
return {
"format_version": 2,
"header": {
"name": name,
"description": description,
"uuid": generateUUID(),
"version": [1, 0, 0],
"min_engine_version": [1, 20, 0]
},
"modules": [
{
"type": "resources",
"uuid": generateUUID(),
"version": [1, 0, 0]
}
]
};
}
function updateOutput(message) {
const outputDiv = document.getElementById('output');
const p = document.createElement('p');
p.textContent = message;
outputDiv.appendChild(p);
console.log(message);
}