diff options
author | stevenh <steven.hartland@multiplay.co.uk> | 2011-01-29 16:23:56 +0000 |
---|---|---|
committer | stevenh <steven.hartland@multiplay.co.uk> | 2011-01-29 16:23:56 +0000 |
commit | a89a96416b8ae9cea4ccb1ac4ccc2974405398dd (patch) | |
tree | 75dce493ea03d0abc9bef41f800f49e17ced012b /src | |
parent | 5f5ed85bbece25f48f086335610c714ad208dd10 (diff) | |
download | bukkit-a89a96416b8ae9cea4ccb1ac4ccc2974405398dd.tar bukkit-a89a96416b8ae9cea4ccb1ac4ccc2974405398dd.tar.gz bukkit-a89a96416b8ae9cea4ccb1ac4ccc2974405398dd.tar.lz bukkit-a89a96416b8ae9cea4ccb1ac4ccc2974405398dd.tar.xz bukkit-a89a96416b8ae9cea4ccb1ac4ccc2974405398dd.zip |
Refactored event calling so its front loading avoiding the lookup for each event call.
This now uses an annoymous class implementing IExecutor that facilitates direct event method handler calling
Changed commands from being executed exclusively by a player to by a CommandSender to facilitate external command callers such as rcon
Fixed CustomEventListener
Merged in additional events
Added getFullName to PluginDescriptionFile which returns the combination of Name and Version
There's also a few bits of reformatting as it seems someones been editing with either tabs or dos eol :(
Diffstat (limited to 'src')
18 files changed, 540 insertions, 367 deletions
diff --git a/src/main/java/org/bukkit/command/Command.java b/src/main/java/org/bukkit/command/Command.java index 3bb4cb69..6f4aca60 100644 --- a/src/main/java/org/bukkit/command/Command.java +++ b/src/main/java/org/bukkit/command/Command.java @@ -3,7 +3,7 @@ package org.bukkit.command; import java.util.ArrayList; import java.util.List; -import org.bukkit.entity.Player; +import org.bukkit.command.CommandSender; public abstract class Command { private final String name; @@ -17,12 +17,12 @@ public abstract class Command { this.usageMessage = "/" + name; } - public abstract boolean execute(Player player, String currentAlias, String[] args); - + public abstract boolean execute(CommandSender sender, String currentAlias, String[] args); + public String getName() { return name; } - + public List<String> getAliases() { return aliases; } @@ -34,17 +34,17 @@ public abstract class Command { public String getUsage() { return usageMessage; } - + public Command setAliases(List<String> aliases) { this.aliases = aliases; return this; } - + public Command setTooltip(String tooltip) { this.tooltip = tooltip; return this; } - + public Command setUsage(String usage) { this.usageMessage = usage; return this; diff --git a/src/main/java/org/bukkit/command/CommandMap.java b/src/main/java/org/bukkit/command/CommandMap.java index a60ebd17..9d8c2dea 100644 --- a/src/main/java/org/bukkit/command/CommandMap.java +++ b/src/main/java/org/bukkit/command/CommandMap.java @@ -5,7 +5,7 @@ import org.bukkit.entity.Player; public interface CommandMap { /** - * Registers all the commands belonging to a certain plugin. + * Registers all the commands belonging to a certain plugin. * @param plugin * @return */ @@ -13,17 +13,17 @@ public interface CommandMap { /** * Registers a command. Returns true on success; false if name is already taken and fallback had to be used. - * + * * @param a label for this command, without the '/'-prefix. * @return Returns true if command was registered; false if label was already in use. */ public boolean register(String label, String fallbackPrefix, Command command); /** Looks for the requested command and executes it if found. - * + * * @param cmdLine command + arguments. Example: "/test abc 123" * @return targetFound returns false if no target is found. */ - public boolean dispatch(Player sender, String cmdLine); + public boolean dispatch(CommandSender sender, String cmdLine); } diff --git a/src/main/java/org/bukkit/command/PluginCommand.java b/src/main/java/org/bukkit/command/PluginCommand.java index 0f4d2327..16ea3654 100644 --- a/src/main/java/org/bukkit/command/PluginCommand.java +++ b/src/main/java/org/bukkit/command/PluginCommand.java @@ -13,15 +13,15 @@ public final class PluginCommand extends Command { this.usageMessage = ""; } - public boolean execute(Player player, String commandLabel, String[] args) { - boolean cmdSuccess = owningPlugin.onCommand(player, this, commandLabel, args); + public boolean execute(CommandSender sender, String commandLabel, String[] args) { + boolean cmdSuccess = owningPlugin.onCommand(sender, this, commandLabel, args); if (!cmdSuccess && !usageMessage.isEmpty()) { String tmpMsg = usageMessage.replace("<command>", commandLabel); String[] usageLines = tmpMsg.split("\\n"); for(String line: usageLines) { while (line.length() > 0) { int stripChars = (line.length() > 53 ? 53:line.length()); - player.sendMessage(ChatColor.RED + line.substring(0, stripChars)); + sender.sendMessage(ChatColor.RED + line.substring(0, stripChars)); line = line.substring(stripChars); } } diff --git a/src/main/java/org/bukkit/command/SimpleCommandMap.java b/src/main/java/org/bukkit/command/SimpleCommandMap.java index 9415e7ff..21b681b3 100644 --- a/src/main/java/org/bukkit/command/SimpleCommandMap.java +++ b/src/main/java/org/bukkit/command/SimpleCommandMap.java @@ -20,12 +20,12 @@ public final class SimpleCommandMap implements CommandMap { register("reload", "bukkit", new Command("reload") { @Override - public boolean execute(Player player, String currentAlias, String[] args) { - if (player.isOp()) { + public boolean execute(CommandSender sender, String currentAlias, String[] args) { + if (sender.isOp()) { server.reload(); - player.sendMessage(ChatColor.GREEN + "Reload complete."); + sender.sendMessage(ChatColor.GREEN + "Reload complete."); } else { - player.sendMessage(ChatColor.RED + "You do not have sufficient access" + sender.sendMessage(ChatColor.RED + "You do not have sufficient access" + " to reload this server."); } @@ -56,28 +56,28 @@ public final class SimpleCommandMap implements CommandMap { register(name, fallbackPrefix, command); } } - - /** + + /** * {@inheritDoc} */ public boolean register(String name, String fallbackPrefix, Command command) { boolean nameInUse = (knownCommands.get(name) != null); if (nameInUse) name = fallbackPrefix + ":" + name; - + knownCommands.put(name, command); return !nameInUse; } - /** + /** * {@inheritDoc} */ - public boolean dispatch(Player sender, String commandLine) { + public boolean dispatch(CommandSender sender, String commandLine) { String[] args = commandLine.split(" "); String sentCommandLabel = args[0].substring(1); args = Arrays.copyOfRange(args, 1, args.length); - + Command target = knownCommands.get(sentCommandLabel); boolean isRegisteredCommand = (target != null); if (isRegisteredCommand) { @@ -98,12 +98,12 @@ public final class SimpleCommandMap implements CommandMap { } @Override - public boolean execute(Player player, String currentAlias, String[] args) { + public boolean execute(CommandSender sender, String currentAlias, String[] args) { if (args.length == 0) { - player.sendMessage("This server is running " + ChatColor.GREEN + sender.sendMessage("This server is running " + ChatColor.GREEN + server.getName() + ChatColor.WHITE + " version " + ChatColor.GREEN + server.getVersion()); - player.sendMessage("This server is also sporting some funky dev build of Bukkit!"); - player.sendMessage("Plugins: " + getPluginList()); + sender.sendMessage("This server is also sporting some funky dev build of Bukkit!"); + sender.sendMessage("Plugins: " + getPluginList()); } else { StringBuilder name = new StringBuilder(); @@ -118,26 +118,26 @@ public final class SimpleCommandMap implements CommandMap { if (plugin != null) { PluginDescriptionFile desc = plugin.getDescription(); - player.sendMessage(ChatColor.GREEN + desc.getName() + ChatColor.WHITE + " version " + ChatColor.GREEN + desc.getVersion()); + sender.sendMessage(ChatColor.GREEN + desc.getName() + ChatColor.WHITE + " version " + ChatColor.GREEN + desc.getVersion()); if (desc.getDescription() != null) { - player.sendMessage(desc.getDescription()); + sender.sendMessage(desc.getDescription()); } if (desc.getWebsite() != null) { - player.sendMessage("Website: " + ChatColor.GREEN + desc.getWebsite()); + sender.sendMessage("Website: " + ChatColor.GREEN + desc.getWebsite()); } if (!desc.getAuthors().isEmpty()) { if (desc.getAuthors().size() == 1) { - player.sendMessage("Author: " + getAuthors(desc)); + sender.sendMessage("Author: " + getAuthors(desc)); } else { - player.sendMessage("Authors: " + getAuthors(desc)); + sender.sendMessage("Authors: " + getAuthors(desc)); } } } else { - player.sendMessage("This server is not running any plugin by that name."); - player.sendMessage("Plugins: " + getPluginList()); + sender.sendMessage("This server is not running any plugin by that name."); + sender.sendMessage("Plugins: " + getPluginList()); } } diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java index 3baaa0d6..96d97c78 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java @@ -3,12 +3,13 @@ package org.bukkit.entity; import java.net.InetSocketAddress; import org.bukkit.Location; +import org.bukkit.command.CommandSender; /** * Represents a player, connected or not - * + * */ -public interface Player extends HumanEntity { +public interface Player extends HumanEntity, CommandSender { /** * Checks if this player is currently online * @@ -17,20 +18,6 @@ public interface Player extends HumanEntity { public boolean isOnline(); /** - * Checks if this player is currently op - * - * @return true if they are online - */ - public boolean isOp(); - - /** - * Sends this player a message, which will be displayed in their chat - * - * @param message Message to be displayed - */ - public void sendMessage(String message); - - /** * Gets the "friendly" name to display of this player. This may include color. * * Note that this name will not be displayed in game, only in chat and places @@ -49,14 +36,14 @@ public interface Player extends HumanEntity { * @return String containing a color formatted name to display for this player */ public void setDisplayName(String name); - + /** * Set the target of the player's compass. - * + * * @param loc */ public void setCompassTarget(Location loc); - + /** * Gets the socket address of this player * @return the player's address diff --git a/src/main/java/org/bukkit/event/CustomEventListener.java b/src/main/java/org/bukkit/event/CustomEventListener.java index fcc0af83..ca68bdb2 100644 --- a/src/main/java/org/bukkit/event/CustomEventListener.java +++ b/src/main/java/org/bukkit/event/CustomEventListener.java @@ -1,5 +1,19 @@ package org.bukkit.event; -public interface CustomEventListener { - public void onCustomEvent(Event event); -} +import org.bukkit.event.Listener; + +/** + * Handles all custom events + */ +public class CustomEventListener implements Listener { + public CustomEventListener() { + } + + /** + * Called when a player joins a server + * + * @param event Relevant event details + */ + public void onCustomEvent(Event event) { + } +}
\ No newline at end of file diff --git a/src/main/java/org/bukkit/event/Event.java b/src/main/java/org/bukkit/event/Event.java index 548ef0f0..df7e6ad5 100644 --- a/src/main/java/org/bukkit/event/Event.java +++ b/src/main/java/org/bukkit/event/Event.java @@ -38,8 +38,7 @@ public abstract class Event { * @return Name of this event */ public final String getEventName() { - if(type!=Type.CUSTOM_EVENT) return type.toString(); - else return name; + return ( type != Type.CUSTOM_EVENT) ? type.toString() : name; } /** @@ -276,6 +275,13 @@ public abstract class Event { BLOCK_INTERACT (Category.BLOCK), /** + * Called when a block is destroyed from being burnt by fire + * + * @see org.bukkit.event.block.BlockBurnEvent + */ + BLOCK_BURN (Category.BLOCK), + + /** * Called when leaves are decaying naturally * * @see org.bukkit.event.block.LeavesDecayEvent @@ -357,6 +363,13 @@ public abstract class Event { PLUGIN_DISABLE (Category.SERVER), /** + * Called when a plugin is disabled + * + * @see org.bukkit.event.server.PluginEvent + */ + SERVER_COMMAND (Category.SERVER), + + /** * WORLD EVENTS */ @@ -417,7 +430,7 @@ public abstract class Event { * @see org.bukkit.event.entity.EntityDamageByEntityEvent */ ENTITY_DAMAGEDBY_ENTITY (Category.LIVING_ENTITY), - + /** * Called when a LivingEntity is damaged by a projectile Entity * @@ -445,7 +458,7 @@ public abstract class Event { * @todo: add javadoc see comment */ ENTITY_COMBUST (Category.LIVING_ENTITY), - + /** * Called when an entity explodes, either TNT, Creeper, or Ghast Fireball * @@ -454,6 +467,13 @@ public abstract class Event { ENTITY_EXPLODE (Category.LIVING_ENTITY), /** + * Called when an entity targets another entity + * + * @see org.bukkit.event.entity.EntityTargetEvent + */ + ENTITY_TARGET (Category.LIVING_ENTITY), + + /** * VEHICLE EVENTS */ diff --git a/src/main/java/org/bukkit/event/block/BlockListener.java b/src/main/java/org/bukkit/event/block/BlockListener.java index e2c44f8f..ff998b18 100644 --- a/src/main/java/org/bukkit/event/block/BlockListener.java +++ b/src/main/java/org/bukkit/event/block/BlockListener.java @@ -1,97 +1,104 @@ -package org.bukkit.event.block;
-
-import org.bukkit.event.Listener;
-
-/**
- * Handles all events thrown in relation to Blocks
- *
- * @author durron597
- */
-public class BlockListener implements Listener {
- /**
- * Default Constructor
- */
- public BlockListener() {
- }
-
- /**
- * Called when a block is damaged (or broken)
- *
- * @param event Relevant event details
- */
- public void onBlockDamage(BlockDamageEvent event) {
- }
-
- /**
- * Called when we try to place a block, to see if we can build it
- */
- public void onBlockCanBuild(BlockCanBuildEvent event) {
- }
-
- /**
- * Called when a block flows (water/lava)
- *
- * @param event Relevant event details
- */
- public void onBlockFlow(BlockFromToEvent event) {
- }
-
- /**
- * Called when a block gets ignited
- *
- * @param event Relevant event details
- */
- public void onBlockIgnite(BlockIgniteEvent event) {
- }
-
- /**
- * Called when block physics occurs
- *
- * @param event Relevant event details
- */
- public void onBlockPhysics(BlockPhysicsEvent event) {
- }
-
- /**
- * Called when a player places a block
- *
- * @param event Relevant event details
- */
- public void onBlockPlace(BlockPlaceEvent event) {
- }
-
- /**
- * Called when a block is interacted with
- *
- * @param event Relevant event details
- */
- public void onBlockInteract(BlockInteractEvent event) {
- }
-
- /**
- * Called when a player right clicks a block
- *
- * @param event Relevant event details
- */
- public void onBlockRightClick(BlockRightClickEvent event) {
- }
-
- /**
- * Called when redstone changes
- * From: the source of the redstone change
- * To: The redstone dust that changed
- *
- * @param event Relevant event details
- */
- public void onBlockRedstoneChange(BlockFromToEvent event) {
- }
-
- /**
- * Called when leaves are decaying naturally
- *
- * @param event Relevant event details
- */
- public void onLeavesDecay(LeavesDecayEvent event) {
- }
-
-}
+package org.bukkit.event.block; + +import org.bukkit.event.Listener; + +/** + * Handles all events thrown in relation to Blocks + * + * @author durron597 + */ +public class BlockListener implements Listener { + /** + * Default Constructor + */ + public BlockListener() { + } + + /** + * Called when a block is damaged (or broken) + * + * @param event Relevant event details + */ + public void onBlockDamage(BlockDamageEvent event) { + } + + /** + * Called when we try to place a block, to see if we can build it + */ + public void onBlockCanBuild(BlockCanBuildEvent event) { + } + + /** + * Called when a block flows (water/lava) + * + * @param event Relevant event details + */ + public void onBlockFlow(BlockFromToEvent event) { + } + + /** + * Called when a block gets ignited + * + * @param event Relevant event details + */ + public void onBlockIgnite(BlockIgniteEvent event) { + } + + /** + * Called when block physics occurs + * + * @param event Relevant event details + */ + public void onBlockPhysics(BlockPhysicsEvent event) { + } + + /** + * Called when a player places a block + * + * @param event Relevant event details + */ + public void onBlockPlace(BlockPlaceEvent event) { + } + + /** + * Called when a block is interacted with + * + * @param event Relevant event details + */ + public void onBlockInteract(BlockInteractEvent event) { + } + + /** + * Called when a player right clicks a block + * + * @param event Relevant event details + */ + public void onBlockRightClick(BlockRightClickEvent event) { + } + + /** + * Called when redstone changes + * From: the source of the redstone change + * To: The redstone dust that changed + * + * @param event Relevant event details + */ + public void onBlockRedstoneChange(BlockFromToEvent event) { + } + + /** + * Called when leaves are decaying naturally + * + * @param event Relevant event details + */ + public void onLeavesDecay(LeavesDecayEvent event) { + } + + /** + * Called when a block is destroyed from burning + * + * @param event Relevant event details + */ + public void onBlockBurn(BlockBurnEvent event) { + } +} diff --git a/src/main/java/org/bukkit/event/entity/EntityListener.java b/src/main/java/org/bukkit/event/entity/EntityListener.java index 143beb05..3c38f1ed 100644 --- a/src/main/java/org/bukkit/event/entity/EntityListener.java +++ b/src/main/java/org/bukkit/event/entity/EntityListener.java @@ -14,10 +14,10 @@ public class EntityListener implements Listener { public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { } - + public void onEntityDamageByProjectile(EntityDamageByProjectileEvent event) { } - + public void onEntityCombust(EntityCombustEvent event) { } @@ -26,4 +26,10 @@ public class EntityListener implements Listener { public void onEntityExplode(EntityExplodeEvent event) { } + + public void onEntityDeath(EntityDeathEvent event) { + } + + public void onEntityTarget(EntityTargetEvent event) { + } } diff --git a/src/main/java/org/bukkit/event/server/ServerListener.java b/src/main/java/org/bukkit/event/server/ServerListener.java index efc44cf6..7853d367 100644 --- a/src/main/java/org/bukkit/event/server/ServerListener.java +++ b/src/main/java/org/bukkit/event/server/ServerListener.java @@ -22,4 +22,12 @@ public class ServerListener implements Listener { */ public void onPluginDisabled(PluginEvent event) { } + + /** + * Called when a server command is used + * + * @param event Relevant event details + */ + public void onServerCommand(PluginEvent event) { + } } diff --git a/src/main/java/org/bukkit/plugin/Plugin.java b/src/main/java/org/bukkit/plugin/Plugin.java index 73656c8f..ce00bd52 100644 --- a/src/main/java/org/bukkit/plugin/Plugin.java +++ b/src/main/java/org/bukkit/plugin/Plugin.java @@ -4,7 +4,7 @@ package org.bukkit.plugin; import java.io.File; import org.bukkit.Server; import org.bukkit.command.Command; -import org.bukkit.entity.Player; +import org.bukkit.command.CommandSender; import org.bukkit.util.config.Configuration; /** @@ -14,21 +14,21 @@ public interface Plugin { /** * Returns the folder that the plugin data's files are located in. The * folder may not yet exist. - * + * * @return */ public File getDataFolder(); - + /** * Returns the plugin.yaml file containing the details for this plugin * * @return Contents of the plugin.yaml file */ public PluginDescriptionFile getDescription(); - + /** * Returns the main configuration file. It should be loaded. - * + * * @return */ public Configuration getConfiguration(); @@ -63,11 +63,11 @@ public interface Plugin { * Called when this plugin is enabled */ public void onEnable(); - + /** * Called when a command registered by this plugin is received. - * @param commandLabel + * @param commandLabel * @return TODO */ - public boolean onCommand(Player player, Command command, String commandLabel, String[] args); + public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args); } diff --git a/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java b/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java index 841c577c..46aee5a3 100644 --- a/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java +++ b/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java @@ -78,6 +78,15 @@ public final class PluginDescriptionFile { } /** + * Returns the name of a plugin including the version + * + * @return String name + */ + public String getFullName() { + return name + " v" + version; + } + + /** * Returns the main class for a plugin * * @return Java classpath @@ -85,7 +94,7 @@ public final class PluginDescriptionFile { public String getMain() { return main; } - + public Object getCommands() { return commands; } diff --git a/src/main/java/org/bukkit/plugin/PluginLoader.java b/src/main/java/org/bukkit/plugin/PluginLoader.java index d8a26644..cc19455e 100644 --- a/src/main/java/org/bukkit/plugin/PluginLoader.java +++ b/src/main/java/org/bukkit/plugin/PluginLoader.java @@ -5,6 +5,7 @@ import java.io.File; import java.util.regex.Pattern; import org.bukkit.event.Event; +import org.bukkit.event.Listener; /** * Represents a plugin loader, which handles direct access to specific types @@ -27,13 +28,12 @@ public interface PluginLoader { public Pattern[] getPluginFileFilters(); /** - * Calls a player related event with the given details + * Creates and returns an event executor * - * @param registration Registered information on the plugin to call about this event - * @param type Type of player related event to call - * @param event Event details + * @param type Type of the event executor to create + * @param listener the object that will handle the eventual call back */ - public void callEvent(RegisteredListener registration, Event event); + public IExecutor createExecutor(Event.Type type, Listener listener); /** * Enables the specified plugin diff --git a/src/main/java/org/bukkit/plugin/PluginManager.java b/src/main/java/org/bukkit/plugin/PluginManager.java index b42da9eb..df86ec6c 100644 --- a/src/main/java/org/bukkit/plugin/PluginManager.java +++ b/src/main/java/org/bukkit/plugin/PluginManager.java @@ -94,6 +94,17 @@ public interface PluginManager { public void registerEvent(Event.Type type, Listener listener, Priority priority, Plugin plugin); /** + * Registers the given event to the specified executor + * + * @param type EventType to register + * @param listener Listener to register + * @param executor IExecutor to register + * @param priority Priority of this event + * @param plugin Plugin to register + */ + public void registerEvent(Event.Type type, Listener listener, IExecutor executor, Priority priority, Plugin plugin); + + /** * Enables the specified plugin * * Attempting to enable a plugin that is already enabled will have no effect diff --git a/src/main/java/org/bukkit/plugin/RegisteredListener.java b/src/main/java/org/bukkit/plugin/RegisteredListener.java index 1ee5a1c7..06de0d57 100644 --- a/src/main/java/org/bukkit/plugin/RegisteredListener.java +++ b/src/main/java/org/bukkit/plugin/RegisteredListener.java @@ -3,6 +3,7 @@ package org.bukkit.plugin; import org.bukkit.event.Event; import org.bukkit.event.Listener; +import org.bukkit.plugin.IExecutor; /** * Stores relevant information for plugin listeners @@ -11,11 +12,20 @@ public class RegisteredListener { private final Listener listener; private final Event.Priority priority; private final Plugin plugin; + private final IExecutor executor; - public RegisteredListener(final Listener pluginListener, final Event.Priority eventPriority, final Plugin registeredPlugin) { + public RegisteredListener(final Listener pluginListener, final IExecutor eventExecutor, final Event.Priority eventPriority, final Plugin registeredPlugin ) { listener = pluginListener; priority = eventPriority; plugin = registeredPlugin; + executor = eventExecutor; + } + + public RegisteredListener(final Listener pluginListener, final Event.Priority eventPriority, final Plugin registeredPlugin, Event.Type type ) { + listener = pluginListener; + priority = eventPriority; + plugin = registeredPlugin; + executor = registeredPlugin.getPluginLoader().createExecutor( type, pluginListener ); } /** @@ -41,4 +51,12 @@ public class RegisteredListener { public Event.Priority getPriority() { return priority; } + + /** + * Calls the event executor + * @return Registered Priority + */ + public void callEvent(Event event) { + executor.execute( listener, event ); + } } diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java index a3899f56..e93b07a5 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -193,15 +193,11 @@ public final class SimplePluginManager implements PluginManager { if (eventListeners != null) { for (RegisteredListener registration : eventListeners) { - Plugin plugin = registration.getPlugin(); - PluginLoader loader = plugin.getPluginLoader(); - - if (plugin.isEnabled()) { - try { - loader.callEvent(registration, event); - } catch (Throwable ex) { - Logger.getLogger(SimplePluginManager.class.getName()).log(Level.SEVERE, "Could not pass event " + event.getType() + " to " + plugin.getDescription().getName(), ex); - } + // NOTE: no need to check isEnabled as all disabled plugins have their listeners disabled + try { + registration.callEvent( event ); + } catch (Throwable ex) { + Logger.getLogger(SimplePluginManager.class.getName()).log(Level.SEVERE, "Could not pass event " + event.getType() + " to " + registration.getPlugin().getDescription().getName(), ex); } } } @@ -216,19 +212,43 @@ public final class SimplePluginManager implements PluginManager { * @param plugin Plugin to register */ public void registerEvent(Event.Type type, Listener listener, Priority priority, Plugin plugin) { + getEventListeners( type ).offer(new RegisteredListener(listener, priority, plugin, type)); + } + + /** + * Registers the given event to the specified listener + * + * @param type EventType to register + * @param listener PlayerListener to register + * @param priority Priority of this event + * @param plugin Plugin to register + */ + public void registerEvent(Event.Type type, Listener listener, IExecutor executor, Priority priority, Plugin plugin) { + getEventListeners( type ).offer(new RegisteredListener(listener, executor, priority, plugin)); + } + + /** + * Returns a PriorityQueue of RegisteredListener for the specified event type creating a new queue if needed + * + * @param type EventType to lookup + * @return PriorityQueue<RegisteredListener> the looked up or create queue matching the requested type + */ + private PriorityQueue<RegisteredListener> getEventListeners( Event.Type type ) + { PriorityQueue<RegisteredListener> eventListeners = listeners.get(type); - if (eventListeners == null) { - eventListeners = new PriorityQueue<RegisteredListener>(11, - new Comparator<RegisteredListener>( ) { - public int compare(RegisteredListener i, RegisteredListener j) { - return i.getPriority().compareTo(j.getPriority()); - } - } - ); - listeners.put(type, eventListeners); + if (eventListeners != null) { + return eventListeners; } - eventListeners.offer(new RegisteredListener(listener, priority, plugin)); + eventListeners = new PriorityQueue<RegisteredListener>( + 11, new Comparator<RegisteredListener>() { + public int compare(RegisteredListener i, RegisteredListener j) { + return i.getPriority().compareTo(j.getPriority()); + } + } + ); + listeners.put(type, eventListeners); + return eventListeners; } } diff --git a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java index 69e50861..5c47d396 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java @@ -4,7 +4,7 @@ package org.bukkit.plugin.java; import java.io.File; import org.bukkit.Server; import org.bukkit.command.Command; -import org.bukkit.entity.Player; +import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginLoader; @@ -49,7 +49,7 @@ public abstract class JavaPlugin implements Plugin { /** * Returns the folder that the plugin data's files are located in. The * folder may not yet exist. - * + * * @return */ public File getDataFolder() { @@ -100,13 +100,13 @@ public abstract class JavaPlugin implements Plugin { public PluginDescriptionFile getDescription() { return description; } - + /** * Returns the main configuration located at * <plugin name>/config.yml and loads the file. If the configuration file * does not exist and it cannot be loaded, no error will be emitted and * the configuration file will have no values. - * + * * @return */ public Configuration getConfiguration() { @@ -138,11 +138,11 @@ public abstract class JavaPlugin implements Plugin { } } } - + /** * Called when a command registered by this plugin is received. */ - public boolean onCommand(Player player, Command cmd, String commandLabel, String[] args) { + public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { return false; // default implementation: do nothing! } } diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java index 3886027a..cf08ccbd 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java @@ -16,16 +16,9 @@ import org.bukkit.event.CustomEventListener; import org.bukkit.event.Event; import org.bukkit.event.Listener; import org.bukkit.event.block.*; -import org.bukkit.event.entity.EntityCombustEvent; -import org.bukkit.event.entity.EntityDamageByBlockEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageByProjectileEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.entity.EntityListener; +import org.bukkit.event.entity.*; import org.bukkit.event.player.*; -import org.bukkit.event.server.PluginEvent; -import org.bukkit.event.server.ServerListener; +import org.bukkit.event.server.*; import org.bukkit.event.vehicle.*; import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.ChunkUnloadEvent; @@ -77,7 +70,7 @@ public final class JavaPluginLoader implements PluginLoader { Class<?> jarClass = Class.forName(description.getMain(), true, loader); Class<? extends JavaPlugin> plugin = jarClass.asSubclass(JavaPlugin.class); Constructor<? extends JavaPlugin> constructor = plugin.getConstructor(PluginLoader.class, Server.class, PluginDescriptionFile.class, File.class, File.class, ClassLoader.class); - + result = constructor.newInstance(this, server, description, dataFolder, file, loader); } catch (Throwable ex) { throw new InvalidPluginException(ex); @@ -85,13 +78,13 @@ public final class JavaPluginLoader implements PluginLoader { return (Plugin)result; } - + private File getDataFolder(File file) { File dataFolder = null; - + String filename = file.getName(); int index = file.getName().lastIndexOf("."); - + if (index != -1) { String name = filename.substring(0, index); dataFolder = new File(file.getParentFile(), name); @@ -100,9 +93,9 @@ public final class JavaPluginLoader implements PluginLoader { // Using _ to prevent name collision dataFolder = new File(file.getParentFile(), filename + "_"); } - + //dataFolder.mkdirs(); - + return dataFolder; } @@ -118,158 +111,238 @@ public final class JavaPluginLoader implements PluginLoader { classes.put(name, clazz); } - public void callEvent(RegisteredListener registration, Event event) { - Listener listener = registration.getListener(); - - if (listener instanceof PlayerListener) { - PlayerListener trueListener = (PlayerListener)listener; - - switch (event.getType()) { - case PLAYER_JOIN: - trueListener.onPlayerJoin((PlayerEvent)event); - break; - case PLAYER_QUIT: - trueListener.onPlayerQuit((PlayerEvent)event); - break; - case PLAYER_COMMAND: - trueListener.onPlayerCommand((PlayerChatEvent)event); - break; - case PLAYER_CHAT: - trueListener.onPlayerChat((PlayerChatEvent)event); - break; - case PLAYER_MOVE: - trueListener.onPlayerMove((PlayerMoveEvent)event); - break; - case PLAYER_TELEPORT: - trueListener.onPlayerTeleport((PlayerMoveEvent)event); - break; - case PLAYER_ITEM: - trueListener.onPlayerItem((PlayerItemEvent)event); - break; - case PLAYER_LOGIN: - trueListener.onPlayerLogin((PlayerLoginEvent)event); - break; - case PLAYER_EGG_THROW: - trueListener.onPlayerEggThrow((PlayerEggThrowEvent)event); - break; - case PLAYER_ANIMATION: - trueListener.onPlayerAnimation((PlayerAnimationEvent)event); - break; - } - } else if (listener instanceof BlockListener) { - BlockListener trueListener = (BlockListener)listener; - - switch (event.getType()) { - case BLOCK_PHYSICS: - trueListener.onBlockPhysics((BlockPhysicsEvent)event); - break; - case BLOCK_CANBUILD: - trueListener.onBlockCanBuild((BlockCanBuildEvent)event); - break; - case BLOCK_RIGHTCLICKED: - trueListener.onBlockRightClick((BlockRightClickEvent) event); - break; - case BLOCK_PLACED: - trueListener.onBlockPlace((BlockPlaceEvent)event); - break; - case BLOCK_DAMAGED: - trueListener.onBlockDamage((BlockDamageEvent)event); - break; - case BLOCK_INTERACT: - trueListener.onBlockInteract((BlockInteractEvent)event); - break; - case BLOCK_FLOW: - trueListener.onBlockFlow((BlockFromToEvent)event); - break; - case LEAVES_DECAY: - trueListener.onLeavesDecay((LeavesDecayEvent)event); - break; - case BLOCK_IGNITE: - trueListener.onBlockIgnite((BlockIgniteEvent)event); - break; - case REDSTONE_CHANGE: - trueListener.onBlockRedstoneChange((BlockFromToEvent)event); - break; - } - } else if(listener instanceof ServerListener) { - ServerListener trueListener = (ServerListener)listener; - - switch (event.getType()) { - case PLUGIN_ENABLE: - trueListener.onPluginEnabled((PluginEvent)event); - break; - case PLUGIN_DISABLE: - trueListener.onPluginDisabled((PluginEvent)event); - break; - } - } else if(listener instanceof WorldListener) { - WorldListener trueListener = (WorldListener)listener; - - switch (event.getType()) { - case CHUNK_LOADED: - trueListener.onChunkLoaded((ChunkLoadEvent)event); - break; - case CHUNK_UNLOADED: - trueListener.onChunkUnloaded((ChunkUnloadEvent)event); - break; - } - } else if(listener instanceof EntityListener) { - EntityListener trueListener = (EntityListener) listener; - switch(event.getType()) - { - case ENTITY_DAMAGEDBY_BLOCK: - trueListener.onEntityDamageByBlock((EntityDamageByBlockEvent)event); - break; - case ENTITY_DAMAGEDBY_ENTITY: - trueListener.onEntityDamageByEntity((EntityDamageByEntityEvent)event); - break; - case ENTITY_DAMAGEDBY_PROJECTILE: - trueListener.onEntityDamageByProjectile((EntityDamageByProjectileEvent)event); - break; - case ENTITY_DAMAGED: - trueListener.onEntityDamage((EntityDamageEvent)event); - break; - case ENTITY_DEATH: - // TODO: ENTITY_DEATH hook - break; - case ENTITY_COMBUST: - trueListener.onEntityCombust((EntityCombustEvent)event); - break; - case ENTITY_EXPLODE: - trueListener.onEntityExplode((EntityExplodeEvent)event); - break; - } - } else if (listener instanceof VehicleListener) { - VehicleListener trueListener = (VehicleListener)listener; - - switch (event.getType()) { - case VEHICLE_CREATE: - trueListener.onVehicleCreate((VehicleCreateEvent)event); - break; - case VEHICLE_DAMAGE: - trueListener.onVehicleDamage((VehicleDamageEvent)event); - break; - case VEHICLE_COLLISION_BLOCK: - trueListener.onVehicleBlockCollision((VehicleBlockCollisionEvent)event); - break; - case VEHICLE_COLLISION_ENTITY: - trueListener.onVehicleEntityCollision((VehicleEntityCollisionEvent)event); - break; - case VEHICLE_ENTER: - trueListener.onVehicleEnter((VehicleEnterEvent)event); - break; - case VEHICLE_EXIT: - trueListener.onVehicleExit((VehicleExitEvent)event); - break; - case VEHICLE_MOVE: - trueListener.onVehicleMove((VehicleMoveEvent)event); - break; - } - } else if(listener instanceof CustomEventListener) { - if(event.getType()==Event.Type.CUSTOM_EVENT) { - ((CustomEventListener)listener).onCustomEvent(event); - } + public IExecutor createExecutor( Event.Type type, Listener listener ) { + // TODO: remove multiple Listener type and hence casts + switch (type) { + // Player Events + case PLAYER_JOIN: + return new IExecutor() { + public void execute( Listener listener, Event event ) { + ((PlayerListener)listener).onPlayerJoin( (PlayerEvent)event ); + } + }; + case PLAYER_QUIT: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((PlayerListener)listener).onPlayerQuit( (PlayerEvent)event ); + } + }; + case PLAYER_COMMAND: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((PlayerListener)listener).onPlayerCommand( (PlayerChatEvent)event ); + } + }; + case PLAYER_CHAT: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((PlayerListener)listener).onPlayerChat( (PlayerChatEvent)event ); + } + }; + case PLAYER_MOVE: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((PlayerListener)listener).onPlayerMove( (PlayerMoveEvent)event ); + } + }; + case PLAYER_TELEPORT: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((PlayerListener)listener).onPlayerTeleport( (PlayerMoveEvent)event ); + } + }; + case PLAYER_ITEM: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((PlayerListener)listener).onPlayerItem( (PlayerItemEvent)event ); + } + }; + case PLAYER_LOGIN: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((PlayerListener)listener).onPlayerLogin( (PlayerLoginEvent)event ); + } + }; + case PLAYER_EGG_THROW: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((PlayerListener)listener).onPlayerEggThrow( (PlayerEggThrowEvent)event ); + } + }; + case PLAYER_ANIMATION: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((PlayerListener)listener).onPlayerAnimation( (PlayerAnimationEvent)event ); + } + }; + + // Block Events + case BLOCK_PHYSICS: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((BlockListener)listener).onBlockPhysics( (BlockPhysicsEvent)event ); + } + }; + case BLOCK_CANBUILD: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((BlockListener)listener).onBlockCanBuild( (BlockCanBuildEvent)event ); + } + }; + case BLOCK_RIGHTCLICKED: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((BlockListener)listener).onBlockRightClick( (BlockRightClickEvent)event ); + } + }; + case BLOCK_PLACED: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((BlockListener)listener).onBlockPlace( (BlockPlaceEvent)event ); + } + }; + case BLOCK_DAMAGED: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((BlockListener)listener).onBlockDamage( (BlockDamageEvent)event ); + } + }; + case BLOCK_INTERACT: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((BlockListener)listener).onBlockInteract( (BlockInteractEvent)event ); + } + }; + case BLOCK_FLOW: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((BlockListener)listener).onBlockFlow( (BlockFromToEvent)event ); + } + }; + case LEAVES_DECAY: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((BlockListener)listener).onLeavesDecay( (LeavesDecayEvent)event ); + } + }; + case BLOCK_IGNITE: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((BlockListener)listener).onBlockIgnite( (BlockIgniteEvent)event ); + } + }; + case REDSTONE_CHANGE: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((BlockListener)listener).onBlockRedstoneChange( (BlockFromToEvent)event ); + } + }; + + case BLOCK_BURN: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((BlockListener)listener).onBlockBurn( (BlockBurnEvent)event ); + } + }; + + // Server Events + case PLUGIN_ENABLE: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((ServerListener)listener).onPluginEnabled( (PluginEvent)event ); + } + }; + case PLUGIN_DISABLE: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((ServerListener)listener).onPluginDisabled( (PluginEvent)event ); + } + }; + + case SERVER_COMMAND: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((ServerListener)listener).onServerCommand( (ServerCommandEvent)event ); + } + }; + + // World Events + case CHUNK_LOADED: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((WorldListener)listener).onChunkLoaded( (ChunkLoadEvent)event ); + } + }; + case CHUNK_UNLOADED: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((WorldListener)listener).onChunkUnloaded( (ChunkUnloadEvent)event ); + } + }; + + // Entity Events + case ENTITY_DAMAGEDBY_BLOCK: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((EntityListener)listener).onEntityDamageByBlock( (EntityDamageByBlockEvent)event ); + } + }; + case ENTITY_DAMAGEDBY_ENTITY: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((EntityListener)listener).onEntityDamageByEntity( (EntityDamageByEntityEvent)event ); + } + }; + case ENTITY_DAMAGEDBY_PROJECTILE: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((EntityListener)listener).onEntityDamageByProjectile( (EntityDamageByProjectileEvent)event ); + } + }; + case ENTITY_DAMAGED: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((EntityListener)listener).onEntityDamage( (EntityDamageEvent)event ); + } + }; + case ENTITY_DEATH: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((EntityListener)listener).onEntityDeath( (EntityDeathEvent)event ); + } + }; + case ENTITY_COMBUST: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((EntityListener)listener).onEntityCombust( (EntityCombustEvent)event ); + } + }; + case ENTITY_EXPLODE: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((EntityListener)listener).onEntityExplode( (EntityExplodeEvent)event ); + } + }; + case ENTITY_TARGET: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((EntityListener)listener).onEntityTarget( (EntityTargetEvent)event ); + } + }; + + // Vehicle Events + case VEHICLE_CREATE: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((VehicleListener)listener).onVehicleCreate( (VehicleCreateEvent)event ); + } + }; + case VEHICLE_DAMAGE: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((VehicleListener)listener).onVehicleDamage( (VehicleDamageEvent)event ); + } + }; + case VEHICLE_COLLISION_BLOCK: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((VehicleListener)listener).onVehicleBlockCollision( (VehicleBlockCollisionEvent)event ); + } + }; + case VEHICLE_COLLISION_ENTITY: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((VehicleListener)listener).onVehicleEntityCollision( (VehicleEntityCollisionEvent)event ); + } + }; + case VEHICLE_ENTER: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((VehicleListener)listener).onVehicleEnter( (VehicleEnterEvent)event ); + } + }; + case VEHICLE_EXIT: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((VehicleListener)listener).onVehicleExit( (VehicleExitEvent)event ); + } + }; + case VEHICLE_MOVE: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((VehicleListener)listener).onVehicleMove( (VehicleMoveEvent)event ); + } + }; + + // Custom Events + case CUSTOM_EVENT: + return new IExecutor() { public void execute( Listener listener, Event event ) { + ((CustomEventListener)listener).onCustomEvent( event ); + } + }; } + + throw new IllegalArgumentException( "Event " + type + " is not supported" ); } public void enablePlugin(final Plugin plugin) { @@ -281,7 +354,7 @@ public final class JavaPluginLoader implements PluginLoader { JavaPlugin jPlugin = (JavaPlugin)plugin; server.getPluginManager().callEvent(new PluginEvent(Event.Type.PLUGIN_ENABLE, plugin)); - + jPlugin.setEnabled(true); } } |