Archiviert
13
0

Add modifier for EntityTypes

Fixes #710
Dieser Commit ist enthalten in:
Dan Mulloy 2019-10-29 16:52:30 -04:00
Ursprung 9a108af219
Commit a76ceb94cc
3 geänderte Dateien mit 71 neuen und 0 gelöschten Zeilen

Datei anzeigen

@ -58,6 +58,7 @@ import org.bukkit.Sound;
import org.bukkit.World;
import org.bukkit.WorldType;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;
@ -437,6 +438,16 @@ public class PacketContainer implements Serializable {
return getEntityModifier(event.getPlayer().getWorld());
}
/**
* Retrieves a read/write structure for entity types
* @return A modifier for an EntityType.
*/
public StructureModifier<EntityType> getEntityTypeModifier() {
return structureModifier.withType(
MinecraftReflection.getMinecraftClass("EntityTypes"),
BukkitConverters.getEntityTypeConverter());
}
/**
* Retrieves a read/write structure for chunk positions.
* @return A modifier for a ChunkPosition.

Datei anzeigen

@ -49,12 +49,15 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import net.minecraft.server.v1_14_R1.EntityTypes;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.World;
import org.bukkit.WorldType;
import org.bukkit.advancement.Advancement;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
@ -656,6 +659,54 @@ public class BukkitConverters {
};
}
private static MethodAccessor getEntityTypeName;
private static MethodAccessor entityTypeFromName;
public static EquivalentConverter<EntityType> getEntityTypeConverter() {
return ignoreNull(new EquivalentConverter<EntityType>() {
@Override
public Object getGeneric(EntityType specific) {
if (entityTypeFromName == null) {
Class<?> entityTypesClass = MinecraftReflection.getMinecraftClass("EntityTypes");
entityTypeFromName = Accessors.getMethodAccessor(
FuzzyReflection
.fromClass(entityTypesClass, false)
.getMethod(FuzzyMethodContract
.newBuilder()
.returnDerivedOf(Optional.class)
.parameterExactArray(new Class<?>[]{ String.class })
.build()));
}
Optional<?> opt = (Optional<?>) entityTypeFromName.invoke(null, specific.getName());
return opt.orElse(null);
}
@Override
public EntityType getSpecific(Object generic) {
if (getEntityTypeName == null) {
Class<?> entityTypesClass = MinecraftReflection.getMinecraftClass("EntityTypes");
getEntityTypeName = Accessors.getMethodAccessor(
FuzzyReflection
.fromClass(entityTypesClass, false)
.getMethod(FuzzyMethodContract
.newBuilder()
.returnTypeExact(MinecraftReflection.getMinecraftKeyClass())
.parameterExactArray(new Class<?>[]{ entityTypesClass })
.build()));
}
MinecraftKey key = MinecraftKey.fromHandle(getEntityTypeName.invoke(null, generic));
return EntityType.fromName(key.getKey());
}
@Override
public Class<EntityType> getSpecificType() {
return EntityType.class;
}
});
}
/**
* Retrieve the converter used to convert NMS ItemStacks to Bukkit's ItemStack.
* @return Item stack converter.

Datei anzeigen

@ -46,6 +46,7 @@ import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.WorldType;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.potion.PotionEffect;
@ -289,6 +290,14 @@ public class PacketContainerTest {
// @Test
// public void testGetPositionModifier() { }
@Test
public void testEntityTypeModifier() {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY);
packet.getEntityTypeModifier().write(0, EntityType.ARROW);
assertEquals(packet.getEntityTypeModifier().read(0), EntityType.ARROW);
}
@Test
public void testGetPositionCollectionModifier() {
PacketContainer explosionPacket = new PacketContainer(PacketType.Play.Server.EXPLOSION);