Skip to content

Commit

Permalink
Document what needs to be done
Browse files Browse the repository at this point in the history
May not do the recursive restriction cause they aren't used in the live game
  • Loading branch information
aronwk-aaron committed Jun 7, 2024
1 parent 5ba37ff commit 3cfbc9d
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
#include "CDDeletionRestrictionsTable.h"
#include "GeneralUtils.h"
#include "eDeletionRestrictionsCheckType.h"

CDDeletionRestriction CDDeletionRestrictionsTable::Default = {
.id = 0,
.restricted = false,
.ids = {},
.checkType = eDeletionRestrictionsCheckType::MAX
};

//! Constructor
void CDDeletionRestrictionsTable::LoadValuesFromDatabase() {

// First, get the size of the table
uint32_t size = 0;
auto tableSize = CDClientDatabase::ExecuteQuery("SELECT COUNT(*) FROM CurrencyTable");
while (!tableSize.eof()) {
Expand All @@ -15,14 +21,11 @@ void CDDeletionRestrictionsTable::LoadValuesFromDatabase() {

tableSize.finalize();

// Reserve the size
auto& entries = GetEntriesMutable();
entries.reserve(size);

// Now get the data
auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM DeletionRestrictions");
while (!tableData.eof()) {
CDDeletionRestrictions entry;
CDDeletionRestriction entry;
entry.id = tableData.getIntField("id", -1);
if (entry.id == -1) continue;
entry.restricted = tableData.getIntField("restricted", -1);
Expand All @@ -37,17 +40,18 @@ void CDDeletionRestrictionsTable::LoadValuesFromDatabase() {
}
entry.checkType = static_cast<eDeletionRestrictionsCheckType>(tableData.getIntField("checkType", 6)); // MAX

entries.push_back(entry);
entries.insert(std::make_pair(entry.id, entry));
tableData.nextRow();
}

tableData.finalize();
}

std::vector<CDDeletionRestrictions> CDDeletionRestrictionsTable::Query(std::function<bool(CDDeletionRestrictions)> predicate) {
std::vector<CDDeletionRestrictions> data = cpplinq::from(GetEntries())
>> cpplinq::where(predicate)
>> cpplinq::to_vector();

return data;
const CDDeletionRestriction& CDDeletionRestrictionsTable::GetByID(uint32_t id) {
auto& entries = GetEntries();
const auto& it = entries.find(id);
if (it != entries.end()) {
return it->second;
}
return Default;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,17 @@

enum class eDeletionRestrictionsCheckType : uint32_t;

struct CDDeletionRestrictions {
struct CDDeletionRestriction {
uint32_t id;
bool restricted;
std::vector<uint32_t> ids;
eDeletionRestrictionsCheckType checkType;
};

class CDDeletionRestrictionsTable : public CDTable<CDDeletionRestrictionsTable, std::vector<CDDeletionRestrictions>> {
class CDDeletionRestrictionsTable : public CDTable<CDDeletionRestrictionsTable, std::map<uint32_t, CDDeletionRestriction>> {
public:
void LoadValuesFromDatabase();
std::vector<CDDeletionRestrictions> Query(std::function<bool(CDDeletionRestrictions)> predicate);
const CDDeletionRestriction& GetByID(uint32_t id);

static CDDeletionRestriction Default;
};
42 changes: 42 additions & 0 deletions dGame/dInventory/Item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,13 @@
#include "eUseItemResponse.h"
#include "dZoneManager.h"
#include "ChatPackets.h"
#include "eDeletionRestrictionsCheckType.h"

#include "CDBrickIDTableTable.h"
#include "CDObjectSkillsTable.h"
#include "CDComponentsRegistryTable.h"
#include "CDPackageComponentTable.h"
#include "CDDeletionRestrictionsTable.h"

namespace {
const std::map<std::string, std::string> ExtraSettingAbbreviations = {
Expand Down Expand Up @@ -568,3 +570,43 @@ void Item::LoadConfigXml(const tinyxml2::XMLElement& i) {
config.push_back(LDFBaseData::DataFromString(value));
}
}

bool Item::CanDeleteItem(Item* item) {
if (!item) return false;
// TODO:
// Check if item is being possessed
// Check if the owner is mounting item? (how is this different than the above)
// Allow GM 9 to freely delete
// Finally, check Deletion Restriction
const auto& itemComponent = item->inventory->FindItemComponent(item->lot);
if (itemComponent.delResIndex == -1) return true;
return CheckDeletionRestriction(itemComponent.delResIndex, item->lot);
}

bool Item::CheckDeletionRestriction(uint32_t delResIndex, LOT item) {
auto* delresTable = CDClientManager::GetTable<CDDeletionRestrictionsTable>();
const auto restriction = delresTable->GetByID(delResIndex);

switch(restriction.checkType) {
case eDeletionRestrictionsCheckType::INCLUDE_LOTS:
if (std::ranges::find(restriction.ids, item) != restriction.ids.end()) return false;
else return true;
case eDeletionRestrictionsCheckType::EXCLUDE_LOTS:
if (std::ranges::find(restriction.ids, item) != restriction.ids.end()) return true;
else return false;
case eDeletionRestrictionsCheckType::ANY_OF_THESE:
// TODO: Implement
return true;
case eDeletionRestrictionsCheckType::ALL_OF_THESE:
// TODO: Implement
return true;
case eDeletionRestrictionsCheckType::WHILE_IN_ZONE:
if (std::ranges::find(restriction.ids, Game::zoneManager->GetZoneID().GetMapID()) != restriction.ids.end()) return false;
else return true;
case eDeletionRestrictionsCheckType::ALWAYS_RESTRICTED:
return false;
case eDeletionRestrictionsCheckType::MAX:
default:
return true;
}
}
7 changes: 7 additions & 0 deletions dGame/dInventory/Item.h
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,13 @@ class Item final

void LoadConfigXml(const tinyxml2::XMLElement& i);

bool CanDeleteItem(Item* item);

bool CheckDeletionRestriction(uint32_t delResIndex, LOT item);

bool CheckDeletionRestrictionRecursion(std::set<uint32_t>& delResIndexs, uint32_t delResIndex);


private:
/**
* The object ID of this item
Expand Down

0 comments on commit 3cfbc9d

Please sign in to comment.