diff options
Diffstat (limited to 'src')
5 files changed, 141 insertions, 51 deletions
diff --git a/src/main/java/net/cflems/mc/sandbox/Sandbox.java b/src/main/java/net/cflems/mc/sandbox/Sandbox.java index 63439ce..8fd11b8 100644 --- a/src/main/java/net/cflems/mc/sandbox/Sandbox.java +++ b/src/main/java/net/cflems/mc/sandbox/Sandbox.java @@ -1,8 +1,8 @@ package net.cflems.mc.sandbox; import net.cflems.mc.sandbox.commands.*; -import net.cflems.mc.sandbox.listeners.PowerToolListener; import net.cflems.mc.sandbox.storage.PowerToolStore; +import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; public class Sandbox extends JavaPlugin { @@ -12,16 +12,21 @@ public class Sandbox extends JavaPlugin { @Override public void onEnable() { PowerToolStore.registerSerializables(); - PowerToolStore powerToolStore = new PowerToolStore(getDataFolder()); - getServer().getPluginManager().registerEvents(new PowerToolListener(powerToolStore), this); + + PluginManager pluginManager = getServer().getPluginManager(); this.getCommand("enchant").setExecutor(new Enchant()); this.getCommand("fly").setExecutor(new Fly()); this.getCommand("repair").setExecutor(new Repair()); this.getCommand("fireball").setExecutor(new Fireball()); - PowerTool powerTool = new PowerTool(powerToolStore); - this.getCommand("powertool").setExecutor(new PowerTool(powerToolStore)); + Lightning lightning = new Lightning(); + pluginManager.registerEvents(lightning, this); + this.getCommand("lightning").setExecutor(lightning); + + PowerTool powerTool = new PowerTool(new PowerToolStore(getDataFolder())); + pluginManager.registerEvents(powerTool, this); + this.getCommand("powertool").setExecutor(powerTool); this.getCommand("ptsu").setExecutor(new PTSU(powerTool)); } } diff --git a/src/main/java/net/cflems/mc/sandbox/commands/Lightning.java b/src/main/java/net/cflems/mc/sandbox/commands/Lightning.java new file mode 100644 index 0000000..d0565c6 --- /dev/null +++ b/src/main/java/net/cflems/mc/sandbox/commands/Lightning.java @@ -0,0 +1,92 @@ +package net.cflems.mc.sandbox.commands; + +import net.cflems.mc.sandbox.CommandUtils; +import net.cflems.mc.sandbox.DelegableCommand; +import net.cflems.mc.sandbox.Sandbox; +import org.bukkit.Bukkit; +import org.bukkit.FluidCollisionMode; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.LightningStrike; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.util.RayTraceResult; + +public final class Lightning extends DelegableCommand implements Listener { + private static final String PERMISSION = Sandbox.PERMISSION_NAMESPACE + ".lightning"; + private static final String PLAYER_PERMISSION = PERMISSION + ".player"; + private static final int MAX_DISTANCE = 100; + + @Override + public boolean executeAs( + CommandSender sender, + CommandSender effectiveSender, + Command command, + String label, + String[] args) { + if (args.length > 1) return false; + if (!effectiveSender.hasPermission(PERMISSION)) { + CommandUtils.respond(sender, "You do not have permission to use lightning."); + return true; + } + + LightningStrike lightningStrike; + if (args.length > 0) { + if (!effectiveSender.hasPermission(PLAYER_PERMISSION)) { + CommandUtils.respond(sender, "You do not have permission to smite players with lightning."); + return true; + } + + Player targetPlayer = Bukkit.getPlayer(args[0]); + if (targetPlayer == null) { + CommandUtils.respond(sender, "That player does not exist or is not online."); + return true; + } + + lightningStrike = targetPlayer.getWorld().strikeLightning(targetPlayer.getLocation()); + } else { + if (!(sender instanceof Player player)) { + CommandUtils.respond(sender, "Only players can use lightning without smiting a target."); + return true; + } + + RayTraceResult rayTraceResult = + player + .getWorld() + .rayTrace( + player.getEyeLocation(), + player.getEyeLocation().getDirection(), + MAX_DISTANCE, + FluidCollisionMode.NEVER, + true, + 0, + entity -> !entity.equals(player)); + if (rayTraceResult == null) { + return true; + } + + lightningStrike = + player + .getWorld() + .strikeLightning(rayTraceResult.getHitPosition().toLocation(player.getWorld())); + } + + if (sender instanceof Player player) lightningStrike.setCausingPlayer(player); + return true; + } + + @EventHandler(priority = EventPriority.NORMAL) + public void onEntityDamage(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof LightningStrike lightningStrike)) return; + Player causingPlayer = lightningStrike.getCausingPlayer(); + if (causingPlayer == null) return; + + int causingPlayerLevel = causingPlayer.getLevel(); + int levelCost = (int) Math.sqrt(causingPlayerLevel); + event.setDamage(4 * levelCost); + causingPlayer.setLevel(Math.max(causingPlayerLevel - levelCost, 0)); + } +} diff --git a/src/main/java/net/cflems/mc/sandbox/commands/PowerTool.java b/src/main/java/net/cflems/mc/sandbox/commands/PowerTool.java index 063f5b3..23e25c5 100644 --- a/src/main/java/net/cflems/mc/sandbox/commands/PowerTool.java +++ b/src/main/java/net/cflems/mc/sandbox/commands/PowerTool.java @@ -1,17 +1,26 @@ package net.cflems.mc.sandbox.commands; +import java.util.List; import net.cflems.mc.sandbox.CommandUtils; import net.cflems.mc.sandbox.DelegableCommand; import net.cflems.mc.sandbox.Sandbox; import net.cflems.mc.sandbox.storage.NoMetaException; +import net.cflems.mc.sandbox.storage.PowerToolBinding; import net.cflems.mc.sandbox.storage.PowerToolStore; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; -public final class PowerTool extends DelegableCommand { +public final class PowerTool extends DelegableCommand implements Listener { private static final String PERMISSION = Sandbox.PERMISSION_NAMESPACE + ".powertool"; + private static final String USE_PERMISSION = PERMISSION + ".use"; private static final String RELOAD_PERMISSION = PERMISSION + ".reload"; private final PowerToolStore store; @@ -64,4 +73,26 @@ public final class PowerTool extends DelegableCommand { } return true; } + + @EventHandler(priority = EventPriority.NORMAL) + public void onPlayerInteract(PlayerInteractEvent event) { + if (!event.hasItem() + || event.useItemInHand().equals(Event.Result.DENY) + || (event.getAction() != Action.RIGHT_CLICK_AIR + && event.getAction() != Action.RIGHT_CLICK_BLOCK)) return; + + List<PowerToolBinding> commands = store.get(event.getItem()); + if (commands.isEmpty()) return; + + Player player = event.getPlayer(); + if (!player.hasPermission(USE_PERMISSION)) { + CommandUtils.respond(player, "You do not have permission to use power tools."); + return; + } + + commands.forEach( + binding -> + CommandUtils.delegateCommand(player, binding.effectivePlayerId(), binding.command())); + event.setCancelled(true); + } } diff --git a/src/main/java/net/cflems/mc/sandbox/listeners/PowerToolListener.java b/src/main/java/net/cflems/mc/sandbox/listeners/PowerToolListener.java deleted file mode 100644 index 8f4211a..0000000 --- a/src/main/java/net/cflems/mc/sandbox/listeners/PowerToolListener.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.cflems.mc.sandbox.listeners; - -import java.util.List; -import net.cflems.mc.sandbox.CommandUtils; -import net.cflems.mc.sandbox.storage.PowerToolBinding; -import net.cflems.mc.sandbox.storage.PowerToolStore; -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerInteractEvent; - -public final class PowerToolListener implements Listener { - private static final String USE_PT_PERMISSION = "sandbox.powertool.use"; - - private final PowerToolStore store; - - public PowerToolListener(PowerToolStore store) { - this.store = store; - } - - @EventHandler(priority = EventPriority.NORMAL) - public void onPlayerInteract(PlayerInteractEvent event) { - if (!event.hasItem() - || event.useItemInHand().equals(Event.Result.DENY) - || (event.getAction() != Action.RIGHT_CLICK_AIR - && event.getAction() != Action.RIGHT_CLICK_BLOCK)) return; - - List<PowerToolBinding> commands = store.get(event.getItem()); - if (commands.isEmpty()) return; - - Player player = event.getPlayer(); - if (!player.hasPermission(USE_PT_PERMISSION)) { - CommandUtils.respond(player, "You do not have permission to use power tools."); - return; - } - - commands.forEach( - binding -> - CommandUtils.delegateCommand(player, binding.effectivePlayerId(), binding.command())); - event.setCancelled(true); - } -} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index b4db8ad..a360809 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -20,6 +20,9 @@ commands: fireball: usage: /fireball [power] description: Shoots a fireball, optionally with the desired power. + lightning: + usage: /lightning [player] + description: Shoots a lightning bolt, optionally smiting to specified player. powertool: aliases: [ "pt" ] usage: /powertool [command...] @@ -60,6 +63,10 @@ permissions: description: Permission to use fireballs. sandbox.fireball.custom: description: Permission to use fireballs with custom power. + sandbox.lightning: + description: Permission to use lightning. + sandbox.lightning.player: + description: Permission to use lightning to smite players. sandbox.powertool: description: Permission to modify power tools. sandbox.powertool.use: |
