LitnhJacuzzi
LitnhJacuzzi
I recommend you to use sun.misc.Unsafe.allocateInstance(), the Objenesis will be not available when the class is dynamically generated(It causes NoClassDefFoundError like #100 and problems in #45).
(注:Fabric1.19.4最新版本的模组中,类`TextFieldMixin`注入了不存在的方法`onClick`导致此类注入时抛出异常注入失败,因此该版本的模组在原版所有的TextFieldWidget组件都无法正常工作。经调查,当前版本中此处注入的方法名应该为`mouseClicked`) 实现原理建议:此模组的功能建议使用监听焦点组件的变化来实现,焦点是一个GUI系统中用于定向键盘输入的关键属性,在一个标准的GUI系统中,如果此系统被操作系统赋予了焦点,那么其中有且只有一个焦点组件,在没有全局键盘监听的情况下,键盘输入最终只会在这一个组件上产生效果。而文本框组件则是典型的`focusableWidget`,只有当其获得焦点时才能向其中输入文字,因此监听所有文本框组件的焦点变化可以准确地决定当前输入法的状态。下面以Fabric1.19.4来说明大概的实现方式: 首先Fabric本身并没有提供监听焦点变化的API,如果要监听文本框的焦点变化只能通过Mixin注入监听器到文本框类`setFocused`方法的**尾部**;不同Fabric模组的文本框组件类不同,要适配不同模组需要一一注入;Fabric中一个`Screen`隐藏时不会移除其中获得了焦点的组件的焦点,因此需要注入焦点移除的代码到`MinecraftClient.setScreen()`方法中。 我已在原版的文本框组件中应用了基于此原理的实现,效果很好,相关的实现部分如下: 类`IMCheckState`: ```java // check overall state private static void syncState() { IMManager.makeState(focusedInputWidget != null || ); } public static void focusGained(Object widget) { focusedInputWidget = widget;...
当前版本的 ModernUI 会将文本 Shader 始终锁定为模组自定义的实现(如`rendertype_modern_text_sdf_fill.json`),不会应用由资源包自定义的 Shader 实现,这会导致一些资源包中的文本效果(如`ItemAdders`插件的动态彩色、波浪等效果)无法呈现 最好的解决方案应该是设法合并 ModernUI 和资源包定义的文本 Shader 以实现最佳的呈现效果。我对 Shader 编程不熟暂时不能提供通用的合并方案,但应该需要在加载资源包时对两个 Shader 进行源码级处理