Change some EnumNodes to ResourceNodes

This commit is contained in:
SPGoding
2020-05-26 23:48:00 -05:00
parent 2646c22e68
commit 9c20e9520a
6 changed files with 54 additions and 22 deletions

View File

@@ -37,6 +37,6 @@ export class NumberNode extends AbstractNode<number> implements StateNode<number
renderRaw(path: Path, value: number, view: TreeView, options?: RenderOptions) {
return `${options?.hideLabel ? `` : `<label>${path.last()}</label>`}
<input value="${value ?? ''}"></input>`
<input value="${value ?? ''}">`
}
}

View File

@@ -26,6 +26,6 @@ export class StringNode extends AbstractNode<string> implements StateNode<string
renderRaw(path: Path, value: string, view: TreeView, options?: RenderOptions) {
return `${options?.hideLabel ? `` : `<label>${path.last()}</label>`}
<input value="${value ?? ''}"></input>`
<input value="${value ?? ''}">`
}
}

View File

@@ -54,19 +54,19 @@ export class RangeNode extends AbstractNode<IRange> implements StateNode<IRange>
let input = ''
if (value === undefined || typeof value === 'number') {
curType = 'exact'
input = `<input value=${value === undefined ? '' : value}></input>`
input = `<input value=${value === undefined ? '' : value}>`
} else if (value.type === 'binomial') {
curType = 'binomial'
input = `<label>n</label>
<input value=${value.n === undefined ? '' : value.n}></input>
<input value=${value.n === undefined ? '' : value.n}>
<label>p</label>
<input value=${value.p === undefined ? '' : value.p}></input>`
<input value=${value.p === undefined ? '' : value.p}>`
} else {
curType = 'range'
input = `<label>Min</label>
<input value=${value.min === undefined ? '' : value.min}></input>
<input value=${value.min === undefined ? '' : value.min}>
<label>Max</label>
<input value=${value.max === undefined ? '' : value.max}></input>`
<input value=${value.max === undefined ? '' : value.max}>`
}
const id = view.register(el => {
(el as HTMLInputElement).value = curType

View File

@@ -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<string>) {
super({
export interface ResourceNodeMods extends NodeMods<string> {
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 ? `` : `<label>${path.last()}</label>`}
<input list=${id} value="${value ?? ''}">
<datalist id=${id}>${this.options.map(o => `<option value="${o}">`).join('')}</datalist>`
} else {
return super.renderRaw(path, value, view, options)
}
}
}

View File

@@ -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})
)

View File

@@ -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')
)
}))