fix chat announcement before event

This commit is contained in:
Robert Paciorek 2024-01-29 21:46:07 +00:00 committed by Spirtix
parent 245fd2237a
commit 31420034ff

View File

@ -22,7 +22,11 @@ class WorldEvent {
} }
private WorldEvent() { private WorldEvent() {
Reset(10); startTime = DateTime.UtcNow.AddMinutes(-60);
startTimeString = startTime.ToString("MM/dd/yyyy HH:mm:ss");
uid = "sodoff";
state = State.End;
ScheduleEvent(10); // WE_ != WEN_
} }
// controlled (init/reset) by Reset() // controlled (init/reset) by Reset()
@ -33,16 +37,19 @@ class WorldEvent {
private DateTime startTime; private DateTime startTime;
private DateTime endTime; private DateTime endTime;
private string startTimeString; private DateTime nextStartTime;
private DateTime AITime; private DateTime AITime;
private bool endTimeIsSet; private bool endTimeIsSet;
private string startTimeString;
private string nextStartTimeString;
// controlled (init/reset) by InitEvent() // controlled (init/reset) by InitEvent()
private Dictionary<string, float> health = new(); private Dictionary<string, float> health = new();
private Dictionary<string, string> players = new(); private Dictionary<string, string> players = new();
private string lastResults = ""; private string lastResults = "";
private void Reset(float time) { // reset event - set new id, start time, end time, etc
private void Reset(float time = 2) {
lock (EventLock) { lock (EventLock) {
room = Room.GetOrAdd("HubTrainingDO"); room = Room.GetOrAdd("HubTrainingDO");
uid = Path.GetRandomFileName().Substring(0, 8); // this is used as RandomSeed for random select ship variant uid = Path.GetRandomFileName().Substring(0, 8); // this is used as RandomSeed for random select ship variant
@ -55,33 +62,37 @@ class WorldEvent {
UpdateEndTime(600 + 90); UpdateEndTime(600 + 90);
endTimeIsSet = false; endTimeIsSet = false;
nextStartTime = startTime;
nextStartTimeString = startTimeString;
Console.WriteLine($"Event {uid} start time: {startTimeString}"); Console.WriteLine($"Event {uid} start time: {startTimeString}");
} }
} }
// set / update event end time in results of Reset() or SetTimeSpan()
private void UpdateEndTime(double timeout) { private void UpdateEndTime(double timeout) {
endTime = startTime.AddSeconds(timeout); endTime = startTime.AddSeconds(timeout);
Console.WriteLine($"Event {uid} end time: {endTime}"); Console.WriteLine($"Event {uid} end time: {endTime}");
ResetTimer((endTime - DateTime.UtcNow).TotalSeconds); SetTimer((endTime - DateTime.UtcNow).TotalSeconds, PreEndEvent);
timer.Elapsed += PreEndEvent;
} }
private void ResetTimer(double timeout) { // schedule next event and set timer to call PreInit
if (timer != null) { private void ScheduleEvent(float minutes) {
timer.Stop(); nextStartTime = DateTime.UtcNow.AddMinutes(minutes);
timer.Close(); nextStartTimeString = nextStartTime.ToString("MM/dd/yyyy HH:mm:ss");;
SetTimer(minutes*60 - 120, PreInit);
} }
timer = new System.Timers.Timer(timeout * 1000); // reset event and set timer to call PreEndEvent, send new WE_ info
timer.AutoReset = false; private void PreInit(Object source, ElapsedEventArgs e) {
timer.Enabled = true; Reset(); // WE_ == WEN_
AnnounceEvent();
Console.WriteLine($"Event {uid} reset timer set to {timeout} s");
} }
// check init state and init event (set AI, reset health, score) if need in response to client (shot, etc) request
private void InitEvent() { private void InitEvent() {
lock (EventLock) { lock (EventLock) {
if (AITime < DateTime.UtcNow) { if (AITime < DateTime.UtcNow && state != State.End) {
var clients = room.Clients.ToList(); var clients = room.Clients.ToList();
operatorAI = clients[random.Next(0, clients.Count)]; operatorAI = clients[random.Next(0, clients.Count)];
AITime = DateTime.UtcNow.AddSeconds(3.5); AITime = DateTime.UtcNow.AddSeconds(3.5);
@ -128,6 +139,17 @@ class WorldEvent {
} }
lastResults = $"{uid};{results};{scores};{targets}"; lastResults = $"{uid};{results};{scores};{targets}";
Console.WriteLine($"Event {uid} end: {results} {targets} {scores}");
SetTimer(2, PostEndEvent1); // looks like client don't like get _End before WEH_ with 0.0 ... so wait to send _End
return true;
}
return false;
}
// send reward info
private void PostEndEvent1(Object source, ElapsedEventArgs e) {
NetworkPacket packet = Utils.VlNetworkPacket( NetworkPacket packet = Utils.VlNetworkPacket(
"WE_ScoutAttack_End", "WE_ScoutAttack_End",
lastResults, lastResults,
@ -137,8 +159,6 @@ class WorldEvent {
roomClient.Send(packet); roomClient.Send(packet);
} }
Console.WriteLine($"Event {uid} end: {results} {targets} {scores}");
NetworkArray vl = new(); NetworkArray vl = new();
NetworkArray vl1 = new(); NetworkArray vl1 = new();
vl1.Add("WE__AI"); vl1.Add("WE__AI");
@ -168,20 +188,36 @@ class WorldEvent {
roomClient.Send(packet); roomClient.Send(packet);
} }
// (re)schedule event reset and announcement of next event Console.WriteLine($"Event {uid} sent _End");
ResetTimer(60);
timer.Elapsed += PostEndEvent;
return true; SetTimer(60, PostEndEvent2);
}
return false;
} }
private void PostEndEvent(Object source, ElapsedEventArgs e) { // schedule next event, set timer to call PreInit() and send new WEN_ info
Reset(30); private void PostEndEvent2(Object source, ElapsedEventArgs e) {
ScheduleEvent(30); // WE_ != WEN_
AnnounceEvent(false, true); // send only WEN_ (WE_ should stay unchanged ... as WE_..._End)
}
Console.WriteLine($"Event {uid} send event notification (WE_ + WEN_) to all clients"); // set server side timer for word event state changes
NetworkPacket packet = Utils.VlNetworkPacket(EventInfoArray(), room.Id); private void SetTimer(double timeout, System.Timers.ElapsedEventHandler callback) {
if (timer != null) {
timer.Stop();
timer.Close();
}
timer = new System.Timers.Timer(timeout * 1000);
timer.AutoReset = false;
timer.Enabled = true;
timer.Elapsed += callback;
Console.WriteLine($"Event timer {callback.Method.Name} set to {timeout} s");
}
// send event info
private void AnnounceEvent(bool WE = true, bool WEN = true) {
Console.WriteLine($"Event {uid} send event notification (WE_ = {(WE ? startTimeString : WE)} WEN_ = {(WEN ? nextStartTimeString : WEN)}, room = {room.Id}) to all clients");
NetworkPacket packet = Utils.VlNetworkPacket(EventInfoArray(WE, WEN), room.Id);
foreach (var r in Room.AllRooms()) { foreach (var r in Room.AllRooms()) {
foreach (var roomClient in r.Clients) { foreach (var roomClient in r.Clients) {
roomClient.Send(packet); roomClient.Send(packet);
@ -189,27 +225,30 @@ class WorldEvent {
} }
} }
public string EventInfo() { public string EventInfo() {
return startTimeString + "," + uid + ", false, HubTrainingDO"; return startTimeString + "," + uid + ", false, HubTrainingDO";
} }
public NetworkArray EventInfoArray(bool x = false) { public NetworkArray EventInfoArray(bool WE = true, bool WEN = true) {
NetworkArray vl = new(); NetworkArray vl = new();
if (WE) {
NetworkArray vl1 = new(); NetworkArray vl1 = new();
vl1.Add("WE_ScoutAttack"); vl1.Add("WE_ScoutAttack");
vl1.Add((Byte)4); vl1.Add((Byte)4);
vl1.Add(EventInfo()); vl1.Add(EventInfo());
vl1.Add(false); vl1.Add(false);
vl1.Add(x); vl1.Add(true);
vl.Add(vl1); vl.Add(vl1);
}
if (WEN) {
NetworkArray vl2 = new(); NetworkArray vl2 = new();
vl2.Add("WEN_ScoutAttack"); vl2.Add("WEN_ScoutAttack");
vl2.Add((Byte)4); vl2.Add((Byte)4);
vl2.Add(startTimeString); vl2.Add(nextStartTimeString);
vl2.Add(false); vl2.Add(false);
vl2.Add(x); vl2.Add(true);
vl.Add(vl2); vl.Add(vl2);
}
return vl; return vl;
} }
@ -232,7 +271,7 @@ class WorldEvent {
health.Add(targetUid, 1.0f); health.Add(targetUid, 1.0f);
health[targetUid] -= updateVal; health[targetUid] -= updateVal;
if (health[targetUid] < 0) { if (health[targetUid] < 0.0001f) {
health[targetUid] = 0.0f; health[targetUid] = 0.0f;
EndEvent(); EndEvent();
} }
@ -245,6 +284,17 @@ class WorldEvent {
return health[targetUid]; return health[targetUid];
} }
public void SetTimeSpan(Client client, float seconds) {
if (state != State.Active) {
return;
}
if (client == operatorAI || !endTimeIsSet) {
Console.WriteLine($"Event {uid} set TimeSpan: {seconds} from operator: {client == operatorAI}");
UpdateEndTime(seconds);
endTimeIsSet = true;
}
}
public void UpdateScore(string client, string value) { public void UpdateScore(string client, string value) {
if (!players.ContainsKey(client)) { if (!players.ContainsKey(client)) {
players.Add(client, value); players.Add(client, value);
@ -258,24 +308,9 @@ class WorldEvent {
AITime = DateTime.UtcNow.AddSeconds(7); AITime = DateTime.UtcNow.AddSeconds(7);
} }
public void SetTimeSpan(Client client, float seconds) {
if (state != State.Active) {
return;
}
if (client == operatorAI || !endTimeIsSet) {
Console.WriteLine($"Event {uid} set TimeSpan: {seconds} from operator: {client == operatorAI}");
UpdateEndTime(seconds);
endTimeIsSet = true;
}
}
public float GetHealth(string targetUid) => health[targetUid]; public float GetHealth(string targetUid) => health[targetUid];
public bool IsActive() { public bool IsActive() => (state == State.Active);
return state == State.Active;
}
public string GetLastResults() { public string GetLastResults() => lastResults;
return lastResults;
}
} }