diff --git a/projects/openrct2.vcxproj.user b/projects/openrct2.vcxproj.user
index 96c90432a6..60b61f231a 100644
--- a/projects/openrct2.vcxproj.user
+++ b/projects/openrct2.vcxproj.user
@@ -24,6 +24,7 @@
$(TargetDir)\openrct2.exe
WindowsLocalDebugger
$(TargetDir)
- --server 127.0.0.1 --port 12345
+
+
\ No newline at end of file
diff --git a/src/game.c b/src/game.c
index af06998e03..f4167d48d4 100644
--- a/src/game.c
+++ b/src/game.c
@@ -380,6 +380,8 @@ void game_logic_update()
window_error_open(title_text, body_text);
}
+
+ network_tick();
}
/**
diff --git a/src/interface/window.h b/src/interface/window.h
index b856ae8611..5b5af29019 100644
--- a/src/interface/window.h
+++ b/src/interface/window.h
@@ -619,6 +619,7 @@ void window_sign_small_open(rct_windownumber number);
void window_cheats_open();
void window_player_list_open();
void window_network_status_open(const char* text);
+void window_network_status_close();
void window_server_list_open();
void window_research_open();
diff --git a/src/network/network.cpp b/src/network/network.cpp
index b1cc1e0606..4645a0caae 100644
--- a/src/network/network.cpp
+++ b/src/network/network.cpp
@@ -55,6 +55,7 @@ enum {
NETWORK_COMMAND_PLAYERLIST,
NETWORK_COMMAND_PING,
NETWORK_COMMAND_PINGLIST,
+ NETWORK_COMMAND_READY,
NETWORK_COMMAND_MAX
};
@@ -67,6 +68,7 @@ const char *NetworkCommandNames[] = {
"NETWORK_COMMAND_PLAYERLIST",
"NETWORK_COMMAND_PING",
"NETWORK_COMMAND_PINGLIST",
+ "NETWORK_COMMAND_READY",
};
NetworkPacket::NetworkPacket()
@@ -248,6 +250,7 @@ Network::Network()
server_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Server_Handle_CHAT;
server_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Server_Handle_GAMECMD;
server_command_handlers[NETWORK_COMMAND_PING] = &Network::Server_Handle_PING;
+ server_command_handlers[NETWORK_COMMAND_READY] = &Network::Server_Handle_READY;
}
Network::~Network()
@@ -406,12 +409,7 @@ uint8 Network::GetPlayerID()
void Network::Update()
{
- if (GetMode() == NETWORK_MODE_NONE)
- return;
-
switch (GetMode()) {
- case NETWORK_MODE_NONE:
- return;
case NETWORK_MODE_SERVER:
UpdateServer();
break;
@@ -466,16 +464,36 @@ void Network::UpdateClient()
{
if (!ProcessConnection(server_connection)) {
Close();
- } else {
- ProcessGameCommandQueue();
- if (CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) {
- if (server_srand0_tick == 0) {
- // printf("SRAND OK!\n");
- }
- } else {
- window_network_status_open("Network desync detected");
- Close();
+ }
+}
+
+void Network::UpdateTick()
+{
+ switch (GetMode()) {
+ case NETWORK_MODE_SERVER:
+ UpdateServerTick();
+ break;
+ case NETWORK_MODE_CLIENT:
+ UpdateClientTick();
+ break;
+ }
+}
+
+void Network::UpdateServerTick()
+{
+
+}
+
+void Network::UpdateClientTick()
+{
+ ProcessGameCommandQueue();
+ if (CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) {
+ if (server_srand0_tick == 0) {
+ // printf("SRAND OK!\n");
}
+ } else {
+ window_network_status_open("Network desync detected");
+ Close();
}
}
@@ -636,6 +654,13 @@ void Network::Server_Send_PINGLIST()
SendPacketToClients(*packet);
}
+void Network::Client_Send_READY()
+{
+ std::unique_ptr packet = std::move(NetworkPacket::Allocate());
+ *packet << (uint32)NETWORK_COMMAND_READY;
+ server_connection.QueuePacket(std::move(packet));
+}
+
bool Network::ProcessConnection(NetworkConnection& connection)
{
int packetStatus;
@@ -830,15 +855,20 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac
window_network_status_open(status);
memcpy(&chunk_buffer[offset], (void*)packet.Read(chunksize), chunksize);
if (offset + chunksize == size) {
+ window_network_status_close();
+
SDL_RWops* rw = SDL_RWFromMem(&chunk_buffer[0], size);
if (game_load_network(rw)) {
game_load_init();
- if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) & 1)
+ if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) == 0) {
pause_toggle();
+ }
game_command_queue.clear();
server_tick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32);
server_srand0_tick = 0;
- window_network_status_open("Loaded new map from network");
+
+ Client_Send_READY();
+ // window_network_status_open("Loaded new map from network");
}
SDL_RWclose(rw);
}
@@ -873,8 +903,13 @@ int Network::Client_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket&
uint8 playerid;
uint8 callback;
packet >> tick >> args[0] >> args[1] >> args[2] >> args[3] >> args[4] >> args[5] >> args[6] >> playerid >> callback;
- GameCommand gc = GameCommand(tick, args, playerid, callback);
- game_command_queue.insert(gc);
+
+ if (args[4] == GAME_COMMAND_TOGGLE_PAUSE) {
+ pause_toggle();
+ } else {
+ GameCommand gc = GameCommand(tick, args, playerid, callback);
+ game_command_queue.insert(gc);
+ }
return 1;
}
@@ -956,6 +991,14 @@ int Network::Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket
return 1;
}
+int Network::Server_Handle_READY(NetworkConnection& connection, NetworkPacket& packet)
+{
+ if (!was_paused_before_client_connected) {
+ game_do_command(0, 1, 0, 0, GAME_COMMAND_TOGGLE_PAUSE, 0, 0);
+ }
+ return 1;
+}
+
int network_init()
{
return gNetwork.Init();
@@ -981,6 +1024,11 @@ void network_update()
gNetwork.Update();
}
+void network_tick()
+{
+ gNetwork.UpdateTick();
+}
+
int network_get_mode()
{
return gNetwork.GetMode();
diff --git a/src/network/network.h b/src/network/network.h
index 17dc74a497..d3fb166cac 100644
--- a/src/network/network.h
+++ b/src/network/network.h
@@ -132,6 +132,7 @@ public:
uint32 GetServerTick();
uint8 GetPlayerID();
void Update();
+ void UpdateTick();
NetworkPlayer* GetPlayerByID(int id);
const char* FormatChat(NetworkPlayer* fromplayer, const char* text);
void SendPacketToClients(NetworkPacket& packet);
@@ -148,6 +149,7 @@ public:
void Client_Send_PING();
void Server_Send_PING();
void Server_Send_PINGLIST();
+ void Client_Send_READY();
std::vector> player_list;
@@ -192,6 +194,8 @@ private:
void UpdateServer();
void UpdateClient();
+ void UpdateServerTick();
+ void UpdateClientTick();
private:
std::vector client_command_handlers;
@@ -208,6 +212,7 @@ private:
int Client_Handle_PING(NetworkConnection& connection, NetworkPacket& packet);
int Server_Handle_PING(NetworkConnection& connection, NetworkPacket& packet);
int Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket& packet);
+ int Server_Handle_READY(NetworkConnection& connection, NetworkPacket& packet);
};
extern "C" {
@@ -219,6 +224,7 @@ int network_begin_client(const char *host, int port);
int network_begin_server(int port);
void network_update();
+void network_tick();
int network_get_mode();
int network_get_authstatus();
uint32 network_get_server_tick();
diff --git a/src/openrct2.c b/src/openrct2.c
index 02d96a5f1e..14e8aae5d3 100644
--- a/src/openrct2.c
+++ b/src/openrct2.c
@@ -244,6 +244,10 @@ void openrct2_launch()
rct2_open_file(gOpenRCT2StartupActionPath);
RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_PLAYING;
+
+ if (gNetworkStart == NETWORK_MODE_SERVER) {
+ network_begin_server(gNetworkStartPort);
+ }
break;
case STARTUP_ACTION_EDIT:
if (strlen(gOpenRCT2StartupActionPath) == 0) {
@@ -256,8 +260,6 @@ void openrct2_launch()
if (gNetworkStart == NETWORK_MODE_CLIENT) {
network_begin_client(gNetworkStartHost, gNetworkStartPort);
- } else if (gNetworkStart == NETWORK_MODE_SERVER) {
- network_begin_server(gNetworkStartPort);
}
openrct2_loop();
diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c
index 504306ff34..368a4fbfe4 100644
--- a/src/windows/loadsave.c
+++ b/src/windows/loadsave.c
@@ -26,6 +26,7 @@
#include "../interface/widget.h"
#include "../interface/window.h"
#include "../localisation/localisation.h"
+#include "../network/network.h"
#include "../scenario.h"
#include "../title.h"
#include "../windows/error.h"
@@ -748,6 +749,10 @@ static void window_loadsave_select(rct_window *w, const char *path)
}
}
else if (game_load_save(path)) {
+ if (_loadsaveType & LOADSAVETYPE_NETWORK) {
+ network_begin_server(gConfigNetwork.default_port);
+ }
+
window_close(w);
gfx_invalidate_screen();
rct2_endupdate();
diff --git a/src/windows/network_status.c b/src/windows/network_status.c
index d2f49888a1..813e7e9620 100644
--- a/src/windows/network_status.c
+++ b/src/windows/network_status.c
@@ -106,6 +106,11 @@ void window_network_status_open(const char* text)
window->colours[2] = 7;
}
+void window_network_status_close()
+{
+ window_close_by_class(WC_NETWORK_STATUS);
+}
+
static void window_network_status_mouseup(rct_window *w, int widgetIndex)
{
switch (widgetIndex) {
diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c
index c3e726a280..6c93cb0e0f 100644
--- a/src/windows/top_toolbar.c
+++ b/src/windows/top_toolbar.c
@@ -660,8 +660,17 @@ static void window_top_toolbar_invalidate(rct_window *w)
if (!gConfigInterface.toolbar_show_news)
window_top_toolbar_widgets[WIDX_NEWS].type = WWT_EMPTY;
- if (network_get_mode() == NETWORK_MODE_NONE)
+ switch (network_get_mode()) {
+ case NETWORK_MODE_SERVER:
+ window_top_toolbar_widgets[WIDX_FASTFORWARD].type = WWT_EMPTY;
+ break;
+ case NETWORK_MODE_CLIENT:
+ window_top_toolbar_widgets[WIDX_PAUSE].type = WWT_EMPTY;
+ window_top_toolbar_widgets[WIDX_FASTFORWARD].type = WWT_EMPTY;
+ break;
+ default:
window_top_toolbar_widgets[WIDX_NETWORK].type = WWT_EMPTY;
+ }
}
enabledWidgets = 0;