99#include " skse/GameObjects.h"
1010#include " skse/GameExtraData.h"
1111#include " skse/GameData.h"
12+ #include " skse/PapyrusForm.h"
1213
1314#include < vector>
1415#include < map>
@@ -38,47 +39,14 @@ class ExtraContainerInfo {
3839 return true ;
3940 }
4041
41- // returns the count of items left in the vector
42- UInt32 CountItems () {
43- UInt32 count = 0 ;
44- ExtraDataVec::iterator itEnd = m_vec.end ();
45- ExtraDataVec::iterator it = m_vec.begin ();
46- while (it != itEnd) {
47- ExtraContainerChanges::EntryData* extraData = (*it);
48- if (extraData && (extraData->countDelta > 0 )) {
49- count++;
50- // if (IsConsoleMode()) {
51- // PrintItemType(extraData->type);
52- // }
53- }
54- ++it;
55- }
56- return count;
57- }
58-
59- // returns the weight of items left in the vector
60- float GetTotalWeight () {
61- float weight = 0.0 ;
62- ExtraDataVec::iterator itEnd = m_vec.end ();
63- ExtraDataVec::iterator it = m_vec.begin ();
64- while (it != itEnd) {
65- ExtraContainerChanges::EntryData* extraData = (*it);
66- if (extraData && (extraData->countDelta > 0 )) {
67- weight += papyrusForm::GetWeight (extraData->type );
68- }
69- ++it;
70- }
71- return weight;
72- }
73-
7442 // Create an EntryDataList that includes all of the items in the given EntryDataList, taking into account that some items may already exist on this container
7543 ExtraContainerChanges::EntryDataList *SkaarEntryDataListWithExistingItemCounts (ExtraContainerChanges::EntryDataList *givenItemsList) {
7644 ExtraContainerChanges::EntryDataList *newEntryList = ExtraContainerChanges::EntryDataList::Create ();
7745 for (size_t i = 0 ; i < givenItemsList->Count (); i++) {
7846 ExtraContainerChanges::EntryData *currentEntry = givenItemsList->GetNthItem (i);
7947 TESForm *currentForm = currentEntry->type ;
8048 UInt32 currentCount = currentEntry->countDelta ;
81- _MESSAGE (" Starting search for FormID %d" , currentForm->formID );
49+ _DMESSAGE (" Starting search for FormID %d, name %s " , currentForm->formID , papyrusForm::GetName (currentForm) );
8250
8351 // See if this list already has this TESForm
8452 ExtraContainerMap::iterator it = m_map.find (currentForm);
@@ -87,13 +55,13 @@ class ExtraContainerInfo {
8755 UInt32 index = it->second ;
8856 ExtraContainerChanges::EntryData* pXData = m_vec[index];
8957 if (pXData) {
90- _MESSAGE (" EXISTING FormID %d" , pXData->type ->formID );
91- ExtraContainerChanges::EntryData *newData = ExtraContainerChanges::EntryData::Create (pXData->type , pXData->countDelta + currentCount);
58+ _DMESSAGE (" EXISTING FormID %d, name %s " , pXData->type ->formID , papyrusForm::GetName (currentForm) );
59+ ExtraContainerChanges::EntryData *newData = ExtraContainerChanges::EntryData::Create (pXData->type , pXData->countDelta + currentCount);
9260 newEntryList->Push (newData);
9361 }
9462 }
9563 else { // If not, create a new EntryData object and add it to m_vec
96- _MESSAGE (" NEW FormID %d, count %d" , currentForm->formID , currentCount);
64+ _DMESSAGE (" NEW FormID %d, name %s, count %d" , currentForm->formID , papyrusForm::GetName (currentForm) , currentCount);
9765 ExtraContainerChanges::EntryData *newData = ExtraContainerChanges::EntryData::Create (currentForm, currentCount);
9866 newEntryList->Push (newData);
9967 }
@@ -108,49 +76,29 @@ class ExtraContainerInfo {
10876 ExtraDataVec::iterator iteratorEnd = m_vec.end ();
10977 while (iteratorPosition != iteratorEnd) {
11078 ExtraContainerChanges::EntryData* entryData = (*iteratorPosition);
111- if (entryData && entryData->countDelta > 0 ) {
112- if (entryData->type ->GetFormType () == type || type == kFormType_None ) {
113- _MESSAGE (" EXISTING PLAYER %d" , entryData->type ->formID );
114- bool alreadyThere = SkaarSpecialInventoryCrafting::SkaarEntryDataListContainsEntryData (currentEntries, entryData);
115- if (!alreadyThere) {
116- currentEntries->Push (entryData);
117- }
79+ if (entryData) { // && entryData->countDelta > 0
80+ _DMESSAGE (" EXISTING PLAYER %d" , entryData->type ->formID );
81+ bool alreadyThere = SkaarSpecialInventoryCrafting::SkaarEntryDataListContainsEntryData (currentEntries, entryData);
82+ if (!alreadyThere) {
83+ currentEntries->Push (entryData);
11884 }
11985 }
12086 ++iteratorPosition;
12187 }
12288 return currentEntries;
12389 }
124-
125- ExtraContainerChanges::EntryData* GetNth (UInt32 n, UInt32 count) {
126- ExtraDataVec::iterator itEnd = m_vec.end ();
127- ExtraDataVec::iterator it = m_vec.begin ();
128- while (it != itEnd) {
129- ExtraContainerChanges::EntryData* extraData = (*it);
130- if (extraData && (extraData->countDelta > 0 )) {
131- if (count == n)
132- {
133- return extraData;
134- }
135- count++;
136- }
137- ++it;
138- }
139- return NULL ;
140- }
14190};
14291
14392
14493namespace SkaarSpecialInventoryCrafting {
145-
14694 ExtraContainerInfo SkaarItemInfoForObjectReference (TESObjectREFR* pContainerRef);
14795 ExtraContainerChanges::EntryDataList *SkaarAddRemainingItems (ExtraContainerChanges::EntryDataList *currentItems, TESObjectREFR *pContainerRef, FormType type);
14896 bool SkaarEntryDataListContainsEntryData (ExtraContainerChanges::EntryDataList *entryDataList, ExtraContainerChanges::EntryData *entry);
14997 ExtraContainerChanges::EntryDataList *SkaarGetAllItems (TESObjectREFR* container, FormType type);
15098
15199 // Create a new list of all items of the given type that are in the given container
152100 ExtraContainerChanges::EntryDataList *SkaarGetAllItems (TESObjectREFR* container, FormType type) {
153- _MESSAGE (" SkaarGetAllItems called" );
101+ _DMESSAGE (" SkaarGetAllItems called" );
154102 ExtraContainerChanges* containerChanges = static_cast <ExtraContainerChanges*>(container->extraData .GetByType (kExtraData_ContainerChanges ));
155103 if (!containerChanges) {
156104 return NULL ;
@@ -160,24 +108,25 @@ namespace SkaarSpecialInventoryCrafting {
160108 if (!itemsList || !containerItems || containerItems->Count () <= 0 ) {
161109 return NULL ;
162110 }
163- _MESSAGE (" SkaarGetAllItems about to loop" );
111+ _DMESSAGE (" SkaarGetAllItems about to loop" );
164112 for (size_t i = 0 ; i < containerItems->Count (); i++) {
165113 ExtraContainerChanges::EntryData *currentEntry = containerItems->GetNthItem (i);
166- if (currentEntry && currentEntry-> countDelta > 0 ) {
114+ if (currentEntry) {
167115 if (currentEntry->type ->GetFormType () == type || type == kFormType_None ) {
168- _MESSAGE (" Found TESForm %d" , currentEntry->type ->formID );
116+ _DMESSAGE (" Found TESForm %d" , currentEntry->type ->formID );
169117 itemsList->Push (currentEntry);
170118 }
171119 }
172120 }
173- _MESSAGE (" SkaarGetAllItems about to return" );
121+ _DMESSAGE (" SkaarGetAllItems about to return" );
174122 return itemsList;
175123 }
176124
177125 // For each item in a given source container, add the same number of every item to the destination container
126+ // In the case of the workbench containers mod, the source container is the workbench's container and the destination container is the player
178127 void SkaarAddItemsFromContainerToContainer (StaticFunctionTag *base, TESObjectREFR* pSourceContainerRef, TESObjectREFR* pDestContainerRef, UInt32 typeID) {
179128 FormType type = static_cast <FormType>(typeID);
180- _MESSAGE (" SkaarAddItemsFromContainerToContainer() called" );
129+ _DMESSAGE (" SkaarAddItemsFromContainerToContainer() called" );
181130
182131 if (!pDestContainerRef || !pSourceContainerRef) {
183132 return ;
@@ -198,12 +147,10 @@ namespace SkaarSpecialInventoryCrafting {
198147 // Put into the list those items that were already on the destination but not in the source so they aren't lost
199148 newEntryDataList = SkaarAddRemainingItems (newEntryDataList, pDestContainerRef, type);
200149
150+ _DMESSAGE (" About to add ExtraContainerChanges to the player that has %d items in it" , newEntryDataList->Count ());
201151 ExtraContainerChanges* pXDestContainerChanges = static_cast <ExtraContainerChanges*>(pDestContainerRef->extraData .GetByType (kExtraData_ContainerChanges ));
202152 pXDestContainerChanges->data ->objList = newEntryDataList;
203- _MESSAGE (" About to add ExtraContainerChanges to the player that has %d items in it" , newEntryDataList->Count ());
204- pDestContainerRef->extraData .Add (kExtraData_ContainerChanges , pXDestContainerChanges);
205-
206- _MESSAGE (" SkaarAddItemsFromContainerToContainer() finished" );
153+ _DMESSAGE (" SkaarAddItemsFromContainerToContainer() finished" );
207154 }
208155
209156 void SkaarRemoveItemsInContainerFromContainer (StaticFunctionTag *base, TESObjectREFR* pInContainerRef, TESObjectREFR* pFromContainerRef, UInt32 typeID) {
@@ -218,15 +165,15 @@ namespace SkaarSpecialInventoryCrafting {
218165 }
219166
220167 ExtraContainerChanges::EntryDataList *fromContainerItems = SkaarGetAllItems (pFromContainerRef, type);
221- _MESSAGE (" About to remove ExtraContainerChanges from the player that has %d items in it" , inContainerItems->Count ());
168+ _DMESSAGE (" About to remove ExtraContainerChanges from the player that has %d items in it" , inContainerItems->Count ());
222169 for (size_t i = 0 ; i < inContainerItems->Count (); i++) {
223170 ExtraContainerChanges::EntryData *currentInEntry = inContainerItems->GetNthItem (i);
224171 if (!currentInEntry) {
225172 continue ;
226173 }
227174 for (size_t j = 0 ; j < fromContainerItems->Count (); j++) {
228175 ExtraContainerChanges::EntryData *currentFromEntry = fromContainerItems->GetNthItem (j);
229- if (currentFromEntry && currentFromEntry->type == currentInEntry->type && currentInEntry->countDelta > 0 ) {
176+ if (currentFromEntry && currentFromEntry->type == currentInEntry->type && currentInEntry->countDelta > 0 ) { // I do actually want to ignore items with a negative count here because I do not want to add back items that were removed from the InContainer
230177 UINT32 delta = currentFromEntry->countDelta - currentInEntry->countDelta ;
231178 if (delta >= 0 ) {
232179 currentFromEntry->countDelta = delta;
@@ -280,4 +227,4 @@ namespace SkaarSpecialInventoryCrafting {
280227
281228 return true ;
282229 }
283- }
230+ }
0 commit comments