[Feature] Add Lore Item Trade Error (#3932)

* DRAFT: [Feature] Add Lore Item Trade Error

I had lots of feedback from players to add feedback when doing player to player trades to include what items were causing the trade block.

I quickly added this check, however if multiple lore items are being traded, this will only output the first. So far it has worked well, but not sure if we want to:

- Expand this to list all lore items in the trade.
- Enable this by default and do not provide a rule?

* Credit to @KinglyKrab for the assist on making this output a list.

Ruled this off but enabled by default.
This commit is contained in:
Fryguy 2024-01-13 00:43:57 -05:00 committed by GitHub
parent 1bb8678abe
commit 1d7f39c13b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 10 deletions

View File

@ -219,6 +219,7 @@ RULE_BOOL(Character, UseForageCommonFood, true, "If enabled, use the common food
RULE_INT(Character, ClearXTargetDelay, 10, "Seconds between uses of the #clearxtargets command (Set to 0 to disable)")
RULE_BOOL(Character, PreventMountsFromZoning, false, "Enable to prevent mounts from zoning - Prior to December 15, 2004 this is enabled.")
RULE_BOOL(Character, GroupInvitesRequireTarget, false, "Enable to require players to have invitee on target (Disables /invite name) - Classic Style")
RULE_BOOL(Character, PlayerTradingLoreFeedback, true, "If enabled, during a player to player trade, if lore items exist, it will output which items.")
RULE_CATEGORY_END()
RULE_CATEGORY(Mercs)

View File

@ -907,28 +907,53 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st
bool Client::CheckTradeLoreConflict(Client* other)
{
if (!other)
if (!other) {
return true;
}
bool has_lore_item = false;
std::vector<uint32> lore_item_ids;
for (int16 index = EQ::invslot::TRADE_BEGIN; index <= EQ::invslot::TRADE_END; ++index) {
const EQ::ItemInstance* inst = m_inv[index];
if (!inst || !inst->GetItem())
const auto inst = m_inv[index];
if (!inst || !inst->GetItem()) {
continue;
}
if (other->CheckLoreConflict(inst->GetItem()))
return true;
if (other->CheckLoreConflict(inst->GetItem())) {
lore_item_ids.emplace_back(inst->GetItem()->ID);
has_lore_item = true;
}
}
for (int16 index = EQ::invbag::TRADE_BAGS_BEGIN; index <= EQ::invbag::TRADE_BAGS_END; ++index) {
const EQ::ItemInstance* inst = m_inv[index];
if (!inst || !inst->GetItem())
const auto inst = m_inv[index];
if (!inst || !inst->GetItem()) {
continue;
}
if (other->CheckLoreConflict(inst->GetItem()))
return true;
if (other->CheckLoreConflict(inst->GetItem())) {
lore_item_ids.emplace_back(inst->GetItem()->ID);
has_lore_item = true;
}
}
return false;
if (has_lore_item && RuleB(Character, PlayerTradingLoreFeedback)) {
for (const uint32 lore_item_id : lore_item_ids) {
Message(
Chat::Red,
fmt::format(
"{} already has a lore {} in their inventory.",
other->GetCleanName(),
database.CreateItemLink(lore_item_id)
).c_str()
);
}
}
return has_lore_item;
}
bool Client::CheckTradeNonDroppable()