UNPKG

bedrock-development

Version:

APIs for creating and editing files related to Minecraft Bedrock development.

163 lines (149 loc) 5.16 kB
import { Directories } from "../../file_manager.js"; import { NameData, currentFormatVersion } from "../../utils.js"; import { GeometryName } from "../client"; import { MinecraftDataType } from "../minecraft.js"; import { FormatVersion, Identifier, MolangTripleArray } from "../shared_types.js"; export interface IServerBlock { format_version: FormatVersion; ["minecraft:block"]: { description: IServerBlockDescription; components: IServerBlockComponents; permutations?: { condition: string; components: IServerBlockComponents; }[]; } } export interface IServerBlockDescription { identifier: Identifier; register_to_creative_menu?: boolean; is_experimental?: boolean; menu_category?: { category: string; group?: string; is_hidden_in_commands?: boolean; }; states?: { [key: string]: any; }; traits?: { [key: string]: any; }; } export interface IServerBlockComponents { ["minecraft:collision_box"]?: boolean|{ origin: MolangTripleArray; size: MolangTripleArray; }; ["minecraft:crafting_table"]?: { table_name: string; crafting_tags: string[]; }; ["minecraft:destructible_by_explosion"]?: boolean|{ explosion_resistance: number }; ["minecraft:destructible_by_mining"]?: boolean|{ seconds_to_destroy: number }; ["minecraft:flammable"]?: boolean|{ catch_chance_multiplier: number; destroy_chance_multiplier: number; }; ["minecraft:display_name"]?: string; ["minecraft:friction"]?: number; ["minecraft:geometry"]?: GeometryName|{ identifier: GeometryName; bone_visibility?: { [key: string]: boolean|string; } }; ["minecraft:light_dampening"]?: number; ["minecraft:light_emission"]?: number; ["minecraft:loot"]?: string; ["minecraft:map_color"]?: string|MolangTripleArray; ["minecraft:material_instances"]?: { ['*']: IServerBlockMaterialInstance; [key: string]: IServerBlockMaterialInstance; } ["minecraft:placement_filter"]?: { conditions: { allowed_faces?: 'up'|'down'|'north'|'east'|'south'|'west'|'side'[]; block_filter?: Identifier|{ tags: string; }[]; }[]; }; ["minecraft:selection_box"]?: boolean|{ origin: MolangTripleArray; size: MolangTripleArray; }; ["minecraft:transformation"]?: { translation?: MolangTripleArray; rotation?: MolangTripleArray; scale?: MolangTripleArray; }; [key: string]: any; } export interface IServerBlockMaterialInstance { texture: string; render_method?: 'opaque'|'double_sided'|'alpha_test'|'blend'; face_dimming?: boolean; ambient_occlusion?: boolean; } export class ServerBlock extends MinecraftDataType implements IServerBlock { format_version: FormatVersion; ["minecraft:block"]: { description: IServerBlockDescription; components: IServerBlockComponents; permutations?: { condition: string; components: IServerBlockComponents; }[]; } public static get DirectoryPath(): string { return Directories.BEHAVIOR_PATH + 'blocks/'; } constructor(filepath: string, template: IServerBlock) { super(filepath, template); this.format_version = template.format_version; this["minecraft:block"] = template["minecraft:block"]; } public static createFromTemplate(nameData: NameData): ServerBlock { return new ServerBlock(this.createFilePath(nameData), { format_version: currentFormatVersion, "minecraft:block": { description: { identifier: nameData.fullname as Identifier, }, components: {} } }); } setDisplayData(name: NameData) { this["minecraft:block"].description.identifier = name.fullname as Identifier; this["minecraft:block"].components["minecraft:display_name"] = `tile.${name.fullname}.name`; this["minecraft:block"].components["minecraft:material_instances"] = { "*": { texture: name.shortname } }; } setExplosionResistance(resistance: number|boolean) { if (typeof(resistance) === 'boolean') { this["minecraft:block"].components["minecraft:destructible_by_explosion"] = resistance; } else { this["minecraft:block"].components["minecraft:destructible_by_explosion"] = { explosion_resistance: resistance }; } } setFriction(friction: number = 0.4) { this["minecraft:block"].components["minecraft:friction"] = friction; } setLightEmission(emission: number) { this["minecraft:block"].components["minecraft:light_emission"] = emission; } setLootTable(table: string = "loot_tables/blocks/empty.json") { this["minecraft:block"].components["minecraft:loot"] = table; } }