From 651726bb06ce494b6944674acc28a98e8d53e2fe Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Fri, 21 Jun 2024 00:16:01 +0530 Subject: [PATCH] camera overview thing + rsg multiplayer (no sounds currently) --- src/CameraController.hx | 69 +++++++++++++++++++++++++++++++++++++++ src/MarbleWorld.hx | 50 +++++++++++++++++++++++----- src/mis/MissionElement.hx | 2 ++ src/modes/GameMode.hx | 1 + src/modes/HuntMode.hx | 4 +++ src/modes/NullMode.hx | 2 ++ src/net/NetCommands.hx | 1 + 7 files changed, 120 insertions(+), 9 deletions(-) diff --git a/src/CameraController.hx b/src/CameraController.hx index c3669b76..d182f46e 100644 --- a/src/CameraController.hx +++ b/src/CameraController.hx @@ -1,5 +1,6 @@ package src; +import mis.MisParser; import h3d.col.Bounds; import h3d.col.Plane; import h3d.mat.Material; @@ -68,6 +69,11 @@ class CameraController extends Object { public var oob:Bool = false; public var finish:Bool = false; + public var overview:Bool = false; + + var overviewCenter:Vector; + var overviewWidth:Vector; + var overviewHeight:Float; var _ignoreCursor:Bool = false; @@ -164,10 +170,73 @@ class CameraController extends Object { // CameraPitch = 0.001; } + public function startOverview() { + var worldBounds = new Bounds(); + var center = new Vector(0, 0, 0); + for (itr in level.interiors) { + var itrBounds = itr.getBounds(); + worldBounds.add(itrBounds); + center.load(center.add(itrBounds.getCenter().toVector())); + } + if (level.interiors.length == 0) { + worldBounds.xMin = -1; + worldBounds.xMax = 1; + worldBounds.yMin = -1; + worldBounds.yMax = 1; + worldBounds.zMin = -1; + worldBounds.zMax = 1; + } else + center.scale(1 / level.interiors.length); + + overviewWidth = new Vector(worldBounds.xMax - worldBounds.xMin, worldBounds.yMax - worldBounds.yMin, worldBounds.zMax - worldBounds.zMin); + if (level.mission.missionInfo.overviewwidth != null) { + var parseTest = MisParser.parseVector3(level.mission.missionInfo.overviewwidth); + if (parseTest != null) { + overviewWidth = parseTest; + } + } + overviewHeight = level.mission.missionInfo.overviewheight != null ? Std.parseFloat(level.mission.missionInfo.overviewheight) : 0.0; + overviewCenter = center; + + overview = true; + } + + public function stopOverview() { + overview = false; + } + + function doOverviewCamera(currentTime:Float, dt:Float) { + var angle = Util.adjustedMod(2 * currentTime * Math.PI / 100.0, 2 * Math.PI); + var distance = overviewWidth.multiply(2.0 / 3.0); + var offset = new Vector(Math.sin(angle) * distance.x, Math.cos(angle) * distance.y); + var position = overviewCenter.add(offset); + + var top = overviewCenter.z + (overviewWidth.z / 2) + overviewHeight; + position.z = top; + + var posDist = Math.sqrt((position.x - overviewCenter.x) * (position.x - overviewCenter.x) + + (position.y - overviewCenter.y) * (position.y - overviewCenter.y)); + var upOffset = Math.tan(0.5) * posDist / 2; + // position.load(position.add(new Vector(0, 0, upOffset))); + + var camera = level.scene.camera; + camera.pos.load(position); + camera.target.load(overviewCenter); + camera.up.x = 0; + camera.up.y = 0; + camera.up.z = 1; + } + public function update(currentTime:Float, dt:Float) { // camera.position.set(marblePosition.x, marblePosition.y, marblePosition.z).sub(directionVector.clone().multiplyScalar(2.5)); // this.level.scene.camera.target = marblePosition.add(cameraVerticalTranslation); // camera.position.add(cameraVerticalTranslation); + + if (overview) { + doOverviewCamera(currentTime, dt); + return; + } + var camera = level.scene.camera; var lerpt = Math.pow(0.5, dt / 0.032); // Math.min(1, 1 - Math.pow(0.6, dt / 0.032)); // hxd.Math.min(1, 1 - Math.pow(0.6, dt * 600)); diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index a9909820..70da6173 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -543,23 +543,25 @@ class MarbleWorld extends Scheduler { return (aId > bId) ? 1 : (aId < bId) ? -1 : 0; }); } - var cc = 0; - for (client in Net.clients) - cc++; - if (Net.isHost && cc == 0) { - allClientsReady(); - Net.serverInfo.state = "PLAYING"; - MasterServerClient.instance.sendServerInfo(Net.serverInfo); // notify the server of the playing state - } + // var cc = 0; + // for (client in Net.clients) + // cc++; + // if (Net.isHost && cc == 0) { + // allClientsReady(); + // Net.serverInfo.state = "PLAYING"; + // MasterServerClient.instance.sendServerInfo(Net.serverInfo); // notify the server of the playing state + // } if (this.isMultiplayer) { // Push the pre - game showPreGame(); } + this.gameMode.onMissionLoad(); } public function showPreGame() { MarbleGame.canvas.pushDialog(new MPPreGameDlg()); this.setCursorLock(false); + this.marble.camera.startOverview(); } public function addJoiningClient(cc:GameConnection, onAdded:() -> Void) { @@ -801,7 +803,7 @@ class MarbleWorld extends Scheduler { this.setUp(marble, up, this.timeState, true); if (marble == this.marble) - this.playGui.setCenterText(''); + this.playGui.setCenterText('none'); if (!this.isMultiplayer) this.clearSchedule(); marble.outOfBounds = false; @@ -841,12 +843,42 @@ class MarbleWorld extends Scheduler { } } else { if (!this.multiplayerStarted && this.finishTime == null) { + if ((Net.isHost && (this.timeState.timeSinceLoad < startTime - 3.0)) // 3.5 == 109 ticks + || (Net.isClient && this.serverStartTicks != 0 && @:privateAccess this.marble.serverTicks < this.serverStartTicks + 16)) { + this.playGui.setCenterText('none'); + } + if ((Net.isHost + && (this.timeState.timeSinceLoad > startTime - 3.0) + && (this.timeState.timeSinceLoad < startTime - 1.5)) // 3.5 == 109 ticks + || (Net.isClient + && this.serverStartTicks != 0 + && @:privateAccess this.marble.serverTicks > this.serverStartTicks + 16 + && @:privateAccess this.marble.serverTicks < this.serverStartTicks + 63)) { + this.playGui.setCenterText('ready'); + } + if ((Net.isHost + && (this.timeState.timeSinceLoad > startTime - 1.5) + && (this.timeState.timeSinceLoad < startTime)) // 3.5 == 109 ticks + || (Net.isClient + && this.serverStartTicks != 0 + && @:privateAccess this.marble.serverTicks > this.serverStartTicks + 63 + && @:privateAccess this.marble.serverTicks < this.serverStartTicks + 109)) { + this.playGui.setCenterText('set'); + } if ((Net.isHost && (this.timeState.timeSinceLoad >= startTime)) // 3.5 == 109 ticks || (Net.isClient && this.serverStartTicks != 0 && @:privateAccess this.marble.serverTicks >= this.serverStartTicks + 109)) { this.multiplayerStarted = true; this.marble.setMode(Play); for (client => marble in this.clientMarbles) marble.setMode(Play); + + this.playGui.setCenterText('go'); + } + } + if (this.multiplayerStarted) { + if ((Net.isHost && (this.timeState.timeSinceLoad > startTime + 2.0)) // 3.5 == 109 ticks + || (Net.isClient && this.serverStartTicks != 0 && @:privateAccess this.marble.serverTicks > this.serverStartTicks + 172)) { + this.playGui.setCenterText('none'); } } } diff --git a/src/mis/MissionElement.hx b/src/mis/MissionElement.hx index c54ee1a7..456d514a 100644 --- a/src/mis/MissionElement.hx +++ b/src/mis/MissionElement.hx @@ -62,6 +62,8 @@ class MissionElementScriptObject extends MissionElementBase { var maxgemsperspawn:String; var radiusfromgem:String; var spawnblock:String; + var overviewwidth:String; + var overviewheight:String; public function new() { _type = MissionElementType.ScriptObject; diff --git a/src/modes/GameMode.hx b/src/modes/GameMode.hx index e81008c9..87134a82 100644 --- a/src/modes/GameMode.hx +++ b/src/modes/GameMode.hx @@ -17,6 +17,7 @@ interface GameMode { public function getSpawnTransform():{position:Vector, orientation:Quat, up:Vector}; public function getRespawnTransform(marble:Marble):{position:Vector, orientation:Quat, up:Vector}; public function missionScan(mission:Mission):Void; + public function onMissionLoad():Void; public function getStartTime():Float; public function timeMultiplier():Float; public function getScoreType():ScoreType; diff --git a/src/modes/HuntMode.hx b/src/modes/HuntMode.hx index d8ba37af..e2ee26ec 100644 --- a/src/modes/HuntMode.hx +++ b/src/modes/HuntMode.hx @@ -332,6 +332,10 @@ class HuntMode extends NullMode { @:privateAccess level.playGui.formatGemHuntCounter(points); } + override function onMissionLoad() { + prepareGems(); + } + override function onClientRestart() { prepareGems(); } diff --git a/src/modes/NullMode.hx b/src/modes/NullMode.hx index e117e8af..16d54164 100644 --- a/src/modes/NullMode.hx +++ b/src/modes/NullMode.hx @@ -136,4 +136,6 @@ class NullMode implements GameMode { // } public function onClientRestart() {} + + public function onMissionLoad() {} } diff --git a/src/net/NetCommands.hx b/src/net/NetCommands.hx index 50401992..d7f6c4b5 100644 --- a/src/net/NetCommands.hx +++ b/src/net/NetCommands.hx @@ -195,6 +195,7 @@ class NetCommands { if (MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1] is MPPreGameDlg) { MarbleGame.canvas.popDialog(MarbleGame.canvas.children[MarbleGame.canvas.children.length - 1]); MarbleGame.instance.world.setCursorLock(true); + MarbleGame.instance.world.marble.camera.stopOverview(); } } }