Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
minecraftforge
GitHub Repository: minecraftforge/minecraftforge
Path: blob/1.21.x/src/main/java/net/minecraftforge/common/world/ModifiableBiomeInfo.java
6513 views
1
/*
2
* Copyright (c) Forge Development LLC and contributors
3
* SPDX-License-Identifier: LGPL-2.1-only
4
*/
5
6
package net.minecraftforge.common.world;
7
8
import java.util.List;
9
import java.util.Locale;
10
11
import org.jetbrains.annotations.ApiStatus;
12
import org.jetbrains.annotations.NotNull;
13
import org.jetbrains.annotations.Nullable;
14
15
import net.minecraft.core.Holder;
16
import net.minecraft.world.level.biome.Biome;
17
import net.minecraft.world.level.biome.Biome.ClimateSettings;
18
import net.minecraft.world.level.biome.BiomeGenerationSettings;
19
import net.minecraft.world.level.biome.BiomeSpecialEffects;
20
import net.minecraft.world.level.biome.MobSpawnSettings;
21
22
/**
23
* Holds lazy-evaluable modified biome info.
24
* Memoizers are not used because it's important to return null
25
* without evaluating the biome info if it's accessed outside of a server context.
26
*/
27
public class ModifiableBiomeInfo {
28
@NotNull
29
private final BiomeInfo originalBiomeInfo;
30
@Nullable
31
private BiomeInfo modifiedBiomeInfo = null;
32
33
/**
34
* @param originalBiomeInfo BiomeInfo representing the original state of a biome when the biome was constructed.
35
*/
36
public ModifiableBiomeInfo(@NotNull final BiomeInfo originalBiomeInfo) {
37
this.originalBiomeInfo = originalBiomeInfo;
38
}
39
40
/**
41
* {@return The modified biome info if modified biome info has been generated, otherwise gets original biome info}
42
*/
43
@NotNull
44
public BiomeInfo get() {
45
return this.modifiedBiomeInfo == null
46
? originalBiomeInfo
47
: modifiedBiomeInfo;
48
}
49
50
/**
51
* {@return The original biome info that the associated biome was created with}
52
*/
53
@NotNull
54
public BiomeInfo getOriginalBiomeInfo() {
55
return this.originalBiomeInfo;
56
}
57
58
/**
59
* {@return Modified biome info; null if it hasn't been set yet}
60
*/
61
@Nullable
62
public BiomeInfo getModifiedBiomeInfo() {
63
return this.modifiedBiomeInfo;
64
}
65
66
/**
67
* Internal forge method; the game will crash if mods invoke this.
68
* Creates and caches the modified biome info.
69
* @param biome named biome with original data.
70
* @param biomeModifiers biome modifiers to apply.
71
*
72
* @throws IllegalStateException if invoked more than once.
73
*/
74
@ApiStatus.Internal
75
public void applyBiomeModifiers(final Holder<Biome> biome, final List<BiomeModifier> biomeModifiers) {
76
if (this.modifiedBiomeInfo != null)
77
throw new IllegalStateException(String.format(Locale.ENGLISH, "Biome %s already modified", biome));
78
79
var original = this.getOriginalBiomeInfo();
80
var builder = BiomeInfo.Builder.copyOf(original);
81
for (var phase : BiomeModifier.Phase.values()) {
82
for (var modifier : biomeModifiers)
83
modifier.modify(biome, phase, builder);
84
}
85
this.modifiedBiomeInfo = builder.build();
86
}
87
88
/**
89
* Record containing raw biome data.
90
* @param climateSettings Weather and temperature settings.
91
* @param effects Client-relevant effects for rendering and sound.
92
* @param generationSettings Worldgen features and carvers.
93
* @param mobSpawnSettings Mob spawn settings.
94
*/
95
public record BiomeInfo(ClimateSettings climateSettings, BiomeSpecialEffects effects, BiomeGenerationSettings generationSettings, MobSpawnSettings mobSpawnSettings) {
96
public static class Builder {
97
private ClimateSettingsBuilder climateSettings;
98
private BiomeSpecialEffectsBuilder effects;
99
private BiomeGenerationSettings.PlainBuilder generationSettings;
100
private MobSpawnSettingsBuilder mobSpawnSettings;
101
102
/**
103
* @param original the biome to copy
104
* @return A ModifiedBiomeInfo.Builder with a copy of the biome's data
105
*/
106
public static Builder copyOf(final BiomeInfo original) {
107
final ClimateSettingsBuilder climateBuilder = ClimateSettingsBuilder.copyOf(original.climateSettings());
108
final BiomeSpecialEffectsBuilder effectsBuilder = BiomeSpecialEffectsBuilder.copyOf(original.effects());
109
final var generationBuilder = new BiomeGenerationSettings.PlainBuilder();
110
generationBuilder.addFrom(original.generationSettings());
111
final MobSpawnSettingsBuilder mobSpawnBuilder = new MobSpawnSettingsBuilder(original.mobSpawnSettings());
112
113
return new Builder(
114
climateBuilder,
115
effectsBuilder,
116
generationBuilder,
117
mobSpawnBuilder
118
);
119
}
120
121
private Builder(final ClimateSettingsBuilder climateSettings, final BiomeSpecialEffectsBuilder effects, final BiomeGenerationSettings.PlainBuilder generationSettings, final MobSpawnSettingsBuilder mobSpawnSettings) {
122
this.climateSettings = climateSettings;
123
this.effects = effects;
124
this.generationSettings = generationSettings;
125
this.mobSpawnSettings = mobSpawnSettings;
126
}
127
128
public BiomeInfo build() {
129
return new BiomeInfo(this.climateSettings.build(), this.effects.build(), this.generationSettings.build(), this.mobSpawnSettings.build());
130
}
131
132
public ClimateSettingsBuilder getClimateSettings() {
133
return climateSettings;
134
}
135
136
public BiomeSpecialEffectsBuilder getSpecialEffects() {
137
return effects;
138
}
139
140
public BiomeGenerationSettings.PlainBuilder getGenerationSettings() {
141
return generationSettings;
142
}
143
144
public MobSpawnSettingsBuilder getMobSpawnSettings() {
145
return mobSpawnSettings;
146
}
147
}
148
}
149
}
150
151