Skip to content

Commit

Permalink
Feature/fabrictailor-107 fixed NPE on invalid cape url and fixed NoSu…
Browse files Browse the repository at this point in the history
…chElementException on empty collection on setting default skin (#108)

* FABRICTAILOR-107 fixed NoSuchElementException on empty collection

* FABRICTAILOR-107 fixed NPE on invalid url

* FABRICTAILOR-107 added ukrainian translation :3

* FABRICTAILOR-107 bumped version to 2.4.2
  • Loading branch information
stacksm4sher authored Jun 14, 2024
1 parent e327d9d commit 4012157
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 19 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -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 {

Expand Down Expand Up @@ -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<Property> 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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Boolean> 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()
Expand All @@ -32,4 +40,5 @@ private static void ft_allowAllTextureDomains(String url, CallbackInfoReturnable
var allowed = config.allowedTextureDomains.contains(topDomain);
cir.setReturnValue(allowed);
}

}
39 changes: 39 additions & 0 deletions src/main/resources/assets/fabrictailor/lang/uk_ua.json
Original file line number Diff line number Diff line change
@@ -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 не встановлено на цьому сервері. Будь ласка, зв'яжіться з адміністратором для отримання додаткової інформації."
}
39 changes: 39 additions & 0 deletions src/main/resources/data/fabrictailor/lang/uk_ua.json
Original file line number Diff line number Diff line change
@@ -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 не встановлено на цьому сервері. Будь ласка, зв'яжіться з адміністратором для отримання додаткової інформації."
}

0 comments on commit 4012157

Please sign in to comment.