commit b8f9b7749bebdb9921d1d099503604090c1bfcfd Author: FantasyPvP <80643031+FantasyPvP@users.noreply.github.com> Date: Sun Jan 5 18:42:39 2025 +0000 initial diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4788b4b --- /dev/null +++ b/.gitignore @@ -0,0 +1,113 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +target/ + +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next + +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar +.flattened-pom.xml + +# Common working directory +run/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..fe242d4 --- /dev/null +++ b/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + dev.zxq5 + fantasysmp + 1.0-SNAPSHOT + jar + + fantasysmp + + + 21 + UTF-8 + + + + clean package + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.3 + + + package + + shade + + + + + + + + src/main/resources + true + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + + + + org.spigotmc + spigot-api + 1.21.4-R0.1-SNAPSHOT + provided + + + + com.google.code.gson + gson + 2.11.0 + + + diff --git a/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java b/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java new file mode 100644 index 0000000..eb483b7 --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/Fantasysmp.java @@ -0,0 +1,28 @@ +package dev.zxq5.fantasysmp; + +import dev.zxq5.fantasysmp.events.StevenKillCheck; +import dev.zxq5.fantasysmp.items.Items; +import dev.zxq5.fantasysmp.items.Witherite; +import dev.zxq5.fantasysmp.warps.Warper; +import org.bukkit.plugin.java.JavaPlugin; + +public final class Fantasysmp extends JavaPlugin { + + @Override + public void onEnable() { + + Items items = new Items(this); + getCommand("items").setExecutor(items); + // Plugin startup logic + + getCommand("home").setExecutor(new Warper()); + getCommand("sethome").setExecutor(new Warper()); + + getServer().getPluginManager().registerEvents(new StevenKillCheck(), this); + } + + @Override + public void onDisable() { + // Plugin shutdown logic + } +} diff --git a/src/main/java/dev/zxq5/fantasysmp/events/StevenKillCheck.java b/src/main/java/dev/zxq5/fantasysmp/events/StevenKillCheck.java new file mode 100644 index 0000000..333f9ac --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/events/StevenKillCheck.java @@ -0,0 +1,25 @@ +package dev.zxq5.fantasysmp.events; + +import org.bukkit.Location; +import org.bukkit.entity.Chicken; +import org.bukkit.entity.Player; +import org.bukkit.entity.Wither; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +import static org.bukkit.Bukkit.getServer; + +public class StevenKillCheck implements Listener { + + @EventHandler + public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + if (event.getEntity() instanceof Chicken && event.getDamager() instanceof Player player) { + Location coords = player.getLocation(); + + // summon lightning at location + + getServer().getWorlds().getFirst().strikeLightning(coords); + } + } +} diff --git a/src/main/java/dev/zxq5/fantasysmp/items/GenericGearSet.java b/src/main/java/dev/zxq5/fantasysmp/items/GenericGearSet.java new file mode 100644 index 0000000..e7fc624 --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/items/GenericGearSet.java @@ -0,0 +1,215 @@ +package dev.zxq5.fantasysmp.items; + +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.inventory.EquipmentSlotGroup; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public abstract class GenericGearSet { + protected int swordAttackDamage = 0; + protected float swordAttackSpeed = 0; + protected int swordDurability = 0; + protected String swordName = "wooden sword"; + protected String swordLore = ""; + + protected int helmetArmour = 0; + protected int helmetArmourToughness = 0; + protected int helmetDurability = 0; + protected String helmetName = "leather cap"; + protected String helmetLore = ""; + + protected int chestplateArmour = 0; + protected int chestplateArmourToughness = 0; + protected int chestplateDurability = 0; + protected String chestplateName = "leather tunic"; + protected String chestplateLore = ""; + + protected int leggingsArmour = 0; + protected int leggingsArmourToughness = 0; + protected int leggingsDurability = 0; + protected String leggingsName = "leather pants"; + protected String leggingsLore = ""; + + protected int bootsArmour = 0; + protected int bootsArmourToughness = 0; + protected int bootsDurability = 0; + protected String bootsName = "leather boots"; + protected String bootsLore = ""; + + public void setTier1() { + swordAttackDamage = 4; + swordAttackSpeed = 1.6f; + + // todo: idk + } + + public void setTier3() { + swordAttackDamage = 6; + swordAttackSpeed = 1.6f; + helmetArmour = 2; + helmetArmourToughness = 0; + chestplateArmour = 6; + chestplateArmourToughness = 0; + leggingsArmour = 5; + leggingsArmourToughness = 0; + bootsArmour = 2; + bootsArmourToughness = 0; + } + + public void setTier4() { + swordAttackDamage = 7; + swordAttackSpeed = 1.6f; + helmetArmour = 3; + helmetArmourToughness = 2; + chestplateArmour = 8; + chestplateArmourToughness = 2; + leggingsArmour = 6; + leggingsArmourToughness = 2; + bootsArmour = 3; + bootsArmourToughness = 2; + } + + public void setTier5() { + swordAttackDamage = 8; + swordAttackSpeed = 1.6f; + helmetArmour = 3; + helmetArmourToughness = 3; + chestplateArmour = 8; + chestplateArmourToughness = 3; + leggingsArmour = 6; + leggingsArmourToughness = 3; + bootsArmour = 3; + bootsArmourToughness = 3; + } + + public void setTier6() { + swordAttackDamage = 10; + swordAttackSpeed = 1.6f; + helmetArmour = 3; + helmetArmourToughness = 5; + chestplateArmour = 8; + chestplateArmourToughness = 5; + leggingsArmour = 6; + leggingsArmourToughness = 5; + bootsArmour = 3; + bootsArmourToughness = 5; + } + + // this must be overridden by the child class. + public static void init() {} + + public ItemStack getSword() { + ItemStack item = new ItemStack(Material.WOODEN_SWORD, 1); + ItemMeta meta = item.getItemMeta(); + meta.addAttributeModifier(Attribute.ATTACK_DAMAGE, new AttributeModifier( + NamespacedKey.minecraft("generic.attackDamage"), + swordAttackDamage, + AttributeModifier.Operation.ADD_NUMBER, + EquipmentSlotGroup.HAND + )); + + meta.addAttributeModifier(Attribute.ATTACK_SPEED, new AttributeModifier( + NamespacedKey.minecraft("generic.attackSpeed"), + swordAttackSpeed, + AttributeModifier.Operation.ADD_NUMBER, + EquipmentSlotGroup.HAND + )); + + item.setItemMeta(meta); + return item; + } + + public ItemStack getHelmet() { + ItemStack item = new ItemStack(Material.LEATHER_HELMET, 1); + ItemMeta meta = item.getItemMeta(); + meta.addAttributeModifier(Attribute.ARMOR, new AttributeModifier( + NamespacedKey.minecraft("generic.armor"), + helmetArmour, + AttributeModifier.Operation.ADD_NUMBER, + EquipmentSlotGroup.HEAD + )); + meta.addAttributeModifier(Attribute.ARMOR_TOUGHNESS, new AttributeModifier( + NamespacedKey.minecraft("generic.armorToughness"), + helmetArmourToughness, + AttributeModifier.Operation.ADD_NUMBER, + EquipmentSlotGroup.HEAD + )); + item.setItemMeta(meta); + return item; + } + + public ItemStack getChestplate() { + ItemStack item = new ItemStack(Material.LEATHER_CHESTPLATE, 1); + ItemMeta meta = item.getItemMeta(); + meta.addAttributeModifier(Attribute.ARMOR, new AttributeModifier( + NamespacedKey.minecraft("generic.armor"), + chestplateArmour, + AttributeModifier.Operation.ADD_NUMBER, + EquipmentSlotGroup.CHEST + )); + meta.addAttributeModifier(Attribute.ARMOR_TOUGHNESS, new AttributeModifier( + NamespacedKey.minecraft("generic.armorToughness"), + chestplateArmourToughness, + AttributeModifier.Operation.ADD_NUMBER, + EquipmentSlotGroup.CHEST + )); + item.setItemMeta(meta); + return item; + } + + public ItemStack getLeggings() { + ItemStack item = new ItemStack(Material.LEATHER_LEGGINGS, 1); + ItemMeta meta = item.getItemMeta(); + meta.addAttributeModifier(Attribute.ARMOR, new AttributeModifier( + NamespacedKey.minecraft("generic.armor"), + leggingsArmour, + AttributeModifier.Operation.ADD_NUMBER, + EquipmentSlotGroup.LEGS + )); + meta.addAttributeModifier(Attribute.ARMOR_TOUGHNESS, new AttributeModifier( + NamespacedKey.minecraft("generic.armorToughness"), + leggingsArmourToughness, + AttributeModifier.Operation.ADD_NUMBER, + EquipmentSlotGroup.LEGS + )); + item.setItemMeta(meta); + return item; + } + + public ItemStack getBoots() { + ItemStack item = new ItemStack(Material.LEATHER_BOOTS, 1); + ItemMeta meta = item.getItemMeta(); + meta.addAttributeModifier(Attribute.ARMOR, new AttributeModifier( + NamespacedKey.minecraft("generic.armor"), + bootsArmour, + AttributeModifier.Operation.ADD_NUMBER, + EquipmentSlotGroup.FEET + )); + meta.addAttributeModifier(Attribute.ARMOR_TOUGHNESS, new AttributeModifier( + NamespacedKey.minecraft("generic.armorToughness"), + bootsArmourToughness, + AttributeModifier.Operation.ADD_NUMBER, + EquipmentSlotGroup.FEET + )); + item.setItemMeta(meta); + return item; + } +} + + + + + + + + + + + + + + + diff --git a/src/main/java/dev/zxq5/fantasysmp/items/Items.java b/src/main/java/dev/zxq5/fantasysmp/items/Items.java new file mode 100644 index 0000000..c936015 --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/items/Items.java @@ -0,0 +1,52 @@ +package dev.zxq5.fantasysmp.items; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandExecutor; +import org.bukkit.entity.Player; +import org.bukkit.entity.Wither; +import org.bukkit.event.EventHandler; +import org.bukkit.plugin.java.JavaPlugin; + +import static org.bukkit.Bukkit.getServer; + +public class Items implements CommandExecutor { + + @Override + public boolean onCommand(org.bukkit.command.CommandSender sender, org.bukkit.command.Command command, String label, String[] args) { + + Player player = (Player) sender; + + if (!(sender instanceof Player)) { + return false; + } + + if (!(command.getName().equals("items"))) { + return false; + } + + if (args.length != 1) { + return false; + } + + if (!(player.hasPermission("fantasysmp.items"))) { + player.sendMessage("You do not have permission to use this command."); + return false; + } + + CommandExecutor handler; + switch (args[0]) { + case "witherite" -> handler = new Witherite(); + default -> { return false; } + } + + handler.onCommand(sender, command, label, args); + + return true; + } + + public Items(JavaPlugin plugin) { + Witherite.init(); + getServer().getPluginManager().registerEvents(new Witherite(), plugin); + + } +} diff --git a/src/main/java/dev/zxq5/fantasysmp/items/Witherite.java b/src/main/java/dev/zxq5/fantasysmp/items/Witherite.java new file mode 100644 index 0000000..7b0326b --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/items/Witherite.java @@ -0,0 +1,87 @@ +package dev.zxq5.fantasysmp.items; + +import org.bukkit.command.CommandExecutor; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.potion.PotionEffect; + +public class Witherite extends GenericGearSet implements Listener, CommandExecutor { + + @Override + public boolean onCommand(org.bukkit.command.CommandSender sender, org.bukkit.command.Command command, String label, String[] args) { + if (!(args[0].equals("witherite"))) { + return false; + } + + Player player = (Player) sender; + + player.getInventory().addItem(new Witherite().getSword()); + player.getInventory().addItem(new Witherite().getHelmet()); + player.getInventory().addItem(new Witherite().getChestplate()); + player.getInventory().addItem(new Witherite().getLeggings()); + player.getInventory().addItem(new Witherite().getBoots()); + + return true; + } + + @EventHandler + public void onEntityDamageByEntity(org.bukkit.event.entity.EntityDamageByEntityEvent event) { + + // checks that it is a player that is performing the attack. + if (!(event.getDamager() instanceof org.bukkit.entity.Player player)) { + return; + } + + try { + if (!player.getInventory().getItemInMainHand().getItemMeta().getLore().toString().contains(this.swordLore)) { + return; + } + } catch (Exception e) { + e.printStackTrace(); + return; + } + + PotionEffect effect = new PotionEffect( + org.bukkit.potion.PotionEffectType.WITHER, + 20 * 5, + 1 + ); + effect.apply((LivingEntity) event.getEntity()); + + } + + @EventHandler + public void onEntityPotionEffectEvent(org.bukkit.event.entity.EntityPotionEffectEvent event) { + if (event.getEntity() instanceof Player player) { + try { + if (player.getInventory().getHelmet().getItemMeta().getLore().toString().contains(this.helmetLore) + && player.getInventory().getChestplate().getItemMeta().getLore().toString().contains(this.chestplateLore) + && player.getInventory().getLeggings().getItemMeta().getLore().toString().contains(this.leggingsLore) + && player.getInventory().getBoots().getItemMeta().getLore().toString().contains(this.bootsLore)) { + event.setCancelled(true); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public static void init() {} + + public Witherite() { + this.setTier5(); + this.swordName = "Witherite Sword"; + this.helmetName = "Witherite Helmet"; + this.chestplateName = "Witherite Chestplate"; + this.leggingsName = "Witherite Leggings"; + this.bootsName = "Witherite Boots"; + + this.swordLore = "A sword forged with the skulls of wither skeletons."; + this.helmetLore = "A helmet forged with the skulls of wither skeletons."; + this.chestplateLore = "A chestplate forged with the skulls of wither skeletons."; + this.leggingsLore = "A leggings forged with the skulls of wither skeletons."; + this.bootsLore = "A boots forged with the skulls of wither skeletons."; + } +} diff --git a/src/main/java/dev/zxq5/fantasysmp/warps/Warp.java b/src/main/java/dev/zxq5/fantasysmp/warps/Warp.java new file mode 100644 index 0000000..a447cc3 --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/warps/Warp.java @@ -0,0 +1,155 @@ +package dev.zxq5.fantasysmp.warps; + +import com.google.gson.Gson; +import org.bukkit.Location; +import org.bukkit.command.CommandExecutor; +import org.bukkit.entity.Player; + +import java.io.*; +import java.util.UUID; + +import static org.bukkit.Bukkit.getServer; + + +public class Warp { + private String setby; + private String world; + private WarpType type; + private int x; + private int y; + private int z; + + public boolean execute(Player player) { + Location location = new Location(player.getWorld(), this.x, this.y, this.z); + location.setPitch(player.getLocation().getPitch()); + location.setYaw(player.getLocation().getYaw()); + player.teleport(location); + return true; + } + + public static Warp[] getWarps() throws Exception { + File dataFolder = getServer().getPluginManager().getPlugin("Fantasysmp").getDataFolder(); + File file = new File(dataFolder, "warps.json"); + + if (!file.exists()) { + init(); + } + + BufferedReader reader; + reader = new BufferedReader(new FileReader(file)); + + Gson gson = new Gson(); + Warp[] warps = gson.fromJson(reader, Warp[].class); + + reader.close(); + + return warps; + } + + public static void saveWarps(Warp[] warps) throws Exception { + File dataFolder = getServer().getPluginManager().getPlugin("Fantasysmp").getDataFolder(); + File file = new File(dataFolder, "warps.json"); + + Gson gson = new Gson(); + String json = gson.toJson(warps); + Writer writer = new FileWriter(file); + writer.write(json); + writer.close(); + } + + public static Warp getHome(UUID uuid) { + String uuidString = uuid.toString(); + + Warp[] warps; + try { + warps = getWarps(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + for (Warp warp : warps) { + if (warp.setby.equals(uuidString)) { + if (warp.type.equals(WarpType.HOME)) { + return warp; + } + return warp; + } + } + + return null; + } + + public static void init() { + File dataFolder = getServer().getPluginManager().getPlugin("Fantasysmp").getDataFolder(); + File file = new File(dataFolder, "warps.json"); + + if (!file.exists()) { + try { + Warp[] w = new Warp[0]; + Gson gson = new Gson(); + String json = gson.toJson(w); + Writer writer = new FileWriter(file); + writer.write(json); + writer.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public static void setHome(Player player) { + String uuid = player.getUniqueId().toString(); + + Warp[] warps; + try { + warps = getWarps(); + } catch (Exception e) { + e.printStackTrace(); + return; + } + + int x, y, z; + x = (int) player.getLocation().getX(); + y = (int) player.getLocation().getY(); + z = (int) player.getLocation().getZ(); + + Warp warp = null; + + for (Warp w : warps) { + if (w.setby.equals(uuid)) { + warp = w; + break; + } + } + + if (warp == null) { + warp = new Warp(); + } + + warp.type = WarpType.HOME; + warp.setby = uuid; + warp.world = player.getWorld().getName(); + warp.x = x; + warp.y = y; + warp.z = z; + + warps = new Warp[warps.length + 1]; + System.arraycopy(warps, 0, warps, 0, warps.length - 1); + warps[warps.length - 1] = warp; + try { + saveWarps(warps); + } catch (Exception e) { + e.printStackTrace(); + } + + return; + } +} + +enum WarpType { + HOME, + PUBLIC, + DEATH, + TEAM, +} \ No newline at end of file diff --git a/src/main/java/dev/zxq5/fantasysmp/warps/Warper.java b/src/main/java/dev/zxq5/fantasysmp/warps/Warper.java new file mode 100644 index 0000000..9ea789e --- /dev/null +++ b/src/main/java/dev/zxq5/fantasysmp/warps/Warper.java @@ -0,0 +1,37 @@ +package dev.zxq5.fantasysmp.warps; + +import org.bukkit.command.CommandExecutor; +import org.bukkit.entity.Player; + +public class Warper implements CommandExecutor { + @Override + public boolean onCommand(org.bukkit.command.CommandSender sender, org.bukkit.command.Command command, String label, String[] args) { + if (!(sender instanceof Player player)) { + return false; + } + + if (command.getName().equals("home")) { + if (args.length != 0) { + player.sendMessage("Usage: /home"); + return true; + } + + Warp warp = Warp.getHome(player.getUniqueId()); + + if (warp != null) { + warp.execute(player); + } + } + + if (command.getName().equals("sethome")) { + if (args.length != 0) { + player.sendMessage("Usage: /sethome"); + return true; + } + + Warp.setHome(player); + } + + return true; + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..bc065f6 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,45 @@ +name: fantasysmp +version: '1.0-SNAPSHOT' +main: dev.zxq5.fantasysmp.Fantasysmp +api-version: '1.21' +authors: [ zxq5 ] +description: plugin for fantasysmp +website: https://zxq5.dev + +commands: + items: + description: create custom items from plugin + usage: /items + + home: + description: teleport to your home + usage: /home + permission: fantasysmp.home + + sethome: + description: set your home + usage: /sethome + permission: fantasysmp.home + +permissions: + fantasysmp.admin: + description: Manage plugin + default: op + children: + fantasysmp.*: true + + fantasysmp.items: + description: create custom items from plugin + default: false + + fantasysmp.warps: + description: create custom warps from plugin + default: false + + fantasysmp.manage_warps: + description: commands for managing warps + default: false + + fantasysmp.home: + description: commands for teleporting home + default: true \ No newline at end of file