diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index 2bcb357c5..b92ce3d2a 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -536,17 +536,28 @@ namespace Barotrauma } } - public void FindHull() + public void FindHull(bool setSubmarine = true) { Hull newHull = Hull.FindHull( ConvertUnits.ToDisplayUnits(refLimb.SimPosition), currentHull); - + if (newHull == currentHull) return; - CurrentHull = newHull; - + if (setSubmarine) + { + if (newHull == null && currentHull.Submarine != null) + { + SetPosition(refLimb.SimPosition + ConvertUnits.ToSimUnits(currentHull.Submarine.Position)); + } + else if (currentHull == null && newHull != null && newHull.Submarine != null) + { + SetPosition(refLimb.SimPosition - ConvertUnits.ToSimUnits(newHull.Submarine.Position)); + } + } + CurrentHull = newHull; + UpdateCollisionCategories(); } diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 2126dbb26..6796d5346 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -443,7 +443,7 @@ namespace Barotrauma } } - AnimController.FindHull(); + AnimController.FindHull(false); CharacterList.Add(this); @@ -755,7 +755,6 @@ namespace Barotrauma if (moveCam) { - cam.TargetPos = WorldPosition; cam.OffsetAmount = MathHelper.Lerp(cam.OffsetAmount, 250.0f, 0.05f); } diff --git a/Subsurface/Source/Characters/CharacterHUD.cs b/Subsurface/Source/Characters/CharacterHUD.cs index d57d1e94c..63dfb0a46 100644 --- a/Subsurface/Source/Characters/CharacterHUD.cs +++ b/Subsurface/Source/Characters/CharacterHUD.cs @@ -67,7 +67,7 @@ namespace Barotrauma else if (character.SelectedCharacter == null && character.ClosestItem != null && character.SelectedConstruction == null) { - Vector2 startPos = character.Position + (character.ClosestItem.Position - character.Position) * 0.7f; + Vector2 startPos = character.WorldPosition + (character.ClosestItem.WorldPosition - character.WorldPosition) * 0.7f; startPos = cam.WorldToScreen(startPos); Vector2 textPos = startPos; diff --git a/Subsurface/Source/Items/Components/ItemContainer.cs b/Subsurface/Source/Items/Components/ItemContainer.cs index 8021ae386..d2a9c716b 100644 --- a/Subsurface/Source/Items/Components/ItemContainer.cs +++ b/Subsurface/Source/Items/Components/ItemContainer.cs @@ -163,6 +163,7 @@ namespace Barotrauma.Items.Components if (item.body == null) { transformedItemPos = new Vector2(item.Rect.X, item.Rect.Y); + if (item.Submarine != null) transformedItemPos += item.Submarine.Position; transformedItemPos = transformedItemPos + itemPos; } else @@ -179,7 +180,7 @@ namespace Barotrauma.Items.Components transformedItemPos = Vector2.Transform(transformedItemPos, transform); transformedItemInterval = Vector2.Transform(transformedItemInterval, transform); - transformedItemPos += ConvertUnits.ToDisplayUnits(item.body.SimPosition); + transformedItemPos += item.DrawPosition; currentRotation += item.body.Rotation; } diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 0d923aaf3..76856230b 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -1257,6 +1257,16 @@ namespace Barotrauma } } + + public override void OnMapLoaded() + { + FindHull(); + + foreach (ItemComponent ic in components) + { + ic.OnMapLoaded(); + } + } public void NewComponentEvent(ItemComponent ic, bool isClient, bool isImportant) diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index fe80f64d8..6c0d41534 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -384,9 +384,8 @@ namespace Barotrauma if (subBody != null) subBody.ApplyForce(force); } - public void SetPrevTransform(Vector2 position, Camera cam = null) + public void SetPrevTransform(Vector2 position) { - if (cam != null) cam.Position += prevPosition - position; prevPosition = position; } @@ -646,23 +645,16 @@ namespace Barotrauma subBody = new SubmarineBody(this); - MapEntity.MapLoaded(); - - foreach (Item item in Item.ItemList) - { - foreach (ItemComponent ic in item.components) - { - ic.OnMapLoaded(); - } - } + loaded = this; + MapEntity.MapLoaded(); + WayPoint.GenerateSubWaypoints(); GameMain.LightManager.OnMapLoaded(); ID = ushort.MaxValue-10; - loaded = this; } public static Submarine Load(string fileName) diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index fb76a9f4e..75f9f334e 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -101,14 +101,15 @@ namespace Barotrauma while (Physics.accumulator >= Physics.step) { cam.MoveCamera((float)Physics.step); + if (Character.Controlled != null) cam.TargetPos = Character.Controlled.WorldPosition; - if (Submarine.Loaded != null) Submarine.Loaded.SetPrevTransform(Submarine.Loaded.Position, cam); + if (Submarine.Loaded != null) Submarine.Loaded.SetPrevTransform(Submarine.Loaded.Position); foreach (PhysicsBody pb in PhysicsBody.list) { pb.SetPrevTransform(pb.SimPosition, pb.Rotation); } - + MapEntity.UpdateAll(cam, (float)Physics.step); Character.UpdateAnimAll((float)Physics.step); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index ffd5b832a..aa21a3b5c 100644 Binary files a/Subsurface_Solution.v12.suo and b/Subsurface_Solution.v12.suo differ