feat(mappings): start mapping rework

This commit is contained in:
ineanto 2024-09-11 11:56:39 +02:00
parent 144245fc5a
commit b7be5ad54e
Signed by: ineanto
GPG key ID: E511F9CAA2F9CE84
108 changed files with 293 additions and 1568 deletions

View file

@ -8,6 +8,11 @@
<option name="modules"> <option name="modules">
<set> <set>
<option value="$PROJECT_DIR$" /> <option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/api" />
<option value="$PROJECT_DIR$/common" />
<option value="$PROJECT_DIR$/mappings" />
<option value="$PROJECT_DIR$/mappings/v1_20" />
<option value="$PROJECT_DIR$/v1_20" />
</set> </set>
</option> </option>
</GradleProjectSettings> </GradleProjectSettings>

11
api/build.gradle.kts Normal file
View file

@ -0,0 +1,11 @@
plugins {
id("java")
}
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}

View file

@ -0,0 +1,4 @@
package xyz.ineanto.nicko.api;
public class NickoAPI {
}

View file

@ -1,12 +1,8 @@
plugins { plugins {
id("java") id("java")
id("io.github.goooler.shadow") version "8.1.7" id("io.github.goooler.shadow") version "8.1.7"
id("xyz.jpenilla.run-paper") version "2.3.0"
} }
group = "xyz.ineanto"
version = "1.1.8"
java { java {
sourceCompatibility = JavaVersion.VERSION_21 sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21
@ -15,127 +11,7 @@ java {
} }
} }
repositories { allprojects {
mavenCentral() group = "xyz.ineanto.nicko"
mavenLocal() version = "1.2.0"
maven { url = uri("https://jitpack.io") }
maven {
name = "xenondevs"
url = uri("https://repo.xenondevs.xyz/releases")
}
maven {
name = "papermc"
url = uri("https://repo.papermc.io/repository/maven-public/")
}
maven {
name = "codemc"
url = uri("https://repo.codemc.io/repository/maven-snapshots/")
}
maven {
name = "placeholderapi"
url = uri("https://repo.extendedclip.com/content/repositories/placeholderapi/")
}
}
dependencies {
// Nicko
compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT")
compileOnly("com.github.dmulloy2:ProtocolLib:master-SNAPSHOT")
compileOnly("me.clip:placeholderapi:2.11.5")
compileOnly("net.kyori:adventure-api:4.17.0")
implementation("xyz.xenondevs.invui:invui:1.35")
implementation("net.wesjd:anvilgui:1.10.1-SNAPSHOT")
implementation("com.github.jsixface:yamlconfig:1.2")
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2")
implementation("com.fasterxml.jackson.core:jackson-core:2.15.2")
implementation("com.mysql:mysql-connector-j:8.2.0")
implementation("org.mariadb.jdbc:mariadb-java-client:3.3.1")
implementation("redis.clients:jedis:5.1.2")
implementation("com.google.code.gson:gson:2.10.1")
implementation("org.bstats:bstats-bukkit:3.0.2")
testImplementation("com.github.MockBukkit:MockBukkit:v3.99.1")
testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.2")
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.10.2")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
}
tasks {
processResources {
from("src/main/resources")
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
filesMatching("*.yml") {
expand("version" to version)
}
}
shadowJar {
// NAMING
archiveBaseName.set("nicko")
archiveVersion.set(version.toString())
archiveAppendix.set("")
archiveClassifier.set("")
// RELOCATIONS
relocate("xyz.xenondevs", "xyz.ineanto.nicko.libs.invui")
relocate("me.clip", "xyz.ineanto.nicko.libs.placeholderapi")
relocate("net.wesjd", "xyz.ineanto.nicko.libs.anvilgui")
relocate("com.github.jsixface", "xyz.ineanto.nicko.libs.yaml")
relocate("com.fasterxml.jackson.dataformat", "xyz.ineanto.nicko.libs.jackson.yaml")
relocate("com.fasterxml.jackson.core", "xyz.ineanto.nicko.libs.jackson.core")
relocate("com.mysql", "xyz.ineanto.nicko.libs.mysql")
relocate("org.mariadb.jdbc", "xyz.ineanto.nicko.libs.mariadb")
relocate("redis.clients", "xyz.ineanto.nicko.libs.redis")
relocate("com.google.gson", "xyz.ineanto.nicko.libs.gson")
relocate("org.apache.commons.pool2", "xyz.ineanto.nicko.libs.pool2")
relocate("org.bstats", "xyz.ineanto.nicko.libs.bstats")
// EXCLUSIONS
exclude("colors.bin")
exclude("waffle/**")
exclude("com/sun/**")
exclude("com/google/protobuf/**")
exclude("com/google/errorprone/**")
exclude("org/apache/commons/logging/**")
exclude("org/jetbrains/**")
exclude("org/intellij/**")
exclude("org/checkerframework/**")
exclude("org/json/**")
exclude("org/slf4j/**")
exclude("org/yaml/**")
exclude("google/protobuf/**")
exclude("net/kyori/**")
// MINIFY
minimize {
exclude(dependency("xyz.xenondevs.invui:.*"))
exclude(dependency("net.wesjd:.*"))
exclude(dependency("org.bstats:.*"))
}
}
jar {
enabled = false
}
test {
useJUnitPlatform()
}
runServer {
dependsOn(shadowJar)
downloadPlugins {
url("https://download.luckperms.net/1554/bukkit/loader/LuckPerms-Bukkit-5.4.139.jar")
// 1.20 - 1.20.4 testing
//url("https://github.com/dmulloy2/ProtocolLib/releases/download/5.2.0/ProtocolLib.jar")
// 1.20.5 - latest testing
url("https://ci.dmulloy2.net/job/ProtocolLib/lastSuccessfulBuild/artifact/build/libs/ProtocolLib.jar")
}
minecraftVersion("1.21.1")
}
} }

