diff --git a/.gradle/8.8/checksums/checksums.lock b/.gradle/8.8/checksums/checksums.lock
new file mode 100644
index 0000000..2d370c4
Binary files /dev/null and b/.gradle/8.8/checksums/checksums.lock differ
diff --git a/.gradle/8.8/dependencies-accessors/gc.properties b/.gradle/8.8/dependencies-accessors/gc.properties
new file mode 100644
index 0000000..e69de29
diff --git a/.gradle/8.8/executionHistory/executionHistory.bin b/.gradle/8.8/executionHistory/executionHistory.bin
new file mode 100644
index 0000000..a3cc731
Binary files /dev/null and b/.gradle/8.8/executionHistory/executionHistory.bin differ
diff --git a/.gradle/8.8/executionHistory/executionHistory.lock b/.gradle/8.8/executionHistory/executionHistory.lock
new file mode 100644
index 0000000..8068f9b
Binary files /dev/null and b/.gradle/8.8/executionHistory/executionHistory.lock differ
diff --git a/.gradle/8.8/fileChanges/last-build.bin b/.gradle/8.8/fileChanges/last-build.bin
new file mode 100644
index 0000000..f76dd23
Binary files /dev/null and b/.gradle/8.8/fileChanges/last-build.bin differ
diff --git a/.gradle/8.8/fileHashes/fileHashes.bin b/.gradle/8.8/fileHashes/fileHashes.bin
new file mode 100644
index 0000000..4176a15
Binary files /dev/null and b/.gradle/8.8/fileHashes/fileHashes.bin differ
diff --git a/.gradle/8.8/fileHashes/fileHashes.lock b/.gradle/8.8/fileHashes/fileHashes.lock
new file mode 100644
index 0000000..7aa94e3
Binary files /dev/null and b/.gradle/8.8/fileHashes/fileHashes.lock differ
diff --git a/.gradle/8.8/fileHashes/resourceHashesCache.bin b/.gradle/8.8/fileHashes/resourceHashesCache.bin
new file mode 100644
index 0000000..2c3baa9
Binary files /dev/null and b/.gradle/8.8/fileHashes/resourceHashesCache.bin differ
diff --git a/.gradle/8.8/gc.properties b/.gradle/8.8/gc.properties
new file mode 100644
index 0000000..e69de29
diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock
new file mode 100644
index 0000000..6714908
Binary files /dev/null and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 0000000..d3ef842
--- /dev/null
+++ b/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Wed Oct 08 05:17:43 CEST 2025
+gradle.version=8.8
diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin
new file mode 100644
index 0000000..efee463
Binary files /dev/null and b/.gradle/buildOutputCleanup/outputFiles.bin differ
diff --git a/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/buildfingerprint.bin b/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/buildfingerprint.bin
new file mode 100644
index 0000000..c61b3f0
Binary files /dev/null and b/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/buildfingerprint.bin differ
diff --git a/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/entry.bin b/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/entry.bin
new file mode 100644
index 0000000..97f34ce
Binary files /dev/null and b/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/entry.bin differ
diff --git a/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/projectfingerprint.bin b/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/projectfingerprint.bin
new file mode 100644
index 0000000..3555567
Binary files /dev/null and b/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/projectfingerprint.bin differ
diff --git a/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/work.bin b/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/work.bin
new file mode 100644
index 0000000..7b8328e
Binary files /dev/null and b/.gradle/configuration-cache/6jo271vzo402llotakqvcifez/work.bin differ
diff --git a/.gradle/configuration-cache/configuration-cache.lock b/.gradle/configuration-cache/configuration-cache.lock
new file mode 100644
index 0000000..7a94985
Binary files /dev/null and b/.gradle/configuration-cache/configuration-cache.lock differ
diff --git a/.gradle/configuration-cache/gc.properties b/.gradle/configuration-cache/gc.properties
new file mode 100644
index 0000000..e69de29
diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe
new file mode 100644
index 0000000..8337190
Binary files /dev/null and b/.gradle/file-system.probe differ
diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties
new file mode 100644
index 0000000..e69de29
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..b86273d
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/discord.xml b/.idea/discord.xml
new file mode 100644
index 0000000..912db82
--- /dev/null
+++ b/.idea/discord.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..44e3409
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..89659c9
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..9749c3f
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..35a8b7a
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules/commandify.main.iml b/.idea/modules/commandify.main.iml
new file mode 100644
index 0000000..645f40d
--- /dev/null
+++ b/.idea/modules/commandify.main.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..6299b86
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,116 @@
+plugins {
+ id 'java-library'
+ id 'maven-publish'
+ id 'idea'
+ id 'net.neoforged.moddev' version '2.0.113'
+}
+
+version = mod_version
+group = mod_group_id
+
+repositories {
+ mavenLocal()
+}
+
+base {
+ archivesName = mod_id
+}
+
+java.toolchain.languageVersion = JavaLanguageVersion.of(21)
+
+neoForge {
+ version = project.neo_version
+
+ parchment {
+ mappingsVersion = project.parchment_mappings_version
+ minecraftVersion = project.parchment_minecraft_version
+ }
+
+ runs {
+ client {
+ client()
+ systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id
+ }
+
+ server {
+ server()
+ programArgument '--nogui'
+ systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id
+ }
+
+ gameTestServer {
+ type = "gameTestServer"
+ systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id
+ }
+
+ data {
+ data()
+ programArguments.addAll '--mod', project.mod_id, '--all',
+ '--output', file('src/generated/resources/').getAbsolutePath(),
+ '--existing', file('src/main/resources/').getAbsolutePath()
+ }
+
+ configureEach {
+ systemProperty 'forge.logging.markers', 'REGISTRIES'
+ logLevel = org.slf4j.event.Level.DEBUG
+ }
+ }
+
+ mods {
+ "${mod_id}" {
+ sourceSet(sourceSets.main)
+ }
+ }
+}
+
+// Inclut les ressources générées
+sourceSets.main.resources { srcDir 'src/generated/resources' }
+
+// 🔧 Gère la substitution automatique dans META-INF/neoforge.mods.toml
+processResources {
+ def replaceProperties = [
+ "minecraft_version" : minecraft_version,
+ "minecraft_version_range": minecraft_version_range,
+ "neo_version" : neo_version,
+ "neo_version_range" : neo_version_range,
+ "loader_version_range" : loader_version_range,
+ "mod_id" : mod_id,
+ "mod_name" : mod_name,
+ "mod_license" : mod_license,
+ "mod_version" : mod_version,
+ "mod_authors" : mod_authors,
+ "mod_description" : mod_description
+ ]
+
+ inputs.properties replaceProperties
+
+ filesMatching("META-INF/neoforge.mods.toml") {
+ expand replaceProperties
+ }
+}
+
+dependencies {
+ // Tu peux ajouter ici d’autres dépendances si besoin
+}
+
+// 📦 Publication locale (utile pour tests ou modpack perso)
+publishing {
+ publications {
+ register('mavenJava', MavenPublication) {
+ from components.java
+ }
+ }
+ repositories {
+ maven {
+ url "file://${project.projectDir}/repo"
+ }
+ }
+}
+
+// 🔍 Téléchargement auto des sources et Javadoc dans IntelliJ
+idea {
+ module {
+ downloadSources = true
+ downloadJavadoc = true
+ }
+}
diff --git a/build/classes/java/main/fr/ultralion/commandify/Commandify$ConsoleColors.class b/build/classes/java/main/fr/ultralion/commandify/Commandify$ConsoleColors.class
new file mode 100644
index 0000000..a546175
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/Commandify$ConsoleColors.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/Commandify$ServerEvents.class b/build/classes/java/main/fr/ultralion/commandify/Commandify$ServerEvents.class
new file mode 100644
index 0000000..3a5bf97
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/Commandify$ServerEvents.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/Commandify.class b/build/classes/java/main/fr/ultralion/commandify/Commandify.class
new file mode 100644
index 0000000..3271305
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/Commandify.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/Config.class b/build/classes/java/main/fr/ultralion/commandify/Config.class
new file mode 100644
index 0000000..664b854
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/Config.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/LateCommandRegister.class b/build/classes/java/main/fr/ultralion/commandify/LateCommandRegister.class
new file mode 100644
index 0000000..27eac22
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/LateCommandRegister.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/admin/CommandInvsee$1$1.class b/build/classes/java/main/fr/ultralion/commandify/commands/admin/CommandInvsee$1$1.class
new file mode 100644
index 0000000..1805347
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/admin/CommandInvsee$1$1.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/admin/CommandInvsee$1.class b/build/classes/java/main/fr/ultralion/commandify/commands/admin/CommandInvsee$1.class
new file mode 100644
index 0000000..65eaef3
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/admin/CommandInvsee$1.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/admin/CommandInvsee.class b/build/classes/java/main/fr/ultralion/commandify/commands/admin/CommandInvsee.class
new file mode 100644
index 0000000..c080610
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/admin/CommandInvsee.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandBroadcast.class b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandBroadcast.class
new file mode 100644
index 0000000..c736439
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandBroadcast.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandIgnore.class b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandIgnore.class
new file mode 100644
index 0000000..64cb115
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandIgnore.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandIgnored.class b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandIgnored.class
new file mode 100644
index 0000000..08a98cc
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandIgnored.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandMsg.class b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandMsg.class
new file mode 100644
index 0000000..e03e8ef
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandMsg.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandReply.class b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandReply.class
new file mode 100644
index 0000000..4ca9917
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandReply.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandUnignore.class b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandUnignore.class
new file mode 100644
index 0000000..d2d5f77
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/chat/CommandUnignore.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/other/CommandCommandifyInfo.class b/build/classes/java/main/fr/ultralion/commandify/commands/other/CommandCommandifyInfo.class
new file mode 100644
index 0000000..4a83b9c
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/other/CommandCommandifyInfo.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/reload/ReloadCommand.class b/build/classes/java/main/fr/ultralion/commandify/commands/reload/ReloadCommand.class
new file mode 100644
index 0000000..6f4ca0d
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/reload/ReloadCommand.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/BackEvents.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/BackEvents.class
new file mode 100644
index 0000000..6209941
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/BackEvents.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/BackManager$BackLocation.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/BackManager$BackLocation.class
new file mode 100644
index 0000000..2b6484a
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/BackManager$BackLocation.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/BackManager.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/BackManager.class
new file mode 100644
index 0000000..afd6119
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/BackManager.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/CommandBack.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/CommandBack.class
new file mode 100644
index 0000000..0c7bd3e
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/back/CommandBack.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandDelHome.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandDelHome.class
new file mode 100644
index 0000000..0510226
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandDelHome.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandHome.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandHome.class
new file mode 100644
index 0000000..6e1debe
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandHome.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandHomes.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandHomes.class
new file mode 100644
index 0000000..bec94ab
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandHomes.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandSetHome.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandSetHome.class
new file mode 100644
index 0000000..87a2a72
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/CommandSetHome.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/HomeData$ConsoleColors.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/HomeData$ConsoleColors.class
new file mode 100644
index 0000000..b089756
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/HomeData$ConsoleColors.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/HomeData$Home.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/HomeData$Home.class
new file mode 100644
index 0000000..5c5111f
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/HomeData$Home.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/HomeData.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/HomeData.class
new file mode 100644
index 0000000..d9cd083
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/homes/HomeData.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/rtp/CommandRtp.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/rtp/CommandRtp.class
new file mode 100644
index 0000000..224eff1
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/rtp/CommandRtp.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/spawn/SetSpawnCommand.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/spawn/SetSpawnCommand.class
new file mode 100644
index 0000000..b987c97
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/spawn/SetSpawnCommand.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/spawn/SpawnCommand.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/spawn/SpawnCommand.class
new file mode 100644
index 0000000..60138d7
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/spawn/SpawnCommand.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/spawn/data/SpawnData.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/spawn/data/SpawnData.class
new file mode 100644
index 0000000..b0f33c8
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/spawn/data/SpawnData.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpa.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpa.class
new file mode 100644
index 0000000..11c9a9d
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpa.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpaccept.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpaccept.class
new file mode 100644
index 0000000..7de7096
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpaccept.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpadeny.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpadeny.class
new file mode 100644
index 0000000..090a3bd
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpadeny.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpahere.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpahere.class
new file mode 100644
index 0000000..ba31166
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpahere.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpatoggle.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpatoggle.class
new file mode 100644
index 0000000..ec96cda
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpatoggle.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/TeleportManager$TpaRequest.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/TeleportManager$TpaRequest.class
new file mode 100644
index 0000000..0a2838f
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/TeleportManager$TpaRequest.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/TeleportManager.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/TeleportManager.class
new file mode 100644
index 0000000..4fb52c5
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/teleport/TeleportManager.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandDelWarp.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandDelWarp.class
new file mode 100644
index 0000000..2607025
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandDelWarp.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandSetWarp.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandSetWarp.class
new file mode 100644
index 0000000..d45b2c3
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandSetWarp.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandWarp.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandWarp.class
new file mode 100644
index 0000000..9623488
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandWarp.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandWarps.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandWarps.class
new file mode 100644
index 0000000..332045a
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/CommandWarps.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/WarpData$ConsoleColors.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/WarpData$ConsoleColors.class
new file mode 100644
index 0000000..3a4b86b
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/WarpData$ConsoleColors.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/WarpData$Warp.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/WarpData$Warp.class
new file mode 100644
index 0000000..a5a1aa4
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/WarpData$Warp.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/WarpData.class b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/WarpData.class
new file mode 100644
index 0000000..6821409
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/teleportation/warps/WarpData.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/commands/worldmanagement/CommandWorld.class b/build/classes/java/main/fr/ultralion/commandify/commands/worldmanagement/CommandWorld.class
new file mode 100644
index 0000000..01907e7
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/commands/worldmanagement/CommandWorld.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/events/ChatFilter.class b/build/classes/java/main/fr/ultralion/commandify/events/ChatFilter.class
new file mode 100644
index 0000000..e04b9f9
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/events/ChatFilter.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/util/ChatManager.class b/build/classes/java/main/fr/ultralion/commandify/util/ChatManager.class
new file mode 100644
index 0000000..921a534
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/util/ChatManager.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/util/IgnoreManager$1.class b/build/classes/java/main/fr/ultralion/commandify/util/IgnoreManager$1.class
new file mode 100644
index 0000000..c511c23
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/util/IgnoreManager$1.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/util/IgnoreManager$ConsoleColors.class b/build/classes/java/main/fr/ultralion/commandify/util/IgnoreManager$ConsoleColors.class
new file mode 100644
index 0000000..d24730b
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/util/IgnoreManager$ConsoleColors.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/util/IgnoreManager.class b/build/classes/java/main/fr/ultralion/commandify/util/IgnoreManager.class
new file mode 100644
index 0000000..97f1737
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/util/IgnoreManager.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/util/Lang$1.class b/build/classes/java/main/fr/ultralion/commandify/util/Lang$1.class
new file mode 100644
index 0000000..5145052
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/util/Lang$1.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/util/Lang$2.class b/build/classes/java/main/fr/ultralion/commandify/util/Lang$2.class
new file mode 100644
index 0000000..7be62f5
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/util/Lang$2.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/util/Lang$ConsoleColors.class b/build/classes/java/main/fr/ultralion/commandify/util/Lang$ConsoleColors.class
new file mode 100644
index 0000000..e1c4c95
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/util/Lang$ConsoleColors.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/util/Lang.class b/build/classes/java/main/fr/ultralion/commandify/util/Lang.class
new file mode 100644
index 0000000..67093e6
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/util/Lang.class differ
diff --git a/build/classes/java/main/fr/ultralion/commandify/util/OtherPlayerInventory.class b/build/classes/java/main/fr/ultralion/commandify/util/OtherPlayerInventory.class
new file mode 100644
index 0000000..5c6ff81
Binary files /dev/null and b/build/classes/java/main/fr/ultralion/commandify/util/OtherPlayerInventory.class differ
diff --git a/build/libs/commandify-1.0.1.jar b/build/libs/commandify-1.0.1.jar
new file mode 100644
index 0000000..d575188
Binary files /dev/null and b/build/libs/commandify-1.0.1.jar differ
diff --git a/build/moddev/artifacts/neoforge-21.1.208-client-extra-aka-minecraft-resources.jar b/build/moddev/artifacts/neoforge-21.1.208-client-extra-aka-minecraft-resources.jar
new file mode 100644
index 0000000..b26c422
Binary files /dev/null and b/build/moddev/artifacts/neoforge-21.1.208-client-extra-aka-minecraft-resources.jar differ
diff --git a/build/moddev/artifacts/neoforge-21.1.208-merged.jar b/build/moddev/artifacts/neoforge-21.1.208-merged.jar
new file mode 100644
index 0000000..236fc87
Binary files /dev/null and b/build/moddev/artifacts/neoforge-21.1.208-merged.jar differ
diff --git a/build/moddev/artifacts/neoforge-21.1.208-sources.jar b/build/moddev/artifacts/neoforge-21.1.208-sources.jar
new file mode 100644
index 0000000..6875e5b
Binary files /dev/null and b/build/moddev/artifacts/neoforge-21.1.208-sources.jar differ
diff --git a/build/moddev/artifacts/neoforge-21.1.208.jar b/build/moddev/artifacts/neoforge-21.1.208.jar
new file mode 100644
index 0000000..721ebdc
Binary files /dev/null and b/build/moddev/artifacts/neoforge-21.1.208.jar differ
diff --git a/build/moddev/clientLegacyClasspath.txt b/build/moddev/clientLegacyClasspath.txt
new file mode 100644
index 0000000..8ef7dfc
--- /dev/null
+++ b/build/moddev/clientLegacyClasspath.txt
@@ -0,0 +1,107 @@
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.electronwill.night-config\core\3.8.3\b442a95f09e349927f5a945ecb594455870fcf4f\core-3.8.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.electronwill.night-config\toml\3.8.3\90b2fd6efcb4a7d5b9810cf78f9d824994d717f2\toml-3.8.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.github.oshi\oshi-core\6.4.10\b1d8ab82d11d92fd639b56d639f8f46f739dd5fa\oshi-core-6.4.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.code.findbugs\jsr305\3.0.2\25ea2e8b0c338a877313bd4672d3fe056ea78f0d\jsr305-3.0.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.code.gson\gson\2.10.1\b3add478d4382b78ea20b1671390a858002feb6c\gson-2.10.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.errorprone\error_prone_annotations\2.18.0\89b684257096f548fa39a7df9fdaa409d4d4df91\error_prone_annotations-2.18.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\failureaccess\1.0.1\1dcf1de382a0bf95a3d8b0849546c88bac1292c9\failureaccess-1.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\guava\32.1.2-jre\5e64ec7e056456bef3a4bc4c6fdaef71e8ab6318\guava-32.1.2-jre.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\b421526c5f297295adef1c886e5246c39d4ac629\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.j2objc\j2objc-annotations\2.8\c85270e307e7b822f1086b93689124b89768e273\j2objc-annotations-2.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.ibm.icu\icu4j\73.2\61ad4ef7f9131fcf6d25c34b817f90d6da06c9e9\icu4j-73.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.machinezoo.noexception\noexception\1.7.1\b65330c98e38a1f915fa54a6e5eca496505e3f0a\noexception-1.7.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\authlib\6.0.54\de8bc95660e1b2fe8793fd427a7a10dcec5b3ea7\authlib-6.0.54.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\blocklist\1.0.10\5c685c5ffa94c4cd39496c7184c1d122e515ecef\blocklist-1.0.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\brigadier\1.3.10\d15b53a14cf20fdcaa98f731af5dda654452c010\brigadier-1.3.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\datafixerupper\8.0.16\67d4de6d7f95d89bcf5862995fb854ebaec02a34\datafixerupper-8.0.16.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\logging\1.2.7\24cb95ffb0e3433fd6e844c04e68009e504ca1c0\logging-1.2.7.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\patchy\2.2.10\da05971b07cbb379d002cf7eaec6a2048211fefc\patchy-2.2.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\text2speech\1.17.9\3cad216e3a7f0c19b4b394388bc9ffc446f13b14\text2speech-1.17.9.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\commons-codec\commons-codec\1.16.0\4e3eb3d79888d76b54e28b350915b5dc3919c9de\commons-codec-1.16.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\commons-io\commons-io\2.15.1\f11560da189ab563a5c8e351941415430e9304ea\commons-io-2.15.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\commons-logging\commons-logging\1.2\4bfc12adfe4842bf07b657f0369c4cb522955686\commons-logging-1.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\bootstraplauncher\2.0.2\1a2d076cbc33b0520cbacd591224427b2a20047d\bootstraplauncher-2.0.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\modlauncher\11.0.5\b8f0d49294f733fdb6173931b263553e943dc950\modlauncher-11.0.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\securejarhandler\3.0.8\c0ef95cecd8699a0449053ac7d9c160748d902cd\securejarhandler-3.0.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-buffer\4.1.97.Final\f8f3d8644afa5e6e1a40a3a6aeb9d9aa970ecb4f\netty-buffer-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-codec\4.1.97.Final\384ba4d75670befbedb45c4d3b497a93639c206d\netty-codec-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-common\4.1.97.Final\7cceacaf11df8dc63f23d0fb58e9d4640fc88404\netty-common-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-handler\4.1.97.Final\abb86c6906bf512bf2b797a41cd7d2e8d3cd7c36\netty-handler-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-resolver\4.1.97.Final\cec8348108dc76c47cf87c669d514be52c922144\netty-resolver-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-classes-epoll\4.1.97.Final\795da37ded759e862457a82d9d92c4d39ce8ecee\netty-transport-classes-epoll-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-native-unix-common\4.1.97.Final\d469d84265ab70095b01b40886cabdd433b6e664\netty-transport-native-unix-common-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport\4.1.97.Final\f37380d23c9bb079bc702910833b2fd532c9abd0\netty-transport-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\it.unimi.dsi\fastutil\8.5.12\c24946d46824bd528054bface3231d2ecb7e95e8\fastutil-8.5.12.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.fabricmc\sponge-mixin\0.15.2+mixin.0.8.7\2af2f021d8e02a0220dc27a7a72b4666d66d44ca\sponge-mixin-0.15.2+mixin.0.8.7.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.java.dev.jna\jna-platform\5.14.0\28934d48aed814f11e4c584da55c49fa7032b31b\jna-platform-5.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.java.dev.jna\jna\5.14.0\67bf3eaea4f0718cb376a181a629e5f88fa1c9dd\jna-5.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.jodah\typetools\0.6.3\a01aaa6ddaea9ec07ec4f209487b7a46a526283a\typetools-0.6.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.minecraftforge\srgutils\0.4.15\ca408b131759478f164e010fae0d73997e125fb5\srgutils-0.4.15.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.minecrell\terminalconsoleappender\1.3.0\b562e9bb61235c9520e26282cdee71f8f802d1fc\terminalconsoleappender-1.3.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.accesstransformers\at-modlauncher\10.0.1\5aba50202aceead086bc09fbc2751c9f05cb4890\at-modlauncher-10.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.fancymodloader\earlydisplay\4.0.41\53dfbd387ed1b88c7d144bdb6551b7f57d5da6d7\earlydisplay-4.0.41.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.fancymodloader\loader\4.0.41\3aebc81b9347fa87bb629ffaed20276f2a4c944e\loader-4.0.41.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarFileSystems\0.4.1\78f59f89defcd032ed788b151ca6a0d40ace796a\JarJarFileSystems-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarMetadata\0.4.1\f8da03683dc81694556dc3e177c5e3bb77ae6fcb\JarJarMetadata-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarSelector\0.4.1\fb3cc7a58af22ad2880adb98af6d518128c47dae\JarJarSelector-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\accesstransformers\10.0.1\fd83b5725f76eae9115e9355fa1c456a6a441400\accesstransformers-10.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\bus\8.0.5\5b2d33285ab5d1554e9798ad98c40d6ea3868bd5\bus-8.0.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\coremods\7.0.3\9147e6f638b4272b3bd5fc8f92ad37802512c6c\coremods-7.0.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\mergetool\2.0.0\52fe1949be64e3303aabaaa21e315f551db9c9f4\mergetool-2.0.0-api.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.sf.jopt-simple\jopt-simple\5.0.4\4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c\jopt-simple-5.0.4.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.antlr\antlr4-runtime\4.13.1\17125bae1d965624e265ef49552f6465a2bfa307\antlr4-runtime-4.13.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.commons\commons-compress\1.26.0\659feffdd12280201c8aacb8f7be94f9a883c824\commons-compress-1.26.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.commons\commons-lang3\3.14.0\1ed471194b02f2c6cb734a0cd6f6f107c673afae\commons-lang3-3.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.httpcomponents\httpclient\4.5.13\e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada\httpclient-4.5.13.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.httpcomponents\httpcore\4.4.16\51cf043c87253c9f58b539c9f7e44c8894223850\httpcore-4.4.16.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.22.1\bea6fede6328fabafd7e68363161a7ea6605abd1\log4j-api-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-core\2.22.1\7183a25510a02ad00cc6a95d3b3d2a7d3c5a8dc4\log4j-core-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-slf4j2-impl\2.22.1\d7e6693c2606cb7e7335047d7bb96dec52db5665\log4j-slf4j2-impl-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.maven\maven-artifact\3.8.5\4433f50c07debefaed0553bd0068f4f48d449313\maven-artifact-3.8.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.checkerframework\checker-qual\3.33.0\de2b60b62da487644fc11f734e73c8b0b431238f\checker-qual-3.33.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.codehaus.plexus\plexus-utils\3.3.0\cf43b5391de623b36fe066a21127baef82c64022\plexus-utils-3.3.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.jcraft\jorbis\0.0.17\8872d22b293e8f5d7d56ff92be966e6dc28ebdc6\jorbis-0.0.17.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.jline\jline-reader\3.20.0\8f15415b022a25b473e8e16c28ae913186ffb9c4\jline-reader-3.20.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.jline\jline-terminal\3.20.0\d0ddcc708ddf527a3454c941b7b9225cc83a15ff\jline-terminal-3.20.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.joml\joml\1.10.5\22566d58af70ad3d72308bab63b8339906deb649\joml-1.10.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-freetype\3.3.3\15a8c1de7f51d07a92eae7ce1222557073a0c0c3\lwjgl-freetype-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-freetype\3.3.3\81091b006dbb43fab04c8c638e9ac87c51b4096d\lwjgl-freetype-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-freetype\3.3.3\82028265a0a2ff33523ca75137ada7dc176e5210\lwjgl-freetype-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-freetype\3.3.3\a0db6c84a8becc8ca05f9dbfa985edc348a824c7\lwjgl-freetype-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.3\32334f3fd5270a59bad9939a93115acb6de36dcf\lwjgl-glfw-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.3\e449e28b4891fc423c54c85fbc5bb0b9efece67a\lwjgl-glfw-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.3\efa1eb78c5ccd840e9f329717109b5e892d72f8e\lwjgl-glfw-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.3\f27018dc74f6289574502b46cce55d52817554e2\lwjgl-glfw-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.3\426222fc027602a5f21b9c0fe79cde6a4c7a011f\lwjgl-jemalloc-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.3\b543467b7ff3c6920539a88ee602d34098628be5\lwjgl-jemalloc-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.3\ba1f3fed0ee4be0217eaa41c5bbfb4b9b1383c33\lwjgl-jemalloc-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.3\f6063b6e0f23be483c5c88d84ce51b39dc69126c\lwjgl-jemalloc-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.3\87b8d5050e3adb46bb58fe1cb2669a4a48fce10d\lwjgl-openal-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.3\8e0615235116b9e4160dfe87bec90f5f6378bf72\lwjgl-openal-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.3\cf83862ae95d98496b26915024c7e666d8ab1c8f\lwjgl-openal-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.3\daada81ceb5fc0c291fbfdd4433cb8d9423577f2\lwjgl-openal-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.3\2f6b0147078396a58979125a4c947664e98293a\lwjgl-opengl-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.3\65e956d3735a1abdc82eff4baec1b61174697d4b\lwjgl-opengl-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.3\d32d833dcaa2f355a886eaf21f0408b5f03241d\lwjgl-opengl-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.3\e6c1eec8be8a71951b830a4d69efc01c6531900c\lwjgl-opengl-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.3\1d9facdf6541de114b0f963be33505b7679c78cb\lwjgl-stb-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.3\25dd6161988d7e65f71d5065c99902402ee32746\lwjgl-stb-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.3\a584ab44de569708871f0a79561f4d8c37487f2c\lwjgl-stb-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.3\b5c874687b9aac1a936501d4ed2c49567fd1b575\lwjgl-stb-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.3\82d755ca94b102e9ca77283b9e2dc46d1b15fbe5\lwjgl-tinyfd-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.3\a6697981b0449a5087c1d546fc08b4f73e8f98c9\lwjgl-tinyfd-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.3\a88c494f3006eb91a7433b12a3a55a9a6c20788b\lwjgl-tinyfd-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.3\c336c84ee88cccb495c6ffa112395509e7378e8a\lwjgl-tinyfd-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.3\29589b5f87ed335a6c7e7ee6a5775f81f97ecb84\lwjgl-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.3\9e670718e050aeaeea0c2d5b907cffb142f2e58f\lwjgl-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.3\a5ed18a2b82fc91b81f40d717cb1f64c9dcb0540\lwjgl-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.3\e9aca8c5479b520a2a7f0d542a118140e812c5e8\lwjgl-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lz4\lz4-java\1.8.0\4b986a99445e49ea5fbf5d149c4b63f6ed6c6780\lz4-java-1.8.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.openjdk.nashorn\nashorn-core\15.4\f67f5ffaa5f5130cf6fb9b133da00c7df3b532a5\nashorn-core-15.4.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-analysis\9.8\b9747a320844b6cb1eacd90d8ecfd260a16c01d3\asm-analysis-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-commons\9.8\36e4d212970388e5bd2c5180292012502df461bb\asm-commons-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-tree\9.8\18419ca5b77a2f81097c741e7872e6ab8d2f40d\asm-tree-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-util\9.8\395f1c1f035258511f27bc9b2583d76e4b143f59\asm-util-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.8\dc19ecb3f7889b7860697215cae99c0f9b6f6b4b\asm-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\2.0.9\7cf2726fdcfbc8610f9a71fb3ed639871f315340\slf4j-api-2.0.9.jar
+F:\java\mods\neoforge\1.21.1\commandify\build\moddev\artifacts\neoforge-21.1.208-client-extra-aka-minecraft-resources.jar
diff --git a/build/moddev/clientLog4j2.xml b/build/moddev/clientLog4j2.xml
new file mode 100644
index 0000000..773e88a
--- /dev/null
+++ b/build/moddev/clientLog4j2.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/moddev/clientRunProgramArgs.txt b/build/moddev/clientRunProgramArgs.txt
new file mode 100644
index 0000000..a2f0bf2
--- /dev/null
+++ b/build/moddev/clientRunProgramArgs.txt
@@ -0,0 +1,24 @@
+# Main Class
+cpw.mods.bootstraplauncher.BootstrapLauncher
+
+# NeoForge Run-Type Program Arguments
+--launchTarget
+forgeclientdev
+--version
+21.1.208
+--assetIndex
+17
+--assetsDir
+C:\\Users\\jessy\\.gradle\\caches\\neoformruntime\\assets
+--gameDir
+.
+--fml.fmlVersion
+4.0.41
+--fml.mcVersion
+1.21.1
+--fml.neoForgeVersion
+21.1.208
+--fml.neoFormVersion
+20240808.144430
+
+# User Supplied Program Arguments
\ No newline at end of file
diff --git a/build/moddev/clientRunVmArgs.txt b/build/moddev/clientRunVmArgs.txt
new file mode 100644
index 0000000..a59dcda
--- /dev/null
+++ b/build/moddev/clientRunVmArgs.txt
@@ -0,0 +1,19 @@
+-p
+C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\JarJarFileSystems\\0.4.1\\78f59f89defcd032ed788b151ca6a0d40ace796a\\JarJarFileSystems-0.4.1.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\bootstraplauncher\\2.0.2\\1a2d076cbc33b0520cbacd591224427b2a20047d\\bootstraplauncher-2.0.2.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\securejarhandler\\3.0.8\\c0ef95cecd8699a0449053ac7d9c160748d902cd\\securejarhandler-3.0.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-commons\\9.8\\36e4d212970388e5bd2c5180292012502df461bb\\asm-commons-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-util\\9.8\\395f1c1f035258511f27bc9b2583d76e4b143f59\\asm-util-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-analysis\\9.8\\b9747a320844b6cb1eacd90d8ecfd260a16c01d3\\asm-analysis-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-tree\\9.8\\18419ca5b77a2f81097c741e7872e6ab8d2f40d\\asm-tree-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm\\9.8\\dc19ecb3f7889b7860697215cae99c0f9b6f6b4b\\asm-9.8.jar
+--add-modules
+ALL-MODULE-PATH
+--add-opens
+java.base/java.util.jar=cpw.mods.securejarhandler
+--add-opens
+java.base/java.lang.invoke=cpw.mods.securejarhandler
+--add-exports
+java.base/sun.security.util=cpw.mods.securejarhandler
+--add-exports
+jdk.naming.dns/com.sun.jndi.dns=java.naming
+-Dlog4j2.configurationFile=F:\\java\\mods\\neoforge\\1.21.1\\commandify\\build\\moddev\\clientLog4j2.xml
+-Djava.net.preferIPv6Addresses=system
+-DignoreList=mixinextras-neoforge-0.5.0.jar,client-extra,neoforge-
+-DlegacyClassPath.file=F:\\java\\mods\\neoforge\\1.21.1\\commandify\\build\\moddev\\clientLegacyClasspath.txt
+-Dneoforge.enableGameTest=true
+-Dneoforge.enabledGameTestNamespaces=commandify
+-Dforge.logging.markers=REGISTRIES
\ No newline at end of file
diff --git a/build/moddev/dataLegacyClasspath.txt b/build/moddev/dataLegacyClasspath.txt
new file mode 100644
index 0000000..8ef7dfc
--- /dev/null
+++ b/build/moddev/dataLegacyClasspath.txt
@@ -0,0 +1,107 @@
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.electronwill.night-config\core\3.8.3\b442a95f09e349927f5a945ecb594455870fcf4f\core-3.8.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.electronwill.night-config\toml\3.8.3\90b2fd6efcb4a7d5b9810cf78f9d824994d717f2\toml-3.8.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.github.oshi\oshi-core\6.4.10\b1d8ab82d11d92fd639b56d639f8f46f739dd5fa\oshi-core-6.4.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.code.findbugs\jsr305\3.0.2\25ea2e8b0c338a877313bd4672d3fe056ea78f0d\jsr305-3.0.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.code.gson\gson\2.10.1\b3add478d4382b78ea20b1671390a858002feb6c\gson-2.10.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.errorprone\error_prone_annotations\2.18.0\89b684257096f548fa39a7df9fdaa409d4d4df91\error_prone_annotations-2.18.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\failureaccess\1.0.1\1dcf1de382a0bf95a3d8b0849546c88bac1292c9\failureaccess-1.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\guava\32.1.2-jre\5e64ec7e056456bef3a4bc4c6fdaef71e8ab6318\guava-32.1.2-jre.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\b421526c5f297295adef1c886e5246c39d4ac629\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.j2objc\j2objc-annotations\2.8\c85270e307e7b822f1086b93689124b89768e273\j2objc-annotations-2.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.ibm.icu\icu4j\73.2\61ad4ef7f9131fcf6d25c34b817f90d6da06c9e9\icu4j-73.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.machinezoo.noexception\noexception\1.7.1\b65330c98e38a1f915fa54a6e5eca496505e3f0a\noexception-1.7.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\authlib\6.0.54\de8bc95660e1b2fe8793fd427a7a10dcec5b3ea7\authlib-6.0.54.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\blocklist\1.0.10\5c685c5ffa94c4cd39496c7184c1d122e515ecef\blocklist-1.0.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\brigadier\1.3.10\d15b53a14cf20fdcaa98f731af5dda654452c010\brigadier-1.3.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\datafixerupper\8.0.16\67d4de6d7f95d89bcf5862995fb854ebaec02a34\datafixerupper-8.0.16.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\logging\1.2.7\24cb95ffb0e3433fd6e844c04e68009e504ca1c0\logging-1.2.7.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\patchy\2.2.10\da05971b07cbb379d002cf7eaec6a2048211fefc\patchy-2.2.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\text2speech\1.17.9\3cad216e3a7f0c19b4b394388bc9ffc446f13b14\text2speech-1.17.9.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\commons-codec\commons-codec\1.16.0\4e3eb3d79888d76b54e28b350915b5dc3919c9de\commons-codec-1.16.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\commons-io\commons-io\2.15.1\f11560da189ab563a5c8e351941415430e9304ea\commons-io-2.15.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\commons-logging\commons-logging\1.2\4bfc12adfe4842bf07b657f0369c4cb522955686\commons-logging-1.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\bootstraplauncher\2.0.2\1a2d076cbc33b0520cbacd591224427b2a20047d\bootstraplauncher-2.0.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\modlauncher\11.0.5\b8f0d49294f733fdb6173931b263553e943dc950\modlauncher-11.0.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\securejarhandler\3.0.8\c0ef95cecd8699a0449053ac7d9c160748d902cd\securejarhandler-3.0.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-buffer\4.1.97.Final\f8f3d8644afa5e6e1a40a3a6aeb9d9aa970ecb4f\netty-buffer-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-codec\4.1.97.Final\384ba4d75670befbedb45c4d3b497a93639c206d\netty-codec-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-common\4.1.97.Final\7cceacaf11df8dc63f23d0fb58e9d4640fc88404\netty-common-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-handler\4.1.97.Final\abb86c6906bf512bf2b797a41cd7d2e8d3cd7c36\netty-handler-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-resolver\4.1.97.Final\cec8348108dc76c47cf87c669d514be52c922144\netty-resolver-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-classes-epoll\4.1.97.Final\795da37ded759e862457a82d9d92c4d39ce8ecee\netty-transport-classes-epoll-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-native-unix-common\4.1.97.Final\d469d84265ab70095b01b40886cabdd433b6e664\netty-transport-native-unix-common-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport\4.1.97.Final\f37380d23c9bb079bc702910833b2fd532c9abd0\netty-transport-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\it.unimi.dsi\fastutil\8.5.12\c24946d46824bd528054bface3231d2ecb7e95e8\fastutil-8.5.12.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.fabricmc\sponge-mixin\0.15.2+mixin.0.8.7\2af2f021d8e02a0220dc27a7a72b4666d66d44ca\sponge-mixin-0.15.2+mixin.0.8.7.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.java.dev.jna\jna-platform\5.14.0\28934d48aed814f11e4c584da55c49fa7032b31b\jna-platform-5.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.java.dev.jna\jna\5.14.0\67bf3eaea4f0718cb376a181a629e5f88fa1c9dd\jna-5.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.jodah\typetools\0.6.3\a01aaa6ddaea9ec07ec4f209487b7a46a526283a\typetools-0.6.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.minecraftforge\srgutils\0.4.15\ca408b131759478f164e010fae0d73997e125fb5\srgutils-0.4.15.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.minecrell\terminalconsoleappender\1.3.0\b562e9bb61235c9520e26282cdee71f8f802d1fc\terminalconsoleappender-1.3.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.accesstransformers\at-modlauncher\10.0.1\5aba50202aceead086bc09fbc2751c9f05cb4890\at-modlauncher-10.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.fancymodloader\earlydisplay\4.0.41\53dfbd387ed1b88c7d144bdb6551b7f57d5da6d7\earlydisplay-4.0.41.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.fancymodloader\loader\4.0.41\3aebc81b9347fa87bb629ffaed20276f2a4c944e\loader-4.0.41.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarFileSystems\0.4.1\78f59f89defcd032ed788b151ca6a0d40ace796a\JarJarFileSystems-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarMetadata\0.4.1\f8da03683dc81694556dc3e177c5e3bb77ae6fcb\JarJarMetadata-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarSelector\0.4.1\fb3cc7a58af22ad2880adb98af6d518128c47dae\JarJarSelector-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\accesstransformers\10.0.1\fd83b5725f76eae9115e9355fa1c456a6a441400\accesstransformers-10.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\bus\8.0.5\5b2d33285ab5d1554e9798ad98c40d6ea3868bd5\bus-8.0.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\coremods\7.0.3\9147e6f638b4272b3bd5fc8f92ad37802512c6c\coremods-7.0.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\mergetool\2.0.0\52fe1949be64e3303aabaaa21e315f551db9c9f4\mergetool-2.0.0-api.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.sf.jopt-simple\jopt-simple\5.0.4\4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c\jopt-simple-5.0.4.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.antlr\antlr4-runtime\4.13.1\17125bae1d965624e265ef49552f6465a2bfa307\antlr4-runtime-4.13.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.commons\commons-compress\1.26.0\659feffdd12280201c8aacb8f7be94f9a883c824\commons-compress-1.26.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.commons\commons-lang3\3.14.0\1ed471194b02f2c6cb734a0cd6f6f107c673afae\commons-lang3-3.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.httpcomponents\httpclient\4.5.13\e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada\httpclient-4.5.13.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.httpcomponents\httpcore\4.4.16\51cf043c87253c9f58b539c9f7e44c8894223850\httpcore-4.4.16.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.22.1\bea6fede6328fabafd7e68363161a7ea6605abd1\log4j-api-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-core\2.22.1\7183a25510a02ad00cc6a95d3b3d2a7d3c5a8dc4\log4j-core-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-slf4j2-impl\2.22.1\d7e6693c2606cb7e7335047d7bb96dec52db5665\log4j-slf4j2-impl-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.maven\maven-artifact\3.8.5\4433f50c07debefaed0553bd0068f4f48d449313\maven-artifact-3.8.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.checkerframework\checker-qual\3.33.0\de2b60b62da487644fc11f734e73c8b0b431238f\checker-qual-3.33.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.codehaus.plexus\plexus-utils\3.3.0\cf43b5391de623b36fe066a21127baef82c64022\plexus-utils-3.3.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.jcraft\jorbis\0.0.17\8872d22b293e8f5d7d56ff92be966e6dc28ebdc6\jorbis-0.0.17.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.jline\jline-reader\3.20.0\8f15415b022a25b473e8e16c28ae913186ffb9c4\jline-reader-3.20.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.jline\jline-terminal\3.20.0\d0ddcc708ddf527a3454c941b7b9225cc83a15ff\jline-terminal-3.20.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.joml\joml\1.10.5\22566d58af70ad3d72308bab63b8339906deb649\joml-1.10.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-freetype\3.3.3\15a8c1de7f51d07a92eae7ce1222557073a0c0c3\lwjgl-freetype-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-freetype\3.3.3\81091b006dbb43fab04c8c638e9ac87c51b4096d\lwjgl-freetype-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-freetype\3.3.3\82028265a0a2ff33523ca75137ada7dc176e5210\lwjgl-freetype-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-freetype\3.3.3\a0db6c84a8becc8ca05f9dbfa985edc348a824c7\lwjgl-freetype-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.3\32334f3fd5270a59bad9939a93115acb6de36dcf\lwjgl-glfw-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.3\e449e28b4891fc423c54c85fbc5bb0b9efece67a\lwjgl-glfw-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.3\efa1eb78c5ccd840e9f329717109b5e892d72f8e\lwjgl-glfw-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-glfw\3.3.3\f27018dc74f6289574502b46cce55d52817554e2\lwjgl-glfw-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.3\426222fc027602a5f21b9c0fe79cde6a4c7a011f\lwjgl-jemalloc-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.3\b543467b7ff3c6920539a88ee602d34098628be5\lwjgl-jemalloc-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.3\ba1f3fed0ee4be0217eaa41c5bbfb4b9b1383c33\lwjgl-jemalloc-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-jemalloc\3.3.3\f6063b6e0f23be483c5c88d84ce51b39dc69126c\lwjgl-jemalloc-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.3\87b8d5050e3adb46bb58fe1cb2669a4a48fce10d\lwjgl-openal-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.3\8e0615235116b9e4160dfe87bec90f5f6378bf72\lwjgl-openal-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.3\cf83862ae95d98496b26915024c7e666d8ab1c8f\lwjgl-openal-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-openal\3.3.3\daada81ceb5fc0c291fbfdd4433cb8d9423577f2\lwjgl-openal-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.3\2f6b0147078396a58979125a4c947664e98293a\lwjgl-opengl-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.3\65e956d3735a1abdc82eff4baec1b61174697d4b\lwjgl-opengl-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.3\d32d833dcaa2f355a886eaf21f0408b5f03241d\lwjgl-opengl-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-opengl\3.3.3\e6c1eec8be8a71951b830a4d69efc01c6531900c\lwjgl-opengl-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.3\1d9facdf6541de114b0f963be33505b7679c78cb\lwjgl-stb-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.3\25dd6161988d7e65f71d5065c99902402ee32746\lwjgl-stb-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.3\a584ab44de569708871f0a79561f4d8c37487f2c\lwjgl-stb-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-stb\3.3.3\b5c874687b9aac1a936501d4ed2c49567fd1b575\lwjgl-stb-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.3\82d755ca94b102e9ca77283b9e2dc46d1b15fbe5\lwjgl-tinyfd-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.3\a6697981b0449a5087c1d546fc08b4f73e8f98c9\lwjgl-tinyfd-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.3\a88c494f3006eb91a7433b12a3a55a9a6c20788b\lwjgl-tinyfd-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl-tinyfd\3.3.3\c336c84ee88cccb495c6ffa112395509e7378e8a\lwjgl-tinyfd-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.3\29589b5f87ed335a6c7e7ee6a5775f81f97ecb84\lwjgl-3.3.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.3\9e670718e050aeaeea0c2d5b907cffb142f2e58f\lwjgl-3.3.3-natives-windows-x86.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.3\a5ed18a2b82fc91b81f40d717cb1f64c9dcb0540\lwjgl-3.3.3-natives-windows.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lwjgl\lwjgl\3.3.3\e9aca8c5479b520a2a7f0d542a118140e812c5e8\lwjgl-3.3.3-natives-windows-arm64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lz4\lz4-java\1.8.0\4b986a99445e49ea5fbf5d149c4b63f6ed6c6780\lz4-java-1.8.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.openjdk.nashorn\nashorn-core\15.4\f67f5ffaa5f5130cf6fb9b133da00c7df3b532a5\nashorn-core-15.4.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-analysis\9.8\b9747a320844b6cb1eacd90d8ecfd260a16c01d3\asm-analysis-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-commons\9.8\36e4d212970388e5bd2c5180292012502df461bb\asm-commons-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-tree\9.8\18419ca5b77a2f81097c741e7872e6ab8d2f40d\asm-tree-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-util\9.8\395f1c1f035258511f27bc9b2583d76e4b143f59\asm-util-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.8\dc19ecb3f7889b7860697215cae99c0f9b6f6b4b\asm-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\2.0.9\7cf2726fdcfbc8610f9a71fb3ed639871f315340\slf4j-api-2.0.9.jar
+F:\java\mods\neoforge\1.21.1\commandify\build\moddev\artifacts\neoforge-21.1.208-client-extra-aka-minecraft-resources.jar
diff --git a/build/moddev/dataLog4j2.xml b/build/moddev/dataLog4j2.xml
new file mode 100644
index 0000000..773e88a
--- /dev/null
+++ b/build/moddev/dataLog4j2.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/moddev/dataRunProgramArgs.txt b/build/moddev/dataRunProgramArgs.txt
new file mode 100644
index 0000000..9af0b84
--- /dev/null
+++ b/build/moddev/dataRunProgramArgs.txt
@@ -0,0 +1,29 @@
+# Main Class
+cpw.mods.bootstraplauncher.BootstrapLauncher
+
+# NeoForge Run-Type Program Arguments
+--launchTarget
+forgedatadev
+--assetIndex
+17
+--assetsDir
+C:\\Users\\jessy\\.gradle\\caches\\neoformruntime\\assets
+--gameDir
+.
+--fml.fmlVersion
+4.0.41
+--fml.mcVersion
+1.21.1
+--fml.neoForgeVersion
+21.1.208
+--fml.neoFormVersion
+20240808.144430
+
+# User Supplied Program Arguments
+--mod
+commandify
+--all
+--output
+F:\\java\\mods\\neoforge\\1.21.1\\commandify\\src\\generated\\resources
+--existing
+F:\\java\\mods\\neoforge\\1.21.1\\commandify\\src\\main\\resources
\ No newline at end of file
diff --git a/build/moddev/dataRunVmArgs.txt b/build/moddev/dataRunVmArgs.txt
new file mode 100644
index 0000000..08f5c33
--- /dev/null
+++ b/build/moddev/dataRunVmArgs.txt
@@ -0,0 +1,17 @@
+-p
+C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\JarJarFileSystems\\0.4.1\\78f59f89defcd032ed788b151ca6a0d40ace796a\\JarJarFileSystems-0.4.1.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\bootstraplauncher\\2.0.2\\1a2d076cbc33b0520cbacd591224427b2a20047d\\bootstraplauncher-2.0.2.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\securejarhandler\\3.0.8\\c0ef95cecd8699a0449053ac7d9c160748d902cd\\securejarhandler-3.0.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-commons\\9.8\\36e4d212970388e5bd2c5180292012502df461bb\\asm-commons-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-util\\9.8\\395f1c1f035258511f27bc9b2583d76e4b143f59\\asm-util-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-analysis\\9.8\\b9747a320844b6cb1eacd90d8ecfd260a16c01d3\\asm-analysis-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-tree\\9.8\\18419ca5b77a2f81097c741e7872e6ab8d2f40d\\asm-tree-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm\\9.8\\dc19ecb3f7889b7860697215cae99c0f9b6f6b4b\\asm-9.8.jar
+--add-modules
+ALL-MODULE-PATH
+--add-opens
+java.base/java.util.jar=cpw.mods.securejarhandler
+--add-opens
+java.base/java.lang.invoke=cpw.mods.securejarhandler
+--add-exports
+java.base/sun.security.util=cpw.mods.securejarhandler
+--add-exports
+jdk.naming.dns/com.sun.jndi.dns=java.naming
+-Dlog4j2.configurationFile=F:\\java\\mods\\neoforge\\1.21.1\\commandify\\build\\moddev\\dataLog4j2.xml
+-Djava.net.preferIPv6Addresses=system
+-DignoreList=mixinextras-neoforge-0.5.0.jar,client-extra,neoforge-
+-DlegacyClassPath.file=F:\\java\\mods\\neoforge\\1.21.1\\commandify\\build\\moddev\\dataLegacyClasspath.txt
+-Dforge.logging.markers=REGISTRIES
\ No newline at end of file
diff --git a/build/moddev/gameTestServerLegacyClasspath.txt b/build/moddev/gameTestServerLegacyClasspath.txt
new file mode 100644
index 0000000..9ab7b45
--- /dev/null
+++ b/build/moddev/gameTestServerLegacyClasspath.txt
@@ -0,0 +1,67 @@
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.electronwill.night-config\core\3.8.3\b442a95f09e349927f5a945ecb594455870fcf4f\core-3.8.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.electronwill.night-config\toml\3.8.3\90b2fd6efcb4a7d5b9810cf78f9d824994d717f2\toml-3.8.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.github.oshi\oshi-core\6.4.10\b1d8ab82d11d92fd639b56d639f8f46f739dd5fa\oshi-core-6.4.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.code.findbugs\jsr305\3.0.2\25ea2e8b0c338a877313bd4672d3fe056ea78f0d\jsr305-3.0.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.code.gson\gson\2.10.1\b3add478d4382b78ea20b1671390a858002feb6c\gson-2.10.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.errorprone\error_prone_annotations\2.18.0\89b684257096f548fa39a7df9fdaa409d4d4df91\error_prone_annotations-2.18.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\failureaccess\1.0.1\1dcf1de382a0bf95a3d8b0849546c88bac1292c9\failureaccess-1.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\guava\32.1.2-jre\5e64ec7e056456bef3a4bc4c6fdaef71e8ab6318\guava-32.1.2-jre.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\b421526c5f297295adef1c886e5246c39d4ac629\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.j2objc\j2objc-annotations\2.8\c85270e307e7b822f1086b93689124b89768e273\j2objc-annotations-2.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.machinezoo.noexception\noexception\1.7.1\b65330c98e38a1f915fa54a6e5eca496505e3f0a\noexception-1.7.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\authlib\6.0.54\de8bc95660e1b2fe8793fd427a7a10dcec5b3ea7\authlib-6.0.54.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\brigadier\1.3.10\d15b53a14cf20fdcaa98f731af5dda654452c010\brigadier-1.3.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\datafixerupper\8.0.16\67d4de6d7f95d89bcf5862995fb854ebaec02a34\datafixerupper-8.0.16.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\logging\1.2.7\24cb95ffb0e3433fd6e844c04e68009e504ca1c0\logging-1.2.7.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\commons-io\commons-io\2.15.1\f11560da189ab563a5c8e351941415430e9304ea\commons-io-2.15.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\bootstraplauncher\2.0.2\1a2d076cbc33b0520cbacd591224427b2a20047d\bootstraplauncher-2.0.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\modlauncher\11.0.5\b8f0d49294f733fdb6173931b263553e943dc950\modlauncher-11.0.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\securejarhandler\3.0.8\c0ef95cecd8699a0449053ac7d9c160748d902cd\securejarhandler-3.0.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-buffer\4.1.97.Final\f8f3d8644afa5e6e1a40a3a6aeb9d9aa970ecb4f\netty-buffer-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-codec\4.1.97.Final\384ba4d75670befbedb45c4d3b497a93639c206d\netty-codec-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-common\4.1.97.Final\7cceacaf11df8dc63f23d0fb58e9d4640fc88404\netty-common-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-handler\4.1.97.Final\abb86c6906bf512bf2b797a41cd7d2e8d3cd7c36\netty-handler-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-resolver\4.1.97.Final\cec8348108dc76c47cf87c669d514be52c922144\netty-resolver-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-classes-epoll\4.1.97.Final\795da37ded759e862457a82d9d92c4d39ce8ecee\netty-transport-classes-epoll-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-native-epoll\4.1.97.Final\54188f271e388e7f313aea995e82f58ce2cdb809\netty-transport-native-epoll-4.1.97.Final-linux-x86_64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-native-epoll\4.1.97.Final\5514744c588190ffda076b35a9b8c9f24946a960\netty-transport-native-epoll-4.1.97.Final-linux-aarch_64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-native-unix-common\4.1.97.Final\d469d84265ab70095b01b40886cabdd433b6e664\netty-transport-native-unix-common-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport\4.1.97.Final\f37380d23c9bb079bc702910833b2fd532c9abd0\netty-transport-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\it.unimi.dsi\fastutil\8.5.12\c24946d46824bd528054bface3231d2ecb7e95e8\fastutil-8.5.12.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.fabricmc\sponge-mixin\0.15.2+mixin.0.8.7\2af2f021d8e02a0220dc27a7a72b4666d66d44ca\sponge-mixin-0.15.2+mixin.0.8.7.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.java.dev.jna\jna-platform\5.14.0\28934d48aed814f11e4c584da55c49fa7032b31b\jna-platform-5.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.java.dev.jna\jna\5.14.0\67bf3eaea4f0718cb376a181a629e5f88fa1c9dd\jna-5.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.jodah\typetools\0.6.3\a01aaa6ddaea9ec07ec4f209487b7a46a526283a\typetools-0.6.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.minecraftforge\srgutils\0.4.15\ca408b131759478f164e010fae0d73997e125fb5\srgutils-0.4.15.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.minecrell\terminalconsoleappender\1.3.0\b562e9bb61235c9520e26282cdee71f8f802d1fc\terminalconsoleappender-1.3.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.accesstransformers\at-modlauncher\10.0.1\5aba50202aceead086bc09fbc2751c9f05cb4890\at-modlauncher-10.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.fancymodloader\earlydisplay\4.0.41\53dfbd387ed1b88c7d144bdb6551b7f57d5da6d7\earlydisplay-4.0.41.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.fancymodloader\loader\4.0.41\3aebc81b9347fa87bb629ffaed20276f2a4c944e\loader-4.0.41.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarFileSystems\0.4.1\78f59f89defcd032ed788b151ca6a0d40ace796a\JarJarFileSystems-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarMetadata\0.4.1\f8da03683dc81694556dc3e177c5e3bb77ae6fcb\JarJarMetadata-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarSelector\0.4.1\fb3cc7a58af22ad2880adb98af6d518128c47dae\JarJarSelector-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\accesstransformers\10.0.1\fd83b5725f76eae9115e9355fa1c456a6a441400\accesstransformers-10.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\bus\8.0.5\5b2d33285ab5d1554e9798ad98c40d6ea3868bd5\bus-8.0.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\coremods\7.0.3\9147e6f638b4272b3bd5fc8f92ad37802512c6c\coremods-7.0.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\mergetool\2.0.0\52fe1949be64e3303aabaaa21e315f551db9c9f4\mergetool-2.0.0-api.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.sf.jopt-simple\jopt-simple\5.0.4\4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c\jopt-simple-5.0.4.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.antlr\antlr4-runtime\4.13.1\17125bae1d965624e265ef49552f6465a2bfa307\antlr4-runtime-4.13.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.commons\commons-lang3\3.14.0\1ed471194b02f2c6cb734a0cd6f6f107c673afae\commons-lang3-3.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.22.1\bea6fede6328fabafd7e68363161a7ea6605abd1\log4j-api-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-core\2.22.1\7183a25510a02ad00cc6a95d3b3d2a7d3c5a8dc4\log4j-core-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-slf4j2-impl\2.22.1\d7e6693c2606cb7e7335047d7bb96dec52db5665\log4j-slf4j2-impl-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.maven\maven-artifact\3.8.5\4433f50c07debefaed0553bd0068f4f48d449313\maven-artifact-3.8.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.checkerframework\checker-qual\3.33.0\de2b60b62da487644fc11f734e73c8b0b431238f\checker-qual-3.33.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.codehaus.plexus\plexus-utils\3.3.0\cf43b5391de623b36fe066a21127baef82c64022\plexus-utils-3.3.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.jline\jline-reader\3.20.0\8f15415b022a25b473e8e16c28ae913186ffb9c4\jline-reader-3.20.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.jline\jline-terminal\3.20.0\d0ddcc708ddf527a3454c941b7b9225cc83a15ff\jline-terminal-3.20.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.joml\joml\1.10.5\22566d58af70ad3d72308bab63b8339906deb649\joml-1.10.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lz4\lz4-java\1.8.0\4b986a99445e49ea5fbf5d149c4b63f6ed6c6780\lz4-java-1.8.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.openjdk.nashorn\nashorn-core\15.4\f67f5ffaa5f5130cf6fb9b133da00c7df3b532a5\nashorn-core-15.4.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-analysis\9.8\b9747a320844b6cb1eacd90d8ecfd260a16c01d3\asm-analysis-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-commons\9.8\36e4d212970388e5bd2c5180292012502df461bb\asm-commons-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-tree\9.8\18419ca5b77a2f81097c741e7872e6ab8d2f40d\asm-tree-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-util\9.8\395f1c1f035258511f27bc9b2583d76e4b143f59\asm-util-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.8\dc19ecb3f7889b7860697215cae99c0f9b6f6b4b\asm-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\2.0.9\7cf2726fdcfbc8610f9a71fb3ed639871f315340\slf4j-api-2.0.9.jar
+F:\java\mods\neoforge\1.21.1\commandify\build\moddev\artifacts\neoforge-21.1.208-client-extra-aka-minecraft-resources.jar
diff --git a/build/moddev/gameTestServerLog4j2.xml b/build/moddev/gameTestServerLog4j2.xml
new file mode 100644
index 0000000..773e88a
--- /dev/null
+++ b/build/moddev/gameTestServerLog4j2.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/moddev/gameTestServerRunProgramArgs.txt b/build/moddev/gameTestServerRunProgramArgs.txt
new file mode 100644
index 0000000..e8ef3f6
--- /dev/null
+++ b/build/moddev/gameTestServerRunProgramArgs.txt
@@ -0,0 +1,18 @@
+# Main Class
+cpw.mods.bootstraplauncher.BootstrapLauncher
+
+# NeoForge Run-Type Program Arguments
+--launchTarget
+forgeserverdev
+--gameDir
+.
+--fml.fmlVersion
+4.0.41
+--fml.mcVersion
+1.21.1
+--fml.neoForgeVersion
+21.1.208
+--fml.neoFormVersion
+20240808.144430
+
+# User Supplied Program Arguments
\ No newline at end of file
diff --git a/build/moddev/gameTestServerRunVmArgs.txt b/build/moddev/gameTestServerRunVmArgs.txt
new file mode 100644
index 0000000..62b3af4
--- /dev/null
+++ b/build/moddev/gameTestServerRunVmArgs.txt
@@ -0,0 +1,20 @@
+-p
+C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\JarJarFileSystems\\0.4.1\\78f59f89defcd032ed788b151ca6a0d40ace796a\\JarJarFileSystems-0.4.1.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\bootstraplauncher\\2.0.2\\1a2d076cbc33b0520cbacd591224427b2a20047d\\bootstraplauncher-2.0.2.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\securejarhandler\\3.0.8\\c0ef95cecd8699a0449053ac7d9c160748d902cd\\securejarhandler-3.0.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-commons\\9.8\\36e4d212970388e5bd2c5180292012502df461bb\\asm-commons-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-util\\9.8\\395f1c1f035258511f27bc9b2583d76e4b143f59\\asm-util-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-analysis\\9.8\\b9747a320844b6cb1eacd90d8ecfd260a16c01d3\\asm-analysis-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-tree\\9.8\\18419ca5b77a2f81097c741e7872e6ab8d2f40d\\asm-tree-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm\\9.8\\dc19ecb3f7889b7860697215cae99c0f9b6f6b4b\\asm-9.8.jar
+--add-modules
+ALL-MODULE-PATH
+--add-opens
+java.base/java.util.jar=cpw.mods.securejarhandler
+--add-opens
+java.base/java.lang.invoke=cpw.mods.securejarhandler
+--add-exports
+java.base/sun.security.util=cpw.mods.securejarhandler
+--add-exports
+jdk.naming.dns/com.sun.jndi.dns=java.naming
+-Dlog4j2.configurationFile=F:\\java\\mods\\neoforge\\1.21.1\\commandify\\build\\moddev\\gameTestServerLog4j2.xml
+-Djava.net.preferIPv6Addresses=system
+-DignoreList=mixinextras-neoforge-0.5.0.jar,client-extra,neoforge-
+-DlegacyClassPath.file=F:\\java\\mods\\neoforge\\1.21.1\\commandify\\build\\moddev\\gameTestServerLegacyClasspath.txt
+-Dneoforge.enableGameTest=true
+-Dneoforge.gameTestServer=true
+-Dneoforge.enabledGameTestNamespaces=commandify
+-Dforge.logging.markers=REGISTRIES
\ No newline at end of file
diff --git a/build/moddev/minecraft_assets.properties b/build/moddev/minecraft_assets.properties
new file mode 100644
index 0000000..6a13c43
--- /dev/null
+++ b/build/moddev/minecraft_assets.properties
@@ -0,0 +1,3 @@
+#Wed Oct 08 05:17:47 CEST 2025
+asset_index=17
+assets_root=C\:\\Users\\jessy\\.gradle\\caches\\neoformruntime\\assets
diff --git a/build/moddev/serverLegacyClasspath.txt b/build/moddev/serverLegacyClasspath.txt
new file mode 100644
index 0000000..9ab7b45
--- /dev/null
+++ b/build/moddev/serverLegacyClasspath.txt
@@ -0,0 +1,67 @@
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.electronwill.night-config\core\3.8.3\b442a95f09e349927f5a945ecb594455870fcf4f\core-3.8.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.electronwill.night-config\toml\3.8.3\90b2fd6efcb4a7d5b9810cf78f9d824994d717f2\toml-3.8.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.github.oshi\oshi-core\6.4.10\b1d8ab82d11d92fd639b56d639f8f46f739dd5fa\oshi-core-6.4.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.code.findbugs\jsr305\3.0.2\25ea2e8b0c338a877313bd4672d3fe056ea78f0d\jsr305-3.0.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.code.gson\gson\2.10.1\b3add478d4382b78ea20b1671390a858002feb6c\gson-2.10.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.errorprone\error_prone_annotations\2.18.0\89b684257096f548fa39a7df9fdaa409d4d4df91\error_prone_annotations-2.18.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\failureaccess\1.0.1\1dcf1de382a0bf95a3d8b0849546c88bac1292c9\failureaccess-1.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\guava\32.1.2-jre\5e64ec7e056456bef3a4bc4c6fdaef71e8ab6318\guava-32.1.2-jre.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\b421526c5f297295adef1c886e5246c39d4ac629\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.google.j2objc\j2objc-annotations\2.8\c85270e307e7b822f1086b93689124b89768e273\j2objc-annotations-2.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.machinezoo.noexception\noexception\1.7.1\b65330c98e38a1f915fa54a6e5eca496505e3f0a\noexception-1.7.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\authlib\6.0.54\de8bc95660e1b2fe8793fd427a7a10dcec5b3ea7\authlib-6.0.54.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\brigadier\1.3.10\d15b53a14cf20fdcaa98f731af5dda654452c010\brigadier-1.3.10.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\datafixerupper\8.0.16\67d4de6d7f95d89bcf5862995fb854ebaec02a34\datafixerupper-8.0.16.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\com.mojang\logging\1.2.7\24cb95ffb0e3433fd6e844c04e68009e504ca1c0\logging-1.2.7.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\commons-io\commons-io\2.15.1\f11560da189ab563a5c8e351941415430e9304ea\commons-io-2.15.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\bootstraplauncher\2.0.2\1a2d076cbc33b0520cbacd591224427b2a20047d\bootstraplauncher-2.0.2.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\modlauncher\11.0.5\b8f0d49294f733fdb6173931b263553e943dc950\modlauncher-11.0.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\cpw.mods\securejarhandler\3.0.8\c0ef95cecd8699a0449053ac7d9c160748d902cd\securejarhandler-3.0.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-buffer\4.1.97.Final\f8f3d8644afa5e6e1a40a3a6aeb9d9aa970ecb4f\netty-buffer-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-codec\4.1.97.Final\384ba4d75670befbedb45c4d3b497a93639c206d\netty-codec-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-common\4.1.97.Final\7cceacaf11df8dc63f23d0fb58e9d4640fc88404\netty-common-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-handler\4.1.97.Final\abb86c6906bf512bf2b797a41cd7d2e8d3cd7c36\netty-handler-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-resolver\4.1.97.Final\cec8348108dc76c47cf87c669d514be52c922144\netty-resolver-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-classes-epoll\4.1.97.Final\795da37ded759e862457a82d9d92c4d39ce8ecee\netty-transport-classes-epoll-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-native-epoll\4.1.97.Final\54188f271e388e7f313aea995e82f58ce2cdb809\netty-transport-native-epoll-4.1.97.Final-linux-x86_64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-native-epoll\4.1.97.Final\5514744c588190ffda076b35a9b8c9f24946a960\netty-transport-native-epoll-4.1.97.Final-linux-aarch_64.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport-native-unix-common\4.1.97.Final\d469d84265ab70095b01b40886cabdd433b6e664\netty-transport-native-unix-common-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\io.netty\netty-transport\4.1.97.Final\f37380d23c9bb079bc702910833b2fd532c9abd0\netty-transport-4.1.97.Final.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\it.unimi.dsi\fastutil\8.5.12\c24946d46824bd528054bface3231d2ecb7e95e8\fastutil-8.5.12.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.fabricmc\sponge-mixin\0.15.2+mixin.0.8.7\2af2f021d8e02a0220dc27a7a72b4666d66d44ca\sponge-mixin-0.15.2+mixin.0.8.7.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.java.dev.jna\jna-platform\5.14.0\28934d48aed814f11e4c584da55c49fa7032b31b\jna-platform-5.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.java.dev.jna\jna\5.14.0\67bf3eaea4f0718cb376a181a629e5f88fa1c9dd\jna-5.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.jodah\typetools\0.6.3\a01aaa6ddaea9ec07ec4f209487b7a46a526283a\typetools-0.6.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.minecraftforge\srgutils\0.4.15\ca408b131759478f164e010fae0d73997e125fb5\srgutils-0.4.15.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.minecrell\terminalconsoleappender\1.3.0\b562e9bb61235c9520e26282cdee71f8f802d1fc\terminalconsoleappender-1.3.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.accesstransformers\at-modlauncher\10.0.1\5aba50202aceead086bc09fbc2751c9f05cb4890\at-modlauncher-10.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.fancymodloader\earlydisplay\4.0.41\53dfbd387ed1b88c7d144bdb6551b7f57d5da6d7\earlydisplay-4.0.41.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged.fancymodloader\loader\4.0.41\3aebc81b9347fa87bb629ffaed20276f2a4c944e\loader-4.0.41.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarFileSystems\0.4.1\78f59f89defcd032ed788b151ca6a0d40ace796a\JarJarFileSystems-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarMetadata\0.4.1\f8da03683dc81694556dc3e177c5e3bb77ae6fcb\JarJarMetadata-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\JarJarSelector\0.4.1\fb3cc7a58af22ad2880adb98af6d518128c47dae\JarJarSelector-0.4.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\accesstransformers\10.0.1\fd83b5725f76eae9115e9355fa1c456a6a441400\accesstransformers-10.0.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\bus\8.0.5\5b2d33285ab5d1554e9798ad98c40d6ea3868bd5\bus-8.0.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\coremods\7.0.3\9147e6f638b4272b3bd5fc8f92ad37802512c6c\coremods-7.0.3.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.neoforged\mergetool\2.0.0\52fe1949be64e3303aabaaa21e315f551db9c9f4\mergetool-2.0.0-api.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\net.sf.jopt-simple\jopt-simple\5.0.4\4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c\jopt-simple-5.0.4.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.antlr\antlr4-runtime\4.13.1\17125bae1d965624e265ef49552f6465a2bfa307\antlr4-runtime-4.13.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.commons\commons-lang3\3.14.0\1ed471194b02f2c6cb734a0cd6f6f107c673afae\commons-lang3-3.14.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.22.1\bea6fede6328fabafd7e68363161a7ea6605abd1\log4j-api-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-core\2.22.1\7183a25510a02ad00cc6a95d3b3d2a7d3c5a8dc4\log4j-core-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-slf4j2-impl\2.22.1\d7e6693c2606cb7e7335047d7bb96dec52db5665\log4j-slf4j2-impl-2.22.1.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.apache.maven\maven-artifact\3.8.5\4433f50c07debefaed0553bd0068f4f48d449313\maven-artifact-3.8.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.checkerframework\checker-qual\3.33.0\de2b60b62da487644fc11f734e73c8b0b431238f\checker-qual-3.33.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.codehaus.plexus\plexus-utils\3.3.0\cf43b5391de623b36fe066a21127baef82c64022\plexus-utils-3.3.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.jline\jline-reader\3.20.0\8f15415b022a25b473e8e16c28ae913186ffb9c4\jline-reader-3.20.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.jline\jline-terminal\3.20.0\d0ddcc708ddf527a3454c941b7b9225cc83a15ff\jline-terminal-3.20.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.joml\joml\1.10.5\22566d58af70ad3d72308bab63b8339906deb649\joml-1.10.5.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.lz4\lz4-java\1.8.0\4b986a99445e49ea5fbf5d149c4b63f6ed6c6780\lz4-java-1.8.0.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.openjdk.nashorn\nashorn-core\15.4\f67f5ffaa5f5130cf6fb9b133da00c7df3b532a5\nashorn-core-15.4.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-analysis\9.8\b9747a320844b6cb1eacd90d8ecfd260a16c01d3\asm-analysis-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-commons\9.8\36e4d212970388e5bd2c5180292012502df461bb\asm-commons-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-tree\9.8\18419ca5b77a2f81097c741e7872e6ab8d2f40d\asm-tree-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm-util\9.8\395f1c1f035258511f27bc9b2583d76e4b143f59\asm-util-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.8\dc19ecb3f7889b7860697215cae99c0f9b6f6b4b\asm-9.8.jar
+C:\Users\jessy\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\2.0.9\7cf2726fdcfbc8610f9a71fb3ed639871f315340\slf4j-api-2.0.9.jar
+F:\java\mods\neoforge\1.21.1\commandify\build\moddev\artifacts\neoforge-21.1.208-client-extra-aka-minecraft-resources.jar
diff --git a/build/moddev/serverLog4j2.xml b/build/moddev/serverLog4j2.xml
new file mode 100644
index 0000000..773e88a
--- /dev/null
+++ b/build/moddev/serverLog4j2.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/moddev/serverRunProgramArgs.txt b/build/moddev/serverRunProgramArgs.txt
new file mode 100644
index 0000000..0da8230
--- /dev/null
+++ b/build/moddev/serverRunProgramArgs.txt
@@ -0,0 +1,19 @@
+# Main Class
+cpw.mods.bootstraplauncher.BootstrapLauncher
+
+# NeoForge Run-Type Program Arguments
+--launchTarget
+forgeserverdev
+--gameDir
+.
+--fml.fmlVersion
+4.0.41
+--fml.mcVersion
+1.21.1
+--fml.neoForgeVersion
+21.1.208
+--fml.neoFormVersion
+20240808.144430
+
+# User Supplied Program Arguments
+--nogui
\ No newline at end of file
diff --git a/build/moddev/serverRunVmArgs.txt b/build/moddev/serverRunVmArgs.txt
new file mode 100644
index 0000000..7cabe79
--- /dev/null
+++ b/build/moddev/serverRunVmArgs.txt
@@ -0,0 +1,18 @@
+-p
+C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\JarJarFileSystems\\0.4.1\\78f59f89defcd032ed788b151ca6a0d40ace796a\\JarJarFileSystems-0.4.1.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\bootstraplauncher\\2.0.2\\1a2d076cbc33b0520cbacd591224427b2a20047d\\bootstraplauncher-2.0.2.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\securejarhandler\\3.0.8\\c0ef95cecd8699a0449053ac7d9c160748d902cd\\securejarhandler-3.0.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-commons\\9.8\\36e4d212970388e5bd2c5180292012502df461bb\\asm-commons-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-util\\9.8\\395f1c1f035258511f27bc9b2583d76e4b143f59\\asm-util-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-analysis\\9.8\\b9747a320844b6cb1eacd90d8ecfd260a16c01d3\\asm-analysis-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-tree\\9.8\\18419ca5b77a2f81097c741e7872e6ab8d2f40d\\asm-tree-9.8.jar;C:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm\\9.8\\dc19ecb3f7889b7860697215cae99c0f9b6f6b4b\\asm-9.8.jar
+--add-modules
+ALL-MODULE-PATH
+--add-opens
+java.base/java.util.jar=cpw.mods.securejarhandler
+--add-opens
+java.base/java.lang.invoke=cpw.mods.securejarhandler
+--add-exports
+java.base/sun.security.util=cpw.mods.securejarhandler
+--add-exports
+jdk.naming.dns/com.sun.jndi.dns=java.naming
+-Dlog4j2.configurationFile=F:\\java\\mods\\neoforge\\1.21.1\\commandify\\build\\moddev\\serverLog4j2.xml
+-Djava.net.preferIPv6Addresses=system
+-DignoreList=mixinextras-neoforge-0.5.0.jar,client-extra,neoforge-
+-DlegacyClassPath.file=F:\\java\\mods\\neoforge\\1.21.1\\commandify\\build\\moddev\\serverLegacyClasspath.txt
+-Dneoforge.enabledGameTestNamespaces=commandify
+-Dforge.logging.markers=REGISTRIES
\ No newline at end of file
diff --git a/build/reports/configuration-cache/6jo271vzo402llotakqvcifez/6lvo2qh2otds2nwal4nwbu8z4/configuration-cache-report.html b/build/reports/configuration-cache/6jo271vzo402llotakqvcifez/6lvo2qh2otds2nwal4nwbu8z4/configuration-cache-report.html
new file mode 100644
index 0000000..2a997ae
--- /dev/null
+++ b/build/reports/configuration-cache/6jo271vzo402llotakqvcifez/6lvo2qh2otds2nwal4nwbu8z4/configuration-cache-report.html
@@ -0,0 +1,446 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Gradle Configuration Cache
+
+
+
+
+
+
+ Loading...
+
+
+
+
+
+
+
diff --git a/build/resources/main/META-INF/neoforge.mods.toml b/build/resources/main/META-INF/neoforge.mods.toml
new file mode 100644
index 0000000..40b76c7
--- /dev/null
+++ b/build/resources/main/META-INF/neoforge.mods.toml
@@ -0,0 +1,25 @@
+modLoader = "javafml"
+loaderVersion = "[4,)"
+license = "All Rights Reserved"
+
+[[mods]]
+modId = "commandify"
+version = "1.0.1"
+displayName = "commandify"
+displayURL = "https://ultralion.xyz"
+authors = "UltraLion"
+description = '''Commandify'''
+
+[[dependencies."commandify"]]
+modId = "neoforge"
+type = "required"
+versionRange = "[21,)"
+ordering = "NONE"
+side = "SERVER"
+
+[[dependencies."commandify"]]
+modId = "minecraft"
+type = "required"
+versionRange = "[1.21.1,1.22)"
+ordering = "AFTER"
+side = "BOTH"
diff --git a/build/resources/main/assets/commandify/lang/en_us.json b/build/resources/main/assets/commandify/lang/en_us.json
new file mode 100644
index 0000000..5274270
--- /dev/null
+++ b/build/resources/main/assets/commandify/lang/en_us.json
@@ -0,0 +1,145 @@
+{
+ "commandify.invsee.open_self": "§cYou cannot open your own inventory.",
+ "commandify.invsee.open_target": "§aYou are now editing §e%s§a's inventory.",
+ "commandify.invsee.title": "Inventory of %s",
+ "commandify.invsee.error": "§cInternal error while opening the inventory: %s",
+
+ "commandify.broadcast.format": "§6§l[Announcement] §e%s",
+ "commandify.broadcast.sent": "§aAnnouncement sent to all players.",
+
+ "commandify.ignore.self": "§cYou cannot ignore yourself.",
+ "commandify.ignore.already": "§eYou are already ignoring §6%s§e.",
+ "commandify.ignore.added": "§aYou are now ignoring §6%s§a.",
+
+ "commandify.ignored.empty": "§7You are not ignoring any players.",
+ "commandify.ignored.header": "§e👥 Ignored players:",
+ "commandify.ignored.hover": "Click to /unignore %s",
+
+ "commandify.unignore.not_ignored": "§eYou are not ignoring §6%s§e.",
+ "commandify.unignore.success": "§aYou are no longer ignoring §6%s§a.",
+
+ "commandify.msg.self": "§cYou cannot send a message to yourself.",
+ "commandify.msg.ignored": "§cThis player has ignored you. Your message was not delivered.",
+ "commandify.msg.to_sender": "§7[§bMe §7→ §e%s§7] §f%s",
+ "commandify.msg.to_target": "§7[§e%s §7→ §bMe§7] §f%s",
+
+ "commandify.reply.none": "§cNo recent message to reply to.",
+ "commandify.reply.offline": "§cThat player is no longer online.",
+ "commandify.reply.ignored": "§cThis player has ignored you. Your message was not delivered.",
+ "commandify.reply.to_sender": "§7[§bMe §7→ §e%s§7] §f%s",
+ "commandify.reply.to_target": "§7[§e%s §7→ §bMe§7] §f%s",
+
+ "commandify.info.title": "§6§lCommandify §r§7(v%s)",
+ "commandify.info.author": "§eAuthor: §fUltraLion",
+ "commandify.info.website": "§eWebsite: §fhttps://ultralion.xyz",
+ "commandify.info.modules_title": "§7Active Modules:",
+ "commandify.info.module.teleport": "§f- Teleportation (Homes, Warps, TPA, RTP, Back)",
+ "commandify.info.module.world": "§f- World Management (Time, Weather)",
+ "commandify.info.module.chat": "§f- Chat (Private Msg, Reply, Ignore, Broadcast)",
+ "commandify.info.modid": "§7Mod ID: §f%s",
+ "commandify.info.server_version": "§7Server Version: §f%s",
+ "commandify.info.players": "§7Online Players: §f%s",
+
+ "commandify.reload.success": "§a[Commandify] Configuration successfully reloaded!",
+ "commandify.reload.error": "§c[Commandify] An error occurred while reloading the configuration.",
+
+ "commandify.back.disabled": "§cThe /back command is disabled on this server.",
+ "commandify.back.no_previous": "§cNo previous location found.",
+ "commandify.back.success": "§aTeleported to your last location.",
+
+ "commandify.home.not_found": "§cThe home '%s' does not exist.",
+ "commandify.home.invalid_world": "§cThe world for this home does not exist or is not loaded.",
+ "commandify.home.success": "§aTeleported to home '%s'.",
+
+ "commandify.homes.disabled": "§cThe /homes command is disabled on this server.",
+ "commandify.homes.none": "§7You haven’t set any homes yet.",
+ "commandify.homes.header": "§6===== Your homes (%s) =====",
+ "commandify.homes.footer": "§6==============================",
+ "commandify.homes.hover_tp": "§7Click to teleport to '%s'.",
+
+ "commandify.sethome.limit_reached": "§cYou have reached your home limit (%s).",
+ "commandify.sethome.success": "§aHome '%s' has been set to your current location.",
+
+ "commandify.delhome.not_found": "§cThe home '%s' does not exist.",
+ "commandify.delhome.success": "§aHome '%s' has been successfully deleted.",
+
+ "commandify.rtp.no_world": "§cUnable to find the main world.",
+ "commandify.rtp.disabled": "§cThe /rtp command is disabled on this server.",
+ "commandify.rtp.cooldown": "§e⏳ Wait %s seconds before using /rtp again.",
+ "commandify.rtp.searching": "§7Searching for a safe place in the world...",
+ "commandify.rtp.no_safe": "§cNo safe location found after several attempts.",
+ "commandify.rtp.success": "§aTeleported to a random global location: §e%s",
+
+ "commandify.setspawn.disabled": "§cThe /setspawn command is disabled in the configuration.",
+ "commandify.setspawn.player_only": "§cThis command can only be used by a player.",
+ "commandify.setspawn.success": "§aGlobal spawn point set to your current position!",
+
+ "commandify.spawn.disabled": "§cThe /spawn command is disabled in the configuration.",
+ "commandify.spawn.player_only": "§cThis command can only be used by a player.",
+ "commandify.spawn.not_set": "§cNo spawn point has been set. Use /setspawn.",
+ "commandify.spawn.no_world": "§cError: Overworld not found.",
+ "commandify.spawn.success": "§aTeleported to the server spawn point.",
+
+ "commandify.tpa.self": "§cYou cannot send a teleport request to yourself.",
+ "commandify.tpa.blocked": "§cThis player is not accepting teleport requests.",
+ "commandify.tpa.sent": "§aTeleport request sent to §e%s§a.",
+ "commandify.tpa.accept_button": "[✅ Accept]",
+ "commandify.tpa.deny_button": "[❌ Deny]",
+ "commandify.tpa.accept_hover": "§aClick to accept the teleport request.",
+ "commandify.tpa.deny_hover": "§cClick to deny the teleport request.",
+ "commandify.tpa.request_message": " wants to teleport to you. ",
+
+ "commandify.tpaccept.none": "§cYou have no pending teleport request.",
+ "commandify.tpaccept.offline": "§cThe player who sent the request is no longer online.",
+ "commandify.tpaccept.here_target": "§aYou accepted the request. Teleporting to §e%s§a!",
+ "commandify.tpaccept.here_requester": "§a%s§a teleported to you.",
+ "commandify.tpaccept.tpa_requester": "§aTeleported to §e%s§a.",
+ "commandify.tpaccept.tpa_target": "§a%s§a teleported to you.",
+
+ "commandify.tpadeny.none": "§cYou have no pending teleport request.",
+ "commandify.tpadeny.to_requester": "§c%s has denied your teleport request.",
+ "commandify.tpadeny.to_target": "§aTeleport request denied.",
+
+ "commandify.tpahere.self": "§cYou cannot send a teleport request to yourself.",
+ "commandify.tpahere.blocked": "§cThat player does not accept teleport requests.",
+ "commandify.tpahere.sent": "§aTeleport request sent to §e%s§a to teleport to you.",
+ "commandify.tpahere.request_message": " §ewants you to teleport to them. ",
+ "commandify.tpahere.accept_button": "[✅ Accept]",
+ "commandify.tpahere.deny_button": "[❌ Deny]",
+ "commandify.tpahere.accept_hover": "§aClick to accept",
+ "commandify.tpahere.deny_hover": "§cClick to deny",
+
+ "commandify.tpatoggle.enabled": "§aYou are now accepting teleport requests.",
+ "commandify.tpatoggle.disabled": "§cYou are now refusing all teleport requests.",
+
+ "commandify.tpa.expired_requester": "§cYour teleport request to %s has expired.",
+ "commandify.tpa.expired_target": "§7The teleport request from %s has expired.",
+ "commandify.tpa.unknown_player": "a player",
+
+ "commandify.setwarp.disabled": "§cThe /setwarp command is disabled on this server.",
+ "commandify.setwarp.success": "§aWarp '%s' has been successfully created!",
+
+ "commandify.delwarp.disabled": "§cThe /delwarp command is disabled on this server.",
+ "commandify.delwarp.not_found": "§cThe warp '%s' does not exist.",
+ "commandify.delwarp.success": "§aWarp '%s' successfully deleted.",
+
+ "commandify.warp.disabled": "§cThe /warp command is disabled on this server.",
+ "commandify.warp.not_found": "§cThe warp '%s' does not exist.",
+ "commandify.warp.invalid_world": "§cThe warp's world does not exist or is not loaded.",
+ "commandify.warp.success": "§aTeleported to warp '%s'.",
+
+ "commandify.warps.disabled": "§cThe /warps command is disabled on this server.",
+ "commandify.warps.empty": "§7No warps have been created yet.",
+ "commandify.warps.header": "§6--- Available warps ---",
+ "commandify.warps.footer": "§6---------------------------",
+ "commandify.warps.hover": "§7Click to teleport to §e%s",
+
+ "commandify.world.disabled": "§cThis command is disabled on this server.",
+ "commandify.world.day": "§eTime set to §6day.",
+ "commandify.world.night": "§9Time set to §bnight.",
+ "commandify.world.noon": "§eTime set to §6noon.",
+ "commandify.world.midnight": "§9Time set to §bmidnight.",
+ "commandify.world.sun": "§eWeather set to §6sunny.",
+ "commandify.world.rain": "§bWeather set to §9rain.",
+ "commandify.world.thunder": "§bWeather set to §cthunderstorm."
+}
\ No newline at end of file
diff --git a/build/resources/main/assets/commandify/lang/fr_fr.json b/build/resources/main/assets/commandify/lang/fr_fr.json
new file mode 100644
index 0000000..d840515
--- /dev/null
+++ b/build/resources/main/assets/commandify/lang/fr_fr.json
@@ -0,0 +1,145 @@
+{
+ "commandify.invsee.open_self": "§cTu ne peux pas ouvrir ton propre inventaire.",
+ "commandify.invsee.open_target": "§aTu modifies l’inventaire de §e%s§a.",
+ "commandify.invsee.title": "Inventaire de %s",
+ "commandify.invsee.error": "§cErreur interne lors de l’ouverture de l’inventaire : %s",
+
+ "commandify.broadcast.format": "§6§l[Annonce] §e%s",
+ "commandify.broadcast.sent": "§aAnnonce envoyée à tous les joueurs.",
+
+ "commandify.ignore.self": "§cTu ne peux pas t’ignorer toi-même.",
+ "commandify.ignore.already": "§eTu ignores déjà §6%s§e.",
+ "commandify.ignore.added": "§aTu ignores maintenant §6%s§a.",
+
+ "commandify.ignored.empty": "§7Tu n’as ignoré aucun joueur.",
+ "commandify.ignored.header": "§e👥 Joueurs ignorés :",
+ "commandify.ignored.hover": "Cliquer pour /unignore %s",
+
+ "commandify.unignore.not_ignored": "§eTu n’ignores pas §6%s§e.",
+ "commandify.unignore.success": "§aTu n’ignores plus §6%s§a.",
+
+ "commandify.msg.self": "§cTu ne peux pas t’envoyer un message à toi-même.",
+ "commandify.msg.ignored": "§cCe joueur t’a ignoré, ton message ne lui sera pas envoyé.",
+ "commandify.msg.to_sender": "§7[§bMoi §7→ §e%s§7] §f%s",
+ "commandify.msg.to_target": "§7[§e%s §7→ §bMoi§7] §f%s",
+
+ "commandify.reply.none": "§cAucun message récent à qui répondre.",
+ "commandify.reply.offline": "§cCe joueur n’est plus en ligne.",
+ "commandify.reply.ignored": "§cCe joueur t’a ignoré, ton message ne lui sera pas envoyé.",
+ "commandify.reply.to_sender": "§7[§bMoi §7→ §e%s§7] §f%s",
+ "commandify.reply.to_target": "§7[§e%s §7→ §bMoi§7] §f%s",
+
+ "commandify.info.title": "§6§lCommandify §r§7(v%s)",
+ "commandify.info.author": "§eAuteur : §fUltraLion",
+ "commandify.info.website": "§eSite : §fhttps://ultralion.xyz",
+ "commandify.info.modules_title": "§7Modules actifs :",
+ "commandify.info.module.teleport": "§f- Téléportation (Homes, Warps, TPA, RTP, Back)",
+ "commandify.info.module.world": "§f- Monde (Temps, Météo)",
+ "commandify.info.module.chat": "§f- Chat (MP, Réponse, Ignore, Broadcast)",
+ "commandify.info.modid": "§7Mod ID : §f%s",
+ "commandify.info.server_version": "§7Version serveur : §f%s",
+ "commandify.info.players": "§7Joueurs connectés : §f%s",
+
+ "commandify.reload.success": "§a[Commandify] Configuration rechargée avec succès !",
+ "commandify.reload.error": "§c[Commandify] Erreur lors du rechargement de la configuration.",
+
+ "commandify.back.disabled": "§cLa commande /back est désactivée sur ce serveur.",
+ "commandify.back.no_previous": "§cAucune position précédente trouvée.",
+ "commandify.back.success": "§aTéléportation vers ta dernière position.",
+
+ "commandify.home.not_found": "§cLe home '%s' n’existe pas.",
+ "commandify.home.invalid_world": "§cLe monde du home n’existe pas ou n’est pas chargé.",
+ "commandify.home.success": "§aTéléportation vers le home '%s'.",
+
+ "commandify.homes.disabled": "§cLa commande /homes est désactivée sur ce serveur.",
+ "commandify.homes.none": "§7Tu n’as défini aucun home pour le moment.",
+ "commandify.homes.header": "§6===== Tes homes (%s) =====",
+ "commandify.homes.footer": "§6==============================",
+ "commandify.homes.hover_tp": "§7Clique pour te téléporter à '%s'.",
+
+ "commandify.sethome.limit_reached": "§cTu as atteint la limite de homes (%s).",
+ "commandify.sethome.success": "§aHome '%s' défini à ta position actuelle.",
+
+ "commandify.delhome.not_found": "§cLe home '%s' n’existe pas.",
+ "commandify.delhome.success": "§aHome '%s' supprimé avec succès.",
+
+ "commandify.rtp.no_world": "§cImpossible de trouver le monde principal.",
+ "commandify.rtp.disabled": "§cLa commande /rtp est désactivée sur ce serveur.",
+ "commandify.rtp.cooldown": "§e⏳ Attends encore %s secondes avant d’utiliser /rtp.",
+ "commandify.rtp.searching": "§7Recherche d’un lieu sûr dans le monde...",
+ "commandify.rtp.no_safe": "§cAucun endroit sûr trouvé après plusieurs essais.",
+ "commandify.rtp.success": "§aTéléporté à un lieu aléatoire global : §e%s",
+
+ "commandify.setspawn.disabled": "§cLa commande /setspawn est désactivée dans la configuration.",
+ "commandify.setspawn.player_only": "§cCette commande doit être utilisée par un joueur.",
+ "commandify.setspawn.success": "§aSpawn défini à ta position exacte !",
+
+ "commandify.spawn.disabled": "§cLa commande /spawn est désactivée dans la configuration.",
+ "commandify.spawn.player_only": "§cCette commande doit être utilisée par un joueur.",
+ "commandify.spawn.not_set": "§cAucun spawn défini. Utilise /setspawn.",
+ "commandify.spawn.no_world": "§cErreur : monde Overworld introuvable.",
+ "commandify.spawn.success": "§aTéléporté au spawn du serveur.",
+
+ "commandify.tpa.self": "§cTu ne peux pas t’envoyer une demande à toi-même.",
+ "commandify.tpa.blocked": "§cCe joueur n’accepte pas les demandes de téléportation.",
+ "commandify.tpa.sent": "§aDemande de téléportation envoyée à §e%s§a.",
+ "commandify.tpa.accept_button": "[✅ Accepter]",
+ "commandify.tpa.deny_button": "[❌ Refuser]",
+ "commandify.tpa.accept_hover": "§aClique pour accepter la demande de téléportation.",
+ "commandify.tpa.deny_hover": "§cClique pour refuser la demande de téléportation.",
+ "commandify.tpa.request_message": " souhaite se téléporter à toi. ",
+
+ "commandify.tpaccept.none": "§cAucune demande de téléportation en attente.",
+ "commandify.tpaccept.offline": "§cLe joueur ayant fait la demande n’est plus en ligne.",
+ "commandify.tpaccept.here_target": "§aTu as accepté la demande, téléportation vers §e%s§a !",
+ "commandify.tpaccept.here_requester": "§a%s§a s’est téléporté à toi.",
+ "commandify.tpaccept.tpa_requester": "§aTéléportation vers §e%s§a.",
+ "commandify.tpaccept.tpa_target": "§a%s§a s’est téléporté à toi.",
+
+ "commandify.tpadeny.none": "§cAucune demande de téléportation en attente.",
+ "commandify.tpadeny.to_requester": "§c%s a refusé ta demande de téléportation.",
+ "commandify.tpadeny.to_target": "§aDemande de téléportation refusée.",
+
+ "commandify.tpahere.self": "§cTu ne peux pas t’envoyer une demande à toi-même.",
+ "commandify.tpahere.blocked": "§cCe joueur n’accepte pas les demandes de téléportation.",
+ "commandify.tpahere.sent": "§aDemande envoyée à §e%s§a pour qu’il se téléporte à toi.",
+ "commandify.tpahere.request_message": " §ete demande de te téléporter à lui. ",
+ "commandify.tpahere.accept_button": "[✅ Accepter]",
+ "commandify.tpahere.deny_button": "[❌ Refuser]",
+ "commandify.tpahere.accept_hover": "§aClique pour accepter",
+ "commandify.tpahere.deny_hover": "§cClique pour refuser",
+
+ "commandify.tpatoggle.enabled": "§aTu acceptes maintenant les demandes de téléportation.",
+ "commandify.tpatoggle.disabled": "§cTu refuses désormais toutes les demandes de téléportation.",
+
+ "commandify.tpa.expired_requester": "§cTa demande de téléportation vers %s a expiré.",
+ "commandify.tpa.expired_target": "§7La demande de téléportation de %s a expiré.",
+ "commandify.tpa.unknown_player": "un joueur",
+
+ "commandify.setwarp.disabled": "§cLa commande /setwarp est désactivée sur ce serveur.",
+ "commandify.setwarp.success": "§aWarp '%s' défini avec succès !",
+
+ "commandify.delwarp.disabled": "§cLa commande /delwarp est désactivée sur ce serveur.",
+ "commandify.delwarp.not_found": "§cLe warp '%s' n’existe pas.",
+ "commandify.delwarp.success": "§aWarp '%s' supprimé avec succès.",
+
+ "commandify.warp.disabled": "§cLa commande /warp est désactivée sur ce serveur.",
+ "commandify.warp.not_found": "§cLe warp '%s' n’existe pas.",
+ "commandify.warp.invalid_world": "§cLe monde du warp n’existe pas ou n’est pas chargé.",
+ "commandify.warp.success": "§aTéléportation vers le warp '%s'.",
+
+ "commandify.warps.disabled": "§cLa commande /warps est désactivée sur ce serveur.",
+ "commandify.warps.empty": "§7Aucun warp n’a encore été défini.",
+ "commandify.warps.header": "§6--- Warps disponibles ---",
+ "commandify.warps.footer": "§6---------------------------",
+ "commandify.warps.hover": "§7Clique pour te téléporter à §e%s",
+
+ "commandify.world.disabled": "§cCette commande est désactivée sur ce serveur.",
+ "commandify.world.day": "§eHeure définie sur §6jour.",
+ "commandify.world.night": "§9Heure définie sur §bla nuit.",
+ "commandify.world.noon": "§eHeure définie sur §6midi.",
+ "commandify.world.midnight": "§9Heure définie sur §bminuit.",
+ "commandify.world.sun": "§eMétéo réglée sur §6ensoleillé.",
+ "commandify.world.rain": "§bMétéo réglée sur §9pluie.",
+ "commandify.world.thunder": "§bMétéo réglée sur §corage."
+}
\ No newline at end of file
diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin
new file mode 100644
index 0000000..41a1051
Binary files /dev/null and b/build/tmp/compileJava/previous-compilation-data.bin differ
diff --git a/build/tmp/createMinecraftArtifacts/nfrt-problem-report.json b/build/tmp/createMinecraftArtifacts/nfrt-problem-report.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/build/tmp/createMinecraftArtifacts/nfrt-problem-report.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/build/tmp/createMinecraftArtifacts/nfrt_artifact_manifest.properties b/build/tmp/createMinecraftArtifacts/nfrt_artifact_manifest.properties
new file mode 100644
index 0000000..a460ed8
--- /dev/null
+++ b/build/tmp/createMinecraftArtifacts/nfrt_artifact_manifest.properties
@@ -0,0 +1,132 @@
+#
+#Wed Oct 08 05:17:45 CEST 2025
+ca.weblite\:java-objc-bridge\:1.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\ca.weblite\\java-objc-bridge\\1.1\\1227f9e0666314f9de41477e3ec277e542ed7f7b\\java-objc-bridge-1.1.jar
+com.electronwill.night-config\:core\:3.8.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.electronwill.night-config\\core\\3.8.3\\b442a95f09e349927f5a945ecb594455870fcf4f\\core-3.8.3.jar
+com.electronwill.night-config\:toml\:3.8.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.electronwill.night-config\\toml\\3.8.3\\90b2fd6efcb4a7d5b9810cf78f9d824994d717f2\\toml-3.8.3.jar
+com.github.oshi\:oshi-core\:6.4.10=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.github.oshi\\oshi-core\\6.4.10\\b1d8ab82d11d92fd639b56d639f8f46f739dd5fa\\oshi-core-6.4.10.jar
+com.google.code.findbugs\:jsr305\:3.0.2=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.code.findbugs\\jsr305\\3.0.2\\25ea2e8b0c338a877313bd4672d3fe056ea78f0d\\jsr305-3.0.2.jar
+com.google.code.gson\:gson\:2.10.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.code.gson\\gson\\2.10.1\\b3add478d4382b78ea20b1671390a858002feb6c\\gson-2.10.1.jar
+com.google.errorprone\:error_prone_annotations\:2.18.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.errorprone\\error_prone_annotations\\2.18.0\\89b684257096f548fa39a7df9fdaa409d4d4df91\\error_prone_annotations-2.18.0.jar
+com.google.guava\:failureaccess\:1.0.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.guava\\failureaccess\\1.0.1\\1dcf1de382a0bf95a3d8b0849546c88bac1292c9\\failureaccess-1.0.1.jar
+com.google.guava\:guava\:32.1.2-jre=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.guava\\guava\\32.1.2-jre\\5e64ec7e056456bef3a4bc4c6fdaef71e8ab6318\\guava-32.1.2-jre.jar
+com.google.guava\:listenablefuture\:9999.0-empty-to-avoid-conflict-with-guava=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.guava\\listenablefuture\\9999.0-empty-to-avoid-conflict-with-guava\\b421526c5f297295adef1c886e5246c39d4ac629\\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
+com.google.j2objc\:j2objc-annotations\:2.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.j2objc\\j2objc-annotations\\2.8\\c85270e307e7b822f1086b93689124b89768e273\\j2objc-annotations-2.8.jar
+com.ibm.icu\:icu4j\:73.2=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.ibm.icu\\icu4j\\73.2\\61ad4ef7f9131fcf6d25c34b817f90d6da06c9e9\\icu4j-73.2.jar
+com.machinezoo.noexception\:noexception\:1.7.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.machinezoo.noexception\\noexception\\1.7.1\\b65330c98e38a1f915fa54a6e5eca496505e3f0a\\noexception-1.7.1.jar
+com.mojang\:authlib\:6.0.54=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\authlib\\6.0.54\\de8bc95660e1b2fe8793fd427a7a10dcec5b3ea7\\authlib-6.0.54.jar
+com.mojang\:blocklist\:1.0.10=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\blocklist\\1.0.10\\5c685c5ffa94c4cd39496c7184c1d122e515ecef\\blocklist-1.0.10.jar
+com.mojang\:brigadier\:1.3.10=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\brigadier\\1.3.10\\d15b53a14cf20fdcaa98f731af5dda654452c010\\brigadier-1.3.10.jar
+com.mojang\:datafixerupper\:8.0.16=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\datafixerupper\\8.0.16\\67d4de6d7f95d89bcf5862995fb854ebaec02a34\\datafixerupper-8.0.16.jar
+com.mojang\:logging\:1.2.7=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\logging\\1.2.7\\24cb95ffb0e3433fd6e844c04e68009e504ca1c0\\logging-1.2.7.jar
+com.mojang\:patchy\:2.2.10=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\patchy\\2.2.10\\da05971b07cbb379d002cf7eaec6a2048211fefc\\patchy-2.2.10.jar
+com.mojang\:text2speech\:1.17.9=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\text2speech\\1.17.9\\3cad216e3a7f0c19b4b394388bc9ffc446f13b14\\text2speech-1.17.9.jar
+commons-codec\:commons-codec\:1.16.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\commons-codec\\commons-codec\\1.16.0\\4e3eb3d79888d76b54e28b350915b5dc3919c9de\\commons-codec-1.16.0.jar
+commons-io\:commons-io\:2.15.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\commons-io\\commons-io\\2.15.1\\f11560da189ab563a5c8e351941415430e9304ea\\commons-io-2.15.1.jar
+commons-logging\:commons-logging\:1.2=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\commons-logging\\commons-logging\\1.2\\4bfc12adfe4842bf07b657f0369c4cb522955686\\commons-logging-1.2.jar
+cpw.mods\:bootstraplauncher\:2.0.2=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\bootstraplauncher\\2.0.2\\1a2d076cbc33b0520cbacd591224427b2a20047d\\bootstraplauncher-2.0.2.jar
+cpw.mods\:modlauncher\:11.0.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\modlauncher\\11.0.5\\b8f0d49294f733fdb6173931b263553e943dc950\\modlauncher-11.0.5.jar
+cpw.mods\:securejarhandler\:3.0.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\securejarhandler\\3.0.8\\c0ef95cecd8699a0449053ac7d9c160748d902cd\\securejarhandler-3.0.8.jar
+io.codechicken\:DiffPatch\:2.0.0.36\:all=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.codechicken\\DiffPatch\\2.0.0.36\\5b32f9baa0c0371c0dc80a3b88794960af0c6b44\\DiffPatch-2.0.0.36-all.jar
+io.github.llamalad7\:mixinextras-neoforge\:0.5.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.github.llamalad7\\mixinextras-neoforge\\0.5.0\\d734b83ce6542bb70ea31755c1595b88992dbe65\\mixinextras-neoforge-0.5.0.jar
+io.netty\:netty-buffer\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-buffer\\4.1.97.Final\\f8f3d8644afa5e6e1a40a3a6aeb9d9aa970ecb4f\\netty-buffer-4.1.97.Final.jar
+io.netty\:netty-codec\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-codec\\4.1.97.Final\\384ba4d75670befbedb45c4d3b497a93639c206d\\netty-codec-4.1.97.Final.jar
+io.netty\:netty-common\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-common\\4.1.97.Final\\7cceacaf11df8dc63f23d0fb58e9d4640fc88404\\netty-common-4.1.97.Final.jar
+io.netty\:netty-handler\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-handler\\4.1.97.Final\\abb86c6906bf512bf2b797a41cd7d2e8d3cd7c36\\netty-handler-4.1.97.Final.jar
+io.netty\:netty-resolver\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-resolver\\4.1.97.Final\\cec8348108dc76c47cf87c669d514be52c922144\\netty-resolver-4.1.97.Final.jar
+io.netty\:netty-transport-classes-epoll\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-transport-classes-epoll\\4.1.97.Final\\795da37ded759e862457a82d9d92c4d39ce8ecee\\netty-transport-classes-epoll-4.1.97.Final.jar
+io.netty\:netty-transport-native-unix-common\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-transport-native-unix-common\\4.1.97.Final\\d469d84265ab70095b01b40886cabdd433b6e664\\netty-transport-native-unix-common-4.1.97.Final.jar
+io.netty\:netty-transport\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-transport\\4.1.97.Final\\f37380d23c9bb079bc702910833b2fd532c9abd0\\netty-transport-4.1.97.Final.jar
+it.unimi.dsi\:fastutil\:8.3.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\it.unimi.dsi\\fastutil\\8.3.1\\ff33b340d60b81f4c1015fa8008bb30ff0a0d53b\\fastutil-8.3.1.jar
+it.unimi.dsi\:fastutil\:8.5.12=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\it.unimi.dsi\\fastutil\\8.5.12\\c24946d46824bd528054bface3231d2ecb7e95e8\\fastutil-8.5.12.jar
+net.covers1624\:Quack\:0.4.10.101=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.covers1624\\Quack\\0.4.10.101\\970b7f652b5c40c893ef9a4bf13a97a291587d74\\Quack-0.4.10.101.jar
+net.fabricmc\:sponge-mixin\:0.15.2+mixin.0.8.7=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.fabricmc\\sponge-mixin\\0.15.2+mixin.0.8.7\\2af2f021d8e02a0220dc27a7a72b4666d66d44ca\\sponge-mixin-0.15.2+mixin.0.8.7.jar
+net.java.dev.jna\:jna-platform\:5.14.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.java.dev.jna\\jna-platform\\5.14.0\\28934d48aed814f11e4c584da55c49fa7032b31b\\jna-platform-5.14.0.jar
+net.java.dev.jna\:jna\:5.14.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.java.dev.jna\\jna\\5.14.0\\67bf3eaea4f0718cb376a181a629e5f88fa1c9dd\\jna-5.14.0.jar
+net.jodah\:typetools\:0.6.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.jodah\\typetools\\0.6.3\\a01aaa6ddaea9ec07ec4f209487b7a46a526283a\\typetools-0.6.3.jar
+net.minecraftforge\:mergetool\:1.1.7\:fatjar=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.minecraftforge\\mergetool\\1.1.7\\3d41564f78f123d64573cae7948014baf3aaba3f\\mergetool-1.1.7-fatjar.jar
+net.minecraftforge\:srgutils\:0.4.15=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.minecraftforge\\srgutils\\0.4.15\\ca408b131759478f164e010fae0d73997e125fb5\\srgutils-0.4.15.jar
+net.minecrell\:terminalconsoleappender\:1.3.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.minecrell\\terminalconsoleappender\\1.3.0\\b562e9bb61235c9520e26282cdee71f8f802d1fc\\terminalconsoleappender-1.3.0.jar
+net.neoforged.accesstransformers\:at-modlauncher\:10.0.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged.accesstransformers\\at-modlauncher\\10.0.1\\5aba50202aceead086bc09fbc2751c9f05cb4890\\at-modlauncher-10.0.1.jar
+net.neoforged.fancymodloader\:earlydisplay\:4.0.41=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged.fancymodloader\\earlydisplay\\4.0.41\\53dfbd387ed1b88c7d144bdb6551b7f57d5da6d7\\earlydisplay-4.0.41.jar
+net.neoforged.fancymodloader\:loader\:4.0.41=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged.fancymodloader\\loader\\4.0.41\\3aebc81b9347fa87bb629ffaed20276f2a4c944e\\loader-4.0.41.jar
+net.neoforged.installertools\:installertools\:2.1.2\:fatjar=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged.installertools\\installertools\\2.1.2\\62740d5aa8f75f4a4d542d363bdda5b64a198f7a\\installertools-2.1.2-fatjar.jar
+net.neoforged.jst\:jst-cli-bundle\:1.0.74=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged.jst\\jst-cli-bundle\\1.0.74\\4b55f9a755ff69d480d3fb5d68c40662f5265b7e\\jst-cli-bundle-1.0.74.jar
+net.neoforged\:AutoRenamingTool\:2.0.3\:all=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\AutoRenamingTool\\2.0.3\\d9890c71b4366f886c2b1006782043a6a6816eb6\\AutoRenamingTool-2.0.3-all.jar
+net.neoforged\:JarJarFileSystems\:0.4.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\JarJarFileSystems\\0.4.1\\78f59f89defcd032ed788b151ca6a0d40ace796a\\JarJarFileSystems-0.4.1.jar
+net.neoforged\:JarJarMetadata\:0.4.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\JarJarMetadata\\0.4.1\\f8da03683dc81694556dc3e177c5e3bb77ae6fcb\\JarJarMetadata-0.4.1.jar
+net.neoforged\:JarJarSelector\:0.4.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\JarJarSelector\\0.4.1\\fb3cc7a58af22ad2880adb98af6d518128c47dae\\JarJarSelector-0.4.1.jar
+net.neoforged\:accesstransformers\:10.0.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\accesstransformers\\10.0.1\\fd83b5725f76eae9115e9355fa1c456a6a441400\\accesstransformers-10.0.1.jar
+net.neoforged\:bus\:8.0.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\bus\\8.0.5\\5b2d33285ab5d1554e9798ad98c40d6ea3868bd5\\bus-8.0.5.jar
+net.neoforged\:coremods\:7.0.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\coremods\\7.0.3\\9147e6f638b4272b3bd5fc8f92ad37802512c6c\\coremods-7.0.3.jar
+net.neoforged\:mergetool\:2.0.0\:api=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\mergetool\\2.0.0\\52fe1949be64e3303aabaaa21e315f551db9c9f4\\mergetool-2.0.0-api.jar
+net.neoforged\:mergetool\:2.0.3\:api=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\mergetool\\2.0.3\\1275202cbbb248f49345cf6787ce299afd9a02fb\\mergetool-2.0.3-api.jar
+net.neoforged\:mergetool\:2.0.3\:fatjar=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\mergetool\\2.0.3\\85c096b0155715275f84922d41462484c9a0285c\\mergetool-2.0.3-fatjar.jar
+net.neoforged\:neoforge\:21.1.208\:sources=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\neoforge\\21.1.208\\9a95d45b028b825d956fde60435baa4c26115afe\\neoforge-21.1.208-sources.jar
+net.neoforged\:neoforge\:21.1.208\:universal=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\neoforge\\21.1.208\\6ba51e7eb3315ea421d4392bb4a3b69c5fbe2caa\\neoforge-21.1.208-universal.jar
+net.neoforged\:neoforge\:21.1.208\:userdev=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\neoforge\\21.1.208\\9855f11263143135035746877eef33fd1025f457\\neoforge-21.1.208-userdev.jar
+net.neoforged\:neoform\:1.21.1-20240808.144430@zip=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\neoform\\1.21.1-20240808.144430\\811e2bd86fa2cda2812e5e8e51d718ea8bd6d3f4\\neoform-1.21.1-20240808.144430.zip
+net.sf.jopt-simple\:jopt-simple\:5.0.4=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.sf.jopt-simple\\jopt-simple\\5.0.4\\4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c\\jopt-simple-5.0.4.jar
+org.antlr\:antlr4-runtime\:4.13.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.antlr\\antlr4-runtime\\4.13.1\\17125bae1d965624e265ef49552f6465a2bfa307\\antlr4-runtime-4.13.1.jar
+org.apache.commons\:commons-compress\:1.18=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.commons\\commons-compress\\1.18\\1191f9f2bc0c47a8cce69193feb1ff0a8bcb37d5\\commons-compress-1.18.jar
+org.apache.commons\:commons-compress\:1.26.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.commons\\commons-compress\\1.26.0\\659feffdd12280201c8aacb8f7be94f9a883c824\\commons-compress-1.26.0.jar
+org.apache.commons\:commons-lang3\:3.14.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.commons\\commons-lang3\\3.14.0\\1ed471194b02f2c6cb734a0cd6f6f107c673afae\\commons-lang3-3.14.0.jar
+org.apache.commons\:commons-lang3\:3.9=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.commons\\commons-lang3\\3.9\\122c7cee69b53ed4a7681c03d4ee4c0e2765da5\\commons-lang3-3.9.jar
+org.apache.httpcomponents\:httpclient\:4.5.13=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.httpcomponents\\httpclient\\4.5.13\\e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada\\httpclient-4.5.13.jar
+org.apache.httpcomponents\:httpcore\:4.4.16=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.httpcomponents\\httpcore\\4.4.16\\51cf043c87253c9f58b539c9f7e44c8894223850\\httpcore-4.4.16.jar
+org.apache.logging.log4j\:log4j-api\:2.22.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.logging.log4j\\log4j-api\\2.22.1\\bea6fede6328fabafd7e68363161a7ea6605abd1\\log4j-api-2.22.1.jar
+org.apache.logging.log4j\:log4j-core\:2.22.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.logging.log4j\\log4j-core\\2.22.1\\7183a25510a02ad00cc6a95d3b3d2a7d3c5a8dc4\\log4j-core-2.22.1.jar
+org.apache.logging.log4j\:log4j-slf4j2-impl\:2.22.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.logging.log4j\\log4j-slf4j2-impl\\2.22.1\\d7e6693c2606cb7e7335047d7bb96dec52db5665\\log4j-slf4j2-impl-2.22.1.jar
+org.apache.maven\:maven-artifact\:3.8.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.maven\\maven-artifact\\3.8.5\\4433f50c07debefaed0553bd0068f4f48d449313\\maven-artifact-3.8.5.jar
+org.checkerframework\:checker-qual\:3.33.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.checkerframework\\checker-qual\\3.33.0\\de2b60b62da487644fc11f734e73c8b0b431238f\\checker-qual-3.33.0.jar
+org.codehaus.plexus\:plexus-utils\:3.3.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.codehaus.plexus\\plexus-utils\\3.3.0\\cf43b5391de623b36fe066a21127baef82c64022\\plexus-utils-3.3.0.jar
+org.jcraft\:jorbis\:0.0.17=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.jcraft\\jorbis\\0.0.17\\8872d22b293e8f5d7d56ff92be966e6dc28ebdc6\\jorbis-0.0.17.jar
+org.jetbrains\:annotations\:24.1.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.jetbrains\\annotations\\24.1.0\\7af6a669488450c4a07c2c3254e2151df42d7d04\\annotations-24.1.0.jar
+org.jline\:jline-reader\:3.20.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.jline\\jline-reader\\3.20.0\\8f15415b022a25b473e8e16c28ae913186ffb9c4\\jline-reader-3.20.0.jar
+org.jline\:jline-terminal\:3.20.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.jline\\jline-terminal\\3.20.0\\d0ddcc708ddf527a3454c941b7b9225cc83a15ff\\jline-terminal-3.20.0.jar
+org.joml\:joml\:1.10.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.joml\\joml\\1.10.5\\22566d58af70ad3d72308bab63b8339906deb649\\joml-1.10.5.jar
+org.lwjgl\:lwjgl-freetype\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-freetype\\3.3.3\\a0db6c84a8becc8ca05f9dbfa985edc348a824c7\\lwjgl-freetype-3.3.3.jar
+org.lwjgl\:lwjgl-freetype\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-freetype\\3.3.3\\81091b006dbb43fab04c8c638e9ac87c51b4096d\\lwjgl-freetype-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-freetype\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-freetype\\3.3.3\\82028265a0a2ff33523ca75137ada7dc176e5210\\lwjgl-freetype-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-freetype\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-freetype\\3.3.3\\15a8c1de7f51d07a92eae7ce1222557073a0c0c3\\lwjgl-freetype-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-glfw\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-glfw\\3.3.3\\efa1eb78c5ccd840e9f329717109b5e892d72f8e\\lwjgl-glfw-3.3.3.jar
+org.lwjgl\:lwjgl-glfw\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-glfw\\3.3.3\\e449e28b4891fc423c54c85fbc5bb0b9efece67a\\lwjgl-glfw-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-glfw\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-glfw\\3.3.3\\f27018dc74f6289574502b46cce55d52817554e2\\lwjgl-glfw-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-glfw\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-glfw\\3.3.3\\32334f3fd5270a59bad9939a93115acb6de36dcf\\lwjgl-glfw-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-jemalloc\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-jemalloc\\3.3.3\\b543467b7ff3c6920539a88ee602d34098628be5\\lwjgl-jemalloc-3.3.3.jar
+org.lwjgl\:lwjgl-jemalloc\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-jemalloc\\3.3.3\\426222fc027602a5f21b9c0fe79cde6a4c7a011f\\lwjgl-jemalloc-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-jemalloc\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-jemalloc\\3.3.3\\ba1f3fed0ee4be0217eaa41c5bbfb4b9b1383c33\\lwjgl-jemalloc-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-jemalloc\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-jemalloc\\3.3.3\\f6063b6e0f23be483c5c88d84ce51b39dc69126c\\lwjgl-jemalloc-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-openal\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-openal\\3.3.3\\daada81ceb5fc0c291fbfdd4433cb8d9423577f2\\lwjgl-openal-3.3.3.jar
+org.lwjgl\:lwjgl-openal\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-openal\\3.3.3\\cf83862ae95d98496b26915024c7e666d8ab1c8f\\lwjgl-openal-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-openal\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-openal\\3.3.3\\8e0615235116b9e4160dfe87bec90f5f6378bf72\\lwjgl-openal-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-openal\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-openal\\3.3.3\\87b8d5050e3adb46bb58fe1cb2669a4a48fce10d\\lwjgl-openal-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-opengl\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-opengl\\3.3.3\\2f6b0147078396a58979125a4c947664e98293a\\lwjgl-opengl-3.3.3.jar
+org.lwjgl\:lwjgl-opengl\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-opengl\\3.3.3\\e6c1eec8be8a71951b830a4d69efc01c6531900c\\lwjgl-opengl-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-opengl\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-opengl\\3.3.3\\65e956d3735a1abdc82eff4baec1b61174697d4b\\lwjgl-opengl-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-opengl\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-opengl\\3.3.3\\d32d833dcaa2f355a886eaf21f0408b5f03241d\\lwjgl-opengl-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-stb\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-stb\\3.3.3\\25dd6161988d7e65f71d5065c99902402ee32746\\lwjgl-stb-3.3.3.jar
+org.lwjgl\:lwjgl-stb\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-stb\\3.3.3\\1d9facdf6541de114b0f963be33505b7679c78cb\\lwjgl-stb-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-stb\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-stb\\3.3.3\\a584ab44de569708871f0a79561f4d8c37487f2c\\lwjgl-stb-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-stb\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-stb\\3.3.3\\b5c874687b9aac1a936501d4ed2c49567fd1b575\\lwjgl-stb-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-tinyfd\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-tinyfd\\3.3.3\\82d755ca94b102e9ca77283b9e2dc46d1b15fbe5\\lwjgl-tinyfd-3.3.3.jar
+org.lwjgl\:lwjgl-tinyfd\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-tinyfd\\3.3.3\\a6697981b0449a5087c1d546fc08b4f73e8f98c9\\lwjgl-tinyfd-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-tinyfd\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-tinyfd\\3.3.3\\a88c494f3006eb91a7433b12a3a55a9a6c20788b\\lwjgl-tinyfd-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-tinyfd\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-tinyfd\\3.3.3\\c336c84ee88cccb495c6ffa112395509e7378e8a\\lwjgl-tinyfd-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl\\3.3.3\\29589b5f87ed335a6c7e7ee6a5775f81f97ecb84\\lwjgl-3.3.3.jar
+org.lwjgl\:lwjgl\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl\\3.3.3\\a5ed18a2b82fc91b81f40d717cb1f64c9dcb0540\\lwjgl-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl\\3.3.3\\e9aca8c5479b520a2a7f0d542a118140e812c5e8\\lwjgl-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl\\3.3.3\\9e670718e050aeaeea0c2d5b907cffb142f2e58f\\lwjgl-3.3.3-natives-windows-x86.jar
+org.lz4\:lz4-java\:1.8.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lz4\\lz4-java\\1.8.0\\4b986a99445e49ea5fbf5d149c4b63f6ed6c6780\\lz4-java-1.8.0.jar
+org.openjdk.nashorn\:nashorn-core\:15.4=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.openjdk.nashorn\\nashorn-core\\15.4\\f67f5ffaa5f5130cf6fb9b133da00c7df3b532a5\\nashorn-core-15.4.jar
+org.ow2.asm\:asm-analysis\:9.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-analysis\\9.5\\490bacc77de7cbc0be1a30bb3471072d705be4a4\\asm-analysis-9.5.jar
+org.ow2.asm\:asm-analysis\:9.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-analysis\\9.8\\b9747a320844b6cb1eacd90d8ecfd260a16c01d3\\asm-analysis-9.8.jar
+org.ow2.asm\:asm-commons\:9.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-commons\\9.8\\36e4d212970388e5bd2c5180292012502df461bb\\asm-commons-9.8.jar
+org.ow2.asm\:asm-tree\:9.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-tree\\9.5\\fd33c8b6373abaa675be407082fdfda35021254a\\asm-tree-9.5.jar
+org.ow2.asm\:asm-tree\:9.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-tree\\9.8\\18419ca5b77a2f81097c741e7872e6ab8d2f40d\\asm-tree-9.8.jar
+org.ow2.asm\:asm-util\:9.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-util\\9.5\\64b5a1fc8c1b15ed2efd6a063e976bc8d3dc5ffe\\asm-util-9.5.jar
+org.ow2.asm\:asm-util\:9.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-util\\9.8\\395f1c1f035258511f27bc9b2583d76e4b143f59\\asm-util-9.8.jar
+org.ow2.asm\:asm\:9.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm\\9.5\\dc6ea1875f4d64fbc85e1691c95b96a3d8569c90\\asm-9.5.jar
+org.ow2.asm\:asm\:9.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm\\9.8\\dc19ecb3f7889b7860697215cae99c0f9b6f6b4b\\asm-9.8.jar
+org.slf4j\:slf4j-api\:2.0.9=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.slf4j\\slf4j-api\\2.0.9\\7cf2726fdcfbc8610f9a71fb3ed639871f315340\\slf4j-api-2.0.9.jar
+org.tukaani\:xz\:1.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.tukaani\\xz\\1.8\\c4f7d054303948eb6a4066194253886c8af07128\\xz-1.8.jar
+org.vineflower\:vineflower\:1.10.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.vineflower\\vineflower\\1.10.1\\4f48c5947b21f9ebc743e7c80215ee839d3dc668\\vineflower-1.10.1.jar
diff --git a/build/tmp/downloadAssets/nfrt_artifact_manifest.properties b/build/tmp/downloadAssets/nfrt_artifact_manifest.properties
new file mode 100644
index 0000000..9dd4dc7
--- /dev/null
+++ b/build/tmp/downloadAssets/nfrt_artifact_manifest.properties
@@ -0,0 +1,132 @@
+#
+#Wed Oct 08 05:17:47 CEST 2025
+ca.weblite\:java-objc-bridge\:1.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\ca.weblite\\java-objc-bridge\\1.1\\1227f9e0666314f9de41477e3ec277e542ed7f7b\\java-objc-bridge-1.1.jar
+com.electronwill.night-config\:core\:3.8.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.electronwill.night-config\\core\\3.8.3\\b442a95f09e349927f5a945ecb594455870fcf4f\\core-3.8.3.jar
+com.electronwill.night-config\:toml\:3.8.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.electronwill.night-config\\toml\\3.8.3\\90b2fd6efcb4a7d5b9810cf78f9d824994d717f2\\toml-3.8.3.jar
+com.github.oshi\:oshi-core\:6.4.10=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.github.oshi\\oshi-core\\6.4.10\\b1d8ab82d11d92fd639b56d639f8f46f739dd5fa\\oshi-core-6.4.10.jar
+com.google.code.findbugs\:jsr305\:3.0.2=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.code.findbugs\\jsr305\\3.0.2\\25ea2e8b0c338a877313bd4672d3fe056ea78f0d\\jsr305-3.0.2.jar
+com.google.code.gson\:gson\:2.10.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.code.gson\\gson\\2.10.1\\b3add478d4382b78ea20b1671390a858002feb6c\\gson-2.10.1.jar
+com.google.errorprone\:error_prone_annotations\:2.18.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.errorprone\\error_prone_annotations\\2.18.0\\89b684257096f548fa39a7df9fdaa409d4d4df91\\error_prone_annotations-2.18.0.jar
+com.google.guava\:failureaccess\:1.0.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.guava\\failureaccess\\1.0.1\\1dcf1de382a0bf95a3d8b0849546c88bac1292c9\\failureaccess-1.0.1.jar
+com.google.guava\:guava\:32.1.2-jre=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.guava\\guava\\32.1.2-jre\\5e64ec7e056456bef3a4bc4c6fdaef71e8ab6318\\guava-32.1.2-jre.jar
+com.google.guava\:listenablefuture\:9999.0-empty-to-avoid-conflict-with-guava=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.guava\\listenablefuture\\9999.0-empty-to-avoid-conflict-with-guava\\b421526c5f297295adef1c886e5246c39d4ac629\\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
+com.google.j2objc\:j2objc-annotations\:2.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.google.j2objc\\j2objc-annotations\\2.8\\c85270e307e7b822f1086b93689124b89768e273\\j2objc-annotations-2.8.jar
+com.ibm.icu\:icu4j\:73.2=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.ibm.icu\\icu4j\\73.2\\61ad4ef7f9131fcf6d25c34b817f90d6da06c9e9\\icu4j-73.2.jar
+com.machinezoo.noexception\:noexception\:1.7.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.machinezoo.noexception\\noexception\\1.7.1\\b65330c98e38a1f915fa54a6e5eca496505e3f0a\\noexception-1.7.1.jar
+com.mojang\:authlib\:6.0.54=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\authlib\\6.0.54\\de8bc95660e1b2fe8793fd427a7a10dcec5b3ea7\\authlib-6.0.54.jar
+com.mojang\:blocklist\:1.0.10=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\blocklist\\1.0.10\\5c685c5ffa94c4cd39496c7184c1d122e515ecef\\blocklist-1.0.10.jar
+com.mojang\:brigadier\:1.3.10=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\brigadier\\1.3.10\\d15b53a14cf20fdcaa98f731af5dda654452c010\\brigadier-1.3.10.jar
+com.mojang\:datafixerupper\:8.0.16=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\datafixerupper\\8.0.16\\67d4de6d7f95d89bcf5862995fb854ebaec02a34\\datafixerupper-8.0.16.jar
+com.mojang\:logging\:1.2.7=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\logging\\1.2.7\\24cb95ffb0e3433fd6e844c04e68009e504ca1c0\\logging-1.2.7.jar
+com.mojang\:patchy\:2.2.10=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\patchy\\2.2.10\\da05971b07cbb379d002cf7eaec6a2048211fefc\\patchy-2.2.10.jar
+com.mojang\:text2speech\:1.17.9=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\com.mojang\\text2speech\\1.17.9\\3cad216e3a7f0c19b4b394388bc9ffc446f13b14\\text2speech-1.17.9.jar
+commons-codec\:commons-codec\:1.16.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\commons-codec\\commons-codec\\1.16.0\\4e3eb3d79888d76b54e28b350915b5dc3919c9de\\commons-codec-1.16.0.jar
+commons-io\:commons-io\:2.15.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\commons-io\\commons-io\\2.15.1\\f11560da189ab563a5c8e351941415430e9304ea\\commons-io-2.15.1.jar
+commons-logging\:commons-logging\:1.2=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\commons-logging\\commons-logging\\1.2\\4bfc12adfe4842bf07b657f0369c4cb522955686\\commons-logging-1.2.jar
+cpw.mods\:bootstraplauncher\:2.0.2=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\bootstraplauncher\\2.0.2\\1a2d076cbc33b0520cbacd591224427b2a20047d\\bootstraplauncher-2.0.2.jar
+cpw.mods\:modlauncher\:11.0.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\modlauncher\\11.0.5\\b8f0d49294f733fdb6173931b263553e943dc950\\modlauncher-11.0.5.jar
+cpw.mods\:securejarhandler\:3.0.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\cpw.mods\\securejarhandler\\3.0.8\\c0ef95cecd8699a0449053ac7d9c160748d902cd\\securejarhandler-3.0.8.jar
+io.codechicken\:DiffPatch\:2.0.0.36\:all=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.codechicken\\DiffPatch\\2.0.0.36\\5b32f9baa0c0371c0dc80a3b88794960af0c6b44\\DiffPatch-2.0.0.36-all.jar
+io.github.llamalad7\:mixinextras-neoforge\:0.5.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.github.llamalad7\\mixinextras-neoforge\\0.5.0\\d734b83ce6542bb70ea31755c1595b88992dbe65\\mixinextras-neoforge-0.5.0.jar
+io.netty\:netty-buffer\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-buffer\\4.1.97.Final\\f8f3d8644afa5e6e1a40a3a6aeb9d9aa970ecb4f\\netty-buffer-4.1.97.Final.jar
+io.netty\:netty-codec\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-codec\\4.1.97.Final\\384ba4d75670befbedb45c4d3b497a93639c206d\\netty-codec-4.1.97.Final.jar
+io.netty\:netty-common\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-common\\4.1.97.Final\\7cceacaf11df8dc63f23d0fb58e9d4640fc88404\\netty-common-4.1.97.Final.jar
+io.netty\:netty-handler\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-handler\\4.1.97.Final\\abb86c6906bf512bf2b797a41cd7d2e8d3cd7c36\\netty-handler-4.1.97.Final.jar
+io.netty\:netty-resolver\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-resolver\\4.1.97.Final\\cec8348108dc76c47cf87c669d514be52c922144\\netty-resolver-4.1.97.Final.jar
+io.netty\:netty-transport-classes-epoll\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-transport-classes-epoll\\4.1.97.Final\\795da37ded759e862457a82d9d92c4d39ce8ecee\\netty-transport-classes-epoll-4.1.97.Final.jar
+io.netty\:netty-transport-native-unix-common\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-transport-native-unix-common\\4.1.97.Final\\d469d84265ab70095b01b40886cabdd433b6e664\\netty-transport-native-unix-common-4.1.97.Final.jar
+io.netty\:netty-transport\:4.1.97.Final=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\io.netty\\netty-transport\\4.1.97.Final\\f37380d23c9bb079bc702910833b2fd532c9abd0\\netty-transport-4.1.97.Final.jar
+it.unimi.dsi\:fastutil\:8.3.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\it.unimi.dsi\\fastutil\\8.3.1\\ff33b340d60b81f4c1015fa8008bb30ff0a0d53b\\fastutil-8.3.1.jar
+it.unimi.dsi\:fastutil\:8.5.12=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\it.unimi.dsi\\fastutil\\8.5.12\\c24946d46824bd528054bface3231d2ecb7e95e8\\fastutil-8.5.12.jar
+net.covers1624\:Quack\:0.4.10.101=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.covers1624\\Quack\\0.4.10.101\\970b7f652b5c40c893ef9a4bf13a97a291587d74\\Quack-0.4.10.101.jar
+net.fabricmc\:sponge-mixin\:0.15.2+mixin.0.8.7=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.fabricmc\\sponge-mixin\\0.15.2+mixin.0.8.7\\2af2f021d8e02a0220dc27a7a72b4666d66d44ca\\sponge-mixin-0.15.2+mixin.0.8.7.jar
+net.java.dev.jna\:jna-platform\:5.14.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.java.dev.jna\\jna-platform\\5.14.0\\28934d48aed814f11e4c584da55c49fa7032b31b\\jna-platform-5.14.0.jar
+net.java.dev.jna\:jna\:5.14.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.java.dev.jna\\jna\\5.14.0\\67bf3eaea4f0718cb376a181a629e5f88fa1c9dd\\jna-5.14.0.jar
+net.jodah\:typetools\:0.6.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.jodah\\typetools\\0.6.3\\a01aaa6ddaea9ec07ec4f209487b7a46a526283a\\typetools-0.6.3.jar
+net.minecraftforge\:mergetool\:1.1.7\:fatjar=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.minecraftforge\\mergetool\\1.1.7\\3d41564f78f123d64573cae7948014baf3aaba3f\\mergetool-1.1.7-fatjar.jar
+net.minecraftforge\:srgutils\:0.4.15=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.minecraftforge\\srgutils\\0.4.15\\ca408b131759478f164e010fae0d73997e125fb5\\srgutils-0.4.15.jar
+net.minecrell\:terminalconsoleappender\:1.3.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.minecrell\\terminalconsoleappender\\1.3.0\\b562e9bb61235c9520e26282cdee71f8f802d1fc\\terminalconsoleappender-1.3.0.jar
+net.neoforged.accesstransformers\:at-modlauncher\:10.0.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged.accesstransformers\\at-modlauncher\\10.0.1\\5aba50202aceead086bc09fbc2751c9f05cb4890\\at-modlauncher-10.0.1.jar
+net.neoforged.fancymodloader\:earlydisplay\:4.0.41=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged.fancymodloader\\earlydisplay\\4.0.41\\53dfbd387ed1b88c7d144bdb6551b7f57d5da6d7\\earlydisplay-4.0.41.jar
+net.neoforged.fancymodloader\:loader\:4.0.41=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged.fancymodloader\\loader\\4.0.41\\3aebc81b9347fa87bb629ffaed20276f2a4c944e\\loader-4.0.41.jar
+net.neoforged.installertools\:installertools\:2.1.2\:fatjar=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged.installertools\\installertools\\2.1.2\\62740d5aa8f75f4a4d542d363bdda5b64a198f7a\\installertools-2.1.2-fatjar.jar
+net.neoforged.jst\:jst-cli-bundle\:1.0.74=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged.jst\\jst-cli-bundle\\1.0.74\\4b55f9a755ff69d480d3fb5d68c40662f5265b7e\\jst-cli-bundle-1.0.74.jar
+net.neoforged\:AutoRenamingTool\:2.0.3\:all=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\AutoRenamingTool\\2.0.3\\d9890c71b4366f886c2b1006782043a6a6816eb6\\AutoRenamingTool-2.0.3-all.jar
+net.neoforged\:JarJarFileSystems\:0.4.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\JarJarFileSystems\\0.4.1\\78f59f89defcd032ed788b151ca6a0d40ace796a\\JarJarFileSystems-0.4.1.jar
+net.neoforged\:JarJarMetadata\:0.4.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\JarJarMetadata\\0.4.1\\f8da03683dc81694556dc3e177c5e3bb77ae6fcb\\JarJarMetadata-0.4.1.jar
+net.neoforged\:JarJarSelector\:0.4.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\JarJarSelector\\0.4.1\\fb3cc7a58af22ad2880adb98af6d518128c47dae\\JarJarSelector-0.4.1.jar
+net.neoforged\:accesstransformers\:10.0.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\accesstransformers\\10.0.1\\fd83b5725f76eae9115e9355fa1c456a6a441400\\accesstransformers-10.0.1.jar
+net.neoforged\:bus\:8.0.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\bus\\8.0.5\\5b2d33285ab5d1554e9798ad98c40d6ea3868bd5\\bus-8.0.5.jar
+net.neoforged\:coremods\:7.0.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\coremods\\7.0.3\\9147e6f638b4272b3bd5fc8f92ad37802512c6c\\coremods-7.0.3.jar
+net.neoforged\:mergetool\:2.0.0\:api=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\mergetool\\2.0.0\\52fe1949be64e3303aabaaa21e315f551db9c9f4\\mergetool-2.0.0-api.jar
+net.neoforged\:mergetool\:2.0.3\:api=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\mergetool\\2.0.3\\1275202cbbb248f49345cf6787ce299afd9a02fb\\mergetool-2.0.3-api.jar
+net.neoforged\:mergetool\:2.0.3\:fatjar=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\mergetool\\2.0.3\\85c096b0155715275f84922d41462484c9a0285c\\mergetool-2.0.3-fatjar.jar
+net.neoforged\:neoforge\:21.1.208\:sources=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\neoforge\\21.1.208\\9a95d45b028b825d956fde60435baa4c26115afe\\neoforge-21.1.208-sources.jar
+net.neoforged\:neoforge\:21.1.208\:universal=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\neoforge\\21.1.208\\6ba51e7eb3315ea421d4392bb4a3b69c5fbe2caa\\neoforge-21.1.208-universal.jar
+net.neoforged\:neoforge\:21.1.208\:userdev=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\neoforge\\21.1.208\\9855f11263143135035746877eef33fd1025f457\\neoforge-21.1.208-userdev.jar
+net.neoforged\:neoform\:1.21.1-20240808.144430@zip=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.neoforged\\neoform\\1.21.1-20240808.144430\\811e2bd86fa2cda2812e5e8e51d718ea8bd6d3f4\\neoform-1.21.1-20240808.144430.zip
+net.sf.jopt-simple\:jopt-simple\:5.0.4=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\net.sf.jopt-simple\\jopt-simple\\5.0.4\\4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c\\jopt-simple-5.0.4.jar
+org.antlr\:antlr4-runtime\:4.13.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.antlr\\antlr4-runtime\\4.13.1\\17125bae1d965624e265ef49552f6465a2bfa307\\antlr4-runtime-4.13.1.jar
+org.apache.commons\:commons-compress\:1.18=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.commons\\commons-compress\\1.18\\1191f9f2bc0c47a8cce69193feb1ff0a8bcb37d5\\commons-compress-1.18.jar
+org.apache.commons\:commons-compress\:1.26.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.commons\\commons-compress\\1.26.0\\659feffdd12280201c8aacb8f7be94f9a883c824\\commons-compress-1.26.0.jar
+org.apache.commons\:commons-lang3\:3.14.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.commons\\commons-lang3\\3.14.0\\1ed471194b02f2c6cb734a0cd6f6f107c673afae\\commons-lang3-3.14.0.jar
+org.apache.commons\:commons-lang3\:3.9=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.commons\\commons-lang3\\3.9\\122c7cee69b53ed4a7681c03d4ee4c0e2765da5\\commons-lang3-3.9.jar
+org.apache.httpcomponents\:httpclient\:4.5.13=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.httpcomponents\\httpclient\\4.5.13\\e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada\\httpclient-4.5.13.jar
+org.apache.httpcomponents\:httpcore\:4.4.16=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.httpcomponents\\httpcore\\4.4.16\\51cf043c87253c9f58b539c9f7e44c8894223850\\httpcore-4.4.16.jar
+org.apache.logging.log4j\:log4j-api\:2.22.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.logging.log4j\\log4j-api\\2.22.1\\bea6fede6328fabafd7e68363161a7ea6605abd1\\log4j-api-2.22.1.jar
+org.apache.logging.log4j\:log4j-core\:2.22.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.logging.log4j\\log4j-core\\2.22.1\\7183a25510a02ad00cc6a95d3b3d2a7d3c5a8dc4\\log4j-core-2.22.1.jar
+org.apache.logging.log4j\:log4j-slf4j2-impl\:2.22.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.logging.log4j\\log4j-slf4j2-impl\\2.22.1\\d7e6693c2606cb7e7335047d7bb96dec52db5665\\log4j-slf4j2-impl-2.22.1.jar
+org.apache.maven\:maven-artifact\:3.8.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.maven\\maven-artifact\\3.8.5\\4433f50c07debefaed0553bd0068f4f48d449313\\maven-artifact-3.8.5.jar
+org.checkerframework\:checker-qual\:3.33.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.checkerframework\\checker-qual\\3.33.0\\de2b60b62da487644fc11f734e73c8b0b431238f\\checker-qual-3.33.0.jar
+org.codehaus.plexus\:plexus-utils\:3.3.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.codehaus.plexus\\plexus-utils\\3.3.0\\cf43b5391de623b36fe066a21127baef82c64022\\plexus-utils-3.3.0.jar
+org.jcraft\:jorbis\:0.0.17=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.jcraft\\jorbis\\0.0.17\\8872d22b293e8f5d7d56ff92be966e6dc28ebdc6\\jorbis-0.0.17.jar
+org.jetbrains\:annotations\:24.1.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.jetbrains\\annotations\\24.1.0\\7af6a669488450c4a07c2c3254e2151df42d7d04\\annotations-24.1.0.jar
+org.jline\:jline-reader\:3.20.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.jline\\jline-reader\\3.20.0\\8f15415b022a25b473e8e16c28ae913186ffb9c4\\jline-reader-3.20.0.jar
+org.jline\:jline-terminal\:3.20.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.jline\\jline-terminal\\3.20.0\\d0ddcc708ddf527a3454c941b7b9225cc83a15ff\\jline-terminal-3.20.0.jar
+org.joml\:joml\:1.10.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.joml\\joml\\1.10.5\\22566d58af70ad3d72308bab63b8339906deb649\\joml-1.10.5.jar
+org.lwjgl\:lwjgl-freetype\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-freetype\\3.3.3\\a0db6c84a8becc8ca05f9dbfa985edc348a824c7\\lwjgl-freetype-3.3.3.jar
+org.lwjgl\:lwjgl-freetype\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-freetype\\3.3.3\\81091b006dbb43fab04c8c638e9ac87c51b4096d\\lwjgl-freetype-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-freetype\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-freetype\\3.3.3\\82028265a0a2ff33523ca75137ada7dc176e5210\\lwjgl-freetype-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-freetype\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-freetype\\3.3.3\\15a8c1de7f51d07a92eae7ce1222557073a0c0c3\\lwjgl-freetype-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-glfw\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-glfw\\3.3.3\\efa1eb78c5ccd840e9f329717109b5e892d72f8e\\lwjgl-glfw-3.3.3.jar
+org.lwjgl\:lwjgl-glfw\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-glfw\\3.3.3\\e449e28b4891fc423c54c85fbc5bb0b9efece67a\\lwjgl-glfw-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-glfw\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-glfw\\3.3.3\\f27018dc74f6289574502b46cce55d52817554e2\\lwjgl-glfw-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-glfw\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-glfw\\3.3.3\\32334f3fd5270a59bad9939a93115acb6de36dcf\\lwjgl-glfw-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-jemalloc\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-jemalloc\\3.3.3\\b543467b7ff3c6920539a88ee602d34098628be5\\lwjgl-jemalloc-3.3.3.jar
+org.lwjgl\:lwjgl-jemalloc\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-jemalloc\\3.3.3\\426222fc027602a5f21b9c0fe79cde6a4c7a011f\\lwjgl-jemalloc-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-jemalloc\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-jemalloc\\3.3.3\\ba1f3fed0ee4be0217eaa41c5bbfb4b9b1383c33\\lwjgl-jemalloc-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-jemalloc\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-jemalloc\\3.3.3\\f6063b6e0f23be483c5c88d84ce51b39dc69126c\\lwjgl-jemalloc-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-openal\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-openal\\3.3.3\\daada81ceb5fc0c291fbfdd4433cb8d9423577f2\\lwjgl-openal-3.3.3.jar
+org.lwjgl\:lwjgl-openal\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-openal\\3.3.3\\cf83862ae95d98496b26915024c7e666d8ab1c8f\\lwjgl-openal-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-openal\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-openal\\3.3.3\\8e0615235116b9e4160dfe87bec90f5f6378bf72\\lwjgl-openal-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-openal\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-openal\\3.3.3\\87b8d5050e3adb46bb58fe1cb2669a4a48fce10d\\lwjgl-openal-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-opengl\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-opengl\\3.3.3\\2f6b0147078396a58979125a4c947664e98293a\\lwjgl-opengl-3.3.3.jar
+org.lwjgl\:lwjgl-opengl\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-opengl\\3.3.3\\e6c1eec8be8a71951b830a4d69efc01c6531900c\\lwjgl-opengl-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-opengl\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-opengl\\3.3.3\\65e956d3735a1abdc82eff4baec1b61174697d4b\\lwjgl-opengl-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-opengl\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-opengl\\3.3.3\\d32d833dcaa2f355a886eaf21f0408b5f03241d\\lwjgl-opengl-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-stb\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-stb\\3.3.3\\25dd6161988d7e65f71d5065c99902402ee32746\\lwjgl-stb-3.3.3.jar
+org.lwjgl\:lwjgl-stb\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-stb\\3.3.3\\1d9facdf6541de114b0f963be33505b7679c78cb\\lwjgl-stb-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-stb\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-stb\\3.3.3\\a584ab44de569708871f0a79561f4d8c37487f2c\\lwjgl-stb-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-stb\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-stb\\3.3.3\\b5c874687b9aac1a936501d4ed2c49567fd1b575\\lwjgl-stb-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl-tinyfd\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-tinyfd\\3.3.3\\82d755ca94b102e9ca77283b9e2dc46d1b15fbe5\\lwjgl-tinyfd-3.3.3.jar
+org.lwjgl\:lwjgl-tinyfd\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-tinyfd\\3.3.3\\a6697981b0449a5087c1d546fc08b4f73e8f98c9\\lwjgl-tinyfd-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl-tinyfd\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-tinyfd\\3.3.3\\a88c494f3006eb91a7433b12a3a55a9a6c20788b\\lwjgl-tinyfd-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl-tinyfd\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl-tinyfd\\3.3.3\\c336c84ee88cccb495c6ffa112395509e7378e8a\\lwjgl-tinyfd-3.3.3-natives-windows-x86.jar
+org.lwjgl\:lwjgl\:3.3.3=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl\\3.3.3\\29589b5f87ed335a6c7e7ee6a5775f81f97ecb84\\lwjgl-3.3.3.jar
+org.lwjgl\:lwjgl\:3.3.3\:natives-windows=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl\\3.3.3\\a5ed18a2b82fc91b81f40d717cb1f64c9dcb0540\\lwjgl-3.3.3-natives-windows.jar
+org.lwjgl\:lwjgl\:3.3.3\:natives-windows-arm64=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl\\3.3.3\\e9aca8c5479b520a2a7f0d542a118140e812c5e8\\lwjgl-3.3.3-natives-windows-arm64.jar
+org.lwjgl\:lwjgl\:3.3.3\:natives-windows-x86=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lwjgl\\lwjgl\\3.3.3\\9e670718e050aeaeea0c2d5b907cffb142f2e58f\\lwjgl-3.3.3-natives-windows-x86.jar
+org.lz4\:lz4-java\:1.8.0=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.lz4\\lz4-java\\1.8.0\\4b986a99445e49ea5fbf5d149c4b63f6ed6c6780\\lz4-java-1.8.0.jar
+org.openjdk.nashorn\:nashorn-core\:15.4=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.openjdk.nashorn\\nashorn-core\\15.4\\f67f5ffaa5f5130cf6fb9b133da00c7df3b532a5\\nashorn-core-15.4.jar
+org.ow2.asm\:asm-analysis\:9.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-analysis\\9.5\\490bacc77de7cbc0be1a30bb3471072d705be4a4\\asm-analysis-9.5.jar
+org.ow2.asm\:asm-analysis\:9.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-analysis\\9.8\\b9747a320844b6cb1eacd90d8ecfd260a16c01d3\\asm-analysis-9.8.jar
+org.ow2.asm\:asm-commons\:9.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-commons\\9.8\\36e4d212970388e5bd2c5180292012502df461bb\\asm-commons-9.8.jar
+org.ow2.asm\:asm-tree\:9.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-tree\\9.5\\fd33c8b6373abaa675be407082fdfda35021254a\\asm-tree-9.5.jar
+org.ow2.asm\:asm-tree\:9.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-tree\\9.8\\18419ca5b77a2f81097c741e7872e6ab8d2f40d\\asm-tree-9.8.jar
+org.ow2.asm\:asm-util\:9.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-util\\9.5\\64b5a1fc8c1b15ed2efd6a063e976bc8d3dc5ffe\\asm-util-9.5.jar
+org.ow2.asm\:asm-util\:9.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm-util\\9.8\\395f1c1f035258511f27bc9b2583d76e4b143f59\\asm-util-9.8.jar
+org.ow2.asm\:asm\:9.5=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm\\9.5\\dc6ea1875f4d64fbc85e1691c95b96a3d8569c90\\asm-9.5.jar
+org.ow2.asm\:asm\:9.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.ow2.asm\\asm\\9.8\\dc19ecb3f7889b7860697215cae99c0f9b6f6b4b\\asm-9.8.jar
+org.slf4j\:slf4j-api\:2.0.9=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.slf4j\\slf4j-api\\2.0.9\\7cf2726fdcfbc8610f9a71fb3ed639871f315340\\slf4j-api-2.0.9.jar
+org.tukaani\:xz\:1.8=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.tukaani\\xz\\1.8\\c4f7d054303948eb6a4066194253886c8af07128\\xz-1.8.jar
+org.vineflower\:vineflower\:1.10.1=C\:\\Users\\jessy\\.gradle\\caches\\modules-2\\files-2.1\\org.vineflower\\vineflower\\1.10.1\\4f48c5947b21f9ebc743e7c80215ee839d3dc668\\vineflower-1.10.1.jar
diff --git a/build/tmp/jar/MANIFEST.MF b/build/tmp/jar/MANIFEST.MF
new file mode 100644
index 0000000..59499bc
--- /dev/null
+++ b/build/tmp/jar/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..13b122b
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,40 @@
+# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
+org.gradle.jvmargs=-Xmx2G
+org.gradle.daemon=true
+org.gradle.parallel=true
+org.gradle.caching=true
+org.gradle.configuration-cache=true
+## Environment Properties
+# You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge
+# The Minecraft version must agree with the Neo version to get a valid artifact
+minecraft_version=1.21.1
+# The Minecraft version range can use any release version of Minecraft as bounds.
+# Snapshots, pre-releases, and release candidates are not guaranteed to sort properly
+# as they do not follow standard versioning conventions.
+minecraft_version_range=[1.21.1,1.22)
+# The Neo version must agree with the Minecraft version to get a valid artifact
+neo_version=21.1.208
+# The Neo version range can use any version of Neo as bounds
+neo_version_range=[21,)
+# The loader version range can only use the major version of FML as bounds
+loader_version_range=[4,)
+parchment_minecraft_version=1.21.1
+parchment_mappings_version=2024.11.17
+## Mod Properties
+# The unique mod identifier for the mod. Must be lowercase in English locale. Must fit the regex [a-z][a-z0-9_]{1,63}
+# Must match the String constant located in the main mod class annotated with @Mod.
+mod_id=commandify
+# The human-readable display name for the mod.
+mod_name=commandify
+# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
+mod_license=All Rights Reserved
+# The mod version. See https://semver.org/
+mod_version=1.0.1
+# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
+# This should match the base package used for the mod sources.
+# See https://maven.apache.org/guides/mini/guide-naming-conventions.html
+mod_group_id=fr.ultralion
+# The authors of the mod. This is a simple text string that is used for display purposes in the mod list.
+mod_authors=UltraLion
+# The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list.
+mod_description=Commandify
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e69de29
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..a441313
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..b740cf1
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,249 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..25da30d
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..ada876e
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,11 @@
+pluginManagement {
+ repositories {
+ mavenLocal()
+ gradlePluginPortal()
+ maven { url = 'https://maven.neoforged.net/releases' }
+ }
+}
+
+plugins {
+ id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0'
+}
diff --git a/src/main/java/fr/ultralion/commandify/Commandify.java b/src/main/java/fr/ultralion/commandify/Commandify.java
new file mode 100644
index 0000000..6abb454
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/Commandify.java
@@ -0,0 +1,132 @@
+package fr.ultralion.commandify;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.commands.admin.CommandInvsee;
+import fr.ultralion.commandify.commands.chat.*;
+import fr.ultralion.commandify.commands.other.CommandCommandifyInfo;
+import fr.ultralion.commandify.commands.reload.ReloadCommand;
+import fr.ultralion.commandify.commands.teleportation.back.CommandBack;
+import fr.ultralion.commandify.commands.teleportation.homes.CommandDelHome;
+import fr.ultralion.commandify.commands.teleportation.homes.CommandHome;
+import fr.ultralion.commandify.commands.teleportation.homes.CommandHomes;
+import fr.ultralion.commandify.commands.teleportation.homes.CommandSetHome;
+import fr.ultralion.commandify.commands.teleportation.rtp.CommandRtp;
+import fr.ultralion.commandify.commands.teleportation.spawn.SetSpawnCommand;
+import fr.ultralion.commandify.commands.teleportation.spawn.SpawnCommand;
+import fr.ultralion.commandify.commands.teleportation.teleport.*;
+import fr.ultralion.commandify.commands.teleportation.warps.CommandDelWarp;
+import fr.ultralion.commandify.commands.teleportation.warps.CommandSetWarp;
+import fr.ultralion.commandify.commands.teleportation.warps.CommandWarp;
+import fr.ultralion.commandify.commands.teleportation.warps.CommandWarps;
+import fr.ultralion.commandify.commands.worldmanagement.CommandWorld;
+import fr.ultralion.commandify.util.IgnoreManager;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.neoforged.api.distmarker.Dist;
+import net.neoforged.bus.api.SubscribeEvent;
+import net.neoforged.fml.common.EventBusSubscriber;
+import net.neoforged.fml.common.Mod;
+import net.neoforged.fml.loading.FMLLoader;
+import net.neoforged.neoforge.event.RegisterCommandsEvent;
+import net.neoforged.neoforge.event.server.ServerStartingEvent;
+import net.neoforged.neoforge.event.server.ServerStoppingEvent;
+
+@Mod(Commandify.MOD_ID)
+public class Commandify {
+
+ public static final String MOD_ID = "commandify";
+ public static final String MOD_VERSION = "1.0.1";
+
+ public Commandify() {
+ if (FMLLoader.getDist() != Dist.DEDICATED_SERVER) {
+ System.out.println(ConsoleColors.RED + "[Commandify] This mod is for servers only!" + ConsoleColors.RESET);
+ throw new IllegalStateException("[Commandify] Client execution detected.");
+ }
+
+ Config.register();
+ System.out.println(ConsoleColors.GREEN + "[Commandify] Server-side mod initialized successfully!" + ConsoleColors.RESET);
+ }
+
+ public static class ConsoleColors {
+ public static final String RESET = "\u001B[0m";
+ public static final String RED = "\u001B[31m";
+ public static final String GREEN = "\u001B[32m";
+ public static final String YELLOW = "\u001B[33m";
+ public static final String BLUE = "\u001B[34m";
+ public static final String CYAN = "\u001B[36m";
+ public static final String WHITE = "\u001B[37m";
+ public static final String BOLD = "\u001B[1m";
+ }
+
+ @EventBusSubscriber(modid = Commandify.MOD_ID, value = Dist.DEDICATED_SERVER)
+ public static class ServerEvents {
+
+ @SubscribeEvent
+ public static void onServerStarting(ServerStartingEvent event) {
+ var server = event.getServer();
+
+ System.out.println(ConsoleColors.CYAN + "[Commandify] Loading language files..." + ConsoleColors.RESET);
+ Lang.load(server);
+
+ System.out.println(ConsoleColors.CYAN + "[Commandify] Initializing IgnoreManager..." + ConsoleColors.RESET);
+ IgnoreManager.init(server);
+
+ System.out.println(ConsoleColors.GREEN + "[Commandify] Language loaded: " +
+ Config.DEFAULT_LANGUAGE.get() + ConsoleColors.RESET);
+ System.out.println(ConsoleColors.GREEN + "[Commandify] IgnoreManager initialized successfully!" + ConsoleColors.RESET);
+ }
+
+ @SubscribeEvent
+ public static void onRegisterCommands(RegisterCommandsEvent event) {
+ CommandDispatcher dispatcher = event.getDispatcher();
+
+ System.out.println(ConsoleColors.YELLOW + "[Commandify] Registering commands..." + ConsoleColors.RESET);
+
+ SetSpawnCommand.register(dispatcher);
+ SpawnCommand.register(dispatcher);
+ ReloadCommand.register(dispatcher);
+
+ CommandTpa.register(dispatcher);
+ CommandTpahere.register(dispatcher);
+ CommandTpaccept.register(dispatcher);
+ CommandTpadeny.register(dispatcher);
+ CommandTpatoggle.register(dispatcher);
+
+ CommandSetHome.register(dispatcher);
+ CommandHome.register(dispatcher);
+ CommandDelHome.register(dispatcher);
+ CommandHomes.register(dispatcher);
+
+ CommandWarp.register(dispatcher);
+ CommandSetWarp.register(dispatcher);
+ CommandDelWarp.register(dispatcher);
+ CommandWarps.register(dispatcher);
+
+ CommandBack.register(dispatcher);
+ CommandRtp.register(dispatcher);
+
+ CommandWorld.register(dispatcher);
+
+ CommandMsg.register(dispatcher);
+ CommandReply.register(dispatcher);
+ CommandBroadcast.register(dispatcher);
+ CommandIgnore.register(dispatcher);
+ CommandUnignore.register(dispatcher);
+ CommandIgnored.register(dispatcher);
+
+ CommandCommandifyInfo.register(dispatcher);
+ CommandInvsee.register(dispatcher);
+
+ System.out.println(ConsoleColors.GREEN + "[Commandify] All commands have been successfully registered!" + ConsoleColors.RESET);
+ }
+
+ @SubscribeEvent
+ public static void onServerStopping(ServerStoppingEvent event) {
+ System.out.println(ConsoleColors.YELLOW + "[Commandify] The server is stopping... cleaning up resources." + ConsoleColors.RESET);
+
+ IgnoreManager.clearAll();
+
+ System.out.println(ConsoleColors.GREEN + "[Commandify] Commandify has been safely disabled (all data preserved)." + ConsoleColors.RESET);
+ }
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/Config.java b/src/main/java/fr/ultralion/commandify/Config.java
new file mode 100644
index 0000000..39ceb7c
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/Config.java
@@ -0,0 +1,140 @@
+package fr.ultralion.commandify;
+
+import net.neoforged.fml.ModLoadingContext;
+import net.neoforged.fml.config.ModConfig;
+import net.neoforged.neoforge.common.ModConfigSpec;
+
+public class Config {
+
+ public static final ModConfigSpec.BooleanValue ENABLE_SETSPAWN_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_RELOAD_COMMAND;
+ public static final ModConfigSpec.ConfigValue DEFAULT_LANGUAGE;
+ public static final ModConfigSpec GENERAL_SPEC;
+ public static final ModConfigSpec.BooleanValue ENABLE_SPAWN_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_TPA;
+ public static final ModConfigSpec.BooleanValue ENABLE_TPAHERE;
+ public static final ModConfigSpec.BooleanValue ENABLE_TPAACCEPT;
+ public static final ModConfigSpec.BooleanValue ENABLE_TPADENY;
+ public static final ModConfigSpec.BooleanValue ENABLE_TPATOGGLE;
+ public static final ModConfigSpec.BooleanValue ENABLE_HOME_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_SETHOME_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_DELHOME_COMMAND;
+ public static final ModConfigSpec.IntValue MAX_HOMES;
+ public static final ModConfigSpec.BooleanValue ENABLE_WARP_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_WARPS_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_SETWARP_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_DELWARP_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_RTP_COMMAND;
+ public static final ModConfigSpec.IntValue RTP_MAX_DISTANCE;
+ public static final ModConfigSpec.IntValue RTP_COOLDOWN;
+ public static final ModConfigSpec.BooleanValue ENABLE_BACK_COMMAND;
+ public static final ModConfigSpec TELEPORT_SPEC;
+ public static final ModConfigSpec.BooleanValue ENABLE_DAY_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_NIGHT_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_NOON_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_MIDNIGHT_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_SUN_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_RAIN_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_THUNDER_COMMAND;
+ public static final ModConfigSpec WORLD_SPEC;
+ public static final ModConfigSpec.BooleanValue ENABLE_MSG_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_REPLY_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_BROADCAST_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_IGNORE_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_IGNORED_LIST_COMMAND;
+ public static final ModConfigSpec.BooleanValue ENABLE_IGNORE_IN_GLOBAL_CHAT;
+ public static final ModConfigSpec CHAT_SPEC;
+ public static final ModConfigSpec.BooleanValue ENABLE_INVSEE_COMMAND;
+ public static final ModConfigSpec ADMIN_SPEC;
+ // GENERAL
+ private static final ModConfigSpec.Builder GENERAL_BUILDER = new ModConfigSpec.Builder();
+ // TELEPORTATION
+ private static final ModConfigSpec.Builder TELEPORT_BUILDER = new ModConfigSpec.Builder();
+ // WORLD MANAGEMENT
+ private static final ModConfigSpec.Builder WORLD_BUILDER = new ModConfigSpec.Builder();
+ // CHAT COMMANDS
+ private static final ModConfigSpec.Builder CHAT_BUILDER = new ModConfigSpec.Builder();
+ // ADMIN / MODERATION COMMANDS
+ private static final ModConfigSpec.Builder ADMIN_BUILDER = new ModConfigSpec.Builder();
+
+ static {
+ // GENERAL
+ GENERAL_BUILDER.comment("General configuration for Commandify").push("general");
+ ENABLE_SETSPAWN_COMMAND = GENERAL_BUILDER.comment("Enable /setspawn").define("enableSetSpawnCommand", true);
+ ENABLE_RELOAD_COMMAND = GENERAL_BUILDER.comment("Enable /commandify reload").define("enableReloadCommand", true);
+
+ DEFAULT_LANGUAGE = GENERAL_BUILDER
+ .comment("Default language for Commandify (e.g., 'en_us' or 'fr_fr')")
+ .define("defaultLanguage", "en_us");
+
+ GENERAL_BUILDER.pop();
+ GENERAL_SPEC = GENERAL_BUILDER.build();
+
+
+ // TELEPORTATION
+ TELEPORT_BUILDER.comment("Teleportation, homes, warps, and RTP").push("teleportation");
+ ENABLE_SPAWN_COMMAND = TELEPORT_BUILDER.comment("Enable /spawn").define("enableSpawnCommand", true);
+ ENABLE_TPA = TELEPORT_BUILDER.comment("Enable /tpa").define("enableTpa", true);
+ ENABLE_TPAHERE = TELEPORT_BUILDER.comment("Enable /tpahere").define("enableTpahere", true);
+ ENABLE_TPAACCEPT = TELEPORT_BUILDER.comment("Enable /tpaccept").define("enableTpaccept", true);
+ ENABLE_TPADENY = TELEPORT_BUILDER.comment("Enable /tpadeny").define("enableTpadeny", true);
+ ENABLE_TPATOGGLE = TELEPORT_BUILDER.comment("Enable /tpatoggle").define("enableTpatoggle", true);
+ ENABLE_HOME_COMMAND = TELEPORT_BUILDER.comment("Enable /home").define("enableHomeCommand", true);
+ ENABLE_SETHOME_COMMAND = TELEPORT_BUILDER.comment("Enable /sethome").define("enableSetHomeCommand", true);
+ ENABLE_DELHOME_COMMAND = TELEPORT_BUILDER.comment("Enable /delhome").define("enableDelHomeCommand", true);
+ MAX_HOMES = TELEPORT_BUILDER.comment("Maximum number of homes per player").defineInRange("maxHomes", 3, 1, 100);
+ ENABLE_WARP_COMMAND = TELEPORT_BUILDER.comment("Enable /warp").define("enableWarpCommand", true);
+ ENABLE_WARPS_COMMAND = TELEPORT_BUILDER.comment("Enable /warps").define("enableWarpsCommand", true);
+ ENABLE_SETWARP_COMMAND = TELEPORT_BUILDER.comment("Enable /setwarp").define("enableSetWarpCommand", true);
+ ENABLE_DELWARP_COMMAND = TELEPORT_BUILDER.comment("Enable /delwarp").define("enableDelWarpCommand", true);
+ ENABLE_RTP_COMMAND = TELEPORT_BUILDER.comment("Enable /rtp (random teleport)").define("enableRtpCommand", true);
+ RTP_MAX_DISTANCE = TELEPORT_BUILDER.comment("Maximum RTP distance (in blocks)").defineInRange("rtpMaxDistance", 30000, 5000, 100000);
+ RTP_COOLDOWN = TELEPORT_BUILDER.comment("RTP cooldown (in seconds)").defineInRange("rtpCooldown", 60, 0, 3600);
+ ENABLE_BACK_COMMAND = TELEPORT_BUILDER.comment("Enable /back").define("enableBackCommand", true);
+ TELEPORT_BUILDER.pop();
+ TELEPORT_SPEC = TELEPORT_BUILDER.build();
+
+
+ // WORLD MANAGEMENT
+ WORLD_BUILDER.comment("World management (time, weather, etc.)").push("world");
+ ENABLE_DAY_COMMAND = WORLD_BUILDER.comment("Enable /day").define("enableDayCommand", true);
+ ENABLE_NIGHT_COMMAND = WORLD_BUILDER.comment("Enable /night").define("enableNightCommand", true);
+ ENABLE_NOON_COMMAND = WORLD_BUILDER.comment("Enable /noon").define("enableNoonCommand", true);
+ ENABLE_MIDNIGHT_COMMAND = WORLD_BUILDER.comment("Enable /midnight").define("enableMidnightCommand", true);
+ ENABLE_SUN_COMMAND = WORLD_BUILDER.comment("Enable /sun").define("enableSunCommand", true);
+ ENABLE_RAIN_COMMAND = WORLD_BUILDER.comment("Enable /rain").define("enableRainCommand", true);
+ ENABLE_THUNDER_COMMAND = WORLD_BUILDER.comment("Enable /thunder").define("enableThunderCommand", true);
+ WORLD_BUILDER.pop();
+ WORLD_SPEC = WORLD_BUILDER.build();
+
+
+ // CHAT
+ CHAT_BUILDER.comment("Private chat commands, broadcast, and ignore system").push("chat");
+ ENABLE_MSG_COMMAND = CHAT_BUILDER.comment("Enable /msg (private messages)").define("enableMsgCommand", true);
+ ENABLE_REPLY_COMMAND = CHAT_BUILDER.comment("Enable /r (reply to last private message)").define("enableReplyCommand", true);
+ ENABLE_BROADCAST_COMMAND = CHAT_BUILDER.comment("Enable /broadcast (admin global message)").define("enableBroadcastCommand", true);
+ ENABLE_IGNORE_COMMAND = CHAT_BUILDER.comment("Enable /ignore and /unignore (block private messages)").define("enableIgnoreCommand", true);
+ ENABLE_IGNORED_LIST_COMMAND = CHAT_BUILDER.comment("Enable /ignored (view ignored players list)").define("enableIgnoredListCommand", true);
+ ENABLE_IGNORE_IN_GLOBAL_CHAT = CHAT_BUILDER.comment("Hide ignored players' messages in global chat").define("ignoreInGlobalChat", true);
+ CHAT_BUILDER.pop();
+ CHAT_SPEC = CHAT_BUILDER.build();
+
+
+ // ADMIN / MODERATION
+ ADMIN_BUILDER.comment("Administrator and moderation commands").push("admin");
+ ENABLE_INVSEE_COMMAND = ADMIN_BUILDER.comment("Enable /invsee (view and edit a player's inventory)").define("enableInvseeCommand", true);
+ ADMIN_BUILDER.pop();
+ ADMIN_SPEC = ADMIN_BUILDER.build();
+ }
+
+
+ // Register config files
+ public static void register() {
+ var context = ModLoadingContext.get().getActiveContainer();
+ context.registerConfig(ModConfig.Type.SERVER, GENERAL_SPEC, "commandify/commandify-general.toml");
+ context.registerConfig(ModConfig.Type.SERVER, TELEPORT_SPEC, "commandify/teleportation.toml");
+ context.registerConfig(ModConfig.Type.SERVER, WORLD_SPEC, "commandify/world.toml");
+ context.registerConfig(ModConfig.Type.SERVER, CHAT_SPEC, "commandify/chat.toml");
+ context.registerConfig(ModConfig.Type.SERVER, ADMIN_SPEC, "commandify/admin.toml");
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/LateCommandRegister.java b/src/main/java/fr/ultralion/commandify/LateCommandRegister.java
new file mode 100644
index 0000000..c39849a
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/LateCommandRegister.java
@@ -0,0 +1,32 @@
+package fr.ultralion.commandify;
+
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.tree.RootCommandNode;
+import fr.ultralion.commandify.commands.chat.CommandMsg;
+import fr.ultralion.commandify.commands.chat.CommandReply;
+import net.minecraft.commands.CommandSourceStack;
+import net.neoforged.bus.api.SubscribeEvent;
+import net.neoforged.fml.common.EventBusSubscriber;
+import net.neoforged.neoforge.event.RegisterCommandsEvent;
+
+@EventBusSubscriber(modid = Commandify.MOD_ID)
+public class LateCommandRegister {
+
+ @SubscribeEvent
+ public static void onRegisterCommands(RegisterCommandsEvent event) {
+ CommandDispatcher dispatcher = event.getDispatcher();
+ RootCommandNode root = dispatcher.getRoot();
+
+ // Remove vanilla /msg, /tell and /w commands to replace them with custom ones
+ root.getChildren().removeIf(node -> {
+ String name = node.getName();
+ return name.equalsIgnoreCase("msg") || name.equalsIgnoreCase("tell") || name.equalsIgnoreCase("w");
+ });
+
+
+ CommandMsg.register(dispatcher);
+ CommandReply.register(dispatcher);
+
+ System.out.println("[Commandify] Vanilla commands /msg, /tell, and /w removed; replaced with Commandify versions.");
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/admin/CommandInvsee.java b/src/main/java/fr/ultralion/commandify/commands/admin/CommandInvsee.java
new file mode 100644
index 0000000..666e683
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/admin/CommandInvsee.java
@@ -0,0 +1,94 @@
+package fr.ultralion.commandify.commands.admin;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.commands.arguments.EntityArgument;
+import net.minecraft.network.chat.Component;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.MenuProvider;
+import net.minecraft.world.SimpleContainer;
+import net.minecraft.world.entity.player.Inventory;
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.inventory.AbstractContainerMenu;
+import net.minecraft.world.inventory.ChestMenu;
+import net.minecraft.world.inventory.MenuType;
+
+public class CommandInvsee {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("invsee")
+ .requires(src -> src.hasPermission(2))
+ .then(Commands.argument("target", EntityArgument.player())
+ .executes(ctx -> {
+ ServerPlayer viewer = ctx.getSource().getPlayerOrException();
+ ServerPlayer target = EntityArgument.getPlayer(ctx, "target");
+
+ if (viewer.getUUID().equals(target.getUUID())) {
+ viewer.sendSystemMessage(Lang.t("commandify.invsee.self"));
+ return 0;
+ }
+
+ try {
+ openEditableInventory(viewer, target);
+ viewer.sendSystemMessage(Lang.t("commandify.invsee.open", target.getName().getString()));
+ } catch (Exception e) {
+ e.printStackTrace();
+ viewer.sendSystemMessage(Lang.t("commandify.invsee.error", e.getMessage()));
+ }
+
+ return 1;
+ })
+ )
+ );
+ }
+
+ private static void openEditableInventory(ServerPlayer viewer, ServerPlayer target) {
+ SimpleContainer container = new SimpleContainer(45);
+
+ for (int i = 0; i < 36; i++) {
+ container.setItem(i, target.getInventory().items.get(i).copy());
+ }
+
+ container.setItem(36, target.getInventory().armor.get(3).copy());
+ container.setItem(37, target.getInventory().armor.get(2).copy());
+ container.setItem(38, target.getInventory().armor.get(1).copy());
+ container.setItem(39, target.getInventory().armor.get(0).copy());
+ container.setItem(40, target.getInventory().offhand.get(0).copy());
+
+ viewer.openMenu(new MenuProvider() {
+ @Override
+ public Component getDisplayName() {
+ return Lang.t("commandify.invsee.title", target.getName().getString());
+ }
+
+ @Override
+ public AbstractContainerMenu createMenu(int id, Inventory viewerInventory, Player player) {
+ return new ChestMenu(MenuType.GENERIC_9x5, id, viewerInventory, container, 5) {
+ @Override
+ public void removed(Player player) {
+ super.removed(player);
+ applyChangesToTarget(container, target);
+ viewer.sendSystemMessage(Lang.t("commandify.invsee.edited", target.getName().getString()));
+ }
+ };
+ }
+ });
+ }
+
+ private static void applyChangesToTarget(SimpleContainer container, ServerPlayer target) {
+ for (int i = 0; i < 36; i++) {
+ target.getInventory().items.set(i, container.getItem(i).copy());
+ }
+
+ target.getInventory().armor.set(3, container.getItem(36).copy());
+ target.getInventory().armor.set(2, container.getItem(37).copy());
+ target.getInventory().armor.set(1, container.getItem(38).copy());
+ target.getInventory().armor.set(0, container.getItem(39).copy());
+ target.getInventory().offhand.set(0, container.getItem(40).copy());
+
+ target.containerMenu.broadcastChanges();
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/chat/CommandBroadcast.java b/src/main/java/fr/ultralion/commandify/commands/chat/CommandBroadcast.java
new file mode 100644
index 0000000..ae31f35
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/chat/CommandBroadcast.java
@@ -0,0 +1,30 @@
+package fr.ultralion.commandify.commands.chat;
+
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+
+public class CommandBroadcast {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("broadcast")
+ .requires(source -> source.hasPermission(2))
+ .then(Commands.argument("message", StringArgumentType.greedyString())
+ .executes(ctx -> {
+ String message = StringArgumentType.getString(ctx, "message");
+
+ ctx.getSource().getServer().getPlayerList().broadcastSystemMessage(
+ Lang.t("commandify.broadcast.format", message),
+ false
+ );
+
+ ctx.getSource().sendSystemMessage(Lang.t("commandify.broadcast.sent"));
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/chat/CommandIgnore.java b/src/main/java/fr/ultralion/commandify/commands/chat/CommandIgnore.java
new file mode 100644
index 0000000..526e797
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/chat/CommandIgnore.java
@@ -0,0 +1,38 @@
+package fr.ultralion.commandify.commands.chat;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.util.IgnoreManager;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.commands.arguments.EntityArgument;
+import net.minecraft.server.level.ServerPlayer;
+
+public class CommandIgnore {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("ignore")
+ .then(Commands.argument("player", EntityArgument.player())
+ .executes(ctx -> {
+ ServerPlayer sender = ctx.getSource().getPlayerOrException();
+ ServerPlayer target = EntityArgument.getPlayer(ctx, "player");
+
+ if (sender.getUUID().equals(target.getUUID())) {
+ sender.sendSystemMessage(Lang.t("commandify.ignore.self"));
+ return 0;
+ }
+
+ if (IgnoreManager.isIgnoring(sender, target)) {
+ sender.sendSystemMessage(Lang.t("commandify.ignore.already", target.getName().getString()));
+ return 0;
+ }
+
+ IgnoreManager.ignore(sender, target);
+ sender.sendSystemMessage(Lang.t("commandify.ignore.added", target.getName().getString()));
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/chat/CommandIgnored.java b/src/main/java/fr/ultralion/commandify/commands/chat/CommandIgnored.java
new file mode 100644
index 0000000..0b5808a
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/chat/CommandIgnored.java
@@ -0,0 +1,60 @@
+package fr.ultralion.commandify.commands.chat;
+
+import com.mojang.authlib.GameProfile;
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.util.IgnoreManager;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.network.chat.ClickEvent;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.chat.MutableComponent;
+import net.minecraft.network.chat.Style;
+import net.minecraft.server.level.ServerPlayer;
+
+import java.util.Set;
+import java.util.UUID;
+
+public class CommandIgnored {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("ignores")
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+ Set ignored = IgnoreManager.getIgnoredList(player);
+
+ if (ignored.isEmpty()) {
+ player.sendSystemMessage(Lang.t("commandify.ignored.empty"));
+ return 1;
+ }
+
+ player.sendSystemMessage(Lang.t("commandify.ignored.header"));
+
+ for (UUID uuid : ignored) {
+ String name = player.server.getProfileCache()
+ .get(uuid)
+ .map(GameProfile::getName)
+ .orElse(uuid.toString().substring(0, 8));
+
+ MutableComponent clickableName = Component.literal("§e" + name)
+ .setStyle(
+ Style.EMPTY
+ .withUnderlined(true)
+ .withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/unignore " + name))
+ .withHoverEvent(
+ new net.minecraft.network.chat.HoverEvent(
+ net.minecraft.network.chat.HoverEvent.Action.SHOW_TEXT,
+ Lang.t("commandify.ignored.hover", name)
+ )
+ )
+ );
+
+ player.sendSystemMessage(Component.literal(" §7- ").append(clickableName));
+ }
+
+ return 1;
+ })
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/chat/CommandMsg.java b/src/main/java/fr/ultralion/commandify/commands/chat/CommandMsg.java
new file mode 100644
index 0000000..25bc62e
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/chat/CommandMsg.java
@@ -0,0 +1,54 @@
+package fr.ultralion.commandify.commands.chat;
+
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+import fr.ultralion.commandify.util.ChatManager;
+import fr.ultralion.commandify.util.IgnoreManager;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.commands.arguments.EntityArgument;
+import net.minecraft.network.chat.Component;
+import net.minecraft.server.level.ServerPlayer;
+
+public class CommandMsg {
+
+ public static void register(CommandDispatcher dispatcher) {
+
+ LiteralArgumentBuilder base = Commands.literal("msg")
+ .then(Commands.argument("target", EntityArgument.player())
+ .then(Commands.argument("message", StringArgumentType.greedyString())
+ .executes(ctx -> {
+ ServerPlayer sender = ctx.getSource().getPlayerOrException();
+ ServerPlayer target = EntityArgument.getPlayer(ctx, "target");
+ String message = StringArgumentType.getString(ctx, "message");
+
+ if (sender.getUUID().equals(target.getUUID())) {
+ sender.sendSystemMessage(Lang.t("commandify.msg.self"));
+ return 0;
+ }
+
+ if (IgnoreManager.isIgnoring(target, sender)) {
+ sender.sendSystemMessage(Lang.t("commandify.msg.ignored"));
+ return 0;
+ }
+
+ Component toSender = Lang.t("commandify.msg.to_sender", target.getName().getString(), message);
+ Component toTarget = Lang.t("commandify.msg.to_target", sender.getName().getString(), message);
+
+ sender.sendSystemMessage(toSender);
+ target.sendSystemMessage(toTarget);
+
+ ChatManager.setLastMessaged(sender, target);
+ return 1;
+ })
+ )
+ );
+
+ dispatcher.register(base);
+
+ dispatcher.register(Commands.literal("tell").redirect(base.build()));
+ dispatcher.register(Commands.literal("w").redirect(base.build()));
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/chat/CommandReply.java b/src/main/java/fr/ultralion/commandify/commands/chat/CommandReply.java
new file mode 100644
index 0000000..ee0af09
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/chat/CommandReply.java
@@ -0,0 +1,55 @@
+package fr.ultralion.commandify.commands.chat;
+
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import fr.ultralion.commandify.util.ChatManager;
+import fr.ultralion.commandify.util.IgnoreManager;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.network.chat.Component;
+import net.minecraft.server.level.ServerPlayer;
+
+import java.util.UUID;
+
+public class CommandReply {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("r")
+ .then(Commands.argument("message", StringArgumentType.greedyString())
+ .executes(ctx -> {
+ ServerPlayer sender = ctx.getSource().getPlayerOrException();
+ String message = StringArgumentType.getString(ctx, "message");
+
+ UUID lastUUID = ChatManager.getLastMessaged(sender);
+ if (lastUUID == null) {
+ sender.sendSystemMessage(Lang.t("commandify.reply.none"));
+ return 0;
+ }
+
+ ServerPlayer target = sender.server.getPlayerList().getPlayer(lastUUID);
+ if (target == null) {
+ sender.sendSystemMessage(Lang.t("commandify.reply.offline"));
+ return 0;
+ }
+
+ if (IgnoreManager.isIgnoring(target, sender)) {
+ sender.sendSystemMessage(Lang.t("commandify.reply.ignored"));
+ return 0;
+ }
+
+ Component toSender = Lang.t("commandify.reply.to_sender", target.getName().getString(), message);
+ Component toTarget = Lang.t("commandify.reply.to_target", sender.getName().getString(), message);
+
+ sender.sendSystemMessage(toSender);
+ target.sendSystemMessage(toTarget);
+
+ ChatManager.setLastMessaged(sender, target);
+
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/chat/CommandUnignore.java b/src/main/java/fr/ultralion/commandify/commands/chat/CommandUnignore.java
new file mode 100644
index 0000000..c3f3944
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/chat/CommandUnignore.java
@@ -0,0 +1,33 @@
+package fr.ultralion.commandify.commands.chat;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.util.IgnoreManager;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.commands.arguments.EntityArgument;
+import net.minecraft.server.level.ServerPlayer;
+
+public class CommandUnignore {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("unignore")
+ .then(Commands.argument("player", EntityArgument.player())
+ .executes(ctx -> {
+ ServerPlayer sender = ctx.getSource().getPlayerOrException();
+ ServerPlayer target = EntityArgument.getPlayer(ctx, "player");
+
+ if (!IgnoreManager.isIgnoring(sender, target)) {
+ sender.sendSystemMessage(Lang.t("commandify.unignore.not_ignored", target.getName().getString()));
+ return 0;
+ }
+
+ IgnoreManager.unignore(sender, target);
+ sender.sendSystemMessage(Lang.t("commandify.unignore.success", target.getName().getString()));
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/other/CommandCommandifyInfo.java b/src/main/java/fr/ultralion/commandify/commands/other/CommandCommandifyInfo.java
new file mode 100644
index 0000000..29b6e73
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/other/CommandCommandifyInfo.java
@@ -0,0 +1,37 @@
+package fr.ultralion.commandify.commands.other;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.Commandify;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.network.chat.Component;
+
+public class CommandCommandifyInfo {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("commandify")
+ .then(Commands.literal("info")
+ .executes(ctx -> {
+ CommandSourceStack source = ctx.getSource();
+
+ source.sendSystemMessage(Lang.t("commandify.info.title", Commandify.MOD_VERSION));
+ source.sendSystemMessage(Lang.t("commandify.info.author"));
+ source.sendSystemMessage(Lang.t("commandify.info.website"));
+ source.sendSystemMessage(Component.literal(""));
+ source.sendSystemMessage(Lang.t("commandify.info.modules_title"));
+ source.sendSystemMessage(Lang.t("commandify.info.module.teleport"));
+ source.sendSystemMessage(Lang.t("commandify.info.module.world"));
+ source.sendSystemMessage(Lang.t("commandify.info.module.chat"));
+ source.sendSystemMessage(Component.literal(""));
+ source.sendSystemMessage(Lang.t("commandify.info.modid", Commandify.MOD_ID));
+ source.sendSystemMessage(Lang.t("commandify.info.server_version", source.getServer().getServerVersion()));
+ source.sendSystemMessage(Lang.t("commandify.info.players", String.valueOf(source.getServer().getPlayerCount())));
+
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/reload/ReloadCommand.java b/src/main/java/fr/ultralion/commandify/commands/reload/ReloadCommand.java
new file mode 100644
index 0000000..6ee2c10
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/reload/ReloadCommand.java
@@ -0,0 +1,47 @@
+package fr.ultralion.commandify.commands.reload;
+
+import com.electronwill.nightconfig.core.file.CommentedFileConfig;
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+
+public class ReloadCommand {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("commandify")
+ .requires(source -> source.hasPermission(2))
+ .then(Commands.literal("reload")
+ .executes(ctx -> {
+ CommandSourceStack source = ctx.getSource();
+
+ try {
+ Path path = Paths.get("config", "commandify-server.toml");
+
+ CommentedFileConfig configData = CommentedFileConfig.builder(path).sync().autosave().build();
+ configData.load();
+
+ Config.ENABLE_SPAWN_COMMAND.set(configData.getOrElse("enableSpawnCommand", true));
+ Config.ENABLE_SETSPAWN_COMMAND.set(configData.getOrElse("enableSetSpawnCommand", true));
+
+ configData.close();
+
+ source.sendSuccess(() -> Lang.t("commandify.reload.success"), true);
+ System.out.println("[Commandify] Configuration successfully reloaded!");
+ } catch (Exception e) {
+ e.printStackTrace();
+ source.sendFailure(Lang.t("commandify.reload.error"));
+ }
+
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/back/BackEvents.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/back/BackEvents.java
new file mode 100644
index 0000000..bbcfd07
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/back/BackEvents.java
@@ -0,0 +1,27 @@
+package fr.ultralion.commandify.commands.teleportation.back;
+
+import fr.ultralion.commandify.Commandify;
+import net.minecraft.server.level.ServerPlayer;
+import net.neoforged.api.distmarker.Dist;
+import net.neoforged.bus.api.SubscribeEvent;
+import net.neoforged.fml.common.EventBusSubscriber;
+import net.neoforged.neoforge.event.entity.EntityTeleportEvent;
+import net.neoforged.neoforge.event.entity.living.LivingDeathEvent;
+
+@EventBusSubscriber(modid = Commandify.MOD_ID, value = Dist.DEDICATED_SERVER)
+public class BackEvents {
+
+ @SubscribeEvent
+ public static void onPlayerDeath(LivingDeathEvent event) {
+ if (event.getEntity() instanceof ServerPlayer player) {
+ BackManager.saveLastLocation(player);
+ }
+ }
+
+ @SubscribeEvent
+ public static void onTeleport(EntityTeleportEvent.EnderEntity event) {
+ if (event.getEntity() instanceof ServerPlayer player) {
+ BackManager.saveLastLocation(player);
+ }
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/back/BackManager.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/back/BackManager.java
new file mode 100644
index 0000000..8f9dfc2
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/back/BackManager.java
@@ -0,0 +1,41 @@
+package fr.ultralion.commandify.commands.teleportation.back;
+
+import net.minecraft.core.registries.Registries;
+import net.minecraft.resources.ResourceKey;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.level.Level;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+public class BackManager {
+
+ private static final Map lastLocations = new HashMap<>();
+
+ public static void saveLastLocation(ServerPlayer player) {
+ String dim = player.level().dimension().location().toString();
+ lastLocations.put(player.getUUID(), new BackLocation(dim, player.getX(), player.getY(), player.getZ(), player.getYRot(), player.getXRot()));
+ }
+
+ public static boolean teleportBack(ServerPlayer player) {
+ BackLocation loc = lastLocations.get(player.getUUID());
+ if (loc == null) return false;
+
+ String[] parts = loc.dimension.split(":");
+ String namespace = parts.length > 1 ? parts[0] : "minecraft";
+ String path = parts.length > 1 ? parts[1] : loc.dimension;
+
+ ResourceKey dim = ResourceKey.create(Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath(namespace, path));
+ ServerLevel world = player.getServer().getLevel(dim);
+ if (world == null) return false;
+
+ player.teleportTo(world, loc.x, loc.y, loc.z, loc.yaw, loc.pitch);
+ return true;
+ }
+
+ public record BackLocation(String dimension, double x, double y, double z, float yaw, float pitch) {
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/back/CommandBack.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/back/CommandBack.java
new file mode 100644
index 0000000..72a9bc3
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/back/CommandBack.java
@@ -0,0 +1,34 @@
+package fr.ultralion.commandify.commands.teleportation.back;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.server.level.ServerPlayer;
+
+public class CommandBack {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("back")
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+
+ if (!Config.ENABLE_BACK_COMMAND.get()) {
+ player.sendSystemMessage(Lang.t("commandify.back.disabled"));
+ return 0;
+ }
+
+ boolean ok = BackManager.teleportBack(player);
+ if (!ok) {
+ player.sendSystemMessage(Lang.t("commandify.back.no_previous"));
+ return 0;
+ }
+
+ player.sendSystemMessage(Lang.t("commandify.back.success"));
+ return 1;
+ })
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandDelHome.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandDelHome.java
new file mode 100644
index 0000000..6d4ca1a
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandDelHome.java
@@ -0,0 +1,38 @@
+package fr.ultralion.commandify.commands.teleportation.homes;
+
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.server.level.ServerPlayer;
+
+import java.util.Map;
+
+public class CommandDelHome {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("delhome")
+ .then(Commands.argument("name", StringArgumentType.word())
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+ String name = StringArgumentType.getString(ctx, "name").toLowerCase();
+
+ Map homes = HomeData.loadHomes(player);
+
+ if (!homes.containsKey(name)) {
+ player.sendSystemMessage(Lang.t("commandify.delhome.not_found", name));
+ return 0;
+ }
+
+ homes.remove(name);
+ HomeData.saveHomes(player, homes);
+
+ player.sendSystemMessage(Lang.t("commandify.delhome.success", name));
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandHome.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandHome.java
new file mode 100644
index 0000000..ee0d612
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandHome.java
@@ -0,0 +1,60 @@
+package fr.ultralion.commandify.commands.teleportation.homes;
+
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import fr.ultralion.commandify.commands.teleportation.back.BackManager;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.core.registries.Registries;
+import net.minecraft.resources.ResourceKey;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.level.Level;
+
+import java.util.Map;
+
+
+public class CommandHome {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("home")
+ .then(Commands.argument("name", StringArgumentType.word())
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+ String name = StringArgumentType.getString(ctx, "name").toLowerCase();
+
+ Map homes = HomeData.loadHomes(player);
+ HomeData.Home home = homes.get(name);
+
+ if (home == null) {
+ player.sendSystemMessage(Lang.t("commandify.home.not_found", name));
+ return 0;
+ }
+
+ String[] parts = home.dimension().split(":");
+ String namespace = parts.length > 1 ? parts[0] : "minecraft";
+ String path = parts.length > 1 ? parts[1] : home.dimension();
+
+ ResourceLocation location = ResourceLocation.fromNamespaceAndPath(namespace, path);
+ ResourceKey dim = ResourceKey.create(Registries.DIMENSION, location);
+
+ ServerLevel world = player.getServer().getLevel(dim);
+ if (world == null) {
+ player.sendSystemMessage(Lang.t("commandify.home.invalid_world"));
+ return 0;
+ }
+
+ BackManager.saveLastLocation(player);
+
+ player.teleportTo(world, home.x(), home.y(), home.z(), home.yaw(), home.pitch());
+ player.sendSystemMessage(Lang.t("commandify.home.success", name));
+
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandHomes.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandHomes.java
new file mode 100644
index 0000000..09d17d8
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandHomes.java
@@ -0,0 +1,66 @@
+package fr.ultralion.commandify.commands.teleportation.homes;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.network.chat.ClickEvent;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.chat.MutableComponent;
+import net.minecraft.network.chat.Style;
+import net.minecraft.server.level.ServerPlayer;
+
+import java.util.Map;
+
+public class CommandHomes {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("homes")
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+
+ if (!Config.ENABLE_HOME_COMMAND.get()) {
+ player.sendSystemMessage(Lang.t("commandify.homes.disabled"));
+ return 0;
+ }
+
+ Map homes = HomeData.loadHomes(player);
+
+ if (homes.isEmpty()) {
+ player.sendSystemMessage(Lang.t("commandify.homes.none"));
+ return 0;
+ }
+
+ player.sendSystemMessage(Lang.t("commandify.homes.header", String.valueOf(homes.size())));
+
+ for (var entry : homes.entrySet()) {
+ String name = entry.getKey();
+
+ MutableComponent homeText = Component.literal("§e• " + name + " ");
+
+ MutableComponent tpButton = Component.literal("§a[TP]")
+ .setStyle(
+ Style.EMPTY
+ .withClickEvent(new ClickEvent(
+ ClickEvent.Action.RUN_COMMAND,
+ "/home " + name
+ ))
+ .withHoverEvent(
+ new net.minecraft.network.chat.HoverEvent(
+ net.minecraft.network.chat.HoverEvent.Action.SHOW_TEXT,
+ Lang.t("commandify.homes.hover_tp", name)
+ )
+ )
+ );
+
+ player.sendSystemMessage(homeText.append(tpButton));
+ }
+
+ player.sendSystemMessage(Lang.t("commandify.homes.footer"));
+ return 1;
+ })
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandSetHome.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandSetHome.java
new file mode 100644
index 0000000..5d2102a
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/CommandSetHome.java
@@ -0,0 +1,46 @@
+package fr.ultralion.commandify.commands.teleportation.homes;
+
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.server.level.ServerPlayer;
+
+import java.util.Map;
+
+public class CommandSetHome {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("sethome")
+ .then(Commands.argument("name", StringArgumentType.word())
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+ String name = StringArgumentType.getString(ctx, "name").toLowerCase();
+
+ Map homes = HomeData.loadHomes(player);
+
+ if (homes.size() >= Config.MAX_HOMES.get() && !homes.containsKey(name)) {
+ player.sendSystemMessage(Lang.t("commandify.sethome.limit_reached", String.valueOf(Config.MAX_HOMES.get())));
+ return 0;
+ }
+
+ HomeData.Home home = new HomeData.Home(
+ name,
+ player.level().dimension().location().toString(),
+ player.getX(), player.getY(), player.getZ(),
+ player.getYRot(), player.getXRot()
+ );
+
+ homes.put(name, home);
+ HomeData.saveHomes(player, homes);
+
+ player.sendSystemMessage(Lang.t("commandify.sethome.success", name));
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/HomeData.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/HomeData.java
new file mode 100644
index 0000000..5a7164d
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/homes/HomeData.java
@@ -0,0 +1,106 @@
+package fr.ultralion.commandify.commands.teleportation.homes;
+
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.level.storage.LevelResource;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+public class HomeData {
+
+ private static Path getHomesDir(MinecraftServer server) {
+ return server.getWorldPath(LevelResource.ROOT)
+ .resolve("data")
+ .resolve("commandify")
+ .resolve("homes");
+ }
+
+ public static Map loadHomes(ServerPlayer player) {
+ Map homes = new HashMap<>();
+ try {
+ Path dir = getHomesDir(player.getServer());
+ Files.createDirectories(dir);
+ Path file = dir.resolve(player.getUUID() + ".json");
+
+ if (!Files.exists(file)) {
+ System.out.println(ConsoleColors.YELLOW + "[Commandify] No homes file found for " + player.getName().getString() + ConsoleColors.RESET);
+ return homes;
+ }
+
+ try (Reader reader = Files.newBufferedReader(file)) {
+ JsonObject json = JsonParser.parseReader(reader).getAsJsonObject();
+ for (String key : json.keySet()) {
+ JsonObject data = json.getAsJsonObject(key);
+ homes.put(key, new Home(
+ key,
+ data.get("dimension").getAsString(),
+ data.get("x").getAsDouble(),
+ data.get("y").getAsDouble(),
+ data.get("z").getAsDouble(),
+ data.get("yaw").getAsFloat(),
+ data.get("pitch").getAsFloat()
+ ));
+ }
+ }
+
+ System.out.println(ConsoleColors.GREEN + "[Commandify] Loaded " + homes.size() + " homes for " + player.getName().getString() + ConsoleColors.RESET);
+
+ } catch (IOException e) {
+ System.out.println(ConsoleColors.RED + "[Commandify] Failed to load homes for " + player.getName().getString() + ": " + e.getMessage() + ConsoleColors.RESET);
+ }
+ return homes;
+ }
+
+ public static void saveHomes(ServerPlayer player, Map homes) {
+ try {
+ Path dir = getHomesDir(player.getServer());
+ Files.createDirectories(dir);
+ Path file = dir.resolve(player.getUUID() + ".json");
+
+ JsonObject json = new JsonObject();
+ for (var entry : homes.entrySet()) {
+ Home h = entry.getValue();
+ JsonObject data = new JsonObject();
+ data.addProperty("dimension", h.dimension);
+ data.addProperty("x", h.x);
+ data.addProperty("y", h.y);
+ data.addProperty("z", h.z);
+ data.addProperty("yaw", h.yaw);
+ data.addProperty("pitch", h.pitch);
+ json.add(entry.getKey(), data);
+ }
+
+ try (Writer writer = Files.newBufferedWriter(file)) {
+ new GsonBuilder().setPrettyPrinting().create().toJson(json, writer);
+ }
+
+ System.out.println(ConsoleColors.GREEN + "[Commandify] Saved " + homes.size() + " homes for " + player.getName().getString() + ConsoleColors.RESET);
+
+ } catch (IOException e) {
+ System.out.println(ConsoleColors.RED + "[Commandify] Failed to save homes for " + player.getName().getString() + ": " + e.getMessage() + ConsoleColors.RESET);
+ }
+ }
+
+ /**
+ * ANSI color codes for readable console output
+ */
+ public static class ConsoleColors {
+ public static final String RESET = "\u001B[0m";
+ public static final String RED = "\u001B[31m";
+ public static final String GREEN = "\u001B[32m";
+ public static final String YELLOW = "\u001B[33m";
+ public static final String CYAN = "\u001B[36m";
+ }
+
+ public record Home(String name, String dimension, double x, double y, double z, float yaw, float pitch) {
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/rtp/CommandRtp.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/rtp/CommandRtp.java
new file mode 100644
index 0000000..05ae9f5
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/rtp/CommandRtp.java
@@ -0,0 +1,160 @@
+package fr.ultralion.commandify.commands.teleportation.rtp;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.core.BlockPos;
+import net.minecraft.resources.ResourceKey;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.biome.Biome;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.levelgen.Heightmap;
+
+import java.util.*;
+
+public class CommandRtp {
+
+ private static final int MAX_ATTEMPTS = 40;
+ private static final Map rtpCooldowns = new HashMap<>();
+ private static final Random RANDOM = new Random();
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("rtp")
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+ ServerLevel world = player.getServer().getLevel(Level.OVERWORLD);
+
+ if (world == null) {
+ player.sendSystemMessage(Lang.t("commandify.rtp.no_world"));
+ return 0;
+ }
+
+ boolean enabled;
+ int globalRange;
+ int cooldownSeconds;
+
+ try {
+ enabled = Config.ENABLE_RTP_COMMAND.get();
+ globalRange = Config.RTP_MAX_DISTANCE.get();
+ cooldownSeconds = Config.RTP_COOLDOWN.get();
+ } catch (IllegalStateException e) {
+ enabled = true;
+ globalRange = 30000;
+ cooldownSeconds = 60;
+ }
+
+ if (!enabled) {
+ player.sendSystemMessage(Lang.t("commandify.rtp.disabled"));
+ return 0;
+ }
+
+ UUID uuid = player.getUUID();
+ long now = System.currentTimeMillis();
+ long cooldownEnd = rtpCooldowns.getOrDefault(uuid, 0L);
+ long cooldownMs = cooldownSeconds * 1000L;
+
+ if (now < cooldownEnd) {
+ long secondsLeft = (cooldownEnd - now) / 1000;
+ player.sendSystemMessage(Lang.t("commandify.rtp.cooldown", String.valueOf(secondsLeft)));
+ return 0;
+ }
+
+ player.sendSystemMessage(Lang.t("commandify.rtp.searching"));
+
+ final ServerLevel worldFinal = world;
+ final long nowFinal = now;
+ final long cooldownMsFinal = cooldownMs;
+ final int rangeFinal = globalRange;
+
+ new Thread(() -> {
+ BlockPos safePos = findSafePosition(worldFinal, rangeFinal);
+
+ if (safePos == null) {
+ player.server.execute(() ->
+ player.sendSystemMessage(Lang.t("commandify.rtp.no_safe"))
+ );
+ return;
+ }
+
+ rtpCooldowns.put(uuid, nowFinal + cooldownMsFinal);
+
+ player.server.execute(() -> {
+ if (!player.isAlive()) return;
+
+ player.teleportTo(
+ worldFinal,
+ safePos.getX() + 0.5,
+ safePos.getY(),
+ safePos.getZ() + 0.5,
+ player.getYRot(),
+ player.getXRot()
+ );
+
+ player.sendSystemMessage(Lang.t(
+ "commandify.rtp.success",
+ safePos.getX() + " " + safePos.getY() + " " + safePos.getZ()
+ ));
+ });
+
+ }, "Commandify-RTP-Thread-" + player.getName().getString()).start();
+
+ return 1;
+ })
+ );
+ }
+
+ private static BlockPos findSafePosition(ServerLevel world, int maxDistance) {
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ int x = RANDOM.nextInt(maxDistance * 2) - maxDistance;
+ int z = RANDOM.nextInt(maxDistance * 2) - maxDistance;
+
+ world.getChunk(new BlockPos(x, 0, z));
+ int y = world.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z);
+ BlockPos pos = new BlockPos(x, y, z);
+
+ if (!isSafe(world, pos)) continue;
+
+ String biomeName = getBiomeName(world, pos);
+ if (biomeName.contains("ocean") || biomeName.contains("river") || biomeName.contains("deep")) continue;
+
+ return pos;
+ }
+ return null;
+ }
+
+ private static boolean isSafe(ServerLevel world, BlockPos pos) {
+ if (pos.getY() <= world.getMinBuildHeight() + 1 || pos.getY() >= world.getMaxBuildHeight() - 2)
+ return false;
+
+ var below = world.getBlockState(pos.below());
+ var at = world.getBlockState(pos);
+ var above = world.getBlockState(pos.above());
+
+ if (!below.isSolidRender(world, pos.below())) return false;
+ if (!at.isAir() || !above.isAir()) return false;
+
+ return !(below.is(Blocks.LAVA) ||
+ below.is(Blocks.WATER) ||
+ below.is(Blocks.MAGMA_BLOCK) ||
+ below.is(Blocks.CACTUS) ||
+ below.is(Blocks.FIRE) ||
+ below.is(Blocks.POWDER_SNOW));
+ }
+
+ private static String getBiomeName(ServerLevel world, BlockPos pos) {
+ try {
+ var biome = world.getBiome(pos).value();
+ Optional> biomeKey = world.registryAccess()
+ .registryOrThrow(net.minecraft.core.registries.Registries.BIOME)
+ .getResourceKey(biome);
+ return biomeKey.map(key -> key.location().toString()).orElse("unknown");
+ } catch (Exception e) {
+ return "unknown";
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/spawn/SetSpawnCommand.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/spawn/SetSpawnCommand.java
new file mode 100644
index 0000000..2252c69
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/spawn/SetSpawnCommand.java
@@ -0,0 +1,44 @@
+package fr.ultralion.commandify.commands.teleportation.spawn;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.commands.teleportation.spawn.data.SpawnData;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.server.level.ServerPlayer;
+
+public class SetSpawnCommand {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("setspawn")
+ .requires(source -> source.hasPermission(2))
+ .executes(ctx -> {
+ CommandSourceStack source = ctx.getSource();
+
+ if (!Config.ENABLE_SETSPAWN_COMMAND.get()) {
+ source.sendFailure(Lang.t("commandify.setspawn.disabled"));
+ return 0;
+ }
+
+ if (!(source.getEntity() instanceof ServerPlayer player)) {
+ source.sendFailure(Lang.t("commandify.setspawn.player_only"));
+ return 0;
+ }
+
+ double x = player.getX();
+ double y = player.getY();
+ double z = player.getZ();
+ float yaw = player.getYRot();
+ float pitch = player.getXRot();
+
+ SpawnData data = new SpawnData(x, y, z, yaw, pitch);
+ data.save(player.getServer());
+
+ source.sendSuccess(() -> Lang.t("commandify.setspawn.success"), false);
+ return 1;
+ })
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/spawn/SpawnCommand.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/spawn/SpawnCommand.java
new file mode 100644
index 0000000..0a4a41c
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/spawn/SpawnCommand.java
@@ -0,0 +1,50 @@
+package fr.ultralion.commandify.commands.teleportation.spawn;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.commands.teleportation.spawn.data.SpawnData;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.level.Level;
+
+public class SpawnCommand {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("spawn")
+ .executes(ctx -> {
+ CommandSourceStack source = ctx.getSource();
+
+ if (!Config.ENABLE_SPAWN_COMMAND.get()) {
+ source.sendFailure(Lang.t("commandify.spawn.disabled"));
+ return 0;
+ }
+
+ if (!(source.getEntity() instanceof ServerPlayer player)) {
+ source.sendFailure(Lang.t("commandify.spawn.player_only"));
+ return 0;
+ }
+
+ SpawnData data = SpawnData.load(player.getServer());
+ if (data == null) {
+ player.sendSystemMessage(Lang.t("commandify.spawn.not_set"));
+ return 0;
+ }
+
+ ServerLevel world = player.getServer().getLevel(Level.OVERWORLD);
+ if (world == null) {
+ player.sendSystemMessage(Lang.t("commandify.spawn.no_world"));
+ return 0;
+ }
+
+ player.teleportTo(world, data.getX(), data.getY(), data.getZ(), data.getYaw(), data.getPitch());
+ player.sendSystemMessage(Lang.t("commandify.spawn.success"));
+
+ return 1;
+ })
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/spawn/data/SpawnData.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/spawn/data/SpawnData.java
new file mode 100644
index 0000000..0298255
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/spawn/data/SpawnData.java
@@ -0,0 +1,79 @@
+package fr.ultralion.commandify.commands.teleportation.spawn.data;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import net.minecraft.core.BlockPos;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.world.level.storage.LevelResource;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+
+public class SpawnData {
+
+ private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
+ private static final String FILE_NAME = "commandify_spawn.json";
+
+ private final double x;
+ private final double y;
+ private final double z;
+ private final float yaw;
+ private final float pitch;
+
+ public SpawnData(double x, double y, double z, float yaw, float pitch) {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ this.yaw = yaw;
+ this.pitch = pitch;
+ }
+
+ public static SpawnData load(MinecraftServer server) {
+ File worldDir = server.getWorldPath(LevelResource.ROOT).toFile();
+ File file = new File(worldDir, FILE_NAME);
+ if (!file.exists()) return null;
+
+ try (FileReader reader = new FileReader(file)) {
+ return GSON.fromJson(reader, SpawnData.class);
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public void save(MinecraftServer server) {
+ File worldDir = server.getWorldPath(LevelResource.ROOT).toFile();
+ File file = new File(worldDir, FILE_NAME);
+ try (FileWriter writer = new FileWriter(file)) {
+ GSON.toJson(this, writer);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public BlockPos toBlockPos() {
+ return new BlockPos((int) x, (int) y, (int) z);
+ }
+
+ public double getX() {
+ return x;
+ }
+
+ public double getY() {
+ return y;
+ }
+
+ public double getZ() {
+ return z;
+ }
+
+ public float getYaw() {
+ return yaw;
+ }
+
+ public float getPitch() {
+ return pitch;
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpa.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpa.java
new file mode 100644
index 0000000..590acb8
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpa.java
@@ -0,0 +1,60 @@
+package fr.ultralion.commandify.commands.teleportation.teleport;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.ChatFormatting;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.network.chat.ClickEvent;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.chat.HoverEvent;
+import net.minecraft.network.chat.MutableComponent;
+import net.minecraft.server.level.ServerPlayer;
+
+public class CommandTpa {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("tpa")
+ .then(Commands.argument("player", net.minecraft.commands.arguments.EntityArgument.player())
+ .executes(ctx -> {
+ ServerPlayer sender = ctx.getSource().getPlayerOrException();
+ ServerPlayer target = net.minecraft.commands.arguments.EntityArgument.getPlayer(ctx, "player");
+
+ if (target.getUUID().equals(sender.getUUID())) {
+ sender.sendSystemMessage(Lang.t("commandify.tpa.self"));
+ return 0;
+ }
+
+ if (!TeleportManager.sendRequest(sender, target, false)) {
+ sender.sendSystemMessage(Lang.t("commandify.tpa.blocked"));
+ return 0;
+ }
+
+ sender.sendSystemMessage(Lang.t("commandify.tpa.sent", target.getName().getString()));
+
+ MutableComponent acceptButton = Lang.raw("commandify.tpa.accept_button").copy()
+ .withStyle(style -> style.withColor(ChatFormatting.GREEN)
+ .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tpaccept"))
+ .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Lang.t("commandify.tpa.accept_hover"))));
+
+ MutableComponent denyButton = Lang.raw("commandify.tpa.deny_button").copy()
+ .withStyle(style -> style.withColor(ChatFormatting.RED)
+ .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tpadeny"))
+ .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Lang.t("commandify.tpa.deny_hover"))));
+
+ Component message = Component.empty()
+ .append(Component.literal(sender.getName().getString()).withStyle(ChatFormatting.GOLD))
+ .append(Lang.t("commandify.tpa.request_message"))
+ .append(Component.literal(" "))
+ .append(acceptButton)
+ .append(Component.literal(" "))
+ .append(denyButton);
+
+ target.sendSystemMessage(message);
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpaccept.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpaccept.java
new file mode 100644
index 0000000..120e2c7
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpaccept.java
@@ -0,0 +1,64 @@
+package fr.ultralion.commandify.commands.teleportation.teleport;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.commands.teleportation.back.BackManager;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.level.Level;
+
+import java.util.UUID;
+
+public class CommandTpaccept {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("tpaccept")
+ .executes(ctx -> {
+ ServerPlayer target = ctx.getSource().getPlayerOrException();
+
+ TeleportManager.TpaRequest request = TeleportManager.getRequest(target.getUUID());
+ if (request == null) {
+ target.sendSystemMessage(Lang.t("commandify.tpaccept.none"));
+ return 0;
+ }
+
+ UUID requesterId = request.getRequester();
+ ServerPlayer requester = target.getServer().getPlayerList().getPlayer(requesterId);
+
+ if (requester == null) {
+ target.sendSystemMessage(Lang.t("commandify.tpaccept.offline"));
+ TeleportManager.removeRequest(target.getUUID());
+ return 0;
+ }
+
+ ServerLevel world = target.getServer().getLevel(Level.OVERWORLD);
+
+ if (request.isHere()) {
+ BackManager.saveLastLocation(target);
+
+ target.teleportTo(world,
+ requester.getX(), requester.getY(), requester.getZ(),
+ requester.getYRot(), requester.getXRot());
+
+ target.sendSystemMessage(Lang.t("commandify.tpaccept.here_target", requester.getName().getString()));
+ requester.sendSystemMessage(Lang.t("commandify.tpaccept.here_requester", target.getName().getString()));
+ } else {
+ BackManager.saveLastLocation(requester);
+
+ requester.teleportTo(world,
+ target.getX(), target.getY(), target.getZ(),
+ target.getYRot(), target.getXRot());
+
+ requester.sendSystemMessage(Lang.t("commandify.tpaccept.tpa_requester", target.getName().getString()));
+ target.sendSystemMessage(Lang.t("commandify.tpaccept.tpa_target", requester.getName().getString()));
+ }
+
+ TeleportManager.removeRequest(target.getUUID());
+ return 1;
+ })
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpadeny.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpadeny.java
new file mode 100644
index 0000000..f1994c6
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpadeny.java
@@ -0,0 +1,40 @@
+package fr.ultralion.commandify.commands.teleportation.teleport;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.server.level.ServerPlayer;
+
+import java.util.UUID;
+
+public class CommandTpadeny {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("tpadeny")
+ .executes(ctx -> {
+ ServerPlayer target = ctx.getSource().getPlayerOrException();
+
+ TeleportManager.TpaRequest request = TeleportManager.getRequest(target.getUUID());
+
+ if (request == null) {
+ target.sendSystemMessage(Lang.t("commandify.tpadeny.none"));
+ return 0;
+ }
+
+ UUID requesterId = request.getRequester();
+ ServerPlayer requester = target.getServer().getPlayerList().getPlayer(requesterId);
+
+ if (requester != null) {
+ requester.sendSystemMessage(Lang.t("commandify.tpadeny.to_requester", target.getName().getString()));
+ }
+
+ target.sendSystemMessage(Lang.t("commandify.tpadeny.to_target"));
+
+ TeleportManager.removeRequest(target.getUUID());
+ return 1;
+ })
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpahere.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpahere.java
new file mode 100644
index 0000000..a666099
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpahere.java
@@ -0,0 +1,60 @@
+package fr.ultralion.commandify.commands.teleportation.teleport;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.ChatFormatting;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.network.chat.ClickEvent;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.chat.HoverEvent;
+import net.minecraft.network.chat.MutableComponent;
+import net.minecraft.server.level.ServerPlayer;
+
+public class CommandTpahere {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("tpahere")
+ .then(Commands.argument("player", net.minecraft.commands.arguments.EntityArgument.player())
+ .executes(ctx -> {
+ ServerPlayer sender = ctx.getSource().getPlayerOrException();
+ ServerPlayer target = net.minecraft.commands.arguments.EntityArgument.getPlayer(ctx, "player");
+
+ if (target.getUUID().equals(sender.getUUID())) {
+ sender.sendSystemMessage(Lang.t("commandify.tpahere.self"));
+ return 0;
+ }
+
+ if (!TeleportManager.sendRequest(sender, target, true)) {
+ sender.sendSystemMessage(Lang.t("commandify.tpahere.blocked"));
+ return 0;
+ }
+
+ sender.sendSystemMessage(Lang.t("commandify.tpahere.sent", target.getName().getString()));
+
+ MutableComponent acceptButton = Lang.raw("commandify.tpahere.accept_button").copy()
+ .withStyle(style -> style.withColor(ChatFormatting.GREEN)
+ .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tpaccept"))
+ .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Lang.t("commandify.tpahere.accept_hover"))));
+
+ MutableComponent denyButton = Lang.raw("commandify.tpahere.deny_button").copy()
+ .withStyle(style -> style.withColor(ChatFormatting.RED)
+ .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tpadeny"))
+ .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Lang.t("commandify.tpahere.deny_hover"))));
+
+ Component message = Component.empty()
+ .append(Component.literal(sender.getName().getString()).withStyle(ChatFormatting.GOLD))
+ .append(Lang.t("commandify.tpahere.request_message"))
+ .append(Component.literal(" "))
+ .append(acceptButton)
+ .append(Component.literal(" "))
+ .append(denyButton);
+
+ target.sendSystemMessage(message);
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpatoggle.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpatoggle.java
new file mode 100644
index 0000000..9e3d693
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/CommandTpatoggle.java
@@ -0,0 +1,29 @@
+package fr.ultralion.commandify.commands.teleportation.teleport;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.server.level.ServerPlayer;
+
+public class CommandTpatoggle {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("tpatoggle")
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+
+ boolean enabled = TeleportManager.toggleTpa(player);
+
+ if (enabled) {
+ player.sendSystemMessage(Lang.t("commandify.tpatoggle.enabled"));
+ } else {
+ player.sendSystemMessage(Lang.t("commandify.tpatoggle.disabled"));
+ }
+
+ return 1;
+ })
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/TeleportManager.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/TeleportManager.java
new file mode 100644
index 0000000..4b24c07
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/teleport/TeleportManager.java
@@ -0,0 +1,96 @@
+package fr.ultralion.commandify.commands.teleportation.teleport;
+
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.server.level.ServerPlayer;
+
+import java.time.Instant;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+public class TeleportManager {
+
+ private static final Map pendingRequests = new ConcurrentHashMap<>();
+ private static final Set tpaDisabled = ConcurrentHashMap.newKeySet();
+ private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+ private static final int EXPIRATION_SECONDS = 60;
+
+ public static boolean sendRequest(ServerPlayer sender, ServerPlayer target, boolean here) {
+ if (tpaDisabled.contains(target.getUUID())) return false;
+
+ UUID targetId = target.getUUID();
+ TpaRequest request = new TpaRequest(sender.getUUID(), here);
+ pendingRequests.put(targetId, request);
+
+ scheduler.schedule(() -> expireRequest(target, request), EXPIRATION_SECONDS, TimeUnit.SECONDS);
+ return true;
+ }
+
+ public static TpaRequest getRequest(UUID targetId) {
+ return pendingRequests.get(targetId);
+ }
+
+ public static void removeRequest(UUID targetId) {
+ pendingRequests.remove(targetId);
+ }
+
+ public static boolean isTpaDisabled(ServerPlayer player) {
+ return tpaDisabled.contains(player.getUUID());
+ }
+
+ public static boolean toggleTpa(ServerPlayer player) {
+ UUID id = player.getUUID();
+ if (tpaDisabled.remove(id)) {
+ return true;
+ } else {
+ tpaDisabled.add(id);
+ return false;
+ }
+ }
+
+ private static void expireRequest(ServerPlayer target, TpaRequest request) {
+ TpaRequest current = pendingRequests.get(target.getUUID());
+ if (current != null && current == request) {
+ pendingRequests.remove(target.getUUID());
+
+ ServerPlayer requester = target.getServer().getPlayerList().getPlayer(request.getRequester());
+
+ if (requester != null) {
+ requester.sendSystemMessage(Lang.t("commandify.tpa.expired_requester", target.getName().getString()));
+ }
+
+ target.sendSystemMessage(Lang.t(
+ "commandify.tpa.expired_target",
+ requester != null ? requester.getName().getString() : Lang.getRaw("commandify.tpa.unknown_player")
+ ));
+ }
+ }
+
+ public static class TpaRequest {
+ private final UUID requester;
+ private final boolean here;
+ private final Instant created;
+
+ public TpaRequest(UUID requester, boolean here) {
+ this.requester = requester;
+ this.here = here;
+ this.created = Instant.now();
+ }
+
+ public UUID getRequester() {
+ return requester;
+ }
+
+ public boolean isHere() {
+ return here;
+ }
+
+ public Instant getCreated() {
+ return created;
+ }
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandDelWarp.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandDelWarp.java
new file mode 100644
index 0000000..f47da44
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandDelWarp.java
@@ -0,0 +1,44 @@
+package fr.ultralion.commandify.commands.teleportation.warps;
+
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.server.level.ServerPlayer;
+
+import java.util.Map;
+
+public class CommandDelWarp {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("delwarp")
+ .then(Commands.argument("name", StringArgumentType.word())
+ .requires(src -> src.hasPermission(2))
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+
+ if (!Config.ENABLE_DELWARP_COMMAND.get()) {
+ player.sendSystemMessage(Lang.t("commandify.delwarp.disabled"));
+ return 0;
+ }
+
+ String name = StringArgumentType.getString(ctx, "name").toLowerCase();
+ Map warps = WarpData.loadWarps(player.getServer());
+
+ if (!warps.containsKey(name)) {
+ player.sendSystemMessage(Lang.t("commandify.delwarp.not_found", name));
+ return 0;
+ }
+
+ warps.remove(name);
+ WarpData.saveWarps(player.getServer(), warps);
+ player.sendSystemMessage(Lang.t("commandify.delwarp.success", name));
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandSetWarp.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandSetWarp.java
new file mode 100644
index 0000000..5580289
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandSetWarp.java
@@ -0,0 +1,47 @@
+package fr.ultralion.commandify.commands.teleportation.warps;
+
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.server.level.ServerPlayer;
+
+import java.util.Map;
+
+public class CommandSetWarp {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("setwarp")
+ .then(Commands.argument("name", StringArgumentType.word())
+ .requires(src -> src.hasPermission(2))
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+
+ if (!Config.ENABLE_SETWARP_COMMAND.get()) {
+ player.sendSystemMessage(Lang.t("commandify.setwarp.disabled"));
+ return 0;
+ }
+
+ String name = StringArgumentType.getString(ctx, "name").toLowerCase();
+ Map warps = WarpData.loadWarps(player.getServer());
+
+ WarpData.Warp warp = new WarpData.Warp(
+ name,
+ player.level().dimension().location().toString(),
+ player.getX(), player.getY(), player.getZ(),
+ player.getYRot(), player.getXRot()
+ );
+
+ warps.put(name, warp);
+ WarpData.saveWarps(player.getServer(), warps);
+
+ player.sendSystemMessage(Lang.t("commandify.setwarp.success", name));
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandWarp.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandWarp.java
new file mode 100644
index 0000000..68bd3ef
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandWarp.java
@@ -0,0 +1,62 @@
+package fr.ultralion.commandify.commands.teleportation.warps;
+
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.commands.teleportation.back.BackManager;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.core.registries.Registries;
+import net.minecraft.resources.ResourceKey;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.level.Level;
+
+import java.util.Map;
+
+public class CommandWarp {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("warp")
+ .then(Commands.argument("name", StringArgumentType.word())
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+
+ if (!Config.ENABLE_WARP_COMMAND.get()) {
+ player.sendSystemMessage(Lang.t("commandify.warp.disabled"));
+ return 0;
+ }
+
+ String name = StringArgumentType.getString(ctx, "name").toLowerCase();
+ Map warps = WarpData.loadWarps(player.getServer());
+ WarpData.Warp warp = warps.get(name);
+
+ if (warp == null) {
+ player.sendSystemMessage(Lang.t("commandify.warp.not_found", name));
+ return 0;
+ }
+
+ String[] parts = warp.dimension().split(":");
+ String namespace = parts.length > 1 ? parts[0] : "minecraft";
+ String path = parts.length > 1 ? parts[1] : warp.dimension();
+ ResourceKey dim = ResourceKey.create(Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath(namespace, path));
+
+ ServerLevel world = player.getServer().getLevel(dim);
+ if (world == null) {
+ player.sendSystemMessage(Lang.t("commandify.warp.invalid_world"));
+ return 0;
+ }
+
+ BackManager.saveLastLocation(player);
+
+ player.teleportTo(world, warp.x(), warp.y(), warp.z(), warp.yaw(), warp.pitch());
+ player.sendSystemMessage(Lang.t("commandify.warp.success", name));
+ return 1;
+ })
+ )
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandWarps.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandWarps.java
new file mode 100644
index 0000000..623b98f
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/CommandWarps.java
@@ -0,0 +1,61 @@
+package fr.ultralion.commandify.commands.teleportation.warps;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.network.chat.ClickEvent;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.chat.HoverEvent;
+import net.minecraft.network.chat.MutableComponent;
+import net.minecraft.server.level.ServerPlayer;
+
+import java.util.Map;
+
+public class CommandWarps {
+
+ public static void register(CommandDispatcher dispatcher) {
+ dispatcher.register(
+ Commands.literal("warps")
+ .executes(ctx -> {
+ ServerPlayer player = ctx.getSource().getPlayerOrException();
+
+ if (!Config.ENABLE_WARPS_COMMAND.get()) {
+ player.sendSystemMessage(Lang.t("commandify.warps.disabled"));
+ return 0;
+ }
+
+ Map warps = WarpData.loadWarps(player.getServer());
+
+ if (warps.isEmpty()) {
+ player.sendSystemMessage(Lang.t("commandify.warps.empty"));
+ return 1;
+ }
+
+ player.sendSystemMessage(Lang.t("commandify.warps.header"));
+
+ for (var entry : warps.entrySet()) {
+ String name = entry.getKey();
+
+ MutableComponent warpLine = Component.literal("§e• §f" + name + " ")
+ .append(
+ Component.literal("§a[TP]")
+ .withStyle(style -> style
+ .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/warp " + name))
+ .withHoverEvent(new HoverEvent(
+ HoverEvent.Action.SHOW_TEXT,
+ Lang.t("commandify.warps.hover", name)
+ ))
+ )
+ );
+
+ player.sendSystemMessage(warpLine);
+ }
+
+ player.sendSystemMessage(Lang.t("commandify.warps.footer"));
+ return 1;
+ })
+ );
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/WarpData.java b/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/WarpData.java
new file mode 100644
index 0000000..4013b89
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/teleportation/warps/WarpData.java
@@ -0,0 +1,95 @@
+package fr.ultralion.commandify.commands.teleportation.warps;
+
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.world.level.storage.LevelResource;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+public class WarpData {
+
+ private static final String FILE_NAME = "warps.json";
+
+ private static Path getFile(MinecraftServer server) {
+ return server.getWorldPath(LevelResource.ROOT)
+ .resolve("data")
+ .resolve("commandify")
+ .resolve(FILE_NAME);
+ }
+
+ public static Map loadWarps(MinecraftServer server) {
+ Map warps = new HashMap<>();
+ Path file = getFile(server);
+ if (!Files.exists(file)) {
+ System.out.println(ConsoleColors.YELLOW + "[Commandify] No warp file found, skipping load." + ConsoleColors.RESET);
+ return warps;
+ }
+
+ try (Reader reader = Files.newBufferedReader(file)) {
+ JsonObject json = JsonParser.parseReader(reader).getAsJsonObject();
+ for (String key : json.keySet()) {
+ JsonObject data = json.getAsJsonObject(key);
+ warps.put(key, new Warp(
+ key,
+ data.get("dimension").getAsString(),
+ data.get("x").getAsDouble(),
+ data.get("y").getAsDouble(),
+ data.get("z").getAsDouble(),
+ data.get("yaw").getAsFloat(),
+ data.get("pitch").getAsFloat()
+ ));
+ }
+ System.out.println(ConsoleColors.GREEN + "[Commandify] Loaded " + warps.size() + " warps." + ConsoleColors.RESET);
+ } catch (IOException e) {
+ System.out.println(ConsoleColors.RED + "[Commandify] Failed to load warps: " + e.getMessage() + ConsoleColors.RESET);
+ }
+ return warps;
+ }
+
+ public static void saveWarps(MinecraftServer server, Map warps) {
+ try {
+ Path file = getFile(server);
+ Files.createDirectories(file.getParent());
+
+ JsonObject json = new JsonObject();
+ for (var entry : warps.entrySet()) {
+ Warp w = entry.getValue();
+ JsonObject data = new JsonObject();
+ data.addProperty("dimension", w.dimension);
+ data.addProperty("x", w.x);
+ data.addProperty("y", w.y);
+ data.addProperty("z", w.z);
+ data.addProperty("yaw", w.yaw);
+ data.addProperty("pitch", w.pitch);
+ json.add(entry.getKey(), data);
+ }
+
+ try (Writer writer = Files.newBufferedWriter(file)) {
+ new GsonBuilder().setPrettyPrinting().create().toJson(json, writer);
+ }
+
+ System.out.println(ConsoleColors.GREEN + "[Commandify] Saved " + warps.size() + " warps." + ConsoleColors.RESET);
+ } catch (IOException e) {
+ System.out.println(ConsoleColors.RED + "[Commandify] Failed to save warps: " + e.getMessage() + ConsoleColors.RESET);
+ }
+ }
+
+ public static class ConsoleColors {
+ public static final String RESET = "\u001B[0m";
+ public static final String RED = "\u001B[31m";
+ public static final String GREEN = "\u001B[32m";
+ public static final String YELLOW = "\u001B[33m";
+ public static final String CYAN = "\u001B[36m";
+ }
+
+ public record Warp(String name, String dimension, double x, double y, double z, float yaw, float pitch) {
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/commands/worldmanagement/CommandWorld.java b/src/main/java/fr/ultralion/commandify/commands/worldmanagement/CommandWorld.java
new file mode 100644
index 0000000..e18fd2a
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/commands/worldmanagement/CommandWorld.java
@@ -0,0 +1,110 @@
+package fr.ultralion.commandify.commands.worldmanagement;
+
+import com.mojang.brigadier.CommandDispatcher;
+import fr.ultralion.commandify.Config;
+import fr.ultralion.commandify.util.Lang;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.server.level.ServerLevel;
+
+public class CommandWorld {
+
+ public static void register(CommandDispatcher dispatcher) {
+
+ //day
+ dispatcher.register(
+ Commands.literal("day")
+ .requires(src -> src.hasPermission(2))
+ .executes(ctx -> {
+ if (!Config.ENABLE_DAY_COMMAND.get()) return disabled(ctx.getSource());
+ ServerLevel world = ctx.getSource().getLevel();
+ world.setDayTime(1000);
+ ctx.getSource().sendSystemMessage(Lang.t("commandify.world.day"));
+ return 1;
+ })
+ );
+
+ //night
+ dispatcher.register(
+ Commands.literal("night")
+ .requires(src -> src.hasPermission(2))
+ .executes(ctx -> {
+ if (!Config.ENABLE_NIGHT_COMMAND.get()) return disabled(ctx.getSource());
+ ServerLevel world = ctx.getSource().getLevel();
+ world.setDayTime(13000);
+ ctx.getSource().sendSystemMessage(Lang.t("commandify.world.night"));
+ return 1;
+ })
+ );
+
+ //noon
+ dispatcher.register(
+ Commands.literal("noon")
+ .requires(src -> src.hasPermission(2))
+ .executes(ctx -> {
+ if (!Config.ENABLE_NOON_COMMAND.get()) return disabled(ctx.getSource());
+ ServerLevel world = ctx.getSource().getLevel();
+ world.setDayTime(6000);
+ ctx.getSource().sendSystemMessage(Lang.t("commandify.world.noon"));
+ return 1;
+ })
+ );
+
+ //midnight
+ dispatcher.register(
+ Commands.literal("midnight")
+ .requires(src -> src.hasPermission(2))
+ .executes(ctx -> {
+ if (!Config.ENABLE_MIDNIGHT_COMMAND.get()) return disabled(ctx.getSource());
+ ServerLevel world = ctx.getSource().getLevel();
+ world.setDayTime(18000);
+ ctx.getSource().sendSystemMessage(Lang.t("commandify.world.midnight"));
+ return 1;
+ })
+ );
+
+ //sun
+ dispatcher.register(
+ Commands.literal("sun")
+ .requires(src -> src.hasPermission(2))
+ .executes(ctx -> {
+ if (!Config.ENABLE_SUN_COMMAND.get()) return disabled(ctx.getSource());
+ ServerLevel world = ctx.getSource().getLevel();
+ world.setWeatherParameters(6000, 0, false, false);
+ ctx.getSource().sendSystemMessage(Lang.t("commandify.world.sun"));
+ return 1;
+ })
+ );
+
+ //rain
+ dispatcher.register(
+ Commands.literal("rain")
+ .requires(src -> src.hasPermission(2))
+ .executes(ctx -> {
+ if (!Config.ENABLE_RAIN_COMMAND.get()) return disabled(ctx.getSource());
+ ServerLevel world = ctx.getSource().getLevel();
+ world.setWeatherParameters(0, 6000, true, false);
+ ctx.getSource().sendSystemMessage(Lang.t("commandify.world.rain"));
+ return 1;
+ })
+ );
+
+ //thunder
+ dispatcher.register(
+ Commands.literal("thunder")
+ .requires(src -> src.hasPermission(2))
+ .executes(ctx -> {
+ if (!Config.ENABLE_THUNDER_COMMAND.get()) return disabled(ctx.getSource());
+ ServerLevel world = ctx.getSource().getLevel();
+ world.setWeatherParameters(0, 6000, true, true);
+ ctx.getSource().sendSystemMessage(Lang.t("commandify.world.thunder"));
+ return 1;
+ })
+ );
+ }
+
+ private static int disabled(CommandSourceStack source) {
+ source.sendSystemMessage(Lang.t("commandify.world.disabled"));
+ return 0;
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/events/ChatFilter.java b/src/main/java/fr/ultralion/commandify/events/ChatFilter.java
new file mode 100644
index 0000000..d1af853
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/events/ChatFilter.java
@@ -0,0 +1,29 @@
+package fr.ultralion.commandify.events;
+
+import fr.ultralion.commandify.Commandify;
+import fr.ultralion.commandify.util.IgnoreManager;
+import net.minecraft.network.chat.Component;
+import net.minecraft.server.level.ServerPlayer;
+import net.neoforged.bus.api.SubscribeEvent;
+import net.neoforged.fml.common.EventBusSubscriber;
+import net.neoforged.neoforge.event.ServerChatEvent;
+
+@EventBusSubscriber(modid = Commandify.MOD_ID)
+public class ChatFilter {
+
+ @SubscribeEvent
+ public static void onPlayerChat(ServerChatEvent event) {
+ ServerPlayer sender = event.getPlayer();
+ var server = sender.getServer();
+
+ String plain = event.getMessage().getString();
+
+ event.setCanceled(true);
+
+ for (ServerPlayer target : server.getPlayerList().getPlayers()) {
+ if (!IgnoreManager.isIgnoring(target, sender)) {
+ target.sendSystemMessage(Component.literal("<" + sender.getName().getString() + "> " + plain));
+ }
+ }
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/util/ChatManager.java b/src/main/java/fr/ultralion/commandify/util/ChatManager.java
new file mode 100644
index 0000000..8bca180
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/util/ChatManager.java
@@ -0,0 +1,25 @@
+package fr.ultralion.commandify.util;
+
+import net.minecraft.server.level.ServerPlayer;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+public class ChatManager {
+
+ private static final Map LAST_MSG = new HashMap<>();
+
+ public static void setLastMessaged(ServerPlayer sender, ServerPlayer target) {
+ LAST_MSG.put(sender.getUUID(), target.getUUID());
+ LAST_MSG.put(target.getUUID(), sender.getUUID());
+ }
+
+ public static UUID getLastMessaged(ServerPlayer player) {
+ return LAST_MSG.get(player.getUUID());
+ }
+
+ public static void clear() {
+ LAST_MSG.clear();
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/util/IgnoreManager.java b/src/main/java/fr/ultralion/commandify/util/IgnoreManager.java
new file mode 100644
index 0000000..d92aea9
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/util/IgnoreManager.java
@@ -0,0 +1,118 @@
+package fr.ultralion.commandify.util;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.level.ServerPlayer;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+public class IgnoreManager {
+
+ private static final Map> CACHE = new HashMap<>();
+ private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
+ private static File BASE_DIR;
+
+ public static void init(MinecraftServer server) {
+ File dataDir = new File(server.getWorldPath(net.minecraft.world.level.storage.LevelResource.ROOT).toFile(), "data/commandify/ignored");
+ if (!dataDir.exists()) dataDir.mkdirs();
+ BASE_DIR = dataDir;
+
+ File[] files = BASE_DIR.listFiles((dir, name) -> name.endsWith(".json"));
+ if (files != null) {
+ for (File f : files) {
+ try (Reader reader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8)) {
+ UUID playerId = UUID.fromString(f.getName().replace(".json", ""));
+ List list = GSON.fromJson(reader, new TypeToken>() {
+ }.getType());
+ if (list != null) {
+ Set ignored = new HashSet<>();
+ for (String s : list) ignored.add(UUID.fromString(s));
+ CACHE.put(playerId, ignored);
+ }
+ } catch (Exception e) {
+ System.out.println(ConsoleColors.RED + "[Commandify] Failed to load ignore file " + f.getName() + ": " + e.getMessage() + ConsoleColors.RESET);
+ }
+ }
+ }
+
+ System.out.println(ConsoleColors.GREEN + "[Commandify] IgnoreManager initialized (" + CACHE.size() + " files loaded)." + ConsoleColors.RESET);
+ }
+
+ public static void ignore(ServerPlayer ignorer, ServerPlayer target) {
+ Set ignored = CACHE.computeIfAbsent(ignorer.getUUID(), k -> new HashSet<>());
+ ignored.add(target.getUUID());
+ save(ignorer.getUUID());
+ }
+
+ public static void unignore(ServerPlayer ignorer, ServerPlayer target) {
+ Set ignored = CACHE.get(ignorer.getUUID());
+ if (ignored != null) {
+ ignored.remove(target.getUUID());
+ if (ignored.isEmpty()) {
+ CACHE.remove(ignorer.getUUID());
+ deleteFile(ignorer.getUUID());
+ } else {
+ save(ignorer.getUUID());
+ }
+ }
+ }
+
+ public static boolean isIgnoring(ServerPlayer ignorer, ServerPlayer target) {
+ Set ignored = CACHE.get(ignorer.getUUID());
+ return ignored != null && ignored.contains(target.getUUID());
+ }
+
+ public static Set getIgnoredList(ServerPlayer player) {
+ return CACHE.getOrDefault(player.getUUID(), Collections.emptySet());
+ }
+
+ private static void save(UUID playerId) {
+ if (BASE_DIR == null) return;
+ Set ignored = CACHE.get(playerId);
+ File file = new File(BASE_DIR, playerId.toString() + ".json");
+
+ if (ignored == null || ignored.isEmpty()) {
+ if (file.exists()) file.delete();
+ return;
+ }
+
+ try (Writer writer = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)) {
+ List list = new ArrayList<>();
+ for (UUID id : ignored) list.add(id.toString());
+ GSON.toJson(list, writer);
+ } catch (IOException e) {
+ System.out.println(ConsoleColors.RED + "[Commandify] Failed to save ignore file for " + playerId + ": " + e.getMessage() + ConsoleColors.RESET);
+ }
+ }
+
+ private static void deleteFile(UUID playerId) {
+ if (BASE_DIR == null) return;
+ File file = new File(BASE_DIR, playerId.toString() + ".json");
+ if (file.exists()) file.delete();
+ }
+
+ public static void clearAll() {
+ CACHE.clear();
+ if (BASE_DIR == null) return;
+ File[] files = BASE_DIR.listFiles();
+ if (files != null) {
+ for (File f : files) f.delete();
+ }
+ System.out.println(ConsoleColors.YELLOW + "[Commandify] All ignore data cleared." + ConsoleColors.RESET);
+ }
+
+ /**
+ * Console colors for better readability
+ */
+ public static class ConsoleColors {
+ public static final String RESET = "\u001B[0m";
+ public static final String RED = "\u001B[31m";
+ public static final String GREEN = "\u001B[32m";
+ public static final String YELLOW = "\u001B[33m";
+ public static final String CYAN = "\u001B[36m";
+ }
+}
diff --git a/src/main/java/fr/ultralion/commandify/util/Lang.java b/src/main/java/fr/ultralion/commandify/util/Lang.java
new file mode 100644
index 0000000..b418831
--- /dev/null
+++ b/src/main/java/fr/ultralion/commandify/util/Lang.java
@@ -0,0 +1,128 @@
+package fr.ultralion.commandify.util;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.mojang.logging.LogUtils;
+import fr.ultralion.commandify.Commandify;
+import fr.ultralion.commandify.Config;
+import net.minecraft.network.chat.Component;
+import net.minecraft.server.MinecraftServer;
+import org.slf4j.Logger;
+
+import java.io.*;
+import java.lang.reflect.Type;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Lang {
+
+ private static final Gson GSON = new Gson();
+ private static final Map TRANSLATIONS = new HashMap<>();
+ private static final Logger LOGGER = LogUtils.getLogger();
+ private static String currentLang = null;
+
+ public static void load(MinecraftServer server) {
+ String langCode = Config.DEFAULT_LANGUAGE.get();
+ if (langCode.equals(currentLang)) return;
+
+ TRANSLATIONS.clear();
+ currentLang = langCode;
+
+ File langDir = new File("config/commandify/lang");
+ if (!langDir.exists()) {
+ langDir.mkdirs();
+ System.out.println(ConsoleColors.CYAN + "[Commandify] Created language folder: " + langDir.getAbsolutePath() + ConsoleColors.RESET);
+ }
+
+ copyAllLangFiles();
+
+ File langFile = new File(langDir, langCode + ".json");
+ if (!langFile.exists()) {
+ System.out.println(ConsoleColors.YELLOW + "[Commandify] Language file '" + langCode + "' not found in config folder, falling back to en_us.json" + ConsoleColors.RESET);
+ langFile = new File(langDir, "en_us.json");
+ }
+
+ try (Reader reader = new InputStreamReader(new FileInputStream(langFile), StandardCharsets.UTF_8)) {
+ Type type = new TypeToken