forked from SoDOff-Project/sodoff-mmo
fix chat announcement before event
This commit is contained in:
parent
245fd2237a
commit
31420034ff
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user