108
common/build.gradle.kts Normal file
View file

@ -0,0 +1,108 @@
plugins {
id("java")
id("xyz.jpenilla.run-paper") version "2.3.0"
id("io.github.goooler.shadow") version "8.1.7"
}
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
dependencies {
compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT")
compileOnly("com.github.dmulloy2:ProtocolLib:master-SNAPSHOT")
compileOnly("me.clip:placeholderapi:2.11.5")
compileOnly("net.kyori:adventure-api:4.17.0")
rootProject.subprojects.forEach {
if (!it.name.startsWith("v")) return@forEach
compileOnly(project(":mappings:${it.name}"))
}
implementation("xyz.xenondevs.invui:invui:1.35")
implementation("net.wesjd:anvilgui:1.10.1-SNAPSHOT")
implementation("com.github.jsixface:yamlconfig:1.2")
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2")
implementation("com.fasterxml.jackson.core:jackson-core:2.15.2")
implementation("com.mysql:mysql-connector-j:8.2.0")
implementation("org.mariadb.jdbc:mariadb-java-client:3.3.1")
implementation("redis.clients:jedis:5.1.2")
implementation("com.google.code.gson:gson:2.10.1")
implementation("org.bstats:bstats-bukkit:3.0.2")
}
tasks {
processResources {
from("src/main/resources")
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
filesMatching("*.yml") {
expand("version" to version)
}
}
shadowJar {
// NAMING
archiveBaseName.set("nicko")
archiveVersion.set(version.toString())
archiveAppendix.set("")
archiveClassifier.set("")
// RELOCATIONS
relocate("xyz.xenondevs", "xyz.ineanto.nicko.libs.invui")
relocate("me.clip", "xyz.ineanto.nicko.libs.placeholderapi")
relocate("net.wesjd", "xyz.ineanto.nicko.libs.anvilgui")
relocate("com.github.jsixface", "xyz.ineanto.nicko.libs.yaml")
relocate("com.fasterxml.jackson.dataformat", "xyz.ineanto.nicko.libs.jackson.yaml")
relocate("com.fasterxml.jackson.core", "xyz.ineanto.nicko.libs.jackson.core")
relocate("com.mysql", "xyz.ineanto.nicko.libs.mysql")
relocate("org.mariadb.jdbc", "xyz.ineanto.nicko.libs.mariadb")
relocate("redis.clients", "xyz.ineanto.nicko.libs.redis")
relocate("com.google.gson", "xyz.ineanto.nicko.libs.gson")
relocate("org.apache.commons.pool2", "xyz.ineanto.nicko.libs.pool2")
relocate("org.bstats", "xyz.ineanto.nicko.libs.bstats")
// EXCLUSIONS
exclude("colors.bin")
exclude("waffle/**")
exclude("com/sun/**")
exclude("com/google/protobuf/**")
exclude("com/google/errorprone/**")
exclude("org/apache/commons/logging/**")
exclude("org/jetbrains/**")
exclude("org/intellij/**")
exclude("org/checkerframework/**")
exclude("org/json/**")
exclude("org/slf4j/**")
exclude("org/yaml/**")
exclude("google/protobuf/**")
exclude("net/kyori/**")
// MINIFY
minimize {
exclude(dependency("xyz.xenondevs.invui:.*"))
exclude(dependency("net.wesjd:.*"))
exclude(dependency("org.bstats:.*"))
}
}
runServer {
dependsOn(shadowJar)
downloadPlugins {
url("https://download.luckperms.net/1554/bukkit/loader/LuckPerms-Bukkit-5.4.139.jar")
// 1.20 - 1.20.4 testing
//url("https://github.com/dmulloy2/ProtocolLib/releases/download/5.2.0/ProtocolLib.jar")
// 1.20.5 - latest testing
url("https://ci.dmulloy2.net/job/ProtocolLib/lastSuccessfulBuild/artifact/build/libs/ProtocolLib.jar")
}
minecraftVersion("1.21.1")
}
}

View file

