diff --git a/Barotrauma/BarotraumaClient/Source/Items/Item.cs b/Barotrauma/BarotraumaClient/Source/Items/Item.cs index bf8b5649d..ee2a4d152 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Item.cs @@ -9,6 +9,8 @@ using System; using System.Collections.Generic; using System.Linq; using Barotrauma.Extensions; +using FarseerPhysics.Dynamics; +using FarseerPhysics.Dynamics.Contacts; namespace Barotrauma { @@ -22,6 +24,9 @@ namespace Barotrauma public IEnumerable ActiveHUDs => activeHUDs; + public float LastImpactSoundTime; + public const float ImpactSoundInterval = 0.2f; + class SpriteState { public float RotationState; @@ -360,6 +365,17 @@ namespace Barotrauma } } + partial void OnCollisionProjSpecific(Fixture f1, Fixture f2, Contact contact, float impact) + { + if (impact > 1.0f && + !string.IsNullOrEmpty(Prefab.ImpactSoundTag) && + Timing.TotalTime > LastImpactSoundTime + ImpactSoundInterval) + { + LastImpactSoundTime = (float)Timing.TotalTime; + SoundPlayer.PlaySound(Prefab.ImpactSoundTag, 1.0f, 500.0f, WorldPosition, CurrentHull); + } + } + public void UpdateSpriteStates(float deltaTime) { foreach (int spriteGroup in Prefab.DecorativeSpriteGroups.Keys) diff --git a/Barotrauma/BarotraumaClient/Source/Items/ItemPrefab.cs b/Barotrauma/BarotraumaClient/Source/Items/ItemPrefab.cs index 821a28a95..53cdf7c63 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/ItemPrefab.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/ItemPrefab.cs @@ -191,6 +191,10 @@ namespace Barotrauma protected set; } + + [Serialize("", false)] + public string ImpactSoundTag { get; private set; } + public override void DrawPlacing(SpriteBatch spriteBatch, Camera cam) { Vector2 position = Submarine.MouseToWorldGrid(cam, Submarine.MainSub); diff --git a/Barotrauma/BarotraumaShared/SharedContent.projitems b/Barotrauma/BarotraumaShared/SharedContent.projitems index 141ff1db9..0cedc6162 100644 --- a/Barotrauma/BarotraumaShared/SharedContent.projitems +++ b/Barotrauma/BarotraumaShared/SharedContent.projitems @@ -1928,6 +1928,42 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index fc1b764d1..b19da3967 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -579,13 +579,12 @@ namespace Barotrauma } } - //containers need to handle collision events to notify items inside them about the impact - var itemContainer = GetComponent(); - if (ImpactTolerance > 0.0f || itemContainer != null) + if (body != null) { - if (body != null) body.FarseerBody.OnCollision += OnCollision; + body.FarseerBody.OnCollision += OnCollision; } + var itemContainer = GetComponent(); if (itemContainer != null) { ownInventory = itemContainer.Inventory; @@ -1145,6 +1144,12 @@ namespace Barotrauma return; } + float forceFactor = 1.0f; + if (CurrentHull != null) + { + return; + } + float forceFactor = 1.0f; if (CurrentHull != null) { @@ -1166,19 +1171,18 @@ namespace Barotrauma body.ApplyForce((uplift - drag) * 10.0f, maxVelocity: NetConfig.MaxPhysicsBodyVelocity); //apply simple angular drag - body.ApplyTorque(body.AngularVelocity * volume * -0.05f); + body.ApplyTorque(body.AngularVelocity * volume * -0.05f); } private bool OnCollision(Fixture f1, Fixture f2, Contact contact) { -#if CLIENT - if (GameMain.Client != null) return true; -#endif - Vector2 normal = contact.Manifold.LocalNormal; - float impact = Vector2.Dot(f1.Body.LinearVelocity, -normal); + OnCollisionProjSpecific(f1, f2, contact, impact); + + if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsClient) { return true; } + if (ImpactTolerance > 0.0f && impact > ImpactTolerance) { ApplyStatusEffects(ActionType.OnImpact, 1.0f); @@ -1200,6 +1204,8 @@ namespace Barotrauma return true; } + partial void OnCollisionProjSpecific(Fixture f1, Fixture f2, Contact contact, float impact); + public override void FlipX(bool relativeToSub) { base.FlipX(relativeToSub);