LAN ready for testing

This commit is contained in:
LAX1DUDE 2022-08-19 01:34:04 -07:00
parent 1e7c5a7493
commit 3d9df11058
32 changed files with 34461 additions and 33644 deletions

View File

@ -1,2 +1,6 @@
@echo off @echo off
title epkcompiler
echo compiling, please wait...
java -jar CompilePackage.jar "../lwjgl-rundir/resources" "../javascript/assets.epk" java -jar CompilePackage.jar "../lwjgl-rundir/resources" "../javascript/assets.epk"
echo finished compiling epk
pause

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -259,12 +259,28 @@ directConnect.serverJoin=Connect to Server
directConnect.lanWorldJoin=Join World directConnect.lanWorldJoin=Join World
directConnect.lanWorldRelay=Network Settings directConnect.lanWorldRelay=Network Settings
lanServer.pauseMenu0=Sharing to LAN
lanServer.pauseMenu1=Relay URL:
lanServer.pauseMenu2=Join Code:
lanServer.worldName=World Name:
lanServer.hidden=Hidden:
lanServer.hideCode=hide details
lanServer.showCode=show details
lanServer.opened=LAN world opened on $relay$, join code is §a$code$
lanServer.closed=LAN world closed
lanServer.pleaseWait=Please Wait...
lanServer.relayDisconnected=Error: connection to LAN relay was lost, you must re-share the world to invide more people
networkSettings.title=LAN World Relay Servers networkSettings.title=LAN World Relay Servers
networkSettings.add=Add Relay networkSettings.add=Add Relay
networkSettings.delete=Delete Relay networkSettings.delete=Delete Relay
networkSettings.default=Set Primary networkSettings.default=Set Primary
networkSettings.refresh=Refresh networkSettings.refresh=Refresh
networkSettings.loadDefaults=Load Defaults networkSettings.loadDefaults=Load Defaults
networkSettings.relayTimeout=Connection Timeout:
networkSettings.relayTimeoutChange=change
networkSettings.relayTimeoutTitle=Change Connection Timeout
addRelay.title=Add New Relay addRelay.title=Add New Relay
addRelay.name=Relay Comment addRelay.name=Relay Comment
@ -274,8 +290,13 @@ addRelay.primary=Set Primary
addRelay.removeText1=Do you want to remove this relay? addRelay.removeText1=Do you want to remove this relay?
noRelay.title=No Relays are Configured! noRelay.title=No Relays are Configured!
noRelay.titleFail=No Working Relays Available!
noRelay.noRelay1=LAN Unavailable: No Relays Configured! noRelay.noRelay1=LAN Unavailable: No Relays Configured!
noRelay.noRelay2=Click '§nNetwork Settings§r' to fix noRelay.noRelay2=Click '§nNetwork Settings§r' to fix
noRelay.worldNotFound1=Could not locate '§c$code$§r'!
noRelay.worldNotFound2=Make sure to add the '§f$code$§r' world's relay URL
noRelay.worldNotFound3=to the relay list 'Network Settings' to connect
noRelay.worldFail=Failed to connect to '$code$'!
multiplayer.title=Play Multiplayer multiplayer.title=Play Multiplayer
multiplayer.connect=Connect multiplayer.connect=Connect

View File

@ -114,9 +114,13 @@ public class EaglerSPRelay extends WebSocketServer {
logger.info("Shutting down..."); logger.info("Shutting down...");
instance.stop(); instance.stop();
System.exit(0); System.exit(0);
}else if(s.equalsIgnoreCase("reset")) {
logger.info("Clearing all ratelimits");
if(pingRateLimiter != null) pingRateLimiter.reset();
if(worldRateLimiter != null) worldRateLimiter.reset();
}else { }else {
logger.info("Unknown command: {}", s); logger.info("Unknown command: {}", s);
logger.info("Type 'stop' to exit, 'reload' to reload config"); logger.info("Type 'stop' to exit" + ((worldRateLimiter != null || pingRateLimiter != null) ? ", 'reset' to clear ratelimits" : ""));
} }
} }
@ -149,7 +153,7 @@ public class EaglerSPRelay extends WebSocketServer {
@Override @Override
public void onStart() { public void onStart() {
logger.info("Listening on {}", getAddress()); logger.info("Listening on {}", getAddress());
logger.info("Type 'stop' to exit"); logger.info("Type 'stop' to exit" + ((worldRateLimiter != null || pingRateLimiter != null) ? ", 'reset' to clear ratelimits" : ""));
} }
@Override @Override
@ -284,6 +288,9 @@ public class EaglerSPRelay extends WebSocketServer {
"The join code is the wrong length, it should be " + config.getCodeLength() + " chars long"))); "The join code is the wrong length, it should be " + config.getCodeLength() + " chars long")));
arg0.close(); arg0.close();
}else { }else {
if(!config.isCodeMixCase()) {
code = code.toLowerCase();
}
EaglerSPServer srv; EaglerSPServer srv;
synchronized(serverCodes) { synchronized(serverCodes) {
srv = serverCodes.get(code); srv = serverCodes.get(code);
@ -424,6 +431,7 @@ public class EaglerSPRelay extends WebSocketServer {
synchronized(clientConnections) { synchronized(clientConnections) {
cl = clientConnections.remove(arg0); cl = clientConnections.remove(arg0);
} }
if(cl != null) {
synchronized(clientAddressSets) { synchronized(clientAddressSets) {
List<EaglerSPClient> lst = clientAddressSets.get(cl.address); List<EaglerSPClient> lst = clientAddressSets.get(cl.address);
if(lst != null) { if(lst != null) {
@ -433,21 +441,20 @@ public class EaglerSPRelay extends WebSocketServer {
} }
} }
} }
if(cl != null) {
logger.debug("[{}]: Client closed, id: {}", (String) arg0.getAttachment(), cl.id); logger.debug("[{}]: Client closed, id: {}", (String) arg0.getAttachment(), cl.id);
synchronized(clientIds) { synchronized(clientIds) {
clientIds.remove(cl.id); clientIds.remove(cl.id);
} }
cl.server.handleClientDisconnect(cl); cl.server.handleClientDisconnect(cl);
}else { }else {
logger.debug("[{}]: Connection Closed: {} ", (String) arg0.getAttachment()); logger.debug("[{}]: Connection Closed", (String) arg0.getAttachment());
} }
} }
} }
@Override @Override
public void onError(WebSocket arg0, Exception arg1) { public void onError(WebSocket arg0, Exception arg1) {
logger.error("[{}]: Exception thrown: {}", (String) arg0.getAttachment(), arg1.toString()); logger.error("[{}]: Exception thrown: {}", (arg0 == null ? "SERVER" : (String) arg0.getAttachment()), arg1.toString());
logger.debug(arg1); logger.debug(arg1);
arg0.close(); arg0.close();
} }

View File

