Minimize code for one generic instance factory instance.

This commit is contained in:
asofold 2016-06-09 18:22:23 +02:00
parent 537eb79e09
commit 8ba1f2cf74
4 changed files with 96 additions and 45 deletions

View File

@ -97,6 +97,7 @@ public interface MCAccess {
public AlmostBoolean isIllegalBounds(Player player);
/**
* Potion effect jump amplifier.
*
* @param player
* @return Double.NEGATIVE_INFINITY if not present.
@ -104,6 +105,7 @@ public interface MCAccess {
public double getJumpAmplifier(Player player);
/**
* Potion effect speed amplifier.
*
* @return Double.NEGATIVE_INFINITY if not present.
*/

View File

@ -1180,6 +1180,7 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI {
final MCAccessConfig mcaC = new MCAccessConfig(config);
final MCAccess mcAccess = new MCAccessFactory().getMCAccess(mcaC);
new EntityAccessFactory().setupEntityAccess(mcAccess, mcaC); // TODO: Registry listeners/events are missing.
setMCAccess(mcAccess);
return mcAccess;
}

View File

@ -14,10 +14,7 @@
*/
package fr.neatmonster.nocheatplus.compat;
import fr.neatmonster.nocheatplus.NCPAPIProvider;
import fr.neatmonster.nocheatplus.compat.cbreflect.reflect.ReflectEntityLastPositionAndLook;
import fr.neatmonster.nocheatplus.components.location.IEntityAccessLastPositionAndLook;
import fr.neatmonster.nocheatplus.logging.Streams;
/**
* Set up more fine grained entity access providers, registered as generic
@ -39,50 +36,13 @@ public class EntityAccessFactory {
* @param config
*/
public void setupEntityAccess(final MCAccess mcAccess, final MCAccessConfig config) {
setupLastPositionWithLook();
}
private void setupLastPositionWithLook() {
IEntityAccessLastPositionAndLook res = null;
// Reference by class name (native access).
final String[] names = new String[] {
RegistryHelper.setupGenericInstance(new String[] {
"fr.neatmonster.nocheatplus.compat.cbdev.EntityAccessLastPositionAndLook",
"fr.neatmonster.nocheatplus.compat.spigotcb1_9_R2.EntityAccessLastPositionAndLook",
"fr.neatmonster.nocheatplus.compat.spigotcb1_9_R1.EntityAccessLastPositionAndLook"
};
for (final String name : names) {
try {
res = (IEntityAccessLastPositionAndLook) Class.forName(name).newInstance();
if (res != null) {
break;
}
}
catch (Throwable t) {
// Skip.
}
}
// Reflection based.
if (res == null) {
try {
res = new ReflectEntityLastPositionAndLook();
}
catch (Throwable t) {
// Ignore.
NCPAPIProvider.getNoCheatPlusAPI().getLogManager().debug(Streams.TRACE_FILE, t);
}
}
// Register / log.
register(IEntityAccessLastPositionAndLook.class, res);
}
private <T> void register(Class<T> registerFor, T result) {
if (result != null) {
NCPAPIProvider.getNoCheatPlusAPI().registerGenericInstance(registerFor, result);
NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.STATUS, "Registered for " + registerFor.getName() + ": " + result.getClass().getName());
}
else {
NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.STATUS, "Could not register an instance for: " + registerFor.getName());
}
"fr.neatmonster.nocheatplus.compat.spigotcb1_9_R1.EntityAccessLastPositionAndLook",
}, new String[] {
"fr.neatmonster.nocheatplus.compat.cbreflect.reflect.ReflectEntityLastPositionAndLook",
}, IEntityAccessLastPositionAndLook.class, config);
}
}

View File

@ -0,0 +1,88 @@
package fr.neatmonster.nocheatplus.compat;
import fr.neatmonster.nocheatplus.NCPAPIProvider;
import fr.neatmonster.nocheatplus.logging.Streams;
public class RegistryHelper {
/**
* Set up a generic instance, according to settings. On success it will be
* registered with the default GenericInstanceRegistry (NoCheatPlusAPI).
*
* @param cbDedicatedNames
* @param cbReflectNames
* @param registerFor
* @param config
* @param logDebug
* @return
*/
public static <T> T setupGenericInstance(String[] cbDedicatedNames, String[] cbReflectNames, Class<T> registerFor, MCAccessConfig config) {
T res = null;
// Reference by class name (native access).
if (config.enableCBDedicated) {
res = getFirstAvailable(cbDedicatedNames, registerFor, true);
}
// Reflection based.
if (res == null && config.enableCBReflect) {
res = getFirstAvailable(cbReflectNames, registerFor, true);
}
// Register / log.
RegistryHelper.registerGenericInstance(registerFor, res);
return res;
}
/**
* Return the first instance for which a class can be instantiated via the
* default constructor.
*
* @param classNames
* Full class names (including package name).
* @param registerFor
* The type to register classes for later (not registered here).
* @param logDebug
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getFirstAvailable(String[] classNames, Class<T> registerFor, boolean logDebug) {
T res = null;
for (String name : classNames) {
try {
res = (T) Class.forName(name).newInstance();
if (res != null) {
return res;
}
}
catch (Throwable t) {
// Skip.
if (logDebug) {
NCPAPIProvider.getNoCheatPlusAPI().getLogManager().debug(Streams.TRACE_FILE, t);
}
}
}
return null;
}
/**
* Register result as generic instance, if not null. Log if registered or if
* not. Meant to register the output of a factory method.
*
* @param registerFor
* The class the given result will be registered for.
* @param result
* @return The given result as instance of T.
*/
public static <T, ET extends T> T registerGenericInstance(Class<T> registerFor, ET result) {
if (result != null) {
NCPAPIProvider.getNoCheatPlusAPI().registerGenericInstance(registerFor, result);
NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.STATUS, "Registered for " + registerFor.getName() + ": " + result.getClass().getName());
}
else {
NCPAPIProvider.getNoCheatPlusAPI().getLogManager().info(Streams.STATUS, "Could not register an instance for: " + registerFor.getName());
}
return result;
}
}