package pw.kaboom.weapons.modules.weapons; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.util.Vector; import com.destroystokyo.paper.event.server.ServerTickStartEvent; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextDecoration; public final class WeaponMachineGun implements Listener { private static final int MAX_BULLET_COUNT = 20; private static HashMap machineGunActive = new HashMap(); public static void rightClick(final Material item, final Component name, final PlayerInteractEvent event) { if (item == Material.GOLDEN_HORSE_ARMOR && Component.text("Machine Gun") .decoration(TextDecoration.ITALIC, false).equals(name)) { final UUID playerUUID = event.getPlayer().getUniqueId(); if (!machineGunActive.containsKey(playerUUID)) { final int numFiredBullets = 0; machineGunActive.put(playerUUID, numFiredBullets); } event.setCancelled(true); } } /* Make shooter invulnerable to weapon projectiles */ @EventHandler private void onProjectileHit(final ProjectileHitEvent event) { if (event.getEntityType() != EntityType.ARROW) { return; } final Projectile projectile = event.getEntity(); if (!Component.text("WeaponMachineGunBullet").equals(projectile.customName())) { return; } final Entity collidedWith = event.getHitEntity(); projectile.remove(); if (collidedWith == null) { return; } if (collidedWith.getType() == EntityType.PLAYER && projectile.getShooter() instanceof Player && ((Player) projectile.getShooter()).getUniqueId().equals( collidedWith.getUniqueId())) { event.setCancelled(true); } else if (collidedWith instanceof LivingEntity) { final int duration = 90000; final int amplifier = 3; final boolean ambient = true; final boolean particles = false; final PotionEffect harm = new PotionEffect( PotionEffectType.HARM, duration, amplifier, ambient, particles ); ((LivingEntity) collidedWith).addPotionEffect(harm); } } @EventHandler(priority = EventPriority.MONITOR) public void onTickStart(ServerTickStartEvent event) { if (machineGunActive.isEmpty()) { return; } Iterator> iterator = machineGunActive.entrySet().iterator(); while (iterator.hasNext()) { final Entry entry = iterator.next(); final UUID playerUUID = entry.getKey(); final Player player = Bukkit.getPlayer(playerUUID); int numFiredBullets = entry.getValue(); if (player == null) { iterator.remove(); continue; } final Location eyeLocation = player.getEyeLocation(); final World world = player.getWorld(); final Vector velocity = eyeLocation.getDirection().multiply(12); world.getChunkAtAsync(eyeLocation).thenAccept(chunk -> { final Arrow arrow = player.launchProjectile(Arrow.class); final float volume = 1.0F; final float pitch = 63.0F; arrow.customName(Component.text("WeaponMachineGunBullet")); arrow.setShooter(player); arrow.setVelocity(velocity); world.playSound( eyeLocation, Sound.ENTITY_GENERIC_EXPLODE, volume, pitch ); }); numFiredBullets++; machineGunActive.put(playerUUID, numFiredBullets); if (numFiredBullets >= MAX_BULLET_COUNT) { iterator.remove(); } } } }