@ -0,0 +1,18 @@
package xyz.ineanto.nicko.mapping;
import org.bukkit.entity.Player;
import xyz.ineanto.nicko.Nicko;
import xyz.ineanto.nicko.storage.PlayerDataStore;
import xyz.ineanto.nicko.storage.name.PlayerNameStore;
import java.util.Set;
public abstract class Mapping {
private final Nicko instance = Nicko.getInstance();
private final PlayerDataStore dataStore = instance.getDataStore();
private final PlayerNameStore nameStore = instance.getNameStore();
public abstract void respawn(Player player);
public abstract Set<String> supportedVersions();
}

View file

@ -0,0 +1,20 @@
package xyz.ineanto.nicko.mapping;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import xyz.ineanto.nicko.mapping.v1_20.Mapping1_20;
import java.util.List;
import java.util.Optional;
public class MappingManager {
private final List<Mapping> mappings = List.of(
new Mapping1_20()
);
public Optional<Mapping> getMappingFor(Server server) {
return mappings.stream()
.filter(mapping -> mapping.supportedVersions().contains(Bukkit.getMinecraftVersion()))
.findFirst();
}
}

View file

@ -0,0 +1,9 @@
plugins {
id("java")
id("io.papermc.paperweight.userdev") version "1.7.2"
}
dependencies {
paperweight.paperDevBundle("1.20-R0.1-SNAPSHOT")
implementation(project(":common"))
}

View file

@ -0,0 +1,83 @@
package xyz.ineanto.nicko.mapping.v1_20;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket;
import net.minecraft.network.protocol.game.ClientboundRespawnPacket;
import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.level.ServerPlayerGameMode;
import net.minecraft.server.players.PlayerList;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.level.biome.BiomeManager;
import org.bukkit.entity.Player;
import xyz.ineanto.nicko.mapping.Mapping;
import java.util.List;
import java.util.Set;
public class Mapping1_20 extends Mapping {
@Override
public void respawn(Player player) {
final ServerPlayer entityPlayer = (ServerPlayer) player;
final ServerLevel world = entityPlayer.serverLevel();
final ServerPlayerGameMode gameMode = entityPlayer.gameMode;
// Really Mojang...? (also applies to Bukkit/Spigot maintainers)
// I'll have to do this everytime I want to update Nicko for the foreseeable future.
// (until ProtocolLib has reworked its API to be more maintainable that said)
// I already when through this hassle with NickReloaded back in 2017,
// when mappings were not included by default, mind you.
// I had to rework the entire project structure and build process just for... you.
// I can't be bothered with fighting your game anymore.
// We need an easy and reliable way to send packets across multiple server versions.
// And I know that this is easier said than done, the game protocol needs
// to evolve and be updated, I get it. But I think you can at least try.
// You made a step forward by providing the mappings for Java, this I can agree with.
// (and still stripped them from Bedrock against community feedback, haha f*ck you.)
// However, we still need a stable and reliable Packet API (and so much more!) one day.
final ClientboundRespawnPacket respawn = new ClientboundRespawnPacket(
world.dimensionTypeId(),
world.dimension(),
BiomeManager.obfuscateSeed(world.getSeed()),
gameMode.getGameModeForPlayer(),
gameMode.getPreviousGameModeForPlayer(),
world.isDebug(),
world.isFlat(),
ClientboundRespawnPacket.KEEP_ALL_DATA,
entityPlayer.getLastDeathLocation(),
entityPlayer.getPortalCooldown()
);
entityPlayer.connection.send(new ClientboundPlayerInfoRemovePacket(List.of(player.getUniqueId())));
entityPlayer.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(entityPlayer)));
entityPlayer.connection.send(respawn);
entityPlayer.onUpdateAbilities();
entityPlayer.connection.teleport(player.getLocation());
entityPlayer.resetSentInfo();
final PlayerList playerList = entityPlayer.server.getPlayerList();
playerList.sendPlayerPermissionLevel(entityPlayer);
playerList.sendLevelInfo(entityPlayer, world);
playerList.sendAllPlayerInfo(entityPlayer);
// Resend their effects
for (MobEffectInstance effect : entityPlayer.getActiveEffects()) {
entityPlayer.connection.send(new ClientboundUpdateMobEffectPacket(entityPlayer.getId(), effect));
}
}
@Override
public Set<String> supportedVersions() {
return Set.of("1.20", "1.20.1");
}
}

View file

@ -1,2 +1,34 @@
rootProject.name = "nicko" rootProject.name = "nicko"
setOf(
"1_20"
).forEach {
include("mappings:v$it")
}
include("common", "api")
dependencyResolutionManagement {
repositories {
mavenCentral()
mavenLocal()
maven { url = uri("https://jitpack.io") }
maven {
name = "xenondevs"
url = uri("https://repo.xenondevs.xyz/releases")
}
maven {
name = "papermc"
url = uri("https://repo.papermc.io/repository/maven-public/")
}
maven {
name = "codemc"
url = uri("https://repo.codemc.io/repository/maven-snapshots/")
}
maven {
name = "placeholderapi"
url = uri("https://repo.extendedclip.com/content/repositories/placeholderapi/")
}
}
}
include("v1_20")

