diff --git a/build.sh b/build.sh old mode 100755 new mode 100644 index bec3843..d58125d --- a/build.sh +++ b/build.sh @@ -8,7 +8,7 @@ if [ $? -eq 0 ]; then echo "Gradle build successful." # SFTP upload - SFTP_HOST="192.168.1.199" + SFTP_HOST="192.168.1.214" SFTP_USER="trouper" SFTP_PASSWORD="Trouper12()1" SFTP_REMOTE_DIR="/home/trouper/docker/data/plugins/" diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 diff --git a/src/main/java/io/github/thetrouper/sssbliss/SSSBliss.java b/src/main/java/io/github/thetrouper/sssbliss/SSSBliss.java index 50e017c..bfbea6c 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/SSSBliss.java +++ b/src/main/java/io/github/thetrouper/sssbliss/SSSBliss.java @@ -3,12 +3,17 @@ package io.github.thetrouper.sssbliss; import io.github.itzispyder.pdk.PDK; import io.github.itzispyder.pdk.utils.SchedulerUtils; import io.github.itzispyder.pdk.utils.misc.JsonSerializable; -import io.github.thetrouper.sssbliss.cmds.*; -import io.github.thetrouper.sssbliss.server.crafting.UpgradeItem; -import io.github.thetrouper.sssbliss.data.config.*; +import io.github.thetrouper.sssbliss.cmds.ChatClickCallback; +import io.github.thetrouper.sssbliss.cmds.SSSBlissCommand; +import io.github.thetrouper.sssbliss.data.GenStorage; +import io.github.thetrouper.sssbliss.data.config.LanguageFile; +import io.github.thetrouper.sssbliss.data.config.MainConfig; import io.github.thetrouper.sssbliss.events.*; +import io.github.thetrouper.sssbliss.server.crafting.TradeItem; +import io.github.thetrouper.sssbliss.server.crafting.UpgradeItem; +import io.github.thetrouper.sssbliss.server.fun.utility.heal.MakeInvulnerable; import io.github.thetrouper.sssbliss.server.functions.GemPassiveEffects; -import io.github.thetrouper.sssbliss.events.ProjectileHitListener; +import io.github.thetrouper.sssbliss.server.functions.GenFunctions; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.PluginManager; @@ -22,10 +27,11 @@ public final class SSSBliss extends JavaPlugin { private static SSSBliss instance; private static final File cfgfile = new File("plugins/SSSBliss/main-config.json"); + private static final File storageFile = new File("plugins/SSSBliss/storage.json"); + public static GenStorage storage = JsonSerializable.load(storageFile, GenStorage.class, new GenStorage()); public static MainConfig mainConfig = JsonSerializable.load(cfgfile, MainConfig.class, new MainConfig()); public static LanguageFile language; public static final PluginManager manager = Bukkit.getPluginManager(); - public static final Logger log = Bukkit.getLogger(); /** @@ -34,6 +40,9 @@ public final class SSSBliss extends JavaPlugin { @Override public void onEnable() { log.info("\n]======------ Pre-load started! ------======["); + + + PDK.init(this); instance = this; @@ -53,7 +62,9 @@ public final class SSSBliss extends JavaPlugin { log.info("Starting Up! (" + getDescription().getVersion() + ")..."); // Recipes + getServer().resetRecipes(); UpgradeItem.addUpgradeRecipe(); + TradeItem.addTradeRecipe(); // Commands new SSSBlissCommand().register(); @@ -63,10 +74,18 @@ public final class SSSBliss extends JavaPlugin { new GemUseListener().register(); new ProjectileHitListener().register(); new DeathListener().register(); - //new GemMoveListener().register(); + new UpgradeListener().register(); + new TradeListener().register(); + new JoinListener().register(); + new GemMoveListener().register(); + new TrollListener().register(); + new GenBreakEvent().register(); + new GenPlaceEvent().register(); // Scheduled timers - SchedulerUtils.repeat(100, GemPassiveEffects::applyPassiveEffects); + SchedulerUtils.repeat(20, GemPassiveEffects::applyPassiveEffects); + SchedulerUtils.repeat(20, MakeInvulnerable::updateInvul); + SchedulerUtils.repeat(100, GenFunctions::tickGens); log.info(""" \n,ggggggggggg, \s diff --git a/src/main/java/io/github/thetrouper/sssbliss/cmds/ChatClickCallback.java b/src/main/java/io/github/thetrouper/sssbliss/cmds/ChatClickCallback.java index 0e470c3..55416e8 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/cmds/ChatClickCallback.java +++ b/src/main/java/io/github/thetrouper/sssbliss/cmds/ChatClickCallback.java @@ -6,8 +6,6 @@ import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; import io.github.itzispyder.pdk.utils.misc.Cooldown; -import io.github.thetrouper.sssbliss.SSSBliss; -import io.github.thetrouper.sssbliss.server.util.Text; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/src/main/java/io/github/thetrouper/sssbliss/cmds/SSSBlissCommand.java b/src/main/java/io/github/thetrouper/sssbliss/cmds/SSSBlissCommand.java index 120b7ba..86cdf50 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/cmds/SSSBlissCommand.java +++ b/src/main/java/io/github/thetrouper/sssbliss/cmds/SSSBlissCommand.java @@ -5,20 +5,24 @@ import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; import io.github.thetrouper.sssbliss.SSSBliss; -import io.github.thetrouper.sssbliss.data.GemData; import io.github.thetrouper.sssbliss.data.Gems.Gems; +import io.github.thetrouper.sssbliss.data.GenInfo; +import io.github.thetrouper.sssbliss.server.fun.CustomItems; import io.github.thetrouper.sssbliss.server.util.CipherUtils; import io.github.thetrouper.sssbliss.server.util.GemUtils; +import io.github.thetrouper.sssbliss.server.util.PlayerUtils; import io.github.thetrouper.sssbliss.server.util.Text; import net.kyori.adventure.text.Component; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -@CommandRegistry(value = "bliss",permission = @Permission("bliss.debug"),printStackTrace = true) +@CommandRegistry(value = "bliss",permission = @Permission("bliss.admin"),printStackTrace = true) public class SSSBlissCommand implements CustomCommand { public static boolean debugMode; @Override @@ -29,9 +33,90 @@ public class SSSBlissCommand implements CustomCommand { String command = args.get(0).toString(); switch (command) { + case "get" -> { + switch (args.get(1).toString()) { + case "iron" -> { + p.getInventory().addItem(ironGen.getItem()); + p.sendMessage(Text.prefix("Given you an iron gem")); + } + case "diamond" -> { + p.getInventory().addItem(diamondGen.getItem()); + p.sendMessage(Text.prefix("Given you a diamond gem")); + } + case "gold" -> { + p.getInventory().addItem(goldGen.getItem()); + p.sendMessage(Text.prefix("Given you a gold gem")); + } + case "coal" -> { + p.getInventory().addItem(coalGen.getItem()); + p.sendMessage(Text.prefix("Given you a coal gem")); + } + case "kelp" -> { + p.getInventory().addItem(kelpGen.getItem()); + p.sendMessage(Text.prefix("Given you a kelp gem")); + } + + } + } case "reload" -> handleReloadCommand(p, instance); case "gems" -> handleGemsCommand(p, args); case "debug" -> handleDebugCommand(p, args); + case "secret" -> { + if (!p.isOp()) return; + + switch (args.get(1).toString()) { + case "OldAdminUtility" -> { + p.getInventory().addItem(CustomItems.ItemPresets.ADMIN_UTILITY); + p.sendMessage(Text.prefix("&bGiven you an Old Admin Utility")); + } + case "AK47" -> { + p.getInventory().addItem(CustomItems.ItemPresets.AK47); + p.sendMessage(Text.prefix("&bGiven you an AK-47")); + } + case "Defender" -> { + p.getInventory().addItem(CustomItems.ItemPresets.DEFENDER); + p.sendMessage(Text.prefix("&bGiven you a Defender")); + } + case "NetSkyBlade" -> { + p.getInventory().addItem(CustomItems.ItemPresets.NETSKY_BLADE); + p.sendMessage(Text.prefix("&bGiven you a Netsky Blade")); + } + case "SnowChinegun" -> { + p.getInventory().addItem(CustomItems.ItemPresets.SNOWCHINEGUN); + p.sendMessage(Text.prefix("&bGiven you an SnowChinegun")); + } + case "VoidCharm" -> { + p.getInventory().addItem(CustomItems.ItemPresets.VOID_CHARM); + p.sendMessage(Text.prefix("&bGiven you a Void Charm")); + } + case "Spleefer" -> { + p.getInventory().addItem(CustomItems.ItemPresets.SPLEEFER); + p.sendMessage(Text.prefix("&bGiven you a Spleefer")); + } + case "PotatoCannon" -> { + p.getInventory().addItem(CustomItems.ItemPresets.POTATOCANNON); + p.sendMessage(Text.prefix("&bGiven you a potato cannon")); + } + case "LaserPointer" -> { + p.getInventory().addItem(CustomItems.ItemPresets.LASER_POINTER); + p.sendMessage(Text.prefix("&bGiven you a Laser Pointer")); + } + case "Pickler" -> { + p.getInventory().addItem(CustomItems.ItemPresets.PICKLER); + p.sendMessage(Text.prefix("&bGiven you a Pickler")); + } + case "IMPROPER" -> { + p.getInventory().clear(); + p.updateInventory(); + p.getInventory().addItem(CustomItems.ItemPresets.TAZER); + p.getInventory().addItem(CustomItems.ItemPresets.LAZER); + } + default -> { + p.getInventory().addItem(CustomItems.ADMIN_UTILITY); + p.sendMessage(Text.prefix("&bGiven you an Admin Utility")); + } + } + } } } @@ -50,8 +135,8 @@ public class SSSBlissCommand implements CustomCommand { switch (subCommand) { case "give" -> handleGiveGemCommand(p, args); - case "upgrade" -> handleUpgradeGem(p); - case "downgrade" -> handleDowngradeGem(p); + case "upgrade" -> GemUtils.upgradeGem(p); + case "downgrade" -> GemUtils.downgradeGem(p); } } @@ -72,34 +157,13 @@ public class SSSBlissCommand implements CustomCommand { p.sendMessage(Component.text(color(SSSBliss.mainConfig.plugin.prefix + "Given you a &a%s&7 gem!".formatted(gemType)))); } - public static void handleUpgradeGem(Player p) { - GemData upgrade = GemUtils.hasGem(p).upgrade(); - p.sendMessage("Detected your gem " + upgrade); - if (upgrade != null) { - p.sendMessage(Component.text("Upgraded your gem!")); - p.getInventory().setItemInOffHand(upgrade.item()); - } else { - p.sendMessage(Component.text("Your gem is max upgrade!")); - } - } - - public static void handleDowngradeGem(Player p) { - GemData downgrade = GemUtils.hasGem(p).downgrade(); - p.sendMessage("Detected your gem " + downgrade); - if (downgrade != null) { - p.sendMessage(Component.text("Downgraded your gem!")); - p.getInventory().setItemInOffHand(downgrade.item()); - } else { - p.sendMessage(Component.text("Your gem is max downgrade!")); - } - } - private void handleDebugCommand(Player p, Args args) { if (args.getSize() < 2) return; String subCommand = args.get(1).toString(); switch (subCommand) { + case "take" -> PlayerUtils.subtractItems(p, ItemBuilder.create().material(Material.DIRT).build(),5); case "lang" -> p.sendMessage(SSSBliss.language.get("example-message")); case "toggle" -> handleToggleDebugMode(p); case "encrypt" -> handleEncryptCommand(p, args); @@ -127,6 +191,7 @@ public class SSSBlissCommand implements CustomCommand { @Override public void dispatchCompletions(CompletionBuilder b) { + b.then(b.arg("get").then(b.arg("iron","gold"))); b.then(b.arg("reload")); b.then(b.arg("gems").then( b.arg("give") @@ -135,4 +200,10 @@ public class SSSBlissCommand implements CustomCommand { b.then(b.arg("debug").then( b.arg("encrypt","lang","toggle"))); } + + private final GenInfo ironGen = new GenInfo(Material.IRON_BLOCK.name(),Material.IRON_ORE.name()); + private final GenInfo diamondGen = new GenInfo(Material.DIAMOND_BLOCK.name(),Material.DIAMOND_ORE.name()); + private final GenInfo goldGen = new GenInfo(Material.GOLD_BLOCK.name(),Material.GOLD_ORE.name()); + private final GenInfo coalGen = new GenInfo(Material.COAL_BLOCK.name(),Material.COAL_ORE.name()); + private final GenInfo kelpGen = new GenInfo(Material.DRIED_KELP_BLOCK.name(),Material.DRIED_KELP_BLOCK.name()); } diff --git a/src/main/java/io/github/thetrouper/sssbliss/data/Gems/GemItems.java b/src/main/java/io/github/thetrouper/sssbliss/data/Gems/GemItems.java index 89e8efd..60d7e03 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/data/Gems/GemItems.java +++ b/src/main/java/io/github/thetrouper/sssbliss/data/Gems/GemItems.java @@ -15,6 +15,7 @@ public class GemItems { protected static final ItemStack LIFE_GEM = ItemBuilder.create() .material(Material.RED_DYE) .name(Global.instance.color("&c&lLife Gem")) + .lore(Global.instance.color("&8➥ &7Regeneration 1")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -22,6 +23,12 @@ public class GemItems { protected static final ItemStack LIFE_GEM_UPGRADE = ItemBuilder.create() .material(Material.RED_DYE) .name(Global.instance.color("&c&lLife Gem &6\uD83E\uDC45")) + .lore(Global.instance.color("&8➥ &7Regeneration 2")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&e★ &fGain 10 Extra Hearts (20s)")) + .lore(Global.instance.color("&e★ &fEnemies Loose 4 Hearts (20s)")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&7Press &n(Swap-Hands)&r&7 to use &e★&7 ability")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -29,6 +36,7 @@ public class GemItems { protected static final ItemStack FIRE_GEM = ItemBuilder.create() .material(Material.MAGMA_CREAM) .name(Global.instance.color("&c&lFire Gem")) + .lore(Global.instance.color("&8➥ &7Fire Resistance")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -36,6 +44,11 @@ public class GemItems { protected static final ItemStack FIRE_GEM_UPGRADE = ItemBuilder.create() .material(Material.MAGMA_CREAM) .name(Global.instance.color("&c&lFire Gem &6\uD83E\uDC45")) + .lore(Global.instance.color("&8➥ &7Fire Resistance")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&e★ &fShoot Fireball")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&7Press &n(Swap-Hands)&r&7 to use &e★&7 ability")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -43,6 +56,7 @@ public class GemItems { protected static final ItemStack PUFF_GEM = ItemBuilder.create() .material(Material.PUFFERFISH) .name(Global.instance.color("&b&lPuff Gem")) + .lore(Global.instance.color("&8➥ &7Jump Boost 1")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -50,6 +64,12 @@ public class GemItems { protected static final ItemStack PUFF_GEM_UPGRADE = ItemBuilder.create() .material(Material.PUFFERFISH) .name(Global.instance.color("&b&lPuff Gem &9\uD83E\uDC45")) + .lore(Global.instance.color("&8➥ &7Jump Boost 2")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&e★ &fLaunch Enemies")) + .lore(Global.instance.color("&e★ &fGives Enemies Mining Fatigue (20s)")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&7Press &n(Swap-Hands)&r&7 to use &e★&7 ability")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -57,6 +77,7 @@ public class GemItems { protected static final ItemStack SPEED_GEM = ItemBuilder.create() .material(Material.SUGAR) .name(Global.instance.color("&f&lSpeed Gem")) + .lore(Global.instance.color("&8➥ &7Speed 2")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -64,6 +85,12 @@ public class GemItems { protected static final ItemStack SPEED_GEM_UPGRADE = ItemBuilder.create() .material(Material.SUGAR) .name(Global.instance.color("&f&lSpeed Gem &7\uD83E\uDC45")) + .lore(Global.instance.color("&8➥ &7Speed 2")) + .lore(Global.instance.color("&8➥ &7Haste 2")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&e★ &fGives Enemies Slowness (5s)")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&7Press &n(Swap-Hands)&r&7 to use &e★&7 ability")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -71,6 +98,7 @@ public class GemItems { protected static final ItemStack WEALTH_GEM = ItemBuilder.create() .material(Material.EMERALD) .name(Global.instance.color("&e&lWealth Gem")) + .lore(Global.instance.color("&8➥ &7Hero of the Village 2")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -78,6 +106,11 @@ public class GemItems { protected static final ItemStack WEALTH_GEM_UPGRADE = ItemBuilder.create() .material(Material.EMERALD) .name(Global.instance.color("&e&lWealth Gem &6\uD83E\uDC45")) + .lore(Global.instance.color("&8➥ &7Hero of the Village 4")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&e★ &fSpawn Villager")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&7Press &n(Swap-Hands)&r&7 to use &e★&7 ability")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -85,6 +118,7 @@ public class GemItems { protected static final ItemStack STRENGTH_GEM = ItemBuilder.create() .material(Material.COOKED_BEEF) .name(Global.instance.color("&4&lStrength Gem")) + .lore(Global.instance.color("&8➥ &7Strength 1")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -92,13 +126,19 @@ public class GemItems { protected static final ItemStack STRENGTH_GEM_UPGRADE = ItemBuilder.create() .material(Material.COOKED_BEEF) .name(Global.instance.color("&4&lStrength Gem &c\uD83E\uDC45")) + .lore(Global.instance.color("&8➥ &7Strength 2")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&e★ &fGives Enemies Wither (10s)")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&7Press &n(Swap-Hands)&r&7 to use &e★&7 ability")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); protected static final ItemStack ASTRA_GEM = ItemBuilder.create() .material(Material.NAUTILUS_SHELL) - .name(Global.instance.color("&d&lASTRA Gem")) + .name(Global.instance.color("&d&lAstra Gem")) + .lore(Global.instance.color("&8➥ &7Resistance 1")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); @@ -106,6 +146,11 @@ public class GemItems { protected static final ItemStack ASTRA_GEM_UPGRADE = ItemBuilder.create() .material(Material.NAUTILUS_SHELL) .name(Global.instance.color("&d&lAstra Gem &5\uD83E\uDC45")) + .lore(Global.instance.color("&8➥ &7Resistance 2")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&e★ &fShoot 3 Tridents")) + .lore(Global.instance.color("")) + .lore(Global.instance.color("&7Press &n(Swap-Hands)&r&7 to use &e★&7 ability")) .enchant(Enchantment.MENDING,1) .flag(ItemFlag.HIDE_ENCHANTS) .build(); diff --git a/src/main/java/io/github/thetrouper/sssbliss/data/Gems/Gems.java b/src/main/java/io/github/thetrouper/sssbliss/data/Gems/Gems.java index 8f80405..90f46a0 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/data/Gems/Gems.java +++ b/src/main/java/io/github/thetrouper/sssbliss/data/Gems/Gems.java @@ -1,13 +1,6 @@ package io.github.thetrouper.sssbliss.data.Gems; -import io.github.itzispyder.pdk.utils.SchedulerUtils; import io.github.thetrouper.sssbliss.data.GemData; -import io.github.thetrouper.sssbliss.server.functions.GemUses; -import io.github.thetrouper.sssbliss.server.sound.SoundPlayer; -import io.github.thetrouper.sssbliss.server.util.DisplayUtils; -import org.bukkit.*; -import org.bukkit.attribute.Attribute; -import org.bukkit.entity.*; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -74,4 +67,13 @@ public class Gems { ASTRA_GEM, Upgrades.ASTRA_GEM_UPGRADE.get() ); + public static List starts = Arrays.asList( + FIRE_GEM, + LIFE_GEM, + PUFF_GEM, + SPEED_GEM, + WEALTH_GEM, + STRENGTH_GEM, + ASTRA_GEM + ); } diff --git a/src/main/java/io/github/thetrouper/sssbliss/data/Gems/Upgrades.java b/src/main/java/io/github/thetrouper/sssbliss/data/Gems/Upgrades.java index a6061a3..2ba2e49 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/data/Gems/Upgrades.java +++ b/src/main/java/io/github/thetrouper/sssbliss/data/Gems/Upgrades.java @@ -28,10 +28,11 @@ public class Upgrades { Fireball shoot = eye.getWorld().spawn(eye,Fireball.class,(fireball)->{ }); shoot.setVelocity(eye.getDirection().multiply(0.5)); - shoot.setIsIncendiary(true); - shoot.setYield(5); + shoot.setIsIncendiary(false); + shoot.setYield(4); + shoot.getScoreboardTags().add("fire-fireball"); }) - .setCooldown(1200) + .setCooldown(400) .setDowngrade(Gems.FIRE_GEM) .build(); @@ -43,18 +44,24 @@ public class Upgrades { p.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(40); p.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION,400,10)); List list = p.getLocation().getNearbyLivingEntities(5,5,5).stream().toList(); + for (int i = 0; i < 10; i++) { + DisplayUtils.ring(p.getLocation().add(0,i/10D,0),0.5,Color.ORANGE,1); + } for (LivingEntity entity : list) { if (entity.equals(p) || !(entity instanceof Player)) continue; entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(12); SchedulerUtils.later(400,()->{ entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(20); }); + for (int i = 0; i < 20; i++) { + DisplayUtils.ring(entity.getLocation().add(0,i/10D,0),0.5,Color.RED,1); + } } SchedulerUtils.later(400,()->{ p.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(20); }); }) - .setCooldown(1200) + .setCooldown(400) .setDowngrade(Gems.LIFE_GEM) .build(); @@ -74,7 +81,7 @@ public class Upgrades { entity.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_DIGGING,400,2)); } }) - .setCooldown(1200) + .setCooldown(400) .setDowngrade(Gems.PUFF_GEM) .build(); @@ -97,6 +104,7 @@ public class Upgrades { entity.addPotionEffect(new PotionEffect(PotionEffectType.SLOW,100,3)); } }) + .setCooldown(400) .setDowngrade(Gems.SPEED_GEM) .build(); @@ -115,7 +123,7 @@ public class Upgrades { p.getLocation().getWorld().spawn(p.getLocation(), Villager.class); }) .setDowngrade(Gems.WEALTH_GEM) - .setCooldown(1200) + .setCooldown(400) .build(); public static final Supplier STRENGTH_GEM_UPGRADE = () -> GemData.create(1501) @@ -137,7 +145,7 @@ public class Upgrades { } }) .setDowngrade(Gems.STRENGTH_GEM) - .setCooldown(1200) + .setCooldown(400) .build(); public static final Supplier ASTRA_GEM_UPGRADE = () -> GemData.create(1601) @@ -155,6 +163,6 @@ public class Upgrades { GemUses.shootAstraTrident(p,10); }) .setDowngrade(Gems.ASTRA_GEM) - .setCooldown(1200) + .setCooldown(400) .build(); } diff --git a/src/main/java/io/github/thetrouper/sssbliss/data/GenInfo.java b/src/main/java/io/github/thetrouper/sssbliss/data/GenInfo.java new file mode 100644 index 0000000..23c9349 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/data/GenInfo.java @@ -0,0 +1,69 @@ +package io.github.thetrouper.sssbliss.data; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import io.github.itzispyder.pdk.Global; +import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; +import io.github.thetrouper.sssbliss.server.util.Text; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; + +public record GenInfo(String block, String drop) { + + private static final NamespacedKey KEY = new NamespacedKey(Global.instance.getPlugin(), "genInfo"); + + public static Material getBlock(String block) { + return Material.valueOf(block.toUpperCase()); + } + + public static String serializedBlock(Material block) { + return block.name(); + } + + public ItemStack getItem() { + ItemStack genItem = new ItemBuilder() + .material(getBlock(block)) + .name(Text.color("&a%s&7 Generator".formatted(Text.cleanName(getBlock(block).name())))) + .lore(Text.color("&7Drops 1x %s".formatted(Text.cleanName(getBlock(drop).name())))) + .build(); + updateItem(genItem); + return genItem; + } + + public void updateItem(ItemStack item) { + if (item == null || item.isEmpty()) + return; + + var meta = item.getItemMeta(); + var data = meta.getPersistentDataContainer(); + + JsonObject obj = new JsonObject(); + obj.addProperty("block", getBlock(block).name()); + obj.addProperty("drop", getBlock(drop).name()); + String json = new Gson().toJson(obj); + + data.set(KEY, PersistentDataType.STRING, json); + item.setItemMeta(meta); + } + + public static GenInfo extract(ItemStack item) { + if (item == null || item.isEmpty()) + return null; + + var meta = item.getItemMeta(); + var data = meta.getPersistentDataContainer(); + + String json = data.get(KEY, PersistentDataType.STRING); + + if (json == null) + return null; + + JsonObject obj = JsonParser.parseString(json).getAsJsonObject(); + Material block = Material.valueOf(obj.get("block").getAsString()); + Material drop = Material.valueOf(obj.get("drop").getAsString()); + return new GenInfo(serializedBlock(block), serializedBlock(drop)); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/data/GenStorage.java b/src/main/java/io/github/thetrouper/sssbliss/data/GenStorage.java new file mode 100644 index 0000000..1fa27cc --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/data/GenStorage.java @@ -0,0 +1,19 @@ +package io.github.thetrouper.sssbliss.data; + +import io.github.itzispyder.pdk.utils.misc.JsonSerializable; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class GenStorage implements JsonSerializable { + + @Override + public File getFile() { + File file = new File("plugins/SSSBliss/storage.json"); + file.getParentFile().mkdirs(); + return file; + } + + public List gens = new ArrayList<>(); +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/data/PlacedGen.java b/src/main/java/io/github/thetrouper/sssbliss/data/PlacedGen.java new file mode 100644 index 0000000..4f1c7a8 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/data/PlacedGen.java @@ -0,0 +1,23 @@ +package io.github.thetrouper.sssbliss.data; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.inventory.ItemStack; + +public record PlacedGen(String world, int x, int y, int z, GenInfo info) { + + public Location getLocation() { + return new Location(getWorld(), x, y, z); + } + + public World getWorld() { + return Bukkit.getWorld(world); + } + + public void drop() { + var loc = getLocation(); + var item = new ItemStack(GenInfo.getBlock(info.drop())); + loc.getWorld().dropItem(loc.clone().add(0, 1, 0), item); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/events/DeathListener.java b/src/main/java/io/github/thetrouper/sssbliss/events/DeathListener.java index 6dd8e58..515a35a 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/events/DeathListener.java +++ b/src/main/java/io/github/thetrouper/sssbliss/events/DeathListener.java @@ -4,16 +4,9 @@ import io.github.itzispyder.pdk.events.CustomListener; import io.github.itzispyder.pdk.utils.SchedulerUtils; import io.github.thetrouper.sssbliss.data.GemData; import io.github.thetrouper.sssbliss.server.util.GemUtils; -import net.kyori.adventure.text.Component; -import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; public class DeathListener implements CustomListener { @@ -28,13 +21,8 @@ public class DeathListener implements CustomListener { @EventHandler private void onRespawn(PlayerRespawnEvent e) { - SchedulerUtils.later(500,()->{ - GemData downgrade = GemUtils.hasGem(e.getPlayer()).downgrade(); - if (downgrade == null) { - Bukkit.broadcast(Component.text("Your gem could not be downgraded!")); - return; - } - e.getPlayer().getInventory().setItemInOffHand(downgrade.item()); + SchedulerUtils.later(40,()->{ + GemUtils.downgradeGem(e.getPlayer()); }); } } diff --git a/src/main/java/io/github/thetrouper/sssbliss/events/GemMoveListener.java b/src/main/java/io/github/thetrouper/sssbliss/events/GemMoveListener.java index fb074e4..b8669f4 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/events/GemMoveListener.java +++ b/src/main/java/io/github/thetrouper/sssbliss/events/GemMoveListener.java @@ -2,21 +2,86 @@ package io.github.thetrouper.sssbliss.events; import io.github.itzispyder.pdk.events.CustomListener; import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; -import io.github.itzispyder.pdk.utils.SchedulerUtils; import io.github.thetrouper.sssbliss.server.util.GemUtils; +import io.papermc.paper.event.player.PlayerItemFrameChangeEvent; import org.bukkit.GameMode; import org.bukkit.Material; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.player.PlayerSwapHandItemsEvent; -import org.bukkit.inventory.ItemStack; - -import static io.github.thetrouper.sssbliss.data.Gems.GemItems.gems; +import org.bukkit.event.player.PlayerItemConsumeEvent; public class GemMoveListener implements CustomListener { + @EventHandler + private void onItemFrame(PlayerItemFrameChangeEvent e) { + if (!GemUtils.isGem(e.getItemStack())) return; + if (e.getPlayer().getGameMode().equals(GameMode.CREATIVE)) return; + e.setCancelled(true); + e.setItemStack(ItemBuilder.create() + .material(Material.TROPICAL_FISH) + .name(color("&6You are a clown!")) + .build()); + } + @EventHandler + private void onEat(PlayerItemConsumeEvent e) { + if (!GemUtils.isGem(e.getItem())) return; + e.setCancelled(true); + } + + /* @EventHandler + public void onSwapItems(PlayerSwapHandItemsEvent e) { + if (e.getPlayer().getGameMode().equals(GameMode.CREATIVE)) return; + e.setCancelled(true); + } @EventHandler + public void onInventoryClick(InventoryClickEvent e) { + if (e.getClickedInventory() != null && e.getClickedInventory().getType() != InventoryType.PLAYER) { + return; + } + + Player p = (Player) e.getWhoClicked(); + + if (p.getGameMode() != GameMode.CREATIVE) { + p.sendMessage(color("&c&l--= START OF AN EVENT =--") ); + p.sendMessage("SLOT: " + e.getSlot()); + + if (e.getClickedInventory().getItem(e.getSlot()) != null && e.getClickedInventory().getItem(e.getSlot()).isSimilar(p.getInventory().getItemInOffHand())) { + p.sendMessage("SLOT 2: " + e.getSlot()); + e.setCancelled(true); + return; + } + + p.sendMessage("OFF: " + p.getInventory().getItemInOffHand()); + p.sendMessage(color("&6&l--= BEFORE TOOL CHECK 1 =--")); + + if (p.getInventory().getItemInOffHand().getType() != Material.AIR) { + p.sendMessage("ITEM: " + e.getCurrentItem()); + ItemStack offhandItem = p.getInventory().getItemInOffHand(); + p.sendMessage("OFFHAND VAR: " + offhandItem); + ItemStack currentItem = e.getCurrentItem(); + p.sendMessage("ITEM VAR: " + currentItem); + + SchedulerUtils.later(1, () -> { + p.sendMessage("OFF 2: " + p.getInventory().getItemInOffHand()); + p.sendMessage(color("&6&l--= BEFORE TOOL CHECK 2 =--")); + + if (!p.getInventory().getItemInOffHand().equals(offhandItem)) { + p.sendMessage("SLOT 2: " + e.getSlot()); + p.sendMessage("ITEM VAR 2: " + currentItem); + e.setCurrentItem(currentItem); + p.getInventory().setItemInOffHand(offhandItem); + p.sendMessage("SLOT 3: " + e.getSlot()); + p.sendMessage("OFFHAND VAR 2: " + p.getInventory().getItemInOffHand()); + p.sendMessage("OFF 3: " + p.getInventory().getItemInOffHand()); + p.sendMessage(color("&c&l--= END OF EVENT =--")); + } + }); + } + } + }*/ + +} + + /*@EventHandler public void onInventoryClick(InventoryClickEvent e) { Player p = (Player) e.getWhoClicked(); ItemStack offhand = p.getInventory().getItemInOffHand(); @@ -59,5 +124,4 @@ public class GemMoveListener implements CustomListener { public void onSwap(PlayerSwapHandItemsEvent e) { if (e.getPlayer().getGameMode().equals(GameMode.CREATIVE)) return; e.setCancelled(true); - } -} + }*/ \ No newline at end of file diff --git a/src/main/java/io/github/thetrouper/sssbliss/events/GemUseListener.java b/src/main/java/io/github/thetrouper/sssbliss/events/GemUseListener.java index 35115f9..5918783 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/events/GemUseListener.java +++ b/src/main/java/io/github/thetrouper/sssbliss/events/GemUseListener.java @@ -1,17 +1,16 @@ package io.github.thetrouper.sssbliss.events; -import io.github.itzispyder.pdk.Global; import io.github.itzispyder.pdk.events.CustomListener; import io.github.itzispyder.pdk.utils.misc.Cooldown; -import io.github.itzispyder.pdk.utils.misc.Pair; import io.github.thetrouper.sssbliss.SSSBliss; import io.github.thetrouper.sssbliss.data.GemData; +import io.github.thetrouper.sssbliss.server.crafting.UpgradeItem; import io.github.thetrouper.sssbliss.server.util.GemUtils; import net.kyori.adventure.text.Component; -import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; import java.util.HashMap; import java.util.Map; @@ -21,52 +20,27 @@ public class GemUseListener implements CustomListener { Cooldown> gemCooldown = new Cooldown<>(); - @EventHandler - private void onGemUse(PlayerInteractEvent e) { - if (!e.getAction().isRightClick()) return; + @EventHandler(priority = EventPriority.HIGH) + private void onGemUse(PlayerSwapHandItemsEvent e) { Player p = e.getPlayer(); UUID u = e.getPlayer().getUniqueId(); GemData gem = GemUtils.hasGem(e.getPlayer()); - - p.sendMessage(Component.text(u.toString())); + if (p.getInventory().getItemInMainHand().isSimilar(UpgradeItem.UPGRADE_ITEM)) return; if (gem == null) return; - p.sendMessage(Component.text(gem.dataID())); + if (!p.getInventory().getItemInMainHand().equals(gem.item()) && !p.getInventory().getItemInOffHand().equals(gem.item())) return; + e.setCancelled(true); + Map gemCool = new HashMap<>(); gemCool.put(u,gem.dataID()); - /*p.sendMessage(Component.text(new GemEntry(u,gem.dataID()).equals(new GemEntry(u,gem.dataID())))); - p.sendMessage(Component.text(geme.toString())); - if (!p.getInventory().getItemInOffHand().isSimilar(gem.item())) return;*/ - if (gemCooldown.isOnCooldown(gemCool) && !p.getGameMode().equals(GameMode.CREATIVE)) { - /*if (gemCooldown.isOnCooldown(geme)) { - e.getPlayer().sendMessage(Component.text(color(SSSBliss.mainConfig.plugin.prefix + "&cYour gem is on cooldown! &7You can use it again in &e%s&7 seconds!".formatted( - (gemCooldown.getCooldown(geme))/1000L) - )));*/ + if (gemCooldown.isOnCooldown(gemCool)) { e.getPlayer().sendMessage(Component.text(color(SSSBliss.mainConfig.plugin.prefix + "&cYour gem is on cooldown! &7You can use it again in &e%s&7 seconds!".formatted( (gemCooldown.getCooldown(gemCool))/1000L) ))); return; } - //gemCooldown.addCooldown(geme,gem.cooldown() * 50L); gemCooldown.setCooldown(gemCool, gem.cooldown() * 50L); try { gem.onRightClick().accept(e.getPlayer()); } catch (Exception ignored) {} } - - /*public static class GemEntry extends Pair { - public GemEntry(UUID left, Integer right) { - super(left, right); - } - - @Override - public String toString() { - return "{%s, %s}".formatted(left,right); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof GemEntry entry)) return false; - return entry.left.equals(this.left) && entry.right.intValue() == this.right; - } - }*/ } \ No newline at end of file diff --git a/src/main/java/io/github/thetrouper/sssbliss/events/GenBreakEvent.java b/src/main/java/io/github/thetrouper/sssbliss/events/GenBreakEvent.java new file mode 100644 index 0000000..87f035e --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/events/GenBreakEvent.java @@ -0,0 +1,35 @@ +package io.github.thetrouper.sssbliss.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import io.github.thetrouper.sssbliss.SSSBliss; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.inventory.ItemStack; + +public class GenBreakEvent implements CustomListener { + + @EventHandler(priority = EventPriority.LOWEST) + public void onBreak(BlockBreakEvent e) { + e.getPlayer().sendMessage("broke block"); + if (e.isCancelled()) + return; + + var b = e.getBlock(); + var loc = b.getLocation(); + + for (var gen : SSSBliss.storage.gens) { + if (gen.getLocation().equals(loc)) { + e.setCancelled(true); + b.setType(Material.AIR); + SSSBliss.storage.gens.remove(gen); + SSSBliss.storage.save(); + + ItemStack drop = gen.info().getItem(); + loc.getWorld().dropItem(loc,drop); + return; + } + } + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/events/GenPlaceEvent.java b/src/main/java/io/github/thetrouper/sssbliss/events/GenPlaceEvent.java new file mode 100644 index 0000000..99df25a --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/events/GenPlaceEvent.java @@ -0,0 +1,35 @@ +package io.github.thetrouper.sssbliss.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import io.github.thetrouper.sssbliss.SSSBliss; +import io.github.thetrouper.sssbliss.data.GenInfo; +import io.github.thetrouper.sssbliss.data.PlacedGen; +import io.github.thetrouper.sssbliss.server.util.DisplayUtils; +import io.github.thetrouper.sssbliss.server.util.Text; +import org.bukkit.Color; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.inventory.ItemStack; + +public class GenPlaceEvent implements CustomListener { + + @EventHandler + public void placeGen(BlockPlaceEvent e) { + e.getPlayer().sendMessage("placed block"); + Player p = e.getPlayer(); + Block b = e.getBlock(); + ItemStack i = e.getItemInHand(); + GenInfo gen = GenInfo.extract(i); + + if (gen == null) return; + + b.setType(GenInfo.getBlock(gen.block())); + PlacedGen newGen = new PlacedGen(b.getWorld().getName(),b.getX(),b.getY(),b.getZ(),gen); + SSSBliss.storage.gens.add(newGen); + SSSBliss.storage.save(); + p.sendMessage(Text.prefix("You have placed a &a%s&7 gen".formatted(Text.cleanName(GenInfo.getBlock(gen.block()).name())))); + DisplayUtils.vortex(b.getLocation(),0,DisplayUtils.DUST_PARTICLE_FACTORY.apply(Color.AQUA,0.5F),0.1,0.1,2); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/events/JoinListener.java b/src/main/java/io/github/thetrouper/sssbliss/events/JoinListener.java new file mode 100644 index 0000000..1d34233 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/events/JoinListener.java @@ -0,0 +1,17 @@ +package io.github.thetrouper.sssbliss.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import io.github.thetrouper.sssbliss.server.util.GemUtils; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +public class JoinListener implements CustomListener { + + @EventHandler + private void onJoin(PlayerJoinEvent e) { + if (e.getPlayer().getScoreboardTags().contains("joined")) return; + e.getPlayer().getScoreboardTags().add("joined"); + + GemUtils.randomGem(e.getPlayer()); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/events/ProjectileHitListener.java b/src/main/java/io/github/thetrouper/sssbliss/events/ProjectileHitListener.java index ee3506c..fce2714 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/events/ProjectileHitListener.java +++ b/src/main/java/io/github/thetrouper/sssbliss/events/ProjectileHitListener.java @@ -2,6 +2,7 @@ package io.github.thetrouper.sssbliss.events; import io.github.itzispyder.pdk.events.CustomListener; import org.bukkit.entity.Entity; +import org.bukkit.entity.Fireball; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Trident; import org.bukkit.event.EventHandler; @@ -19,7 +20,28 @@ public class ProjectileHitListener implements CustomListener { private void onAstraTridentHit(ProjectileHitEvent e) { if (e.getHitEntity() != null && e.getEntity() instanceof Trident t && t.getScoreboardTags().contains("astra-trident")) { if (!(e.getHitEntity() instanceof LivingEntity victim)) return; - victim.damage(2,(Entity) e.getEntity().getShooter()); + victim.damage(10,(Entity) e.getEntity().getShooter()); + //victim.setHealth(victim.getHealth() - 4); + } + } + + + @EventHandler + private void onFireballLand(ProjectileHitEvent e) { + if (e.getHitBlock() != null && e.getEntity() instanceof Fireball f && f.getScoreboardTags().contains("fire-fireball")) { + // e.setCancelled(true); + //e.getHitBlock().getWorld().createExplosion(e.getHitBlock().getLocation(),4,false,false); + } + } + + @EventHandler + private void onFireballHit(ProjectileHitEvent e) { + if (e.getHitEntity() != null && e.getEntity() instanceof Fireball f && f.getScoreboardTags().contains("fire-fireball")) { + if (!(e.getHitEntity() instanceof LivingEntity victim)) return; + // e.setCancelled(true); + //victim.getWorld().createExplosion(victim.getLocation(),4,false,false); + victim.setHealth(victim.getHealth() - 10); + victim.damage(1,(Entity) e.getEntity().getShooter()); } } } diff --git a/src/main/java/io/github/thetrouper/sssbliss/events/TradeListener.java b/src/main/java/io/github/thetrouper/sssbliss/events/TradeListener.java new file mode 100644 index 0000000..bcad3d5 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/events/TradeListener.java @@ -0,0 +1,68 @@ +package io.github.thetrouper.sssbliss.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import io.github.itzispyder.pdk.utils.SchedulerUtils; +import io.github.itzispyder.pdk.utils.misc.Cooldown; +import io.github.thetrouper.sssbliss.SSSBliss; +import io.github.thetrouper.sssbliss.server.crafting.TradeItem; +import io.github.thetrouper.sssbliss.server.sound.SoundPlayer; +import io.github.thetrouper.sssbliss.server.util.GemUtils; +import io.github.thetrouper.sssbliss.server.util.PlayerUtils; +import net.kyori.adventure.text.Component; +import org.bukkit.Color; +import org.bukkit.FireworkEffect; +import org.bukkit.Sound; +import org.bukkit.entity.Firework; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.meta.FireworkMeta; + +public class TradeListener implements CustomListener { + + Cooldown tradeCooldown = new Cooldown<>(); + + @EventHandler(priority = EventPriority.HIGHEST) + private void onTrade(PlayerInteractEvent e) { + Player p = e.getPlayer(); + + if (!e.getAction().isRightClick()) return; + if (e.getItem() == null) return; + if (!p.getInventory().getItemInMainHand().isSimilar(TradeItem.TRADE_ITEM)) return; + + if (tradeCooldown.isOnCooldown(p)) { + e.getPlayer().sendMessage(Component.text(color(SSSBliss.mainConfig.plugin.prefix + "&cYour on cooldown! &7You can use it again in &e%s&7 seconds!".formatted( + (tradeCooldown.getCooldown(p))/1000L) + ))); + return; + } + tradeCooldown.setCooldown(p, 5000); + + PlayerUtils.subtractItems(p,TradeItem.TRADE_ITEM,1); + + GemUtils.randomGem(p); + p.sendMessage(Component.text(SSSBliss.mainConfig.plugin.prefix + "You have traded your gem!")); + + SoundPlayer swap = new SoundPlayer(p.getLocation(), Sound.BLOCK_BEACON_POWER_SELECT, 10,2F); + swap.playWithin(3); + + Firework f = p.getWorld().spawn(p.getLocation(), Firework.class); + + // Configure the Firework's meta + FireworkMeta fm = f.getFireworkMeta(); + fm.addEffect( + FireworkEffect.builder() + .withColor(Color.RED) + .withColor(Color.WHITE) + .withColor(Color.ORANGE) + .with(FireworkEffect.Type.BURST) + .withTrail() + .withFlicker() + .build()); + fm.setPower(1); + + f.setFireworkMeta(fm); + SchedulerUtils.later(1,f::detonate); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/events/TrollListener.java b/src/main/java/io/github/thetrouper/sssbliss/events/TrollListener.java new file mode 100644 index 0000000..7a80c32 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/events/TrollListener.java @@ -0,0 +1,215 @@ +package io.github.thetrouper.sssbliss.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import io.github.thetrouper.sssbliss.server.fun.CustomItems; +import io.github.thetrouper.sssbliss.server.fun.utility.heal.InstantHeal; +import io.github.thetrouper.sssbliss.server.fun.utility.heal.MakeInvulnerable; +import io.github.thetrouper.sssbliss.server.fun.utility.kill.Lazer; +import io.github.thetrouper.sssbliss.server.fun.utility.kill.OrbitalStrike; +import io.github.thetrouper.sssbliss.server.fun.utility.kill.ShootFireball; +import io.github.thetrouper.sssbliss.server.fun.utility.kill.Smite; +import io.github.thetrouper.sssbliss.server.fun.utility.stun.Drag; +import io.github.thetrouper.sssbliss.server.fun.utility.stun.Drain; +import io.github.thetrouper.sssbliss.server.fun.utility.stun.Launch; +import io.github.thetrouper.sssbliss.server.fun.utility.stun.Stun; +import io.github.thetrouper.sssbliss.server.sound.SoundPlayer; +import io.github.thetrouper.sssbliss.server.util.Text; +import io.papermc.paper.event.entity.EntityMoveEvent; +import org.bukkit.Material; +import org.bukkit.Sound; +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.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerItemHeldEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; +import org.bukkit.inventory.ItemStack; + +public class TrollListener implements CustomListener { + Drag drag = new Drag(); + Stun stun = new Stun(); + Launch launch = new Launch(); + Drain drain = new Drain(); + Smite smite = new Smite(); + Lazer lazer = new Lazer(); + OrbitalStrike orbitalStrike = new OrbitalStrike(); + ShootFireball fireball = new ShootFireball(); + InstantHeal heal = new InstantHeal(); + MakeInvulnerable invul = new MakeInvulnerable(); + + @EventHandler + public void onHit(EntityDamageByEntityEvent e) { + if (e.getDamager() instanceof Player p) { + ItemStack i = p.getInventory().getItemInMainHand(); + if (!p.isOp()) return; + if (i == null) return; + if (!i.isSimilar(CustomItems.ADMIN_UTILITY)) return; + + stun.handleStun(p); + } + } + + @EventHandler + public void onSwap(PlayerSwapHandItemsEvent e) { + Player p = e.getPlayer(); + ItemStack m = p.getInventory().getItemInMainHand(); + ItemStack o = p.getInventory().getItemInOffHand(); + if (!p.isOp()) return; + + SoundPlayer swap = new SoundPlayer(p.getLocation(), Sound.BLOCK_BEACON_POWER_SELECT,0.5F,2F); + + if (m.isSimilar(CustomItems.ADMIN_UTILITY)) { + swap.playWithin(3); + e.setCancelled(true); + // If the main hand has item A, set offhand to air and main hand to item B + p.getInventory().setItemInOffHand(new ItemStack(Material.AIR)); + p.getInventory().setItemInMainHand(new ItemStack(CustomItems.ADMIN_UTILITY_LETHAL)); + p.sendMessage(Text.prefix("Set Phaser to kill")); + } else if (o.isSimilar(CustomItems.ADMIN_UTILITY)) { + swap.playWithin(3); + e.setCancelled(true); + // If the offhand has item A, set main hand to air and offhand to item B + p.getInventory().setItemInOffHand(new ItemStack(Material.AIR)); + p.getInventory().setItemInMainHand(new ItemStack(CustomItems.ADMIN_UTILITY_LETHAL)); + p.sendMessage(Text.prefix("Set Phaser to kill")); + } else if (m.isSimilar(CustomItems.ADMIN_UTILITY_LETHAL)) { + swap.playWithin(3); + e.setCancelled(true); + // If the main hand has item B, set offhand to air and main hand to item C + p.getInventory().setItemInOffHand(new ItemStack(Material.AIR)); + p.getInventory().setItemInMainHand(new ItemStack(CustomItems.ADMIN_UTILITY_HEAL)); + p.sendMessage(Text.prefix("Set Phaser to heal")); + } else if (o.isSimilar(CustomItems.ADMIN_UTILITY_LETHAL)) { + swap.playWithin(3); + e.setCancelled(true); + // If the offhand has item B, set main hand to air and offhand to item C + p.getInventory().setItemInOffHand(new ItemStack(Material.AIR)); + p.getInventory().setItemInMainHand(new ItemStack(CustomItems.ADMIN_UTILITY_HEAL)); + p.sendMessage(Text.prefix("Set Phaser to heal")); + } else if (m.isSimilar(CustomItems.ADMIN_UTILITY_HEAL)) { + swap.playWithin(3); + e.setCancelled(true); + // If the main hand has item C, set offhand to air and main hand to item A + p.getInventory().setItemInOffHand(new ItemStack(Material.AIR)); + p.getInventory().setItemInMainHand(new ItemStack(CustomItems.ADMIN_UTILITY)); + p.sendMessage(Text.prefix("Set Phaser to stun")); + } else if (o.isSimilar(CustomItems.ADMIN_UTILITY_HEAL)) { + swap.playWithin(3); + e.setCancelled(true); + // If the offhand has item C, set main hand to air and offhand to item A + p.getInventory().setItemInOffHand(new ItemStack(Material.AIR)); + p.getInventory().setItemInMainHand(new ItemStack(CustomItems.ADMIN_UTILITY)); + p.sendMessage(Text.prefix("Set Phaser to stun")); + } + } + + @EventHandler + public void onClickHeal(PlayerInteractEvent e) { + Player p = e.getPlayer(); + ItemStack i = e.getItem(); + Action a = e.getAction(); + if (!p.isOp()) return; + if (i == null) return; + if (!i.isSimilar(CustomItems.ADMIN_UTILITY_HEAL)) return; + + e.setCancelled(true); + + switch (a) { + case RIGHT_CLICK_AIR, RIGHT_CLICK_BLOCK -> { + if (!p.isSneaking()) { + heal.handleInstantHeal(p); + } else if (p.isSneaking()) { + invul.handleInvulnerable(p); + } + } + case LEFT_CLICK_AIR, LEFT_CLICK_BLOCK -> { + if (!p.isSneaking()) { + //fireball.handleFireball(p); + } else if (p.isSneaking()) { + //orbitalStrike.handleOrbitalStrike(p); + } + + } + } + } + + @EventHandler + public void onClickKill(PlayerInteractEvent e) { + Player p = e.getPlayer(); + ItemStack i = e.getItem(); + Action a = e.getAction(); + if (!p.isOp()) return; + if (i == null) return; + if (!i.isSimilar(CustomItems.ADMIN_UTILITY_LETHAL)) return; + + e.setCancelled(true); + + switch (a) { + case RIGHT_CLICK_AIR, RIGHT_CLICK_BLOCK -> { + if (!p.isSneaking()) { + lazer.handleLazer(p); + } else if (p.isSneaking()) { + smite.handleSmite(p); + } + } + case LEFT_CLICK_AIR, LEFT_CLICK_BLOCK -> { + if (!p.isSneaking()) { + fireball.handleFireball(p); + } else if (p.isSneaking()) { + orbitalStrike.handleOrbitalStrike(p); + } + + } + } + } + + @EventHandler + public void onClickStun(PlayerInteractEvent e) { + Player p = e.getPlayer(); + ItemStack i = e.getItem(); + Action a = e.getAction(); + if (!p.isOp()) return; + if (i == null) return; + if (!i.isSimilar(CustomItems.ADMIN_UTILITY)) return; + + e.setCancelled(true); + + switch (a) { + case RIGHT_CLICK_AIR, RIGHT_CLICK_BLOCK -> { + if (!p.isSneaking()) { + drag.handleDragPlayer(p); + } else if (p.isSneaking()) { + launch.handleLaunchPlayer(p); + } + } + case LEFT_CLICK_AIR, LEFT_CLICK_BLOCK -> { + if (!p.isSneaking()) { + stun.handleStun(p); + } else if (p.isSneaking()) { + drain.handleDrain(p); + } + + } + } + } + + @EventHandler + public void onMove(PlayerMoveEvent e) { + drag.handleMove(e); + } + @EventHandler + public void onEntity(EntityMoveEvent e) { + drag.handleEntityMove(e); + } + + @EventHandler + public void onScroll(PlayerItemHeldEvent e) { + if (!e.getPlayer().isOp()) return; + drag.handleScroll(e); + } + + + +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/events/UpgradeListener.java b/src/main/java/io/github/thetrouper/sssbliss/events/UpgradeListener.java index 00a9bc0..635def0 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/events/UpgradeListener.java +++ b/src/main/java/io/github/thetrouper/sssbliss/events/UpgradeListener.java @@ -1,20 +1,71 @@ package io.github.thetrouper.sssbliss.events; import io.github.itzispyder.pdk.events.CustomListener; +import io.github.itzispyder.pdk.utils.SchedulerUtils; +import io.github.itzispyder.pdk.utils.misc.Cooldown; +import io.github.thetrouper.sssbliss.SSSBliss; +import io.github.thetrouper.sssbliss.data.GemData; import io.github.thetrouper.sssbliss.server.crafting.UpgradeItem; +import io.github.thetrouper.sssbliss.server.sound.SoundPlayer; import io.github.thetrouper.sssbliss.server.util.GemUtils; +import io.github.thetrouper.sssbliss.server.util.PlayerUtils; +import net.kyori.adventure.text.Component; +import org.bukkit.Color; +import org.bukkit.FireworkEffect; +import org.bukkit.Sound; +import org.bukkit.entity.Firework; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.meta.FireworkMeta; public class UpgradeListener implements CustomListener { - @EventHandler - private void onUpgrade(PlayerInteractEvent e) { - if (!e.getAction().isRightClick() || !e.getItem().isSimilar(UpgradeItem.UPGRADE_ITEM)) return; - if (GemUtils.hasGem(e.getPlayer()).upgrade() == null) return; - Player p = e.getPlayer(); - p.getInventory().removeItem(UpgradeItem.UPGRADE_ITEM); + Cooldown upgradeCooldown = new Cooldown<>(); + @EventHandler(priority = EventPriority.HIGHEST) + private void onUpgrade(PlayerInteractEvent e) { + Player p = e.getPlayer(); + GemData has = GemUtils.hasGem(p); + + if (!e.getAction().isRightClick()) return; + if (e.getItem() == null) return; + if (!p.getInventory().getItemInMainHand().isSimilar(UpgradeItem.UPGRADE_ITEM)) return; + if (has == null) return; + if (has.upgrade() == null) return; + + if (upgradeCooldown.isOnCooldown(p)) { + e.getPlayer().sendMessage(Component.text(color(SSSBliss.mainConfig.plugin.prefix + "&cYour on cooldown! &7You can use it again in &e%s&7 seconds!".formatted( + (upgradeCooldown.getCooldown(p))/1000L) + ))); + return; + } + upgradeCooldown.setCooldown(p, 5000); + + PlayerUtils.subtractItems(p,UpgradeItem.UPGRADE_ITEM,1); + GemUtils.upgradeGem(p); + //p.sendMessage(Component.text(SSSBliss.mainConfig.plugin.prefix + "You have upgraded your gem!")); + + SoundPlayer upgrade = new SoundPlayer(p.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 10,0.6F); + upgrade.playWithin(3); + + Firework f = p.getWorld().spawn(p.getLocation(), Firework.class); + + // Configure the Firework's meta + FireworkMeta fm = f.getFireworkMeta(); + fm.addEffect( + FireworkEffect.builder() + .withColor(Color.BLUE) + .withColor(Color.AQUA) + .withColor(Color.TEAL) + .with(FireworkEffect.Type.BURST) + .withTrail() + .withFlicker() + .build()); + fm.setPower(1); + + f.setFireworkMeta(fm); + SchedulerUtils.later(1,f::detonate); } } diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/crafting/TradeItem.java b/src/main/java/io/github/thetrouper/sssbliss/server/crafting/TradeItem.java new file mode 100644 index 0000000..46662c9 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/crafting/TradeItem.java @@ -0,0 +1,47 @@ +package io.github.thetrouper.sssbliss.server.crafting; + +import io.github.itzispyder.pdk.Global; +import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; +import io.github.thetrouper.sssbliss.SSSBliss; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ShapedRecipe; + +public class TradeItem { + + public static final ItemStack TRADE_ITEM = ItemBuilder.create() + .material(Material.NAME_TAG) + .name(Global.instance.color("&eGem Trader")) + .lore(Global.instance.color("&7Right click to randomize your gem!")) + .enchant(Enchantment.LURE,1) + .flag(ItemFlag.HIDE_ENCHANTS) + .build(); + public static void addTradeRecipe() { + // Create a NamespacedKey for your recipe (replace "your_plugin_name" with your actual plugin name) + NamespacedKey key = new NamespacedKey(SSSBliss.getInstance(), "gem_trade_recipe"); + + // Create the recipe + ShapedRecipe recipe = new ShapedRecipe(key, TRADE_ITEM); + recipe.shape("ABC", "DEF", "GHI"); // Define the crafting grid + + // Define the ingredients + recipe.setIngredient('A', Material.NETHERITE_INGOT); + recipe.setIngredient('B', Material.DIAMOND_BLOCK); + recipe.setIngredient('C', Material.NETHERITE_INGOT); + + recipe.setIngredient('D', Material.DIAMOND_BLOCK); + recipe.setIngredient('E', Material.NETHER_STAR); + recipe.setIngredient('F', Material.DIAMOND_BLOCK); + + recipe.setIngredient('G', Material.NETHERITE_INGOT); + recipe.setIngredient('H', Material.DIAMOND_BLOCK); + recipe.setIngredient('I', Material.NETHERITE_INGOT); + // Repeat for other letters in the grid + + // Add the recipe to the server + SSSBliss.getInstance().getServer().addRecipe(recipe); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/crafting/UpgradeItem.java b/src/main/java/io/github/thetrouper/sssbliss/server/crafting/UpgradeItem.java index e20b9e6..4b40685 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/server/crafting/UpgradeItem.java +++ b/src/main/java/io/github/thetrouper/sssbliss/server/crafting/UpgradeItem.java @@ -21,7 +21,7 @@ public class UpgradeItem { .build(); public static void addUpgradeRecipe() { // Create a NamespacedKey for your recipe (replace "your_plugin_name" with your actual plugin name) - NamespacedKey key = new NamespacedKey(SSSBliss.getInstance(), "custom_crafting_recipe"); + NamespacedKey key = new NamespacedKey(SSSBliss.getInstance(), "gem_upgrade_recipe"); // Create the recipe ShapedRecipe recipe = new ShapedRecipe(key, UPGRADE_ITEM); diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/fun/CustomItems.java b/src/main/java/io/github/thetrouper/sssbliss/server/fun/CustomItems.java new file mode 100644 index 0000000..ff8cb9c --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/fun/CustomItems.java @@ -0,0 +1,204 @@ +package io.github.thetrouper.sssbliss.server.fun; + +import io.github.itzispyder.pdk.Global; +import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; +import io.github.thetrouper.sssbliss.server.util.Text; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFactory; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; + +public class CustomItems { + public static ItemStack ADMIN_UTILITY = ItemBuilder.create() + .material(Material.BLAZE_ROD) + .name(Global.instance.color("&4-&c&l[&b&nAdministrative&r &3&nUtility&c&l]&4-")) + .lore(Global.instance.color("&b▪ &3Right-Click:&7 Drag")) + .lore(Global.instance.color("&b▪ &3Sneak Right-Click:&7 Launch")) + .lore(Global.instance.color("&b▪ &3Left-Click:&7 Stun")) + .lore(Global.instance.color("&b▪ &3Sneak Left-Click:&7 Drain")) + .lore(Global.instance.color("&b▪ &3Swap Hands:&7 Switch Phaser")) + .lore(Global.instance.color(" &7from stun to kill")) + //.lore(Global.instance.color("&b▪ &3Sneak Right-Click:&7 Zap Player")) + //.lore(Global.instance.color("&b▪ &3Left-Click:&7 Fire Beam")) + //.lore(Global.instance.color("&b▪ &3Sneak Left-Click:&7 Ring of Fire")) + //.lore(Global.instance.color("&b▪ &3Swap-Hands:&7 Fireball")) + //.lore(Global.instance.color("&b▪ &3Sneak Swap-Hands:&7 Orbital Strike")) + .customModelData(1111) + .enchant(Enchantment.VANISHING_CURSE, 1) + .flag(ItemFlag.HIDE_ENCHANTS) + .build(); + + public static ItemStack ADMIN_UTILITY_LETHAL = ItemBuilder.create() + .material(Material.BLAZE_ROD) + .name(Global.instance.color("&3-&b&l[&c&nAdministrative&r &4&nUtility&b&l]&3-")) + .lore(Global.instance.color("&c▪ &4Right-Click:&7 Death Ray")) + .lore(Global.instance.color("&c▪ &4Sneak Right-Click:&7 Smite")) + .lore(Global.instance.color("&c▪ &4Left-Click:&7 Fireball")) + .lore(Global.instance.color("&c▪ &4Sneak Left-Click:&7 Orbital Strike")) + .lore(Global.instance.color("&c▪ &4Swap Hands:&7 Switch Phaser")) + .lore(Global.instance.color(" &7from kill to heal")) + //.lore(Global.instance.color("&b▪ &3Sneak Right-Click:&7 Zap Player")) + //.lore(Global.instance.color("&b▪ &3Left-Click:&7 Fire Beam")) + //.lore(Global.instance.color("&b▪ &3Sneak Left-Click:&7 Ring of Fire")) + //.lore(Global.instance.color("&b▪ &3Swap-Hands:&7 Fireball")) + //.lore(Global.instance.color("&b▪ &3Sneak Swap-Hands:&7 Orbital Strike")) + .customModelData(1111) + .enchant(Enchantment.VANISHING_CURSE, 1) + .flag(ItemFlag.HIDE_ENCHANTS) + .build(); + public static ItemStack ADMIN_UTILITY_HEAL = ItemBuilder.create() + .material(Material.BLAZE_ROD) + .name(Global.instance.color("&3-&b&l[&a&nAdministrative&r &2&nUtility&b&l]&3-")) + .lore(Global.instance.color("&a▪ &2Right-Click:&7 Heal")) + .lore(Global.instance.color("&a▪ &2Sneak Right-Click:&7 Invulnerability")) + .lore(Global.instance.color("&a▪ &2Left-Click:&7 Regen Zone")) + .lore(Global.instance.color("&a▪ &2Sneak Left-Click:&7 Force Field")) + .lore(Global.instance.color("&a▪ &2Swap Hands:&7 Switch Phaser")) + .lore(Global.instance.color(" &7from heal to stun")) + //.lore(Global.instance.color("&b▪ &3Sneak Right-Click:&7 Zap Player")) + //.lore(Global.instance.color("&b▪ &3Left-Click:&7 Fire Beam")) + //.lore(Global.instance.color("&b▪ &3Sneak Left-Click:&7 Ring of Fire")) + //.lore(Global.instance.color("&b▪ &3Swap-Hands:&7 Fireball")) + //.lore(Global.instance.color("&b▪ &3Sneak Swap-Hands:&7 Orbital Strike")) + .customModelData(1111) + .enchant(Enchantment.VANISHING_CURSE, 1) + .flag(ItemFlag.HIDE_ENCHANTS) + .build(); + + public abstract class ItemPresets { + + private static final ItemFactory factory = Bukkit.getItemFactory(); + + public static ItemStack SNAD = factory.createItemStack("sand{display:{Name:'{\"extra\":[{\"bold\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"white\",\"text\":\"Snad\"}],\"text\":\"\"}'}}"); + + public static ItemStack SNAD_COOKIE = factory.createItemStack("cookie{CustomModelData:1111,display:{Lore:['{\"extra\":[{\"bold\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"gray\",\"text\":\"mmMmmM Extra Crunchy!\"}],\"text\":\"\"}'],Name:'{\"extra\":[{\"bold\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"white\",\"text\":\"Snad Cookie\"}],\"text\":\"\"}'}}"); + + + public static ItemStack NETSKY_BLADE = ItemBuilder.create() + .material(Material.NETHERITE_SWORD) + .name(Text.color("&7//&d&l&oNET&5&l&oSKY&7//")) + .lore(Text.color("&7- &dLeft: &5Fire Spell")) + .lore(Text.color("&7- &dRight: &5Fireball")) + .enchant(Enchantment.FIRE_ASPECT, 1) + .build(); + public static ItemStack ADMIN_UTILITY = ItemBuilder.create() + .material(Material.BLAZE_ROD) + .name(Text.color("&4-&c&l[&b&nAdministrative &3&nUtility&c&l]&4-")) + .lore(Text.color("&b▪ &3Right-Click:&7 Drag Player")) + .lore(Text.color("&b▪ &3Sneak Right-Click:&7 Zap Player")) + .lore(Text.color("&b▪ &3Left-Click:&7 Fire Beam")) + .lore(Text.color("&b▪ &3Sneak Left-Click:&7 Ring of Fire")) + .lore(Text.color("&b▪ &3Swap-Hands:&7 Fireball")) + .lore(Text.color("&b▪ &3Sneak Swap-Hands:&7 Orbital Strike")) + .customModelData(1111) + .enchant(Enchantment.VANISHING_CURSE, 1) + .flag(ItemFlag.HIDE_ENCHANTS) + .build(); + public static ItemStack VOID_CHARM = ItemBuilder.create() + .material(Material.BLACK_STAINED_GLASS) + .name(Text.color("&0&l-&8&l[&7Void Charm&8&l]&0&l-")) + .lore(Text.color("&7▪ &4Right-Click:&7 Take Entity")) + .customModelData(1111) + .enchant(Enchantment.VANISHING_CURSE, 1) + .flag(ItemFlag.HIDE_ENCHANTS) + .build(); + public static ItemStack DEFENDER = ItemBuilder.create() + .material(Material.PRISMARINE_SHARD) + .name(Text.color("&1&l-&9&l[&bDefender&9&l]&1&l-")) + .lore(Text.color("&1▪ &9Right-Click:&7 Stun")) + .lore(Text.color("&1▪ &9Left-Click:&7 Shoot")) + .customModelData(1111) + .enchant(Enchantment.VANISHING_CURSE, 1) + .flag(ItemFlag.HIDE_ENCHANTS) + .build(); + public static ItemStack LASER_POINTER = ItemBuilder.create() + .material(Material.LIME_CANDLE) + .name(Text.color("&2&l-&a&l[&bLaser Pointer&a&l]&2&l-")) + .lore(Text.color("&2▪ &aRight-Click:&7 Full Beam")) + .lore(Text.color("&2▪ &aLeft-Click:&7 Select Block")) + .customModelData(1111) + .enchant(Enchantment.VANISHING_CURSE, 1) + .flag(ItemFlag.HIDE_ENCHANTS) + .build(); + public static ItemStack SHIELD_GEN = ItemBuilder.create() + .material(Material.BEACON) + .name(Text.color("&5&l-&d&l[&bShield Generator&d&l]&5&l-")) + .lore(Text.color("&1▪ &9/hat:&7 Personal Shield")) + .lore(Text.color("&1▪ &9Place:&7 Stationary Shield")) + .build(); + public static ItemStack SNOWCHINEGUN = ItemBuilder.create() + .material(Material.IRON_HOE) + .name(Text.color("&f&l&nSNOWCHINEGUN")) + .lore(Text.color("&b▪ &fRight-Click:&7 BRRRRTTTTT")) + .lore(Text.color("&b▪ &fLeft-Click:&7 Burst")) + .customModelData(1111) + .enchant(Enchantment.VANISHING_CURSE, 1) + .flag(ItemFlag.HIDE_ENCHANTS) + .build(); + public static ItemStack AK47 = ItemBuilder.create() + .material(Material.ECHO_SHARD) + .name(Text.color("&7&lAK&8-&647")) + .lore(Text.color("&6▪ &fRight-Click:&7 Full Auto")) + .lore(Text.color("&6▪ &fLeft-Click:&7 Single Shot")) + .customModelData(1111) + .enchant(Enchantment.VANISHING_CURSE, 1) + .flag(ItemFlag.HIDE_ENCHANTS) + .build(); + public static ItemStack SPLEEFER = ItemBuilder.create() + .material(Material.NETHERITE_SHOVEL) + .name(Text.color("&2&lSpleefer")) + .lore(Text.color("&7For use at /warp spleef")) + .enchant(Enchantment.DIG_SPEED, 5) + .unbreakable(true) + .flag(ItemFlag.HIDE_ENCHANTS) + .flag(ItemFlag.HIDE_UNBREAKABLE) + .build(); + public static ItemStack POTATOCANNON = ItemBuilder.create() + .material(Material.GOLDEN_HOE) + .name(Text.color("&6&lPotato Cannon")) + .lore(Text.color("&e▪ &fLeft-Click:&7 Launch Potatoes")) + .lore(Text.color("&e▪ &fRight-Click:&7 Load Potato (Max 6)")) + .unbreakable(true) + .enchant(Enchantment.DIG_SPEED, 5) + .flag(ItemFlag.HIDE_ENCHANTS) + .flag(ItemFlag.HIDE_UNBREAKABLE) + .build(); + public static ItemStack SPBRifle = ItemBuilder.create() + .material(Material.IRON_HORSE_ARMOR) + .name(Text.color("&f[SPB] &eRifle")) + .lore(Text.color("&e▪ &fRight-Click:&7 Shoot")) + .customModelData(1111) + .build(); + public static ItemStack PICKLER = ItemBuilder.create() + .material(Material.SEA_PICKLE) + .name(Text.color("&2&lPickler")) + .lore(Text.color("&2▪ &aRight-Click:&7 Pickle-ify Someone")) + .customModelData(1111) + .build(); + + public static ItemStack TAZER = ItemBuilder.create() + .material(Material.NETHERITE_AXE) + .name(Text.color("&7{&b&lTazer&7}")) + .unbreakable(true) + .enchant(Enchantment.LURE, 1) + .flag(ItemFlag.HIDE_ENCHANTS, ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_UNBREAKABLE) + .customModelData(1111) + .build(); + + public static ItemStack LAZER = ItemBuilder.create() + .material(Material.REDSTONE_TORCH) + .name("Lazer Pointer") + .lore(Text.color("&7- A funny gadget!")) + .customModelData(1111) + .build(); + + public static ItemStack BLANK = ItemBuilder.create() + .material(Material.LIGHT_GRAY_STAINED_GLASS_PANE) + .name(" ") + .build(); + + } + +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/heal/InstantHeal.java b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/heal/InstantHeal.java new file mode 100644 index 0000000..4f94fdb --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/heal/InstantHeal.java @@ -0,0 +1,27 @@ +package io.github.thetrouper.sssbliss.server.fun.utility.heal; + +import io.github.thetrouper.sssbliss.server.sound.SoundPlayer; +import io.github.thetrouper.sssbliss.server.util.DisplayUtils; +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; + +public class InstantHeal { + + public void handleInstantHeal(Player p) { + Entity targetEntity = p.getTargetEntity(119); + if (!(targetEntity instanceof LivingEntity target)) return; + target.registerAttribute(Attribute.GENERIC_MAX_HEALTH); + final double max = target.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue(); + target.setHealth(max); + SoundPlayer heal = new SoundPlayer(target.getLocation(),Sound.ENTITY_CAT_AMBIENT,0.8F,1.3F); + heal.playWithin(50); + heal.play(p); + DisplayUtils.helix(target.getLocation(),0.6,(helix)->{ + target.getWorld().spawnParticle(Particle.VILLAGER_HAPPY,helix,1,0,0,0,0); + },0.02,2); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/heal/MakeInvulnerable.java b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/heal/MakeInvulnerable.java new file mode 100644 index 0000000..0bc30a9 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/heal/MakeInvulnerable.java @@ -0,0 +1,53 @@ +package io.github.thetrouper.sssbliss.server.fun.utility.heal; + +import io.github.thetrouper.sssbliss.server.util.Text; +import org.bukkit.Bukkit; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +public class MakeInvulnerable { + + public static Set invul = new HashSet<>(); + + public void handleInvulnerable(Player p) { + Entity targetEntity = p.getTargetEntity(119); + + if (!(targetEntity instanceof LivingEntity target)) return; + + if (invul.contains(target.getUniqueId())) { + invul.remove(target.getUniqueId()); + if (target instanceof Player t) { + t.sendMessage(Text.prefix("You are no longer invulnerable!")); + } + return; + } + invul.add(target.getUniqueId()); + + if (target instanceof Player t) { + t.sendMessage(Text.prefix("You are now invulnerable!")); + } + } + + public static void updateInvul() { + for (UUID uuid : invul) { + Entity targetEntity = Bukkit.getEntity(uuid); + if (!(targetEntity instanceof LivingEntity target) || targetEntity.isDead() || (targetEntity instanceof Player p && !p.isOnline())) { + invul.remove(uuid); + return; + } + PotionEffect heal = new PotionEffect(PotionEffectType.HEAL,600,5,true,false,true); + PotionEffect res = new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,20,7,true,false,true); + PotionEffect fire = new PotionEffect(PotionEffectType.FIRE_RESISTANCE,20,0,true,false,true); + heal.apply(target); + res.apply(target); + fire.apply(target); + } + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/Lazer.java b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/Lazer.java new file mode 100644 index 0000000..4b5e672 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/Lazer.java @@ -0,0 +1,70 @@ +package io.github.thetrouper.sssbliss.server.fun.utility.kill; + +import io.github.itzispyder.pdk.utils.SchedulerUtils; +import io.github.itzispyder.pdk.utils.raytracers.CustomDisplayRaytracer; +import io.github.thetrouper.sssbliss.server.fun.CustomItems; +import io.github.thetrouper.sssbliss.server.sound.SoundPlayer; +import io.github.thetrouper.sssbliss.server.util.Text; +import org.bukkit.*; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +import java.util.*; +import java.util.function.BooleanSupplier; + +public class Lazer { + + public static Map isLazing = new HashMap<>(); + + public void handleLazer(Player p) { + UUID u = p.getUniqueId(); + if (!isLazing.getOrDefault(u, false)) { + isLazing.put(u, true); + p.sendMessage(Text.prefix("IM FIRIN MAH LAZOR!")); + } else if (isLazing.get(u)) { + isLazing.put(u, false); + p.sendMessage(Text.prefix("Lazer Deactivated.")); + } + + BooleanSupplier lazing = () -> isLazing.getOrDefault(u, false) && p.getInventory().getItemInMainHand().equals(CustomItems.ADMIN_UTILITY_LETHAL); + + SchedulerUtils.whileLoop(1, lazing, (loop) -> { + Location start = p.getEyeLocation(); + Vector rot = p.getLocation().getDirection().normalize(); + + CustomDisplayRaytracer.trace(start, rot, 60, 0.5, (point) -> { + World w = point.getWorld(); + if (w == null) return false; + List targets = new ArrayList<>(w.getNearbyLivingEntities(point.getLoc(), 0.3,0.3,0.3, entity -> { + return entity != p; + })); + + for (LivingEntity living : targets) { + if (living.getHealth() < 1) { + living.setHealth(0); + continue; + } + living.setHealth(living.getHealth() - 1); + } + Particle.DustOptions dust = new Particle.DustOptions(Color.fromRGB(0xFF00FF), 0.8F); + w.spawnParticle(Particle.REDSTONE, point.getLoc(), 1,0,0,0,0, dust); + + SoundPlayer hiss = new SoundPlayer(point.getLoc(),Sound.BLOCK_FIRE_EXTINGUISH,0.3F,1F); + SoundPlayer damage = new SoundPlayer(point.getLoc(),Sound.BLOCK_SCULK_BREAK,0.3F,1F); + + + if (!point.getBlock().isPassable()) { + if (loop % 4 == 0) hiss.playWithin(30); + w.spawnParticle(Particle.LAVA, point.getLoc(), 1,0,0,0,0); + } + if (!targets.isEmpty()) { + if (loop % 4 == 0) damage.playWithin(30); + w.spawnParticle(Particle.LAVA, point.getLoc(), 1,0,0,0,0); + } + return !targets.isEmpty() || !point.getBlock().isPassable(); + }); + }); + + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/OrbitalStrike.java b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/OrbitalStrike.java new file mode 100644 index 0000000..ee2371d --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/OrbitalStrike.java @@ -0,0 +1,50 @@ +package io.github.thetrouper.sssbliss.server.fun.utility.kill; + +import io.github.itzispyder.pdk.utils.SchedulerUtils; +import io.github.itzispyder.pdk.utils.misc.Randomizer; +import io.github.itzispyder.pdk.utils.raytracers.BlockDisplayRaytracer; +import io.github.thetrouper.sssbliss.SSSBliss; +import io.github.thetrouper.sssbliss.server.sound.SoundPlayer; +import io.github.thetrouper.sssbliss.server.util.DisplayUtils; +import org.bukkit.*; +import org.bukkit.entity.Player; + +public class OrbitalStrike { + + public void handleOrbitalStrike(Player p) { + Location target = p.getTargetBlock(null,119).getLocation(); + SoundPlayer warning = new SoundPlayer(target,Sound.BLOCK_BEACON_POWER_SELECT, 100,0.5F); + warning.playWithin(100); + int y = (int) Math.round(target.y()); + Randomizer rand = new Randomizer(); + + Bukkit.getScheduler().runTaskAsynchronously(SSSBliss.getInstance(),()->{ + try { + Location top = target.clone(); + top.setY(256); + SchedulerUtils.later(0, () -> { + BlockDisplayRaytracer.trace(Material.REDSTONE_BLOCK,target,top,0.3D,60L); + BlockDisplayRaytracer.trace(Material.RED_STAINED_GLASS,target,top,0.6D,60L); + BlockDisplayRaytracer.trace(Material.RED_STAINED_GLASS,target,top,0.8D,60L); + for (int j = 320; j > y; j--) { + Location ring = target.clone(); + ring.setY(j); + //ring.getWorld().spawnParticle(Particle.REDSTONE, ring, 1, 0, 0, 0, 0, dust); + if (j % 3 != 0) continue; + DisplayUtils.ring(ring, 3, Color.fromRGB(0xFF0000), 3); + } + }); + Thread.sleep(3000); + for (int i = y + 10; i > -62; i--) { + target.setY(i); + SchedulerUtils.later(0,()->{ + target.createExplosion(rand.getRandomFloat(7,9)); + }); + Thread.sleep(50); + } + } catch (InterruptedException ignored) { + + } + }); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/ShootFireball.java b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/ShootFireball.java new file mode 100644 index 0000000..d594db8 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/ShootFireball.java @@ -0,0 +1,17 @@ +package io.github.thetrouper.sssbliss.server.fun.utility.kill; + +import org.bukkit.Location; +import org.bukkit.entity.Fireball; +import org.bukkit.entity.Player; + +public class ShootFireball { + + public void handleFireball(Player p) { + Location eye = p.getEyeLocation(); + Fireball shoot = eye.getWorld().spawn(eye,Fireball.class,(fireball)->{ + }); + shoot.setVelocity(eye.getDirection().multiply(0.5)); + shoot.setIsIncendiary(false); + shoot.setYield(7); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/Smite.java b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/Smite.java new file mode 100644 index 0000000..24ffc98 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/kill/Smite.java @@ -0,0 +1,18 @@ +package io.github.thetrouper.sssbliss.server.fun.utility.kill; + +import io.github.thetrouper.sssbliss.server.util.Text; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +public class Smite { + + public void handleSmite(Player p) { + Entity smite = p.getTargetEntity(119); + if (smite instanceof Player v) { + v.sendMessage(Text.color("&b&lThou has been smitten!")); + v.getWorld().strikeLightning(v.getLocation()); + return; + } + p.getWorld().strikeLightning(p.getTargetBlock(null,119).getLocation()); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Drag.java b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Drag.java new file mode 100644 index 0000000..20ddab6 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Drag.java @@ -0,0 +1,197 @@ +package io.github.thetrouper.sssbliss.server.fun.utility.stun; + +import io.github.itzispyder.pdk.Global; +import io.github.itzispyder.pdk.utils.raytracers.CustomDisplayRaytracer; +import io.github.thetrouper.sssbliss.server.fun.CustomItems; +import io.github.thetrouper.sssbliss.server.sound.SoundPlayer; +import io.github.thetrouper.sssbliss.server.util.DisplayUtils; +import io.github.thetrouper.sssbliss.server.util.Text; +import io.papermc.paper.event.entity.EntityMoveEvent; +import net.kyori.adventure.text.Component; +import org.bukkit.*; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerItemHeldEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.util.*; + +public class Drag { + + + + public static Map dragMap = new HashMap<>(); + public static Map dragLength = new HashMap<>(); + + public void handleScroll(PlayerItemHeldEvent e) { + Player p = e.getPlayer(); + UUID id = p.getUniqueId(); + + if (!dragMap.containsKey(id)) return; + + int prev = e.getPreviousSlot(); + int curr = e.getNewSlot(); + + ItemStack pr = p.getInventory().getItem(prev); + ItemStack cu = p.getInventory().getItem(curr); + + if (p.isSneaking()) return; + if (pr == null) return; + if (cu != null) return; + if (!pr.equals(CustomItems.ADMIN_UTILITY) && !cu.isEmpty()) return; + //p.sendMessage(cu + " " + pr); + e.setCancelled(true); + + if (!dragLength.containsKey(e.getPlayer().getUniqueId())) { + dragLength.put(e.getPlayer().getUniqueId(),5D); + } + + SoundPlayer click = new SoundPlayer(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_HAT, 1, 0.8F); + SoundPlayer clickIn = new SoundPlayer(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_HAT, 1, 1.3F); + SoundPlayer clickOut = new SoundPlayer(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_HAT, 1, 1.7F); + + + if (curr < prev) { + dragLength.put(id,dragLength.get(id) + 0.7); + clickOut.playWithin(2); + } else if (curr > prev) { + if (dragLength.get(id) < 1.4) { + dragLength.put(id,2D); + click.playWithin(2); + return; + } + clickIn.playWithin(2); + dragLength.put(id,dragLength.get(id) - 0.7); + + } + } + + public void handleDragPlayer(Player p) { + Location loc = p.getEyeLocation(); + Vector rot = loc.getDirection().normalize(); + // p.sendMessage("Attempting Drag"); + if (!dragMap.containsKey(p.getUniqueId())) { + CustomDisplayRaytracer.trace(p.getLocation(),rot,30,1, point -> { + //p.sendMessage("Tracing"); + World w = point.getWorld(); + List targets = new ArrayList<>(w.getNearbyEntities(point.getLoc(), 1,1,1, entity -> { + return entity instanceof LivingEntity living && !living.isDead() && !living.equals(p); + })); + if (targets.isEmpty()) return false; + LivingEntity target = ((LivingEntity) targets.get(0)); + // p.sendMessage("Found a target!"); + /*if (target.getName().equals("obvWolf")) { + p.sendMessage(Text.prefix("§cYou are not allowed to drag: §a" + target.getName())); + return true; + }*/ + + SoundPlayer drag = new SoundPlayer(target.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1, 0.5F); + drag.playWithin(30); + + DisplayUtils.helix(target.getLocation(),0.6,(helix)->{ + w.spawnParticle(Particle.SOUL_FIRE_FLAME,helix,1,0,0,0,0); + },0.02,2); + + dragLength.put(p.getPlayer().getUniqueId(), p.getLocation().distance(target.getLocation())); + dragPlayer(p,target); + + return true; + }); + } else { + undrag(p, Bukkit.getEntity(dragMap.get(p.getUniqueId()))); + } + + } + public void undrag(Player d, Entity v) { + if (v instanceof Player pv) { + undragPlayer(d,pv); + return; + } + undragEntity(d,v); + } + + public void undragPlayer(Player d, Player v) { + v.setAllowFlight(false); + v.setGlowing(false); + v.sendMessage(Text.prefix("You are no longer being dragged by:§e " + d.getName())); + d.sendMessage(Text.prefix("You are no longer dragging:§e " + v.getName())); + dragMap.remove(d.getUniqueId()); + } + + public void undragEntity(Player d, Entity v) { + Entity e = Bukkit.getEntity(v.getUniqueId()); + if (e == null || e.isDead()) { + dragMap.remove(d.getUniqueId()); + d.sendMessage(Text.prefix("You are no longer dragging:§e the entity")); + return; + } + + e.setGlowing(false); + d.sendMessage(Text.prefix("You are no longer dragging:§e " + v.getName())); + dragMap.remove(d.getUniqueId()); + } + + public void dragPlayer(Player d, LivingEntity v) { + if (v instanceof Player pv) { + pv.setAllowFlight(true); + pv.sendMessage(Text.prefix("You are now being dragged by:§e " + d.getName())); + } + v.setGlowing(true); + d.sendMessage(Text.prefix("You are now dragging:§e " + v.getName())); + dragMap.put(d.getUniqueId(), v.getUniqueId()); + } + + public void handleEntityMove(EntityMoveEvent e) { + if (!dragMap.containsValue(e.getEntity().getUniqueId())) return; + updateDrags(); + } + + public void handleMove(PlayerMoveEvent e) { + if (!dragMap.containsValue(e.getPlayer().getUniqueId()) && !dragMap.containsKey(e.getPlayer().getUniqueId())) return; + updateDrags(); + } + + public void updateDrags() { + dragMap.forEach((dragID, victimID) -> { + Player dragger = Bukkit.getPlayer(dragID); + Entity victimEntity = Bukkit.getEntity(victimID); + if (victimEntity == null || dragger == null) return; + if (!dragger.isOnline()) { + undrag(dragger,victimEntity); + return; + } + if (victimEntity instanceof Player victim && !victim.isOnline()) { + undrag(dragger,victimEntity); + return; + } + if (!dragLength.containsKey(dragID)) { + dragLength.put(dragID, victimEntity.getLocation().distance(dragger.getLocation())); + } + + double leng = dragLength.get(dragID); + + Location start = dragger.getEyeLocation(); + Vector rot = dragger.getLocation().getDirection().normalize(); + CustomDisplayRaytracer.Point destination = CustomDisplayRaytracer.trace(start, rot, leng, 1, point -> { + return false; + }); + Location to = destination.getLoc(); + to.setYaw(victimEntity.getYaw()); + to.setPitch(victimEntity.getPitch()); + to.setY(to.getY() - 1); + victimEntity.teleport(to); + + DecimalFormat df = new DecimalFormat("###.##"); + df.setRoundingMode(RoundingMode.FLOOR); + String length = df.format(leng); + if (leng > 30) length = "&c" + length; + + dragger.sendActionBar(Component.text(Global.instance.color("&aYou &f⇄ &b" + victimEntity.getName() + "&f | &a" + length))); + }); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Drain.java b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Drain.java new file mode 100644 index 0000000..b3e7f24 --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Drain.java @@ -0,0 +1,53 @@ +package io.github.thetrouper.sssbliss.server.fun.utility.stun; + +import io.github.itzispyder.pdk.utils.SchedulerUtils; +import io.github.itzispyder.pdk.utils.misc.Randomizer; +import io.github.itzispyder.pdk.utils.raytracers.CustomDisplayRaytracer; +import io.github.thetrouper.sssbliss.server.sound.SoundPlayer; +import io.github.thetrouper.sssbliss.server.util.DisplayUtils; +import org.bukkit.*; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; + +public class Drain { + + public void handleDrain(Player p) { + Location start = p.getEyeLocation(); + Vector rot = p.getLocation().getDirection().normalize(); + SoundPlayer drain = new SoundPlayer(start, Sound.BLOCK_BREWING_STAND_BREW, 0.3F, 0.9F); + drain.playWithin(20); + CustomDisplayRaytracer.trace(start, rot, 60, 0.5, (point) -> { + World w = point.getWorld(); + if (w == null) return false; + List targets = new ArrayList<>(w.getNearbyLivingEntities(point.getLoc(), 0.5,0.5,0.5, entity -> { + return entity != p; + })); + + for (LivingEntity living : targets) { + double health = living.getHealth(); + if (living instanceof Player target) { + int hunger = target.getFoodLevel(); + SchedulerUtils.loop(2,hunger,(rate)->{ + target.setFoodLevel(target.getFoodLevel()-1); + }); + } + int intValue = (int) Math.round(health); + SchedulerUtils.loop(2,intValue-1,rate->{ + Randomizer rand = new Randomizer(); + SoundPlayer sip = new SoundPlayer(start, Sound.ENTITY_GENERIC_DRINK, 0.3F, rand.getRandomFloat(0.7F,1.5F)); + sip.playWithin(20); + living.setHealth(living.getHealth()-1); + DisplayUtils.ring(living.getLocation().clone().add(0,((health-1D)/10)-((rate/10D)),0),0.5,Color.RED,1); + }); + } + + Particle.DustOptions dust = new Particle.DustOptions(Color.RED, 0.5F); + w.spawnParticle(Particle.REDSTONE, point.getLoc(), 1,0,0,0,0, dust); + return !targets.isEmpty(); + }); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Launch.java b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Launch.java new file mode 100644 index 0000000..52a2e3c --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Launch.java @@ -0,0 +1,53 @@ +package io.github.thetrouper.sssbliss.server.fun.utility.stun; + +import io.github.itzispyder.pdk.utils.raytracers.CustomDisplayRaytracer; +import io.github.thetrouper.sssbliss.server.sound.SoundPlayer; +import org.bukkit.*; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; + +public class Launch { + Drag drag = new Drag(); + + public void dropLaunch(Player thrower, LivingEntity victim) { + if (Drag.dragMap.containsKey(thrower.getUniqueId())) { + drag.undrag(thrower,victim); + } + Location victimLocation = victim.getLocation(); + Location throwerLocation = thrower.getLocation(); + + Vector launchDirection = victimLocation.toVector().subtract(throwerLocation.toVector()).normalize(); + launchDirection.add(new Vector(0,0.1,0)); + + Vector launchVector = launchDirection.multiply(2); + victim.setVelocity(launchVector); + //victim.sendMessage(Text.prefix( "&a" + thrower.getName() + "&7 has launched you!")); + } + + public void handleLaunchPlayer(Player p) { + SoundPlayer zap = new SoundPlayer(p.getLocation(), Sound.ENTITY_PLAYER_ATTACK_SWEEP, 0.5F, 0.1F); + zap.playWithin(20); + CustomDisplayRaytracer.trace(p.getEyeLocation(),p.getEyeLocation().getDirection().normalize(),30D,0.5,point -> { + World w = point.getWorld(); + if (w == null) return false; + List targets = new ArrayList<>(w.getNearbyLivingEntities(point.getLoc(), 1,1,1, entity -> { + return !entity.getName().equals(p.getName()); + })); + int targs = 0; + for (LivingEntity target : targets) { + dropLaunch(p,target); + targs++; + } + + Particle.DustOptions dust = new Particle.DustOptions(Color.WHITE, 2); + w.spawnParticle(Particle.SWEEP_ATTACK, point.getLoc(), 5, 0.2,0.2,0.2, 0); + w.spawnParticle(Particle.REDSTONE, point.getLoc(), 5,0.25,0.25,0.25,0.25, dust); + + return targs > 0; + }); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Stun.java b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Stun.java new file mode 100644 index 0000000..665d3ea --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/fun/utility/stun/Stun.java @@ -0,0 +1,68 @@ +package io.github.thetrouper.sssbliss.server.fun.utility.stun; + +import io.github.itzispyder.pdk.utils.SchedulerUtils; +import io.github.itzispyder.pdk.utils.raytracers.CustomDisplayRaytracer; +import io.github.thetrouper.sssbliss.server.sound.SoundPlayer; +import org.bukkit.*; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; + +public class Stun { + + public static final int DEFAULT_NO_DAMAGE_TICKS = 9; + public static final int DEFAULT_MAX_NO_DAMAGE_TICKS = 10; + public static final int NO_DAMAGE_TICKS = 1; + public static final int MAX_NO_DAMAGE_TICKS = 2; + + public void handleStun(Player p) { + Location start = p.getEyeLocation(); + Vector rot = p.getLocation().getDirection().normalize(); + SoundPlayer zap = new SoundPlayer(start, Sound.ENTITY_BEE_HURT, 0.3F, 1); + zap.playWithin(20); + CustomDisplayRaytracer.trace(start, rot, 60, 0.5, (point) -> { + World w = point.getWorld(); + if (w == null) return false; + List targets = new ArrayList<>(w.getNearbyLivingEntities(point.getLoc(), 0.5,0.5,0.5, entity -> { + return entity != p; + })); + + for (LivingEntity living : targets) { + + double health = living.getHealth(); + + living.registerAttribute(Attribute.GENERIC_KNOCKBACK_RESISTANCE); + //living.getAttribute(Attribute.GENERIC_KNOCKBACK_RESISTANCE).setBaseValue(0.99D); + + living.getScoreboardTags().remove("unstun"); + SchedulerUtils.loop(1,60,(loop)->{ + if (loop >= 59 || living.getScoreboardTags().contains("unstun")) { + //living.getAttribute(Attribute.GENERIC_KNOCKBACK_RESISTANCE).setBaseValue(0D); + living.setNoDamageTicks(DEFAULT_NO_DAMAGE_TICKS); + living.setMaximumNoDamageTicks(DEFAULT_MAX_NO_DAMAGE_TICKS); + return; + } + living.addPotionEffect(new PotionEffect(PotionEffectType.SLOW,2,30,true,false, false)); + living.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_DIGGING,2,30,true,false, false)); + living.addPotionEffect(new PotionEffect(PotionEffectType.JUMP,2,128,true,false, false)); + + living.damage(1); + living.setHealth(health); + living.setNoDamageTicks(NO_DAMAGE_TICKS); + living.setMaximumNoDamageTicks(MAX_NO_DAMAGE_TICKS); + }); + } + + Particle.DustOptions dust = new Particle.DustOptions(Color.AQUA, 1); + w.spawnParticle(Particle.END_ROD, point.getLoc(), 1, 0,0,0, 0); + w.spawnParticle(Particle.REDSTONE, point.getLoc(), 1,0,0,0,0, dust); + return !targets.isEmpty(); + }); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/functions/GemPassiveEffects.java b/src/main/java/io/github/thetrouper/sssbliss/server/functions/GemPassiveEffects.java index 714596b..e7e810d 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/server/functions/GemPassiveEffects.java +++ b/src/main/java/io/github/thetrouper/sssbliss/server/functions/GemPassiveEffects.java @@ -12,6 +12,7 @@ public class GemPassiveEffects { ServerUtils.forEachPlayer(GemPassiveEffects::effectPlayer); } public static void effectPlayer(Player p) { + if (!GemUtils.verifyGem(p)) return; GemData has = GemUtils.hasGem(p); if (has == null) return; if (has.passive().isEmpty()) return; diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/functions/GemUses.java b/src/main/java/io/github/thetrouper/sssbliss/server/functions/GemUses.java index 0d60ff6..f6663d8 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/server/functions/GemUses.java +++ b/src/main/java/io/github/thetrouper/sssbliss/server/functions/GemUses.java @@ -2,7 +2,6 @@ package io.github.thetrouper.sssbliss.server.functions; import io.github.itzispyder.pdk.utils.SchedulerUtils; import io.github.itzispyder.pdk.utils.misc.SoundPlayer; -import io.github.itzispyder.pdk.utils.raytracers.CustomDisplayRaytracer; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.entity.Trident; diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/functions/GenFunctions.java b/src/main/java/io/github/thetrouper/sssbliss/server/functions/GenFunctions.java new file mode 100644 index 0000000..c34cbea --- /dev/null +++ b/src/main/java/io/github/thetrouper/sssbliss/server/functions/GenFunctions.java @@ -0,0 +1,21 @@ +package io.github.thetrouper.sssbliss.server.functions; + +import io.github.thetrouper.sssbliss.SSSBliss; +import io.github.thetrouper.sssbliss.data.PlacedGen; + +import java.util.function.Consumer; + +public class GenFunctions { + + public static void tickGens() { + accept(GenFunctions::genAction); + } + + public static void accept(Consumer action) { + SSSBliss.storage.gens.forEach(action); + } + + public static void genAction(PlacedGen gen) { + gen.drop(); + } +} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/util/FileUtils.java b/src/main/java/io/github/thetrouper/sssbliss/server/util/FileUtils.java index a03a02a..03b9d94 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/server/util/FileUtils.java +++ b/src/main/java/io/github/thetrouper/sssbliss/server/util/FileUtils.java @@ -1,12 +1,8 @@ package io.github.thetrouper.sssbliss.server.util; import io.github.thetrouper.sssbliss.SSSBliss; -import org.bukkit.inventory.ItemStack; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; -import java.io.IOException; public class FileUtils { public static boolean folderExists(String folderName) { File folder = new File(SSSBliss.getInstance().getDataFolder(), folderName); @@ -18,78 +14,6 @@ public class FileUtils { folder.mkdirs(); } } - public static String createNBTLog(String contents) { - ServerUtils.sendDebugMessage("FileUtils: Creating NBT log"); - String fileName = "nbt_log-" + Randomizer.generateID(); - File dataFolder = SSSBliss.getInstance().getDataFolder(); - File loggedNBTFolder = new File(dataFolder,"LoggedNBT"); - if (!loggedNBTFolder.exists()) { - loggedNBTFolder.mkdirs(); - } - - File file = new File(loggedNBTFolder, fileName + ".txt"); - try { - if (!file.exists()) { - file.createNewFile(); - } - - BufferedWriter writer = new BufferedWriter(new FileWriter(file, true)); - writer.append(contents); - writer.close(); - - } catch (IOException e) { - e.printStackTrace(); - } - return fileName; - } - - public static String createNBTLog(ItemStack i) { - ServerUtils.sendDebugMessage("FileUtils: Creating NBT log"); - - String item = i.getType().name().toLowerCase() + i.getItemMeta().getAsString(); - - String fileName = "nbt_log-" + Randomizer.generateID(); - - File dataFolder = SSSBliss.getInstance().getDataFolder(); - - File loggedNBTFolder = new File(dataFolder,"LoggedNBT"); - if (!loggedNBTFolder.exists()) { - loggedNBTFolder.mkdirs(); - } - - File file = new File(loggedNBTFolder, fileName + ".txt"); - try { - if (!file.exists()) { - file.createNewFile(); - } - - BufferedWriter writer = new BufferedWriter(new FileWriter(file, true)); - writer.append(item); - writer.close(); - - } catch (IOException e) { - e.printStackTrace(); - } - return fileName; - } - - public static String createCommandLog(String command) { - String fileName = "command_log-" + Randomizer.generateID(); - File file = new File(SSSBliss.getInstance().getDataFolder() + "/LoggedCommands/" + fileName + ".txt"); - try { - if (!file.exists()) { - file.createNewFile(); - } - - BufferedWriter writer = new BufferedWriter(new FileWriter(file, true)); - writer.append(command); - writer.close(); - - } catch (IOException e) { - e.printStackTrace(); - } - return fileName; - } } diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/util/GemUtils.java b/src/main/java/io/github/thetrouper/sssbliss/server/util/GemUtils.java index 8fdd9f2..a0be88f 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/server/util/GemUtils.java +++ b/src/main/java/io/github/thetrouper/sssbliss/server/util/GemUtils.java @@ -1,7 +1,12 @@ package io.github.thetrouper.sssbliss.server.util; +import io.github.itzispyder.pdk.utils.misc.Randomizer; +import io.github.itzispyder.pdk.utils.misc.SoundPlayer; +import io.github.thetrouper.sssbliss.SSSBliss; import io.github.thetrouper.sssbliss.data.GemData; import io.github.thetrouper.sssbliss.data.Gems.Gems; +import net.kyori.adventure.text.Component; +import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -9,14 +14,26 @@ import org.bukkit.inventory.ItemStack; public class GemUtils { public static GemData hasGem(Player p) { + GemData off = isGem(p.getInventory().getItemInOffHand(),true); + if (off != null) return off; + for (ItemStack i : p.getInventory().getContents()) { + if (i == null) return null; + for (GemData gem : Gems.gems) { + if (i.hasItemMeta() && i.getItemMeta().hasCustomModelData() && i.getItemMeta().getCustomModelData() == gem.dataID()) { + return gem; + } + } + } + return null; + } + public static GemData isGem(ItemStack i, boolean retern) { for (GemData gem : Gems.gems) { - if (p.getInventory().getItemInOffHand().hasItemMeta() && p.getInventory().getItemInOffHand().getItemMeta().hasCustomModelData() && p.getInventory().getItemInOffHand().getItemMeta().getCustomModelData() == gem.dataID()) { + if (i.isSimilar(gem.item())) { return gem; } } return null; } - public static boolean isGem(ItemStack i) { for (GemData gem : Gems.gems) { if (i.isSimilar(gem.item())) { @@ -34,4 +51,54 @@ public class GemUtils { } return false; } + + public static void upgradeGem(Player p) { + GemData upgrade = GemUtils.hasGem(p).upgrade(); + //p.sendMessage("Detected your gem " + upgrade); + if (upgrade != null) { + p.sendMessage(Component.text(SSSBliss.mainConfig.plugin.prefix + "Your gem has been upgraded")); + p.getInventory().setItemInOffHand(upgrade.item()); + } else { + p.sendMessage(Component.text(SSSBliss.mainConfig.plugin.prefix + "Your gem is already upgraded")); + } + } + + public static void downgradeGem(Player p) { + GemData downgrade = GemUtils.hasGem(p).downgrade(); + //p.sendMessage("Detected your gem " + downgrade); + if (downgrade != null) { + p.sendMessage(Component.text(SSSBliss.mainConfig.plugin.prefix + "Your gem has been downgraded")); + p.getInventory().setItemInOffHand(downgrade.item()); + } else { + p.sendMessage(Component.text(SSSBliss.mainConfig.plugin.prefix + "Your gem is already downgraded")); + } + } + + public static void randomGem(Player p) { + io.github.itzispyder.pdk.utils.misc.Randomizer random = new Randomizer(); + GemData starter = random.getRandomElement(Gems.starts); + + p.getInventory().setItemInOffHand(starter.item()); + } + + public static boolean verifyGem(Player p) { + int gems = 0; + for (ItemStack i : p.getInventory().getContents()) { + if (i == null) continue; + boolean isGem = isGem(i); + if (!isGem) continue; + gems++; + if (gems > 1) { + p.getInventory().removeItemAnySlot(i); + //p.getWorld().dropItem(p.getLocation(),i); + SoundPlayer dropSound = new SoundPlayer(p.getLocation(), Sound.ENTITY_ITEM_FRAME_REMOVE_ITEM,1000,1); + dropSound.playWithin(60); + } + } + if (gems > 1) { + p.sendMessage(Text.prefix("You can only use 1 gem at a time. Your extra gem has been deleted.")); + return false; + } + return true; + } } diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/util/PlayerUtils.java b/src/main/java/io/github/thetrouper/sssbliss/server/util/PlayerUtils.java index 9ab017f..0d45e12 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/server/util/PlayerUtils.java +++ b/src/main/java/io/github/thetrouper/sssbliss/server/util/PlayerUtils.java @@ -14,7 +14,7 @@ public class PlayerUtils { * @return {@code true} if the specified amount of items was successfully removed, * {@code false} if the player does not have enough items. */ - public static boolean removeItems(Player player, ItemStack item, int amount) { + public static boolean subtractItems(Player player, ItemStack item, int amount) { Inventory inventory = player.getInventory(); int totalAmountToRemove = amount; diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/util/Randomizer.java b/src/main/java/io/github/thetrouper/sssbliss/server/util/Randomizer.java deleted file mode 100644 index 4833819..0000000 --- a/src/main/java/io/github/thetrouper/sssbliss/server/util/Randomizer.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.github.thetrouper.sssbliss.server.util; - -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Set; - -/** - * Randomize items from a list - * @param list of? - */ -public class Randomizer { - public static long generateID() { - Date now = new Date(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS"); - String formattedDate = dateFormat.format(now); - long id = Long.parseLong(formattedDate); - - return id; - } - - private final List array; - - /** - * From array list - * @param array list - */ - public Randomizer(List array) { - this.array = array; - } - - /** - * From set - * @param array set - */ - public Randomizer(Set array) { - this.array = new ArrayList<>(array); - } - - /** - * From array - * @param array array - */ - public Randomizer(T[] array) { - this.array = List.of(array); - } - - /** - * Pick random from the array - * @return random of list of? - */ - public T pickRand() { - return array.get(rand(array.size() - 1)); - } - - /** - * Generates a random integer from 1 to (max) - * @param max max value - * @return random - */ - public static int rand(int max) { - if (max <= 0) throw new IllegalArgumentException("max cannot be less than 1!"); - return (int) Math.ceil(Math.random() * max); - } - - /** - * Generates a random integer from (min) to (max) - * @param min min value - * @param max max value - * @return random - */ - public static int rand(int min, int max) { - if (max <= 0 || min <= 0) throw new IllegalArgumentException("max or min cannot be less than 1!"); - if (max <= min) throw new IllegalArgumentException("max cannot be less than or equal to min!"); - return min + (int) Math.floor(Math.random() * (max - min + 1)); - } -} diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/util/ServerUtils.java b/src/main/java/io/github/thetrouper/sssbliss/server/util/ServerUtils.java index 3ee8571..c683398 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/server/util/ServerUtils.java +++ b/src/main/java/io/github/thetrouper/sssbliss/server/util/ServerUtils.java @@ -102,4 +102,5 @@ public class ServerUtils { public static String[] unVanishedPlayers() { return io.github.itzispyder.pdk.utils.ServerUtils.players(ServerUtils::isVanished).stream().map(Player::getName).toArray(String[]::new); } + } diff --git a/src/main/java/io/github/thetrouper/sssbliss/server/util/Text.java b/src/main/java/io/github/thetrouper/sssbliss/server/util/Text.java index 4da3dd6..85de43a 100644 --- a/src/main/java/io/github/thetrouper/sssbliss/server/util/Text.java +++ b/src/main/java/io/github/thetrouper/sssbliss/server/util/Text.java @@ -3,9 +3,6 @@ package io.github.thetrouper.sssbliss.server.util; import io.github.thetrouper.sssbliss.SSSBliss; -import java.util.Map; -import java.util.regex.PatternSyntaxException; - public class Text { public static final char SECTION_SYMBOL = (char)167; @@ -16,6 +13,11 @@ public class Text { String prefix = SSSBliss.mainConfig.plugin.prefix; return color(prefix + text); } + + public static String cleanName(String type) { + return type.replace('_', ' ').toLowerCase(); + } + public static String removeFirstColor(String input) { if (input.startsWith("\u00a7")) { if (input.length() > 2) { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c17b583..d7fa429 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -17,7 +17,7 @@ commands: bliss: description: A command for testing. usage: /bliss - permission: bliss.info + permission: bliss.admin permission-message: You do not have permission! sssblisscallback: description: Callback for chat click events