-
-
Notifications
You must be signed in to change notification settings - Fork 103
/
BiomeNMS_v1_12_R1.java
116 lines (98 loc) · 3.64 KB
/
BiomeNMS_v1_12_R1.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
106
107
108
109
110
111
112
113
114
115
116
package net.aufdemrand.denizen.nms.impl;
import net.aufdemrand.denizen.nms.abstracts.BiomeNMS;
import net.aufdemrand.denizen.nms.util.ReflectionHelper;
import net.minecraft.server.v1_12_R1.BiomeBase;
import net.minecraft.server.v1_12_R1.BlockPosition;
import net.minecraft.server.v1_12_R1.Chunk;
import net.minecraft.server.v1_12_R1.EntityTypes;
import net.minecraft.server.v1_12_R1.EnumCreatureType;
import net.minecraft.server.v1_12_R1.WorldServer;
import org.bukkit.Location;
import org.bukkit.block.Biome;
import org.bukkit.craftbukkit.v1_12_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_12_R1.block.CraftBlock;
import org.bukkit.entity.EntityType;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class BiomeNMS_v1_12_R1 extends BiomeNMS {
private final BiomeBase biomeBase;
public BiomeNMS_v1_12_R1(Biome biome) {
super(biome);
this.biomeBase = CraftBlock.biomeToBiomeBase(biome);
}
@Override
public float getHumidity() {
return biomeBase.getHumidity();
}
@Override
public float getTemperature() {
return biomeBase.getTemperature();
}
@Override
public List<EntityType> getAmbientEntities() {
return getSpawnableEntities(EnumCreatureType.AMBIENT);
}
@Override
public List<EntityType> getCreatureEntities() {
return getSpawnableEntities(EnumCreatureType.CREATURE);
}
@Override
public List<EntityType> getMonsterEntities() {
return getSpawnableEntities(EnumCreatureType.MONSTER);
}
@Override
public List<EntityType> getWaterEntities() {
return getSpawnableEntities(EnumCreatureType.WATER_CREATURE);
}
@Override
public void setHumidity(float humidity) {
ReflectionHelper.setFieldValue(BiomeBase.class, "C", biomeBase, humidity);
}
@Override
public void setTemperature(float temperature) {
ReflectionHelper.setFieldValue(BiomeBase.class, "B", biomeBase, temperature);
}
@Override
public void changeBlockBiome(Location location) {
int x = location.getBlockX();
int z = location.getBlockZ();
WorldServer world = ((CraftWorld) location.getWorld()).getHandle();
if (world.isLoaded(new BlockPosition(x, 0, z))) {
Chunk chunk = world.getChunkAtWorldCoords(new BlockPosition(x, 0, z));
if (chunk != null) {
byte[] biomevals = chunk.getBiomeIndex();
biomevals[((z & 0xF) << 4) | (x & 0xF)] = (byte) BiomeBase.a(biomeBase);
}
}
}
@Override
protected boolean getDoesRain() {
Boolean rains = ReflectionHelper.getFieldValue(BiomeBase.class, "F", biomeBase);
if (rains != null) {
return rains;
}
return false;
}
@Override
protected boolean getDoesSnow() {
Boolean rains = ReflectionHelper.getFieldValue(BiomeBase.class, "E", biomeBase);
if (rains != null) {
return rains;
}
return false;
}
private List<EntityType> getSpawnableEntities(EnumCreatureType creatureType) {
List<EntityType> entityTypes = new ArrayList<EntityType>();
for (BiomeBase.BiomeMeta meta : biomeBase.getMobs(creatureType)) {
// TODO: verifyme!
String n = EntityTypes.getName(meta.b).b();
EntityType et = EntityType.fromName(n);
if (et == null) {
et = EntityType.valueOf(n.toUpperCase(Locale.ENGLISH));
}
entityTypes.add(et);
}
return entityTypes;
}
}