Merge pull request #58 from TES3MP/NewAuthProto

Use new authentication protocol
pull/76/head
David Cernat 8 years ago committed by GitHub
commit f039256762

@ -49,16 +49,6 @@ void Networking::Update(RakNet::Packet *packet)
Player *player = Players::GetPlayer(packet->guid);
if (player == 0)
{
controller->GetPacket(ID_HANDSHAKE)->RequestData(packet->guid);
NewPlayer(packet->guid);
player = Players::GetPlayer(packet->guid);
return;
}
RakNet::BitStream bsIn(&packet->data[1], packet->length, false);
{
@ -69,6 +59,15 @@ void Networking::Update(RakNet::Packet *packet)
controller->SetStream(&bsIn, 0);
if (player == 0)
{
controller->GetPacket(ID_HANDSHAKE)->RequestData(packet->guid);
Players::NewPlayer(packet->guid);
player = Players::GetPlayer(packet->guid);
controller->GetPacket(ID_USER_MYID)->Send(Players::GetPlayer(packet->guid), false);
return;
}
BasePacket *myPacket = controller->GetPacket(packet->data[0]);
if (packet->data[0] == ID_HANDSHAKE)
@ -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(Player::LOADED);
static constexpr unsigned int ident = Script::CallbackIdentity("OnPlayerConnect");
Script::CallBackReturn<ident> result = true;
@ -108,22 +121,28 @@ 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())
if (player->LoadedState() == Player::NOTLOADED)
return;
else if (player->LoadedState() == Player::LOADED)
{
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Have not completed handshake with player %d",
player->GetID());
//KickPlayer(player->guid);
player->Loaded(Player::POSTLOADED);
NewPlayer(packet->guid);
return;
}
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 +151,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 +350,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 +358,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;

@ -64,6 +64,7 @@ std::map<RakNet::RakNetGUID, Player*> *Players::GetPlayers()
Player::Player(RakNet::RakNetGUID id) : BasePlayer(id)
{
handshake = false;
loaded = false;
}
Player::~Player()
@ -91,6 +92,15 @@ bool Player::isHandshaked()
return handshake;
}
void Player::Loaded(int state)
{
loaded = state;
}
int Player::LoadedState()
{
return loaded;
}
Player *Players::GetPlayer(unsigned short id)
{

@ -40,18 +40,27 @@ class Player : public mwmp::BasePlayer
unsigned short id;
public:
enum
{
NOTLOADED=0,
LOADED,
POSTLOADED
};
Player(RakNet::RakNetGUID id);
unsigned short GetID();
void SetID(unsigned short id);
bool isHandshaked();
void Handshake();
void Loaded(int state);
int LoadedState();
virtual ~Player();
private:
bool handshake;
int loaded;
};
#endif //OPENMW_PLAYER_HPP

@ -20,10 +20,10 @@ void StatsFunctions::SetName(unsigned short pid, const char *name) noexcept
Player *player;
GET_PLAYER(pid, player,);
if (player->GetCell()->mName == name)
if (player->Npc()->mName == name)
return;
player->GetCell()->mName = name;
player->Npc()->mName = name;
}
const char *StatsFunctions::GetName(unsigned short pid) noexcept
@ -40,7 +40,7 @@ void StatsFunctions::SetBirthsign(unsigned short pid, const char *sign) noexcept
Player *player;
GET_PLAYER(pid, player,);
if (player->GetCell()->mName == sign)
if (*player->BirthSign() == sign)
return;
*player->BirthSign() = sign;

@ -96,6 +96,9 @@ public:
if (!callback)
continue;
LOG_MESSAGE_SIMPLE(Log::LOG_VERBOSE, "Called function \"%s\"", data.name);
if (script->script_type == SCRIPT_CPP)
result = reinterpret_cast<FunctionEllipsis<CallBackReturn<I>>>(callback)(std::forward<Args>(args)...);
#if defined (ENABLE_PAWN)
@ -135,6 +138,8 @@ public:
if (!callback)
continue;
LOG_MESSAGE_SIMPLE(Log::LOG_VERBOSE, "Called function \"%s\"", data.name);
if (script->script_type == SCRIPT_CPP)
reinterpret_cast<FunctionEllipsis<CallBackReturn<I>>>(callback)(std::forward<Args>(args)...);
#if defined (ENABLE_PAWN)

