Merge branch 'main' of https://github.com/LAX1DUDE/eaglercraft into LAX1DUDE-main
This commit is contained in:
commit
108f34c201
|
@ -63,7 +63,7 @@ teavm {
|
|||
|
||||
classesToPreserve = null;
|
||||
stopOnErrors = false;
|
||||
optimizationLevel = "FULL"; //org.teavm.vm.TeaVMOptimizationLevel.SIMPLE;
|
||||
optimizationLevel = "ADVANCED"; //org.teavm.vm.TeaVMOptimizationLevel.SIMPLE;
|
||||
fastGlobalAnalysis = false;
|
||||
targetType = "JAVASCRIPT"; //org.teavm.tooling.TeaVMTargetType.JAVASCRIPT;
|
||||
cacheDirectory = null;
|
||||
|
|
|
@ -38,6 +38,7 @@ public interface QueryConnection {
|
|||
toSend.put("brand", EaglercraftBungee.brand);
|
||||
toSend.put("vers", EaglercraftBungee.version);
|
||||
toSend.put("cracked", EaglercraftBungee.cracked);
|
||||
toSend.put("secure", false);
|
||||
toSend.put("time", System.currentTimeMillis());
|
||||
toSend.put("uuid", BungeeCord.getInstance().config.getUuid());
|
||||
toSend.put("data", msg);
|
||||
|
@ -51,6 +52,7 @@ public interface QueryConnection {
|
|||
toSend.put("brand", EaglercraftBungee.brand);
|
||||
toSend.put("vers", EaglercraftBungee.version);
|
||||
toSend.put("cracked", EaglercraftBungee.cracked);
|
||||
toSend.put("secure", false);
|
||||
toSend.put("time", System.currentTimeMillis());
|
||||
toSend.put("uuid", BungeeCord.getInstance().config.getUuid());
|
||||
toSend.put("data", msg);
|
||||
|
|
|
@ -26,6 +26,7 @@ public class Configuration {
|
|||
private boolean onlineMode;
|
||||
private int playerLimit;
|
||||
private String name;
|
||||
private boolean showBanType;
|
||||
|
||||
public Configuration() {
|
||||
this.timeout = 30000;
|
||||
|
@ -51,6 +52,7 @@ public class Configuration {
|
|||
this.onlineMode = false;
|
||||
this.playerLimit = adapter.getInt("player_limit", this.playerLimit);
|
||||
this.name = adapter.getString("server_name", EaglercraftBungee.name + " Server");
|
||||
this.showBanType = adapter.getBoolean("display_ban_type_on_kick", false);
|
||||
Preconditions.checkArgument(this.listeners != null && !this.listeners.isEmpty(), (Object) "No listeners defined.");
|
||||
final Map<String, ServerInfo> newServers = adapter.getServers();
|
||||
Preconditions.checkArgument(newServers != null && !newServers.isEmpty(), (Object) "No servers defined");
|
||||
|
@ -102,4 +104,9 @@ public class Configuration {
|
|||
public String getServerName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public boolean shouldShowBanType() {
|
||||
return this.showBanType;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -41,6 +41,7 @@ import net.md_5.bungee.api.event.ProxyPingEvent;
|
|||
import net.md_5.bungee.eaglercraft.BanList;
|
||||
import net.md_5.bungee.eaglercraft.WebSocketProxy;
|
||||
import net.md_5.bungee.eaglercraft.BanList.BanCheck;
|
||||
import net.md_5.bungee.eaglercraft.BanList.BanState;
|
||||
import net.md_5.bungee.api.ServerPing;
|
||||
import net.md_5.bungee.protocol.packet.PacketFEPing;
|
||||
import net.md_5.bungee.Util;
|
||||
|
@ -164,7 +165,11 @@ public class InitialHandler extends PacketHandler implements PendingConnection {
|
|||
default:
|
||||
System.err.println("Player '" + un + "' is banned: " + bc.string);
|
||||
}
|
||||
this.disconnect("" + ChatColor.RED + "You are banned.\n" + ChatColor.DARK_GRAY + "Reason: " + bc.string);
|
||||
if(bc.reason == BanState.USER_BANNED || ((BungeeCord)bungee).config.shouldShowBanType()) {
|
||||
this.disconnect("" + ChatColor.RED + "You are banned.\n" + ChatColor.DARK_GRAY + "Reason: " + bc.string);
|
||||
}else {
|
||||
this.disconnect("" + ChatColor.RED + "You are banned.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
final int limit = BungeeCord.getInstance().config.getPlayerLimit();
|
||||
|
@ -266,7 +271,7 @@ public class InitialHandler extends PacketHandler implements PendingConnection {
|
|||
|
||||
@Override
|
||||
public InetSocketAddress getVirtualHost() {
|
||||
return (this.handshake == null) ? null : new InetSocketAddress(this.handshake.getHost(), this.handshake.getPort());
|
||||
return (this.handshake == null) ? null : new InetSocketAddress(this.handshake.getHost(), this.handshake.getPort() & 0xFFFF);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
224714
javascript/classes.js
224714
javascript/classes.js
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
|
@ -40,7 +40,7 @@ public class VideoMapPacketCodec {
|
|||
this.requiresFullResetPacket = true;
|
||||
this.isDisabled = true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param mapIds 2D grid of map IDs that make up the screen (mapIds[y][x])
|
||||
* @param posX audio playback X coord
|
||||
|
@ -48,7 +48,14 @@ public class VideoMapPacketCodec {
|
|||
* @param posZ audio playback Z coord
|
||||
*/
|
||||
public VideoMapPacketCodec(int[][] mapIds, double posX, double posY, double posZ) {
|
||||
this(mapIds, posX, posY, posZ, 1.0f);
|
||||
this(mapIds, posX, posY, posZ, 0.5f);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mapIds 2D grid of map IDs that make up the screen (mapIds[y][x])
|
||||
*/
|
||||
public VideoMapPacketCodec(int[][] mapIds) {
|
||||
this(mapIds, 0, 100, 0, 0.5f);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -167,7 +174,7 @@ public class VideoMapPacketCodec {
|
|||
/**
|
||||
* @param url URL to an MP4 or other HTML5 supported video file
|
||||
* @param loop If the video file should loop
|
||||
* @param durationSeconds duration of the video in seconds
|
||||
* @param duration duration of the video in seconds
|
||||
* @return packet to send to players
|
||||
*/
|
||||
public byte[] beginPlayback(String url, boolean loop, float duration) {
|
||||
|
|
|
@ -20,7 +20,7 @@ public class VideoMapPacketCodecBukkit extends VideoMapPacketCodec {
|
|||
public VideoMapPacketCodecBukkit(int[][] mapIds, double posX, double posY, double posZ, float volume) {
|
||||
super(mapIds, posX, posY, posZ, volume);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param mapIds 2D grid of map IDs that make up the screen (mapIds[y][x])
|
||||
* @param posX audio playback X coord
|
||||
|
@ -28,13 +28,23 @@ public class VideoMapPacketCodecBukkit extends VideoMapPacketCodec {
|
|||
* @param posZ audio playback Z coord
|
||||
*/
|
||||
public VideoMapPacketCodecBukkit(int[][] mapIds, double posX, double posY, double posZ) {
|
||||
super(mapIds, posX, posY, posZ, 1.0f);
|
||||
super(mapIds, posX, posY, posZ);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mapIds 2D grid of map IDs that make up the screen (mapIds[y][x])
|
||||
*/
|
||||
public VideoMapPacketCodecBukkit(int[][] mapIds) {
|
||||
super(mapIds);
|
||||
}
|
||||
|
||||
public static class VideoMapPacket {
|
||||
protected final Object packet;
|
||||
protected VideoMapPacket(byte[] packet) {
|
||||
this.packet = new Packet131ItemData((short)104, (short)0, packet);
|
||||
this(packet, false);
|
||||
}
|
||||
protected VideoMapPacket(byte[] packet, boolean image) {
|
||||
this.packet = new Packet131ItemData((short)(104 + (image ? 1 : 0)), (short)0, packet);
|
||||
}
|
||||
public Object getNativePacket() {
|
||||
return packet;
|
||||
|
@ -72,7 +82,15 @@ public class VideoMapPacketCodecBukkit extends VideoMapPacketCodec {
|
|||
public VideoMapPacket disableVideoBukkit() {
|
||||
return new VideoMapPacket(disableVideo());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* unloads image and resets all map object to vanilla renderer
|
||||
* @return packet to send to players
|
||||
*/
|
||||
public VideoMapPacket disableImageBukkit() {
|
||||
return new VideoMapPacket(disableVideo(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* syncs the server side video timestamp with players
|
||||
* @return packet to send to players
|
||||
|
@ -80,7 +98,15 @@ public class VideoMapPacketCodecBukkit extends VideoMapPacketCodec {
|
|||
public VideoMapPacket syncPlaybackWithPlayersBukkit() {
|
||||
return new VideoMapPacket(syncPlaybackWithPlayers());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* syncs the server side image with players
|
||||
* @return packet to send to players
|
||||
*/
|
||||
public VideoMapPacket syncPlaybackWithPlayersImageBukkit() {
|
||||
return new VideoMapPacket(syncPlaybackWithPlayers(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param url URL to an MP4 or other HTML5 supported video file
|
||||
* @param loop If the video file should loop
|
||||
|
@ -90,7 +116,15 @@ public class VideoMapPacketCodecBukkit extends VideoMapPacketCodec {
|
|||
public VideoMapPacket beginPlaybackBukkit(String url, boolean loop, float duration) {
|
||||
return new VideoMapPacket(beginPlayback(url, loop, duration));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param url URL to a PNG, JPEG, GIF, or other HTML5 supported image file
|
||||
* @return packet to send to players
|
||||
*/
|
||||
public VideoMapPacket beginPlaybackImageBukkit(String url) {
|
||||
return new VideoMapPacket(beginPlayback(url));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells the browser to pre-load a URL to a video to be played in the future
|
||||
* @param url the URL of the video
|
||||
|
@ -101,6 +135,16 @@ public class VideoMapPacketCodecBukkit extends VideoMapPacketCodec {
|
|||
return new VideoMapPacket(bufferVideo(url, ttl));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells the browser to pre-load a URL to an image to be played in the future
|
||||
* @param url the URL of the image
|
||||
* @param ttl the amount of time the image should stay loaded
|
||||
* @return packet to send to players
|
||||
*/
|
||||
public static VideoMapPacket bufferImageBukkit(String url, int ttl) {
|
||||
return new VideoMapPacket(bufferVideo(url, ttl), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param time time in seconds to seek the video to
|
||||
*/
|
||||
|
|
|
@ -13,6 +13,7 @@ import java.awt.datatransfer.Clipboard;
|
|||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import java.awt.datatransfer.UnsupportedFlavorException;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
|
@ -34,6 +35,7 @@ import java.util.LinkedList;
|
|||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
|
@ -65,6 +67,7 @@ import org.lwjgl.util.glu.GLU;
|
|||
|
||||
import de.cuina.fireandfuel.CodecJLayerMP3;
|
||||
import net.lax1dude.eaglercraft.AssetRepository;
|
||||
import net.lax1dude.eaglercraft.EaglerImage;
|
||||
import net.lax1dude.eaglercraft.EarlyLoadScreen;
|
||||
import net.lax1dude.eaglercraft.ServerQuery;
|
||||
import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.ProgramGL;
|
||||
|
@ -635,6 +638,18 @@ public class EaglerAdapterImpl2 {
|
|||
return GL20.glGetAttribLocation(p1.obj, p2);
|
||||
}
|
||||
|
||||
public static final EaglerImage loadPNG(byte[] data) {
|
||||
try {
|
||||
BufferedImage img = ImageIO.read(new ByteArrayInputStream(data));
|
||||
int[] pxls = img.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth());
|
||||
return new EaglerImage(pxls, img.getWidth(), img.getHeight(), true);
|
||||
} catch (IOException e) {
|
||||
System.err.println("Could not load PNG file:");
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static final boolean isVideoSupported() {
|
||||
return false;
|
||||
}
|
||||
|
@ -703,6 +718,43 @@ public class EaglerAdapterImpl2 {
|
|||
throw new UnsupportedOperationException("Video is not supported in LWJGL runtime");
|
||||
}
|
||||
|
||||
public static final boolean isImageSupported() {
|
||||
return false;
|
||||
}
|
||||
public static final void loadImage(String src) {
|
||||
throw new UnsupportedOperationException("Image is not supported in LWJGL runtime");
|
||||
}
|
||||
public static final void loadImage(String src, String setJavascriptPointer) {
|
||||
throw new UnsupportedOperationException("Image is not supported in LWJGL runtime");
|
||||
}
|
||||
public static final void loadImage(String src, String setJavascriptPointer, String javascriptOnloadFunction) {
|
||||
throw new UnsupportedOperationException("Image is not supported in LWJGL runtime");
|
||||
}
|
||||
public static final void bufferImage(String src, int ttl) {
|
||||
throw new UnsupportedOperationException("Image is not supported in LWJGL runtime");
|
||||
}
|
||||
public static final void unloadImage() {
|
||||
throw new UnsupportedOperationException("Image is not supported in LWJGL runtime");
|
||||
}
|
||||
public static final boolean isImageLoaded() {
|
||||
throw new UnsupportedOperationException("Image is not supported in LWJGL runtime");
|
||||
}
|
||||
public static final void updateImageTexture() {
|
||||
throw new UnsupportedOperationException("Image is not supported in LWJGL runtime");
|
||||
}
|
||||
public static final void bindImageTexture() {
|
||||
throw new UnsupportedOperationException("Image is not supported in LWJGL runtime");
|
||||
}
|
||||
public static final int getImageWidth() {
|
||||
throw new UnsupportedOperationException("Image is not supported in LWJGL runtime");
|
||||
}
|
||||
public static final int getImageHeight() {
|
||||
throw new UnsupportedOperationException("Image is not supported in LWJGL runtime");
|
||||
}
|
||||
public static final void setImageFrameRate(float seconds) {
|
||||
throw new UnsupportedOperationException("Image is not supported in LWJGL runtime");
|
||||
}
|
||||
|
||||
// =======================================================================================
|
||||
// =======================================================================================
|
||||
// =======================================================================================
|
||||
|
@ -1369,7 +1421,7 @@ public class EaglerAdapterImpl2 {
|
|||
}
|
||||
|
||||
public static final String getUserAgent() {
|
||||
return System.getProperty("os.name");
|
||||
return "Desktop/" + System.getProperty("os.name");
|
||||
}
|
||||
|
||||
public static final String getClipboard() {
|
||||
|
|
|
@ -1,62 +0,0 @@
|
|||
package com.baislsl.png.chunk;
|
||||
|
||||
import com.baislsl.png.util.ByteHandler;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-9.
|
||||
*/
|
||||
public class Chunk {
|
||||
protected long length;
|
||||
protected ChunkType type;
|
||||
protected byte[] data;
|
||||
protected byte[] crc = new byte[4];
|
||||
|
||||
public byte[] dump() {
|
||||
byte[] output = new byte[4 + 4 + data.length + 4];
|
||||
Byte[] lengthBytes = new Byte[4];
|
||||
for (int i = 0; i < 4; i++) {
|
||||
output[3 - i] = (byte) (length & 0xff);
|
||||
}
|
||||
String typeName = type.name().toUpperCase();
|
||||
for (int i = 0; i < 4; i++) {
|
||||
output[4 + i] = (byte) typeName.charAt(i);
|
||||
}
|
||||
System.arraycopy(data, 0, output, 8, data.length);
|
||||
System.arraycopy(crc, 0, output, output.length - crc.length, crc.length);
|
||||
return output;
|
||||
}
|
||||
|
||||
protected Chunk(byte[] length, byte[] type, byte[] data, byte[] crc) {
|
||||
this.length = ByteHandler.byteToLong(length);
|
||||
this.data = data;
|
||||
this.crc = crc;
|
||||
|
||||
for (ChunkType chunkType : ChunkType.values()) {
|
||||
if (chunkType.name().equals(ByteHandler.byteToString(type))) {
|
||||
this.type = chunkType;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public long dataLength() {
|
||||
return data.length;
|
||||
}
|
||||
|
||||
public long getLength() {
|
||||
return length;
|
||||
}
|
||||
|
||||
public ChunkType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public byte[] getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public byte[] getCrc() {
|
||||
return crc;
|
||||
}
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
package com.baislsl.png.chunk;
|
||||
|
||||
import com.baislsl.png.decode.DecodeException;
|
||||
import com.baislsl.png.decode.PNG;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-9.
|
||||
*/
|
||||
public enum ChunkType {
|
||||
|
||||
IHDR {
|
||||
@Override
|
||||
public void apply(PNG png, byte[] length, byte[] type, byte[] data, byte[] crc) throws DecodeException {
|
||||
png.setIhdr(new IHDR(length, type, data, crc));
|
||||
}
|
||||
},
|
||||
tRNS {
|
||||
@Override
|
||||
public void apply(PNG png, byte[] length, byte[] type, byte[] data, byte[] crc) throws DecodeException {
|
||||
png.setTrns(new tRNS(length, type, data, crc));
|
||||
}
|
||||
},
|
||||
PLTE {
|
||||
@Override
|
||||
public void apply(PNG png, byte[] length, byte[] type, byte[] data, byte[] crc) throws DecodeException {
|
||||
png.setPlte(new PLTE(length, type, data, crc));
|
||||
}
|
||||
},
|
||||
IDAT {
|
||||
@Override
|
||||
public void apply(PNG png, byte[] length, byte[] type, byte[] data, byte[] crc) throws DecodeException {
|
||||
png.add(new IDAT(length, type, data, crc));
|
||||
}
|
||||
},
|
||||
IEND {
|
||||
@Override
|
||||
public void apply(PNG png, byte[] length, byte[] type, byte[] data, byte[] crc) throws DecodeException {
|
||||
png.setIend(new IEND(length, type, data, crc));
|
||||
}
|
||||
};
|
||||
|
||||
public abstract void apply(PNG png, byte[] length, byte[] type, byte[] data, byte[] crc) throws DecodeException;
|
||||
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
package com.baislsl.png.chunk;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-10.
|
||||
*/
|
||||
public class IDAT extends Chunk {
|
||||
|
||||
public IDAT(byte[] length, byte[] type, byte[] data, byte[] crc) {
|
||||
super(length, type, data, crc);
|
||||
}
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
package com.baislsl.png.chunk;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-9.
|
||||
*/
|
||||
public class IEND extends Chunk {
|
||||
public IEND(byte[] length, byte[] type, byte[] data, byte[] crc) {
|
||||
super(length, type, data, crc);
|
||||
}
|
||||
}
|
|
@ -1,119 +0,0 @@
|
|||
package com.baislsl.png.chunk;
|
||||
|
||||
import com.baislsl.png.decode.DecodeException;
|
||||
import com.baislsl.png.util.ByteHandler;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-9.
|
||||
*/
|
||||
public class IHDR extends Chunk {
|
||||
private long width, height;
|
||||
private int bitDepth, colorType, compressionMethod, filterMethod, interlaceMethod;
|
||||
|
||||
final private static int[] colorTypeValid = { 0, 2, 3, 4, 6 };
|
||||
final private static int[][] mapColorBitDepth = { { 1, 2, 4, 8, 16 }, // color type = 0
|
||||
{}, { 8, 16 }, // color type = 2
|
||||
{ 1, 2, 4, 8 }, // color type = 3
|
||||
{ 8, 16 }, // color type = 4
|
||||
{}, { 8, 16 } // color type = 6
|
||||
};
|
||||
|
||||
// the number of bytes per complete pixel, rounding up to one
|
||||
public int getBpp() {
|
||||
if (colorType == 2) { // Each pixel is an R,G,B triple.
|
||||
return 3;
|
||||
} else if (colorType == 6) { // Each pixel is an R,G,B triple, followed by an alpha sample.
|
||||
return 4;
|
||||
} else if (colorType == 3) { // palette index, roll up to 1
|
||||
return 1;
|
||||
} else {
|
||||
// LOG.error("Error when find bpp");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public IHDR(byte[] length, byte[] type, byte[] data, byte[] crc) throws DecodeException {
|
||||
super(length, type, data, crc);
|
||||
build();
|
||||
checkLegal();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("width=");
|
||||
sb.append(width);
|
||||
sb.append("height=");
|
||||
sb.append(height);
|
||||
sb.append("bitDepth=");
|
||||
sb.append(bitDepth);
|
||||
sb.append("colorType=");
|
||||
sb.append(colorType);
|
||||
sb.append("compressionMethod=");
|
||||
sb.append(compressionMethod);
|
||||
sb.append("filterMethod=");
|
||||
sb.append(filterMethod);
|
||||
sb.append("interlaceMethod=");
|
||||
sb.append(interlaceMethod);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private void build() {
|
||||
this.width = ByteHandler.byteToLong(data);
|
||||
this.height = ByteHandler.byteToLong(data, 4);
|
||||
this.bitDepth = ((int) data[8]) & 0xFF;
|
||||
this.colorType = ((int) data[9]) & 0xFF;
|
||||
this.compressionMethod = ((int) data[10]) & 0xFF;
|
||||
this.filterMethod = ((int) data[11]) & 0xFF;
|
||||
this.interlaceMethod = ((int) data[12]) & 0xFF;
|
||||
}
|
||||
|
||||
private void checkLegal() throws DecodeException {
|
||||
boolean legal = false;
|
||||
for (int c : colorTypeValid) {
|
||||
if (c == colorType) {
|
||||
legal = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!legal) {
|
||||
throw new DecodeException("Initialize IHDR : color type not legal to be " + colorType);
|
||||
}
|
||||
for (int b : mapColorBitDepth[colorType]) {
|
||||
if (b == bitDepth) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw new DecodeException(
|
||||
"Initialzie IHDR : bit depth " + bitDepth + " not valid matching color type " + colorType);
|
||||
}
|
||||
|
||||
public long getWidth() {
|
||||
return this.width;
|
||||
}
|
||||
|
||||
public long getHeight() {
|
||||
return this.height;
|
||||
}
|
||||
|
||||
public int getBitDepth() {
|
||||
return bitDepth;
|
||||
}
|
||||
|
||||
public int getColorType() {
|
||||
return colorType;
|
||||
}
|
||||
|
||||
public int getCompressionMethod() {
|
||||
return compressionMethod;
|
||||
}
|
||||
|
||||
public int getFilterMethod() {
|
||||
return filterMethod;
|
||||
}
|
||||
|
||||
public int getInterlaceMethod() {
|
||||
return interlaceMethod;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
package com.baislsl.png.chunk;
|
||||
|
||||
import com.baislsl.png.decode.DecodeException;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-9.
|
||||
*/
|
||||
public class PLTE extends Chunk {
|
||||
private int[] color;
|
||||
|
||||
public PLTE(byte[] length, byte[] type, byte[] data, byte[] crc) throws DecodeException {
|
||||
super(length, type, data, crc);
|
||||
build();
|
||||
}
|
||||
|
||||
private void build() throws DecodeException {
|
||||
if (this.length % 3 != 0)
|
||||
throw new DecodeException("PLTE length can not be divide by 3");
|
||||
int size = (int) length / 3;
|
||||
color = new int[size];
|
||||
for (int i = 0; i < size; i++) {
|
||||
color[i] = (((int) data[i * 3]) & 0xFF) << 16 | (((int) data[i * 3 + 1]) & 0xFF) << 8
|
||||
| (((int) data[i * 3 + 2]) & 0xFF) | 0xFF000000;
|
||||
}
|
||||
}
|
||||
|
||||
public int getColor(int i) {
|
||||
return color[i];
|
||||
}
|
||||
|
||||
public int getPaletteSize() {
|
||||
return color.length;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
package com.baislsl.png.chunk;
|
||||
|
||||
import com.baislsl.png.decode.DecodeException;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-9.
|
||||
*/
|
||||
public class tRNS extends Chunk {
|
||||
|
||||
public tRNS(byte[] length, byte[] type, byte[] data, byte[] crc) throws DecodeException {
|
||||
super(length, type, data, crc);
|
||||
}
|
||||
|
||||
public int getAlpha() {
|
||||
return (int)data[0] & 0xFF;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
package com.baislsl.png.decode;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-9.
|
||||
*/
|
||||
public class DecodeException extends Exception {
|
||||
|
||||
public DecodeException() {
|
||||
}
|
||||
|
||||
public DecodeException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public DecodeException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public DecodeException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
package com.baislsl.png.decode;
|
||||
|
||||
import com.baislsl.png.chunk.ChunkType;
|
||||
import com.baislsl.png.util.CRC;
|
||||
import com.baislsl.png.util.ByteHandler;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import static com.baislsl.png.util.ByteHandler.byteToLong;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-9.
|
||||
*/
|
||||
public class Decoder {
|
||||
// private final static Logger LOG = LoggerFactory.getLogger(Decoder.class);
|
||||
private final InputStream in;
|
||||
|
||||
private final static char[] head = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a };
|
||||
|
||||
public Decoder(InputStream in) {
|
||||
this.in = in;
|
||||
}
|
||||
|
||||
private void readHeader() throws DecodeException, IOException {
|
||||
byte[] header = readBytes(8);
|
||||
for (int i = 0; i < 8; i++) {
|
||||
if ((header[i] & 0xff) != (int) head[i])
|
||||
throw new DecodeException("It seems that this is not a PNG files");
|
||||
}
|
||||
// LOG.info(ByteHandler.byteToString(header));
|
||||
}
|
||||
|
||||
private boolean readChunk(PNG png, String chunkName, byte[] length, byte[] type, byte[] data, byte[] crc)
|
||||
throws IOException, DecodeException {
|
||||
for (ChunkType chunkType : ChunkType.values()) {
|
||||
if (chunkType.name().equalsIgnoreCase(chunkName)) {
|
||||
chunkType.apply(png, length, type, data, crc);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean checkCrc(byte[] data, long crcNumber) {
|
||||
return crcNumber == CRC.crc(data, data.length);
|
||||
}
|
||||
|
||||
private boolean checkCrc(byte[] type, byte[] data, byte[] crc) {
|
||||
long crcNumber = byteToLong(crc);
|
||||
byte[] crcData = new byte[4 + data.length];
|
||||
System.arraycopy(type, 0, crcData, 0, 4);
|
||||
System.arraycopy(data, 0, crcData, 4, data.length);
|
||||
|
||||
return checkCrc(crcData, crcNumber);
|
||||
}
|
||||
|
||||
public PNG readInPNG() throws IOException, DecodeException {
|
||||
PNG png = new PNG();
|
||||
readHeader();
|
||||
|
||||
String chunkName;
|
||||
do {
|
||||
byte[] length = readBytes(4);
|
||||
long size = byteToLong(length);
|
||||
byte[] type = readBytes(4);
|
||||
chunkName = ByteHandler.byteToString(type).toUpperCase();
|
||||
if ("IEND".equals(chunkName)) {
|
||||
break;
|
||||
}
|
||||
byte[] data = readBytes((int) size);
|
||||
byte[] crc = readBytes(4);
|
||||
// LOG.info(ByteHandler.byteToString(type));
|
||||
|
||||
boolean found = readChunk(png, chunkName, length, type, data, crc);
|
||||
if (!found) {
|
||||
// LOG.info("Not support chunk name {}", chunkName);
|
||||
}
|
||||
|
||||
boolean crcMatch = checkCrc(type, data, crc);
|
||||
if (!crcMatch) {
|
||||
throw new DecodeException("Error data stream for incorrect crc");
|
||||
}
|
||||
} while (!"IEND".equals(chunkName));
|
||||
return png;
|
||||
}
|
||||
|
||||
private byte[] readBytes(int size) throws IOException {
|
||||
byte[] result = new byte[size];
|
||||
int ret = in.read(result, 0, size);
|
||||
if (ret == -1)
|
||||
return null;
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
package com.baislsl.png.decode;
|
||||
|
||||
import com.baislsl.png.chunk.IDAT;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class IDATManager extends ArrayList<IDAT> {
|
||||
|
||||
public byte[] getIDATData() {
|
||||
int dataSize = 0;
|
||||
for (IDAT idat : this) {
|
||||
dataSize += idat.dataLength();
|
||||
}
|
||||
byte[] data = new byte[dataSize];
|
||||
int curPos = 0;
|
||||
for (IDAT idat : this) {
|
||||
System.arraycopy(idat.getData(), 0, data, curPos, (int) idat.dataLength());
|
||||
curPos += idat.dataLength();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,132 +0,0 @@
|
|||
package com.baislsl.png.decode;
|
||||
|
||||
import com.baislsl.png.chunk.*;
|
||||
import com.baislsl.png.util.ReverseFilter;
|
||||
|
||||
import net.lax1dude.eaglercraft.EaglerInflater;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-9.
|
||||
*/
|
||||
public class PNG {
|
||||
// private final static Logger LOG = LoggerFactory.getLogger(PNG.class);
|
||||
public IHDR ihdr;
|
||||
public IDATManager idats = new IDATManager();
|
||||
public PLTE plte;
|
||||
public tRNS trns;
|
||||
public IEND iend;
|
||||
|
||||
public PNG() {
|
||||
}
|
||||
|
||||
public boolean isAlpha() {
|
||||
return this.trns != null || ihdr.getBpp() == 4;
|
||||
}
|
||||
|
||||
public int[] getColor() throws DecodeException {
|
||||
byte[] rawData = idats.getIDATData();
|
||||
byte[] uncompressData = applyLZ77(rawData);
|
||||
byte[][] transferData = applyReverseFilter(uncompressData);
|
||||
int[] colors = applyColorTransfer(transferData);
|
||||
return colors;
|
||||
}
|
||||
|
||||
private int[] applyColorTransfer(byte[][] data) throws DecodeException {
|
||||
int bpp = ihdr.getBpp();
|
||||
int width = (int) ihdr.getWidth();
|
||||
int height = (int) ihdr.getHeight();
|
||||
int colorType = ihdr.getColorType();
|
||||
int bitDepth = ihdr.getBitDepth();
|
||||
int[] colors = new int[width * height];
|
||||
for (int i = 0; i < height; i++) {
|
||||
for (int j = 0; j < width; j++) {
|
||||
int idx = i * width + j;
|
||||
switch (colorType) {
|
||||
case 2:
|
||||
if (bitDepth == 8) { // bpp = 3
|
||||
colors[idx] = ((int) data[i][bpp * j] & 0xff) << 16 | ((int) data[i][bpp * j + 1] & 0xff) << 8
|
||||
| ((int) data[i][bpp * j + 2] & 0xff);
|
||||
} else {
|
||||
throw new DecodeException("not supported");
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
if (bitDepth == 8) { // bpp = 4
|
||||
colors[idx] = ((int) data[i][bpp * j] & 0xff) << 16 | ((int) data[i][bpp * j + 1] & 0xff) << 8
|
||||
| ((int) data[i][bpp * j + 2] & 0xff) | ((int) data[i][bpp * j + 3] & 0xff) << 24;
|
||||
} else {
|
||||
throw new DecodeException("not supported");
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
int gap = 8 / bitDepth;
|
||||
int a = (1 << bitDepth) - 1;
|
||||
int b = gap - (j % gap) - 1;
|
||||
int pi = (data[i][j / gap] >> (b * bitDepth)) & a;
|
||||
if (trns != null && trns.getAlpha() == pi) {
|
||||
colors[idx] = 0;
|
||||
}else {
|
||||
colors[idx] = plte.getColor(pi);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new DecodeException("Do not support color type " + colorType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return colors;
|
||||
}
|
||||
|
||||
private byte[] applyLZ77(byte[] data) throws DecodeException {
|
||||
byte[] result;
|
||||
try {
|
||||
result = EaglerInflater.uncompress(data);
|
||||
} catch (IOException e) {
|
||||
// LOG.error("LZ77 decode error", e);
|
||||
throw new DecodeException(e);
|
||||
}
|
||||
// LOG.info("Size after decode={}", result.length);
|
||||
return result;
|
||||
}
|
||||
|
||||
private byte[][] applyReverseFilter(byte[] data) {
|
||||
int width = (int) ihdr.getWidth(), height = (int) ihdr.getHeight();
|
||||
return ReverseFilter.apply(data, width, height, ihdr.getBpp());
|
||||
}
|
||||
|
||||
public void setIdats(IDATManager idats) {
|
||||
this.idats = idats;
|
||||
}
|
||||
|
||||
public void setIhdr(IHDR ihdr) {
|
||||
this.ihdr = ihdr;
|
||||
}
|
||||
|
||||
public void setPlte(PLTE plte) {
|
||||
this.plte = plte;
|
||||
}
|
||||
|
||||
public void setTrns(tRNS trns) {
|
||||
this.trns = trns;
|
||||
}
|
||||
|
||||
public void setIend(IEND iend) {
|
||||
this.iend = iend;
|
||||
}
|
||||
|
||||
public void add(IDAT idat) throws DecodeException {
|
||||
idats.add(idat);
|
||||
}
|
||||
|
||||
public long getWidth() {
|
||||
return ihdr.getWidth();
|
||||
}
|
||||
|
||||
public long getHeight() {
|
||||
return ihdr.getHeight();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
package com.baislsl.png.util;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-10.
|
||||
*/
|
||||
public class ByteHandler {
|
||||
|
||||
public static long byteToLong(byte[] data, int offset, int size) {
|
||||
long result = 0;
|
||||
for (int i = 0; i < size; i++) {
|
||||
result <<= 8;
|
||||
result |= ((long) data[offset + i] & 0xff);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static long byteToLong(byte[] data, int offset) {
|
||||
return byteToLong(data, offset, 4);
|
||||
}
|
||||
|
||||
public static long byteToLong(byte[] data) {
|
||||
return byteToLong(data, 0, 4);
|
||||
}
|
||||
|
||||
public static String byteToString(byte[] data) {
|
||||
StringBuilder str = new StringBuilder();
|
||||
for (byte b : data) {
|
||||
str.append((char) (0x0ff & b));
|
||||
}
|
||||
return str.toString();
|
||||
}
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
package com.baislsl.png.util;
|
||||
|
||||
/**
|
||||
* Created by baislsl on 17-7-9.
|
||||
*/
|
||||
public class CRC {
|
||||
private final static long[] crcTable = new long[256];
|
||||
|
||||
static {
|
||||
for (int i = 0; i < 256; i++) {
|
||||
long c = i;
|
||||
for (int k = 0; k < 8; k++) {
|
||||
if ((c & 1) != 0) {
|
||||
c = 0xedb88320L ^ (c >> 1);
|
||||
} else {
|
||||
c >>= 1;
|
||||
}
|
||||
}
|
||||
crcTable[i] = c;
|
||||
}
|
||||
}
|
||||
|
||||
private static long updateCrc(long crc, byte[] buf, int size) {
|
||||
long ans = crc;
|
||||
for (int i = 0; i < size; i++) {
|
||||
ans = crcTable[(int) ((ans ^ buf[i]) & 0xff)] ^ (ans >> 8);
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
public static long crc(byte[] buf, int size) {
|
||||
return updateCrc(0xffffffffL, buf, size) ^ 0xffffffffL;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
package com.baislsl.png.util;
|
||||
|
||||
public class ReverseFilter {
|
||||
private ReverseFilter() {
|
||||
}
|
||||
|
||||
private static int paethPredictor(int a, int b, int c) {
|
||||
int p = a + b - c;
|
||||
int pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c);
|
||||
if (pa <= pb && pa <= pc)
|
||||
return a;
|
||||
if (pb <= pc)
|
||||
return b;
|
||||
return c;
|
||||
}
|
||||
|
||||
// apply reverse Filter Algorithms to byte data
|
||||
// bpp = 3
|
||||
public static byte[][] apply(byte[] data, int width, int height, int bpp) {
|
||||
int[] filterType = new int[height];
|
||||
int[][] blocks = new int[height][width * bpp];
|
||||
int dataIndex = 0;
|
||||
for (int i = 0; i < height; i++) {
|
||||
filterType[i] = (int) (data[dataIndex++]) & 0xFF;
|
||||
for (int j = 0; j < width * bpp; j++) {
|
||||
blocks[i][j] = (int) (data[dataIndex++]) & 0xFF;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < height; i++) {
|
||||
for (int j = 0; j < width * bpp; j++) {
|
||||
int prior = (i == 0) ? 0 : blocks[i - 1][j];
|
||||
int rawBpp = (j < bpp) ? 0 : blocks[i][j - bpp];
|
||||
int bppPrior = (i == 0 || j < bpp) ? 0 : blocks[i - 1][j - bpp];
|
||||
switch (filterType[i]) {
|
||||
case 0: // none
|
||||
break;
|
||||
case 1: // sub
|
||||
blocks[i][j] = blocks[i][j] + rawBpp;
|
||||
break;
|
||||
case 2: // up
|
||||
blocks[i][j] = blocks[i][j] + prior;
|
||||
break;
|
||||
case 3: // average
|
||||
blocks[i][j] = blocks[i][j] + (rawBpp + prior) / 2;
|
||||
break;
|
||||
case 4: // paeth
|
||||
blocks[i][j] = blocks[i][j] + paethPredictor(rawBpp, prior, bppPrior);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
blocks[i][j] &= 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
byte[][] result = new byte[height][width * bpp];
|
||||
for (int i = 0; i < height; i++) {
|
||||
for (int j = 0; j < width * bpp; j++) {
|
||||
result[i][j] = (byte) blocks[i][j];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
|
@ -6,7 +6,7 @@ public class ConfigConstants {
|
|||
|
||||
public static boolean profanity = false;
|
||||
|
||||
public static final String version = "22w16h";
|
||||
public static final String version = "22w20b";
|
||||
public static final String mainMenuString = "ayuncraft " + version;
|
||||
|
||||
public static final String forkMe = "https://github.com/ayunami2000/ayuncraft";
|
||||
|
@ -26,4 +26,9 @@ public class ConfigConstants {
|
|||
+ "(([0-9]{1,3}\\.){3})[0-9]{1,3})" // Ip
|
||||
+ "(:"
|
||||
+ "[0-9]{1,5})?$"); // Port
|
||||
public static int mainMenuItem = -1;
|
||||
public static String mainMenuItemLine0 = null;
|
||||
public static String mainMenuItemLine1 = null;
|
||||
public static String mainMenuItemLine2 = null;
|
||||
public static String mainMenuItemLink = null;
|
||||
}
|
||||
|
|
|
@ -1,12 +1,5 @@
|
|||
package net.lax1dude.eaglercraft;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import com.baislsl.png.decode.DecodeException;
|
||||
import com.baislsl.png.decode.Decoder;
|
||||
import com.baislsl.png.decode.PNG;
|
||||
|
||||
public class EaglerImage {
|
||||
|
||||
public final int[] data;
|
||||
|
@ -37,16 +30,7 @@ public class EaglerImage {
|
|||
}
|
||||
|
||||
public static final EaglerImage loadImage(byte[] file) {
|
||||
try {
|
||||
PNG p = (new Decoder(new ByteArrayInputStream(file))).readInPNG();
|
||||
return new EaglerImage(p.getColor(), (int)p.getWidth(), (int)p.getHeight(), p.isAlpha());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
} catch (DecodeException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
return EaglerAdapter.loadPNG(file);
|
||||
}
|
||||
|
||||
public EaglerImage getSubImage(int x, int y, int pw, int ph) {
|
||||
|
|
|
@ -24,7 +24,8 @@ public class EarlyLoadScreen {
|
|||
_wglTexParameteri(_wGL_TEXTURE_2D, _wGL_TEXTURE_MIN_FILTER, _wGL_NEAREST);
|
||||
_wglTexParameteri(_wGL_TEXTURE_2D, _wGL_TEXTURE_WRAP_S, _wGL_CLAMP);
|
||||
_wglTexParameteri(_wGL_TEXTURE_2D, _wGL_TEXTURE_WRAP_T, _wGL_CLAMP);
|
||||
EaglerImage img = EaglerImage.loadImage(Base64.decodeBase64(loadScreen));
|
||||
//EaglerImage img = EaglerImage.loadImage(Base64.decodeBase64(loadScreen));
|
||||
EaglerImage img = EaglerAdapter.loadPNG(Base64.decodeBase64(loadScreen));
|
||||
IntBuffer upload = GLAllocation.createDirectIntBuffer(192*192);
|
||||
upload.put(img.data);
|
||||
upload.flip();
|
||||
|
@ -116,7 +117,8 @@ public class EarlyLoadScreen {
|
|||
_wglTexParameteri(_wGL_TEXTURE_2D, _wGL_TEXTURE_MIN_FILTER, _wGL_NEAREST);
|
||||
_wglTexParameteri(_wGL_TEXTURE_2D, _wGL_TEXTURE_WRAP_S, _wGL_CLAMP);
|
||||
_wglTexParameteri(_wGL_TEXTURE_2D, _wGL_TEXTURE_WRAP_T, _wGL_CLAMP);
|
||||
EaglerImage img = EaglerImage.loadImage(Base64.decodeBase64(enableScreen));
|
||||
//EaglerImage img = EaglerImage.loadImage(Base64.decodeBase64(enableScreen));
|
||||
EaglerImage img = EaglerAdapter.loadPNG(Base64.decodeBase64(enableScreen));
|
||||
IntBuffer upload = GLAllocation.createDirectIntBuffer(128*128);
|
||||
upload.put(img.data);
|
||||
upload.flip();
|
||||
|
|
47
src/main/java/net/lax1dude/eaglercraft/EnumBrowser.java
Normal file
47
src/main/java/net/lax1dude/eaglercraft/EnumBrowser.java
Normal file
|
@ -0,0 +1,47 @@
|
|||
package net.lax1dude.eaglercraft;
|
||||
|
||||
public enum EnumBrowser {
|
||||
|
||||
DESKTOP("Desktop"), CHROME("Chrome"), EDGE("Edge"), IE("IE"), |