From 162056fb4f99119bbc5d6dba9e9e6eb152761d34 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Sun, 21 Apr 2024 23:34:38 +0530 Subject: [PATCH] fix more restart and add platform indicators --- data/ui/xbox/platform_android.png | Bin 516 -> 300 bytes data/ui/xbox/platform_desktop.png | Bin 373 -> 275 bytes data/ui/xbox/platform_mac.png | Bin 0 -> 256 bytes data/ui/xbox/platform_unknown.png | Bin 0 -> 349 bytes data/ui/xbox/platform_web.png | Bin 560 -> 388 bytes src/MarbleWorld.hx | 29 +++++++++--------- src/gui/MultiplayerLevelSelectGui.hx | 43 ++++++++++++++++++++++----- src/modes/HuntMode.hx | 12 ++++++++ src/net/ClientConnection.hx | 11 ++++++- src/net/Net.hx | 21 +++++++++---- src/net/NetCommands.hx | 16 +++++++--- 11 files changed, 99 insertions(+), 33 deletions(-) create mode 100644 data/ui/xbox/platform_mac.png create mode 100644 data/ui/xbox/platform_unknown.png diff --git a/data/ui/xbox/platform_android.png b/data/ui/xbox/platform_android.png index 0081e4dfa8e73e61544b3f000e508b618d96bddd..4f78b698e5c7c43c7dc063c02ac7310844802767 100644 GIT binary patch delta 235 zcmV33WVxN$joY8T4aKj`cF%^D6fZe(E#E0FNoIa_#vKk*Oj zPW8YPoqlYq^=|MamCYQo=Zjh|o;G3n&>3GStczPOh8=NNd2$!)$^&?i$|jsPJHGhg l5;D|-C*Q&3kf=n{ya2giId!8gO-uj)002ovPDHLkV1kJHW@Z2Y delta 453 zcmV;$0XqJy0)zyRNq@rt01m?e$8V@)0004*Nkl+R(}sDjKm8&@SiBN7LqoLmX@4Z5fHdg~Fg6A;a38)2 zxd<0V%*L~yCcgv4Bd9f-+vrDR2+e}X>%s`l7Lg?N2lYM6iiP(Gk=Y?aqLVA0{8+ z>{d0RgRs4@FMryEs9%5dNg16$!CC& zA$gD2r=-Swg^3c6#7=)dK!%XxouU+YO|+#ZFekpK=Y{7R6_71;Oa+lHwE+&%BGe^2 zQBZAb?TC*gD;-m4^tlGeri`7hA#cWCz>O#FjVI#`Sw0a$+v(6KOq_bYoOL7X?30pm vxI+7BX_~R^JR&b&h`wiWCL$N%KS1;Ycfzky*`(F000000NkvXXu0mjf<+aWe diff --git a/data/ui/xbox/platform_desktop.png b/data/ui/xbox/platform_desktop.png index 5a37d83dd791ea2bdeb31d5fa4bb0bffb599c51b..46ce0111e1e6f4178e94d678b0852e68c6787e60 100644 GIT binary patch delta 210 zcmV;@04@LZ0+RxeNq@os01m@*>XcmjS?0Yn&TH?te6P44NS%G}c0*}aI1_r)EAj~ML;ne^Xoa*V~7-Hd{EK%7Y=+)f7C~&^rz>|r;p+ZSO zo}q98Zw&ttE{7V%Gsgv65qQVWU zfJJ@`kN6Yhv=}-$9cDxvWK-~CF?3*KW7ufh!OWt-yfIUUC27LK8%07MGARlj`#6jQ urieSNS%G}c0*}aI1_r)EAj~ML;ne^X{N(B47-HeSc1k}lqoIsjKj#bvX#+;-4UIEg zd>S|n7}XB2ZMz<~c~|C*Z9egOpYtXxk2$@0rOvto zd*7Uzz4DKN0Z&eL0c%{UVO7UUl`ZM37+CfR?LEyuYun#6)!TyGH#O-CM3{ZDHNQ5o zHY`F>ghRJ-lDPIl$E3zHO;0~^Mkp~GB(!Vnb%HVNW?&GrbV>U>0)9(%lkbb-NC`8wy0 rxcEI5(>KOG<#@Z~^Q0A>I@QdM3$42kiM1F2eb3gTe~DWM4fjn#t2 literal 0 HcmV?d00001 diff --git a/data/ui/xbox/platform_web.png b/data/ui/xbox/platform_web.png index 9925a98926e5b3453cc7cb9c920de26ca794de7e..d1e087d1b218731824ce8efe567fafbf5131dfbb 100644 GIT binary patch delta 324 zcmV-K0lWUN1cU>SNq@os01m$>|1iDj{s1(Zw;))GYXQgZkLD4mp2U2-ELqiozOgOve` z4f?rRD$1=DyFDh6+V#CCnR9dJK^brrGtSLOjhnZ&-xsinqP1)B`#Qw-n;QK)s_G4; W6mdqXLx>TMM}~8`xonusePrc&y%xuW^8RSp zr*LSB%~*DWG1e1_FQarNw0gtxl^b&SjgTY{&MSPhFbHTKm47buOm(XAaX>ER8`u(x zNNS;B5!oZG2HDCebM1cGB2`F|C2VM;0GluuHSE%RW&py$xe%M6G$tg;6YRo9K2@q~ z%XU<@W#fJqy(h3=L4+Rpcqe75^JIi01D-)fMI?&Jh&lG1!e6=YCt+h`R4pNR^3*M} z;6b!A8v!xlqW5$feZve4x~sD*k*x_rnY6PDC1?em>Cu51qC)?ef;g1eJ=o`D%U=Kqz^uX0Xt_l(1%(g=~2` zZwynqhc&S{?BO3lVtCljiy~7NC^ASvDv-$!#K~1;?sz#kWueAB_PxFc)ThMIwte^6 n%@^;pGkS>d&&Z|x4+!xMgprnwf1UGa00000NkvXXu0mjfsEp 0) { // Only for our clients pls - // if (qm != null) { - // var mvs = qm.powerupStates.copy(); - for (pw in marble.level.powerUps) { - // var val = mvs.shift(); - // if (pw.lastPickUpTime != val) - // Console.log('Revert powerup pickup: ${pw.lastPickUpTime} -> ${val}'); - pw.lastPickUpTime = powerupPredictions.getState(pw.netIndex); - } - var huntMode:HuntMode = cast this.gameMode; - for (activeGem in @:privateAccess huntMode.activeGemSpawnGroup) { - huntMode.setGemHiddenStatus(activeGem, gemPredictions.getState(activeGem)); - } - // } + // if (marbleNeedsPrediction & (1 << Net.clientId) > 0) { // Only for our clients pls + // if (qm != null) { + // var mvs = qm.powerupStates.copy(); + for (pw in marble.level.powerUps) { + // var val = mvs.shift(); + // if (pw.lastPickUpTime != val) + // Console.log('Revert powerup pickup: ${pw.lastPickUpTime} -> ${val}'); + pw.lastPickUpTime = powerupPredictions.getState(pw.netIndex); } + var huntMode:HuntMode = cast this.gameMode; + for (activeGem in @:privateAccess huntMode.activeGemSpawnGroup) { + huntMode.setGemHiddenStatus(activeGem, gemPredictions.getState(activeGem)); + } + // } + // } ackLag = ourQueuedMoves.length; diff --git a/src/gui/MultiplayerLevelSelectGui.hx b/src/gui/MultiplayerLevelSelectGui.hx index 97ae8f9b..e9e52eb3 100644 --- a/src/gui/MultiplayerLevelSelectGui.hx +++ b/src/gui/MultiplayerLevelSelectGui.hx @@ -1,5 +1,6 @@ package gui; +import net.ClientConnection.NetPlatform; import net.Net; import net.NetCommands; import modes.GameMode.ScoreType; @@ -152,18 +153,21 @@ class MultiplayerLevelSelectGui extends GuiImage { if (Net.isHost) { playerListArr.push({ name: Settings.highscoreName, - state: Net.lobbyHostReady + state: Net.lobbyHostReady, + platform: Net.getPlatform() }); } if (Net.isClient) { playerListArr.push({ name: Settings.highscoreName, - state: Net.clientConnection.lobbyReady + state: Net.clientConnection.lobbyReady, + platform: Net.getPlatform() }); for (c => v in Net.clientIdMap) { playerListArr.push({ name: v.name, - state: v.lobbyReady + state: v.lobbyReady, + platform: v.platform }); } } @@ -174,12 +178,22 @@ class MultiplayerLevelSelectGui extends GuiImage { return ResourceLoader.getResource("data/ui/xbox/Ready.png", ResourceLoader.getImage, this.imageResources).toTile(); case "notready": return ResourceLoader.getResource("data/ui/xbox/NotReady.png", ResourceLoader.getImage, this.imageResources).toTile(); + case "pc": + return ResourceLoader.getResource("data/ui/xbox/platform_desktop.png", ResourceLoader.getImage, this.imageResources).toTile(); + case "mac": + return ResourceLoader.getResource("data/ui/xbox/platform_mac.png", ResourceLoader.getImage, this.imageResources).toTile(); + case "web": + return ResourceLoader.getResource("data/ui/xbox/platform_web.png", ResourceLoader.getImage, this.imageResources).toTile(); + case "android": + return ResourceLoader.getResource("data/ui/xbox/platform_android.png", ResourceLoader.getImage, this.imageResources).toTile(); + case "unknown": + return ResourceLoader.getResource("data/ui/xbox/platform_unknown.png", ResourceLoader.getImage, this.imageResources).toTile(); } return null; } playerList = new GuiMLTextListCtrl(arial14, playerListArr.map(player -> { - return '${player.name}'; + return '${player.name}'; }), imgLoader); playerList.selectedColor = 0xF29515; playerList.selectedFillColor = 0xEBEBEB; @@ -327,29 +341,42 @@ class MultiplayerLevelSelectGui extends GuiImage { super.onResize(width, height); } + inline function platformToString(platform:NetPlatform) { + return switch (platform) { + case Unknown: return "unknown"; + case Android: return "android"; + case MacOS: return "mac"; + case PC: return "pc"; + case Web: return "web"; + } + } + public function updateLobbyNames() { var playerListArr = []; if (Net.isHost) { playerListArr.push({ name: Settings.highscoreName, - state: Net.lobbyHostReady + state: Net.lobbyHostReady, + platform: Net.getPlatform() }); } if (Net.isClient) { playerListArr.push({ name: Settings.highscoreName, - state: Net.lobbyClientReady + state: Net.lobbyClientReady, + platform: Net.getPlatform() }); } for (c => v in Net.clientIdMap) { playerListArr.push({ name: v.name, - state: v.lobbyReady + state: v.lobbyReady, + platform: v.platform }); } playerList.setTexts(playerListArr.map(player -> { - return '${player.name}'; + return '${player.name}'; })); } diff --git a/src/modes/HuntMode.hx b/src/modes/HuntMode.hx index 4c1f12b2..975356e2 100644 --- a/src/modes/HuntMode.hx +++ b/src/modes/HuntMode.hx @@ -463,6 +463,18 @@ class HuntMode extends NullMode { } public function setActiveSpawnSphere(spawnGroup:Array) { + Console.log("Got new gem spawn from server!"); + if (activeGemSpawnGroup != null) { + for (agem in activeGemSpawnGroup) { + var gemSpawn = gemSpawnPoints[agem]; + if (gemSpawn.gem != null) { + gemSpawn.gem.pickedUp = true; + gemSpawn.gem.setHide(true); + gemSpawn.gemBeam.setHide(true); + activeGems.remove(gemSpawn.gem); + } + } + } for (sphereId in spawnGroup) { var gemSpawn = gemSpawnPoints[sphereId]; if (gemSpawn.gem != null) { diff --git a/src/net/ClientConnection.hx b/src/net/ClientConnection.hx index c607f110..3bb7e1ef 100644 --- a/src/net/ClientConnection.hx +++ b/src/net/ClientConnection.hx @@ -12,6 +12,14 @@ enum abstract GameplayState(Int) from Int to Int { var GAME; } +enum abstract NetPlatform(Int) from Int to Int { + var Unknown; + var PC; + var MacOS; + var Web; + var Android; +} + @:publicFields class ClientConnection extends GameConnection { var socket:RTCPeerConnection; @@ -50,8 +58,9 @@ abstract class GameConnection { var moveManager:MoveManager; var name:String; var lobbyReady:Bool; + var platform:NetPlatform; - public function new(id:Int) { + function new(id:Int) { this.id = id; this.moveManager = new MoveManager(this); this.lobbyReady = false; diff --git a/src/net/Net.hx b/src/net/Net.hx index 83915f79..d219cdf5 100644 --- a/src/net/Net.hx +++ b/src/net/Net.hx @@ -45,9 +45,9 @@ class ServerInfo { var privateServer:Bool; var inviteCode:Int; var state:String; - var platform:String; + var platform:NetPlatform; - public function new(name:String, players:Int, maxPlayers:Int, privateSlots:Int, privateServer:Bool, inviteCode:Int, state:String, platform:String) { + public function new(name:String, players:Int, maxPlayers:Int, privateSlots:Int, privateServer:Bool, inviteCode:Int, state:String, platform:NetPlatform) { this.name = name; this.players = players; this.maxPlayers = maxPlayers; @@ -298,6 +298,7 @@ class Net { for (c => v in clientIdMap) { b.writeByte(c); b.writeByte(v.lobbyReady ? 1 : 0); + b.writeByte(v.platform); var name = v.getName(); b.writeByte(name.length); for (i in 0...name.length) { @@ -307,6 +308,7 @@ class Net { // Write host data b.writeByte(0); b.writeByte(Net.lobbyHostReady ? 1 : 0); + b.writeByte(getPlatform()); var name = Settings.highscoreName; b.writeByte(name.length); for (i in 0...name.length) { @@ -327,6 +329,7 @@ class Net { clientId = input.readByte(); // 8 bit client id, hopefully we don't exceed this Console.log('Client ID set to ${clientId}'); NetCommands.setPlayerName(clientId, Settings.highscoreName); // Send our player name to the server + NetCommands.transmitPlatform(clientId, getPlatform()); // send our platform too case Ping: var pingLeft = input.readByte(); @@ -407,6 +410,7 @@ class Net { for (i in 0...count) { var id = input.readByte(); var cready = input.readByte() == 1; + var platform = input.readByte(); if (id != 0 && id != Net.clientId && !clientIdMap.exists(id)) { Console.log('Adding ghost connection ${id}'); addGhost(id); @@ -420,6 +424,7 @@ class Net { if (clientIdMap.exists(id)) { clientIdMap[id].setName(name); clientIdMap[id].lobbyReady = cready; + clientIdMap[id].platform = platform; } if (Net.clientId == id) { Net.lobbyClientReady = cready; @@ -457,15 +462,19 @@ class Net { } } - public static function getPlatform() { + public static inline function getPlatform() { #if js - return "Browser"; + return NetPlatform.Web; #end #if hl #if MACOS_BUNDLE - return "MacOS"; + return NetPlatform.MacOS; #else - return "Windows"; + #if android + return NetPlatform.Android; + #else + return NetPlatform.PC; + #end #end #end } diff --git a/src/net/NetCommands.hx b/src/net/NetCommands.hx index 455393cd..254ff0fe 100644 --- a/src/net/NetCommands.hx +++ b/src/net/NetCommands.hx @@ -1,5 +1,6 @@ package net; +import net.ClientConnection.NetPlatform; import gui.EndGameGui; import modes.HuntMode; import net.ClientConnection.GameplayState; @@ -128,6 +129,15 @@ class NetCommands { } } + @:rpc(client) public static function transmitPlatform(clientId:Int, platform:Int) { + if (Net.isHost) { + Net.clientIdMap[clientId].platform = platform; + if (MarbleGame.canvas.content is MultiplayerLevelSelectGui) { + cast(MarbleGame.canvas.content, MultiplayerLevelSelectGui).updateLobbyNames(); + } + } + } + @:rpc(server) public static function endGame() { if (Net.isClient) { if (MarbleGame.instance.world != null) { @@ -146,10 +156,8 @@ class NetCommands { @:rpc(server) public static function restartGame() { var world = MarbleGame.instance.world; if (Net.isHost) { - world.schedule(1, () -> { - world.allClientsReady(); - return null; - }); + world.startTime = 1e8; + haxe.Timer.delay(() -> world.allClientsReady(), 1500); } if (Net.isClient) { var gui = MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1];