diff --git a/gradle.properties b/gradle.properties index 8d37f3a..459ebac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version=0.15.11 fabric_version=0.98.0+1.20.6 # Mod Properties -mod_version=2.4.1 +mod_version=2.4.2 maven_group=org.samo_lego archives_base_name=fabrictailor # Dependencies diff --git a/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java b/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java index 09c6733..426ae05 100644 --- a/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java +++ b/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java @@ -1,7 +1,14 @@ package org.samo_lego.fabrictailor.client.screen; +import com.mojang.authlib.properties.Property; import com.mojang.authlib.properties.PropertyMap; import com.mojang.blaze3d.systems.RenderSystem; +import java.io.File; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; @@ -15,13 +22,15 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.advancements.AdvancementsScreen; import net.minecraft.client.gui.screens.inventory.InventoryScreen; -import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.world.entity.LivingEntity; import org.joml.Quaternionf; import org.joml.Vector3f; import org.samo_lego.fabrictailor.casts.TailoredPlayer; +import static org.samo_lego.fabrictailor.client.ClientTailor.ALLOW_DEFAULT_SKIN; +import static org.samo_lego.fabrictailor.client.ClientTailor.TAILORED_SERVER; import org.samo_lego.fabrictailor.client.screen.tabs.CapeTab; import org.samo_lego.fabrictailor.client.screen.tabs.LocalSkinTab; import org.samo_lego.fabrictailor.client.screen.tabs.PlayerSkinTab; @@ -31,15 +40,6 @@ import org.samo_lego.fabrictailor.network.payload.DefaultSkinPayload; import org.samo_lego.fabrictailor.util.TextTranslations; -import java.io.File; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CompletableFuture; - -import static org.samo_lego.fabrictailor.client.ClientTailor.ALLOW_DEFAULT_SKIN; -import static org.samo_lego.fabrictailor.client.ClientTailor.TAILORED_SERVER; - @Environment(EnvType.CLIENT) public class SkinChangeScreen extends Screen { @@ -145,8 +145,16 @@ protected void init() { Button.builder(TextTranslations.create("button.fabrictailor.set_default_skin"), onClick -> { var profile = ((AAbstractClientPlayer) this.minecraft.player).ft_getPlayerInfo().getProfile(); - var payload = new DefaultSkinPayload(profile.getProperties().get(TailoredPlayer.PROPERTY_TEXTURES).iterator().next()); - ClientPlayNetworking.send(payload); + + // could return empty collection, Iterator#next in this case produces NoSuchElementException + Optional optionalProperty = profile.getProperties() + .get(TailoredPlayer.PROPERTY_TEXTURES) + .stream() + .findFirst(); + if (optionalProperty.isPresent()) { + CustomPacketPayload payload = new DefaultSkinPayload(optionalProperty.get()); + ClientPlayNetworking.send(payload); + } this.onClose(); }) .pos(width / 2 - BUTTON_WIDTH / 2 - 1, buttonY) diff --git a/src/main/java/org/samo_lego/fabrictailor/mixin/client/MTextureUrlChecker_AllDomains.java b/src/main/java/org/samo_lego/fabrictailor/mixin/client/MTextureUrlChecker_AllDomains.java index 57219b7..a630fb7 100644 --- a/src/main/java/org/samo_lego/fabrictailor/mixin/client/MTextureUrlChecker_AllDomains.java +++ b/src/main/java/org/samo_lego/fabrictailor/mixin/client/MTextureUrlChecker_AllDomains.java @@ -2,28 +2,36 @@ import com.google.common.net.InternetDomainName; import com.mojang.authlib.yggdrasil.TextureUrlChecker; +import java.net.URI; +import static org.samo_lego.fabrictailor.FabricTailor.config; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import java.net.URI; +@Mixin(value = TextureUrlChecker.class, remap = false) +public final class MTextureUrlChecker_AllDomains { -import static org.samo_lego.fabrictailor.FabricTailor.config; + private static final String FILE_SCHEME_CONST = "file"; -@Mixin(value = TextureUrlChecker.class, remap = false) -public class MTextureUrlChecker_AllDomains { + private MTextureUrlChecker_AllDomains() { + } @Inject(method = "isAllowedTextureDomain", at = @At(value = "INVOKE", target = "Ljava/net/URI;getScheme()Ljava/lang/String;"), - locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) + locals = LocalCapture.CAPTURE_FAILHARD, + cancellable = true) private static void ft_allowAllTextureDomains(String url, CallbackInfoReturnable cir, URI uri) { - if (uri.getScheme().equals("file")) { + if (FILE_SCHEME_CONST.equals(uri.getScheme())) { cir.setReturnValue(false); // todo, allow files return; } + if (uri.getHost() == null) { + return; + } + String topDomain = InternetDomainName.from(uri.getHost()) .topDomainUnderRegistrySuffix() .toString() @@ -32,4 +40,5 @@ private static void ft_allowAllTextureDomains(String url, CallbackInfoReturnable var allowed = config.allowedTextureDomains.contains(topDomain); cir.setReturnValue(allowed); } + } diff --git a/src/main/resources/assets/fabrictailor/lang/uk_ua.json b/src/main/resources/assets/fabrictailor/lang/uk_ua.json new file mode 100644 index 0000000..87cf627 --- /dev/null +++ b/src/main/resources/assets/fabrictailor/lang/uk_ua.json @@ -0,0 +1,39 @@ +{ + "command.fabrictailor.skin.set.attempt": "Спроба встановити шкіру ... Будь ласка, зачекайте.", + "command.fabrictailor.skin.404": "Сталася помилка під час спроби отримати шкіру.", + "command.fabrictailor.skin.set.404": "Ви повинні надати URL, ім'я гравця або файл скіна, яку ви хочете встановити.", + "command.fabrictailor.skin.set.404.url": "Ви повинні надати URL та варіант скіна, яку ви хочете встановити.", + "command.fabrictailor.skin.set.404.path": "Ви повинні надати шлях до файлу та варіант скіна, яку ви хочете встановити.", + "command.fabrictailor.skin.set.404.playername": "Ви повинні надати ім'я гравця.", + "command.fabrictailor.skin.set.success": "Шкіру успішно встановлено.", + "command.fabrictailor.skin.set.error": "Здається, у цього гравця немає збережених шкір.", + "command.fabrictailor.skin.clear.success": "Шкіру успішно видалено.", + "command.fabrictailor.skin.clear.error": "Сталася помилка під час спроби видалити шкіру.", + "command.fabrictailor.skin.please_wait": "Завантаження скіна. Будь ласка, зачекайте.", + "command.fabrictailor.skin.timer.please_wait": "Ви нещодавно змінили шкіру. Ви повинні почекати %s секунд, щоб змінити її знову.", + "command.fabrictailor.skin.upload.failed": "Сталася проблема під час спроби завантажити шкіру.", + "command.fabrictailor.skin.upload.malformed_url": "Некоректний URL!", + "command.fabrictailor.config.reloadSuccess": "Конфігурацію успішно перезавантажено!", + "command.fabrictailor.config.defaultSkin": "Шкіру за замовчуванням для нових гравців успішно встановлено!", + "hint.fabrictailor.server_skin_path": "Мод FabricTailor працює в середовищі сервера. Переконайтеся, що шлях вказує на файл скіна на сервері.", + "hint.fabrictailor.client_only": "Плащі та HD-скіни будуть видимі тільки для інших гравців, які використовують мод FabricTailor.", + "button.fabrictailor.clear_skin": "Очистити шкіру", + "button.fabrictailor.open_explorer": "Відкрити провідник", + "button.fabrictailor.apply": "Застосувати", + "button.fabrictailor.set_cape": "Встановити плащ", + "button.fabrictailor.set_default_skin": "Встановити скін", + "button.fabrictailor.use_slim": "Струнка модель", + "description.fabrictailor.title_cape": "URL плаща:", + "description.fabrictailor.title_local": "Шлях до скіна:", + "description.fabrictailor.title_player": "Ім'я гравця:", + "description.fabrictailor.title_url": "URL скіна:", + "gui.fabrictailor.change_skin": "Змінити шкіру", + "hint.fabrictailor.dragAndDrop": "Ви також можете перетягнути шкіру сюди!", + "tab.fabrictailor.title_cape": "Отримання плаща", + "tab.fabrictailor.title_local": "Завантаження локальної скіна", + "tab.fabrictailor.title_player": "Отримати від гравця", + "tab.fabrictailor.title_url": "Отримати з URL", + "key.fabrictailor.toggle_skin_gui": "Відкрити FabricTailor GUI", + "category.fabrictailor.skin_category": "FabricTailor", + "error.fabrictailor.not_installed": "Мод FabricTailor не встановлено на цьому сервері. Будь ласка, зв'яжіться з адміністратором для отримання додаткової інформації." +} \ No newline at end of file diff --git a/src/main/resources/data/fabrictailor/lang/uk_ua.json b/src/main/resources/data/fabrictailor/lang/uk_ua.json new file mode 100644 index 0000000..87cf627 --- /dev/null +++ b/src/main/resources/data/fabrictailor/lang/uk_ua.json @@ -0,0 +1,39 @@ +{ + "command.fabrictailor.skin.set.attempt": "Спроба встановити шкіру ... Будь ласка, зачекайте.", + "command.fabrictailor.skin.404": "Сталася помилка під час спроби отримати шкіру.", + "command.fabrictailor.skin.set.404": "Ви повинні надати URL, ім'я гравця або файл скіна, яку ви хочете встановити.", + "command.fabrictailor.skin.set.404.url": "Ви повинні надати URL та варіант скіна, яку ви хочете встановити.", + "command.fabrictailor.skin.set.404.path": "Ви повинні надати шлях до файлу та варіант скіна, яку ви хочете встановити.", + "command.fabrictailor.skin.set.404.playername": "Ви повинні надати ім'я гравця.", + "command.fabrictailor.skin.set.success": "Шкіру успішно встановлено.", + "command.fabrictailor.skin.set.error": "Здається, у цього гравця немає збережених шкір.", + "command.fabrictailor.skin.clear.success": "Шкіру успішно видалено.", + "command.fabrictailor.skin.clear.error": "Сталася помилка під час спроби видалити шкіру.", + "command.fabrictailor.skin.please_wait": "Завантаження скіна. Будь ласка, зачекайте.", + "command.fabrictailor.skin.timer.please_wait": "Ви нещодавно змінили шкіру. Ви повинні почекати %s секунд, щоб змінити її знову.", + "command.fabrictailor.skin.upload.failed": "Сталася проблема під час спроби завантажити шкіру.", + "command.fabrictailor.skin.upload.malformed_url": "Некоректний URL!", + "command.fabrictailor.config.reloadSuccess": "Конфігурацію успішно перезавантажено!", + "command.fabrictailor.config.defaultSkin": "Шкіру за замовчуванням для нових гравців успішно встановлено!", + "hint.fabrictailor.server_skin_path": "Мод FabricTailor працює в середовищі сервера. Переконайтеся, що шлях вказує на файл скіна на сервері.", + "hint.fabrictailor.client_only": "Плащі та HD-скіни будуть видимі тільки для інших гравців, які використовують мод FabricTailor.", + "button.fabrictailor.clear_skin": "Очистити шкіру", + "button.fabrictailor.open_explorer": "Відкрити провідник", + "button.fabrictailor.apply": "Застосувати", + "button.fabrictailor.set_cape": "Встановити плащ", + "button.fabrictailor.set_default_skin": "Встановити скін", + "button.fabrictailor.use_slim": "Струнка модель", + "description.fabrictailor.title_cape": "URL плаща:", + "description.fabrictailor.title_local": "Шлях до скіна:", + "description.fabrictailor.title_player": "Ім'я гравця:", + "description.fabrictailor.title_url": "URL скіна:", + "gui.fabrictailor.change_skin": "Змінити шкіру", + "hint.fabrictailor.dragAndDrop": "Ви також можете перетягнути шкіру сюди!", + "tab.fabrictailor.title_cape": "Отримання плаща", + "tab.fabrictailor.title_local": "Завантаження локальної скіна", + "tab.fabrictailor.title_player": "Отримати від гравця", + "tab.fabrictailor.title_url": "Отримати з URL", + "key.fabrictailor.toggle_skin_gui": "Відкрити FabricTailor GUI", + "category.fabrictailor.skin_category": "FabricTailor", + "error.fabrictailor.not_installed": "Мод FabricTailor не встановлено на цьому сервері. Будь ласка, зв'яжіться з адміністратором для отримання додаткової інформації." +} \ No newline at end of file