View file

@ -1,60 +0,0 @@
# Nicko ${version} - Config:
# Specifies the configuration version, don't change.
version: "1.0.9"
#
# Language
#
# Nicko will copy the English locale as "lang.yml"
# and will use the translations in that file when "Server Custom"
# is selected as the player's locale.
# Accepted values: false (Disabled), true (Enabled)
customLocale: false
#
# Storage
#
sql:
# Indicates wherever the data will be stored locally
# inside a .json file or in an SQL database.
# Accepted values: false (Disabled), true (Enabled)
enabled: false
# Toggles between the MariaDB and MySQL drivers.
# If you use the MySQL database engine, switch this to off.
# Accepted values: false (Disabled), true (Enabled)
mariadb: true
# SQL database's address
# Accepted values: valid IP address (e.g. localhost, 127.0.0.1)
address: "localhost"
# SQL database's port
# Accepted values: valid integer (e.g. 3306, 25565)
port: 3306
# SQL database's username.
# Accepted values: any string
username: "username"
# SQL database's password.
# Accepted values: any string
password: "password"
# This configuration section manages Redis (enabled BungeeCord support).
# It is used to transfer data between multiple servers.
redis:
# Indicates wherever the data will be stored through
# Redis to transfer whenever a player switches server.
# Accepted values: false (Disabled), true (Enabled)
enabled: false
# Redis server's address
# Accepted values: valid IP address (e.g.: localhost, 127.0.0.1)
address: "localhost"
# Redis server's port
# Accepted values: valid integer (e.g. 3306, 25565)
port: 6379
# Redis server's username
# Accepted values: any string
username: "username"
# Redis server's password
# Accepted values: any string
password: "password"

View file

@ -1,153 +0,0 @@
# Nicko ${version} - Language File:
# Specifies the configuration version, don't change.
version: "1.1.4"
prefix: "<b><gradient:#01a97c:#8ffd54>NICKO</gradient></b>"
whoosh: "<b><gradient:#01a97c:#8ffd54>WHOOSH!</gradient></b>"
oops: "<b><color:#ff4640>OOPS!</color></b>"
error:
permission: "<gray>You're missing the permission to do that.</gray>"
invalid_username: "<gray>This is an invalid Minecraft username.</gray>"
mojang_name: "<gray>There's is not Minecraft account with this username.</gray>"
mojang_skin: "<gray>This Minecraft account has no skin.</gray>"
cache: "<gray>Unable to get data from the cache.</gray>"
event:
settings:
error: "<gray>Wasn''t able to update your settings! ({0})</gray>"
appearance:
set:
error: "<gray>Wasn''t able to apply your disguise! ({0})</gray>"
ok: "<gray>You're now disguised.</gray>"
restore:
error: "<gray>Wasn''t able to apply the previous disguise! ({0})</gray>"
ok: "<gray>Disguise restored from last time.</gray>"
remove:
error: "<gray>Wasn''t able to remove your disguise!.</gray>"
missing: "<gray>You''re not currently disguised.</gray>"
ok: "<gray>Undisguised successfully.</gray>"
admin:
cache:
invalidate_cache: "<gray>Cache purged.</gray>"
invalidate_entry: "<gray>{0} was purged.</gray>"
check:
remove_skin: "<gray>Skin removed from player.</gray>"
gui:
title:
home: "Nicko - Home"
settings: "Settings"
admin: "Administration"
check: "Player Management"
confirm: "Are you sure?"
cache: "Cache Management"
invalidate_skin: "Purge cache..."
exit:
name: "Exit"
go_back:
name: "Back"
unavailable:
name: "Unavailable"
lore:
- "<gray><i>This button is disabled.</i></gray>"
error:
name: "Error!"
lore:
- "<gray>The item failed to load, but it might still work.</gray>"
loading:
name: "<gray><i>Loading...</i></gray>"
choice:
confirm:
name: "<green>Confirm</green>"
choose:
name: "<gold><i>Choose an option...</i></gold>"
cancel:
name: "<red>Cancel</red>"
scroll_up:
name: "Scroll up"
lore:
- "<dark_gray><i>(You can't scroll any higher.)</i></dark_gray>"
scroll_down:
name: "Scroll down"
lore:
- "<dark_gray><i>(You can't scroll any further down.)</i></dark_gray>"
new_skin:
name: "New skin..."
new_name:
name: "New name..."
home:
admin:
name: "Administration panel"
lore:
- "<gray>Configure and manage Nicko.</gray>"
settings:
name: "Settings"
lore:
- "<gray>Fine tune your experience with Nicko.</gray>"
change_name:
name: "Change your <gold>nickname</gold>"
change_skin:
name: "Change your <gold>skin</gold>"
change_both:
name: "Change <gold>both</gold>"
random_skin:
name: "<rainbow>Get a random appearance!</rainbow>"
reset:
name: "Reset appearance"
lore:
- "<gray>Completely remove your disguise.</gray>"
admin:
manage_cache:
name: "Manage the <gold>skin</gold> cache..."
lore:
- "<gray>View and manage the skin cache.</gray>"
manage_player:
name: "Inspect a player..."
lore:
- "<gray>See players' disguise information.</gray>"
check:
name: "<gold>{0}</gold>"
lore:
- "<red>Nicked:</red> {1}"
- "<red>Name:</red> <gold>{2}</gold>"
- "<red>Skin:</red> <gold>{3}</gold>"
- " "
- "<gray><i>Click to remove skin!</i></gray>"
cache:
statistics:
name: "Statistics"
lore:
- "Request count: <aqua>{0}</aqua>"
- "Number of skin cached: <aqua>{1}</aqua>"
- "<dark_gray><i>Cache is cleared every 24 hours.</i></dark_gray>"
invalidate_cache:
name: "Invalidate cache"
lore:
- "<red><i>NOT RECOMMENDED</i></red>"
- "<gray>Invalidate the entirety of the skin cache.</gray>"
- "<gray>This doesn't reset player's disguises.</gray>"
invalidate_skin:
name: "Invalidate a skin..."
lore:
- "<gray>Select a specific skin to invalidate.</gray>"
- "<gray>Useful if a skin has been recently updated.</gray>"
entry:
name: "<gold>{0}</gold>"
lore:
- "<gray>Click to invalidate...</gray>"
settings:
toggleable_button:
lore:
- "{0} Disabled"
- "{1} Enabled"
cycling_choices:
lore:
- "<gray><i>Cycle through the values</i></gray>"
- "<gray><i>by left or right clicking.</i></gray>"
language:
name: "Language"
random_skin:
name: "Random skin on login"

