From 10093c1ed3d0562510e94366e30c7070776ce5ca Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Sun, 7 Apr 2024 02:21:46 +0530 Subject: [PATCH] get gravity and server stop mission working --- src/Marble.hx | 4 ++-- src/MarbleGame.hx | 24 ++++++++++++++++++------ src/MarbleWorld.hx | 26 ++++++++++++++++++++------ src/net/NetCommands.hx | 15 +++++++++++++++ src/shapes/AntiGravity.hx | 5 ++++- 5 files changed, 59 insertions(+), 15 deletions(-) diff --git a/src/Marble.hx b/src/Marble.hx index fc96d2a2..28a0e20e 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -1757,8 +1757,8 @@ class Marble extends GameObject { this.blastUseTick = p.blastTick; this.helicopterUseTick = p.heliTick; this.megaMarbleUseTick = p.megaTick; - this.currentUp = p.gravityDirection; - this.level.setUp(cast this, this.currentUp, this.level.timeState, true); + // this.currentUp = p.gravityDirection; + this.level.setUp(cast this, p.gravityDirection, this.level.timeState); this.outOfBounds = p.oob; this.camera.oob = p.oob; if (p.powerUpId == 0x1FF) { diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx index a1210eae..faf5f7c1 100644 --- a/src/MarbleGame.hx +++ b/src/MarbleGame.hx @@ -1,5 +1,7 @@ package src; +import gui.MultiplayerLevelSelectGui; +import net.NetCommands; import net.Net; import gui.LevelSelectGui; import gui.MainMenuGui; @@ -235,6 +237,9 @@ class MarbleGame { quitMission(); })); } else { + if (Net.isMP && Net.isClient) { + Net.disconnect(); + } quitMission(); } }, (sender) -> { @@ -284,7 +289,9 @@ class MarbleGame { public function quitMission() { Console.log("Quitting mission"); if (Net.isMP) { - Net.disconnect(); + if (Net.isHost) { + NetCommands.endGame(); + } } var watching = world.isWatching; var missionType = world.mission.type; @@ -310,12 +317,17 @@ class MarbleGame { canvas.setContent(new MainMenuGui()); #end } else { - var pmg = new LevelSelectGui(LevelSelectGui.currentDifficultyStatic); - if (_exitingToMenu) { - _exitingToMenu = false; - canvas.setContent(new MainMenuGui()); + if (Net.isMP) { + var lobby = new MultiplayerLevelSelectGui(Net.isHost); + canvas.setContent(lobby); } else { - canvas.setContent(pmg); + var pmg = new LevelSelectGui(LevelSelectGui.currentDifficultyStatic); + if (_exitingToMenu) { + _exitingToMenu = false; + canvas.setContent(new MainMenuGui()); + } else { + canvas.setContent(pmg); + } } } diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index c446e6b9..4c4de5a6 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1949,10 +1949,20 @@ class MarbleWorld extends Scheduler { MarbleGame.instance.touchInput.hideControls(@:privateAccess this.playGui.playGuiCtrl); } var endGameCode = () -> { - this.dispose(); - LevelSelectGui.currentSelectionStatic = mission.index + 1; - var pmg = new LevelSelectGui(["beginner", "intermediate", "advanced", "multiplayer"][mission.difficultyIndex]); - MarbleGame.canvas.setContent(pmg); + if (isMultiplayer) { + if (Net.isHost) { + NetCommands.endGame(); + } + if (Net.isClient) { + Net.disconnect(); + MarbleGame.instance.quitMission(); + } + } else { + this.dispose(); + LevelSelectGui.currentSelectionStatic = mission.index + 1; + var pmg = new LevelSelectGui(["beginner", "intermediate", "advanced", "multiplayer"][mission.difficultyIndex]); + MarbleGame.canvas.setContent(pmg); + } #if js pointercontainer.hidden = false; #end @@ -2048,6 +2058,10 @@ class MarbleWorld extends Scheduler { /** Get the current interpolated orientation quaternion. */ public function getOrientationQuat(time:Float) { + if (time < this.orientationChangeTime) + return this.oldOrientationQuat; + if (time > this.orientationChangeTime + 1.25) + return this.newOrientationQuat; var completion = Util.clamp((time - this.orientationChangeTime) / 0.8, 0, 1); var newDt = completion / 0.15; var smooth = 1.0 / (newDt * (newDt * 0.235 * newDt) + newDt + 1.0 + 0.48 * newDt * newDt); @@ -2059,12 +2073,12 @@ class MarbleWorld extends Scheduler { } public function setUp(marble:Marble, vec:Vector, timeState:TimeState, instant:Bool = false) { - if (vec == marble.currentUp) + if (marble.currentUp == vec) return; - marble.currentUp = vec; if (isMultiplayer && Net.isHost) { @:privateAccess marble.netFlags |= MarbleNetFlags.GravityChange; } + marble.currentUp = vec; if (marble == this.marble) { var currentQuat = this.getOrientationQuat(timeState.currentAttemptTime); var oldUp = new Vector(0, 0, 1); diff --git a/src/net/NetCommands.hx b/src/net/NetCommands.hx index d315b5fb..7be2f479 100644 --- a/src/net/NetCommands.hx +++ b/src/net/NetCommands.hx @@ -120,4 +120,19 @@ class NetCommands { } } } + + @:rpc(server) public static function endGame() { + if (Net.isClient) { + if (MarbleGame.instance.world != null) { + MarbleGame.instance.quitMission(); + } + } + if (Net.isHost) { + for (c => v in Net.clientIdMap) { + v.state = LOBBY; + v.lobbyReady = false; + } + Net.lobbyHostReady = false; + } + } } diff --git a/src/shapes/AntiGravity.hx b/src/shapes/AntiGravity.hx index b4e0ec52..9f23c429 100644 --- a/src/shapes/AntiGravity.hx +++ b/src/shapes/AntiGravity.hx @@ -1,5 +1,6 @@ package shapes; +import net.NetPacket.MarbleNetFlags; import src.Marble; import mis.MisParser; import dts.DtsFile; @@ -40,8 +41,10 @@ class AntiGravity extends PowerUp { direction.transform(this.getRotationQuat().toMatrix()); if (marble == level.marble) this.level.setUp(marble, direction, timeState); - else + else { + @:privateAccess marble.netFlags |= MarbleNetFlags.GravityChange; marble.currentUp.load(direction); + } } }