commit 9e8d86a5470a4b45ae59d56e13bc8cce8791df7f Author: Dominic Zimmer Date: Wed Sep 23 19:06:51 2020 +0200 What is a .gitignore? diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/artifacts/MeinKraft_jar.xml b/.idea/artifacts/MeinKraft_jar.xml new file mode 100644 index 0000000..3fade28 --- /dev/null +++ b/.idea/artifacts/MeinKraft_jar.xml @@ -0,0 +1,9 @@ + + + $PROJECT_DIR$/out/artifacts/MeinKraft_jar + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d5d79e0 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..93f21aa --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MeinKraft.iml b/MeinKraft.iml new file mode 100644 index 0000000..0be42a0 --- /dev/null +++ b/MeinKraft.iml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/out/artifacts/MeinKraft_jar/MeinKraft.jar b/out/artifacts/MeinKraft_jar/MeinKraft.jar new file mode 100644 index 0000000..a1fc6ab Binary files /dev/null and b/out/artifacts/MeinKraft_jar/MeinKraft.jar differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/Main.class b/out/production/MeinKraft/de/leafbla/meinkraft/Main.class new file mode 100644 index 0000000..2193168 Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/Main.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/NinjaListener$1.class b/out/production/MeinKraft/de/leafbla/meinkraft/NinjaListener$1.class new file mode 100644 index 0000000..5b7eb04 Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/NinjaListener$1.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/NinjaListener.class b/out/production/MeinKraft/de/leafbla/meinkraft/NinjaListener.class new file mode 100644 index 0000000..fdbb703 Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/NinjaListener.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/ThiefListener.class b/out/production/MeinKraft/de/leafbla/meinkraft/ThiefListener.class new file mode 100644 index 0000000..d1d6593 Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/ThiefListener.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/PlayerRole.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/PlayerRole.class new file mode 100644 index 0000000..c32ef26 Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/PlayerRole.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/Role.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/Role.class new file mode 100644 index 0000000..9e99bfa Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/Role.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/RoleCommand.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/RoleCommand.class new file mode 100644 index 0000000..b5a40d8 Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/RoleCommand.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/RoleListener.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/RoleListener.class new file mode 100644 index 0000000..3c8862b Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/RoleListener.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/RoleManager.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/RoleManager.class new file mode 100644 index 0000000..9d7b9b8 Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/RoleManager.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/bomber/BomberListener$1.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/bomber/BomberListener$1.class new file mode 100644 index 0000000..9461a4b Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/bomber/BomberListener$1.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/bomber/BomberListener$2.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/bomber/BomberListener$2.class new file mode 100644 index 0000000..72034c6 Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/bomber/BomberListener$2.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/bomber/BomberListener.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/bomber/BomberListener.class new file mode 100644 index 0000000..d345960 Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/bomber/BomberListener.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterListener.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterListener.class new file mode 100644 index 0000000..be90e3d Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterListener.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole$1$1$1.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole$1$1$1.class new file mode 100644 index 0000000..ce03e98 Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole$1$1$1.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole$1$1.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole$1$1.class new file mode 100644 index 0000000..383361a Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole$1$1.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole$1.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole$1.class new file mode 100644 index 0000000..279c4db Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole$1.class differ diff --git a/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole.class b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole.class new file mode 100644 index 0000000..72d73e7 Binary files /dev/null and b/out/production/MeinKraft/de/leafbla/meinkraft/roleplay/fighter/FighterRole.class differ diff --git a/out/production/MeinKraft/plugin.yml b/out/production/MeinKraft/plugin.yml new file mode 100644 index 0000000..d320c54 --- /dev/null +++ b/out/production/MeinKraft/plugin.yml @@ -0,0 +1,10 @@ +name: MeinKraft +version: 0.1 +author: thamma +main: de.leafbla.meinkraft.Main +website: leafbla.de +api-version: 1.16 +commands: + role: + description: This is a demo command. + usage: /role {[player] [class]} {list} \ No newline at end of file diff --git a/src/de/leafbla/meinkraft/Main.java b/src/de/leafbla/meinkraft/Main.java new file mode 100644 index 0000000..7b9e476 --- /dev/null +++ b/src/de/leafbla/meinkraft/Main.java @@ -0,0 +1,33 @@ +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 org.bukkit.plugin.java.JavaPlugin; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Main extends JavaPlugin { + + public RoleManager roleManager; + + @Override + public void onDisable() { + Logger.getLogger("test").log(Level.INFO, "Plugin disabled"); + } + + @Override + public void onEnable() { + this.roleManager = new RoleManager(this); + Logger.getLogger("MeinKraft").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); + + // This will throw a NullPointerException if you don't have the command defined in your plugin.yml file! + this.getCommand("role").setExecutor(new RoleCommand(this.roleManager)); + } +} diff --git a/src/de/leafbla/meinkraft/NinjaListener.java b/src/de/leafbla/meinkraft/NinjaListener.java new file mode 100644 index 0000000..94132b9 --- /dev/null +++ b/src/de/leafbla/meinkraft/NinjaListener.java @@ -0,0 +1,126 @@ +package de.leafbla.meinkraft; + +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.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.scheduler.BukkitRunnable; + +public class NinjaListener implements Listener { + private Main plugin; + + public NinjaListener(Main main) { + this.plugin = main; + addKnife(); + addDarts(); + } + + private void addDarts() { + ItemStack item = new ItemStack(Material.STICK); + ItemMeta im = item.getItemMeta(); + im.setDisplayName("Blowpipe"); + item.setItemMeta(im); + NamespacedKey key = new NamespacedKey(plugin, "blowpipe"); + ShapedRecipe recipe = new ShapedRecipe(key, item); + recipe.shape("D", "D"); + recipe.setIngredient('D', Material.DIRT); + Bukkit.addRecipe(recipe); + } + + private void addKnife() { + ItemStack item = new ItemStack(Material.IRON_INGOT); + ItemMeta im = item.getItemMeta(); + im.setDisplayName("Throwing Knife"); + item.setItemMeta(im); + NamespacedKey key = new NamespacedKey(plugin, "throwing_knife"); + ShapedRecipe recipe = new ShapedRecipe(key, item); + recipe.shape("DD", "DD"); + recipe.setIngredient('D', Material.DIRT); + Bukkit.addRecipe(recipe); + } + + @EventHandler + 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) { + 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/ThiefListener.java b/src/de/leafbla/meinkraft/ThiefListener.java new file mode 100644 index 0000000..f7bff14 --- /dev/null +++ b/src/de/leafbla/meinkraft/ThiefListener.java @@ -0,0 +1,63 @@ +package de.leafbla.meinkraft; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.inventory.EquipmentSlot; + +public class ThiefListener implements Listener { + + private Main plugin; + + public ThiefListener(Main plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onInteract(PlayerInteractEntityEvent event) { + if (event.getHand() != EquipmentSlot.HAND) + return; + Player p = event.getPlayer(); + if (!p.isSneaking()) + return;; + Entity en = event.getRightClicked(); + if (en instanceof LivingEntity) { + LivingEntity len = (LivingEntity) en; + if (isBehind(len, p)) + if (len instanceof Player) { + Player target = (Player) len; + p.openInventory(target.getInventory()); + } + } + } + static boolean isBehind(LivingEntity behind, LivingEntity front) { + Location l1 = behind.getLocation(); + Location l2 = front.getLocation(); + l1.setPitch(0); + l2.setPitch(0); + float angle = l1.getDirection().angle(l2.getDirection()); + return (Math.abs(angle) < 1f && behind.getLocation().distance(front.getLocation()) < 1.2); + } + + @EventHandler + public void onMove(PlayerMoveEvent event) { + Player p = event.getPlayer(); + for (final HumanEntity hen: p.getInventory().getViewers()) { + if (!isBehind(hen, p)) { + Bukkit.getScheduler().runTask(this.plugin, hen::closeInventory); + } + } + } + +} diff --git a/src/de/leafbla/meinkraft/roleplay/PlayerRole.java b/src/de/leafbla/meinkraft/roleplay/PlayerRole.java new file mode 100644 index 0000000..3781445 --- /dev/null +++ b/src/de/leafbla/meinkraft/roleplay/PlayerRole.java @@ -0,0 +1,18 @@ +package de.leafbla.meinkraft.roleplay; + +import de.leafbla.meinkraft.Main; +import org.bukkit.entity.Player; + +public abstract class PlayerRole { + + protected final Player player; + protected final Main plugin; + + public PlayerRole(Main plugin, Player player) { + this.player = player; + this.plugin = plugin; + } + + public abstract Role getRole(); + +} diff --git a/src/de/leafbla/meinkraft/roleplay/Role.java b/src/de/leafbla/meinkraft/roleplay/Role.java new file mode 100644 index 0000000..5232fef --- /dev/null +++ b/src/de/leafbla/meinkraft/roleplay/Role.java @@ -0,0 +1,31 @@ +package de.leafbla.meinkraft.roleplay; + +import de.leafbla.meinkraft.roleplay.fighter.FighterRole; +import de.leafbla.meinkraft.Main; +import org.bukkit.entity.Player; + +import java.lang.reflect.InvocationTargetException; + +public enum Role { + + BOMBER(FighterRole.class), + FIGHTER(FighterRole.class), + NINJA(FighterRole.class), + WIZARD(FighterRole.class); + + private final Class playerRole; + + Role(Class playerRole) { + this.playerRole = playerRole; + } + + public PlayerRole createInstance(Main plugin, Player player) { + try { + return this.playerRole.getConstructor(Main.class, Player.class).newInstance(plugin, player); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/src/de/leafbla/meinkraft/roleplay/RoleCommand.java b/src/de/leafbla/meinkraft/roleplay/RoleCommand.java new file mode 100644 index 0000000..858905b --- /dev/null +++ b/src/de/leafbla/meinkraft/roleplay/RoleCommand.java @@ -0,0 +1,60 @@ +package de.leafbla.meinkraft.roleplay; + +import de.leafbla.meinkraft.roleplay.Role; +import de.leafbla.meinkraft.roleplay.RoleManager; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public class RoleCommand implements CommandExecutor { + + private final RoleManager roleManager; + + public RoleCommand(RoleManager roleManager) { + this.roleManager = roleManager; + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String label, String[] args) { + if (command.getName().equalsIgnoreCase("role")) { + if (args.length == 1) { + if (args[0].equalsIgnoreCase("list")) { + commandSender.sendMessage(String.format("§eAvailable classes: %s§6", + Arrays.stream(Role.values()).map(c -> StringUtils.capitalize(c.name())).collect(Collectors.joining("§e,§6 ")) + )); + } else { + return false; + } + } else if (args.length == 2) { + Player player = Bukkit.getPlayer(args[0]); + if (player != null && player.isOnline()) { + if (args[1].equalsIgnoreCase("clear")) { + this.roleManager.unsetClass(player); + commandSender.sendMessage(String.format("§ePlayer §6%s§e's class was cleared", player.getName())); + return true; + } else { + try { + Role theclass = Role.valueOf(args[1].toUpperCase()); + this.roleManager.setClass(player, theclass); + commandSender.sendMessage(String.format("§ePlayer §6%s §ewas assigned class §6%s", player.getName(), StringUtils.capitalize(theclass.name()))); + } catch (IllegalArgumentException e) { + commandSender.sendMessage(String.format("§cClass §e%s §cnot found", args[1])); + } + } + } else { + commandSender.sendMessage(String.format("§cPlayer §e%s §cnot found", args[0])); + } + } else { + return false; + } + } + return true; + } + +} diff --git a/src/de/leafbla/meinkraft/roleplay/RoleListener.java b/src/de/leafbla/meinkraft/roleplay/RoleListener.java new file mode 100644 index 0000000..84a95de --- /dev/null +++ b/src/de/leafbla/meinkraft/roleplay/RoleListener.java @@ -0,0 +1,30 @@ +package de.leafbla.meinkraft.roleplay; + +import de.leafbla.meinkraft.Main; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; + +public abstract class RoleListener implements Listener { + + protected final Main plugin; + protected final RoleManager roleManager; + protected final Role role; + + public RoleListener(Role role, Main plugin) { + this.role = role; + this.plugin = plugin; + this.roleManager = plugin.roleManager; + } + + public boolean matchesRole(Player player) { + PlayerRole playerRole = this.roleManager.getPlayerRole(player); + if (playerRole == null) return false; + return playerRole.getRole() == this.role; + } + + public T getRole(Player player) { + if (!matchesRole(player)) + return null; + return (T) this.roleManager.getPlayerRole(player); + } +} diff --git a/src/de/leafbla/meinkraft/roleplay/RoleManager.java b/src/de/leafbla/meinkraft/roleplay/RoleManager.java new file mode 100644 index 0000000..695912e --- /dev/null +++ b/src/de/leafbla/meinkraft/roleplay/RoleManager.java @@ -0,0 +1,47 @@ +package de.leafbla.meinkraft.roleplay; + +import de.leafbla.meinkraft.Main; +import org.apache.commons.lang.StringUtils; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Logger; + +public class RoleManager { + + private final Map classes = new HashMap<>(); + private final Main plugin; + + public RoleManager(Main plugin) { + this.plugin = plugin; + } + + public void setClass(Player player, Role theclass) { + this.unsetClass(player); + PlayerRole thePlayerRole = theclass.createInstance(plugin, player); + if (thePlayerRole == null) { + Logger.getLogger("MeinKraft").warning("setClass(Player, Class) returned null"); + return; + } + this.classes.put(player, thePlayerRole); + player.sendMessage( + String.format("§eYou are now a §6%s§e!", StringUtils.capitalize(theclass.name())) + ); + } + + public void unsetClass(Player player) { + if (this.classes.containsKey(player)) { + Role oldclass = this.classes.get(player).getRole(); + player.sendMessage( + String.format("§eYou are no longer a §6%s§e!", StringUtils.capitalize(oldclass.name())) + ); + this.classes.remove(player); + } + } + + public PlayerRole getPlayerRole(Player player) { + return this.classes.getOrDefault(player, null); + } + +} diff --git a/src/de/leafbla/meinkraft/roleplay/bomber/BomberListener.java b/src/de/leafbla/meinkraft/roleplay/bomber/BomberListener.java new file mode 100644 index 0000000..142c42c --- /dev/null +++ b/src/de/leafbla/meinkraft/roleplay/bomber/BomberListener.java @@ -0,0 +1,121 @@ +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; + } + + @EventHandler + 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()); + } + } + + @EventHandler + 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<>(); + + @EventHandler + 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 new file mode 100644 index 0000000..a247e2d --- /dev/null +++ b/src/de/leafbla/meinkraft/roleplay/fighter/FighterListener.java @@ -0,0 +1,36 @@ +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()); + } + + @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 new file mode 100644 index 0000000..7177c9e --- /dev/null +++ b/src/de/leafbla/meinkraft/roleplay/fighter/FighterRole.java @@ -0,0 +1,103 @@ +package de.leafbla.meinkraft.roleplay.fighter; + +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.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +public class FighterRole extends PlayerRole { + + public FighterRole(Main plugin, Player player) { + super(plugin, player); + } + + @Override + public Role getRole() { + return Role.FIGHTER; + } + + public void attackEntity(Entity entity) { + if (!(entity instanceof LivingEntity)) return; + this.player.playSound(player.getLocation(), Sound.BLOCK_ANVIL_LAND, 1, 1); + entity.getWorld().dropItem(entity.getLocation(),new ItemStack(Material.STONE)); + } + + public void onInteract(PlayerInteractEvent event) { + Player p = event.getPlayer(); + if (p.isSneaking()) { + if (p.getItemInHand().getType() == Material.AIR) { + p.setVelocity(new Vector(0, 1, 0)); + new BukkitRunnable() { + @Override + public void run() { + p.setGravity(false); + Location loc = p.getLocation(); + loc.setPitch(0); + p.teleport(loc); + new BukkitRunnable() { + int i = 0; + final int MAX = 15; + + @Override + public void run() { + if (++i == MAX) { + this.cancel(); + new BukkitRunnable() { + boolean once = true; + + @Override + public void run() { + if (once) { + loc.setPitch(38); + p.teleport(loc); + p.setGravity(true); + p.setFallDistance(0); + p.setNoDamageTicks(40); + p.setVelocity(new Vector(0, -2, 0)); + once = false; + } + if (((LivingEntity) p).isOnGround()) { + p.getWorld().createExplosion(p.getLocation(), 0f, false, false, p); + for (Entity en : p.getNearbyEntities(2, 1, 2)) { + if (en instanceof LivingEntity) { + LivingEntity len = ((LivingEntity) en); + Vector dir = len.getLocation().toVector().subtract(p.getLocation().toVector()).normalize(); + len.setVelocity(dir.multiply(2).add(new Vector(0, 1, 0))); + } + } + this.cancel(); + + } + } + }.runTaskTimer(plugin, 2, 1); + return; + } + loc.setYaw(((loc.getYaw() + 180 + 360 / MAX) % 360) - 180); + p.teleport(loc); + } + }.runTaskTimer(plugin, 0, 1); + } + }.runTaskLater(plugin, 15); + } + } else if (p.getItemInHand().getType() == Material.BLAZE_ROD) { + for (Entity en : p.getNearbyEntities(5, 5, 5)) { + if (en instanceof LivingEntity) { + LivingEntity len = ((LivingEntity) en); + Vector dir = len.getLocation().toVector().subtract(p.getLocation().toVector()); + if (Math.abs(dir.angle(p.getLocation().getDirection())) < 1.6) { + len.setVelocity(dir.multiply(2).add(new Vector(0, .3, 0))); + } + } + } + } + } +} diff --git a/src/plugin.yml b/src/plugin.yml new file mode 100644 index 0000000..d320c54 --- /dev/null +++ b/src/plugin.yml @@ -0,0 +1,10 @@ +name: MeinKraft +version: 0.1 +author: thamma +main: de.leafbla.meinkraft.Main +website: leafbla.de +api-version: 1.16 +commands: + role: + description: This is a demo command. + usage: /role {[player] [class]} {list} \ No newline at end of file