52
52
import com .google .common .collect .ImmutableMap ;
53
53
import com .google .common .collect .Lists ;
54
54
55
+ import com .mojang .serialization .DataResult ;
56
+ import net .minecraft .nbt .DynamicOpsNBT ;
57
+ import net .minecraft .nbt .NBTTagCompound ;
58
+ import net .minecraft .world .level .dimension .DimensionManager ;
55
59
import org .bukkit .*;
56
60
import org .bukkit .advancement .Advancement ;
61
+ import org .bukkit .craftbukkit .v1_17_R1 .CraftWorld ;
57
62
import org .bukkit .entity .Entity ;
58
63
import org .bukkit .entity .EntityType ;
59
64
import org .bukkit .inventory .ItemStack ;
@@ -1292,6 +1297,32 @@ static DimensionImpl fromId(int id) {
1292
1297
}
1293
1298
}
1294
1299
1300
+ private static FieldAccessor dimensionKey ;
1301
+
1302
+ public static EquivalentConverter <World > getDimensionConverter () {
1303
+ return ignoreNull (new EquivalentConverter <World >() {
1304
+ @ Override
1305
+ public Object getGeneric (World specific ) {
1306
+ return ((CraftWorld ) specific ).getHandle ().getDimensionManager ();
1307
+ }
1308
+
1309
+ @ Override
1310
+ public World getSpecific (Object generic ) {
1311
+ for (World world : Bukkit .getWorlds ()) {
1312
+ if (((CraftWorld ) world ).getHandle ().getDimensionManager () == generic ) {
1313
+ return world ;
1314
+ }
1315
+ }
1316
+ throw new IllegalArgumentException ();
1317
+ }
1318
+
1319
+ @ Override
1320
+ public Class <World > getSpecificType () {
1321
+ return World .class ;
1322
+ }
1323
+ });
1324
+ }
1325
+
1295
1326
public static EquivalentConverter <Integer > getDimensionIDConverter () {
1296
1327
return ignoreNull (new EquivalentConverter <Integer >() {
1297
1328
@ Override
@@ -1300,6 +1331,32 @@ public Object getGeneric(Integer specific) {
1300
1331
dimensionManager = MinecraftReflection .getDimensionManager ();
1301
1332
}
1302
1333
1334
+ if (MinecraftVersion .CAVES_CLIFFS_1 .atOrAbove ()) {
1335
+ World world = null ;
1336
+ if (specific == 0 ) {
1337
+ world = Bukkit .getWorlds ().get (0 );
1338
+ } else if (specific == -1 ) {
1339
+ for (World world1 : Bukkit .getWorlds ()) {
1340
+ if (world1 .getEnvironment () == World .Environment .NETHER ) {
1341
+ world = world1 ;
1342
+ break ;
1343
+ }
1344
+ }
1345
+ } else if (specific == 1 ) {
1346
+ for (World world1 : Bukkit .getWorlds ()) {
1347
+ if (world1 .getEnvironment () == World .Environment .THE_END ) {
1348
+ world = world1 ;
1349
+ break ;
1350
+ }
1351
+ }
1352
+ }
1353
+
1354
+ if (world != null ) {
1355
+ return ((CraftWorld ) world ).getHandle ().getDimensionManager ();
1356
+ }
1357
+
1358
+ throw new IllegalArgumentException ();
1359
+ }
1303
1360
if (MinecraftVersion .NETHER_UPDATE_2 .atOrAbove ()) {
1304
1361
if (dimensionImplConverter == null ) {
1305
1362
dimensionImplConverter = new FauxEnumConverter <>(DimensionImpl .class , dimensionManager );
@@ -1336,6 +1393,28 @@ public Integer getSpecific(Object generic) {
1336
1393
dimensionManager = MinecraftReflection .getDimensionManager ();
1337
1394
}
1338
1395
1396
+ if (MinecraftVersion .CAVES_CLIFFS_1 .atOrAbove ()) {
1397
+ if (dimensionKey == null ) {
1398
+ FuzzyReflection fuzzy = FuzzyReflection .fromClass (dimensionManager , false );
1399
+ dimensionKey = Accessors .getFieldAccessor (fuzzy .getField (FuzzyFieldContract
1400
+ .newBuilder ()
1401
+ .typeExact (MinecraftReflection .getMinecraftKeyClass ())
1402
+ .banModifier (Modifier .STATIC )
1403
+ .build ()));
1404
+ }
1405
+
1406
+ MinecraftKey key = MinecraftKey .fromHandle (dimensionKey .get (generic ));
1407
+ switch (key .getKey ()) {
1408
+ case "overworld" :
1409
+ return Dimension .OVERWORLD .getId ();
1410
+ case "the_nether" :
1411
+ return Dimension .THE_NETHER .getId ();
1412
+ case "the_end" :
1413
+ return Dimension .THE_END .getId ();
1414
+ default :
1415
+ throw new IllegalArgumentException ("id not supported for extra dimensions" );
1416
+ }
1417
+ }
1339
1418
if (MinecraftVersion .NETHER_UPDATE_2 .atOrAbove ()) {
1340
1419
if (dimensionImplConverter == null ) {
1341
1420
dimensionImplConverter = new FauxEnumConverter <>(DimensionImpl .class , dimensionManager );
0 commit comments