GU 16.9 - No Trade Removable

This commit is contained in:
Geit
2020-09-21 14:37:05 -04:00
parent a66c0d1a91
commit 49032118c3
4 changed files with 62 additions and 5 deletions
@@ -272,6 +272,10 @@ namespace ServerObjectNamespace
std::set<uint32> s_noTradeSharedTemplateItemType;
std::set<std::string> s_noTradeSharedStaticItemType;
// list of object types that supports no trade "removable" behavior
std::set<uint32> s_noTradeRemovableTemplateItemType;
std::set<std::string> s_noTradeRemovableStaticItemType;
// ----------------------------------------------------------------------
void sendDeleteToDatabase(const ServerObject& obj, int reason)
@@ -998,17 +1002,17 @@ void ServerObject::install()
// (no trade item of those types can be picked up by another character
// on the same account as the character who currently owns the item)
char const * const noTradeSharedDataTableName = "datatables/no_trade/no_trade_shared.iff";
DataTable * table = DataTableManager::getTable(noTradeSharedDataTableName, true);
if (table)
DataTable *noTradeSharedTable = DataTableManager::getTable(noTradeSharedDataTableName, true);
if (noTradeSharedTable)
{
int const columnObjectTemplate = table->findColumnNumber("Object Template");
int const columnObjectTemplate = noTradeSharedTable->findColumnNumber("Object Template");
if (columnObjectTemplate >= 0)
{
std::string objectTemplate;
for (int i = 0, numRows = table->getNumRows(); i < numRows; ++i)
for (int i = 0, numRows = noTradeSharedTable->getNumRows(); i < numRows; ++i)
{
objectTemplate = table->getStringValue(columnObjectTemplate, i);
objectTemplate = noTradeSharedTable->getStringValue(columnObjectTemplate, i);
if (objectTemplate.empty())
continue;
@@ -1022,6 +1026,31 @@ void ServerObject::install()
DataTableManager::close(noTradeSharedDataTableName);
}
char const *const noTradeRemovableDataTableName = "datatables/no_trade/no_trade_removable.iff";
DataTable *noTradeRemovableTable = DataTableManager::getTable(noTradeRemovableDataTableName, true);
if (noTradeRemovableTable)
{
int const columnObjectTemplate = noTradeRemovableTable->findColumnNumber("Object Template");
if (columnObjectTemplate >= 0)
{
std::string objectTemplate;
for (int i = 0, numRows = noTradeRemovableTable->getNumRows(); i < numRows; ++i)
{
objectTemplate = noTradeRemovableTable->getStringValue(columnObjectTemplate, i);
if (objectTemplate.empty())
continue;
if (objectTemplate.find(".iff") != std::string::npos)
s_noTradeRemovableTemplateItemType.insert(CrcLowerString::calculateCrc(objectTemplate.c_str()));
else
s_noTradeRemovableStaticItemType.insert(objectTemplate);
}
}
DataTableManager::close(noTradeSharedDataTableName);
}
ExitChain::add(ServerObjectNamespace::remove, "ServerObjectNamespace::remove");
}
@@ -1483,6 +1512,19 @@ bool ServerObject::markedNoTradeShared(bool includeCheckForNoTrade) const
//-----------------------------------------------------------------------
bool ServerObject::markedNoTradeRemovable() const
{
if (!markedNoTrade())
return false;
if (m_staticItemName.get().empty())
return (s_noTradeRemovableTemplateItemType.count(getTemplateCrc()) > 0);
return (s_noTradeRemovableStaticItemType.count(m_staticItemName.get()) > 0);
}
//-----------------------------------------------------------------------
bool ServerObject::isInSecureTrade() const
{
const ServerObject *parent = safe_cast<const ServerObject*>(ContainerInterface::getFirstParentInWorld(*this));
@@ -1921,6 +1963,9 @@ void ServerObject::serverObjectEndBaselines(bool fromDatabase)
// If the object was created authoritative, trigger if needed
if (isAuthoritative())
triggerMadeAuthoritative();
if (markedNoTradeRemovable())
getScriptObject()->attachScript("item.special.no_trade_removable", true);
}
if (isPlayerControlled())
@@ -230,6 +230,7 @@ public:
virtual bool markedNoTrade () const;
virtual bool markedNoTradeRecursive (bool testPlayers, bool testOnlyContainedItems = false) const;
virtual bool markedNoTradeShared (bool includeCheckForNoTrade) const;
virtual bool markedNoTradeRemovable () const;
virtual bool isInBazaarOrVendor () const;
virtual bool isInSecureTrade () const;
virtual void removeAllAuctions ();
@@ -4919,6 +4919,11 @@ void TangibleObject::getAttributes(AttributeVector & data) const
{
data.push_back(std::make_pair(SharedObjectAttributes::no_trade, Unicode::emptyString));
if (markedNoTradeRemovable())
{
data.push_back(std::make_pair(SharedObjectAttributes::no_trade_removable, Unicode::emptyString));
}
if (markedNoTradeShared(true))
{
data.push_back(std::make_pair(SharedObjectAttributes::no_trade_shared, Unicode::emptyString));
@@ -4931,6 +4936,11 @@ void TangibleObject::getAttributes(AttributeVector & data) const
{
data.push_back(std::make_pair(SharedObjectAttributes::no_trade, Unicode::emptyString));
if (markedNoTradeRemovable())
{
data.push_back(std::make_pair(SharedObjectAttributes::no_trade_removable, Unicode::emptyString));
}
if (markedNoTradeShared(false))
{
data.push_back(std::make_pair(SharedObjectAttributes::no_trade_shared, Unicode::emptyString));
@@ -95,6 +95,7 @@ namespace SharedObjectAttributes
MAKE_ATTRIB (bio_link);
MAKE_ATTRIB (no_trade);
MAKE_ATTRIB (no_trade_shared);
MAKE_ATTRIB (no_trade_removable);
MAKE_ATTRIB (unique);