Skip to content

Commit 2b0cf72

Browse files
A lotta updates and stuff
1 parent 7a59eab commit 2b0cf72

8 files changed

Lines changed: 70 additions & 51 deletions

File tree

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ apply plugin: "org.spongepowered.mixin"
1818

1919
repositories {
2020
maven { url "http://repo.spongepowered.org/maven" }
21-
maven { url "http://chickenbones.net/maven/" }
21+
maven { url "https://maven.covers1624.net" }
2222
maven { url "http://www.dimdev.org/maven" }
2323
maven { url "http://maven.tterrag.com/" }
2424
ivy {
@@ -60,7 +60,7 @@ sourceCompatibility = 1.8
6060
targetCompatibility = 1.8
6161

6262
minecraft {
63-
version "1.12.2-14.23.4.2703"
63+
version "1.12.2-14.23.5.2847"
6464
runDir "run"
6565
mappings "stable_39"
6666
makeObfSourceJar false

src/main/java/org/dimdev/vanillafix/bugs/mixins/client/MixinEntityPlayerSP.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@
1010
@Mixin(EntityPlayerSP.class)
1111
public class MixinEntityPlayerSP {
1212
/**
13-
* @reason Enables opening GUIs in nether portals. This works by making the
14-
* vanilla code thinks no GUI is open by forcing Minecraft.currentScreen to
15-
* always return null. (see https://bugs.mojang.com/browse/MC-2071)
13+
* @reason Enables opening GUIs in nether portals. (see https://bugs.mojang.com/browse/MC-2071)
14+
* This works by making minecraft think that GUI pauses the game
1615
*/
17-
@Redirect(method = "onLivingUpdate", at = @At(value = "FIELD", target = "Lnet/minecraft/client/Minecraft;currentScreen:Lnet/minecraft/client/gui/GuiScreen;", ordinal = 0))
18-
private GuiScreen getCurrentScreen(Minecraft mc) {
19-
return null;
16+
@Redirect(method = "onLivingUpdate", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiScreen;doesGuiPauseGame()Z"))
17+
private boolean onPauseCheck(GuiScreen guiScreen) {
18+
return true;
2019
}
2120
}

src/main/java/org/dimdev/vanillafix/bugs/mixins/client/MixinMinecraft.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import net.minecraft.client.Minecraft;
44
import net.minecraft.client.gui.GuiIngame;
55
import net.minecraft.client.gui.GuiNewChat;
6+
import net.minecraft.client.multiplayer.WorldClient;
67
import net.minecraft.client.renderer.texture.TextureManager;
78
import net.minecraft.client.shader.Framebuffer;
89
import net.minecraft.profiler.ISnooperInfo;
@@ -20,7 +21,9 @@
2021
import org.spongepowered.asm.mixin.Mixin;
2122
import org.spongepowered.asm.mixin.Shadow;
2223
import org.spongepowered.asm.mixin.injection.At;
24+
import org.spongepowered.asm.mixin.injection.Inject;
2325
import org.spongepowered.asm.mixin.injection.Redirect;
26+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
2427

2528
import javax.imageio.ImageIO;
2629
import java.awt.image.BufferedImage;
@@ -96,4 +99,10 @@ private ITextComponent saveScreenshotAsync(File gameDirectory, int width, int he
9699
/** @reason Message is sent from screenshot method now. */
97100
@Redirect(method = "dispatchKeypresses", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiNewChat;printChatMessage(Lnet/minecraft/util/text/ITextComponent;)V", ordinal = 0))
98101
private void sendScreenshotMessage(GuiNewChat guiNewChat, ITextComponent chatComponent) {}
102+
103+
/** @reason Removes a call to {@link System#gc()} to make world loading as fast as possible */
104+
@Inject(method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Ljava/lang/String;)V", at = @At(value = "INVOKE", target = "Ljava/lang/System;gc()V"), cancellable = true)
105+
private void onSystemGC(WorldClient worldClient, String reason, CallbackInfo ci) {
106+
ci.cancel();
107+
}
99108
}
Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.dimdev.vanillafix.bugs.mixins.client;
22

33
import net.minecraft.client.Minecraft;
4+
import net.minecraft.client.gui.GuiScreen;
45
import net.minecraft.client.multiplayer.WorldClient;
56
import net.minecraft.client.network.NetHandlerPlayClient;
67
import net.minecraft.network.PacketThreadUtil;
@@ -11,46 +12,26 @@
1112
import org.spongepowered.asm.mixin.Mixin;
1213
import org.spongepowered.asm.mixin.Overwrite;
1314
import org.spongepowered.asm.mixin.Shadow;
15+
import org.spongepowered.asm.mixin.injection.At;
16+
import org.spongepowered.asm.mixin.injection.Redirect;
1417

18+
/**
19+
* Makes interdimensional teleportation nearly as fast as same-dimension
20+
* teleportation by removing the "Downloading terrain..." screen. This will cause
21+
* the player to see partially loaded terrain rather than waiting for the whole
22+
* render distance to load, but that's also the vanilla behaviour for same-dimension
23+
* teleportation.
24+
*/
1525
@Mixin(value = NetHandlerPlayClient.class, priority = 500)
1626
public abstract class MixinNetHandlerPlayClient implements INetHandlerPlayClient {
17-
@Shadow private boolean doneLoadingTerrain;
18-
@Shadow(aliases = "clientWorldController") private WorldClient world;
19-
@Shadow(aliases = "gameController") private Minecraft client;
2027

21-
/**
22-
* @reason Makes interdimensional teleportation nearly as fast as same-dimension
23-
* teleportation by removing the "Downloading terrain..." screen. This will cause
24-
* the player to see partially loaded terrain rather than waiting for the whole
25-
* render distance to load, but that's also the vanilla behaviour for same-dimension
26-
* teleportation.
27-
*/
28-
@Overwrite
29-
@Override
30-
public void handleRespawn(SPacketRespawn packetIn) {
31-
PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, client);
32-
33-
if (packetIn.getDimensionID() != client.player.dimension) {
34-
doneLoadingTerrain = false;
35-
client.displayGuiScreen(null);
36-
37-
Scoreboard scoreboard = world.getScoreboard();
38-
world = new WorldClient((NetHandlerPlayClient) (Object) this, new WorldSettings(0L, packetIn.getGameType(), false, client.world.getWorldInfo().isHardcoreModeEnabled(), packetIn.getWorldType()), packetIn.getDimensionID(), packetIn.getDifficulty(), client.profiler);
39-
if (scoreboard != null) world.setWorldScoreboard(scoreboard);
40-
client.loadWorld(world);
41-
client.player.dimension = packetIn.getDimensionID();
42-
}
43-
44-
client.setDimensionAndSpawnPlayer(packetIn.getDimensionID());
45-
client.playerController.setGameType(packetIn.getGameType());
28+
@Redirect(method = "handleJoinGame", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;displayGuiScreen(Lnet/minecraft/client/gui/GuiScreen;)V"))
29+
private void onGuiDisplayJoin(Minecraft mc, GuiScreen guiScreenIn) {
30+
mc.displayGuiScreen(null);
4631
}
4732

48-
// TODO: make this work:
49-
// @Redirect(method = "handleRespawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;displayGuiScreen(Lnet/minecraft/client/gui/GuiScreen;)V", ordinal = 0))
50-
// private void patchDisplayGuiScreen(Minecraft minecraft, GuiScreen screen) {}
51-
//
52-
// @Inject(method = "handleRespawn", at = @At(value = "FIELD", target = "Lnet/minecraft/client/network/NetHandlerPlayClient;doneLoadingTerrain:Z", ordinal = 0))
53-
// private void setDoneLoadingTerrain(boolean value) {
54-
// client.displayGuiScreen(null);
55-
// }
33+
@Redirect(method = "handleRespawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;displayGuiScreen(Lnet/minecraft/client/gui/GuiScreen;)V"))
34+
private void onGuiDisplayRespawn(Minecraft mc, GuiScreen guiScreenIn) {
35+
mc.displayGuiScreen(null);
36+
}
5637
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.dimdev.vanillafix.bugs.mixins.client;
2+
3+
import com.google.common.util.concurrent.ThreadFactoryBuilder;
4+
import net.minecraft.client.renderer.ThreadDownloadImageData;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.injection.At;
7+
import org.spongepowered.asm.mixin.injection.Redirect;
8+
9+
import java.util.concurrent.Executor;
10+
import java.util.concurrent.Executors;
11+
12+
/**
13+
* Removes a start of tons new threads
14+
* for skins loading
15+
*/
16+
@Mixin(ThreadDownloadImageData.class)
17+
public final class MixinThreadDownloadImageData {
18+
private static final Executor EXECUTOR = Executors.newFixedThreadPool(Math.max(2, Runtime.getRuntime().availableProcessors() / 2), new ThreadFactoryBuilder().setNameFormat("Skin Downloader #%d").setDaemon(true).setPriority(Thread.MIN_PRIORITY).build());
19+
20+
@Redirect(method = "loadTextureFromServer", at = @At(value = "INVOKE", target = "Ljava/lang/Thread;start()V"))
21+
private void onThreadStart(Thread thread) {
22+
EXECUTOR.execute(thread);
23+
}
24+
}

src/main/java/org/dimdev/vanillafix/textures/mixins/client/MixinBlockModelRenderer.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,20 @@ private void beforeRenderModel(IBlockAccess world, IBakedModel model, IBlockStat
4343
for (EnumFacing side : EnumFacing.values()) {
4444
if (!checkSides || state.shouldSideBeRendered(world, pos, side)) {
4545
List<BakedQuad> quads = model.getQuads(state, side, rand);
46-
if (quads == null) continue;
4746
for (BakedQuad quad : quads) {
48-
if (quad == null || quad.getSprite() == null) continue;
47+
if (quad == null) {
48+
continue;
49+
} else {
50+
quad.getSprite();
51+
}
4952
visibleTextures.add(quad.getSprite());
5053
}
5154
}
5255
}
5356

5457
List<BakedQuad> quads = model.getQuads(state, null, rand);
55-
if (quads != null) for (BakedQuad quad : quads) {
56-
if (quad == null || quad.getSprite() == null) continue;
58+
for (BakedQuad quad : quads) {
59+
if (quad == null) continue;
5760
visibleTextures.add(quad.getSprite());
5861
}
5962

src/main/java/org/dimdev/vanillafix/textures/modsupport/mixins/client/MixinRenderUtil.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
public class MixinRenderUtil {
1717
@Inject(method = "putTexturedQuad(Lnet/minecraft/client/renderer/BufferBuilder;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;DDDDDDLnet/minecraft/util/EnumFacing;IIIIIIZZ)V", at = @At("HEAD"), remap = false)
1818
private static void onRenderQuad(BufferBuilder renderer, TextureAtlasSprite sprite, double x, double y, double z, double w, double h, double d, EnumFacing face, int r, int g, int b, int a, int light1, int light2, boolean flowing, boolean flipHorizontally, CallbackInfo ci) {
19-
((IPatchedTextureAtlasSprite) sprite).markNeedsAnimationUpdate();
19+
if (sprite != null)
20+
((IPatchedTextureAtlasSprite) sprite).markNeedsAnimationUpdate();
2021
}
2122

2223
@Inject(method = "putRotatedQuad(Lnet/minecraft/client/renderer/BufferBuilder;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;DDDDDLnet/minecraft/util/EnumFacing;IIIIIIZ)V", at = @At("HEAD"), remap = false)
2324
private static void onRenderRotatedQuad(BufferBuilder renderer, TextureAtlasSprite sprite, double x, double y, double z, double w, double d, EnumFacing rotation, int r, int g, int b, int a, int light1, int light2, boolean flowing, CallbackInfo ci) {
24-
((IPatchedTextureAtlasSprite) sprite).markNeedsAnimationUpdate();
25+
if (sprite != null)
26+
((IPatchedTextureAtlasSprite) sprite).markNeedsAnimationUpdate();
2527
}
2628
}

src/main/resources/mixins.vanillafix.bugs.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
"client.MixinNetHandlerPlayClient",
2121
"client.MixinEntityPlayerSP",
2222
"client.MixinIntegratedServer",
23-
"client.MixinEntityRenderer"
23+
"client.MixinEntityRenderer",
24+
"client.MixinThreadDownloadImageData"
2425
],
2526
"injectors": {
2627
"maxShiftBy": 10

0 commit comments

Comments
 (0)