mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2025-12-21 11:59:37 -06:00
Compare commits
6 Commits
mail-fix
...
migrations
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3669ac85d3 | ||
|
|
6b0f3a66e9 | ||
|
|
f5c212fb86 | ||
|
|
99f6cf2d92 | ||
|
|
bc0f3d9163 | ||
|
|
20d5a9b6d8 |
@@ -204,6 +204,7 @@ void Character::DoQuickXMLDataParse() {
|
||||
while (currentChild) {
|
||||
const auto* temp = currentChild->Attribute("v");
|
||||
const auto* id = currentChild->Attribute("id");
|
||||
const auto* si = currentChild->Attribute("si");
|
||||
if (temp && id) {
|
||||
uint32_t index = 0;
|
||||
uint64_t value = 0;
|
||||
@@ -212,6 +213,9 @@ void Character::DoQuickXMLDataParse() {
|
||||
value = std::stoull(temp);
|
||||
|
||||
m_PlayerFlags.insert(std::make_pair(index, value));
|
||||
} else if (si) {
|
||||
auto value = GeneralUtils::TryParse<uint32_t>(si);
|
||||
if (value) m_SessionFlags.insert(value.value());
|
||||
}
|
||||
currentChild = currentChild->NextSiblingElement();
|
||||
}
|
||||
|
||||
@@ -512,7 +512,7 @@ void MissionComponent::LoadFromXml(const tinyxml2::XMLDocument& doc) {
|
||||
|
||||
auto* mission = new Mission(this, missionId);
|
||||
|
||||
mission->LoadFromXml(*doneM);
|
||||
mission->LoadFromXmlDone(*doneM);
|
||||
|
||||
doneM = doneM->NextSiblingElement();
|
||||
|
||||
@@ -527,9 +527,9 @@ void MissionComponent::LoadFromXml(const tinyxml2::XMLDocument& doc) {
|
||||
|
||||
currentM->QueryAttribute("id", &missionId);
|
||||
|
||||
auto* mission = new Mission(this, missionId);
|
||||
auto* mission = m_Missions.contains(missionId) ? m_Missions[missionId] : new Mission(this, missionId);
|
||||
|
||||
mission->LoadFromXml(*currentM);
|
||||
mission->LoadFromXmlCur(*currentM);
|
||||
|
||||
if (currentM->QueryAttribute("o", &missionOrder) == tinyxml2::XML_SUCCESS && mission->IsMission()) {
|
||||
mission->SetUniqueMissionOrderID(missionOrder);
|
||||
@@ -565,20 +565,23 @@ void MissionComponent::UpdateXml(tinyxml2::XMLDocument& doc) {
|
||||
auto* mission = pair.second;
|
||||
|
||||
if (mission) {
|
||||
const auto complete = mission->IsComplete();
|
||||
const auto completions = mission->GetCompletions();
|
||||
|
||||
auto* m = doc.NewElement("m");
|
||||
|
||||
if (complete) {
|
||||
mission->UpdateXml(*m);
|
||||
if (completions > 0) {
|
||||
mission->UpdateXmlDone(*m);
|
||||
|
||||
done->LinkEndChild(m);
|
||||
|
||||
continue;
|
||||
if (mission->IsComplete()) continue;
|
||||
|
||||
m = doc.NewElement("m");
|
||||
}
|
||||
|
||||
if (mission->IsMission()) m->SetAttribute("o", mission->GetUniqueMissionOrderID());
|
||||
|
||||
mission->UpdateXml(*m);
|
||||
mission->UpdateXmlCur(*m);
|
||||
|
||||
cur->LinkEndChild(m);
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ Mission::Mission(MissionComponent* missionComponent, const uint32_t missionId) {
|
||||
}
|
||||
}
|
||||
|
||||
void Mission::LoadFromXml(const tinyxml2::XMLElement& element) {
|
||||
void Mission::LoadFromXmlDone(const tinyxml2::XMLElement& element) {
|
||||
// Start custom XML
|
||||
if (element.Attribute("state") != nullptr) {
|
||||
m_State = static_cast<eMissionState>(std::stoul(element.Attribute("state")));
|
||||
@@ -76,11 +76,15 @@ void Mission::LoadFromXml(const tinyxml2::XMLElement& element) {
|
||||
m_Completions = std::stoul(element.Attribute("cct"));
|
||||
|
||||
m_Timestamp = std::stoul(element.Attribute("cts"));
|
||||
}
|
||||
}
|
||||
|
||||
if (IsComplete()) {
|
||||
return;
|
||||
}
|
||||
void Mission::LoadFromXmlCur(const tinyxml2::XMLElement& element) {
|
||||
// Start custom XML
|
||||
if (element.Attribute("state") != nullptr) {
|
||||
m_State = static_cast<eMissionState>(std::stoul(element.Attribute("state")));
|
||||
}
|
||||
// End custom XML
|
||||
|
||||
auto* task = element.FirstChildElement();
|
||||
|
||||
@@ -132,7 +136,7 @@ void Mission::LoadFromXml(const tinyxml2::XMLElement& element) {
|
||||
}
|
||||
}
|
||||
|
||||
void Mission::UpdateXml(tinyxml2::XMLElement& element) {
|
||||
void Mission::UpdateXmlDone(tinyxml2::XMLElement& element) {
|
||||
// Start custom XML
|
||||
element.SetAttribute("state", static_cast<unsigned int>(m_State));
|
||||
// End custom XML
|
||||
@@ -141,15 +145,21 @@ void Mission::UpdateXml(tinyxml2::XMLElement& element) {
|
||||
|
||||
element.SetAttribute("id", static_cast<unsigned int>(info.id));
|
||||
|
||||
if (m_Completions > 0) {
|
||||
element.SetAttribute("cct", static_cast<unsigned int>(m_Completions));
|
||||
|
||||
element.SetAttribute("cts", static_cast<unsigned int>(m_Timestamp));
|
||||
}
|
||||
|
||||
if (IsComplete()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
void Mission::UpdateXmlCur(tinyxml2::XMLElement& element) {
|
||||
// Start custom XML
|
||||
element.SetAttribute("state", static_cast<unsigned int>(m_State));
|
||||
// End custom XML
|
||||
|
||||
element.DeleteChildren();
|
||||
|
||||
element.SetAttribute("id", static_cast<unsigned int>(info.id));
|
||||
|
||||
if (IsComplete()) return;
|
||||
|
||||
for (auto* task : m_Tasks) {
|
||||
if (task->GetType() == eMissionTaskType::COLLECTION ||
|
||||
|
||||
@@ -28,8 +28,13 @@ public:
|
||||
Mission(MissionComponent* missionComponent, uint32_t missionId);
|
||||
~Mission();
|
||||
|
||||
void LoadFromXml(const tinyxml2::XMLElement& element);
|
||||
void UpdateXml(tinyxml2::XMLElement& element);
|
||||
// XML functions to load and save completed mission state to xml
|
||||
void LoadFromXmlDone(const tinyxml2::XMLElement& element);
|
||||
void UpdateXmlDone(tinyxml2::XMLElement& element);
|
||||
|
||||
// XML functions to load and save current mission state and task data to xml
|
||||
void LoadFromXmlCur(const tinyxml2::XMLElement& element);
|
||||
void UpdateXmlCur(tinyxml2::XMLElement& element);
|
||||
|
||||
/**
|
||||
* Returns the ID of this mission
|
||||
|
||||
@@ -273,6 +273,16 @@ Instance* InstanceManager::FindInstance(LWOMAPID mapID, LWOINSTANCEID instanceID
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Instance* InstanceManager::FindInstanceWithPrivate(LWOMAPID mapID, LWOINSTANCEID instanceID) {
|
||||
for (Instance* i : m_Instances) {
|
||||
if (i && i->GetMapID() == mapID && i->GetInstanceID() == instanceID && !i->GetShutdownComplete() && !i->GetIsShuttingDown()) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Instance* InstanceManager::CreatePrivateInstance(LWOMAPID mapID, LWOCLONEID cloneID, const std::string& password) {
|
||||
auto* instance = FindPrivateInstance(password);
|
||||
|
||||
|
||||
@@ -76,25 +76,25 @@ public:
|
||||
void Shutdown();
|
||||
|
||||
private:
|
||||
std::string m_IP;
|
||||
uint32_t m_Port;
|
||||
LWOZONEID m_ZoneID;
|
||||
int m_MaxClientsSoftCap;
|
||||
int m_MaxClientsHardCap;
|
||||
int m_CurrentClientCount;
|
||||
std::vector<Player> m_Players;
|
||||
SystemAddress m_SysAddr;
|
||||
bool m_Ready;
|
||||
bool m_IsShuttingDown;
|
||||
std::vector<PendingInstanceRequest> m_PendingRequests;
|
||||
std::vector<PendingInstanceRequest> m_PendingAffirmations;
|
||||
std::string m_IP{};
|
||||
uint32_t m_Port{};
|
||||
LWOZONEID m_ZoneID{};
|
||||
int m_MaxClientsSoftCap{};
|
||||
int m_MaxClientsHardCap{};
|
||||
int m_CurrentClientCount{};
|
||||
std::vector<Player> m_Players{};
|
||||
SystemAddress m_SysAddr{};
|
||||
bool m_Ready{};
|
||||
bool m_IsShuttingDown{};
|
||||
std::vector<PendingInstanceRequest> m_PendingRequests{};
|
||||
std::vector<PendingInstanceRequest> m_PendingAffirmations{};
|
||||
|
||||
uint32_t m_AffirmationTimeout;
|
||||
uint32_t m_AffirmationTimeout{};
|
||||
|
||||
bool m_IsPrivate;
|
||||
std::string m_Password;
|
||||
bool m_IsPrivate{};
|
||||
std::string m_Password{};
|
||||
|
||||
bool m_Shutdown;
|
||||
bool m_Shutdown{};
|
||||
|
||||
//Private functions:
|
||||
};
|
||||
@@ -125,6 +125,7 @@ public:
|
||||
|
||||
Instance* FindInstance(LWOMAPID mapID, bool isFriendTransfer, LWOCLONEID cloneId = 0);
|
||||
Instance* FindInstance(LWOMAPID mapID, LWOINSTANCEID instanceID);
|
||||
Instance* FindInstanceWithPrivate(LWOMAPID mapID, LWOINSTANCEID instanceID);
|
||||
|
||||
Instance* CreatePrivateInstance(LWOMAPID mapID, LWOCLONEID cloneID, const std::string& password);
|
||||
Instance* FindPrivateInstance(const std::string& password);
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
#include "Server.h"
|
||||
#include "CDZoneTableTable.h"
|
||||
#include "eGameMasterLevel.h"
|
||||
#include "StringifiedEnum.h"
|
||||
|
||||
#ifdef DARKFLAME_PLATFORM_UNIX
|
||||
|
||||
@@ -212,6 +213,13 @@ int main(int argc, char** argv) {
|
||||
// Run migrations should any need to be run.
|
||||
MigrationRunner::RunSQLiteMigrations();
|
||||
|
||||
// Check for the --migrations-only flag
|
||||
if ((argc > 1 &&
|
||||
(strcmp(argv[1], "--migrations-only") == 0 || strcmp(argv[1], "-m") == 0))) {
|
||||
LOG("Migrations only flag detected. Exiting.");
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
//If the first command line argument is -a or --account then make the user
|
||||
//input a username and password, with the password being hidden.
|
||||
bool createAccount = Database::Get()->GetAccountCount() == 0 && Game::config->GetValue("skip_account_creation") != "1";
|
||||
@@ -556,7 +564,7 @@ void HandlePacket(Packet* packet) {
|
||||
Instance* in = Game::im->GetInstance(zoneID, false, zoneClone);
|
||||
|
||||
for (auto* instance : Game::im->GetInstances()) {
|
||||
LOG("Instance: %i/%i/%i -> %i", instance->GetMapID(), instance->GetCloneID(), instance->GetInstanceID(), instance == in);
|
||||
LOG("Instance: %i/%i/%i -> %i %s", instance->GetMapID(), instance->GetCloneID(), instance->GetInstanceID(), instance == in, instance->GetSysAddr().ToString());
|
||||
}
|
||||
|
||||
if (in && !in->GetIsReady()) //Instance not ready, make a pending request
|
||||
@@ -597,15 +605,10 @@ void HandlePacket(Packet* packet) {
|
||||
if (!Game::im->IsPortInUse(theirPort)) {
|
||||
Instance* in = new Instance(theirIP.string, theirPort, theirZoneID, theirInstanceID, 0, 12, 12);
|
||||
|
||||
SystemAddress copy;
|
||||
copy.binaryAddress = packet->systemAddress.binaryAddress;
|
||||
copy.port = packet->systemAddress.port;
|
||||
|
||||
in->SetSysAddr(copy);
|
||||
in->SetSysAddr(packet->systemAddress);
|
||||
Game::im->AddInstance(in);
|
||||
} else {
|
||||
auto instance = Game::im->FindInstance(
|
||||
theirZoneID, static_cast<uint16_t>(theirInstanceID));
|
||||
auto* instance = Game::im->FindInstanceWithPrivate(theirZoneID, static_cast<LWOINSTANCEID>(theirInstanceID));
|
||||
if (instance) {
|
||||
instance->SetSysAddr(packet->systemAddress);
|
||||
}
|
||||
@@ -613,22 +616,14 @@ void HandlePacket(Packet* packet) {
|
||||
}
|
||||
|
||||
if (theirServerType == ServerType::Chat) {
|
||||
SystemAddress copy;
|
||||
copy.binaryAddress = packet->systemAddress.binaryAddress;
|
||||
copy.port = packet->systemAddress.port;
|
||||
|
||||
chatServerMasterPeerSysAddr = copy;
|
||||
chatServerMasterPeerSysAddr = packet->systemAddress;
|
||||
}
|
||||
|
||||
if (theirServerType == ServerType::Auth) {
|
||||
SystemAddress copy;
|
||||
copy.binaryAddress = packet->systemAddress.binaryAddress;
|
||||
copy.port = packet->systemAddress.port;
|
||||
|
||||
authServerMasterPeerSysAddr = copy;
|
||||
authServerMasterPeerSysAddr = packet->systemAddress;
|
||||
}
|
||||
|
||||
LOG("Received server info, instance: %i port: %i", theirInstanceID, theirPort);
|
||||
LOG("Received %s server info, instance: %i port: %i", StringifiedEnum::ToString(theirServerType).data(), theirInstanceID, theirPort);
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -692,7 +687,7 @@ void HandlePacket(Packet* packet) {
|
||||
if (instance) {
|
||||
instance->AddPlayer(Player());
|
||||
} else {
|
||||
printf("Instance missing? What?");
|
||||
LOG("Instance missing? What?");
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -733,8 +728,8 @@ void HandlePacket(Packet* packet) {
|
||||
inStream.Read<char>(character);
|
||||
password += character;
|
||||
}
|
||||
|
||||
Game::im->CreatePrivateInstance(mapId, cloneId, password.c_str());
|
||||
auto* newInst = Game::im->CreatePrivateInstance(mapId, cloneId, password.c_str());
|
||||
LOG("Creating private zone %i/%i/%i with password %s", newInst->GetMapID(), newInst->GetCloneID(), newInst->GetInstanceID(), password.c_str());
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -835,11 +830,10 @@ void HandlePacket(Packet* packet) {
|
||||
}
|
||||
|
||||
case MessageType::Master::SHUTDOWN_RESPONSE: {
|
||||
RakNet::BitStream inStream(packet->data, packet->length, false);
|
||||
uint64_t header = inStream.Read(header);
|
||||
CINSTREAM_SKIP_HEADER;
|
||||
|
||||
auto* instance = Game::im->GetInstanceBySysAddr(packet->systemAddress);
|
||||
|
||||
LOG("Got shutdown response from %s", packet->systemAddress.ToString());
|
||||
if (instance == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user