diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs b/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs index 8f9276859..bcf133b30 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs @@ -152,6 +152,32 @@ namespace Barotrauma } + if (character.MemLocalState.Count > 120) character.MemLocalState.RemoveRange(0, character.MemLocalState.Count - 120); + character.MemState.Clear(); + } + } + + partial void ImpactProjSpecific(float impact, Body body) + { + float volume = MathHelper.Clamp(impact - 3.0f, 0.5f, 1.0f); + + if (body.UserData is Limb limb && character.Stun <= 0f) + { + if (impact > 3.0f) { PlayImpactSound(limb); } + } + else if (body.UserData is Limb || body == Collider.FarseerBody) + { + if (!character.IsRemotePlayer && impact > ImpactTolerance) + { + SoundPlayer.PlayDamageSound("LimbBlunt", strongestImpact, Collider); + } + } + if (Character.Controlled == character) + { + GameMain.GameScreen.Cam.Shake = Math.Min(Math.Max(strongestImpact, GameMain.GameScreen.Cam.Shake), 3.0f); + } + } + if (character.MemState.Count < 1) return; overrideTargetMovement = Vector2.Zero; diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs b/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs index e032b3a6a..4e2f07fae 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs @@ -744,6 +744,8 @@ namespace Barotrauma private GUILayoutGroup subPreviewContainer; + private GUILayoutGroup subPreviewContainer; + private GUIButton loadGameButton; public Action StartNewGame; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs index 39f56cfa0..ba9f811d7 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs @@ -101,630 +101,6 @@ namespace Barotrauma { #if DEBUG DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); -#endif - abandon = true; - return; - } - Vector2 gapDiff = Leak.WorldPosition - character.WorldPosition; - // TODO: use the collider size/reach? - if (!character.AnimController.InWater && Math.Abs(gapDiff.X) < 100 && gapDiff.Y < 0.0f && gapDiff.Y > -150) - { - HumanAIController.AnimController.Crouching = true; - } - float reach = ConvertUnits.ToSimUnits(repairTool.Range); - bool canOperate = ConvertUnits.ToSimUnits(gapDiff.Length()) < reach * 1.5f; - if (canOperate) - { - TryAddSubObjective(ref operateObjective, () => new AIObjectiveOperateItem(repairTool, character, objectiveManager, option: "", requireEquip: true, operateTarget: Leak)); - } - else - { - TryAddSubObjective(ref gotoObjective, () => new AIObjectiveGoTo(ConvertUnits.ToSimUnits(GetStandPosition()), character, objectiveManager) { CloseEnough = reach * 0.75f }); - } - if (subObjectives.Any()) { return; } - var repairTool = weldingTool.GetComponent(); - if (repairTool == null) - { -#if DEBUG - DebugConsole.ThrowError("AIObjectiveFixLeak failed - the item \"" + weldingTool + "\" has no RepairTool component but is tagged as a welding tool"); #endif abandon = true; return; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs index 88881b170..b617e56e7 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs @@ -74,36 +74,6 @@ namespace Barotrauma } } - public override void Update(float deltaTime) - { - if (objectiveManager.CurrentObjective == this) - { - if (randomTimer > 0) - { - randomTimer -= deltaTime; - } - else - { - SetRandom(); - } - } - } - - public override void Update(float deltaTime) - { - if (objectiveManager.CurrentObjective == this) - { - if (randomTimer > 0) - { - randomTimer -= deltaTime; - } - else - { - SetRandom(); - } - } - } - public override bool IsCompleted() => false; public override bool CanBeCompleted => true; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs index 249eb8da0..aa296d02c 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs @@ -16,7 +16,7 @@ namespace Barotrauma public List Objectives { get; private set; } = new List(); - private Character character; + private readonly Character character; private float _waitTimer; @@ -28,14 +28,7 @@ namespace Barotrauma get { return _waitTimer; } set { - if (CurrentObjective is AIObjectiveCombat || CurrentObjective is AIObjectiveFindSafety) - { - _waitTimer = 0; - } - else - { - _waitTimer = value; - } + _waitTimer = IsAllowedToWait() ? value : 0; } } @@ -205,31 +198,6 @@ namespace Barotrauma { CurrentObjective?.TryComplete(deltaTime); } - else - { - if (CurrentOrder != null) - { - CurrentOrder.TryComplete(deltaTime); - } - else - { - // Wait, if not swimming, climbing, or staying in a forbidden/unsafe hull. - if (character.AIController is HumanAIController humanAI && humanAI.SteeringManager != null) - { - if (!character.AnimController.InWater && - !character.IsClimbing && - !humanAI.UnsafeHulls.Contains(character.CurrentHull) && - !AIObjectiveIdle.IsForbidden(character.CurrentHull)) - { - humanAI.SteeringManager.Reset(); - } - else - { - CurrentObjective?.TryComplete(deltaTime); - } - } - } - } } public void SetOrder(AIObjective objective) @@ -306,5 +274,19 @@ namespace Barotrauma } return newObjective; } + + private bool IsAllowedToWait() + { + if (CurrentOrder != null) { return false; } + if (CurrentObjective is AIObjectiveCombat || CurrentObjective is AIObjectiveFindSafety) { return false; } + if (character.AnimController.InWater) { return false; } + if (character.IsClimbing) { return false; } + if (character.AIController is HumanAIController humanAI) + { + if (humanAI.UnsafeHulls.Contains(character.CurrentHull)) { return false; } + } + if (AIObjectiveIdle.IsForbidden(character.CurrentHull)) { return false; } + return true; + } } } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs index 1a245455c..08ebfe0d6 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs @@ -889,6 +889,10 @@ namespace Barotrauma { isCompleted = true; } + if (component.AIOperate(deltaTime, character, this)) + { + isCompleted = true; + } } else { diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index cc2e7af08..922c12222 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -1145,6 +1145,15 @@ namespace Barotrauma SmoothedCursorPosition = cursorPosition - smoothedCursorDiff; } + if (!(this is AICharacter) || Controlled == this || IsRemotePlayer) + { + //apply some smoothing to the cursor positions of remote players when playing as a client + //to make aiming look a little less choppy + Vector2 smoothedCursorDiff = cursorPosition - SmoothedCursorPosition; + smoothedCursorDiff = NetConfig.InterpolateCursorPositionError(smoothedCursorDiff); + SmoothedCursorPosition = cursorPosition - smoothedCursorDiff; + } + if (!(this is AICharacter) || Controlled == this || IsRemotePlayer) { if (speedMultipliers.Count == 0) return 1f; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs index bf78419aa..2b2d6255a 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs @@ -601,6 +601,25 @@ namespace Barotrauma.Items.Components } } + if (targetItem.Prefab.DeconstructItems.Any()) + { + inputContainer.Inventory.RemoveItem(targetItem); + Entity.Spawner.AddToRemoveQueue(targetItem); + MoveInputQueue(); + PutItemsToLinkedContainer(); + } + else + { + if (outputContainer.Inventory.Items.All(i => i != null)) + { + targetItem.Drop(dropper: null); + } + else + { + outputContainer.Inventory.TryPutItem(targetItem, user: null, createNetworkEvent: true); + } + } + if (targetItem.Prefab.DeconstructItems.Any()) { inputContainer.Inventory.RemoveItem(targetItem); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs index f6d19e87b..7a471a65c 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs @@ -144,6 +144,17 @@ namespace Barotrauma.Items.Components } } + public Vector2 SteeringInput + { + get { return steeringInput; } + set + { + if (!MathUtils.IsValid(value)) return; + steeringInput.X = MathHelper.Clamp(value.X, -100.0f, 100.0f); + steeringInput.Y = MathHelper.Clamp(value.Y, -100.0f, 100.0f); + } + } + public SteeringPath SteeringPath { if (!CanBeSelected) return false; @@ -164,12 +175,6 @@ namespace Barotrauma.Items.Components set { posToMaintain = value; } } - public Vector2? PosToMaintain - { - get { return posToMaintain; } - set { posToMaintain = value; } - } - struct ObstacleDebugInfo { public Vector2 Point1; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index badc65546..fcfcb9e02 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -1139,6 +1139,38 @@ namespace Barotrauma } } + public void UpdateTransform() + { + Submarine prevSub = Submarine; + + FindHull(); + + if (Submarine == null && prevSub != null) + { + body.SetTransform(body.SimPosition + prevSub.SimPosition, body.Rotation); + } + else if (Submarine != null && prevSub == null) + { + body.SetTransform(body.SimPosition - Submarine.SimPosition, body.Rotation); + } + else if (Submarine != null && prevSub != null && Submarine != prevSub) + { + body.SetTransform(body.SimPosition + prevSub.SimPosition - Submarine.SimPosition, body.Rotation); + } + + Vector2 displayPos = ConvertUnits.ToDisplayUnits(body.SimPosition); + rect.X = (int)(displayPos.X - rect.Width / 2.0f); + rect.Y = (int)(displayPos.Y + rect.Height / 2.0f); + + if (Math.Abs(body.LinearVelocity.X) > NetConfig.MaxPhysicsBodyVelocity || + Math.Abs(body.LinearVelocity.Y) > NetConfig.MaxPhysicsBodyVelocity) + { + body.LinearVelocity = new Vector2( + MathHelper.Clamp(body.LinearVelocity.X, -NetConfig.MaxPhysicsBodyVelocity, NetConfig.MaxPhysicsBodyVelocity), + MathHelper.Clamp(body.LinearVelocity.Y, -NetConfig.MaxPhysicsBodyVelocity, NetConfig.MaxPhysicsBodyVelocity)); + } + } + public void UpdateTransform() { Submarine prevSub = Submarine; diff --git a/Barotrauma/BarotraumaShared/Source/Map/Hull.cs b/Barotrauma/BarotraumaShared/Source/Map/Hull.cs index 3668eb362..e763e3898 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Hull.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Hull.cs @@ -83,7 +83,24 @@ namespace Barotrauma public readonly List ConnectedGaps = new List(); - public readonly List ConnectedGaps = new List(); + private string roomName; + [Editable, Serialize("", true, translationTextTag: "RoomName.")] + public string RoomName + { + get { return roomName; } + set + { + if (roomName == value) { return; } + roomName = value; + DisplayName = TextManager.Get(roomName, returnNull: true) ?? roomName; + } + } + + public string DisplayName + { + get; + private set; + } private string roomName; [Editable, Serialize("", true, translationTextTag: "RoomName.")]