Просмотр исходного кода

sample fixed, network interface updated, few methods improved regarding p2p

Arnis Lielturks 7 лет назад
Родитель
Сommit
018dcffb2b

+ 8 - 3
Source/Samples/54_P2PMultiplayer/P2PMultiplayer.cpp

@@ -113,8 +113,9 @@ void P2PMultiplayer::CreateUI()
     int marginTop = 20;
 //    CreateLabel("1. Start server", IntVector2(20, marginTop-20));
     startSession_ = CreateButton("Start session", 160, IntVector2(20, marginTop));
+    nickname_ = CreateLineEdit("Nickname", 160, IntVector2(200, marginTop));
     marginTop += 40;
-    guid_ = CreateLineEdit("1234", 200, IntVector2(20, marginTop));
+    guid_ = CreateLineEdit("", 200, IntVector2(20, marginTop));
     marginTop += 40;
     joinSession_ = CreateButton("Join session", 160, IntVector2(20, marginTop));
 
@@ -167,9 +168,10 @@ void P2PMultiplayer::SubscribeToEvents()
 
 void P2PMultiplayer::HandleStartP2PSession(StringHash eventType, VariantMap& eventData)
 {
+    peers_.Clear();
     URHO3D_LOGINFO("HandleStartP2PSession");
     VariantMap identity;
-    identity["Name"] = "Initial Host";
+    identity["Name"] = nickname_->GetText();
     GetSubsystem<Network>()->P2PStartSession(scene_, identity);
     httpRequest_ = GetSubsystem<Network>()->MakeHttpRequest("http://frameskippers.com:82/?guid=" + GetSubsystem<Network>()->P2PGetGUID());
 
@@ -178,10 +180,11 @@ void P2PMultiplayer::HandleStartP2PSession(StringHash eventType, VariantMap& eve
 
 void P2PMultiplayer::HandleJoinP2PSession(StringHash eventType, VariantMap& eventData)
 {
+    peers_.Clear();
     URHO3D_LOGINFO("HandleJoinP2PSession " + guid_->GetText());
     VariantMap identity;
     SetRandomSeed(Time::GetSystemTime());
-    identity["Name"] = "Client " + String(Random(100));
+    identity["Name"] = nickname_->GetText();
     GetSubsystem<Network>()->P2PJoinSession(guid_->GetText(), scene_, identity);
 //    GetSubsystem<Network>()->SetSimulatedLatency(Random(10.0f));
 //    GetSubsystem<Network>()->SetSimulatedLatency(10 + Random(100));
@@ -243,6 +246,7 @@ void P2PMultiplayer::HandleUpdate(StringHash eventType, VariantMap& eventData)
     }
 
     if (timer_.GetMSec(false) > 1000) {
+        GetSubsystem<Network>()->SetSimulatedLatency(Random(100.0f));
 //        GetSubsystem<Network>()->SetSimulatedLatency(100 + Random(1000));
         if (GetSubsystem<Network>()->GetClientConnections().Size() != peers_.Size() - 1) {
             UpdateClientObjects();
@@ -562,5 +566,6 @@ void P2PMultiplayer::HandleNewHost(StringHash eventType, VariantMap& eventData)
 {
     using namespace P2PNewHost;
     URHO3D_LOGINFOF("Host changed %s, %i => %s", eventData[P_ADDRESS].GetString().CString(), eventData[P_PORT].GetInt(), eventData[P_GUID].GetString().CString());
+    SetRandomSeed(Time::GetSystemTime());
 
 }

+ 1 - 0
Source/Samples/54_P2PMultiplayer/P2PMultiplayer.h

@@ -122,6 +122,7 @@ private:
     SharedPtr<Button> resetHostButton_;
     SharedPtr<Button> disconnect_;
     SharedPtr<LineEdit> guid_;
+    SharedPtr<LineEdit> nickname_;
 //    /// Found server list
 	SharedPtr<Text> clientCount_;
     SharedPtr<Text> roleTitle_;

+ 16 - 3
Source/Samples/54_P2PMultiplayer/Peer.cpp

@@ -74,8 +74,14 @@ void Peer::HandlePhysicsPrestep(StringHash eventType, VariantMap& eventData)
         return;
     }
 
+    bool isHost = false;
+    String nickname = "Unnnamed";
     if (connection_) {
         controls_ = connection_->GetControls();
+        if (connection_->GetGUID() == GetSubsystem<Network>()->P2PGetHostAddress()) {
+            isHost = true;
+        }
+        nickname = connection_->GetIdentity()["Name"].GetString();
     }
 
     const float MOVE_TORQUE = 3.0f;
@@ -103,8 +109,15 @@ void Peer::HandlePhysicsPrestep(StringHash eventType, VariantMap& eventData)
     }
 
     auto text = node_->GetComponent<Text3D>();
-    if (text) {
-        text->SetText(connection_->GetGUID() + " [" + String(connection_->GetLastPing()) + "]");
+    if (text && updateTimer_.GetMSec(false) > 1000) {
+        if (isHost) {
+            // Since host label almost never changes, we have to add some sort of random value to it so it could be synced between peers
+            text->SetText(connection_->GetGUID() + " [" + nickname + "] [" + String(Random(1, 3)) + "] [HOST]");
+        } else {
+            text->SetText(connection_->GetGUID() + " [" + nickname + "] [" + String(connection_->GetLastPing()) + "]");
+        }
+
+        updateTimer_.Reset();
     }
 }
 
@@ -132,7 +145,7 @@ void Peer::Create(Connection* connection)
     auto* titleText = node_->CreateComponent<Text3D>(REPLICATED);
     titleText->SetText(connection->GetGUID());
     titleText->SetFaceCameraMode(FaceCameraMode::FC_LOOKAT_XYZ);
-    titleText->SetFont(cache->GetResource<Font>("Fonts/BlueHighway.sdf"), 24);
+    titleText->SetFont(cache->GetResource<Font>("Fonts/BlueHighway.sdf"), 30);
 
     // Create the physics components
     auto* body = node_->CreateComponent<RigidBody>();

+ 2 - 0
Source/Samples/54_P2PMultiplayer/Peer.h

@@ -49,6 +49,8 @@ private:
     WeakPtr<Connection> connection_;
 
     WeakPtr<Scene> scene_;
+
+    Timer updateTimer_;
 };
 
 

+ 8 - 6
Source/Urho3D/Network/Network.cpp

@@ -289,6 +289,8 @@ Network::Network(Context* context) :
     blacklistedRemoteEvents_.Insert(E_NETWORKHOSTDISCOVERED);
     blacklistedRemoteEvents_.Insert(E_NETWORKINVALIDPASSWORD);
     blacklistedRemoteEvents_.Insert(E_NETWORKBANNED);
+    blacklistedRemoteEvents_.Insert(E_P2PNEWHOST);
+    blacklistedRemoteEvents_.Insert(E_P2PSESSIONSTARTED);
 
 }
 
