diff --git a/src/main/java/com/rsscripting/mobcage/MobCage.java b/src/main/java/com/rsscripting/mobcage/MobCage.java index b7ba95a..ff1c023 100644 --- a/src/main/java/com/rsscripting/mobcage/MobCage.java +++ b/src/main/java/com/rsscripting/mobcage/MobCage.java @@ -4,6 +4,7 @@ import com.rsscripting.mobcage.item.CageRecipe; import com.rsscripting.mobcage.listener.MobCageListener; import com.rsscripting.mobcage.listener.MobReleaseListener; import com.rsscripting.mobcage.util.Keys; +import com.rsscripting.mobcage.util.UpdateChecker; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; @@ -31,6 +32,10 @@ public final class MobCage extends JavaPlugin { this ); + UpdateChecker updateChecker = new UpdateChecker(this); + getServer().getPluginManager().registerEvents(updateChecker, this); + updateChecker.checkForUpdates(); + getLogger().info( "RS-MobCage Enabled" ); diff --git a/src/main/java/com/rsscripting/mobcage/description/descriptor/ArmadilloDescriptor.java b/src/main/java/com/rsscripting/mobcage/description/descriptor/ArmadilloDescriptor.java new file mode 100644 index 0000000..e6ba40d --- /dev/null +++ b/src/main/java/com/rsscripting/mobcage/description/descriptor/ArmadilloDescriptor.java @@ -0,0 +1,78 @@ +package com.rsscripting.mobcage.description.descriptor; + +import com.rsscripting.mobcage.description.CaptureResult; +import com.rsscripting.mobcage.description.MobAttribute; +import com.rsscripting.mobcage.util.MobAgeUtil; +import com.rsscripting.mobcage.util.MobHealthUtil; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.bukkit.Location; +import org.bukkit.entity.Armadillo; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; + +import java.util.Collections; +import java.util.List; + +public class ArmadilloDescriptor implements MobDescriptor { + + @Override + public boolean supports(LivingEntity entity) { + return entity instanceof Armadillo; + } + + @Override + public CaptureResult beforeCapture(LivingEntity entity, Player player) { + CaptureResult result = MobHealthUtil.validateFullHealth(entity); + + if (!result.isAllowed()) { + return result; + } + + MobAgeUtil.normalize(entity); + + return CaptureResult.allowed(); + } + + @Override + public String getDisplayName(LivingEntity entity) { + Armadillo armadillo = (Armadillo) entity; + + return armadillo.isAdult() ? "Armadillo" : "Baby Armadillo"; + } + + @Override + public List getAttributes(LivingEntity entity) { + return Collections.emptyList(); + } + + @Override + public void release(Location location, List lore) { + + boolean baby = false; + + PlainTextComponentSerializer plain = + PlainTextComponentSerializer.plainText(); + + for (Component line : lore) { + String text = plain.serialize(line); + + if (text.equals("Baby Armadillo")) { + baby = true; + break; + } + } + + Armadillo armadillo = (Armadillo) location.getWorld().spawnEntity( + location, + EntityType.ARMADILLO + ); + + if (baby) { + armadillo.setBaby(); + } else { + armadillo.setAdult(); + } + } +} diff --git a/src/main/java/com/rsscripting/mobcage/description/descriptor/MobDescriptorRegistry.java b/src/main/java/com/rsscripting/mobcage/description/descriptor/MobDescriptorRegistry.java index cf07e18..6321645 100644 --- a/src/main/java/com/rsscripting/mobcage/description/descriptor/MobDescriptorRegistry.java +++ b/src/main/java/com/rsscripting/mobcage/description/descriptor/MobDescriptorRegistry.java @@ -8,6 +8,7 @@ public final class MobDescriptorRegistry { private static final List DESCRIPTORS = List.of( new AxolotlDescriptor(), + new ArmadilloDescriptor(), new BeeDescriptor(), new CatDescriptor(), new CaveSpiderDescriptor(), @@ -26,6 +27,7 @@ public final class MobDescriptorRegistry { new SlimeDescriptor(), new SpiderDescriptor(), new VillagerDescriptor(), + new WardenDescriptor(), new WolfDescriptor(), new ZombieDescriptor() ); diff --git a/src/main/java/com/rsscripting/mobcage/description/descriptor/WardenDescriptor.java b/src/main/java/com/rsscripting/mobcage/description/descriptor/WardenDescriptor.java new file mode 100644 index 0000000..f1e541f --- /dev/null +++ b/src/main/java/com/rsscripting/mobcage/description/descriptor/WardenDescriptor.java @@ -0,0 +1,42 @@ +package com.rsscripting.mobcage.description.descriptor; + +import com.rsscripting.mobcage.description.CaptureResult; +import com.rsscripting.mobcage.util.MobHealthUtil; +import net.kyori.adventure.text.Component; +import org.bukkit.Location; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Warden; + +import java.util.List; + +public class WardenDescriptor implements MobDescriptor { + + @Override + public boolean supports(LivingEntity entity) { + return entity instanceof Warden; + } + + @Override + public CaptureResult beforeCapture(LivingEntity entity, Player player) { + return MobHealthUtil.validateFullHealth(entity); + } + + @Override + public String getDisplayName(LivingEntity entity) { + return "Warden"; + } + + @Override + public List getAttributes( + LivingEntity entity + ) { + return List.of(); + } + + @Override + public void release(Location location, List lore) { + location.getWorld().spawnEntity(location, EntityType.WARDEN); + } +} diff --git a/src/main/java/com/rsscripting/mobcage/listener/MobReleaseListener.java b/src/main/java/com/rsscripting/mobcage/listener/MobReleaseListener.java index ce9630a..3bd1e4c 100644 --- a/src/main/java/com/rsscripting/mobcage/listener/MobReleaseListener.java +++ b/src/main/java/com/rsscripting/mobcage/listener/MobReleaseListener.java @@ -61,6 +61,9 @@ public class MobReleaseListener implements Listener { switch (contains) { + case "Armadillo", "Baby Armadillo" -> + new ArmadilloDescriptor().release(location, lore); + case "Axolotl", "Baby Axolotl" -> new AxolotlDescriptor().release(location, lore); @@ -118,6 +121,9 @@ public class MobReleaseListener implements Listener { case "Villager", "Baby Villager" -> new VillagerDescriptor().release(location, lore); + case "Warden", "Baby Warden" -> + new WardenDescriptor().release(location, lore); + case "Wolf", "Baby Wolf" -> new WolfDescriptor().release(location, lore); diff --git a/src/main/java/com/rsscripting/mobcage/util/UpdateChecker.java b/src/main/java/com/rsscripting/mobcage/util/UpdateChecker.java new file mode 100644 index 0000000..34e8c5d --- /dev/null +++ b/src/main/java/com/rsscripting/mobcage/util/UpdateChecker.java @@ -0,0 +1,130 @@ +package com.rsscripting.mobcage.util; + +import com.rsscripting.mobcage.MobCage; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URI; + +public class UpdateChecker implements Listener { + + private static final String VERSION_URL = + "https://raw.githubusercontent.com/russelburgraymond/RS-MobCage/main/pom.xml"; + + private final MobCage plugin; + private String latestVersion; + + public UpdateChecker(MobCage plugin) { + this.plugin = plugin; + } + + public void checkForUpdates() { + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + try { + HttpURLConnection connection = + (HttpURLConnection) URI.create(VERSION_URL) + .toURL() + .openConnection(); + + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + connection.setRequestMethod("GET"); + + try (InputStream input = connection.getInputStream()) { + var factory = DocumentBuilderFactory.newInstance(); + factory.setFeature( + "http://apache.org/xml/features/disallow-doctype-decl", + true + ); + + var document = factory.newDocumentBuilder().parse(input); + latestVersion = document + .getElementsByTagName("version") + .item(0) + .getTextContent() + .trim(); + + String currentVersion = plugin.getPluginMeta().getVersion(); + + if (isNewerVersion(latestVersion, currentVersion)) { + plugin.getLogger().warning( + "Update available! Current version: " + + currentVersion + + " | Latest version: " + + latestVersion + ); + } + } finally { + connection.disconnect(); + } + + } catch (Exception exception) { + plugin.getLogger().warning( + "Could not check for updates: " + exception.getMessage() + ); + } + }); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + if (!player.isOp()) { + return; + } + + if (latestVersion == null) { + return; + } + + String currentVersion = plugin.getPluginMeta().getVersion(); + + if (isNewerVersion(latestVersion, currentVersion)) { + player.sendMessage( + "§6[MobCage] §eUpdate available! Current: " + + currentVersion + + " | Latest: " + + latestVersion + ); + } + } + + private boolean isNewerVersion(String latest, String current) { + try { + String[] latestParts = latest.split("\\."); + String[] currentParts = current.split("\\."); + + int length = Math.max(latestParts.length, currentParts.length); + + for (int i = 0; i < length; i++) { + int latestNumber = i < latestParts.length + ? Integer.parseInt(latestParts[i]) : 0; + + int currentNumber = i < currentParts.length + ? Integer.parseInt(currentParts[i]) : 0; + + if (latestNumber > currentNumber) { + return true; + } + + if (latestNumber < currentNumber) { + return false; + } + } + + } catch (NumberFormatException exception) { + plugin.getLogger().warning( + "Unable to compare plugin versions: " + latest + " and " + current + ); + } + + return false; + } +}