mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-17 03:08:26 +00:00
[Tasks] Remove delivered task items from trades (#2405)
This commit is contained in:
+32
-30
@@ -880,20 +880,36 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st
|
||||
quest_npc = true;
|
||||
}
|
||||
|
||||
std::vector<std::any> item_list;
|
||||
std::list<EQ::ItemInstance*> items;
|
||||
// take ownership of all trade slot items
|
||||
EQ::ItemInstance* insts[4] = { 0 };
|
||||
for (int i = EQ::invslot::TRADE_BEGIN; i <= EQ::invslot::TRADE_NPC_END; ++i) {
|
||||
EQ::ItemInstance *inst = m_inv.GetItem(i);
|
||||
if(inst) {
|
||||
items.push_back(inst);
|
||||
item_list.push_back(inst);
|
||||
} else {
|
||||
item_list.push_back((EQ::ItemInstance*)nullptr);
|
||||
continue;
|
||||
}
|
||||
insts[i - EQ::invslot::TRADE_BEGIN] = m_inv.PopItem(i);
|
||||
database.SaveInventory(CharacterID(), nullptr, i);
|
||||
}
|
||||
|
||||
// copy to be filtered by task updates, null trade slots preserved for quest event arg
|
||||
std::vector<EQ::ItemInstance*> items(insts, insts + std::size(insts));
|
||||
|
||||
if (RuleB(TaskSystem, EnableTaskSystem)) {
|
||||
if (UpdateTasksOnDeliver(items, *trade, tradingWith->CastToNPC())) {
|
||||
if (!tradingWith->IsMoving())
|
||||
tradingWith->FaceTarget(this);
|
||||
|
||||
EVENT_ITEM_ScriptStopReturn();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// todo: rule or npc field to auto return normal items also
|
||||
if (!quest_npc)
|
||||
{
|
||||
for (const EQ::ItemInstance* inst : items) {
|
||||
if (!inst || !inst->GetItem()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const EQ::ItemData* item = inst->GetItem();
|
||||
|
||||
const EQ::ItemData* item = inst->GetItem();
|
||||
if(item && quest_npc == false) {
|
||||
bool isPetAndCanHaveNoDrop = (RuleB(Pets, CanTakeNoDrop) &&
|
||||
_CLIENTPET(tradingWith) &&
|
||||
tradingWith->GetPetType()<=petOther);
|
||||
@@ -920,6 +936,7 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st
|
||||
);
|
||||
}
|
||||
else if (RuleB(NPC, ReturnNonQuestNoDropItems)) {
|
||||
tradingWith->SayString(TRADE_BACK, GetCleanName());
|
||||
PushItemOnCursor(*baginst, true);
|
||||
}
|
||||
}
|
||||
@@ -939,23 +956,12 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st
|
||||
}
|
||||
// Return NO DROP and Attuned items being handed into a non-quest NPC if the rule is true
|
||||
else if (RuleB(NPC, ReturnNonQuestNoDropItems)) {
|
||||
tradingWith->SayString(TRADE_BACK, GetCleanName());
|
||||
PushItemOnCursor(*inst, true);
|
||||
DeleteItemInInventory(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(RuleB(TaskSystem, EnableTaskSystem)) {
|
||||
int Cash = trade->cp + (trade->sp * 10) + (trade->gp * 100) + (trade->pp * 1000);
|
||||
if (UpdateTasksOnDeliver(items, Cash, tradingWith->CastToNPC())) {
|
||||
if(!tradingWith->IsMoving())
|
||||
tradingWith->FaceTarget(this);
|
||||
|
||||
EVENT_ITEM_ScriptStopReturn();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
char temp1[100] = { 0 };
|
||||
char temp2[100] = { 0 };
|
||||
snprintf(temp1, 100, "copper.%d", tradingWith->GetNPCTypeID());
|
||||
@@ -975,12 +981,8 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st
|
||||
tradingWith->FaceTarget(this);
|
||||
}
|
||||
|
||||
EQ::ItemInstance *insts[4] = { 0 };
|
||||
for (int i = EQ::invslot::TRADE_BEGIN; i <= EQ::invslot::TRADE_NPC_END; ++i) {
|
||||
insts[i - EQ::invslot::TRADE_BEGIN] = m_inv.PopItem(i);
|
||||
database.SaveInventory(CharacterID(), nullptr, i);
|
||||
}
|
||||
|
||||
// quest items are filtered by task deliver updates
|
||||
std::vector<std::any> item_list(items.begin(), items.end());
|
||||
parse->EventNPC(EVENT_TRADE, tradingWith->CastToNPC(), this, "", 0, &item_list);
|
||||
|
||||
for(int i = 0; i < 4; ++i) {
|
||||
|
||||
Reference in New Issue
Block a user