From 8b612fd089f2f984f916fbfa9f49527ae7bae35e Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Sun, 23 Jun 2024 00:54:23 +0530 Subject: [PATCH] player kicking, marble skin change networking, minor improvements --- data/ui/mp/kickban/window.png | Bin 4112 -> 6646 bytes src/Marble.hx | 4 +- src/MarbleWorld.hx | 3 +- src/gui/JoinServerGui.hx | 8 +-- src/gui/MPKickBanDlg.hx | 112 ++++++++++++++++++++++++++++++++++ src/gui/MPMarbleSelectGui.hx | 14 +++++ src/gui/MPPlayMissionGui.hx | 3 + src/gui/MPPreGameDlg.hx | 3 + src/net/MasterServerClient.hx | 7 +-- src/net/Net.hx | 27 +++----- src/net/NetCommands.hx | 23 +++++-- 11 files changed, 170 insertions(+), 34 deletions(-) create mode 100644 src/gui/MPKickBanDlg.hx diff --git a/data/ui/mp/kickban/window.png b/data/ui/mp/kickban/window.png index e2a3301dab22f436bf8bbe40a4c37c459a6b95c8..d06a1732ec42375203cccc144d8f6b14604307a6 100644 GIT binary patch literal 6646 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 fD`K;BqXC$1+zut5FW(IR;)CNy> { + this.gameMode.onRestart(); NetCommands.setStartTicks(this.timeState.ticks); }, 500); } diff --git a/src/gui/JoinServerGui.hx b/src/gui/JoinServerGui.hx index 3d67d6fa..3cfadcf7 100644 --- a/src/gui/JoinServerGui.hx +++ b/src/gui/JoinServerGui.hx @@ -121,13 +121,9 @@ class JoinServerGui extends GuiImage { var failed = true; haxe.Timer.delay(() -> { if (failed) { - // if (MarbleGame.canvas.content is MultiplayerLoadingGui) { - // var loadGui:MultiplayerLoadingGui = cast MarbleGame.canvas.content; - // if (loadGui != null) { - // loadGui.setErrorStatus("Failed to connect to server. Please try again."); + MarbleGame.canvas.setContent(new JoinServerGui()); + MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Failed to connect to server. Please try again.")); Net.disconnect(); - // } - // } } }, 15000); Net.joinServer(ourServerList[curSelection].name, "", () -> { diff --git a/src/gui/MPKickBanDlg.hx b/src/gui/MPKickBanDlg.hx new file mode 100644 index 00000000..4e10955e --- /dev/null +++ b/src/gui/MPKickBanDlg.hx @@ -0,0 +1,112 @@ +package gui; + +import net.NetCommands; +import net.Net; +import h2d.filter.DropShadow; +import hxd.res.BitmapFont; +import h3d.prim.Polygon; +import h3d.scene.Mesh; +import h3d.shader.AlphaChannel; +import src.MarbleGame; +import h3d.Vector; +import src.ResourceLoader; +import src.DtsObject; +import src.Settings; +import src.ResourceLoaderWorker; + +class MPKickBanDlg extends GuiImage { + public function new() { + var img = ResourceLoader.getImage("data/ui/mp/kickban/window.png"); + super(img.resource.toTile()); + this.horizSizing = Center; + this.vertSizing = Center; + this.position = new Vector(226, 137); + this.extent = new Vector(409, 316); + + function loadButtonImages(path:String) { + var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); + var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile(); + var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile(); + return [normal, hover, pressed]; + } + + function loadButtonImagesExt(path:String) { + var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile(); + var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile(); + var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile(); + var disabled = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources).toTile(); + return [normal, hover, pressed, disabled]; + } + + var markerFelt32fontdata = ResourceLoader.getFileEntry("data/font/MarkerFelt.fnt"); + var markerFelt32b = new BitmapFont(markerFelt32fontdata.entry); + @:privateAccess markerFelt32b.loader = ResourceLoader.loader; + var markerFelt32 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel); + var markerFelt24 = markerFelt32b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel); + var markerFelt20 = markerFelt32b.toSdfFont(cast 18.5 * Settings.uiScale, MultiChannel); + var markerFelt18 = markerFelt32b.toSdfFont(cast 17 * Settings.uiScale, MultiChannel); + var markerFelt26 = markerFelt32b.toSdfFont(cast 22 * Settings.uiScale, MultiChannel); + + var closeBtn = new GuiButton(loadButtonImages("data/ui/mp/team/close")); + closeBtn.position = new Vector(247, 254); + closeBtn.extent = new Vector(94, 45); + closeBtn.vertSizing = Bottom; + closeBtn.horizSizing = Right; + closeBtn.pressedAction = (e) -> { + MarbleGame.canvas.popDialog(this); + } + this.addChild(closeBtn); + + var kickBtn = new GuiButton(loadButtonImagesExt("data/ui/mp/kickban/kick")); + kickBtn.position = new Vector(77, 254); + kickBtn.extent = new Vector(94, 45); + kickBtn.vertSizing = Bottom; + kickBtn.horizSizing = Right; + kickBtn.disabled = true; + this.addChild(kickBtn); + + var kickTitle = new GuiText(markerFelt32); + kickTitle.text.textColor = 0xFFFFFF; + kickTitle.text.text = "Kick Players"; + kickTitle.text.dropShadow = { + dx: 1, + dy: 1, + alpha: 0.5, + color: 0 + }; + kickTitle.justify = Center; + kickTitle.position = new Vector(11, 17); + kickTitle.extent = new Vector(388, 14); + this.addChild(kickTitle); + + var playerNames = []; + var playerIds = []; + for (c in Net.clients) { + playerNames.push(c.getName()); + playerIds.push(c.id); + } + + var kickPlayerId = -1; + + var playerList = new GuiTextListCtrl(markerFelt18, playerNames, 0); + playerList.position = new Vector(120, 60); + playerList.extent = new Vector(188, 180); + playerList.textYOffset = -6; + playerList.onSelectedFunc = (sel) -> { + kickBtn.disabled = false; + kickPlayerId = playerIds[sel]; + } + this.addChild(playerList); + + kickBtn.pressedAction = (e) -> { + if (Net.clientIdMap.exists(kickPlayerId)) { + var playerToKick = kickPlayerId; + playerNames.remove(Net.clientIdMap.get(playerToKick).getName()); + playerIds.remove(playerToKick); + playerList.setTexts(playerNames); + kickBtn.disabled = true; + NetCommands.getKickedClient(Net.clientIdMap.get(playerToKick)); + } + } + } +} diff --git a/src/gui/MPMarbleSelectGui.hx b/src/gui/MPMarbleSelectGui.hx index 59929bae..e15ca503 100644 --- a/src/gui/MPMarbleSelectGui.hx +++ b/src/gui/MPMarbleSelectGui.hx @@ -1,5 +1,7 @@ package gui; +import net.Net; +import net.NetCommands; import h2d.filter.DropShadow; import hxd.res.BitmapFont; import h3d.prim.Polygon; @@ -54,6 +56,18 @@ class MPMarbleSelectGui extends GuiImage { Settings.optionsSettings.marbleShader = MarbleSelectGui.marbleData[curCategorySelection][curSelection].shader; Settings.save(); MarbleGame.canvas.popDialog(this); + + // Transmit changes to the server/clients + if (Net.isClient) { + NetCommands.setPlayerData(Net.clientId, Settings.highscoreName, Settings.optionsSettings.marbleIndex, + Settings.optionsSettings.marbleCategoryIndex, true); + } + if (Net.isHost) { + var b = Net.sendPlayerInfosBytes(); + for (cc in Net.clients) { + cc.sendBytes(b); + } + } } this.addChild(selectBtn); diff --git a/src/gui/MPPlayMissionGui.hx b/src/gui/MPPlayMissionGui.hx index dc104f8d..04202d46 100644 --- a/src/gui/MPPlayMissionGui.hx +++ b/src/gui/MPPlayMissionGui.hx @@ -163,6 +163,9 @@ class MPPlayMissionGui extends GuiImage { var kickBtn = new GuiButton(loadButtonImages("data/ui/mp/play/kick")); kickBtn.position = new Vector(304, 514); kickBtn.extent = new Vector(44, 44); + kickBtn.pressedAction = (e) -> { + MarbleGame.canvas.pushDialog(new MPKickBanDlg()); + } if (Net.isHost) window.addChild(kickBtn); diff --git a/src/gui/MPPreGameDlg.hx b/src/gui/MPPreGameDlg.hx index fe48d35c..28af5676 100644 --- a/src/gui/MPPreGameDlg.hx +++ b/src/gui/MPPreGameDlg.hx @@ -96,6 +96,9 @@ class MPPreGameDlg extends GuiControl { kickBtn.vertSizing = Bottom; kickBtn.position = new Vector(360, 388); kickBtn.extent = new Vector(45, 45); + kickBtn.pressedAction = (e) -> { + MarbleGame.canvas.pushDialog(new MPKickBanDlg()); + } if (Net.isHost) dialogImg.addChild(kickBtn); diff --git a/src/net/MasterServerClient.hx b/src/net/MasterServerClient.hx index cab214ad..5a606213 100644 --- a/src/net/MasterServerClient.hx +++ b/src/net/MasterServerClient.hx @@ -1,5 +1,6 @@ package net; +import gui.JoinServerGui; import gui.MessageBoxOkDlg; import src.MarbleGame; import haxe.Json; @@ -294,10 +295,8 @@ class MasterServerClient { @:privateAccess Net.client.setRemoteDescription(sdpObj.sdp, sdpObj.type); } if (conts.type == "connectFailed") { - // var loadGui:MultiplayerLoadingGui = cast MarbleGame.canvas.content; - // if (loadGui != null) { - // loadGui.setErrorStatus(conts.reason); - // } + MarbleGame.canvas.setContent(new JoinServerGui()); + MarbleGame.canvas.pushDialog(new MessageBoxOkDlg(conts.reason)); } if (conts.type == "turnserver") { Net.turnServer = conts.server; // Turn server! diff --git a/src/net/Net.hx b/src/net/Net.hx index cea059e3..5433e7e4 100644 --- a/src/net/Net.hx +++ b/src/net/Net.hx @@ -1,5 +1,7 @@ package net; +import gui.MessageBoxOkDlg; +import gui.JoinServerGui; import gui.MPPreGameDlg; import net.NetPacket.ScoreboardPacket; import gui.MPPlayMissionGui; @@ -212,14 +214,8 @@ class Net { MarbleGame.instance.quitMission(); } if (!weLeftOurselves || forceShow) { - // if (!(MarbleGame.canvas.content is MultiplayerLoadingGui)) { - // var loadGui = new MultiplayerLoadingGui(msg); - // MarbleGame.canvas.setContent(loadGui); - // loadGui.setErrorStatus(msg); - // } else { - // var loadGui = cast(MarbleGame.canvas.content, MultiplayerLoadingGui); - // loadGui.setErrorStatus(msg); - // } + MarbleGame.canvas.setContent(new JoinServerGui()); + MarbleGame.canvas.pushDialog(new MessageBoxOkDlg(msg)); } } @@ -232,7 +228,7 @@ class Net { switch (s) { case RTC_CLOSED: Console.log("RTC State change: Connection closed!"); - closeFunc("Connection closed", true); + closeFunc("Connection closed", false); case RTC_CONNECTED: Console.log("RTC State change: Connected!"); case RTC_CONNECTING: @@ -312,12 +308,12 @@ class Net { } var onDatachannelClose = (dc:RTCDataChannel) -> { - closeFunc("Disconnected", true); + closeFunc("Disconnected", false); } var onDatachannelError = (msg:String) -> { Console.log('Errored out due to ${msg}'); - closeFunc("Connection error", true); + closeFunc("Connection error", false); } clientDatachannel.onOpen = (n) -> { @@ -424,11 +420,8 @@ class Net { if (MarbleGame.instance.world != null) { MarbleGame.instance.quitMission(); } - // if (!(MarbleGame.canvas.content is MultiplayerLoadingGui)) { - // var loadGui = new MultiplayerLoadingGui("Timed out"); - // MarbleGame.canvas.setContent(loadGui); - // loadGui.setErrorStatus("Timed out"); - // } + MarbleGame.canvas.setContent(new JoinServerGui()); + MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Timed out")); } } } @@ -660,7 +653,7 @@ class Net { clientId = input.readByte(); // 8 bit client id, hopefully we don't exceed this Console.log('Client ID set to ${clientId}'); NetCommands.setPlayerData(clientId, Settings.highscoreName, Settings.optionsSettings.marbleIndex, - Settings.optionsSettings.marbleCategoryIndex); // Send our player name to the server + Settings.optionsSettings.marbleCategoryIndex, false); // Send our player name to the server NetCommands.transmitPlatform(clientId, getPlatform()); // send our platform too case Ping: diff --git a/src/net/NetCommands.hx b/src/net/NetCommands.hx index 2967961d..9d868c00 100644 --- a/src/net/NetCommands.hx +++ b/src/net/NetCommands.hx @@ -1,5 +1,7 @@ package net; +import gui.MessageBoxOkDlg; +import gui.JoinServerGui; import gui.MPExitGameDlg; import gui.MPEndGameGui; import gui.MPPreGameDlg; @@ -262,19 +264,32 @@ class NetCommands { if (MarbleGame.instance.world != null) { MarbleGame.instance.quitMission(); } - // var loadGui = new MultiplayerLoadingGui("Server closed"); - // MarbleGame.canvas.setContent(loadGui); - // loadGui.setErrorStatus("Server closed"); + MarbleGame.canvas.setContent(new JoinServerGui()); + MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Server closed")); } } - @:rpc(client) public static function setPlayerData(clientId:Int, name:String, marble:Int, marbleCat:Int) { + @:rpc(server) public static function getKicked() { + if (Net.isClient) { + Net.disconnect(); + MarbleGame.canvas.setContent(new JoinServerGui()); + MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Kicked from server")); + } + } + + @:rpc(client) public static function setPlayerData(clientId:Int, name:String, marble:Int, marbleCat:Int, needRetransmit:Bool) { if (Net.isHost) { Net.clientIdMap[clientId].setName(name); Net.clientIdMap[clientId].setMarbleId(marble, marbleCat); if (MarbleGame.canvas.content is MPPlayMissionGui) { cast(MarbleGame.canvas.content, MPPlayMissionGui).updateLobbyNames(); } + if (needRetransmit) { + var b = Net.sendPlayerInfosBytes(); + for (cc in Net.clients) { + cc.sendBytes(b); + } + } } }