diff --git a/src/teavm/java/com/mojang/minecraft/Entity.java b/src/teavm/java/com/mojang/minecraft/Entity.java index c8ae5b0..53eb742 100644 --- a/src/teavm/java/com/mojang/minecraft/Entity.java +++ b/src/teavm/java/com/mojang/minecraft/Entity.java @@ -6,6 +6,7 @@ import com.mojang.minecraft.level.liquid.LiquidType; import com.mojang.minecraft.level.tile.Block; import com.mojang.minecraft.level.tile.Tile$SoundType; import com.mojang.minecraft.model.Vec3D; +import com.mojang.minecraft.net.PositionUpdate; import com.mojang.minecraft.phys.AABB; import net.PeytonPlayz585.math.MathHelper; import net.PeytonPlayz595.nbt.NBTTagCompound; @@ -88,6 +89,20 @@ public abstract class Entity implements Serializable { this.bbWidth = var1; this.bbHeight = var2; } + + public void setPos(PositionUpdate var1) { + if(var1.position) { + this.setPos(var1.x, var1.y, var1.z); + } else { + this.setPos(this.x, this.y, this.z); + } + + if(var1.rotation) { + this.setRot(var1.yaw, var1.pitch); + } else { + this.setRot(this.yRot, this.xRot); + } + } protected void setRot(float var1, float var2) { this.yRot = var1; diff --git a/src/teavm/java/com/mojang/minecraft/Minecraft.java b/src/teavm/java/com/mojang/minecraft/Minecraft.java index 09d5d1f..66a9520 100644 --- a/src/teavm/java/com/mojang/minecraft/Minecraft.java +++ b/src/teavm/java/com/mojang/minecraft/Minecraft.java @@ -16,6 +16,9 @@ import com.mojang.minecraft.model.HumanoidModel; import com.mojang.minecraft.model.ModelManager; import com.mojang.minecraft.model.ModelPart; import com.mojang.minecraft.model.Vec3D; +import com.mojang.minecraft.net.NetworkManager; +import com.mojang.minecraft.net.NetworkPlayer; +import com.mojang.minecraft.net.PacketType; import com.mojang.minecraft.particle.Particle; import com.mojang.minecraft.particle.ParticleManager; import com.mojang.minecraft.particle.WaterDropParticle; @@ -24,6 +27,7 @@ import com.mojang.minecraft.player.InputHandlerImpl; import com.mojang.minecraft.player.Player; import com.mojang.minecraft.render.*; import com.mojang.minecraft.render.Renderer; +import com.mojang.net.NetworkHandler; import net.PeytonPlayz585.level.LevelUtils; import net.PeytonPlayz585.math.MathHelper; @@ -33,16 +37,10 @@ import net.lax1dude.eaglercraft.adapter.Tessellator; import org.lwjgl.opengl.GL11; -import java.awt.*; import java.io.*; import java.nio.IntBuffer; -import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Map.Entry; public final class Minecraft implements Runnable { @@ -69,10 +67,11 @@ public final class Minecraft implements Runnable { public int levelId; public HUDScreen hud; public boolean online; + public NetworkManager networkManager; public MovingObjectPosition selected; public static GameSettings settings; - String server; - int port; + public String server; + public int port; volatile boolean running; public String debug; public boolean hasMouse; @@ -171,15 +170,24 @@ public final class Minecraft implements Runnable { Item.initModels(); Mob.modelCache = new ModelManager(); GL11.glViewport(0, 0, this.width, this.height); - Level level1 = new LevelUtils().load(); - if(level1 == null) { - this.generateLevel(1); + if(this.server != null) { + Level var85; + (var85 = new Level()).setData(8, 8, 8, new byte[512]); + this.setLevel(var85, false); } else { - this.setLevel(level1, true); + Level level1 = new LevelUtils().load(); + if(level1 == null) { + this.generateLevel(1); + } else { + this.setLevel(level1, true); + } } this.particleManager = new ParticleManager(this.level); checkGLError("Post startup"); this.hud = new HUDScreen(this, this.width, this.height); + if(this.server != null) { + this.networkManager = new NetworkManager(this, this.server, this.port, this.session.username, this.session.mppass); + } long var13 = System.currentTimeMillis(); int var15 = 0; @@ -996,6 +1004,10 @@ public final class Minecraft implements Runnable { return; } + if(this.isOnline()) { + this.networkManager.sendBlockChange(var3, var4, var5, var1, var10); + } + this.level.netSetTile(var3, var4, var5, var10); var2 = this.renderer.heldBlock; this.renderer.heldBlock.pos = 0.0F; @@ -1050,6 +1062,244 @@ public final class Minecraft implements Runnable { int var40; int var46; int var45; + if(this.networkManager != null && !(this.currentScreen instanceof ErrorScreen)) { + if(!this.networkManager.isConnected()) { + this.progressBar.setTitle("Connecting.."); + this.progressBar.setProgress(0); + } else { + NetworkManager var20 = this.networkManager; + if(this.networkManager.successful) { + NetworkHandler var18 = var20.netHandler; + if(var20.netHandler.connected) { + try { + NetworkHandler var22 = var20.netHandler; + var20.netHandler.channel.read(var22.in); + var4 = 0; + + while(var22.in.position() > 0 && var4++ != 100) { + var22.in.flip(); + byte var5 = var22.in.get(0); + PacketType var6; + if((var6 = PacketType.packets[var5]) == null) { + throw new IOException("Bad command: " + var5); + } + + if(var22.in.remaining() < var6.length + 1) { + var22.in.compact(); + break; + } + + var22.in.get(); + Object[] var7 = new Object[var6.params.length]; + + for(var8 = 0; var8 < var7.length; ++var8) { + var7[var8] = var22.readObject(var6.params[var8]); + } + + NetworkManager var42 = var22.netManager; + if(var22.netManager.successful) { + if(var6 == PacketType.IDENTIFICATION) { + var42.minecraft.progressBar.setTitle(var7[1].toString()); + var42.minecraft.progressBar.setText(var7[2].toString()); + var42.minecraft.player.userType = ((Byte)var7[3]).byteValue(); + } else if(var6 == PacketType.LEVEL_INIT) { + var42.minecraft.setLevel((Level)null, false); + var42.levelData = new ByteArrayOutputStream(); + } else if(var6 == PacketType.LEVEL_DATA) { + short var11 = ((Short)var7[0]).shortValue(); + byte[] var12 = (byte[])((byte[])var7[1]); + byte var13 = ((Byte)var7[2]).byteValue(); + var42.minecraft.progressBar.setProgress(var13); + var42.levelData.write(var12, 0, var11); + } else if(var6 == PacketType.LEVEL_FINALIZE) { + try { + var42.levelData.close(); + } catch (IOException var14) { + var14.printStackTrace(); + } + + byte[] var51 = LevelIO.decompress(new ByteArrayInputStream(var42.levelData.toByteArray())); + var42.levelData = null; + short var55 = ((Short)var7[0]).shortValue(); + short var63 = ((Short)var7[1]).shortValue(); + short var21 = ((Short)var7[2]).shortValue(); + Level var30; + (var30 = new Level()).setNetworkMode(true); + var30.setData(var55, var63, var21, var51); + var42.minecraft.setLevel(var30, false); + var42.minecraft.online = false; + var42.levelLoaded = true; + } else if(var6 == PacketType.BLOCK_CHANGE) { + if(var42.minecraft.level != null) { + var42.minecraft.level.netSetTile(((Short)var7[0]).shortValue(), ((Short)var7[1]).shortValue(), ((Short)var7[2]).shortValue(), ((Byte)var7[3]).byteValue()); + } + } else { + byte var9; + String var34; + NetworkPlayer var33; + short var36; + short var10004; + byte var10001; + short var47; + short var10003; + if(var6 == PacketType.SPAWN_PLAYER) { + var10001 = ((Byte)var7[0]).byteValue(); + String var10002 = (String)var7[1]; + var10003 = ((Short)var7[2]).shortValue(); + var10004 = ((Short)var7[3]).shortValue(); + short var10005 = ((Short)var7[4]).shortValue(); + byte var10006 = ((Byte)var7[5]).byteValue(); + byte var58 = ((Byte)var7[6]).byteValue(); + var9 = var10006; + short var10 = var10005; + var47 = var10004; + var36 = var10003; + var34 = var10002; + var5 = var10001; + if(var5 >= 0) { + var9 = (byte)(var9 + 128); + var47 = (short)(var47 - 22); + var33 = new NetworkPlayer(var42.minecraft, var5, var34, var36, var47, var10, (float)(var9 * 360) / 256.0F, (float)(var58 * 360) / 256.0F); + var42.players.put(Byte.valueOf(var5), var33); + var42.minecraft.level.addEntity(var33); + } else { + var42.minecraft.level.setSpawnPos(var36 / 32, var47 / 32, var10 / 32, (float)(var9 * 320 / 256)); + var42.minecraft.player.moveTo((float)var36 / 32.0F, (float)var47 / 32.0F, (float)var10 / 32.0F, (float)(var9 * 360) / 256.0F, (float)(var58 * 360) / 256.0F); + } + } else { + byte var53; + NetworkPlayer var61; + byte var69; + if(var6 == PacketType.POSITION_ROTATION) { + var10001 = ((Byte)var7[0]).byteValue(); + short var66 = ((Short)var7[1]).shortValue(); + var10003 = ((Short)var7[2]).shortValue(); + var10004 = ((Short)var7[3]).shortValue(); + var69 = ((Byte)var7[4]).byteValue(); + var9 = ((Byte)var7[5]).byteValue(); + var53 = var69; + var47 = var10004; + var36 = var10003; + short var38 = var66; + var5 = var10001; + if(var5 < 0) { + var42.minecraft.player.moveTo((float)var38 / 32.0F, (float)var36 / 32.0F, (float)var47 / 32.0F, (float)(var53 * 360) / 256.0F, (float)(var9 * 360) / 256.0F); + } else { + var53 = (byte)(var53 + 128); + var36 = (short)(var36 - 22); + if((var61 = (NetworkPlayer)var42.players.get(Byte.valueOf(var5))) != null) { + var61.teleport(var38, var36, var47, (float)(var53 * 360) / 256.0F, (float)(var9 * 360) / 256.0F); + } + } + } else { + byte var37; + byte var44; + byte var49; + byte var65; + byte var67; + if(var6 == PacketType.POSITION_ROTATION_UPDATE) { + var10001 = ((Byte)var7[0]).byteValue(); + var67 = ((Byte)var7[1]).byteValue(); + var65 = ((Byte)var7[2]).byteValue(); + byte var64 = ((Byte)var7[3]).byteValue(); + var69 = ((Byte)var7[4]).byteValue(); + var9 = ((Byte)var7[5]).byteValue(); + var53 = var69; + var49 = var64; + var44 = var65; + var37 = var67; + var5 = var10001; + if(var5 >= 0) { + var53 = (byte)(var53 + 128); + if((var61 = (NetworkPlayer)var42.players.get(Byte.valueOf(var5))) != null) { + var61.queue(var37, var44, var49, (float)(var53 * 360) / 256.0F, (float)(var9 * 360) / 256.0F); + } + } + } else if(var6 == PacketType.ROTATION_UPDATE) { + var10001 = ((Byte)var7[0]).byteValue(); + var67 = ((Byte)var7[1]).byteValue(); + var44 = ((Byte)var7[2]).byteValue(); + var37 = var67; + var5 = var10001; + if(var5 >= 0) { + var37 = (byte)(var37 + 128); + NetworkPlayer var54; + if((var54 = (NetworkPlayer)var42.players.get(Byte.valueOf(var5))) != null) { + var54.queue((float)(var37 * 360) / 256.0F, (float)(var44 * 360) / 256.0F); + } + } + } else if(var6 == PacketType.POSITION_UPDATE) { + var10001 = ((Byte)var7[0]).byteValue(); + var67 = ((Byte)var7[1]).byteValue(); + var65 = ((Byte)var7[2]).byteValue(); + var49 = ((Byte)var7[3]).byteValue(); + var44 = var65; + var37 = var67; + var5 = var10001; + NetworkPlayer var59; + if(var5 >= 0 && (var59 = (NetworkPlayer)var42.players.get(Byte.valueOf(var5))) != null) { + var59.queue(var37, var44, var49); + } + } else if(var6 == PacketType.DESPAWN_PLAYER) { + var5 = ((Byte)var7[0]).byteValue(); + if(var5 >= 0 && (var33 = (NetworkPlayer)var42.players.remove(Byte.valueOf(var5))) != null) { + var42.minecraft.level.removeEntity(var33); + } + } else if(var6 == PacketType.CHAT_MESSAGE) { + var10001 = ((Byte)var7[0]).byteValue(); + var34 = (String)var7[1]; + var5 = var10001; + if(var5 < 0) { + var42.minecraft.hud.addChat("&e" + var34); + } else { + var42.players.get(Byte.valueOf(var5)); + var42.minecraft.hud.addChat(var34); + } + } else if(var6 == PacketType.DISCONNECT) { + var42.netHandler.close(); + var42.minecraft.setCurrentScreen(new ErrorScreen("Connection lost", (String)var7[0])); + } else if(var6 == PacketType.UPDATE_PLAYER_TYPE) { + var42.minecraft.player.userType = ((Byte)var7[0]).byteValue(); + } + } + } + } + } + + if(!var22.connected) { + break; + } + + var22.in.compact(); + } + + if(var22.out.position() > 0) { + var22.out.flip(); + var22.channel.write(var22.out); + var22.out.compact(); + } + } catch (Exception var15) { + var20.minecraft.setCurrentScreen(new ErrorScreen("Disconnected!", "You\'ve lost connection to the server")); + var20.minecraft.online = false; + var15.printStackTrace(); + var20.netHandler.close(); + var20.minecraft.networkManager = null; + } + } + } + + Player var28 = this.player; + var20 = this.networkManager; + if(this.networkManager.levelLoaded) { + int var24 = (int)(var28.x * 32.0F); + var4 = (int)(var28.y * 32.0F); + var40 = (int)(var28.z * 32.0F); + var46 = (int)(var28.yRot * 256.0F / 360.0F) & 255; + var45 = (int)(var28.xRot * 256.0F / 360.0F) & 255; + var20.netHandler.send(PacketType.POSITION_ROTATION, new Object[]{Integer.valueOf(-1), Integer.valueOf(var24), Integer.valueOf(var4), Integer.valueOf(var40), Integer.valueOf(var46), Integer.valueOf(var45)}); + } + } + } if(this.currentScreen == null && this.player != null && this.player.health <= 0) { this.setCurrentScreen((GuiScreen)null); @@ -1139,6 +1389,11 @@ public final class Minecraft implements Runnable { if(GL11.getEventKey() == this.settings.buildKey.key) { this.gamemode.openInventory(); } + + if(GL11.getEventKey() == this.settings.chatKey.key && this.networkManager != null && this.networkManager.isConnected()) { + this.player.releaseAllKeys(); + this.setCurrentScreen(new ChatInputScreen()); + } } for(var25 = 0; var25 < 9; ++var25) { @@ -1248,7 +1503,9 @@ public final class Minecraft implements Runnable { LevelRenderer var31 = this.levelRenderer; ++this.levelRenderer.ticks; this.level.tickEntities(); - this.level.tick(); + if(!this.isOnline()) { + this.level.tick(); + } this.particleManager.tick(); } @@ -1268,6 +1525,10 @@ public final class Minecraft implements Runnable { ticksUntilSave = this.hud.ticks + 600; } } + + public final boolean isOnline() { + return this.networkManager != null; + } public final void generateLevel(int var1) { String var2 = "PeytonPlayz585"; @@ -1285,7 +1546,16 @@ public final class Minecraft implements Runnable { this.gamemode.apply(var1); var1.font = this.fontRenderer; var1.rendererContext$5cd64a7f = this; - this.player = (Player)var1.findSubclassOf(Player.class); + if(!this.isOnline()) { + this.player = (Player)var1.findSubclassOf(Player.class); + } else if(this.player != null) { + this.player.resetPos(); + this.gamemode.preparePlayer(this.player); + if(var1 != null) { + var1.player = this.player; + var1.addEntity(this.player); + } + } } if(this.player == null) { diff --git a/src/teavm/java/com/mojang/minecraft/gamemode/GameMode.java b/src/teavm/java/com/mojang/minecraft/gamemode/GameMode.java index 86ab804..6829679 100644 --- a/src/teavm/java/com/mojang/minecraft/gamemode/GameMode.java +++ b/src/teavm/java/com/mojang/minecraft/gamemode/GameMode.java @@ -50,13 +50,19 @@ public class GameMode boolean success = level.netSetTile(x, y, z, 0); - if(block.stepsound != Tile$SoundType.none && minecraft.settings.sound) - { - level.playSound(block.stepsound.name); - } - if(block != null && success) { + + if(Minecraft.getMinecraft().isOnline()) + { + Minecraft.getMinecraft().networkManager.sendBlockChange(x, y, z, 0, Minecraft.getMinecraft().player.inventory.getSelected()); + } + + if(block.stepsound != Tile$SoundType.none && minecraft.settings.sound) + { + level.playSound(block.stepsound.name); + } + block.spawnBreakParticles(level, x, y, z, minecraft.particleManager); } diff --git a/src/teavm/java/com/mojang/minecraft/gui/ChatInputScreen.java b/src/teavm/java/com/mojang/minecraft/gui/ChatInputScreen.java index d9a4f84..372aada 100644 --- a/src/teavm/java/com/mojang/minecraft/gui/ChatInputScreen.java +++ b/src/teavm/java/com/mojang/minecraft/gui/ChatInputScreen.java @@ -1,8 +1,11 @@ package com.mojang.minecraft.gui; -import com.mojang.minecraft.gui.GuiScreen; import org.lwjgl.opengl.GL11; +import com.mojang.minecraft.gui.GuiScreen; +import com.mojang.minecraft.net.NetworkManager; +import com.mojang.minecraft.net.PacketType; + public final class ChatInputScreen extends GuiScreen { private String message = ""; @@ -25,6 +28,13 @@ public final class ChatInputScreen extends GuiScreen { if(var2 == 1) { this.minecraft.setCurrentScreen((GuiScreen)null); } else if(var2 == 28) { + NetworkManager var10000 = this.minecraft.networkManager; + String var4 = this.message.trim(); + NetworkManager var3 = var10000; + if((var4 = var4.trim()).length() > 0) { + var3.netHandler.send(PacketType.CHAT_MESSAGE, new Object[]{Integer.valueOf(-1), var4}); + } + this.minecraft.setCurrentScreen((GuiScreen)null); } else { if(var2 == 14 && this.message.length() > 0) { diff --git a/src/teavm/java/com/mojang/minecraft/gui/FontRenderer.java b/src/teavm/java/com/mojang/minecraft/gui/FontRenderer.java index 14a8da5..2b095bc 100644 --- a/src/teavm/java/com/mojang/minecraft/gui/FontRenderer.java +++ b/src/teavm/java/com/mojang/minecraft/gui/FontRenderer.java @@ -118,7 +118,6 @@ public class FontRenderer { k = (k & 0xfcfcfc) >> 2; k += l; } - //GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, fontTextureName); new TextureLocation(fontTextureName).bindTexture(); float f = (float) (k >> 16 & 0xff) / 255F; float f1 = (float) (k >> 8 & 0xff) / 255F; @@ -137,8 +136,6 @@ public class FontRenderer { j1 = 15; } continue; - //EaglerAdapter.glCallList(fontDisplayLists + 256 + j1 + (flag ? 16 : 0)); - //EaglerAdapter.glTranslatef(charWidth[256 + j1 + (flag ? 16 : 0)] * 0.5f, 0.0F, 0.0F); } if (i1 < s.length()) { @@ -171,6 +168,21 @@ public class FontRenderer { return i; } + + public static String stripColor(String var0) { + char[] var3 = var0.toCharArray(); + String var1 = ""; + + for(int var2 = 0; var2 < var3.length; ++var2) { + if(var3[var2] == 38) { + ++var2; + } else { + var1 = var1 + var3[var2]; + } + } + + return var1; + } private int charWidth[]; public String fontTextureName; diff --git a/src/teavm/java/com/mojang/minecraft/gui/HUDScreen.java b/src/teavm/java/com/mojang/minecraft/gui/HUDScreen.java index a654307..4e53cd6 100644 --- a/src/teavm/java/com/mojang/minecraft/gui/HUDScreen.java +++ b/src/teavm/java/com/mojang/minecraft/gui/HUDScreen.java @@ -12,6 +12,7 @@ import net.lax1dude.eaglercraft.adapter.Tessellator; import java.util.ArrayList; import java.util.List; import java.util.Random; + import org.lwjgl.opengl.GL11; public final class HUDScreen extends Screen { @@ -176,6 +177,36 @@ public final class HUDScreen extends Screen { var14 = this.width / 2; var15 = this.height / 2; this.hoveredPlayer = null; + if(GL11.isKeyDown(15) && this.mc.networkManager != null && this.mc.networkManager.isConnected()) { + List var22 = this.mc.networkManager.getPlayers(); + GL11.glEnable(3042); + GL11.glDisable(3553); + GL11.glBlendFunc(770, 771); + tessellator.startDrawing(7); + GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.7F); + tessellator.addVertex((float)(var14 + 128), (float)(var15 - 68 - 12), 0.0F); + tessellator.addVertex((float)(var14 - 128), (float)(var15 - 68 - 12), 0.0F); + GL11.glColor4f(0.2F, 0.2F, 0.2F, 0.8F); + tessellator.addVertex((float)(var14 - 128), (float)(var15 + 68), 0.0F); + tessellator.addVertex((float)(var14 + 128), (float)(var15 + 68), 0.0F); + tessellator.draw(); + GL11.glDisable(3042); + GL11.glEnable(3553); + var23 = "Connected players:"; + var5.drawStringWithShadow(var23, var14 - var5.getStringWidth(var23) / 2, var15 - 64 - 12, 16777215); + + for(var11 = 0; var11 < var22.size(); ++var11) { + int var28 = var14 + var11 % 2 * 120 - 120; + int var17 = var15 - 64 + (var11 / 2 << 3); + if(var2 && var3 >= var28 && var4 >= var17 && var3 < var28 + 120 && var4 < var17 + 8) { + this.hoveredPlayer = (String)var22.get(var11); + var5.drawString((String)var22.get(var11), var28 + 2, var17, 16777215); + } else { + var5.drawString((String)var22.get(var11), var28, var17, 15658734); + } + } + } + } public final void addChat(String var1) { diff --git a/src/teavm/java/com/mojang/minecraft/gui/PauseScreen.java b/src/teavm/java/com/mojang/minecraft/gui/PauseScreen.java index 24af996..d995fef 100644 --- a/src/teavm/java/com/mojang/minecraft/gui/PauseScreen.java +++ b/src/teavm/java/com/mojang/minecraft/gui/PauseScreen.java @@ -21,6 +21,13 @@ public final class PauseScreen extends GuiScreen { this.buttons.add(new Button(4, this.width / 2 - 100, this.height / 4 + 120, "Back to game")); ((Button)this.buttons.get(2)).active = false; ((Button)this.buttons.get(3)).active = false; + + if(this.minecraft.networkManager != null) { + ((Button)this.buttons.get(1)).active = false; + ((Button)this.buttons.get(2)).active = false; + ((Button)this.buttons.get(3)).active = false; + } + new LevelUtils().save(); } diff --git a/src/teavm/java/com/mojang/minecraft/net/NetworkManager.java b/src/teavm/java/com/mojang/minecraft/net/NetworkManager.java new file mode 100644 index 0000000..f18889c --- /dev/null +++ b/src/teavm/java/com/mojang/minecraft/net/NetworkManager.java @@ -0,0 +1,74 @@ +package com.mojang.minecraft.net; + +import com.mojang.minecraft.Minecraft; +import com.mojang.minecraft.gui.ErrorScreen; +import com.mojang.net.NetworkHandler; +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +public class NetworkManager +{ + public NetworkManager(Minecraft minecraft, String server, int port, String username, String key) + { + minecraft.online = true; + + this.minecraft = minecraft; + + players = new HashMap(); + + new ServerConnectThread(this, server, port, username, key, minecraft).start(); + } + + public ByteArrayOutputStream levelData; + + public NetworkHandler netHandler; + + public Minecraft minecraft; + + public boolean successful = false; + public boolean levelLoaded = false; + + public HashMap players; + + public void sendBlockChange(int x, int y, int z, int mode, int block) + { + netHandler.send(PacketType.PLAYER_SET_BLOCK, new Object[] {x, y, z, mode, block}); + } + + public void error(Exception e) + { + netHandler.close(); + + ErrorScreen errorScreen = new ErrorScreen("Disconnected!", e.getMessage()); + + minecraft.setCurrentScreen(errorScreen); + + e.printStackTrace(); + } + + public boolean isConnected() + { + return netHandler != null && netHandler.connected; + } + + public List getPlayers() + { + ArrayList list = new ArrayList(); + + list.add(minecraft.session.username); + + Iterator playerIterator = this.players.values().iterator(); + + while(playerIterator.hasNext()) + { + NetworkPlayer networkPlayer = (NetworkPlayer)playerIterator.next(); + + list.add(networkPlayer.name); + } + + return list; + } +} diff --git a/src/teavm/java/com/mojang/minecraft/net/NetworkPlayer.java b/src/teavm/java/com/mojang/minecraft/net/NetworkPlayer.java new file mode 100644 index 0000000..f3020a3 --- /dev/null +++ b/src/teavm/java/com/mojang/minecraft/net/NetworkPlayer.java @@ -0,0 +1,184 @@ +package com.mojang.minecraft.net; + +import com.mojang.minecraft.Minecraft; +import com.mojang.minecraft.gui.FontRenderer; +import com.mojang.minecraft.mob.HumanoidMob; +import com.mojang.minecraft.net.PositionUpdate; +import com.mojang.minecraft.render.TextureLocation; + +import java.util.LinkedList; +import java.util.List; +import org.lwjgl.opengl.GL11; + +public class NetworkPlayer extends HumanoidMob { + + public static final long serialVersionUID = 77479605454997290L; + private List moveQueue = new LinkedList(); + private Minecraft minecraft; + private int xp; + private int yp; + private int zp; + public String name; + public String displayName; + int tickCount = 0; + + public NetworkPlayer(Minecraft var1, int var2, String var3, int var4, int var5, int var6, float var7, float var8) { + super(var1.level, (float)var4, (float)var5, (float)var6); + this.minecraft = var1; + this.displayName = var3; + var3 = FontRenderer.stripColor(var3); + this.name = var3; + this.xp = var4; + this.yp = var5; + this.zp = var6; + this.heightOffset = 0.0F; + this.pushthrough = 0.8F; + this.setPos((float)var4 / 32.0F, (float)var5 / 32.0F, (float)var6 / 32.0F); + this.xRot = var8; + this.yRot = var7; + this.armor = this.helmet = false; + this.renderOffset = 0.6875F; + this.allowAlpha = false; + } + + public void aiStep() { + int var1 = 5; + + do { + if(this.moveQueue.size() > 0) { + this.setPos((PositionUpdate)this.moveQueue.remove(0)); + } + } while(var1-- > 0 && this.moveQueue.size() > 10); + + this.onGround = true; + } + + public void bindTexture() { + new TextureLocation("/char.png").bindTexture(); + } + + public void renderHover(float var2) { + FontRenderer var3 = this.minecraft.fontRenderer; + GL11.glPushMatrix(); + GL11.glTranslatef(this.xo + (this.x - this.xo) * var2, this.yo + (this.y - this.yo) * var2 + 0.8F + this.renderOffset, this.zo + (this.z - this.zo) * var2); + GL11.glRotatef(-this.minecraft.player.yRot, 0.0F, 1.0F, 0.0F); + var2 = 0.05F; + GL11.glScalef(0.05F, -var2, var2); + GL11.glTranslatef((float)(-var3.getStringWidth(this.displayName)) / 2.0F, 0.0F, 0.0F); + GL11.glNormal3f(1.0F, -1.0F, 1.0F); + GL11.glDisable(2896); + GL11.glDisable(16384); + if(this.name.equalsIgnoreCase("Notch")) { + var3.drawString(this.displayName, 0, 0, 16776960); + } else { + var3.drawString(this.displayName, 0, 0, 16777215); + } + + GL11.glDepthFunc(516); + GL11.glDepthMask(false); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.8F); + GL11.glEnable(3042); + GL11.glBlendFunc(770, 771); + var3.drawString(this.displayName, 0, 0, 16777215); + GL11.glDisable(3042); + GL11.glDepthMask(true); + GL11.glDepthFunc(515); + GL11.glTranslatef(1.0F, 1.0F, -0.05F); + var3.drawString(this.name, 0, 0, 5263440); + GL11.glEnable(16384); + GL11.glEnable(2896); + GL11.glPopMatrix(); + } + + public void queue(byte var1, byte var2, byte var3, float var4, float var5) { + float var6 = var4 - this.yRot; + + float var7; + for(var7 = var5 - this.xRot; var6 >= 180.0F; var6 -= 360.0F) { + ; + } + + while(var6 < -180.0F) { + var6 += 360.0F; + } + + while(var7 >= 180.0F) { + var7 -= 360.0F; + } + + while(var7 < -180.0F) { + var7 += 360.0F; + } + + var6 = this.yRot + var6 * 0.5F; + var7 = this.xRot + var7 * 0.5F; + this.moveQueue.add(new PositionUpdate(((float)this.xp + (float)var1 / 2.0F) / 32.0F, ((float)this.yp + (float)var2 / 2.0F) / 32.0F, ((float)this.zp + (float)var3 / 2.0F) / 32.0F, var6, var7)); + this.xp += var1; + this.yp += var2; + this.zp += var3; + this.moveQueue.add(new PositionUpdate((float)this.xp / 32.0F, (float)this.yp / 32.0F, (float)this.zp / 32.0F, var4, var5)); + } + + public void teleport(short var1, short var2, short var3, float var4, float var5) { + float var6 = var4 - this.yRot; + + float var7; + for(var7 = var5 - this.xRot; var6 >= 180.0F; var6 -= 360.0F) { + ; + } + + while(var6 < -180.0F) { + var6 += 360.0F; + } + + while(var7 >= 180.0F) { + var7 -= 360.0F; + } + + while(var7 < -180.0F) { + var7 += 360.0F; + } + + var6 = this.yRot + var6 * 0.5F; + var7 = this.xRot + var7 * 0.5F; + this.moveQueue.add(new PositionUpdate((float)(this.xp + var1) / 64.0F, (float)(this.yp + var2) / 64.0F, (float)(this.zp + var3) / 64.0F, var6, var7)); + this.xp = var1; + this.yp = var2; + this.zp = var3; + this.moveQueue.add(new PositionUpdate((float)this.xp / 32.0F, (float)this.yp / 32.0F, (float)this.zp / 32.0F, var4, var5)); + } + + public void queue(byte var1, byte var2, byte var3) { + this.moveQueue.add(new PositionUpdate(((float)this.xp + (float)var1 / 2.0F) / 32.0F, ((float)this.yp + (float)var2 / 2.0F) / 32.0F, ((float)this.zp + (float)var3 / 2.0F) / 32.0F)); + this.xp += var1; + this.yp += var2; + this.zp += var3; + this.moveQueue.add(new PositionUpdate((float)this.xp / 32.0F, (float)this.yp / 32.0F, (float)this.zp / 32.0F)); + } + + public void queue(float var1, float var2) { + float var3 = var1 - this.yRot; + + float var4; + for(var4 = var2 - this.xRot; var3 >= 180.0F; var3 -= 360.0F) { + ; + } + + while(var3 < -180.0F) { + var3 += 360.0F; + } + + while(var4 >= 180.0F) { + var4 -= 360.0F; + } + + while(var4 < -180.0F) { + var4 += 360.0F; + } + + var3 = this.yRot + var3 * 0.5F; + var4 = this.xRot + var4 * 0.5F; + this.moveQueue.add(new PositionUpdate(var3, var4)); + this.moveQueue.add(new PositionUpdate(var1, var2)); + } +} diff --git a/src/teavm/java/com/mojang/minecraft/net/PacketType.java b/src/teavm/java/com/mojang/minecraft/net/PacketType.java new file mode 100644 index 0000000..a077478 --- /dev/null +++ b/src/teavm/java/com/mojang/minecraft/net/PacketType.java @@ -0,0 +1,86 @@ +package com.mojang.minecraft.net; + +public class PacketType +{ + private PacketType(Class ... classes) + { + opcode = (byte)(nextOpcode++); + packets[opcode] = this; + params = new Class[classes.length]; + + int length = 0; + + for(int classNumber = 0; classNumber < classes.length; classNumber++) + { + Class class_ = classes[classNumber]; + + params[classNumber] = class_; + + if(class_ == Long.TYPE) + { + length += 8; + } else if(class_ == Integer.TYPE) { + length += 4; + } else if(class_ == Short.TYPE) { + length += 2; + } else if(class_ == Byte.TYPE) { + ++length; + } else if(class_ == Float.TYPE) { + length += 4; + } else if(class_ == Double.TYPE) { + length += 8; + } else if(class_ == byte[].class) { + length += 1024; + } else if(class_ == String.class) { + length += 64; + } + } + + this.length = length; + } + + public static final PacketType[] packets = new PacketType[256]; + + public static final PacketType IDENTIFICATION = new PacketType(new Class[] {Byte.TYPE, String.class, String.class, Byte.TYPE}); + public static final PacketType LEVEL_INIT; + public static final PacketType LEVEL_DATA; + public static final PacketType LEVEL_FINALIZE; + public static final PacketType PLAYER_SET_BLOCK; + public static final PacketType BLOCK_CHANGE; + public static final PacketType SPAWN_PLAYER; + public static final PacketType POSITION_ROTATION; + public static final PacketType POSITION_ROTATION_UPDATE; + public static final PacketType POSITION_UPDATE; + public static final PacketType ROTATION_UPDATE; + public static final PacketType DESPAWN_PLAYER; + public static final PacketType CHAT_MESSAGE; + public static final PacketType DISCONNECT; + public static final PacketType UPDATE_PLAYER_TYPE; + + public int length; + private static int nextOpcode; + public byte opcode; + public Class[] params; + + static + { + new PacketType(new Class[0]); + + LEVEL_INIT = new PacketType(new Class[0]); + LEVEL_DATA = new PacketType(new Class[] {Short.TYPE, byte[].class, Byte.TYPE}); + LEVEL_FINALIZE = new PacketType(new Class[] {Short.TYPE, Short.TYPE, Short.TYPE}); + PLAYER_SET_BLOCK = new PacketType(new Class[] {Short.TYPE, Short.TYPE, Short.TYPE, Byte.TYPE, Byte.TYPE}); + BLOCK_CHANGE = new PacketType(new Class[] {Short.TYPE, Short.TYPE, Short.TYPE, Byte.TYPE}); + SPAWN_PLAYER = new PacketType(new Class[] {Byte.TYPE, String.class, Short.TYPE, Short.TYPE, Short.TYPE, Byte.TYPE, Byte.TYPE}); + POSITION_ROTATION = new PacketType(new Class[] {Byte.TYPE, Short.TYPE, Short.TYPE, Short.TYPE, Byte.TYPE, Byte.TYPE}); + POSITION_ROTATION_UPDATE = new PacketType(new Class[] {Byte.TYPE, Byte.TYPE, Byte.TYPE, Byte.TYPE, Byte.TYPE, Byte.TYPE}); + POSITION_UPDATE = new PacketType(new Class[] {Byte.TYPE, Byte.TYPE, Byte.TYPE, Byte.TYPE}); + ROTATION_UPDATE = new PacketType(new Class[] {Byte.TYPE, Byte.TYPE, Byte.TYPE}); + DESPAWN_PLAYER = new PacketType(new Class[] {Byte.TYPE}); + CHAT_MESSAGE = new PacketType(new Class[] {Byte.TYPE, String.class}); + DISCONNECT = new PacketType(new Class[] {String.class}); + UPDATE_PLAYER_TYPE = new PacketType(new Class[] {Byte.TYPE}); + + nextOpcode = 0; + } +} diff --git a/src/teavm/java/com/mojang/minecraft/net/PositionUpdate.java b/src/teavm/java/com/mojang/minecraft/net/PositionUpdate.java new file mode 100644 index 0000000..53f6dfe --- /dev/null +++ b/src/teavm/java/com/mojang/minecraft/net/PositionUpdate.java @@ -0,0 +1,45 @@ +package com.mojang.minecraft.net; + +public class PositionUpdate +{ + public PositionUpdate(float x, float y, float z, float yaw, float pitch) + { + this.x = x; + this.y = y; + this.z = z; + this.yaw = yaw; + this.pitch = pitch; + + rotation = true; + position = true; + } + + public PositionUpdate(float x, float y, float z) + { + this.x = x; + this.y = y; + this.z = z; + + position = true; + rotation = false; + } + + public PositionUpdate(float yaw, float pitch) + { + this.yaw = yaw; + this.pitch = pitch; + + rotation = true; + position = false; + } + + public float x; + public float y; + public float z; + + public float yaw; + public float pitch; + + public boolean rotation = false; + public boolean position = false; +} diff --git a/src/teavm/java/com/mojang/minecraft/net/ServerConnectThread.java b/src/teavm/java/com/mojang/minecraft/net/ServerConnectThread.java new file mode 100644 index 0000000..772ca51 --- /dev/null +++ b/src/teavm/java/com/mojang/minecraft/net/ServerConnectThread.java @@ -0,0 +1,53 @@ +package com.mojang.minecraft.net; + +import com.mojang.minecraft.Minecraft; +import com.mojang.minecraft.gui.ErrorScreen; +import com.mojang.net.NetworkHandler; + +public class ServerConnectThread extends Thread +{ + public ServerConnectThread(NetworkManager networkManager, String server, int port, String username, String key, Minecraft minecraft) { + super(); + + netManager = networkManager; + + this.server = server; + this.port = port; + + this.username = username; + this.key = key; + + this.minecraft = minecraft; + } + + @Override + public void run() + { + try { + netManager.netHandler = new NetworkHandler(server, port); + netManager.netHandler.netManager = netManager; + + netManager.netHandler.send(PacketType.IDENTIFICATION, new Object[]{Byte.valueOf((byte)7), this.username, this.key, Integer.valueOf(0)}); + + netManager.successful = true; + } catch (Exception var3) { + minecraft.online = false; + + minecraft.networkManager = null; + + minecraft.setCurrentScreen(new ErrorScreen("Failed to connect", "You failed to connect to the server. It\'s probably down!")); + + netManager.successful = false; + } + } + + private String server; + private int port; + + private String username; + private String key; + + private Minecraft minecraft; + + private NetworkManager netManager; +} diff --git a/src/teavm/java/com/mojang/net/NetworkHandler.java b/src/teavm/java/com/mojang/net/NetworkHandler.java new file mode 100644 index 0000000..f317071 --- /dev/null +++ b/src/teavm/java/com/mojang/net/NetworkHandler.java @@ -0,0 +1,169 @@ +package com.mojang.net; + +import com.mojang.minecraft.Minecraft; +import com.mojang.minecraft.gamemode.CreativeGameMode; +import com.mojang.minecraft.net.NetworkManager; +import com.mojang.minecraft.net.PacketType; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketException; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; +import java.util.Arrays; + +public final class NetworkHandler { + + public volatile boolean connected; + public SocketChannel channel; + public ByteBuffer in = ByteBuffer.allocate(1048576); + public ByteBuffer out = ByteBuffer.allocate(1048576); + public NetworkManager netManager; + private Socket sock; + private boolean unused = false; + private byte[] stringBytes = new byte[64]; + + + public NetworkHandler(String var1, int var2) { + Minecraft.getMinecraft().gamemode = new CreativeGameMode(Minecraft.getMinecraft()); + try + { + channel = SocketChannel.open(); + this.channel.connect(new InetSocketAddress(var1, var2)); + this.channel.configureBlocking(false); + System.currentTimeMillis(); + this.sock = this.channel.socket(); + this.connected = true; + this.in.clear(); + this.out.clear(); + this.sock.setTcpNoDelay(true); + this.sock.setTrafficClass(24); + this.sock.setKeepAlive(false); + this.sock.setReuseAddress(false); + this.sock.setSoTimeout(100); + this.sock.getInetAddress().toString(); + } catch (SocketException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public final void close() { + try { + if(this.out.position() > 0) { + this.out.flip(); + this.channel.write(this.out); + this.out.compact(); + } + } catch (Exception var2) { + ; + } + + this.connected = false; + + try { + this.channel.close(); + } catch (Exception var1) { + ; + } + + this.sock = null; + this.channel = null; + } + + public final void send(PacketType var1, Object ... var2) { + if(this.connected) { + this.out.put(var1.opcode); + + for(int var3 = 0; var3 < var2.length; ++var3) { + Class var10001 = var1.params[var3]; + Object var4 = var2[var3]; + Class var5 = var10001; + NetworkHandler var6 = this; + if(this.connected) { + try { + if(var5 == Long.TYPE) { + var6.out.putLong(((Long)var4).longValue()); + } else if(var5 == Integer.TYPE) { + var6.out.putInt(((Number)var4).intValue()); + } else if(var5 == Short.TYPE) { + var6.out.putShort(((Number)var4).shortValue()); + } else if(var5 == Byte.TYPE) { + var6.out.put(((Number)var4).byteValue()); + } else if(var5 == Double.TYPE) { + var6.out.putDouble(((Double)var4).doubleValue()); + } else if(var5 == Float.TYPE) { + var6.out.putFloat(((Float)var4).floatValue()); + } else { + byte[] var9; + if(var5 != String.class) { + if(var5 == byte[].class) { + if((var9 = (byte[])((byte[])var4)).length < 1024) { + var9 = Arrays.copyOf(var9, 1024); + } + + var6.out.put(var9); + } + } else { + if(var4 != null) { + var9 = ((String)var4).getBytes("UTF-8"); + Arrays.fill(var6.stringBytes, (byte)32); + + int var8; + for(var8 = 0; var8 < 64 && var8 < var9.length; ++var8) { + var6.stringBytes[var8] = var9[var8]; + } + + for(var8 = var9.length; var8 < 64; ++var8) { + var6.stringBytes[var8] = 32; + } + + var6.out.put(var6.stringBytes); + } + } + } + } catch (Exception var7) { + this.netManager.error(var7); + } + } + } + + } + } + + public Object readObject(Class var1) { + if(!this.connected) { + return null; + } else { + try { + if(var1 == Long.TYPE) { + return Long.valueOf(this.in.getLong()); + } else if(var1 == Integer.TYPE) { + return Integer.valueOf(this.in.getInt()); + } else if(var1 == Short.TYPE) { + return Short.valueOf(this.in.getShort()); + } else if(var1 == Byte.TYPE) { + return Byte.valueOf(this.in.get()); + } else if(var1 == Double.TYPE) { + return Double.valueOf(this.in.getDouble()); + } else if(var1 == Float.TYPE) { + return Float.valueOf(this.in.getFloat()); + } else if(var1 == String.class) { + this.in.get(this.stringBytes); + return (new String(this.stringBytes, "UTF-8")).trim(); + } else if(var1 == byte[].class) { + byte[] var3 = new byte[1024]; + this.in.get(var3); + return var3; + } else { + return null; + } + } catch (Exception var2) { + this.netManager.error(var2); + return null; + } + } + } +} diff --git a/src/teavm/java/net/PeytonPlayz585/level/LevelUtils.java b/src/teavm/java/net/PeytonPlayz585/level/LevelUtils.java index cc014b0..e85d26d 100644 --- a/src/teavm/java/net/PeytonPlayz585/level/LevelUtils.java +++ b/src/teavm/java/net/PeytonPlayz585/level/LevelUtils.java @@ -108,6 +108,11 @@ public class LevelUtils { } public void save() { + + if(Minecraft.getMinecraft().networkManager != null) { + return; + } + Level var1 = Minecraft.getMinecraft().level; NBTTagCompound var3 = new NBTTagCompound();