Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ def commonManifest = {
attributes 'Implementation-Vendor': 'covers1624'
attributes 'Implementation-Version': version
attributes 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
attributes 'MixinConfigs': 'mixins.codechickenlib.json'
attributes 'MixinConfigs': 'mixins.codechickenlib.json,mixins.codechickenlib.optifine.json'
}

jar {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package codechicken.lib.internal.optifine;

public interface OptiFineGameSettingsBridge {

boolean bridge$isFastRender();

void bridge$setFastRender(boolean value);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package codechicken.lib.internal.optifine;

import codechicken.lib.CodeChickenLib;
import net.minecraft.client.GameSettings;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.MainMenuScreen;
import net.minecraft.client.gui.toasts.SystemToast;
import net.minecraft.util.Util;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.GuiScreenEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

@Mod.EventBusSubscriber (modid = CodeChickenLib.MOD_ID, value = Dist.CLIENT)
public class OptiFineGuiListener {

private static boolean notified;
private static long firstRenderTime;
private static long previousMouseX;
private static long previousMouseY;

@SubscribeEvent
public static void onDrawScreen(GuiScreenEvent.DrawScreenEvent.Post event) {
if (notified || !(event.getGui() instanceof MainMenuScreen)) {
return;
}

GameSettings gameSettings = Minecraft.getInstance().options;
if (!(gameSettings instanceof OptiFineGameSettingsBridge) || !((OptiFineGameSettingsBridge) gameSettings).bridge$isFastRender()) {
notified = true;
return;
}

if (firstRenderTime == 0) {
firstRenderTime = Util.getMillis();
previousMouseX = event.getMouseX();
previousMouseY = event.getMouseY();
return;
}

// Wait for fade in effect
if (Util.getMillis() - firstRenderTime < 1000) {
return;
}

// Wait for user input
if (previousMouseX == event.getMouseX() && previousMouseY == event.getMouseY()) {
return;
}

notified = true;
Minecraft.getInstance().getToasts().addToast(new SystemToast(
SystemToast.Type.TUTORIAL_HINT,
new TranslationTextComponent("ccl.optifine.toast.title"),
new TranslationTextComponent("ccl.optifine.toast.description")
));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package codechicken.lib.internal.optifine;

import org.objectweb.asm.tree.ClassNode;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;

import java.util.List;
import java.util.Set;

public class OptiFinePlugin implements IMixinConfigPlugin {

private boolean shouldApplyMixin;

@Override
public void onLoad(String mixinPackage) {
try {
Class.forName("optifine.OptiFineTransformationService", false, Thread.currentThread().getContextClassLoader());
this.shouldApplyMixin = true;
} catch (Throwable throwable) {
// no-op
}
}

//@formatter:off
@Override public String getRefMapperConfig() { return null; }
@Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { return shouldApplyMixin; }
@Override public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) { }
@Override public List<String> getMixins() { return null; }
@Override public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { }
@Override public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { }
//@formatter:on
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package codechicken.lib.internal.optifine.mixin;

import codechicken.lib.internal.optifine.OptiFineGameSettingsBridge;
import net.minecraft.client.GameSettings;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;

@Mixin (GameSettings.class)
public abstract class GameSettingsMixin implements OptiFineGameSettingsBridge {

@SuppressWarnings ({"ShadowTarget", "target"})
@Shadow (remap = false)
private boolean ofFastRender;

@Override
public boolean bridge$isFastRender() {
return ofFastRender;
}

@Override
public void bridge$setFastRender(boolean value) {
this.ofFastRender = value;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package codechicken.lib.internal.optifine.mixin;

import codechicken.lib.internal.optifine.OptiFineGameSettingsBridge;
import net.minecraft.client.GameSettings;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.ConfirmScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.Widget;
import net.minecraft.client.gui.widget.button.OptionButton;
import net.minecraft.client.settings.IteratableOption;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Pseudo
@Mixin (targets = "net.optifine.gui.GuiPerformanceSettingsOF", remap = false)
public abstract class GuiPerformanceSettingsOFMixin extends Screen {

public GuiPerformanceSettingsOFMixin(ITextComponent titleIn) {
super(titleIn);
}

@SuppressWarnings ("UnresolvedMixinReference")
@Inject (
method = "actionPerformed",
at = @At(
value = "HEAD"
)
)
private void onActionPerformed(Widget widget, CallbackInfo callbackInfo) {
if (!(widget instanceof OptionButton)) {
return;
}

OptionButton button = (OptionButton) widget;
if (!(button.getOption() instanceof IteratableOption)) {
return;
}

IteratableOption option = (IteratableOption) button.getOption();
if (!(option.getCaption() instanceof TranslationTextComponent)) {
return;
}

TranslationTextComponent translation = (TranslationTextComponent) option.getCaption();
if (!translation.getKey().equals("of.options.FAST_RENDER")) {
return;
}

GameSettings gameSettings = Minecraft.getInstance().options;
if (!(gameSettings instanceof OptiFineGameSettingsBridge) || !((OptiFineGameSettingsBridge) gameSettings).bridge$isFastRender()) {
return;
}

Minecraft.getInstance().setScreen(new ConfirmScreen(callback -> {
((OptiFineGameSettingsBridge) gameSettings).bridge$setFastRender(callback);
Minecraft.getInstance().setScreen(this);
}, new TranslationTextComponent("ccl.optifine.confirm.title"), new TranslationTextComponent("ccl.optifine.confirm.description")));
}
}
2 changes: 1 addition & 1 deletion src/main/resources/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
COMMENT: This file exists purely for dev time,
anything added here should be mirrored in the build.gradle.
MixinConfigs: mixins.codechickenlib.json
MixinConfigs: mixins.codechickenlib.json,mixins.codechickenlib.optifine.json
3 changes: 3 additions & 0 deletions src/main/resources/META-INF/accesstransformer.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,6 @@ public-f net.minecraft.client.renderer.BlockRendererDispatcher field_175028_a #
public-f net.minecraft.client.Minecraft field_175618_aM # blockRenderDispatcher
public net.minecraft.client.renderer.ItemRenderer func_229114_a_(Lnet/minecraft/client/renderer/model/IBakedModel;Lnet/minecraft/item/ItemStack;IILcom/mojang/blaze3d/matrix/MatrixStack;Lcom/mojang/blaze3d/vertex/IVertexBuilder;)V # renderModel
public net.minecraft.item.ArmorMaterial field_77882_bY # MAX_DAMAGE_ARRAY

# OptiFine
public net.minecraft.client.AbstractOption func_243220_a()Lnet/minecraft/util/text/ITextComponent; # getBaseMessageTranslation
6 changes: 5 additions & 1 deletion src/main/resources/assets/codechickenlib/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,9 @@
"ccl.commands.killall.success": "Killed %s entities.",
"ccl.commands.killall.success.line": "Killed %s",
"ccl.commands.count.fail": "Found no entities.",
"ccl.commands.count.total": "Found %s entities."
"ccl.commands.count.total": "Found %s entities.",
"ccl.optifine.toast.title": "OptiFine Incompatibility",
"ccl.optifine.toast.description": "FastRender not supported",
"ccl.optifine.confirm.title": "OptiFine Incompatibility",
"ccl.optifine.confirm.description": "Enabling Fast Render is known to cause rendering issues for forge mods, Please do not report any graphical errors to mod developers with this option turned on. Ensure that you are able to reproduce graphical errors without Optifine installed.\nAre you sure you wish to proceed?"
}
6 changes: 5 additions & 1 deletion src/main/resources/data/codechickenlib/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,9 @@
"ccl.commands.killall.success": "Killed %s entities.",
"ccl.commands.killall.success.line": "Killed %s",
"ccl.commands.count.fail": "Found no entities.",
"ccl.commands.count.total": "Found %s entities."
"ccl.commands.count.total": "Found %s entities.",
"ccl.optifine.toast.title": "OptiFine Incompatibility",
"ccl.optifine.toast.description": "FastRender not supported",
"ccl.optifine.confirm.title": "OptiFine Incompatibility",
"ccl.optifine.confirm.description": "Enabling Fast Render is known to cause rendering issues for forge mods, Please do not report any graphical errors to mod developers with this option turned on. Ensure that you are able to reproduce graphical errors without Optifine installed.\nAre you sure you wish to proceed?"
}
13 changes: 13 additions & 0 deletions src/main/resources/mixins.codechickenlib.optifine.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"required": false,
"minVersion": "0.8",
"package": "codechicken.lib.internal.optifine.mixin",
"refmap": "mixins.codechickenlib.refmap.json",
"plugin": "codechicken.lib.internal.optifine.OptiFinePlugin",
"target": "@env(DEFAULT)",
"compatibilityLevel": "JAVA_8",
"client" : [
"GameSettingsMixin",
"GuiPerformanceSettingsOFMixin"
]
}