145 lines
4.7 KiB
Java
145 lines
4.7 KiB
Java
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<UUID, Integer> machineGunActive = new HashMap<UUID, Integer>();
|
|
|
|
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<Entry<UUID, Integer>> iterator = machineGunActive.entrySet().iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
final Entry<UUID, Integer> 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();
|
|
}
|
|
}
|
|
}
|
|
}
|