Begin LAN support

Todo: cleanup & consistency (specifically with raw/direct usages of IntegratedServer)
This commit is contained in:
ayunami2000 2022-08-08 11:00:16 -04:00
parent 0b2a351278
commit e0fad18020
14 changed files with 30589 additions and 30447 deletions

11
eaglercraft-sp.iml Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="EclipseModuleManager">
<conelement value="org.eclipse.buildship.core.gradleclasspathcontainer" />
<src_description expected_position="0">
<src_folder value="file://$MODULE_DIR$/src/main/java" expected_position="0" />
<src_folder value="file://$MODULE_DIR$/src/teavm/java" expected_position="1" />
<src_folder value="file://$MODULE_DIR$/sp-server/src/ipc/java" expected_position="2" />
</src_description>
</component>
</module>

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

@ -468,5 +468,5 @@ window.startLANServer = () => {
if(typeof window.constructLANServer !== "function") { if(typeof window.constructLANServer !== "function") {
window.initializeLANServer(); window.initializeLANServer();
} }
return window.constructLANerver(); return window.constructLANServer();
}; };

View File

@ -32,6 +32,7 @@ menu.convertingLevel=Converting world
menu.simulating=Simulating the world for a bit menu.simulating=Simulating the world for a bit
menu.respawning=Respawning menu.respawning=Respawning
menu.shareToLan=Open to LAN menu.shareToLan=Open to LAN
menu.closeLan=Close LAN
menu.skinCapeSettings=Skins/Capes Settings menu.skinCapeSettings=Skins/Capes Settings
menu.skinCapeSettingsNote0=I put the button up here so menu.skinCapeSettingsNote0=I put the button up here so
@ -232,6 +233,7 @@ selectServer.direct=Direct Connect
selectServer.edit=Edit selectServer.edit=Edit
selectServer.delete=Delete selectServer.delete=Delete
selectServer.add=Add server selectServer.add=Add server
selectServer.lan=§3LAN
selectServer.defaultName=Minecraft Server selectServer.defaultName=Minecraft Server
selectServer.deleteQuestion=Are you sure you want to remove this server? selectServer.deleteQuestion=Are you sure you want to remove this server?
selectServer.deleteWarning=will be lost forever! (A long time!) selectServer.deleteWarning=will be lost forever! (A long time!)

View File

@ -6,6 +6,7 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import net.lax1dude.eaglercraft.sp.ipc.*; import net.lax1dude.eaglercraft.sp.ipc.*;
import net.minecraft.src.EnumGameType;
import net.minecraft.src.NBTTagCompound; import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.NetHandler; import net.minecraft.src.NetHandler;
import net.minecraft.src.WorldSettings; import net.minecraft.src.WorldSettings;
@ -426,5 +427,19 @@ public class IntegratedServer {
EaglerAdapter.disableChannel("NET|" + channel); EaglerAdapter.disableChannel("NET|" + channel);
sendIPCPacket(new IPCPacket0CPlayerChannel(channel, false)); sendIPCPacket(new IPCPacket0CPlayerChannel(channel, false));
} }
private static boolean hostingLAN = false;
public static final String shareToLAN(EnumGameType gameType, boolean allowCommands) {
hostingLAN = true;
return "yee";
}
public static final void closeLAN() {
hostingLAN = false;
}
public static final boolean isHostingLAN() {
return hostingLAN;
}
} }

View File

