From 96e2d749c714e0637bd83d20fbd59ed0ad920e85 Mon Sep 17 00:00:00 2001 From: Koncord Date: Sun, 18 Sep 2016 11:54:45 +0800 Subject: [PATCH] New auth protocol --- apps/openmw-mp/Networking.cpp | 48 +++++++++++++++--------- apps/openmw/engine.cpp | 4 +- apps/openmw/mwmp/Main.cpp | 63 +++++++++++++++++++++----------- apps/openmw/mwmp/Main.hpp | 3 +- components/openmw-mp/Version.hpp | 2 +- 5 files changed, 77 insertions(+), 43 deletions(-) diff --git a/apps/openmw-mp/Networking.cpp b/apps/openmw-mp/Networking.cpp index d28c8ce79..81938cbff 100644 --- a/apps/openmw-mp/Networking.cpp +++ b/apps/openmw-mp/Networking.cpp @@ -52,10 +52,9 @@ void Networking::Update(RakNet::Packet *packet) if (player == 0) { controller->GetPacket(ID_HANDSHAKE)->RequestData(packet->guid); - - NewPlayer(packet->guid); + Players::NewPlayer(packet->guid); player = Players::GetPlayer(packet->guid); - + controller->GetPacket(ID_USER_MYID)->Send(Players::GetPlayer(packet->guid), false); return; } @@ -97,6 +96,20 @@ void Networking::Update(RakNet::Packet *packet) return; } player->Handshake(); + return; + } + + if (!player->isHandshaked()) + { + LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Have not completed handshake with player %d", + player->GetID()); + //KickPlayer(player->guid); + return; + } + + if (packet->data[0] == ID_LOADED) + { + player->Loaded(); static constexpr unsigned int ident = Script::CallbackIdentity("OnPlayerConnect"); Script::CallBackReturn result = true; @@ -108,22 +121,27 @@ void Networking::Update(RakNet::Packet *packet) Players::DeletePlayer(packet->guid); return; } + } + else if(packet->data[0] == ID_GAME_BASE_INFO) + { + LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Received ID_GAME_BASE_INFO about %s", + player->Npc()->mName.c_str()); - return; - + myPacket->Read(player); + myPacket->Send(player, true); } - if (!player->isHandshaked()) - { - LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Have not completed handshake with player %d", - player->GetID()); - //KickPlayer(player->guid); + if(!player->isLoaded()) return; + else if(player->BirthSign()->empty()) + { + (*player->BirthSign()) = "a"; + NewPlayer(packet->guid); } switch (packet->data[0]) { - case ID_GAME_BASE_INFO: + /*case ID_GAME_BASE_INFO: { LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Received ID_GAME_BASE_INFO about %s", player->Npc()->mName.c_str()); @@ -132,7 +150,7 @@ void Networking::Update(RakNet::Packet *packet) myPacket->Send(player, true); break; - } + }*/ case ID_GAME_UPDATE_POS: { //DEBUG_PRINTF("ID_GAME_UPDATE_POS \n"); @@ -331,10 +349,6 @@ void Networking::Update(RakNet::Packet *packet) void Networking::NewPlayer(RakNet::RakNetGUID guid) { - Players::NewPlayer(guid); - - controller->GetPacket(ID_USER_MYID)->Send(Players::GetPlayer(guid), false); - controller->GetPacket(ID_GAME_BASE_INFO)->RequestData(guid); controller->GetPacket(ID_GAME_UPDATE_BASESTATS)->RequestData(guid); controller->GetPacket(ID_GAME_ATTRIBUTE)->RequestData(guid); @@ -343,7 +357,7 @@ void Networking::NewPlayer(RakNet::RakNetGUID guid) controller->GetPacket(ID_GAME_CELL)->RequestData(guid); controller->GetPacket(ID_GAME_UPDATE_EQUIPED)->RequestData(guid); - for (TPlayers::iterator pl = players->begin(); pl != players->end(); pl++) + for (TPlayers::iterator pl = players->begin(); pl != players->end(); pl++) //sending other players to new player { if (pl->first == guid) continue; diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index a49d801e1..b96fe2070 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -644,9 +644,9 @@ void OMW::Engine::go() ToUTF8::Utf8Encoder encoder (mEncoding); mEncoder = &encoder; - + mwmp::Main::Init(mContentFiles); prepareEngine (settings); - mwmp::Main::Create(); + mwmp::Main::PostInit(); mSkipMenu = true; if (!mSaveGameFile.empty()) diff --git a/apps/openmw/mwmp/Main.cpp b/apps/openmw/mwmp/Main.cpp index ec39f4d36..68a7fbdb2 100644 --- a/apps/openmw/mwmp/Main.cpp +++ b/apps/openmw/mwmp/Main.cpp @@ -91,19 +91,35 @@ void Main::Configure(const boost::program_options::variables_map &variables) Main::addr = variables["connect"].as(); } -void Main::Create() -{ - assert(!pMain); - pMain = new Main(); +Settings::CategorySettingValueMap saveUserSettings; +Settings::CategorySettingValueMap saveDefaultSettings; +Settings::CategorySettingVector saveChangedSettings; - Settings::Manager mgr; - Settings::CategorySettingValueMap saveUserSettings = mgr.mUserSettings; - Settings::CategorySettingValueMap saveDefaultSettings = mgr.mDefaultSettings; - Settings::CategorySettingVector saveChangedSettings = mgr.mChangedSettings; +Settings::Manager InitMgr(Settings::Manager &mgr) +{ + saveUserSettings = mgr.mUserSettings; + saveDefaultSettings = mgr.mDefaultSettings; + saveChangedSettings = mgr.mChangedSettings; mgr.mUserSettings.clear(); mgr.mDefaultSettings.clear(); mgr.mChangedSettings.clear(); loadSettings(mgr); +} + +void RestoreMgr(Settings::Manager &mgr) +{ + mgr.mUserSettings = saveUserSettings; + mgr.mDefaultSettings = saveDefaultSettings; + mgr.mChangedSettings = saveChangedSettings; +} + +void Main::Init(std::vector &content) +{ + assert(!pMain); + pMain = new Main(); + + Settings::Manager mgr; + InitMgr(mgr); int logLevel = mgr.getInt("loglevel", "General"); Log::SetLevel(logLevel); @@ -120,15 +136,21 @@ void Main::Create() } - pMain->mGUIController->setupChat(mgr); + pMain->mNetworking->Connect(pMain->server, pMain->port); + RestoreMgr(mgr); +} - mgr.mUserSettings = saveUserSettings; - mgr.mDefaultSettings = saveDefaultSettings; - mgr.mChangedSettings = saveChangedSettings; +void Main::PostInit() +{ + Settings::Manager mgr; + InitMgr(mgr); + + pMain->mGUIController->setupChat(mgr); + RestoreMgr(mgr); - //pMain->mGUILogin = new GUILogin(); const MWBase::Environment &environment = MWBase::Environment::get(); environment.getStateManager()->newGame(true); + MWBase::Environment::get().getMechanicsManager()->toggleAI(); } void Main::Destroy() @@ -164,17 +186,14 @@ void Main::UpdateWorld(float dt) const if (!mLocalPlayer->CharGenThread()) return; - if (!mNetworking->isConnected()) + static bool init = true; + if (init) { - MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr(); - MWBase::Environment::get().getMechanicsManager()->toggleAI(); - - (*mLocalPlayer->Npc()) = *player.get()->mBase; - - mLocalPlayer->updateAttributesAndSkills(); + init = false; + LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "%s", "Sending ID_GAME_BASE_INFO to server"); - mNetworking->Connect(server, port); - player.getClass().getCreatureStats(player).getSpells().add("fireball"); + mNetworking->GetPacket(ID_GAME_BASE_INFO)->Send(getLocalPlayer()); + mNetworking->GetPacket(ID_LOADED)->Send(getLocalPlayer()); mLocalPlayer->updateBaseStats(true); get().getGUIController()->setChatVisible(true); } diff --git a/apps/openmw/mwmp/Main.hpp b/apps/openmw/mwmp/Main.hpp index 7292f92dd..10c919344 100644 --- a/apps/openmw/mwmp/Main.hpp +++ b/apps/openmw/mwmp/Main.hpp @@ -14,7 +14,8 @@ namespace mwmp static void OptionsDesc(boost::program_options::options_description *desc); static void Configure(const boost::program_options::variables_map &variables); - static void Create(); + static void Init(std::vector &content); + static void PostInit(); static void Destroy(); static const Main &get(); static void Frame(float dt); diff --git a/components/openmw-mp/Version.hpp b/components/openmw-mp/Version.hpp index 9f5734a92..ad23f5e2a 100644 --- a/components/openmw-mp/Version.hpp +++ b/components/openmw-mp/Version.hpp @@ -6,6 +6,6 @@ #define OPENMW_VERSION_HPP #define TES3MP_VERSION "0.0.1c" -#define TES3MP_PROTO_VERSION 1 +#define TES3MP_PROTO_VERSION 2 #endif //OPENMW_VERSION_HPP