Skip to content

Commit fbe13bb

Browse files
feat: geodes (#1697)
Signed-off-by: Alexander Medvedev <lilalexmed@proton.me> Co-authored-by: Alexander Medvedev <lilalexmed@proton.me>
1 parent 33531d3 commit fbe13bb

File tree

5 files changed

+548
-8
lines changed

5 files changed

+548
-8
lines changed

pumpkin-codegen/src/configured_feature.rs

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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 {}) },

pumpkin-data/src/generated/configured_features_generated.rs

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ fn build_configured_features() -> std::collections::HashMap<String, ConfiguredFe
2020
block_column::{BlockColumnFeature, Layer},
2121
end_spike::{EndSpikeFeature, Spike},
2222
fallen_tree::FallenTreeFeature,
23+
geode::GeodeFeature,
2324
nether_forest_vegetation::NetherForestVegetationFeature,
2425
netherrack_replace_blobs::ReplaceBlobsFeature,
2526
ore::{OreFeature, OreTarget},
@@ -144,7 +145,108 @@ fn build_configured_features() -> std::collections::HashMap<String, ConfiguredFe
144145
);
145146
map.insert(
146147
"amethyst_geode".to_string(),
147-
ConfiguredFeature::Geode(crate::generation::feature::features::geode::GeodeFeature {}),
148+
ConfiguredFeature::Geode(Box::new(GeodeFeature {
149+
filling_provider: BlockStateProvider::Simple(SimpleStateProvider {
150+
state: BlockStateCodec {
151+
name: &pumpkin_data::Block::AIR,
152+
properties: None,
153+
},
154+
}),
155+
inner_layer_provider: BlockStateProvider::Simple(SimpleStateProvider {
156+
state: BlockStateCodec {
157+
name: &pumpkin_data::Block::AMETHYST_BLOCK,
158+
properties: None,
159+
},
160+
}),
161+
alternate_inner_layer_provider: BlockStateProvider::Simple(SimpleStateProvider {
162+
state: BlockStateCodec {
163+
name: &pumpkin_data::Block::BUDDING_AMETHYST,
164+
properties: None,
165+
},
166+
}),
167+
middle_layer_provider: BlockStateProvider::Simple(SimpleStateProvider {
168+
state: BlockStateCodec {
169+
name: &pumpkin_data::Block::CALCITE,
170+
properties: None,
171+
},
172+
}),
173+
outer_layer_provider: BlockStateProvider::Simple(SimpleStateProvider {
174+
state: BlockStateCodec {
175+
name: &pumpkin_data::Block::SMOOTH_BASALT,
176+
properties: None,
177+
},
178+
}),
179+
inner_placements: vec![
180+
{
181+
let mut props = std::collections::HashMap::new();
182+
props.insert("facing".to_string(), "up".to_string());
183+
props.insert("waterlogged".to_string(), "false".to_string());
184+
BlockStateCodec {
185+
name: &pumpkin_data::Block::SMALL_AMETHYST_BUD,
186+
properties: Some(props),
187+
}
188+
},
189+
{
190+
let mut props = std::collections::HashMap::new();
191+
props.insert("facing".to_string(), "up".to_string());
192+
props.insert("waterlogged".to_string(), "false".to_string());
193+
BlockStateCodec {
194+
name: &pumpkin_data::Block::MEDIUM_AMETHYST_BUD,
195+
properties: Some(props),
196+
}
197+
},
198+
{
199+
let mut props = std::collections::HashMap::new();
200+
props.insert("facing".to_string(), "up".to_string());
201+
props.insert("waterlogged".to_string(), "false".to_string());
202+
BlockStateCodec {
203+
name: &pumpkin_data::Block::LARGE_AMETHYST_BUD,
204+
properties: Some(props),
205+
}
206+
},
207+
{
208+
let mut props = std::collections::HashMap::new();
209+
props.insert("facing".to_string(), "up".to_string());
210+
props.insert("waterlogged".to_string(), "false".to_string());
211+
BlockStateCodec {
212+
name: &pumpkin_data::Block::AMETHYST_CLUSTER,
213+
properties: Some(props),
214+
}
215+
},
216+
],
217+
cannot_replace: BlockWrapper::Single("#minecraft:features_cannot_replace".to_string()),
218+
invalid_blocks: BlockWrapper::Single("#minecraft:geode_invalid_blocks".to_string()),
219+
filling: 1.7f64,
220+
inner_layer: 2.2f64,
221+
middle_layer: 3.2f64,
222+
outer_layer: 4.2f64,
223+
generate_crack_chance: 0.95f64,
224+
base_crack_size: 2f64,
225+
crack_point_offset: 2i32,
226+
use_potential_placements_chance: 0.35f64,
227+
use_alternate_layer0_chance: 0.083f64,
228+
placements_require_layer0_alternate: true,
229+
outer_wall_distance: IntProvider::Object(NormalIntProvider::Uniform(
230+
UniformIntProvider {
231+
min_inclusive: 4i32,
232+
max_inclusive: 6i32,
233+
},
234+
)),
235+
distribution_points: IntProvider::Object(NormalIntProvider::Uniform(
236+
UniformIntProvider {
237+
min_inclusive: 3i32,
238+
max_inclusive: 4i32,
239+
},
240+
)),
241+
point_offset: IntProvider::Object(NormalIntProvider::Uniform(UniformIntProvider {
242+
min_inclusive: 1i32,
243+
max_inclusive: 2i32,
244+
})),
245+
min_gen_offset: -16i32,
246+
max_gen_offset: 16i32,
247+
noise_multiplier: 0.05f64,
248+
invalid_blocks_threshold: 1i32,
249+
})),
148250
);
149251
map.insert(
150252
"azalea_tree".to_string(),

pumpkin-data/src/generated/tag.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ use pumpkin_util::version::MinecraftVersion;
33
pub type Tag = (&'static [&'static str], &'static [u16]);
44
#[derive(Eq, PartialEq, Hash, Debug, Clone, Copy)]
55
pub enum RegistryKey {
6-
BannerPattern,
7-
Block,
86
CatVariant,
97
DamageType,
108
Dialog,
9+
BannerPattern,
10+
Block,
1111
DimensionType,
1212
Enchantment,
1313
EntityType,
@@ -27,8 +27,8 @@ impl RegistryKey {
2727
"block" => Some(Self::Block),
2828
"cat_variant" => Some(Self::CatVariant),
2929
"damage_type" => Some(Self::DamageType),
30-
"dialog" => Some(Self::Dialog),
3130
"dimension_type" => Some(Self::DimensionType),
31+
"dialog" => Some(Self::Dialog),
3232
"enchantment" => Some(Self::Enchantment),
3333
"entity_type" => Some(Self::EntityType),
3434
"fluid" => Some(Self::Fluid),
@@ -48,8 +48,8 @@ impl RegistryKey {
4848
Self::Block => "block",
4949
Self::CatVariant => "cat_variant",
5050
Self::DamageType => "damage_type",
51-
Self::Dialog => "dialog",
5251
Self::DimensionType => "dimension_type",
52+
Self::Dialog => "dialog",
5353
Self::Enchantment => "enchantment",
5454
Self::EntityType => "entity_type",
5555
Self::Fluid => "fluid",

pumpkin-world/src/generation/feature/configured_features.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ pub enum ConfiguredFeature {
131131
RandomSelector(RandomFeature),
132132
SimpleRandomSelector(SimpleRandomFeature),
133133
RandomBooleanSelector(RandomBooleanFeature),
134-
Geode(GeodeFeature),
134+
Geode(Box<GeodeFeature>),
135135
DripstoneCluster(DripstoneClusterFeature),
136136
LargeDripstone(LargeDripstoneFeature),
137137
PointedDripstone(SmallDripstoneFeature),
@@ -294,6 +294,15 @@ impl ConfiguredFeature {
294294
Self::SeaPickle(feature) => {
295295
feature.generate(chunk, min_y, height, feature_name, random, pos)
296296
}
297+
Self::Geode(feature) => feature.generate(
298+
chunk,
299+
block_registry,
300+
min_y,
301+
height,
302+
feature_name,
303+
random,
304+
pos,
305+
),
297306
Self::Kelp(feature) => {
298307
feature.generate(chunk, min_y, height, feature_name, random, pos)
299308
}

0 commit comments

Comments
 (0)