diff --git a/src/nodes/NumberNode.ts b/src/nodes/NumberNode.ts index deb11b3d..5282cc50 100644 --- a/src/nodes/NumberNode.ts +++ b/src/nodes/NumberNode.ts @@ -37,6 +37,6 @@ export class NumberNode extends AbstractNode implements StateNode${path.last()}`} - ` + ` } } diff --git a/src/nodes/StringNode.ts b/src/nodes/StringNode.ts index 42005d22..a501bb3e 100644 --- a/src/nodes/StringNode.ts +++ b/src/nodes/StringNode.ts @@ -26,6 +26,6 @@ export class StringNode extends AbstractNode implements StateNode${path.last()}`} - ` + ` } } diff --git a/src/nodes/custom/RangeNode.ts b/src/nodes/custom/RangeNode.ts index f7c5091f..84878963 100644 --- a/src/nodes/custom/RangeNode.ts +++ b/src/nodes/custom/RangeNode.ts @@ -54,19 +54,19 @@ export class RangeNode extends AbstractNode implements StateNode let input = '' if (value === undefined || typeof value === 'number') { curType = 'exact' - input = `` + input = `` } else if (value.type === 'binomial') { curType = 'binomial' input = ` - + - ` + ` } else { curType = 'range' input = ` - + - ` + ` } const id = view.register(el => { (el as HTMLInputElement).value = curType diff --git a/src/nodes/custom/ResourceNode.ts b/src/nodes/custom/ResourceNode.ts index 3cf891cf..1d6d3d74 100644 --- a/src/nodes/custom/ResourceNode.ts +++ b/src/nodes/custom/ResourceNode.ts @@ -1,12 +1,44 @@ import { NodeMods, RenderOptions } from '../AbstractNode' -import { StringNode } from '../StringNode' +import { EnumNode } from '../EnumNode' +import { Path } from '../../model/Path' +import { DataModel } from '../../model/DataModel' +import { TreeView, getId } from '../../view/TreeView' -export class ResourceNode extends StringNode { - constructor(mods?: NodeMods) { - super({ +export interface ResourceNodeMods extends NodeMods { + options?: string[] + registry?: string + additional?: boolean +} + +export class ResourceNode extends EnumNode { + additional: boolean + + constructor(mods?: ResourceNodeMods) { + const options = mods?.options ?? [] // TODO: Support registry using `github.com/Arcensoth/mcdata` + super(options, { transform: (v) => { if (v === undefined) return undefined return v.startsWith('minecraft:') ? v : 'minecraft:' + v }, ...mods}) + this.additional = mods?.additional ?? false } -} + + getState(el: Element) { + if (this.additional) { + return el.querySelector('input')!.value + } else { + return super.getState(el) + } + } + + renderRaw(path: Path, value: string, view: TreeView, options?: RenderOptions) { + if (this.additional) { + const id = `datalist-${getId()}` + return `${options?.hideLabel ? `` : ``} + + ${this.options.map(o => `` + } else { + return super.renderRaw(path, value, view, options) + } + } +} diff --git a/src/schemas/Condition.ts b/src/schemas/Condition.ts index 71aa46a2..a9276ee6 100644 --- a/src/schemas/Condition.ts +++ b/src/schemas/Condition.ts @@ -16,7 +16,7 @@ import './Predicates' const entitySources = ['this', 'killer', 'killer_player'] export const ConditionSchema = SchemaRegistry.register('condition', new ObjectNode({ - condition: new EnumNode(conditions, 'random_chance'), + condition: new ResourceNode({options: conditions, default: () => 'random_chance'}), [Switch]: 'condition', [Case]: { 'alternative': { @@ -25,7 +25,7 @@ export const ConditionSchema = SchemaRegistry.register('condition', new ObjectNo ) }, 'block_state_property': { - block: new ResourceNode(), + block: new ResourceNode({registry: 'minecraft:block'}), properties: new MapNode( new StringNode(), new StringNode() @@ -76,7 +76,7 @@ export const ConditionSchema = SchemaRegistry.register('condition', new ObjectNo name: new StringNode() }, 'table_bonus': { - enchantment: new EnumNode(enchantments), + enchantment: new ResourceNode({options: enchantments}), chances: new ListNode( new NumberNode({min: 0, max: 1}) ) diff --git a/src/schemas/Predicates.ts b/src/schemas/Predicates.ts index 08533899..aa8d517b 100644 --- a/src/schemas/Predicates.ts +++ b/src/schemas/Predicates.ts @@ -20,7 +20,7 @@ import { } from './Collections' SchemaRegistry.register('item-predicate', new ObjectNode({ - item: new ResourceNode(), + item: new ResourceNode({registry: 'minecraft:item'}), tag: new StringNode(), count: new RangeNode(), durability: new RangeNode(), @@ -32,12 +32,12 @@ SchemaRegistry.register('item-predicate', new ObjectNode({ })) SchemaRegistry.register('enchantment-predicate', new ObjectNode({ - enchantment: new EnumNode(enchantments), + enchantment: new ResourceNode({options: enchantments}), levels: new RangeNode() })) SchemaRegistry.register('block-predicate', new ObjectNode({ - block: new ResourceNode(), + block: new ResourceNode({registry: 'minecraft:block'}), tag: new StringNode(), nbt: new StringNode(), state: new MapNode( @@ -47,7 +47,7 @@ SchemaRegistry.register('block-predicate', new ObjectNode({ })) SchemaRegistry.register('fluid-predicate', new ObjectNode({ - fluid: new ResourceNode(), + fluid: new ResourceNode({registry: 'minecraft:fluid'}), tag: new StringNode(), nbt: new StringNode(), state: new MapNode( @@ -62,9 +62,9 @@ SchemaRegistry.register('location-predicate', new ObjectNode({ y: new RangeNode(), z: new RangeNode() }), - biome: new EnumNode(biomes), + biome: new ResourceNode({options: biomes}), feature: new EnumNode(structures), - dimension: new EnumNode(dimensions), + dimension: new ResourceNode({options: dimensions, additional: true}), light: new ObjectNode({ light: new RangeNode() }), @@ -134,7 +134,7 @@ SchemaRegistry.register('entity-predicate', new ObjectNode({ in_open_water: new BooleanNode() }), effects: new MapNode( - new EnumNode(statusEffects), + new ResourceNode({options: statusEffects}), new ReferenceNode('status-effect-predicate') ) }))