From 48eabedb778a041ac4238602055693489ca98b06 Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 6 Jan 2016 20:17:41 +0200 Subject: [PATCH] Fixed server end cinematic, bugfix in submarine position syncing, CharacterIgnoreDistance bugfix, readded crew button to multiplayer, searching a path out of the sub --- .../AI/Objectives/AIObjectiveGoTo.cs | 22 ++++++++-- Subsurface/Source/Characters/AI/PathFinder.cs | 31 +++++++++++--- Subsurface/Source/Characters/AICharacter.cs | 18 ++++----- .../Source/Events/Quests/MonsterQuest.cs | 7 +++- Subsurface/Source/GameSession/CrewManager.cs | 3 +- .../GameSession/GameModes/SinglePlayerMode.cs | 2 +- Subsurface/Source/Map/Entity.cs | 2 +- Subsurface/Source/Map/Hull.cs | 11 +++-- Subsurface/Source/Map/MapEntity.cs | 11 ++--- Subsurface/Source/Map/Submarine.cs | 12 +++++- Subsurface/Source/Map/SubmarineBody.cs | 15 +++++-- Subsurface/Source/Map/TransitionCinematic.cs | 7 +++- Subsurface/Source/Map/WayPoint.cs | 4 +- Subsurface/Source/Networking/GameClient.cs | 38 ++++++++++++++---- Subsurface/Source/Networking/GameServer.cs | 26 +++++++----- Subsurface/Source/Networking/NetworkMember.cs | 4 ++ Subsurface_Solution.v12.suo | Bin 846848 -> 849408 bytes 17 files changed, 156 insertions(+), 57 deletions(-) diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs index 88aa9edd5..c8a38af87 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGoTo.cs @@ -62,10 +62,26 @@ namespace Barotrauma if (target!=null) character.AIController.SelectTarget(target.AiTarget); - character.AIController.SteeringManager.SteeringSeek( - target != null ? target.SimPosition : targetPos); - Vector2 currTargetPos = target != null ? target.SimPosition : targetPos; + Vector2 currTargetPos = Vector2.Zero; + + if (target == null) + { + currTargetPos = targetPos; + } + else + { + currTargetPos = target.SimPosition; + + //if character is outside the sub and target isn't, transform the position + if (character.Submarine == null && target.Submarine != null) + { + currTargetPos += target.Submarine.SimPosition; + } + } + + character.AIController.SteeringManager.SteeringSeek(currTargetPos); + if (Vector2.Distance(currTargetPos, character.SimPosition) < 1.0f) { character.AnimController.TargetDir = currTargetPos.X > character.SimPosition.X ? Direction.Right : Direction.Left; diff --git a/Subsurface/Source/Characters/AI/PathFinder.cs b/Subsurface/Source/Characters/AI/PathFinder.cs index 8b3ab05c3..f76c31ba4 100644 --- a/Subsurface/Source/Characters/AI/PathFinder.cs +++ b/Subsurface/Source/Characters/AI/PathFinder.cs @@ -100,12 +100,22 @@ namespace Barotrauma PathNode startNode = null; foreach (PathNode node in nodes) { - float dist = System.Math.Abs(start.X-node.Position.X)+ - System.Math.Abs(start.Y - node.Position.Y)*10.0f + - Vector2.Distance(end,node.Position)/2.0f; + Vector2 nodePos = node.Position; + + //if node waypoint is one of submarine waypoints outside the sub, transform position + if (node.Waypoint != null && node.Waypoint.Submarine != null && node.Waypoint.CurrentHull == null) + { + nodePos -= node.Waypoint.Submarine.Position; + } + + float dist = System.Math.Abs(start.X-nodePos.X)+ + System.Math.Abs(start.Y - nodePos.Y)*10.0f + + Vector2.Distance(end,nodePos)/2.0f; + if (dist NetConfig.CharacterIgnoreDistance) return false; + //if ((AnimController.RefLimb.SimPosition - Submarine.Loaded.SimPosition).Length() > NetConfig.CharacterIgnoreDistance) return false; message.Write(AnimController.RefLimb.SimPosition.X); message.Write(AnimController.RefLimb.SimPosition.Y); @@ -94,15 +94,15 @@ namespace Barotrauma aiController.FillNetworkData(message); return true; case NetworkEventType.EntityUpdate: - if (Submarine == null) - { - if ((AnimController.RefLimb.SimPosition - Submarine.Loaded.SimPosition).Length() > NetConfig.CharacterIgnoreDistance) return false; + //if (Submarine == null) + //{ + // if ((AnimController.RefLimb.SimPosition - Submarine.Loaded.SimPosition).Length() > NetConfig.CharacterIgnoreDistance) return false; - } - else - { - if (AnimController.RefLimb.SimPosition.Length() > NetConfig.CharacterIgnoreDistance) return false; - } + //} + //else + //{ + // if (AnimController.RefLimb.SimPosition.Length() > NetConfig.CharacterIgnoreDistance) return false; + //} message.Write(AnimController.TargetDir == Direction.Right); diff --git a/Subsurface/Source/Events/Quests/MonsterQuest.cs b/Subsurface/Source/Events/Quests/MonsterQuest.cs index 22cfd873d..c1c21c269 100644 --- a/Subsurface/Source/Events/Quests/MonsterQuest.cs +++ b/Subsurface/Source/Events/Quests/MonsterQuest.cs @@ -11,9 +11,11 @@ namespace Barotrauma private Character monster; + private Vector2 radarPosition; + public override Vector2 RadarPosition { - get { return monster.Position; } + get { return radarPosition; } } public MonsterMission(XElement element) @@ -27,6 +29,7 @@ namespace Barotrauma Vector2 position = level.PositionsOfInterest[Rand.Int(level.PositionsOfInterest.Count, false)]; monster = Character.Create(monsterFile, position); + radarPosition = monster.Position; } public override void Update(float deltaTime) @@ -34,6 +37,8 @@ namespace Barotrauma switch (state) { case 0: + if (monster.Enabled) radarPosition = monster.Position; + if (!monster.IsDead) return; ShowMessage(state); state = 1; diff --git a/Subsurface/Source/GameSession/CrewManager.cs b/Subsurface/Source/GameSession/CrewManager.cs index b946c5e1a..2039166b3 100644 --- a/Subsurface/Source/GameSession/CrewManager.cs +++ b/Subsurface/Source/GameSession/CrewManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.IO; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; @@ -225,7 +226,7 @@ namespace Barotrauma AddCharacter(character); } - if (characters.Count > 0) SelectCharacter(null, characters[0]); + if (characters.Any()) listBox.Select(0);// SelectCharacter(null, characters[0]); } public void EndShift() diff --git a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs index 56ea00291..189e8609f 100644 --- a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs +++ b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs @@ -235,7 +235,7 @@ namespace Barotrauma { isRunning = false; - var cinematic = new TransitionCinematic(Submarine.Loaded, GameMain.GameScreen.Cam); + var cinematic = new TransitionCinematic(Submarine.Loaded, GameMain.GameScreen.Cam, 5.0f); SoundPlayer.OverrideMusicType = CrewManager.characters.Any(c => !c.IsDead) ? "endshift" : "crewdead"; diff --git a/Subsurface/Source/Map/Entity.cs b/Subsurface/Source/Map/Entity.cs index 51f3ce6dc..1b0ed6019 100644 --- a/Subsurface/Source/Map/Entity.cs +++ b/Subsurface/Source/Map/Entity.cs @@ -51,7 +51,7 @@ namespace Barotrauma get { return Vector2.Zero; } } - public Vector2 WorldPosition + public virtual Vector2 WorldPosition { get { return Submarine == null ? Position : Submarine.Position + Position; } } diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index a84bebfef..c1c1394fe 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -170,15 +170,14 @@ namespace Barotrauma InsertToList(); } - public override void OnMapLoaded() + public static void GenerateEntityGrid() { - - if (entityGrid == null) + entityGrid = new EntityGrid(Submarine.Borders, 200.0f); + + foreach (Hull hull in hullList) { - entityGrid = new EntityGrid(Submarine.Borders, 200.0f); + entityGrid.InsertEntity(hull); } - - entityGrid.InsertEntity(this); } public override bool Contains(Vector2 position) diff --git a/Subsurface/Source/Map/MapEntity.cs b/Subsurface/Source/Map/MapEntity.cs index 0808d1021..7a6fc88ca 100644 --- a/Subsurface/Source/Map/MapEntity.cs +++ b/Subsurface/Source/Map/MapEntity.cs @@ -499,13 +499,14 @@ namespace Barotrauma } } + for (int i = 0; i < mapEntityList.Count; i++) + { + if (mapEntityList[i].Submarine != null) mapEntityList[i].Move(Submarine.HiddenSubPosition); + } + for (int i = 0; i " + Position + " - " + dist); if (dist > 1000.0f) { - body.SetTransform(targetSimPos, 0.0f); + body.SetTransform(ConvertUnits.ToSimUnits((Vector2)targetPosition), 0.0f); + + GameMain.GameScreen.Cam.Position = submarine.Position + Submarine.HiddenSubPosition; targetPosition = null; } else if (dist > 50.0f) { - Vector2 moveAmount = Vector2.Normalize(targetSimPos - body.Position); - moveAmount *= Math.Min(dist, 100.0f); + Vector2 moveAmount = Vector2.Normalize((Vector2)targetPosition - Position); + moveAmount *= ConvertUnits.ToSimUnits(Math.Min(dist, 100.0f)); + + System.Diagnostics.Debug.WriteLine("moveamount: "+moveAmount); body.SetTransform(body.Position + moveAmount * deltaTime, 0.0f); + + //GameMain.GameScreen.Cam.Position += ConvertUnits.ToDisplayUnits(moveAmount); } else { diff --git a/Subsurface/Source/Map/TransitionCinematic.cs b/Subsurface/Source/Map/TransitionCinematic.cs index 5e5376cf0..b7af7ef3e 100644 --- a/Subsurface/Source/Map/TransitionCinematic.cs +++ b/Subsurface/Source/Map/TransitionCinematic.cs @@ -15,8 +15,10 @@ namespace Barotrauma get; private set; } + + private float duration; - public TransitionCinematic(Submarine submarine, Camera cam) + public TransitionCinematic(Submarine submarine, Camera cam, float duration) { Vector2 targetPos = submarine.Position; @@ -29,6 +31,8 @@ namespace Barotrauma targetPos = Level.Loaded.StartPosition + Vector2.UnitY * 500.0f; } + this.duration = duration; + Running = true; CoroutineManager.StartCoroutine(UpdateTransitionCinematic(submarine, cam, targetPos)); } @@ -46,7 +50,6 @@ namespace Barotrauma Level.Loaded.ShaftBodies[1].Enabled = false; cam.TargetPos = Vector2.Zero; - float duration = 5.0f; float timer = 0.0f; while (timer < duration) diff --git a/Subsurface/Source/Map/WayPoint.cs b/Subsurface/Source/Map/WayPoint.cs index ca740db60..d7c74bf06 100644 --- a/Subsurface/Source/Map/WayPoint.cs +++ b/Subsurface/Source/Map/WayPoint.cs @@ -80,6 +80,8 @@ namespace Barotrauma InsertToList(); WayPointList.Add(this); + + currentHull = Hull.FindHull(WorldPosition); } public override void Draw(SpriteBatch spriteBatch, bool editing, bool back=true) @@ -472,7 +474,7 @@ namespace Barotrauma public override void OnMapLoaded() { - currentHull = Hull.FindHull(WorldPosition); + currentHull = Hull.FindHull(WorldPosition, currentHull); } public override XElement Save(XDocument doc) diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 3d3e15c38..55dd52e89 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -596,27 +596,51 @@ namespace Barotrauma.Networking Character.Controlled = null; GameMain.LightManager.LosEnabled = false; + float endPreviewLength = 10.0f; - DateTime endTime = DateTime.Now + new TimeSpan(0,0,0,0,(int)(1000.0f*endPreviewLength)); + var cinematic = new TransitionCinematic(Submarine.Loaded, GameMain.GameScreen.Cam, endPreviewLength); + float secondsLeft = endPreviewLength; do { - secondsLeft = (float)(endTime - DateTime.Now).TotalSeconds; + secondsLeft -= CoroutineManager.DeltaTime; - float camAngle = (float)((DateTime.Now - endTime).TotalSeconds / endPreviewLength) * MathHelper.TwoPi; - Vector2 offset = (new Vector2( - (float)Math.Cos(camAngle) * (Submarine.Borders.Width / 2.0f), - (float)Math.Sin(camAngle) * (Submarine.Borders.Height / 2.0f))); + //float camAngle = (float)((DateTime.Now - endTime).TotalSeconds / endPreviewLength) * MathHelper.TwoPi; + //Vector2 offset = (new Vector2( + // (float)Math.Cos(camAngle) * (Submarine.Borders.Width / 2.0f), + // (float)Math.Sin(camAngle) * (Submarine.Borders.Height / 2.0f))); - GameMain.GameScreen.Cam.TargetPos = Submarine.Loaded.DrawPosition + offset * 0.8f; + //GameMain.GameScreen.Cam.TargetPos = Submarine.Loaded.Position + offset * 0.8f; //Game1.GameScreen.Cam.MoveCamera((float)deltaTime); messageBox.Text = endMessage + "\nReturning to lobby in " + (int)secondsLeft + " s"; + yield return CoroutineStatus.Running; } while (secondsLeft > 0.0f); + //float endPreviewLength = 10.0f; + + //DateTime endTime = DateTime.Now + new TimeSpan(0,0,0,0,(int)(1000.0f*endPreviewLength)); + //float secondsLeft = endPreviewLength; + + //do + //{ + // secondsLeft = (float)(endTime - DateTime.Now).TotalSeconds; + + // float camAngle = (float)((DateTime.Now - endTime).TotalSeconds / endPreviewLength) * MathHelper.TwoPi; + // Vector2 offset = (new Vector2( + // (float)Math.Cos(camAngle) * (Submarine.Borders.Width / 2.0f), + // (float)Math.Sin(camAngle) * (Submarine.Borders.Height / 2.0f))); + + // GameMain.GameScreen.Cam.TargetPos = Submarine.Loaded.DrawPosition + offset * 0.8f; + // //Game1.GameScreen.Cam.MoveCamera((float)deltaTime); + + // messageBox.Text = endMessage + "\nReturning to lobby in " + (int)secondsLeft + " s"; + // yield return CoroutineStatus.Running; + //} while (secondsLeft > 0.0f); + messageBox.Close(null,null); Submarine.Unload(); diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 18cdf275b..c0e98f219 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -288,7 +288,9 @@ namespace Barotrauma.Networking { if (!(c is AICharacter) || c.IsDead) continue; - if (c.SimPosition.Length() > NetConfig.CharacterIgnoreDistance) continue; + Vector2 diff = Submarine.Loaded.WorldPosition - c.WorldPosition; + + if (FarseerPhysics.ConvertUnits.ToSimUnits(diff.Length()) > NetConfig.CharacterIgnoreDistance) continue; new NetworkEvent(NetworkEventType.EntityUpdate, c.ID, false); } @@ -318,7 +320,12 @@ namespace Barotrauma.Networking { if (c.IsDead) continue; - if (c is AICharacter && c.SimPosition.Length() > NetConfig.CharacterIgnoreDistance) continue; + if (c is AICharacter) + { + Vector2 diff = c.WorldPosition - Submarine.Loaded.WorldPosition; + + if (FarseerPhysics.ConvertUnits.ToSimUnits(diff.Length()) > NetConfig.CharacterIgnoreDistance) continue; + } new NetworkEvent(NetworkEventType.ImportantEntityUpdate, c.ID, false); } @@ -870,19 +877,20 @@ namespace Barotrauma.Networking float endPreviewLength = 10.0f; - DateTime endTime = DateTime.Now + new TimeSpan(0, 0, 0, 0, (int)(1000.0f * endPreviewLength)); + var cinematic = new TransitionCinematic(Submarine.Loaded, GameMain.GameScreen.Cam, endPreviewLength); + float secondsLeft = endPreviewLength; do { - secondsLeft = (float)(endTime - DateTime.Now).TotalSeconds; + secondsLeft -= CoroutineManager.DeltaTime; - float camAngle = (float)((DateTime.Now - endTime).TotalSeconds / endPreviewLength) * MathHelper.TwoPi; - Vector2 offset = (new Vector2( - (float)Math.Cos(camAngle) * (Submarine.Borders.Width / 2.0f), - (float)Math.Sin(camAngle) * (Submarine.Borders.Height / 2.0f))); + //float camAngle = (float)((DateTime.Now - endTime).TotalSeconds / endPreviewLength) * MathHelper.TwoPi; + //Vector2 offset = (new Vector2( + // (float)Math.Cos(camAngle) * (Submarine.Borders.Width / 2.0f), + // (float)Math.Sin(camAngle) * (Submarine.Borders.Height / 2.0f))); - GameMain.GameScreen.Cam.TargetPos = Submarine.Loaded.Position + offset * 0.8f; + //GameMain.GameScreen.Cam.TargetPos = Submarine.Loaded.Position + offset * 0.8f; //Game1.GameScreen.Cam.MoveCamera((float)deltaTime); messageBox.Text = endMessage + "\nReturning to lobby in " + (int)secondsLeft + " s"; diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index 10395e611..8e2b01754 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -206,6 +206,8 @@ namespace Barotrauma.Networking { inGameHUD.Update(deltaTime); + GameMain.GameSession.CrewManager.Update(deltaTime); + //if (crewFrameOpen) crewFrame.Update(deltaTime); if (Character.Controlled == null || Character.Controlled.IsDead) @@ -233,6 +235,8 @@ namespace Barotrauma.Networking { if (!gameStarted || Screen.Selected != GameMain.GameScreen) return; + GameMain.GameSession.CrewManager.Draw(spriteBatch); + inGameHUD.Draw(spriteBatch); } diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index eb1deec25061791bd9ed810b1a0c2bae27cd8a69..4f23039e965b9cb81628159740c5787eeedcd2fe 100644 GIT binary patch delta 16461 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 j@Xz$6EYnOj=*j{!T->?+5!}I