WildLoaders/src/main/java/com/bgsoftware/wildloaders/handlers/ProvidersHandler.java

123 lines
4.8 KiB
Java

package com.bgsoftware.wildloaders.handlers;
import com.bgsoftware.wildloaders.WildLoadersPlugin;
import com.bgsoftware.wildloaders.api.hooks.ClaimsProvider;
import com.bgsoftware.wildloaders.api.hooks.TickableProvider;
import com.bgsoftware.wildloaders.api.managers.ProvidersManager;
import com.bgsoftware.wildloaders.utils.threads.Executor;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.plugin.Plugin;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
public final class ProvidersHandler implements ProvidersManager {
private final WildLoadersPlugin plugin;
private final List<ClaimsProvider> claimsProviders = new ArrayList<>();
private final List<TickableProvider> tickableProviders = new ArrayList<>();
public ProvidersHandler(WildLoadersPlugin plugin) {
this.plugin = plugin;
Executor.sync(() -> {
loadClaimsProviders();
loadTickableProviders();
});
}
private void loadClaimsProviders() {
// Loading the claim providers
if (Bukkit.getPluginManager().isPluginEnabled("Factions")) {
if (Bukkit.getPluginManager().getPlugin("Factions").getDescription().getAuthors().contains("drtshock")) {
Optional<ClaimsProvider> claimsProvider = createInstance("ClaimsProvider_FactionsUUID");
claimsProvider.ifPresent(this::addClaimsProvider);
} else {
Optional<ClaimsProvider> claimsProvider = createInstance("ClaimsProvider_MassiveFactions");
claimsProvider.ifPresent(this::addClaimsProvider);
}
}
if (Bukkit.getPluginManager().isPluginEnabled("FactionsX")) {
Optional<ClaimsProvider> claimsProvider = createInstance("ClaimsProvider_FactionsX");
claimsProvider.ifPresent(this::addClaimsProvider);
}
if (Bukkit.getPluginManager().isPluginEnabled("SuperiorSkyblock2")) {
Optional<ClaimsProvider> claimsProvider = createInstance("ClaimsProvider_SuperiorSkyblock");
claimsProvider.ifPresent(this::addClaimsProvider);
}
if (Bukkit.getPluginManager().isPluginEnabled("Lands")) {
Optional<ClaimsProvider> claimsProvider = createInstance("ClaimsProvider_Lands");
claimsProvider.ifPresent(this::addClaimsProvider);
}
}
private void loadTickableProviders() {
// Loading the tickable providers
if (Bukkit.getPluginManager().isPluginEnabled("EpicSpawners")) {
Plugin epicSpawners = Bukkit.getPluginManager().getPlugin("EpicSpawners");
if (epicSpawners.getDescription().getVersion().startsWith("6")) {
Optional<TickableProvider> tickableProvider = createInstance("TickableProvider_EpicSpawners6");
tickableProvider.ifPresent(this::addTickableProvider);
} else {
Optional<TickableProvider> tickableProvider = createInstance("TickableProvider_EpicSpawners7");
tickableProvider.ifPresent(this::addTickableProvider);
}
}
}
@Override
public void addClaimsProvider(ClaimsProvider claimsProvider) {
claimsProviders.add(claimsProvider);
}
@Override
public void addTickableProvider(TickableProvider tickableProvider) {
tickableProviders.add(tickableProvider);
}
public boolean hasChunkAccess(UUID player, Chunk chunk) {
for (ClaimsProvider claimsProvider : claimsProviders) {
if (claimsProvider.hasClaimAccess(player, chunk))
return true;
}
return false;
}
public void tick(Chunk[] chunks) {
tickableProviders.forEach(tickableProvider -> tickableProvider.tick(chunks));
}
private <T> Optional<T> createInstance(String className) {
try {
Class<?> clazz = Class.forName("com.bgsoftware.wildloaders.hooks." + className);
try {
Method compatibleMethod = clazz.getDeclaredMethod("isCompatible");
if (!(boolean) compatibleMethod.invoke(null))
return Optional.empty();
} catch (Exception ignored) {
}
try {
Constructor<?> constructor = clazz.getConstructor(WildLoadersPlugin.class);
// noinspection unchecked
return Optional.of((T) constructor.newInstance(plugin));
} catch (Exception error) {
// noinspection unchecked
return Optional.of((T) clazz.newInstance());
}
} catch (ClassNotFoundException ignored) {
return Optional.empty();
} catch (Exception error) {
error.printStackTrace();
return Optional.empty();
}
}
}