14 Commits
Author SHA1 Message Date
Luka 831cdf7ef6 Merge branch 'main' of https://github.com/LifelessNerd/PureKitPvP 2022-11-08 17:58:21 +01:00
Luka 91cd1ef1d9 every time 2022-11-08 17:58:10 +01:00
Luka de Vrij 4a603ee65d Update README.md
1.1 update
2022-11-08 17:56:32 +01:00
Luka 78295a4dd3 1.1 release
perks
2022-11-08 17:56:15 +01:00
Luka ab68294a6f Perk GUI
WIP
2022-11-08 00:25:50 +01:00
LifelessNerd 0e3e0b6675 mobile change 2022-10-23 17:43:13 +02:00
Luka 8513b8f1da wot 2022-10-21 23:51:14 +02:00
Luka f4be22124e ComponentUtils
setLore added, needs testing tho
2022-10-20 23:53:13 +02:00
Luka e225a9b373 Perk redesign draft, nieuwe perks 2022-10-19 23:12:22 +02:00
Luka e07872a82d perks, fixes
new perks, setperk all argument, kitstats sorted draft
2022-10-18 23:25:11 +02:00
Luka 96d42f3e29 Notoriety perk 2022-10-17 23:39:13 +02:00
Luka 803e18c8a5 PERKS 2022-10-17 00:25:00 +02:00
Luka 4952ff1209 Merge branch 'main' of https://github.com/LifelessNerd/PureKitPvP 2022-08-10 15:06:02 +02:00
Luka a78ae48e5f 1.0 release 2022-08-10 15:05:56 +02:00
28 changed files with 1158 additions and 113 deletions

No files matched your search

