steel_registry/structure_processor/
data.rs1use serde::{Deserialize, Deserializer, de::Error as _};
4use steel_utils::{Identifier, value_providers::IntProvider};
5
6use crate::shared_structs::{
7 BlockStateData, deserialize_optional_tag_identifier, deserialize_tag_identifier,
8};
9
10#[derive(Debug, Clone, Deserialize)]
12#[serde(deny_unknown_fields)]
13pub struct StructureProcessorListData {
14 pub processors: Vec<StructureProcessorKind>,
16}
17
18#[derive(Debug, Clone, Deserialize)]
20#[serde(tag = "processor_type")]
21pub enum StructureProcessorKind {
22 #[serde(rename = "minecraft:block_rot")]
24 BlockRot {
25 #[serde(default, deserialize_with = "deserialize_optional_tag_identifier")]
27 rottable_blocks: Option<Identifier>,
28 integrity: f32,
30 },
31 #[serde(rename = "minecraft:protected_blocks")]
33 ProtectedBlocks {
34 #[serde(rename = "value", deserialize_with = "deserialize_tag_identifier")]
36 cannot_replace: Identifier,
37 },
38 #[serde(rename = "minecraft:rule")]
40 Rule { rules: Vec<ProcessorRuleData> },
41 #[serde(rename = "minecraft:block_age")]
43 BlockAge { mossiness: f32 },
44 #[serde(rename = "minecraft:lava_submerged_block")]
46 LavaSubmergedBlock,
47 #[serde(rename = "minecraft:blackstone_replace")]
49 BlackstoneReplace,
50 #[serde(rename = "minecraft:capped")]
52 Capped {
53 delegate: Box<StructureProcessorKind>,
54 limit: IntProvider,
55 },
56}
57
58#[derive(Debug, Clone, Deserialize)]
60#[serde(deny_unknown_fields)]
61pub struct ProcessorRuleData {
62 pub input_predicate: StructureRuleTestData,
63 pub location_predicate: StructureRuleTestData,
64 #[serde(default)]
65 pub position_predicate: PosRuleTestData,
66 pub output_state: BlockStateData,
67 #[serde(default)]
68 pub block_entity_modifier: RuleBlockEntityModifierData,
69}
70
71#[derive(Debug, Clone, Deserialize)]
73#[serde(tag = "predicate_type")]
74pub enum StructureRuleTestData {
75 #[serde(rename = "minecraft:always_true")]
76 AlwaysTrue,
77 #[serde(rename = "minecraft:block_match")]
78 BlockMatch { block: Identifier },
79 #[serde(rename = "minecraft:random_block_match")]
80 RandomBlockMatch { block: Identifier, probability: f32 },
81 #[serde(rename = "minecraft:tag_match")]
82 TagMatch { tag: Identifier },
83 #[serde(rename = "minecraft:blockstate_match")]
84 BlockStateMatch { block_state: BlockStateData },
85}
86
87#[derive(Debug, Clone, Deserialize, Default)]
89#[serde(tag = "predicate_type")]
90pub enum PosRuleTestData {
91 #[default]
92 #[serde(rename = "minecraft:always_true")]
93 AlwaysTrue,
94 #[serde(rename = "minecraft:axis_aligned_linear_pos")]
95 AxisAlignedLinearPos {
96 #[serde(deserialize_with = "deserialize_processor_axis")]
97 axis: StructureProcessorAxis,
98 min_chance: f32,
99 max_chance: f32,
100 min_dist: i32,
101 max_dist: i32,
102 },
103}
104
105#[derive(Debug, Clone, Copy, PartialEq, Eq)]
107pub enum StructureProcessorAxis {
108 X,
109 Y,
110 Z,
111}
112
113fn deserialize_processor_axis<'de, D: Deserializer<'de>>(
114 deserializer: D,
115) -> Result<StructureProcessorAxis, D::Error> {
116 let value = String::deserialize(deserializer)?;
117 match value.as_str() {
118 "x" => Ok(StructureProcessorAxis::X),
119 "y" => Ok(StructureProcessorAxis::Y),
120 "z" => Ok(StructureProcessorAxis::Z),
121 _ => Err(D::Error::custom("invalid structure processor axis")),
122 }
123}
124
125#[derive(Debug, Clone, Deserialize, Default)]
127#[serde(tag = "type")]
128pub enum RuleBlockEntityModifierData {
129 #[default]
131 Passthrough,
132 #[serde(rename = "minecraft:append_loot")]
134 AppendLoot { loot_table: Identifier },
135}