Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveFixLeaks.cs
T
Joonas Rikkonen 7dbfbfd4eb bd9a92d...cd50479
commit cd504791ebda32f7e9d79ec2ac726058e83b5bf1
Author: Joonas Rikkonen <poe.regalis@gmail.com>
Date:   Sun Feb 3 20:03:46 2019 +0200

    Additional server logging for steam auth & desync kicks

commit 6efece5e42502c1cdba89d4f4cc91398402f2b25
Author: Joonas Rikkonen <poe.regalis@gmail.com>
Date:   Sun Feb 3 19:46:51 2019 +0200

    Fixed server failing to sync clients who join the server after a character has been removed during the round (e.g. eaten, turned into a husk).

commit 482c9f87ec715119ad9ad420f25003ac92e666b9
Author: Joonas Rikkonen <poe.regalis@gmail.com>
Date:   Sun Feb 3 19:37:00 2019 +0200

    Fixed server-side error messages when clients attempt to use a fabricator. Happened because the server tried to set the required time -text on the fabricator interface based on the controlled character instead of the character using the fabricator.

commit 0a21304ee43935364de131d8aba09da8f51e6a47
Author: Joonas Rikkonen <poe.regalis@gmail.com>
Date:   Sun Feb 3 17:30:39 2019 +0200

    Fixed AI crew occasionally going outside to fix leaks

commit 78fa9382490f3b8d63c2ced9b31551fddf937703
Author: Joonas Rikkonen <poe.regalis@gmail.com>
Date:   Sun Feb 3 16:47:09 2019 +0200

    Changed coilgun ammo box category from Machine to Equipment (no machine tab in the store menu, caused errors when trying to find a tab button style)

commit 73f4374938a69bbeb9e5c0177bcd2b632fc33c8f
Author: Joonas Rikkonen <poe.regalis@gmail.com>
Date:   Sun Feb 3 16:14:56 2019 +0200

    Fixed humanhusk not spawning when a husk-infected human dies.

commit 080b04d6d046a3c7659942a0a72a3f1a0aa33f4d
Author: Joonas Rikkonen <poe.regalis@gmail.com>
Date:   Sun Feb 3 15:57:18 2019 +0200

    Made coilgun ammo boxes fabricable and purchaseable, coilgun bolts can't be crafted, alien flares can't be purchased. Closes #1027

commit edd46655a853880e03c2f9a32abd92b6429a6c8e
Author: Joonas Rikkonen <poe.regalis@gmail.com>
Date:   Sun Feb 3 15:48:39 2019 +0200

    Removed auxiliorizine from the chemical shipment mission (auxiliorizine doesn't exist anymore).

commit c19620e1f507b2bda398ab4b8ab8cd7d3ea5af23
Author: Joonas Rikkonen <poe.regalis@gmail.com>
Date:   Sun Feb 3 15:46:26 2019 +0200

    Removed duplicate line from loading screen tips. Closes #1032

commit e7df25130bfc76c16a08e86d3d42b16eab7cb21d
Author: ezjamsen <ezjames.fi@gmail.com>
Date:   Sun Feb 3 13:01:19 2019 +0200

    Halved moloch speeds temporarily until a full balance of enemies is done.
2019-03-18 21:11:11 +02:00

161 lines
5.2 KiB
C#

using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Barotrauma
{
class AIObjectiveFixLeaks : AIObjective
{
const float UpdateGapListInterval = 5.0f;
private double lastGapUpdate;
private AIObjectiveIdle idleObjective;
private AIObjectiveFindDivingGear findDivingGear;
private List<AIObjectiveFixLeak> objectiveList;
public AIObjectiveFixLeaks(Character character)
: base (character, "")
{
}
public override bool IsCompleted()
{
if (Timing.TotalTime > lastGapUpdate + UpdateGapListInterval || objectiveList == null)
{
UpdateGapList();
lastGapUpdate = Timing.TotalTime;
}
return objectiveList.Count == 0;
}
public override float GetPriority(AIObjectiveManager objectiveManager)
{
if (Timing.TotalTime > lastGapUpdate + UpdateGapListInterval || objectiveList == null)
{
UpdateGapList();
lastGapUpdate = Timing.TotalTime;
}
float priority = 0.0f;
foreach (AIObjectiveFixLeak fixObjective in objectiveList)
{
//gaps from outside to inside significantly increase the priority
if (!fixObjective.Leak.IsRoomToRoom)
{
priority = Math.Max(priority + fixObjective.Leak.Open * 100.0f, 50.0f);
}
else
{
priority += fixObjective.Leak.Open * 10.0f;
}
if (priority >= 100.0f) break;
}
return Math.Min(priority, 100.0f);
}
protected override void Act(float deltaTime)
{
if (Timing.TotalTime > lastGapUpdate + UpdateGapListInterval || objectiveList == null)
{
UpdateGapList();
lastGapUpdate = Timing.TotalTime;
}
if (objectiveList.Any())
{
if (!objectiveList[objectiveList.Count - 1].Leak.IsRoomToRoom)
{
if (findDivingGear == null) findDivingGear = new AIObjectiveFindDivingGear(character, true);
if (!findDivingGear.IsCompleted() && findDivingGear.CanBeCompleted)
{
findDivingGear.TryComplete(deltaTime);
return;
}
}
objectiveList[objectiveList.Count - 1].TryComplete(deltaTime);
if (!objectiveList[objectiveList.Count - 1].CanBeCompleted ||
objectiveList[objectiveList.Count - 1].IsCompleted())
{
objectiveList.RemoveAt(objectiveList.Count - 1);
}
}
else
{
if (idleObjective == null) idleObjective = new AIObjectiveIdle(character);
idleObjective.TryComplete(deltaTime);
}
}
private void UpdateGapList()
{
if (objectiveList == null) { objectiveList = new List<AIObjectiveFixLeak>(); }
objectiveList.Clear();
foreach (Gap gap in Gap.GapList)
{
if (gap.ConnectedWall == null) { continue; }
if (gap.ConnectedDoor != null || gap.Open <= 0.0f) { continue; }
//not linked to a hull -> ignore
if (gap.linkedTo.All(l => l == null)) { continue; }
if (character.TeamID == 0)
{
if (gap.Submarine == null) continue;
}
else
{
//prevent characters from attempting to fix leaks in the enemy sub
//team 1 plays in sub 0, team 2 in sub 1
Submarine mySub = character.TeamID < 1 || character.TeamID > Submarine.MainSubs.Length ?
Submarine.MainSub : Submarine.MainSubs[character.TeamID - 1];
if (gap.Submarine != mySub) continue;
}
float gapPriority = GetGapFixPriority(gap);
int index = 0;
while (index < objectiveList.Count &&
GetGapFixPriority(objectiveList[index].Leak) < gapPriority)
{
index++;
}
objectiveList.Insert(index, new AIObjectiveFixLeak(gap, character));
}
}
private float GetGapFixPriority(Gap gap)
{
if (gap == null) return 0.0f;
//larger gap -> higher priority
float gapPriority = (gap.IsHorizontal ? gap.Rect.Width : gap.Rect.Height) * gap.Open;
//prioritize gaps that are close
gapPriority /= Math.Max(Vector2.Distance(character.WorldPosition, gap.WorldPosition), 1.0f);
//gaps to outside are much higher priority
if (!gap.IsRoomToRoom) gapPriority *= 10.0f;
return gapPriority;
}
public override bool IsDuplicate(AIObjective otherObjective)
{
return otherObjective is AIObjectiveFixLeaks;
}
}
}