commit 4f3e9558e3c3cc8c006ea6b019a70c5a23d06e3d Author: EpicKnarvik97 Date: Wed Dec 17 14:19:06 2025 +0100 First commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..87d4436 --- /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/ \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..98f393d --- /dev/null +++ b/pom.xml @@ -0,0 +1,137 @@ + + + 4.0.0 + + net.knarcraft + HorseTravel + 1.0-SNAPSHOT + jar + + HorseTravel + + + 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 + + + false + + + net.knarcraft.knarlib + net.knarcraft.minigames.lib.knarlib + + + net.knarcraft.knargui + net.knarcraft.minigames.lib.knargui + + + org.jetbrains.annotations + net.knarcraft.minigames.lib.annotations + + + + + net.knarcraft:knarlib + + net/knarcraft/knarlib/** + + + + net.knarcraft:knargui + + net/knarcraft/knargui/** + + + + org.jetbrains:annotations + + org/jetbrains/annotations/** + + + + + + + + + + + src/main/resources + true + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + knarcraft-repo + https://git.knarcraft.net/api/packages/EpicKnarvik97/maven + + + jitpack.io + https://jitpack.io + + + + + + org.spigotmc + spigot-api + 1.21.8-R0.1-SNAPSHOT + provided + + + org.jetbrains + annotations + 24.0.0 + compile + + + net.knarcraft + knargui + 1.0-SNAPSHOT + compile + + + net.knarcraft + knarlib + 1.2.17 + compile + + + com.github.MilkBowl + VaultAPI + 1.7.1 + provided + + + diff --git a/src/main/java/net/knarcraft/horsetravel/HorseTravel.java b/src/main/java/net/knarcraft/horsetravel/HorseTravel.java new file mode 100644 index 0000000..31e1a10 --- /dev/null +++ b/src/main/java/net/knarcraft/horsetravel/HorseTravel.java @@ -0,0 +1,40 @@ +package net.knarcraft.horsetravel; + +import org.bukkit.entity.EntityType; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public final class HorseTravel extends JavaPlugin { + + // TODO: Load this from the config + public static final @NotNull List travelEntities = List.of(EntityType.HORSE, EntityType.DONKEY, + EntityType.MULE, EntityType.CAMEL); + + @Override + public void onEnable() { + // Plugin startup logic + /* + Horse RPG Travel + + /htp create Network Name + + If network exists, automatically connect. + Spawn horse at current location. Clicking on the horse should open a GUI with travel locations. + Should be able to customize the horse by clicking on it? + Should be able to customize the item shown, by holding it in the player's hand. + + /htp setitem Network Name + + Ability to set a cost on teleportation, global modifyable for each location + Able to set a permission requirement for a network or a location + + */ + } + + @Override + public void onDisable() { + // Plugin shutdown logic + } +} diff --git a/src/main/java/net/knarcraft/horsetravel/gui/HorseGUI.java b/src/main/java/net/knarcraft/horsetravel/gui/HorseGUI.java new file mode 100644 index 0000000..e2c43a1 --- /dev/null +++ b/src/main/java/net/knarcraft/horsetravel/gui/HorseGUI.java @@ -0,0 +1,30 @@ +package net.knarcraft.horsetravel.gui; + +import net.knarcraft.knargui.AbstractGUI; +import net.knarcraft.knargui.GUIAction; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class HorseGUI extends AbstractGUI { + + int counter = 0; + int maxSize; + + public HorseGUI(int inventorySize, String inventoryName) { + super(inventorySize, inventoryName, InventoryType.CHEST); + this.maxSize = inventorySize; + } + + public boolean addIcon(@NotNull ItemStack itemStack, @NotNull GUIAction guiAction) { + if (counter >= maxSize) { + return false; + } + setItem(counter, itemStack); + setClickAction(counter, ClickType.RIGHT, guiAction); + setClickAction(counter++, ClickType.LEFT, guiAction); + return true; + } + +} diff --git a/src/main/java/net/knarcraft/horsetravel/listener/HorseListener.java b/src/main/java/net/knarcraft/horsetravel/listener/HorseListener.java new file mode 100644 index 0000000..e300420 --- /dev/null +++ b/src/main/java/net/knarcraft/horsetravel/listener/HorseListener.java @@ -0,0 +1,24 @@ +package net.knarcraft.horsetravel.listener; + +import net.knarcraft.horsetravel.HorseTravel; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityInteractEvent; +import org.jetbrains.annotations.NotNull; + +public class HorseListener implements Listener { + + @EventHandler + public void onHorseInteract(@NotNull EntityInteractEvent event) { + // TODO: Decide if the event is a horse travel point + if (!HorseTravel.travelEntities.contains(event.getEntityType())) { + return; + } + + // TODO: Need to check some identifier + event.getEntity().getUniqueId(); + + // TODO: Horse travel points should show the name of their location + } + +} diff --git a/src/main/java/net/knarcraft/horsetravel/manager/TravelManager.java b/src/main/java/net/knarcraft/horsetravel/manager/TravelManager.java new file mode 100644 index 0000000..94210a7 --- /dev/null +++ b/src/main/java/net/knarcraft/horsetravel/manager/TravelManager.java @@ -0,0 +1,45 @@ +package net.knarcraft.horsetravel.manager; + +import net.knarcraft.horsetravel.travelpoint.TravelPoint; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +public class TravelManager { + + private Map> travelPoints; + private Map travelPointLookup; + + @Nullable + public Set getNetworkPoints(@NotNull String networkName) { + return new HashSet<>(travelPoints.get(networkName)); + } + + public TravelPoint getFromId(@NotNull UUID uuid) { + return travelPointLookup.get(uuid); + } + + public void addTravelPoint(@NotNull TravelPoint travelPoint) { + travelPoints.putIfAbsent(travelPoint.getNetworkName(), new HashSet<>()); + travelPoints.get(travelPoint.getNetworkName()).add(travelPoint); + travelPointLookup.put(travelPoint.getEntityId(), travelPoint); + } + + public void removeTravelPoint(@NotNull TravelPoint travelPoint) { + if (travelPoints.containsKey(travelPoint.getNetworkName())) { + travelPoints.get(travelPoint.getNetworkName()).remove(travelPoint); + } + travelPointLookup.remove(travelPoint.getEntityId()); + } + + public Set getRelatedPoints(@NotNull TravelPoint travelPoint) { + Set points = travelPoints.get(travelPoint.getNetworkName()); + points.removeIf((point) -> point.equals(travelPoint)); + return points; + } + +} diff --git a/src/main/java/net/knarcraft/horsetravel/travelpoint/TravelPoint.java b/src/main/java/net/knarcraft/horsetravel/travelpoint/TravelPoint.java new file mode 100644 index 0000000..2ce1bf1 --- /dev/null +++ b/src/main/java/net/knarcraft/horsetravel/travelpoint/TravelPoint.java @@ -0,0 +1,27 @@ +package net.knarcraft.horsetravel.travelpoint; + +import org.bukkit.inventory.ItemStack; + +import java.util.UUID; + +public class TravelPoint { + + private UUID entityId; + private String networkName; + private ItemStack appearingItem; + private TravelPointRequirements requirements; + + public UUID getEntityId() { + return this.entityId; + } + + public String getNetworkName() { + return this.networkName; + } + + // TODO: Check/take cost before allowing usage + // TODO: Check if player has permission before allowing usage + // TODO: Interactable travel points should be marked as enchanted. + // TODO: Use lore to explain reason of non-availability + +} diff --git a/src/main/java/net/knarcraft/horsetravel/travelpoint/TravelPointRequirements.java b/src/main/java/net/knarcraft/horsetravel/travelpoint/TravelPointRequirements.java new file mode 100644 index 0000000..ff1de2f --- /dev/null +++ b/src/main/java/net/knarcraft/horsetravel/travelpoint/TravelPointRequirements.java @@ -0,0 +1,10 @@ +package net.knarcraft.horsetravel.travelpoint; + +import java.util.List; + +public class TravelPointRequirements { + + private List permissions; + private double cost; + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..50c9708 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,4 @@ +name: HorseTravel +version: '1.0-SNAPSHOT' +main: net.knarcraft.horsetravel.HorseTravel +api-version: '1.21'