package org.inventivetalent.mapmanager; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import org.inventivetalent.reflection.resolver.ClassResolver; import org.spigotmc.CustomTimingsHandler; import java.util.HashMap; import java.util.Map; public class TimingsHelper { static ClassResolver classResolver = new ClassResolver(); public static final boolean PAPER_SPIGOT = Bukkit.getVersion().contains("Paper") || (MapManagerPlugin.instance != null && MapManagerPlugin.instance.getConfig().getBoolean("paperSpigot", false)); static final Map<String, Object> HANDLER_MAP = new HashMap<>(); public static void startTiming(String name) { if (!HANDLER_MAP.containsKey(name)) { HANDLER_MAP.put(name, createHandler(name)); } Object handler = HANDLER_MAP.get(name); try { classResolver.resolveSilent("co.aikar.timings.Timing", "org.spigotmc.CustomTimingsHandler").getDeclaredMethod("startTiming").invoke(handler); } catch (Exception e) { throw new RuntimeException(e); } } public static void stopTiming(String name) { if (HANDLER_MAP.containsKey(name)) { Object handler = HANDLER_MAP.get(name); try { classResolver.resolveSilent("co.aikar.timings.Timing", "org.spigotmc.CustomTimingsHandler").getDeclaredMethod("stopTiming").invoke(handler); } catch (Exception e) { throw new RuntimeException(e); } } } private static Object createHandler(String name) { if (!PAPER_SPIGOT) { return new CustomTimingsHandler(name); } else { try { Class<?> clazz = Class.forName("co.aikar.timings.Timings"); return clazz.getDeclaredMethod("of", Plugin.class, String.class).invoke(null, MapManagerPlugin.instance, name); } catch (Exception e) { throw new RuntimeException(e); } } } }