+3 -3
View File
@@ -6,7 +6,7 @@
<groupId>me.lifelessnerd.purekitpvp</groupId>
<artifactId>PureKitPvP</artifactId>
<version>1.0-SNAPSHOT</version>
<version>1.1</version>
<packaging>jar</packaging>
<name>PureKitPvP</name>
@@ -24,8 +24,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<source>16</source>
<target>16</target>
</configuration>
</plugin>
<plugin>
@@ -1,9 +1,7 @@
package me.lifelessnerd.purekitpvp;
import me.lifelessnerd.purekitpvp.createKit.CreateKit;
import me.lifelessnerd.purekitpvp.createKit.DeleteKit;
import me.lifelessnerd.purekitpvp.createKit.KitIcon;
import me.lifelessnerd.purekitpvp.createKit.SetKillItem;
import me.lifelessnerd.purekitpvp.perks.perkfirehandler.PerkLib;
import me.lifelessnerd.purekitpvp.createKit.*;
import me.lifelessnerd.purekitpvp.customitems.GetCustomItem;
import me.lifelessnerd.purekitpvp.customitems.loottablelogic.CreateLootTable;
import me.lifelessnerd.purekitpvp.files.KitConfig;
@@ -31,10 +29,11 @@ public class AdminCommandManager implements TabExecutor {
subcommands.add(new DeleteKit(plugin));
subcommands.add(new ResetKit());
subcommands.add(new SetKillItem(plugin));
subcommands.add(new SetPerk(plugin));
subcommands.add(new CreateLootTable(plugin));
subcommands.add(new GetCustomItem());
subcommands.add(new GetKitStats(plugin));
subcommands.add(new HelpCommand(subcommands, plugin));
subcommands.add(new AdminHelpCommand(subcommands, plugin));
subcommands.add(new InfoCommand());
subcommands.add(new ReloadPlugin(plugin));
this.plugin = plugin;
@@ -133,6 +132,33 @@ public class AdminCommandManager implements TabExecutor {
return autoComplete;
}
}
if (args[0].equalsIgnoreCase("setperk")){
if (args.length == 2){ //kit
List<String> autoComplete = new ArrayList<>();
for(String key : KitConfig.get().getConfigurationSection("kits.").getKeys(false)){
key = key.toLowerCase();
autoComplete.add(key);
};
autoComplete.add("all");
return autoComplete;
}
if (args.length == 3){ //perk
List<String> autoComplete = new ArrayList<>();
PerkLib perkLib = new PerkLib();
for(String perkName : perkLib.perks.keySet()){
autoComplete.add(perkName.toLowerCase());
};
autoComplete.add("all");
return autoComplete;
}
if (args.length == 4){ //true/false
List<String> autoComplete = new ArrayList<>();
autoComplete.add("true");
autoComplete.add("false");
return autoComplete;
}
}
if (args[0].equalsIgnoreCase("deletekit")){
if (args.length == 2){
@@ -0,0 +1,76 @@
package me.lifelessnerd.purekitpvp;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
public class AdminHelpCommand extends Subcommand {
Plugin plugin;
ArrayList<Subcommand> subcommands;
public AdminHelpCommand(ArrayList<Subcommand> subcommands, Plugin plugin) {
this.plugin = plugin;
this.subcommands = subcommands;
}
@Override
public String getName() {
return "help";
}
@Override
public String[] getAliases() {
return null;
}
@Override
public String getDescription() {
return "Get a list of all commands";
}
@Override
public String getSyntax() {
return "/purekitpvp help";
}
@Override
public boolean perform(Player player, String[] args) {
if (args.length == 1){
String message = """
&bPureKitPvP - Help Menu
&a/kit &r- &eOpen up the kit menu
&a/getkit <kit> &r- &eGet a kit directly
&a/suicide &r- &eCommit suicide (if enabled)
&a/stats <player> &r- &eGet PVP stats of a player
&a/purekitpvphelp &r- &eShow this menu for non-admins
&bFor admin commands, see &a/pkpvp help 2&b!
""";
player.sendMessage(ChatColor.translateAlternateColorCodes('&', message));
}
if (args.length >= 2){
if (args[1].equalsIgnoreCase("2")){
if (!(player.hasPermission("purekitpvp.admin.*"))){
player.sendMessage("No permission!");
return true;
}//Obsolete, any AdminCommandManager subcommands require admin perm
player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&bPureKitPvP - Admin Commands"));
for (Subcommand subcommand : subcommands){
String message =
"&a" + subcommand.getSyntax() + " &r- &e" + subcommand.getDescription();
player.sendMessage(ChatColor.translateAlternateColorCodes('&', message));
}
}
}
return true;
}
}
@@ -1,80 +1,30 @@
package me.lifelessnerd.purekitpvp;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
public class HelpCommand extends Subcommand {
Plugin plugin;
ArrayList<Subcommand> subcommands;
public HelpCommand(ArrayList<Subcommand> subcommands, Plugin plugin) {
this.plugin = plugin;
this.subcommands = subcommands;
}
import org.jetbrains.annotations.NotNull;
public class HelpCommand implements CommandExecutor {
@Override
public String getName() {
return "help";
}
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
@Override
public String[] getAliases() {
return null;
}
if (!(sender instanceof Player player)){
return false;
}
@Override
public String getDescription() {
return "Get a list of all commands";
}
@Override
public String getSyntax() {
return "/purekitpvp help";
}
@Override
public boolean perform(Player player, String[] args) {
if (args.length == 1){
String message = """
String message = """
&bPureKitPvP - Help Menu
&a/kit &r- &eOpen up the kit menu
&a/getkit <kit> &r- &eGet a kit directly
&a/suicide &r- &eCommit suicide (if enabled)
&a/stats <player> &r- &eGet PVP stats of a player
&a/perks &r- &eSelect perks
&bFor admin commands, see &a/pkpvp help 2&b!
""";
player.sendMessage(ChatColor.translateAlternateColorCodes('&', message));
}
if (args.length >= 2){
if (args[1].equalsIgnoreCase("2")){
if (!(player.hasPermission("purekitpvp.admin.*"))){
player.sendMessage("No permission!");
return true;
}//Obsolete, any AdminCommandManager subcommands require admin perm
player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&bPureKitPvP - Admin Commands"));
for (Subcommand subcommand : subcommands){
String message =
"&a" + subcommand.getSyntax() + " &r- &e" + subcommand.getDescription();
player.sendMessage(ChatColor.translateAlternateColorCodes('&', message));
}
}
}
player.sendMessage(ChatColor.translateAlternateColorCodes('&', message));
return true;
}
}
@@ -29,7 +29,7 @@ public class InfoCommand extends Subcommand{
String message =
"""
&bPureKitPvP - version 1.0
&bPureKitPvP - version 1.1
&6SpigotMC: &ohttps://bit.ly/PureKitPvPSpigotMC
&6Github: &ohttps://github.com/LifelessNerd/PureKitPvP
&6Developer: &ohttps://twitter.com/NerdLifeless
@@ -1,14 +1,15 @@
package me.lifelessnerd.purekitpvp;
import me.lifelessnerd.purekitpvp.combathandlers.PearlListener;
import me.lifelessnerd.purekitpvp.combathandlers.libs.commands.Suicide;
import me.lifelessnerd.purekitpvp.combathandlers.VoidKiller;
import me.lifelessnerd.purekitpvp.combathandlers.mobhandler.OnPlayerSpawnMob;
import me.lifelessnerd.purekitpvp.combathandlers.killhandler.DeathHandler;
import me.lifelessnerd.purekitpvp.perks.perkCommand.PerkCommand;
import me.lifelessnerd.purekitpvp.perks.perkCommand.PerkGUIListener;
import me.lifelessnerd.purekitpvp.perks.perkfirehandler.PerkFireHandler;
import me.lifelessnerd.purekitpvp.customitems.GoldenHeadEat;
import me.lifelessnerd.purekitpvp.customitems.OpenRandomChest;
import me.lifelessnerd.purekitpvp.files.KitConfig;
import me.lifelessnerd.purekitpvp.files.KitStatsConfig;
import me.lifelessnerd.purekitpvp.files.LootTablesConfig;
import me.lifelessnerd.purekitpvp.files.PlayerStatsConfig;
import me.lifelessnerd.purekitpvp.files.*;
import me.lifelessnerd.purekitpvp.kitCommand.GUIListener;
import me.lifelessnerd.purekitpvp.kitCommand.GetKit;
import me.lifelessnerd.purekitpvp.kitCommand.KitsGUI;
@@ -32,11 +33,15 @@ public final class PureKitPvP extends JavaPlugin {
//Might create problems, I tried to just keep value null but then the entire value didn't show up until I created a kit
//Which is not too bad either so whatever, if there are any problems ever change this and hope for the best
//Otherwise find a way to make a path without a value, like: kits: , instead of kits: ''
//TODO: fix this with createConfiguration if I feel like it, tbf it works fine
//: fix this with createConfiguration if I feel like it, tbf it works fine (IT DOES)
KitConfig.get().options().copyDefaults(true);
KitConfig.save();
PerkData.setup();
PerkData.get().options().copyDefaults(true);
PerkData.save();
KitStatsConfig.setup();
KitStatsConfig.get().options().copyDefaults(true);
KitStatsConfig.save();
@@ -49,13 +54,17 @@ public final class PureKitPvP extends JavaPlugin {
PlayerStatsConfig.get().options().copyDefaults(true);
PlayerStatsConfig.save();
PerkFireHandler perkFireHandler = new PerkFireHandler(this);
getCommand("getkit").setExecutor(new GetKit(this));
getCommand("kit").setExecutor(new KitsGUI(this));
getCommand("perk").setExecutor(new PerkCommand(this));
getCommand("suicide").setExecutor(new Suicide(this));
getCommand("getstats").setExecutor(new GetStats(this));
getCommand("purekitpvphelp").setExecutor(new HelpCommand());
getCommand("purekitpvp").setExecutor(new AdminCommandManager(this));
getServer().getPluginManager().registerEvents(new GetKit(this), this);
getServer().getPluginManager().registerEvents(new GUIListener(this), this);
getServer().getPluginManager().registerEvents(new PerkGUIListener(this), this);
getServer().getPluginManager().registerEvents(new DeathHandler(this), this);
getServer().getPluginManager().registerEvents(new VoidKiller(this), this);
getServer().getPluginManager().registerEvents(new ProjectilesThrownStat(this), this);
@@ -63,7 +72,7 @@ public final class PureKitPvP extends JavaPlugin {
getServer().getPluginManager().registerEvents(new GoldenHeadEat(this), this);
getServer().getPluginManager().registerEvents(new OpenRandomChest(this), this);
getServer().getPluginManager().registerEvents(new OnPlayerSpawnMob(this), this);
getServer().getPluginManager().registerEvents(new PearlListener(this), this);
}
@Override
@@ -0,0 +1,39 @@
package me.lifelessnerd.purekitpvp.combathandlers;
import com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent;
import me.lifelessnerd.purekitpvp.perks.perkfirehandler.PerkFireHandler;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.EnderPearl;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
public class PearlListener implements Listener {
Plugin plugin;
public PearlListener(Plugin plugin) {
this.plugin = plugin;
}
@EventHandler
public void onProjectileThrow(PlayerLaunchProjectileEvent event) {
if (!(event.getProjectile() instanceof EnderPearl)){
return;
}
Player player = event.getPlayer();
if (!(player.getWorld().getName().equalsIgnoreCase(plugin.getConfig().getString("world")))) {
return;
}
PerkFireHandler.fireEnderpearlPerks(player, event);
}
}
@@ -3,6 +3,7 @@ package me.lifelessnerd.purekitpvp.combathandlers.killhandler;
import me.lifelessnerd.purekitpvp.combathandlers.PlayerLeveling;
import me.lifelessnerd.purekitpvp.combathandlers.libs.DamageCauseLib;
import me.lifelessnerd.purekitpvp.combathandlers.mobhandler.MobRemover;
import me.lifelessnerd.purekitpvp.perks.perkfirehandler.PerkFireHandler;
import me.lifelessnerd.purekitpvp.files.KitConfig;
import me.lifelessnerd.purekitpvp.files.PlayerStatsConfig;
import me.lifelessnerd.purekitpvp.utils.DoubleUtils;
@@ -304,6 +305,10 @@ public class DeathHandler implements Listener {
plugin.getLogger().log(Level.SEVERE, exception.toString()); //TODO throws here. think i fixed it but not sure
}
//PerkHandler
PerkFireHandler.fireKillPerks(creditPlayer);
} else {
@@ -374,6 +379,9 @@ public class DeathHandler implements Listener {
return;
}
PerkFireHandler.fireCombatPerks(player, damager);
PerkFireHandler.fireVampirePerk(event);
} else if (event.getDamager() instanceof Arrow && event.getEntity() instanceof Player) {
//Projectile combat
@@ -568,6 +576,9 @@ public class DeathHandler implements Listener {
if (event.getEntity() instanceof Snowball | event.getEntity() instanceof Egg){
shooter = (Player) event.getEntity().getShooter();
PerkFireHandler.fireSnowballPerks(player, shooter);
}
else {
return;
@@ -7,6 +7,7 @@ import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.potion.PotionEffect;
import org.jetbrains.annotations.NotNull;
public class Suicide implements CommandExecutor {
@@ -30,6 +31,10 @@ public class Suicide implements CommandExecutor {
}
player.setHealth(1);
for(PotionEffect effect:player.getActivePotionEffects()){
//Now use the method Player#removePotionEffect to remove the potion effect. This method accepts a PotionEffectType, so we need to get the type of the effect variable, and then remove it:
player.removePotionEffect(effect.getType());
}
player.teleport(new Location(player.getWorld(),
player.getLocation().getX(),
plugin.getConfig().getDouble("voidY") - 150.0,
@@ -0,0 +1,133 @@
package me.lifelessnerd.purekitpvp.createKit;
import me.lifelessnerd.purekitpvp.Subcommand;
import me.lifelessnerd.purekitpvp.perks.perkfirehandler.PerkLib;
import me.lifelessnerd.purekitpvp.files.KitConfig;
import me.lifelessnerd.purekitpvp.utils.MyStringUtils;
import org.bukkit.ChatColor;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
public class SetPerk extends Subcommand {
Plugin plugin;
public SetPerk(Plugin plugin) {
this.plugin = plugin;
}
@Override
public String getName() {
return "setperk";
}
@Override
public String[] getAliases() {
return null;
}
@Override
public String getDescription() {
return "Set perk values for this kit";
}
@Override
public String getSyntax() {
return "/purekitpvp setperk <kit> <perk> <true/false>";
}
@Override
public boolean perform(Player player, String[] args) {
if (!player.hasPermission("purekitpvp.admin.createkit")){
player.sendMessage(ChatColor.RED + "No permission!");
return true;
}
if (!(args.length >= 2)){
player.sendMessage(ChatColor.RED + "Please provide arguments!");
return false;
}
String kitNameArg = MyStringUtils.camelCaseWord(args[1]);
ArrayList<String> kitNames = new ArrayList<>();
ConfigurationSection kitsSection = KitConfig.get().getConfigurationSection("kits");
// This nesting is painful but it works okay
if (kitNameArg.equalsIgnoreCase("all")){
kitNames.addAll(kitsSection.getKeys(false));
} else {
if (!(KitConfig.get().isSet("kits." + kitNameArg))){
player.sendMessage(ChatColor.GRAY + "That kit does not exist.");
return true;
} else {
kitNames.add(kitNameArg);
}
}
String perkNameArg = args[2].toUpperCase();
PerkLib perkLib = new PerkLib();
ArrayList<String> perkNames = new ArrayList<>();
// This nesting is painful but it works okay
if (perkNameArg.equalsIgnoreCase("all")){
perkNames.addAll(perkLib.perks.keySet());
} else {
if (!(perkLib.perks.containsKey(perkNameArg))){
player.sendMessage(ChatColor.GRAY + "That perk does not exist. Choose from the following:");
for (String key : perkLib.perks.keySet()){
player.sendMessage(ChatColor.GREEN + key);
player.sendMessage(ChatColor.GRAY + perkLib.perks.get(key));
}
return true;
} else {
perkNames.add(perkNameArg);
}
}
String booleanArg = args[3].toLowerCase();
if (!(booleanArg.equalsIgnoreCase("true") || booleanArg.equalsIgnoreCase("false"))){
player.sendMessage(ChatColor.GRAY + "Provide either true or false.");
return true;
}
if (booleanArg.equalsIgnoreCase("true")) {
for(String kitName : kitNames){
for(String perkName : perkNames) {
KitConfig.get().set("kits." + kitName + ".perks." + perkName, true);
player.sendMessage(ChatColor.translateAlternateColorCodes('&',
"&7Perk &e" + perkName + " &7updated to &aTRUE&7 for kit &e" + kitName
));
}
}
} else { // i.e. false
for (String kitName : kitNames) {
for (String perkName : perkNames) {
KitConfig.get().set("kits." + kitName + ".perks." + perkName, null);
player.sendMessage(ChatColor.translateAlternateColorCodes('&',
"&7Perk &e" + perkName + " &7updated to &cFALSE&7 for kit &e" + kitName
));
}
}
}
KitConfig.save();
KitConfig.reload();
return true;
}
}
@@ -44,7 +44,7 @@ public class GetCustomItem extends Subcommand {
ItemStack goldenHead = new ItemStack(Material.PLAYER_HEAD);
SkullMeta meta = (SkullMeta) goldenHead.getItemMeta();
meta.displayName(Component.text("Golden Head"));
String[] loreList = {"Golden Head"};
String[] loreList = {"Healing Item"};
meta.setLore(Arrays.asList(loreList));
meta.setOwningPlayer(Bukkit.getOfflinePlayer("PhantomTupac"));
goldenHead.setItemMeta(meta);
@@ -46,7 +46,7 @@ public class GoldenHeadEat implements Listener {
ItemStack heldItem = player.getInventory().getItemInMainHand();
String desiredLore = "Golden Head"; //TODO: Might make this customizable later
String desiredLore = "Healing Item"; //TODO: Might have broken it by changing it Golden Head > Healing Item
if (!(heldItem.getItemMeta().hasLore())) {
@@ -42,7 +42,7 @@
// }
//
// if (args.length < 1){
// player.sendMessage("Please specify what function to use."); //TODO: Add all options in a message
// player.sendMessage("Please specify what function to use.");
// return false;
// }
//
@@ -55,7 +55,7 @@
// }
//
//
// player.sendMessage(args[0] + " is not a valid sub-command."); //TODO: Add all options in a message same as above
// player.sendMessage(args[0] + " is not a valid sub-command.");
// return false;
//
// }
@@ -33,16 +33,16 @@ public class GetGoldenHead extends Subcommand {
@Override
public boolean perform(Player player, String[] args) {
ItemStack goldenHead = new ItemStack(Material.PLAYER_HEAD);
SkullMeta meta = (SkullMeta) goldenHead.getItemMeta();
meta.displayName(Component.text("Golden Head"));
String[] loreList = {"Golden Head"};
meta.setLore(Arrays.asList(loreList));
meta.setOwningPlayer(Bukkit.getOfflinePlayer("PhantomTupac"));
goldenHead.setItemMeta(meta);
player.getInventory().addItem(goldenHead);
// System.out.println("dab");
// ItemStack goldenHead = new ItemStack(Material.PLAYER_HEAD);
// SkullMeta meta = (SkullMeta) goldenHead.getItemMeta();
// meta.displayName(Component.text("Golden Head"));
// String[] loreList = {"Healing Item"};
// meta.setLore(Arrays.asList(loreList));
// meta.setOwningPlayer(Bukkit.getOfflinePlayer("PhantomTupac"));
// goldenHead.setItemMeta(meta);
//
// player.getInventory().addItem(goldenHead);
return true;
}
@@ -0,0 +1,64 @@
package me.lifelessnerd.purekitpvp.files;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.io.File;
import java.io.IOException;
public class PerkData {
private static File file;
private static FileConfiguration customFile;
public static void setup(){
file = new File(Bukkit.getServer().getPluginManager().getPlugin("PureKitPvP").getDataFolder(), "perkdata.yml");
if (!(file.exists())){
try{
file.createNewFile();
} catch (IOException e){
//pain
}
}
customFile = YamlConfiguration.loadConfiguration(file);
}
public static FileConfiguration get(){
return customFile;
}
public static void save(){
try{
customFile.save(file);
} catch (IOException e){
System.out.println("Cannot save!");
}
}
public static void reload(){
customFile = YamlConfiguration.loadConfiguration(file);
}
public static void setPerk(Player player, String perkName, int slot){
FileConfiguration perkData = PerkData.get();
if (!(perkData.isSet(player.getName()))){
createSection(player);
}
perkData.set(player.getName() + ".slot" + slot, perkName);
}
public static void createSection(Player player){
FileConfiguration perkData = PerkData.get();
perkData.set(player.getName() + ".slot1", null);
perkData.set(player.getName() + ".slot2", null);
perkData.set(player.getName() + ".slot3", null);
perkData.set(player.getName() + ".slot4", null);
perkData.set(player.getName() + ".slot5", null);
}
}
@@ -1,14 +1,27 @@
package me.lifelessnerd.purekitpvp.kitCommand;
import me.lifelessnerd.purekitpvp.perks.perkfirehandler.PerkLib;
import me.lifelessnerd.purekitpvp.utils.MyStringUtils;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
import java.util.List;
public class GUIListener implements Listener {
@@ -25,14 +38,14 @@ public class GUIListener implements Listener {
if (player.getWorld().getName().equalsIgnoreCase(plugin.getConfig().getString("world"))){
if (!(e.getCurrentItem() == null && e.getRawSlot() >= 53)){ //NPE, idk why
if (!(e.getCurrentItem() == null && e.getRawSlot() >= 53)){
ItemStack clickedItem = e.getCurrentItem();
InventoryView inv = e.getView();
if (inv.title().toString().contains("Kits")) { //I hate component
if (!(e.getRawSlot() == 53)){ // 53 is reset button
if (e.getRawSlot() < 52){
e.setCancelled(true);
if(clickedItem == null){ //
if(clickedItem == null){
return;
}
String displayName = clickedItem.getItemMeta().getDisplayName();
@@ -40,7 +53,8 @@ public class GUIListener implements Listener {
player.chat("/getkit " + displayName);
player.closeInventory();
}
else {
else if (e.getRawSlot() == 53){ // Reset button
e.setCancelled(true);
if (player.hasPermission("purekitpvp.admin.resetkit")){
player.chat("/purekitpvp resetkit");
@@ -48,8 +62,13 @@ public class GUIListener implements Listener {
else {
player.chat("/suicide");
}
}
} else if (e.getRawSlot() == 52){ // Perk help button
e.setCancelled(true);
player.chat("/perks");
}
}
}
}
@@ -98,15 +98,16 @@ public class GetKit implements TabExecutor, Listener {
if (item == null) {
item = new ItemStack(Material.AIR);
}
// This code is from PureKits, idk why it works (.setHelmet is called for every armor piece?)
player.getInventory().setItem(index, item);
ItemStack helmet = fileConfiguration.getItemStack("kits." + kitNameArg + ".helmet");
player.getInventory().setHelmet(helmet);
ItemStack chestplate = fileConfiguration.getItemStack("kits." + kitNameArg + ".helmet");
player.getInventory().setChestplate(chestplate);
player.getInventory().setHelmet(chestplate);
ItemStack leggings = fileConfiguration.getItemStack("kits." + kitNameArg + ".helmet");
player.getInventory().setLeggings(leggings);
player.getInventory().setHelmet(leggings);
ItemStack boots = fileConfiguration.getItemStack("kits." + kitNameArg + ".helmet");
player.getInventory().setBoots(boots);
player.getInventory().setHelmet(boots);
}
hasKit.add(player.getName());
@@ -12,6 +12,7 @@ import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
@@ -23,6 +24,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class KitsGUI implements TabExecutor {
@@ -120,11 +122,12 @@ public class KitsGUI implements TabExecutor {
String amount = String.valueOf(item.getAmount());
lore.add(ChatColor.GRAY + amount + "x " + ChatColor.YELLOW + MyStringUtils.itemCamelCase("golden_head"));
lore.add(ChatColor.GRAY + " Healing Item");
lore.add(ChatColor.GRAY + " " + item.getItemMeta().getLore().get(0));
} else if (item.getType().toString().equalsIgnoreCase("CHEST")){
String amount = String.valueOf(item.getAmount());
lore.add(ChatColor.GRAY + amount + "x " + ChatColor.YELLOW + MyStringUtils.itemCamelCase("random_loot_chest"));
lore.add(ChatColor.GRAY + " " + item.getItemMeta().getLore().get(0));
} else {
String amount = String.valueOf(item.getAmount());
@@ -138,13 +141,18 @@ public class KitsGUI implements TabExecutor {
}
//Set KillItem as lore
ItemStack killItem = (ItemStack) KitConfig.get().get("kits." + key + ".killitem");
if (killItem.getType().toString().equalsIgnoreCase("PLAYER_HEAD")) {
lore.add(ChatColor.WHITE + "Item on Kill:");
lore.add(ChatColor.YELLOW + " Golden Head"); //I would just get the displayname to make this more dynamic but I cant because of fecking component
lore.add(ChatColor.GRAY + "1x " + ChatColor.YELLOW + "Golden Head"); //fixedI would just get the displayname to make this more dynamic but I cant because of fecking component
lore.add(ChatColor.GRAY + " " + killItem.getItemMeta().getLore().get(0));
} else if (killItem.getType().toString().equalsIgnoreCase("CHEST")){
lore.add(ChatColor.WHITE + "Item on Kill:");
int amount = killItem.getAmount();
lore.add(ChatColor.GRAY + "" + amount + "x " + ChatColor.YELLOW + "Kit Loot Chest");
lore.add(ChatColor.GRAY + "" + amount + "x " + ChatColor.YELLOW + "Random Loot Chest");
lore.add(ChatColor.GRAY + " " + killItem.getItemMeta().getLore().get(0));
//System.out.println(killItem.getItemMeta().getLore().get(0));
} else if (killItem.getType().toString().equalsIgnoreCase("AIR")){
lore.add(ChatColor.WHITE + "No Item on Kill");
@@ -154,7 +162,17 @@ public class KitsGUI implements TabExecutor {
lore.add(ChatColor.GRAY + "" + amount + "x " + ChatColor.YELLOW + MyStringUtils.itemCamelCase(killItem.getType().toString()));
}
//Add some final lines with active perks on this kit
// ConfigurationSection perksSection = KitConfig.get().getConfigurationSection("kits." + key + ".perks");
// if (perksSection == null || perksSection.getKeys(false).size() == 0){
// lore.add(ChatColor.RED + "No Perks");
// } else {
// lore.add(ChatColor.RED + "Perks:");
// for (String perkKey : perksSection.getKeys(false)) {
// lore.add(" " + ChatColor.YELLOW + MyStringUtils.itemCamelCase(perkKey));
// }
// }
//LEGACY, PERKS ARE NOW SELECTION BASED PER PLAYER
itemMeta.setLore(lore); //Heck you Component
@@ -172,16 +190,29 @@ public class KitsGUI implements TabExecutor {
ItemMeta resetButtonMeta = resetButton.getItemMeta();
resetButtonMeta.displayName(Component.text("Reset kit"));
List<Component> loreList = new ArrayList<>();
TextComponent txt = Component.text("If you do not have permission to reset your kit,").color(TextColor.color(0,100,255));
TextComponent txt2 = Component.text("this will run /suicide on your behalf.").color(TextColor.color(0,100,255));
TextComponent txt = Component.text("If you do not have permission to reset your kit,").color(TextColor.color(100,100,100));
TextComponent txt2 = Component.text("this will run /suicide on your behalf.").color(TextColor.color(100,100,100));
loreList.add(txt);
loreList.add(txt2);
resetButtonMeta.lore(loreList);
resetButton.setItemMeta(resetButtonMeta);
kits.setItem(53, resetButton);
// Perk Redirect Button
ItemStack perkHelpButton = new ItemStack(Material.BOOK);
ItemMeta perkHelpButtonMeta = perkHelpButton.getItemMeta();
perkHelpButtonMeta.displayName(Component.text("Perk Info"));
List<Component> loreList2 = new ArrayList<>();
TextComponent txt21 = Component.text("Click here to change your perks!").color(TextColor.color(100,100,100));
loreList2.add(txt21);
perkHelpButtonMeta.lore(loreList2);
perkHelpButton.setItemMeta(perkHelpButtonMeta);
kits.setItem(52, perkHelpButton);
player.openInventory(kits);
}
@@ -10,6 +10,8 @@ import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import java.util.*;
public class GetKitStats extends Subcommand {
Plugin plugin;
public GetKitStats(Plugin plugin) {
@@ -40,7 +42,31 @@ public class GetKitStats extends Subcommand {
@Override
public boolean perform(Player player, String[] args) {
FileConfiguration kitStats = KitStatsConfig.get();
for(String key : kitStats.getKeys(false)){
ArrayList<String> kitStatsKeys = new ArrayList<>(kitStats.getKeys(false));
HashMap<String, Integer> map = new HashMap<>();
LinkedHashMap<String, Integer> sortedMap = new LinkedHashMap<>();
ArrayList<Integer> list = new ArrayList<>();
for(String key : kitStatsKeys){
map.put(key, kitStats.getInt(key));
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
list.add(entry.getValue());
}
Collections.sort(list);
Collections.reverse(list);
for (Integer integer : list) {
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue().equals(integer)) {
sortedMap.put(entry.getKey(), integer);
}
}
}
for(String key : sortedMap.keySet()){
player.sendMessage(key + " - " + kitStats.getInt(key));
@@ -0,0 +1,112 @@
package me.lifelessnerd.purekitpvp.perks.perkCommand;
import me.lifelessnerd.purekitpvp.files.KitConfig;
import me.lifelessnerd.purekitpvp.files.PerkData;
import me.lifelessnerd.purekitpvp.perks.perkfirehandler.PerkLib;
import me.lifelessnerd.purekitpvp.utils.ComponentUtils;
import me.lifelessnerd.purekitpvp.utils.MyStringUtils;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
public class PerkCommand implements CommandExecutor {
Plugin plugin;
public PerkCommand(Plugin plugin) {
this.plugin = plugin;
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!(sender instanceof Player)){
return false;
}
Player player = (Player) sender;
if (!(player.getWorld().getName().equalsIgnoreCase(plugin.getConfig().getString("world")))){
player.sendMessage(ChatColor.RED + "You can only use this menu in " + ChatColor.GRAY + plugin.getConfig().getString("world"));
return true;
}
//Create inventory GUI
TextComponent invTitle = Component.text("Perks Menu").color(TextColor.color(255, 150, 20));
Inventory perksInventory = Bukkit.createInventory(null, 54, invTitle);
//Info item
ItemStack infoItem = new ItemStack(Material.BOOK);
TextComponent infoItemName = Component.text("Perks Info").color(TextColor.color(233, 67, 47));
ItemMeta infoMeta = infoItem.getItemMeta();
infoMeta.displayName(infoItemName);
infoMeta = ComponentUtils.setLore(infoMeta, "&aYou can equip a total of &e5 &aperks total.", 0);
infoMeta = ComponentUtils.setLore(infoMeta, "&7Click on a perk slot to choose a perk for that slot.", 1);
infoMeta = ComponentUtils.setLore(infoMeta, "&7It will replace any perk currently in that slot.", 2);
infoMeta = ComponentUtils.setLore(infoMeta, "&7Perks are abilities that are always active.", 3);
infoMeta = ComponentUtils.setLore(infoMeta, "&7Duplicate perks do not stack.", 4);
infoItem.setItemMeta(infoMeta);
perksInventory.setItem(13, infoItem);
//Fill perk slots with either empty or actual perk icon
for (int index = 20; index <= 24; index++){
int slot = index - 19;
String fileContent = PerkData.get().getString(player.getName() + ".slot" + slot);
//System.out.println(fileContent);
if (fileContent == null){
// No perk selected in this slot; show red stained glass
ItemStack perkSlot = new ItemStack(Material.RED_STAINED_GLASS_PANE);
TextComponent perkSlotName = Component.text("Perk Slot " + slot).color(TextColor.color(233, 67, 47));
ItemMeta perkSlotMeta = perkSlot.getItemMeta();
perkSlotMeta.displayName(perkSlotName);
perkSlotMeta = ComponentUtils.setLore(perkSlotMeta, "&aClick to select a perk for this slot!", 0);
perkSlot.setItemMeta(perkSlotMeta);
perksInventory.setItem(index, perkSlot);
} else {
PerkLib perkLib = new PerkLib();
ItemStack perkSlot = new ItemStack(perkLib.perkIcons.get(fileContent));
TextComponent perkSlotName = Component.text("Perk Slot " + slot).color(TextColor.color(233, 67, 47));
ItemMeta perkSlotMeta = perkSlot.getItemMeta();
perkSlotMeta.displayName(perkSlotName);
//Component style - not my own class util (okay, only the decoder)
ArrayList<Component> loreTBA = new ArrayList<>();
TextComponent loreTitle = Component.text(fileContent).color(TextColor.color(0, 230, 0));
loreTBA.add(loreTitle);
if (perkLib.perks.get(fileContent).contains("\n")) {
String[] decodedLore = MyStringUtils.perkLoreDecoder(perkLib.perks.get(fileContent));
for (String line : decodedLore) {
loreTBA.add(Component.text(line).color(TextColor.color(150, 150, 150)));
}
} else {
loreTBA.add(Component.text(perkLib.perks.get(fileContent)).color(TextColor.color(150, 150, 150)));
}
perkSlotMeta.lore(loreTBA);
perkSlotMeta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
perkSlotMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
perkSlot.setItemMeta(perkSlotMeta);
perksInventory.setItem(index, perkSlot);
}
}
player.openInventory(perksInventory);
return true;
}
}
@@ -0,0 +1,110 @@
package me.lifelessnerd.purekitpvp.perks.perkCommand;
import me.lifelessnerd.purekitpvp.files.PerkData;
import me.lifelessnerd.purekitpvp.perks.perkfirehandler.PerkLib;
import me.lifelessnerd.purekitpvp.utils.MyStringUtils;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;
import java.util.ArrayList;
public class PerkGUIListener implements Listener {
Plugin plugin;
public PerkGUIListener(Plugin plugin) {
this.plugin = plugin;
}
@EventHandler
public void onInventoryClick(InventoryClickEvent e) {
Player player = (Player) e.getWhoClicked();
if (!(player.getWorld().getName().equalsIgnoreCase(plugin.getConfig().getString("world")))) {
return;
}
if (e.getCurrentItem() == null || e.getRawSlot() >= 53) {
return;
}
ItemStack clickedItem = e.getCurrentItem();
InventoryView inv = e.getView();
if (inv.title().toString().contains("Perks Menu")) { //I hate component
e.setCancelled(true);
Component itemDisplayName = clickedItem.displayName();
PlainTextComponentSerializer serializer = PlainTextComponentSerializer.plainText();
String itemName = serializer.serialize(itemDisplayName);
if (itemName.contains("Perk Slot")) {
int slot = Integer.parseInt(String.valueOf(itemName.charAt(itemName.length() - 2)));
//Create inventory GUI
TextComponent invTitle = Component.text("Perk Slot " + slot).color(TextColor.color(255, 150, 20));
Inventory perkSlotInventory = Bukkit.createInventory(null, 54, invTitle);
//Fill inventory with interactive perk items
PerkLib perkLib = new PerkLib();
for (String perk : perkLib.perkIcons.keySet()) {
ItemStack icon = new ItemStack(perkLib.perkIcons.get(perk));
ItemMeta itemMeta = icon.getItemMeta();
itemMeta.displayName(Component.text(perk).color(TextColor.color(200, 0, 0)));
itemMeta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
itemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
icon.setItemMeta(itemMeta);
ArrayList<Component> loreTBA = new ArrayList<>();
if (perkLib.perks.get(perk).contains("\n")) {
String[] decodedLore = MyStringUtils.perkLoreDecoder(perkLib.perks.get(perk));
for (String line : decodedLore) {
loreTBA.add(Component.text(line).color(TextColor.color(150, 150, 150)));
}
} else {
loreTBA.add(Component.text(perkLib.perks.get(perk)).color(TextColor.color(150, 150, 150)));
}
icon.lore(loreTBA);
perkSlotInventory.addItem(icon);
}
player.openInventory(perkSlotInventory);
}
}
else if (inv.title().toString().contains("Perk Slot")){
e.setCancelled(true);
Component title = inv.title();
PlainTextComponentSerializer serializer = PlainTextComponentSerializer.plainText();
String itemName = serializer.serialize(title);
int slot = Integer.parseInt(String.valueOf(itemName.charAt(itemName.length() - 1)));
ItemStack clickedPerk = e.getCurrentItem();
String displayName = serializer.serialize(clickedPerk.displayName());
displayName = displayName.substring(1, displayName.length() - 1);
PerkData.setPerk(player, displayName, slot);
PerkData.save();
PerkData.reload();
inv.close();
player.chat("/perks");
}
}
}
@@ -0,0 +1,248 @@
package me.lifelessnerd.purekitpvp.perks.perkfirehandler;
import com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent;
import me.lifelessnerd.purekitpvp.files.KitConfig;
import me.lifelessnerd.purekitpvp.files.PerkData;
import me.lifelessnerd.purekitpvp.files.PlayerStatsConfig;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
public class PerkFireHandler {
public static Plugin plugin;
public PerkFireHandler(Plugin plugin){
PerkFireHandler.plugin = plugin;
}
public static void fireKillPerks(Player player){
ConfigurationSection playerPerks = PerkData.get().getConfigurationSection(player.getName());
if (playerPerks == null){
return;
}
Set<String> perkSlots = playerPerks.getKeys(false);
Set<String> perks = new HashSet<>();
for (String perkSlot : perkSlots){
perks.add(playerPerks.getString(perkSlot));
}
for(String perk : perks){
//System.out.println(perk);
switch(perk){
case "JUGGERNAUT":
player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 100, 1));
break;
case "BULLDOZER":
player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 100, 1));
break;
case "KNOWLEDGE":
player.giveExpLevels(1);
break;
case "NOTORIETY":
if(Math.random() <= 0.1) {
ItemStack weapon = player.getInventory().getItemInMainHand();
ItemMeta weaponMeta = weapon.getItemMeta();
int sharpnessLevel = weaponMeta.getEnchantLevel(Enchantment.DAMAGE_ALL);
if (plugin.getConfig().getInt("notoriety-maximum") != -1){
// So if the boundary is set to SOME value
if (sharpnessLevel >= plugin.getConfig().getInt("notoriety-maximum")){
player.sendMessage(ChatColor.YELLOW + "You have reached the maximum Notoriety!");
player.playSound(player.getLocation(), Sound.BLOCK_ANVIL_FALL, 1,0);
continue;
}
}
weaponMeta.removeEnchant(Enchantment.DAMAGE_ALL);
weaponMeta.addEnchant(Enchantment.DAMAGE_ALL, sharpnessLevel + 1, true);
weapon.setItemMeta(weaponMeta);
player.sendMessage(ChatColor.YELLOW + "Your sharpness level has increased!");
}
break;
case "ENDERMAGIC":
if(Math.random() <= 0.3) {
ItemStack pearl = new ItemStack(Material.ENDER_PEARL, 1);
player.getInventory().addItem(pearl);
player.sendMessage(ChatColor.YELLOW + "You gained an ender pearl!");
}
break;
case "SPEEDSTER":
player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 200, 2));
break;
}
}
}
public static void fireCombatPerks(Player damaged, Player damager){
ConfigurationSection playerPerks = PerkData.get().getConfigurationSection(damager.getName());
if (playerPerks == null){
return;
}
Set<String> perkSlots = playerPerks.getKeys(false);
Set<String> perks = new HashSet<>();
for (String perkSlot : perkSlots){
perks.add(playerPerks.getString(perkSlot));
}
for(String perk : perks){
switch(perk){
case "ROBBERY":
if(damager.getInventory().getItemInMainHand().getType() != Material.AIR) { // if hit with hand
return;
}
if (Math.random() <= 0.3){
ItemStack item = damaged.getInventory().getItemInMainHand();
damaged.getInventory().setItemInMainHand(new ItemStack(Material.AIR));
//Check what slots in inventory (!= hotbar) are empty
ArrayList<Integer> airSlots = new ArrayList<Integer>();
for (int slot = 9; slot <= 35; slot++){
if(damaged.getInventory().getItem(slot) == null){
airSlots.add(slot);
}
}
Collections.shuffle(airSlots);
if (airSlots.size() != 0){ // this is exploitable, if a player has a full inv, stuff does not change. So else
damaged.getInventory().setItem(airSlots.get(0), item);
} else { //fixes above exploit
int randomNum = ThreadLocalRandom.current().nextInt(9, 35 + 1);
ItemStack toBeSwapped = damaged.getInventory().getItem(randomNum);
damaged.getInventory().setItem(randomNum, item);
damaged.getInventory().setItem(damaged.getInventory().getHeldItemSlot(), toBeSwapped);
}
// I could have just always swapped, sometimes swap with air
// oh well shite
damaged.sendMessage(ChatColor.YELLOW + "You were disarmed!");
}
break;
}
}
}
public static void fireVampirePerk(EntityDamageByEntityEvent event) {
ConfigurationSection playerPerks = PerkData.get().getConfigurationSection(event.getDamager().getName());
Player player = (Player) event.getDamager();
if (playerPerks == null){
return;
}
Set<String> perkSlots = playerPerks.getKeys(false);
Set<String> perks = new HashSet<>();
for (String perkSlot : perkSlots){
perks.add(playerPerks.getString(perkSlot));
}
for(String perk : perks){
if (perk.equalsIgnoreCase("VAMPIRE")){
if (event.isCritical()){
//Main logic
double damageDealt = event.getDamage();
double regen = damageDealt / 2;
if (player.getHealth() + regen <= 20){
player.setHealth(player.getHealth() + regen);
} else {
player.setHealth(20);
}
player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_BURP, 1,0);
}
}
}
}
public static void fireSnowballPerks(Player damaged, Player shooter) {
ConfigurationSection playerPerks = PerkData.get().getConfigurationSection(shooter.getName());
if (playerPerks == null){
return;
}
Set<String> perkSlots = playerPerks.getKeys(false);
Set<String> perks = new HashSet<>();
for (String perkSlot : perkSlots){
perks.add(playerPerks.getString(perkSlot));
}
for(String perk : perks){
switch(perk){
case "SNOWMAN":
damaged.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 60, 0));
break;
case "DISRUPTOR":
damaged.addPotionEffect(new PotionEffect(PotionEffectType.POISON, 80, 0));
break;
}
}
}
public static void fireEnderpearlPerks(Player player, PlayerLaunchProjectileEvent event) {
ConfigurationSection playerPerks = PerkData.get().getConfigurationSection(player.getName());
if (playerPerks == null){
return;
}
Set<String> perkSlots = playerPerks.getKeys(false);
Set<String> perks = new HashSet<>();
for (String perkSlot : perkSlots){
perks.add(playerPerks.getString(perkSlot));
}
for(String perk : perks){
switch(perk){
case "ENDERMAN":
Block lookingAt = event.getPlayer().getTargetBlock(50);
player.teleport(lookingAt.getLocation());
event.setCancelled(true);
int epAmount = player.getInventory().getItemInMainHand().getAmount();
ItemStack toBeGiven = player.getInventory().getItemInMainHand();
toBeGiven.setAmount(epAmount - 1);
player.getInventory().setItemInMainHand(toBeGiven);
break;
}
}
}
}
@@ -0,0 +1,38 @@
package me.lifelessnerd.purekitpvp.perks.perkfirehandler;
import org.bukkit.Material;
import java.util.HashMap;
public class PerkLib {
public HashMap<String, String> perks = new HashMap<>();
public HashMap<String, Material> perkIcons = new HashMap<>();
public PerkLib(){
perks.put("JUGGERNAUT", "Gain regeneration 1 (5s) after every kill");
perks.put("BULLDOZER", "Gain strength 2 (5s) after every kill");
perks.put("KNOWLEDGE", "Gain 1 XP level on kill");
perks.put("NOTORIETY","10% chance of gaining a sharpness level on each kill\nSharpness will be added to the item held");
perks.put("ENDERMAGIC", "30% chance of gaining an ender pearl on kill");
perks.put("SPEEDSTER","Gain 10 seconds of speed 2 after every kill");
perks.put("ROBBERY","30% chance of disarming someone if hit with your fist\nThe weapon will be swapped with a slot in the inventory");
perks.put("SNOWMAN","Give slowness 1 (3s) when you hit someone with a snowball");
perks.put("DISRUPTOR","Give poison 1 (5s) when you hit someone with an egg");
perks.put("ENDERMAN", "Ender pearls behave differently, teleporting on\nclick, to the location you are looking at, max 50 blocks away\nThey do no damage");
perks.put("VAMPIRE", "On critical hits, gain 50% of the damage\nyou dealt as regeneration");
perkIcons.put("JUGGERNAUT" , Material.DIAMOND_CHESTPLATE);
perkIcons.put("BULLDOZER" , Material.ANVIL);
perkIcons.put("KNOWLEDGE" , Material.BOOK);
perkIcons.put("NOTORIETY", Material.DIAMOND_SWORD);
perkIcons.put("ENDERMAGIC", Material.ENDER_PEARL);
perkIcons.put("SPEEDSTER", Material.SUGAR);
perkIcons.put("ROBBERY", Material.IRON_BARS);
perkIcons.put("SNOWMAN", Material.SNOWBALL);
perkIcons.put("DISRUPTOR", Material.EGG);
perkIcons.put("ENDERMAN", Material.ENDER_EYE);
perkIcons.put("VAMPIRE", Material.REDSTONE);
}
}
@@ -0,0 +1,113 @@
package me.lifelessnerd.purekitpvp.utils;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList;
import java.util.List;
public class ComponentUtils {
public static ItemMeta setLore(ItemMeta itemMeta, String lore, int line){ //TODO: needs testing
List<Component> currentLore = null;
if (itemMeta.hasLore()){
currentLore = itemMeta.lore();
} else {
currentLore = new ArrayList<>();
}
TextComponent translated = stringDecoder(lore);
if (line >= currentLore.size()){
currentLore.add(translated);
} else {
currentLore.set(line, translated);
}
itemMeta.lore(currentLore);
return itemMeta;
}
static TextComponent stringDecoder(String lore) {
//String to TextComponent decoder
// "&aTesting &3string!"
TextComponent textComponent = Component.text("");
StringBuilder toBeAdded = new StringBuilder();
TextColor lastColor = NamedTextColor.WHITE;
for (int index = 0; index < lore.length(); index++) {
char character = lore.charAt(index);
if (character == '&') {
textComponent = textComponent.append(Component.text(
toBeAdded.toString()).color(lastColor));
toBeAdded = new StringBuilder();
switch (lore.charAt(index + 1)) {
case '0':
lastColor = NamedTextColor.BLACK;
break;
case '1':
lastColor = NamedTextColor.DARK_BLUE;
break;
case '2':
lastColor = NamedTextColor.DARK_GREEN;
break;
case '3':
lastColor = NamedTextColor.DARK_AQUA;
break;
case '4':
lastColor = NamedTextColor.DARK_RED;
break;
case '5':
lastColor = NamedTextColor.DARK_PURPLE;
break;
case '6':
lastColor = NamedTextColor.GOLD;
break;
case '7':
lastColor = NamedTextColor.GRAY;
break;
case '8':
lastColor = NamedTextColor.DARK_GRAY;
break;
case '9':
lastColor = NamedTextColor.BLUE;
break;
case 'a':
lastColor = NamedTextColor.GREEN;
break;
case 'b':
lastColor = NamedTextColor.AQUA;
break;
case 'c':
lastColor = NamedTextColor.RED;
break;
case 'd':
lastColor = NamedTextColor.LIGHT_PURPLE;
break;
case 'e':
lastColor = NamedTextColor.YELLOW;
break;
case 'f':
lastColor = NamedTextColor.WHITE;
break;
}
index = index + 1;
} else {
toBeAdded.append(character);
}
}
textComponent = textComponent.append(Component.text(
toBeAdded.toString()).color(lastColor));
return textComponent;
}
}
@@ -73,12 +73,17 @@ public class MyStringUtils {
time.deleteCharAt(splitOnceMore[0].length() - 1);
int timeSec = Integer.parseInt(time.toString()) / 20;
StringBuilder potency = new StringBuilder(splitOnceMore[1]);
potency.deleteCharAt(0);
int potencyInt = Integer.parseInt(potency.toString()) + 1;
StringBuilder lvlAndTime = new StringBuilder("");
lvlAndTime.append(potencyInt + " (" + timeSec + "s)");
if (timeSec > 100000000){
lvlAndTime.append(potencyInt + " (Infinite)");
} else {
lvlAndTime.append(potencyInt + " (" + timeSec + "s)");
}
result.append(lvlAndTime);
@@ -105,4 +110,9 @@ public class MyStringUtils {
return result.toString();
}
public static String[] perkLoreDecoder(String string){
String[] output = string.split("\n");
return output;
}
}
+6 -1
View File
@@ -21,4 +21,9 @@ killstreak-glowing: true
killstreak-glowing-duration: 100
#Suicide command from PureKitPvP, ensures death recaps work correctly
suicide-command: true
suicide-command: true
#Notoriety perk boundary
#If the notoriety perk is too OP, restrict the maximum level of sharpness that can be gained
#Set to -1 if infinite
notoriety-maximum: -1
+12 -1
View File
@@ -22,10 +22,21 @@ commands:
- pvpstats
purekitpvp:
description: All admin commands. See documentation for help.
usage: /purekitpvp <createkit/deletekit/kitstats/setkillitem/getcustomitem/createloottable/reload>
usage: /purekitpvp <createkit/deletekit/kitstats/setkillitem/setperk/getcustomitem/createloottable/reload>
aliases:
- kitpvp
- pkpvp
purekitpvphelp:
description: Get PureKitPvP help, for the common folk
usage: /purekitpvphelp
aliases:
- pkpvphelp
- pvphelp
perks:
description: Perk menu
usage: /perk
aliases:
- perk
+12 -4
View File
@@ -1,5 +1,6 @@
![\[Banner\]](https://i.imgur.com/tl2TQuw.png)
# PureKitPvP
# PureKitPvP (1.1)
PureKitPvP lets you create a kit pvp environment quickly, with your own custom kits. These kits work similar to the plugin PureKits, but since that plugin is abandoned, I decided to extend it with other features. A quick overview of all features:
- Death Recaps
@@ -18,6 +19,7 @@ PureKitPvP lets you create a kit pvp environment quickly, with your own custom k
- See Kit usage stats for balancing
- Mobs can be used in kits, they despawn when the player has died
- Quickly die when falling in the void
- 11 Perks, with GUI selection
## Commands
All commands can be seen in-game via _/purekitpvp help_.
@@ -57,7 +59,10 @@ All commands can be seen in-game via _/purekitpvp help_.
* **/kit**
* Show Kit GUI
![\[IMG\]](https://i.imgur.com/JLFvel3.png)
* **/perks**
* Show Perk GUI, click on a slot to change the perk in that slot (see img2)
![\[IMG\]](https://i.imgur.com/Yau99d1.png)
![\[IMG\]](https://i.imgur.com/DB81qVL.png)
* **/getkit <kitName>**
* Get a kit directly
@@ -80,11 +85,14 @@ For the loottables.yml, follow the format that is provided in the example in the
Have all the items you want to be in your kit in your inventory, and type the command. A kit will be created with the arguments and automatically added to the kit menu (/kit). You either provide a kill item in the base command, or, if you want the kill item to be a special item (i.e. a golden head or a random loot chest), use the /purekitpvp getcustomitem command to get that item, and run the command /purekitpvp setkillitem \<kitName> while holding that item.
The contents of the kit will be shown in a clean hoverbox when choosing the kit, which will categorize the first 3 items in your hotbar as weapons, the rest of the inventory as items, the armor as armor and the offhand as offhand. If the kit has no armor, it will tell you aswell. A piece of lore can be set in the kits.yml.
Basic potions that can be found in the inventory are translated as well, although they do not show their potency and lenght, due to how these items work in spigot. Custom potions created with commands however do work perfectly and show potency and lenght, so I recommend to create your own potions with commands when working with them.
## Perks
The perks menu can be brought up using /perks, or via the /kit command. These perks can be changed anytime (so also during combat. Any suggestions on how to forbid this are welcome), and these perks are active at any time. You can have a total of 5 perks active at any time. Perks are activated based on what they do, some active on kill, some during combat etc.
Some configuration is provided in the config, but these perks are not as customizable as the kits and loot tables, due to most perks being quite unlike each other.
There are currently around 11 perks to choose from. Suggestions can be made (see contact info below).
## How to create a loot table
*Also see the video that covers this topic below.*
Place a chest and put all items you want to be in your loottable in the chest. The chance of each item will be 0.1 by default. You can change this in the loottables.yml file, but if you want you can just put 2 identical items in the chest if you want the chance to be 0.2. When finished, run the command /purekitpvp createloottable \<name> \<lore> \<displayName>. The lore and displayname are important for the item this loot table with be attached to. Now you may change the chance values of each item in the loottables.yml file. You may also change the lore and displayname to get multi-line text. Check if your YAML is valid before reloading the plugin (or back it up), otherwise the file may reset (!). To get the item with the loot table, run the command /purekitpvp getcustomitem random_chest \<loottable>. With this item in your inventory you can use it in a kit, or as kill item.
Place a chest and put all items you want to be in your loottable in the chest. The chance of each item will be 0.1 by default. You can change this in the loottables.yml file, but if you want you can just put 2 identical items in the chest if you want the chance to be 0.2. When finished, run the command /purekitpvp createloottable \<name> \<lore> \<displayName>. The lore and displayname are important for the item this loot table with be attached to. Now you may change the chance values of each item in the loottables.yml file. You may also change the lore and displayname to get multi-line text. If guaranteed is set to a true, the plugin will keep cycling through all item of the lootchest until exactly that amount is given. Check if your YAML is valid before reloading the plugin (or back it up), otherwise the file may reset (!). To get the item with the loot table, run the command /purekitpvp getcustomitem random_chest \<loottable> (will auto-complete). With this item in your inventory you can use it in a kit, or set it as kill item.
## Video
https://youtu.be/wZcZ4DcRfgU