@@ -484,7 +486,7 @@ bool Network::P2PConnectNAT(const String& address, unsigned short port)
     }
 
     //isServer_ = false;
-    SLNet::ConnectionAttemptResult connectResult = rakPeer_->Connect(address.CString(), port, password_.CString(), password_.Length());
+    SLNet::ConnectionAttemptResult connectResult = rakPeer_->Connect(address.CString(), port, nullptr, 0);
     if (connectResult == SLNet::ALREADY_CONNECTED_TO_ENDPOINT) {
         URHO3D_LOGWARNING("Already connected to server " + address + ":" + String(port) + ", error code: " + String((int)connectResult));
         return false;
@@ -1346,6 +1348,7 @@ void Network::ConfigureNetworkSimulator()
 
 bool Network::P2PStartSession(Scene* scene, const VariantMap& identity)
 {
+    Disconnect(1000);
     if (!natPunchServerAddress_) {
         URHO3D_LOGERROR("Set the NAT server info first!");
         return false;
@@ -1389,6 +1392,7 @@ void Network::HandleNATStartP2PSession(StringHash eventType, VariantMap& eventDa
 
 void Network::P2PJoinSession(const String& guid, Scene* scene, const VariantMap& identity)
 {
+    Disconnect(1000);
     if (!natPunchServerAddress_) {
         URHO3D_LOGERROR("Set the NAT server info first!");
         return;
@@ -1424,6 +1428,7 @@ void Network::HandleNATJoinP2PSession(StringHash eventType, VariantMap& eventDat
         serverConnection_->SetSceneLoaded(true);
         serverConnection_->SetIdentity(identity_);
         serverConnection_->SetConnectPending(true);
+        serverConnection_->SetAddressOrGUID(*remoteGUID_);
         serverConnection_->ConfigureNetworkSimulator(simulatedLatency_, simulatedPacketLoss_);
     }
 
@@ -1452,10 +1457,7 @@ bool Network::P2PIsConnectedHost()
 
 bool Network::P2PIsHostSystem()
 {
-    if (P2PGetGUID() == hostGuid_ && isServer_) {
-        return true;
-    }
-    return false;
+    return fullyConnectedMesh2_->IsHostSystem();
 }
 
 String Network::P2PGetHostAddress()
@@ -1463,7 +1465,7 @@ String Network::P2PGetHostAddress()
     if (networkMode_ == SERVER_CLIENT) {
         return "";
     }
-    return String(fullyConnectedMesh2_->GetConnectedHost().ToString());
+    return hostGuid_;
 }
 
 void Network::P2PSetReady(bool value)

+ 3 - 2
Source/Urho3D/Network/Network.h

@@ -81,8 +81,6 @@ public:
     int GetP2PParticipantCount();
     /// Is host connected to the P2P session
     bool P2PIsConnectedHost();
-    /// Connect to NAT server which will handle P2P session
-    bool P2PConnectNAT(const String& address, unsigned short port);
     /// Are we the host system in P2P session
     bool P2PIsHostSystem();
     /// Get host GUID
@@ -169,6 +167,9 @@ public:
     const NetworkMode  GetMode() const;
 
 private:
+    /// Connect to NAT server which will handle P2P session
+    bool P2PConnectNAT(const String& address, unsigned short port);
+
     /// Handle begin frame event.
     void HandleBeginFrame(StringHash eventType, VariantMap& eventData);
     /// Handle render update frame event.