mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-01-10 13:52:38 +00:00
Public release of the DLU server code!
Have fun!
This commit is contained in:
270
dNet/AuthPackets.cpp
Normal file
270
dNet/AuthPackets.cpp
Normal file
@@ -0,0 +1,270 @@
|
||||
#include "AuthPackets.h"
|
||||
#include "PacketUtils.h"
|
||||
#include "dMessageIdentifiers.h"
|
||||
|
||||
#include "dNetCommon.h"
|
||||
#include "dServer.h"
|
||||
#include "dLogger.h"
|
||||
#include "Database.h"
|
||||
#include "ZoneInstanceManager.h"
|
||||
#include "MD5.h"
|
||||
#include "SHA512.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <bcrypt/BCrypt.hpp>
|
||||
#else
|
||||
#include <bcrypt.h>
|
||||
#endif
|
||||
|
||||
#include <BitStream.h>
|
||||
#include <future>
|
||||
|
||||
#include "Game.h"
|
||||
#include "dConfig.h"
|
||||
|
||||
void AuthPackets::HandleHandshake(dServer* server, Packet* packet) {
|
||||
RakNet::BitStream inStream(packet->data, packet->length, false);
|
||||
uint64_t header = inStream.Read(header);
|
||||
uint32_t clientVersion = 0;
|
||||
inStream.Read(clientVersion);
|
||||
|
||||
server->GetLogger()->Log("AuthPackets", "Received client version: %i\n", clientVersion);
|
||||
SendHandshake(server, packet->systemAddress, server->GetIP(), server->GetPort());
|
||||
}
|
||||
|
||||
void AuthPackets::SendHandshake(dServer* server, const SystemAddress& sysAddr, const std::string& nextServerIP, uint16_t nextServerPort) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, SERVER, MSG_SERVER_VERSION_CONFIRM);
|
||||
bitStream.Write<unsigned int>(NET_VERSION);
|
||||
bitStream.Write(uint32_t(0x93));
|
||||
|
||||
if (nextServerPort == 1001) bitStream.Write(uint32_t(1)); //Conn: auth
|
||||
else bitStream.Write(uint32_t(4)); //Conn: world
|
||||
|
||||
bitStream.Write(uint32_t(0)); //Server process ID
|
||||
bitStream.Write(nextServerPort);
|
||||
|
||||
server->Send(&bitStream, sysAddr, false);
|
||||
}
|
||||
|
||||
void AuthPackets::HandleLoginRequest(dServer* server, Packet* packet) {
|
||||
std::string username = PacketUtils::ReadString(8, packet, true);
|
||||
std::string password = PacketUtils::ReadString(0x4A, packet, true);
|
||||
const char* szUsername = username.c_str();
|
||||
|
||||
// Fetch account details
|
||||
sql::PreparedStatement* stmt = Database::CreatePreppedStmt("SELECT password, banned, locked, play_key_id, gm_level FROM accounts WHERE name=? LIMIT 1;");
|
||||
stmt->setString(1, szUsername);
|
||||
|
||||
sql::ResultSet* res = stmt->executeQuery();
|
||||
|
||||
if (res->rowsCount() == 0) {
|
||||
server->GetLogger()->Log("AuthPackets", "No user found!\n");
|
||||
AuthPackets::SendLoginResponse(server, packet->systemAddress, LOGIN_RESPONSE_WRONG_PASS_OR_USER, "", "", 2001, username);
|
||||
return;
|
||||
}
|
||||
|
||||
std::string sqlPass = "";
|
||||
bool sqlBanned = false;
|
||||
bool sqlLocked = false;
|
||||
uint32_t sqlPlayKey = 0;
|
||||
uint32_t sqlGmLevel = 0;
|
||||
|
||||
while (res->next()) {
|
||||
sqlPass = res->getString(1).c_str();
|
||||
sqlBanned = res->getBoolean(2);
|
||||
sqlLocked = res->getBoolean(3);
|
||||
sqlPlayKey = res->getInt(4);
|
||||
sqlGmLevel = res->getInt(5);
|
||||
}
|
||||
|
||||
delete stmt;
|
||||
delete res;
|
||||
|
||||
//If we aren't running in live mode, then only GMs are allowed to enter:
|
||||
const auto& closedToNonDevs = Game::config->GetValue("closed_to_non_devs");
|
||||
if (closedToNonDevs.size() > 0 && bool(std::stoi(closedToNonDevs)) && sqlGmLevel == 0) {
|
||||
AuthPackets::SendLoginResponse(server, packet->systemAddress, eLoginResponse::LOGIN_RESPONSE_PERMISSIONS_NOT_HIGH_ENOUGH, "The server is currently only open to developers.", "", 2001, username);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Game::config->GetValue("dont_use_keys") != "1") {
|
||||
//Check to see if we have a play key:
|
||||
if (sqlPlayKey == 0 && sqlGmLevel == 0) {
|
||||
AuthPackets::SendLoginResponse(server, packet->systemAddress, LOGIN_RESPONSE_PERMISSIONS_NOT_HIGH_ENOUGH, "Your account doesn't have a play key associated with it!", "", 2001, username);
|
||||
server->GetLogger()->Log("AuthPackets", "User %s tried to log in, but they don't have a play key.\n", username.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
//Check if the play key is _valid_:
|
||||
auto keyCheckStmt = Database::CreatePreppedStmt("SELECT active FROM `play_keys` WHERE id=?");
|
||||
keyCheckStmt->setInt(1, sqlPlayKey);
|
||||
auto keyRes = keyCheckStmt->executeQuery();
|
||||
bool isKeyActive = false;
|
||||
|
||||
if (keyRes->rowsCount() == 0 && sqlGmLevel == 0) {
|
||||
AuthPackets::SendLoginResponse(server, packet->systemAddress, LOGIN_RESPONSE_PERMISSIONS_NOT_HIGH_ENOUGH, "Your account doesn't have a play key associated with it!", "", 2001, username);
|
||||
return;
|
||||
}
|
||||
|
||||
while (keyRes->next()) {
|
||||
isKeyActive = (bool)keyRes->getInt(1);
|
||||
}
|
||||
|
||||
if (!isKeyActive && sqlGmLevel == 0) {
|
||||
AuthPackets::SendLoginResponse(server, packet->systemAddress, LOGIN_RESPONSE_PERMISSIONS_NOT_HIGH_ENOUGH, "Your play key has been disabled.", "", 2001, username);
|
||||
server->GetLogger()->Log("AuthPackets", "User %s tried to log in, but their play key was disabled\n", username.c_str());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (sqlBanned) {
|
||||
AuthPackets::SendLoginResponse(server, packet->systemAddress, LOGIN_RESPONSE_BANNED, "", "", 2001, username); return;
|
||||
}
|
||||
|
||||
if (sqlLocked) {
|
||||
AuthPackets::SendLoginResponse(server, packet->systemAddress, LOGIN_RESPONSE_ACCOUNT_LOCKED, "", "", 2001, username); return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Updated hashing method:
|
||||
* First attempt bcrypt.
|
||||
* If that fails, fallback to old method and setup bcrypt for new login.
|
||||
*/
|
||||
|
||||
bool loginSuccess = true;
|
||||
|
||||
int32_t bcryptState = ::bcrypt_checkpw(password.c_str(), sqlPass.c_str());
|
||||
|
||||
if (bcryptState != 0)
|
||||
{
|
||||
// Fallback on old method
|
||||
|
||||
std::string oldPassword = sha512(password + username);
|
||||
|
||||
if (sqlPass != oldPassword)
|
||||
{
|
||||
loginSuccess = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Generate new hash for bcrypt
|
||||
|
||||
char salt[BCRYPT_HASHSIZE];
|
||||
char hash[BCRYPT_HASHSIZE];
|
||||
|
||||
bcryptState = ::bcrypt_gensalt(12, salt);
|
||||
|
||||
assert(bcryptState == 0);
|
||||
|
||||
bcryptState = ::bcrypt_hashpw(password.c_str(), salt, hash);
|
||||
|
||||
assert(bcryptState == 0);
|
||||
|
||||
sql::PreparedStatement* accountUpdate = Database::CreatePreppedStmt("UPDATE accounts SET password = ? WHERE name = ? LIMIT 1;");
|
||||
|
||||
accountUpdate->setString(1, std::string(hash, BCRYPT_HASHSIZE).c_str());
|
||||
accountUpdate->setString(2, szUsername);
|
||||
|
||||
accountUpdate->executeUpdate();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Login success with bcrypt
|
||||
}
|
||||
|
||||
if (!loginSuccess) {
|
||||
AuthPackets::SendLoginResponse(server, packet->systemAddress, LOGIN_RESPONSE_WRONG_PASS_OR_USER, "", "", 2001, username);
|
||||
server->GetLogger()->Log("AuthPackets", "Wrong password used\n");
|
||||
}
|
||||
else {
|
||||
SystemAddress system = packet->systemAddress; //Copy the sysAddr before the Packet gets destroyed from main
|
||||
|
||||
if (!server->GetIsConnectedToMaster()) {
|
||||
AuthPackets::SendLoginResponse(server, system, LOGIN_RESPONSE_GENERAL_FAILED, "", "", 0, username);
|
||||
return;
|
||||
}
|
||||
|
||||
ZoneInstanceManager::Instance()->RequestZoneTransfer(server, 0, 0, false, [system, server, username](bool mythranShift, uint32_t zoneID, uint32_t zoneInstance, uint32_t zoneClone, std::string zoneIP, uint16_t zonePort) {
|
||||
AuthPackets::SendLoginResponse(server, system, LOGIN_RESPONSE_SUCCESS, "", zoneIP, zonePort, username);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void AuthPackets::SendLoginResponse(dServer* server, const SystemAddress& sysAddr, eLoginResponse responseCode, const std::string& errorMsg, const std::string& wServerIP, uint16_t wServerPort, std::string username) {
|
||||
RakNet::BitStream packet;
|
||||
PacketUtils::WriteHeader(packet, CLIENT, MSG_CLIENT_LOGIN_RESPONSE);
|
||||
|
||||
packet.Write(static_cast<uint8_t>(responseCode));
|
||||
|
||||
PacketUtils::WritePacketString("Talk_Like_A_Pirate", 33, &packet);
|
||||
|
||||
// 7 unknown strings - perhaps other IP addresses?
|
||||
PacketUtils::WritePacketString("", 33, &packet);
|
||||
PacketUtils::WritePacketString("", 33, &packet);
|
||||
PacketUtils::WritePacketString("", 33, &packet);
|
||||
PacketUtils::WritePacketString("", 33, &packet);
|
||||
PacketUtils::WritePacketString("", 33, &packet);
|
||||
PacketUtils::WritePacketString("", 33, &packet);
|
||||
PacketUtils::WritePacketString("", 33, &packet);
|
||||
|
||||
packet.Write(static_cast<uint16_t>(1)); // Version Major
|
||||
packet.Write(static_cast<uint16_t>(10)); // Version Current
|
||||
packet.Write(static_cast<uint16_t>(64)); // Version Minor
|
||||
|
||||
// Writes the user key
|
||||
uint32_t sessionKey = rand(); // not mt but whatever
|
||||
std::string userHash = std::to_string(sessionKey);
|
||||
userHash = md5(userHash);
|
||||
PacketUtils::WritePacketWString(userHash, 33, &packet);
|
||||
|
||||
// Write the Character and Chat IPs
|
||||
PacketUtils::WritePacketString(wServerIP, 33, &packet);
|
||||
PacketUtils::WritePacketString("", 33, &packet);
|
||||
|
||||
// Write the Character and Chat Ports
|
||||
packet.Write(static_cast<uint16_t>(wServerPort));
|
||||
packet.Write(static_cast<uint16_t>(0));
|
||||
|
||||
// Write another IP
|
||||
PacketUtils::WritePacketString("", 33, &packet);
|
||||
|
||||
// Write a GUID or something...
|
||||
PacketUtils::WritePacketString("00000000-0000-0000-0000-000000000000", 37, &packet);
|
||||
|
||||
packet.Write(static_cast<uint32_t>(0)); // ???
|
||||
|
||||
// Write the localization
|
||||
PacketUtils::WritePacketString("US", 3, &packet);
|
||||
|
||||
packet.Write(static_cast<uint8_t>(false)); // User first logged in?
|
||||
packet.Write(static_cast<uint8_t>(false)); // User is F2P?
|
||||
packet.Write(static_cast<uint64_t>(0)); // ???
|
||||
|
||||
// Write custom error message
|
||||
packet.Write(static_cast<uint16_t>(errorMsg.length()));
|
||||
PacketUtils::WritePacketWString(errorMsg, static_cast<uint32_t>(errorMsg.length()), &packet);
|
||||
|
||||
// Here write auth logs
|
||||
packet.Write(static_cast<uint32_t>(20));
|
||||
for (uint32_t i = 0; i < 20; ++i) {
|
||||
packet.Write(static_cast<uint32_t>(8));
|
||||
packet.Write(static_cast<uint32_t>(44));
|
||||
packet.Write(static_cast<uint32_t>(14000));
|
||||
packet.Write(static_cast<uint32_t>(0));
|
||||
}
|
||||
|
||||
server->Send(&packet, sysAddr, false);
|
||||
|
||||
//Inform the master server that we've created a session for this user:
|
||||
{
|
||||
CBITSTREAM;
|
||||
PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_SET_SESSION_KEY);
|
||||
bitStream.Write(sessionKey);
|
||||
PacketUtils::WriteString(bitStream, username, 66);
|
||||
server->SendToMaster(&bitStream);
|
||||
|
||||
server->GetLogger()->Log("AuthPackets", "Set sessionKey: %i for user %s\n", sessionKey, username.c_str());
|
||||
}
|
||||
}
|
||||
18
dNet/AuthPackets.h
Normal file
18
dNet/AuthPackets.h
Normal file
@@ -0,0 +1,18 @@
|
||||
#ifndef AUTHPACKETS_H
|
||||
#define AUTHPACKETS_H
|
||||
|
||||
#define _VARIADIC_MAX 10
|
||||
#include "dCommonVars.h"
|
||||
#include "dNetCommon.h"
|
||||
|
||||
class dServer;
|
||||
|
||||
namespace AuthPackets {
|
||||
void HandleHandshake(dServer* server, Packet* packet);
|
||||
void SendHandshake(dServer* server, const SystemAddress& sysAddr, const std::string& nextServerIP, uint16_t nextServerPort);
|
||||
|
||||
void HandleLoginRequest(dServer* server, Packet* packet);
|
||||
void SendLoginResponse(dServer* server, const SystemAddress& sysAddr, eLoginResponse responseCode, const std::string& errorMsg, const std::string& wServerIP, uint16_t wServerPort, std::string username);
|
||||
}
|
||||
|
||||
#endif // AUTHPACKETS_H
|
||||
74
dNet/ChatPackets.cpp
Normal file
74
dNet/ChatPackets.cpp
Normal file
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Darkflame Universe
|
||||
* Copyright 2018
|
||||
*/
|
||||
|
||||
#include "ChatPackets.h"
|
||||
#include "RakNetTypes.h"
|
||||
#include "BitStream.h"
|
||||
#include "Game.h"
|
||||
#include "PacketUtils.h"
|
||||
#include "dMessageIdentifiers.h"
|
||||
#include "dServer.h"
|
||||
|
||||
void ChatPackets::SendChatMessage(const SystemAddress& sysAddr, char chatChannel, const std::string& senderName, LWOOBJID playerObjectID, bool senderMythran, const std::u16string& message) {
|
||||
CBITSTREAM
|
||||
PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_GENERAL_CHAT_MESSAGE);
|
||||
|
||||
bitStream.Write(static_cast<uint64_t>(0));
|
||||
bitStream.Write(chatChannel);
|
||||
|
||||
bitStream.Write(static_cast<uint32_t>(message.size()));
|
||||
PacketUtils::WriteWString(bitStream, senderName, 33);
|
||||
|
||||
bitStream.Write(playerObjectID);
|
||||
bitStream.Write(static_cast<uint16_t>(0));
|
||||
bitStream.Write(static_cast<char>(0));
|
||||
|
||||
for (uint32_t i = 0; i < message.size(); ++i) {
|
||||
bitStream.Write(static_cast<uint16_t>(message[i]));
|
||||
}
|
||||
bitStream.Write(static_cast<uint16_t>(0));
|
||||
|
||||
SEND_PACKET_BROADCAST
|
||||
}
|
||||
|
||||
void ChatPackets::SendSystemMessage(const SystemAddress& sysAddr, const std::u16string& message, const bool broadcast) {
|
||||
CBITSTREAM
|
||||
PacketUtils::WriteHeader(bitStream, CHAT, MSG_CHAT_GENERAL_CHAT_MESSAGE);
|
||||
|
||||
bitStream.Write(static_cast<uint64_t>(0));
|
||||
bitStream.Write(static_cast<char>(4));
|
||||
|
||||
bitStream.Write(static_cast<uint32_t>(message.size()));
|
||||
PacketUtils::WriteWString(bitStream, "", 33);
|
||||
|
||||
bitStream.Write(static_cast<uint64_t>(0));
|
||||
bitStream.Write(static_cast<uint16_t>(0));
|
||||
bitStream.Write(static_cast<char>(0));
|
||||
|
||||
for (uint32_t i = 0; i < message.size(); ++i) {
|
||||
bitStream.Write(static_cast<uint16_t>(message[i]));
|
||||
}
|
||||
|
||||
bitStream.Write(static_cast<uint16_t>(0));
|
||||
|
||||
//This is so Wincent's announcement works:
|
||||
if (sysAddr != UNASSIGNED_SYSTEM_ADDRESS) {
|
||||
SEND_PACKET;
|
||||
return;
|
||||
}
|
||||
|
||||
SEND_PACKET_BROADCAST;
|
||||
}
|
||||
|
||||
void ChatPackets::SendMessageFail(const SystemAddress& sysAddr) {
|
||||
//0x00 - "Chat is currently disabled."
|
||||
//0x01 - "Upgrade to a full LEGO Universe Membership to chat with other players."
|
||||
|
||||
CBITSTREAM;
|
||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_SEND_CANNED_TEXT);
|
||||
bitStream.Write<uint8_t>(0); //response type, options above ^
|
||||
//docs say there's a wstring here-- no idea what it's for, or if it's even needed so leaving it as is for now.
|
||||
SEND_PACKET;
|
||||
}
|
||||
20
dNet/ChatPackets.h
Normal file
20
dNet/ChatPackets.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Darkflame Universe
|
||||
* Copyright 2018
|
||||
*/
|
||||
|
||||
#ifndef CHATPACKETS_H
|
||||
#define CHATPACKETS_H
|
||||
|
||||
struct SystemAddress;
|
||||
|
||||
#include <string>
|
||||
#include "dCommonVars.h"
|
||||
|
||||
namespace ChatPackets {
|
||||
void SendChatMessage(const SystemAddress& sysAddr, char chatChannel, const std::string& senderName, LWOOBJID playerObjectID, bool senderMythran, const std::u16string& message);
|
||||
void SendSystemMessage(const SystemAddress& sysAddr, const std::u16string& message, bool broadcast = false);
|
||||
void SendMessageFail(const SystemAddress& sysAddr);
|
||||
};
|
||||
|
||||
#endif // CHATPACKETS_H
|
||||
306
dNet/ClientPackets.cpp
Normal file
306
dNet/ClientPackets.cpp
Normal file
@@ -0,0 +1,306 @@
|
||||
/*
|
||||
* Darkflame Universe
|
||||
* Copyright 2018
|
||||
*/
|
||||
|
||||
#include "ClientPackets.h"
|
||||
#include "UserManager.h"
|
||||
#include "User.h"
|
||||
#include "Character.h"
|
||||
#include "EntityManager.h"
|
||||
#include "Entity.h"
|
||||
#include "ControllablePhysicsComponent.h"
|
||||
#include "Game.h"
|
||||
#include "dLogger.h"
|
||||
#include "WorldPackets.h"
|
||||
#include "NiPoint3.h"
|
||||
#include "NiQuaternion.h"
|
||||
#include "dCommonVars.h"
|
||||
#include "BitStream.h"
|
||||
#include "dChatFilter.h"
|
||||
#include "WorldPackets.h"
|
||||
#include "ChatPackets.h"
|
||||
#include "dServer.h"
|
||||
#include "GameMessages.h"
|
||||
#include "dZoneManager.h"
|
||||
#include "Player.h"
|
||||
#include "Zone.h"
|
||||
#include "PossessorComponent.h"
|
||||
#include "PossessableComponent.h"
|
||||
#include "VehiclePhysicsComponent.h"
|
||||
#include "dConfig.h"
|
||||
#include "CharacterComponent.h"
|
||||
|
||||
void ClientPackets::HandleChatMessage(const SystemAddress& sysAddr, Packet* packet) {
|
||||
User* user = UserManager::Instance()->GetUser(sysAddr);
|
||||
if (!user) {
|
||||
Game::logger->Log("ClientPackets", "Unable to get user to parse chat message\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (user->GetIsMuted()) {
|
||||
user->GetLastUsedChar()->SendMuteNotice();
|
||||
return;
|
||||
}
|
||||
|
||||
CINSTREAM;
|
||||
uint64_t header;
|
||||
inStream.Read(header);
|
||||
|
||||
char chatChannel;
|
||||
uint16_t unknown;
|
||||
uint32_t messageLength;
|
||||
std::u16string message;
|
||||
|
||||
inStream.Read(chatChannel);
|
||||
inStream.Read(unknown);
|
||||
inStream.Read(messageLength);
|
||||
|
||||
for (uint32_t i = 0; i < (messageLength - 1); ++i) {
|
||||
uint16_t character;
|
||||
inStream.Read(character);
|
||||
message.push_back(character);
|
||||
}
|
||||
|
||||
std::string playerName = user->GetLastUsedChar()->GetName();
|
||||
bool isMythran = user->GetLastUsedChar()->GetGMLevel() > 0;
|
||||
|
||||
if (!user->GetLastChatMessageApproved() && !isMythran) return;
|
||||
|
||||
std::string sMessage = GeneralUtils::UTF16ToWTF8(message);
|
||||
Game::logger->Log("Chat", "%s: %s\n", playerName.c_str(), sMessage.c_str());
|
||||
ChatPackets::SendChatMessage(sysAddr, chatChannel, playerName, user->GetLoggedInChar(), isMythran, message);
|
||||
}
|
||||
|
||||
void ClientPackets::HandleClientPositionUpdate(const SystemAddress& sysAddr, Packet* packet) {
|
||||
User* user = UserManager::Instance()->GetUser(sysAddr);
|
||||
if (!user) {
|
||||
Game::logger->Log("ClientPackets", "Unable to get user to parse position update\n");
|
||||
return;
|
||||
}
|
||||
|
||||
CINSTREAM;
|
||||
uint64_t header;
|
||||
inStream.Read(header);
|
||||
|
||||
Entity* entity = EntityManager::Instance()->GetEntity(user->GetLastUsedChar()->GetObjectID());
|
||||
if (!entity) return;
|
||||
|
||||
ControllablePhysicsComponent* comp = static_cast<ControllablePhysicsComponent*>(entity->GetComponent(COMPONENT_TYPE_CONTROLLABLE_PHYSICS));
|
||||
if (!comp) return;
|
||||
|
||||
/*
|
||||
//If we didn't move, this will match and stop our velocity
|
||||
if (packet->length == 37) {
|
||||
NiPoint3 zeroVel(0.0f, 0.0f, 0.0f);
|
||||
comp->SetVelocity(zeroVel);
|
||||
comp->SetAngularVelocity(zeroVel);
|
||||
comp->SetIsOnGround(true); //probably8
|
||||
EntityManager::Instance()->SerializeEntity(entity);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
auto* possessorComponent = entity->GetComponent<PossessorComponent>();
|
||||
|
||||
NiPoint3 position;
|
||||
inStream.Read(position.x);
|
||||
inStream.Read(position.y);
|
||||
inStream.Read(position.z);
|
||||
|
||||
NiQuaternion rotation;
|
||||
inStream.Read(rotation.x);
|
||||
inStream.Read(rotation.y);
|
||||
inStream.Read(rotation.z);
|
||||
inStream.Read(rotation.w);
|
||||
|
||||
bool onGround = false;
|
||||
bool onRail = false;
|
||||
inStream.Read(onGround);
|
||||
inStream.Read(onRail);
|
||||
|
||||
bool velocityFlag = false;
|
||||
inStream.Read(velocityFlag);
|
||||
NiPoint3 velocity{};
|
||||
if (velocityFlag) {
|
||||
inStream.Read(velocity.x);
|
||||
inStream.Read(velocity.y);
|
||||
inStream.Read(velocity.z);
|
||||
}
|
||||
|
||||
bool angVelocityFlag = false;
|
||||
inStream.Read(angVelocityFlag);
|
||||
NiPoint3 angVelocity{};
|
||||
if (angVelocityFlag) {
|
||||
inStream.Read(angVelocity.x);
|
||||
inStream.Read(angVelocity.y);
|
||||
inStream.Read(angVelocity.z);
|
||||
}
|
||||
|
||||
bool hasVehicle = false;
|
||||
|
||||
if (possessorComponent != nullptr) {
|
||||
auto* possassableEntity = EntityManager::Instance()->GetEntity(possessorComponent->GetPossessable());
|
||||
|
||||
if (possassableEntity != nullptr) {
|
||||
auto* vehiclePhysicsComponent = possassableEntity->GetComponent<VehiclePhysicsComponent>();
|
||||
|
||||
if (vehiclePhysicsComponent != nullptr) {
|
||||
// This is flipped for whatever reason
|
||||
rotation = NiQuaternion(rotation.z, rotation.y, rotation.x, rotation.w);
|
||||
|
||||
vehiclePhysicsComponent->SetPosition(position);
|
||||
vehiclePhysicsComponent->SetRotation(rotation);
|
||||
vehiclePhysicsComponent->SetIsOnGround(onGround);
|
||||
vehiclePhysicsComponent->SetIsOnRail(onRail);
|
||||
vehiclePhysicsComponent->SetVelocity(velocity);
|
||||
vehiclePhysicsComponent->SetDirtyVelocity(velocityFlag);
|
||||
vehiclePhysicsComponent->SetAngularVelocity(angVelocity);
|
||||
vehiclePhysicsComponent->SetDirtyAngularVelocity(angVelocityFlag);
|
||||
|
||||
EntityManager::Instance()->SerializeEntity(possassableEntity);
|
||||
|
||||
hasVehicle = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (hasVehicle) {
|
||||
velocity = NiPoint3::ZERO;
|
||||
angVelocity = NiPoint3::ZERO;
|
||||
}
|
||||
|
||||
// Handle statistics
|
||||
auto* characterComponent = entity->GetComponent<CharacterComponent>();
|
||||
if (characterComponent != nullptr) {
|
||||
characterComponent->TrackPositionUpdate(position);
|
||||
}
|
||||
|
||||
comp->SetPosition(position);
|
||||
comp->SetRotation(rotation);
|
||||
comp->SetIsOnGround(onGround);
|
||||
comp->SetIsOnRail(onRail);
|
||||
comp->SetVelocity(velocity);
|
||||
comp->SetDirtyVelocity(velocityFlag);
|
||||
comp->SetAngularVelocity(angVelocity);
|
||||
comp->SetDirtyAngularVelocity(angVelocityFlag);
|
||||
|
||||
auto* player = static_cast<Player*>(entity);
|
||||
player->SetGhostReferencePoint(position);
|
||||
EntityManager::Instance()->QueueGhostUpdate(player->GetObjectID());
|
||||
|
||||
if (!hasVehicle) {
|
||||
EntityManager::Instance()->SerializeEntity(entity);
|
||||
}
|
||||
|
||||
//TODO: add moving platform stuffs
|
||||
/*bool movingPlatformFlag;
|
||||
inStream.Read(movingPlatformFlag);
|
||||
if (movingPlatformFlag) {
|
||||
LWOOBJID objectID;
|
||||
NiPoint3 niData2;
|
||||
|
||||
inStream.Read(objectID);
|
||||
inStream.Read(niData2.x);
|
||||
inStream.Read(niData2.y);
|
||||
inStream.Read(niData2.z);
|
||||
|
||||
|
||||
|
||||
bool niData3Flag;
|
||||
inStream.Read(niData3Flag);
|
||||
if (niData3Flag) {
|
||||
NiPoint3 niData3;
|
||||
inStream.Read(niData3.x);
|
||||
inStream.Read(niData3.y);
|
||||
inStream.Read(niData3.z);
|
||||
|
||||
controllablePhysics->GetLocationData()->GetMovingPlatformData()->SetData3(niData3);
|
||||
}
|
||||
}*/
|
||||
|
||||
/*
|
||||
for (int i = 0; i < Game::server->GetReplicaManager()->GetParticipantCount(); ++i)
|
||||
{
|
||||
const auto& player = Game::server->GetReplicaManager()->GetParticipantAtIndex(i);
|
||||
|
||||
if (entity->GetSystemAddress() == player)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
EntityManager::Instance()->SerializeEntity(entity, player);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void ClientPackets::HandleChatModerationRequest(const SystemAddress& sysAddr, Packet* packet) {
|
||||
User* user = UserManager::Instance()->GetUser(sysAddr);
|
||||
if (!user) {
|
||||
Game::logger->Log("ClientPackets", "Unable to get user to parse chat moderation request\n");
|
||||
return;
|
||||
}
|
||||
|
||||
auto* entity = Player::GetPlayer(sysAddr);
|
||||
|
||||
if (entity == nullptr) {
|
||||
Game::logger->Log("ClientPackets", "Unable to get player to parse chat moderation request\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if the player has restricted chat access
|
||||
auto* character = entity->GetCharacter();
|
||||
|
||||
if (character->HasPermission(PermissionMap::RestrictedChatAccess))
|
||||
{
|
||||
// Send a message to the player
|
||||
ChatPackets::SendSystemMessage(
|
||||
sysAddr,
|
||||
u"This character has restricted chat access."
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
RakNet::BitStream stream(packet->data, packet->length, false);
|
||||
|
||||
uint64_t header;
|
||||
stream.Read(header);
|
||||
|
||||
// Data
|
||||
uint8_t chatLevel;
|
||||
uint8_t requestID;
|
||||
uint16_t messageLength;
|
||||
|
||||
std::string receiver = "";
|
||||
std::string message = "";
|
||||
|
||||
stream.Read(chatLevel);
|
||||
stream.Read(requestID);
|
||||
|
||||
for (uint32_t i = 0; i < 42; ++i) {
|
||||
uint16_t character;
|
||||
stream.Read(character);
|
||||
receiver.push_back(static_cast<uint8_t>(character));
|
||||
}
|
||||
|
||||
stream.Read(messageLength);
|
||||
for (uint32_t i = 0; i < messageLength; ++i) {
|
||||
uint16_t character;
|
||||
stream.Read(character);
|
||||
message.push_back(static_cast<uint8_t>(character));
|
||||
}
|
||||
|
||||
std::unordered_map<char, char> unacceptedItems;
|
||||
bool bAllClean = Game::chatFilter->IsSentenceOkay(message, user->GetLastUsedChar()->GetGMLevel());
|
||||
if (!bAllClean) {
|
||||
unacceptedItems.insert(std::make_pair((char)0, (char)message.length()));
|
||||
}
|
||||
|
||||
if (user->GetIsMuted()) {
|
||||
bAllClean = false;
|
||||
}
|
||||
|
||||
user->SetLastChatMessageApproved(bAllClean);
|
||||
WorldPackets::SendChatModerationResponse(sysAddr, bAllClean, requestID, receiver, unacceptedItems);
|
||||
}
|
||||
17
dNet/ClientPackets.h
Normal file
17
dNet/ClientPackets.h
Normal file
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Darkflame Universe
|
||||
* Copyright 2018
|
||||
*/
|
||||
|
||||
#ifndef CLIENTPACKETS_H
|
||||
#define CLIENTPACKETS_H
|
||||
|
||||
#include "RakNetTypes.h"
|
||||
|
||||
namespace ClientPackets {
|
||||
void HandleChatMessage(const SystemAddress& sysAddr, Packet* packet);
|
||||
void HandleClientPositionUpdate(const SystemAddress& sysAddr, Packet* packet);
|
||||
void HandleChatModerationRequest(const SystemAddress& sysAddr, Packet* packet);
|
||||
};
|
||||
|
||||
#endif // CLIENTPACKETS_H
|
||||
119
dNet/MasterPackets.cpp
Normal file
119
dNet/MasterPackets.cpp
Normal file
@@ -0,0 +1,119 @@
|
||||
#include "MasterPackets.h"
|
||||
#include "BitStream.h"
|
||||
#include "PacketUtils.h"
|
||||
#include "dMessageIdentifiers.h"
|
||||
#include "dCommonVars.h"
|
||||
#include "dServer.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
void MasterPackets::SendPersistentIDRequest(dServer* server, uint64_t requestID) {
|
||||
CBITSTREAM
|
||||
PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_REQUEST_PERSISTENT_ID);
|
||||
bitStream.Write(requestID);
|
||||
server->SendToMaster(&bitStream);
|
||||
}
|
||||
|
||||
void MasterPackets::SendPersistentIDResponse(dServer* server, const SystemAddress& sysAddr, uint64_t requestID, uint32_t objID) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_REQUEST_PERSISTENT_ID_RESPONSE);
|
||||
|
||||
bitStream.Write(requestID);
|
||||
bitStream.Write(objID);
|
||||
|
||||
server->Send(&bitStream, sysAddr, false);
|
||||
}
|
||||
|
||||
void MasterPackets::SendZoneTransferRequest(dServer* server, uint64_t requestID, bool mythranShift, uint32_t zoneID, uint32_t cloneID) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_REQUEST_ZONE_TRANSFER);
|
||||
|
||||
bitStream.Write(requestID);
|
||||
bitStream.Write(static_cast<uint8_t>(mythranShift));
|
||||
bitStream.Write(zoneID);
|
||||
bitStream.Write(cloneID);
|
||||
|
||||
server->SendToMaster(&bitStream);
|
||||
}
|
||||
|
||||
void MasterPackets::SendZoneCreatePrivate(dServer* server, uint32_t zoneID, uint32_t cloneID, const std::string& password) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_CREATE_PRIVATE_ZONE);
|
||||
|
||||
bitStream.Write(zoneID);
|
||||
bitStream.Write(cloneID);
|
||||
|
||||
RakNet::RakString passwd(password.c_str());
|
||||
bitStream.Write(passwd);
|
||||
|
||||
server->SendToMaster(&bitStream);
|
||||
}
|
||||
|
||||
void MasterPackets::SendZoneRequestPrivate(dServer* server, uint64_t requestID, bool mythranShift, const std::string& password) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_REQUEST_PRIVATE_ZONE);
|
||||
|
||||
bitStream.Write(requestID);
|
||||
bitStream.Write(static_cast<uint8_t>(mythranShift));
|
||||
|
||||
RakNet::RakString passwd(password.c_str());
|
||||
bitStream.Write(passwd);
|
||||
|
||||
server->SendToMaster(&bitStream);
|
||||
}
|
||||
|
||||
void MasterPackets::SendWorldReady(dServer* server, LWOMAPID zoneId, LWOINSTANCEID instanceId)
|
||||
{
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_WORLD_READY);
|
||||
|
||||
bitStream.Write(zoneId);
|
||||
bitStream.Write(instanceId);
|
||||
|
||||
server->SendToMaster(&bitStream);
|
||||
}
|
||||
|
||||
void MasterPackets::SendZoneTransferResponse(dServer* server, const SystemAddress& sysAddr, uint64_t requestID, bool mythranShift, uint32_t zoneID, uint32_t zoneInstance, uint32_t zoneClone, const std::string& serverIP, uint32_t serverPort) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_REQUEST_ZONE_TRANSFER_RESPONSE);
|
||||
|
||||
bitStream.Write(requestID);
|
||||
bitStream.Write(static_cast<uint8_t>(mythranShift));
|
||||
bitStream.Write(zoneID);
|
||||
bitStream.Write(zoneInstance);
|
||||
bitStream.Write(zoneClone);
|
||||
bitStream.Write(static_cast<uint16_t>(serverPort));
|
||||
PacketUtils::WriteString(bitStream, serverIP, static_cast<uint32_t>(serverIP.size() + 1));
|
||||
|
||||
server->Send(&bitStream, sysAddr, false);
|
||||
}
|
||||
|
||||
void MasterPackets::HandleServerInfo(Packet* packet) {
|
||||
RakNet::BitStream inStream(packet->data, packet->length, false);
|
||||
uint64_t header = inStream.Read(header);
|
||||
|
||||
uint32_t theirPort = 0;
|
||||
uint32_t theirZoneID = 0;
|
||||
uint32_t theirInstanceID = 0;
|
||||
std::string theirIP = "";
|
||||
|
||||
inStream.Read(theirPort);
|
||||
inStream.Read(theirZoneID);
|
||||
inStream.Read(theirInstanceID);
|
||||
theirIP = PacketUtils::ReadString(inStream.GetReadOffset(), packet, false); //20 is the current offset
|
||||
|
||||
//TODO: Actually mark this server as an available server in the manager
|
||||
}
|
||||
|
||||
void MasterPackets::SendServerInfo(dServer* server, Packet* packet) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, MASTER, MSG_MASTER_SERVER_INFO);
|
||||
|
||||
bitStream.Write(server->GetPort());
|
||||
bitStream.Write(server->GetZoneID());
|
||||
bitStream.Write(server->GetInstanceID());
|
||||
bitStream.Write(server->GetServerType());
|
||||
PacketUtils::WriteString(bitStream, server->GetIP(), server->GetIP().size());
|
||||
|
||||
server->SendToMaster(&bitStream);
|
||||
}
|
||||
29
dNet/MasterPackets.h
Normal file
29
dNet/MasterPackets.h
Normal file
@@ -0,0 +1,29 @@
|
||||
#ifndef MASTERPACKETS_H
|
||||
#define MASTERPACKETS_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include "RakNetTypes.h"
|
||||
#include "dCommonVars.h"
|
||||
class dServer;
|
||||
|
||||
namespace MasterPackets {
|
||||
void SendPersistentIDRequest(dServer* server, uint64_t requestID); //Called from the World server
|
||||
void SendPersistentIDResponse(dServer* server, const SystemAddress& sysAddr, uint64_t requestID, uint32_t objID);
|
||||
|
||||
void SendZoneTransferRequest(dServer* server, uint64_t requestID, bool mythranShift, uint32_t zoneID, uint32_t cloneID);
|
||||
void SendZoneTransferResponse(dServer* server, const SystemAddress& sysAddr, uint64_t requestID, bool mythranShift, uint32_t zoneID, uint32_t zoneInstance, uint32_t zoneClone, const std::string& serverIP, uint32_t serverPort);
|
||||
|
||||
void HandleServerInfo(Packet* packet);
|
||||
void SendServerInfo(dServer* server, Packet* packet);
|
||||
|
||||
void SendZoneCreatePrivate(dServer* server, uint32_t zoneID, uint32_t cloneID, const std::string& password);
|
||||
|
||||
void SendZoneRequestPrivate(dServer* server, uint64_t requestID, bool mythranShift, const std::string& password);
|
||||
|
||||
void SendWorldReady(dServer* server, LWOMAPID zoneId, LWOINSTANCEID instanceId);
|
||||
|
||||
void HandleSetSessionKey(Packet* packet);
|
||||
}
|
||||
|
||||
#endif // MASTERPACKETS_H
|
||||
155
dNet/PacketUtils.cpp
Normal file
155
dNet/PacketUtils.cpp
Normal file
@@ -0,0 +1,155 @@
|
||||
#include "PacketUtils.h"
|
||||
#include <MessageIdentifiers.h>
|
||||
#include <vector>
|
||||
#include <fstream>
|
||||
#include "dLogger.h"
|
||||
#include "Game.h"
|
||||
|
||||
void PacketUtils::WriteHeader(RakNet::BitStream& bitStream, uint16_t connectionType, uint32_t internalPacketID) {
|
||||
bitStream.Write(MessageID(ID_USER_PACKET_ENUM));
|
||||
bitStream.Write(connectionType);
|
||||
bitStream.Write(internalPacketID);
|
||||
bitStream.Write(uint8_t(0));
|
||||
}
|
||||
|
||||
uint16_t PacketUtils::ReadPacketU16(uint32_t startLoc, Packet * packet) {
|
||||
if (startLoc + 2 > packet->length) return 0;
|
||||
|
||||
std::vector<unsigned char> t;
|
||||
for (uint32_t i = startLoc; i < startLoc + 2; i++) t.push_back(packet->data[i]);
|
||||
return *(uint16_t*)t.data();
|
||||
}
|
||||
|
||||
uint32_t PacketUtils::ReadPacketU32(uint32_t startLoc, Packet * packet) {
|
||||
if (startLoc + 4 > packet->length) return 0;
|
||||
|
||||
std::vector<unsigned char> t;
|
||||
for (uint32_t i = startLoc; i < startLoc + 4; i++) {
|
||||
t.push_back(packet->data[i]);
|
||||
}
|
||||
return *(uint32_t*)t.data();
|
||||
}
|
||||
|
||||
uint64_t PacketUtils::ReadPacketU64(uint32_t startLoc, Packet * packet) {
|
||||
if (startLoc + 8 > packet->length) return 0;
|
||||
|
||||
std::vector<unsigned char> t;
|
||||
for (uint32_t i = startLoc; i < startLoc + 8; i++) t.push_back(packet->data[i]);
|
||||
return *(uint64_t*)t.data();
|
||||
}
|
||||
|
||||
int64_t PacketUtils::ReadPacketS64(uint32_t startLoc, Packet * packet) {
|
||||
if (startLoc + 8 > packet->length) return 0;
|
||||
|
||||
std::vector<unsigned char> t;
|
||||
for (size_t i = startLoc; i < startLoc + 8; i++) t.push_back(packet->data[i]);
|
||||
return *(int64_t*)t.data();
|
||||
}
|
||||
|
||||
std::string PacketUtils::ReadString(uint32_t startLoc, Packet* packet, bool wide) {
|
||||
std::string readString = "";
|
||||
|
||||
if (packet->length > startLoc) {
|
||||
uint32_t i = 0;
|
||||
while (packet->data[startLoc + i] != '\0' && packet->length > (uint32_t)(startLoc + i)) {
|
||||
readString.push_back(packet->data[startLoc + i]);
|
||||
|
||||
if (wide) {
|
||||
i += 2; // Wide-char string
|
||||
} else {
|
||||
i++; // Regular string
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return readString;
|
||||
}
|
||||
|
||||
void PacketUtils::WritePacketString(const std::string& string, uint32_t maxSize, RakNet::BitStream * bitStream) {
|
||||
uint32_t size = static_cast<uint32_t>(string.size());
|
||||
uint32_t remSize = static_cast<uint32_t>(maxSize - size);
|
||||
|
||||
if (size > maxSize) size = maxSize;
|
||||
|
||||
for (uint32_t i = 0; i < size; ++i) {
|
||||
bitStream->Write(static_cast<char>(string[i]));
|
||||
}
|
||||
|
||||
for (uint32_t j = 0; j < remSize; ++j) {
|
||||
bitStream->Write(static_cast<char>(0));
|
||||
}
|
||||
}
|
||||
|
||||
void PacketUtils::WriteString(RakNet::BitStream& bitStream, const std::string& s, uint32_t maxSize) {
|
||||
uint32_t size = s.size();
|
||||
uint32_t emptySize = maxSize - size;
|
||||
|
||||
if (size > maxSize) size = maxSize;
|
||||
|
||||
for (uint32_t i = 0; i < size; i++) {
|
||||
bitStream.Write((char)s[i]);
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < emptySize; i++) {
|
||||
bitStream.Write((char)0);
|
||||
}
|
||||
}
|
||||
|
||||
void PacketUtils::WriteWString(RakNet::BitStream& bitStream, const std::string& string, uint32_t maxSize) {
|
||||
uint32_t size = static_cast<uint32_t>(string.length());
|
||||
uint32_t remSize = static_cast<uint32_t>(maxSize - size);
|
||||
|
||||
if (size > maxSize) size = maxSize;
|
||||
|
||||
for (uint32_t i = 0; i < size; ++i) {
|
||||
bitStream.Write(static_cast<uint16_t>(string[i]));
|
||||
}
|
||||
|
||||
for (uint32_t j = 0; j < remSize; ++j) {
|
||||
bitStream.Write(static_cast<uint16_t>(0));
|
||||
}
|
||||
}
|
||||
|
||||
void PacketUtils::WriteWString(RakNet::BitStream& bitStream, const std::u16string& string, uint32_t maxSize) {
|
||||
uint32_t size = static_cast<uint32_t>(string.length());
|
||||
uint32_t remSize = static_cast<uint32_t>(maxSize - size);
|
||||
|
||||
if (size > maxSize) size = maxSize;
|
||||
|
||||
for (uint32_t i = 0; i < size; ++i) {
|
||||
bitStream.Write(static_cast<uint16_t>(string[i]));
|
||||
}
|
||||
|
||||
for (uint32_t j = 0; j < remSize; ++j) {
|
||||
bitStream.Write(static_cast<uint16_t>(0));
|
||||
}
|
||||
}
|
||||
|
||||
void PacketUtils::WritePacketWString(const std::string& string, uint32_t maxSize, RakNet::BitStream * bitStream) {
|
||||
uint32_t size = static_cast<uint32_t>(string.length());
|
||||
uint32_t remSize = static_cast<uint32_t>(maxSize - size);
|
||||
|
||||
if (size > maxSize) size = maxSize;
|
||||
|
||||
for (uint32_t i = 0; i < size; ++i) {
|
||||
bitStream->Write(static_cast<uint16_t>(string[i]));
|
||||
}
|
||||
|
||||
for (uint32_t j = 0; j < remSize; ++j) {
|
||||
bitStream->Write(static_cast<uint16_t>(0));
|
||||
}
|
||||
}
|
||||
|
||||
//! Saves a packet to the filesystem
|
||||
void PacketUtils::SavePacket(const std::string& filename, const char * data, size_t length) {
|
||||
//If we don't log to the console, don't save the bin files either. This takes up a lot of time.
|
||||
if (!Game::logger->GetIsLoggingToConsole()) return;
|
||||
|
||||
std::string path = "packets/" + filename;
|
||||
|
||||
std::ofstream file(path, std::ios::binary);
|
||||
if (!file.is_open()) return;
|
||||
|
||||
file.write(data, length);
|
||||
file.close();
|
||||
}
|
||||
25
dNet/PacketUtils.h
Normal file
25
dNet/PacketUtils.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#ifndef PACKETUTILS_H
|
||||
#define PACKETUTILS_H
|
||||
|
||||
#include <BitStream.h>
|
||||
#include <string>
|
||||
|
||||
namespace PacketUtils {
|
||||
void WriteHeader(RakNet::BitStream& bitStream, uint16_t connectionType, uint32_t internalPacketID);
|
||||
|
||||
uint16_t ReadPacketU16(uint32_t startLoc, Packet * packet);
|
||||
uint32_t ReadPacketU32(uint32_t startLoc, Packet * packet);
|
||||
uint64_t ReadPacketU64(uint32_t startLoc, Packet * packet);
|
||||
int64_t ReadPacketS64(uint32_t startLoc, Packet * packet);
|
||||
std::string ReadString(uint32_t startLoc, Packet * packet, bool wide);
|
||||
|
||||
void WritePacketString(const std::string& string, uint32_t maxSize, RakNet::BitStream * bitStream);
|
||||
void WriteString(RakNet::BitStream& bitStream, const std::string& s, uint32_t maxSize);
|
||||
void WriteWString(RakNet::BitStream& bitStream, const std::string& string, uint32_t maxSize);
|
||||
void WriteWString(RakNet::BitStream& bitStream, const std::u16string& string, uint32_t maxSize);
|
||||
void WritePacketWString(const std::string& string, uint32_t maxSize, RakNet::BitStream * bitStream);
|
||||
|
||||
void SavePacket(const std::string& filename, const char * data, size_t length);
|
||||
};
|
||||
|
||||
#endif // PACKETUTILS_H
|
||||
213
dNet/WorldPackets.cpp
Normal file
213
dNet/WorldPackets.cpp
Normal file
@@ -0,0 +1,213 @@
|
||||
#include "dCommonVars.h"
|
||||
#include "WorldPackets.h"
|
||||
#include "BitStream.h"
|
||||
#include "dMessageIdentifiers.h"
|
||||
#include "PacketUtils.h"
|
||||
#include "GeneralUtils.h"
|
||||
#include "User.h"
|
||||
#include "Character.h"
|
||||
#include "dLogger.h"
|
||||
#include <iostream>
|
||||
#include "Game.h"
|
||||
#include "LDFFormat.h"
|
||||
#include "dServer.h"
|
||||
#include "dZoneManager.h"
|
||||
#include "ZCompression.h"
|
||||
|
||||
void WorldPackets::SendLoadStaticZone(const SystemAddress& sysAddr, float x, float y, float z, uint32_t checksum) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_LOAD_STATIC_ZONE);
|
||||
|
||||
auto zone = dZoneManager::Instance()->GetZone()->GetZoneID();
|
||||
bitStream.Write(static_cast<uint16_t>(zone.GetMapID()));
|
||||
bitStream.Write(static_cast<uint16_t>(zone.GetInstanceID()));
|
||||
//bitStream.Write(static_cast<uint32_t>(zone.GetCloneID()));
|
||||
bitStream.Write(0);
|
||||
|
||||
bitStream.Write(checksum);
|
||||
bitStream.Write(static_cast<uint16_t>(0)); // ??
|
||||
|
||||
bitStream.Write(x);
|
||||
bitStream.Write(y);
|
||||
bitStream.Write(z);
|
||||
|
||||
bitStream.Write(static_cast<uint32_t>(0)); // Change this to eventually use 4 on activity worlds
|
||||
|
||||
SEND_PACKET
|
||||
}
|
||||
|
||||
void WorldPackets::SendCharacterList ( const SystemAddress& sysAddr, User* user ) {
|
||||
if (!user) return;
|
||||
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_CHARACTER_LIST_RESPONSE);
|
||||
|
||||
std::vector<Character*> characters = user->GetCharacters();
|
||||
bitStream.Write(static_cast<uint8_t>(characters.size()));
|
||||
bitStream.Write(static_cast<uint8_t>(0)); //character index in front, just picking 0
|
||||
|
||||
for (uint32_t i = 0; i < characters.size(); ++i) {
|
||||
bitStream.Write(characters[i]->GetObjectID());
|
||||
bitStream.Write(static_cast<uint32_t>(0));
|
||||
|
||||
PacketUtils::WriteWString(bitStream, characters[i]->GetName(), 33);
|
||||
PacketUtils::WriteWString(bitStream, characters[i]->GetUnapprovedName(), 33);
|
||||
|
||||
bitStream.Write(static_cast<uint8_t>(characters[i]->GetNameRejected()));
|
||||
bitStream.Write(static_cast<uint8_t>(false));
|
||||
|
||||
PacketUtils::WriteString(bitStream, "", 10);
|
||||
|
||||
bitStream.Write(characters[i]->GetShirtColor());
|
||||
bitStream.Write(characters[i]->GetShirtStyle());
|
||||
bitStream.Write(characters[i]->GetPantsColor());
|
||||
bitStream.Write(characters[i]->GetHairStyle());
|
||||
bitStream.Write(characters[i]->GetHairColor());
|
||||
bitStream.Write(characters[i]->GetLeftHand());
|
||||
bitStream.Write(characters[i]->GetRightHand());
|
||||
bitStream.Write(characters[i]->GetEyebrows());
|
||||
bitStream.Write(characters[i]->GetEyes());
|
||||
bitStream.Write(characters[i]->GetMouth());
|
||||
bitStream.Write(static_cast<uint32_t>(0));
|
||||
|
||||
bitStream.Write(static_cast<uint16_t>(characters[i]->GetZoneID()));
|
||||
bitStream.Write(static_cast<uint16_t>(characters[i]->GetZoneInstance()));
|
||||
bitStream.Write(characters[i]->GetZoneClone());
|
||||
|
||||
bitStream.Write(characters[i]->GetLastLogin());
|
||||
|
||||
const auto& equippedItems = characters[i]->GetEquippedItems();
|
||||
bitStream.Write(static_cast<uint16_t>(equippedItems.size()));
|
||||
|
||||
for (uint32_t j = 0; j < equippedItems.size(); ++j) {
|
||||
bitStream.Write(equippedItems[j]);
|
||||
}
|
||||
}
|
||||
|
||||
SEND_PACKET
|
||||
}
|
||||
|
||||
void WorldPackets::SendCharacterCreationResponse ( const SystemAddress& sysAddr, eCreationResponse response ) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_CHARACTER_CREATE_RESPONSE);
|
||||
bitStream.Write(response);
|
||||
SEND_PACKET
|
||||
}
|
||||
|
||||
void WorldPackets::SendCharacterRenameResponse ( const SystemAddress& sysAddr, eRenameResponse response ) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_CHARACTER_RENAME_RESPONSE);
|
||||
bitStream.Write(response);
|
||||
SEND_PACKET
|
||||
}
|
||||
|
||||
void WorldPackets::SendCharacterDeleteResponse(const SystemAddress& sysAddr, bool response) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_DELETE_CHARACTER_RESPONSE);
|
||||
bitStream.Write(static_cast<uint8_t>(response));
|
||||
SEND_PACKET
|
||||
}
|
||||
|
||||
void WorldPackets::SendTransferToWorld ( const SystemAddress& sysAddr, const std::string& serverIP, uint32_t serverPort, bool mythranShift ) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_TRANSFER_TO_WORLD);
|
||||
|
||||
PacketUtils::WriteString(bitStream, serverIP, 33);
|
||||
bitStream.Write(static_cast<uint16_t>(serverPort));
|
||||
bitStream.Write(static_cast<uint8_t>(mythranShift));
|
||||
|
||||
SEND_PACKET
|
||||
}
|
||||
|
||||
void WorldPackets::SendServerState ( const SystemAddress& sysAddr ) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_SERVER_STATES);
|
||||
bitStream.Write(static_cast<uint8_t>(1)); //If the server is receiving this request, it probably is ready anyway.
|
||||
SEND_PACKET
|
||||
}
|
||||
|
||||
void WorldPackets::SendCreateCharacter(const SystemAddress& sysAddr, const LWOOBJID& objectID, const std::string& xmlData, const std::u16string& username, int32_t gm) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_CREATE_CHARACTER);
|
||||
|
||||
RakNet::BitStream data;
|
||||
data.Write<uint32_t>(6); //LDF key count
|
||||
|
||||
LDFData<LWOOBJID>* objid = new LDFData<LWOOBJID>(u"objid", objectID);
|
||||
LDFData<LOT>* lot = new LDFData<LOT>(u"template", 1);
|
||||
LDFData<std::string> * xmlConfigData = new LDFData<std::string>(u"xmlData", xmlData);
|
||||
LDFData<std::u16string>* name = new LDFData<std::u16string>(u"name", username);
|
||||
LDFData<int32_t>* gmlevel = new LDFData<int32_t>(u"gmlevel", gm);
|
||||
LDFData<int32_t>* chatmode = new LDFData<int32_t>(u"chatmode", gm);
|
||||
|
||||
objid->WriteToPacket(&data);
|
||||
lot->WriteToPacket(&data);
|
||||
name->WriteToPacket(&data);
|
||||
gmlevel->WriteToPacket(&data);
|
||||
chatmode->WriteToPacket(&data);
|
||||
xmlConfigData->WriteToPacket(&data);
|
||||
|
||||
delete objid;
|
||||
delete lot;
|
||||
delete xmlConfigData;
|
||||
delete gmlevel;
|
||||
delete chatmode;
|
||||
delete name;
|
||||
|
||||
//Compress the data before sending:
|
||||
const int reservedSize = 5 * 1024 * 1024;
|
||||
uint8_t compressedData[reservedSize];
|
||||
size_t size = ZCompression::Compress(data.GetData(), data.GetNumberOfBytesUsed(), compressedData, reservedSize);
|
||||
|
||||
bitStream.Write<uint32_t>(size + 9); //size of data + header bytes (8)
|
||||
bitStream.Write<uint8_t>(1); //compressed boolean, true
|
||||
bitStream.Write<uint32_t>(data.GetNumberOfBytesUsed());
|
||||
bitStream.Write<uint32_t>(size);
|
||||
|
||||
for (size_t i = 0; i < size; i++)
|
||||
bitStream.Write(compressedData[i]);
|
||||
|
||||
/*
|
||||
uint32_t dataSize = data.GetNumberOfBytesUsed();
|
||||
bitStream.Write(dataSize + 8); // The data size
|
||||
bitStream.Write(static_cast<uint8_t>(0)); // Data is not compressed
|
||||
bitStream.Write(data); // Write the data
|
||||
*/
|
||||
|
||||
PacketUtils::SavePacket("chardata.bin", (const char *)bitStream.GetData(), static_cast<uint32_t>(bitStream.GetNumberOfBytesUsed()));
|
||||
SEND_PACKET
|
||||
Game::logger->Log("WorldPackets", "Sent CreateCharacter for ID: %llu\n", objectID);
|
||||
}
|
||||
|
||||
void WorldPackets::SendChatModerationResponse(const SystemAddress& sysAddr, bool requestAccepted, uint32_t requestID, const std::string& receiver, std::unordered_map<char, char> unacceptedItems) {
|
||||
CBITSTREAM
|
||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_CHAT_MODERATION_STRING);
|
||||
|
||||
bitStream.Write(static_cast<char>(requestAccepted));
|
||||
bitStream.Write(static_cast<uint16_t>(0));
|
||||
bitStream.Write(static_cast<uint8_t>(requestID));
|
||||
bitStream.Write(static_cast<char>(0));
|
||||
|
||||
for (uint32_t i = 0; i < 33; ++i) {
|
||||
bitStream.Write(static_cast<uint16_t>(receiver[i]));
|
||||
}
|
||||
|
||||
for (std::unordered_map<char, char>::iterator it = unacceptedItems.begin(); it != unacceptedItems.end(); ++it) {
|
||||
bitStream.Write(it->first);
|
||||
bitStream.Write(it->second);
|
||||
}
|
||||
|
||||
SEND_PACKET
|
||||
}
|
||||
|
||||
void WorldPackets::SendGMLevelChange(const SystemAddress& sysAddr, bool success, uint8_t highestLevel, uint8_t prevLevel, uint8_t newLevel) {
|
||||
CBITSTREAM
|
||||
PacketUtils::WriteHeader(bitStream, CLIENT, MSG_CLIENT_MAKE_GM_RESPONSE);
|
||||
|
||||
bitStream.Write<uint8_t>(success);
|
||||
bitStream.Write<uint16_t>(highestLevel);
|
||||
bitStream.Write<uint16_t>(prevLevel);
|
||||
bitStream.Write<uint16_t>(newLevel);
|
||||
|
||||
SEND_PACKET
|
||||
}
|
||||
24
dNet/WorldPackets.h
Normal file
24
dNet/WorldPackets.h
Normal file
@@ -0,0 +1,24 @@
|
||||
#ifndef WORLDPACKETS_H
|
||||
#define WORLDPACKETS_H
|
||||
|
||||
#include "dCommonVars.h"
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
class User;
|
||||
struct SystemAddress;
|
||||
|
||||
namespace WorldPackets {
|
||||
void SendLoadStaticZone(const SystemAddress& sysAddr, float x, float y, float z, uint32_t checksum);
|
||||
void SendCharacterList(const SystemAddress& sysAddr, User * user);
|
||||
void SendCharacterCreationResponse(const SystemAddress& sysAddr, eCreationResponse response);
|
||||
void SendCharacterRenameResponse(const SystemAddress& sysAddr, eRenameResponse response);
|
||||
void SendCharacterDeleteResponse(const SystemAddress& sysAddr, bool response);
|
||||
void SendTransferToWorld(const SystemAddress& sysAddr, const std::string& serverIP, uint32_t serverPort, bool mythranShift);
|
||||
void SendServerState(const SystemAddress& sysAddr);
|
||||
void SendCreateCharacter(const SystemAddress& sysAddr, const LWOOBJID& objectID, const std::string& xmlData, const std::u16string& username, int32_t gm);
|
||||
void SendChatModerationResponse(const SystemAddress& sysAddr, bool requestAccepted, uint32_t requestID, const std::string& receiver, std::unordered_map<char, char> unacceptedItems);
|
||||
void SendGMLevelChange(const SystemAddress& sysAddr, bool success, uint8_t highestLevel, uint8_t prevLevel, uint8_t newLevel);
|
||||
}
|
||||
|
||||
#endif // WORLDPACKETS_H
|
||||
69
dNet/ZoneInstanceManager.cpp
Normal file
69
dNet/ZoneInstanceManager.cpp
Normal file
@@ -0,0 +1,69 @@
|
||||
#define _VARIADIC_MAX 10
|
||||
#include "ZoneInstanceManager.h"
|
||||
|
||||
// Custom Classes
|
||||
#include "MasterPackets.h"
|
||||
#include "PacketUtils.h"
|
||||
#include "dServer.h"
|
||||
|
||||
// C++
|
||||
#include <future>
|
||||
|
||||
// Static Variables
|
||||
ZoneInstanceManager * ZoneInstanceManager::m_Address = nullptr;
|
||||
|
||||
//! Requests a zone transfer
|
||||
void ZoneInstanceManager::RequestZoneTransfer(dServer* server, uint32_t zoneID, uint32_t zoneClone, bool mythranShift, std::function<void(bool, uint32_t, uint32_t, uint32_t, std::string, uint16_t)> callback) {
|
||||
|
||||
ZoneTransferRequest * request = new ZoneTransferRequest();
|
||||
request->requestID = ++currentRequestID;
|
||||
request->callback = callback;
|
||||
|
||||
this->requests.push_back(request);
|
||||
|
||||
MasterPackets::SendZoneTransferRequest(server, request->requestID, mythranShift, zoneID, zoneClone);
|
||||
}
|
||||
|
||||
//! Handles a zone transfer response
|
||||
void ZoneInstanceManager::HandleRequestZoneTransferResponse(uint64_t requestID, Packet * packet) {
|
||||
|
||||
bool mythranShift = static_cast<bool>(packet->data[16]);
|
||||
uint32_t zoneID = PacketUtils::ReadPacketU32(17, packet);
|
||||
uint32_t zoneInstance = PacketUtils::ReadPacketU32(21, packet);
|
||||
uint32_t zoneClone = PacketUtils::ReadPacketU32(25, packet);
|
||||
uint16_t serverPort = PacketUtils::ReadPacketU16(29, packet);
|
||||
std::string serverIP = PacketUtils::ReadString(31, packet, false);
|
||||
|
||||
for (uint32_t i = 0; i < this->requests.size(); ++i) {
|
||||
if (this->requests[i]->requestID == requestID) {
|
||||
|
||||
// Call the request callback
|
||||
this->requests[i]->callback(mythranShift, zoneID, zoneInstance, zoneClone, serverIP, serverPort);
|
||||
|
||||
delete this->requests[i];
|
||||
this->requests.erase(this->requests.begin() + i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ZoneInstanceManager::CreatePrivateZone(dServer* server, uint32_t zoneID, uint32_t zoneClone, const std::string& password)
|
||||
{
|
||||
MasterPackets::SendZoneCreatePrivate(server, zoneID, zoneClone, password);
|
||||
}
|
||||
|
||||
void ZoneInstanceManager::RequestPrivateZone(
|
||||
dServer* server,
|
||||
bool mythranShift,
|
||||
const std::string& password,
|
||||
std::function<void(bool, uint32_t, uint32_t, uint32_t, std::string, uint16_t)> callback)
|
||||
{
|
||||
ZoneTransferRequest* request = new ZoneTransferRequest();
|
||||
request->requestID = ++currentRequestID;
|
||||
request->callback = callback;
|
||||
|
||||
this->requests.push_back(request);
|
||||
|
||||
MasterPackets::SendZoneRequestPrivate(server, request->requestID, mythranShift, password);
|
||||
}
|
||||
65
dNet/ZoneInstanceManager.h
Normal file
65
dNet/ZoneInstanceManager.h
Normal file
@@ -0,0 +1,65 @@
|
||||
#pragma once
|
||||
|
||||
// C++
|
||||
#define _VARIADIC_MAX 10
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
// RakNet
|
||||
#include <RakNetTypes.h>
|
||||
|
||||
class dServer;
|
||||
|
||||
/*!
|
||||
\file ZoneInstanceManager.hpp
|
||||
\brief A class for handling zone transfers and zone-related functions
|
||||
*/
|
||||
|
||||
//! The zone request
|
||||
struct ZoneTransferRequest {
|
||||
uint64_t requestID;
|
||||
std::function<void(bool, uint32_t, uint32_t, uint32_t, std::string, uint16_t)> callback;
|
||||
};
|
||||
|
||||
//! The zone manager
|
||||
class ZoneInstanceManager {
|
||||
private:
|
||||
static ZoneInstanceManager * m_Address; //!< The singleton instance
|
||||
|
||||
std::vector<ZoneTransferRequest*> requests; //!< The zone transfer requests
|
||||
uint64_t currentRequestID; //!< The current request ID
|
||||
|
||||
public:
|
||||
|
||||
//! The singleton method
|
||||
static ZoneInstanceManager * Instance() {
|
||||
if (m_Address == 0) {
|
||||
m_Address = new ZoneInstanceManager;
|
||||
m_Address->currentRequestID = 0;
|
||||
}
|
||||
|
||||
return m_Address;
|
||||
}
|
||||
|
||||
//! Requests a zone transfer
|
||||
/*!
|
||||
\param zoneID The zone ID
|
||||
\param zoneClone The zone clone
|
||||
\param mythranShift Whether or not this is a mythran shift
|
||||
\param callback The callback function
|
||||
*/
|
||||
void RequestZoneTransfer(dServer* server, uint32_t zoneID, uint32_t zoneClone, bool mythranShift, std::function<void(bool, uint32_t, uint32_t, uint32_t, std::string, uint16_t)> callback);
|
||||
|
||||
//! Handles a zone transfer response
|
||||
/*!
|
||||
\param requestID The request ID
|
||||
\param packet The packet
|
||||
*/
|
||||
void HandleRequestZoneTransferResponse(uint64_t requestID, Packet * packet);
|
||||
|
||||
void CreatePrivateZone(dServer* server, uint32_t zoneID, uint32_t zoneClone, const std::string& password);
|
||||
|
||||
void RequestPrivateZone(dServer* server, bool mythranShift, const std::string& password, std::function<void(bool, uint32_t, uint32_t, uint32_t, std::string, uint16_t)> callback);
|
||||
|
||||
};
|
||||
537
dNet/dMessageIdentifiers.h
Normal file
537
dNet/dMessageIdentifiers.h
Normal file
@@ -0,0 +1,537 @@
|
||||
#pragma once
|
||||
#include "MessageIdentifiers.h"
|
||||
|
||||
enum CONNECTION_TYPE {
|
||||
SERVER = 0, //!< Means it is used throughout all servers
|
||||
AUTH, //!< Means it is sent from the client authentication
|
||||
CHAT, //!< Means it is sent from and to the chat server
|
||||
CHAT_INTERNAL, //!< Unused - We can potentially use this in the future for various things
|
||||
WORLD, //!< Means it is sent from the client world
|
||||
CLIENT, //!< Means it is sent to the client from the world server
|
||||
MASTER //!< Means it is sent to and from the master server
|
||||
};
|
||||
|
||||
//! The Internal Server Packet Identifiers
|
||||
enum SERVER {
|
||||
MSG_SERVER_VERSION_CONFIRM = 0, /*!< Sent during a handshake to confirm the server/client version */
|
||||
MSG_SERVER_DISCONNECT_NOTIFY, /*!< Sent when a user disconnected */
|
||||
MSG_SERVER_GENERAL_NOTIFY /*!< A general notification */
|
||||
};
|
||||
|
||||
//! The Internal Authentication Packet Identifiers
|
||||
enum AUTH {
|
||||
MSG_AUTH_LOGIN_REQUEST = 0, /*!< Sent from the client when a user logs in */
|
||||
MSG_AUTH_LOGOUT_REQUEST, /*!< Sent from the client when a user logs out */
|
||||
MSG_AUTH_CREATE_NEW_ACCOUNT_REQUEST, /*!< Sent from the client when a user creates a new account */
|
||||
MSG_AUTH_LEGOINTERFACE_AUTH_RESPONSE, /*!< Unknown */
|
||||
MSG_AUTH_SESSIONKEY_RECEIVED_CONFIRM, /*!< Sent when the server recieved the session key (?) */
|
||||
MSG_AUTH_RUNTIME_CONFIG /*!< Unknown */
|
||||
};
|
||||
|
||||
//! The Internal Chat Packet Identifiers
|
||||
enum CHAT {
|
||||
MSG_CHAT_LOGIN_SESSION_NOTIFY = 0, /*!< When a user logs in */
|
||||
MSG_CHAT_GENERAL_CHAT_MESSAGE, /*!< Used for global chat messages */
|
||||
MSG_CHAT_PRIVATE_CHAT_MESSAGE, /*!< Used for private chat messages */
|
||||
MSG_CHAT_USER_CHANNEL_CHAT_MESSAGE, /*!< Unknown */
|
||||
MSG_CHAT_WORLD_DISCONNECT_REQUEST, /*!< Unknown */
|
||||
MSG_CHAT_WORLD_PROXIMITY_RESPONSE, /*!< Unknown */
|
||||
MSG_CHAT_WORLD_PARCEL_RESPONSE, /*!< Unknown */
|
||||
MSG_CHAT_ADD_FRIEND_REQUEST, /*!< When the client requests to add a friend */
|
||||
MSG_CHAT_ADD_FRIEND_RESPONSE, /*!< Sent from the server when the client adds a friend */
|
||||
MSG_CHAT_REMOVE_FRIEND, /*!< When the client removes a friend */
|
||||
MSG_CHAT_GET_FRIENDS_LIST, /*!< Sent when the client requests a user's friends list */
|
||||
MSG_CHAT_ADD_IGNORE, /*!< Sent when the client adds a friend to the "ignore" list */
|
||||
MSG_CHAT_REMOVE_IGNORE, /*!< Sent when the client removes a friend from the "ignore" list */
|
||||
MSG_CHAT_GET_IGNORE_LIST, /*!< Sent when the client requests a user's ignored list */
|
||||
MSG_CHAT_TEAM_MISSED_INVITE_CHECK, /*!< Unknown (Something with an unresponded-to friend request probably) */
|
||||
MSG_CHAT_TEAM_INVITE, /*!< When the client invites a user to a team */
|
||||
MSG_CHAT_TEAM_INVITE_RESPONSE, /*!< Sent from the server when the client invites someone to the team */
|
||||
MSG_CHAT_TEAM_KICK, /*!< Sent when the client kicks a member from a team */
|
||||
MSG_CHAT_TEAM_LEAVE, /*!< Sent when the client leaves a team */
|
||||
MSG_CHAT_TEAM_SET_LOOT, /*!< Unknown (Something to do with team loot) */
|
||||
MSG_CHAT_TEAM_SET_LEADER, /*!< Unknown (Probably sets the team leader or something) */
|
||||
MSG_CHAT_TEAM_GET_STATUS, /*!< Check to see if we are in a team or not, sent on world join */
|
||||
MSG_CHAT_GUILD_CREATE, /*!< Guild Creation */
|
||||
MSG_CHAT_GUILD_INVITE, /*!< Guild Invitation */
|
||||
MSG_CHAT_GUILD_INVITE_RESPONSE, /*!< Guild Invite Response */
|
||||
MSG_CHAT_GUILD_LEAVE, /*!< Guild Leave */
|
||||
MSG_CHAT_GUILD_KICK, /*!< Guild Kick */
|
||||
MSG_CHAT_GUILD_GET_STATUS, /*!< Guild Get Status */
|
||||
MSG_CHAT_GUILD_GET_ALL, /*!< Guild Get All */
|
||||
MSG_CHAT_SHOW_ALL,
|
||||
MSG_CHAT_BLUEPRINT_MODERATED,
|
||||
MSG_CHAT_BLUEPRINT_MODEL_READY,
|
||||
MSG_CHAT_PROPERTY_READY_FOR_APPROVAL,
|
||||
MSG_CHAT_PROPERTY_MODERATION_CHANGED,
|
||||
MSG_CHAT_PROPERTY_BUILDMODE_CHANGED,
|
||||
MSG_CHAT_PROPERTY_BUILDMODE_CHANGED_REPORT,
|
||||
MSG_CHAT_MAIL,
|
||||
MSG_CHAT_WORLD_INSTANCE_LOCATION_REQUEST,
|
||||
MSG_CHAT_REPUTATION_UPDATE,
|
||||
MSG_CHAT_SEND_CANNED_TEXT,
|
||||
MSG_CHAT_GMLEVEL_UPDATE,
|
||||
MSG_CHAT_CHARACTER_NAME_CHANGE_REQUEST,
|
||||
MSG_CHAT_CSR_REQUEST,
|
||||
MSG_CHAT_CSR_REPLY,
|
||||
MSG_CHAT_GM_KICK,
|
||||
MSG_CHAT_GM_ANNOUNCE,
|
||||
MSG_CHAT_GM_MUTE,
|
||||
MSG_CHAT_ACTIVITY_UPDATE,
|
||||
MSG_CHAT_WORLD_ROUTE_PACKET,
|
||||
MSG_CHAT_GET_ZONE_POPULATIONS,
|
||||
MSG_CHAT_REQUEST_MINIMUM_CHAT_MODE,
|
||||
MSG_CHAT_REQUEST_MINIMUM_CHAT_MODE_PRIVATE,
|
||||
MSG_CHAT_MATCH_REQUEST,
|
||||
MSG_CHAT_UGCMANIFEST_REPORT_MISSING_FILE,
|
||||
MSG_CHAT_UGCMANIFEST_REPORT_DONE_FILE,
|
||||
MSG_CHAT_UGCMANIFEST_REPORT_DONE_BLUEPRINT,
|
||||
MSG_CHAT_UGCC_REQUEST,
|
||||
MSG_CHAT_WHO,
|
||||
MSG_CHAT_WORLD_PLAYERS_PET_MODERATED_ACKNOWLEDGE,
|
||||
MSG_CHAT_ACHIEVEMENT_NOTIFY,
|
||||
MSG_CHAT_GM_CLOSE_PRIVATE_CHAT_WINDOW,
|
||||
MSG_CHAT_UNEXPECTED_DISCONNECT,
|
||||
MSG_CHAT_PLAYER_READY,
|
||||
MSG_CHAT_GET_DONATION_TOTAL,
|
||||
MSG_CHAT_UPDATE_DONATION,
|
||||
MSG_CHAT_PRG_CSR_COMMAND,
|
||||
MSG_CHAT_HEARTBEAT_REQUEST_FROM_WORLD,
|
||||
MSG_CHAT_UPDATE_FREE_TRIAL_STATUS
|
||||
};
|
||||
|
||||
//! Used for packets related to chatting
|
||||
enum CHAT_INTERNAL {
|
||||
MSG_CHAT_INTERNAL_PLAYER_ADDED_NOTIFICATION = 0,
|
||||
MSG_CHAT_INTERNAL_PLAYER_REMOVED_NOTIFICATION,
|
||||
MSG_CHAT_INTERNAL_ADD_FRIEND,
|
||||
MSG_CHAT_INTERNAL_ADD_BEST_FRIEND,
|
||||
MSG_CHAT_INTERNAL_ADD_TO_TEAM,
|
||||
MSG_CHAT_INTERNAL_ADD_BLOCK,
|
||||
MSG_CHAT_INTERNAL_REMOVE_FRIEND,
|
||||
MSG_CHAT_INTERNAL_REMOVE_BLOCK,
|
||||
MSG_CHAT_INTERNAL_REMOVE_FROM_TEAM,
|
||||
MSG_CHAT_INTERNAL_DELETE_TEAM,
|
||||
MSG_CHAT_INTERNAL_REPORT,
|
||||
MSG_CHAT_INTERNAL_PRIVATE_CHAT,
|
||||
MSG_CHAT_INTERNAL_PRIVATE_CHAT_RESPONSE,
|
||||
MSG_CHAT_INTERNAL_ANNOUNCEMENT,
|
||||
MSG_CHAT_INTERNAL_MAIL_COUNT_UPDATE,
|
||||
MSG_CHAT_INTERNAL_MAIL_SEND_NOTIFY,
|
||||
MSG_CHAT_INTERNAL_REQUEST_USER_LIST,
|
||||
MSG_CHAT_INTERNAL_FRIEND_LIST,
|
||||
MSG_CHAT_INTERNAL_ROUTE_TO_PLAYER,
|
||||
MSG_CHAT_INTERNAL_TEAM_UPDATE,
|
||||
MSG_CHAT_INTERNAL_MUTE_UPDATE,
|
||||
MSG_CHAT_INTERNAL_CREATE_TEAM,
|
||||
};
|
||||
|
||||
//! Used for packets send to the world
|
||||
enum WORLD {
|
||||
MSG_WORLD_CLIENT_VALIDATION = 1, // Session info
|
||||
MSG_WORLD_CLIENT_CHARACTER_LIST_REQUEST,
|
||||
MSG_WORLD_CLIENT_CHARACTER_CREATE_REQUEST,
|
||||
MSG_WORLD_CLIENT_LOGIN_REQUEST, // Character selected
|
||||
MSG_WORLD_CLIENT_GAME_MSG,
|
||||
MSG_WORLD_CLIENT_CHARACTER_DELETE_REQUEST,
|
||||
MSG_WORLD_CLIENT_CHARACTER_RENAME_REQUEST,
|
||||
MSG_WORLD_CLIENT_HAPPY_FLOWER_MODE_NOTIFY,
|
||||
MSG_WORLD_CLIENT_SLASH_RELOAD_MAP, // Reload map cmp
|
||||
MSG_WORLD_CLIENT_SLASH_PUSH_MAP_REQUEST, // Push map req cmd
|
||||
MSG_WORLD_CLIENT_SLASH_PUSH_MAP, // Push map cmd
|
||||
MSG_WORLD_CLIENT_SLASH_PULL_MAP, // Pull map cmd
|
||||
MSG_WORLD_CLIENT_LOCK_MAP_REQUEST,
|
||||
MSG_WORLD_CLIENT_GENERAL_CHAT_MESSAGE, // General chat message
|
||||
MSG_WORLD_CLIENT_HTTP_MONITOR_INFO_REQUEST,
|
||||
MSG_WORLD_CLIENT_SLASH_DEBUG_SCRIPTS, // Debug scripts cmd
|
||||
MSG_WORLD_CLIENT_MODELS_CLEAR,
|
||||
MSG_WORLD_CLIENT_EXHIBIT_INSERT_MODEL,
|
||||
MSG_WORLD_CLIENT_LEVEL_LOAD_COMPLETE, // Character data request
|
||||
MSG_WORLD_CLIENT_TMP_GUILD_CREATE,
|
||||
MSG_WORLD_CLIENT_ROUTE_PACKET, // Social?
|
||||
MSG_WORLD_CLIENT_POSITION_UPDATE,
|
||||
MSG_WORLD_CLIENT_MAIL,
|
||||
MSG_WORLD_CLIENT_WORD_CHECK, // Whitelist word check
|
||||
MSG_WORLD_CLIENT_STRING_CHECK, // Whitelist string check
|
||||
MSG_WORLD_CLIENT_GET_PLAYERS_IN_ZONE,
|
||||
MSG_WORLD_CLIENT_REQUEST_UGC_MANIFEST_INFO,
|
||||
MSG_WORLD_CLIENT_BLUEPRINT_GET_ALL_DATA_REQUEST,
|
||||
MSG_WORLD_CLIENT_CANCEL_MAP_QUEUE,
|
||||
MSG_WORLD_CLIENT_HANDLE_FUNNESS,
|
||||
MSG_WORLD_CLIENT_FAKE_PRG_CSR_MESSAGE,
|
||||
MSG_WORLD_CLIENT_REQUEST_FREE_TRIAL_REFRESH,
|
||||
MSG_WORLD_CLIENT_GM_SET_FREE_TRIAL_STATUS
|
||||
};
|
||||
|
||||
//! An enum for packets sent to the client
|
||||
enum CLIENT {
|
||||
MSG_CLIENT_LOGIN_RESPONSE = 0,
|
||||
MSG_CLIENT_LOGOUT_RESPONSE,
|
||||
MSG_CLIENT_LOAD_STATIC_ZONE,
|
||||
MSG_CLIENT_CREATE_OBJECT,
|
||||
MSG_CLIENT_CREATE_CHARACTER,
|
||||
MSG_CLIENT_CREATE_CHARACTER_EXTENDED,
|
||||
MSG_CLIENT_CHARACTER_LIST_RESPONSE,
|
||||
MSG_CLIENT_CHARACTER_CREATE_RESPONSE,
|
||||
MSG_CLIENT_CHARACTER_RENAME_RESPONSE,
|
||||
MSG_CLIENT_CHAT_CONNECT_RESPONSE,
|
||||
MSG_CLIENT_AUTH_ACCOUNT_CREATE_RESPONSE,
|
||||
MSG_CLIENT_DELETE_CHARACTER_RESPONSE,
|
||||
MSG_CLIENT_GAME_MSG,
|
||||
MSG_CLIENT_CONNECT_CHAT,
|
||||
MSG_CLIENT_TRANSFER_TO_WORLD,
|
||||
MSG_CLIENT_IMPENDING_RELOAD_NOTIFY,
|
||||
MSG_CLIENT_MAKE_GM_RESPONSE,
|
||||
MSG_CLIENT_HTTP_MONITOR_INFO_RESPONSE,
|
||||
MSG_CLIENT_SLASH_PUSH_MAP_RESPONSE,
|
||||
MSG_CLIENT_SLASH_PULL_MAP_RESPONSE,
|
||||
MSG_CLIENT_SLASH_LOCK_MAP_RESPONSE,
|
||||
MSG_CLIENT_BLUEPRINT_SAVE_RESPONSE,
|
||||
MSG_CLIENT_BLUEPRINT_LUP_SAVE_RESPONSE,
|
||||
MSG_CLIENT_BLUEPRINT_LOAD_RESPONSE_ITEMID,
|
||||
MSG_CLIENT_BLUEPRINT_GET_ALL_DATA_RESPONSE,
|
||||
MSG_CLIENT_MODEL_INSTANTIATE_RESPONSE,
|
||||
MSG_CLIENT_DEBUG_OUTPUT,
|
||||
MSG_CLIENT_ADD_FRIEND_REQUEST,
|
||||
MSG_CLIENT_ADD_FRIEND_RESPONSE,
|
||||
MSG_CLIENT_REMOVE_FRIEND_RESPONSE,
|
||||
MSG_CLIENT_GET_FRIENDS_LIST_RESPONSE,
|
||||
MSG_CLIENT_UPDATE_FRIEND_NOTIFY,
|
||||
MSG_CLIENT_ADD_IGNORE_RESPONSE,
|
||||
MSG_CLIENT_REMOVE_IGNORE_RESPONSE,
|
||||
MSG_CLIENT_GET_IGNORE_LIST_RESPONSE,
|
||||
MSG_CLIENT_TEAM_INVITE,
|
||||
MSG_CLIENT_TEAM_INVITE_INITIAL_RESPONSE,
|
||||
MSG_CLIENT_GUILD_CREATE_RESPONSE,
|
||||
MSG_CLIENT_GUILD_GET_STATUS_RESPONSE,
|
||||
MSG_CLIENT_GUILD_INVITE,
|
||||
MSG_CLIENT_GUILD_INVITE_INITIAL_RESPONSE,
|
||||
MSG_CLIENT_GUILD_INVITE_FINAL_RESPONSE,
|
||||
MSG_CLIENT_GUILD_INVITE_CONFIRM,
|
||||
MSG_CLIENT_GUILD_ADD_PLAYER,
|
||||
MSG_CLIENT_GUILD_REMOVE_PLAYER,
|
||||
MSG_CLIENT_GUILD_LOGIN_LOGOUT,
|
||||
MSG_CLIENT_GUILD_RANK_CHANGE,
|
||||
MSG_CLIENT_GUILD_DATA,
|
||||
MSG_CLIENT_GUILD_STATUS,
|
||||
MSG_CLIENT_MAIL,
|
||||
MSG_CLIENT_DB_PROXY_RESULT,
|
||||
MSG_CLIENT_SHOW_ALL_RESPONSE,
|
||||
MSG_CLIENT_WHO_RESPONSE,
|
||||
MSG_CLIENT_SEND_CANNED_TEXT,
|
||||
MSG_CLIENT_UPDATE_CHARACTER_NAME,
|
||||
MSG_CLIENT_SET_NETWORK_SIMULATOR,
|
||||
MSG_CLIENT_INVALID_CHAT_MESSAGE,
|
||||
MSG_CLIENT_MINIMUM_CHAT_MODE_RESPONSE,
|
||||
MSG_CLIENT_MINIMUM_CHAT_MODE_RESPONSE_PRIVATE,
|
||||
MSG_CLIENT_CHAT_MODERATION_STRING,
|
||||
MSG_CLIENT_UGC_MANIFEST_RESPONSE,
|
||||
MSG_CLIENT_IN_LOGIN_QUEUE,
|
||||
MSG_CLIENT_SERVER_STATES,
|
||||
MSG_CLIENT_GM_CLOSE_TARGET_CHAT_WINDOW,
|
||||
MSG_CLIENT_GENERAL_TEXT_FOR_LOCALIZATION,
|
||||
MSG_CLIENT_UPDATE_FREE_TRIAL_STATUS,
|
||||
MSG_CLIENT_UGC_DOWNLOAD_FAILED = 120
|
||||
};
|
||||
|
||||
//! Used for packets sent to the master server
|
||||
enum MASTER {
|
||||
MSG_MASTER_REQUEST_PERSISTENT_ID = 1,
|
||||
MSG_MASTER_REQUEST_PERSISTENT_ID_RESPONSE,
|
||||
MSG_MASTER_REQUEST_ZONE_TRANSFER,
|
||||
MSG_MASTER_REQUEST_ZONE_TRANSFER_RESPONSE,
|
||||
MSG_MASTER_SERVER_INFO,
|
||||
MSG_MASTER_REQUEST_SESSION_KEY,
|
||||
MSG_MASTER_SET_SESSION_KEY,
|
||||
MSG_MASTER_SESSION_KEY_RESPONSE,
|
||||
MSG_MASTER_PLAYER_ADDED,
|
||||
MSG_MASTER_PLAYER_REMOVED,
|
||||
|
||||
MSG_MASTER_CREATE_PRIVATE_ZONE,
|
||||
MSG_MASTER_REQUEST_PRIVATE_ZONE,
|
||||
|
||||
MSG_MASTER_WORLD_READY,
|
||||
MSG_MASTER_PREP_ZONE,
|
||||
|
||||
MSG_MASTER_SHUTDOWN,
|
||||
MSG_MASTER_SHUTDOWN_RESPONSE,
|
||||
MSG_MASTER_SHUTDOWN_IMMEDIATE,
|
||||
|
||||
MSG_MASTER_SHUTDOWN_UNIVERSE,
|
||||
|
||||
MSG_MASTER_AFFIRM_TRANSFER_REQUEST,
|
||||
MSG_MASTER_AFFIRM_TRANSFER_RESPONSE,
|
||||
|
||||
MSG_MASTER_NEW_SESSION_ALERT
|
||||
};
|
||||
|
||||
//! The Game messages
|
||||
enum GAME_MSG : unsigned short {
|
||||
GAME_MSG_TELEPORT = 19,
|
||||
GAME_MSG_SET_PLAYER_CONTROL_SCHEME = 26,
|
||||
GAME_MSG_DROP_CLIENT_LOOT = 30,
|
||||
GAME_MSG_DIE = 37,
|
||||
GAME_MSG_REQUEST_DIE = 38,
|
||||
GAME_MSG_PLAY_EMOTE = 41,
|
||||
GAME_MSG_PLAY_ANIMATION = 43,
|
||||
GAME_MSG_SET_NAME = 72,
|
||||
GAME_MSG_ECHO_START_SKILL = 118,
|
||||
GAME_MSG_START_SKILL = 119,
|
||||
GAME_MSG_VERIFY_ACK = 121,
|
||||
GAME_MSG_ADD_SKILL = 127,
|
||||
GAME_MSG_REMOVE_SKILL = 128,
|
||||
GAME_MSG_SET_CURRENCY = 133,
|
||||
GAME_MSG_PICKUP_CURRENCY = 137,
|
||||
GAME_MSG_PICKUP_ITEM = 139,
|
||||
GAME_MSG_TEAM_PICKUP_ITEM = 140,
|
||||
GAME_MSG_PLAY_FX_EFFECT = 154,
|
||||
GAME_MSG_STOP_FX_EFFECT = 155,
|
||||
GAME_MSG_REQUEST_RESURRECT = 159,
|
||||
GAME_MSG_RESURRECT = 160,
|
||||
GAME_MSG_PUSH_EQUIPPED_ITEMS_STATE = 191,
|
||||
GAME_MSG_POP_EQUIPPED_ITEMS_STATE = 192,
|
||||
GAME_MSG_SET_GM_LEVEL = 193,
|
||||
GAME_MSG_SET_STUNNED = 198,
|
||||
GAME_MSG_KNOCKBACK = 202,
|
||||
GAME_MSG_REBUILD_CANCEL = 209,
|
||||
GAME_MSG_ENABLE_REBUILD = 213,
|
||||
GAME_MSG_MOVE_ITEM_IN_INVENTORY = 224,
|
||||
GAME_MSG_ADD_ITEM_TO_INVENTORY_CLIENT_SYNC = 227,
|
||||
GAME_MSG_REMOVE_ITEM_FROM_INVENTORY = 230,
|
||||
GAME_MSG_EQUIP_ITEM = 231,
|
||||
GAME_MSG_UN_EQUIP_ITEM = 233,
|
||||
GAME_MSG_OFFER_MISSION = 248,
|
||||
GAME_MSG_RESPOND_TO_MISSION = 249,
|
||||
GAME_MSG_NOTIFY_MISSION = 254,
|
||||
GAME_MSG_NOTIFY_MISSION_TASK = 255,
|
||||
GAME_MSG_REBUILD_NOTIFY_STATE = 336,
|
||||
GAME_MSG_TERMINATE_INTERACTION = 357,
|
||||
GAME_MSG_SERVER_TERMINATE_INTERACTION = 358,
|
||||
GAME_MSG_REQUEST_USE = 364,
|
||||
GAME_MSG_VENDOR_OPEN_WINDOW = 369,
|
||||
GAME_MSG_BUY_FROM_VENDOR = 373,
|
||||
GAME_MSG_SELL_TO_VENDOR = 374,
|
||||
GAME_MSG_TEAM_SET_OFF_WORLD_FLAG = 383,
|
||||
GAME_MSG_SET_INVENTORY_SIZE = 389,
|
||||
GAME_MSG_ACKNOWLEDGE_POSSESSION = 391,
|
||||
GAME_MSG_SET_SHOOTING_GALLERY_PARAMS = 400,
|
||||
GAME_MSG_REQUEST_ACTIVITY_START_STOP = 402,
|
||||
GAME_MSG_REQUEST_ACTIVITY_ENTER = 403,
|
||||
GAME_MSG_REQUEST_ACTIVITY_EXIT = 404,
|
||||
GAME_MSG_ACTIVITY_ENTER = 405,
|
||||
GAME_MSG_ACTIVITY_EXIT = 406,
|
||||
GAME_MSG_ACTIVITY_START = 407,
|
||||
GAME_MSG_ACTIVITY_STOP = 408,
|
||||
GAME_MSG_SHOOTING_GALLERY_CLIENT_AIM_UPDATE = 409,
|
||||
GAME_MSG_SHOOTING_GALLERY_FIRE = 411,
|
||||
GAME_MSG_VENDOR_STATUS_UPDATE = 417,
|
||||
GAME_MSG_NOTIFY_CLIENT_SHOOTING_GALLERY_SCORE = 425,
|
||||
GAME_MSG_CONSUME_CLIENT_ITEM = 427,
|
||||
GAME_MSG_CLIENT_ITEM_CONSUMED = 428,
|
||||
GAME_MSG_UPDATE_SHOOTING_GALLERY_ROTATION = 448,
|
||||
GAME_MSG_SET_FLAG = 471,
|
||||
GAME_MSG_NOTIFY_CLIENT_FLAG_CHANGE = 472,
|
||||
GAME_MSG_VENDOR_TRANSACTION_RESULT = 476,
|
||||
GAME_MSG_HAS_BEEN_COLLECTED = 486,
|
||||
GAME_MSG_DISPLAY_CHAT_BUBBLE = 495,
|
||||
GAME_MSG_SPAWN_PET = 498,
|
||||
GAME_MSG_DESPAWN_PET = 499,
|
||||
GAME_MSG_PLAYER_LOADED = 505,
|
||||
GAME_MSG_PLAYER_READY = 509,
|
||||
GAME_MSG_REQUEST_LINKED_MISSION = 515,
|
||||
GAME_MSG_INVALID_ZONE_TRANSFER_LIST = 519,
|
||||
GAME_MSG_MISSION_DIALOGUE_OK = 520,
|
||||
GAME_MSG_DISPLAY_MESSAGE_BOX = 529,
|
||||
GAME_MSG_MESSAGE_BOX_RESPOND = 530,
|
||||
GAME_MSG_CHOICE_BOX_RESPOND = 531,
|
||||
GAME_MSG_SET_SHOOTING_GALLERY_RETICULE_EFFECT = 548,
|
||||
GAME_MSG_PLACE_MODEL_RESPONSE = 0x223,
|
||||
GAME_MSG_SET_JET_PACK_MODE = 561,
|
||||
GAME_MSG_REGISTER_PET_ID = 565,
|
||||
GAME_MSG_REGISTER_PET_DBID = 566,
|
||||
GAME_MSG_SHOW_ACTIVITY_COUNTDOWN = 568,
|
||||
GAME_MSG_START_ACTIVITY_TIME = 576,
|
||||
GAME_MSG_ACTIVITY_PAUSE = 602,
|
||||
GAME_MSG_USE_NON_EQUIPMENT_ITEM = 603,
|
||||
GAME_MSG_USE_ITEM_RESULT = 607,
|
||||
GAME_MSG_COMMAND_PET = 640,
|
||||
GAME_MSG_PET_RESPONSE = 641,
|
||||
GAME_MSG_REQUEST_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 648,
|
||||
GAME_MSG_SEND_ACTIVITY_SUMMARY_LEADERBOARD_DATA = 649,
|
||||
GAME_MSG_NOTIFY_OBJECT = 656,
|
||||
GAME_MSG_CLIENT_NOTIFY_PET = 659,
|
||||
GAME_MSG_NOTIFY_PET = 660,
|
||||
GAME_MSG_NOTIFY_PET_TAMING_MINIGAME = 661,
|
||||
GAME_MSG_START_SERVER_PET_MINIGAME_TIMER = 662,
|
||||
GAME_MSG_CLIENT_EXIT_TAMING_MINIGAME = 663,
|
||||
GAME_MSG_PET_NAME_CHANGED = 686,
|
||||
GAME_MSG_PET_TAMING_MINIGAME_RESULT = 667,
|
||||
GAME_MSG_PET_TAMING_TRY_BUILD_RESULT = 668,
|
||||
GAME_MSG_NOTIFY_TAMING_BUILD_SUCCESS = 673,
|
||||
GAME_MSG_NOTIFY_TAMING_MODEL_LOADED_ON_SERVER = 674,
|
||||
GAME_MSG_ADD_PET_TO_PLAYER = 681,
|
||||
GAME_MSG_REQUEST_SET_PET_NAME = 683,
|
||||
GAME_MSG_SET_PET_NAME = 684,
|
||||
GAME_MSG_NOTIFY_PET_TAMING_PUZZLE_SELECTED = 675,
|
||||
GAME_MSG_SHOW_PET_ACTION_BUTTON = 692,
|
||||
GAME_MSG_SET_EMOTE_LOCK_STATE = 693,
|
||||
GAME_MSG_PLAY_EMBEDDED_EFFECT_ON_ALL_CLIENTS_NEAR_OBJECT = 713,
|
||||
GAME_MSG_DOWNLOAD_PROPERTY_DATA = 716,
|
||||
GAME_MSG_QUERY_PROPERTY_DATA = 717,
|
||||
GAME_MSG_PROPERTY_EDITOR_BEGIN = 724,
|
||||
GAME_MSG_PROPERTY_EDITOR_END = 725,
|
||||
GAME_MSG_START_PATHING = 735,
|
||||
GAME_MSG_NOTIFY_CLIENT_ZONE_OBJECT = 737,
|
||||
GAME_MSG_PROPERTY_RENTAL_RESPONSE = 750,
|
||||
GAME_MSG_REQUEST_PLATFORM_RESYNC = 760,
|
||||
GAME_MSG_PLATFORM_RESYNC = 761,
|
||||
GAME_MSG_PLAY_CINEMATIC = 762,
|
||||
GAME_MSG_END_CINEMATIC = 763,
|
||||
GAME_MSG_CINEMATIC_UPDATE = 764,
|
||||
GAME_MSG_TOGGLE_GHOST_REFERENCE_OVERRIDE = 767,
|
||||
GAME_MSG_SET_GHOST_REFERENCE_POSITION = 768,
|
||||
GAME_MSG_FIRE_EVENT_SERVER_SIDE = 770,
|
||||
GAME_MSG_SET_NETWORK_SCRIPT_VAR = 781,
|
||||
GAME_MSG_UPDATE_MODEL_FROM_CLIENT = 793,
|
||||
GAME_MSG_DELETE_MODEL_FROM_CLIENT = 794,
|
||||
GAME_MSG_PLAY_ND_AUDIO_EMITTER = 821,
|
||||
GAME_MSG_PLAY2_DAMBIENT_SOUND = 831,
|
||||
GAME_MSG_ENTER_PROPERTY1 = 840,
|
||||
GAME_MSG_ENTER_PROPERTY2 = 841,
|
||||
GAME_MSG_PROPERTY_ENTRANCE_SYNC = 842,
|
||||
GAME_MSG_PROPERTY_SELECT_QUERY = 845,
|
||||
GAME_MSG_PARSE_CHAT_MESSAGE = 850,
|
||||
GAME_MSG_BROADCAST_TEXT_TO_CHATBOX = 858,
|
||||
GAME_MSG_OPEN_PROPERTY_MANAGEMENT = 860,
|
||||
GAME_MSG_OPEN_PROPERTY_VENDOR = 861,
|
||||
GAME_MSG_UPDATE_PROPERTY_OR_MODEL_FOR_FILTER_CHECK = 863,
|
||||
GAME_MSG_CLIENT_TRADE_REQUEST = 868,
|
||||
GAME_MSG_SERVER_TRADE_REQUEST = 869,
|
||||
GAME_MSG_SERVER_TRADE_INVITE = 870,
|
||||
GAME_MSG_CLIENT_TRADE_REPLY = 871,
|
||||
GAME_MSG_SERVER_TRADE_REPLY = 872,
|
||||
GAME_MSG_SERVER_TRADE_INITIAL_REPLY = 873,
|
||||
GAME_MSG_SERVER_TRADE_FINAL_REPLY = 874,
|
||||
GAME_MSG_CLIENT_TRADE_UPDATE = 875,
|
||||
GAME_MSG_SERVER_SIDE_TRADE_UPDATE = 876,
|
||||
GAME_MSG_SERVER_TRADE_UPDATE = 877,
|
||||
GAME_MSG_CLIENT_TRADE_CANCEL = 878,
|
||||
GAME_MSG_CLIENT_SIDE_TRADE_CANCEL = 879,
|
||||
GAME_MSG_CLIENT_TRADE_ACCEPT = 880,
|
||||
GAME_MSG_SERVER_SIDE_TRADE_ACCEPT = 881,
|
||||
GAME_MSG_SERVER_SIDE_TRADE_CANCEL = 882,
|
||||
GAME_MSG_SERVER_TRADE_CANCEL = 883,
|
||||
GAME_MSG_SERVER_TRADE_ACCEPT = 884,
|
||||
GAME_MSG_READY_FOR_UPDATES = 888,
|
||||
GAME_MSG_ORIENT_TO_OBJECT = 905,
|
||||
GAME_MSG_ORIENT_TO_POSITION = 906,
|
||||
GAME_MSG_ORIENT_TO_ANGLE = 907,
|
||||
GAME_MSG_BOUNCER_ACTIVE_STATUS = 942,
|
||||
GAME_MSG_BBB_LOAD_ITEM_REQUEST = 1000,
|
||||
GAME_MSG_BBB_SAVE_REQUEST = 1001,
|
||||
GAME_MSG_BBB_SAVE_RESPONSE = 1006,
|
||||
GAME_MSG_NOTIFY_CLIENT_OBJECT = 1042,
|
||||
GAME_MSG_DISPLAY_ZONE_SUMMARY = 1043,
|
||||
GAME_MSG_ACTIVITY_STATE_CHANGE_REQUEST = 1053,
|
||||
GAME_MSG_MODIFY_PLAYER_ZONE_STATISTIC = 1046,
|
||||
GAME_MSG_START_BUILDING_WITH_ITEM = 1057,
|
||||
GAME_MSG_START_ARRANGING_WITH_ITEM = 1061,
|
||||
GAME_MSG_FINISH_ARRANGING_WITH_ITEM = 1062,
|
||||
GAME_MSG_DONE_ARRANGING_WITH_ITEM = 1063,
|
||||
GAME_MSG_SET_BUILD_MODE = 1068,
|
||||
GAME_MSG_BUILD_MODE_SET = 1069,
|
||||
GAME_MSG_SET_BUILD_MODE_CONFIRMED = 1073,
|
||||
GAME_MSG_NOTIFY_CLIENT_FAILED_PRECONDITION = 1081,
|
||||
GAME_MSG_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1093,
|
||||
GAME_MSG_MODULAR_BUILD_BEGIN = 1094,
|
||||
GAME_MSG_MODULAR_BUILD_END = 1095,
|
||||
GAME_MSG_MODULAR_BUILD_MOVE_AND_EQUIP = 1096,
|
||||
GAME_MSG_MODULAR_BUILD_FINISH = 1097,
|
||||
GAME_MSG_REPORT_BUG = 1198,
|
||||
GAME_MSG_MISSION_DIALOGUE_CANCELLED = 1129,
|
||||
GAME_MSG_ECHO_SYNC_SKILL = 1144,
|
||||
GAME_MSG_SYNC_SKILL = 1145,
|
||||
GAME_MSG_REQUEST_SERVER_PROJECTILE_IMPACT = 1148,
|
||||
GAME_MSG_DO_CLIENT_PROJECTILE_IMPACT = 1151,
|
||||
GAME_MSG_MODULAR_BUILD_CONVERT_MODEL = 1155,
|
||||
GAME_MSG_SET_PLAYER_ALLOWED_RESPAWN = 1165,
|
||||
GAME_MSG_UI_MESSAGE_SERVER_TO_SINGLE_CLIENT = 1184,
|
||||
GAME_MSG_UI_MESSAGE_SERVER_TO_ALL_CLIENTS = 1185,
|
||||
GAME_MSG_PET_TAMING_TRY_BUILD = 1197,
|
||||
GAME_MSG_REQUEST_SMASH_PLAYER = 1202,
|
||||
GAME_MSG_FIRE_EVENT_CLIENT_SIDE = 1213,
|
||||
GAME_MSG_TOGGLE_GM_INVIS = 1218,
|
||||
GAME_MSG_CHANGE_OBJECT_WORLD_STATE = 1223,
|
||||
GAME_MSG_VEHICLE_LOCK_INPUT = 1230,
|
||||
GAME_MSG_VEHICLE_UNLOCK_INPUT = 1231,
|
||||
GAME_MSG_RACING_RESET_PLAYER_TO_LAST_RESET = 1252,
|
||||
GAME_MSG_RACING_SERVER_SET_PLAYER_LAP_AND_PLANE = 1253,
|
||||
GAME_MSG_RACING_SET_PLAYER_RESET_INFO = 1254,
|
||||
GAME_MSG_RACING_PLAYER_INFO_RESET_FINISHED = 1255,
|
||||
GAME_MSG_LOCK_NODE_ROTATION = 1260,
|
||||
GAME_MSG_VEHICLE_SET_WHEEL_LOCK_STATE = 1273,
|
||||
GAME_MSG_NOTIFY_VEHICLE_OF_RACING_OBJECT = 1276,
|
||||
GAME_MSG_PLAYER_REACHED_RESPAWN_CHECKPOINT = 1296,
|
||||
GAME_MSG_HANDLE_UGC_EQUIP_POST_DELETE_BASED_ON_EDIT_MODE = 1300,
|
||||
GAME_MSG_HANDLE_UGC_EQUIP_PRE_CREATE_BASED_ON_EDIT_MODE = 1301,
|
||||
GAME_MSG_PROPERTY_CONTENTS_FROM_CLIENT = 1305,
|
||||
GAME_MSG_GET_MODELS_ON_PROPERTY = 1306,
|
||||
GAME_MSG_MATCH_REQUEST = 1308,
|
||||
GAME_MSG_MATCH_RESPONSE = 1309,
|
||||
GAME_MSG_MATCH_UPDATE = 1310,
|
||||
GAME_MSG_MODULE_ASSEMBLY_DB_DATA_FOR_CLIENT = 1131,
|
||||
GAME_MSG_MODULE_ASSEMBLY_QUERY_DATA = 1132,
|
||||
GAME_MSG_VEHICLE_ADD_PASSIVE_BOOST_ACTION = 1340,
|
||||
GAME_MSG_VEHICLE_REMOVE_PASSIVE_BOOST_ACTION = 1341,
|
||||
GAME_MSG_VEHICLE_NOTIFY_SERVER_ADD_PASSIVE_BOOST_ACTION = 1342,
|
||||
GAME_MSG_VEHICLE_NOTIFY_SERVER_REMOVE_PASSIVE_BOOST_ACTION = 1343,
|
||||
GAME_MSG_VEHICLE_ADD_SLOWDOWN_ACTION = 1344,
|
||||
GAME_MSG_VEHICLE_REMOVE_SLOWDOWN_ACTION = 1345,
|
||||
GAME_MSG_VEHICLE_NOTIFY_SERVER_ADD_SLOWDOWN_ACTION = 1346,
|
||||
GAME_MSG_VEHICLE_NOTIFY_SERVER_REMOVE_SLOWDOWN_ACTION = 1347,
|
||||
GAME_MSG_BUYBACK_FROM_VENDOR = 1350,
|
||||
GAME_MSG_SET_PROPERTY_ACCESS = 1366,
|
||||
GAME_MSG_ZONE_PROPERTY_MODEL_PLACED = 1369,
|
||||
GAME_MSG_ZONE_PROPERTY_MODEL_ROTATED = 1370,
|
||||
GAME_MSG_ZONE_PROPERTY_MODEL_REMOVED_WHILE_EQUIPPED = 1371,
|
||||
GAME_MSG_ZONE_PROPERTY_MODEL_EQUIPPED = 1372,
|
||||
GAME_MSG_ZONE_PROPERTY_MODEL_PICKED_UP = 1373,
|
||||
GAME_MSG_ZONE_PROPERTY_MODEL_REMOVED = 1374,
|
||||
GAME_MSG_NOTIFY_RACING_CLIENT = 1390,
|
||||
GAME_MSG_RACING_PLAYER_HACK_CAR = 1391,
|
||||
GAME_MSG_RACING_PLAYER_LOADED = 1392,
|
||||
GAME_MSG_RACING_CLIENT_READY = 1393,
|
||||
GAME_MSG_UPDATE_CHAT_MODE = 1395,
|
||||
GAME_MSG_VEHICLE_NOTIFY_FINISHED_RACE = 1396,
|
||||
GAME_MSG_SET_CONSUMABLE_ITEM = 1409,
|
||||
GAME_MSG_SET_PET_NAME_MODERATED = 1448,
|
||||
GAME_MSG_MODIFY_LEGO_SCORE = 1459,
|
||||
GAME_MSG_RESTORE_TO_POST_LOAD_STATS = 1468,
|
||||
GAME_MSG_SET_RAIL_MOVEMENT = 1471,
|
||||
GAME_MSG_START_RAIL_MOVEMENT = 1472,
|
||||
GAME_MSG_CANCEL_RAIL_MOVEMENT = 1474,
|
||||
GAME_MSG_CLIENT_RAIL_MOVEMENT_READY = 1476,
|
||||
GAME_MSG_PLAYER_RAIL_ARRIVED_NOTIFICATION = 1477,
|
||||
GAME_MSG_UPDATE_PLAYER_STATISTIC = 1481,
|
||||
GAME_MSG_MODULAR_ASSEMBLY_NIF_COMPLETED = 1498,
|
||||
GAME_MSG_NOTIFY_NOT_ENOUGH_INV_SPACE = 1516,
|
||||
GAME_MSG_TEAM_SET_LEADER = 0x0615,
|
||||
GAME_MSG_TEAM_INVITE_CONFIRM = 0x0616,
|
||||
GAME_MSG_TEAM_GET_STATUS_RESPONSE = 0x0617,
|
||||
GAME_MSG_TEAM_ADD_PLAYER = 0x061a,
|
||||
GAME_MSG_TEAM_REMOVE_PLAYER = 0x061b,
|
||||
GAME_MSG_START_CELEBRATION_EFFECT = 1618,
|
||||
GAME_MSG_ADD_BUFF = 1647,
|
||||
GAME_MSG_SERVER_DONE_LOADING_ALL_OBJECTS = 1642,
|
||||
GAME_MSG_PLACE_PROPERTY_MODEL = 1170,
|
||||
GAME_MSG_VEHICLE_NOTIFY_HIT_IMAGINATION_SERVER = 1606,
|
||||
GAME_MSG_ADD_RUN_SPEED_MODIFIER = 1505,
|
||||
GAME_MSG_REMOVE_RUN_SPEED_MODIFIER = 1506,
|
||||
GAME_MSG_PROPERTY_ENTRANCE_BEGIN = 1553,
|
||||
GAME_MSG_REQUEST_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1666,
|
||||
GAME_MSG_RESPONSE_MOVE_ITEM_BETWEEN_INVENTORY_TYPES = 1667,
|
||||
GAME_MSG_PLAYER_SET_CAMERA_CYCLING_MODE = 1676,
|
||||
GAME_MSG_NOTIFY_SERVER_LEVEL_PROCESSING_COMPLETE = 1734,
|
||||
GAME_MSG_MARK_INVENTORY_ITEM_AS_ACTIVE = 1767,
|
||||
END
|
||||
};
|
||||
6
dNet/dNetCommon.h
Normal file
6
dNet/dNetCommon.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
#include "RakNetTypes.h"
|
||||
#include "RakPeer.h"
|
||||
|
||||
#define NET_PASSWORD_EXTERNAL "3.25 ND1"
|
||||
#define NET_PASSWORD_INTERNAL "3.25 DARKFLAME1"
|
||||
258
dNet/dServer.cpp
Normal file
258
dNet/dServer.cpp
Normal file
@@ -0,0 +1,258 @@
|
||||
#define _VARIADIC_MAX 10
|
||||
#include "dServer.h"
|
||||
#include "dNetCommon.h"
|
||||
#include "dLogger.h"
|
||||
|
||||
#include "RakNetworkFactory.h"
|
||||
#include "MessageIdentifiers.h"
|
||||
|
||||
#include "PacketUtils.h"
|
||||
#include "dMessageIdentifiers.h"
|
||||
#include "MasterPackets.h"
|
||||
#include "ZoneInstanceManager.h"
|
||||
|
||||
//! Replica Constructor class
|
||||
class ReplicaConstructor : public ReceiveConstructionInterface {
|
||||
public:
|
||||
ReplicaReturnResult ReceiveConstruction(RakNet::BitStream *inBitStream, RakNetTime timestamp, NetworkID networkID, NetworkIDObject *existingObject, SystemAddress senderId, ReplicaManager *caller) {
|
||||
return REPLICA_PROCESSING_DONE;
|
||||
}
|
||||
} ConstructionCB;
|
||||
|
||||
//! Replica Download Sender class
|
||||
class ReplicaSender : public SendDownloadCompleteInterface {
|
||||
public:
|
||||
ReplicaReturnResult SendDownloadComplete(RakNet::BitStream *outBitStream, RakNetTime currentTime, SystemAddress senderId, ReplicaManager *caller) {
|
||||
return REPLICA_PROCESSING_DONE;
|
||||
}
|
||||
} SendDownloadCompleteCB;
|
||||
|
||||
//! Replica Download Receiver class
|
||||
class ReplicaReceiever : public ReceiveDownloadCompleteInterface {
|
||||
public:
|
||||
ReplicaReturnResult ReceiveDownloadComplete(RakNet::BitStream *inBitStream, SystemAddress senderId, ReplicaManager *caller) {
|
||||
return REPLICA_PROCESSING_DONE;
|
||||
}
|
||||
} ReceiveDownloadCompleteCB;
|
||||
|
||||
dServer::dServer(const std::string& ip, int port, int instanceID, int maxConnections, bool isInternal, bool useEncryption, dLogger* logger, const std::string masterIP, int masterPort, ServerType serverType, unsigned int zoneID) {
|
||||
mIP = ip;
|
||||
mPort = port;
|
||||
mZoneID = zoneID;
|
||||
mInstanceID = instanceID;
|
||||
mMaxConnections = maxConnections;
|
||||
mIsInternal = isInternal;
|
||||
mUseEncryption = useEncryption;
|
||||
mLogger = logger;
|
||||
mMasterIP = masterIP;
|
||||
mMasterPort = masterPort;
|
||||
mMasterConnectionActive = false;
|
||||
mNetIDManager = nullptr;
|
||||
mReplicaManager = nullptr;
|
||||
mServerType = serverType;
|
||||
|
||||
//Attempt to start our server here:
|
||||
mIsOkay = Startup();
|
||||
|
||||
//Forcibly log to both the console and our file what ip, port and possibly zoneID / instanceID we're running on:
|
||||
bool prevLogSetting = mLogger->GetIsLoggingToConsole();
|
||||
mLogger->SetLogToConsole(true);
|
||||
|
||||
if (mIsOkay) {
|
||||
if (zoneID == 0)
|
||||
mLogger->Log("dServer", "Server is listening on %s:%i with encryption: %i\n", ip.c_str(), port, int(useEncryption));
|
||||
else
|
||||
mLogger->Log("dServer", "Server is listening on %s:%i with encryption: %i, running zone %i / %i\n", ip.c_str(), port, int(useEncryption), zoneID, instanceID);
|
||||
}
|
||||
else { mLogger->Log("dServer", "FAILED TO START SERVER ON IP/PORT: %s:%i\n", ip.c_str(), port); return; }
|
||||
|
||||
mLogger->SetLogToConsole(prevLogSetting);
|
||||
|
||||
//Connect to master if we are not master:
|
||||
if (serverType != ServerType::Master) {
|
||||
SetupForMasterConnection();
|
||||
ConnectToMaster();
|
||||
}
|
||||
|
||||
//Set up Replica if we're a world server:
|
||||
if (serverType == ServerType::World) {
|
||||
mNetIDManager = new NetworkIDManager();
|
||||
mNetIDManager->SetIsNetworkIDAuthority(true);
|
||||
|
||||
mReplicaManager = new ReplicaManager();
|
||||
mReplicaManager->SetAutoParticipateNewConnections(false);
|
||||
mReplicaManager->SetAutoConstructToNewParticipants(false);
|
||||
mReplicaManager->SetAutoSerializeInScope(true);
|
||||
mReplicaManager->SetReceiveConstructionCB(&ConstructionCB);
|
||||
mReplicaManager->SetDownloadCompleteCB(&SendDownloadCompleteCB, &ReceiveDownloadCompleteCB);
|
||||
|
||||
mPeer->AttachPlugin(mReplicaManager);
|
||||
mPeer->SetNetworkIDManager(mNetIDManager);
|
||||
}
|
||||
}
|
||||
|
||||
dServer::~dServer() {
|
||||
Shutdown();
|
||||
}
|
||||
|
||||
Packet* dServer::ReceiveFromMaster() {
|
||||
if (!mMasterPeer) return nullptr;
|
||||
if (!mMasterConnectionActive) ConnectToMaster();
|
||||
|
||||
Packet* packet = mMasterPeer->Receive();
|
||||
if (packet) {
|
||||
if (packet->length < 1) { mMasterPeer->DeallocatePacket(packet); return nullptr; }
|
||||
|
||||
if (packet->data[0] == ID_DISCONNECTION_NOTIFICATION || packet->data[0] == ID_CONNECTION_LOST) {
|
||||
mLogger->Log("Server", "Lost our connection to master, shutting DOWN!\n");
|
||||
mMasterConnectionActive = false;
|
||||
//ConnectToMaster(); //We'll just shut down now
|
||||
}
|
||||
|
||||
if (packet->data[0] == ID_CONNECTION_REQUEST_ACCEPTED) {
|
||||
mLogger->Log("Server", "Established connection to master\n");
|
||||
mMasterConnectionActive = true;
|
||||
mMasterSystemAddress = packet->systemAddress;
|
||||
MasterPackets::SendServerInfo(this, packet);
|
||||
}
|
||||
|
||||
if (packet->data[0] == ID_USER_PACKET_ENUM) {
|
||||
if (packet->data[1] == MASTER) {
|
||||
switch (packet->data[3]) {
|
||||
case MSG_MASTER_REQUEST_ZONE_TRANSFER_RESPONSE: {
|
||||
uint64_t requestID = PacketUtils::ReadPacketU64(8, packet);
|
||||
ZoneInstanceManager::Instance()->HandleRequestZoneTransferResponse(requestID, packet);
|
||||
break;
|
||||
}
|
||||
|
||||
//When we handle these packets in World instead dServer, we just return the packet's pointer.
|
||||
case MSG_MASTER_REQUEST_PERSISTENT_ID_RESPONSE: {
|
||||
return packet;
|
||||
break;
|
||||
}
|
||||
|
||||
case MSG_MASTER_SESSION_KEY_RESPONSE: {
|
||||
return packet;
|
||||
break;
|
||||
}
|
||||
|
||||
case MSG_MASTER_SHUTDOWN : {
|
||||
return packet;
|
||||
break;
|
||||
}
|
||||
|
||||
case MSG_MASTER_AFFIRM_TRANSFER_REQUEST: {
|
||||
return packet;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
mLogger->Log("Server", "Unknown packet ID from master: %i\n", packet->data[3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mMasterPeer->DeallocatePacket(packet);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Packet* dServer::Receive() {
|
||||
return mPeer->Receive();
|
||||
}
|
||||
|
||||
void dServer::DeallocatePacket(Packet * packet) {
|
||||
mPeer->DeallocatePacket(packet);
|
||||
}
|
||||
|
||||
void dServer::DeallocateMasterPacket(Packet * packet) {
|
||||
mMasterPeer->DeallocatePacket(packet);
|
||||
}
|
||||
|
||||
void dServer::Send(RakNet::BitStream * bitStream, const SystemAddress & sysAddr, bool broadcast) {
|
||||
mPeer->Send(bitStream, SYSTEM_PRIORITY, RELIABLE_ORDERED, 0, sysAddr, broadcast);
|
||||
}
|
||||
|
||||
void dServer::SendToMaster(RakNet::BitStream* bitStream) {
|
||||
if (!mMasterConnectionActive) ConnectToMaster();
|
||||
mMasterPeer->Send(bitStream, SYSTEM_PRIORITY, RELIABLE_ORDERED, 0, mMasterSystemAddress, false);
|
||||
}
|
||||
|
||||
void dServer::Disconnect(const SystemAddress& sysAddr, uint32_t disconNotifyID) {
|
||||
RakNet::BitStream bitStream;
|
||||
PacketUtils::WriteHeader(bitStream, SERVER, MSG_SERVER_DISCONNECT_NOTIFY);
|
||||
bitStream.Write(disconNotifyID);
|
||||
mPeer->Send(&bitStream, SYSTEM_PRIORITY, RELIABLE_ORDERED, 0, sysAddr, false);
|
||||
|
||||
mPeer->CloseConnection(sysAddr, true);
|
||||
}
|
||||
|
||||
bool dServer::IsConnected(const SystemAddress& sysAddr) {
|
||||
return mPeer->IsConnected(sysAddr);
|
||||
}
|
||||
|
||||
bool dServer::Startup() {
|
||||
mSocketDescriptor = SocketDescriptor(uint16_t(mPort), 0);
|
||||
mPeer = RakNetworkFactory::GetRakPeerInterface();
|
||||
|
||||
if (!mPeer) return false;
|
||||
if (!mPeer->Startup(mMaxConnections, 10, &mSocketDescriptor, 1)) return false;
|
||||
|
||||
if (mIsInternal) {
|
||||
mPeer->SetIncomingPassword("3.25 DARKFLAME1", 15);
|
||||
}
|
||||
else {
|
||||
//mPeer->SetPerConnectionOutgoingBandwidthLimit(800000); //100Kb/s
|
||||
mPeer->SetIncomingPassword("3.25 ND1", 8);
|
||||
}
|
||||
|
||||
mPeer->SetMaximumIncomingConnections(mMaxConnections);
|
||||
if (mUseEncryption) mPeer->InitializeSecurity(NULL, NULL, NULL, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void dServer::Shutdown() {
|
||||
mPeer->Shutdown(1000);
|
||||
|
||||
if (mNetIDManager) {
|
||||
delete mNetIDManager;
|
||||
mNetIDManager = nullptr;
|
||||
}
|
||||
|
||||
if (mReplicaManager) {
|
||||
delete mReplicaManager;
|
||||
mReplicaManager = nullptr;
|
||||
}
|
||||
|
||||
//RakNetworkFactory::DestroyRakPeerInterface(mPeer); //Not needed, we already called Shutdown ourselves.
|
||||
if (mServerType != ServerType::Master) {
|
||||
mMasterPeer->Shutdown(1000);
|
||||
//RakNetworkFactory::DestroyRakPeerInterface(mMasterPeer);
|
||||
}
|
||||
}
|
||||
|
||||
void dServer::SetupForMasterConnection() {
|
||||
mMasterSocketDescriptor = SocketDescriptor(uint16_t(mPort + 1), 0);
|
||||
mMasterPeer = RakNetworkFactory::GetRakPeerInterface();
|
||||
mMasterPeer->Startup(1, 30, &mMasterSocketDescriptor, 1);
|
||||
}
|
||||
|
||||
bool dServer::ConnectToMaster() {
|
||||
return mMasterPeer->Connect(mMasterIP.c_str(), mMasterPort, "3.25 DARKFLAME1", 15);
|
||||
}
|
||||
|
||||
void dServer::UpdateReplica() {
|
||||
mReplicaManager->Update(mPeer);
|
||||
}
|
||||
|
||||
int dServer::GetPing(const SystemAddress& sysAddr) const
|
||||
{
|
||||
return mPeer->GetAveragePing(sysAddr);
|
||||
}
|
||||
|
||||
int dServer::GetLatestPing(const SystemAddress& sysAddr) const
|
||||
{
|
||||
return mPeer->GetLastPing(sysAddr);
|
||||
}
|
||||
79
dNet/dServer.h
Normal file
79
dNet/dServer.h
Normal file
@@ -0,0 +1,79 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include "RakPeerInterface.h"
|
||||
#include "ReplicaManager.h"
|
||||
#include "NetworkIDManager.h"
|
||||
|
||||
class dLogger;
|
||||
|
||||
enum class ServerType : uint32_t {
|
||||
Master,
|
||||
Auth,
|
||||
Chat,
|
||||
World
|
||||
};
|
||||
|
||||
class dServer {
|
||||
public:
|
||||
dServer(const std::string& ip, int port, int instanceID, int maxConnections, bool isInternal, bool useEncryption, dLogger* logger, const std::string masterIP, int masterPort, ServerType serverType, unsigned int zoneID = 0);
|
||||
~dServer();
|
||||
|
||||
Packet* ReceiveFromMaster();
|
||||
Packet* Receive();
|
||||
void DeallocatePacket(Packet* packet);
|
||||
void DeallocateMasterPacket(Packet* packet);
|
||||
void Send(RakNet::BitStream* bitStream, const SystemAddress& sysAddr, bool broadcast);
|
||||
void SendToMaster(RakNet::BitStream* bitStream);
|
||||
|
||||
void Disconnect(const SystemAddress& sysAddr, uint32_t disconNotifyID);
|
||||
|
||||
bool IsConnected(const SystemAddress& sysAddr);
|
||||
const std::string& GetIP() const { return mIP; }
|
||||
const int GetPort() const { return mPort; }
|
||||
const int GetMaxConnections() const { return mMaxConnections; }
|
||||
const bool GetIsEncrypted() const { return mUseEncryption; }
|
||||
const bool GetIsInternal() const { return mIsInternal; }
|
||||
const bool GetIsOkay() const { return mIsOkay; }
|
||||
dLogger* GetLogger() const { return mLogger; }
|
||||
const bool GetIsConnectedToMaster() const { return mMasterConnectionActive; }
|
||||
const unsigned int GetZoneID() const { return mZoneID; }
|
||||
const int GetInstanceID() const { return mInstanceID; }
|
||||
ReplicaManager* GetReplicaManager() { return mReplicaManager; }
|
||||
void UpdateReplica();
|
||||
|
||||
int GetPing(const SystemAddress& sysAddr) const;
|
||||
int GetLatestPing(const SystemAddress& sysAddr) const;
|
||||
|
||||
NetworkIDManager* GetNetworkIDManager() { return mNetIDManager; }
|
||||
|
||||
const ServerType GetServerType() const { return mServerType; }
|
||||
|
||||
private:
|
||||
bool Startup();
|
||||
void Shutdown();
|
||||
void SetupForMasterConnection();
|
||||
bool ConnectToMaster();
|
||||
|
||||
private:
|
||||
dLogger* mLogger;
|
||||
RakPeerInterface* mPeer;
|
||||
ReplicaManager* mReplicaManager;
|
||||
NetworkIDManager* mNetIDManager;
|
||||
SocketDescriptor mSocketDescriptor;
|
||||
std::string mIP;
|
||||
int mPort;
|
||||
int mMaxConnections;
|
||||
unsigned int mZoneID;
|
||||
int mInstanceID;
|
||||
bool mUseEncryption;
|
||||
bool mIsInternal;
|
||||
bool mIsOkay;
|
||||
bool mMasterConnectionActive;
|
||||
ServerType mServerType;
|
||||
|
||||
RakPeerInterface* mMasterPeer;
|
||||
SocketDescriptor mMasterSocketDescriptor;
|
||||
SystemAddress mMasterSystemAddress;
|
||||
std::string mMasterIP;
|
||||
int mMasterPort;
|
||||
};
|
||||
Reference in New Issue
Block a user