commit b9601c9eb98e0c4ac25c3c5f42fb0d1be7c5ca9c Author: Xelara Networks Date: Sat Jun 13 17:27:26 2026 -0400 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..332bd3b --- /dev/null +++ b/pom.xml @@ -0,0 +1,47 @@ + + 4.0.0 + + com.dirt + DirtFirstJoin + 1.0-SNAPSHOT + jar + + DirtFirstJoin + Run configurable commands when a player joins for the first time. + + + UTF-8 + 21 + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + + + + io.papermc.paper + paper-api + 1.21.1-R0.1-SNAPSHOT + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + 21 + + + + + diff --git a/src/main/java/com/dirt/firstjoin/DirtFirstJoinPlugin.java b/src/main/java/com/dirt/firstjoin/DirtFirstJoinPlugin.java new file mode 100644 index 0000000..d01c8ce --- /dev/null +++ b/src/main/java/com/dirt/firstjoin/DirtFirstJoinPlugin.java @@ -0,0 +1,126 @@ +package com.dirt.firstjoin; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public class DirtFirstJoinPlugin extends JavaPlugin implements Listener { + + private final Set processedThisSession = new HashSet<>(); + + @Override + public void onEnable() { + saveDefaultConfig(); + getServer().getPluginManager().registerEvents(this, this); + getLogger().info("DirtFirstJoin enabled."); + } + + @Override + public void onDisable() { + processedThisSession.clear(); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + if (player.hasPlayedBefore()) { + debug("Skipping " + player.getName() + " because they have joined before."); + return; + } + + if (processedThisSession.contains(player.getUniqueId())) { + debug("Skipping " + player.getName() + " because they were already processed this session."); + return; + } + + int delay = Math.max(0, getConfig().getInt("settings.run-delay-ticks", 40)); + boolean markBeforeRunning = getConfig().getBoolean("settings.mark-before-running", true); + + if (markBeforeRunning) { + processedThisSession.add(player.getUniqueId()); + } + + debug("Scheduling first-join commands for " + player.getName() + " in " + delay + " ticks."); + + Bukkit.getScheduler().runTaskLater(this, () -> { + Player onlinePlayer = Bukkit.getPlayer(player.getUniqueId()); + if (onlinePlayer == null || !onlinePlayer.isOnline()) { + debug("Player " + player.getName() + " went offline before commands could run."); + return; + } + + if (!markBeforeRunning) { + if (processedThisSession.contains(player.getUniqueId())) { + debug("Skipping " + player.getName() + " because they were already processed before run."); + return; + } + processedThisSession.add(player.getUniqueId()); + } + + runFirstJoinCommands(onlinePlayer); + }, delay); + } + + private void runFirstJoinCommands(Player player) { + List commands = getConfig().getStringList("commands"); + + if (commands.isEmpty()) { + debug("No commands configured for first join."); + return; + } + + for (String command : commands) { + String parsed = command + .replace("{player}", player.getName()) + .replace("{uuid}", player.getUniqueId().toString()); + + debug("Running command: " + parsed); + boolean success = Bukkit.dispatchCommand(Bukkit.getConsoleSender(), parsed); + + if (!success) { + getLogger().warning("Failed to execute command for " + player.getName() + ": " + parsed); + } + } + } + + private void debug(String message) { + if (getConfig().getBoolean("settings.debug", false)) { + getLogger().info("[Debug] " + message); + } + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (args.length == 1 && args[0].equalsIgnoreCase("reload")) { + if (!sender.hasPermission("dirtfirstjoin.admin")) { + sender.sendMessage(color(getConfig().getString("messages.no-permission", "&cYou do not have permission."))); + return true; + } + + reloadConfig(); + sender.sendMessage(color(getConfig().getString("messages.reload", "&aDirtFirstJoin config reloaded."))); + return true; + } + + sender.sendMessage(color(getConfig().getString("messages.usage", "&eUsage: /dirtfirstjoin reload"))); + return true; + } + + private String color(String message) { + return ChatColor.translateAlternateColorCodes('&', message); + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..9133b37 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,12 @@ +settings: + run-delay-ticks: 40 + mark-before-running: true + debug: false + +messages: + reload: "&aDirtFirstJoin config reloaded." + no-permission: "&cYou do not have permission." + usage: "&eUsage: /dirtfirstjoin reload" + +commands: + - "rtp {player}" diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..243d1a9 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,17 @@ +name: DirtFirstJoin +version: 1.0-SNAPSHOT +main: com.dirt.firstjoin.DirtFirstJoinPlugin +api-version: '1.21' +authors: [Dirt] +description: Run configurable commands when a player joins for the first time. + +commands: + dirtfirstjoin: + description: Main command for DirtFirstJoin + usage: / reload + aliases: [dfj] + +permissions: + dirtfirstjoin.admin: + description: Allows reloading DirtFirstJoin + default: op diff --git a/target/DirtFirstJoin-1.0-SNAPSHOT.jar b/target/DirtFirstJoin-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..0744afc Binary files /dev/null and b/target/DirtFirstJoin-1.0-SNAPSHOT.jar differ diff --git a/target/classes/com/dirt/firstjoin/DirtFirstJoinPlugin.class b/target/classes/com/dirt/firstjoin/DirtFirstJoinPlugin.class new file mode 100644 index 0000000..0df3f13 Binary files /dev/null and b/target/classes/com/dirt/firstjoin/DirtFirstJoinPlugin.class differ diff --git a/target/classes/config.yml b/target/classes/config.yml new file mode 100644 index 0000000..9133b37 --- /dev/null +++ b/target/classes/config.yml @@ -0,0 +1,12 @@ +settings: + run-delay-ticks: 40 + mark-before-running: true + debug: false + +messages: + reload: "&aDirtFirstJoin config reloaded." + no-permission: "&cYou do not have permission." + usage: "&eUsage: /dirtfirstjoin reload" + +commands: + - "rtp {player}" diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml new file mode 100644 index 0000000..243d1a9 --- /dev/null +++ b/target/classes/plugin.yml @@ -0,0 +1,17 @@ +name: DirtFirstJoin +version: 1.0-SNAPSHOT +main: com.dirt.firstjoin.DirtFirstJoinPlugin +api-version: '1.21' +authors: [Dirt] +description: Run configurable commands when a player joins for the first time. + +commands: + dirtfirstjoin: + description: Main command for DirtFirstJoin + usage: / reload + aliases: [dfj] + +permissions: + dirtfirstjoin.admin: + description: Allows reloading DirtFirstJoin + default: op diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..b2df252 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Sat Jun 13 17:09:45 EDT 2026 +artifactId=DirtFirstJoin +groupId=com.dirt +version=1.0-SNAPSHOT diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..3a53fe7 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1 @@ +com/dirt/firstjoin/DirtFirstJoinPlugin.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..b7677e6 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1 @@ +/home/bitnix/Desktop/DirtFirstJoin/src/main/java/com/dirt/firstjoin/DirtFirstJoinPlugin.java