From 106c61ca9a2239eda20a089abc9b1bb1555bbeeb Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Thu, 16 May 2019 06:55:08 +0300 Subject: [PATCH] (4d3ec7d3b) Fixed: Missing {0} variable from russian localization --- .../Source/Characters/Animation/Ragdoll.cs | 26 ++++ .../Source/Screens/CampaignSetupUI.cs | 2 + .../Source/Characters/AI/HumanAIController.cs | 126 +++++++++++++----- .../AI/Objectives/AIObjectiveFindSafety.cs | 18 +-- .../AI/Objectives/AIObjectiveFixLeak.cs | 26 ++++ .../AI/Objectives/AIObjectiveIdle.cs | 30 ----- .../AI/Objectives/AIObjectiveManager.cs | 26 +--- .../AI/Objectives/AIObjectiveOperateItem.cs | 4 + .../AI/Objectives/AIObjectiveRescue.cs | 8 +- .../AI/Objectives/AIObjectiveRescueAll.cs | 5 +- .../Source/Characters/Character.cs | 9 ++ .../Components/Machines/Deconstructor.cs | 19 +++ .../Items/Components/Machines/Steering.cs | 17 +-- .../BarotraumaShared/Source/Items/Item.cs | 32 +++++ .../BarotraumaShared/Source/Map/Hull.cs | 19 ++- 15 files changed, 253 insertions(+), 114 deletions(-) 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 63a17d9a7..85e385887 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/CampaignSetupUI.cs @@ -726,6 +726,8 @@ namespace Barotrauma private GUILayoutGroup subPreviewContainer; + private GUILayoutGroup subPreviewContainer; + private GUIButton loadGameButton; public Action StartNewGame; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs index 4dafc480e..6ab0785ff 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs @@ -15,14 +15,14 @@ namespace Barotrauma private float sortTimer; private float crouchRaycastTimer; - private float reactTimer; + private float reportTimer; private float hullVisibilityTimer; private bool shouldCrouch; - const float reactionTime = 0.5f; - const float hullVisibilityInterval = 0.5f; const float crouchRaycastInterval = 1; + const float reportInterval = 1; const float sortObjectiveInterval = 1; + const float hullVisibilityInterval = 1; public static float HULL_SAFETY_THRESHOLD = 50; @@ -72,7 +72,7 @@ namespace Barotrauma insideSteering = new IndoorsSteeringManager(this, true, false); outsideSteering = new SteeringManager(this); objectiveManager = new AIObjectiveManager(c); - reactTimer = Rand.Range(0f, reactionTime); + reportTimer = Rand.Range(0f, reportInterval); sortTimer = Rand.Range(0f, sortObjectiveInterval); hullVisibilityTimer = Rand.Range(0f, hullVisibilityTimer); InitProjSpecific(); @@ -118,22 +118,23 @@ namespace Barotrauma objectiveManager.SortObjectives(); sortTimer = sortObjectiveInterval; } - if (reactTimer > 0.0f) + + if (reportTimer > 0.0f) { - reactTimer -= deltaTime; + reportTimer -= deltaTime; } else { if (Character.CurrentHull != null) { - VisibleHulls.ForEach(h => PropagateHullSafety(Character, h)); + VisibleHulls.ForEach(h => PropagateHullSafety(Character.Controlled, h)); } if (Character.SpeechImpediment < 100.0f) { ReportProblems(); UpdateSpeaking(); } - reactTimer = reactionTime * Rand.Range(0.75f, 1.25f); + reportTimer = reportInterval; } if (objectiveManager.CurrentObjective == null) { return; } @@ -445,6 +446,88 @@ namespace Barotrauma } } + protected void ReportProblems() + { + Order newOrder = null; + if (Character.CurrentHull != null) + { + foreach (var hull in VisibleHulls) + { + if (AIObjectiveExtinguishFires.IsValidTarget(hull, Character)) + { + if (AddTargets(Character, hull)) + { + if (hull == Character.CurrentHull) + { + var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportfire"); + newOrder = new Order(orderPrefab, Character.CurrentHull, null); + } + } + } + foreach (var gap in hull.ConnectedGaps) + { + if (AIObjectiveFixLeaks.IsValidTarget(gap, Character)) + { + if (AddTargets(Character, gap)) + { + if (hull == Character.CurrentHull) + { + var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportbreach"); + newOrder = new Order(orderPrefab, Character.CurrentHull, null); + } + } + } + } + foreach (Item item in Item.ItemList) + { + if (item.CurrentHull != hull) { continue; } + if (AIObjectiveRepairItems.IsValidTarget(item, Character)) + { + if (item.Repairables.All(r => item.Condition > r.ShowRepairUIThreshold)) { continue; } + if (AddTargets(Character, item)) + { + if (hull == Character.CurrentHull) + { + var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportbrokendevices"); + newOrder = new Order(orderPrefab, Character.CurrentHull, item.Repairables?.FirstOrDefault()); + } + } + } + } + foreach (Character c in Character.CharacterList) + { + if (c.CurrentHull != hull) { continue; } + if (AIObjectiveFightIntruders.IsValidTarget(c, Character)) + { + if (AddTargets(Character, c)) + { + if (hull == Character.CurrentHull) + { + var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportintruders"); + newOrder = new Order(orderPrefab, Character.CurrentHull, null); + } + } + } + } + } + if (Character.Bleeding > 1.0f || Character.Vitality < Character.MaxVitality * 0.1f) + { + if (AddTargets(Character, Character)) + { + var orderPrefab = Order.PrefabList.Find(o => o.AITag == "requestfirstaid"); + newOrder = new Order(orderPrefab, Character.CurrentHull, null); + } + } + } + if (newOrder != null) + { + if (GameMain.GameSession?.CrewManager != null && GameMain.GameSession.CrewManager.AddOrder(newOrder, newOrder.FadeOutTime)) + { + Character.Speak(newOrder.GetChatMessage("", Character.CurrentHull?.DisplayName, givingOrderToSelf: false), ChatMessageType.Order); + } + } + } + private void UpdateSpeaking() { if (Character.Oxygen < 20.0f) @@ -642,7 +725,6 @@ namespace Barotrauma DoForEachCrewMember(character, (humanAi) => humanAi.RefreshHullSafety(hull)); } - public float CurrentHullSafety { get; private set; } private void RefreshHullSafety(Hull hull) { if (GetHullSafety(hull, Character, VisibleHulls) > HULL_SAFETY_THRESHOLD) @@ -737,34 +819,12 @@ namespace Barotrauma public float GetHullSafety(Hull hull, Character character, IEnumerable visibleHulls = null) { - bool updateCurrentHullSafety = character == Character && character.CurrentHull == hull; - if (hull == null) - { - if (updateCurrentHullSafety) - { - CurrentHullSafety = 0; - } - return 0; - } - if (character == Character) - { - // If the character is this character, we can use the cached hulls. - // If no visible hulls are provided, the calculations don't take visible/adjacent hulls into account. - if (visibleHulls == null) - { - visibleHulls = VisibleHulls; - } - } + if (hull == null) { return 0; } bool ignoreFire = ObjectiveManager.IsCurrentObjective() || ObjectiveManager.IsCurrentObjective(); bool ignoreWater = HasDivingSuit(character); bool ignoreOxygen = ignoreWater || HasDivingMask(character); bool ignoreEnemies = ObjectiveManager.IsCurrentObjective(); - float safety = GetHullSafety(hull, visibleHulls, character, ignoreWater, ignoreOxygen, ignoreFire, ignoreEnemies); - if (updateCurrentHullSafety) - { - CurrentHullSafety = safety; - } - return safety; + return GetHullSafety(hull, visibleHulls, character, ignoreWater, ignoreOxygen, ignoreFire, ignoreEnemies); } public static float GetHullSafety(Hull hull, IEnumerable visibleHulls, Character character, bool ignoreWater = false, bool ignoreOxygen = false, bool ignoreFire = false, bool ignoreEnemies = false) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs index 69a45abab..cfd809ee5 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFindSafety.cs @@ -12,7 +12,7 @@ namespace Barotrauma public override bool ForceRun => true; // TODO: expose? - const float priorityIncrease = 100; + const float priorityIncrease = 25; const float priorityDecrease = 10; const float SearchHullInterval = 3.0f; const float clearUnreachableInterval = 30; @@ -51,7 +51,8 @@ namespace Barotrauma return; } if (character.OxygenAvailable < CharacterHealth.LowOxygenThreshold) { Priority = 100; } - currenthullSafety = HumanAIController.CurrentHullSafety; + // TODO: no need to update every frame? + currenthullSafety = HumanAIController.GetCurrentHullSafety(); if (currenthullSafety > HumanAIController.HULL_SAFETY_THRESHOLD) { Priority -= priorityDecrease * deltaTime; @@ -64,7 +65,6 @@ namespace Barotrauma Priority = MathHelper.Clamp(Priority, 0, 100); if (divingGearObjective != null && !divingGearObjective.IsCompleted() && divingGearObjective.CanBeCompleted) { - // Boost the priority while seeking the diving gear Priority = Math.Max(Priority, Math.Min(AIObjectiveManager.OrderPriority + 20, 100)); } } @@ -123,10 +123,6 @@ namespace Barotrauma }, onAbandon: () => unreachable.Add(goToObjective.Target as Hull)); } - else - { - goToObjective = null; - } } if (goToObjective != null) { return; } if (currentHull == null) { return; } @@ -152,8 +148,8 @@ namespace Barotrauma } if (escapeVel != Vector2.Zero) { - float left = currentHull.Rect.X + 50; - float right = currentHull.Rect.Right - 50; + float left = HumanAIController.VisibleHulls.Min(h => h.Rect.X) + 50; + float right = HumanAIController.VisibleHulls.Max(h => h.Rect.Right) - 50; //only move if we haven't reached the edge of the room if (escapeVel.X < 0 && character.Position.X > left || escapeVel.X > 0 && character.Position.X < right) { @@ -194,14 +190,14 @@ namespace Barotrauma //skip the hull if the safety is already less than the best hull //(no need to do the expensive pathfinding if we already know we're not going to choose this hull) if (hullSafety < bestValue) { continue; } + // Each unsafe node reduces the hull safety value. + // Ignore current hull, because otherwise the would block all paths from the current hull to the target hull. var path = PathSteering.PathFinder.FindPath(character.SimPosition, hull.SimPosition); if (path.Unreachable) { unreachable.Add(hull); continue; } - // Each unsafe node reduces the hull safety value. - // Ignore the current hull, because otherwise we couldn't find a path out. int unsafeNodes = path.Nodes.Count(n => n.CurrentHull != character.CurrentHull && HumanAIController.UnsafeHulls.Contains(n.CurrentHull)); hullSafety /= 1 + unsafeNodes; // If the target is not inside a friendly submarine, considerably reduce the hull safety. diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs index c2ebaab7e..1ae446ffe 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeak.cs @@ -491,6 +491,32 @@ 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; 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 6ef703e18..24594b0db 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs @@ -18,26 +18,15 @@ namespace Barotrauma private Character character; - - private float _waitTimer; /// - /// When set above zero, the character will stand still doing nothing until the timer runs out. Does not affect orders, find safety or combat. + /// When set above zero, the character will stand still doing nothing until the timer runs out. Does not affect orders. /// - public float WaitTimer - { - get { return _waitTimer; } - set - { - if (CurrentObjective is AIObjectiveCombat || CurrentObjective is AIObjectiveFindSafety) - { - _waitTimer = 0; - } - else - { - _waitTimer = value; - } - } - } + public float WaitTimer; + + public AIObjective CurrentOrder { get; private set; } + public AIObjective CurrentObjective { get; private set; } + + public bool IsCurrentObjective() where T : AIObjective => CurrentObjective is T; public AIObjective CurrentOrder { get; private set; } public AIObjective CurrentObjective { get; private set; } @@ -213,7 +202,6 @@ namespace Barotrauma } 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 && diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs index 7a933d76b..3c88335cd 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs @@ -853,6 +853,10 @@ namespace Barotrauma { isCompleted = true; } + if (component.AIOperate(deltaTime, character, this)) + { + isCompleted = true; + } } else { diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescue.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescue.cs index 6c3d8212f..7cac8a326 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescue.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescue.cs @@ -23,12 +23,6 @@ namespace Barotrauma public AIObjectiveRescue(Character character, Character targetCharacter, AIObjectiveManager objectiveManager, float priorityModifier = 1) : base(character, objectiveManager, priorityModifier) { - if (targetCharacter != character) - { - // TODO: enable healing self too - abandon = true; - return; - } this.targetCharacter = targetCharacter; } @@ -207,7 +201,7 @@ namespace Barotrauma public override bool IsCompleted() { - bool isCompleted = targetCharacter.Bleeding <= 0 && targetCharacter.Vitality / targetCharacter.MaxVitality > AIObjectiveRescueAll.GetVitalityThreshold(objectiveManager); + bool isCompleted = targetCharacter.Vitality / targetCharacter.MaxVitality > AIObjectiveRescueAll.GetVitalityThreshold(objectiveManager); if (isCompleted) { character.Speak(TextManager.Get("DialogTargetHealed").Replace("[targetname]", targetCharacter.Name), diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescueAll.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescueAll.cs index 4167f8e72..819ff805f 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescueAll.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescueAll.cs @@ -9,7 +9,7 @@ namespace Barotrauma public override string DebugTag => "rescue all"; public override bool ForceRun => true; - private const float vitalityThreshold = 0.8f; + private const float vitalityThreshold = 0.85f; private const float vitalityThresholdForOrders = 0.95f; public static float GetVitalityThreshold(AIObjectiveManager manager) => manager.CurrentOrder is AIObjectiveRescueAll ? vitalityThresholdForOrders : vitalityThreshold; @@ -35,9 +35,10 @@ namespace Barotrauma public static bool IsValidTarget(Character target, Character character) { if (target == null || target.IsDead || target.Removed) { return false; } + if (target == character) { return false; } // TODO: enable healing self if (!HumanAIController.IsFriendly(character, target)) { return false; } if (!(character.AIController is HumanAIController humanAI)) { return false; } - if (target.Bleeding < 1 && target.Vitality / target.MaxVitality > GetVitalityThreshold(humanAI.ObjectiveManager)) { return false; } + if (target.Vitality / target.MaxVitality > GetVitalityThreshold(humanAI.ObjectiveManager)) { return false; } if (target.Submarine == null) { return false; } if (target.Submarine.TeamID != character.Submarine.TeamID) { return false; } if (target.CurrentHull == null) { return false; } 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 c6646effc..c4ea8f2e2 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs @@ -962,6 +962,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 7a471a65c..f6d19e87b 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs @@ -144,17 +144,6 @@ 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; @@ -175,6 +164,12 @@ 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 86654ba9e..ecaea3ee0 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Hull.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Hull.cs @@ -81,7 +81,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.")]