@@ -89,6 +89,7 @@ pub fn build() -> TokenStream {
8989 simple_block:: SimpleBlockFeature ,
9090 simple_random_selector:: SimpleRandomFeature ,
9191 spring_feature:: { BlockWrapper , SpringFeatureFeature } ,
92+ geode:: GeodeFeature ,
9293 tree:: TreeFeature ,
9394 tree:: trunk:: { TrunkPlacer , TrunkType ,
9495 bending:: BendingTrunkPlacer ,
@@ -365,10 +366,80 @@ pub fn value_to_configured_feature(v: &Value) -> TokenStream {
365366 } )
366367 }
367368 }
369+ "minecraft:geode" => {
370+ let blocks = & config[ "blocks" ] ;
371+ let filling_provider = value_to_block_state_provider ( & blocks[ "filling_provider" ] ) ;
372+ let inner_layer_provider = value_to_block_state_provider ( & blocks[ "inner_layer_provider" ] ) ;
373+ let alternate_inner_layer_provider =
374+ value_to_block_state_provider ( & blocks[ "alternate_inner_layer_provider" ] ) ;
375+ let middle_layer_provider = value_to_block_state_provider ( & blocks[ "middle_layer_provider" ] ) ;
376+ let outer_layer_provider = value_to_block_state_provider ( & blocks[ "outer_layer_provider" ] ) ;
377+ let inner_placements: Vec < TokenStream > = blocks[ "inner_placements" ]
378+ . as_array ( )
379+ . map ( |arr| arr. iter ( ) . map ( |s| value_to_block_state_codec ( s) ) . collect ( ) )
380+ . unwrap_or_default ( ) ;
381+ let cannot_replace = value_to_block_wrapper ( & blocks[ "cannot_replace" ] ) ;
382+ let invalid_blocks = value_to_block_wrapper ( & blocks[ "invalid_blocks" ] ) ;
383+
384+ let layers = & config[ "layers" ] ;
385+ let filling = layers[ "filling" ] . as_f64 ( ) . unwrap_or ( 1.7 ) ;
386+ let inner_layer = layers[ "inner_layer" ] . as_f64 ( ) . unwrap_or ( 2.2 ) ;
387+ let middle_layer = layers[ "middle_layer" ] . as_f64 ( ) . unwrap_or ( 3.2 ) ;
388+ let outer_layer = layers[ "outer_layer" ] . as_f64 ( ) . unwrap_or ( 4.2 ) ;
389+
390+ let crack = & config[ "crack" ] ;
391+ let generate_crack_chance = crack[ "generate_crack_chance" ] . as_f64 ( ) . unwrap_or ( 1.0 ) ;
392+ let base_crack_size = crack[ "base_crack_size" ] . as_f64 ( ) . unwrap_or ( 2.0 ) ;
393+ let crack_point_offset = crack[ "crack_point_offset" ] . as_i64 ( ) . unwrap_or ( 2 ) as i32 ;
394+
395+ let use_potential_placements_chance =
396+ config[ "use_potential_placements_chance" ] . as_f64 ( ) . unwrap_or ( 0.35 ) ;
397+ let use_alternate_layer0_chance =
398+ config[ "use_alternate_layer0_chance" ] . as_f64 ( ) . unwrap_or ( 0.0 ) ;
399+ let placements_require_layer0_alternate =
400+ config[ "placements_require_layer0_alternate" ] . as_bool ( ) . unwrap_or ( true ) ;
401+ let outer_wall_distance = value_to_int_provider ( & config[ "outer_wall_distance" ] ) ;
402+ let distribution_points = value_to_int_provider ( & config[ "distribution_points" ] ) ;
403+ let point_offset = value_to_int_provider ( & config[ "point_offset" ] ) ;
404+ let min_gen_offset = config[ "min_gen_offset" ] . as_i64 ( ) . unwrap_or ( -16 ) as i32 ;
405+ let max_gen_offset = config[ "max_gen_offset" ] . as_i64 ( ) . unwrap_or ( 16 ) as i32 ;
406+ let noise_multiplier = config[ "noise_multiplier" ] . as_f64 ( ) . unwrap_or ( 0.05 ) ;
407+ let invalid_blocks_threshold =
408+ config[ "invalid_blocks_threshold" ] . as_i64 ( ) . unwrap_or ( 0 ) as i32 ;
409+
410+ quote ! {
411+ ConfiguredFeature :: Geode ( Box :: new( GeodeFeature {
412+ filling_provider: #filling_provider,
413+ inner_layer_provider: #inner_layer_provider,
414+ alternate_inner_layer_provider: #alternate_inner_layer_provider,
415+ middle_layer_provider: #middle_layer_provider,
416+ outer_layer_provider: #outer_layer_provider,
417+ inner_placements: vec![ #( #inner_placements) , * ] ,
418+ cannot_replace: #cannot_replace,
419+ invalid_blocks: #invalid_blocks,
420+ filling: #filling,
421+ inner_layer: #inner_layer,
422+ middle_layer: #middle_layer,
423+ outer_layer: #outer_layer,
424+ generate_crack_chance: #generate_crack_chance,
425+ base_crack_size: #base_crack_size,
426+ crack_point_offset: #crack_point_offset,
427+ use_potential_placements_chance: #use_potential_placements_chance,
428+ use_alternate_layer0_chance: #use_alternate_layer0_chance,
429+ placements_require_layer0_alternate: #placements_require_layer0_alternate,
430+ outer_wall_distance: #outer_wall_distance,
431+ distribution_points: #distribution_points,
432+ point_offset: #point_offset,
433+ min_gen_offset: #min_gen_offset,
434+ max_gen_offset: #max_gen_offset,
435+ noise_multiplier: #noise_multiplier,
436+ invalid_blocks_threshold: #invalid_blocks_threshold,
437+ } ) )
438+ }
439+ } ,
368440 "minecraft:monster_room" => quote ! { ConfiguredFeature :: MonsterRoom ( crate :: generation:: feature:: features:: monster_room:: DungeonFeature { } ) } ,
369441
370442 // All TODO/empty features
371- "minecraft:geode" => quote ! { ConfiguredFeature :: Geode ( crate :: generation:: feature:: features:: geode:: GeodeFeature { } ) } ,
372443 "minecraft:fossil" => quote ! { ConfiguredFeature :: Fossil ( crate :: generation:: feature:: features:: fossil:: FossilFeature { } ) } ,
373444 "minecraft:lake" => quote ! { ConfiguredFeature :: Lake ( crate :: generation:: feature:: features:: lake:: LakeFeature { } ) } ,
374445 "minecraft:disk" => quote ! { ConfiguredFeature :: Disk ( crate :: generation:: feature:: features:: disk:: DiskFeature { } ) } ,
0 commit comments