-
-
Notifications
You must be signed in to change notification settings - Fork 103
/
BiomeNMSImpl.java
105 lines (89 loc) · 3.94 KB
/
BiomeNMSImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package com.denizenscript.denizen.nms.v1_17.impl;
import com.denizenscript.denizen.nms.abstracts.BiomeNMS;
import com.denizenscript.denizen.nms.v1_17.ReflectionMappingsInfo;
import com.denizenscript.denizencore.utilities.ReflectionHelper;
import net.minecraft.core.Registry;
import net.minecraft.util.random.WeightedRandomList;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.level.biome.MobSpawnSettings;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.craftbukkit.v1_17_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_17_R1.block.CraftBlock;
import org.bukkit.entity.EntityType;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class BiomeNMSImpl extends BiomeNMS {
public net.minecraft.world.level.biome.Biome biomeBase;
public BiomeNMSImpl(Biome biome) {
super(biome);
World world = Bukkit.getWorlds().get(0); // TODO: Biomes can now be world-unique as of 1.16.2
this.biomeBase = CraftBlock.biomeToBiomeBase(((CraftWorld) world).getHandle().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), biome);
}
@Override
public float getHumidity() {
return biomeBase.getDownfall();
}
@Override
public float getTemperature() {
return biomeBase.getBaseTemperature();
}
@Override
public List<EntityType> getAmbientEntities() {
return getSpawnableEntities(MobCategory.AMBIENT);
}
@Override
public List<EntityType> getCreatureEntities() {
return getSpawnableEntities(MobCategory.CREATURE);
}
@Override
public List<EntityType> getMonsterEntities() {
return getSpawnableEntities(MobCategory.MONSTER);
}
@Override
public List<EntityType> getWaterEntities() {
return getSpawnableEntities(MobCategory.WATER_CREATURE);
}
@Override
public void setHumidity(float humidity) {
Object climate = ReflectionHelper.getFieldValue(net.minecraft.world.level.biome.Biome.class, ReflectionMappingsInfo.Biome_climateSettings, biomeBase);
ReflectionHelper.setFieldValue(climate.getClass(), ReflectionMappingsInfo.Biome_ClimateSettings_downfall, climate, humidity);
}
@Override
public void setTemperature(float temperature) {
Object climate = ReflectionHelper.getFieldValue(net.minecraft.world.level.biome.Biome.class, ReflectionMappingsInfo.Biome_climateSettings, biomeBase);
ReflectionHelper.setFieldValue(climate.getClass(), ReflectionMappingsInfo.Biome_ClimateSettings_temperature, climate, temperature);
}
@Override
protected boolean getDoesRain() {
return biomeBase.getPrecipitation() == net.minecraft.world.level.biome.Biome.Precipitation.RAIN;
}
@Override
protected boolean getDoesSnow() {
return biomeBase.getPrecipitation() == net.minecraft.world.level.biome.Biome.Precipitation.SNOW;
}
private List<EntityType> getSpawnableEntities(MobCategory creatureType) {
MobSpawnSettings mobs = biomeBase.getMobSettings();
WeightedRandomList<MobSpawnSettings.SpawnerData> typeSettingList = mobs.getMobs(creatureType);
List<EntityType> entityTypes = new ArrayList<>();
if (typeSettingList == null) {
return entityTypes;
}
for (MobSpawnSettings.SpawnerData meta : typeSettingList.unwrap()) {
try {
String n = net.minecraft.world.entity.EntityType.getKey(meta.type).getPath();
EntityType et = EntityType.fromName(n);
if (et == null) {
et = EntityType.valueOf(n.toUpperCase(Locale.ENGLISH));
}
entityTypes.add(et);
}
catch (Throwable e) {
// Ignore the error. Likely from invalid entity type name output.
}
}
return entityTypes;
}
}