This repository has been archived on 2021-07-14. You can view files and clone it, but cannot push or open issues or pull requests.
scriptcraft/src/main/js/lib/events-bukkit.js

79 lines
2.4 KiB
JavaScript
Raw Normal View History

/*global Java, exports, org, __plugin */
var bkEventPriority = org.bukkit.event.EventPriority,
bkEventExecutor = org.bukkit.plugin.EventExecutor,
bkRegisteredListener = org.bukkit.plugin.RegisteredListener,
bkEventPackage = 'org.bukkit.event.';
var nashorn = (typeof Java != 'undefined');
function getHandlerListForEventType( eventType ){
var result = null;
var clazz = null;
if (nashorn) {
//Nashorn doesn't like when getHandlerList is in a superclass of your event
//so to avoid this problem, call getHandlerList using java.lang.reflect
//methods
clazz = eventType['class'];
result = clazz.getMethod("getHandlerList").invoke(null);
} else {
result = eventType.getHandlerList();
}
return result;
}
exports.on = function(
/* Java Class */
eventType,
/* function( registeredListener, event) */
handler,
/* (optional) String (HIGH, HIGHEST, LOW, LOWEST, NORMAL, MONITOR), */
priority ) {
var handlerList,
regd,
eventExecutor;
if ( typeof priority == 'undefined' ) {
priority = bkEventPriority.HIGHEST;
} else {
priority = bkEventPriority[priority.toUpperCase().trim()];
}
handlerList = getHandlerListForEventType (eventType);
var result = { };
eventExecutor = new bkEventExecutor( {
execute: function( l, evt ) {
function cancel(){
if (evt instanceof org.bukkit.event.Cancellable){
evt.setCancelled(true);
}
}
/*
let handlers use this.cancel() to cancel the current event
or this.unregister() to unregister from future events.
*/
var bound = {};
for (var i in result){
bound[i] = result[i];
}
bound.cancel = cancel;
handler.call( bound, evt, cancel );
}
} );
/*
wph 20130222 issue #64 bad interaction with Essentials plugin
if another plugin tries to unregister a Listener (not a Plugin or a RegisteredListener)
then BOOM! the other plugin will throw an error because Rhino can't coerce an
equals() method from an Interface.
The workaround is to make the ScriptCraftPlugin java class a Listener.
Should only unregister() registered plugins in ScriptCraft js code.
*/
2016-03-19 13:09:26 +01:00
regd = new bkRegisteredListener( __plugin, eventExecutor, priority, __plugin, false );
handlerList.register( regd );
result.unregister = function(){
handlerList.unregister( regd );
};
return result;
};