View file

@ -1,155 +0,0 @@
# Nicko ${version} - Fichier de langue:
# Précise la version de la configuration, ne pas changer.
version: "1.1.4"
prefix: "<b><gradient:#01a97c:#8ffd54>NICKO</gradient></b>"
whoosh: "<b><gradient:#01a97c:#8ffd54>WHOOSH!</gradient></b>"
oops: "<b><color:#ff4640>OOPS!</color></b>"
error:
permission: "<gray>Vous n'avez pas la permission de faire cela.<gray>"
invalid_username: "<gray>Nom d'utilisateur Minecraft invalide.<gray>"
mojang_name: "<gray>Aucun compte Minecraft associé à ce nom d'utilisateur.<gray>"
mojang_skin: "<gray>Ce compte Minecraft n'a pas de skin.<gray>"
cache: "<gray>Impossible de récupérer les données depuis le cache.<gray>"
event:
settings:
error: "<gray>Impossible de mettre à jour vos paramètres ! ({0})</gray>"
appearance:
set:
error: "<gray>Impossible d''appliquer votre déguisement ! ({0})</gray>"
ok: "<gray>Déguisement appliqué avec succès.</gray>"
restore:
error: "<gray>Impossible d''appliquer le précédent déguisement ! ({0})</gray>"
ok: "<gray>Votre précédent déguisement a été appliqué.<gray>"
remove:
error: "<gray>Impossible de retirer votre déguisement.</gray>"
missing: "<gray>Vous n''avez pas de déguisement.</gray>"
ok: "<gray>Déguisement retiré.</gray>"
admin:
cache:
invalidate_cache: "<gray>Cache complet invalidé.</gray>"
invalidate_entry: "<gray>{0} a été invalidé.</gray>"
check:
remove_skin: "<gray>Déguisement retiré au joueur.</gray>"
gui:
title:
home: "Nicko - Accueil"
settings: "Paramètres"
admin: "Administration"
check: "Gestion des Joueurs"
confirm: "Êtes-vous sûr ?"
cache: "Gestion du Cache"
invalidate_skin: "Purge du cache..."
exit:
name: "Quitter"
go_back:
name: "Retour"
unavailable:
name: "Indisponible"
lore:
- "<gray><i>Ce boutton est désactivé.</i></gray>"
error:
name: "Erreur !"
lore:
- "<gray>La texture de l'objet n'a pas chargé</gray>"
- "<gray>correctement mais il fonctionne encore.</gray>"
loading:
name: "<gray><i>Chargement...</i></gray>"
choice:
confirm:
name: "<green>Confirmer</green>"
choose:
name: "<gold><i>Choisissez une option...</i></gold>"
cancel:
name: "<red>Annuler</red>"
scroll_up:
name: "Défiler vers le haut"
lore:
- "<dark_gray><i>(Impossible de défiler plus haut.)</i></dark_gray>"
scroll_down:
name: "Défiler vers le bas"
lore:
- "<dark_gray><i>(Impossible de défiler plus bas.)</i></dark_gray>"
new_skin:
name: "Nouveau skin..."
new_name:
name: "Nouveau nom..."
home:
admin:
name: "Panel d'administration"
lore:
- "<gray>Configurez et gérez Nicko.</gray>"
settings:
name: "Paramètres"
lore:
- "<gray>Gérez votre expérience avec Nicko.</gray>"
change_name:
name: "Changer le <gold>pseudo</gold>"
change_skin:
name: "Changer le <gold>skin</gold>"
change_both:
name: "Changer les <gold>deux</gold>"
random_skin:
name: "<rainbow>Obtenir une apparence aléatoire !</rainbow>"
reset:
name: "Réinitialiser l'apparence"
lore:
- "<gray>Supprime complètement votre déguisement.</gray>"
admin:
manage_cache:
name: "Gérer le cache de <gold>skin...</gold>"
lore:
- "<gray>Consultez et gérez le cache de skin.</gray>"
manage_player:
name: "Vérifier un joueur..."
lore:
- "<gray>Vérifiez les informations de déguisement d'un joueur.</gray>"
check:
name: "<gold>{0}</gold>"
lore:
- "<red>Déguisé:</red> {1}"
- "<red>Nom:</red> <gold>{2}</gold>"
- "<red>Skin:</red> <gold>{3}</gold>"
- " "
- "<gray><i>Cliquez pour retirer le skin !</i></gray>"
cache:
statistics:
name: "Statistiques"
lore:
- "Nombre de requêtes: <aqua>{0}</aqua>"
- "Nb. de skin dans le cache: <aqua>{1}</aqua>"
- "<dark_gray><i>Le cache est vidé toutes les 24 heures.</i></dark_gray>"
invalidate_cache:
name: "Purger le cache"
lore:
- "<red><i>DÉCONSEILLÉ</i></red>"
- "<gray>Purge l'entièreté du cache des skin.</gray>"
- "<gray>Ne retire pas les déguisements des joueurs.</gray>"
invalidate_skin:
name: "Invalider un skin..."
lore:
- "<gray>Sélectionnez une apparence spécifique à</gray>"
- "<gray>invalider. Utile dans le cas où un skin</gray>"
- "<gray>a récemment été mis à jour.</gray>"
entry:
name: "<gold>{0}</gold>"
lore:
- "<gray>Cliquez pour invalider...</gray>"
settings:
toggleable_button:
lore:
- "{0} Désactivé"
- "{1} Activé"
cycling_choices:
lore:
- "<gray><i>Parcourez les valeurs</i></gray>"
- "<gray><i>avec un clique gauche/droit.</i></gray>"
language:
name: "Langage"
random_skin:
name: "Apparence aléatoire à la connexion"