@ -15,7 +15,7 @@ public class EaglerSPRelayConfig {
private String address = "0.0.0.0"; private String address = "0.0.0.0";
private int port = 6699; private int port = 6699;
private int codeLength = 5; private int codeLength = 5;
private String codeChars = "abcdefghijklmnopqrstuvwxyz0123456789$%&*+?!"; private String codeChars = "abcdefghijklmnopqrstuvwxyz0123456789";
private boolean codeMixCase = false; private boolean codeMixCase = false;
private int connectionsPerIP = 128; private int connectionsPerIP = 128;
@ -60,8 +60,10 @@ public class EaglerSPRelayConfig {
try(BufferedReader reader = new BufferedReader(new FileReader(conf))) { try(BufferedReader reader = new BufferedReader(new FileReader(conf))) {
String s; String s;
while((s = reader.readLine()) != null) { while((s = reader.readLine()) != null) {
String[] ss = s.trim().split("=", 2); String[] ss = s.trim().split(":", 2);
if(ss.length == 2) { if(ss.length == 2) {
ss[0] = ss[0].trim();
ss[1] = ss[1].trim();
if(ss[0].equalsIgnoreCase("port")) { if(ss[0].equalsIgnoreCase("port")) {
try { try {
port = Integer.parseInt(ss[1]); port = Integer.parseInt(ss[1]);
@ -278,26 +280,27 @@ public class EaglerSPRelayConfig {
public void save(File conf) { public void save(File conf) {
try(PrintWriter w = new PrintWriter(new FileOutputStream(conf))) { try(PrintWriter w = new PrintWriter(new FileOutputStream(conf))) {
w.println("address=" + address); w.println("[EaglerSPRelay]");
w.println("port=" + port); w.println("address: " + address);
w.println("code-length=" + codeLength); w.println("port: " + port);
w.println("code-chars=" + codeChars); w.println("code-length: " + codeLength);
w.println("code-mix-case=" + codeMixCase); w.println("code-chars: " + codeChars);
w.println("connections-per-ip=" + connectionsPerIP); w.println("code-mix-case: " + codeMixCase);
w.println("ping-ratelimit-enable=" + pingRateLimitEnable); w.println("connections-per-ip: " + connectionsPerIP);
w.println("ping-ratelimit-period=" + pingRateLimitPeriod); w.println("ping-ratelimit-enable: " + pingRateLimitEnable);
w.println("ping-ratelimit-limit=" + pingRateLimitLimit); w.println("ping-ratelimit-period: " + pingRateLimitPeriod);
w.println("ping-ratelimit-lockout-limit=" + pingRateLimitLockoutLimit); w.println("ping-ratelimit-limit: " + pingRateLimitLimit);
w.println("ping-ratelimit-lockout-duration=" + pingRateLimitLockoutDuration); w.println("ping-ratelimit-lockout-limit: " + pingRateLimitLockoutLimit);
w.println("worlds-per-ip=" + worldsPerIP); w.println("ping-ratelimit-lockout-duration: " + pingRateLimitLockoutDuration);
w.println("world-ratelimit-enable=" + openRateLimitEnable); w.println("worlds-per-ip: " + worldsPerIP);
w.println("world-ratelimit-period=" + openRateLimitPeriod); w.println("world-ratelimit-enable: " + openRateLimitEnable);
w.println("world-ratelimit-limit=" + openRateLimitLimit); w.println("world-ratelimit-period: " + openRateLimitPeriod);
w.println("world-ratelimit-lockout-limit=" + openRateLimitLockoutLimit); w.println("world-ratelimit-limit: " + openRateLimitLimit);
w.println("world-ratelimit-lockout-duration=" + openRateLimitLockoutDuration); w.println("world-ratelimit-lockout-limit: " + openRateLimitLockoutLimit);
w.println("origin-whitelist=" + originWhitelist); w.println("world-ratelimit-lockout-duration: " + openRateLimitLockoutDuration);
w.println("enable-real-ip-header=" + enableRealIpHeader); w.println("origin-whitelist: " + originWhitelist);
w.print("server-comment=" + serverComment); w.println("enable-real-ip-header: " + enableRealIpHeader);
w.print("server-comment: " + serverComment);
}catch(IOException t) { }catch(IOException t) {
EaglerSPRelay.logger.error("Failed to write config file: {}", conf.getAbsoluteFile()); EaglerSPRelay.logger.error("Failed to write config file: {}", conf.getAbsoluteFile());
EaglerSPRelay.logger.error(t); EaglerSPRelay.logger.error(t);

View File

@ -89,7 +89,7 @@ public class IPacket {
if(j < 0) { if(j < 0) {
return null; return null;
} }
ret[i] = (char)is.read(); ret[i] = (char)j;
} }
return new String(ret); return new String(ret);
} }

View File

@ -1,26 +0,0 @@
package net.minecraft.src;
import net.minecraft.server.MinecraftServer;
public class CommandServerPublishLocal extends CommandBase {
public String getCommandName() {
return "publish";
}
/**
* Return the required permission level for this command.
*/
public int getRequiredPermissionLevel() {
return 4;
}
public void processCommand(ICommandSender par1ICommandSender, String[] par2ArrayOfStr) {
String var3 = MinecraftServer.getServer().shareToLAN(EnumGameType.SURVIVAL, false);
if (var3 != null) {
notifyAdmins(par1ICommandSender, "commands.publish.started", new Object[] { var3 });
} else {
notifyAdmins(par1ICommandSender, "commands.publish.failed", new Object[0]);
}
}
}

View File

@ -29,7 +29,6 @@ public class ServerCommandManager extends CommandHandler implements IAdminComman
this.registerCommand(new CommandClearInventory()); this.registerCommand(new CommandClearInventory());
this.registerCommand(new ServerCommandTestFor()); this.registerCommand(new ServerCommandTestFor());
this.registerCommand(new ServerCommandScoreboard()); this.registerCommand(new ServerCommandScoreboard());
this.registerCommand(new CommandServerPublishLocal());
CommandBase.setAdminCommander(this); CommandBase.setAdminCommander(this);
} }

View File

@ -37,9 +37,9 @@ public class GuiScreenAddRelay extends GuiScreen {
this.buttonList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 120 + 12 + sslOff, var1.translateKey("gui.cancel"))); this.buttonList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 120 + 12 + sslOff, var1.translateKey("gui.cancel")));
this.buttonList.add(new GuiButton(2, this.width / 2 - 100, 142, var1.translateKey("addRelay.primary") + ": " + var1.translateKey("gui.no"))); this.buttonList.add(new GuiButton(2, this.width / 2 - 100, 142, var1.translateKey("addRelay.primary") + ": " + var1.translateKey("gui.no")));
this.serverName = new GuiTextField(this.fontRenderer, this.width / 2 - 100, 106, 200, 20); this.serverName = new GuiTextField(this.fontRenderer, this.width / 2 - 100, 106, 200, 20);
this.serverName.setFocused(true);
this.serverAddress = new GuiTextField(this.fontRenderer, this.width / 2 - 100, 66, 200, 20); this.serverAddress = new GuiTextField(this.fontRenderer, this.width / 2 - 100, 66, 200, 20);
this.serverAddress.setMaxStringLength(128); this.serverAddress.setMaxStringLength(128);
this.serverAddress.setFocused(true);
((GuiButton) this.buttonList.get(0)).enabled = this.serverAddress.getText().length() > 0 && this.serverAddress.getText().split(":").length > 0 && this.serverName.getText().length() > 0; ((GuiButton) this.buttonList.get(0)).enabled = this.serverAddress.getText().length() > 0 && this.serverAddress.getText().split(":").length > 0 && this.serverName.getText().length() > 0;
this.parentGui.addNewName = IntegratedServer.relayManager.makeNewRelayName(); this.parentGui.addNewName = IntegratedServer.relayManager.makeNewRelayName();
this.parentGui.addNewAddr = ""; this.parentGui.addNewAddr = "";

View File

@ -0,0 +1,71 @@
package net.lax1dude.eaglercraft;
import net.minecraft.client.Minecraft;
import net.minecraft.src.GuiButton;
import net.minecraft.src.GuiScreen;
import net.minecraft.src.GuiSlider2;
import net.minecraft.src.StringTranslate;
public class GuiScreenChangeRelayTimeout extends GuiScreen {
private GuiScreen parent;
private GuiSlider2 slider;
private String title;
public GuiScreenChangeRelayTimeout(GuiScreen parent) {
this.parent = parent;
}
public void initGui() {
StringTranslate ts = StringTranslate.getInstance();
title = ts.translateKey("networkSettings.relayTimeoutTitle");
buttonList.clear();
buttonList.add(new GuiButton(0, width / 2 - 100, height / 3 + 55, ts.translateKey("gui.cancel")));
buttonList.add(new GuiButton(1, width / 2 - 100, height / 3 + 85, ts.translateKey("gui.done")));
slider = new GuiSlider2(0, width / 2 - 100, height / 3 + 10, 200, 20, (mc.gameSettings.relayTimeout - 1) / 14.0f, 1.0f) {
public boolean mousePressed(Minecraft par1Minecraft, int par2, int par3) {
if(super.mousePressed(par1Minecraft, par2, par3)) {
this.displayString = "" + (int)((sliderValue * 14.0f) + 1.0f) + "s";
return true;
}else {
return false;
}
}
public void mouseDragged(Minecraft par1Minecraft, int par2, int par3) {
super.mouseDragged(par1Minecraft, par2, par3);
this.displayString = "" + (int)((sliderValue * 14.0f) + 1.0f) + "s";
}
};
slider.displayString = "" + mc.gameSettings.relayTimeout + "s";
}
public void actionPerformed(GuiButton btn) {
if(btn.id == 0) {
mc.displayGuiScreen(parent);
}else if(btn.id == 1) {
mc.gameSettings.relayTimeout = (int)((slider.sliderValue * 14.0f) + 1.0f);
mc.gameSettings.saveOptions();
mc.displayGuiScreen(parent);
}
}
public void drawScreen(int par1, int par2, float par3) {
drawDefaultBackground();
drawCenteredString(fontRenderer, title, width / 2, height / 3 - 20, 0xFFFFFF);
slider.drawButton(mc, par1, par2);
super.drawScreen(par1, par2, par3);
}
public void mouseClicked(int mx, int my, int button) {
slider.mousePressed(mc, mx, my);
super.mouseClicked(mx, my, button);
}
public void mouseMovedOrUp(int par1, int par2, int par3) {
if(par3 == 0) {
slider.mouseReleased(par1, par2);
}
super.mouseMovedOrUp(par1, par2, par3);
}
}

View File

@ -37,7 +37,7 @@ public class GuiScreenConnectOption extends GuiScreen {
}else if(par1GuiButton.id == 2) { }else if(par1GuiButton.id == 2) {
GuiScreen scn = new GuiScreenLANConnect(guiScreen); GuiScreen scn = new GuiScreenLANConnect(guiScreen);
if(IntegratedServer.relayManager.count() == 0) { if(IntegratedServer.relayManager.count() == 0) {
mc.displayGuiScreen(new GuiScreenNoRelays(guiScreen)); mc.displayGuiScreen(new GuiScreenNoRelays(guiScreen, "noRelay.title"));
}else { }else {
mc.displayGuiScreen(scn); mc.displayGuiScreen(scn);
} }

View File

@ -28,17 +28,17 @@ public class GuiScreenLANConnect extends GuiScreen {
this.codeTextField.setMaxStringLength(48); this.codeTextField.setMaxStringLength(48);
this.codeTextField.setFocused(true); this.codeTextField.setFocused(true);
this.codeTextField.setText(lastCode); this.codeTextField.setText(lastCode);
((GuiButton) this.buttonList.get(0)).enabled = this.codeTextField.getText().length() > 0; ((GuiButton) this.buttonList.get(0)).enabled = this.codeTextField.getText().trim().length() > 0;
} }
public void onGuiClosed() { public void onGuiClosed() {
EaglerAdapter.enableRepeatEvents(false); EaglerAdapter.enableRepeatEvents(false);
lastCode = this.codeTextField.getText(); lastCode = this.codeTextField.getText().trim();
} }
protected void keyTyped(char par1, int par2) { protected void keyTyped(char par1, int par2) {
if (this.codeTextField.textboxKeyTyped(par1, par2)) { if (this.codeTextField.textboxKeyTyped(par1, par2)) {
((GuiButton) this.buttonList.get(0)).enabled = this.codeTextField.getText().length() > 0; ((GuiButton) this.buttonList.get(0)).enabled = this.codeTextField.getText().trim().length() > 0;
} else if (par2 == 28) { } else if (par2 == 28) {
this.actionPerformed((GuiButton) this.buttonList.get(0)); this.actionPerformed((GuiButton) this.buttonList.get(0));
} }
@ -67,6 +67,8 @@ public class GuiScreenLANConnect extends GuiScreen {
protected void actionPerformed(GuiButton par1GuiButton) { protected void actionPerformed(GuiButton par1GuiButton) {
if(par1GuiButton.id == 1) { if(par1GuiButton.id == 1) {
mc.displayGuiScreen(parent); mc.displayGuiScreen(parent);
}else if(par1GuiButton.id == 0) {
mc.displayGuiScreen(new GuiScreenLANConnecting(parent, this.codeTextField.getText().trim()));
} }
} }

View File

@ -0,0 +1,67 @@
package net.lax1dude.eaglercraft;
import java.io.IOException;
import net.minecraft.src.GuiDisconnected;
import net.minecraft.src.GuiScreen;
import net.minecraft.src.LoadingScreenRenderer;
import net.minecraft.src.NetClientHandler;
import net.minecraft.src.Packet2ClientProtocol;
import net.minecraft.src.StringTranslate;
public class GuiScreenLANConnecting extends GuiScreen {
private final GuiScreen parent;
private final String code;
private boolean completed = false;
public GuiScreenLANConnecting(GuiScreen parent, String code) {
this.parent = parent;
this.code = code;
}
public boolean doesGuiPauseGame() {
return false;
}
public void drawScreen(int par1, int par2, float par3) {
this.drawDefaultBackground();
StringTranslate st = StringTranslate.getInstance();
if(completed) {
String message = st.translateKey("connect.authorizing");
this.drawString(fontRenderer, message, (this.width - this.fontRenderer.getStringWidth(message)) / 2, this.height / 3 + 10, 0xFFFFFF);
}else {
LoadingScreenRenderer ls = mc.loadingScreen;
String message = st.translateKey("lanServer.pleaseWait");
this.drawString(fontRenderer, message, (this.width - this.fontRenderer.getStringWidth(message)) / 2, this.height / 3 + 10, 0xFFFFFF);
RelayServerSocket sock = IntegratedServer.relayManager.getWorkingRelay((str) -> ls.resetProgresAndWorkingMessage("Connecting: " + str), 0x02, code);
if(sock == null) {
this.mc.displayGuiScreen(new GuiScreenNoRelays(parent, st.translateKey("noRelay.worldNotFound1").replace("$code$", code),
st.translateKey("noRelay.worldNotFound2").replace("$code$", code), st.translateKey("noRelay.worldNotFound3")));
return;
}
LANClientNetworkManager netMgr = LANClientNetworkManager.connectToWorld(sock, code, sock.getURI());
if(netMgr == null) {
this.mc.displayGuiScreen(new GuiDisconnected(parent, "connect.failed", "disconnect.genericReason", "noRelay.worldFail", ""));
return;
}
completed = true;
try {
NetClientHandler netHandler = new NetClientHandler(mc, netMgr);
this.mc.setNetManager(netMgr);
netHandler.addToSendQueue(new Packet2ClientProtocol(61, EaglerProfile.username, "127.0.0.1", mc.gameSettings.renderDistance));
} catch (IOException e) {
this.mc.displayGuiScreen(new GuiDisconnected(parent, "connect.failed", "disconnect.genericReason", "could not create nethandler", ""));
e.printStackTrace();
return;
}
}
}
}

View File

@ -7,9 +7,22 @@ import net.minecraft.src.StringTranslate;
public class GuiScreenNoRelays extends GuiScreen { public class GuiScreenNoRelays extends GuiScreen {
private GuiScreen parent; private GuiScreen parent;
private String title1;
private String title2;
private String title3;
public GuiScreenNoRelays(GuiScreen parent) { public GuiScreenNoRelays(GuiScreen parent, String title) {
this.parent = parent; this.parent = parent;
this.title1 = title;
this.title2 = null;
this.title3 = null;
}
public GuiScreenNoRelays(GuiScreen parent, String title1, String title2, String title3) {
this.parent = parent;
this.title1 = title1;
this.title2 = title2;
this.title3 = title3;
} }
public void initGui() { public void initGui() {
@ -22,7 +35,13 @@ public class GuiScreenNoRelays extends GuiScreen {
public void drawScreen(int par1, int par2, float par3) { public void drawScreen(int par1, int par2, float par3) {
StringTranslate var4 = StringTranslate.getInstance(); StringTranslate var4 = StringTranslate.getInstance();
this.drawDefaultBackground(); this.drawDefaultBackground();
this.drawCenteredString(this.fontRenderer, var4.translateKey("noRelay.title"), this.width / 2, this.height / 4 - 60 + 70, 16777215); this.drawCenteredString(this.fontRenderer, var4.translateKey(title1), this.width / 2, this.height / 4 - 60 + 70, 16777215);
if(title2 != null) {
this.drawCenteredString(this.fontRenderer, var4.translateKey(title2), this.width / 2, this.height / 4 - 60 + 80, 0xCCCCCC);
}
if(title3 != null) {
this.drawCenteredString(this.fontRenderer, var4.translateKey(title3), this.width / 2, this.height / 4 - 60 + 90, 0xCCCCCC);
}
super.drawScreen(par1, par2, par3); super.drawScreen(par1, par2, par3);
} }

View File

@ -22,6 +22,8 @@ public class GuiScreenRelay extends GuiScreen {
private String tooltipString = null; private String tooltipString = null;
private long lastRefresh = 0l;
public GuiScreenRelay(GuiScreen screen) { public GuiScreenRelay(GuiScreen screen) {
this.screen = screen; this.screen = screen;
} }
@ -56,6 +58,7 @@ public class GuiScreenRelay extends GuiScreen {
public void actionPerformed(GuiButton btn) { public void actionPerformed(GuiButton btn) {
if(btn.id == 0) { if(btn.id == 0) {
IntegratedServer.relayManager.save();
mc.displayGuiScreen(screen); mc.displayGuiScreen(screen);
} else if(btn.id == 1) { } else if(btn.id == 1) {
addingNew = true; addingNew = true;
@ -74,9 +77,20 @@ public class GuiScreenRelay extends GuiScreen {
selected = 0; selected = 0;
} }
} else if(btn.id == 4) { } else if(btn.id == 4) {
long millis = System.currentTimeMillis();
if(millis - lastRefresh > 700l) {
lastRefresh = millis;
slots.relayManager.ping(); slots.relayManager.ping();
}
lastRefresh += 60l;
} else if(btn.id == 5) { } else if(btn.id == 5) {
slots.relayManager.loadDefaults(); slots.relayManager.loadDefaults();
long millis = System.currentTimeMillis();
if(millis - lastRefresh > 700l) {
lastRefresh = millis;
slots.relayManager.ping();
}
lastRefresh += 60l;
} }
} }
@ -110,10 +124,39 @@ public class GuiScreenRelay extends GuiScreen {
tooltipString = null; tooltipString = null;
} }
this.drawCenteredString(this.fontRenderer, var4.translateKey("networkSettings.title"), this.width / 2, 16, 16777215); this.drawCenteredString(fontRenderer, var4.translateKey("networkSettings.title"), this.width / 2, 16, 16777215);
String str = var4.translateKey("networkSettings.relayTimeout") + " " + mc.gameSettings.relayTimeout;
int w = fontRenderer.getStringWidth(str);
this.drawString(fontRenderer, str, 3, 3, 0xDDDDDD);
EaglerAdapter.glPushMatrix();
EaglerAdapter.glTranslatef(w + 7, 4, 0.0f);
EaglerAdapter.glScalef(0.75f, 0.75f, 0.75f);
str = EnumChatFormatting.UNDERLINE + var4.translateKey("networkSettings.relayTimeoutChange");
int w2 = fontRenderer.getStringWidth(str);
boolean b = par1 > w + 5 && par1 < w + 7 + w2 * 3 / 4 && par2 > 3 && par2 < 11;
this.drawString(fontRenderer, EnumChatFormatting.UNDERLINE + var4.translateKey("networkSettings.relayTimeoutChange"), 0, 0, b ? 0xCCCCCC : 0x999999);
EaglerAdapter.glPopMatrix();
super.drawScreen(par1, par2, par3); super.drawScreen(par1, par2, par3);
} }
protected void mouseClicked(int par1, int par2, int par3) {
super.mouseClicked(par1, par2, par3);
if(par3 == 0) {
StringTranslate var4 = StringTranslate.getInstance();
String str = var4.translateKey("networkSettings.relayTimeout") + " " + mc.gameSettings.relayTimeout;
int w = fontRenderer.getStringWidth(str);
str = var4.translateKey("networkSettings.relayTimeoutChange");
int w2 = fontRenderer.getStringWidth(str);
if(par1 > w + 5 && par1 < w + 7 + w2 * 3 / 4 && par2 > 3 && par2 < 11) {
this.mc.displayGuiScreen(new GuiScreenChangeRelayTimeout(this));
this.mc.sndManager.playSoundFX("random.click", 1.0F, 1.0F);
}
}
}
void setToolTip(String str) { void setToolTip(String str) {
tooltipString = str; tooltipString = str;
} }

View File

@ -120,6 +120,7 @@ public class IntegratedServer {
statusState = IntegratedState.WORLD_UNLOADING; statusState = IntegratedState.WORLD_UNLOADING;
sendIPCPacket(new IPCPacket01StopServer()); sendIPCPacket(new IPCPacket01StopServer());
} }
IntegratedServerLAN.closeLAN();
} }
public static void autoSave() { public static void autoSave() {
@ -258,6 +259,9 @@ public class IntegratedServer {
public static void processICP() { public static void processICP() {
if(!EaglerAdapter.isIntegratedServerAlive()) { if(!EaglerAdapter.isIntegratedServerAlive()) {
if(IntegratedServerLAN.isHostingLAN()) {
IntegratedServerLAN.closeLAN();
}
return; return;
} }
@ -389,6 +393,10 @@ public class IntegratedServer {
t.printStackTrace(); t.printStackTrace();
} }
} }
if(IntegratedServerLAN.isHostingLAN()) {
IntegratedServerLAN.updateLANServer();
}
} }
public static void sendIPCPacket(IPCPacketBase pkt) { public static void sendIPCPacket(IPCPacketBase pkt) {

View File

@ -13,7 +13,10 @@ public class IntegratedServerLAN {
private static RelayServerSocket lanRelaySocket = null; private static RelayServerSocket lanRelaySocket = null;
private static String currentCode = null;
public static String shareToLAN(Consumer<String> progressCallback, String worldName, boolean worldHidden) { public static String shareToLAN(Consumer<String> progressCallback, String worldName, boolean worldHidden) {
currentCode = null;
RelayServerSocket sock = IntegratedServer.relayManager.getWorkingRelay((str) -> progressCallback.accept("Connecting: " + str), RelayServerSocket sock = IntegratedServer.relayManager.getWorkingRelay((str) -> progressCallback.accept("Connecting: " + str),
IntegratedServer.preferredRelayVersion, worldName + (worldHidden ? ";1" : ";0")); IntegratedServer.preferredRelayVersion, worldName + (worldHidden ? ";1" : ";0"));
if(sock == null) { if(sock == null) {
@ -45,7 +48,7 @@ public class IntegratedServerLAN {
servers.add(srv.getICEString()); servers.add(srv.getICEString());
} }
EaglerAdapter.serverLANInitializeServer(servers.toArray(new String[servers.size()])); EaglerAdapter.serverLANInitializeServer(servers.toArray(new String[servers.size()]));
return code; return currentCode = code;
}else { }else {
System.err.println("Relay [" + sock.getURI() + "] unexpected packet: " + pkt.getClass().getSimpleName()); System.err.println("Relay [" + sock.getURI() + "] unexpected packet: " + pkt.getClass().getSimpleName());
closeLAN(); closeLAN();
@ -63,10 +66,19 @@ public class IntegratedServerLAN {
} }
} }
public static String getCurrentURI() {
return lanRelaySocket == null ? "<disconnected>" : lanRelaySocket.getURI();
}
public static String getCurrentCode() {
return currentCode == null ? "<undefined>" : currentCode;
}
public static void closeLAN() { public static void closeLAN() {
if(lanRelaySocket != null) { if(lanRelaySocket != null) {
lanRelaySocket.close(); lanRelaySocket.close();
lanRelaySocket = null; lanRelaySocket = null;
currentCode = null;
} }
cleanupLAN(); cleanupLAN();
} }
@ -142,6 +154,7 @@ public class IntegratedServerLAN {
} }
if(lanRelaySocket.isClosed()) { if(lanRelaySocket.isClosed()) {
lanRelaySocket = null; lanRelaySocket = null;
currentCode = null;
cleanupLAN(); cleanupLAN();
}else { }else {
Iterator<LANClient> itr = clients.values().iterator(); Iterator<LANClient> itr = clients.values().iterator();

View File

@ -39,7 +39,7 @@ public class LANClientNetworkManager implements INetworkManager {
public static LANClientNetworkManager connectToWorld(RelayServerSocket sock, String displayCode, String displayRelay) { public static LANClientNetworkManager connectToWorld(RelayServerSocket sock, String displayCode, String displayRelay) {
EaglerAdapter.clearLANClientState(); EaglerAdapter.clearLANClientState();
int connectState = -1; int connectState = PRE;
IPacket pkt; IPacket pkt;
mainLoop: while(!sock.isClosed()) { mainLoop: while(!sock.isClosed()) {
if((pkt = sock.readPacket()) != null) { if((pkt = sock.readPacket()) != null) {
@ -245,10 +245,20 @@ public class LANClientNetworkManager implements INetworkManager {
@Override @Override
public void processReadPackets() { public void processReadPackets() {
/*
* Alright some really weird shit is up with TeaVM here, if you put the try/catch
* around the full inner body of the while loop, the compiler fails with no error
* message, just a vague stack trace. But making a multi-catch around just
* readPacketData and processPacket has no issues
*
* You'e welcome for the two hours of my time and single line changes I made
* in a fuck ton of irrelevant files leading up to this bullshit revelation
*/
if(this.theNetHandler != null) { if(this.theNetHandler != null) {
byte[] data; byte[] data;
while((data = EaglerAdapter.clientLANReadPacket()) != null) { while((data = EaglerAdapter.clientLANReadPacket()) != null) {
try {
ByteArrayInputStream bai = new ByteArrayInputStream(data); ByteArrayInputStream bai = new ByteArrayInputStream(data);
int pktId = bai.read(); int pktId = bai.read();
@ -264,18 +274,15 @@ public class LANClientNetworkManager implements INetworkManager {
continue; continue;
} }
pkt.readPacketData(new DataInputStream(bai));
try { try {
pkt.readPacketData(new DataInputStream(bai));
pkt.processPacket(theNetHandler); pkt.processPacket(theNetHandler);
}catch(IOException ex) {
System.err.println("Could not deserialize a " + data.length + " byte long minecraft packet of type '" + (data.length <= 0 ? -1 : (int)(data[0] & 0xFF)) + "' from remote LAN world");
}catch(Throwable t) { }catch(Throwable t) {
System.err.println("Could not process minecraft packet 0x" + Integer.toHexString(pkt.getPacketId()) + " class '" + pkt.getClass().getSimpleName() + "' from remote LAN world"); System.err.println("Could not process minecraft packet 0x" + Integer.toHexString(pkt.getPacketId()) + " class '" + pkt.getClass().getSimpleName() + "' from remote LAN world");
t.printStackTrace(); t.printStackTrace();
} }
}catch(IOException ex) {
System.err.println("Could not deserialize a " + data.length + " byte long minecraft packet of type '" + (data.length <= 0 ? -1 : (int)(data[0] & 0xFF)) + "' from remote LAN world");
}
} }
} }
} }

View File

@ -1,6 +1,7 @@
package net.lax1dude.eaglercraft; package net.lax1dude.eaglercraft;
import net.lax1dude.eaglercraft.RelayQuery.VersionMismatch; import net.lax1dude.eaglercraft.RelayQuery.VersionMismatch;
import net.minecraft.client.Minecraft;
public class RelayServer { public class RelayServer {
@ -114,7 +115,7 @@ public class RelayServer {
} }
public RelayServerSocket openSocket() { public RelayServerSocket openSocket() {
return EaglerAdapter.openRelayConnection(address); return EaglerAdapter.openRelayConnection(address, Minecraft.getMinecraft().gameSettings.relayTimeout * 1000);
} }
} }

View File

@ -85,7 +85,7 @@ public class IPacket {
if(j < 0) { if(j < 0) {
return null; return null;
} }
ret[i] = (char)is.read(); ret[i] = (char)j;
} }
return new String(ret); return new String(ret);
} }

View File

@ -36,7 +36,7 @@ public class IPacket00Handshake extends IPacket {
@Override @Override
public int packetLength() { public int packetLength() {
return 1 + (connectionCode != null ? 1 + connectionCode.length() : 0); return 1 + 1 + (connectionCode != null ? 1 + connectionCode.length() : 0);
} }
} }

View File

@ -13,6 +13,7 @@ import net.lax1dude.eaglercraft.GuiScreenSingleplayerConnecting;
import net.lax1dude.eaglercraft.GuiScreenSingleplayerLoading; import net.lax1dude.eaglercraft.GuiScreenSingleplayerLoading;
import net.lax1dude.eaglercraft.GuiVoiceOverlay; import net.lax1dude.eaglercraft.GuiVoiceOverlay;
import net.lax1dude.eaglercraft.IntegratedServer; import net.lax1dude.eaglercraft.IntegratedServer;
import net.lax1dude.eaglercraft.IntegratedServerLAN;
import net.lax1dude.eaglercraft.LocalStorageManager; import net.lax1dude.eaglercraft.LocalStorageManager;
import net.lax1dude.eaglercraft.Voice; import net.lax1dude.eaglercraft.Voice;
import net.lax1dude.eaglercraft.WorkerNetworkManager; import net.lax1dude.eaglercraft.WorkerNetworkManager;
@ -76,6 +77,7 @@ import net.minecraft.src.RenderManager;
import net.minecraft.src.ScaledResolution; import net.minecraft.src.ScaledResolution;
import net.minecraft.src.ServerData; import net.minecraft.src.ServerData;
import net.minecraft.src.SoundManager; import net.minecraft.src.SoundManager;
import net.minecraft.src.StatCollector;
import net.minecraft.src.StatStringFormatKeyInv; import net.minecraft.src.StatStringFormatKeyInv;
import net.minecraft.src.StringTranslate; import net.minecraft.src.StringTranslate;
import net.minecraft.src.TextureManager; import net.minecraft.src.TextureManager;
@ -237,6 +239,8 @@ public class Minecraft implements Runnable {
private int messageOnLoginCounter = 0; private int messageOnLoginCounter = 0;
public boolean lanState = false;
public Minecraft() { public Minecraft() {
this.tempDisplayHeight = 480; this.tempDisplayHeight = 480;
this.fullscreen = false; this.fullscreen = false;
@ -490,26 +494,6 @@ public class Minecraft implements Runnable {
} }
} }
} }
/*
t1 = System.currentTimeMillis();
for(int i = 0; i < 8; i++) {
float f = 1.0f - ((float)(System.currentTimeMillis() - t1) / 136f);
f = 0.25f + f * f * 0.75f;
EaglerAdapter.glClearColor(f, f, f, 1.0F);
EaglerAdapter.glClear(EaglerAdapter.GL_COLOR_BUFFER_BIT | EaglerAdapter.GL_DEPTH_BUFFER_BIT);
EaglerAdapter.glFlush();
EaglerAdapter.updateDisplay();
long t = t1 + 17 + 17*i - System.currentTimeMillis();
if(t > 0) {
try {
Thread.sleep(t);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
*/
EaglerAdapter.glClear(EaglerAdapter.GL_COLOR_BUFFER_BIT | EaglerAdapter.GL_DEPTH_BUFFER_BIT); EaglerAdapter.glClear(EaglerAdapter.GL_COLOR_BUFFER_BIT | EaglerAdapter.GL_DEPTH_BUFFER_BIT);
showWarningText(); showWarningText();
@ -1155,13 +1139,21 @@ public class Minecraft implements Runnable {
this.mcProfiler.startSection("stats"); this.mcProfiler.startSection("stats");
this.mcProfiler.endStartSection("gui"); this.mcProfiler.endStartSection("gui");
this.isGamePaused = this.isSingleplayer() && this.theWorld != null && this.thePlayer != null && this.currentScreen != null && this.currentScreen.doesGuiPauseGame(); this.isGamePaused = this.isSingleplayer() && this.theWorld != null && this.thePlayer != null && this.currentScreen != null
&& this.currentScreen.doesGuiPauseGame() && !IntegratedServerLAN.isHostingLAN();
if(wasPaused != isGamePaused) { if(wasPaused != isGamePaused) {
IntegratedServer.setPaused(this.isGamePaused); IntegratedServer.setPaused(this.isGamePaused);
wasPaused = isGamePaused; wasPaused = isGamePaused;
} }
if(lanState && !IntegratedServerLAN.isHostingLAN()) {
lanState = false;
if(thePlayer != null) {
thePlayer.sendChatToPlayer(EnumChatFormatting.RED + StatCollector.translateToLocal("lanServer.relayDisconnected"));
}
}
if (!this.isGamePaused) { if (!this.isGamePaused) {
this.ingameGUI.updateTick(); this.ingameGUI.updateTick();
} }
@ -1590,6 +1582,7 @@ public class Minecraft implements Runnable {
if (this.texturePackList.getIsDownloading()) { if (this.texturePackList.getIsDownloading()) {
this.texturePackList.onDownloadFinished(); this.texturePackList.onDownloadFinished();
} }
this.lanState = false;
IntegratedServer.unloadWorld(); IntegratedServer.unloadWorld();
this.setServerData((ServerData) null); this.setServerData((ServerData) null);
this.integratedServerIsRunning = false; this.integratedServerIsRunning = false;
@ -1651,26 +1644,6 @@ public class Minecraft implements Runnable {
this.myNetworkManager = nm; this.myNetworkManager = nm;
} }
/*
public void installResource(String par1Str, File par2File) {
int var3 = par1Str.indexOf("/");
String var4 = par1Str.substring(0, var3);
par1Str = par1Str.substring(var3 + 1);
if (var4.equalsIgnoreCase("sound3")) {
this.sndManager.addSound(par1Str, par2File);
} else if (var4.equalsIgnoreCase("streaming")) {
this.sndManager.addStreaming(par1Str, par2File);
} else if (!var4.equalsIgnoreCase("music") && !var4.equalsIgnoreCase("newmusic")) {
if (var4.equalsIgnoreCase("lang")) {
StringTranslate.getInstance().func_94519_a(par1Str, par2File);
}
} else {
this.sndManager.addMusic(par1Str, par2File);
}
}
*/
/** /**
* A String of renderGlobal.getDebugInfoRenders * A String of renderGlobal.getDebugInfoRenders
*/ */

View File

@ -1,6 +1,7 @@
package net.minecraft.src; package net.minecraft.src;
import net.lax1dude.eaglercraft.EaglerAdapter; import net.lax1dude.eaglercraft.EaglerAdapter;
import net.lax1dude.eaglercraft.IntegratedServer;
import net.lax1dude.eaglercraft.LocalStorageManager; import net.lax1dude.eaglercraft.LocalStorageManager;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@ -141,6 +142,9 @@ public class GameSettings {
public float voiceSpeakVolume = 0.5f; public float voiceSpeakVolume = 0.5f;
public int voicePTTKey = 47; public int voicePTTKey = 47;
public boolean hideJoinCode = false;
public int relayTimeout = 4;
public GameSettings(Minecraft par1Minecraft) { public GameSettings(Minecraft par1Minecraft) {
this.keyBindings = new KeyBinding[] { this.keyBindAttack, this.keyBindUseItem, this.keyBindForward, this.keyBindLeft, this.keyBindBack, this.keyBindRight, this.keyBindJump, this.keyBindSneak, this.keyBindDrop, this.keyBindInventory, this.keyBindings = new KeyBinding[] { this.keyBindAttack, this.keyBindUseItem, this.keyBindForward, this.keyBindLeft, this.keyBindBack, this.keyBindRight, this.keyBindJump, this.keyBindSneak, this.keyBindDrop, this.keyBindInventory,
this.keyBindChat, this.keyBindPlayerList, this.keyBindPickBlock, this.keyBindSprint, this.keyBindZoom, this.keyBindFunction }; this.keyBindChat, this.keyBindPlayerList, this.keyBindPickBlock, this.keyBindSprint, this.keyBindZoom, this.keyBindFunction };
@ -528,6 +532,8 @@ public class GameSettings {
if(yee.hasKey("voicePTTKey")) voicePTTKey = yee.getInteger("voicePTTKey"); if(yee.hasKey("voicePTTKey")) voicePTTKey = yee.getInteger("voicePTTKey");
if(yee.hasKey("voiceListenRadius")) voiceListenRadius = yee.getInteger("voiceListenRadius"); if(yee.hasKey("voiceListenRadius")) voiceListenRadius = yee.getInteger("voiceListenRadius");
if(yee.hasKey("difficulty")) difficulty = yee.getByte("difficulty"); if(yee.hasKey("difficulty")) difficulty = yee.getByte("difficulty");
if(yee.hasKey("hideJoinCode")) hideJoinCode = yee.getBoolean("hideJoinCode");
if(yee.hasKey("relayTimeout")) relayTimeout = yee.getByte("relayTimeout");
if(voiceListenRadius < 5) voiceListenRadius = 5; if(voiceListenRadius < 5) voiceListenRadius = 5;
else if(voiceListenRadius > 22) voiceListenRadius = 22; else if(voiceListenRadius > 22) voiceListenRadius = 22;
@ -541,6 +547,8 @@ public class GameSettings {
} }
KeyBinding.resetKeyBindingArrayAndHash(); KeyBinding.resetKeyBindingArrayAndHash();
IntegratedServer.relayManager.load(LocalStorageManager.gameSettingsStorage.getTagList("relays"));
} }
} }
@ -602,6 +610,8 @@ public class GameSettings {
yee.setInteger("voicePTTKey", voicePTTKey); yee.setInteger("voicePTTKey", voicePTTKey);
yee.setInteger("voiceListenRadius", voiceListenRadius); yee.setInteger("voiceListenRadius", voiceListenRadius);
yee.setByte("difficulty", (byte)difficulty); yee.setByte("difficulty", (byte)difficulty);
yee.setBoolean("hideJoinCode", hideJoinCode);
yee.setByte("relayTimeout", (byte)relayTimeout);
for (int var4 = 0; var4 < this.keyBindings.length; ++var4) { for (int var4 = 0; var4 < this.keyBindings.length; ++var4) {
yee.setInteger(keyBindings[var4].keyDescription, keyBindings[var4].keyCode); yee.setInteger(keyBindings[var4].keyDescription, keyBindings[var4].keyCode);

View File

@ -3,6 +3,7 @@ package net.minecraft.src;
import net.lax1dude.eaglercraft.AbortedException; import net.lax1dude.eaglercraft.AbortedException;
import net.lax1dude.eaglercraft.ConfigConstants; import net.lax1dude.eaglercraft.ConfigConstants;
import net.lax1dude.eaglercraft.EaglerAdapter; import net.lax1dude.eaglercraft.EaglerAdapter;
import net.lax1dude.eaglercraft.GuiScreenNoRelays;
import net.lax1dude.eaglercraft.GuiScreenSkinCapeSettings; import net.lax1dude.eaglercraft.GuiScreenSkinCapeSettings;
import net.lax1dude.eaglercraft.GuiVoiceMenu; import net.lax1dude.eaglercraft.GuiVoiceMenu;
import net.lax1dude.eaglercraft.IntegratedServer; import net.lax1dude.eaglercraft.IntegratedServer;
@ -66,13 +67,20 @@ public class GuiIngameMenu extends GuiScreen {
case 7: case 7:
if (IntegratedServerLAN.isHostingLAN()) { if (IntegratedServerLAN.isHostingLAN()) {
this.mc.lanState = false;
IntegratedServerLAN.closeLAN(); IntegratedServerLAN.closeLAN();
IntegratedServer.configureLAN(this.mc.theWorld.getWorldInfo().getGameType(), false);
this.mc.thePlayer.sendChatToPlayer(StatCollector.translateToLocal("lanServer.closed"));
this.mc.displayGuiScreen((GuiScreen) null); this.mc.displayGuiScreen((GuiScreen) null);
this.mc.setIngameFocus(); this.mc.setIngameFocus();
this.mc.sndManager.resumeAllSounds(); this.mc.sndManager.resumeAllSounds();
} else {
if(IntegratedServer.relayManager.count() == 0) {
this.mc.displayGuiScreen(new GuiScreenNoRelays(this, "noRelay.title"));
}else { }else {
this.mc.displayGuiScreen(new GuiShareToLan(this)); this.mc.displayGuiScreen(new GuiShareToLan(this));
} }
}
break; break;
case 8: case 8:
@ -98,9 +106,9 @@ public class GuiIngameMenu extends GuiScreen {
this.drawDefaultBackground(); this.drawDefaultBackground();
this.drawCenteredString(this.fontRenderer, "Game menu", this.width / 2, 40, 16777215); this.drawCenteredString(this.fontRenderer, "Game menu", this.width / 2, 40, 16777215);
super.drawScreen(par1, par2, par3); super.drawScreen(par1, par2, par3);
StringTranslate var1 = StringTranslate.getInstance();
if(par1 >= 3 && par1 < 123 && par2 >= 3 && par2 < 23) { if(par1 >= 3 && par1 < 123 && par2 >= 3 && par2 < 23) {
int c = 0xCCCC66; int c = 0xCCCC66;
StringTranslate var1 = StringTranslate.getInstance();
EaglerAdapter.glPushMatrix(); EaglerAdapter.glPushMatrix();
EaglerAdapter.glTranslatef(126.0f, 6.0f, 0.0f); EaglerAdapter.glTranslatef(126.0f, 6.0f, 0.0f);
EaglerAdapter.glScalef(0.8f, 0.8f, 0.8f); EaglerAdapter.glScalef(0.8f, 0.8f, 0.8f);
@ -111,6 +119,37 @@ public class GuiIngameMenu extends GuiScreen {
drawString(fontRenderer, "Eaglercraft: " + ConfigConstants.version, 6, 27, 0x999999); drawString(fontRenderer, "Eaglercraft: " + ConfigConstants.version, 6, 27, 0x999999);
if(IntegratedServerLAN.isHostingLAN()) {
String str = var1.translateKey("lanServer.pauseMenu0");
drawString(fontRenderer, str, 6, 52, 0xFFFF55);
if(mc.gameSettings.hideJoinCode) {
EaglerAdapter.glPushMatrix();
EaglerAdapter.glTranslatef(7.0f, 67.0f, 0.0f);
EaglerAdapter.glScalef(0.75f, 0.75f, 0.75f);
str = var1.translateKey("lanServer.showCode");
int w = fontRenderer.getStringWidth(str);
boolean hover = par1 > 6 && par1 < 8 + w * 3 / 4 && par2 > 66 && par2 < 67 + 8;
drawString(fontRenderer, EnumChatFormatting.UNDERLINE + str, 0, 0, hover ? 0xEEEEAA : 0xCCCC55);
EaglerAdapter.glPopMatrix();
}else {
int w = fontRenderer.getStringWidth(str);
EaglerAdapter.glPushMatrix();
EaglerAdapter.glTranslatef(6 + w + 3, 53, 0.0f);
EaglerAdapter.glScalef(0.75f, 0.75f, 0.75f);
str = var1.translateKey("lanServer.hideCode");
int w2 = fontRenderer.getStringWidth(str);
boolean hover = par1 > 6 + w + 2 && par1 < 6 + w + 3 + w2 * 3 / 4 && par2 > 53 - 1 && par2 < 53 + 6;
drawString(fontRenderer, EnumChatFormatting.UNDERLINE + str, 0, 0, hover ? 0xEEEEAA : 0xCCCC55);
EaglerAdapter.glPopMatrix();
drawString(fontRenderer, EnumChatFormatting.GRAY + var1.translateKey("lanServer.pauseMenu1") + " " +
EnumChatFormatting.RESET + IntegratedServerLAN.getCurrentURI(), 6, 67, 0xFFFFFF);
drawString(fontRenderer, EnumChatFormatting.GRAY + var1.translateKey("lanServer.pauseMenu2") + " " +
EnumChatFormatting.RESET + IntegratedServerLAN.getCurrentCode(), 6, 77, 0xFFFFFF);
}
}
try { try {
if(!mc.isSingleplayer()) { if(!mc.isSingleplayer()) {
if(voiceMenu.isBlockingInput()) { if(voiceMenu.isBlockingInput()) {
@ -149,6 +188,30 @@ public class GuiIngameMenu extends GuiScreen {
if(!mc.isSingleplayer()) { if(!mc.isSingleplayer()) {
voiceMenu.mouseClicked(par1, par2, par3); voiceMenu.mouseClicked(par1, par2, par3);
} }
if(par3 == 0) {
StringTranslate var1 = StringTranslate.getInstance();
if(mc.gameSettings.hideJoinCode) {
String str = var1.translateKey("lanServer.showCode");
int w = fontRenderer.getStringWidth(str);
if(par1 > 6 && par1 < 8 + w * 3 / 4 && par2 > 66 && par2 < 67 + 8) {
mc.gameSettings.hideJoinCode = false;
mc.sndManager.playSoundFX("random.click", 1.0F, 1.0F);
mc.gameSettings.saveOptions();
}
}else {
String str = var1.translateKey("lanServer.pauseMenu0");
int w = fontRenderer.getStringWidth(str);
str = var1.translateKey("lanServer.hideCode");
int w2 = fontRenderer.getStringWidth(str);
if(par1 > 6 + w + 2 && par1 < 6 + w + 3 + w2 * 3 / 4 && par2 > 53 - 1 && par2 < 53 + 6) {
mc.gameSettings.hideJoinCode = true;
mc.sndManager.playSoundFX("random.click", 1.0F, 1.0F);
mc.gameSettings.saveOptions();
}
}
}
super.mouseClicked(par1, par2, par3); super.mouseClicked(par1, par2, par3);
}catch(AbortedException ex) { }catch(AbortedException ex) {
} }

View File

@ -1,5 +1,7 @@
package net.minecraft.src; package net.minecraft.src;
import net.lax1dude.eaglercraft.GuiNetworkSettingsButton;
import net.lax1dude.eaglercraft.GuiScreenNoRelays;
import net.lax1dude.eaglercraft.IntegratedServer; import net.lax1dude.eaglercraft.IntegratedServer;
import net.lax1dude.eaglercraft.IntegratedServerLAN; import net.lax1dude.eaglercraft.IntegratedServerLAN;
@ -11,6 +13,7 @@ public class GuiShareToLan extends GuiScreen {
private final GuiScreen parentScreen; private final GuiScreen parentScreen;
private GuiButton buttonAllowCommandsToggle; private GuiButton buttonAllowCommandsToggle;
private GuiButton buttonGameMode; private GuiButton buttonGameMode;
private GuiButton buttonHiddenToggle;
/** /**
* The currently selected game mode. One of 'survival', 'creative', or * The currently selected game mode. One of 'survival', 'creative', or
@ -21,8 +24,15 @@ public class GuiShareToLan extends GuiScreen {
/** True if 'Allow Cheats' is currently enabled */ /** True if 'Allow Cheats' is currently enabled */
private boolean allowCommands; private boolean allowCommands;
private final GuiNetworkSettingsButton relaysButton;
private boolean hiddenToggle;
private GuiTextField codeTextField;
public GuiShareToLan(GuiScreen par1GuiScreen) { public GuiShareToLan(GuiScreen par1GuiScreen) {
this.parentScreen = par1GuiScreen; this.parentScreen = par1GuiScreen;
this.relaysButton = new GuiNetworkSettingsButton(this);
} }
/** /**
@ -34,10 +44,16 @@ public class GuiShareToLan extends GuiScreen {
StatCollector.translateToLocal("lanServer.start"))); StatCollector.translateToLocal("lanServer.start")));
this.buttonList.add(new GuiButton(102, this.width / 2 + 5, this.height - 28, 150, 20, this.buttonList.add(new GuiButton(102, this.width / 2 + 5, this.height - 28, 150, 20,
StatCollector.translateToLocal("gui.cancel"))); StatCollector.translateToLocal("gui.cancel")));
this.buttonList.add(this.buttonGameMode = new GuiButton(104, this.width / 2 - 155, 100, 150, 20, this.buttonList.add(this.buttonGameMode = new GuiButton(104, this.width / 2 - 155, 160, 150, 20,
StatCollector.translateToLocal("selectWorld.gameMode"))); StatCollector.translateToLocal("selectWorld.gameMode")));
this.buttonList.add(this.buttonAllowCommandsToggle = new GuiButton(103, this.width / 2 + 5, 100, 150, 20, this.buttonList.add(this.buttonAllowCommandsToggle = new GuiButton(103, this.width / 2 + 5, 160, 150, 20,
StatCollector.translateToLocal("selectWorld.allowCommands"))); StatCollector.translateToLocal("selectWorld.allowCommands")));
this.buttonList.add(this.buttonHiddenToggle = new GuiButton(105, this.width / 2 - 75, 190, 150, 20,
StatCollector.translateToLocal("lanServer.hidden")));
this.codeTextField = new GuiTextField(this.fontRenderer, this.width / 2 - 100, 100, 200, 20);
this.codeTextField.setText(mc.thePlayer.username + "'s World");
this.codeTextField.setFocused(true);
this.codeTextField.setMaxStringLength(252);
this.func_74088_g(); this.func_74088_g();
} }
@ -46,6 +62,8 @@ public class GuiShareToLan extends GuiScreen {
+ StatCollector.translateToLocal("selectWorld.gameMode." + this.gameMode); + StatCollector.translateToLocal("selectWorld.gameMode." + this.gameMode);
this.buttonAllowCommandsToggle.displayString = StatCollector.translateToLocal("selectWorld.allowCommands") this.buttonAllowCommandsToggle.displayString = StatCollector.translateToLocal("selectWorld.allowCommands")
+ " "; + " ";
this.buttonHiddenToggle.displayString = StatCollector.translateToLocal("lanServer.hidden")
+ " ";
if (this.allowCommands) { if (this.allowCommands) {
this.buttonAllowCommandsToggle.displayString = this.buttonAllowCommandsToggle.displayString this.buttonAllowCommandsToggle.displayString = this.buttonAllowCommandsToggle.displayString
@ -54,6 +72,14 @@ public class GuiShareToLan extends GuiScreen {
this.buttonAllowCommandsToggle.displayString = this.buttonAllowCommandsToggle.displayString this.buttonAllowCommandsToggle.displayString = this.buttonAllowCommandsToggle.displayString
+ StatCollector.translateToLocal("options.off"); + StatCollector.translateToLocal("options.off");
} }
if(this.hiddenToggle) {
this.buttonHiddenToggle.displayString = this.buttonHiddenToggle.displayString
+ StatCollector.translateToLocal("options.on");
} else {
this.buttonHiddenToggle.displayString = this.buttonHiddenToggle.displayString
+ StatCollector.translateToLocal("options.off");
}
} }
/** /**
@ -76,23 +102,29 @@ public class GuiShareToLan extends GuiScreen {
} else if (par1GuiButton.id == 103) { } else if (par1GuiButton.id == 103) {
this.allowCommands = !this.allowCommands; this.allowCommands = !this.allowCommands;
this.func_74088_g(); this.func_74088_g();
} else if (par1GuiButton.id == 104) {
this.hiddenToggle = !this.hiddenToggle;
this.func_74088_g();
} else if (par1GuiButton.id == 101) { } else if (par1GuiButton.id == 101) {
String worldName = this.codeTextField.getText().trim();
if(worldName.length() == 0) {
worldName = mc.thePlayer.username + "'s World";
}
if(worldName.length() >= 252) {
worldName = worldName.substring(0, 252);
}
this.mc.displayGuiScreen((GuiScreen) null); this.mc.displayGuiScreen((GuiScreen) null);
LoadingScreenRenderer ls = mc.loadingScreen; LoadingScreenRenderer ls = mc.loadingScreen;
IntegratedServer.configureLAN(EnumGameType.getByName(this.gameMode), this.allowCommands); IntegratedServer.configureLAN(EnumGameType.getByName(this.gameMode), this.allowCommands);
String code = IntegratedServerLAN.shareToLAN((str) -> ls.displayProgressMessage(str), null, false); String code = IntegratedServerLAN.shareToLAN((str) -> ls.resetProgresAndWorkingMessage(str), worldName, hiddenToggle);
//TODO: handle code success or failure, redirect to relay list on failure, on success store code and relay and display in pause menu
//TODO: must call IntegratedServer.configureLAN(mc.theWorld.getGameType(), false); when world is closed
String var3;
if (code != null) { if (code != null) {
var3 = StatCollector.translateToLocalFormatted("commands.publish.started", code); this.mc.ingameGUI.getChatGUI().printChatMessage(StringTranslate.getInstance().translateKey("lanServer.opened")
.replace("$relay$", IntegratedServerLAN.getCurrentURI()).replace("$code$", code));
this.mc.lanState = true;
} else { } else {
var3 = StatCollector.translateToLocal("commands.publish.failed"); IntegratedServer.configureLAN(mc.theWorld.getWorldInfo().getGameType(), false);
this.mc.displayGuiScreen(new GuiScreenNoRelays(this, "noRelay.titleFail"));
} }
this.mc.ingameGUI.getChatGUI().printChatMessage(var3);
} }
} }
@ -103,8 +135,29 @@ public class GuiShareToLan extends GuiScreen {
this.drawDefaultBackground(); this.drawDefaultBackground();
this.drawCenteredString(this.fontRenderer, StatCollector.translateToLocal("lanServer.title"), this.width / 2, this.drawCenteredString(this.fontRenderer, StatCollector.translateToLocal("lanServer.title"), this.width / 2,
50, 16777215); 50, 16777215);
this.drawCenteredString(this.fontRenderer, StatCollector.translateToLocal("lanServer.worldName"), this.width / 2,
82, 16777215);
this.drawCenteredString(this.fontRenderer, StatCollector.translateToLocal("lanServer.otherPlayers"), this.drawCenteredString(this.fontRenderer, StatCollector.translateToLocal("lanServer.otherPlayers"),
this.width / 2, 82, 16777215); this.width / 2, 142, 16777215);
super.drawScreen(par1, par2, par3); super.drawScreen(par1, par2, par3);
this.relaysButton.drawScreen(par1, par2);
this.codeTextField.drawTextBox();
} }
public void mouseClicked(int par1, int par2, int par3) {
super.mouseClicked(par1, par2, par3);
this.relaysButton.mouseClicked(par1, par2, par3);
this.codeTextField.mouseClicked(par1, par2, par3);
}
protected void keyTyped(char c, int k) {
super.keyTyped(c, k);
this.codeTextField.textboxKeyTyped(c, k);
}
public void updateScreen() {
super.updateScreen();
this.codeTextField.updateCursorCounter();
}
} }

View File

@ -55,6 +55,11 @@ public class NetClientHandler extends NetHandler {
/** RNG. */ /** RNG. */
EaglercraftRandom rand = new EaglercraftRandom(); EaglercraftRandom rand = new EaglercraftRandom();
public NetClientHandler(Minecraft par1Minecraft, INetworkManager mgr) throws IOException {
this.mc = par1Minecraft;
this.netManager = mgr;
}
public NetClientHandler(Minecraft par1Minecraft, String channel) throws IOException { public NetClientHandler(Minecraft par1Minecraft, String channel) throws IOException {
this.mc = par1Minecraft; this.mc = par1Minecraft;
this.netManager = IntegratedServer.openConnection(channel, this); this.netManager = IntegratedServer.openConnection(channel, this);

View File

@ -13,7 +13,6 @@ import org.json.JSONObject;
import net.lax1dude.eaglercraft.Base64; import net.lax1dude.eaglercraft.Base64;
import net.lax1dude.eaglercraft.ConfigConstants; import net.lax1dude.eaglercraft.ConfigConstants;
import net.lax1dude.eaglercraft.EaglerAdapter; import net.lax1dude.eaglercraft.EaglerAdapter;
import net.lax1dude.eaglercraft.IntegratedServer;
import net.lax1dude.eaglercraft.LocalStorageManager; import net.lax1dude.eaglercraft.LocalStorageManager;
import net.lax1dude.eaglercraft.RelayEntry; import net.lax1dude.eaglercraft.RelayEntry;
import net.lax1dude.eaglercraft.ServerQuery.QueryResponse; import net.lax1dude.eaglercraft.ServerQuery.QueryResponse;
@ -164,7 +163,6 @@ public class ServerList {
this.servers.add(dat); this.servers.add(dat);
this.allServers.add(dat); this.allServers.add(dat);
} }
IntegratedServer.relayManager.load(LocalStorageManager.gameSettingsStorage.getTagList("relays"));
} }
/** /**

View File

@ -3467,7 +3467,7 @@ public class EaglerAdapterImpl2 {
private final List<Throwable> exceptions = new LinkedList(); private final List<Throwable> exceptions = new LinkedList();
private final List<IPacket> packets = new LinkedList(); private final List<IPacket> packets = new LinkedList();
private RelayServerSocketImpl(String uri) { private RelayServerSocketImpl(String uri, int timeout) {
this.uri = uri; this.uri = uri;
WebSocket s = null; WebSocket s = null;
try { try {
@ -3525,6 +3525,17 @@ public class EaglerAdapterImpl2 {
closed = true; closed = true;
} }
}); });
Window.setTimeout(new TimerHandler() {
@Override
public void onTimer() {
if(!open && !closed) {
closed = true;
sock.close();
}
}
}, timeout);
} }
@Override @Override
@ -3669,7 +3680,7 @@ public class EaglerAdapterImpl2 {
} }
public static final RelayServerSocket openRelayConnection(String addr) { public static final RelayServerSocket openRelayConnection(String addr, int timeout) {
long millis = System.currentTimeMillis(); long millis = System.currentTimeMillis();
Long l = relayQueryBlocked.get(addr); Long l = relayQueryBlocked.get(addr);
@ -3682,7 +3693,7 @@ public class EaglerAdapterImpl2 {
return new RelayServerSocketRatelimitDummy(RateLimit.BLOCKED); return new RelayServerSocketRatelimitDummy(RateLimit.BLOCKED);
} }
return new RelayServerSocketImpl(addr); return new RelayServerSocketImpl(addr, timeout);
} }
private static EaglercraftLANClient rtcLANClient = null; private static EaglercraftLANClient rtcLANClient = null;
@ -3759,9 +3770,7 @@ public class EaglerAdapterImpl2 {
} }
public static final void clientLANSendPacket(byte[] pkt) { public static final void clientLANSendPacket(byte[] pkt) {
ArrayBuffer arr = ArrayBuffer.create(pkt.length); rtcLANClient.sendPacketToServer(convertToArrayBuffer(pkt));
Uint8Array.create(arr).set(pkt);
rtcLANClient.sendPacketToServer(arr);
} }
public static final byte[] clientLANReadPacket() { public static final byte[] clientLANReadPacket() {