Fix several crashes, added Multiplayer menu
This commit is contained in:
parent
acab40399f
commit
0a9e4ea3f3
|
@ -7,7 +7,6 @@ import com.mojang.minecraft.gui.*;
|
|||
import com.mojang.minecraft.item.Arrow;
|
||||
import com.mojang.minecraft.item.Item;
|
||||
import com.mojang.minecraft.level.Level;
|
||||
import com.mojang.minecraft.level.LevelIO;
|
||||
import com.mojang.minecraft.level.generator.LevelGenerator;
|
||||
import com.mojang.minecraft.level.liquid.LiquidType;
|
||||
import com.mojang.minecraft.level.tile.Block;
|
||||
|
@ -41,8 +40,9 @@ import java.io.*;
|
|||
import java.nio.IntBuffer;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
public final class Minecraft implements Runnable {
|
||||
public final class Minecraft {
|
||||
|
||||
public GameMode gamemode = new SurvivalGameMode(this);
|
||||
public int width;
|
||||
|
@ -60,7 +60,6 @@ public final class Minecraft implements Runnable {
|
|||
public GuiScreen currentScreen = null;
|
||||
public ProgressBarDisplay progressBar = new ProgressBarDisplay(this);
|
||||
public Renderer renderer = new Renderer(this);
|
||||
public LevelIO levelIo;
|
||||
private int ticks;
|
||||
private int blockHitTime;
|
||||
public String levelName;
|
||||
|
@ -82,7 +81,6 @@ public final class Minecraft implements Runnable {
|
|||
|
||||
|
||||
public Minecraft() {
|
||||
this.levelIo = new LevelIO(this.progressBar);
|
||||
this.ticks = 0;
|
||||
this.blockHitTime = 0;
|
||||
this.levelName = null;
|
||||
|
@ -96,7 +94,6 @@ public final class Minecraft implements Runnable {
|
|||
this.hasMouse = false;
|
||||
this.lastClick = 0;
|
||||
this.raining = false;
|
||||
new SleepForeverThread(this);
|
||||
this.width = GL11.getCanvasWidth();
|
||||
this.height = GL11.getCanvasHeight();
|
||||
}
|
||||
|
@ -107,14 +104,16 @@ public final class Minecraft implements Runnable {
|
|||
this.currentScreen.onClose();
|
||||
}
|
||||
|
||||
if(var1 == null && this.player.health <= 0) {
|
||||
if(var1 == null && level != null && player != null && this.player.health <= 0) {
|
||||
var1 = new GameOverScreen();
|
||||
}
|
||||
|
||||
this.currentScreen = (GuiScreen)var1;
|
||||
if(var1 != null) {
|
||||
if(this.hasMouse) {
|
||||
this.player.releaseAllKeys();
|
||||
if(level != null) {
|
||||
this.player.releaseAllKeys();
|
||||
}
|
||||
this.hasMouse = false;
|
||||
GL11.mouseSetGrabbed(false);
|
||||
}
|
||||
|
@ -168,18 +167,7 @@ public final class Minecraft implements Runnable {
|
|||
Item.initModels();
|
||||
Mob.modelCache = new ModelManager();
|
||||
GL11.glViewport(0, 0, this.width, this.height);
|
||||
if(this.server != null) {
|
||||
Level var85;
|
||||
(var85 = new Level()).setData(8, 8, 8, new byte[512]);
|
||||
this.setLevel(var85, false);
|
||||
} else {
|
||||
Level level1 = new LevelUtils().load();
|
||||
if(level1 == null) {
|
||||
this.generateLevel(1);
|
||||
} else {
|
||||
this.setLevel(level1, true);
|
||||
}
|
||||
}
|
||||
this.setCurrentScreen(new MainMenu());
|
||||
this.particleManager = new ParticleManager(this.level);
|
||||
checkGLError("Post startup");
|
||||
this.hud = new HUDScreen(this, this.width, this.height);
|
||||
|
@ -899,7 +887,7 @@ public final class Minecraft implements Runnable {
|
|||
}
|
||||
|
||||
public final void grabMouse() {
|
||||
if(!GL11.isFocused()) {
|
||||
if(!GL11.isFocused() || level == null) {
|
||||
return;
|
||||
}
|
||||
if (GL11.isPointerLocked2()) {
|
||||
|
@ -924,7 +912,7 @@ public final class Minecraft implements Runnable {
|
|||
}
|
||||
|
||||
public final void pause() {
|
||||
if(this.currentScreen == null) {
|
||||
if(this.currentScreen == null && level != null) {
|
||||
this.setCurrentScreen(new PauseScreen());
|
||||
}
|
||||
}
|
||||
|
@ -1068,10 +1056,10 @@ public final class Minecraft implements Runnable {
|
|||
NetworkManager var20 = this.networkManager;
|
||||
if(this.networkManager.successful) {
|
||||
NetworkHandler var18 = var20.netHandler;
|
||||
if(GL11.connectionOpen()) {
|
||||
if(var18.channel.connectionOpen()) {
|
||||
try {
|
||||
NetworkHandler var22 = var20.netHandler;
|
||||
var20.netHandler.read(var22.in);
|
||||
var20.netHandler.channel.read(var22.in);
|
||||
var4 = 0;
|
||||
|
||||
while(var22.in.position() > 0 && var4++ != 100) {
|
||||
|
@ -1116,7 +1104,17 @@ public final class Minecraft implements Runnable {
|
|||
var14.printStackTrace();
|
||||
}
|
||||
|
||||
byte[] var51 = LevelIO.decompress(new ByteArrayInputStream(var42.levelData.toByteArray()));
|
||||
byte[] var51;
|
||||
try {
|
||||
DataInputStream var3;
|
||||
byte[] var1 = new byte[(var3 = new DataInputStream(new GZIPInputStream(new ByteArrayInputStream(var42.levelData.toByteArray())))).readInt()];
|
||||
var3.readFully(var1);
|
||||
var3.close();
|
||||
var51 = var1;
|
||||
} catch (Exception var2) {
|
||||
throw new RuntimeException(var2);
|
||||
}
|
||||
|
||||
var42.levelData = null;
|
||||
short var55 = ((Short)var7[0]).shortValue();
|
||||
short var63 = ((Short)var7[1]).shortValue();
|
||||
|
@ -1264,7 +1262,7 @@ public final class Minecraft implements Runnable {
|
|||
}
|
||||
}
|
||||
|
||||
if(!GL11.connectionOpen()) {
|
||||
if(!var22.channel.connectionOpen()) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1273,7 +1271,7 @@ public final class Minecraft implements Runnable {
|
|||
|
||||
if(var22.out.position() > 0) {
|
||||
var22.out.flip();
|
||||
var22.write(var22.out);
|
||||
var22.channel.write(var22.out);
|
||||
var22.out.compact();
|
||||
}
|
||||
} catch (Exception var15) {
|
||||
|
@ -1352,7 +1350,7 @@ public final class Minecraft implements Runnable {
|
|||
}
|
||||
|
||||
while(GL11.keysNext()) {
|
||||
this.player.setKey(GL11.getEventKey(), GL11.getEventKeyState());
|
||||
this.player.setKey(GL11.getEventKey(), GL11.getEventKeyState());
|
||||
if(GL11.getEventKeyState()) {
|
||||
if(this.currentScreen != null) {
|
||||
this.currentScreen.keyboardEvent();
|
||||
|
@ -1507,7 +1505,9 @@ public final class Minecraft implements Runnable {
|
|||
this.particleManager.tick();
|
||||
}
|
||||
|
||||
this.player.arrows = 1;
|
||||
if(player != null) {
|
||||
this.player.arrows = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -1515,12 +1515,12 @@ public final class Minecraft implements Runnable {
|
|||
|
||||
private void levelSave() {
|
||||
if(this.level == null) {
|
||||
ticksUntilSave = this.hud.ticks + 600;
|
||||
ticksUntilSave = this.ticks + 600;
|
||||
}
|
||||
|
||||
if(this.hud.ticks >= this.ticksUntilSave) {
|
||||
if(this.ticks >= this.ticksUntilSave) {
|
||||
new LevelUtils().save();
|
||||
ticksUntilSave = this.hud.ticks + 600;
|
||||
ticksUntilSave = this.ticks + 600;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,8 +10,6 @@ public final class SessionData {
|
|||
public String username;
|
||||
public String sessionId;
|
||||
public String mppass;
|
||||
public boolean haspaid;
|
||||
|
||||
|
||||
public SessionData(String var1, String var2) {
|
||||
this.username = var1;
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
package com.mojang.minecraft;
|
||||
|
||||
public class SleepForeverThread extends Thread
|
||||
{
|
||||
public SleepForeverThread(Minecraft minecraft)
|
||||
{
|
||||
setDaemon(true);
|
||||
|
||||
start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
try {
|
||||
while(true)
|
||||
{
|
||||
Thread.sleep(2147483647L);
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -33,13 +33,16 @@ public final class HUDScreen extends Screen {
|
|||
this.width = var2 * 240 / var3;
|
||||
this.height = var3 * 240 / var3;
|
||||
|
||||
if(firstTimeLaunch) {
|
||||
if(firstTimeLaunch && Minecraft.getMinecraft().level != null) {
|
||||
mc.setCurrentScreen(new PauseScreen());
|
||||
firstTimeLaunch = false;
|
||||
}
|
||||
}
|
||||
|
||||
public final void render(float var1, boolean var2, int var3, int var4) {
|
||||
if(Minecraft.getMinecraft().level == null) {
|
||||
return;
|
||||
}
|
||||
FontRenderer var5 = this.mc.fontRenderer;
|
||||
this.mc.renderer.enableGuiMode();
|
||||
new TextureLocation("/gui/gui.png").bindTexture();
|
||||
|
|
54
src/teavm/java/com/mojang/minecraft/gui/MainMenu.java
Normal file
54
src/teavm/java/com/mojang/minecraft/gui/MainMenu.java
Normal file
|
@ -0,0 +1,54 @@
|
|||
package com.mojang.minecraft.gui;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.mojang.minecraft.Minecraft;
|
||||
import com.mojang.minecraft.level.Level;
|
||||
import com.mojang.minecraft.render.TextureLocation;
|
||||
|
||||
import net.PeytonPlayz585.level.LevelUtils;
|
||||
import net.lax1dude.eaglercraft.adapter.Tessellator;
|
||||
|
||||
public class MainMenu extends GuiScreen {
|
||||
|
||||
public final void onOpen() {
|
||||
this.buttons.clear();
|
||||
this.buttons.add(new Button(1, this.width / 2 - 100, this.height / 4 + 48, "Singleplayer"));
|
||||
this.buttons.add(new Button(2, this.width / 2 - 100, this.height / 4 + 72, "Multiplayer"));
|
||||
}
|
||||
|
||||
protected final void onButtonClick(Button var1) {
|
||||
if(var1.id == 1) {
|
||||
Level level1 = new LevelUtils().load();
|
||||
if(level1 == null) {
|
||||
Minecraft.getMinecraft().setCurrentScreen(null);
|
||||
this.minecraft.generateLevel(1);
|
||||
this.minecraft.player.releaseAllKeys();
|
||||
} else {
|
||||
Minecraft.getMinecraft().setCurrentScreen(null);
|
||||
this.minecraft.setLevel(level1, true);
|
||||
this.minecraft.player.releaseAllKeys();
|
||||
}
|
||||
} else if(var1.id == 2) {
|
||||
this.minecraft.setCurrentScreen(new MultiplayerMenu());
|
||||
}
|
||||
}
|
||||
|
||||
public final void render(int var1, int var2) {
|
||||
int var4 = this.minecraft.width * 240 / this.minecraft.height;
|
||||
int var5 = this.minecraft.height * 240 / this.minecraft.height;
|
||||
GL11.glClear(16640);
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
int var7 = new TextureLocation("/dirt.png").bindTexture();
|
||||
float var10 = 32.0F;
|
||||
tessellator.startDrawing(7);
|
||||
tessellator.setColorOpaque_I(4210752);
|
||||
tessellator.addVertexWithUV(0.0F, (float)var5, 0.0F, 0.0F, (float)var5 / var10);
|
||||
tessellator.addVertexWithUV((float)var4, (float)var5, 0.0F, (float)var4 / var10, (float)var5 / var10);
|
||||
tessellator.addVertexWithUV((float)var4, 0.0F, 0.0F, (float)var4 / var10, 0.0F);
|
||||
tessellator.addVertexWithUV(0.0F, 0.0F, 0.0F, 0.0F, 0.0F);
|
||||
tessellator.draw();
|
||||
super.render(var1, var2);
|
||||
}
|
||||
|
||||
}
|
137
src/teavm/java/com/mojang/minecraft/gui/MultiplayerMenu.java
Normal file
137
src/teavm/java/com/mojang/minecraft/gui/MultiplayerMenu.java
Normal file
|
@ -0,0 +1,137 @@
|
|||
package com.mojang.minecraft.gui;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.mojang.minecraft.Minecraft;
|
||||
import com.mojang.minecraft.SessionData;
|
||||
import com.mojang.minecraft.level.Level;
|
||||
import com.mojang.minecraft.net.NetworkManager;
|
||||
import com.mojang.minecraft.render.TextureLocation;
|
||||
|
||||
import net.PeytonPlayz585.level.LevelUtils;
|
||||
import net.lax1dude.eaglercraft.adapter.Tessellator;
|
||||
|
||||
public class MultiplayerMenu extends GuiScreen {
|
||||
|
||||
boolean textBox1Active = false;
|
||||
boolean textBox2Active = false;
|
||||
private int counter = 0;
|
||||
String server = "";
|
||||
String username = "";
|
||||
Button connect;
|
||||
|
||||
public final void onOpen() {
|
||||
GL11.enableRepeatEvents(true);
|
||||
this.buttons.clear();
|
||||
this.buttons.add(connect = new Button(0, this.width / 2 - 100, this.height / 4 + 96 + 12, "Connect"));
|
||||
this.buttons.add(new Button(1, this.width / 2 - 100, this.height / 4 + 120 + 12, "Cancel"));
|
||||
connect.active = false;
|
||||
}
|
||||
|
||||
public final void tick() {
|
||||
++this.counter;
|
||||
}
|
||||
|
||||
protected final void onButtonClick(Button var1) {
|
||||
if(var1.id == 0 && var1.active) {
|
||||
GL11.enableRepeatEvents(false);
|
||||
minecraft.session = new SessionData(this.username, "mcpass");
|
||||
Level var85;
|
||||
(var85 = new Level()).setData(8, 8, 8, new byte[512]);
|
||||
minecraft.setLevel(var85, false);
|
||||
minecraft.networkManager = new NetworkManager(minecraft, this.server, minecraft.session.username, minecraft.session.mppass);
|
||||
} else if(var1.id == 1) {
|
||||
GL11.enableRepeatEvents(false);
|
||||
minecraft.setCurrentScreen(new MainMenu());
|
||||
}
|
||||
}
|
||||
|
||||
protected void onMouseClick(int var1, int var2, int var3) {
|
||||
if(var3 == 0) {
|
||||
if(var1 >= this.width / 2 - 100 && var1 < (this.width / 2 - 100) + 200 && var2 >= this.height / 4 - 10 + 50 + 18 && var2 < (this.height / 4 - 10 + 50 + 18) + 20) {
|
||||
GL11.enableRepeatEvents(true);
|
||||
textBox1Active = true;
|
||||
textBox2Active = false;
|
||||
} else if(var1 >= this.width / 2 - 100 && var1 < (this.width / 2 - 100) + 200 && var2 >= this.height / 4 - 10 + 50 - 20 && var2 < (this.height / 4 - 10 + 50 - 20) + 20) {
|
||||
GL11.enableRepeatEvents(true);
|
||||
textBox2Active = true;
|
||||
textBox1Active = false;
|
||||
} else {
|
||||
GL11.enableRepeatEvents(false);
|
||||
textBox1Active = false;
|
||||
textBox2Active = false;
|
||||
}
|
||||
}
|
||||
super.onMouseClick(var1, var2, var3);
|
||||
}
|
||||
|
||||
protected final void onKeyPress(char var1, int var2) {
|
||||
if(textBox1Active) {
|
||||
if(var2 == 14 && this.server.length() > 0) {
|
||||
this.server = this.server.substring(0, this.server.length() - 1);
|
||||
}
|
||||
if("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ,.:-_\'*!\\\"#%/()=+?[]{}<>@|$;".indexOf(var1) >= 0 && this.server.length() < 32) {
|
||||
this.server = this.server + var1;
|
||||
}
|
||||
if(server.length() > 0 && username.length() > 0) {
|
||||
connect.active = true;
|
||||
} else {
|
||||
connect.active = false;
|
||||
}
|
||||
} else if(textBox2Active) {
|
||||
if(var2 == 14 && this.username.length() > 0) {
|
||||
this.username = this.username.substring(0, this.username.length() - 1);
|
||||
}
|
||||
if("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ,.:-_\'*!\\\"#%/()=+?[]{}<>@|$;".indexOf(var1) >= 0 && this.username.length() < 32) {
|
||||
this.username = this.username + var1;
|
||||
}
|
||||
if(server.length() > 0 && username.length() > 0) {
|
||||
connect.active = true;
|
||||
} else {
|
||||
connect.active = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final void render(int var1, int var2) {
|
||||
int var4 = this.minecraft.width * 240 / this.minecraft.height;
|
||||
int var5 = this.minecraft.height * 240 / this.minecraft.height;
|
||||
GL11.glClear(16640);
|
||||
Tessellator tessellator = Tessellator.instance;
|
||||
int var7 = new TextureLocation("/dirt.png").bindTexture();
|
||||
float var10 = 32.0F;
|
||||
tessellator.startDrawing(7);
|
||||
tessellator.setColorOpaque_I(4210752);
|
||||
tessellator.addVertexWithUV(0.0F, (float)var5, 0.0F, 0.0F, (float)var5 / var10);
|
||||
tessellator.addVertexWithUV((float)var4, (float)var5, 0.0F, (float)var4 / var10, (float)var5 / var10);
|
||||
tessellator.addVertexWithUV((float)var4, 0.0F, 0.0F, (float)var4 / var10, 0.0F);
|
||||
tessellator.addVertexWithUV(0.0F, 0.0F, 0.0F, 0.0F, 0.0F);
|
||||
tessellator.draw();
|
||||
|
||||
//username
|
||||
drawBox((this.width / 2 - 100) - 1, (this.height / 4 - 10 + 50 - 20) - 1, (this.width / 2 - 100) + 200 + 1, (this.height / 4 - 10 + 50 - 20) + 20 + 1, -6250336);
|
||||
drawBox(this.width / 2 - 100, this.height / 4 - 10 + 50 - 20, (this.width / 2 - 100) + 200, (this.height / 4 - 10 + 50 - 20) + 20, -16777216);
|
||||
|
||||
this.drawString(this.fontRenderer, "Username:", this.width / 2 - 100, this.height / 4 - 10 + 50 - 30, 10526880);
|
||||
|
||||
//server IP
|
||||
drawBox((this.width / 2 - 100) - 1, (this.height / 4 - 10 + 50 + 18) - 1, (this.width / 2 - 100) + 200 + 1, (this.height / 4 - 10 + 50 + 18) + 20 + 1, -6250336);
|
||||
drawBox(this.width / 2 - 100, this.height / 4 - 10 + 50 + 18, (this.width / 2 - 100) + 200, (this.height / 4 - 10 + 50 + 18) + 20, -16777216);
|
||||
|
||||
this.drawString(this.fontRenderer, "Server address:", this.width / 2 - 100, this.height / 4 - 10 + 50 + 8, 10526880);
|
||||
if(textBox1Active) {
|
||||
boolean e = this.counter / 6 % 2 == 0;
|
||||
this.drawString(this.fontRenderer, server + (e ? "_" : ""), (this.width / 2 - 100) + 4, (this.height / 4 - 10 + 50 + 18) + (20 - 8) / 2, 14737632);
|
||||
} else {
|
||||
this.drawString(this.fontRenderer, server, (this.width / 2 - 100) + 4, (this.height / 4 - 10 + 50 + 18) + (20 - 8) / 2, 14737632);
|
||||
}
|
||||
if(textBox2Active) {
|
||||
boolean e = this.counter / 6 % 2 == 0;
|
||||
this.drawString(this.fontRenderer, username + (e ? "_" : ""), (this.width / 2 - 100) + 4, (this.height / 4 - 10 + 50 - 20) + (20 - 8) / 2, 14737632);
|
||||
} else {
|
||||
this.drawString(this.fontRenderer, username, (this.width / 2 - 100) + 4, (this.height / 4 - 10 + 50 - 20) + (20 - 8) / 2, 14737632);
|
||||
}
|
||||
super.render(var1, var2);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,258 +0,0 @@
|
|||
package com.mojang.minecraft.level;
|
||||
|
||||
import com.mojang.minecraft.ProgressBarDisplay;
|
||||
import com.mojang.minecraft.level.Level;
|
||||
import com.mojang.minecraft.level.LevelObjectInputStream;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
public final class LevelIO {
|
||||
|
||||
private ProgressBarDisplay progressBar;
|
||||
|
||||
|
||||
public LevelIO(ProgressBarDisplay var1) {
|
||||
this.progressBar = var1;
|
||||
}
|
||||
|
||||
public final boolean save(Level var1, File var2) {
|
||||
try {
|
||||
FileOutputStream var5 = new FileOutputStream(var2);
|
||||
save(var1, (OutputStream)var5);
|
||||
var5.close();
|
||||
return true;
|
||||
} catch (Exception var4) {
|
||||
var4.printStackTrace();
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setText("Failed!");
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(1000L);
|
||||
} catch (InterruptedException var3) {
|
||||
;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public final Level load(File var1) {
|
||||
try {
|
||||
FileInputStream var5 = new FileInputStream(var1);
|
||||
Level var2 = this.load((InputStream)var5);
|
||||
var5.close();
|
||||
return var2;
|
||||
} catch (Exception var4) {
|
||||
var4.printStackTrace();
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setText("Failed!");
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(1000L);
|
||||
} catch (InterruptedException var3) {
|
||||
;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public final boolean saveOnline(Level var1, String var2, String var3, String var4, String var5, int var6) {
|
||||
if(var4 == null) {
|
||||
var4 = "";
|
||||
}
|
||||
|
||||
if(this.progressBar != null && this.progressBar != null) {
|
||||
this.progressBar.setTitle("Saving level");
|
||||
}
|
||||
|
||||
try {
|
||||
if(this.progressBar != null && this.progressBar != null) {
|
||||
this.progressBar.setText("Compressing..");
|
||||
}
|
||||
|
||||
ByteArrayOutputStream var7 = new ByteArrayOutputStream();
|
||||
save(var1, (OutputStream)var7);
|
||||
var7.close();
|
||||
byte[] var10 = var7.toByteArray();
|
||||
if(this.progressBar != null && this.progressBar != null) {
|
||||
this.progressBar.setText("Connecting..");
|
||||
}
|
||||
|
||||
HttpURLConnection var12;
|
||||
(var12 = (HttpURLConnection)(new URL("http://" + var2 + "/level/save.html")).openConnection()).setDoInput(true);
|
||||
var12.setDoOutput(true);
|
||||
var12.setRequestMethod("POST");
|
||||
DataOutputStream var13;
|
||||
(var13 = new DataOutputStream(var12.getOutputStream())).writeUTF(var3);
|
||||
var13.writeUTF(var4);
|
||||
var13.writeUTF(var5);
|
||||
var13.writeByte(var6);
|
||||
var13.writeInt(var10.length);
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setText("Saving..");
|
||||
}
|
||||
|
||||
var13.write(var10);
|
||||
var13.close();
|
||||
BufferedReader var11;
|
||||
if(!(var11 = new BufferedReader(new InputStreamReader(var12.getInputStream()))).readLine().equalsIgnoreCase("ok")) {
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setText("Failed: " + var11.readLine());
|
||||
}
|
||||
|
||||
var11.close();
|
||||
Thread.sleep(1000L);
|
||||
return false;
|
||||
} else {
|
||||
var11.close();
|
||||
return true;
|
||||
}
|
||||
} catch (Exception var9) {
|
||||
var9.printStackTrace();
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setText("Failed!");
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(1000L);
|
||||
} catch (InterruptedException var8) {
|
||||
;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public final Level loadOnline(String var1, String var2, int var3) {
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setTitle("Loading level");
|
||||
}
|
||||
|
||||
try {
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setText("Connecting..");
|
||||
}
|
||||
|
||||
HttpURLConnection var6;
|
||||
(var6 = (HttpURLConnection)(new URL("http://" + var1 + "/level/load.html?id=" + var3 + "&user=" + var2)).openConnection()).setDoInput(true);
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setText("Loading..");
|
||||
}
|
||||
|
||||
DataInputStream var7;
|
||||
if((var7 = new DataInputStream(var6.getInputStream())).readUTF().equalsIgnoreCase("ok")) {
|
||||
return this.load((InputStream)var7);
|
||||
} else {
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setText("Failed: " + var7.readUTF());
|
||||
}
|
||||
|
||||
var7.close();
|
||||
Thread.sleep(1000L);
|
||||
return null;
|
||||
}
|
||||
} catch (Exception var5) {
|
||||
var5.printStackTrace();
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setText("Failed!");
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(3000L);
|
||||
} catch (InterruptedException var4) {
|
||||
;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public final Level load(InputStream var1) {
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setTitle("Loading level");
|
||||
}
|
||||
|
||||
if(this.progressBar != null) {
|
||||
this.progressBar.setText("Reading..");
|
||||
}
|
||||
|
||||
try {
|
||||
DataInputStream var10;
|
||||
if((var10 = new DataInputStream(new GZIPInputStream(var1))).readInt() != 656127880) {
|
||||
return null;
|
||||
} else {
|
||||
byte var12;
|
||||
if((var12 = var10.readByte()) > 2) {
|
||||
return null;
|
||||
} else if(var12 <= 1) {
|
||||
String var14 = var10.readUTF();
|
||||
String var15 = var10.readUTF();
|
||||
long var3 = var10.readLong();
|
||||
short var5 = var10.readShort();
|
||||
short var6 = var10.readShort();
|
||||
short var7 = var10.readShort();
|
||||
byte[] var8 = new byte[var5 * var6 * var7];
|
||||
var10.readFully(var8);
|
||||
var10.close();
|
||||
Level var11;
|
||||
(var11 = new Level()).setData(var5, var7, var6, var8);
|
||||
var11.name = var14;
|
||||
var11.creator = var15;
|
||||
var11.createTime = var3;
|
||||
return var11;
|
||||
} else {
|
||||
Level var2;
|
||||
LevelObjectInputStream var13;
|
||||
(var2 = (Level)(var13 = new LevelObjectInputStream(var10)).readObject()).initTransient();
|
||||
var13.close();
|
||||
return var2;
|
||||
}
|
||||
}
|
||||
} catch (Exception var9) {
|
||||
var9.printStackTrace();
|
||||
System.out.println("Failed to load level: " + var9.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void save(Level var0, OutputStream var1) {
|
||||
try {
|
||||
DataOutputStream var3;
|
||||
(var3 = new DataOutputStream(new GZIPOutputStream(var1))).writeInt(656127880);
|
||||
var3.writeByte(2);
|
||||
ObjectOutputStream var4;
|
||||
(var4 = new ObjectOutputStream(var3)).writeObject(var0);
|
||||
var4.close();
|
||||
} catch (Exception var2) {
|
||||
var2.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] decompress(InputStream var0) {
|
||||
try {
|
||||
DataInputStream var3;
|
||||
byte[] var1 = new byte[(var3 = new DataInputStream(new GZIPInputStream(var0))).readInt()];
|
||||
var3.readFully(var1);
|
||||
var3.close();
|
||||
return var1;
|
||||
} catch (Exception var2) {
|
||||
throw new RuntimeException(var2);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -21,7 +21,7 @@ public class NetworkManager
|
|||
|
||||
players = new HashMap<Byte, NetworkPlayer>();
|
||||
|
||||
new ServerConnectThread(this, server, username, key, minecraft).start();
|
||||
new ServerConnect(this, server, username, key, minecraft).connect();
|
||||
}
|
||||
|
||||
public ByteArrayOutputStream levelData;
|
||||
|
@ -53,7 +53,7 @@ public class NetworkManager
|
|||
|
||||
public boolean isConnected()
|
||||
{
|
||||
return netHandler != null && GL11.connectionOpen();
|
||||
return netHandler != null && netHandler.channel.connectionOpen();
|
||||
}
|
||||
|
||||
public List getPlayers()
|
||||
|
|
|
@ -4,9 +4,9 @@ import com.mojang.minecraft.Minecraft;
|
|||
import com.mojang.minecraft.gui.ErrorScreen;
|
||||
import com.mojang.net.NetworkHandler;
|
||||
|
||||
public class ServerConnectThread extends Thread
|
||||
public class ServerConnect
|
||||
{
|
||||
public ServerConnectThread(NetworkManager networkManager, String server, String username, String key, Minecraft minecraft) {
|
||||
public ServerConnect(NetworkManager networkManager, String server, String username, String key, Minecraft minecraft) {
|
||||
super();
|
||||
|
||||
netManager = networkManager;
|
||||
|
@ -19,8 +19,7 @@ public class ServerConnectThread extends Thread
|
|||
this.minecraft = minecraft;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
public void connect()
|
||||
{
|
||||
try {
|
||||
netManager.netHandler = new NetworkHandler(server);
|
|
@ -6,6 +6,8 @@ import com.mojang.minecraft.gui.ErrorScreen;
|
|||
import com.mojang.minecraft.net.NetworkManager;
|
||||
import com.mojang.minecraft.net.PacketType;
|
||||
|
||||
import net.PeytonPlayz585.websocket.WebSocketChannel;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
|
@ -20,6 +22,7 @@ public final class NetworkHandler {
|
|||
public NetworkManager netManager;
|
||||
private boolean unused = false;
|
||||
private byte[] stringBytes = new byte[64];
|
||||
public WebSocketChannel channel;
|
||||
|
||||
|
||||
public NetworkHandler(String var1) {
|
||||
|
@ -43,18 +46,14 @@ public final class NetworkHandler {
|
|||
Minecraft.getMinecraft().setCurrentScreen(new ErrorScreen(":(", "Invalid URI protocol!"));
|
||||
}
|
||||
|
||||
if(!GL11.startConnection(address)) {
|
||||
if(!GL11.startConnection(address)) {
|
||||
Minecraft.getMinecraft().setCurrentScreen(new ErrorScreen(address, "Failed to connect to server!"));
|
||||
}
|
||||
}
|
||||
channel = new WebSocketChannel(address);
|
||||
}
|
||||
|
||||
public final void close() {
|
||||
try {
|
||||
if(this.out.position() > 0) {
|
||||
this.out.flip();
|
||||
this.write(this.out);
|
||||
this.channel.write(this.out);
|
||||
this.out.compact();
|
||||
}
|
||||
} catch (Exception var2) {
|
||||
|
@ -62,14 +61,14 @@ public final class NetworkHandler {
|
|||
}
|
||||
|
||||
try {
|
||||
GL11.endConnection();
|
||||
channel.endConnection();
|
||||
} catch (Exception var1) {
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
public final void send(PacketType var1, Object ... var2) {
|
||||
if(GL11.connectionOpen()) {
|
||||
if(channel.connectionOpen()) {
|
||||
this.out.put(var1.opcode);
|
||||
|
||||
for(int var3 = 0; var3 < var2.length; ++var3) {
|
||||
|
@ -77,7 +76,7 @@ public final class NetworkHandler {
|
|||
Object var4 = var2[var3];
|
||||
Class<?> var5 = var10001;
|
||||
NetworkHandler var6 = this;
|
||||
if(GL11.connectionOpen()) {
|
||||
if(channel.connectionOpen()) {
|
||||
try {
|
||||
if(var5 == Long.TYPE) {
|
||||
var6.out.putLong(((Long)var4).longValue());
|
||||
|
@ -129,7 +128,7 @@ public final class NetworkHandler {
|
|||
}
|
||||
|
||||
public Object readObject(Class var1) {
|
||||
if(!GL11.connectionOpen()) {
|
||||
if(!channel.connectionOpen()) {
|
||||
return null;
|
||||
} else {
|
||||
try {
|
||||
|
@ -162,49 +161,6 @@ public final class NetworkHandler {
|
|||
}
|
||||
}
|
||||
|
||||
public void read(ByteBuffer buf) {
|
||||
int bytesRead = 0;
|
||||
while (bytesRead < buf.capacity()) {
|
||||
if (!GL11.receivedBuffers.isEmpty()) {
|
||||
ByteBuffer receivedBuffer = GL11.receivedBuffers.peek();
|
||||
int remainingBytes = buf.capacity() - bytesRead;
|
||||
int bytesToRead = Math.min(receivedBuffer.remaining(), remainingBytes);
|
||||
receivedBuffer.get(buf.array(), bytesRead, bytesToRead);
|
||||
bytesRead += bytesToRead;
|
||||
|
||||
if (receivedBuffer.remaining() == 0) {
|
||||
GL11.receivedBuffers.poll();
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static ByteBuffer writeBuffer;
|
||||
|
||||
public void write(ByteBuffer buf) {
|
||||
if (writeBuffer == null) {
|
||||
writeBuffer = ByteBuffer.allocate(buf.capacity());
|
||||
}
|
||||
|
||||
int bytesToWrite = Math.min(buf.remaining(), writeBuffer.remaining());
|
||||
writeBuffer.put(buf.array(), buf.position(), bytesToWrite);
|
||||
buf.position(buf.position() + bytesToWrite);
|
||||
|
||||
if (writeBuffer.remaining() == 0 || buf.remaining() == 0) {
|
||||
writeBuffer.flip();
|
||||
byte[] data = new byte[writeBuffer.remaining()];
|
||||
writeBuffer.get(data);
|
||||
GL11.writePacket(data);
|
||||
writeBuffer.clear();
|
||||
}
|
||||
|
||||
if (buf.remaining() > 0) {
|
||||
write(buf);
|
||||
}
|
||||
}
|
||||
|
||||
@JSBody(params = { }, script = "return window.location.href;")
|
||||
private static native String getLocationString();
|
||||
|
||||
|
|
|
@ -109,7 +109,7 @@ public class LevelUtils {
|
|||
|
||||
public void save() {
|
||||
|
||||
if(Minecraft.getMinecraft().networkManager != null) {
|
||||
if(Minecraft.getMinecraft().server != null || Minecraft.getMinecraft().networkManager != null || Minecraft.getMinecraft().level == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
package net.PeytonPlayz585.websocket;
|
||||
|
||||
import org.teavm.jso.JSBody;
|
||||
import org.teavm.jso.ajax.*;
|
||||
import org.teavm.jso.dom.events.MessageEvent;
|
||||
import org.teavm.jso.typedarrays.ArrayBuffer;
|
||||
import org.teavm.jso.typedarrays.DataView;
|
||||
import org.teavm.jso.typedarrays.Int8Array;
|
||||
import org.teavm.jso.websocket.WebSocket;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Queue;
|
||||
|
||||
public class WebSocketChannel {
|
||||
private final WebSocket socket;
|
||||
private final Queue<MessageEvent> messageQueue;
|
||||
private final ByteBuffer readBuffer;
|
||||
private boolean reading;
|
||||
private boolean isConnected = false;
|
||||
|
||||
public WebSocketChannel(String url) {
|
||||
socket = WebSocket.create(url);
|
||||
messageQueue = new LinkedList<>();
|
||||
readBuffer = ByteBuffer.allocate(4096);
|
||||
reading = false;
|
||||
|
||||
socket.onMessage(event -> {
|
||||
isConnected = true;
|
||||
messageQueue.offer(event);
|
||||
});
|
||||
|
||||
socket.onOpen(event -> {
|
||||
isConnected = true;
|
||||
messageQueue.clear();
|
||||
});
|
||||
|
||||
socket.onClose((event) -> {
|
||||
isConnected = false;
|
||||
messageQueue.clear();
|
||||
});
|
||||
|
||||
socket.onError((event) -> {
|
||||
isConnected = false;
|
||||
socket.close();
|
||||
});
|
||||
}
|
||||
|
||||
public void read(ByteBuffer buffer) {
|
||||
if (reading || messageQueue.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
MessageEvent event = messageQueue.peek();
|
||||
readData(buffer, event);
|
||||
if (!event.isBubbles() && !event.isCancelable()) {
|
||||
messageQueue.poll();
|
||||
}
|
||||
}
|
||||
|
||||
private void readData(ByteBuffer buffer, MessageEvent event) {
|
||||
DataView data = DataView.create(event.getDataAsArray());
|
||||
int length = Math.min(buffer.remaining(), data.getByteLength());
|
||||
for (int i = 0; i < length; i++) {
|
||||
buffer.put((byte) data.getInt8(i));
|
||||
}
|
||||
if (reading) {
|
||||
return;
|
||||
}
|
||||
if (buffer.hasRemaining()) {
|
||||
readBuffer.clear();
|
||||
readBuffer.put(buffer);
|
||||
reading = true;
|
||||
} else {
|
||||
buffer.flip();
|
||||
}
|
||||
}
|
||||
|
||||
@JSBody(params = { "sock", "buffer" }, script = "sock.send(buffer);")
|
||||
private static native void nativeBinarySend(WebSocket sock, ArrayBuffer buffer);
|
||||
|
||||
public void write(ByteBuffer buffer) {
|
||||
if (socket.getReadyState() == 3) {
|
||||
return;
|
||||
}
|
||||
byte[] data = new byte[buffer.remaining()];
|
||||
buffer.get(data);
|
||||
Int8Array array = Int8Array.create(data.length);
|
||||
for (int i = 0; i < data.length; i++) {
|
||||
array.set(i, data[i]);
|
||||
}
|
||||
nativeBinarySend(socket, array.getBuffer());
|
||||
}
|
||||
|
||||
public boolean connectionOpen() {
|
||||
return isConnected && socket.getReadyState() != 3;
|
||||
}
|
||||
|
||||
public void endConnection() {
|
||||
socket.close();
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
|
@ -1201,61 +1201,6 @@ public class EaglerAdapterImpl2 {
|
|||
@JSBody(params = { "name", "cvs" }, script = "var a=document.createElement(\"a\");a.href=cvs.toDataURL(\"image/png\");a.download=name;a.click();")
|
||||
private static native void saveScreenshot(String name, HTMLCanvasElement cvs);
|
||||
|
||||
private static WebSocket webSocket;
|
||||
private static boolean isConnected = false;
|
||||
public static java.util.Queue<ByteBuffer> receivedBuffers = new java.util.ArrayDeque<ByteBuffer>();
|
||||
|
||||
public static boolean startConnection(String serverUrl) {
|
||||
webSocket = WebSocket.create(serverUrl);
|
||||
|
||||
webSocket.onOpen(new EventListener<MessageEvent>() {
|
||||
@Override
|
||||
public void handleEvent(MessageEvent evt) {
|
||||
isConnected = true;
|
||||
}
|
||||
});
|
||||
|
||||
webSocket.onMessage(new EventListener<MessageEvent>() {
|
||||
@Override
|
||||
public void handleEvent(MessageEvent evt) {
|
||||
Uint8Array a = Uint8Array.create(evt.getDataAsArray());
|
||||
byte[] b = new byte[a.getByteLength()];
|
||||
for(int i = 0; i < b.length; ++i) {
|
||||
b[i] = (byte) (a.get(i) & 0xFF);
|
||||
}
|
||||
ByteBuffer buffer = ByteBuffer.wrap(b);
|
||||
receivedBuffers.add(buffer);
|
||||
}
|
||||
});
|
||||
|
||||
webSocket.onClose(new EventListener<CloseEvent>() {
|
||||
@Override
|
||||
public void handleEvent(CloseEvent event) {
|
||||
isConnected = false;
|
||||
}
|
||||
});
|
||||
|
||||
return isConnected;
|
||||
}
|
||||
|
||||
public static void endConnection() {
|
||||
webSocket.close();
|
||||
}
|
||||
|
||||
public static final boolean connectionOpen() {
|
||||
return isConnected;
|
||||
}
|
||||
|
||||
@JSBody(params = { "sock", "buffer" }, script = "sock.send(buffer);")
|
||||
private static native void nativeBinarySend(WebSocket sock, ArrayBuffer buffer);
|
||||
public static final void writePacket(byte[] packet) {
|
||||
if(webSocket != null && isConnected) {
|
||||
Uint8Array arr = Uint8Array.create(packet.length);
|
||||
arr.set(packet);
|
||||
nativeBinarySend(webSocket, arr.getBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public static final byte[] loadLocalStorage(String key) {
|
||||
String s = win.getLocalStorage().getItem("_eaglercraft_beta."+key);
|
||||
if(s != null) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user