1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-21 10:39:39 +00:00

Add ProcessPlayerPacket method to server's Networking

This commit is contained in:
David Cernat 2016-10-19 21:26:42 +03:00
parent f0fa5e8771
commit 2602c1f71a
2 changed files with 230 additions and 213 deletions

View file

@ -48,29 +48,10 @@ Networking::~Networking()
LOG_QUIT(); LOG_QUIT();
} }
void Networking::Update(RakNet::Packet *packet) void Networking::ProcessPlayerPacket(RakNet::Packet *packet)
{ {
Player *player = Players::GetPlayer(packet->guid); Player *player = Players::GetPlayer(packet->guid);
RakNet::BitStream bsIn(&packet->data[1], packet->length, false);
{
RakNet::RakNetGUID ignoredGUID;
bsIn.Read(ignoredGUID);
(void)ignoredGUID;
}
playerController->SetStream(&bsIn, 0);
if (player == 0)
{
playerController->GetPacket(ID_HANDSHAKE)->RequestData(packet->guid);
Players::NewPlayer(packet->guid);
player = Players::GetPlayer(packet->guid);
playerController->GetPacket(ID_USER_MYID)->Send(Players::GetPlayer(packet->guid), false);
return;
}
PlayerPacket *myPacket = playerController->GetPacket(packet->data[0]); PlayerPacket *myPacket = playerController->GetPacket(packet->data[0]);
if (packet->data[0] == ID_HANDSHAKE) if (packet->data[0] == ID_HANDSHAKE)
@ -127,7 +108,7 @@ void Networking::Update(RakNet::Packet *packet)
else if (packet->data[0] == ID_GAME_BASE_INFO) else if (packet->data[0] == ID_GAME_BASE_INFO)
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Received ID_GAME_BASE_INFO about %s", LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Received ID_GAME_BASE_INFO about %s",
player->Npc()->mName.c_str()); player->Npc()->mName.c_str());
myPacket->Read(player); myPacket->Read(player);
myPacket->Send(player, true); myPacket->Send(player, true);
@ -146,236 +127,269 @@ void Networking::Update(RakNet::Packet *packet)
{ {
/*case ID_GAME_BASE_INFO: /*case ID_GAME_BASE_INFO:
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Received ID_GAME_BASE_INFO about %s", LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Received ID_GAME_BASE_INFO about %s",
player->Npc()->mName.c_str()); player->Npc()->mName.c_str());
myPacket->Read(player); myPacket->Read(player);
myPacket->Send(player, true); myPacket->Send(player, true);
break; break;
}*/ }*/
case ID_GAME_POS: case ID_GAME_POS:
{
//DEBUG_PRINTF("ID_GAME_POS \n");
if (!player->CreatureStats()->mDead)
{ {
//DEBUG_PRINTF("ID_GAME_POS \n"); myPacket->Read(player);
myPacket->Send(player, true); //send to other clients
if (!player->CreatureStats()->mDead)
{
myPacket->Read(player);
myPacket->Send(player, true); //send to other clients
}
break;
} }
case ID_GAME_CELL:
break;
}
case ID_GAME_CELL:
{
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Received ID_GAME_CELL from %s",
player->Npc()->mName.c_str());
if (!player->CreatureStats()->mDead)
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Received ID_GAME_CELL from %s", myPacket->Read(player);
LOG_APPEND(Log::LOG_INFO, "- Moved to %s",
player->GetCell()->getDescription().c_str());
myPacket->Send(player, true); //send to other clients
Script::Call<Script::CallbackIdentity("OnPlayerChangeCell")>(player->GetID());
}
else
{
LOG_APPEND(Log::LOG_INFO, "- Ignored because %s is dead",
player->Npc()->mName.c_str()); player->Npc()->mName.c_str());
if (!player->CreatureStats()->mDead)
{
myPacket->Read(player);
LOG_APPEND(Log::LOG_INFO, "- Moved to %s",
player->GetCell()->getDescription().c_str());
myPacket->Send(player, true); //send to other clients
Script::Call<Script::CallbackIdentity("OnPlayerChangeCell")>(player->GetID());
}
else
{
LOG_APPEND(Log::LOG_INFO, "- Ignored because %s is dead",
player->Npc()->mName.c_str());
}
break;
} }
case ID_GAME_ATTRIBUTE:
break;
}
case ID_GAME_ATTRIBUTE:
{
if (!player->CreatureStats()->mDead)
{ {
if (!player->CreatureStats()->mDead)
{
myPacket->Read(player);
myPacket->Send(player, true);
Script::Call<Script::CallbackIdentity("OnPlayerChangeAttributes")>(player->GetID());
}
break;
}
case ID_GAME_SKILL:
{
if (!player->CreatureStats()->mDead)
{
myPacket->Read(player);
myPacket->Send(player, true);
Script::Call<Script::CallbackIdentity("OnPlayerChangeSkills")>(player->GetID());
}
break;
}
case ID_GAME_LEVEL:
{
if (!player->CreatureStats()->mDead)
{
myPacket->Read(player);
myPacket->Send(player, true);
Script::Call<Script::CallbackIdentity("OnPlayerChangeLevel")>(player->GetID());
}
break;
}
case ID_GAME_EQUIPMENT:
{
DEBUG_PRINTF("ID_GAME_EQUIPMENT\n");
myPacket->Read(player); myPacket->Read(player);
myPacket->Send(player, true); myPacket->Send(player, true);
Script::Call<Script::CallbackIdentity("OnPlayerChangeEquipment")>(player->GetID()); Script::Call<Script::CallbackIdentity("OnPlayerChangeAttributes")>(player->GetID());
break;
} }
case ID_GAME_ATTACK: break;
}
case ID_GAME_SKILL:
{
if (!player->CreatureStats()->mDead)
{ {
DEBUG_PRINTF("ID_GAME_ATTACK\n"); myPacket->Read(player);
myPacket->Send(player, true);
if (!player->CreatureStats()->mDead) Script::Call<Script::CallbackIdentity("OnPlayerChangeSkills")>(player->GetID());
}
break;
}
case ID_GAME_LEVEL:
{
if (!player->CreatureStats()->mDead)
{
myPacket->Read(player);
myPacket->Send(player, true);
Script::Call<Script::CallbackIdentity("OnPlayerChangeLevel")>(player->GetID());
}
break;
}
case ID_GAME_EQUIPMENT:
{
DEBUG_PRINTF("ID_GAME_EQUIPMENT\n");
myPacket->Read(player);
myPacket->Send(player, true);
Script::Call<Script::CallbackIdentity("OnPlayerChangeEquipment")>(player->GetID());
break;
}
case ID_GAME_ATTACK:
{
DEBUG_PRINTF("ID_GAME_ATTACK\n");
if (!player->CreatureStats()->mDead)
{
myPacket->Read(player);
Player *target = Players::GetPlayer(player->GetAttack()->target);
if (target == nullptr)
target = player;
LOG_MESSAGE_SIMPLE(Log::LOG_VERBOSE, "Player: %s attaked %s state: %d", player->Npc()->mName.c_str(),
target->Npc()->mName.c_str(), player->GetAttack()->pressed == 1);
if (player->GetAttack()->pressed == 0)
{ {
myPacket->Read(player); LOG_APPEND(Log::LOG_VERBOSE, "success: %d", player->GetAttack()->success == 1);
if (player->GetAttack()->success == 1)
Player *target = Players::GetPlayer(player->GetAttack()->target);
if (target == nullptr)
target = player;
LOG_MESSAGE_SIMPLE(Log::LOG_VERBOSE, "Player: %s attaked %s state: %d", player->Npc()->mName.c_str(),
target->Npc()->mName.c_str(), player->GetAttack()->pressed == 1);
if (player->GetAttack()->pressed == 0)
{ {
LOG_APPEND(Log::LOG_VERBOSE, "success: %d", player->GetAttack()->success == 1); LOG_APPEND(Log::LOG_VERBOSE, "damage: %d", player->GetAttack()->damage == 1);
if (player->GetAttack()->success == 1) player->setLastAttackerID(target->GetID());
{
LOG_APPEND(Log::LOG_VERBOSE, "damage: %d", player->GetAttack()->damage == 1);
player->setLastAttackerID(target->GetID());
}
} }
myPacket->Send(player, true);
playerController->GetPacket(ID_GAME_DYNAMICSTATS)->RequestData(player->GetAttack()->target);
} }
break;
}
case ID_GAME_DYNAMICSTATS:
{
DEBUG_PRINTF("ID_GAME_DYNAMICSTATS\n");
myPacket->Read(player);
myPacket->Send(player, true); myPacket->Send(player, true);
break; playerController->GetPacket(ID_GAME_DYNAMICSTATS)->RequestData(player->GetAttack()->target);
} }
break;
}
case ID_GAME_DIE: case ID_GAME_DYNAMICSTATS:
{
DEBUG_PRINTF("ID_GAME_DYNAMICSTATS\n");
myPacket->Read(player);
myPacket->Send(player, true);
break;
}
case ID_GAME_DIE:
{
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Received ID_GAME_DIE from %s",
player->Npc()->mName.c_str());
Player *killer = Players::GetPlayer(player->getLastAttackerID());
short reason = 0; // unknown;
if (!killer)
killer = player;
else if (killer->GetID() == player->GetID())
reason = 2; //suicide
else
reason = 1; //killed
player->resetLastAttacker();
player->CreatureStats()->mDead = true;
myPacket->Send(player, true);
Script::Call<Script::CallbackIdentity("OnPlayerDeath")>(player->GetID(), reason, killer->GetID());
break;
}
case ID_GAME_RESURRECT:
{
DEBUG_PRINTF("ID_GAME_RESURRECT\n");
//packetResurrect.Read(player);
player->CreatureStats()->mDead = false;
myPacket->Send(player, true);
playerController->GetPacket(ID_GAME_POS)->RequestData(player->guid);
playerController->GetPacket(ID_GAME_CELL)->RequestData(player->guid);
Script::Call<Script::CallbackIdentity("OnPlayerResurrect")>(player->GetID());
break;
}
case ID_GAME_DRAWSTATE:
{
DEBUG_PRINTF("ID_GAME_DRAWSTATE\n");
myPacket->Read(player);
myPacket->Send(player, true);
break;
}
case ID_CHAT_MESSAGE:
{
DEBUG_PRINTF("ID_CHAT_MESSAGE\n");
myPacket->Read(player);
Script::CallBackReturn<Script::CallbackIdentity("OnPlayerSendMessage")> result = true;
Script::Call<Script::CallbackIdentity("OnPlayerSendMessage")>(result, player->GetID(), player->ChatMessage()->c_str());
if (result)
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Received ID_GAME_DIE from %s", *player->ChatMessage() = player->Npc()->mName + " (" + std::to_string(player->GetID()) + "): "
player->Npc()->mName.c_str()); + *player->ChatMessage() + "\n";
myPacket->Send(player, false);
Player *killer = Players::GetPlayer(player->getLastAttackerID());
short reason = 0; // unknown;
if (!killer)
killer = player;
else if (killer->GetID() == player->GetID())
reason = 2; //suicide
else
reason = 1; //killed
player->resetLastAttacker();
player->CreatureStats()->mDead = true;
myPacket->Send(player, true); myPacket->Send(player, true);
Script::Call<Script::CallbackIdentity("OnPlayerDeath")>(player->GetID(), reason, killer->GetID());
break;
} }
break;
}
case ID_GAME_CHARGEN:
{
DEBUG_PRINTF("ID_GAME_CHARGEN\n");
myPacket->Read(player);
case ID_GAME_RESURRECT: if (player->CharGenStage()->current == player->CharGenStage()->end && player->CharGenStage()->current != 0)
{ {
DEBUG_PRINTF("ID_GAME_RESURRECT\n"); Script::Call<Script::CallbackIdentity("OnPlayerEndCharGen")>(player->GetID());
//packetResurrect.Read(player); cout << "RACE: " << player->Npc()->mRace << endl;
player->CreatureStats()->mDead = false;
myPacket->Send(player, true);
playerController->GetPacket(ID_GAME_POS)->RequestData(player->guid);
playerController->GetPacket(ID_GAME_CELL)->RequestData(player->guid);
Script::Call<Script::CallbackIdentity("OnPlayerResurrect")>(player->GetID());
break;
} }
break;
}
case ID_GAME_DRAWSTATE: case ID_GUI_MESSAGEBOX:
{ {
DEBUG_PRINTF("ID_GAME_DRAWSTATE\n"); DEBUG_PRINTF("ID_GUI_MESSAGEBOX\n");
myPacket->Read(player); myPacket->Read(player);
myPacket->Send(player, true);
break;
}
case ID_CHAT_MESSAGE: Script::Call<Script::CallbackIdentity("OnGUIAction")>(player->GetID(), (int)player->guiMessageBox.id,
{ player->guiMessageBox.data.c_str());
DEBUG_PRINTF("ID_CHAT_MESSAGE\n"); break;
myPacket->Read(player); }
Script::CallBackReturn<Script::CallbackIdentity("OnPlayerSendMessage")> result = true;
Script::Call<Script::CallbackIdentity("OnPlayerSendMessage")>(result, player->GetID(), player->ChatMessage()->c_str());
if (result) case ID_GAME_CHARCLASS:
{ {
*player->ChatMessage() = player->Npc()->mName + " (" + std::to_string(player->GetID()) + "): " DEBUG_PRINTF("ID_GAME_CHARCLASS\n");
+ *player->ChatMessage() + "\n"; myPacket->Read(player);
myPacket->Send(player, false); break;
myPacket->Send(player, true); }
}
break;
}
case ID_GAME_CHARGEN:
{
DEBUG_PRINTF("ID_GAME_CHARGEN\n");
myPacket->Read(player);
if (player->CharGenStage()->current == player->CharGenStage()->end && player->CharGenStage()->current != 0) default:
{ printf("Message with identifier %i has arrived.\n", packet->data[0]);
Script::Call<Script::CallbackIdentity("OnPlayerEndCharGen")>(player->GetID()); break;
cout << "RACE: " << player->Npc()->mRace << endl; }
} }
break;
}
case ID_GUI_MESSAGEBOX: void Networking::Update(RakNet::Packet *packet)
{ {
DEBUG_PRINTF("ID_GUI_MESSAGEBOX\n"); Player *player = Players::GetPlayer(packet->guid);
myPacket->Read(player);
Script::Call<Script::CallbackIdentity("OnGUIAction")>(player->GetID(), (int)player->guiMessageBox.id, RakNet::BitStream bsIn(&packet->data[1], packet->length, false);
player->guiMessageBox.data.c_str());
break;
}
case ID_GAME_CHARCLASS: {
{ RakNet::RakNetGUID ignoredGUID;
DEBUG_PRINTF("ID_GAME_CHARCLASS\n"); bsIn.Read(ignoredGUID);
myPacket->Read(player); (void)ignoredGUID;
break; }
}
default: if (player == 0)
printf("Message with identifier %i has arrived.\n", packet->data[0]); {
break; playerController->SetStream(&bsIn, 0);
playerController->GetPacket(ID_HANDSHAKE)->RequestData(packet->guid);
Players::NewPlayer(packet->guid);
player = Players::GetPlayer(packet->guid);
playerController->GetPacket(ID_USER_MYID)->Send(Players::GetPlayer(packet->guid), false);
return;
}
else if (playerController->ContainsPacket(packet->data[0]))
{
playerController->SetStream(&bsIn, 0);
ProcessPlayerPacket(packet);
}
else if (worldController->ContainsPacket(packet->data[0]))
{
worldController->SetStream(&bsIn, 0);
} }
} }

View file

@ -20,7 +20,10 @@ namespace mwmp
void NewPlayer(RakNet::RakNetGUID guid); void NewPlayer(RakNet::RakNetGUID guid);
void DisconnectPlayer(RakNet::RakNetGUID guid); void DisconnectPlayer(RakNet::RakNetGUID guid);
void KickPlayer(RakNet::RakNetGUID guid); void KickPlayer(RakNet::RakNetGUID guid);
void ProcessPlayerPacket(RakNet::Packet *packet);
void Update(RakNet::Packet *packet); void Update(RakNet::Packet *packet);
unsigned short NumberOfConnections() const; unsigned short NumberOfConnections() const;
unsigned int MaxConnections() const; unsigned int MaxConnections() const;