Change netplay initial gctime to be determined by the hosts initial time
This commit is contained in:
parent
4cdc307b87
commit
074d688884
|
@ -534,6 +534,8 @@ include_directories(Source/Core)
|
|||
#
|
||||
add_subdirectory(Externals/Bochs_disasm)
|
||||
include_directories(Externals/Bochs_disasm)
|
||||
include_directories(Externals)
|
||||
add_subdirectory(Externals/enet)
|
||||
|
||||
if(NOT XXHASH_FOUND)
|
||||
message("Using static xxhash from Externals")
|
||||
|
|
|
@ -24,6 +24,7 @@ set(SRCS BreakPoints.cpp
|
|||
SysConf.cpp
|
||||
Thread.cpp
|
||||
Timer.cpp
|
||||
TraversalClient.cpp
|
||||
Version.cpp
|
||||
x64ABI.cpp
|
||||
x64Analyzer.cpp
|
||||
|
@ -33,7 +34,7 @@ set(SRCS BreakPoints.cpp
|
|||
Logging/ConsoleListener.cpp
|
||||
Logging/LogManager.cpp)
|
||||
|
||||
|
||||
set(LIBS enet)
|
||||
if(_M_ARM)
|
||||
if (_M_ARM_32) #ARMv7
|
||||
set(SRCS ${SRCS}
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
// This file is public domain, in case it's useful to anyone. -comex
|
||||
|
||||
#include "Common/TraversalClient.h"
|
||||
#include "enet/enet.h"
|
||||
#include "Timer.h"
|
||||
#include "Common/TraversalClient.h"
|
||||
|
||||
static void GetRandomishBytes(u8* buf, size_t size)
|
||||
{
|
||||
|
@ -15,11 +14,11 @@ static void GetRandomishBytes(u8* buf, size_t size)
|
|||
|
||||
TraversalClient::TraversalClient(ENetHost* netHost, const std::string& server)
|
||||
: m_NetHost(netHost)
|
||||
, m_Server(server)
|
||||
, m_Client(nullptr)
|
||||
, m_FailureReason(0)
|
||||
, m_ConnectRequestId(0)
|
||||
, m_PendingConnect(false)
|
||||
, m_Server(server)
|
||||
, m_PingTime(0)
|
||||
{
|
||||
netHost->intercept = TraversalClient::InterceptCallback;
|
||||
|
@ -113,6 +112,8 @@ void TraversalClient::Update()
|
|||
|
||||
enet_packet_destroy(netEvent.packet);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
HandleResends();
|
||||
|
@ -343,9 +344,7 @@ bool EnsureTraversalClient(const std::string& server, u16 port)
|
|||
return false;
|
||||
}
|
||||
g_MainNetHost.reset(host);
|
||||
|
||||
g_TraversalClient.reset(new TraversalClient(g_MainNetHost.get(), server));
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
#include "Common/Common.h"
|
||||
#include "Common/Thread.h"
|
||||
#include "Common/TraversalProto.h"
|
||||
|
||||
#include "enet/enet.h"
|
||||
|
||||
class TraversalClientClient
|
||||
|
@ -28,7 +27,6 @@ public:
|
|||
Connected,
|
||||
Failure
|
||||
};
|
||||
|
||||
enum FailureReason
|
||||
{
|
||||
BadHost = 0x300,
|
||||
|
@ -38,14 +36,12 @@ public:
|
|||
ResendTimeout,
|
||||
ConnectFailedError = 0x400,
|
||||
};
|
||||
|
||||
TraversalClient(ENetHost* netHost, const std::string& server);
|
||||
~TraversalClient();
|
||||
void Reset();
|
||||
void ConnectToClient(const std::string& host);
|
||||
void ReconnectToServer();
|
||||
void Update();
|
||||
|
||||
// called from NetHost
|
||||
bool TestPacket(u8* data, size_t size, ENetAddress* from);
|
||||
void HandleResends();
|
||||
|
@ -63,14 +59,12 @@ private:
|
|||
int tries;
|
||||
enet_uint32 sendTime;
|
||||
};
|
||||
|
||||
void HandleServerPacket(TraversalPacket* packet);
|
||||
void ResendPacket(OutgoingTraversalPacketInfo* info);
|
||||
TraversalRequestId SendTraversalPacket(const TraversalPacket& packet);
|
||||
void OnFailure(int reason);
|
||||
void HandlePing();
|
||||
static int ENET_CALLBACK InterceptCallback(ENetHost* host, ENetEvent* event);
|
||||
|
||||
TraversalRequestId m_ConnectRequestId;
|
||||
bool m_PendingConnect;
|
||||
std::list<OutgoingTraversalPacketInfo> m_OutgoingTraversalPackets;
|
||||
|
@ -78,11 +72,9 @@ private:
|
|||
std::string m_Server;
|
||||
enet_uint32 m_PingTime;
|
||||
};
|
||||
|
||||
extern std::unique_ptr<TraversalClient> g_TraversalClient;
|
||||
// the NetHost connected to the TraversalClient.
|
||||
extern std::unique_ptr<ENetHost> g_MainNetHost;
|
||||
|
||||
// Create g_TraversalClient and g_MainNetHost if necessary.
|
||||
bool EnsureTraversalClient(const std::string& server, u16 port);
|
||||
void ReleaseTraversalClient();
|
||||
|
|
|
@ -247,6 +247,7 @@ set(LIBS
|
|||
bdisasm
|
||||
common
|
||||
discio
|
||||
enet
|
||||
inputcommon
|
||||
${LZO}
|
||||
sfml-network
|
||||
|
|
|
@ -452,7 +452,7 @@ bool BeginRecordingInput(int controllers)
|
|||
if (NetPlay::IsNetPlayRunning())
|
||||
{
|
||||
s_bNetPlay = true;
|
||||
s_recordingStartTime = NETPLAY_INITIAL_GCTIME;
|
||||
s_recordingStartTime = g_netplay_initial_gctime;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
#include "Core/ConfigManager.h"
|
||||
#include "Core/Core.h"
|
||||
#include "Core/Movie.h"
|
||||
#include "Core/NetPlayClient.h"
|
||||
#include "Core/HW/EXI_DeviceIPL.h"
|
||||
#include "Core/HW/SI.h"
|
||||
#include "Core/HW/SI_DeviceDanceMat.h"
|
||||
|
@ -13,8 +15,6 @@
|
|||
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
||||
#include "Core/IPC_HLE/WII_IPC_HLE_Device_usb.h"
|
||||
#include "Core/IPC_HLE/WII_IPC_HLE_WiiMote.h"
|
||||
#include "Core/Movie.h"
|
||||
#include "Core/NetPlayClient.h"
|
||||
|
||||
static std::mutex crit_netplay_client;
|
||||
static NetPlayClient * netplay_client = nullptr;
|
||||
|
@ -57,7 +57,8 @@ NetPlayClient::~NetPlayClient()
|
|||
|
||||
// called from ---GUI--- thread
|
||||
NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name, bool traversal)
|
||||
: m_dialog(dialog)
|
||||
: m_state(Failure)
|
||||
, m_dialog(dialog)
|
||||
, m_client(nullptr)
|
||||
, m_server(nullptr)
|
||||
, m_is_running(false)
|
||||
|
@ -69,7 +70,6 @@ NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlay
|
|||
, m_pid(0)
|
||||
, m_connecting(false)
|
||||
, m_traversal_client(nullptr)
|
||||
, m_state(Failure)
|
||||
{
|
||||
m_target_buffer_size = 20;
|
||||
ClearBuffers();
|
||||
|
@ -149,6 +149,8 @@ NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlay
|
|||
m_thread = std::thread(&NetPlayClient::ThreadFunc, this);
|
||||
}
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -375,6 +377,8 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
|
|||
g_NetPlaySettings.m_EXIDevice[0] = (TEXIDevices)tmp;
|
||||
packet >> tmp;
|
||||
g_NetPlaySettings.m_EXIDevice[1] = (TEXIDevices)tmp;
|
||||
|
||||
packet >> g_netplay_initial_gctime;
|
||||
}
|
||||
|
||||
m_dialog->OnMsgStartGame();
|
||||
|
@ -455,6 +459,8 @@ void NetPlayClient::Disconnect()
|
|||
case ENET_EVENT_TYPE_DISCONNECT:
|
||||
m_server = nullptr;
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
//didn't disconnect gracefully force disconnect
|
||||
|
@ -495,6 +501,8 @@ void NetPlayClient::ThreadFunc()
|
|||
|
||||
netEvent.peer->data = nullptr;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1050,7 +1058,7 @@ u32 CEXIIPL::NetPlay_GetGCTime()
|
|||
std::lock_guard<std::mutex> lk(crit_netplay_client);
|
||||
|
||||
if (netplay_client)
|
||||
return NETPLAY_INITIAL_GCTIME;
|
||||
return g_netplay_initial_gctime;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <map>
|
||||
#include <queue>
|
||||
#include <sstream>
|
||||
#include <SFML/Network/Packet.hpp>
|
||||
#include "Common/CommonTypes.h"
|
||||
#include "Common/FifoQueue.h"
|
||||
#include "Common/Thread.h"
|
||||
|
@ -14,7 +15,7 @@
|
|||
#include "Common/TraversalClient.h"
|
||||
#include "Core/NetPlayProto.h"
|
||||
#include "InputCommon/GCPadStatus.h"
|
||||
#include <SFML/Network/Packet.hpp>
|
||||
|
||||
|
||||
class NetPlayUI
|
||||
{
|
||||
|
@ -97,7 +98,7 @@ protected:
|
|||
Common::FifoQueue<GCPadStatus> m_pad_buffer[4];
|
||||
Common::FifoQueue<NetWiimote> m_wiimote_buffer[4];
|
||||
|
||||
NetPlayUI* m_dialog;
|
||||
NetPlayUI* m_dialog;
|
||||
|
||||
ENetHost* m_client;
|
||||
ENetPeer* m_server;
|
||||
|
|
|
@ -32,7 +32,7 @@ typedef std::vector<u8> NetWiimote;
|
|||
|
||||
#define NETPLAY_VERSION "Dolphin NetPlay 2014-01-08"
|
||||
|
||||
static const int NETPLAY_INITIAL_GCTIME = 1272737767;
|
||||
extern int g_netplay_initial_gctime;
|
||||
|
||||
// messages
|
||||
enum
|
||||
|
|
|
@ -4,13 +4,22 @@
|
|||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "Common/StdMakeUnique.h"
|
||||
#include "Common/StringUtil.h"
|
||||
#include "Core/HW/EXI_DeviceIPL.h"
|
||||
#include "Core/NetPlayClient.h" //for NetPlayUI
|
||||
#include "Core/NetPlayServer.h"
|
||||
#include "Core/HW/EXI_DeviceIPL.h"
|
||||
#include "InputCommon/GCPadStatus.h"
|
||||
#if !defined(_WIN32)
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#ifndef ANDROID
|
||||
#include <ifaddrs.h>
|
||||
#endif
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
int g_netplay_initial_gctime = 1272737767;
|
||||
|
||||
NetPlayServer::~NetPlayServer()
|
||||
{
|
||||
|
@ -175,6 +184,8 @@ void NetPlayServer::ThreadFunc()
|
|||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -285,7 +296,7 @@ unsigned int NetPlayServer::OnConnect(ENetPeer* socket)
|
|||
// add client to the player list
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
|
||||
m_players.emplace(player.socket->connectID, player);
|
||||
m_players.insert(std::pair<u32, Client>(player.socket->connectID, player));
|
||||
std::lock_guard<std::recursive_mutex> lks(m_crit.send);
|
||||
UpdatePadMapping(); // sync pad mappings with everyone
|
||||
UpdateWiimoteMapping();
|
||||
|
@ -617,6 +628,8 @@ bool NetPlayServer::StartGame()
|
|||
// no change, just update with clients
|
||||
AdjustPadBufferSize(m_target_buffer_size);
|
||||
|
||||
g_netplay_initial_gctime = CEXIIPL::GetGCTime();
|
||||
|
||||
// tell clients to start game
|
||||
sf::Packet spac;
|
||||
spac << (MessageId)NP_MSG_START_GAME;
|
||||
|
@ -630,6 +643,7 @@ bool NetPlayServer::StartGame()
|
|||
spac << m_settings.m_OCFactor;
|
||||
spac << m_settings.m_EXIDevice[0];
|
||||
spac << m_settings.m_EXIDevice[1];
|
||||
spac << g_netplay_initial_gctime;
|
||||
|
||||
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
|
||||
std::lock_guard<std::recursive_mutex> lks(m_crit.send);
|
||||
|
@ -712,44 +726,20 @@ std::vector<std::pair<std::string, std::string>> NetPlayServer::GetInterfaceList
|
|||
std::vector<std::pair<std::string, std::string>> result;
|
||||
#if defined(_WIN32)
|
||||
|
||||
#elif defined(__APPLE__)
|
||||
// we do this to get the friendly names rather than the BSD ones. ew.
|
||||
if (m_dynamic_store && m_prefs)
|
||||
{
|
||||
CFArrayRef ary = SCNetworkServiceCopyAll((SCPreferencesRef)m_prefs);
|
||||
for (CFIndex i = 0; i < CFArrayGetCount(ary); i++)
|
||||
{
|
||||
SCNetworkServiceRef ifr = (SCNetworkServiceRef)CFArrayGetValueAtIndex(ary, i);
|
||||
std::string name = CFStrToStr(SCNetworkServiceGetName(ifr));
|
||||
CFStringRef key = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL, kSCDynamicStoreDomainState, SCNetworkServiceGetServiceID(ifr), kSCEntNetIPv4);
|
||||
CFDictionaryRef props = (CFDictionaryRef)SCDynamicStoreCopyValue((SCDynamicStoreRef)m_dynamic_store, key);
|
||||
CFRelease(key);
|
||||
if (!props)
|
||||
continue;
|
||||
CFArrayRef ipary = (CFArrayRef)CFDictionaryGetValue(props, kSCPropNetIPv4Addresses);
|
||||
if (ipary)
|
||||
{
|
||||
for (CFIndex j = 0; j < CFArrayGetCount(ipary); j++)
|
||||
result.emplace_back(std::make_pair(name, CFStrToStr((CFStringRef)CFArrayGetValueAtIndex(ipary, j))));
|
||||
CFRelease(ipary);
|
||||
}
|
||||
}
|
||||
CFRelease(ary);
|
||||
}
|
||||
#elif defined(ANDROID)
|
||||
// Android has no getifaddrs for some stupid reason. If this
|
||||
// functionality ends up actually being used on Android, fix this.
|
||||
#else
|
||||
ifaddrs* ifp;
|
||||
ifaddrs* ifp = nullptr;
|
||||
char buf[512];
|
||||
if (getifaddrs(&ifp) != -1)
|
||||
{
|
||||
for (struct ifaddrs* curifp = ifp; curifp; curifp = curifp->ifa_next)
|
||||
for (ifaddrs* curifp = ifp; curifp; curifp = curifp->ifa_next)
|
||||
{
|
||||
struct sockaddr* sa = curifp->ifa_addr;
|
||||
sockaddr* sa = curifp->ifa_addr;
|
||||
if (sa->sa_family != AF_INET)
|
||||
continue;
|
||||
struct sockaddr_in* sai = (struct sockaddr_in*) sa;
|
||||
sockaddr_in* sai = (struct sockaddr_in*) sa;
|
||||
if (ntohl(((struct sockaddr_in*) sa)->sin_addr.s_addr) == 0x7f000001)
|
||||
continue;
|
||||
const char* ip = inet_ntop(sa->sa_family, &sai->sin_addr, buf, sizeof(buf));
|
||||
|
@ -761,7 +751,7 @@ std::vector<std::pair<std::string, std::string>> NetPlayServer::GetInterfaceList
|
|||
}
|
||||
#endif
|
||||
if (result.empty())
|
||||
result.push_back(std::make_pair("!local!", "127.0.0.1"));
|
||||
result.emplace_back(std::make_pair("!local!", "127.0.0.1"));
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,12 +8,11 @@
|
|||
#include <queue>
|
||||
#include <sstream>
|
||||
#include <unordered_set>
|
||||
|
||||
#include "Common/Thread.h"
|
||||
#include "Common/TraversalClient.h"
|
||||
#include "Common/Timer.h"
|
||||
#include "Core/NetPlayProto.h"
|
||||
#include <SFML/Network/Packet.hpp>
|
||||
#include "Common/Thread.h"
|
||||
#include "Common/Timer.h"
|
||||
#include "Common/TraversalClient.h"
|
||||
#include "Core/NetPlayProto.h"
|
||||
|
||||
class NetPlayUI;
|
||||
|
||||
|
@ -127,4 +126,4 @@ private:
|
|||
static bool m_upnp_error;
|
||||
static std::thread m_upnp_thread;
|
||||
#endif
|
||||
};
|
||||
};
|
|
@ -12,6 +12,7 @@
|
|||
#include <wx/chartype.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/choice.h>
|
||||
#include <wx/clipbrd.h>
|
||||
#include <wx/defs.h>
|
||||
#include <wx/dialog.h>
|
||||
#include <wx/event.h>
|
||||
|
@ -27,7 +28,7 @@
|
|||
#include <wx/string.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/translation.h>
|
||||
#include <wx/clipbrd.h>
|
||||
|
||||
|
||||
#include "Common/CommonTypes.h"
|
||||
#include "Common/FifoQueue.h"
|
||||
|
@ -416,12 +417,12 @@ NetPlayDiag::NetPlayDiag(wxWindow* const parent, const CGameListCtrl* const game
|
|||
: wxFrame(parent, wxID_ANY, _("Dolphin NetPlay"))
|
||||
, m_selected_game(game)
|
||||
, m_start_btn(nullptr)
|
||||
, m_game_list(game_list)
|
||||
, m_host_type_choice(nullptr)
|
||||
, m_host_label(nullptr)
|
||||
, m_host_type_choice(nullptr)
|
||||
, m_host_copy_btn(nullptr)
|
||||
, m_host_copy_btn_is_retry(false)
|
||||
, m_is_hosting(is_hosting)
|
||||
, m_game_list(game_list)
|
||||
{
|
||||
Bind(wxEVT_THREAD, &NetPlayDiag::OnThread, this);
|
||||
|
||||
|
|
|
@ -105,8 +105,8 @@ private:
|
|||
|
||||
wxListBox* m_player_lbox;
|
||||
wxTextCtrl* m_chat_text;
|
||||
wxTextCtrl* m_chat_msg_text;
|
||||
wxCheckBox* m_memcard_write;
|
||||
wxTextCtrl* m_chat_msg_text;
|
||||
wxCheckBox* m_memcard_write;
|
||||
wxCheckBox* m_record_chkbox;
|
||||
|
||||
std::string m_selected_game;
|
||||
|
|
|
@ -413,8 +413,8 @@ Global
|
|||
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Debug|x64.Build.0 = Debug|x64
|
||||
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Mixed Platforms.ActiveCfg = Release|Win32
|
||||
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Mixed Platforms.Build.0 = Release|Win32
|
||||
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Mixed Platforms.ActiveCfg = Release|x64
|
||||
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Mixed Platforms.Build.0 = Release|x64
|
||||
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|Win32.Build.0 = Release|Win32
|
||||
{CBC76802-C128-4B17-BF6C-23B08C313E5E}.Release|x64.ActiveCfg = Release|x64
|
||||
|
|
Loading…
Reference in New Issue