diff --git a/engine/server/library/serverGame/src/shared/object/ServerObject.cpp b/engine/server/library/serverGame/src/shared/object/ServerObject.cpp index 78839fcf..598f2e1f 100755 --- a/engine/server/library/serverGame/src/shared/object/ServerObject.cpp +++ b/engine/server/library/serverGame/src/shared/object/ServerObject.cpp @@ -272,6 +272,10 @@ namespace ServerObjectNamespace std::set s_noTradeSharedTemplateItemType; std::set s_noTradeSharedStaticItemType; + // list of object types that supports no trade "removable" behavior + std::set s_noTradeRemovableTemplateItemType; + std::set 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(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()) diff --git a/engine/server/library/serverGame/src/shared/object/ServerObject.h b/engine/server/library/serverGame/src/shared/object/ServerObject.h index c0c320bd..23e12f28 100755 --- a/engine/server/library/serverGame/src/shared/object/ServerObject.h +++ b/engine/server/library/serverGame/src/shared/object/ServerObject.h @@ -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 (); diff --git a/engine/server/library/serverGame/src/shared/object/TangibleObject.cpp b/engine/server/library/serverGame/src/shared/object/TangibleObject.cpp index 34d2ce8b..a5a80da8 100755 --- a/engine/server/library/serverGame/src/shared/object/TangibleObject.cpp +++ b/engine/server/library/serverGame/src/shared/object/TangibleObject.cpp @@ -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)); diff --git a/engine/shared/library/sharedGame/src/shared/core/SharedObjectAttributes.h b/engine/shared/library/sharedGame/src/shared/core/SharedObjectAttributes.h index 04f7b531..74fe6ba3 100755 --- a/engine/shared/library/sharedGame/src/shared/core/SharedObjectAttributes.h +++ b/engine/shared/library/sharedGame/src/shared/core/SharedObjectAttributes.h @@ -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);