summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/net/cflems/mc/sandbox/Sandbox.java15
-rw-r--r--src/main/java/net/cflems/mc/sandbox/commands/Lightning.java92
-rw-r--r--src/main/java/net/cflems/mc/sandbox/commands/PowerTool.java33
-rw-r--r--src/main/java/net/cflems/mc/sandbox/listeners/PowerToolListener.java45
-rw-r--r--src/main/resources/plugin.yml7
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: