// NodeJS Javascript
// Assumes Custom Registered blocks (Modded only currently)
// Assumes template files are already made beforehand
// Modifying variable for custom ModID, Manditory (Your namespace)
// Modifying variable for base folder (temp storage for files) recomended
// Modifying variables for custom template files, Manditory if you plan to use template json that aren't standard
// Number of textures used, is limited to one for built in templates.
// Custom locations can be used with built in templates. Suggest to keep orginization the same throughout your mod.
// Follows MC naming scheme. type_material_block_blockSubtype ( example oak_plank_stairs_outter )
// Will take on _fence & _fence_gate to provided variant_material provided.
// Fixed typo rendering 2nd texture useless
var fs = require('fs');
const { resolve } = require('path');
const path = require('path');
// setup to use MC naming convention of using _ as the spaces
var baseDrive = 'G:/';
var baseFolder = baseDrive+'MC_JSONS';
var customModID = 'delbase';
var baseModID = 'minecraft';
var textureModID;
var textureUseCount;
// Folder structure
var blockState = '/assets/blockstates';
var models = '/assets/models';
var baseModelFiles = 'block';
var customModelFiles = baseModelFiles+'/fence';
var itemModelFiles = models+'/items';
var lootTableFiles = '/loot_tables/blocks';
var useCustomTemplate = false;
var useCustomModelFolders = false;
// Hard coded Normal Minecraft
// Useful for single textured fences
var templateFencePost = 'block/fence_post';
var templateFenceSide = 'block/fence_side';
var templateFenceGate = 'block/template_fence_gate';
var templateFenceGateOpen = 'block/template_fence_gate_open';
var templateFenceGateWall = 'block/template_fence_gate_wall';
var templateFenceGateWallOpen = 'block/template_fence_gate_wall_open';
var templateFenceInventory = 'block/fence_inventory';
// Custom Templates. Set before use.
// useful for log like textures (with a side/top)
var customFencePost = 'block/template/fence_post';
var customFenceSide = 'block/template/fence_side';
var customFenceGate = 'block/template/fence_gate';
var customFenceGateOpen = 'block/template/fence_gate_open';
var customFenceGateWall = 'block/template/fence_gate_wall';
var customFenceGateWallOpen = 'block/template/fence_gate_wall_open';
var customFenceInventory = 'block/template/fence_inventory';
// Texture tags in use. Base is the Minecraft one.
var baseTextureTag = 'texture';
// Add variables as needed for templates, name as needed
var customTextureUpDownTag = baseTextureTag;
var customTextureSideTag = 'postside';
// One used for the base Texture Tag & available for custom
// assigned in code
var textureOne;
var textureTwo;
//misc texturnames
var colorName;
var typeName;
var blockName;
const myArgs = process.argv.slice(2);
keystart(myArgs);
/*
[0] 1. color / Variant name (text)
[1] 2. Material type (sand, terracotta, etc) (text)
[2] 3. Built in template or custom template ( 0 -base / 1 -custom)
[3] 4. normal model file location or custom ( 0 -normal / 1 -custom)
[4] 5. number of textures for the file
[5] 6. modID for texture (0 -Minecraft built in/ 1- Custom modID
[6] 7. Texture 1 Name || /block is included in the first texture assuming it's under the block folder
[7] 8. Texture 2 Name [if used]
// 0 color/variant name, 1 material type, 2 base/custom templates (base/custom == 0 / 1)
// 3 base/custom model file location (base/custom), 4 number of textures used per file, 5 texture modID, custom or built in Minecraft ( base/custom == 0/1 )
// 6 texture one name (up/down), 7+ add as many texture used per one,
// comes setup for 2 textures per block, must adjust for 3+
*/
async function setVariables(Args) {
colorName = Args[0];
typeName = Args[1];
blockName = colorName;
if (typeName != 0) { blockName = blockName + '_' + typeName; }
if (Args[2] == 0 || Args[2] == 1) {
if (Args[2] == 0) { useCustomTemplate = false; } else { useCustomTemplate = true; }
} else {
errorout('wrong selection of custom or built in templates for model files.')
}
if (Args[3] == 0 || Args[3] == 1) {
if (Args[3] == 0) { useCustomModelFolders = false; } else { useCustomModelFolders = true; }
} else {
errorout('Invalid selection of custom or built in(For Minecraft) folder structure')
}
textureUseCount = Args[4];
if (textureUseCount < 1) { errorout('number of textures claimed less than 1') }
if (Args[5] == 0 || Args[5] == 1){
if (Args[5] == 1) { textureModID = customModID } else { textureModID = baseModID }
} else { errorout('missing/invalid selection for texture modID') }
if (Args[6] != null){ textureOne = Args[6]; } else { errorout('no valid texture given') }
if (Args[7] != null){
if (textureUseCount > 1) { textureTwo = Args[7] }
}
}
function errorout(extmsg) {
console.log(extmsg);
process.exit();
}
function fileOut(fileOut, message, newfile) {
if (newfile) { fs.openSync(fileOut, 'w'); }
fs.appendFileSync(fileOut, message+'\n');
}
function keystart(argums){
setVariables(argums).then(blockStates(useCustomModelFolders)).then(fenceModels(useCustomTemplate, useCustomModelFolders)).then(lootTable());
}
function blockStates(useCustomtmpath) {
let blockPath;
let foldPath = path.join(baseFolder, blockState)
fs.mkdirSync(foldPath, { recursive: true });
if (useCustomtmpath) { blockPath = customModelFiles; } else { blockPath = baseModelFiles; }
bsFence(path.join(foldPath, blockName+'_fence.json'), blockPath)
bsFenceGate(path.join(foldPath, blockName+'_fence_gate.json'), blockPath)
}
function bsFence(fileLocation, filePath) {
let post = filePath+'/'+blockName+'_fence_post';
let side = filePath+'/'+blockName+'_fence_side';
let uvlock = '\"uvlock\": true';
fileOut(fileLocation, '{', true);
fileOut(fileLocation, '\"multipart\": [', false);
fileOut(fileLocation, '{', false);
fileOut(fileLocation, '\"apply\": {', false);
fileOut(fileLocation, '\"model\": \"'+customModID+':'+post+'\"', false);
fileOut(fileLocation, '}', false);
fileOut(fileLocation, '},', false);
bsFenceAid(fileLocation, customModID, side, 'north', uvlock, 0, false);
bsFenceAid(fileLocation, customModID, side, 'east', uvlock, 90, false);
bsFenceAid(fileLocation, customModID, side, 'south', uvlock, 180, false);
bsFenceAid(fileLocation, customModID, side, 'west', uvlock, 270, true);
fileOut(fileLocation, ']', false);
fileOut(fileLocation, '}', false);
}
function bsFenceAid(fLocation, modID, model, direct, uv, y, last) {
let bracket;
if(last) { bracket = '}' } else { bracket = '},' }
fileOut(fLocation, '{', false);
fileOut(fLocation, '\"when\": {', false);
fileOut(fLocation, '\"'+direct+'\": \"true\"', false);
fileOut(fLocation, '},', false);
fileOut(fLocation, '\"apply\": {', false);
fileOut(fLocation, '\"model\": \"'+modID+':'+model+'\",', false);
if(y != 0) { fileOut(fLocation, '\"y\": '+y+',', false); }
fileOut(fLocation, uv, false);
fileOut(fLocation, '}', false);
fileOut(fLocation, bracket, false);
}
function bsFenceGate(fileLocation, filePath) {
let gate = filePath+'/'+blockName+'_fence_gate';
let gateOpen = gate+'_open';
let gateWall = gate+'_wall';
let gateWallOpen = gateWall+'_open';
let fEast = 'facing=east';
let fWest = 'facing=west';
let fNorth = 'facing=north';
let fSouth = 'facing=south';
let iWall = 'in_wall=true';
let oWall = 'in_wall=false';
let wOpen = 'open=true';
let wClose = 'open=false';
let uvlock = '\"uvlock\": true,';
fileOut(fileLocation, '{', true);
fileOut(fileLocation, '\"variants\": {', false);
fileOut(fileLocation, '\"'+fEast+','+oWall+','+wClose+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gate, uvlock, 270, false);
fileOut(fileLocation, '\"'+fEast+','+oWall+','+wOpen+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateOpen, uvlock, 270, false);
fileOut(fileLocation, '\"'+fEast+','+iWall+','+wClose+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateWall, uvlock, 270, false);
fileOut(fileLocation, '\"'+fEast+','+iWall+','+wOpen+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateWallOpen, uvlock, 270, false);
fileOut(fileLocation, '\"'+fNorth+','+oWall+','+wClose+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gate, uvlock, 180, false);
fileOut(fileLocation, '\"'+fNorth+','+oWall+','+wOpen+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateOpen, uvlock, 180, false);
fileOut(fileLocation, '\"'+fNorth+','+iWall+','+wClose+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateWall, uvlock, 180, false);
fileOut(fileLocation, '\"'+fNorth+','+iWall+','+wOpen+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateWallOpen, uvlock, 180, false);
fileOut(fileLocation, '\"'+fSouth+','+oWall+','+wClose+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gate, uvlock, 0, false);
fileOut(fileLocation, '\"'+fSouth+','+oWall+','+wOpen+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateOpen, uvlock, 0, false);
fileOut(fileLocation, '\"'+fSouth+','+iWall+','+wClose+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateWall, uvlock, 0, false);
fileOut(fileLocation, '\"'+fSouth+','+iWall+','+wOpen+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateWallOpen, uvlock, 0, false);
fileOut(fileLocation, '\"'+fWest+','+oWall+','+wClose+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gate, uvlock, 90, false);
fileOut(fileLocation, '\"'+fWest+','+oWall+','+wOpen+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateOpen, uvlock, 90, false);
fileOut(fileLocation, '\"'+fWest+','+iWall+','+wClose+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateWall, uvlock, 90, false);
fileOut(fileLocation, '\"'+fWest+','+iWall+','+wOpen+'\": {', false);
bsFenceGateAid(fileLocation, customModID, gateWallOpen, uvlock, 90, true);
fileOut(fileLocation, '}', false);
fileOut(fileLocation, '}', false);
}
function bsFenceGateAid(fLocation, modID, model, uv, y, last) {
let bracket;
if (last) { bracket = '}' } else { bracket = '},' }
fileOut(fLocation, uv, false);
if (y != 0) { fileOut(fLocation, '\"y\": '+y+',', false); }
fileOut(fLocation, '\"model\": \"'+modID+':'+model+'\"', false);
fileOut(fLocation, bracket, false);
}
function fenceModels(customTemplateLocation, customModelLocation){
let fold;
if (customModelLocation) { fold = path.join(baseFolder, models, customModelFiles) } else { fold = path.join(baseFolder, models, baseModelFiles) }
fs.mkdirSync(fold, { recursive: true });
let iFold = path.join(baseFolder, itemModelFiles);
fs.mkdirSync(iFold, { recursive: true });
fmFencePost(fold, customTemplateLocation);
fmFenceSide(fold, customTemplateLocation);
fmFenceInventory(fold, customTemplateLocation);
fmFenceGate(fold, customTemplateLocation);
fmFenceGateOpen(fold, customTemplateLocation);
fmFenceGateWall(fold, customTemplateLocation);
fmFenceGateWallOpen(fold, customTemplateLocation);
fmFenceItems(iFold, customModelLocation);
}
function fmFencePost(folder, iscustomtemplate){
let template;
let templatemod;
let json = path.join(folder, blockName+'_fence_post.json')
if (iscustomtemplate) {
template = customFencePost;
templatemod = customModID;
} else {
template = templateFencePost;
templatemod = baseModID;
}
fileOut(json, '{', true);
fileOut(json, '\"parent\": \"'+templatemod+':'+template+'\",');
fmFenceAid(textureUseCount, iscustomtemplate, json, textureModID);
}
function fmFenceSide(folder, iscustomtemplate) {
let template;
let templatemod;
let json = path.join(folder, blockName+'_fence_side.json')
if (iscustomtemplate) {
template = customFenceSide;
templatemod = customModID;
} else {
template = templateFenceSide;
templatemod = baseModID;
}
fileOut(json, '{', true);
fileOut(json, '\"parent\": \"'+templatemod+':'+template+'\",');
fmFenceAid(1, iscustomtemplate, json, textureModID);
}
function fmFenceInventory(folder, iscustomtemplate) {
let template;
let templatemod;
let json = path.join(folder, blockName+'_fence_inventory.json')
if (iscustomtemplate) {
template = customFenceInventory;
templatemod = customModID;
} else {
template = templateFenceInventory;
templatemod = baseModID;
}
fileOut(json, '{', true);
fileOut(json, '\"parent\": \"'+templatemod+':'+template+'\",');
fmFenceAid(textureUseCount, iscustomtemplate, json, textureModID);
}
function fmFenceGate(folder, iscustomtemplate) {
let template;
let templatemod;
let json = path.join(folder, blockName+'_fence_gate.json')
if (iscustomtemplate) {
template = customFenceGate;
templatemod =customModID;
} else {
template = templateFenceGate;
templatemod = baseModID;
}
fileOut(json, '{', true);
fileOut(json, '\"parent\": \"'+templatemod+':'+template+'\",');
fmFenceAid(textureUseCount, iscustomtemplate, json, textureModID);
}
function fmFenceGateOpen(folder, iscustomtemplate) {
let template;
let templatemod;
let json = path.join(folder, blockName+'_fence_gate_open.json')
if (iscustomtemplate) {
template = customFenceGateOpen;
templatemod = customModID;
} else {
template = templateFenceGateOpen;
templatemod = baseModID;
}
fileOut(json, '{', true);
fileOut(json, '\"parent\": \"'+templatemod+':'+template+'\",');
fmFenceAid(textureUseCount, iscustomtemplate, json, textureModID);
}
function fmFenceGateWall(folder, iscustomtemplate) {
let template;
let templatemod;
let json = path.join(folder, blockName+'_fence_gate_wall.json')
if (iscustomtemplate) {
template = customFenceGateWall;
templatemod =customModID;
} else {
template = templateFenceGateWall;
templatemod = baseModID;
}
fileOut(json, '{', true);
fileOut(json, '\"parent\": \"'+templatemod+':'+template+'\",');
fmFenceAid(textureUseCount, iscustomtemplate, json, textureModID);
}
function fmFenceGateWallOpen(folder, iscustomtemplate) {
let template;
let templatemod;
let json = path.join(folder, blockName+'_fence_gate_wall_open.json')
if (iscustomtemplate) {
template = customFenceGateWallOpen;
templatemod = customModID;
} else {
template = templateFenceGateWallOpen;
templatemod = baseModID;
}
fileOut(json, '{', true);
fileOut(json, '\"parent\": \"'+templatemod+':'+template+'\",');
fmFenceAid(textureUseCount, iscustomtemplate, json, textureModID);
}
function fmFenceItems(folder, iscustomLocation) {
let modelLocation;
if (iscustomLocation) { modelLocation = customModelFiles } else { modelLocation = baseModelFiles }
fmFenceItemAid(path.join(folder, blockName+'_fence.json'), modelLocation, 'fence_inventory');
fmFenceItemAid(path.join(folder, blockName+'_fence_gate.json'), modelLocation, 'fence_gate');
}
function fmFenceItemAid(file, modelLocation, type) {
fileOut(file, '{', true);
fileOut(file, '\"parent\": \"'+customModID+':'+modelLocation+'/'+blockName+'_'+type+'\"', false);
fileOut(file, '}', false);
}
function fmFenceAid(texturecount, isCustom, file, mod) {
fileOut(file, '\"textures\": {', false)
if (isCustom) {
if (texturecount > 1) {
fileOut(file, '\"'+customTextureUpDownTag+'\": \"'+mod+':'+'block/'+textureOne+'\",', false)
fileOut(file, '\"'+customTextureSideTag+'\": \"'+mod+':'+'block/'+textureTwo+'\"', false)
} else {
fileOut(file, '\"'+customTextureUpDownTag+'\": \"'+mod+':'+'block/'+textureOne+'\"', false)
}
} else {
fileOut(file, '\"'+baseTextureTag+'\": \"'+mod+':'+'block/'+textureOne+'\"', false)
}
fileOut(file, '}\n}', false)
}
function lootTable(){
let fold = path.join(baseFolder, lootTableFiles);
fs.mkdirSync(fold, { recursive: true })
ltFenceAid(path.join(fold, blockName+'_fence.json'), blockName+'_fence');
ltFenceAid(path.join(fold, blockName+'_fence_gate.json'), blockName+'_fence_gate');
}
function ltFenceAid(file, block) {
fileOut(file, '{', true);
fileOut(file, '\"type\": \"minecraft:block\",', false);
fileOut(file, '\"pools\": [', false);
fileOut(file, '{', false);
fileOut(file, '\"rolls\": 1.0,', false);
fileOut(file, '\"bonus_rolls\": 0.0,', false);
fileOut(file, '\"entries\": [', false);
fileOut(file, '{', false);
fileOut(file, '\"type\": \"minecraft:item\",', false);
fileOut(file, '\"name\": \"'+customModID+':'+block+'\"', false);
fileOut(file, '}', false);
fileOut(file, '],', false);
fileOut(file, '\"conditions\": [', false);
fileOut(file, '{', false);
fileOut(file, '\"condition\": \"minecraft:survives_explosion\"', false);
fileOut(file, '}\n]\n\}\n]\n}', false);
}
Comments
0 B
|👍
/👎