-
Notifications
You must be signed in to change notification settings - Fork 0
Full example
JoniCraftHD edited this page Jul 31, 2026
·
3 revisions
const BulkBuilder = Java.loadClass('com.joni.kjs_bc.BulkBuilderLogic') //required
const JsonAssetGenerator = Java.loadClass('com.joni.kjs_bc.JsonAssetGenerator') // required
// 1. Adding Presets
BulkBuilder.create_preset('RAW_ITEM') //doesnt have to be uppercase
.presetType('item')
.texture('kubejs:item/raw_overlay')
.namePrefix('Raw ')
.idSuffix('_raw')
.tagBoth('c:raw_materials')
.build();
BulkBuilder.create_preset('ORE_BLOCK')
.presetType('block')
.texture('minecraft:block/stone')
.overlay('kubejs:block/ore_overlay')
.nameSuffix(' Ore')
.idSuffix('_ore')
.dropsPreset('RAW_ITEM')
.soundType('stone')
.hardness(4.0)
.requiresTool(true)
.tagBlock('minecraft:mineable/pickaxe')
.tagBlock('minecraft:needs_iron_tool')
.tagBoth('c:ores')
.build();
// 2. Bulk Creation definition
BulkBuilder.bulkCreate('sapphire')
.displayName('Sapphire')
.tooltip(Text.gray('Al₂O₃ ').append(Text.green(' Tier 5 Gem')))
.presets('RAW_ITEM', 'ORE_BLOCK') //what presets you want to generate
.tintOverlay('#667DEA')
.build();
// 3. Asset Generation
JsonAssetGenerator.generateAssetsForCreations(); // required to the textures to generate
// 4. Registry Item
//only required once !
//important Items HAVE to be registered first if .dropPreset is used !!!
StartupEvents.registry('item', event => {
BulkBuilder.getCreations().forEach(creation => {
creation.presetIds().forEach(presetId => {
let preset = BulkBuilder.getPresets().get(presetId);
if (preset && preset.type() === 'item') {
let itemId = `${creation.id()}${preset.idSuffix()}`;
let finalName = `${preset.namePrefix()}${creation.displayName()}${preset.nameSuffix()}`;
let item = event.create(itemId)
.displayName(finalName)
.color(0, creation.tintColor()) // item registry requires colour 0
.maxStackSize(preset.maxStackSize())
.rarity(preset.rarity());
if (preset.baseTexture()) item.texture(preset.baseTexture());
if (creation.tooltip()) {
item.tooltip(creation.tooltip());
}
preset.itemTags().forEach(tag => item.tag(tag));
preset.bothTags().forEach(tag => item.tag(tag));
}
});
});
});
// Block registry
StartupEvents.registry('block', event => {
BulkBuilder.getCreations().forEach(creation => {
creation.presetIds().forEach(presetId => {
let preset = BulkBuilder.getPresets().get(presetId);
if (preset && preset.type() === 'block') {
let currentBlockId = `${creation.id()}${preset.idSuffix()}`;
let finalName = `${preset.namePrefix()}${creation.displayName()}${preset.nameSuffix()}`;
let block = preset.hasGravity()
? event.create(currentBlockId, 'falling')
: event.create(currentBlockId);
block.displayName(finalName)
.soundType(preset.soundType())
.hardness(preset.hardness())
.resistance(preset.resistance())
.lightLevel(preset.lightLevel())
.opaque(preset.opaque())
.fullBlock(preset.fullBlock())
.requiresTool(preset.requiresTool())
.renderType("cutout")
.color(1, creation.tintColor());
preset.blockTags().forEach(tag => block.tagBlock(tag));
preset.bothTags().forEach(tag => block.tagBlock(tag));
if (preset.noItem()) {
block.noItem();
} else {
block.item(itemBuilder => {
itemBuilder.color(1, creation.tintColor()); //needs colour 1
itemBuilder.rarity(preset.rarity());
preset.bothTags().forEach(tag => itemBuilder.tag(tag));
});
}
}
});
});
});-notice, this server script is only needed ONCE just once for all creations, so you dont need to write this multiple times !
const BulkBuilder = Java.loadClass('com.joni.kjs_bc.BulkBuilderLogic')
LootJS.modifiers(event => {
BulkBuilder.getCreations().forEach(creation => {
creation.presetIds().forEach(presetId => {
let preset = BulkBuilder.getPresets().get(presetId);
if (preset && preset.type() === 'block' && preset.dropPresetId()) {
let blockId = `kubejs:${creation.id()}${preset.idSuffix()}`;
let dropPreset = BulkBuilder.getPresets().get(preset.dropPresetId());
let dropItemId = `kubejs:${creation.id()}${dropPreset ? dropPreset.idSuffix() : ''}`;
event.addBlockModifier(blockId)
.removeLoot(blockId)
.addLoot(dropItemId);
}
});
});
});