2828import org .bukkit .event .Listener ;
2929import org .bukkit .event .player .PlayerLocaleChangeEvent ;
3030
31- import java .lang .reflect .InvocationTargetException ;
32- import java .lang .reflect .Method ;
31+ import java .lang .invoke .MethodHandle ;
32+ import java .lang .invoke .MethodHandles ;
33+ import java .lang .invoke .MethodType ;
3334import java .util .Locale ;
3435
3536class ACFBukkitLocalesListener implements Listener {
3637
3738 private final BukkitCommandManager manager ;
39+ private MethodHandle localeMethod1_8 = null ;
40+ private boolean checkedLocaleMethod1_8 = false ;
3841
3942 ACFBukkitLocalesListener (BukkitCommandManager manager ) {
4043 this .manager = manager ;
@@ -56,13 +59,20 @@ void onLocaleChange(PlayerLocaleChangeEvent event) {
5659 }
5760 } catch (NoSuchMethodError ignored2 ) {
5861 try {
59- Method getNewLocale = event . getClass (). getMethod ( "getNewLocale" );
60- getNewLocale . setAccessible ( true ) ;
61- String value = ( String ) getNewLocale . invoke ( event );
62- if (! value . equals ( manager . issuersLocaleString . get ( player . getUniqueId ()))) {
63- locale = ACFBukkitUtil . stringToLocale ( value );
62+ if (! checkedLocaleMethod1_8 ) {
63+ checkedLocaleMethod1_8 = true ;
64+ MethodHandles . Lookup lookup = MethodHandles . lookup ( );
65+ MethodType type = MethodType . methodType ( String . class );
66+ localeMethod1_8 = lookup . findVirtual ( PlayerLocaleChangeEvent . class , "getNewLocale" , type );
6467 }
65- } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored3 ) {
68+ if (localeMethod1_8 != null ) {
69+ String value = (String ) localeMethod1_8 .invoke (event );
70+ if (!value .equals (manager .issuersLocaleString .get (player .getUniqueId ()))) {
71+ locale = ACFBukkitUtil .stringToLocale (value );
72+ }
73+ }
74+ } catch (Throwable t ) {
75+ manager .log (LogLevel .ERROR , "Error registering MethodHandle for LocaleChangeEvent" , t );
6676 }
6777 }
6878 }
0 commit comments