11/*global Java, exports, org, __plugin */
22var bkEventPriority = org . bukkit . event . EventPriority ,
3- bkEventExecutor = org . bukkit . plugin . EventExecutor ,
4- bkRegisteredListener = org . bukkit . plugin . RegisteredListener ;
3+ bkHandlerList = org . bukkit . event . HandlerList ,
4+ bkPluginManager = org . bukkit . Bukkit . pluginManager ;
55
6- var nashorn = typeof Java != 'undefined' ;
6+ // Ask Nashorn to generate a class implementing the Listener
7+ // interface, so that we may instantiate it to tag our event
8+ // handlers.
9+ var ScriptCraftListener = Java . extend ( org . bukkit . event . Listener , { } ) ;
710
8- function getHandlerListForEventType ( eventType ) {
9- var result = null ;
10- var clazz = null ;
11- if ( nashorn ) {
12- //Nashorn doesn't like when getHandlerList is in a superclass of your event
13- //so to avoid this problem, call getHandlerList using java.lang.reflect
14- //methods
15- clazz = eventType [ 'class' ] ;
16- result = clazz . getMethod ( 'getHandlerList' ) . invoke ( null ) ;
17- } else {
18- result = eventType . getHandlerList ( ) ;
19- }
20-
21- return result ;
22- }
2311exports . on = function (
2412 /* Java Class */
2513 eventType ,
@@ -29,53 +17,45 @@ exports.on = function(
2917 /* (optional) String (HIGH, HIGHEST, LOW, LOWEST, NORMAL, MONITOR), */
3018 priority
3119) {
32- var handlerList , regd , eventExecutor ;
33-
3420 if ( typeof priority == 'undefined' ) {
3521 priority = bkEventPriority . HIGHEST ;
3622 } else {
3723 priority = bkEventPriority [ priority . toUpperCase ( ) . trim ( ) ] ;
3824 }
39- handlerList = getHandlerListForEventType ( eventType ) ;
4025
4126 var result = { } ;
42- eventExecutor = new bkEventExecutor ( {
43- execute : function ( l , evt ) {
44- function cancel ( ) {
45- if ( evt instanceof org . bukkit . event . Cancellable ) {
46- evt . setCancelled ( true ) ;
47- }
48- }
49- /*
50- let handlers use this.cancel() to cancel the current event
51- or this.unregister() to unregister from future events.
52- */
53- var bound = { } ;
54- for ( var i in result ) {
55- bound [ i ] = result [ i ] ;
27+ var eventExecutor = function ( l , evt ) {
28+ function cancel ( ) {
29+ if ( evt instanceof org . bukkit . event . Cancellable ) {
30+ evt . setCancelled ( true ) ;
5631 }
57- bound . cancel = cancel ;
58- handler . call ( bound , evt , cancel ) ;
5932 }
60- } ) ;
61- /*
62- wph 20130222 issue #64 bad interaction with Essentials plugin
63- if another plugin tries to unregister a Listener (not a Plugin or a RegisteredListener)
64- then BOOM! the other plugin will throw an error because Rhino can't coerce an
65- equals() method from an Interface.
66- The workaround is to make the ScriptCraftPlugin java class a Listener.
67- Should only unregister() registered plugins in ScriptCraft js code.
68- */
69- regd = new bkRegisteredListener (
70- __plugin ,
71- eventExecutor ,
33+ /*
34+ let handlers use this.cancel() to cancel the current event
35+ or this.unregister() to unregister from future events.
36+ */
37+ var bound = { } ;
38+ for ( var i in result ) {
39+ bound [ i ] = result [ i ] ;
40+ }
41+ bound . cancel = cancel ;
42+ handler . call ( bound , evt , cancel ) ;
43+ } ;
44+
45+ // Create an instance of our empty Listener implementation to track the handler
46+ var listener = new ScriptCraftListener ( ) ;
47+
48+ bkPluginManager . registerEvent (
49+ eventType . class ,
50+ listener ,
7251 priority ,
73- __plugin ,
74- false
52+ eventExecutor ,
53+ __plugin
7554 ) ;
76- handlerList . register ( regd ) ;
55+
7756 result . unregister = function ( ) {
78- handlerList . unregister ( regd ) ;
57+ bkHandlerList . unregisterAll ( listener ) ;
7958 } ;
59+
8060 return result ;
8161} ;
0 commit comments