diff --git a/src/main/java/com/sk89q/worldedit/WorldEdit.java b/src/main/java/com/sk89q/worldedit/WorldEdit.java index e20a6efa9..6dca280b5 100644 --- a/src/main/java/com/sk89q/worldedit/WorldEdit.java +++ b/src/main/java/com/sk89q/worldedit/WorldEdit.java @@ -23,12 +23,11 @@ import com.sk89q.minecraft.util.commands.CommandsManager; import com.sk89q.worldedit.CuboidClipboard.FlipDirection; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BlockType; -import com.sk89q.worldedit.command.tool.DoubleActionTraceTool; -import com.sk89q.worldedit.command.tool.Tool; -import com.sk89q.worldedit.command.tool.TraceTool; -import com.sk89q.worldedit.event.actor.BlockInteractEvent; +import com.sk89q.worldedit.event.platform.BlockInteractEvent; import com.sk89q.worldedit.event.extent.EditSessionEvent; import com.sk89q.worldedit.event.platform.CommandEvent; +import com.sk89q.worldedit.event.platform.InputType; +import com.sk89q.worldedit.event.platform.PlayerInputEvent; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.extension.platform.PlatformManager; @@ -57,8 +56,8 @@ import java.util.Set; import java.util.logging.Logger; import static com.google.common.base.Preconditions.checkNotNull; -import static com.sk89q.worldedit.event.actor.InteractionType.PRIMARY_INPUT; -import static com.sk89q.worldedit.event.actor.InteractionType.SECONDARY_INPUT; +import static com.sk89q.worldedit.event.platform.Interaction.HIT; +import static com.sk89q.worldedit.event.platform.Interaction.OPEN; /** * The entry point and container for a working implementation of WorldEdit. @@ -722,35 +721,9 @@ public class WorldEdit { * @return true if the swing was handled */ public boolean handleArmSwing(LocalPlayer player) { - if (player.getItemInHand() == getConfiguration().navigationWand) { - if (getConfiguration().navigationWandMaxDistance <= 0) { - return false; - } - - if (!player.hasPermission("worldedit.navigation.jumpto.tool")) { - return false; - } - - WorldVector pos = player.getSolidBlockTrace(getConfiguration().navigationWandMaxDistance); - if (pos != null) { - player.findFreePosition(pos); - } else { - player.printError("No block in sight (or too far)!"); - } - return true; - } - - LocalSession session = getSession(player); - - Tool tool = session.getTool(player.getItemInHand()); - if (tool != null && tool instanceof DoubleActionTraceTool) { - if (tool.canUse(player)) { - ((DoubleActionTraceTool) tool).actSecondary(getServer(), getConfiguration(), player, session); - return true; - } - } - - return false; + PlayerInputEvent event = new PlayerInputEvent(player, InputType.PRIMARY); + getEventBus().post(event); + return event.isCancelled(); } /** @@ -760,33 +733,9 @@ public class WorldEdit { * @return true if the right click was handled */ public boolean handleRightClick(LocalPlayer player) { - if (player.getItemInHand() == getConfiguration().navigationWand) { - if (getConfiguration().navigationWandMaxDistance <= 0) { - return false; - } - - if (!player.hasPermission("worldedit.navigation.thru.tool")) { - return false; - } - - if (!player.passThroughForwardWall(40)) { - player.printError("Nothing to pass through!"); - } - - return true; - } - - LocalSession session = getSession(player); - - Tool tool = session.getTool(player.getItemInHand()); - if (tool != null && tool instanceof TraceTool) { - if (tool.canUse(player)) { - ((TraceTool) tool).actPrimary(getServer(), getConfiguration(), player, session); - return true; - } - } - - return false; + PlayerInputEvent event = new PlayerInputEvent(player, InputType.SECONDARY); + getEventBus().post(event); + return event.isCancelled(); } /** @@ -797,7 +746,7 @@ public class WorldEdit { * @return false if you want the action to go through */ public boolean handleBlockRightClick(LocalPlayer player, WorldVector clicked) { - BlockInteractEvent event = new BlockInteractEvent(player, clicked.toLocation(), SECONDARY_INPUT); + BlockInteractEvent event = new BlockInteractEvent(player, clicked.toLocation(), OPEN); getEventBus().post(event); return event.isCancelled(); } @@ -810,7 +759,7 @@ public class WorldEdit { * @return false if you want the action to go through */ public boolean handleBlockLeftClick(LocalPlayer player, WorldVector clicked) { - BlockInteractEvent event = new BlockInteractEvent(player, clicked.toLocation(), PRIMARY_INPUT); + BlockInteractEvent event = new BlockInteractEvent(player, clicked.toLocation(), HIT); getEventBus().post(event); return event.isCancelled(); } diff --git a/src/main/java/com/sk89q/worldedit/entity/Player.java b/src/main/java/com/sk89q/worldedit/entity/Player.java index 4d5a5b601..0098dc2f4 100644 --- a/src/main/java/com/sk89q/worldedit/entity/Player.java +++ b/src/main/java/com/sk89q/worldedit/entity/Player.java @@ -22,12 +22,13 @@ package com.sk89q.worldedit.entity; import com.sk89q.worldedit.PlayerDirection; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseBlock; +import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.inventory.BlockBag; /** * A player. */ -public interface Player extends Entity { +public interface Player extends Entity, Actor { /** * Returns true if the entity is holding a pick axe. diff --git a/src/main/java/com/sk89q/worldedit/event/actor/BlockInteractEvent.java b/src/main/java/com/sk89q/worldedit/event/platform/BlockInteractEvent.java similarity index 94% rename from src/main/java/com/sk89q/worldedit/event/actor/BlockInteractEvent.java rename to src/main/java/com/sk89q/worldedit/event/platform/BlockInteractEvent.java index cec761cdd..2fdb4e443 100644 --- a/src/main/java/com/sk89q/worldedit/event/actor/BlockInteractEvent.java +++ b/src/main/java/com/sk89q/worldedit/event/platform/BlockInteractEvent.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.event.actor; +package com.sk89q.worldedit.event.platform; import com.sk89q.worldedit.event.Cancellable; import com.sk89q.worldedit.event.Event; @@ -33,7 +33,7 @@ public class BlockInteractEvent extends Event implements Cancellable { private final Actor cause; private final Location location; - private final InteractionType type; + private final Interaction type; private boolean cancelled; /** @@ -43,7 +43,7 @@ public class BlockInteractEvent extends Event implements Cancellable { * @param location the location of the block * @param type the type of interaction */ - public BlockInteractEvent(Actor cause, Location location, InteractionType type) { + public BlockInteractEvent(Actor cause, Location location, Interaction type) { checkNotNull(cause); checkNotNull(location); checkNotNull(type); @@ -75,7 +75,7 @@ public class BlockInteractEvent extends Event implements Cancellable { * * @return the type of interaction */ - public InteractionType getType() { + public Interaction getType() { return type; } diff --git a/src/main/java/com/sk89q/worldedit/event/platform/InputType.java b/src/main/java/com/sk89q/worldedit/event/platform/InputType.java new file mode 100644 index 000000000..4f614d719 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/event/platform/InputType.java @@ -0,0 +1,37 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.event.platform; + +/** + * The type of input sent. + */ +public enum InputType { + + /** + * Left click. + */ + PRIMARY, + + /** + * Right click. + */ + SECONDARY + +} diff --git a/src/main/java/com/sk89q/worldedit/event/actor/InteractionType.java b/src/main/java/com/sk89q/worldedit/event/platform/Interaction.java similarity index 90% rename from src/main/java/com/sk89q/worldedit/event/actor/InteractionType.java rename to src/main/java/com/sk89q/worldedit/event/platform/Interaction.java index f965de7c1..91331fa56 100644 --- a/src/main/java/com/sk89q/worldedit/event/actor/InteractionType.java +++ b/src/main/java/com/sk89q/worldedit/event/platform/Interaction.java @@ -17,20 +17,21 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.event.actor; +package com.sk89q.worldedit.event.platform; /** * The type of interaction. */ -public enum InteractionType { +public enum Interaction { /** * Refers to primary input usage (left click). */ - PRIMARY_INPUT, + HIT, /** * Refers to secondary input usage (right click). */ - SECONDARY_INPUT + OPEN + } diff --git a/src/main/java/com/sk89q/worldedit/event/platform/PlayerInputEvent.java b/src/main/java/com/sk89q/worldedit/event/platform/PlayerInputEvent.java new file mode 100644 index 000000000..2bc39ee97 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/event/platform/PlayerInputEvent.java @@ -0,0 +1,78 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.event.platform; + +import com.sk89q.worldedit.entity.Player; +import com.sk89q.worldedit.event.Cancellable; +import com.sk89q.worldedit.event.Event; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Raised whenever a player sends input. + */ +public class PlayerInputEvent extends Event implements Cancellable { + + private final Player player; + private final InputType inputType; + private boolean cancelled; + + /** + * Create a new event. + * + * @param player the player + * @param inputType the input type + */ + public PlayerInputEvent(Player player, InputType inputType) { + checkNotNull(player); + checkNotNull(inputType); + this.player = player; + this.inputType = inputType; + } + + /** + * Get the player that sent the input. + * + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Get the type of input sent. + * + * @return the input sent + */ + public InputType getInputType() { + return inputType; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + +} diff --git a/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java b/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java index 7ddc5e09c..4a93df9e4 100644 --- a/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java +++ b/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java @@ -20,12 +20,11 @@ package com.sk89q.worldedit.extension.platform; import com.sk89q.worldedit.*; -import com.sk89q.worldedit.command.tool.BlockTool; -import com.sk89q.worldedit.command.tool.DoubleActionBlockTool; -import com.sk89q.worldedit.command.tool.Tool; +import com.sk89q.worldedit.command.tool.*; import com.sk89q.worldedit.entity.Player; -import com.sk89q.worldedit.event.actor.BlockInteractEvent; -import com.sk89q.worldedit.event.actor.InteractionType; +import com.sk89q.worldedit.event.platform.BlockInteractEvent; +import com.sk89q.worldedit.event.platform.Interaction; +import com.sk89q.worldedit.event.platform.PlayerInputEvent; import com.sk89q.worldedit.internal.ServerInterfaceAdapter; import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.util.Location; @@ -213,7 +212,7 @@ public class PlatformManager { Player player = (Player) actor; LocalSession session = worldEdit.getSessionManager().get(actor); - if (event.getType() == InteractionType.PRIMARY_INPUT) { + if (event.getType() == Interaction.HIT) { if (player.getItemInHand() == getConfiguration().wandItem) { if (!session.isToolControlEnabled()) { return; @@ -254,7 +253,7 @@ public class PlatformManager { } } - } else if (event.getType() == InteractionType.SECONDARY_INPUT) { + } else if (event.getType() == Interaction.OPEN) { if (player.getItemInHand() == getConfiguration().wandItem) { if (!session.isToolControlEnabled()) { return; @@ -289,6 +288,88 @@ public class PlatformManager { } } + @Subscribe + public void handlePlayerInput(PlayerInputEvent event) { + Player player = event.getPlayer(); + + switch (event.getInputType()) { + case PRIMARY: { + if (player.getItemInHand() == getConfiguration().navigationWand) { + if (getConfiguration().navigationWandMaxDistance <= 0) { + return; + } + + if (!player.hasPermission("worldedit.navigation.jumpto.tool")) { + return; + } + + WorldVector pos = player.getSolidBlockTrace(getConfiguration().navigationWandMaxDistance); + if (pos != null) { + player.findFreePosition(pos); + } else { + player.printError("No block in sight (or too far)!"); + } + + event.setCancelled(true); + return; + } + + LocalSession session = worldEdit.getSessionManager().get(player); + + if (player instanceof LocalPlayer) { // Temporary workaround + LocalPlayer localPlayer = (LocalPlayer) player; + + Tool tool = session.getTool(player.getItemInHand()); + if (tool != null && tool instanceof DoubleActionTraceTool) { + if (tool.canUse(localPlayer)) { + ((DoubleActionTraceTool) tool).actSecondary(getServerInterface(), getConfiguration(), localPlayer, session); + event.setCancelled(true); + return; + } + } + } + + break; + } + + case SECONDARY: { + if (player.getItemInHand() == getConfiguration().navigationWand) { + if (getConfiguration().navigationWandMaxDistance <= 0) { + return; + } + + if (!player.hasPermission("worldedit.navigation.thru.tool")) { + return; + } + + if (!player.passThroughForwardWall(40)) { + player.printError("Nothing to pass through!"); + } + + event.setCancelled(true); + return; + } + + LocalSession session = worldEdit.getSessionManager().get(player); + + if (player instanceof LocalPlayer) { // Temporary workaround + LocalPlayer localPlayer = (LocalPlayer) player; + + Tool tool = session.getTool(player.getItemInHand()); + if (tool != null && tool instanceof TraceTool) { + if (tool.canUse(localPlayer)) { + ((TraceTool) tool).actPrimary(getServerInterface(), getConfiguration(), localPlayer, session); + event.setCancelled(true); + return; + } + } + } + + break; + } + } + } + /** * A default configuration for when none is set. */