View file

@ -1,490 +0,0 @@
w4nderlost
TooParanoids
Der_OG_31er
9xxDaRkShAdOwxx9
giiiaan_
Jqstinnn
Tillysboy92
AlwaysCello
SyndrexG0D
Peypeycake
ThePerjurer
Tioe
Elternbaum
BarkersRover_16
pebsso
cyrus6950
Bigest_guy
RV0REU
R379
Shetell
_HEAPASS_
Iamaloner21
TheFardoxGamerHD
Flyboi43
Cha0smusik
kat00
Infreat
Crummymoofin
MijnVriend
momsrightkidney
dmacrado
Elephantman321
ii_hamoudi_YT
FaurePavane
ambiezzz
XD_Bandit695_XD
Nabingo
Cyl0re
ku5
SrAragon
StarlightDream9
CJ5370
rainbees
KeroTheWolf
Andrews9722
cursed_Assyrian
yamateni
ProgramEXE
exprso
harrypanda
LookerMD
migykins
Wintrous
ZzGaBi
Flayber
Grenixal
maeve_wells
Creeper10fr
10Chairs
2525lock
Shqipe
XenitsuZen
Berno17_
wolle1313
HalfDogHalfCat1
NachoGarcia
popsicoal
NemesiSevil2006
AnywayOj
Tanko12345
Samdweck
LYRECODE123
Resulten
SirBastii
Maku056
ItzArnizzz
Brsh3620
Masonita
kapplanium
shoezo
Mansur203
Waterboy15217
redragonne
ghko325
HopePVP_tw7
xtka
NimwenxZ
Hiro0408
PanderaWz
Shesu
_Aniste_NY_
Besceste
3ee3
ArcticGalaxy123
snooze_mingo
LizzyLomnh
FaZeChulupa
LineZeeK
liabilaty
BlackSheep1610
Simif69
Aficionado
riekin
XLuggas
MathExams
6fq
Marveel
lolme51
TaioSayUwU
Fonklift
blvw
Po1204
Pierre_Rabbit
mifimasters
MrRidge1
arnqen
Nick_cage102
Geo_9918
SSShudder
Nicolas_Mom
WolfMatrix101
frictionless_
Gughik
gold_dragon_4
nealxero
ClonedPickle
SourWatermelonxX
devilunion
Daryifuny
joaomarcos11
Dekeef
PadfootTheDog
DarkScopez80
flowers220
Gaiiya
The_Yeet_
juuuuwu
MrMafioz
Surpasses
TypicalOwen
0lober
Zerfixy
Sunny3803b
neostanley
Creeper_Kart
minestin
Goldenfredster
Vju
MrArchI_YT
Casper1709
Backiii_
DrCreate
Nova_Lux1
Jayvin_Blanco
ShadowMan1770
0KOPO40K
Silk_Altermann69
Alu____
Honey_MilkExe112
T0XEI
CB_13
Paragorn
HaGiang
Shivendra8i
Mayflower47
Not_Someguy
raxx111bg
IceyGlaceon
grasseffect
PoopTNTpvp
codecyber
Shrumpkin13
Shqdown
Cmartin82
KTCXD_5p0tty
rockesalt
goldjeong
TheRealAKD
NamiSwaaan
yaaratol
Dikiy_Flexer
PoLecker24
_SakuraTree
PikkOgP0rno
HawksFang
BlueWinterWolf
hskmerk
gurmaw
Lunggor
clashfield
Zelaste
ACommonMouse
TJ_Mystery
Dizzy3312
Raindropsss
minecraftxiaoju
sachilovebbh
Celina_LaZyCxt
firered6
55000000
Illunarnati
Jedidiah2003
setomz1
basically_e
TommyGreif02
Bongrip42069
Coco_Keopi
Lt_Colt
Kuurotta
GqmeKnight
WinCo_Foods
FKDLZ
IanPumpkin
tastywtf
natedawg0
ZQLFenyx
GamerMaster110
papajobi9
Yucaroon
Xion_69
AirJaw
funfun321234
khalleesii
Pozisch
thorso15
kyumisoup
Leonqrd
BmwDreamer
TehRos
pitplayer69
_ve0
Miss_Yuka
I_am_a_Bucket
nicolas_bean
xHorizonGC
RTX3060_
Borec188
c8to
megan3groCENG
ventriloquize
galczin
Scorch3dEarth3d
nightstarLP
VittyGam3r
GLaDOS__
hydrelo
JustACarter
MikeDropperPlay
NorthernWest
_Skelesam_
ZX_Style
Tamas_Boi
taylub
VyacheslavO_O
trippyaubs
udtpic
Lunarglow
Stoolman
legendary_meow
Loganii
CaptainStain56
FoofieGeto
Judgeavapl
OneBigDigger
Sorem13
Raisonneur
IlkoalI
Naxa
craigbabyonebay
NicholasG04
UtopianCrisi
CalamarPasGenti
ryluh_
Aceslimz
Howardygh99927
brandon257
MarcoswildHD
x_XSkylerX_x
Bronco09
That_Kookie_
Danigtz
Ricky_lol
999keyt
Thilow15
Difesito
ostehovl
isacano_12
big_esra
secretbaguette
MrCommunism
Jekube
GrandeMaster
DrGrip
TheArnek
JacsMars
Lliam14
MrGameandWatch84
Rinzap
XrazzeD
ukknown
ZohanPrent
Naspo
Rajem
VepiGHG
matoureal
BrianChen87
Jrocky
stivo999
Des_cole
ReqGames
Kingja1912
issssyy
Apache424
Nick_Zockt_
Mr_Haider_10
ValentineBun
fedorPro228
xTilz
blockbuster02k
4ck
FrostedTree
VegasTortoise
ZBellaV12121
paypales
qDread
itsRiven
i8oreo
_kimcream_
Phisuss
Oscargray
Elsiff
callofdutydog00
BruhTheMoment
Pazmaa
MythicalOak
komuchi33
awf4
Jacobsaurus21
itsjohannaa
Jello12
Adrien183
jajazzywazzy
Jorjie22
SuperBrawlr5788
KaraageV
_Hanime_tv
Padilhao
Tikkas
ordinaryducky
Mothytix95
renopotouwu
1000voices
niclas05
Felipstein
DoutorBauer
FireballPlaysMC
vapelordsheep
Aboain
ImGrexy
Aivokolo
SuperAmazing101
va75a77a
_DawYans_
AceT1223
Livvyboo7
Saaaaaaaaaaaaans
okaychill
AwesomeBro1122
absolutesnek
jogie5000
curtainSenpai
gabbyisaloser
gamergurl6969
ZeusDk
FranaRibas
Discoboss
SYZ_1
Nakoe
FIU_Captive
xSiFan_
ilyDeathxz
da_fipsi
Lochy
The_Lavie37
Tonion
vnvrchy
xX0meg4Xx
haohxtheone
VtTronic
xDaniGum
tikkelill
DatYoshi
eyehamstewpit
nicholas460_
Memsly445
nugunugu
AndreSlayz
jashik1
Qweenoftheocean
Coltable
treblaclef
Kisaxx
69Dxddy69
RaulCuh
3Wheat
_OscarTheGrouch
oIsqk
Blockbusterweng
AntoineDegauss
ValeIsTheBest
SwaggyCrabby
DieOfSanity
SirenMC
Jade_Jewel
Tropic44
666splendor
TallnessTallness
breadgang9827
Muffin_Worlds
DedicatedVeggie
Gonzalox_7
datrandomasian
Chasemon01
Nyavix
Lonely_Summers
_RoveN
ok_kyro
LN_hunter
saharsabz
Roselilianna
Gadx
xtytan
RoRo_levosgien88
Bowsesqe_21
Bennett528
TheShipSailsWest
KaiserGaming
Layna_Shinozaki
OP_greatly
D3rpTaco
Loufink
Jorlmungus
Snichol1801
Ludixeo
Imoeto
MarshallNebunu
crazycrystals
Parapatus
HahaDani
MrQuaring
DonTurnt
SailorRoberts101
FluffieBear
TripleThick
KingSparta
MummysHome
Cooga3
Technosista
Youmerstudios
SkyyRaine
criss102
mrfailt
CraftingBasic
qnxkdifh
Igorex2k20
LaLisette
ReBoredGamer
warlordwest
ExoTemporal
KingLonmc
666Horus
IslandCity2
TheBigSavage1
Trishke2003
skyrowin
Krissy3D
AntonWTobias
SaddyWasTaken
Ahoy_Peko_Hao_Yo
T4nTr1Ss
aleciolike
ninja_shenley
Lordmord1337
eatmypoopfather
Ktanner
The42OWeedGOD
CooperBee
_MikuMiku_
althume
Tr3bba93

