From 3401ca837af5d708231d8449a4430bbe7f3116e1 Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Sun, 12 Jun 2022 11:56:22 +0200 Subject: [PATCH] some more utilities --- README.MD | 11 ++++--- .../lib/internal/proxy/ClientProxy.java | 11 ++----- .../lib/internal/proxy/CommonProxy.java | 8 ++--- .../lib/updates/UpdateChecker.java | 4 +-- .../lib/util/{Async.java => AsyncUtil.java} | 3 +- .../com/falsepattern/lib/util/LangUtil.java | 31 +++++++++++++++++++ .../com/falsepattern/lib/util/RenderUtil.java | 28 +++++++++++++++++ 7 files changed, 74 insertions(+), 22 deletions(-) rename src/main/java/com/falsepattern/lib/util/{Async.java => AsyncUtil.java} (94%) create mode 100644 src/main/java/com/falsepattern/lib/util/LangUtil.java create mode 100644 src/main/java/com/falsepattern/lib/util/RenderUtil.java diff --git a/README.MD b/README.MD index 0eddb00..ad25d4a 100644 --- a/README.MD +++ b/README.MD @@ -12,11 +12,12 @@ A library mod for 1.7.10 with lots of useful stuff. See the table below for more The contents of the [util](src/main/java/com/falsepattern/lib/util) package so far: -| Class | Purpose | -|---------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------| -| [ResourceUtil](src/main/java/com/falsepattern/lib/util/ResourceUtil.java) | Provides methods for efficiently retrieving resources from SPECIFIC jar files instead of the entire classpath | -| [Async](src/main/java/com/falsepattern/lib/util/Async.java) | Provides asynchronous execution utilities | - +| Class | Purpose | +|---------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| +| [AsyncUtil](src/main/java/com/falsepattern/lib/util/AsyncUtil.java) | Asynchronous execution utilities | +| [LangUtil](src/main/java/com/falsepattern/lib/util/LangUtil.java) | Utility for having default language values defined inside code instead of lang files | +| [RenderUtil](src/main/java/com/falsepattern/lib/util/RenderUtil.java) | Rendering tools. Currently, the only thing implemented is a way to grab the current partial tick time from the minecraft instance | +| [ResourceUtil](src/main/java/com/falsepattern/lib/util/ResourceUtil.java) | Methods for efficiently retrieving resources from SPECIFIC jar files instead of the entire classpath | Anything annotated with [@StableAPI](src/main/java/com/falsepattern/lib/StableAPI.java) is guaranteed to not change in patch versions. diff --git a/src/main/java/com/falsepattern/lib/internal/proxy/ClientProxy.java b/src/main/java/com/falsepattern/lib/internal/proxy/ClientProxy.java index 95c65f8..02772b1 100644 --- a/src/main/java/com/falsepattern/lib/internal/proxy/ClientProxy.java +++ b/src/main/java/com/falsepattern/lib/internal/proxy/ClientProxy.java @@ -2,10 +2,8 @@ package com.falsepattern.lib.internal.proxy; import com.falsepattern.lib.internal.FalsePatternLib; import com.falsepattern.lib.internal.Tags; -import com.falsepattern.lib.text.FormattedText; import com.falsepattern.lib.updates.UpdateChecker; -import com.falsepattern.lib.util.Async; -import cpw.mods.fml.common.Loader; +import com.falsepattern.lib.util.AsyncUtil; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -13,13 +11,10 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import lombok.val; import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.resources.I18n; -import net.minecraft.event.ClickEvent; import net.minecraft.util.IChatComponent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.EntityJoinWorldEvent; -import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.Future; @@ -38,7 +33,7 @@ public class ClientProxy extends CommonProxy { @Override public void postInit(FMLPostInitializationEvent e) { super.postInit(e); - chatFuture = Async.asyncWorker.submit(new Callable>() { + chatFuture = AsyncUtil.asyncWorker.submit(new Callable>() { @Override public List call() throws Exception { //Deadlock avoidance @@ -47,7 +42,7 @@ public class ClientProxy extends CommonProxy { return null; } if (!updatesFuture.isDone()) { - chatFuture = Async.asyncWorker.submit(this); + chatFuture = AsyncUtil.asyncWorker.submit(this); return null; } val updates = updatesFuture.get(); diff --git a/src/main/java/com/falsepattern/lib/internal/proxy/CommonProxy.java b/src/main/java/com/falsepattern/lib/internal/proxy/CommonProxy.java index 09bd9c7..9563578 100644 --- a/src/main/java/com/falsepattern/lib/internal/proxy/CommonProxy.java +++ b/src/main/java/com/falsepattern/lib/internal/proxy/CommonProxy.java @@ -4,16 +4,14 @@ import com.falsepattern.lib.config.ConfigException; import com.falsepattern.lib.config.ConfigurationManager; import com.falsepattern.lib.internal.FalsePatternLib; import com.falsepattern.lib.internal.LibraryConfig; -import com.falsepattern.lib.internal.Tags; import com.falsepattern.lib.updates.ModUpdateInfo; import com.falsepattern.lib.updates.UpdateChecker; -import com.falsepattern.lib.util.Async; +import com.falsepattern.lib.util.AsyncUtil; import cpw.mods.fml.common.event.FMLConstructionEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import lombok.val; import lombok.var; -import net.minecraftforge.common.MinecraftForge; import java.util.List; import java.util.concurrent.Callable; @@ -37,7 +35,7 @@ public class CommonProxy { if (LibraryConfig.ENABLE_UPDATE_CHECKER) { FalsePatternLib.getLog().info("Launching asynchronous update check."); val updateCheckFuture = UpdateChecker.fetchUpdatesAsync(FalsePatternLib.UPDATE_URL); - updatesFuture = Async.asyncWorker.submit(new Callable>() { + updatesFuture = AsyncUtil.asyncWorker.submit(new Callable>() { @Override public List call() { //Deadlock avoidance @@ -46,7 +44,7 @@ public class CommonProxy { return null; } if (!updateCheckFuture.isDone()) { - updatesFuture = Async.asyncWorker.submit(this); + updatesFuture = AsyncUtil.asyncWorker.submit(this); return null; } try { diff --git a/src/main/java/com/falsepattern/lib/updates/UpdateChecker.java b/src/main/java/com/falsepattern/lib/updates/UpdateChecker.java index e6e58c2..0767560 100644 --- a/src/main/java/com/falsepattern/lib/updates/UpdateChecker.java +++ b/src/main/java/com/falsepattern/lib/updates/UpdateChecker.java @@ -9,7 +9,7 @@ import com.falsepattern.lib.internal.Internet; import com.falsepattern.lib.internal.LibraryConfig; import com.falsepattern.lib.internal.Tags; import com.falsepattern.lib.text.FormattedText; -import com.falsepattern.lib.util.Async; +import com.falsepattern.lib.util.AsyncUtil; import cpw.mods.fml.common.Loader; import lombok.val; import net.minecraft.client.resources.I18n; @@ -37,7 +37,7 @@ public class UpdateChecker { * @return A future that will contain the update info about mods that were both available on the URL and installed */ public static Future> fetchUpdatesAsync(String url) { - return Async.asyncWorker.submit(() -> fetchUpdates(url)); + return AsyncUtil.asyncWorker.submit(() -> fetchUpdates(url)); } /** diff --git a/src/main/java/com/falsepattern/lib/util/Async.java b/src/main/java/com/falsepattern/lib/util/AsyncUtil.java similarity index 94% rename from src/main/java/com/falsepattern/lib/util/Async.java rename to src/main/java/com/falsepattern/lib/util/AsyncUtil.java index 5313d30..726b68f 100644 --- a/src/main/java/com/falsepattern/lib/util/Async.java +++ b/src/main/java/com/falsepattern/lib/util/AsyncUtil.java @@ -2,7 +2,6 @@ package com.falsepattern.lib.util; import com.falsepattern.lib.StableAPI; import com.falsepattern.lib.internal.Tags; -import lombok.Getter; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -13,7 +12,7 @@ import java.util.concurrent.Executors; * You must make sure to solve any potential deadlocks yourself! */ @StableAPI(since = "0.8.0") -public class Async { +public class AsyncUtil { public static final ExecutorService asyncWorker = Executors.newSingleThreadExecutor((runnable) -> { Thread thread = new Thread(runnable); thread.setDaemon(true); diff --git a/src/main/java/com/falsepattern/lib/util/LangUtil.java b/src/main/java/com/falsepattern/lib/util/LangUtil.java new file mode 100644 index 0000000..64c07d3 --- /dev/null +++ b/src/main/java/com/falsepattern/lib/util/LangUtil.java @@ -0,0 +1,31 @@ +package com.falsepattern.lib.util; + +import com.falsepattern.lib.StableAPI; +import cpw.mods.fml.common.registry.LanguageRegistry; +import lombok.*; + +import java.util.HashMap; +import java.util.Map; + +import static lombok.AccessLevel.PRIVATE; + +@NoArgsConstructor(access = PRIVATE) +@StableAPI(since = "0.8.0") +public final class LangUtil { + public static final String DEFAULT_LOCALE = "en_US"; + private static final ThreadLocal> tempMap = ThreadLocal.withInitial(HashMap::new); + + public static void defaultLocalization(@NonNull Map localeMap) { + localeMap.forEach(LangUtil::defaultLocalization); + } + + public static void defaultLocalization(@NonNull String key, @NonNull String value) { + if (!LanguageRegistry.instance().getStringLocalization(key, DEFAULT_LOCALE).isEmpty()) + return; + val map = tempMap.get(); + map.put(key, value); + LanguageRegistry.instance().injectLanguage(DEFAULT_LOCALE, map); + map.clear(); + } +} + diff --git a/src/main/java/com/falsepattern/lib/util/RenderUtil.java b/src/main/java/com/falsepattern/lib/util/RenderUtil.java new file mode 100644 index 0000000..f678141 --- /dev/null +++ b/src/main/java/com/falsepattern/lib/util/RenderUtil.java @@ -0,0 +1,28 @@ +package com.falsepattern.lib.util; + +import cpw.mods.fml.relauncher.ReflectionHelper; +import cpw.mods.fml.relauncher.SideOnly; +import lombok.*; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Timer; + +import static cpw.mods.fml.relauncher.Side.CLIENT; +import static lombok.AccessLevel.PRIVATE; +import static net.minecraft.client.Minecraft.getMinecraft; + +@SideOnly(CLIENT) +@NoArgsConstructor(access = PRIVATE) +public final class RenderUtil { + private final static Timer MINECRAFT_TIMER = getMinecraftTimer(); + + @SneakyThrows + private static Timer getMinecraftTimer() { + val timerField = ReflectionHelper.findField(Minecraft.class, "timer", "field_71428_T"); + timerField.setAccessible(true); + return (Timer) timerField.get(getMinecraft()); + } + + public static float partialTick() { + return MINECRAFT_TIMER.renderPartialTicks; + } +}