From 3c7a6b9b3e1f113519429870b83374b52854ba43 Mon Sep 17 00:00:00 2001 From: Asdow <20314541+Asdow@users.noreply.github.com> Date: Sun, 15 Jan 2023 22:34:03 +0200 Subject: [PATCH] Add possibility to match against helmet attachments --- Tactical/LogicalBodyTypes/Filter.cpp | 27 ++++++++++++++++++++++++++ Tactical/LogicalBodyTypes/Filter.h | 6 +++++- Tactical/LogicalBodyTypes/FilterDB.cpp | 8 ++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Tactical/LogicalBodyTypes/Filter.cpp b/Tactical/LogicalBodyTypes/Filter.cpp index 1c303a03c..519289c56 100644 --- a/Tactical/LogicalBodyTypes/Filter.cpp +++ b/Tactical/LogicalBodyTypes/Filter.cpp @@ -2,6 +2,21 @@ namespace LogicalBodyTypes { +INT32 CompareAttachment(SOLDIERTYPE* pSoldier, INVENTORY_SLOT slot, UINT8 index) +{ + INT32 cmp_val = 0; + + if (pSoldier->inv[slot].objectStack.size() > 0) + { + OBJECTTYPE* const attachment = pSoldier->inv[slot].objectStack.front().GetAttachmentAtIndex(index); + if (attachment) { cmp_val = attachment->usItem; } + else { cmp_val = 0; } + } + else { cmp_val = 0; } + + return cmp_val; +} + Filter::Filter(void) { } @@ -210,6 +225,18 @@ bool Filter::Match(SOLDIERTYPE* pSoldier) { case REQ_WEARING_BACKPACK: cmp_val = pSoldier->inv[BPACKPOCKPOS].exists(); break; + case REQ_HELMETPOSATTACHMENT0: + cmp_val = CompareAttachment(pSoldier, HELMETPOS, 0); + break; + case REQ_HELMETPOSATTACHMENT1: + cmp_val = CompareAttachment(pSoldier, HELMETPOS, 1); + break; + case REQ_HELMETPOSATTACHMENT2: + cmp_val = CompareAttachment(pSoldier, HELMETPOS, 2); + break; + case REQ_HELMETPOSATTACHMENT3: + cmp_val = CompareAttachment(pSoldier, HELMETPOS, 3); + break; default: if (q < NUM_REQTYPESINV) { cmp_val = pSoldier->inv[q].usItem; diff --git a/Tactical/LogicalBodyTypes/Filter.h b/Tactical/LogicalBodyTypes/Filter.h index ac6870870..9649d7b71 100644 --- a/Tactical/LogicalBodyTypes/Filter.h +++ b/Tactical/LogicalBodyTypes/Filter.h @@ -64,6 +64,10 @@ class Filter { REQ_HELMET_AMOR_PROTECTION, REQ_HELMET_AMOR_COVERAGE, REQ_WEARING_BACKPACK, + REQ_HELMETPOSATTACHMENT0, + REQ_HELMETPOSATTACHMENT1, + REQ_HELMETPOSATTACHMENT2, + REQ_HELMETPOSATTACHMENT3, NUM_REQTYPES, // 3rd byte is for operator flags _REQ_BTWN = 0x20000, @@ -86,7 +90,7 @@ class Filter { }; typedef std::pair NumberPair; typedef std::list StringList; - typedef std::list NumberList; + typedef std::vector NumberList; union criterionVariant { INT32 number; std::wstring* string; diff --git a/Tactical/LogicalBodyTypes/FilterDB.cpp b/Tactical/LogicalBodyTypes/FilterDB.cpp index 4cb3030e5..3c5a3d4b8 100644 --- a/Tactical/LogicalBodyTypes/FilterDB.cpp +++ b/Tactical/LogicalBodyTypes/FilterDB.cpp @@ -270,7 +270,7 @@ namespace LogicalBodyTypes { /***************************************** Filter enum criterion types ******************************************/ - LOGBT_ENUMDB_ADD("IntegerFilterCriterionTypes", 33, + LOGBT_ENUMDB_ADD("IntegerFilterCriterionTypes", 37, Filter::REQ_HELMETPOS, Filter::REQ_VESTPOS, Filter::REQ_LEGPOS, @@ -303,7 +303,11 @@ namespace LogicalBodyTypes { Filter::REQ_VEST_AMOR_COVERAGE, Filter::REQ_HELMET_AMOR_PROTECTION, Filter::REQ_HELMET_AMOR_COVERAGE, - Filter::REQ_WEARING_BACKPACK + Filter::REQ_WEARING_BACKPACK, + Filter::REQ_HELMETPOSATTACHMENT0, + Filter::REQ_HELMETPOSATTACHMENT1, + Filter::REQ_HELMETPOSATTACHMENT2, + Filter::REQ_HELMETPOSATTACHMENT3 ); /*****************************************