-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathextract_lootTables.js
102 lines (81 loc) · 2.97 KB
/
extract_lootTables.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
'use strict'
const fs = require('fs')
const path = require('path')
const getPotentialDrops = require('prismarine-loottable').getPotentialDrops
const deepEqual = require('deep-equal')
function removeNamespace (name) {
if (name.startsWith('minecraft:')) name = name.substring(10)
return name
}
function extractBlockTable (lootData, lootTable, name) {
const obj = {}
obj.block = removeNamespace(name)
extractTable(obj, lootTable)
lootData.push(obj)
}
function extractEntityTable (lootData, lootTable, name) {
const obj = {}
obj.entity = removeNamespace(name)
extractTable(obj, lootTable)
lootData.push(obj)
}
function removeDuplicates (list) {
for (let i = 0; i < list.length; i++) {
for (let j = i + 1; j < list.length; j++) {
if (deepEqual(list[i], list[j])) {
list.splice(j, 1)
removeDuplicates(list)
return
}
}
}
}
function extractTable (obj, lootTable) {
const drops = getPotentialDrops(lootTable)
obj.drops = []
for (const drop of drops) {
const dropInfo = {}
obj.drops.push(dropInfo)
dropInfo.item = removeNamespace(drop.itemType)
dropInfo.dropChance = drop.estimateDropChance()
dropInfo.stackSizeRange = drop.getStackSizeRange()
if (obj.block !== undefined) {
dropInfo.silkTouch = drop.requiresSilkTouch() || undefined
dropInfo.noSilkTouch = drop.requiresNoSilkTouch() || undefined
dropInfo.blockAge = drop.getRequiredBlockAge() || undefined
} else {
dropInfo.playerKill = drop.requiresPlayerKill() || undefined
}
}
removeDuplicates(obj.drops)
}
function generate (inputDir, outputFile, handlerFunction) {
const lootData = []
const lootFiles = fs.readdirSync(inputDir)
for (const loot of lootFiles) {
const fullPath = path.join(inputDir, loot)
if (fs.statSync(fullPath).isDirectory()) continue
const name = loot.substring(0, loot.length - 5)
handlerFunction(lootData, require(fullPath), name)
}
fs.writeFileSync(outputFile, JSON.stringify(lootData, null, 2))
return lootFiles.length
}
function handle (dataFolder, mcDataFolder, version) {
dataFolder += '/' + version
const raw = path.resolve(dataFolder + '/data/loot_tables')
const dataPath = path.resolve(mcDataFolder + '/data/pc/' + version)
fs.mkdirSync(dataPath, { recursive: true })
let entryCount = 0
entryCount += generate(path.join(raw, 'blocks'), path.join(dataPath, 'blockLoot.json'), extractBlockTable)
entryCount += generate(path.join(raw, 'entities'), path.join(dataPath, 'entityLoot.json'), extractEntityTable)
console.log(`Version ${version} finished. (${entryCount} entries processed)`)
}
if (process.argv.length !== 5) {
console.log('Usage: node extract_lootTables.js <version1,version2,...> <extractedDataFolder> <mcDataFolder>')
process.exit(1)
}
const versions = process.argv[2].split(',')
const dataFolder = path.resolve(process.argv[3])
const mcDataFolder = path.resolve(process.argv[4])
for (const version of versions) handle(dataFolder, mcDataFolder, version)