From 74d0a3f29d318d0d9e3b8a550a62f504f913c1e2 Mon Sep 17 00:00:00 2001 From: Apollo <102649729+Apollounknowndev@users.noreply.github.com> Date: Wed, 4 Sep 2024 16:04:52 -0400 Subject: [PATCH] Update for 24w34-6a (#58) * Update for 24w34/5a * Bump pack format * Fix biome carvers * 36a, alphabetize components * fix optional fields in equippable component * Remove double Opt( * Update pack format to 52 * Consistent init function name --------- Co-authored-by: Misode --- core/src/ValidationOption.ts | 1 + java/1.21.2/src/Collections.ts | 13 + java/1.21.2/src/schemas/Components.ts | 432 ++++++++++++---------- java/1.21.2/src/schemas/PackMcmeta.ts | 2 +- java/1.21.2/src/schemas/Predicates.ts | 13 + java/1.21.2/src/schemas/TrialSpawner.ts | 100 +++++ java/1.21.2/src/schemas/Trims.ts | 2 +- java/1.21.2/src/schemas/index.ts | 2 + java/1.21.2/src/schemas/worldgen/Biome.ts | 7 +- 9 files changed, 366 insertions(+), 206 deletions(-) create mode 100644 java/1.21.2/src/schemas/TrialSpawner.ts diff --git a/core/src/ValidationOption.ts b/core/src/ValidationOption.ts index d6d42dc..4d5383e 100644 --- a/core/src/ValidationOption.ts +++ b/core/src/ValidationOption.ts @@ -293,6 +293,7 @@ export type ResourceType = | 'block_entity_type' | 'block_predicate_type' | 'cat_variant' + | 'consume_effect_type' | 'custom_stat' | 'data_component_type' | 'enchantment' diff --git a/java/1.21.2/src/Collections.ts b/java/1.21.2/src/Collections.ts index eca18a8..ff3e6b8 100644 --- a/java/1.21.2/src/Collections.ts +++ b/java/1.21.2/src/Collections.ts @@ -642,4 +642,17 @@ export function initCollections(collections: CollectionRegistry) { 'tnt', 'trigger', ]) + + collections.register('use_animation', [ + 'none', + 'eat', + 'drink', + 'block', + 'bow', + 'spear', + 'crossbow', + 'spyglass', + 'toot_horn', + 'brush', + ]) } diff --git a/java/1.21.2/src/schemas/Components.ts b/java/1.21.2/src/schemas/Components.ts index 6920e53..0d87c77 100644 --- a/java/1.21.2/src/schemas/Components.ts +++ b/java/1.21.2/src/schemas/Components.ts @@ -1,5 +1,6 @@ import { BooleanNode, + Case, StringNode as RawStringNode, ListNode, MapNode, @@ -10,6 +11,7 @@ import { ChoiceNode, CollectionRegistry, NumberNode, + Switch, SwitchNode, INode, Mod, @@ -141,24 +143,27 @@ export function initComponentsSchemas(schemas: SchemaRegistry, collections: Coll } }))) + schemas.register('consume_effect', ObjectNode({ + type: StringNode({ validator: 'resource', params: { pool: 'consume_effect_type' } }), + [Switch]: [{ push: 'type' }], + [Case]: { + 'minecraft:apply_effects': { + effects: ListNode(Reference('mob_effect_instance')), + probability: Opt(NumberNode({ min: 0, max: 1 })), + }, + 'minecraft:remove_effects': { + effects: Tag({ resource: 'mob_effect' }) + }, + 'minecraft:teleport_randomly': { + diameter: NumberNode({ min: 0 }), + }, + 'minecraft:play_sound': { + sound: Reference('sound_event'), + }, + } + })) + const Components: Record = { - 'minecraft:custom_data': Reference('custom_data_component'), - 'minecraft:max_stack_size': NumberNode({ integer: true, min: 0, max: 99 }), - 'minecraft:max_damage': NumberNode({ integer: true, min: 1 }), - 'minecraft:damage': NumberNode({ integer: true, min: 0 }), - 'minecraft:unbreakable': ObjectNode({ - show_in_tooltip: Opt(BooleanNode()) - }, { context: 'data_component.unbreakable' }), - 'minecraft:custom_name': StringNode(), // text component - 'minecraft:item_name': StringNode(), // text component - 'minecraft:lore': ListNode( - StringNode(), // text component - { context: 'data_component.lore', maxLength: 256 }, - ), - 'minecraft:rarity': StringNode({ enum: 'rarity' }), - 'minecraft:enchantments': Reference('enchantments_component'), - 'minecraft:can_place_on': Reference('adventure_mode_predicate'), - 'minecraft:can_break': Reference('adventure_mode_predicate'), 'minecraft:attribute_modifiers': ChoiceNode([ { type: 'list', @@ -178,44 +183,82 @@ export function initComponentsSchemas(schemas: SchemaRegistry, collections: Coll change: v => ({ modifiers: v }) } ], { context: 'data_component.attribute_modifiers' }), - 'minecraft:custom_model_data': NumberNode({ integer: true }), - 'minecraft:hide_additional_tooltip': ObjectNode({}), - 'minecraft:hide_tooltip': ObjectNode({}), - 'minecraft:repair_cost': NumberNode({ integer: true, min: 0 }), - 'minecraft:enchantment_glint_override': BooleanNode(), - 'minecraft:intangible_projectile': ObjectNode({}), - 'minecraft:food': ObjectNode({ - nutrition: NumberNode({ integer: true, min: 0 }), - saturation: NumberNode(), - can_always_eat: Opt(BooleanNode()), - eat_seconds: Opt(NumberNode()), - using_converts_to: Opt(Reference('single_item_stack')), - effects: Opt(ListNode( - ObjectNode({ - effect: Reference('mob_effect_instance'), - probability: Opt(NumberNode({ min: 0, max: 1 })), - }), - )), - }, { context: 'data_component.food' }), - 'minecraft:fire_resistant': ObjectNode({}), - 'minecraft:tool': ObjectNode({ - rules: ListNode( - ObjectNode({ - blocks: Tag({ resource: 'block' }), - speed: Opt(NumberNode({ min: 1 })), - correct_for_drops: Opt(BooleanNode()), + 'minecraft:banner_patterns': ListNode( + ObjectNode({ + pattern: ChoiceNode([ + { + type: 'string', + node: StringNode({ validator: 'resource', params: { pool: 'banner_pattern' } }), + }, + { + type: 'object', + node: Reference('banner_pattern') + }, + ]), + color: StringNode({ enum: 'dye_color' }), + }), + { context: 'data_component.banner_patterns' }, + ), + 'minecraft:base_color': StringNode({ enum: 'dye_color' }), + 'minecraft:bees': ListNode( + ObjectNode({ + entity_data: ObjectNode({ + // TODO: any unsafe data }), - ), - default_mining_speed: Opt(NumberNode()), - damage_per_block: Opt(NumberNode({ integer: true, min: 0 })), - }), - 'minecraft:enchantable': ObjectNode({ - value: NumberNode({ integer: true, min: 1 }), - }), - 'minecraft:repairable': ObjectNode({ - items: Tag({ resource: 'item' }), + ticks_in_hive: NumberNode({ integer: true }), + min_ticks_in_hive: NumberNode({ integer: true }), + }), + { context: 'data_component.bees' }, + ), + 'minecraft:block_entity_data': ObjectNode({ + id: StringNode({ validator: 'resource', params: { pool: 'block_entity_type' } }), + // TODO: any unsafe data + }, { context: 'data_component.block_entity_data' }), + 'minecraft:block_state': MapNode( + StringNode(), + StringNode(), + { context: 'data_component.block_state' }, + ), + 'minecraft:bucket_entity_data': ObjectNode({ + // TODO: any unsafe data + }, { context: 'data_component.bucket_entity_data' }), + 'minecraft:bundle_contents': ListNode( + Reference('item_stack'), + { context: 'data_component.bundle_contents', maxLength: 64 }, + ), + 'minecraft:can_break': Reference('adventure_mode_predicate'), + 'minecraft:can_place_on': Reference('adventure_mode_predicate'), + 'minecraft:charged_projectiles': ListNode( + Reference('item_stack'), + { context: 'data_component.charged_projectiles' }, + ), + 'minecraft:consumable': ObjectNode({ + consume_seconds: Opt(NumberNode({ min: 0 })), + animation: Opt(StringNode({ enum: 'use_animation' })), + sound: Opt(Reference('sound_event')), + has_consume_particles: Opt(BooleanNode()), + on_consume_effects: Opt(ListNode(Reference('consume_effect'))) }), - 'minecraft:stored_enchantments': Reference('enchantments_component'), + 'minecraft:container': ListNode( + ObjectNode({ + slot: NumberNode({ integer: true, min: 0, max: 255 }), + item: Reference('item_stack'), + }), + { context: 'data_component.container', maxLength: 256 }, + ), + 'minecraft:container_loot': ObjectNode({ + loot_table: StringNode({ validator: 'resource', params: { pool: '$loot_table' } }), + seed: Opt(NumberNode({ integer: true })), + }, { context: 'data_component.container_loot' }), + 'minecraft:custom_data': Reference('custom_data_component'), + 'minecraft:custom_model_data': NumberNode({ integer: true }), + 'minecraft:custom_name': StringNode(), // text component + 'minecraft:damage': NumberNode({ integer: true, min: 0 }), + 'minecraft:debug_stick_state': MapNode( + StringNode({ validator: 'resource', params: { pool: 'block' } }), + StringNode(), // TODO: block state key validation + { context: 'data_component.debug_stick_state' }, + ), 'minecraft:dyed_color': ChoiceNode([ { type: 'number', @@ -231,96 +274,39 @@ export function initComponentsSchemas(schemas: SchemaRegistry, collections: Coll change: v => ({ rgb: v }) } ], { context: 'data_component.dyed_color' }), - 'minecraft:map_color': NumberNode({ color: true }), - 'minecraft:map_id': NumberNode({ integer: true }), - 'minecraft:map_decorations': MapNode( - StringNode(), - Reference('map_decoration'), - { context: 'data_component.map_decorations' }, - ), - 'minecraft:charged_projectiles': ListNode( - Reference('item_stack'), - { context: 'data_component.charged_projectiles' }, - ), - 'minecraft:bundle_contents': ListNode( - Reference('item_stack'), - { context: 'data_component.bundle_contents', maxLength: 64 }, - ), - 'minecraft:potion_contents': ChoiceNode([ - { - type: 'string', - node: StringNode({ validator: 'resource', params: { pool: 'potion' } }), - change: v => v.potion - }, - { - type: 'object', - node: ObjectNode({ - potion: Opt(StringNode({ validator: 'resource', params: { pool: 'potion' } })), - custom_color: Opt(NumberNode({ color: true })), - custom_effects: Opt(ListNode( - Reference('mob_effect_instance'), - )), - }), - change: v => ({ potion: v}) - } - ], { context: 'data_component.potion_contents' }), - 'minecraft:suspicious_stew_effects': ListNode( - Reference('suspicious_stew_effect_instance'), - { context: 'data_component.suspicious_stew_effects' }, - ), - 'minecraft:writable_book_content': ObjectNode({ - pages: Opt(ListNode( - Filterable(SizeLimitedString({ maxLength: 1024 })), - )), - }, { context: 'data_component.writable_book_content' }), - 'minecraft:written_book_content': ObjectNode({ - title: SizeLimitedString({ maxLength: 32 }), - author: StringNode(), - generation: Opt(NumberNode({ integer: true, min: 0, max: 3 })), - pages: Opt(ListNode( - Filterable(SizeLimitedString({ maxLength: 32767 })), // text component - )), - resolved: Opt(BooleanNode()), - }, { context: 'data_component.written_book_content' }), - 'minecraft:trim': ObjectNode({ - material: ChoiceNode([ - { - type: 'string', - node: StringNode({ validator: 'resource', params: { pool: '$trim_material' } }), - }, - { - type: 'object', - node: Reference('trim_material'), - }, - ]), - pattern: ChoiceNode([ - { - type: 'string', - node: StringNode({ validator: 'resource', params: { pool: '$trim_pattern' } }), - }, - { - type: 'object', - node: Reference('trim_pattern'), - }, - ]), - show_in_tooltip: Opt(BooleanNode()), - }, { context: 'data_component.trim' }), - 'minecraft:debug_stick_state': MapNode( - StringNode({ validator: 'resource', params: { pool: 'block' } }), - StringNode(), // TODO: block state key validation - { context: 'data_component.debug_stick_state' }, - ), + 'minecraft:enchantable': ObjectNode({ + value: NumberNode({ integer: true, min: 1 }), + }), + 'minecraft:enchantment_glint_override': BooleanNode(), + 'minecraft:enchantments': Reference('enchantments_component'), 'minecraft:entity_data': ObjectNode({ id: StringNode({ validator: 'resource', params: { pool: 'entity_type' } }), // TODO: any unsafe data }, { context: 'data_component.entity_data' }), - 'minecraft:bucket_entity_data': ObjectNode({ - // TODO: any unsafe data - }, { context: 'data_component.bucket_entity_data' }), - 'minecraft:block_entity_data': ObjectNode({ - id: StringNode({ validator: 'resource', params: { pool: 'block_entity_type' } }), - // TODO: any unsafe data - }, { context: 'data_component.block_entity_data' }), + 'minecraft:equippable': ObjectNode({ + slot: StringNode({ enum: 'equipment_slot' }), + equip_sound: Opt(Reference('sound_event')), + model: Opt(StringNode()), + allowed_entities: Opt(Tag({ resource: 'entity_type' })), + dispensable: Opt(BooleanNode()), + }), + 'minecraft:fire_resistant': ObjectNode({}), + 'minecraft:firework_explosion': Reference('firework_explosion'), + 'minecraft:fireworks': ObjectNode({ + flight_duration: Opt(NumberNode({ integer: true, min: 0, max: 255 })), + explosions: ListNode( + Reference('firework_explosion'), + { maxLength: 256 }, + ), + }, { context: 'data_component.fireworks' }), + 'minecraft:food': ObjectNode({ + nutrition: NumberNode({ integer: true, min: 0 }), + saturation: NumberNode(), + can_always_eat: Opt(BooleanNode()), + }, { context: 'data_component.food' }), + 'minecraft:glider': ObjectNode({}), + 'minecraft:hide_additional_tooltip': ObjectNode({}), + 'minecraft:hide_tooltip': ObjectNode({}), 'minecraft:instrument': ChoiceNode([ { type: 'string', @@ -335,7 +321,9 @@ export function initComponentsSchemas(schemas: SchemaRegistry, collections: Coll }, { context: 'instrument' }), }, ], { context: 'data_component.instrument' }), - 'minecraft:ominous_bottle_amplifier': NumberNode({ integer: true, min: 0, max: 4 }), + 'minecraft:intangible_projectile': ObjectNode({}), + 'minecraft:item_model': StringNode(), + 'minecraft:item_name': StringNode(), // text component 'minecraft:jukebox_playable': ObjectNode({ song: ChoiceNode([ { @@ -349,10 +337,7 @@ export function initComponentsSchemas(schemas: SchemaRegistry, collections: Coll ]), show_in_tooltip: Opt(BooleanNode()), }, { context: 'data_component.jukebox_playable' }), - 'minecraft:recipes': ListNode( - StringNode({ validator: 'resource', params: { pool: '$recipe' } }), - { context: 'data_component.recipes' }, - ), + 'minecraft:lock': StringNode(), 'minecraft:lodestone_tracker': ObjectNode({ target: Opt(ObjectNode({ dimension: StringNode({ validator: 'resource', params: { pool: '$dimension' } }), @@ -360,14 +345,43 @@ export function initComponentsSchemas(schemas: SchemaRegistry, collections: Coll })), tracked: Opt(BooleanNode()), }, { context: 'data_component.lodestone_tracker' }), - 'minecraft:firework_explosion': Reference('firework_explosion'), - 'minecraft:fireworks': ObjectNode({ - flight_duration: Opt(NumberNode({ integer: true, min: 0, max: 255 })), - explosions: ListNode( - Reference('firework_explosion'), - { maxLength: 256 }, - ), - }, { context: 'data_component.fireworks' }), + 'minecraft:lore': ListNode( + StringNode(), // text component + { context: 'data_component.lore', maxLength: 256 }, + ), + 'minecraft:map_color': NumberNode({ color: true }), + 'minecraft:map_decorations': MapNode( + StringNode(), + Reference('map_decoration'), + { context: 'data_component.map_decorations' }, + ), + 'minecraft:map_id': NumberNode({ integer: true }), + 'minecraft:max_damage': NumberNode({ integer: true, min: 1 }), + 'minecraft:max_stack_size': NumberNode({ integer: true, min: 0, max: 99 }), + 'minecraft:note_block_sound': StringNode({ validator: 'resource', params: { pool: [], allowUnknown: true } }), + 'minecraft:ominous_bottle_amplifier': NumberNode({ integer: true, min: 0, max: 4 }), + 'minecraft:pot_decorations': ListNode( + StringNode({ validator: 'resource', params: { pool: 'item' } }), + { context: 'data_component.pot_decorations', maxLength: 4 }, + ), + 'minecraft:potion_contents': ChoiceNode([ + { + type: 'string', + node: StringNode({ validator: 'resource', params: { pool: 'potion' } }), + change: v => v.potion + }, + { + type: 'object', + node: ObjectNode({ + potion: Opt(StringNode({ validator: 'resource', params: { pool: 'potion' } })), + custom_color: Opt(NumberNode({ color: true })), + custom_effects: Opt(ListNode( + Reference('mob_effect_instance'), + )), + }), + change: v => ({ potion: v}) + } + ], { context: 'data_component.potion_contents' }), 'minecraft:profile': ChoiceNode([ { type: 'string', @@ -420,55 +434,77 @@ export function initComponentsSchemas(schemas: SchemaRegistry, collections: Coll change: v => ({ name: v }) } ], { context: 'data_component.profile' }), - 'minecraft:note_block_sound': StringNode({ validator: 'resource', params: { pool: [], allowUnknown: true } }), - 'minecraft:banner_patterns': ListNode( - ObjectNode({ - pattern: ChoiceNode([ - { - type: 'string', - node: StringNode({ validator: 'resource', params: { pool: 'banner_pattern' } }), - }, - { - type: 'object', - node: Reference('banner_pattern') - }, - ]), - color: StringNode({ enum: 'dye_color' }), - }), - { context: 'data_component.banner_patterns' }, - ), - 'minecraft:base_color': StringNode({ enum: 'dye_color' }), - 'minecraft:pot_decorations': ListNode( - StringNode({ validator: 'resource', params: { pool: 'item' } }), - { context: 'data_component.pot_decorations', maxLength: 4 }, - ), - 'minecraft:container': ListNode( - ObjectNode({ - slot: NumberNode({ integer: true, min: 0, max: 255 }), - item: Reference('item_stack'), - }), - { context: 'data_component.container', maxLength: 256 }, + 'minecraft:rarity': StringNode({ enum: 'rarity' }), + 'minecraft:recipes': ListNode( + StringNode({ validator: 'resource', params: { pool: '$recipe' } }), + { context: 'data_component.recipes' }, ), - 'minecraft:block_state': MapNode( - StringNode(), - StringNode(), - { context: 'data_component.block_state' }, + 'minecraft:repair_cost': NumberNode({ integer: true, min: 0 }), + 'minecraft:repairable': ObjectNode({ + items: Tag({ resource: 'item' }), + }), + 'minecraft:stored_enchantments': Reference('enchantments_component'), + 'minecraft:suspicious_stew_effects': ListNode( + Reference('suspicious_stew_effect_instance'), + { context: 'data_component.suspicious_stew_effects' }, ), - 'minecraft:bees': ListNode( - ObjectNode({ - entity_data: ObjectNode({ - // TODO: any unsafe data + 'minecraft:tool': ObjectNode({ + rules: ListNode( + ObjectNode({ + blocks: Tag({ resource: 'block' }), + speed: Opt(NumberNode({ min: 1 })), + correct_for_drops: Opt(BooleanNode()), }), - ticks_in_hive: NumberNode({ integer: true }), - min_ticks_in_hive: NumberNode({ integer: true }), - }), - { context: 'data_component.bees' }, - ), - 'minecraft:lock': StringNode(), - 'minecraft:container_loot': ObjectNode({ - loot_table: StringNode({ validator: 'resource', params: { pool: '$loot_table' } }), - seed: Opt(NumberNode({ integer: true })), - }, { context: 'data_component.container_loot' }), + ), + default_mining_speed: Opt(NumberNode()), + damage_per_block: Opt(NumberNode({ integer: true, min: 0 })), + }), + 'minecraft:tooltip_style': StringNode(), + 'minecraft:trim': ObjectNode({ + material: ChoiceNode([ + { + type: 'string', + node: StringNode({ validator: 'resource', params: { pool: '$trim_material' } }), + }, + { + type: 'object', + node: Reference('trim_material'), + }, + ]), + pattern: ChoiceNode([ + { + type: 'string', + node: StringNode({ validator: 'resource', params: { pool: '$trim_pattern' } }), + }, + { + type: 'object', + node: Reference('trim_pattern'), + }, + ]), + show_in_tooltip: Opt(BooleanNode()), + }, { context: 'data_component.trim' }), + 'minecraft:unbreakable': ObjectNode({ + show_in_tooltip: Opt(BooleanNode()) + }, { context: 'data_component.unbreakable' }), + 'minecraft:use_cooldown': ObjectNode({ + seconds: NumberNode({ min: 0 }), + cooldown_group: StringNode(), + }), + 'minecraft:use_remainder': Reference('item_stack'), + 'minecraft:writable_book_content': ObjectNode({ + pages: Opt(ListNode( + Filterable(SizeLimitedString({ maxLength: 1024 })), + )), + }, { context: 'data_component.writable_book_content' }), + 'minecraft:written_book_content': ObjectNode({ + title: SizeLimitedString({ maxLength: 32 }), + author: StringNode(), + generation: Opt(NumberNode({ integer: true, min: 0, max: 3 })), + pages: Opt(ListNode( + Filterable(SizeLimitedString({ maxLength: 32767 })), // text component + )), + resolved: Opt(BooleanNode()), + }, { context: 'data_component.written_book_content' }), } const keyMatches = (key: string) => (path: ModelPath) => { diff --git a/java/1.21.2/src/schemas/PackMcmeta.ts b/java/1.21.2/src/schemas/PackMcmeta.ts index bb9f99d..472685a 100644 --- a/java/1.21.2/src/schemas/PackMcmeta.ts +++ b/java/1.21.2/src/schemas/PackMcmeta.ts @@ -12,7 +12,7 @@ import { } from '@mcschema/core' import { InclusiveRange } from './Common' -const CURRENT_PACK_FORMAT = 49 +const CURRENT_PACK_FORMAT = 52 export function initPackMcmetaSchemas(schemas: SchemaRegistry, collections: CollectionRegistry) { const Reference = RawReference.bind(undefined, schemas) diff --git a/java/1.21.2/src/schemas/Predicates.ts b/java/1.21.2/src/schemas/Predicates.ts index 17ab19c..7cf5fb9 100644 --- a/java/1.21.2/src/schemas/Predicates.ts +++ b/java/1.21.2/src/schemas/Predicates.ts @@ -280,6 +280,15 @@ export function initPredicatesSchemas(schemas: SchemaRegistry, collections: Coll StringNode({ enum: 'gamemode' }) )), level: Opt(Reference('int_bounds')), + input: Opt(ObjectNode({ + forward: Opt(BooleanNode()), + backward: Opt(BooleanNode()), + left: Opt(BooleanNode()), + right: Opt(BooleanNode()), + jump: Opt(BooleanNode()), + sneak: Opt(BooleanNode()), + sprint: Opt(BooleanNode()), + })), advancements: Opt(MapNode( StringNode({ validator: 'resource', params: { pool: '$advancement' } }), ChoiceNode([ @@ -313,6 +322,10 @@ export function initPredicatesSchemas(schemas: SchemaRegistry, collections: Coll has_raid: Opt(BooleanNode()), is_captain: Opt(BooleanNode()), }, + 'minecraft:sheep': { + sheared: Opt(BooleanNode()), + color: Opt(StringNode({ enum: 'dye_color' })), + }, 'minecraft:slime': { size: Opt(Reference('int_bounds')) }, diff --git a/java/1.21.2/src/schemas/TrialSpawner.ts b/java/1.21.2/src/schemas/TrialSpawner.ts new file mode 100644 index 0000000..5af3855 --- /dev/null +++ b/java/1.21.2/src/schemas/TrialSpawner.ts @@ -0,0 +1,100 @@ +import { + Reference as RawReference, + ChoiceNode, + ListNode, + MapNode, + Mod, + ObjectNode, + Opt, + SchemaRegistry, + StringNode, + CollectionRegistry, + NumberNode +} from '@mcschema/core' +import { InclusiveRange } from './Common' + +export function initTrialSpawnerSchemas(schemas: SchemaRegistry, collections: CollectionRegistry) { + const Reference = RawReference.bind(undefined, schemas) + + + schemas.register('light_limit', ChoiceNode([ + { + type: 'number', + node: NumberNode({ integer: true, min: 0, max: 15 }), + change: (v: any) => Array.isArray(v) ? (v[0] ?? 0) : (v?.min_inclusive ?? 0) + }, + { + type: 'list', + node: ListNode( + NumberNode({ integer: true, min: 0, max: 15 }), + { minLength: 2, maxLength: 2 }, + ), + change: (v: any) => typeof v === 'number' ? [v, v] : [v?.min_inclusive ?? 0, v?.max_inclusive ?? 0] + }, + { + type: 'object', + node: InclusiveRange({ integer: true, min: 0, max: 15 }), + change: (v: any) => Array.isArray(v) ? {min_inclusive: v[0] ?? 0, max_inclusive: v[1] ?? 0} : {min_inclusive: v ?? 0, max_inclusive: v ?? 0} + } + ])) + + schemas.register('trial_spawner', Mod(ObjectNode({ + spawn_range: Opt(NumberNode({ integer: true, min: 1, max: 128 })), + total_mobs: NumberNode({ min: 0 }), + simultaneous_mobs: NumberNode({ min: 0 }), + total_mobs_added_per_player: NumberNode({ min: 0 }), + simultaneous_mobs_added_per_player: NumberNode({ min: 0 }), + ticks_between_spawn: Opt(NumberNode({ integer: true, min: 0 })), + spawn_potentials: Opt(ListNode(ObjectNode({ + weight: NumberNode({ integer: true, min: 1 }), + data: ObjectNode({ + entity: StringNode({ validator: 'nbt', params: { registry: { category: 'minecraft:entity', id: ['pop', { push: 'type' }] } } }), + custom_spawn_rules: Opt(ObjectNode({ + block_light_limit: Opt(Reference('light_limit')), + sky_light_limit: Opt(Reference('light_limit')), + })), + equipment: Opt(ObjectNode({ + loot_table: StringNode({ validator: 'resource', params: { pool: '$loot_table' } }), + slot_drop_chances: Opt(ChoiceNode([ + { + type: 'number', + node: NumberNode(), + }, + { + type: 'object', + node: MapNode( + StringNode({ enum: 'equipment_slot' }), + NumberNode() + ) + } + ])) + })) + }), + }))), + loot_tables_to_eject: Opt(ListNode(ObjectNode({ + weight: NumberNode({ integer: true, min: 1 }), + data: StringNode({ validator: 'resource', params: { pool: '$loot_table' } }), + }))), + items_to_drop_when_ominous: Opt(StringNode({ validator: 'resource', params: { pool: '$loot_table' } })), + }, { context: 'instrument' }), { + default: () => ({ + spawn_range: 4, + total_mobs: 6, + simultaneous_mobs: 2, + total_mobs_added_per_player: 2, + simultaneous_mobs_added_per_player: 1, + ticks_between_spawn: 40, + loot_tables_to_eject: [ + { + data: 'minecraft:spawners/trial_chamber/consumables', + weight: 1 + }, + { + data: 'minecraft:spawners/trial_chamber/key', + weight: 1 + }, + ], + items_to_drop_when_ominous: 'minecraft:spawners/trial_chamber/items_to_drop_when_ominous' + }) + })) +} diff --git a/java/1.21.2/src/schemas/Trims.ts b/java/1.21.2/src/schemas/Trims.ts index 04a1c2f..5abb422 100644 --- a/java/1.21.2/src/schemas/Trims.ts +++ b/java/1.21.2/src/schemas/Trims.ts @@ -21,7 +21,7 @@ export function initTrimsSchemas(schemas: SchemaRegistry, collections: Collectio ingredient: StringNode({ validator: 'resource', params: { pool: 'item' } }), item_model_index: NumberNode(), override_armor_materials: Opt(MapNode( - StringNode({ enum: 'armor_material' }), + StringNode(), StringNode(), )), }, { context: 'trim_material' }), { diff --git a/java/1.21.2/src/schemas/index.ts b/java/1.21.2/src/schemas/index.ts index 87df37a..288070f 100644 --- a/java/1.21.2/src/schemas/index.ts +++ b/java/1.21.2/src/schemas/index.ts @@ -15,6 +15,7 @@ import { initPredicatesSchemas } from './Predicates' import { initRecipeSchemas } from './Recipe' import { initTagsSchemas } from './Tags' import { initTextComponentSchemas } from './TextComponent' +import { initTrialSpawnerSchemas } from './TrialSpawner' import { initTrimsSchemas } from './Trims' import { initWolfVariantSchemas } from './WolfVariant' import { initWorldgenSchemas } from './worldgen' @@ -48,6 +49,7 @@ export function initSchemas(schemas: SchemaRegistry, collections: CollectionRegi initRecipeSchemas(schemas, collections) initTagsSchemas(schemas, collections) initTextComponentSchemas(schemas, collections) + initTrialSpawnerSchemas(schemas, collections) initTrimsSchemas(schemas, collections) initWolfVariantSchemas(schemas, collections) initWorldgenSchemas(schemas, collections) diff --git a/java/1.21.2/src/schemas/worldgen/Biome.ts b/java/1.21.2/src/schemas/worldgen/Biome.ts index b720f60..42c36dc 100644 --- a/java/1.21.2/src/schemas/worldgen/Biome.ts +++ b/java/1.21.2/src/schemas/worldgen/Biome.ts @@ -87,12 +87,7 @@ export function initBiomeSchemas(schemas: SchemaRegistry, collections: Collectio }) }) ), - carvers: MapNode( - StringNode({ enum: ['air', 'liquid'] }), - Mod(Tag({ resource: '$worldgen/configured_carver', inlineSchema: 'configured_carver' }), { - default: () => ['minecraft:cave'] - }) - ), + carvers: Tag({ resource: '$worldgen/configured_carver', inlineSchema: 'configured_carver' }), features: ListNode( Mod(Tag({ resource: '$worldgen/placed_feature', inlineSchema: 'placed_feature' }), { category: () => 'predicate' }), { maxLength: 11 }