BiomeHooks.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. /*
  2. * This file is part of architectury.
  3. * Copyright (C) 2020, 2021, 2022 architectury
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU Lesser General Public
  7. * License as published by the Free Software Foundation; either
  8. * version 3 of the License, or (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * Lesser General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Lesser General Public License
  16. * along with this program; if not, write to the Free Software Foundation,
  17. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. */
  19. package me.shedaniel.architectury.hooks.biome;
  20. import net.minecraft.sounds.Music;
  21. import net.minecraft.sounds.SoundEvent;
  22. import net.minecraft.world.entity.EntityType;
  23. import net.minecraft.world.entity.MobCategory;
  24. import net.minecraft.world.level.biome.*;
  25. import net.minecraft.world.level.biome.Biome.BiomeCategory;
  26. import net.minecraft.world.level.biome.BiomeSpecialEffects.GrassColorModifier;
  27. import net.minecraft.world.level.levelgen.GenerationStep;
  28. import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver;
  29. import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
  30. import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
  31. import net.minecraft.world.level.levelgen.surfacebuilders.ConfiguredSurfaceBuilder;
  32. import org.jetbrains.annotations.Nullable;
  33. import java.util.List;
  34. import java.util.Map;
  35. import java.util.Optional;
  36. import java.util.OptionalInt;
  37. import java.util.function.Supplier;
  38. public final class BiomeHooks {
  39. public static BiomeProperties getBiomeProperties(Biome biome) {
  40. return new BiomeWrapped(biome);
  41. }
  42. public static class BiomeWrapped implements BiomeProperties {
  43. protected final Biome biome;
  44. protected final ClimateProperties climateProperties;
  45. protected final EffectsProperties effectsProperties;
  46. protected final GenerationProperties generationProperties;
  47. protected final SpawnProperties spawnProperties;
  48. public BiomeWrapped(Biome biome) {
  49. this(biome,
  50. new ClimateWrapped(biome),
  51. new EffectsWrapped(biome),
  52. new GenerationSettingsWrapped(biome),
  53. new SpawnSettingsWrapped(biome));
  54. }
  55. public BiomeWrapped(Biome biome,
  56. ClimateProperties climateProperties,
  57. EffectsProperties effectsProperties,
  58. GenerationProperties generationProperties,
  59. SpawnProperties spawnProperties) {
  60. this.biome = biome;
  61. this.climateProperties = climateProperties;
  62. this.effectsProperties = effectsProperties;
  63. this.generationProperties = generationProperties;
  64. this.spawnProperties = spawnProperties;
  65. }
  66. @Override
  67. public ClimateProperties getClimateProperties() {
  68. return climateProperties;
  69. }
  70. @Override
  71. public EffectsProperties getEffectsProperties() {
  72. return effectsProperties;
  73. }
  74. @Override
  75. public GenerationProperties getGenerationProperties() {
  76. return generationProperties;
  77. }
  78. @Override
  79. public SpawnProperties getSpawnProperties() {
  80. return spawnProperties;
  81. }
  82. @Override
  83. public BiomeCategory getCategory() {
  84. return biome.biomeCategory;
  85. }
  86. @Override
  87. public float getDepth() {
  88. return biome.depth;
  89. }
  90. @Override
  91. public float getScale() {
  92. return biome.scale;
  93. }
  94. }
  95. public static class MutableBiomeWrapped extends BiomeWrapped implements BiomeProperties.Mutable {
  96. public MutableBiomeWrapped(Biome biome,
  97. GenerationProperties.Mutable generationProperties,
  98. SpawnProperties.Mutable spawnProperties) {
  99. this(biome,
  100. new ClimateWrapped(biome.climateSettings),
  101. new EffectsWrapped(biome.getSpecialEffects()),
  102. generationProperties,
  103. spawnProperties);
  104. }
  105. public MutableBiomeWrapped(Biome biome,
  106. ClimateProperties.Mutable climateProperties,
  107. EffectsProperties.Mutable effectsProperties,
  108. GenerationProperties.Mutable generationProperties,
  109. SpawnProperties.Mutable spawnProperties) {
  110. super(biome,
  111. climateProperties,
  112. effectsProperties,
  113. generationProperties,
  114. spawnProperties);
  115. }
  116. @Override
  117. public ClimateProperties.Mutable getClimateProperties() {
  118. return (ClimateProperties.Mutable) super.getClimateProperties();
  119. }
  120. @Override
  121. public EffectsProperties.Mutable getEffectsProperties() {
  122. return (EffectsProperties.Mutable) super.getEffectsProperties();
  123. }
  124. @Override
  125. public GenerationProperties.Mutable getGenerationProperties() {
  126. return (GenerationProperties.Mutable) super.getGenerationProperties();
  127. }
  128. @Override
  129. public SpawnProperties.Mutable getSpawnProperties() {
  130. return (SpawnProperties.Mutable) super.getSpawnProperties();
  131. }
  132. @Override
  133. public Mutable setCategory(BiomeCategory category) {
  134. biome.biomeCategory = category;
  135. return this;
  136. }
  137. @Override
  138. public Mutable setDepth(float depth) {
  139. biome.depth = depth;
  140. return this;
  141. }
  142. @Override
  143. public Mutable setScale(float scale) {
  144. biome.scale = scale;
  145. return this;
  146. }
  147. }
  148. public static class ClimateWrapped implements ClimateProperties.Mutable {
  149. protected final Biome.ClimateSettings climateSettings;
  150. public ClimateWrapped(Biome biome) {
  151. this(biome.climateSettings);
  152. }
  153. public ClimateWrapped(Biome.ClimateSettings climateSettings) {
  154. this.climateSettings = climateSettings;
  155. }
  156. @Override
  157. public Mutable setPrecipitation(Biome.Precipitation precipitation) {
  158. climateSettings.precipitation = precipitation;
  159. return this;
  160. }
  161. @Override
  162. public Mutable setTemperature(float temperature) {
  163. climateSettings.temperature = temperature;
  164. return this;
  165. }
  166. @Override
  167. public Mutable setTemperatureModifier(Biome.TemperatureModifier temperatureModifier) {
  168. climateSettings.temperatureModifier = temperatureModifier;
  169. return this;
  170. }
  171. @Override
  172. public Mutable setDownfall(float downfall) {
  173. climateSettings.downfall = downfall;
  174. return this;
  175. }
  176. @Override
  177. public Biome.Precipitation getPrecipitation() {
  178. return climateSettings.precipitation;
  179. }
  180. @Override
  181. public float getTemperature() {
  182. return climateSettings.temperature;
  183. }
  184. @Override
  185. public Biome.TemperatureModifier getTemperatureModifier() {
  186. return climateSettings.temperatureModifier;
  187. }
  188. @Override
  189. public float getDownfall() {
  190. return climateSettings.downfall;
  191. }
  192. }
  193. public static class EffectsWrapped implements EffectsProperties.Mutable {
  194. protected final BiomeSpecialEffects effects;
  195. public EffectsWrapped(Biome biome) {
  196. this(biome.getSpecialEffects());
  197. }
  198. public EffectsWrapped(BiomeSpecialEffects effects) {
  199. this.effects = effects;
  200. }
  201. @Override
  202. public EffectsProperties.Mutable setFogColor(int color) {
  203. effects.fogColor = color;
  204. return this;
  205. }
  206. @Override
  207. public EffectsProperties.Mutable setWaterColor(int color) {
  208. effects.waterColor = color;
  209. return this;
  210. }
  211. @Override
  212. public EffectsProperties.Mutable setWaterFogColor(int color) {
  213. effects.waterFogColor = color;
  214. return this;
  215. }
  216. @Override
  217. public EffectsProperties.Mutable setSkyColor(int color) {
  218. effects.skyColor = color;
  219. return this;
  220. }
  221. @Override
  222. public EffectsProperties.Mutable setFoliageColorOverride(@Nullable Integer colorOverride) {
  223. effects.foliageColorOverride = Optional.ofNullable(colorOverride);
  224. return this;
  225. }
  226. @Override
  227. public EffectsProperties.Mutable setGrassColorOverride(@Nullable Integer colorOverride) {
  228. effects.grassColorOverride = Optional.ofNullable(colorOverride);
  229. return this;
  230. }
  231. @Override
  232. public EffectsProperties.Mutable setGrassColorModifier(GrassColorModifier modifier) {
  233. effects.grassColorModifier = modifier;
  234. return this;
  235. }
  236. @Override
  237. public EffectsProperties.Mutable setAmbientParticle(@Nullable AmbientParticleSettings settings) {
  238. effects.ambientParticleSettings = Optional.ofNullable(settings);
  239. return this;
  240. }
  241. @Override
  242. public EffectsProperties.Mutable setAmbientLoopSound(@Nullable SoundEvent sound) {
  243. effects.ambientLoopSoundEvent = Optional.ofNullable(sound);
  244. return this;
  245. }
  246. @Override
  247. public EffectsProperties.Mutable setAmbientMoodSound(@Nullable AmbientMoodSettings settings) {
  248. effects.ambientMoodSettings = Optional.ofNullable(settings);
  249. return this;
  250. }
  251. @Override
  252. public EffectsProperties.Mutable setAmbientAdditionsSound(@Nullable AmbientAdditionsSettings settings) {
  253. effects.ambientAdditionsSettings = Optional.ofNullable(settings);
  254. return this;
  255. }
  256. @Override
  257. public EffectsProperties.Mutable setBackgroundMusic(@Nullable Music music) {
  258. effects.backgroundMusic = Optional.ofNullable(music);
  259. return this;
  260. }
  261. @Override
  262. public int getFogColor() {
  263. return effects.fogColor;
  264. }
  265. @Override
  266. public int getWaterColor() {
  267. return effects.waterColor;
  268. }
  269. @Override
  270. public int getWaterFogColor() {
  271. return effects.waterFogColor;
  272. }
  273. @Override
  274. public int getSkyColor() {
  275. return effects.skyColor;
  276. }
  277. @Override
  278. public OptionalInt getFoliageColorOverride() {
  279. return effects.foliageColorOverride.map(OptionalInt::of).orElseGet(OptionalInt::empty);
  280. }
  281. @Override
  282. public OptionalInt getGrassColorOverride() {
  283. return effects.grassColorOverride.map(OptionalInt::of).orElseGet(OptionalInt::empty);
  284. }
  285. @Override
  286. public GrassColorModifier getGrassColorModifier() {
  287. return effects.grassColorModifier;
  288. }
  289. @Override
  290. public Optional<AmbientParticleSettings> getAmbientParticle() {
  291. return effects.ambientParticleSettings;
  292. }
  293. @Override
  294. public Optional<SoundEvent> getAmbientLoopSound() {
  295. return effects.ambientLoopSoundEvent;
  296. }
  297. @Override
  298. public Optional<AmbientMoodSettings> getAmbientMoodSound() {
  299. return effects.ambientMoodSettings;
  300. }
  301. @Override
  302. public Optional<AmbientAdditionsSettings> getAmbientAdditionsSound() {
  303. return effects.ambientAdditionsSettings;
  304. }
  305. @Override
  306. public Optional<Music> getBackgroundMusic() {
  307. return effects.backgroundMusic;
  308. }
  309. }
  310. public static class GenerationSettingsWrapped implements GenerationProperties {
  311. protected final BiomeGenerationSettings settings;
  312. public GenerationSettingsWrapped(Biome biome) {
  313. this(biome.getGenerationSettings());
  314. }
  315. public GenerationSettingsWrapped(BiomeGenerationSettings settings) {
  316. this.settings = settings;
  317. }
  318. @Override
  319. public Optional<Supplier<ConfiguredSurfaceBuilder<?>>> getSurfaceBuilder() {
  320. return Optional.ofNullable(settings.getSurfaceBuilder());
  321. }
  322. @Override
  323. public List<Supplier<ConfiguredWorldCarver<?>>> getCarvers(GenerationStep.Carving carving) {
  324. return settings.getCarvers(carving);
  325. }
  326. @Override
  327. public List<Supplier<ConfiguredFeature<?, ?>>> getFeatures(GenerationStep.Decoration decoration) {
  328. return settings.features().get(decoration.ordinal());
  329. }
  330. @Override
  331. public List<List<Supplier<ConfiguredFeature<?, ?>>>> getFeatures() {
  332. return settings.features();
  333. }
  334. @Override
  335. public List<Supplier<ConfiguredStructureFeature<?, ?>>> getStructureStarts() {
  336. return (List<Supplier<ConfiguredStructureFeature<?, ?>>>) settings.structures();
  337. }
  338. }
  339. public static class SpawnSettingsWrapped implements SpawnProperties {
  340. protected final MobSpawnSettings settings;
  341. public SpawnSettingsWrapped(Biome biome) {
  342. this(biome.getMobSettings());
  343. }
  344. public SpawnSettingsWrapped(MobSpawnSettings settings) {
  345. this.settings = settings;
  346. }
  347. @Override
  348. public float getCreatureProbability() {
  349. return this.settings.getCreatureProbability();
  350. }
  351. @Override
  352. public Map<MobCategory, List<MobSpawnSettings.SpawnerData>> getSpawners() {
  353. return null;
  354. }
  355. @Override
  356. public Map<EntityType<?>, MobSpawnSettings.MobSpawnCost> getMobSpawnCosts() {
  357. return null;
  358. }
  359. @Override
  360. public boolean isPlayerSpawnFriendly() {
  361. return this.settings.playerSpawnFriendly();
  362. }
  363. }
  364. }