Provider Rework (#3407)

Moved providers around, made them make sense, profit
This commit is contained in:
Josh Roy 2020-06-24 17:00:59 -04:00 committed by GitHub
parent 04a1d8197f
commit 4a471f0a93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 220 additions and 417 deletions

View File

@ -68,32 +68,26 @@
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>NMSProvider</artifactId>
<artifactId>BaseProviders</artifactId>
<version>2.17.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>UpdatedMetaProvider</artifactId>
<artifactId>NMSReflectionProvider</artifactId>
<version>2.17.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>LegacyProvider</artifactId>
<version>2.17.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>ReflectionProvider</artifactId>
<version>2.17.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>FlattenedProvider</artifactId>
<artifactId>PaperProvider</artifactId>
<version>2.17.2</version>
<exclusions>
<exclusion>
<groupId>com.destroystokyo.paper</groupId>
<artifactId>paper-api</artifactId>
</exclusion>
</exclusions>
<scope>compile</scope>
</dependency>
</dependencies>

View File

@ -18,7 +18,6 @@
package com.earth2me.essentials;
import com.earth2me.essentials.commands.*;
import com.earth2me.essentials.craftbukkit.ServerState;
import com.earth2me.essentials.items.AbstractItemDb;
import com.earth2me.essentials.items.CustomItemResolver;
import com.earth2me.essentials.items.FlatItemDb;
@ -35,20 +34,17 @@ import com.earth2me.essentials.textreader.SimpleTextInput;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.VersionUtil;
import com.google.common.base.Throwables;
import io.papermc.lib.PaperLib;
import net.ess3.api.IEssentials;
import net.ess3.api.ISettings;
import net.ess3.api.*;
import net.ess3.nms.PotionMetaProvider;
import net.ess3.nms.SpawnEggProvider;
import net.ess3.nms.SpawnerProvider;
import net.ess3.nms.flattened.FlatSpawnEggProvider;
import net.ess3.nms.legacy.LegacyPotionMetaProvider;
import net.ess3.nms.legacy.LegacySpawnEggProvider;
import net.ess3.nms.legacy.LegacySpawnerProvider;
import net.ess3.nms.refl.ReflSpawnEggProvider;
import net.ess3.nms.updatedmeta.BasePotionDataProvider;
import net.ess3.nms.updatedmeta.BlockMetaSpawnerProvider;
import net.ess3.providers.ProviderFactory;
import net.ess3.nms.refl.providers.ReflServerStateProvider;
import net.ess3.nms.refl.providers.ReflSpawnEggProvider;
import net.ess3.provider.PotionMetaProvider;
import net.ess3.provider.ServerStateProvider;
import net.ess3.provider.SpawnEggProvider;
import net.ess3.provider.SpawnerProvider;
import net.ess3.provider.providers.*;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.World;
@ -111,6 +107,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
private transient SpawnerProvider spawnerProvider;
private transient SpawnEggProvider spawnEggProvider;
private transient PotionMetaProvider potionMetaProvider;
private transient ServerStateProvider serverStateProvider;
private transient Kits kits;
public Essentials() {
@ -246,22 +243,32 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
confList.add(jails);
execTimer.mark("Init(Jails)");
spawnerProvider = new ProviderFactory<>(getLogger(),
Arrays.asList(
BlockMetaSpawnerProvider.class,
LegacySpawnerProvider.class
), "mob spawner").getProvider();
spawnEggProvider = new ProviderFactory<>(getLogger(),
Arrays.asList(
FlatSpawnEggProvider.class,
ReflSpawnEggProvider.class,
LegacySpawnEggProvider.class
), "spawn egg").getProvider();
potionMetaProvider = new ProviderFactory<>(getLogger(),
Arrays.asList(
BasePotionDataProvider.class,
LegacyPotionMetaProvider.class
), "potion meta").getProvider();
//Spawner provider only uses one but it's here for legacy...
spawnerProvider = new BlockMetaSpawnerProvider();
//Spawn Egg Providers
if (VersionUtil.getServerBukkitVersion().isLowerThanOrEqualTo(VersionUtil.v1_8_8_R01)) {
spawnEggProvider = new LegacySpawnEggProvider();
} else if (VersionUtil.getServerBukkitVersion().isLowerThanOrEqualTo(VersionUtil.v1_12_2_R01)) {
spawnEggProvider = new ReflSpawnEggProvider();
} else {
spawnEggProvider = new FlatSpawnEggProvider();
}
//Potion Meta Provider
if (VersionUtil.getServerBukkitVersion().isLowerThanOrEqualTo(VersionUtil.v1_8_8_R01)) {
potionMetaProvider = new LegacyPotionMetaProvider();
} else {
potionMetaProvider = new BasePotionDataProvider();
}
//Server State Provider
if (PaperLib.isPaper() && VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_15_2_R01)) {
serverStateProvider = new PaperServerStateProvider();
} else {
serverStateProvider = new ReflServerStateProvider(getLogger());
}
execTimer.mark("Init(Providers)");
reload();
@ -360,7 +367,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
@Override
public void onDisable() {
boolean stopping = ServerState.isStopping();
boolean stopping = getServerStateProvider().isStopping();
if (!stopping) {
LOGGER.log(Level.SEVERE, tl("serverReloading"));
}
@ -949,6 +956,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
return customItemResolver;
}
@Override
public ServerStateProvider getServerStateProvider() {
return serverStateProvider;
}
private static void addDefaultBackPermissionsToWorld(World w) {
String permName = "essentials.back.into." + w.getName();

View File

@ -6,7 +6,8 @@ import com.earth2me.essentials.api.IWarps;
import com.earth2me.essentials.metrics.Metrics;
import com.earth2me.essentials.perm.PermissionsHandler;
import com.earth2me.essentials.register.payment.Methods;
import net.ess3.nms.SpawnerProvider;
import net.ess3.provider.ServerStateProvider;
import net.ess3.provider.SpawnerProvider;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
@ -106,4 +107,6 @@ public interface IEssentials extends Plugin {
Iterable<User> getOnlineUsers();
SpawnerProvider getSpawnerProvider();
ServerStateProvider getServerStateProvider();
}

View File

@ -1,67 +0,0 @@
package com.earth2me.essentials.craftbukkit;
import net.ess3.nms.refl.ReflUtil;
import org.bukkit.Bukkit;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
public class ServerState {
private static final MethodHandle isStopping; //Only in Paper
private static final MethodHandle nmsHasStopped;
private static final MethodHandle nmsIsRunning;
private static final Object nmsServer;
static {
MethodHandle isStoppingHandle = null;
MethodHandle nmsHasStoppedHandle = null;
MethodHandle nmsIsRunningHandle = null;
Object nmsServerObject = null;
try {
//noinspection JavaLangInvokeHandleSignature - We don't compile against Paper
isStoppingHandle = MethodHandles.lookup().findStatic(Bukkit.class, "isStopping", MethodType.methodType(boolean.class));
} catch (Throwable e) {
try {
Class<?> nmsClass = ReflUtil.getNMSClass("MinecraftServer");
if (nmsClass != null) {
nmsServerObject = nmsClass.getMethod("getServer").invoke(null);
nmsIsRunningHandle = MethodHandles.lookup().findVirtual(nmsClass, "isRunning", MethodType.methodType(boolean.class));
nmsHasStoppedHandle = MethodHandles.lookup().findVirtual(nmsClass, "hasStopped", MethodType.methodType(boolean.class));
}
} catch (Throwable ignored) {
}
}
isStopping = isStoppingHandle;
nmsHasStopped = nmsHasStoppedHandle;
nmsIsRunning = nmsIsRunningHandle;
nmsServer = nmsServerObject;
}
public static boolean isStopping() {
boolean stopping = false;
if (isStopping != null) {
try {
stopping = (boolean) isStopping.invoke();
} catch (Throwable t) {
t.printStackTrace();
}
} else if (nmsServer != null) {
if (nmsHasStopped != null) {
try {
stopping = (boolean) nmsHasStopped.invoke(nmsServer);
} catch (Throwable t) {
t.printStackTrace();
}
} else if (nmsIsRunning != null) {
try {
stopping = !(boolean) nmsIsRunning.invoke(nmsServer);
} catch (Throwable t) {
t.printStackTrace();
}
}
}
return stopping;
}
}

View File

@ -1,8 +1,8 @@
package net.ess3.api;
import com.earth2me.essentials.items.CustomItemResolver;
import net.ess3.nms.PotionMetaProvider;
import net.ess3.nms.SpawnEggProvider;
import net.ess3.provider.PotionMetaProvider;
import net.ess3.provider.SpawnEggProvider;
import java.util.Collection;

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>EssentialsXParent</artifactId>
<groupId>net.ess3</groupId>
<version>2.17.2</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>LegacyProvider</artifactId>
<dependencies>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>NMSProvider</artifactId>
<version>2.17.2</version>
</dependency>
</dependencies>
</project>

View File

@ -1,24 +0,0 @@
package net.ess3.nms.legacy;
import net.ess3.nms.SpawnerProvider;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
@SuppressWarnings("deprecation")
public class LegacySpawnerProvider extends SpawnerProvider {
@Override
public ItemStack setEntityType(ItemStack is, EntityType type) {
is.getData().setData((byte) type.getTypeId());
return setDisplayName(is, type);
}
@Override
public EntityType getEntityType(ItemStack is) {
return EntityType.fromId((int) is.getData().getData());
}
@Override
public String getDescription() {
return "legacy item data provider";
}
}

View File

@ -1,19 +0,0 @@
package net.ess3.nms;
import net.ess3.providers.Provider;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
public abstract class PotionMetaProvider implements Provider {
public abstract ItemStack createPotionItem(Material initial, int effectId);
@Override
public boolean tryProvider() {
try {
createPotionItem(Material.POTION, 8260); // Poison Level II Extended
return true;
} catch (Throwable t) {
return false;
}
}
}

View File

@ -1,23 +0,0 @@
package net.ess3.nms;
import net.ess3.providers.Provider;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
public abstract class SpawnEggProvider implements Provider {
public abstract ItemStack createEggItem(EntityType type) throws IllegalArgumentException;
public abstract EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentException;
@Override
public boolean tryProvider() {
try {
EntityType type = EntityType.CREEPER;
ItemStack is = createEggItem(type);
EntityType readType = getSpawnedType(is);
return type == readType;
} catch (Throwable t) {
return false;
}
}
}

View File

@ -1,35 +0,0 @@
package net.ess3.providers;
import java.util.logging.Logger;
public class ProviderFactory<T extends Provider> {
private Logger logger;
private String providerType;
private Iterable<Class<? extends T>> providers;
public ProviderFactory(Logger logger, Iterable<Class<? extends T>> providers, String providerType) {
this.logger = logger;
this.providerType = providerType;
this.providers = providers;
}
public T getProvider() {
for (Class<? extends T> providerClass : providers) {
T provider = loadProvider(providerClass);
if (provider != null && provider.tryProvider()) {
logger.info("Using " + provider.getDescription() + " as " + providerType + " provider.");
return provider;
}
}
logger.severe("The " + providerType + " provider failed to load! Some parts of Essentials may not function correctly.");
return null;
}
private T loadProvider(Class<? extends T> providerClass) {
try {
return providerClass.getConstructor().newInstance();
} catch (Throwable ignored) {
return null;
}
}
}

View File

@ -1,51 +0,0 @@
package net.ess3.nms.refl;
import net.ess3.nms.refl.ReflUtil.NMSVersion;
import org.junit.Assert;
import org.junit.Test;
public class NMSVersionTest {
@Test
public void testMajor() {
NMSVersion v2_9_R1 = NMSVersion.fromString("v2_9_R1");
Assert.assertEquals(2, v2_9_R1.getMajor());
Assert.assertEquals(9, v2_9_R1.getMinor());
Assert.assertEquals(1, v2_9_R1.getRelease());
Assert.assertEquals(v2_9_R1.toString(), "v2_9_R1");
Assert.assertTrue(v2_9_R1.isHigherThan(NMSVersion.fromString("v1_10_R1")));
Assert.assertTrue(v2_9_R1.isHigherThanOrEqualTo(NMSVersion.fromString("v1_9_R1")));
}
@Test
public void testMinor() {
NMSVersion v1_10_R1 = NMSVersion.fromString("v1_10_R1");
Assert.assertEquals(1, v1_10_R1.getMajor());
Assert.assertEquals(10, v1_10_R1.getMinor());
Assert.assertEquals(1, v1_10_R1.getRelease());
Assert.assertEquals(v1_10_R1.toString(), "v1_10_R1");
Assert.assertTrue(NMSVersion.fromString("v1_9_R1").isLowerThan(v1_10_R1));
Assert.assertTrue(NMSVersion.fromString("v1_9_R1").isLowerThanOrEqualTo(v1_10_R1));
}
@Test
public void testRelease() {
NMSVersion v1_9_R2 = NMSVersion.fromString("v1_9_R2");
Assert.assertEquals(1, v1_9_R2.getMajor());
Assert.assertEquals(9, v1_9_R2.getMinor());
Assert.assertEquals(2, v1_9_R2.getRelease());
Assert.assertEquals(v1_9_R2.toString(), "v1_9_R2");
Assert.assertEquals(v1_9_R2, NMSVersion.fromString("v1_9_R2"));
Assert.assertTrue(v1_9_R2.isHigherThan(NMSVersion.fromString("v1_9_R1")));
}
}

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>EssentialsXParent</artifactId>
<groupId>net.ess3</groupId>
<version>2.17.2</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>UpdatedMetaProvider</artifactId>
<dependencies>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>NMSProvider</artifactId>
<version>2.17.2</version>
</dependency>
</dependencies>
</project>

View File

@ -49,11 +49,9 @@
<module>EssentialsProtect</module>
<module>EssentialsSpawn</module>
<module>EssentialsXMPP</module>
<module>nms/NMSProvider</module>
<module>nms/UpdatedMetaProvider</module>
<module>nms/LegacyProvider</module>
<module>nms/ReflectionProvider</module>
<module>nms/FlattenedProvider</module>
<module>providers/BaseProviders</module>
<module>providers/NMSReflectionProvider</module>
<module>providers/PaperProvider</module>
</modules>
<dependencies>

View File

@ -10,5 +10,5 @@
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>NMSProvider</artifactId>
</project>
<artifactId>BaseProviders</artifactId>
</project>

View File

@ -0,0 +1,8 @@
package net.ess3.provider;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
public interface PotionMetaProvider extends Provider {
ItemStack createPotionItem(Material initial, int effectId);
}

View File

@ -1,7 +1,5 @@
package net.ess3.providers;
package net.ess3.provider;
public interface Provider {
boolean tryProvider();
String getDescription();
}

View File

@ -0,0 +1,5 @@
package net.ess3.provider;
public interface ServerStateProvider extends Provider {
boolean isStopping();
}

View File

@ -0,0 +1,10 @@
package net.ess3.provider;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
public interface SpawnEggProvider extends Provider {
ItemStack createEggItem(EntityType type) throws IllegalArgumentException;
EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentException;
}

View File

@ -1,17 +1,19 @@
package net.ess3.nms;
package net.ess3.provider;
import com.google.common.collect.ImmutableMap;
import net.ess3.providers.Provider;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.Map;
public abstract class SpawnerProvider implements Provider {
private Map<EntityType, String> entityToDisplayName = ImmutableMap.<EntityType, String>builder()
public interface SpawnerProvider extends Provider {
ItemStack setEntityType(ItemStack is, EntityType type) throws IllegalArgumentException;
EntityType getEntityType(ItemStack is) throws IllegalArgumentException;
Map<EntityType, String> entityToDisplayName = ImmutableMap.<EntityType, String>builder()
.put(EntityType.CAVE_SPIDER, "Cave Spider")
.put(EntityType.PIG_ZOMBIE, "Zombie Pigman")
.put(EntityType.MAGMA_CUBE, "Magma Cube")
@ -24,36 +26,13 @@ public abstract class SpawnerProvider implements Provider {
.put(EntityType.HORSE, "Horse")
.build();
public abstract ItemStack setEntityType(ItemStack is, EntityType type) throws IllegalArgumentException;
public abstract EntityType getEntityType(ItemStack is) throws IllegalArgumentException;
@Override
public boolean tryProvider() {
EntityType type = EntityType.CREEPER;
Material MOB_SPAWNER;
try {
MOB_SPAWNER = Material.valueOf("SPAWNER");
} catch (Exception e) {
MOB_SPAWNER = Material.valueOf("MOB_SPAWNER");
}
try {
ItemStack is = setEntityType(new ItemStack(MOB_SPAWNER), type);
EntityType readType = getEntityType(is);
return type == readType;
} catch (Throwable t) {
return false;
}
}
@SuppressWarnings("deprecation")
protected ItemStack setDisplayName(ItemStack is, EntityType type) {
default ItemStack setDisplayName(ItemStack is, EntityType type) {
ItemMeta meta = is.getItemMeta();
String displayName;
if (entityToDisplayName.containsKey(type)) {
displayName = entityToDisplayName.get(type);
} else {
//noinspection deprecation
displayName = type.getName();
}
meta.setDisplayName(ChatColor.RESET + displayName + " Spawner");

View File

@ -1,7 +1,7 @@
package net.ess3.nms.updatedmeta;
package net.ess3.provider.providers;
import com.google.common.collect.ImmutableMap;
import net.ess3.nms.PotionMetaProvider;
import net.ess3.provider.PotionMetaProvider;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.PotionMeta;
@ -10,8 +10,8 @@ import org.bukkit.potion.PotionType;
import java.util.Map;
public class BasePotionDataProvider extends PotionMetaProvider {
private static Map<Integer, PotionType> damageValueToType = ImmutableMap.<Integer, PotionType>builder()
public class BasePotionDataProvider implements PotionMetaProvider {
private static final Map<Integer, PotionType> damageValueToType = ImmutableMap.<Integer, PotionType>builder()
.put(1, PotionType.REGEN)
.put(2, PotionType.SPEED)
.put(3, PotionType.FIRE_RESISTANCE)
@ -29,7 +29,7 @@ public class BasePotionDataProvider extends PotionMetaProvider {
.build();
@Override
public ItemStack createPotionItem(Material initial, int effectId) throws IllegalArgumentException {
public ItemStack createPotionItem(Material initial, int effectId) {
ItemStack potion = new ItemStack(initial, 1);
if (effectId == 0) {
@ -46,16 +46,14 @@ public class BasePotionDataProvider extends PotionMetaProvider {
throw new IllegalArgumentException("Unable to process potion effect ID " + effectId + " with damage value " + damageValue);
}
boolean extended = getBit(effectId, 6) == 1;
boolean upgraded = getBit(effectId, 5) == 1;
boolean splash = getBit(effectId, 14) == 1;
if (splash && initial == Material.POTION) {
//getBit is splash here
if (getBit(effectId, 14) == 1 && initial == Material.POTION) {
potion = new ItemStack(Material.SPLASH_POTION, 1);
}
PotionMeta meta = (PotionMeta) potion.getItemMeta();
PotionData data = new PotionData(type, extended, upgraded);
//getBit(s) are extended and upgraded respectfully
PotionData data = new PotionData(type, getBit(effectId, 6) == 1, getBit(effectId, 5) == 1);
meta.setBasePotionData(data); // this method is exclusive to recent 1.9+
potion.setItemMeta(meta);
@ -68,6 +66,6 @@ public class BasePotionDataProvider extends PotionMetaProvider {
@Override
public String getDescription() {
return "1.9+ BasePotionData provider";
return "1.9+ Potion Meta Provider";
}
}

View File

@ -1,15 +1,15 @@
package net.ess3.nms.updatedmeta;
package net.ess3.provider.providers;
import net.ess3.nms.SpawnerProvider;
import net.ess3.provider.SpawnerProvider;
import org.bukkit.block.BlockState;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta;
public class BlockMetaSpawnerProvider extends SpawnerProvider {
public class BlockMetaSpawnerProvider implements SpawnerProvider {
@Override
public ItemStack setEntityType(ItemStack is, EntityType type) {
public ItemStack setEntityType(ItemStack is, EntityType type) throws IllegalArgumentException {
BlockStateMeta bsm = (BlockStateMeta) is.getItemMeta();
BlockState bs = bsm.getBlockState();
((CreatureSpawner) bs).setSpawnedType(type);
@ -19,7 +19,7 @@ public class BlockMetaSpawnerProvider extends SpawnerProvider {
}
@Override
public EntityType getEntityType(ItemStack is) {
public EntityType getEntityType(ItemStack is) throws IllegalArgumentException {
BlockStateMeta bsm = (BlockStateMeta) is.getItemMeta();
CreatureSpawner bs = (CreatureSpawner) bsm.getBlockState();
return bs.getSpawnedType();
@ -27,6 +27,6 @@ public class BlockMetaSpawnerProvider extends SpawnerProvider {
@Override
public String getDescription() {
return "1.8.3+ BlockStateMeta provider";
return "1.8.3+ Spawner Provider";
}
}

View File

@ -1,15 +1,14 @@
package net.ess3.nms.flattened;
package net.ess3.provider.providers;
import net.ess3.nms.SpawnEggProvider;
import net.ess3.provider.SpawnEggProvider;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
public class FlatSpawnEggProvider extends SpawnEggProvider {
public class FlatSpawnEggProvider implements SpawnEggProvider {
@Override
public ItemStack createEggItem(EntityType type) throws IllegalArgumentException {
String name = type.name() + "_SPAWN_EGG";
Material material = Material.valueOf(name);
Material material = Material.valueOf(type.name() + "_SPAWN_EGG");
return new ItemStack(material);
}
@ -18,13 +17,12 @@ public class FlatSpawnEggProvider extends SpawnEggProvider {
String materialName = eggItem.getType().name();
if (materialName.contains("_SPAWN_EGG")) {
return EntityType.valueOf(materialName.replace("_SPAWN_EGG", ""));
} else {
throw new IllegalArgumentException("Not a spawn egg");
}
throw new IllegalArgumentException("Not a spawn egg");
}
@Override
public String getDescription() {
return "1.13+ flat spawn egg provider";
return "1.13+ Flattening Spawn Egg Provider";
}
}

View File

@ -1,11 +1,11 @@
package net.ess3.nms.legacy;
package net.ess3.provider.providers;
import net.ess3.nms.PotionMetaProvider;
import net.ess3.provider.PotionMetaProvider;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
@SuppressWarnings("deprecation")
public class LegacyPotionMetaProvider extends PotionMetaProvider {
public class LegacyPotionMetaProvider implements PotionMetaProvider {
@Override
public ItemStack createPotionItem(Material initial, int effectId) {
ItemStack potion = new ItemStack(initial, 1);
@ -15,6 +15,6 @@ public class LegacyPotionMetaProvider extends PotionMetaProvider {
@Override
public String getDescription() {
return "legacy potion meta provider";
return "Legacy 1.8 Potion Meta Provider";
}
}

View File

@ -1,13 +1,13 @@
package net.ess3.nms.legacy;
package net.ess3.provider.providers;
import net.ess3.nms.SpawnEggProvider;
import net.ess3.provider.SpawnEggProvider;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
import org.bukkit.material.SpawnEgg;
@SuppressWarnings("deprecation")
public class LegacySpawnEggProvider extends SpawnEggProvider {
public class LegacySpawnEggProvider implements SpawnEggProvider {
@Override
public ItemStack createEggItem(EntityType type) throws IllegalArgumentException {
return new SpawnEgg(type).toItemStack();
@ -18,13 +18,12 @@ public class LegacySpawnEggProvider extends SpawnEggProvider {
MaterialData data = eggItem.getData();
if (data instanceof SpawnEgg) {
return ((SpawnEgg) data).getSpawnedType();
} else {
throw new IllegalArgumentException("Item is missing data");
}
throw new IllegalArgumentException("Item is missing data");
}
@Override
public String getDescription() {
return "legacy item data provider";
return "Legacy 1.8 Spawn Egg Provider";
}
}

View File

@ -10,12 +10,12 @@
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ReflectionProvider</artifactId>
<artifactId>NMSReflectionProvider</artifactId>
<dependencies>
<dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>NMSProvider</artifactId>
<artifactId>BaseProviders</artifactId>
<version>2.17.2</version>
</dependency>
<dependency>

View File

@ -17,14 +17,9 @@ import java.util.regex.Pattern;
public class ReflUtil {
public static final NMSVersion V1_8_R1 = NMSVersion.fromString("v1_8_R1");
public static final NMSVersion V1_8_R2 = NMSVersion.fromString("v1_8_R2");
public static final NMSVersion V1_8_R3 = NMSVersion.fromString("v1_8_R3");
public static final NMSVersion V1_9_R1 = NMSVersion.fromString("v1_9_R1");
public static final NMSVersion V1_10_R1 = NMSVersion.fromString("v1_10_R1");
public static final NMSVersion V1_11_R1 = NMSVersion.fromString("v1_11_R1");
public static final NMSVersion V1_12_R1 = NMSVersion.fromString("v1_12_R1");
public static final NMSVersion V1_13_R1 = NMSVersion.fromString("v1_13_R1");
public static final NMSVersion V1_13_R2 = NMSVersion.fromString("v1_13_R2");
private static NMSVersion nmsVersionObject;
private static String nmsVersion;
@ -52,7 +47,7 @@ public class ReflUtil {
return getClassCached("org.bukkit.craftbukkit." + getNMSVersion() + "." + className);
}
private static Map<String, Class<?>> classCache = new HashMap<>();
private static final Map<String, Class<?>> classCache = new HashMap<>();
public static Class<?> getClassCached(String className) {
if (classCache.containsKey(className)) {
@ -67,7 +62,7 @@ public class ReflUtil {
}
}
private static Table<Class<?>, String, Method> methodCache = HashBasedTable.create();
private static final Table<Class<?>, String, Method> methodCache = HashBasedTable.create();
public static Method getMethodCached(Class<?> clazz, String methodName) {
if (methodCache.contains(clazz, methodName)) {
@ -83,7 +78,7 @@ public class ReflUtil {
}
}
private static Table<Class<?>, MethodParams, Method> methodParamCache = HashBasedTable.create();
private static final Table<Class<?>, MethodParams, Method> methodParamCache = HashBasedTable.create();
public static Method getMethodCached(Class<?> clazz, String methodName, Class<?>... params) {
MethodParams methodParams = new MethodParams(methodName, params);
@ -100,7 +95,7 @@ public class ReflUtil {
}
}
private static Table<Class<?>, String, Field> fieldCache = HashBasedTable.create();
private static final Table<Class<?>, String, Field> fieldCache = HashBasedTable.create();
public static Field getFieldCached(Class<?> clazz, String fieldName) {
if (fieldCache.contains(clazz, fieldName)) {
@ -116,7 +111,7 @@ public class ReflUtil {
}
}
private static Map<Class<?>, Constructor<?>> constructorCache = new HashMap<>();
private static final Map<Class<?>, Constructor<?>> constructorCache = new HashMap<>();
public static Constructor<?> getConstructorCached(Class<?> clazz) {
if (constructorCache.containsKey(clazz)) {
@ -132,7 +127,7 @@ public class ReflUtil {
}
}
private static Table<Class<?>, ConstructorParams, Constructor<?>> constructorParamCache = HashBasedTable.create();
private static final Table<Class<?>, ConstructorParams, Constructor<?>> constructorParamCache = HashBasedTable.create();
public static Constructor<?> getConstructorCached(Class<?> clazz, Class<?>... params) {
ConstructorParams constructorParams = new ConstructorParams(params);

View File

@ -33,7 +33,7 @@ import java.lang.reflect.Method;
public class SpawnEggRefl {
private EntityType type;
SpawnEggRefl(EntityType type) {
public SpawnEggRefl(EntityType type) {
this.type = type;
}
@ -42,7 +42,7 @@ public class SpawnEggRefl {
*
* @return The entity type.
*/
EntityType getSpawnedType() {
public EntityType getSpawnedType() {
return type;
}
@ -67,7 +67,7 @@ public class SpawnEggRefl {
*
* @return ItemStack
*/
ItemStack toItemStack() throws Exception {
public ItemStack toItemStack() throws Exception {
return toItemStack(1);
}
@ -119,7 +119,7 @@ public class SpawnEggRefl {
* @param item - ItemStack, quantity is disregarded
* @return SpawnEgg
*/
static SpawnEggRefl fromItemStack(ItemStack item) throws Exception {
public static SpawnEggRefl fromItemStack(ItemStack item) throws Exception {
if (item == null)
throw new IllegalArgumentException("Item cannot be null");
if (item.getType() != Material.MONSTER_EGG)

View File

@ -0,0 +1,45 @@
package net.ess3.nms.refl.providers;
import net.ess3.nms.refl.ReflUtil;
import net.ess3.provider.ServerStateProvider;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.logging.Logger;
public class ReflServerStateProvider implements ServerStateProvider {
private final Object nmsServer;
private final MethodHandle nmsIsRunning;
public ReflServerStateProvider(Logger logger) {
Object serverObject = null;
MethodHandle isRunning = null;
Class<?> nmsClass = ReflUtil.getNMSClass("MinecraftServer");
try {
serverObject = nmsClass.getMethod("getServer").invoke(null);
isRunning = MethodHandles.lookup().findVirtual(nmsClass, "isRunning", MethodType.methodType(boolean.class));
} catch (Exception e) {
e.printStackTrace();
}
nmsServer = serverObject;
nmsIsRunning = isRunning;
}
@Override
public boolean isStopping() {
if (nmsServer != null && nmsIsRunning != null) {
try {
return !(boolean) nmsIsRunning.invoke(nmsServer);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
return false;
}
@Override
public String getDescription() {
return "NMS Reflection Server State Provider";
}
}

View File

@ -1,15 +1,14 @@
package net.ess3.nms.refl;
package net.ess3.nms.refl.providers;
import net.ess3.nms.SpawnEggProvider;
import net.ess3.nms.refl.SpawnEggRefl;
import net.ess3.provider.SpawnEggProvider;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
public class ReflSpawnEggProvider extends SpawnEggProvider {
public class ReflSpawnEggProvider implements SpawnEggProvider {
@Override
public ItemStack createEggItem(EntityType type) throws IllegalArgumentException {
if (ReflUtil.getNMSVersion().startsWith("v1_8_R")) {
throw new IllegalArgumentException("1.8 servers should use legacy provider");
}
try {
return new SpawnEggRefl(type).toItemStack();
} catch (Exception e) {
@ -19,9 +18,6 @@ public class ReflSpawnEggProvider extends SpawnEggProvider {
@Override
public EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentException {
if (ReflUtil.getNMSVersion().startsWith("v1_8_R")) {
throw new IllegalArgumentException("1.8 servers should use legacy provider");
}
try {
return SpawnEggRefl.fromItemStack(eggItem).getSpawnedType();
} catch (Exception e) {
@ -31,6 +27,6 @@ public class ReflSpawnEggProvider extends SpawnEggProvider {
@Override
public String getDescription() {
return "Reflection based provider";
return "NMS Reflection Provider";
}
}

View File

@ -10,13 +10,25 @@
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>FlattenedProvider</artifactId>
<artifactId>PaperProvider</artifactId>
<repositories>
<repository>
<id>paper-repo</id>
<url>https://papermc.io/repo/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>NMSProvider</artifactId>
<artifactId>BaseProviders</artifactId>
<version>2.17.2</version>
</dependency>
<dependency>
<groupId>com.destroystokyo.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.15.2-R0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
</project>

View File

@ -0,0 +1,16 @@
package net.ess3.provider.providers;
import net.ess3.provider.ServerStateProvider;
import org.bukkit.Bukkit;
public class PaperServerStateProvider implements ServerStateProvider {
@Override
public boolean isStopping() {
return Bukkit.isStopping();
}
@Override
public String getDescription() {
return "Paper Server State Provider";
}
}