630 lines
14 KiB
JavaScript
630 lines
14 KiB
JavaScript
|
||
const models = [
|
||
'android_station',
|
||
'battery_bank',
|
||
'black_hole',
|
||
['matter_scanner', 'matter_scanner_working'],
|
||
'pattern_storage',
|
||
['matter_replicator', 'matter_replicator_working'],
|
||
// 'matter_panel',
|
||
['matter_decomposer', 'matter_decomposer_working'],
|
||
];
|
||
|
||
const fs = require('fs')
|
||
const _root = './src/main/resources/assets/overdrive_that_matters/'
|
||
const root_data = './src/main/resources/data/overdrive_that_matters/'
|
||
const root = _root + 'models/block/'
|
||
|
||
const time = Date.now()
|
||
process.stdout.write('Regenerating data files\n')
|
||
|
||
// "модель" горизонта событий / черной дыры
|
||
{
|
||
const elements = []
|
||
|
||
// сфера
|
||
const layers = 32
|
||
const radius = 2
|
||
|
||
// создание
|
||
for (let y = -layers / 2; y < layers / 2; y++) {
|
||
for (let x = -layers / 2; x < layers / 2; x++) {
|
||
for (let z = -layers / 2; z < layers / 2; z++) {
|
||
const dist1 = Math.sqrt(x * x + y * y + z * z)
|
||
|
||
if (dist1 <= radius) {
|
||
elements.push({
|
||
"from": [4 + (x + layers / 2) / layers * 8, 4 + (y + layers / 2) / layers * 8, 4 + (z + layers / 2) / layers * 8],
|
||
"to": [4 + (x + layers / 2 + 1) / layers * 8, 4 + (y + layers / 2 + 1) / layers * 8, 4 + (z + layers / 2 + 1) / layers * 8],
|
||
"faces": {
|
||
"down": { "texture": "#black_hole" },
|
||
"up": { "texture": "#black_hole" },
|
||
"north": { "texture": "#black_hole" },
|
||
"south": { "texture": "#black_hole" },
|
||
"west": { "texture": "#black_hole" },
|
||
"east": { "texture": "#black_hole" }
|
||
}
|
||
})
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
fs.writeFileSync(root + 'black_hole.json', JSON.stringify({
|
||
"parent": "block/block",
|
||
"textures": {
|
||
"black_hole": "overdrive_that_matters:block/black_hole"
|
||
},
|
||
"elements": elements
|
||
}, null, '\t'))
|
||
}
|
||
|
||
const handle = fs.openSync('./src/main/java/ru/dbotthepony/mc/otm/shapes/BlockShapes.java', 'w')
|
||
|
||
fs.writeSync(handle, 'package ru.dbotthepony.mc.otm.shapes;\n\n\n')
|
||
fs.writeSync(handle, `// This file is regenerated on each gradle run. Do not edit it!\n`)
|
||
fs.writeSync(handle, 'public class BlockShapes {\n')
|
||
|
||
// модели блоков
|
||
for (const _model of models) {
|
||
let model, path
|
||
|
||
if (Array.isArray(_model)) {
|
||
model = _model[0]
|
||
path = _model[1]
|
||
} else {
|
||
model = _model
|
||
path = _model
|
||
}
|
||
|
||
fs.writeSync(handle, '\tpublic static final BlockShape ' + model.toUpperCase() + ' = new BlockShape(\n')
|
||
|
||
const obj = JSON.parse(fs.readFileSync(root + path + '.json', {encoding: 'utf-8'}))
|
||
let first = true
|
||
|
||
for (const elementID in obj.elements) {
|
||
const element = obj.elements[elementID]
|
||
|
||
if (element.rotation)
|
||
continue;
|
||
|
||
const from = element.from
|
||
const to = element.to
|
||
|
||
if (first) {
|
||
first = false
|
||
} else {
|
||
fs.writeSync(handle, ',\n')
|
||
}
|
||
|
||
fs.writeSync(handle, `\t\tnew SimpleCuboid(${from[0] / 16}d, ${from[1] / 16}d, ${from[2] / 16}d, ${to[0] / 16}d, ${to[1] / 16}d, ${to[2] / 16}d)`)
|
||
}
|
||
|
||
fs.writeSync(handle, '\n\t);\n\n')
|
||
}
|
||
|
||
fs.writeSync(handle, '}')
|
||
fs.closeSync(handle)
|
||
|
||
const facings = [
|
||
{facing: "north", y: 0},
|
||
{facing: "south", y: 180},
|
||
{facing: "west", y: 270},
|
||
{facing: "east", y: 90},
|
||
]
|
||
|
||
// генерируем 6 моделей паттернов
|
||
{
|
||
const pattern_storage_pattern = JSON.parse(fs.readFileSync(root + 'pattern/pattern_storage_pattern.json'))
|
||
|
||
const pattern_list = ['overdrive_that_matters:block/pattern/pattern_storage_pattern'];
|
||
|
||
for (let i = 0; i < 7; i++) {
|
||
pattern_storage_pattern.elements[0].from[0] -= 2
|
||
pattern_storage_pattern.elements[0].to[0] -= 2
|
||
|
||
fs.writeFileSync(root + 'pattern/pattern_storage_pattern' + i + '.json', JSON.stringify(pattern_storage_pattern, null, '\t'))
|
||
pattern_list.push('overdrive_that_matters:block/pattern/pattern_storage_pattern' + i)
|
||
}
|
||
|
||
const base_model = 'overdrive_that_matters:block/pattern_storage'
|
||
|
||
const blockstate = {
|
||
multipart: []
|
||
}
|
||
|
||
for (const face of facings) {
|
||
blockstate.multipart.push({
|
||
when: {
|
||
facing: face.facing
|
||
},
|
||
|
||
apply: {
|
||
model: base_model,
|
||
y: face.y ? face.y : undefined
|
||
}
|
||
});
|
||
}
|
||
|
||
for (let i = 0; i < 8; i++) {
|
||
for (const face of facings) {
|
||
blockstate.multipart.push({
|
||
when: {
|
||
facing: face.facing,
|
||
["disk_" + i]: true
|
||
},
|
||
|
||
apply: {
|
||
model: pattern_list[i],
|
||
y: face.y ? face.y : undefined
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
fs.writeFileSync(_root + 'blockstates/pattern_storage.json', JSON.stringify(blockstate, null, '\t'))
|
||
}
|
||
|
||
// Компоненты для крафта (как предмет)
|
||
{
|
||
const components = [
|
||
'tritanium_ingot',
|
||
'matter_io_port',
|
||
'matter_transform_matrix',
|
||
'energy_bus',
|
||
'electric_parts',
|
||
// 'machine_frame',
|
||
'tritanium_plate',
|
||
'iron_plate',
|
||
'copper_wiring',
|
||
'gold_wiring',
|
||
// 'portable_condensation_drive_casing',
|
||
// 'portable_dense_condensation_drive_casing',
|
||
'circuit_plating',
|
||
'basic_control_circuit',
|
||
'advanced_control_circuit',
|
||
]
|
||
|
||
for (const item of components) {
|
||
fs.writeFileSync(_root + 'models/item/' + item + '.json', JSON.stringify(
|
||
{
|
||
"parent": "item/generated",
|
||
"textures": {
|
||
"layer0": "overdrive_that_matters:item/component/" + item
|
||
}
|
||
}
|
||
, null, '\t'))
|
||
}
|
||
}
|
||
|
||
// Drive Viewer
|
||
{
|
||
const states = ['idle', 'working']
|
||
const machine = 'drive_viewer'
|
||
|
||
const blockstate = {
|
||
multipart: []
|
||
}
|
||
|
||
for (const face of facings) {
|
||
for (const state of states) {
|
||
blockstate.multipart.push({
|
||
when: {
|
||
facing: face.facing,
|
||
worker: state
|
||
},
|
||
|
||
apply: {
|
||
model: 'overdrive_that_matters:block/' + machine + '_' + state,
|
||
y: face.y ? face.y : undefined
|
||
}
|
||
});
|
||
}
|
||
|
||
blockstate.multipart.push({
|
||
when: {
|
||
facing: face.facing,
|
||
drive: true
|
||
},
|
||
|
||
apply: {
|
||
model: 'overdrive_that_matters:block/' + machine + '_drive_part',
|
||
y: face.y ? face.y : undefined
|
||
}
|
||
});
|
||
}
|
||
|
||
fs.writeFileSync(_root + 'blockstates/' + machine + '.json', JSON.stringify(blockstate, null, '\t'))
|
||
}
|
||
|
||
// Машины с WorkerState
|
||
{
|
||
const to_generate = ['matter_scanner', 'matter_replicator', 'matter_decomposer']
|
||
const to_generate_semi = ['matter_bottler']
|
||
const states = ['idle', 'working', 'error']
|
||
const states_semi = ['idle', 'working']
|
||
|
||
for (const machine of to_generate) {
|
||
const blockstate = {
|
||
multipart: []
|
||
}
|
||
|
||
for (const face of facings) {
|
||
for (const state of states) {
|
||
blockstate.multipart.push({
|
||
when: {
|
||
facing: face.facing,
|
||
worker: state
|
||
},
|
||
|
||
apply: {
|
||
model: 'overdrive_that_matters:block/' + machine + '_' + state,
|
||
y: face.y ? face.y : undefined
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
fs.writeFileSync(_root + 'blockstates/' + machine + '.json', JSON.stringify(blockstate, null, '\t'))
|
||
}
|
||
|
||
for (const machine of to_generate_semi) {
|
||
const blockstate = {
|
||
multipart: []
|
||
}
|
||
|
||
for (const face of facings) {
|
||
for (const state of states_semi) {
|
||
blockstate.multipart.push({
|
||
when: {
|
||
facing: face.facing,
|
||
worker: state
|
||
},
|
||
|
||
apply: {
|
||
model: 'overdrive_that_matters:block/' + machine + '_' + state,
|
||
y: face.y ? face.y : undefined
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
fs.writeFileSync(_root + 'blockstates/' + machine + '.json', JSON.stringify(blockstate, null, '\t'))
|
||
}
|
||
}
|
||
|
||
// просто дропы блоков
|
||
{
|
||
const blocks = [
|
||
'cargo_crate',
|
||
'matter_cable',
|
||
'tritanium_block',
|
||
'tritanium_striped_block',
|
||
'carbon_fibre_block',
|
||
|
||
'crate_red',
|
||
'crate_blue',
|
||
'crate_yellow',
|
||
'crate_green',
|
||
'crate_black',
|
||
'crate_pink',
|
||
'crate_purple',
|
||
|
||
'tritanium_raw_block',
|
||
]
|
||
|
||
for (const name of blocks) {
|
||
fs.writeFileSync(root_data + 'loot_tables/blocks/' + name + '.json', JSON.stringify({
|
||
"type": "minecraft:block",
|
||
"pools": [
|
||
{
|
||
"rolls": 1,
|
||
"bonus_rolls": 0,
|
||
"entries": [
|
||
{
|
||
"type": "minecraft:item",
|
||
"name": "overdrive_that_matters:" + name
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}, null, '\t'))
|
||
}
|
||
}
|
||
|
||
// Cargo Crate
|
||
{
|
||
const blockstate = {
|
||
variants: {}
|
||
}
|
||
|
||
for (const face of facings) {
|
||
for (const open of [true, false]) {
|
||
blockstate.variants['facing=' + face.facing + ',open=' + open] = {
|
||
model: 'overdrive_that_matters:block/cargo_crate_' + (open ? 'open' : 'closed'),
|
||
y: face.y
|
||
}
|
||
}
|
||
}
|
||
|
||
fs.writeFileSync(_root + 'blockstates/cargo_crate.json', JSON.stringify(blockstate, null, '\t'))
|
||
}
|
||
|
||
// Обычные блокстейты для ресурсов
|
||
{
|
||
const blocks = [
|
||
'tritanium_ore',
|
||
'tritanium_raw_block',
|
||
'deepslate_tritanium_ore',
|
||
]
|
||
|
||
for (const name of blocks) {
|
||
const blockstate = {
|
||
"variants": {
|
||
"": [
|
||
{
|
||
"model": "overdrive_that_matters:block/" + name,
|
||
"weight": 10
|
||
},
|
||
]
|
||
}
|
||
}
|
||
|
||
for (const x of [0, 90, 180]) {
|
||
for (const y of [0, 90, 180, 270]) {
|
||
blockstate.variants[''].push({
|
||
"model": "overdrive_that_matters:block/" + name,
|
||
"weight": 1,
|
||
"x": x,
|
||
"y": y
|
||
})
|
||
}
|
||
}
|
||
|
||
fs.writeFileSync(_root + 'blockstates/' + name + '.json', JSON.stringify(blockstate, null, '\t'))
|
||
|
||
fs.writeFileSync(_root + 'models/item/' + name + '.json', JSON.stringify({
|
||
"parent": "overdrive_that_matters:block/" + name
|
||
}, null, '\t'))
|
||
|
||
fs.writeFileSync(_root + 'models/block/' + name + '.json', JSON.stringify({
|
||
"parent": "block/cube_all",
|
||
"textures": {
|
||
"all": "overdrive_that_matters:block/resource/" + name
|
||
}
|
||
}, null, '\t'))
|
||
}
|
||
}
|
||
|
||
// Обычные блокстейты
|
||
{
|
||
const blocks = [
|
||
'tritanium_block',
|
||
'tritanium_striped_block',
|
||
'carbon_fibre_block',
|
||
|
||
'crate_red',
|
||
'crate_blue',
|
||
'crate_yellow',
|
||
'crate_green',
|
||
'crate_black',
|
||
'crate_pink',
|
||
'crate_purple',
|
||
|
||
'black_hole',
|
||
]
|
||
|
||
const blocks2 = [
|
||
'tritanium_block',
|
||
'carbon_fibre_block',
|
||
|
||
'crate_red',
|
||
'crate_blue',
|
||
'crate_yellow',
|
||
'crate_green',
|
||
'crate_black',
|
||
'crate_pink',
|
||
'crate_purple',
|
||
]
|
||
|
||
for (const name of blocks) {
|
||
fs.writeFileSync(_root + 'blockstates/' + name + '.json', JSON.stringify({
|
||
"variants": {
|
||
"": {
|
||
"model": "overdrive_that_matters:block/" + name
|
||
}
|
||
}
|
||
}, null, '\t'))
|
||
|
||
fs.writeFileSync(_root + 'models/item/' + name + '.json', JSON.stringify({
|
||
"parent": "overdrive_that_matters:block/" + name
|
||
}, null, '\t'))
|
||
}
|
||
|
||
for (const name of blocks2) {
|
||
fs.writeFileSync(_root + 'models/block/' + name + '.json', JSON.stringify({
|
||
"parent": "block/cube_all",
|
||
"textures": {
|
||
"all": "overdrive_that_matters:block/decorative/" + name
|
||
}
|
||
}, null, '\t'))
|
||
}
|
||
}
|
||
|
||
// дропы с машин
|
||
{
|
||
const drops = {
|
||
android_station: ['energy_cap', 'battery_container'],
|
||
battery_bank: ['battery_bank'],
|
||
matter_capacitor_bank: ['matter_container'],
|
||
|
||
drive_viewer: ['energy_cap', 'battery_container', 'drive_slot'],
|
||
matter_bottler: ['energy_cap', 'battery_container', 'work_slots', 'work_flow', 'matter_capability'],
|
||
|
||
matter_panel: ['tasks'],
|
||
pattern_storage: ['patterns'],
|
||
}
|
||
|
||
const drops_workers = {
|
||
matter_decomposer: ['work_slots', 'matter_capability'],
|
||
matter_replicator: ['regular_slots', 'reserved_slots', 'matter_capability'],
|
||
matter_scanner: ['work_slots'],
|
||
}
|
||
|
||
const combined = {}
|
||
|
||
for (const name in drops) {
|
||
combined[name] = drops[name]
|
||
}
|
||
|
||
for (const name in drops_workers) {
|
||
drops_workers[name].push('work_ticks', 'current_job', 'energy_cap', 'battery_container')
|
||
combined[name] = drops_workers[name]
|
||
}
|
||
|
||
for (const name in combined) {
|
||
const values = combined[name]
|
||
|
||
const state = {
|
||
type: 'minecraft:block',
|
||
pools: [
|
||
{
|
||
rolls: 1,
|
||
bonus_rolls: 0,
|
||
entries: [
|
||
{
|
||
type: 'minecraft:item',
|
||
name: "overdrive_that_matters:" + name,
|
||
functions: [
|
||
{
|
||
"function": "minecraft:copy_name",
|
||
"source": "block_entity"
|
||
},
|
||
|
||
{
|
||
"function": "minecraft:copy_nbt",
|
||
"source": "block_entity",
|
||
"ops": [
|
||
{
|
||
"source": "Name",
|
||
"target": "BlockEntityTag.Name",
|
||
"op": "replace"
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
|
||
for (const type of values) {
|
||
state.pools[0].entries[0].functions[1].ops.push({
|
||
"source": type,
|
||
"target": "BlockEntityTag." + type,
|
||
"op": "replace"
|
||
})
|
||
}
|
||
|
||
fs.writeFileSync(root_data + 'loot_tables/blocks/' + name + '.json', JSON.stringify(state, null, '\t'))
|
||
}
|
||
}
|
||
|
||
// генерация моделей для battery bank и matter capacitor bank
|
||
{
|
||
let back = JSON.parse(fs.readFileSync(root + 'battery/battery_back.json'))
|
||
let front = JSON.parse(fs.readFileSync(root + 'battery/battery_front.json'))
|
||
const stepx = 12 / 3
|
||
const stepy = 6
|
||
|
||
const battery_list = ['overdrive_that_matters:block/battery/battery_front'];
|
||
const matter_list = [];
|
||
|
||
for (let i = 0; i < 5; i++) {
|
||
if (i == 2) {
|
||
front = JSON.parse(fs.readFileSync(root + 'battery/battery_front.json'))
|
||
front.elements[0].from[1] += stepy
|
||
front.elements[0].to[1] += stepy
|
||
} else {
|
||
front.elements[0].from[0] -= stepx
|
||
front.elements[0].to[0] -= stepx
|
||
}
|
||
|
||
fs.writeFileSync(root + 'battery/battery_front' + i + '.json', JSON.stringify(front, null, '\t'))
|
||
battery_list.push('overdrive_that_matters:block/battery/battery_front' + i)
|
||
}
|
||
|
||
battery_list.push('overdrive_that_matters:block/battery/battery_back')
|
||
|
||
for (let i = 0; i < 5; i++) {
|
||
if (i == 2) {
|
||
back = JSON.parse(fs.readFileSync(root + 'battery/battery_back.json'))
|
||
back.elements[0].from[1] += stepy
|
||
back.elements[0].to[1] += stepy
|
||
} else {
|
||
back.elements[0].from[0] += stepx
|
||
back.elements[0].to[0] += stepx
|
||
}
|
||
|
||
fs.writeFileSync(root + 'battery/battery_back' + i + '.json', JSON.stringify(back, null, '\t'))
|
||
battery_list.push('overdrive_that_matters:block/battery/battery_back' + i)
|
||
}
|
||
|
||
for (let i = 0; i < battery_list.length; i++) {
|
||
fs.writeFileSync(root + 'battery/matter_capacitor' + i + '.json', JSON.stringify({
|
||
parent: battery_list[i],
|
||
textures: {
|
||
"1": "overdrive_that_matters:block/matterybank_core"
|
||
}
|
||
}, null, '\t'))
|
||
|
||
matter_list.push('overdrive_that_matters:block/battery/matter_capacitor' + i)
|
||
}
|
||
|
||
const list = [
|
||
['overdrive_that_matters:block/battery_bank', battery_list, 'blockstates/battery_bank.json'],
|
||
['overdrive_that_matters:block/matter_capacitor_bank', matter_list, 'blockstates/matter_capacitor_bank.json'],
|
||
]
|
||
|
||
for (const [base_model, models, path] of list) {
|
||
|
||
const blockstate = {
|
||
multipart: []
|
||
}
|
||
|
||
for (const face of facings) {
|
||
blockstate.multipart.push({
|
||
when: {
|
||
facing: face.facing
|
||
},
|
||
|
||
apply: {
|
||
model: base_model,
|
||
y: face.y ? face.y : undefined
|
||
}
|
||
});
|
||
}
|
||
|
||
for (let i = 0; i < 12; i++) {
|
||
for (const face of facings) {
|
||
blockstate.multipart.push({
|
||
when: {
|
||
facing: face.facing,
|
||
["battery_" + i]: true
|
||
},
|
||
|
||
apply: {
|
||
model: models[i],
|
||
y: face.y ? face.y : undefined
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
fs.writeFileSync(_root + path, JSON.stringify(blockstate, null, '\t'))
|
||
}
|
||
}
|
||
|
||
process.stdout.write(`Regenerated data files in ${Date.now() - time}ms\n`)
|