@ -105,8 +105,8 @@ int main(int argc, char *argv[])
loadSettings(mgr);
int logLevel = mgr.getInt("loglevel", "General");
if (logLevel < Log::LOG_INFO || logLevel > Log::LOG_FATAL)
logLevel = Log::LOG_INFO;
if (logLevel < Log::LOG_VERBOSE || logLevel > Log::LOG_FATAL)
logLevel = Log::LOG_VERBOSE;
// Some objects used to redirect cout and cerr
// Scope must be here, so this still works inside the catch block for logging exceptions
@ -154,7 +154,10 @@ int main(int argc, char *argv[])
RakNet::RakPeerInterface *peer = RakNet::RakPeerInterface::GetInstance();
peer->SetIncomingPassword(TES3MP_VERSION, (int)strlen(TES3MP_VERSION));
stringstream sstr(TES3MP_VERSION);
sstr << TES3MP_PROTO_VERSION;
peer->SetIncomingPassword(sstr.str().c_str(), (int)sstr.str().size());
if (RakNet::NonNumericHostString(addr.c_str()))
{

@ -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())

@ -91,19 +91,35 @@ void Main::Configure(const boost::program_options::variables_map &variables)
Main::addr = variables["connect"].as<string>();
}
void Main::Create()
{
assert(!pMain);
pMain = new Main();
static Settings::CategorySettingValueMap saveUserSettings;
static Settings::CategorySettingValueMap saveDefaultSettings;
static Settings::CategorySettingVector saveChangedSettings;
Settings::Manager mgr;
Settings::CategorySettingValueMap saveUserSettings = mgr.mUserSettings;
Settings::CategorySettingValueMap saveDefaultSettings = mgr.mDefaultSettings;
Settings::CategorySettingVector saveChangedSettings = mgr.mChangedSettings;
void 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<std::string> &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<ESM::NPC>()->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);
}

@ -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<std::string> &content);
static void PostInit();
static void Destroy();
static const Main &get();
static void Frame(float dt);

@ -103,7 +103,10 @@ void Networking::Connect(const std::string &ip, unsigned short port)
master.SetPortHostOrder(port);
std::string errmsg = "";
if (peer->Connect(master.ToString(false), master.GetPort(), TES3MP_VERSION, (int) strlen(TES3MP_VERSION), 0, 0, 3, 500, 0) != RakNet::CONNECTION_ATTEMPT_STARTED)
stringstream sstr(TES3MP_VERSION);
sstr << TES3MP_PROTO_VERSION;
if (peer->Connect(master.ToString(false), master.GetPort(), sstr.str().c_str(), (int) sstr.str().size(), 0, 0, 3, 500, 0) != RakNet::CONNECTION_ATTEMPT_STARTED)
errmsg = "Connection attempt failed.\n";
bool queue = true;
@ -139,10 +142,6 @@ void Networking::Connect(const std::string &ip, unsigned short port)
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Received ID_CONNECTION_REQUESTED_ACCEPTED from %s",
serverAddr.ToString());
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "%s", "Sending ID_GAME_BASE_INFO to server");
GetPacket(ID_GAME_BASE_INFO)->Send(getLocalPlayer());
break;
}
case ID_DISCONNECTION_NOTIFICATION:

@ -31,6 +31,7 @@ enum GameMessages
ID_GAME_CHARCLASS,
ID_GAME_SKILLPRIORITY,
ID_HANDSHAKE,
ID_LOADED,
ID_GUI_MESSAGEBOX,
ID_GAME_TIME
};

@ -0,0 +1,22 @@
//
// Created by koncord on 17.09.16.
//
#ifndef OPENMW_PACKETLOADED_HPP
#define OPENMW_PACKETLOADED_HPP
#include <components/openmw-mp/Packets/BasePacket.hpp>
namespace mwmp
{
class PacketLoaded : public BasePacket
{
public:
PacketLoaded(RakNet::RakPeerInterface *peer) : BasePacket(peer)
{
packetID = ID_LOADED;
}
};
}
#endif //OPENMW_PACKETLOADED_HPP

@ -25,6 +25,7 @@
#include "Packets/PacketHandshake.hpp"
#include "Packets/PacketGUIBoxes.hpp"
#include "Packets/PacketTime.hpp"
#include "Packets/PacketLoaded.hpp"
#include "PacketsController.hpp"
@ -61,7 +62,7 @@ mwmp::PacketsController::PacketsController(RakNet::RakPeerInterface *peer)
AddPacket<PacketGUIBoxes>(&packets, peer);
AddPacket<PacketClass>(&packets, peer);
AddPacket<PacketTime>(&packets, peer);
AddPacket<PacketLoaded>(&packets, peer);
}

@ -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

Loading…
Cancel
Save