@ -5,6 +5,7 @@ import net.lax1dude.eaglercraft.ConfigConstants;
import net.lax1dude.eaglercraft.EaglerAdapter; import net.lax1dude.eaglercraft.EaglerAdapter;
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.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
public class GuiIngameMenu extends GuiScreen { public class GuiIngameMenu extends GuiScreen {
@ -30,8 +31,8 @@ public class GuiIngameMenu extends GuiScreen {
this.buttonList.add(new GuiButton(4, this.width / 2 - 100, this.height / 4 + 24 + var1, StatCollector.translateToLocal("menu.returnToGame"))); this.buttonList.add(new GuiButton(4, this.width / 2 - 100, this.height / 4 + 24 + var1, StatCollector.translateToLocal("menu.returnToGame")));
this.buttonList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96 + var1, 98, 20, StatCollector.translateToLocal("menu.options"))); this.buttonList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96 + var1, 98, 20, StatCollector.translateToLocal("menu.options")));
GuiButton var3; GuiButton var3;
this.buttonList.add(var3 = new GuiButton(7, this.width / 2 + 2, this.height / 4 + 96 + var1, 98, 20, StatCollector.translateToLocal("menu.shareToLan"))); this.buttonList.add(var3 = new GuiButton(7, this.width / 2 + 2, this.height / 4 + 96 + var1, 98, 20, StatCollector.translateToLocal(IntegratedServer.isHostingLAN() ? "menu.closeLan" : "menu.shareToLan")));
var3.enabled = false; var3.enabled = mc.isSingleplayer();
this.buttonList.add(new GuiButton(8, 3, 3, 120, 20, StatCollector.translateToLocal("menu.skinCapeSettings"))); this.buttonList.add(new GuiButton(8, 3, 3, 120, 20, StatCollector.translateToLocal("menu.skinCapeSettings")));
} }
@ -61,6 +62,17 @@ public class GuiIngameMenu extends GuiScreen {
this.mc.setIngameFocus(); this.mc.setIngameFocus();
this.mc.sndManager.resumeAllSounds(); this.mc.sndManager.resumeAllSounds();
break; break;
case 7:
if (IntegratedServer.isHostingLAN()) {
IntegratedServer.closeLAN();
this.mc.displayGuiScreen((GuiScreen) null);
this.mc.setIngameFocus();
this.mc.sndManager.resumeAllSounds();
} else {
this.mc.displayGuiScreen(new GuiShareToLan(this));
}
break;
case 8: case 8:
this.mc.displayGuiScreen(new GuiScreenSkinCapeSettings(this)); this.mc.displayGuiScreen(new GuiScreenSkinCapeSettings(this));

View File

@ -123,13 +123,14 @@ public class GuiMultiplayer extends GuiScreen {
*/ */
public void initGuiControls() { public void initGuiControls() {
StringTranslate var1 = StringTranslate.getInstance(); StringTranslate var1 = StringTranslate.getInstance();
this.buttonList.add(this.field_96289_p = new GuiButton(7, this.width / 2 - 154, this.height - 28, 70, 20, var1.translateKey("selectServer.edit"))); this.buttonList.add(this.field_96289_p = new GuiButton(7, this.width / 2 - 154 + 36, this.height - 28, 60, 20, var1.translateKey("selectServer.edit")));
this.buttonList.add(this.buttonDelete = new GuiButton(2, this.width / 2 - 74, this.height - 28, 70, 20, var1.translateKey("selectServer.delete"))); this.buttonList.add(this.buttonDelete = new GuiButton(2, this.width / 2 - 74 + 22, this.height - 28, 60, 20, var1.translateKey("selectServer.delete")));
this.buttonList.add(this.buttonSelect = new GuiButton(1, this.width / 2 - 154, this.height - 52, 100, 20, var1.translateKey("selectServer.select"))); this.buttonList.add(this.buttonSelect = new GuiButton(1, this.width / 2 - 154, this.height - 52, 100, 20, var1.translateKey("selectServer.select")));
this.buttonList.add(new GuiButton(4, this.width / 2 - 50, this.height - 52, 100, 20, var1.translateKey("selectServer.direct"))); this.buttonList.add(new GuiButton(4, this.width / 2 - 50, this.height - 52, 100, 20, var1.translateKey("selectServer.direct")));
this.buttonList.add(new GuiButton(3, this.width / 2 + 4 + 50, this.height - 52, 100, 20, var1.translateKey("selectServer.add"))); this.buttonList.add(new GuiButton(3, this.width / 2 + 4 + 50, this.height - 52, 100, 20, var1.translateKey("selectServer.add")));
this.buttonList.add(new GuiButton(8, this.width / 2 + 4, this.height - 28, 70, 20, var1.translateKey("selectServer.refresh"))); this.buttonList.add(new GuiButton(8, this.width / 2 + 4 + 10, this.height - 28, 60, 20, var1.translateKey("selectServer.refresh")));
this.buttonList.add(new GuiButton(0, this.width / 2 + 4 + 76, this.height - 28, 75, 20, var1.translateKey("gui.cancel"))); this.buttonList.add(new GuiButton(0, this.width / 2 + 4 + 76, this.height - 28, 75, 20, var1.translateKey("gui.cancel")));
this.buttonList.add(new GuiButton(10, this.width / 2 - 154, this.height - 28, 30, 20, var1.translateKey("selectServer.lan")));
boolean var2 = this.selectedServer >= 0 && this.selectedServer < this.serverSlotContainer.getSize(); boolean var2 = this.selectedServer >= 0 && this.selectedServer < this.serverSlotContainer.getSize();
this.buttonSelect.enabled = var2; this.buttonSelect.enabled = var2;
this.field_96289_p.enabled = var2; this.field_96289_p.enabled = var2;
@ -193,6 +194,8 @@ public class GuiMultiplayer extends GuiScreen {
--cooldownTimer; --cooldownTimer;
this.mc.displayGuiScreen(new GuiMultiplayer(this.parentScreen)); this.mc.displayGuiScreen(new GuiMultiplayer(this.parentScreen));
} }
} else if (par1GuiButton.id == 10) {
this.mc.displayGuiScreen(this.parentScreen);
} else { } else {
this.serverSlotContainer.actionPerformed(par1GuiButton); this.serverSlotContainer.actionPerformed(par1GuiButton);
} }

View File

@ -0,0 +1,91 @@
package net.minecraft.src;
import net.lax1dude.eaglercraft.IntegratedServer;
public class GuiShareToLan extends GuiScreen {
/**
* A reference to the screen object that created this. Used for navigating between screens.
*/
private final GuiScreen parentScreen;
private GuiButton buttonAllowCommandsToggle;
private GuiButton buttonGameMode;
/**
* The currently selected game mode. One of 'survival', 'creative', or 'adventure'
*/
private String gameMode = "survival";
/** True if 'Allow Cheats' is currently enabled */
private boolean allowCommands;
public GuiShareToLan(GuiScreen par1GuiScreen) {
this.parentScreen = par1GuiScreen;
}
/**
* Adds the buttons (and other controls) to the screen in question.
*/
public void initGui() {
this.buttonList.clear();
this.buttonList.add(new GuiButton(101, this.width / 2 - 155, this.height - 28, 150, 20, StatCollector.translateToLocal("lanServer.start")));
this.buttonList.add(new GuiButton(102, this.width / 2 + 5, this.height - 28, 150, 20, StatCollector.translateToLocal("gui.cancel")));
this.buttonList.add(this.buttonGameMode = new GuiButton(104, this.width / 2 - 155, 100, 150, 20, StatCollector.translateToLocal("selectWorld.gameMode")));
this.buttonList.add(this.buttonAllowCommandsToggle = new GuiButton(103, this.width / 2 + 5, 100, 150, 20, StatCollector.translateToLocal("selectWorld.allowCommands")));
this.func_74088_g();
}
private void func_74088_g() {
this.buttonGameMode.displayString = StatCollector.translateToLocal("selectWorld.gameMode") + " " + StatCollector.translateToLocal("selectWorld.gameMode." + this.gameMode);
this.buttonAllowCommandsToggle.displayString = StatCollector.translateToLocal("selectWorld.allowCommands") + " ";
if (this.allowCommands) {
this.buttonAllowCommandsToggle.displayString = this.buttonAllowCommandsToggle.displayString + StatCollector.translateToLocal("options.on");
} else {
this.buttonAllowCommandsToggle.displayString = this.buttonAllowCommandsToggle.displayString + StatCollector.translateToLocal("options.off");
}
}
/**
* Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
*/
protected void actionPerformed(GuiButton par1GuiButton) {
if (par1GuiButton.id == 102) {
this.mc.displayGuiScreen(this.parentScreen);
} else if (par1GuiButton.id == 104) {
if (this.gameMode.equals("survival")) {
this.gameMode = "creative";
} else if (this.gameMode.equals("creative")) {
this.gameMode = "adventure";
} else {
this.gameMode = "survival";
}
this.func_74088_g();
} else if (par1GuiButton.id == 103) {
this.allowCommands = !this.allowCommands;
this.func_74088_g();
} else if (par1GuiButton.id == 101) {
this.mc.displayGuiScreen((GuiScreen)null);
String var2 = IntegratedServer.shareToLAN(EnumGameType.getByName(this.gameMode), this.allowCommands);
String var3;
if (var2 != null) {
var3 = StatCollector.translateToLocalFormatted("commands.publish.started", var2);
} else {
var3 = StatCollector.translateToLocal("commands.publish.failed");
}
this.mc.ingameGUI.getChatGUI().printChatMessage(var3);
}
}
/**
* Draws the screen and all the components in it.
*/
public void drawScreen(int par1, int par2, float par3) {
this.drawDefaultBackground();
this.drawCenteredString(this.fontRenderer, StatCollector.translateToLocal("lanServer.title"), this.width / 2, 50, 16777215);
this.drawCenteredString(this.fontRenderer, StatCollector.translateToLocal("lanServer.otherPlayers"), this.width / 2, 82, 16777215);
super.drawScreen(par1, par2, par3);
}
}

View File

@ -4,7 +4,7 @@ import org.teavm.jso.JSFunctor;
import org.teavm.jso.JSObject; import org.teavm.jso.JSObject;
import org.teavm.jso.typedarrays.ArrayBuffer; import org.teavm.jso.typedarrays.ArrayBuffer;
public interface EaglercraftLANClient { public interface EaglercraftLANClient extends JSObject {
final int READYSTATE_INIT_FAILED = -2; final int READYSTATE_INIT_FAILED = -2;
final int READYSTATE_FAILED = -1; final int READYSTATE_FAILED = -1;

View File

@ -4,7 +4,7 @@ import org.teavm.jso.JSFunctor;
import org.teavm.jso.JSObject; import org.teavm.jso.JSObject;
import org.teavm.jso.typedarrays.ArrayBuffer; import org.teavm.jso.typedarrays.ArrayBuffer;
public interface EaglercraftLANServer { public interface EaglercraftLANServer extends JSObject {
boolean LANServerSupported(); boolean LANServerSupported();