Skip to content

Commit 6fdf0f8

Browse files
committed
Add modifier for dimensions
1 parent 7e12f57 commit 6fdf0f8

File tree

3 files changed

+69
-4
lines changed

3 files changed

+69
-4
lines changed

modules/API/src/main/java/com/comphenix/protocol/events/PacketContainer.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@
4242
import com.comphenix.protocol.utility.StreamSerializer;
4343
import com.comphenix.protocol.wrappers.*;
4444
import com.comphenix.protocol.wrappers.EnumWrappers.*;
45-
import com.comphenix.protocol.wrappers.EnumWrappers.Difficulty;
46-
import com.comphenix.protocol.wrappers.EnumWrappers.SoundCategory;
4745
import com.comphenix.protocol.wrappers.nbt.NbtBase;
4846
import com.comphenix.protocol.wrappers.nbt.NbtCompound;
4947
import com.comphenix.protocol.wrappers.nbt.NbtFactory;
@@ -55,8 +53,10 @@
5553
import io.netty.buffer.ByteBuf;
5654
import io.netty.buffer.UnpooledByteBufAllocator;
5755

58-
import org.bukkit.*;
59-
import org.bukkit.Particle;
56+
import org.bukkit.Material;
57+
import org.bukkit.Sound;
58+
import org.bukkit.World;
59+
import org.bukkit.WorldType;
6060
import org.bukkit.entity.Entity;
6161
import org.bukkit.inventory.ItemStack;
6262
import org.bukkit.potion.PotionEffectType;
@@ -936,6 +936,17 @@ public StructureModifier<MinecraftKey> getMinecraftKeys() {
936936
MinecraftKey.getConverter());
937937
}
938938

939+
/**
940+
* Retrive a read/write structure for dimension IDs in 1.13.1+
941+
* @return A modifier for dimension IDs
942+
*/
943+
public StructureModifier<Integer> getDimensions() {
944+
return structureModifier.withType(
945+
MinecraftReflection.getMinecraftClass("DimensionManager"),
946+
BukkitConverters.getDimensionIDConverter()
947+
);
948+
}
949+
939950
/**
940951
* Retrieve a read/write structure for the Map class.
941952
* @param keyConverter Converter for map keys

modules/API/src/main/java/com/comphenix/protocol/wrappers/BukkitConverters.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,4 +1070,51 @@ public PotionEffectType getSpecific(Object generic) {
10701070
}
10711071
});
10721072
}
1073+
1074+
private static MethodAccessor dimensionFromId = null;
1075+
private static MethodAccessor idFromDimension = null;
1076+
1077+
public static EquivalentConverter<Integer> getDimensionIDConverter() {
1078+
return new EquivalentConverter<Integer>() {
1079+
1080+
@Override
1081+
public Object getGeneric(Integer specific) {
1082+
if (dimensionFromId == null) {
1083+
Class<?> clazz = MinecraftReflection.getMinecraftClass("DimensionManager");
1084+
FuzzyReflection reflection = FuzzyReflection.fromClass(clazz, false);
1085+
FuzzyMethodContract contract = FuzzyMethodContract
1086+
.newBuilder()
1087+
.requireModifier(Modifier.STATIC)
1088+
.parameterExactType(int.class)
1089+
.returnTypeExact(clazz)
1090+
.build();
1091+
dimensionFromId = Accessors.getMethodAccessor(reflection.getMethod(contract));
1092+
}
1093+
1094+
return dimensionFromId.invoke(null, (int) specific);
1095+
}
1096+
1097+
@Override
1098+
public Integer getSpecific(Object generic) {
1099+
if (idFromDimension == null) {
1100+
Class<?> clazz = MinecraftReflection.getMinecraftClass("DimensionManager");
1101+
FuzzyReflection reflection = FuzzyReflection.fromClass(clazz, false);
1102+
FuzzyMethodContract contract = FuzzyMethodContract
1103+
.newBuilder()
1104+
.banModifier(Modifier.STATIC)
1105+
.returnTypeExact(int.class)
1106+
.parameterCount(0)
1107+
.build();
1108+
idFromDimension = Accessors.getMethodAccessor(reflection.getMethod(contract));
1109+
}
1110+
1111+
return (Integer) idFromDimension.invoke(generic);
1112+
}
1113+
1114+
@Override
1115+
public Class<Integer> getSpecificType() {
1116+
return Integer.class;
1117+
}
1118+
};
1119+
}
10731120
}

modules/ProtocolLib/src/test/java/com/comphenix/protocol/events/PacketContainerTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,13 @@ public void testGenericEnums() {
467467
assertEquals(container.getEnumModifier(Action.class, PacketPlayOutBoss.Action.class).read(0), Action.UPDATE_PCT);
468468
}
469469

470+
@Test
471+
public void testDimensionManager() {
472+
PacketContainer container = new PacketContainer(PacketType.Play.Server.RESPAWN);
473+
container.getDimensions().write(0, 1);
474+
assertEquals((Object) 1, container.getDimensions().read(0));
475+
}
476+
470477
/**
471478
* Actions from the outbound Boss packet. Used for testing generic enums.
472479
* @author dmulloy2

0 commit comments

Comments
 (0)