Browse Source

Adding public method to spawn missile and fireball as player

RedstoneFuture 3 years ago
parent
commit
511d288d78

+ 50 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Game.java

@@ -45,12 +45,15 @@ import de.butzlabben.missilewars.wrapper.event.PlayerArenaJoinEvent;
 import de.butzlabben.missilewars.wrapper.game.MissileGameEquipment;
 import de.butzlabben.missilewars.wrapper.game.SpecialGameEquipment;
 import de.butzlabben.missilewars.wrapper.game.Team;
+import de.butzlabben.missilewars.wrapper.missile.Missile;
+import de.butzlabben.missilewars.wrapper.missile.MissileFacing;
 import de.butzlabben.missilewars.wrapper.player.MWPlayer;
 import de.butzlabben.missilewars.wrapper.stats.FightStats;
 import lombok.Getter;
 import lombok.ToString;
 import org.bukkit.*;
 import org.bukkit.enchantments.Enchantment;
+import org.bukkit.entity.Fireball;
 import org.bukkit.entity.Player;
 import org.bukkit.event.HandlerList;
 import org.bukkit.inventory.ItemStack;
@@ -481,6 +484,53 @@ public class Game {
         Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> player.spigot().respawn(), 20L);
     }
 
+    /**
+     * This method spawns the missile for the player.
+     *
+     * @param player the executing player
+     */
+    public void spawnMissile(Player player, ItemStack itemStack) {
+
+        // Are missiles only allowed to spawn inside the arena, between the two arena spawn points?
+        boolean isOnlyBetweenSpawnPlaceable = this.arena.getMissileConfiguration().isOnlyBetweenSpawnPlaceable();
+        if (isOnlyBetweenSpawnPlaceable) {
+            if (!this.arena.isInBetween(player.getLocation().toVector(), this.arena.getPlane1(), this.arena.getPlane2())) {
+                player.sendMessage(MessageConfig.getMessage("missile_place_deny"));
+                return;
+            }
+        }
+
+        Missile missile = this.arena.getMissileConfiguration().getMissileFromName(itemStack.getItemMeta().getDisplayName());
+        if (missile == null) {
+            player.sendMessage(MessageConfig.getMessage("invalid_missile"));
+            return;
+        }
+        itemStack.setAmount(itemStack.getAmount() - 1);
+        player.setItemInHand(itemStack);
+        missile.paste(player, MissileFacing.getFacingPlayer(player, this.arena.getMissileConfiguration()), this);
+    }
+
+    /**
+     * This method spawns the fireball for the player.
+     *
+     * @param player the executing player
+     */
+    public void spawnFireball(Player player, ItemStack itemStack) {
+        int amount = itemStack.getAmount();
+        itemStack.setAmount(amount - 1);
+
+        if (amount == 1 && VersionUtil.getVersion() == 8) {
+            player.getInventory().remove(VersionUtil.getFireball());
+        }
+
+        Fireball fb = player.launchProjectile(Fireball.class);
+        fb.setVelocity(player.getLocation().getDirection().multiply(2.5D));
+        VersionUtil.playFireball(player, fb.getLocation());
+        fb.setYield(3F);
+        fb.setIsIncendiary(true);
+        fb.setBounce(false);
+    }
+
     public void setArena(Arena arena) {
         Preconditions.checkNotNull(arena);
         if (this.arena != null) {