forked from mirror/openmw-tes3mp
Merge pull request #58 from TES3MP/NewAuthProto
Use new authentication protocol
This commit is contained in:
commit
f039256762
14 changed files with 147 additions and 62 deletions
|
@ -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()
|
||||
static Settings::CategorySettingValueMap saveUserSettings;
|
||||
static Settings::CategorySettingValueMap saveDefaultSettings;
|
||||
static Settings::CategorySettingVector saveChangedSettings;
|
||||
|
||||
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;
|
||||
Settings::CategorySettingValueMap saveUserSettings = mgr.mUserSettings;
|
||||
Settings::CategorySettingValueMap saveDefaultSettings = mgr.mDefaultSettings;
|
||||
Settings::CategorySettingVector saveChangedSettings = mgr.mChangedSettings;
|
||||
mgr.mUserSettings.clear();
|
||||
mgr.mDefaultSettings.clear();
|
||||
mgr.mChangedSettings.clear();
|
||||
loadSettings(mgr);
|
||||
InitMgr(mgr);
|
||||
|
||||
int logLevel = mgr.getInt("loglevel", "General");
|
||||
Log::SetLevel(logLevel);
|
||||
|
@ -120,15 +136,21 @@ void Main::Create()
|
|||
|
||||
}
|
||||
|
||||
pMain->mNetworking->Connect(pMain->server, pMain->port);
|
||||
RestoreMgr(mgr);
|
||||
}
|
||||
|
||||
void Main::PostInit()
|
||||
{
|
||||
Settings::Manager mgr;
|
||||
InitMgr(mgr);
|
||||
|
||||
pMain->mGUIController->setupChat(mgr);
|
||||
RestoreMgr(mgr);
|
||||
|
||||
mgr.mUserSettings = saveUserSettings;
|
||||
mgr.mDefaultSettings = saveDefaultSettings;
|
||||
mgr.mChangedSettings = saveChangedSettings;
|
||||
|
||||
//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();
|
||||
init = false;
|
||||
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "%s", "Sending ID_GAME_BASE_INFO to server");
|
||||
|
||||
(*mLocalPlayer->Npc()) = *player.get<ESM::NPC>()->mBase;
|
||||
|
||||
mLocalPlayer->updateAttributesAndSkills();
|
||||
|
||||
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
|
||||
};
|
||||
|
|
22
components/openmw-mp/Packets/PacketLoaded.hpp
Normal file
22
components/openmw-mp/Packets/PacketLoaded.hpp
Normal file
|
@ -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…
Reference in a new issue