104 lines
4.6 KiB
C#
104 lines
4.6 KiB
C#
using Barotrauma.Networking;
|
|
using Microsoft.Xna.Framework;
|
|
using System.Linq;
|
|
|
|
namespace Barotrauma
|
|
{
|
|
partial class HumanAIController : AIController
|
|
{
|
|
partial void InitProjSpecific()
|
|
{
|
|
/*if (GameMain.GameSession != null && GameMain.GameSession.CrewManager != null)
|
|
{
|
|
CurrentOrder = Order.PrefabList.Find(o => o.AITag == "dismissed");
|
|
objectiveManager.SetOrder(CurrentOrder, "", null);
|
|
GameMain.GameSession.CrewManager.SetCharacterOrder(Character, CurrentOrder, null, null);
|
|
}*/
|
|
}
|
|
|
|
partial void SetOrderProjSpecific(Order order)
|
|
{
|
|
GameMain.GameSession.CrewManager.DisplayCharacterOrder(Character, order);
|
|
}
|
|
|
|
public override void DebugDraw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch)
|
|
{
|
|
if (SelectedAiTarget?.Entity != null)
|
|
{
|
|
GUI.DrawLine(spriteBatch,
|
|
new Vector2(Character.DrawPosition.X, -Character.DrawPosition.Y),
|
|
new Vector2(SelectedAiTarget.WorldPosition.X, -SelectedAiTarget.WorldPosition.Y), Color.Red);
|
|
}
|
|
|
|
IndoorsSteeringManager pathSteering = steeringManager as IndoorsSteeringManager;
|
|
if (pathSteering == null || pathSteering.CurrentPath == null || pathSteering.CurrentPath.CurrentNode == null) return;
|
|
|
|
GUI.DrawLine(spriteBatch,
|
|
new Vector2(Character.DrawPosition.X, -Character.DrawPosition.Y),
|
|
new Vector2(pathSteering.CurrentPath.CurrentNode.DrawPosition.X, -pathSteering.CurrentPath.CurrentNode.DrawPosition.Y),
|
|
Color.LightGreen * 0.5f, 0, 3);
|
|
|
|
|
|
for (int i = 1; i < pathSteering.CurrentPath.Nodes.Count; i++)
|
|
{
|
|
GUI.DrawLine(spriteBatch,
|
|
new Vector2(pathSteering.CurrentPath.Nodes[i].DrawPosition.X, -pathSteering.CurrentPath.Nodes[i].DrawPosition.Y),
|
|
new Vector2(pathSteering.CurrentPath.Nodes[i - 1].DrawPosition.X, -pathSteering.CurrentPath.Nodes[i - 1].DrawPosition.Y),
|
|
Color.LightGreen * 0.5f, 0, 3);
|
|
|
|
GUI.SmallFont.DrawString(spriteBatch,
|
|
pathSteering.CurrentPath.Nodes[i].ID.ToString(),
|
|
new Vector2(pathSteering.CurrentPath.Nodes[i].DrawPosition.X, -pathSteering.CurrentPath.Nodes[i].DrawPosition.Y - 10),
|
|
Color.LightGreen);
|
|
}
|
|
}
|
|
|
|
//TODO: move this to the shared project, otherwise bots won't be able to report things in multiplayer
|
|
partial void ReportProblems()
|
|
{
|
|
if (GameMain.Client != null) return;
|
|
|
|
Order newOrder = null;
|
|
if (Character.CurrentHull != null)
|
|
{
|
|
if (Character.CurrentHull.FireSources.Count > 0)
|
|
{
|
|
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportfire");
|
|
newOrder = new Order(orderPrefab, Character.CurrentHull, null);
|
|
}
|
|
|
|
if (Character.CurrentHull.ConnectedGaps.Any(g => !g.IsRoomToRoom && g.ConnectedDoor == null && g.Open > 0.0f))
|
|
{
|
|
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportbreach");
|
|
newOrder = new Order(orderPrefab, Character.CurrentHull, null);
|
|
}
|
|
|
|
foreach (Character c in Character.CharacterList)
|
|
{
|
|
if (c.CurrentHull == Character.CurrentHull && !c.IsDead &&
|
|
(c.AIController is EnemyAIController || c.TeamID != Character.TeamID))
|
|
{
|
|
var orderPrefab = Order.PrefabList.Find(o => o.AITag == "reportintruders");
|
|
newOrder = new Order(orderPrefab, Character.CurrentHull, null);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (Character.CurrentHull != null && (Character.Bleeding > 1.0f || Character.Vitality < Character.MaxVitality * 0.1f))
|
|
{
|
|
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?.RoomName, givingOrderToSelf: false), ChatMessageType.Order);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|