Get render module mostly working

This commit is contained in:
Jonas Herzig
2019-03-10 15:56:48 +01:00
parent f8fc3462e8
commit cdcd6f6893
12 changed files with 158 additions and 55 deletions

View File

@@ -8,6 +8,7 @@ import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.StandardOpenOption; import java.nio.file.StandardOpenOption;
@@ -32,7 +33,7 @@ public class PlainFileAuthData implements AuthData {
String authKey; String authKey;
try { try {
authKey = new String(Files.readAllBytes(path), StandardCharsets.UTF_8); authKey = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
} catch (FileNotFoundException ignored) { } catch (NoSuchFileException | FileNotFoundException ignored) {
return; return;
} }
AuthConfirmation result = apiClient.checkAuthkey(authKey); AuthConfirmation result = apiClient.checkAuthkey(authKey);

View File

@@ -119,6 +119,8 @@ public abstract class OpenGlFrameCapturer<F extends Frame, D extends CaptureData
if (fb.framebufferWidth != width || fb.framebufferHeight != height) { if (fb.framebufferWidth != width || fb.framebufferHeight != height) {
fb.createFramebuffer(width, height); fb.createFramebuffer(width, height);
} }
mc.mainWindow.framebufferWidth = width;
mc.mainWindow.framebufferHeight = height;
//#else //#else
//$$ if (width != mc.displayWidth || height != mc.displayHeight) { //$$ if (width != mc.displayWidth || height != mc.displayHeight) {
//$$ mc.resize(width, height); //$$ mc.resize(width, height);

View File

@@ -42,6 +42,7 @@ import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path; import java.nio.file.Path;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
@@ -300,7 +301,7 @@ public class GuiRenderSettings extends GuiScreen implements Closeable {
String json = "{}"; String json = "{}";
try { try {
json = new String(Files.readAllBytes(getSettingsPath()), StandardCharsets.UTF_8); json = new String(Files.readAllBytes(getSettingsPath()), StandardCharsets.UTF_8);
} catch (FileNotFoundException ignored) { } catch (NoSuchFileException | FileNotFoundException ignored) {
} catch (IOException e) { } catch (IOException e) {
LOGGER.error("Reading render settings:", e); LOGGER.error("Reading render settings:", e);
} }

View File

@@ -273,10 +273,13 @@ public class GuiVideoRenderer extends GuiScreen implements Tickable {
//#if MC>=11300 //#if MC>=11300
NativeImage data = previewTexture.getTextureData(); NativeImage data = previewTexture.getTextureData();
assert data != null; assert data != null;
for (int x = 0; x < data.getWidth(); x++) {
for (int y = 0; y < data.getHeight(); y++) { for (int y = 0; y < data.getHeight(); y++) {
int value = 0xff << 24 | (buffer.get() & 0xff) << 16 | (buffer.get() & 0xff) << 8 | (buffer.get() & 0xff); for (int x = 0; x < data.getWidth(); x++) {
data.setPixelRGBA(x, y, value); int r = buffer.get() & 0xff;
int g = buffer.get() & 0xff;
int b = buffer.get() & 0xff;
int value = 0xff << 24 | b << 16 | g << 8 | r;
data.setPixelRGBA(x, y, value); // actually takes ABGR, not RGBA
} }
} }
//#else //#else

View File

@@ -88,10 +88,6 @@ public class EntityRendererHandler implements WorldRenderer {
this.omnidirectional = omnidirectional; this.omnidirectional = omnidirectional;
} }
public interface GluPerspective {
void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar);
}
public interface IEntityRenderer { public interface IEntityRenderer {
void replayModRender_setHandler(EntityRendererHandler handler); void replayModRender_setHandler(EntityRendererHandler handler);
EntityRendererHandler replayModRender_getHandler(); EntityRendererHandler replayModRender_getHandler();

View File

@@ -50,7 +50,7 @@ import static com.replaymod.core.versions.MCVer.*;
//#else //#else
//$$ @Mixin(value = EntityRenderer.class) //$$ @Mixin(value = EntityRenderer.class)
//#endif //#endif
public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer, EntityRendererHandler.GluPerspective { public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer {
@Shadow @Shadow
public Minecraft mc; public Minecraft mc;
@@ -77,13 +77,16 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
//$$ } //$$ }
//#endif //#endif
@Inject(method = "setupFog", at = @At("HEAD"), cancellable = true) // Moved to MixinFogRenderer in 1.13
private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) { //#if MC<11300
if (replayModRender_handler == null) return; //$$ @Inject(method = "setupFog", at = @At("HEAD"), cancellable = true)
if (replayModRender_handler.getSettings().getChromaKeyingColor() != null) { //$$ private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) {
ci.cancel(); //$$ if (replayModRender_handler == null) return;
} //$$ if (replayModRender_handler.getSettings().getChromaKeyingColor() != null) {
} //$$ ci.cancel();
//$$ }
//$$ }
//#endif
@Inject(method = "orientCamera", at = @At("HEAD")) @Inject(method = "orientCamera", at = @At("HEAD"))
private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) { private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) {
@@ -109,7 +112,13 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
private float orgRoll; private float orgRoll;
@Inject(method = "setupCameraTransform", at = @At("HEAD")) @Inject(method = "setupCameraTransform", at = @At("HEAD"))
private void replayModRender_beforeSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_beforeSetupCameraTransform(
float partialTicks,
//#if MC<11300
//$$ int renderPass,
//#endif
CallbackInfo ci
) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
Entity entity = getRenderViewEntity(MCVer.getMinecraft()); Entity entity = getRenderViewEntity(MCVer.getMinecraft());
orgYaw = entity.rotationYaw; orgYaw = entity.rotationYaw;
@@ -121,7 +130,13 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
} }
@Inject(method = "setupCameraTransform", at = @At("RETURN")) @Inject(method = "setupCameraTransform", at = @At("RETURN"))
private void replayModRender_afterSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_afterSetupCameraTransform(
float partialTicks,
//#if MC<11300
//$$ int renderPass,
//#endif
CallbackInfo ci
) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
Entity entity = getRenderViewEntity(MCVer.getMinecraft()); Entity entity = getRenderViewEntity(MCVer.getMinecraft());
entity.rotationYaw = orgYaw; entity.rotationYaw = orgYaw;
@@ -135,28 +150,41 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
} }
@Inject(method = "renderHand", at = @At("HEAD"), cancellable = true) @Inject(method = "renderHand", at = @At("HEAD"), cancellable = true)
private void replayModRender_renderSpectatorHand(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_renderSpectatorHand(
float partialTicks,
//#if MC<11300
//$$ int renderPass,
//#endif
CallbackInfo ci
) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
if (replayModRender_handler.omnidirectional) { if (replayModRender_handler.omnidirectional) {
// No spectator hands during 360° view, we wouldn't even know where to put it
ci.cancel(); ci.cancel();
return; // No spectator hands during 360° view, we wouldn't even know where to put it //#if MC>=11300
}
Entity currentEntity = getRenderViewEntity(MCVer.getMinecraft());
if (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) {
if (renderPass == 2) { // Need to update render pass
renderPass = replayModRender_handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0;
renderHand(partialTicks, renderPass);
ci.cancel();
} // else, render normally
} }
//#else
//$$ } else {
//$$ Entity currentEntity = getRenderViewEntity(MCVer.getMinecraft());
//$$ if (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) {
//$$ if (renderPass == 2) { // Need to update render pass
//$$ renderPass = replayModRender_handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0;
//$$ renderHand(partialTicks, renderPass);
//$$ ci.cancel();
//$$ } // else, render normally
//$$ }
//$$ }
//#endif
} }
} }
@Shadow //#if MC<11300
public abstract void renderHand(float partialTicks, int renderPass); //$$ @Shadow
//$$ public abstract void renderHand(float partialTicks, int renderPass);
//#endif
//#if MC>=11300 //#if MC>=11300
@Redirect(method = "updateCameraAndRender", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V")) @Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V"))
private void replayModRender_drawSelectionBox(WorldRenderer instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) { private void replayModRender_drawSelectionBox(WorldRenderer instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) {
//#else //#else
//#if MC>=10904 //#if MC>=10904
@@ -179,7 +207,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
private int orgRenderDistanceChunks; private int orgRenderDistanceChunks;
//#if MC>=11300 //#if MC>=11300
@Inject(method = "updateCameraAndRender", at = @At(value = "JUMP", ordinal = 0)) @Inject(method = "updateCameraAndRender(FJ)V", at = @At(value = "JUMP", ordinal = 0))
//#else //#else
//#if MC>=10800 //#if MC>=10800
//$$ @Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0)) //$$ @Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0))
@@ -197,7 +225,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
} }
//#if MC>=11300 //#if MC>=11300
@Redirect(method = "updateCameraAndRender", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;renderSky(F)V")) @Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;renderSky(F)V"))
private void replayModRender_renderSky(WorldRenderer instance, float partialTicks) { private void replayModRender_renderSky(WorldRenderer instance, float partialTicks) {
//#else //#else
//#if MC>=10800 //#if MC>=10800
@@ -235,7 +263,13 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
//#else //#else
//$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 0, remap = false)) //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 0, remap = false))
//#endif //#endif
private void replayModRender_setupStereoscopicProjection(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_setupStereoscopicProjection(
float partialTicks,
//#if MC<11300
//$$ int renderPass,
//#endif
CallbackInfo ci
) {
if (replayModRender_getHandler() != null) { if (replayModRender_getHandler() != null) {
if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) {
GL11.glTranslatef(0.07f, 0, 0); GL11.glTranslatef(0.07f, 0, 0);
@@ -250,7 +284,13 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
//#else //#else
//$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 1, remap = false)) //$$ @Inject(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glLoadIdentity()V", shift = At.Shift.AFTER, ordinal = 1, remap = false))
//#endif //#endif
private void replayModRender_setupStereoscopicModelView(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_setupStereoscopicModelView(
float partialTicks,
//#if MC<11300
//$$ int renderPass,
//#endif
CallbackInfo ci
) {
if (replayModRender_getHandler() != null) { if (replayModRender_getHandler() != null) {
if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) {
GL11.glTranslatef(0.1f, 0, 0); GL11.glTranslatef(0.1f, 0, 0);
@@ -265,23 +305,22 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
*/ */
//#if MC>=11300 //#if MC>=11300
@Redirect(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/Matrix4f;perspective(DFFF)V")) @Redirect(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/Matrix4f;perspective(DFFF)Lnet/minecraft/client/renderer/Matrix4f;"))
private void replayModRender_gluPerspective$0(double fovY, float aspect, float zNear, float zFar) { private Matrix4f replayModRender_perspective$0(double fovY, float aspect, float zNear, float zFar) {
replayModRender_gluPerspective((float) fovY, aspect, zNear, zFar); return replayModRender_perspective((float) fovY, aspect, zNear, zFar);
} }
@Redirect(method = "updateCameraAndRender", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/Matrix4f;perspective(DFFF)V")) @Redirect(method = "updateCameraAndRender(FJ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/Matrix4f;perspective(DFFF)Lnet/minecraft/client/renderer/Matrix4f;"))
private void replayModRender_gluPerspective$1(double fovY, float aspect, float zNear, float zFar) { private Matrix4f replayModRender_perspective$1(double fovY, float aspect, float zNear, float zFar) {
replayModRender_gluPerspective((float) fovY, aspect, zNear, zFar); return replayModRender_perspective((float) fovY, aspect, zNear, zFar);
} }
@Override private Matrix4f replayModRender_perspective(float fovY, float aspect, float zNear, float zFar) {
public void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) {
if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) {
fovY = 90; fovY = 90;
aspect = 1; aspect = 1;
} }
Matrix4f.perspective(fovY, aspect, zNear, zFar); return Matrix4f.perspective(fovY, aspect, zNear, zFar);
} }
//#else //#else
//$$ @Redirect(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) //$$ @Redirect(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false))
@@ -305,8 +344,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
//$$ } //$$ }
//#endif //#endif
//$$ //$$
//$$ @Override //$$ private void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) {
//$$ public void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) {
//$$ if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { //$$ if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) {
//$$ fovY = 90; //$$ fovY = 90;
//$$ aspect = 1; //$$ aspect = 1;

View File

@@ -0,0 +1,24 @@
//#if MC>=11300
package com.replaymod.render.mixin;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.renderer.FogRenderer;
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.CallbackInfo;
@Mixin(FogRenderer.class)
public abstract class MixinFogRenderer {
@Inject(method = "setupFog", at = @At("HEAD"), cancellable = true)
private void replayModRender_onSetupFog(int fogDistanceFlag, float partialTicks, CallbackInfo ci) {
EntityRendererHandler handler =
((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().entityRenderer).replayModRender_getHandler();
if (handler == null) return;
if (handler.getSettings().getChromaKeyingColor() != null) {
ci.cancel();
}
}
}
//#endif

View File

@@ -39,12 +39,31 @@ public abstract class MixinRenderGlobal {
public ChunkRenderDispatcher renderDispatcher; public ChunkRenderDispatcher renderDispatcher;
@Shadow @Shadow
public abstract void setupTerrain(Entity viewEntity, double partialTicks, ICamera camera, public abstract void setupTerrain(
int frameCount, boolean playerSpectator); Entity viewEntity,
//#if MC>=11300
float partialTicks,
//#else
//$$ double partialTicks,
//#endif
ICamera camera,
int frameCount,
boolean playerSpectator
);
@Inject(method = "setupTerrain", at = @At("HEAD"), cancellable = true) @Inject(method = "setupTerrain", at = @At("HEAD"), cancellable = true)
public void replayModRender_setupTerrain(Entity viewEntity, double partialTicks, ICamera camera, private void replayModRender_setupTerrain(
int frameCount, boolean playerSpectator, CallbackInfo ci) { Entity viewEntity,
//#if MC>=11300
float partialTicks,
//#else
//$$ double partialTicks,
//#endif
ICamera camera,
int frameCount,
boolean playerSpectator,
CallbackInfo ci
) {
if (replayModRender_hook != null && !replayModRender_passThroughSetupTerrain) { if (replayModRender_hook != null && !replayModRender_passThroughSetupTerrain) {
replayModRender_passThroughSetupTerrain = true; replayModRender_passThroughSetupTerrain = true;

View File

@@ -23,7 +23,11 @@ public abstract class MixinRenderManager {
@Shadow @Shadow
private float playerViewY; private float playerViewY;
@Inject(method = "doRenderEntity", at = @At("HEAD")) //#if MC>=11300
@Inject(method = "renderEntity", at = @At("HEAD"))
//#else
//$$ @Inject(method = "doRenderEntity", at = @At("HEAD"))
//#endif
//#if MC>=10904 //#if MC>=10904
private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfo ci) { private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfo ci) {
//#else //#else

View File

@@ -181,7 +181,10 @@ public class VideoRenderer implements RenderInfo {
public float updateForNextFrame() { public float updateForNextFrame() {
// because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily // because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily
//#if MC>=11300 //#if MC>=11300
// FIXME is this even necessary? int displayWidthBefore = mc.mainWindow.framebufferWidth;
int displayHeightBefore = mc.mainWindow.framebufferHeight;
mc.mainWindow.framebufferWidth = displayWidth;
mc.mainWindow.framebufferHeight = displayHeight;
//#else //#else
//$$ int displayWidthBefore = mc.displayWidth; //$$ int displayWidthBefore = mc.displayWidth;
//$$ int displayHeightBefore = mc.displayHeight; //$$ int displayHeightBefore = mc.displayHeight;
@@ -207,7 +210,8 @@ public class VideoRenderer implements RenderInfo {
// change Minecraft's display size back // change Minecraft's display size back
//#if MC>=11300 //#if MC>=11300
// FIXME mc.mainWindow.framebufferWidth = displayWidthBefore;
mc.mainWindow.framebufferHeight = displayHeightBefore;
//#else //#else
//$$ mc.displayWidth = displayWidthBefore; //$$ mc.displayWidth = displayWidthBefore;
//$$ mc.displayHeight = displayHeightBefore; //$$ mc.displayHeight = displayHeightBefore;
@@ -359,6 +363,8 @@ public class VideoRenderer implements RenderInfo {
// Finally, resize the Minecraft framebuffer to the actual width/height of the window // Finally, resize the Minecraft framebuffer to the actual width/height of the window
//#if MC>=11300 //#if MC>=11300
mc.getFramebuffer().createFramebuffer(displayWidth, displayHeight); mc.getFramebuffer().createFramebuffer(displayWidth, displayHeight);
mc.mainWindow.framebufferWidth = displayWidth;
mc.mainWindow.framebufferHeight = displayHeight;
//#else //#else
//$$ mc.resize(displayWidth, displayHeight); //$$ mc.resize(displayWidth, displayHeight);
//#endif //#endif

View File

@@ -27,6 +27,12 @@ public net.minecraft.client.Minecraft func_147121_ag()V # rightClickMouse
public net.minecraft.client.Minecraft func_147112_ai()V # middleClickMouse public net.minecraft.client.Minecraft func_147112_ai()V # middleClickMouse
public net.minecraft.client.Minecraft func_147115_a(Z)V # sendClickBlockToController public net.minecraft.client.Minecraft func_147115_a(Z)V # sendClickBlockToController
##if MC>=11300
# MainWindow
public net.minecraft.client.MainWindow field_198131_r # framebufferWidth
public net.minecraft.client.MainWindow field_198132_s # framebufferHeight
##endif
# Packets # Packets
##if MC>=11300 ##if MC>=11300
public net.minecraft.network.play.server.SPacketJoinGame field_149200_f # maxPlayers public net.minecraft.network.play.server.SPacketJoinGame field_149200_f # maxPlayers

View File

@@ -11,6 +11,9 @@
//$$ "MixinRendererLivingEntity", //$$ "MixinRendererLivingEntity",
//#endif //#endif
"MixinEntityRenderer", "MixinEntityRenderer",
//#if MC>=11300
"MixinFogRenderer",
//#endif
"MixinFrustum", "MixinFrustum",
"MixinRender", "MixinRender",
//#if MC>=10800 //#if MC>=10800