add support for end event from timer

This commit is contained in:
Robert Paciorek 2024-01-23 01:15:40 +00:00 committed by Spirtix
parent 21045494f6
commit 9978303231

View File

@ -25,6 +25,7 @@ class WorldEvent {
Reset(3.3f); Reset(3.3f);
} }
// controlled (init/reset) by Reset()
private Room room; private Room room;
private string uid; private string uid;
private Client operatorAI; private Client operatorAI;
@ -33,12 +34,13 @@ class WorldEvent {
private DateTime startTime; private DateTime startTime;
private DateTime endTime; private DateTime endTime;
private string startTimeString; private string startTimeString;
private Dictionary<string, float> health;
private Dictionary<string, string> players;
private DateTime AITime; private DateTime AITime;
private bool endTimeIsSet; private bool endTimeIsSet;
private string lastResults; // controlled (init/reset) by InitEvent()
private Dictionary<string, float> health = new();
private Dictionary<string, string> players = new();
private string lastResults = "";
private void Reset(float time) { private void Reset(float time) {
lock (EventLock) { lock (EventLock) {
@ -50,15 +52,20 @@ class WorldEvent {
startTime = DateTime.UtcNow.AddMinutes(time); startTime = DateTime.UtcNow.AddMinutes(time);
startTimeString = startTime.ToString("MM/dd/yyyy HH:mm:ss"); startTimeString = startTime.ToString("MM/dd/yyyy HH:mm:ss");
AITime = startTime.AddMinutes(-1); AITime = startTime.AddMinutes(-1);
endTime = startTime.AddMinutes(10); UpdateEndTime(600 + 90);
endTimeIsSet = false; endTimeIsSet = false;
Console.WriteLine($"Event {uid} start time: {startTimeString}"); Console.WriteLine($"Event {uid} start time: {startTimeString}");
ResetTimer((endTime - DateTime.UtcNow).TotalSeconds + 90);
} }
} }
private void UpdateEndTime(double timeout) {
endTime = startTime.AddSeconds(timeout);
Console.WriteLine($"Event {uid} end time: {endTime}");
ResetTimer((endTime - DateTime.UtcNow).TotalSeconds);
timer.Elapsed += PreEndEvent;
}
private void ResetTimer(double timeout) { private void ResetTimer(double timeout) {
if (timer != null) { if (timer != null) {
timer.Stop(); timer.Stop();
@ -66,7 +73,6 @@ class WorldEvent {
} }
timer = new System.Timers.Timer(timeout * 1000); timer = new System.Timers.Timer(timeout * 1000);
timer.Elapsed += PostEndEvent;
timer.AutoReset = false; timer.AutoReset = false;
timer.Enabled = true; timer.Enabled = true;
@ -94,16 +100,24 @@ class WorldEvent {
} }
} }
private void PreEndEvent(Object source, ElapsedEventArgs e) {
Console.WriteLine($"Event {uid} force end from timer");
EndEvent(true);
}
private bool EndEvent(bool force = false) { private bool EndEvent(bool force = false) {
bool results = true; bool results = false;
string targets = ""; string targets = "";
if (health.Count > 0) {
results = true;
foreach (var x in health) { foreach (var x in health) {
results = results && (x.Value == 0.0f); results = results && (x.Value == 0.0f);
targets += x.Key + ":" + x.Value.ToString("0.0#####", CultureInfo.GetCultureInfo("en-US")) + ","; targets += x.Key + ":" + x.Value.ToString("0.0#####", CultureInfo.GetCultureInfo("en-US")) + ",";
} }
}
if (results || force) { if (results || force) {
lock (EventLock) { lock (EventLock) {
if (state != State.Active) if (state == State.End || (state == State.NotActive && !force))
return true; return true;
state = State.End; state = State.End;
} }
@ -156,6 +170,7 @@ class WorldEvent {
// (re)schedule event reset and announcement of next event // (re)schedule event reset and announcement of next event
ResetTimer(60); ResetTimer(60);
timer.Elapsed += PostEndEvent;
return true; return true;
} }
@ -204,7 +219,7 @@ class WorldEvent {
public Room GetRoom() => room; public Room GetRoom() => room;
public float UpdateHealth(string targetUid, float updateVal) { public float UpdateHealth(string targetUid, float updateVal) {
InitEvent(); // TODO better place for this InitEvent();
lock (EventLock) { lock (EventLock) {
if (state != State.Active) { if (state != State.Active) {
@ -223,6 +238,7 @@ class WorldEvent {
} }
if (endTime < DateTime.UtcNow) { if (endTime < DateTime.UtcNow) {
Console.WriteLine($"Event {uid} force end from UpdateHealth");
EndEvent(true); EndEvent(true);
} }
@ -248,7 +264,7 @@ class WorldEvent {
} }
if (client == operatorAI || !endTimeIsSet) { if (client == operatorAI || !endTimeIsSet) {
Console.WriteLine($"Event {uid} set TimeSpan: {seconds} from operator: {client == operatorAI}"); Console.WriteLine($"Event {uid} set TimeSpan: {seconds} from operator: {client == operatorAI}");
endTime = startTime.AddSeconds(seconds); UpdateEndTime(seconds);
endTimeIsSet = true; endTimeIsSet = true;
} }
} }