diff --git a/src/de/leafbla/meinkraft/Main.java b/src/de/leafbla/meinkraft/Main.java index 24d7b3c..9e1fe15 100644 --- a/src/de/leafbla/meinkraft/Main.java +++ b/src/de/leafbla/meinkraft/Main.java @@ -2,16 +2,10 @@ package de.leafbla.meinkraft; import de.leafbla.meinkraft.roleplay.RoleCommand; import de.leafbla.meinkraft.roleplay.RoleManager; -import de.leafbla.meinkraft.roleplay.bomber.BomberListener; -import de.leafbla.meinkraft.roleplay.fighter.FighterListener; -import de.leafbla.meinkraft.roleplay.ninja.NinjaListener; -import de.leafbla.meinkraft.roleplay.thief.ThiefListener; -import de.leafbla.meinkraft.roleplay.wizard.WizardListener; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; import java.util.logging.Level; -import java.util.logging.Logger; public class Main extends JavaPlugin { @@ -19,20 +13,14 @@ public class Main extends JavaPlugin { @Override public void onDisable() { - Bukkit.getLogger().log(Level.INFO, "Plugin disabled"); + Bukkit.getLogger().log(Level.INFO, "MeinKraft disabled"); roleManager.unsetAll(); } @Override public void onEnable() { + Bukkit.getLogger().log(Level.INFO, "MeinKraft enabled"); this.roleManager = new RoleManager(this); - Bukkit.getLogger().log(Level.INFO, "Plugin enabled"); - getServer().getPluginManager().registerEvents(new ThiefListener(this), this); - getServer().getPluginManager().registerEvents(new NinjaListener(this), this); - getServer().getPluginManager().registerEvents(new BomberListener(this), this); - getServer().getPluginManager().registerEvents(new FighterListener(this), this); - getServer().getPluginManager().registerEvents(new WizardListener(this), this); - this.getCommand("role").setExecutor(new RoleCommand(this.roleManager)); } } diff --git a/src/de/leafbla/meinkraft/roleplay/PlayerRole.java b/src/de/leafbla/meinkraft/roleplay/PlayerRole.java index de6928b..04cd7e1 100644 --- a/src/de/leafbla/meinkraft/roleplay/PlayerRole.java +++ b/src/de/leafbla/meinkraft/roleplay/PlayerRole.java @@ -4,41 +4,116 @@ import de.leafbla.meinkraft.Main; import de.leafbla.meinkraft.roleplay.wizard.ProjectileBlockHit; import de.leafbla.meinkraft.roleplay.wizard.ProjectileEntityHit; import de.leafbla.meinkraft.util.Pair; +import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; import org.bukkit.entity.Snowball; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.projectiles.ProjectileSource; import java.util.HashMap; import java.util.Map; +import java.util.Objects; -public abstract class PlayerRole { +public abstract class PlayerRole implements Listener { protected final Map> projectiles = new HashMap<>(); + protected final Map, Runnable> rightClickActions = new HashMap<>(); protected final Player player; public final Main plugin; private final Role role; + private final RoleManager roleManager; public Player getPlayer() { return player; } public PlayerRole(Main plugin, Player player, Role role) { + plugin.getServer().getPluginManager().registerEvents(this, plugin); this.player = player; this.plugin = plugin; this.role = role; + this.roleManager = plugin.roleManager; } public Role getRole() { return this.role; } - public abstract void start(); + public abstract void onStart(); - public abstract void end(); + public abstract void onEnd(); + + public void end() { + this.onEnd(); + rightClickActions.keySet().forEach(pair -> player.getInventory().remove(pair.getLeft())); + HandlerList.unregisterAll(this); + } public Snowball launchProjectile(Material material, ProjectileEntityHit entityHit, ProjectileBlockHit blockHit) { Snowball snowball = Utils.launchProjectile(player, material); this.projectiles.put(snowball.getEntityId(), new Pair<>(entityHit, blockHit)); return snowball; } + + public boolean matchesRole(Player player) { + PlayerRole playerRole = this.roleManager.getPlayerRole(player); + if (playerRole == null) return false; + return playerRole.getRole() == this.role; + } + + public void registerRightClickAction(Material material, String name, Runnable action) { + player.getInventory().addItem(Utils.namedItem(material, name)); + Bukkit.broadcastMessage(String.format("registering RCA %s %s", material.name(), name)); + rightClickActions.put(new Pair<>(material, name), action); + } + + @EventHandler + public void onInteractRightClickHandItem(PlayerInteractEvent event) { + Player player = event.getPlayer(); + if (!this.matchesRole(player)) return; + if (event.getHand() != EquipmentSlot.HAND) return; + if (!event.getAction().name().contains("RIGHT")) return; + ItemStack itemStack = player.getInventory().getItemInMainHand(); + if (!itemStack.hasItemMeta()) return; + Material material = itemStack.getType(); + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta == null) return; + if (!itemMeta.hasDisplayName()) return; + String displayName = itemMeta.getDisplayName(); + Pair pair = new Pair<>(material, displayName); + if (!rightClickActions.containsKey(pair)) return; + Runnable runnable = rightClickActions.get(pair); + runnable.run(); + } + + + @EventHandler + public void onRegisteredProjectileHit(ProjectileHitEvent event) { + ProjectileSource shooter = event.getEntity().getShooter(); + if (!(shooter instanceof Player)) return; + Player player = (Player) shooter; + if (!this.matchesRole(player)) return; + Projectile projectile = event.getEntity(); + if (this.projectiles.containsKey(projectile.getEntityId())) { + ProjectileBlockHit projectileBlockHit = this.projectiles.get(projectile.getEntityId()).getRight(); + ProjectileEntityHit projectileEntityHit = this.projectiles.get(projectile.getEntityId()).getLeft(); + if (event.getHitEntity() != null) { + projectileEntityHit.onHit(event, projectile, event.getHitEntity(), player); + } else if (event.getHitBlock() != null) { + Entity hitEntity = event.getHitEntity(); + projectileBlockHit.onHit(event, projectile, event.getHitBlock(), event.getHitBlockFace(), player); + } + this.projectiles.remove(projectile.getEntityId()); + } + } } diff --git a/src/de/leafbla/meinkraft/roleplay/RoleManager.java b/src/de/leafbla/meinkraft/roleplay/RoleManager.java index 196261e..c61728e 100644 --- a/src/de/leafbla/meinkraft/roleplay/RoleManager.java +++ b/src/de/leafbla/meinkraft/roleplay/RoleManager.java @@ -26,7 +26,7 @@ public class RoleManager { return; } this.classes.put(player, thePlayerRole); - thePlayerRole.start(); + thePlayerRole.onStart(); player.sendMessage( String.format("§eYou are now a §6%s§e!", StringUtils.capitalize(theclass.name())) ); diff --git a/src/de/leafbla/meinkraft/roleplay/bomber/BomberListener.java b/src/de/leafbla/meinkraft/roleplay/bomber/BomberListener.java deleted file mode 100644 index 1690a32..0000000 --- a/src/de/leafbla/meinkraft/roleplay/bomber/BomberListener.java +++ /dev/null @@ -1,118 +0,0 @@ -package de.leafbla.meinkraft.roleplay.bomber; - -import de.leafbla.meinkraft.Main; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_16_R2.entity.CraftSnowball; -import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; -import org.bukkit.entity.Player; -import org.bukkit.entity.Snowball; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashMap; -import java.util.Map; - -public class BomberListener implements Listener { - private final Main plugin; - - private final Map mines = new HashMap<>(); - private final Map c4 = new HashMap<>(); - - public BomberListener(Main main) { - this.plugin = main; - } - - public void onPlace(BlockPlaceEvent event) { - if (event.getBlockPlaced().getType() == Material.STONE_PRESSURE_PLATE) { - mines.put(event.getBlockPlaced().getLocation(), event.getPlayer()); - } - if (event.getBlockPlaced().getType() == Material.TURTLE_EGG) { - if (c4.containsKey(event.getPlayer())) { - Location old = c4.get(event.getPlayer()); - old.getBlock().setType(Material.AIR); - } - c4.put(event.getPlayer(), event.getBlockPlaced().getLocation()); - } - } - - public void onPlace(PlayerInteractEvent event) { - if (event.getAction() == Action.PHYSICAL) - if (event.getClickedBlock().getType() == Material.STONE_PRESSURE_PLATE) { - World w = event.getClickedBlock().getWorld(); - Location loc = event.getClickedBlock().getLocation(); - if (mines.containsKey(loc)) { - Player source = mines.get(loc); - w.createExplosion(loc, 2f, false, false, source); - mines.remove(loc); - new BukkitRunnable() { - @Override - public void run() { - loc.getBlock().setType(Material.AIR); - } - }.runTask(this.plugin); - //mines.remove(loc); - } - } - if (event.getAction().name().contains("RIGHT")) { - if (event.getPlayer().getItemInHand().getType() == Material.REDSTONE_TORCH) { - World w = event.getPlayer().getWorld(); - if (c4.containsKey(event.getPlayer())) { - Location loc = c4.get(event.getPlayer()); - w.createExplosion(loc, 2f, false, false, event.getPlayer()); - w.getBlockAt(loc).setType(Material.AIR); - c4.remove(event.getPlayer()); - } - } - if (event.getPlayer().getItemInHand().getType() == Material.SLIME_BALL) { - ItemStack oneknife = new ItemStack(Material.SLIME_BALL, 1); - Snowball ball = event.getPlayer().launchProjectile(Snowball.class); - grenades.put(ball, event.getPlayer()); - ball.setVelocity(ball.getVelocity().multiply(.75)); - ball.setBounce(true); - ((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife)); - - ItemStack balls = event.getPlayer().getItemInHand(); - int amt = balls.getAmount(); - balls.setAmount(amt); - event.getPlayer().setItemInHand(balls); - } - } - } - - Map grenades = new HashMap<>(); - - public void onLand(ProjectileHitEvent event) { - if (event.getEntity() instanceof Snowball) { - Snowball ball = (Snowball) event.getEntity(); - ItemStack item = - CraftItemStack.asBukkitCopy( - ((CraftSnowball) ball).getHandle().getItem() - ); - if (item.getType() == Material.SLIME_BALL) { - if (grenades.containsKey(ball)) { - Player thrower = grenades.get(ball); - Location loc = event.getEntity().getLocation(); - World w = event.getEntity().getWorld(); - w.playSound(event.getEntity().getLocation(), Sound.ENTITY_CREEPER_PRIMED, 2, 1); - - new BukkitRunnable() { - @Override - public void run() { - w.createExplosion(loc, 3f, false, false, thrower); - } - }.runTaskLater(this.plugin, 30); - } - - } - } - } -} diff --git a/src/de/leafbla/meinkraft/roleplay/bomber/BomberRole.java b/src/de/leafbla/meinkraft/roleplay/bomber/BomberRole.java index 965a749..da54798 100644 --- a/src/de/leafbla/meinkraft/roleplay/bomber/BomberRole.java +++ b/src/de/leafbla/meinkraft/roleplay/bomber/BomberRole.java @@ -3,21 +3,39 @@ package de.leafbla.meinkraft.roleplay.bomber; import de.leafbla.meinkraft.Main; import de.leafbla.meinkraft.roleplay.PlayerRole; import de.leafbla.meinkraft.roleplay.Role; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_16_R2.entity.CraftSnowball; +import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; import org.bukkit.entity.Player; +import org.bukkit.entity.Snowball; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.HashMap; +import java.util.Map; public class BomberRole extends PlayerRole { + private final Map mines = new HashMap<>(); + private final Map c4 = new HashMap<>(); public BomberRole(Main plugin, Player player) { super(plugin, player, Role.BOMBER); } @Override - public void start() { + public void onStart() { player.setLevel(42); } @Override - public void end() { + public void onEnd() { player.setLevel(0); } @@ -25,4 +43,90 @@ public class BomberRole extends PlayerRole { public Role getRole() { return Role.BOMBER; } + + + public void onPlace(BlockPlaceEvent event) { + if (event.getBlockPlaced().getType() == Material.STONE_PRESSURE_PLATE) { + mines.put(event.getBlockPlaced().getLocation(), event.getPlayer()); + } + if (event.getBlockPlaced().getType() == Material.TURTLE_EGG) { + if (c4.containsKey(event.getPlayer())) { + Location old = c4.get(event.getPlayer()); + old.getBlock().setType(Material.AIR); + } + c4.put(event.getPlayer(), event.getBlockPlaced().getLocation()); + } + } + + public void onPlace(PlayerInteractEvent event) { + if (event.getAction() == Action.PHYSICAL) + if (event.getClickedBlock().getType() == Material.STONE_PRESSURE_PLATE) { + World w = event.getClickedBlock().getWorld(); + Location loc = event.getClickedBlock().getLocation(); + if (mines.containsKey(loc)) { + Player source = mines.get(loc); + w.createExplosion(loc, 2f, false, false, source); + mines.remove(loc); + new BukkitRunnable() { + @Override + public void run() { + loc.getBlock().setType(Material.AIR); + } + }.runTask(this.plugin); + //mines.remove(loc); + } + } + if (event.getAction().name().contains("RIGHT")) { + if (event.getPlayer().getItemInHand().getType() == Material.REDSTONE_TORCH) { + World w = event.getPlayer().getWorld(); + if (c4.containsKey(event.getPlayer())) { + Location loc = c4.get(event.getPlayer()); + w.createExplosion(loc, 2f, false, false, event.getPlayer()); + w.getBlockAt(loc).setType(Material.AIR); + c4.remove(event.getPlayer()); + } + } + if (event.getPlayer().getItemInHand().getType() == Material.SLIME_BALL) { + ItemStack oneknife = new ItemStack(Material.SLIME_BALL, 1); + Snowball ball = event.getPlayer().launchProjectile(Snowball.class); + grenades.put(ball, event.getPlayer()); + ball.setVelocity(ball.getVelocity().multiply(.75)); + ball.setBounce(true); + ((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife)); + + ItemStack balls = event.getPlayer().getItemInHand(); + int amt = balls.getAmount(); + balls.setAmount(amt); + event.getPlayer().setItemInHand(balls); + } + } + } + + Map grenades = new HashMap<>(); + + public void onLand(ProjectileHitEvent event) { + if (event.getEntity() instanceof Snowball) { + Snowball ball = (Snowball) event.getEntity(); + ItemStack item = + CraftItemStack.asBukkitCopy( + ((CraftSnowball) ball).getHandle().getItem() + ); + if (item.getType() == Material.SLIME_BALL) { + if (grenades.containsKey(ball)) { + Player thrower = grenades.get(ball); + Location loc = event.getEntity().getLocation(); + World w = event.getEntity().getWorld(); + w.playSound(event.getEntity().getLocation(), Sound.ENTITY_CREEPER_PRIMED, 2, 1); + + new BukkitRunnable() { + @Override + public void run() { + w.createExplosion(loc, 3f, false, false, thrower); + } + }.runTaskLater(this.plugin, 30); + } + + } + } + } } diff --git a/src/de/leafbla/meinkraft/roleplay/fighter/FighterListener.java b/src/de/leafbla/meinkraft/roleplay/fighter/FighterListener.java deleted file mode 100644 index 7631999..0000000 --- a/src/de/leafbla/meinkraft/roleplay/fighter/FighterListener.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.leafbla.meinkraft.roleplay.fighter; - -import de.leafbla.meinkraft.Main; -import de.leafbla.meinkraft.roleplay.Role; -import de.leafbla.meinkraft.roleplay.RoleListener; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.player.PlayerInteractEvent; - -public class FighterListener extends RoleListener { - - public FighterListener(Main main) { - super(Role.FIGHTER, main); - } - - @EventHandler - public void onDamage(EntityDamageByEntityEvent event) { - if (!(event.getDamager() instanceof Player)) return; - Player player = (Player) event.getDamager(); - if (!this.matchesRole(player)) return; - FighterRole role = this.getRole(player); - if (event.getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return; - - role.attackEntity(event.getEntity(), event); - } - - @EventHandler - public void onAttack(PlayerInteractEvent event) { - Player player = event.getPlayer(); - if (!this.matchesRole(player)) return; - FighterRole role = this.getRole(player); - role.onInteract(event); - } -} diff --git a/src/de/leafbla/meinkraft/roleplay/fighter/FighterRole.java b/src/de/leafbla/meinkraft/roleplay/fighter/FighterRole.java index ab77377..346e6c9 100644 --- a/src/de/leafbla/meinkraft/roleplay/fighter/FighterRole.java +++ b/src/de/leafbla/meinkraft/roleplay/fighter/FighterRole.java @@ -11,8 +11,10 @@ import org.bukkit.Sound; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; @@ -31,7 +33,7 @@ public class FighterRole extends PlayerRole implements ManaAble { } @Override - public void start() { + public void onStart() { this.setMana(0); this.player.setWalkSpeed(0.3f); this.powerfist = false; @@ -39,8 +41,8 @@ public class FighterRole extends PlayerRole implements ManaAble { } @Override - public void end() { - player.setExp(0.5f); + public void onEnd() { + player.setExp(0); this.player.setWalkSpeed(0.2f); } @@ -240,4 +242,20 @@ public class FighterRole extends PlayerRole implements ManaAble { }.runTaskTimer(plugin, 0, 1); } + @EventHandler + public void onDamage(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player)) return; + Player player = (Player) event.getDamager(); + if (!this.matchesRole(player)) return; + if (event.getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return; + + this.attackEntity(event.getEntity(), event); + } + + @EventHandler + public void onAttack(PlayerInteractEvent event) { + Player player = event.getPlayer(); + if (!this.matchesRole(player)) return; + this.onInteract(event); + } } diff --git a/src/de/leafbla/meinkraft/roleplay/ninja/NinjaListener.java b/src/de/leafbla/meinkraft/roleplay/ninja/NinjaListener.java deleted file mode 100644 index b731ff3..0000000 --- a/src/de/leafbla/meinkraft/roleplay/ninja/NinjaListener.java +++ /dev/null @@ -1,78 +0,0 @@ -package de.leafbla.meinkraft.roleplay.ninja; - -import de.leafbla.meinkraft.Main; -import de.leafbla.meinkraft.roleplay.Role; -import de.leafbla.meinkraft.roleplay.RoleListener; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.entity.*; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.projectiles.ProjectileSource; - -public class NinjaListener extends RoleListener { - private Main plugin; - - public NinjaListener(Main main) { - super(Role.NINJA, main); - this.plugin = main; - } - - @EventHandler - public void onMove(PlayerMoveEvent event) { - Player player = event.getPlayer(); - if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); - role.onMove(event); - } - - - @EventHandler - public void onInteract(PlayerInteractEvent event) { - Player player = event.getPlayer(); - if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); - role.onInteract(event); - } - - @EventHandler - public void onPoison(EntityDamageEvent event) { - if (!(event.getEntity() instanceof Player)) return; - Player player = (Player) event.getEntity(); - if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); - if (event.getCause() == EntityDamageEvent.DamageCause.POISON) - event.setCancelled(true); - } - - @EventHandler - public void onLand(ProjectileHitEvent event) { - ProjectileSource shooter = event.getEntity().getShooter(); - if (!(shooter instanceof Player)) return; - Player player = (Player) shooter; - if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); - role.projectileHit(event); - } - - @EventHandler - public void onPoisonSoak(LingeringPotionSplashEvent event) { - ProjectileSource shooter = event.getEntity().getShooter(); - if (!(shooter instanceof Player)) return; - Player player = (Player) shooter; - if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); - role.lingeringPotionSplash(event); - } - - @EventHandler - public void onCloudApply(AreaEffectCloudApplyEvent event) { - ProjectileSource shooter = event.getEntity().getSource(); - if (!(shooter instanceof Player)) return; - Player player = (Player) shooter; - if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); - role.effectCloudApply(event); - } -} diff --git a/src/de/leafbla/meinkraft/roleplay/ninja/NinjaRole.java b/src/de/leafbla/meinkraft/roleplay/ninja/NinjaRole.java index 67adba5..21d63f2 100644 --- a/src/de/leafbla/meinkraft/roleplay/ninja/NinjaRole.java +++ b/src/de/leafbla/meinkraft/roleplay/ninja/NinjaRole.java @@ -15,6 +15,7 @@ import org.bukkit.event.entity.LingeringPotionSplashEvent; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.meta.ItemMeta; @@ -29,6 +30,7 @@ import org.bukkit.util.RayTraceResult; import org.bukkit.util.Vector; import java.util.Date; +import java.util.EventListener; import java.util.Objects; public class NinjaRole extends PlayerRole { @@ -43,10 +45,11 @@ public class NinjaRole extends PlayerRole { } @Override - public void start() { - player.getInventory().addItem(Utils.namedItem(Material.STICK, "Blasrohr")); - player.getInventory().addItem(Utils.namedItem(Material.SLIME_BALL, "Lingering Poison Potion")); - player.getInventory().addItem(Utils.namedItem(Material.BONE, "Dash Attack")); + public void onStart() { + this.registerRightClickAction(Material.STICK, "Blasrohr", this::blasrohr); + this.registerRightClickAction(Material.SLIME_BALL, "Lingering Poison Potion", this::poisonCloud); + this.registerRightClickAction(Material.BONE, "Dash Attack", this::dash); + stealth = new BukkitRunnable() { @Override public void run() { @@ -69,23 +72,11 @@ public class NinjaRole extends PlayerRole { } @Override - public void end() { + public void onEnd() { stealth.cancel(); player.removePotionEffect(PotionEffectType.INVISIBILITY); } - public void onInteract(PlayerInteractEvent event) { - Player player = event.getPlayer(); - ItemStack inHand = player.getInventory().getItemInMainHand(); - if (inHand.getType() == Material.STICK) { - this.blasrohr(); - } else if (inHand.getType() == Material.SLIME_BALL) { - this.poisonCloud(); - } else if (inHand.getType() == Material.BONE) { - player.sendMessage("BONE"); - this.dash(); - } - } private void blasrohr() { Snowball ball = this.launchProjectile(Material.ARROW, (event, projectile, target, shooter) -> { @@ -108,7 +99,7 @@ public class NinjaRole extends PlayerRole { thownPotion.setItem(lingeringPotion); } - public void onMove(PlayerMoveEvent event) { + public void onMove2(PlayerMoveEvent event) { if (event.getFrom().getBlock().equals(event.getTo().getBlock())) return; // not really moved, huh? this.lastMove = new Date(); if (stealthed) { @@ -122,7 +113,7 @@ public class NinjaRole extends PlayerRole { } } - final int DASHLENGTH = 7; + final int DASHLENGTH = 20; public void dash() { RayTraceResult blockTraceResult = player.getWorld().rayTraceBlocks(player.getEyeLocation(), player.getEyeLocation().getDirection(), DASHLENGTH); @@ -172,18 +163,14 @@ public class NinjaRole extends PlayerRole { public void effectCloudApply(AreaEffectCloudApplyEvent event) { event.setCancelled(true); - player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 20, 0)); + //player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 20, 0)); } - - - @EventHandler public void onMove(PlayerMoveEvent event) { Player player = event.getPlayer(); if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); - role.onMove(event); + this.onMove2(event); } @@ -191,8 +178,6 @@ public class NinjaRole extends PlayerRole { public void onInteract(PlayerInteractEvent event) { Player player = event.getPlayer(); if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); - role.onInteract(event); } @EventHandler @@ -200,7 +185,6 @@ public class NinjaRole extends PlayerRole { if (!(event.getEntity() instanceof Player)) return; Player player = (Player) event.getEntity(); if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); if (event.getCause() == EntityDamageEvent.DamageCause.POISON) event.setCancelled(true); } @@ -211,26 +195,24 @@ public class NinjaRole extends PlayerRole { if (!(shooter instanceof Player)) return; Player player = (Player) shooter; if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); - role.projectileHit(event); + this.projectileHit(event); } @EventHandler - public void onPoisonSoak(LingeringPotionSplashEvent event) { + public void onPoisonLaydown(LingeringPotionSplashEvent event) { ProjectileSource shooter = event.getEntity().getShooter(); if (!(shooter instanceof Player)) return; Player player = (Player) shooter; if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); - role.lingeringPotionSplash(event); + this.lingeringPotionSplash(event); } + @EventHandler public void onCloudApply(AreaEffectCloudApplyEvent event) { ProjectileSource shooter = event.getEntity().getSource(); if (!(shooter instanceof Player)) return; Player player = (Player) shooter; if (!this.matchesRole(player)) return; - NinjaRole role = this.getRole(player); - role.effectCloudApply(event); + this.effectCloudApply(event); } } diff --git a/src/de/leafbla/meinkraft/roleplay/wizard/WizardListener.java b/src/de/leafbla/meinkraft/roleplay/wizard/WizardListener.java deleted file mode 100644 index 1f47d90..0000000 --- a/src/de/leafbla/meinkraft/roleplay/wizard/WizardListener.java +++ /dev/null @@ -1,128 +0,0 @@ -package de.leafbla.meinkraft.roleplay.wizard; - -import de.leafbla.meinkraft.Main; -import de.leafbla.meinkraft.roleplay.Role; -import de.leafbla.meinkraft.roleplay.RoleListener; -import de.leafbla.meinkraft.roleplay.fighter.FighterRole; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.Particle; -import org.bukkit.craftbukkit.v1_16_R2.entity.CraftSnowball; -import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Snowball; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.ProjectileHitEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerItemHeldEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.ShapedRecipe; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.projectiles.ProjectileSource; -import org.bukkit.scheduler.BukkitRunnable; -import org.spigotmc.event.entity.EntityDismountEvent; - -public class WizardListener extends RoleListener { - - public WizardListener(Main main) { - super(Role.WIZARD, main); - } - - @EventHandler - public void onHold(PlayerItemHeldEvent event) { - Player player = event.getPlayer(); - if (!this.matchesRole(player)) return; - WizardRole role = this.getRole(player); - role.onItemHeld(event); - } - - @EventHandler - public void onAttack(PlayerInteractEvent event) { - Player player = event.getPlayer(); - if (!this.matchesRole(player)) return; - WizardRole role = this.getRole(player); - role.onInteract(event); - } - - public void onInteract(PlayerInteractEvent event) { - Player player = event.getPlayer(); - if (event.getAction().name().contains("RIGHT")) { - ItemStack knife = event.getPlayer().getInventory().getItemInMainHand(); - if (knife.getType() == Material.IRON_INGOT) { - ItemStack oneknife = knife.clone(); - oneknife.setAmount(1); - Snowball ball = player.launchProjectile(Snowball.class); - ball.setVelocity(ball.getVelocity().multiply(1.2)); - ball.setBounce(false); - ((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife)); - - int amt = knife.getAmount(); - knife.setAmount(amt - 1); - player.setItemInHand(knife); - } else if (knife.getType() == Material.STICK) { - ItemStack oneknife = new ItemStack(Material.FEATHER, 1); - Snowball ball = player.launchProjectile(Snowball.class); - ball.setVelocity(ball.getVelocity().multiply(3)); - ((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife)); - - int amt = knife.getAmount(); - flying = true; - new BukkitRunnable() { - int i = 0; - - @Override - public void run() { - if (flying) - ball.getWorld().spawnParticle(Particle.FLAME, ball.getLocation(), 0); - else - this.cancel(); - } - }.runTaskTimerAsynchronously(this.plugin, 0, 1); - //knife.setAmount(amt - 1); - //player.setItemInHand(knife); - } - } - } - - private boolean flying = false; - - @EventHandler - public void onLand(ProjectileHitEvent event) { - ProjectileSource shooter = event.getEntity().getShooter(); - if (!(shooter instanceof Player)) return; - Player player = (Player) shooter; - if (!this.matchesRole(player)) return; - WizardRole role = this.getRole(player); - role.projectileHit(event); - //if (event.getEntity() instanceof Snowball) { - // Snowball ball = (Snowball) event.getEntity(); - // ItemStack item = - // CraftItemStack.asBukkitCopy( - // ((CraftSnowball) ball).getHandle().getItem() - // ); - // if (item.getType() == Material.IRON_INGOT) { - // if (event.getHitEntity() == null) - // event.getEntity().getWorld().dropItem(event.getEntity().getLocation(), item); - // else { - // if (event.getHitEntity() instanceof LivingEntity) - // ((LivingEntity) event.getHitEntity()).damage(8); - // } - // } else if (item.getType() == Material.FEATHER) { - // flying = false; - // if (event.getHitEntity() != null) { - // if (event.getHitEntity() instanceof LivingEntity) { - // LivingEntity len = ((LivingEntity) event.getHitEntity()); - // Bukkit.broadcastMessage(String.format("hit %s", len.getName())); - // len.addPotionEffect(new PotionEffect(PotionEffectType.POISON, 5 * 20, 0, true, true)); - // } - // } - // } - //} - } -} diff --git a/src/de/leafbla/meinkraft/roleplay/wizard/WizardRole.java b/src/de/leafbla/meinkraft/roleplay/wizard/WizardRole.java index 63faf3d..aef6a8c 100644 --- a/src/de/leafbla/meinkraft/roleplay/wizard/WizardRole.java +++ b/src/de/leafbla/meinkraft/roleplay/wizard/WizardRole.java @@ -8,21 +8,26 @@ import de.leafbla.meinkraft.roleplay.Utils; import de.leafbla.meinkraft.util.Pair; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.craftbukkit.v1_16_R2.entity.CraftSnowball; +import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.entity.Snowball; +import org.bukkit.event.EventHandler; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemHeldEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.projectiles.ProjectileSource; import org.bukkit.scheduler.BukkitRunnable; import java.util.*; -public class WizardRole extends PlayerRole implements ManaAble { +public class WizardRole extends PlayerRole implements ManaAble, EventListener { BukkitRunnable refillMana; Set transmorphedPlayers = new HashSet<>(); @@ -51,9 +56,10 @@ public class WizardRole extends PlayerRole implements ManaAble { } @Override - public void start() { + public void onStart() { + for (WizardSpell wizardSpell : WizardSpell.values()) + this.registerRightClickAction(wizardSpell.getIcon(), wizardSpell.displayName(), () -> wizardSpell.cast(this)); - setupInventory(); this.currentSpell = WizardSpell.values()[0]; this.mana = 33; refillMana = new BukkitRunnable() { @@ -76,7 +82,7 @@ public class WizardRole extends PlayerRole implements ManaAble { } @Override - public void end() { + public void onEnd() { refillMana.cancel(); } @@ -85,55 +91,48 @@ public class WizardRole extends PlayerRole implements ManaAble { return Role.WIZARD; } - public void onInteract(PlayerInteractEvent event) { - ItemStack itemStack = event.getPlayer().getInventory().getItemInMainHand(); - if (itemStack.getType() != Material.STICK) return; - if (!itemStack.hasItemMeta()) return; - if (!event.getAction().name().startsWith("RIGHT")) return; - if (event.getHand() == EquipmentSlot.OFF_HAND) return; - this.castSpell(); - } - private void castSpell() { - this.currentSpell.cast(this); - } - public void onItemHeld(PlayerItemHeldEvent event) { - int newslot = event.getNewSlot(); - if (newslot == 0) return; // self caused or irrelevant - callSpellSlot(newslot - 1); - event.setCancelled(true); - player.getInventory().setHeldItemSlot(0); - event.setCancelled(true); - } + public void onInteractOldTestStuffs(PlayerInteractEvent event) { + Player player = event.getPlayer(); + if (event.getAction().name().contains("RIGHT")) { + ItemStack knife = event.getPlayer().getInventory().getItemInMainHand(); + if (knife.getType() == Material.IRON_INGOT) { + ItemStack oneknife = knife.clone(); + oneknife.setAmount(1); + Snowball ball = player.launchProjectile(Snowball.class); + ball.setVelocity(ball.getVelocity().multiply(1.2)); + ball.setBounce(false); + ((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife)); - private void callSpellSlot(int newslot) { - if (newslot >= WizardSpell.values().length) return; - this.currentSpell = WizardSpell.values()[newslot]; - ItemMeta itemMeta = player.getInventory().getItemInMainHand().getItemMeta(); - itemMeta.setDisplayName(this.currentSpell.displayName()); - player.getInventory().getItemInMainHand().setItemMeta(itemMeta); - player.sendMessage(String.format("§eEquipped Spell §6%s§e.", this.currentSpell.displayName())); - } + int amt = knife.getAmount(); + knife.setAmount(amt - 1); + player.setItemInHand(knife); + } else if (knife.getType() == Material.STICK) { + ItemStack oneknife = new ItemStack(Material.FEATHER, 1); + Snowball ball = player.launchProjectile(Snowball.class); + ball.setVelocity(ball.getVelocity().multiply(3)); + ((CraftSnowball) ball).getHandle().setItem(CraftItemStack.asNMSCopy(oneknife)); - /** - * Called when a projectile hits something that originates from the player - * - * @param event - */ - public void projectileHit(ProjectileHitEvent event) { - assert Objects.equals(event.getEntity().getShooter(), player); - Projectile projectile = event.getEntity(); - if (this.projectiles.containsKey(projectile.getEntityId())) { - ProjectileBlockHit projectileBlockHit = this.projectiles.get(projectile.getEntityId()).getRight(); - ProjectileEntityHit projectileEntityHit = this.projectiles.get(projectile.getEntityId()).getLeft(); - if (event.getHitEntity() != null) { - projectileEntityHit.onHit(event, projectile, event.getHitEntity(), player); - } else if (event.getHitBlock() != null) { - Entity hitEntity = event.getHitEntity(); - projectileBlockHit.onHit(event, projectile, event.getHitBlock(), event.getHitBlockFace(), player); + int amt = knife.getAmount(); + flying = true; + new BukkitRunnable() { + int i = 0; + + @Override + public void run() { + if (flying) + ball.getWorld().spawnParticle(Particle.FLAME, ball.getLocation(), 0); + else + this.cancel(); + } + }.runTaskTimerAsynchronously(this.plugin, 0, 1); + //knife.setAmount(amt - 1); + //player.setItemInHand(knife); } - this.projectiles.remove(projectile.getEntityId()); } } + + private boolean flying = false; + } diff --git a/src/de/leafbla/meinkraft/roleplay/wizard/WizardSpell.java b/src/de/leafbla/meinkraft/roleplay/wizard/WizardSpell.java index 6944045..41a7a71 100644 --- a/src/de/leafbla/meinkraft/roleplay/wizard/WizardSpell.java +++ b/src/de/leafbla/meinkraft/roleplay/wizard/WizardSpell.java @@ -33,8 +33,6 @@ enum WizardSpell { }); } }, - SPELL2("Fireball", Material.FIRE_CHARGE, 0), - SPELL3("Something Something", Material.CLAY, 0), TRANSMORPH("Transmorgify", Material.FEATHER, 30) { @Override public void _cast(WizardRole wizardRole) { diff --git a/src/de/leafbla/meinkraft/util/Pair.java b/src/de/leafbla/meinkraft/util/Pair.java index 148f400..46434d6 100644 --- a/src/de/leafbla/meinkraft/util/Pair.java +++ b/src/de/leafbla/meinkraft/util/Pair.java @@ -1,8 +1,8 @@ package de.leafbla.meinkraft.util; public class Pair { - private L l; - private R r; + private final L l; + private final R r; public Pair(L l, R r) { this.l = l; @@ -16,4 +16,16 @@ public class Pair { public L getLeft() { return this.l; } + + @Override + public int hashCode() { + return l.hashCode() * r.hashCode(); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof Pair)) return false; + Pair other = (Pair) o; + return this.l.equals(other.l) && this.r.equals(other.r); + } }