Skip to content

Instantly share code, notes, and snippets.

@brickwall2900
Last active January 13, 2024 12:37
Show Gist options
  • Save brickwall2900/c4dc2609e6a60c44849e43113f22cceb to your computer and use it in GitHub Desktop.
Save brickwall2900/c4dc2609e6a60c44849e43113f22cceb to your computer and use it in GitHub Desktop.
bad apple minecraft
import com.mojang.blaze3d.platform.NativeImage;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.renderer.texture.*;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.base.MediaPlayer;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.player.embedded.videosurface.callback.BufferFormat;
import uk.co.caprica.vlcj.player.embedded.videosurface.callback.BufferFormatCallback;
import uk.co.caprica.vlcj.player.embedded.videosurface.callback.RenderCallbackAdapter;
import java.nio.ByteBuffer;
public class BadAppleScreen extends Screen {
private DynamicTexture texture;
private ResourceLocation registeredTexture;
private MediaPlayerFactory factory;
private EmbeddedMediaPlayer mediaPlayer;
protected BadAppleScreen() {
super(Component.literal("Bad Apple"));
texture = new DynamicTexture(640, 480, true);
registeredTexture = Minecraft.getInstance().getTextureManager().register("bad_apple", texture);
factory = new MediaPlayerFactory();
mediaPlayer = factory.mediaPlayers().newEmbeddedMediaPlayer();
mediaPlayer.videoSurface().set(factory.videoSurfaces().newVideoSurface(
new RGBABufferFormatCallback(),
new ScreenCallbackAdapter(texture.getPixels()),
false
));
mediaPlayer.media().play("D:\\bad_apple.mp4");
}
@Override
public void render(GuiGraphics guiGraphics, int i, int j, float f) {
super.render(guiGraphics, i, j, f);
texture.upload();
guiGraphics.setColor(1, 1, 1, 1);
guiGraphics.blit(registeredTexture, 0, 0, 0, 0, 0, width, height, width, height);
}
@Override
public void onClose() {
super.onClose();
mediaPlayer.release();
factory.release();
Minecraft.getInstance().execute(() -> texture.close());
}
private static final class RGBABufferFormatCallback implements BufferFormatCallback {
@Override
public BufferFormat getBufferFormat(int sourceWidth, int sourceHeight) {
return new BufferFormat("RGBA", 640, 480, new int[] {640 * 4}, new int[] {480});
}
@Override
public void allocatedBuffers(ByteBuffer[] buffers) {
}
}
public static class ScreenCallbackAdapter extends RenderCallbackAdapter {
private final NativeImage texture;
public ScreenCallbackAdapter(NativeImage texture) {
super(new int[texture.getWidth() * texture.getHeight()]);
this.texture = texture;
}
@Override
protected void onDisplay(MediaPlayer mediaPlayer, int[] buffer) {
for (int i = 0; i < buffer.length; i++) {
int x = (i % texture.getWidth());
int y = (i / texture.getWidth());
texture.setPixelRGBA(x, y, buffer[i]);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment