From 19e580631f1cc8b03ce66c1174b7df0f1e9fbf42 Mon Sep 17 00:00:00 2001 From: kcinnaJlol <39594309+kcinnaJlol@users.noreply.github.com> Date: Fri, 13 Dec 2024 20:27:59 +0100 Subject: [PATCH 1/2] add pausing --- server/client_events/client_chat_event.py | 21 +++++++++++++++--- server/init_server.py | 2 +- simulation/init_simulation.py | 26 +++++++++++++---------- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/server/client_events/client_chat_event.py b/server/client_events/client_chat_event.py index ac59014..31885d6 100644 --- a/server/client_events/client_chat_event.py +++ b/server/client_events/client_chat_event.py @@ -1,5 +1,20 @@ import json +from simulation.init_simulation import simulation as sim from server.server_events import server_chat_event - -def handle(data, source_user): - server_chat_event.fire("{1}: {0}".format(data, source_user)) +def handle(data, user): + server_chat_event.fire("{1}: {0}".format(data, user.username)) + ip = user.websocket.remote_address[0] + if ip == "127.0.0.1" and data[0] == "/": + parse_command(data[1:]) + +def change_pause(value): + sim.running = value + if sim.running: + server_chat_event.fire("Simulation unpaused.") + else: + server_chat_event.fire("Simulation paused.") + +def parse_command(cmd): + match cmd: + case "pause": + change_pause(not sim.running) diff --git a/server/init_server.py b/server/init_server.py index 01abce1..6f61b33 100644 --- a/server/init_server.py +++ b/server/init_server.py @@ -142,7 +142,7 @@ def init_server(websocket): server_meter_parameters_update_event.fire_initial(token_object.token) case packets.ClientPackets.CHAT: - client_chat_event.handle(packet_data, token_object.username) + client_chat_event.handle(packet_data, token_object) case packets.ClientPackets.VOIP: client_voip_event.handle(packet_data, token_object.username) diff --git a/simulation/init_simulation.py b/simulation/init_simulation.py index 08b7f4d..cbdfd77 100644 --- a/simulation/init_simulation.py +++ b/simulation/init_simulation.py @@ -15,6 +15,8 @@ class Simulation: def __init__(self): + self.running = False + self.timestep = 0.1 # time between model steps self.default_timestep = 0.1 # what is 1x speed self.minimum_speedup_drop = 2 # skip sending packets if we exceed this many times 1x speed @@ -32,16 +34,17 @@ def __init__(self): def timer(self): while True: start = time.perf_counter() - model.model_run(self.prev_delta) - drop = 0 - if (self.default_timestep/self.timestep) >= self.minimum_speedup_drop: - drop = self.timesteps % math.floor((self.default_timestep/self.timestep)/self.minimum_speedup_drop) - if drop == 0: # prevent flooding clients on high speedups - server_meter_parameters_update_event.fire(model.values) - server_indicator_parameters_update_event.fire(model.indicators) - server_switch_parameters_update_event.fire(model.switches,True) - server_alarm_parameters_update_event.fire(model.alarms) - server_recorder_parameters_update_event.fire(model.recorders) + if self.running: + model.model_run(self.prev_delta) + drop = 0 + if (self.default_timestep/self.timestep) >= self.minimum_speedup_drop: + drop = self.timesteps % math.floor((self.default_timestep/self.timestep)/self.minimum_speedup_drop) + if drop == 0: # prevent flooding clients on high speedups + server_meter_parameters_update_event.fire(model.values) + server_indicator_parameters_update_event.fire(model.indicators) + server_switch_parameters_update_event.fire(model.switches,True) + server_alarm_parameters_update_event.fire(model.alarms) + server_recorder_parameters_update_event.fire(model.recorders) end = time.perf_counter() delta = end - start if self.timestep - delta < 0: @@ -54,7 +57,8 @@ def timer(self): def timer_fast(self): while True: start = time.perf_counter() - model.model_run_fast(self.fast_prev_delta) + if self.running: + model.model_run_fast(self.fast_prev_delta) end = time.perf_counter() delta = end - start From 4d3bfa9f3cd5fbca0612a7a11d682184b8bdb5b1 Mon Sep 17 00:00:00 2001 From: kcinnaJlol <39594309+kcinnaJlol@users.noreply.github.com> Date: Fri, 13 Dec 2024 20:46:13 +0100 Subject: [PATCH 2/2] minor tweaks - give feedback when commands are available and when joining a paused server - send updates while paused --- server/init_server.py | 1 + server/server_events/server_chat_event.py | 10 +++++++++- simulation/init_simulation.py | 18 +++++++++--------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/server/init_server.py b/server/init_server.py index 6f61b33..2b7e558 100644 --- a/server/init_server.py +++ b/server/init_server.py @@ -140,6 +140,7 @@ def init_server(websocket): case packets.ClientPackets.SYNCHRONIZE: #allows the client to request some extra stuff server_player_position_parameters_update_event.fire_initial(token_object.token) server_meter_parameters_update_event.fire_initial(token_object.token) + server_chat_event.fire_initial(token_object) case packets.ClientPackets.CHAT: client_chat_event.handle(packet_data, token_object) diff --git a/server/server_events/server_chat_event.py b/server/server_events/server_chat_event.py index 1d40a4a..b91bc4a 100644 --- a/server/server_events/server_chat_event.py +++ b/server/server_events/server_chat_event.py @@ -1,11 +1,19 @@ from server.helpers import packet_helper from server.connection_manager import manager from server.constants import packets +from simulation.init_simulation import simulation as sim import json def fire(message): manager.broadcast_packet(packet_helper.build(packets.ServerPackets.CHAT, message)) def fire_initial(token_object): - manager.send_user_packet(packet_helper.build(packets.ServerPackets.CHAT, "Connected"), token_object.token) + if token_object.websocket.remote_address[0] == "127.0.0.1": + manager.send_user_packet(packet_helper.build(packets.ServerPackets.CHAT, "Connected (commands are available)"), token_object.token) + else: + manager.send_user_packet(packet_helper.build(packets.ServerPackets.CHAT, "Connected"), token_object.token) + + if not sim.running: + manager.send_user_packet(packet_helper.build(packets.ServerPackets.CHAT, "Simulation paused."), token_object.token) + pass diff --git a/simulation/init_simulation.py b/simulation/init_simulation.py index cbdfd77..a5bf674 100644 --- a/simulation/init_simulation.py +++ b/simulation/init_simulation.py @@ -36,15 +36,15 @@ def timer(self): start = time.perf_counter() if self.running: model.model_run(self.prev_delta) - drop = 0 - if (self.default_timestep/self.timestep) >= self.minimum_speedup_drop: - drop = self.timesteps % math.floor((self.default_timestep/self.timestep)/self.minimum_speedup_drop) - if drop == 0: # prevent flooding clients on high speedups - server_meter_parameters_update_event.fire(model.values) - server_indicator_parameters_update_event.fire(model.indicators) - server_switch_parameters_update_event.fire(model.switches,True) - server_alarm_parameters_update_event.fire(model.alarms) - server_recorder_parameters_update_event.fire(model.recorders) + drop = 0 + if (self.default_timestep/self.timestep) >= self.minimum_speedup_drop: + drop = self.timesteps % math.floor((self.default_timestep/self.timestep)/self.minimum_speedup_drop) + if drop == 0: # prevent flooding clients on high speedups + server_meter_parameters_update_event.fire(model.values) + server_indicator_parameters_update_event.fire(model.indicators) + server_switch_parameters_update_event.fire(model.switches,True) + server_alarm_parameters_update_event.fire(model.alarms) + server_recorder_parameters_update_event.fire(model.recorders) end = time.perf_counter() delta = end - start if self.timestep - delta < 0: