Unstable 1.1.14.0
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
#nullable enable
|
||||
using Barotrauma.Networking;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Barotrauma
|
||||
{
|
||||
partial class TraitorEvent : ScriptedEvent
|
||||
{
|
||||
public enum State
|
||||
{
|
||||
Incomplete,
|
||||
Completed,
|
||||
Failed
|
||||
}
|
||||
|
||||
public Action? OnStateChanged;
|
||||
|
||||
private new readonly TraitorEventPrefab prefab;
|
||||
|
||||
public new TraitorEventPrefab Prefab => prefab;
|
||||
|
||||
private LocalizedString codeWord;
|
||||
|
||||
private State currentState;
|
||||
public State CurrentState
|
||||
{
|
||||
get { return currentState; }
|
||||
set
|
||||
{
|
||||
if (currentState == value) { return; }
|
||||
currentState = value;
|
||||
OnStateChanged?.Invoke();
|
||||
}
|
||||
}
|
||||
|
||||
private Client? traitor;
|
||||
|
||||
public Client? Traitor => traitor;
|
||||
|
||||
private readonly HashSet<Client> secondaryTraitors = new HashSet<Client>();
|
||||
|
||||
public IEnumerable<Client> SecondaryTraitors => secondaryTraitors;
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{nameof(TraitorEvent)} ({prefab.Identifier})";
|
||||
}
|
||||
|
||||
private readonly static HashSet<Identifier> nonActionChildElementNames = new HashSet<Identifier>()
|
||||
{
|
||||
"icon".ToIdentifier(),
|
||||
"reputationrequirement".ToIdentifier(),
|
||||
"missionrequirement".ToIdentifier(),
|
||||
"levelrequirement".ToIdentifier()
|
||||
};
|
||||
protected override IEnumerable<Identifier> NonActionChildElementNames => nonActionChildElementNames;
|
||||
|
||||
public TraitorEvent(TraitorEventPrefab prefab) : base(prefab)
|
||||
{
|
||||
this.prefab = prefab;
|
||||
codeWord = string.Empty;
|
||||
}
|
||||
|
||||
public override void Init(EventSet? parentSet = null)
|
||||
{
|
||||
base.Init(parentSet);
|
||||
if (traitor == null)
|
||||
{
|
||||
DebugConsole.ThrowError($"Error when initializing event \"{prefab.Identifier}\": traitor not set.\n" + Environment.StackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
public override LocalizedString ReplaceVariablesInEventText(LocalizedString str)
|
||||
{
|
||||
if (codeWord.IsNullOrEmpty())
|
||||
{
|
||||
//store the code word so the same random word is used in all the actions in the event
|
||||
codeWord = TextManager.Get("traitor.codeword");
|
||||
}
|
||||
|
||||
return str
|
||||
.Replace("[traitor]", traitor?.Name ?? "none")
|
||||
.Replace("[target]", (GetTargets("target".ToIdentifier()).FirstOrDefault() as Character)?.DisplayName ?? "none")
|
||||
.Replace("[codeword]", codeWord.Value);
|
||||
}
|
||||
|
||||
public void SetTraitor(Client traitor)
|
||||
{
|
||||
if (traitor.Character == null)
|
||||
{
|
||||
throw new InvalidOperationException($"Tried to set a client who's not controlling a character (\"{traitor.Name}\") as the traitor.");
|
||||
}
|
||||
this.traitor = traitor;
|
||||
traitor.Character.IsTraitor = true;
|
||||
AddTarget(Tags.Traitor, traitor.Character);
|
||||
AddTarget(Tags.AnyTraitor, traitor.Character);
|
||||
AddTargetPredicate(Tags.NonTraitor, e => e is Character c && (c.IsPlayer || c.IsBot) && !c.IsTraitor && c.TeamID == traitor.TeamID && !c.IsIncapacitated);
|
||||
AddTargetPredicate(Tags.NonTraitorPlayer, e => e is Character c && c.IsPlayer && !c.IsTraitor && c.IsOnPlayerTeam && !c.IsIncapacitated);
|
||||
}
|
||||
|
||||
public void SetSecondaryTraitors(IEnumerable<Client> traitors)
|
||||
{
|
||||
int index = 0;
|
||||
foreach (var traitor in traitors)
|
||||
{
|
||||
if (traitor.Character == null)
|
||||
{
|
||||
throw new InvalidOperationException($"Tried to set a client who's not controlling a character (\"{traitor.Name}\") as a secondary traitor.");
|
||||
}
|
||||
if (this.traitor == traitor)
|
||||
{
|
||||
DebugConsole.ThrowError($"Tried to assign the main traitor {traitor.Name} as a secondary traitor.");
|
||||
continue;
|
||||
}
|
||||
secondaryTraitors.Add(traitor);
|
||||
traitor.Character.IsTraitor = true;
|
||||
AddTarget(Tags.SecondaryTraitor, traitor.Character);
|
||||
AddTarget((Tags.SecondaryTraitor.ToString() + index).ToIdentifier(), traitor.Character);
|
||||
AddTarget(Tags.AnyTraitor, traitor.Character);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user