diff --git a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs index 4824ea005..c0b42c8da 100644 --- a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs @@ -814,15 +814,12 @@ namespace Barotrauma } else { - notClimbing = Math.Abs(targetMovement.X) > 0.05f; + notClimbing = Math.Abs(targetMovement.X) > 0.05f || + (TargetMovement.Y < 0.0f && ConvertUnits.ToSimUnits(trigger.Height) + handPos.Y < HeadPosition) || + (TargetMovement.Y > 0.0f && handPos.Y > 0.1f); } - //stop climbing if: - // - moving sideways - // - reached the top or bottom of the ladder - if (notClimbing || - (TargetMovement.Y < 0.0f && ConvertUnits.ToSimUnits(trigger.Height) + handPos.Y < HeadPosition) || - (TargetMovement.Y > 0.0f && handPos.Y > 0.1f)) + if (notClimbing) { Anim = Animation.None; character.SelectedConstruction = null; diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index 0e55b948d..6b9490491 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -793,7 +793,10 @@ namespace Barotrauma if (original != simPosition) { - Body body = Submarine.CheckVisibility(original, simPosition); + Category collisionCategory = Physics.CollisionWall | Physics.CollisionLevel; + if (!ignorePlatforms) collisionCategory |= Physics.CollisionPlatform; + + Body body = Submarine.PickBody(original, simPosition, null, collisionCategory); //if there's something in between the limbs if (body != null) @@ -803,13 +806,10 @@ namespace Barotrauma } } - - if (lerp) { limb.body.TargetPosition = movePos; - limb.body.MoveToTargetPosition(Vector2.Distance(limb.SimPosition, movePos) < 10.0f); - + limb.body.MoveToTargetPosition(Vector2.Distance(limb.SimPosition, movePos) < 10.0f); } else { diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 9edfe9614..2fadac1c6 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -1602,6 +1602,7 @@ namespace Barotrauma GameServer.Log(Name + " selected " + pickedItem.Name, Color.Orange); } pickedItem.Pick(this, false, pickHit, actionHit); + } return; @@ -1732,6 +1733,8 @@ namespace Barotrauma return; } + if (GameMain.Server != null && (isDead || IsUnconscious)) return; + keys[(int)InputType.Use].Held = actionKeyState; keys[(int)InputType.Use].SetState(false, actionKeyState); diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index e8a6dfc9a..57297b9f5 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -1301,14 +1301,19 @@ namespace Barotrauma System.Diagnostics.Debug.WriteLine("Item.Pick(" + picker + ", " + forceSelectKey + ")"); - if (picker.SelectedConstruction == this) + if (selected) { - if (picker.IsKeyHit(InputType.Select)) picker.SelectedConstruction = null; - } - else if (selected) - { - picker.SelectedConstruction = this; + if (picker.SelectedConstruction == this) + { + picker.SelectedConstruction = null; + } + else + { + picker.SelectedConstruction = this; + } } + + if (!hasRequiredSkills && Character.Controlled==picker && Screen.Selected != GameMain.EditMapScreen) { diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index de9f21253..720fc5dee 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -383,12 +383,18 @@ namespace Barotrauma fixture.CollisionCategories == Category.None || fixture.CollisionCategories == Physics.CollisionItem) return -1; - if (collisionCategory != null && !fixture.CollisionCategories.HasFlag((Category)collisionCategory)) return -1; + if (collisionCategory != null && + !fixture.CollisionCategories.HasFlag((Category)collisionCategory) && + !((Category)collisionCategory).HasFlag(fixture.CollisionCategories)) return -1; if (ignoredBodies != null && ignoredBodies.Contains(fixture.Body)) return -1; - + Structure structure = fixture.Body.UserData as Structure; - if (structure != null && (structure.IsPlatform || !structure.HasBody)) return -1; + if (structure != null) + { + if (!structure.HasBody) return -1; + if (structure.IsPlatform && collisionCategory != null && !((Category)collisionCategory).HasFlag(Physics.CollisionPlatform)) return -1; + } if (fraction < closestFraction) { diff --git a/Subsurface/Source/Networking/NetConfig.cs b/Subsurface/Source/Networking/NetConfig.cs index 655f77b69..2f055c8e1 100644 --- a/Subsurface/Source/Networking/NetConfig.cs +++ b/Subsurface/Source/Networking/NetConfig.cs @@ -17,7 +17,7 @@ //if a ragdoll is further than this from the correct position, teleport it there //(in sim units) - public const float ResetRagdollDistance = 2.0f; + public const float ResetRagdollDistance = 1.0f; //if the ragdoll is closer than this, don't try to correct its position public const float AllowedRagdollDistance = 0.1f;