mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2024-09-28 22:47:32 +02:00
Minimize code for one generic instance factory instance.
This commit is contained in:
parent
537eb79e09
commit
8ba1f2cf74
@ -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.
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user