View file

@ -1,21 +0,0 @@
name: Nicko
main: xyz.ineanto.nicko.Nicko
version: ${version}
author: Ineanto
description: "The feature packed, next generation disguise plugin for Minecraft."
api-version: 1.20
softdepend: [ PlaceholderAPI ]
depend:
- ProtocolLib
load: POSTWORLD
commands:
nicko:
description: "Opens Nicko's GUI."
permission: nicko.use
permissions:
nicko.*:
default: op
children:
- nicko.use
nicko.use:
default: false

View file

@ -1,33 +0,0 @@
package xyz.ineanto.nicko.test;
import be.seeseemelk.mockbukkit.MockBukkit;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import xyz.ineanto.nicko.Nicko;
import xyz.ineanto.nicko.config.Configuration;
import static org.junit.jupiter.api.Assertions.assertNotNull;
public class NickoPluginTest {
private static Nicko plugin;
@BeforeAll
public static void setup() {
final Configuration config = Configuration.DEFAULT;
MockBukkit.mock();
plugin = MockBukkit.load(Nicko.class, config);
}
@Test
@DisplayName("Plugin Initialization")
public void initializePlugin() {
assertNotNull(plugin);
}
@AfterAll
public static void shutdown() {
MockBukkit.unmock();
}
}

View file

