Compare commits

..

9 Commits

Author SHA1 Message Date
David Markowitz
33222d433b Merge branch 'seriously' into mail-fix 2025-04-02 00:57:46 -07:00
David Markowitz
6469147517 fix: mail claiming item
tested that I can claim an item without an error
2025-04-01 22:08:53 -07:00
David Markowitz
fd2a06ef51 specify up to 3.31 2025-04-01 21:45:15 -07:00
David Markowitz
8fc72ccf8a Update build-and-test.yml 2025-04-01 21:36:12 -07:00
David Markowitz
c7eea5643c Update build-and-test.yml 2025-04-01 21:32:27 -07:00
David Markowitz
56deead7c4 Update build-and-test.yml 2025-04-01 21:28:06 -07:00
David Markowitz
5209e57cc1 Update build-and-test.yml 2025-04-01 21:24:44 -07:00
David Markowitz
8c038d34b3 Update build-and-test.yml 2025-04-01 21:23:49 -07:00
David Markowitz
cdf3f5de6d Update build-and-test.yml 2025-04-01 21:22:00 -07:00
7 changed files with 63 additions and 90 deletions

View File

@@ -204,7 +204,6 @@ 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;
@@ -213,9 +212,6 @@ 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();
}

View File

@@ -512,7 +512,7 @@ void MissionComponent::LoadFromXml(const tinyxml2::XMLDocument& doc) {
auto* mission = new Mission(this, missionId);
mission->LoadFromXmlDone(*doneM);
mission->LoadFromXml(*doneM);
doneM = doneM->NextSiblingElement();
@@ -527,9 +527,9 @@ void MissionComponent::LoadFromXml(const tinyxml2::XMLDocument& doc) {
currentM->QueryAttribute("id", &missionId);
auto* mission = m_Missions.contains(missionId) ? m_Missions[missionId] : new Mission(this, missionId);
auto* mission = new Mission(this, missionId);
mission->LoadFromXmlCur(*currentM);
mission->LoadFromXml(*currentM);
if (currentM->QueryAttribute("o", &missionOrder) == tinyxml2::XML_SUCCESS && mission->IsMission()) {
mission->SetUniqueMissionOrderID(missionOrder);
@@ -565,23 +565,20 @@ void MissionComponent::UpdateXml(tinyxml2::XMLDocument& doc) {
auto* mission = pair.second;
if (mission) {
const auto completions = mission->GetCompletions();
const auto complete = mission->IsComplete();
auto* m = doc.NewElement("m");
if (completions > 0) {
mission->UpdateXmlDone(*m);
if (complete) {
mission->UpdateXml(*m);
done->LinkEndChild(m);
if (mission->IsComplete()) continue;
m = doc.NewElement("m");
continue;
}
if (mission->IsMission()) m->SetAttribute("o", mission->GetUniqueMissionOrderID());
mission->UpdateXmlCur(*m);
mission->UpdateXml(*m);
cur->LinkEndChild(m);
}

View File

@@ -65,7 +65,7 @@ Mission::Mission(MissionComponent* missionComponent, const uint32_t missionId) {
}
}
void Mission::LoadFromXmlDone(const tinyxml2::XMLElement& element) {
void Mission::LoadFromXml(const tinyxml2::XMLElement& element) {
// Start custom XML
if (element.Attribute("state") != nullptr) {
m_State = static_cast<eMissionState>(std::stoul(element.Attribute("state")));
@@ -76,15 +76,11 @@ void Mission::LoadFromXmlDone(const tinyxml2::XMLElement& element) {
m_Completions = std::stoul(element.Attribute("cct"));
m_Timestamp = std::stoul(element.Attribute("cts"));
}
}
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")));
if (IsComplete()) {
return;
}
}
// End custom XML
auto* task = element.FirstChildElement();
@@ -136,7 +132,7 @@ void Mission::LoadFromXmlCur(const tinyxml2::XMLElement& element) {
}
}
void Mission::UpdateXmlDone(tinyxml2::XMLElement& element) {
void Mission::UpdateXml(tinyxml2::XMLElement& element) {
// Start custom XML
element.SetAttribute("state", static_cast<unsigned int>(m_State));
// End custom XML
@@ -145,21 +141,15 @@ void Mission::UpdateXmlDone(tinyxml2::XMLElement& element) {
element.SetAttribute("id", static_cast<unsigned int>(info.id));
element.SetAttribute("cct", static_cast<unsigned int>(m_Completions));
if (m_Completions > 0) {
element.SetAttribute("cct", static_cast<unsigned int>(m_Completions));
element.SetAttribute("cts", static_cast<unsigned int>(m_Timestamp));
}
element.SetAttribute("cts", static_cast<unsigned int>(m_Timestamp));
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;
if (IsComplete()) {
return;
}
}
for (auto* task : m_Tasks) {
if (task->GetType() == eMissionTaskType::COLLECTION ||

View File

@@ -28,13 +28,8 @@ public:
Mission(MissionComponent* missionComponent, uint32_t missionId);
~Mission();
// 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);
void LoadFromXml(const tinyxml2::XMLElement& element);
void UpdateXml(tinyxml2::XMLElement& element);
/**
* Returns the ID of this mission

View File

@@ -273,16 +273,6 @@ 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);

View File

@@ -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,7 +125,6 @@ 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);

View File

@@ -42,7 +42,6 @@
#include "Server.h"
#include "CDZoneTableTable.h"
#include "eGameMasterLevel.h"
#include "StringifiedEnum.h"
#ifdef DARKFLAME_PLATFORM_UNIX
@@ -213,13 +212,6 @@ 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";
@@ -564,7 +556,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 %s", instance->GetMapID(), instance->GetCloneID(), instance->GetInstanceID(), instance == in, instance->GetSysAddr().ToString());
LOG("Instance: %i/%i/%i -> %i", instance->GetMapID(), instance->GetCloneID(), instance->GetInstanceID(), instance == in);
}
if (in && !in->GetIsReady()) //Instance not ready, make a pending request
@@ -605,10 +597,15 @@ void HandlePacket(Packet* packet) {
if (!Game::im->IsPortInUse(theirPort)) {
Instance* in = new Instance(theirIP.string, theirPort, theirZoneID, theirInstanceID, 0, 12, 12);
in->SetSysAddr(packet->systemAddress);
SystemAddress copy;
copy.binaryAddress = packet->systemAddress.binaryAddress;
copy.port = packet->systemAddress.port;
in->SetSysAddr(copy);
Game::im->AddInstance(in);
} else {
auto* instance = Game::im->FindInstanceWithPrivate(theirZoneID, static_cast<LWOINSTANCEID>(theirInstanceID));
auto instance = Game::im->FindInstance(
theirZoneID, static_cast<uint16_t>(theirInstanceID));
if (instance) {
instance->SetSysAddr(packet->systemAddress);
}
@@ -616,14 +613,22 @@ void HandlePacket(Packet* packet) {
}
if (theirServerType == ServerType::Chat) {
chatServerMasterPeerSysAddr = packet->systemAddress;
SystemAddress copy;
copy.binaryAddress = packet->systemAddress.binaryAddress;
copy.port = packet->systemAddress.port;
chatServerMasterPeerSysAddr = copy;
}
if (theirServerType == ServerType::Auth) {
authServerMasterPeerSysAddr = packet->systemAddress;
SystemAddress copy;
copy.binaryAddress = packet->systemAddress.binaryAddress;
copy.port = packet->systemAddress.port;
authServerMasterPeerSysAddr = copy;
}
LOG("Received %s server info, instance: %i port: %i", StringifiedEnum::ToString(theirServerType).data(), theirInstanceID, theirPort);
LOG("Received server info, instance: %i port: %i", theirInstanceID, theirPort);
break;
}
@@ -687,7 +692,7 @@ void HandlePacket(Packet* packet) {
if (instance) {
instance->AddPlayer(Player());
} else {
LOG("Instance missing? What?");
printf("Instance missing? What?");
}
break;
}
@@ -728,8 +733,8 @@ void HandlePacket(Packet* packet) {
inStream.Read<char>(character);
password += character;
}
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());
Game::im->CreatePrivateInstance(mapId, cloneId, password.c_str());
break;
}
@@ -830,10 +835,11 @@ void HandlePacket(Packet* packet) {
}
case MessageType::Master::SHUTDOWN_RESPONSE: {
CINSTREAM_SKIP_HEADER;
RakNet::BitStream inStream(packet->data, packet->length, false);
uint64_t header = inStream.Read(header);
auto* instance = Game::im->GetInstanceBySysAddr(packet->systemAddress);
LOG("Got shutdown response from %s", packet->systemAddress.ToString());
if (instance == nullptr) {
return;
}