Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f2d1d26137 | |||
| 0089f06a27 | |||
| bd4d2a5f88 | |||
| f410fb3cfb | |||
| ef0ce50833 | |||
| 2ae83c9b7c | |||
| 4919e92157 |
Binary file not shown.
@ -1,2 +1,2 @@
|
|||||||
[InternetShortcut]
|
[InternetShortcut]
|
||||||
URL=https://eddoursul.win/mods/artifact-tracker/
|
URL=https://mod.pub/skyrim-se/36-artifact-tracker
|
||||||
|
|||||||
165
LICENSE.txt
165
LICENSE.txt
@ -1,165 +0,0 @@
|
|||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
|
|
||||||
This version of the GNU Lesser General Public License incorporates
|
|
||||||
the terms and conditions of version 3 of the GNU General Public
|
|
||||||
License, supplemented by the additional permissions listed below.
|
|
||||||
|
|
||||||
0. Additional Definitions.
|
|
||||||
|
|
||||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
|
||||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
|
||||||
General Public License.
|
|
||||||
|
|
||||||
"The Library" refers to a covered work governed by this License,
|
|
||||||
other than an Application or a Combined Work as defined below.
|
|
||||||
|
|
||||||
An "Application" is any work that makes use of an interface provided
|
|
||||||
by the Library, but which is not otherwise based on the Library.
|
|
||||||
Defining a subclass of a class defined by the Library is deemed a mode
|
|
||||||
of using an interface provided by the Library.
|
|
||||||
|
|
||||||
A "Combined Work" is a work produced by combining or linking an
|
|
||||||
Application with the Library. The particular version of the Library
|
|
||||||
with which the Combined Work was made is also called the "Linked
|
|
||||||
Version".
|
|
||||||
|
|
||||||
The "Minimal Corresponding Source" for a Combined Work means the
|
|
||||||
Corresponding Source for the Combined Work, excluding any source code
|
|
||||||
for portions of the Combined Work that, considered in isolation, are
|
|
||||||
based on the Application, and not on the Linked Version.
|
|
||||||
|
|
||||||
The "Corresponding Application Code" for a Combined Work means the
|
|
||||||
object code and/or source code for the Application, including any data
|
|
||||||
and utility programs needed for reproducing the Combined Work from the
|
|
||||||
Application, but excluding the System Libraries of the Combined Work.
|
|
||||||
|
|
||||||
1. Exception to Section 3 of the GNU GPL.
|
|
||||||
|
|
||||||
You may convey a covered work under sections 3 and 4 of this License
|
|
||||||
without being bound by section 3 of the GNU GPL.
|
|
||||||
|
|
||||||
2. Conveying Modified Versions.
|
|
||||||
|
|
||||||
If you modify a copy of the Library, and, in your modifications, a
|
|
||||||
facility refers to a function or data to be supplied by an Application
|
|
||||||
that uses the facility (other than as an argument passed when the
|
|
||||||
facility is invoked), then you may convey a copy of the modified
|
|
||||||
version:
|
|
||||||
|
|
||||||
a) under this License, provided that you make a good faith effort to
|
|
||||||
ensure that, in the event an Application does not supply the
|
|
||||||
function or data, the facility still operates, and performs
|
|
||||||
whatever part of its purpose remains meaningful, or
|
|
||||||
|
|
||||||
b) under the GNU GPL, with none of the additional permissions of
|
|
||||||
this License applicable to that copy.
|
|
||||||
|
|
||||||
3. Object Code Incorporating Material from Library Header Files.
|
|
||||||
|
|
||||||
The object code form of an Application may incorporate material from
|
|
||||||
a header file that is part of the Library. You may convey such object
|
|
||||||
code under terms of your choice, provided that, if the incorporated
|
|
||||||
material is not limited to numerical parameters, data structure
|
|
||||||
layouts and accessors, or small macros, inline functions and templates
|
|
||||||
(ten or fewer lines in length), you do both of the following:
|
|
||||||
|
|
||||||
a) Give prominent notice with each copy of the object code that the
|
|
||||||
Library is used in it and that the Library and its use are
|
|
||||||
covered by this License.
|
|
||||||
|
|
||||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
|
||||||
document.
|
|
||||||
|
|
||||||
4. Combined Works.
|
|
||||||
|
|
||||||
You may convey a Combined Work under terms of your choice that,
|
|
||||||
taken together, effectively do not restrict modification of the
|
|
||||||
portions of the Library contained in the Combined Work and reverse
|
|
||||||
engineering for debugging such modifications, if you also do each of
|
|
||||||
the following:
|
|
||||||
|
|
||||||
a) Give prominent notice with each copy of the Combined Work that
|
|
||||||
the Library is used in it and that the Library and its use are
|
|
||||||
covered by this License.
|
|
||||||
|
|
||||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
|
||||||
document.
|
|
||||||
|
|
||||||
c) For a Combined Work that displays copyright notices during
|
|
||||||
execution, include the copyright notice for the Library among
|
|
||||||
these notices, as well as a reference directing the user to the
|
|
||||||
copies of the GNU GPL and this license document.
|
|
||||||
|
|
||||||
d) Do one of the following:
|
|
||||||
|
|
||||||
0) Convey the Minimal Corresponding Source under the terms of this
|
|
||||||
License, and the Corresponding Application Code in a form
|
|
||||||
suitable for, and under terms that permit, the user to
|
|
||||||
recombine or relink the Application with a modified version of
|
|
||||||
the Linked Version to produce a modified Combined Work, in the
|
|
||||||
manner specified by section 6 of the GNU GPL for conveying
|
|
||||||
Corresponding Source.
|
|
||||||
|
|
||||||
1) Use a suitable shared library mechanism for linking with the
|
|
||||||
Library. A suitable mechanism is one that (a) uses at run time
|
|
||||||
a copy of the Library already present on the user's computer
|
|
||||||
system, and (b) will operate properly with a modified version
|
|
||||||
of the Library that is interface-compatible with the Linked
|
|
||||||
Version.
|
|
||||||
|
|
||||||
e) Provide Installation Information, but only if you would otherwise
|
|
||||||
be required to provide such information under section 6 of the
|
|
||||||
GNU GPL, and only to the extent that such information is
|
|
||||||
necessary to install and execute a modified version of the
|
|
||||||
Combined Work produced by recombining or relinking the
|
|
||||||
Application with a modified version of the Linked Version. (If
|
|
||||||
you use option 4d0, the Installation Information must accompany
|
|
||||||
the Minimal Corresponding Source and Corresponding Application
|
|
||||||
Code. If you use option 4d1, you must provide the Installation
|
|
||||||
Information in the manner specified by section 6 of the GNU GPL
|
|
||||||
for conveying Corresponding Source.)
|
|
||||||
|
|
||||||
5. Combined Libraries.
|
|
||||||
|
|
||||||
You may place library facilities that are a work based on the
|
|
||||||
Library side by side in a single library together with other library
|
|
||||||
facilities that are not Applications and are not covered by this
|
|
||||||
License, and convey such a combined library under terms of your
|
|
||||||
choice, if you do both of the following:
|
|
||||||
|
|
||||||
a) Accompany the combined library with a copy of the same work based
|
|
||||||
on the Library, uncombined with any other library facilities,
|
|
||||||
conveyed under the terms of this License.
|
|
||||||
|
|
||||||
b) Give prominent notice with the combined library that part of it
|
|
||||||
is a work based on the Library, and explaining where to find the
|
|
||||||
accompanying uncombined form of the same work.
|
|
||||||
|
|
||||||
6. Revised Versions of the GNU Lesser General Public License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the GNU Lesser General Public License from time to time. Such new
|
|
||||||
versions will be similar in spirit to the present version, but may
|
|
||||||
differ in detail to address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Library as you received it specifies that a certain numbered version
|
|
||||||
of the GNU Lesser General Public License "or any later version"
|
|
||||||
applies to it, you have the option of following the terms and
|
|
||||||
conditions either of that published version or of any later version
|
|
||||||
published by the Free Software Foundation. If the Library as you
|
|
||||||
received it does not specify a version number of the GNU Lesser
|
|
||||||
General Public License, you may choose any version of the GNU Lesser
|
|
||||||
General Public License ever published by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Library as you received it specifies that a proxy can decide
|
|
||||||
whether future versions of the GNU Lesser General Public License shall
|
|
||||||
apply, that proxy's public statement of acceptance of any version is
|
|
||||||
permanent authorization for you to choose that version for the
|
|
||||||
Library.
|
|
||||||
Binary file not shown.
@ -6,7 +6,7 @@ message("Using toolchain file ${CMAKE_TOOLCHAIN_FILE}.")
|
|||||||
########################################################################################################################
|
########################################################################################################################
|
||||||
project(
|
project(
|
||||||
ArtifactTracker
|
ArtifactTracker
|
||||||
VERSION 1.0.7
|
VERSION 1.0.11
|
||||||
DESCRIPTION "Artifact Tracker"
|
DESCRIPTION "Artifact Tracker"
|
||||||
LANGUAGES CXX)
|
LANGUAGES CXX)
|
||||||
set(CMAKE_CXX_STANDARD 23)
|
set(CMAKE_CXX_STANDARD 23)
|
||||||
|
|||||||
@ -21,7 +21,7 @@ BEGIN
|
|||||||
VALUE "FileDescription", "@PROJECT_DESCRIPTION@"
|
VALUE "FileDescription", "@PROJECT_DESCRIPTION@"
|
||||||
VALUE "FileVersion", "@PROJECT_VERSION@"
|
VALUE "FileVersion", "@PROJECT_VERSION@"
|
||||||
VALUE "InternalName", "@PROJECT_NAME@"
|
VALUE "InternalName", "@PROJECT_NAME@"
|
||||||
VALUE "LegalCopyright", "GNU Lesser General Public License 3.0"
|
VALUE "LegalCopyright", "ModPub Non-Commercial Private Use License 1.0"
|
||||||
VALUE "ProductName", "@PROJECT_FRIENDLY_NAME@"
|
VALUE "ProductName", "@PROJECT_FRIENDLY_NAME@"
|
||||||
VALUE "ProductVersion", "@PROJECT_VERSION@"
|
VALUE "ProductVersion", "@PROJECT_VERSION@"
|
||||||
VALUE "OriginalFilename", "@PROJECT_NAME@.dll"
|
VALUE "OriginalFilename", "@PROJECT_NAME@.dll"
|
||||||
|
|||||||
@ -46,7 +46,9 @@ namespace ArtifactTracker
|
|||||||
|
|
||||||
SKSE::GetModCallbackEventSource()->RemoveEventSink(EventListener::GetSingleton());
|
SKSE::GetModCallbackEventSource()->RemoveEventSink(EventListener::GetSingleton());
|
||||||
|
|
||||||
g_cellContainer = dataHandler->LookupForm(0x804, "Artifact Tracker.esp")->As<RE::TESBoundObject>(); // ETR_CellStorageContainer
|
if (const auto& form = dataHandler->LookupForm(0x804, "Artifact Tracker.esp")) {
|
||||||
|
g_cellContainer = form->As<RE::TESBoundObject>(); // ETR_CellStorageContainer
|
||||||
|
}
|
||||||
|
|
||||||
g_listNew = dataHandler->LookupForm<RE::BGSListForm>(0x800, "Artifact Tracker.esp"); // ETR_ItemsNew
|
g_listNew = dataHandler->LookupForm<RE::BGSListForm>(0x800, "Artifact Tracker.esp"); // ETR_ItemsNew
|
||||||
g_listStored = dataHandler->LookupForm<RE::BGSListForm>(0x801, "Artifact Tracker.esp"); // ETR_ItemsStored
|
g_listStored = dataHandler->LookupForm<RE::BGSListForm>(0x801, "Artifact Tracker.esp"); // ETR_ItemsStored
|
||||||
@ -85,6 +87,9 @@ namespace ArtifactTracker
|
|||||||
g_artifactAllFormTypes.insert(RE::FormType::AlchemyItem);
|
g_artifactAllFormTypes.insert(RE::FormType::AlchemyItem);
|
||||||
g_artifactAllFormTypes.insert(RE::FormType::Ingredient);
|
g_artifactAllFormTypes.insert(RE::FormType::Ingredient);
|
||||||
g_artifactAllFormTypes.insert(RE::FormType::SoulGem);
|
g_artifactAllFormTypes.insert(RE::FormType::SoulGem);
|
||||||
|
g_artifactAllFormTypes.insert(RE::FormType::Ammo);
|
||||||
|
g_artifactAllFormTypes.insert(RE::FormType::Scroll);
|
||||||
|
g_artifactAllFormTypes.insert(RE::FormType::KeyMaster);
|
||||||
|
|
||||||
g_artifactFormTypes.insert(RE::FormType::Weapon);
|
g_artifactFormTypes.insert(RE::FormType::Weapon);
|
||||||
for (const auto& form : dataHandler->GetFormArray<RE::TESObjectWEAP>()) {
|
for (const auto& form : dataHandler->GetFormArray<RE::TESObjectWEAP>()) {
|
||||||
@ -145,8 +150,30 @@ namespace ArtifactTracker
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const auto& form : dataHandler->GetFormArray<RE::TESAmmo>()) {
|
||||||
|
if (form->GetPlayable() && form->AsKeywordForm()->HasKeyword(extraArtifactKeyword) && !form->AsKeywordForm()->HasKeyword(notArtifactKeyword)) {
|
||||||
|
g_artifactMap[form->formID] = form;
|
||||||
|
g_artifactFormTypes.insert(RE::FormType::Ammo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& form : dataHandler->GetFormArray<RE::ScrollItem>()) {
|
||||||
|
if (form->HasKeyword(extraArtifactKeyword) && !form->HasKeyword(notArtifactKeyword)) {
|
||||||
|
g_artifactMap[form->formID] = form;
|
||||||
|
g_artifactFormTypes.insert(RE::FormType::Scroll);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& form : dataHandler->GetFormArray<RE::TESKey>()) {
|
||||||
|
if (form->HasKeyword(extraArtifactKeyword) && !form->HasKeyword(notArtifactKeyword)) {
|
||||||
|
g_artifactMap[form->formID] = form;
|
||||||
|
g_artifactFormTypes.insert(RE::FormType::KeyMaster);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EventListener::Install();
|
EventListener::Install();
|
||||||
OnGameLoad(); // covers new game and coc'ing from the main menu
|
OnGameLoad(); // covers new game and coc'ing from the main menu
|
||||||
|
|
||||||
g_bLoaded = true;
|
g_bLoaded = true;
|
||||||
|
|
||||||
if (bKID) {
|
if (bKID) {
|
||||||
@ -202,7 +229,7 @@ namespace ArtifactTracker
|
|||||||
if (&a_exform) {
|
if (&a_exform) {
|
||||||
g_persistentMap[a_exform.formID] = a_exform.As<RE::TESObjectREFR>();
|
g_persistentMap[a_exform.formID] = a_exform.As<RE::TESObjectREFR>();
|
||||||
}
|
}
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
});
|
});
|
||||||
|
|
||||||
std::uint32_t savedCount = g_listStored->forms.size() + g_listFound->forms.size() + g_listNew->forms.size();
|
std::uint32_t savedCount = g_listStored->forms.size() + g_listFound->forms.size() + g_listNew->forms.size();
|
||||||
@ -383,7 +410,7 @@ namespace ArtifactTracker
|
|||||||
cellStorage = refr;
|
cellStorage = refr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
});
|
});
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
@ -424,7 +451,7 @@ namespace ArtifactTracker
|
|||||||
cellStorage = &a_ref;
|
cellStorage = &a_ref;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
});
|
});
|
||||||
|
|
||||||
for (int i = 0; i < dupes.size(); i++) {
|
for (int i = 0; i < dupes.size(); i++) {
|
||||||
@ -495,14 +522,14 @@ namespace ArtifactTracker
|
|||||||
|
|
||||||
cell->ForEachReference([&](RE::TESObjectREFR& a_ref) {
|
cell->ForEachReference([&](RE::TESObjectREFR& a_ref) {
|
||||||
if (ignoreFormID && ignoreFormID == a_ref.formID) {
|
if (ignoreFormID && ignoreFormID == a_ref.formID) {
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto baseObj = a_ref.GetBaseObject();
|
const auto baseObj = a_ref.GetBaseObject();
|
||||||
|
|
||||||
if (IsValidContainer(&a_ref)) {
|
if (IsValidContainer(&a_ref)) {
|
||||||
if (g_cellContainer == baseObj || baseObj->formID == 0xDC9E7 || g_persistentMap.contains(a_ref.formID)) { // skip persistent and PlayerBookShelfContainer
|
if (g_cellContainer == baseObj || baseObj->formID == 0xDC9E7 || g_persistentMap.contains(a_ref.formID)) { // skip persistent and PlayerBookShelfContainer
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto contInv = a_ref.GetInventory([&](RE::TESBoundObject& a_object) -> bool {
|
const auto contInv = a_ref.GetInventory([&](RE::TESBoundObject& a_object) -> bool {
|
||||||
@ -523,11 +550,11 @@ namespace ArtifactTracker
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_artifactAllFormTypes.contains(baseObj->GetFormType()) || a_ref.IsDisabled() || a_ref.IsMarkedForDeletion() || cellItems.contains(baseObj->formID)) {
|
if (!g_artifactAllFormTypes.contains(baseObj->GetFormType()) || a_ref.IsDisabled() || a_ref.IsMarkedForDeletion() || cellItems.contains(baseObj->formID)) {
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
}
|
}
|
||||||
|
|
||||||
cellItems.insert(baseObj->formID);
|
cellItems.insert(baseObj->formID);
|
||||||
@ -542,7 +569,7 @@ namespace ArtifactTracker
|
|||||||
g_listStored->AddForm(baseObj);
|
g_listStored->AddForm(baseObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const auto& [item, data] : inv) {
|
for (const auto& [item, data] : inv) {
|
||||||
@ -788,7 +815,7 @@ namespace ArtifactTracker
|
|||||||
if (refrItem) {
|
if (refrItem) {
|
||||||
AddRefArtifactsToList(refrItem, a_targetList, a_excludeList);
|
AddRefArtifactsToList(refrItem, a_targetList, a_excludeList);
|
||||||
}
|
}
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ auto EventListener::GetSingleton() -> EventListener*
|
|||||||
|
|
||||||
void EventListener::Install()
|
void EventListener::Install()
|
||||||
{
|
{
|
||||||
RE::PlayerCharacter::GetSingleton()->AddEventSink<RE::BGSActorCellEvent>(EventListener::GetSingleton());
|
RE::PlayerCharacter::GetSingleton()->AsBGSActorCellEventSource()->AddEventSink<RE::BGSActorCellEvent>(EventListener::GetSingleton());
|
||||||
RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink<RE::TESContainerChangedEvent>(EventListener::GetSingleton());
|
RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink<RE::TESContainerChangedEvent>(EventListener::GetSingleton());
|
||||||
RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink<RE::TESActorLocationChangeEvent>(EventListener::GetSingleton());
|
RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink<RE::TESActorLocationChangeEvent>(EventListener::GetSingleton());
|
||||||
RE::UI::GetSingleton()->AddEventSink<RE::MenuOpenCloseEvent>(EventListener::GetSingleton());
|
RE::UI::GetSingleton()->AddEventSink<RE::MenuOpenCloseEvent>(EventListener::GetSingleton());
|
||||||
|
|||||||
@ -13,7 +13,8 @@ namespace {
|
|||||||
stl::report_and_fail("Failed to find standard logging directory"sv);
|
stl::report_and_fail("Failed to find standard logging directory"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
*path /= "ArtifactTracker.log"sv;
|
*path /= PluginDeclaration::GetSingleton()->GetName();
|
||||||
|
*path += ".log"sv;
|
||||||
auto sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(path->string(), true);
|
auto sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(path->string(), true);
|
||||||
|
|
||||||
auto log = std::make_shared<spdlog::logger>("global log"s, std::move(sink));
|
auto log = std::make_shared<spdlog::logger>("global log"s, std::move(sink));
|
||||||
@ -28,9 +29,7 @@ namespace {
|
|||||||
void InitializeMessaging()
|
void InitializeMessaging()
|
||||||
{
|
{
|
||||||
GetMessagingInterface()->RegisterListener([](MessagingInterface::Message* message) {
|
GetMessagingInterface()->RegisterListener([](MessagingInterface::Message* message) {
|
||||||
if (message->type == MessagingInterface::kPostLoad) {
|
if (message->type == MessagingInterface::kDataLoaded) {
|
||||||
SKSE::GetModCallbackEventSource()->AddEventSink(EventListener::GetSingleton()); // runs, if KID is installed
|
|
||||||
} else if (message->type == MessagingInterface::kDataLoaded) {
|
|
||||||
const auto kidSE = ArtifactTracker::g_loadInterface->GetPluginInfo("po3_KeywordItemDistributor");
|
const auto kidSE = ArtifactTracker::g_loadInterface->GetPluginInfo("po3_KeywordItemDistributor");
|
||||||
const auto kidAE = ArtifactTracker::g_loadInterface->GetPluginInfo("Keyword Item Distributor"); // KID 2.0 for AE has a different internal name
|
const auto kidAE = ArtifactTracker::g_loadInterface->GetPluginInfo("Keyword Item Distributor"); // KID 2.0 for AE has a different internal name
|
||||||
if (!kidSE && !kidAE) {
|
if (!kidSE && !kidAE) {
|
||||||
@ -64,6 +63,8 @@ SKSEPluginLoad(const LoadInterface* skse) {
|
|||||||
|
|
||||||
ArtifactTracker::g_loadInterface = skse;
|
ArtifactTracker::g_loadInterface = skse;
|
||||||
|
|
||||||
|
SKSE::GetModCallbackEventSource()->AddEventSink(EventListener::GetSingleton()); // runs when KID is installed
|
||||||
|
|
||||||
log::info("{} has finished loading.", plugin->GetName());
|
log::info("{} has finished loading.", plugin->GetName());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -42,9 +42,9 @@ inline std::uint32_t GetItemCount(RE::TESObjectREFR* a_container, RE::TESForm* a
|
|||||||
container->ForEachContainerObject([&](RE::ContainerObject& a_entry) {
|
container->ForEachContainerObject([&](RE::ContainerObject& a_entry) {
|
||||||
if (a_entry.obj == a_form) {
|
if (a_entry.obj == a_form) {
|
||||||
iResult += a_entry.count;
|
iResult += a_entry.count;
|
||||||
return false;
|
return RE::BSContainer::ForEachResult::kStop;
|
||||||
}
|
}
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,9 +74,9 @@ inline std::int32_t GetItemCount(RE::TESObjectREFR* a_container, RE::FormID a_fo
|
|||||||
container->ForEachContainerObject([&](RE::ContainerObject& a_entry) {
|
container->ForEachContainerObject([&](RE::ContainerObject& a_entry) {
|
||||||
if (a_entry.obj && a_entry.obj->formID == a_formID) {
|
if (a_entry.obj && a_entry.obj->formID == a_formID) {
|
||||||
iResult += a_entry.count;
|
iResult += a_entry.count;
|
||||||
return false;
|
return RE::BSContainer::ForEachResult::kStop;
|
||||||
}
|
}
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,9 +103,9 @@ inline bool RefListHasItem(RE::TESForm* a_refOrList, RE::FormID a_formID)
|
|||||||
list->ForEachForm([&](RE::TESForm& a_form) {
|
list->ForEachForm([&](RE::TESForm& a_form) {
|
||||||
if (&a_form && RefListHasItem(&a_form, a_formID)) {
|
if (&a_form && RefListHasItem(&a_form, a_formID)) {
|
||||||
bResult = true;
|
bResult = true;
|
||||||
return false;
|
return RE::BSContainer::ForEachResult::kStop;
|
||||||
}
|
}
|
||||||
return true;
|
return RE::BSContainer::ForEachResult::kContinue;
|
||||||
});
|
});
|
||||||
return bResult;
|
return bResult;
|
||||||
}
|
}
|
||||||
@ -182,6 +182,7 @@ inline void LoadINI(std::map<std::string, bool>* settings, const char* iniPath)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
inline void RunBenchmark(std::function<void()> benchmark, std::string desc)
|
inline void RunBenchmark(std::function<void()> benchmark, std::string desc)
|
||||||
{
|
{
|
||||||
const auto start = std::chrono::high_resolution_clock::now();
|
const auto start = std::chrono::high_resolution_clock::now();
|
||||||
@ -191,6 +192,7 @@ inline void RunBenchmark(std::function<void()> benchmark, std::string desc)
|
|||||||
const auto elapsed = std::chrono::duration<double>(end - start);
|
const auto elapsed = std::chrono::duration<double>(end - start);
|
||||||
log::info("{}: Elapsed time: {} seconds", desc, elapsed.count());
|
log::info("{}: Elapsed time: {} seconds", desc, elapsed.count());
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
inline std::vector<RE::Actor*> GetPlayerFollowers()
|
inline std::vector<RE::Actor*> GetPlayerFollowers()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,15 +1,15 @@
|
|||||||
{
|
{
|
||||||
"registries": [
|
"registries": [
|
||||||
{
|
{
|
||||||
"kind": "git",
|
"kind": "git",
|
||||||
"repository": "https://gitlab.com/colorglass/vcpkg-colorglass",
|
"repository": "https://gitlab.com/colorglass/vcpkg-colorglass",
|
||||||
"baseline": "5a11d06fd1b2d7cd6339d6aea48d450309e89cc1",
|
"baseline": "6309841a1ce770409708a67a9ba5c26c537d2937",
|
||||||
"packages": [
|
"packages": [
|
||||||
"commonlibsse-ng",
|
"commonlibsse-ng",
|
||||||
"gluino",
|
"gluino",
|
||||||
"script-extender-common",
|
"script-extender-common",
|
||||||
"skse"
|
"skse"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json",
|
"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json",
|
||||||
"name": "artifact-tracker",
|
"name": "artifact-tracker",
|
||||||
"version-string": "1.0.7",
|
"version-string": "1.0.11",
|
||||||
"port-version": 0,
|
"port-version": 0,
|
||||||
"description": "Artifact Tracker",
|
"description": "Artifact Tracker",
|
||||||
"homepage": "https://eddoursul.win/mods/artifact-tracker/",
|
"homepage": "https://mod.pub/skyrim-se/36-artifact-tracker",
|
||||||
"license": "LGPL-3.0",
|
"license": null,
|
||||||
"features": {
|
"features": {
|
||||||
"plugin": {
|
"plugin": {
|
||||||
"description": "Tracks found and stored artifacts.",
|
"description": "Tracks found and stored artifacts.",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user