@ -1,38 +0,0 @@
package xyz.ineanto.nicko.test.appearance;
import be.seeseemelk.mockbukkit.MockBukkit;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import xyz.ineanto.nicko.Nicko;
import xyz.ineanto.nicko.appearance.random.RandomNameFetcher;
import xyz.ineanto.nicko.config.Configuration;
import xyz.ineanto.nicko.mojang.MojangUtils;
import static org.junit.jupiter.api.Assertions.*;
public class RandomNameTest {
private static Nicko plugin;
@BeforeAll
public static void setup() {
final Configuration config = Configuration.DEFAULT;
MockBukkit.mock();
plugin = MockBukkit.load(Nicko.class, config);
}
@Test
@DisplayName("Get random name")
public void getRandomName() {
final RandomNameFetcher randomNameFetcher = new RandomNameFetcher(plugin);
final String username = randomNameFetcher.getRandomUsername();
assertNotNull(username);
assertFalse(MojangUtils.isUsernameInvalid(username));
}
@AfterAll
public static void shutdown() {
MockBukkit.unmock();
}
}

View file

@ -1,35 +0,0 @@
package xyz.ineanto.nicko.test.config;
import be.seeseemelk.mockbukkit.MockBukkit;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import xyz.ineanto.nicko.Nicko;
import xyz.ineanto.nicko.config.Configuration;
import static org.junit.jupiter.api.Assertions.assertFalse;
public class ConfigurationTest {
private static Nicko plugin;
@BeforeAll
public static void setup() {
MockBukkit.mock();
final Configuration config = Configuration.DEFAULT;
plugin = MockBukkit.load(Nicko.class, config);
}
@Test
@DisplayName("Read configuration")
public void readConfiguration() {
final Configuration configuration = plugin.getNickoConfig();
assertFalse(configuration.getSqlConfiguration().isEnabled());
assertFalse(configuration.getRedisConfiguration().isEnabled());
}
@AfterAll
public static void shutdown() {
MockBukkit.unmock();
}
}

Some files were not shown because too many files have changed in this diff Show more