Compare commits

...

18 Commits

Author SHA1 Message Date
98f4a89e41 Improved QuickLoot compatibility 2024-08-02 02:25:53 +02:00
c3e88fa508 Skip the light attach crash fix when po3's Tweaks are loaded 2024-08-01 15:08:41 +02:00
3e7d025eb7 Updated scriptarchiveorder.txt 2024-08-01 14:36:03 +02:00
7e8d47f48c Copied new Entropic Blood instructions into all localizations 2024-08-01 14:29:32 +02:00
95218f185f Updated changelog 2024-08-01 13:41:51 +02:00
b81e14aed9 Use EquipItemEx to re-equip items after turning back from the werewolf form 2024-08-01 13:06:48 +02:00
1081d60eec Updated Enderal version, added changelog 2024-08-01 03:04:58 +02:00
d05df1c25c Revert "Use GetPermanentActorValue() to show effects in the hero menu"
This reverts commit ccd3c0c262.
2024-08-01 02:34:13 +02:00
87ca1ee284 Fixed damage bonus never applied with Entropic Blood 2024-08-01 01:19:11 +02:00
a2cbdf65ee Incremented _00E_PlayerFunctions version, added versioning to the Entropic Blood scripts 2024-07-31 15:45:56 +02:00
54aa09c3c2 Entropic Blood: selection of a victim happens by pressing "Activate" instead of just pointing 2024-07-31 15:15:17 +02:00
fb076c753c Restore fActivatePickLength as well if save is reloaded during victim selection with Entropic Blood 2024-07-31 15:14:03 +02:00
b67e285b42 Made slow time effect during victim selection with Entropic Blood 2 times slower 2024-07-30 21:32:41 +02:00
6f96053d76 Entropic Blood fixes:
- Controlled actor no longer remains hostile to player.
- Fixed floating in the air after save reload or player's death, occurred during victim selection or ghostwalking.
- Unmarking attacking actor unmarks its target as well.
2024-07-30 17:35:20 +02:00
343039ddd8 Added light attach crash fix by powerofthree 2024-07-29 15:27:01 +02:00
fe6bfad3e9 Check Fishing CC by size to allow a patch 2024-07-27 17:12:23 +02:00
747140eabc Switched CommonlibSSE-NG to alandtse's fork 2024-07-27 16:30:58 +02:00
7675374689 Restored records needed for compatibility with Compass Navigation Overhaul 2024-06-18 18:11:08 +02:00
50 changed files with 524 additions and 290 deletions

Binary file not shown.

View File

@ -645,6 +645,7 @@ FNIS by Fore
Unfuzer by greentea101 Unfuzer by greentea101
UIExtensions by expired6978 UIExtensions by expired6978
Flat Map Markers SSE, Stay At The System Page, Yes Im Sure by Ryan McKenzie Flat Map Markers SSE, Stay At The System Page, Yes Im Sure by Ryan McKenzie
powerofthree's Tweaks
CommonLibSSE-NG and general reverse engineering by Ryan McKenzie, powerofthree, Charmed Baryon, Qudix, Maxsu, doodlum, and others CommonLibSSE-NG and general reverse engineering by Ryan McKenzie, powerofthree, Charmed Baryon, Qudix, Maxsu, doodlum, and others
Better Dialogue Controls by ecirbaf Better Dialogue Controls by ecirbaf
Unofficial Enderal Port (fs.dll) by Hishutup Unofficial Enderal Port (fs.dll) by Hishutup

View File

@ -6,6 +6,18 @@ See https://en.wiki.sureai.net/Enderal:Patch for the list of official patches up
Beware, spoilers ahead! Beware, spoilers ahead!
2.1.2 (2024-08-01)
- Entropic Blood fixes:
-- Controlled actor no longer remains hostile to player.
-- INI settings get properly restored after save reload occured during victim selection - fixes floating in the air and increased activation distance.
-- Fixed the damage bonus never applying to controlled NPCs.
-- Changed the time slow effect to be two times slower.
-- Marking NPCs no longer happens solely by pointing, press "Activate" to mark an actor.
- Added the light attach crash fix by powerofthree.
- Brought back hightlighting of permanent effects in the hero menu.
- Fixed apparition talismans not being recognized as equipped after turning back from the werewolf form.
2.1.1 (2024-04-24) 2.1.1 (2024-04-24)
- Fixed hidden stashes not showing up. - Fixed hidden stashes not showing up.
- Fixed incorrectly assigned racial bonus during quick start. - Fixed incorrectly assigned racial bonus during quick start.

View File

@ -4,3 +4,4 @@ MapMarkerPlacementFixes = true
AchievementFix = true AchievementFix = true
VideoInterruptPatch = true VideoInterruptPatch = true
ForceBorderless = true ForceBorderless = true
AttachLightHitEffectCrashFix = true

View File

@ -1 +1 @@
version = 2.1.1 version = 2.1.2

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -313,6 +313,7 @@ scripts\defaultsetstageonattacked.pex
scripts\defaultsetstageondeath.pex scripts\defaultsetstageondeath.pex
scripts\dragonactorscript.pex scripts\dragonactorscript.pex
scripts\masterambushscript.pex scripts\masterambushscript.pex
scripts\QuickReflexesFix.pex
scripts\_00e_setupinitquestlist.pex scripts\_00e_setupinitquestlist.pex
scripts\_00e_func_setnpcascompanion.pex scripts\_00e_func_setnpcascompanion.pex
scripts\_00e_func_safemove.pex scripts\_00e_func_safemove.pex

View File

@ -6,30 +6,27 @@ message("Using toolchain file ${CMAKE_TOOLCHAIN_FILE}.")
######################################################################################################################## ########################################################################################################################
project( project(
EnderalSE EnderalSE
VERSION 2.1.0 VERSION 2.1.2
DESCRIPTION "Enderal SE DLL" DESCRIPTION "Enderal SE DLL"
LANGUAGES CXX) LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON) set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)
include(GNUInstallDirs)
find_path(SIMPLEINI_INCLUDE_DIRS "ConvertUTF.c")
configure_file( configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.rc.in ${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.rc.in
${CMAKE_CURRENT_BINARY_DIR}/version.rc ${CMAKE_CURRENT_BINARY_DIR}/version.rc
@ONLY) @ONLY)
#include(GNUInstallDirs)
find_path(SIMPLEINI_INCLUDE_DIRS "ConvertUTF.c")
set(sources file(
src/Main.cpp GLOB_RECURSE
src/EventListener.cpp sources
src/Papyrus.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp
src/Patches/TweenMenuPatch.cpp ${CMAKE_CURRENT_BINARY_DIR}/version.rc
src/Patches/HeroMenuPatch.cpp )
${CMAKE_CURRENT_BINARY_DIR}/version.rc)
source_group( source_group(
TREE ${CMAKE_CURRENT_SOURCE_DIR} TREE ${CMAKE_CURRENT_SOURCE_DIR}
@ -40,10 +37,35 @@ source_group(
######################################################################################################################## ########################################################################################################################
## Configure target DLL ## Configure target DLL
######################################################################################################################## ########################################################################################################################
find_package(CommonLibSSE CONFIG REQUIRED)
include(FetchContent)
FetchContent_Declare(
CommonLibNG
GIT_REPOSITORY https://github.com/alandtse/CommonLibVR.git
GIT_TAG 5e5417e3585c9434295e919bdda27737244e9c5a
)
set(ENABLE_SKYRIM_SE ON CACHE BOOL " " FORCE)
set(ENABLE_SKYRIM_AE ON CACHE BOOL " " FORCE)
set(ENABLE_SKYRIM_VR ON CACHE BOOL " " FORCE)
set(BUILD_TESTS OFF CACHE BOOL " " FORCE)
FetchContent_MakeAvailable(CommonLibNG)
# Use a local copy instead
#add_subdirectory("d:/Git/CommonLibVR/" ${CMAKE_BINARY_DIR}/_deps/clib-build)
#find_package(CommonLibSSE CONFIG REQUIRED)
get_target_property(COMMONLIB_SRC_DIR CommonLibSSE SOURCE_DIR)
include(${COMMONLIB_SRC_DIR}/cmake/CommonLibSSE.cmake)
add_commonlibsse_plugin(${PROJECT_NAME} SOURCES ${headers} ${sources}) add_commonlibsse_plugin(${PROJECT_NAME} SOURCES ${headers} ${sources})
add_library("${PROJECT_NAME}::${PROJECT_NAME}" ALIAS "${PROJECT_NAME}") add_library("${PROJECT_NAME}::${PROJECT_NAME}" ALIAS "${PROJECT_NAME}")
target_link_libraries(${PROJECT_NAME} PUBLIC CommonLibSSE::CommonLibSSE)
target_include_directories(${PROJECT_NAME} target_include_directories(${PROJECT_NAME}
PRIVATE PRIVATE
@ -57,6 +79,15 @@ target_include_directories(${PROJECT_NAME}
PUBLIC PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>) $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
find_package(spdlog CONFIG REQUIRED)
target_link_libraries(
"${PROJECT_NAME}"
PUBLIC
spdlog::spdlog
Version.lib
)
target_precompile_headers(${PROJECT_NAME} target_precompile_headers(${PROJECT_NAME}
PRIVATE PRIVATE
src/PCH.h) src/PCH.h)
@ -74,3 +105,4 @@ add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_SOURCE_DIR}/../../SKSE/Plugins/") COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_SOURCE_DIR}/../../SKSE/Plugins/")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${PROJECT_NAME}> "${CMAKE_CURRENT_SOURCE_DIR}/../../SKSE/Plugins/") COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${PROJECT_NAME}> "${CMAKE_CURRENT_SOURCE_DIR}/../../SKSE/Plugins/")

View File

@ -668,9 +668,8 @@ inline void CheckSkyrimCells()
inline void CheckCCMods() inline void CheckCCMods()
{ {
std::string filenames[74] = { std::string filenames[73] = {
"ccASVSSE001-ALMSIVI.esm", "ccASVSSE001-ALMSIVI.esm",
"ccBGSSSE001-Fish.esm",
"ccBGSSSE002-ExoticArrows.esl", "ccBGSSSE002-ExoticArrows.esl",
"ccBGSSSE003-Zombies.esl", "ccBGSSSE003-Zombies.esl",
"ccBGSSSE004-RuinsEdge.esl", "ccBGSSSE004-RuinsEdge.esl",
@ -745,12 +744,17 @@ inline void CheckCCMods()
"ccAFDSSE001-DweSanctuary.esm", "ccAFDSSE001-DweSanctuary.esm",
}; };
for (short i = 0; i < 74; i++) { for (short i = 0; i < 73; i++) {
if (DataFileExists(filenames[i], 800)) { if (DataFileExists(filenames[i], 800)) {
MessageBoxW(NULL, L"Creation Club mods are incompatible with Enderal.", L"Error", MB_OK | MB_ICONERROR); MessageBoxW(NULL, L"Creation Club mods are incompatible with Enderal.", L"Error", MB_OK | MB_ICONERROR);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
if (DataFileExists("ccBGSSSE001-Fish.esm", 1200000)) {
MessageBoxW(NULL, L"Fishing CC are incompatible with Enderal without a patch.", L"Error", MB_OK | MB_ICONERROR);
exit(EXIT_FAILURE);
}
} }
inline void CheckUnconvertedMap() inline void CheckUnconvertedMap()

View File

@ -12,6 +12,7 @@
#include "Patches/HeroMenuPatch.h" #include "Patches/HeroMenuPatch.h"
#include "Patches/HUDMenuPatch.h" #include "Patches/HUDMenuPatch.h"
#include "Patches/ForceBorderless.h" #include "Patches/ForceBorderless.h"
#include "Patches/AttachLightHitEffectCrash.h"
using namespace SKSE; using namespace SKSE;
@ -21,7 +22,8 @@ static std::map<std::string, bool> g_settings{
{ "MapMarkerPlacementFixes", true }, { "MapMarkerPlacementFixes", true },
{ "AchievementFix", true }, { "AchievementFix", true },
{ "VideoInterruptPatch", true }, { "VideoInterruptPatch", true },
{ "ForceBorderless", true } { "ForceBorderless", true },
{ "AttachLightHitEffectCrashFix", true }
}; };
namespace { namespace {
@ -62,6 +64,10 @@ namespace {
if (message->type == MessagingInterface::kPostLoad) { if (message->type == MessagingInterface::kPostLoad) {
if (!REL::Module::IsVR()) { if (!REL::Module::IsVR()) {
if (g_settings.at("AttachLightHitEffectCrashFix")) {
logger::info("Installing light attach crash fix...");
AttachLightHitEffectCrash::Install();
}
if (g_settings.at("StayAtSystemPage")) { if (g_settings.at("StayAtSystemPage")) {
if (const auto pluginInfo = GetLoadInterface()->GetPluginInfo("StayAtSystemPage"); pluginInfo) { if (const auto pluginInfo = GetLoadInterface()->GetPluginInfo("StayAtSystemPage"); pluginInfo) {
MessageBoxW(NULL, L"Stay At The System Page is already included in Enderal, please, disable it.", L"Enderal SE Error", MB_OK | MB_ICONERROR); MessageBoxW(NULL, L"Stay At The System Page is already included in Enderal, please, disable it.", L"Enderal SE Error", MB_OK | MB_ICONERROR);

View File

@ -0,0 +1,33 @@
namespace SKSE::stl
{
namespace detail
{
struct asm_patch :
Xbyak::CodeGenerator
{
asm_patch(std::uintptr_t a_dst)
{
Xbyak::Label dst;
mov(rax, a_dst);
jmp(rax);
}
};
}
void asm_jump(std::uintptr_t a_from, [[maybe_unused]] std::size_t a_size, std::uintptr_t a_to)
{
detail::asm_patch p{ a_to };
p.ready();
assert(p.getSize() <= a_size);
REL::safe_write(
a_from,
std::span{ p.getCode<const std::byte*>(), p.getSize() });
}
void asm_replace(std::uintptr_t a_from, std::size_t a_size, std::uintptr_t a_to)
{
REL::safe_fill(a_from, REL::INT3, a_size);
asm_jump(a_from, a_size, a_to);
}
}

View File

@ -9,6 +9,7 @@
#include <spdlog/sinks/basic_file_sink.h> #include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/msvc_sink.h> #include <spdlog/sinks/msvc_sink.h>
#include <xbyak/xbyak.h>
// Compatible declarations with other sample projects. // Compatible declarations with other sample projects.
#define DLLEXPORT __declspec(dllexport) #define DLLEXPORT __declspec(dllexport)
@ -17,3 +18,14 @@ using namespace std::literals;
using namespace REL::literals; using namespace REL::literals;
namespace logger = SKSE::log; namespace logger = SKSE::log;
namespace SKSE::stl
{
void asm_replace(std::uintptr_t a_from, std::size_t a_size, std::uintptr_t a_to);
template <class T>
void asm_replace(std::uintptr_t a_from, std::size_t a_size)
{
asm_replace(a_from, a_size, reinterpret_cast<std::uintptr_t>(T::func));
}
}

View File

@ -0,0 +1,54 @@
#pragma once
// fix BSFadeNode nullptr crash re: AttachLightHitEffectVisitor
// Copied from powerofthree's Tweaks (MIT)
namespace AttachLightHitEffectCrash
{
struct AttachLightHitEffectVisitor
{
static RE::BSContainer::ForEachResult func(RE::AttachLightHitEffectVisitor* a_this, RE::ReferenceEffect* a_hitEffect)
{
if (a_hitEffect->GetAttached()) {
auto root = a_hitEffect->GetAttachRoot();
if (const auto attachLightObj = root ? root->GetObjectByName(RE::FixedStrings::GetSingleton()->attachLight) : //crash here because no null check
nullptr) {
root = attachLightObj;
}
if (root && root != a_this->attachRoot) {
a_this->attachLightNode = root;
}
if (a_this->attachLightNode) {
return RE::BSContainer::ForEachResult::kStop;
}
} else {
a_this->allAttached = false;
}
return RE::BSContainer::ForEachResult::kContinue;
}
};
void Install()
{
if (!GetLoadInterface()->GetPluginInfo("po3_Tweaks")) {
// proceed normally
} else if (std::filesystem::exists("Data/SKSE/Plugins/po3_Tweaks.ini")) {
CSimpleIniA ini;
ini.SetMultiKey(false);
ini.LoadFile("Data/SKSE/Plugins/po3_Tweaks.ini");
if (!ini.GetBoolValue("Fixes", "Light Attach Crash", false)) {
logger::info("Detected po3's Tweaks with disabled Light Attach Crash Fix");
// proceed normally
} else {
logger::info("Detected po3's Tweaks with enabled Light Attach Crash Fix");
return;
}
}
REL::Relocation<std::uintptr_t> func{ REL::RelocationID(33610, 34388) };
std::size_t size = REL::Module::get().version() > REL::Version(1, 5, 97, 0) ? 0xEC : 0x86;
SKSE::stl::asm_replace<AttachLightHitEffectVisitor>(func.address(), size);
logger::info("Initialized Light Attach Crash Fix");
}
}

View File

@ -13,7 +13,7 @@ namespace BinkInterruptPatch
return true; return true;
} }
if (SKSE::WinAPI::GetKeyState(VK_SPACE) & 0x8000 || SKSE::WinAPI::GetKeyState(VK_ESCAPE) & 0x8000 || SKSE::WinAPI::GetKeyState(VK_LBUTTON) & 0x8000 || SKSE::WinAPI::GetKeyState(VK_RBUTTON) & 0x8000 || SKSE::WinAPI::GetKeyState(VK_LMENU) & 0x8000) { if (REX::W32::GetKeyState(VK_SPACE) & 0x8000 || REX::W32::GetKeyState(VK_ESCAPE) & 0x8000 || REX::W32::GetKeyState(VK_LBUTTON) & 0x8000 || REX::W32::GetKeyState(VK_RBUTTON) & 0x8000 || REX::W32::GetKeyState(VK_LMENU) & 0x8000) {
return false; return false;
} }

View File

@ -122,24 +122,24 @@ void HeroMenuPatch::FillMenuValues()
args2[10].SetNumber(Lernpunkte->value); args2[10].SetNumber(Lernpunkte->value);
args2[11].SetNumber(Handwerkspunkte->value); args2[11].SetNumber(Handwerkspunkte->value);
args2[12].SetNumber(TalentPoints->value); args2[12].SetNumber(TalentPoints->value);
args2[13].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kIllusion)); args2[13].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kIllusion));
args2[14].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kDestruction)); args2[14].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kDestruction));
args2[15].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kAlteration)); args2[15].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kAlteration));
args2[16].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kOneHanded)); args2[16].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kOneHanded));
args2[17].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kBlock)); args2[17].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kBlock));
args2[18].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kArchery)); args2[18].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kArchery));
args2[19].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kConjuration)); args2[19].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kConjuration));
args2[20].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kRestoration)); args2[20].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kRestoration));
args2[21].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kTwoHanded)); args2[21].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kTwoHanded));
args2[22].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kLightArmor)); args2[22].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kLightArmor));
args2[23].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kHeavyArmor)); args2[23].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kHeavyArmor));
args2[24].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kSneak)); args2[24].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kSneak));
args2[25].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kAlchemy)); args2[25].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kAlchemy));
args2[26].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kPickpocket)); args2[26].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kPickpocket));
args2[27].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kLockpicking)); args2[27].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kLockpicking));
args2[28].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kEnchanting)); args2[28].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kEnchanting));
args2[29].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kSmithing)); args2[29].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kSmithing));
args2[30].SetNumber(playerAV->GetPermanentActorValue(RE::ActorValue::kSpeech)); args2[30].SetNumber(playerAV->GetBaseActorValue(RE::ActorValue::kSpeech));
args2[31].SetNumber(playerExp->value - fEXPNeededForCurrentLevel); args2[31].SetNumber(playerExp->value - fEXPNeededForCurrentLevel);
args2[32].SetNumber(fEXPNeededForNextLevel - fEXPNeededForCurrentLevel); args2[32].SetNumber(fEXPNeededForNextLevel - fEXPNeededForCurrentLevel);
@ -149,23 +149,23 @@ void HeroMenuPatch::FillMenuValues()
args3[0].SetNumber(0); args3[0].SetNumber(0);
args3[1].SetNumber(0); args3[1].SetNumber(0);
args3[2].SetNumber(0); args3[2].SetNumber(0);
args3[3].SetNumber(playerAV->GetActorValue(RE::ActorValue::kIllusion) - playerAV->GetPermanentActorValue(RE::ActorValue::kIllusion)); args3[3].SetNumber(playerAV->GetActorValue(RE::ActorValue::kIllusion) - playerAV->GetBaseActorValue(RE::ActorValue::kIllusion));
args3[4].SetNumber(playerAV->GetActorValue(RE::ActorValue::kDestruction) - playerAV->GetPermanentActorValue(RE::ActorValue::kDestruction)); args3[4].SetNumber(playerAV->GetActorValue(RE::ActorValue::kDestruction) - playerAV->GetBaseActorValue(RE::ActorValue::kDestruction));
args3[5].SetNumber(playerAV->GetActorValue(RE::ActorValue::kAlteration) - playerAV->GetPermanentActorValue(RE::ActorValue::kAlteration)); args3[5].SetNumber(playerAV->GetActorValue(RE::ActorValue::kAlteration) - playerAV->GetBaseActorValue(RE::ActorValue::kAlteration));
args3[6].SetNumber(playerAV->GetActorValue(RE::ActorValue::kOneHanded) - playerAV->GetPermanentActorValue(RE::ActorValue::kOneHanded)); args3[6].SetNumber(playerAV->GetActorValue(RE::ActorValue::kOneHanded) - playerAV->GetBaseActorValue(RE::ActorValue::kOneHanded));
args3[7].SetNumber(playerAV->GetActorValue(RE::ActorValue::kBlock) - playerAV->GetPermanentActorValue(RE::ActorValue::kBlock)); args3[7].SetNumber(playerAV->GetActorValue(RE::ActorValue::kBlock) - playerAV->GetBaseActorValue(RE::ActorValue::kBlock));
args3[8].SetNumber(playerAV->GetActorValue(RE::ActorValue::kArchery) - playerAV->GetPermanentActorValue(RE::ActorValue::kArchery)); args3[8].SetNumber(playerAV->GetActorValue(RE::ActorValue::kArchery) - playerAV->GetBaseActorValue(RE::ActorValue::kArchery));
args3[9].SetNumber(playerAV->GetActorValue(RE::ActorValue::kConjuration) - playerAV->GetPermanentActorValue(RE::ActorValue::kConjuration)); args3[9].SetNumber(playerAV->GetActorValue(RE::ActorValue::kConjuration) - playerAV->GetBaseActorValue(RE::ActorValue::kConjuration));
args3[10].SetNumber(playerAV->GetActorValue(RE::ActorValue::kRestoration) - playerAV->GetPermanentActorValue(RE::ActorValue::kRestoration)); args3[10].SetNumber(playerAV->GetActorValue(RE::ActorValue::kRestoration) - playerAV->GetBaseActorValue(RE::ActorValue::kRestoration));
args3[11].SetNumber(playerAV->GetActorValue(RE::ActorValue::kTwoHanded) - playerAV->GetPermanentActorValue(RE::ActorValue::kTwoHanded)); args3[11].SetNumber(playerAV->GetActorValue(RE::ActorValue::kTwoHanded) - playerAV->GetBaseActorValue(RE::ActorValue::kTwoHanded));
args3[12].SetNumber(playerAV->GetActorValue(RE::ActorValue::kLightArmor) - playerAV->GetPermanentActorValue(RE::ActorValue::kLightArmor)); args3[12].SetNumber(playerAV->GetActorValue(RE::ActorValue::kLightArmor) - playerAV->GetBaseActorValue(RE::ActorValue::kLightArmor));
args3[13].SetNumber(playerAV->GetActorValue(RE::ActorValue::kHeavyArmor) - playerAV->GetPermanentActorValue(RE::ActorValue::kHeavyArmor)); args3[13].SetNumber(playerAV->GetActorValue(RE::ActorValue::kHeavyArmor) - playerAV->GetBaseActorValue(RE::ActorValue::kHeavyArmor));
args3[14].SetNumber(playerAV->GetActorValue(RE::ActorValue::kSneak) - playerAV->GetPermanentActorValue(RE::ActorValue::kSneak)); args3[14].SetNumber(playerAV->GetActorValue(RE::ActorValue::kSneak) - playerAV->GetBaseActorValue(RE::ActorValue::kSneak));
args3[15].SetNumber(playerAV->GetActorValue(RE::ActorValue::kAlchemy) - playerAV->GetPermanentActorValue(RE::ActorValue::kAlchemy)); args3[15].SetNumber(playerAV->GetActorValue(RE::ActorValue::kAlchemy) - playerAV->GetBaseActorValue(RE::ActorValue::kAlchemy));
args3[16].SetNumber(playerAV->GetActorValue(RE::ActorValue::kPickpocket) - playerAV->GetPermanentActorValue(RE::ActorValue::kPickpocket)); args3[16].SetNumber(playerAV->GetActorValue(RE::ActorValue::kPickpocket) - playerAV->GetBaseActorValue(RE::ActorValue::kPickpocket));
args3[17].SetNumber(playerAV->GetActorValue(RE::ActorValue::kLockpicking) - playerAV->GetPermanentActorValue(RE::ActorValue::kLockpicking)); args3[17].SetNumber(playerAV->GetActorValue(RE::ActorValue::kLockpicking) - playerAV->GetBaseActorValue(RE::ActorValue::kLockpicking));
args3[18].SetNumber(playerAV->GetActorValue(RE::ActorValue::kEnchanting) - playerAV->GetPermanentActorValue(RE::ActorValue::kEnchanting)); args3[18].SetNumber(playerAV->GetActorValue(RE::ActorValue::kEnchanting) - playerAV->GetBaseActorValue(RE::ActorValue::kEnchanting));
args3[19].SetNumber(playerAV->GetActorValue(RE::ActorValue::kSmithing) - playerAV->GetPermanentActorValue(RE::ActorValue::kSmithing)); args3[19].SetNumber(playerAV->GetActorValue(RE::ActorValue::kSmithing) - playerAV->GetBaseActorValue(RE::ActorValue::kSmithing));
args3[20].SetNumber(playerAV->GetActorValue(RE::ActorValue::kSpeech) - playerAV->GetPermanentActorValue(RE::ActorValue::kSpeech)); args3[20].SetNumber(playerAV->GetActorValue(RE::ActorValue::kSpeech) - playerAV->GetBaseActorValue(RE::ActorValue::kSpeech));
uiMovie->Invoke("heromenu_mc.SetModifier", nullptr, args3, 21); uiMovie->Invoke("heromenu_mc.SetModifier", nullptr, args3, 21);
} }

View File

@ -107,7 +107,7 @@ inline void CheckScriptVersions()
std::map<std::string, short> scripts; std::map<std::string, short> scripts;
scripts["EnderalFunctions"] = 1; scripts["EnderalFunctions"] = 1;
scripts["_00E_PlayerFunctions"] = 1; scripts["_00E_PlayerFunctions"] = 2;
scripts["_00E_PlayerSetUpScript"] = 1; scripts["_00E_PlayerSetUpScript"] = 1;
scripts["_00E_EngineBugfixAlias"] = 1; scripts["_00E_EngineBugfixAlias"] = 1;
scripts["_00E_Phasmalist_NewApparitionAlias"] = 1; scripts["_00E_Phasmalist_NewApparitionAlias"] = 1;
@ -177,6 +177,9 @@ inline void CheckScriptVersions()
scripts["_00e_nq06_functions"] = 1; scripts["_00e_nq06_functions"] = 1;
scripts["_00e_mq18a_functions"] = 1; scripts["_00e_mq18a_functions"] = 1;
scripts["_00e_mq05prologue_functions"] = 1; scripts["_00e_mq05prologue_functions"] = 1;
scripts["_00E_A2_EldritchBloodSC"] = 1;
scripts["_00E_A2_EldritchBloodPlayerSC"] = 1;
scripts["_00E_A2_EldritchBloodPlayerMarkSC"] = 1;
for (const auto& entry : scripts) { for (const auto& entry : scripts) {
RE::BSTSmartPointer<ScriptVersionCallback>{ RE::BSTSmartPointer<ScriptVersionCallback>{

View File

@ -2,19 +2,6 @@
"default-registry": { "default-registry": {
"kind": "git", "kind": "git",
"repository": "https://github.com/microsoft/vcpkg.git", "repository": "https://github.com/microsoft/vcpkg.git",
"baseline": "08c4e71048eb54733d9b180a28b9b1d7ce637454" "baseline": "cacf5994341f27e9a14a7b8724b0634b138ecb30"
}, }
"registries": [
{
"kind": "git",
"repository": "https://gitlab.com/colorglass/vcpkg-colorglass",
"baseline": "6309841a1ce770409708a67a9ba5c26c537d2937",
"packages": [
"commonlibsse-ng",
"gluino",
"script-extender-common",
"skse"
]
}
]
} }

View File

@ -10,8 +10,11 @@
"plugin": { "plugin": {
"description": "Enderal SE functions and potion replacer.", "description": "Enderal SE functions and potion replacer.",
"dependencies": [ "dependencies": [
"commonlibsse-ng", "simpleini",
"simpleini" "spdlog",
"directxtk",
"rapidcsv",
"xbyak"
] ]
} }
}, },

View File

@ -11,7 +11,7 @@ float function _GetVersionFull() global
; C - backward-compatible update ; C - backward-compatible update
; D - hotfix ; D - hotfix
; E - build ; E - build
return 2100.0 return 2120.0
endfunction endfunction
int function GetVersion() global int function GetVersion() global

View File

@ -1,8 +1,10 @@
Scriptname _00E_A2_EldritchBloodPlayerMarkSC extends ReferenceAlias Scriptname _00E_A2_EldritchBloodPlayerMarkSC extends ReferenceAlias
Import Utility Import Utility
int function _GetScriptVersion() Global
return 1
endFunction
;===================================================================================== ;=====================================================================================
; EVENTS ; EVENTS
@ -10,70 +12,75 @@ Import Utility
Auto State Marking Auto State Marking
Event OnCrosshairRefChange(ObjectReference ref) Event OnControlUp(string control, float HoldTime)
if lastTarget != None Actor rTarget = Game.GetCurrentCrosshairRef() as Actor
lastTarget.blockActivation(false)
EndIf if ! rTarget || rTarget == Game.GetForm(0x14)
lastTarget = ref return
ref.blockActivation(true) endif
If _00E_A2_EldritchBloodGlobal.GetValueInt() == 1 If _00E_A2_EldritchBloodGlobal.GetValueInt() == 1
If Ref.GetSelfAsActor() && Ref != Game.GetPlayer() EldritchBloodEffectScript.SelectEnemy(rTarget)
EldritchBloodEffectScript.SelectEnemy(Ref as Actor)
EndIf EndIf
Else
UnregisterForCrosshairRef() EndEvent
EndIf
EndEvent
Event OnAnimationEvent(ObjectReference akSource, string asEventName) Event OnCrosshairRefChange(ObjectReference ref)
if(akSource == akSelfRef && asEventName == "weaponSwing") if lastTarget != None
if iAttackCounter == 0 lastTarget.blockActivation(false)
iAttackCounter = 1 EndIf
Else lastTarget = ref
if ref
ref.blockActivation(true)
endif
EndEvent
Event OnAnimationEvent(ObjectReference akSource, string asEventName)
if(akSource == akSelfRef && asEventName == "weaponSwing")
if iAttackCounter == 0
iAttackCounter = 1
Else
; Debug.Notification(sMarkingModeInterrupted)
_00E_MarkingTalents_sMarkingModeInterrupted.Show()
EldritchBloodEffectScript.abort()
UnregisterForAnimationEvent(akSelfRef, "weaponSwing")
EndIf
EndIf
EndEvent
Event OnObjectEquipped(Form equippedObject, ObjectReference reference)
if ! equippedObject as Shout
; Debug.Notification(sMarkingModeInterrupted) ; Debug.Notification(sMarkingModeInterrupted)
_00E_MarkingTalents_sMarkingModeInterrupted.Show() _00E_MarkingTalents_sMarkingModeInterrupted.Show()
EldritchBloodEffectScript.abort() EldritchBloodEffectScript.abort()
UnregisterForAnimationEvent(akSelfRef, "weaponSwing")
EndIf EndIf
EndIf
EndEvent EndEvent
Event OnSpellCast(Form akSpell)
if akSpell != _00E_A2_EldritchBloodSP
; Debug.Notification(sMarkingModeInterrupted)
_00E_MarkingTalents_sMarkingModeInterrupted.Show()
EldritchBloodEffectScript.abort()
EndIf
EndEvent
Event OnPlayerBowShot(Weapon akWeapon, Ammo akAmmo, float afPower, bool abSunGazing)
Event OnObjectEquipped(Form equippedObject, ObjectReference reference)
Shout equippedShout = equippedObject as Shout
if(!equippedShout)
; Debug.Notification(sMarkingModeInterrupted) ; Debug.Notification(sMarkingModeInterrupted)
_00E_MarkingTalents_sMarkingModeInterrupted.Show() _00E_MarkingTalents_sMarkingModeInterrupted.Show()
EldritchBloodEffectScript.abort() EldritchBloodEffectScript.abort()
EndIf
EndEvent EndEvent
Event OnSpellCast(Form akSpell)
Shout equippedShout = akSpell as Shout
if akSpell != _00E_A2_EldritchBloodSP
; Debug.Notification(sMarkingModeInterrupted)
_00E_MarkingTalents_sMarkingModeInterrupted.Show()
EldritchBloodEffectScript.abort()
EndIf
EndEvent
Event OnPlayerBowShot(Weapon akWeapon, Ammo akAmmo, float afPower, bool abSunGazing)
; Debug.Notification(sMarkingModeInterrupted)
_00E_MarkingTalents_sMarkingModeInterrupted.Show()
EldritchBloodEffectScript.abort()
EndEvent
EndState EndState
@ -86,27 +93,32 @@ Function EnterMarkingMode(Float iReach, _00E_A2_EldritchBloodPlayerSC _00E_A2_El
akSelfRef = Self.GetActorReference() akSelfRef = Self.GetActorReference()
RegisterForAnimationEvent(akSelfRef, "weaponSwing") RegisterForAnimationEvent(akSelfRef, "weaponSwing")
Game.DisablePlayerControls(false, false, false, false, false, false, false, false)
fActivatePickLengthBefore = GetINIFloat("fActivatePickLength:Interface") fActivatePickLengthBefore = GetINIFloat("fActivatePickLength:Interface")
SetINIFloat("fActivatePickLength:Interface", iReach) SetINIFloat("fActivatePickLength:Interface", iReach)
EldritchBloodEffectScript = _00E_A2_EldritchBloodMEScript EldritchBloodEffectScript = _00E_A2_EldritchBloodMEScript
RegisterForCrosshairRef() RegisterForCrosshairRef()
RegisterForControl("Activate")
EndFunction EndFunction
Function ExitMarkingMode() Function ExitMarkingMode()
iAttackCounter = 0
UnregisterForAllControls()
UnregisterForCrosshairRef()
UnregisterForAnimationEvent(akSelfRef, "weaponSwing")
; Restore activation reach
if fActivatePickLengthBefore <= 0
fActivatePickLengthBefore = 150.0
endif
SetINIFloat("fActivatePickLength:Interface", fActivatePickLengthBefore)
if lastTarget != None if lastTarget != None
lastTarget.blockActivation(false) lastTarget.blockActivation(false)
EndIf EndIf
lastTarget = None lastTarget = None
iAttackCounter = 0
UnregisterForAnimationEvent(akSelfRef, "weaponSwing")
Game.EnablePlayerControls()
UnregisterForCrosshairRef()
SetINIFloat("fActivatePickLength:Interface", 150)
EndFunction EndFunction
;===================================================================================== ;=====================================================================================

View File

@ -3,6 +3,10 @@ Scriptname _00E_A2_EldritchBloodPlayerSC extends activemagiceffect
Import _00E_TalentLibrary Import _00E_TalentLibrary
Import Utility Import Utility
int function _GetScriptVersion() Global
return 1
endFunction
;===================================================================================== ;=====================================================================================
; EVENTS & STATES ; EVENTS & STATES
;===================================================================================== ;=====================================================================================
@ -51,69 +55,79 @@ EndFunction
State MarkTargets State MarkTargets
Event OnBeginState() Event OnBeginState()
If _00E_SelectionTutorialShown.GetValueInt() == 0 && _00E_DisableSkillTutorials.GetValueInt() == 0 If _00E_SelectionTutorialShown.GetValueInt() == 0 && _00E_DisableSkillTutorials.GetValueInt() == 0
_00E_Tutorial_SelectionMode.Show() _00E_Tutorial_SelectionMode.Show()
_00E_SelectionTutorialShown.SetValueInt(1) _00E_SelectionTutorialShown.SetValueInt(1)
EndIf EndIf
If _00E_A2_EldritchBloodInDepthTutorial.GetValueInt() == 0 && _00E_DisableSkillTutorials.GetValueInt() == 0 If _00E_A2_EldritchBloodInDepthTutorial.GetValueInt() == 0 && _00E_DisableSkillTutorials.GetValueInt() == 0
_00E_A2_Tutorial_EldritchBloodDetailed.Show() _00E_A2_Tutorial_EldritchBloodDetailed.Show()
_00E_A2_EldritchBloodInDepthTutorial.SetValueInt(1) _00E_A2_EldritchBloodInDepthTutorial.SetValueInt(1)
EndIf EndIf
If _00E_DisableSkillTutorials.GetValueInt() == 0 If _00E_DisableSkillTutorials.GetValueInt() == 0
_00E_A2_Tutorial_EldritchBlood.ShowAsHelpMessage("EldritchBlood", 8, 8, 1) _00E_A2_Tutorial_EldritchBlood.ShowAsHelpMessage("EldritchBlood", 8, 8, 1)
EndIf EndIf
_00E_A2_EldritchBloodGlobal.SetValueInt(1) _00E_A2_EldritchBloodGlobal.SetValueInt(1)
(PlayerREF as _00E_Game_TalentControlSC).SetTalentRecoveryTime(_00E_A2_EldritchBlood, 0) (PlayerREF as _00E_Game_TalentControlSC).SetTalentRecoveryTime(_00E_A2_EldritchBlood, 0)
A2_EldritchBlood_Player.ForceRefTo(PlayerREF) A2_EldritchBlood_Player.ForceRefTo(PlayerREF)
A2_EldritchBlood_PlayerForScript = A2_EldritchBlood_Player as _00E_A2_EldritchBloodPlayerMarkSC A2_EldritchBlood_PlayerForScript = A2_EldritchBlood_Player as _00E_A2_EldritchBloodPlayerMarkSC
PlayerREF.AddSpell(_00E_A2_EldritchBloodAbSelectionSP, False) PlayerREF.AddSpell(_00E_A2_EldritchBloodAbSelectionSP, False)
_00E_A2_EldritchBloodSelectionIntroIMOD.Apply() _00E_A2_EldritchBloodSelectionIntroIMOD.Apply()
MarkingLP = _00E_A2_GhostwalkMarkingLPM.Play(playerREF) MarkingLP = _00E_A2_GhostwalkMarkingLPM.Play(playerREF)
MAGConjurePortal.Play(PlayerREF) MAGConjurePortal.Play(PlayerREF)
A2_EldritchBlood_PlayerForScript.EnterMarkingMode(1800, Self as _00E_A2_EldritchBloodPlayerSC) A2_EldritchBlood_PlayerForScript.EnterMarkingMode(1800, Self as _00E_A2_EldritchBloodPlayerSC)
Wait(0.5) Wait(0.5)
_00E_A2_EldritchBloodSelectionHoldIMOD.ApplyCrossFade(1.5) _00E_A2_EldritchBloodSelectionHoldIMOD.ApplyCrossFade(1.5)
EndEvent EndEvent
EndState EndState
State AddEffect State AddEffect
Event OnBeginState() Event OnBeginState()
A2_EldritchBlood_Victim.GetActorReference().RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimSP) A2_EldritchBlood_Victim.GetActorReference().RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimSP)
A2_EldritchBlood_VictimTarget.GetActorReference().RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimTargetSP)
PlayerREF.RemoveSpell(_00E_A2_EldritchBloodAbSelectionSP) if A2_EldritchBlood_VictimTarget.GetActorReference()
A2_EldritchBlood_PlayerForScript.ExitMarkingMode() A2_EldritchBlood_VictimTarget.GetActorReference().RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimTargetSP)
_00E_A2_EldritchBloodSelectionHoldIMOD.Remove() endif
Sound.StopInstance(MarkingLP)
QSTDA16SoulGemOffM.Play(PlayerREF) PlayerREF.RemoveSpell(_00E_A2_EldritchBloodAbSelectionSP)
A2_EldritchBlood_Player.Clear() A2_EldritchBlood_PlayerForScript.ExitMarkingMode()
A2_EldritchBlood_Rune.GetReference().Delete() _00E_A2_EldritchBloodSelectionHoldIMOD.Remove()
A2_EldritchBlood_VictimRune.GetReference().Delete() QSTDA16SoulGemOffM.Play(PlayerREF)
A2_EldritchBlood_Rune.Clear() A2_EldritchBlood_Player.Clear()
A2_EldritchBlood_VictimRune.Clear()
if A2_EldritchBlood_Rune.GetReference()
If MarkingRuneREF A2_EldritchBlood_Rune.GetReference().Delete()
MarkingRuneREF.Delete() endif
EndIf
if A2_EldritchBlood_VictimRune.GetReference()
If MarkingVictimRuneREF A2_EldritchBlood_VictimRune.GetReference().Delete()
MarkingVictimRuneREF.Delete() endif
EndIf
A2_EldritchBlood_Rune.Clear()
A2_EldritchBlood_VictimRune.Clear()
AddFrenzySpell()
If MarkingRuneREF
_00E_A2_EldritchBloodGlobal.SetValueInt(0) MarkingRuneREF.Delete()
EndIf
EndEvent
If MarkingVictimRuneREF
MarkingVictimRuneREF.Delete()
EndIf
AddFrenzySpell()
_00E_A2_EldritchBloodGlobal.SetValueInt(0)
Sound.StopInstance(MarkingLP)
EndEvent
EndState EndState
@ -125,38 +139,54 @@ Function AddFrenzySpell()
float iExpDamage = _00E_A2_EldritchBloodSP.GetNthEffectMagnitude(iIndex - 1) float iExpDamage = _00E_A2_EldritchBloodSP.GetNthEffectMagnitude(iIndex - 1)
_00E_A2_EldritchBloodEnchantment.SetNthEffectMagnitude(0, iExpDamage) _00E_A2_EldritchBloodEnchantment.SetNthEffectMagnitude(0, iExpDamage)
_00E_A2_EldritchBloodMarkedVictimFXS.Stop(A2_EldritchBlood_VictimTarget.GetActorReference())
if A2_EldritchBlood_VictimTarget.GetActorReference()
_00E_A2_EldritchBloodMarkedVictimFXS.Stop(A2_EldritchBlood_VictimTarget.GetActorReference())
endif
float iFrenzyDMGMult = _00E_A2_EldritchBloodSP.GetNthEffectMagnitude(iIndex + 2) float iFrenzyDMGMult = _00E_A2_EldritchBloodSP.GetNthEffectMagnitude(iIndex + 2)
Int iFrenzyDuration = _00E_A2_EldritchBloodSP.GetNthEffectDuration(iIndex + 2) as Int Int iFrenzyDuration = _00E_A2_EldritchBloodSP.GetNthEffectDuration(iIndex + 2) as Int
_00E_A2_EldritchBloodVictimSP.SetNthEffectMagnitude(0, iFrenzyDMGMult) _00E_A2_EldritchBloodVictimSP.SetNthEffectMagnitude(0, iFrenzyDMGMult)
_00E_A2_EldritchBloodVictimSP.SetNthEffectDuration(0, iFrenzyDuration) _00E_A2_EldritchBloodVictimSP.SetNthEffectDuration(0, iFrenzyDuration)
_00E_A2_EldritchBloodVictimSP.Cast(A2_EldritchBlood_Victim.GetReference(), A2_EldritchBlood_Victim.GetReference())
If iFrezyAttackTargetMarked if A2_EldritchBlood_Victim.GetReference()
A2_EldritchBlood_Victim.GetActorReference().StartCombat(A2_EldritchBlood_VictimTarget.GetActorReference()) _00E_A2_EldritchBloodVictimSP.Cast(A2_EldritchBlood_Victim.GetReference(), A2_EldritchBlood_Victim.GetReference())
Else endif
A2_EldritchBlood_Victim.GetActorReference().StartCombat(PlayerREF.GetCombatTarget())
EndIf
EndFunction EndFunction
Function NotMarkedClearUp() Function NotMarkedClearUp()
A2_EldritchBlood_Victim.GetActorReference().RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimSP) if A2_EldritchBlood_Victim.GetActorReference()
A2_EldritchBlood_VictimTarget.GetActorReference().RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimTargetSP) A2_EldritchBlood_Victim.GetActorReference().RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimSP)
endif
if A2_EldritchBlood_VictimTarget.GetActorReference()
A2_EldritchBlood_VictimTarget.GetActorReference().RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimTargetSP)
_00E_A2_EldritchBloodMarkedVictimFXS.Stop(A2_EldritchBlood_VictimTarget.GetActorReference())
endif
(PlayerREF as _00E_Game_TalentControlSC).SetTalentRecoveryTime(_00E_A2_EldritchBlood, 0) (PlayerREF as _00E_Game_TalentControlSC).SetTalentRecoveryTime(_00E_A2_EldritchBlood, 0)
MAGFail.Play(PlayerREF) MAGFail.Play(PlayerREF)
PlayerREF.RemoveSpell(_00E_A2_EldritchBloodAbSelectionSP) PlayerREF.RemoveSpell(_00E_A2_EldritchBloodAbSelectionSP)
A2_EldritchBlood_PlayerForScript.ExitMarkingMode()
if A2_EldritchBlood_PlayerForScript
A2_EldritchBlood_PlayerForScript.ExitMarkingMode()
endif
_00E_A2_EldritchBloodSelectionHoldIMOD.Remove() _00E_A2_EldritchBloodSelectionHoldIMOD.Remove()
Sound.StopInstance(MarkingLP)
QSTDA16SoulGemOffM.Play(PlayerREF) QSTDA16SoulGemOffM.Play(PlayerREF)
A2_EldritchBlood_Player.Clear() A2_EldritchBlood_Player.Clear()
A2_EldritchBlood_Rune.GetReference().Delete()
A2_EldritchBlood_VictimRune.GetReference().Delete() if A2_EldritchBlood_Rune.GetReference()
_00E_A2_EldritchBloodMarkedVictimFXS.Stop(A2_EldritchBlood_VictimTarget.GetActorReference()) A2_EldritchBlood_Rune.GetReference().Delete()
endif
if A2_EldritchBlood_VictimRune.GetReference()
A2_EldritchBlood_VictimRune.GetReference().Delete()
endif
A2_EldritchBlood_Rune.Clear() A2_EldritchBlood_Rune.Clear()
A2_EldritchBlood_VictimRune.Clear() A2_EldritchBlood_VictimRune.Clear()
A2_EldritchBlood_VictimTarget.Clear() A2_EldritchBlood_VictimTarget.Clear()
@ -170,31 +200,38 @@ Function NotMarkedClearUp()
MarkingVictimRuneREF.Delete() MarkingVictimRuneREF.Delete()
EndIf EndIf
Wait(2) if ! PlayerREF.IsDead()
Wait(2.0)
endif
_00E_A2_EldritchBloodGlobal.SetValueInt(0) _00E_A2_EldritchBloodGlobal.SetValueInt(0)
if MarkingLP
Sound.StopInstance(MarkingLP)
endif
EndFunction EndFunction
Function SelectEnemy(Actor iVictim) Function SelectEnemy(Actor iVictim)
If IsTargetValid(iVictim) If ! IsTargetValid(iVictim)
If !IsTargetMarked(iVictim) return
If !iFrenzyTargetMarked EndIf
MarkFrenzyVictim(iVictim)
iFrenzyTargetMarked = True If !IsTargetMarked(iVictim)
Elseif !iFrezyAttackTargetMarked If !iFrenzyTargetMarked
MarkFrenzyTargetVictim(iVictim) MarkFrenzyVictim(iVictim)
iFrezyAttackTargetMarked = True iFrenzyTargetMarked = True
Else Elseif !iFrezyAttackTargetMarked
_00E_Levelsystem_sEnemyAlreadyMarked.Show() MarkFrenzyTargetVictim(iVictim)
MAGFail.Play(PlayerREF) iFrezyAttackTargetMarked = True
EndIf
Else
UnmarkEnemy(iVictim)
EndIf
Else Else
Return _00E_Levelsystem_sEnemyAlreadyMarked.Show()
MAGFail.Play(PlayerREF)
EndIf EndIf
Else
UnmarkEnemy(iVictim)
EndIf
EndFunction EndFunction
@ -224,35 +261,33 @@ EndFunction
Function UnmarkEnemy(Actor iVictim) Function UnmarkEnemy(Actor iVictim)
bool Cleared
If iVictim.HasSpell(_00E_A2_EldritchBloodAbMarkedVictimSP) If iVictim.HasSpell(_00E_A2_EldritchBloodAbMarkedVictimSP)
A2_EldritchBlood_Rune.Clear() A2_EldritchBlood_Rune.Clear()
A2_EldritchBlood_Victim.Clear() A2_EldritchBlood_Victim.Clear()
MarkingRuneREF.Disable()
iFrenzyTargetMarked = False iFrenzyTargetMarked = False
_00E_Levelsystem_sEldritchBloodVictimMarkingRemoved.Show() _00E_Levelsystem_sEldritchBloodVictimMarkingRemoved.Show()
iVictim.RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimSP) iVictim.RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimSP)
_00E_A2_EldritchBloodMarkedFXS.Stop(iVictim) _00E_A2_EldritchBloodMarkedFXS.Stop(iVictim)
_00E_A2_GhostwalkDeselectM.Play(PlayerREF) _00E_A2_GhostwalkDeselectM.Play(PlayerREF)
Cleared = True MarkingRuneREF.Delete()
MarkingRuneREF = None
Elseif iVictim.HasSpell(_00E_A2_EldritchBloodAbMarkedVictimTargetSP) Elseif iVictim.HasSpell(_00E_A2_EldritchBloodAbMarkedVictimTargetSP)
A2_EldritchBlood_VictimRune.Clear() A2_EldritchBlood_VictimRune.Clear()
A2_EldritchBlood_VictimTarget.Clear() A2_EldritchBlood_VictimTarget.Clear()
MarkingVictimRuneREF.Disable()
iFrezyAttackTargetMarked = False iFrezyAttackTargetMarked = False
_00E_Levelsystem_sEldritchBloodAttackVictimMarkingRemoved.Show() _00E_Levelsystem_sEldritchBloodAttackVictimMarkingRemoved.Show()
iVictim.RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimTargetSP) iVictim.RemoveSpell(_00E_A2_EldritchBloodAbMarkedVictimTargetSP)
_00E_A2_EldritchBloodMarkedVictimFXS.Stop(iVictim) _00E_A2_EldritchBloodMarkedVictimFXS.Stop(iVictim)
_00E_A2_GhostwalkDeselectM.Play(PlayerREF) _00E_A2_GhostwalkDeselectM.Play(PlayerREF)
Cleared = True MarkingVictimRuneREF.Delete()
MarkingVictimRuneREF = None
EndIf EndIf
EndFunction EndFunction
bool Function IsTargetValid(Actor CheckVictim) bool Function IsTargetValid(Actor CheckVictim)
If CheckVictim.IsInFaction(PlayerAlliesFaction) If CheckVictim.IsInFaction(PlayerAlliesFaction) || CheckVictim.IsCommandedActor() || CheckVictim.IsPlayerTeammate()
Return False Return False
ElseIf CheckVictim.HasKeyword(MagicNoEldritchBlood) ElseIf CheckVictim.HasKeyword(MagicNoEldritchBlood)
_00E_Levelsystem_sAbilityEnemyLevelTooHigh.Show() _00E_Levelsystem_sAbilityEnemyLevelTooHigh.Show()
@ -272,21 +307,13 @@ bool Function EnemyLevelTooHigh(Actor LevelVictim)
Float iAllowedDif = _00E_A2_EldritchBloodSP.GetNthEffectMagnitude(6) Float iAllowedDif = _00E_A2_EldritchBloodSP.GetNthEffectMagnitude(6)
If (LevelVictim.GetLevel() > (PlayerLevel.GetValueInt() + iAllowedDif as Int)) return (LevelVictim.GetLevel() > (PlayerLevel.GetValueInt() + iAllowedDif as Int))
Return True
Else
Return False
EndIf
EndFunction EndFunction
bool Function IsTargetMarked(Actor iVictim) bool Function IsTargetMarked(Actor iVictim)
If iVictim.HasSpell(_00E_A2_EldritchBloodAbMarkedVictimSP) || iVictim.HasSpell(_00E_A2_EldritchBloodAbMarkedVictimTargetSP) return iVictim.HasSpell(_00E_A2_EldritchBloodAbMarkedVictimSP) || iVictim.HasSpell(_00E_A2_EldritchBloodAbMarkedVictimTargetSP)
Return True
Else
Return False
EndIf
EndFunction EndFunction

View File

@ -3,6 +3,10 @@ Scriptname _00E_A2_EldritchBloodSC extends activemagiceffect
Import _00E_TalentLibrary Import _00E_TalentLibrary
Import Utility Import Utility
int function _GetScriptVersion() Global
return 1
endFunction
;===================================================================================== ;=====================================================================================
; EVENTS ; EVENTS
;===================================================================================== ;=====================================================================================
@ -20,7 +24,7 @@ EndEvent
Event OnEffectStart(Actor akTarget, Actor akCaster) Event OnEffectStart(Actor akTarget, Actor akCaster)
Actor PlayerRef = Game.GetPlayer() Actor PlayerRef = Game.GetForm(0x14) as Actor
TalentLevel = GetPlayerTalentLevel(_00E_Class_LifeAndDeath_P09b_Talent_EldritchBlood, _00E_Class_LifeAndDeath_P09b_Talent_EldritchBlood2, _00E_Class_LifeAndDeath_P09b_Talent_EldritchBlood3) TalentLevel = GetPlayerTalentLevel(_00E_Class_LifeAndDeath_P09b_Talent_EldritchBlood, _00E_Class_LifeAndDeath_P09b_Talent_EldritchBlood2, _00E_Class_LifeAndDeath_P09b_Talent_EldritchBlood3)
Game.ShowFirstPersonGeometry() Game.ShowFirstPersonGeometry()
@ -29,10 +33,6 @@ Event OnEffectStart(Actor akTarget, Actor akCaster)
_00E_A2_EldritchBloodParticelAttachVFX.Play(Victim) _00E_A2_EldritchBloodParticelAttachVFX.Play(Victim)
If Victim.GetCombatTarget() == PlayerRef
Victim.StopCombat()
EndIf
; Strip Victim off all its factions ; Strip Victim off all its factions
VictimFactions = Victim.GetFactions(-128, 127) VictimFactions = Victim.GetFactions(-128, 127)
VictimFactionRanks = CreateIntArray(VictimFactions.Length) VictimFactionRanks = CreateIntArray(VictimFactions.Length)
@ -55,16 +55,25 @@ Event OnEffectStart(Actor akTarget, Actor akCaster)
Victim.SetActorValue("Confidence", 4) Victim.SetActorValue("Confidence", 4)
Victim.SetActorValue("Aggression", 2) Victim.SetActorValue("Aggression", 2)
Victim.EvaluatePackage() AdjustDamageMult(Victim)
AdjustAndAddFrenzyPerk()
Victim.StopCombat()
If A2_EldritchBlood_VictimTarget.GetActorReference()
A2_EldritchBlood_Victim.GetActorReference().StartCombat(A2_EldritchBlood_VictimTarget.GetActorReference())
ElseIf PlayerREF.GetCombatTarget()
A2_EldritchBlood_Victim.GetActorReference().StartCombat(PlayerREF.GetCombatTarget())
EndIf
EndEvent EndEvent
Event OnEffectFinish(Actor akTarget, Actor akCaster) Event OnEffectFinish(Actor akTarget, Actor akCaster)
Victim.SetActorValue("attackdamagemult", fInitialAttackDamageMult)
Victim.SetActorValue("destructionpowermod", fInitialDestructionPowerMod)
_00E_A2_EldritchBloodMarkedFXS.Stop(Victim) _00E_A2_EldritchBloodMarkedFXS.Stop(Victim)
Victim.RemovePerk(iPerk)
A2_EldritchBlood_Victim.Clear() A2_EldritchBlood_Victim.Clear()
A2_EldritchBlood_VictimTarget.Clear() A2_EldritchBlood_VictimTarget.Clear()
_00E_A2_EldritchBloodParticelAttachVFX.Stop(Victim) _00E_A2_EldritchBloodParticelAttachVFX.Stop(Victim)
@ -85,6 +94,7 @@ Event OnEffectFinish(Actor akTarget, Actor akCaster)
EndWhile EndWhile
Victim.EvaluatePackage() Victim.EvaluatePackage()
EndEvent EndEvent
Event OnDying(Actor akKiller) Event OnDying(Actor akKiller)
@ -98,33 +108,20 @@ EndEvent
; FUNCTIONS ; FUNCTIONS
;===================================================================================== ;=====================================================================================
Function AdjustAndAddFrenzyPerk() Function AdjustDamageMult(Actor Victim)
float iDamageMultiplicator = _00E_A2_EldritchBloodSP.GetNthEffectMagnitude(TalentLevel + 2) float iDamageMultiplicator = GetMagnitude()
If TalentLevel == 1 fInitialAttackDamageMult = Victim.GetActorValue("attackdamagemult")
iPerk = _00E_A2_EldritchBloodPerk01 fInitialDestructionPowerMod = Victim.GetActorValue("destructionpowermod")
Elseif TalentLevel == 2
iPerk = _00E_A2_EldritchBloodPerk02 Victim.SetActorValue("attackdamagemult", fInitialAttackDamageMult * iDamageMultiplicator)
Elseif TalentLevel == 3 Victim.SetActorValue("destructionpowermod", fInitialDestructionPowerMod + (100 * iDamageMultiplicator))
iPerk == _00E_A2_EldritchBloodPerk03
EndIf
iPerk.SetNthEntryValue(1, 1, iDamageMultiplicator)
iPerk.SetNthEntryValue(2, 1, iDamageMultiplicator)
EndFunction EndFunction
Function Explode() Function Explode()
If TalentLevel == 1
iPerk = _00E_A2_EldritchBloodPerk01
Elseif TalentLevel == 2
iPerk = _00E_A2_EldritchBloodPerk02
Elseif TalentLevel == 3
iPerk == _00E_A2_EldritchBloodPerk03
EndIf
Victim.SetCriticalStage(Victim.CritStage_DisintegrateStart) Victim.SetCriticalStage(Victim.CritStage_DisintegrateStart)
If bSynergySkyfallExplosion If bSynergySkyfallExplosion
@ -172,14 +169,14 @@ Function Explode()
_00E_A2_ShatterSoulExpIMOD.Apply() _00E_A2_ShatterSoulExpIMOD.Apply()
Victim.AttachAshPile(_00E_EldritchPile) Victim.AttachAshPile(_00E_EldritchPile)
EndIf EndIf
ObjectReference VictimREF = Victim as ObjectReference ObjectReference VictimREF = Victim as ObjectReference
(VictimREF as _00E_EPOnDeath).HasBlameSpell = true (VictimREF as _00E_EPOnDeath).HasBlameSpell = true
Victim.SetAlpha(0.0, true) Victim.SetAlpha(0.0, true)
Victim.Kill(Victim) Victim.Kill(Victim)
Victim.SetCriticalStage(Victim.CritStage_DisintegrateEnd) Victim.SetCriticalStage(Victim.CritStage_DisintegrateEnd)
EXPMarker.Delete() EXPMarker.Delete()
EndFunction EndFunction
@ -187,6 +184,9 @@ EndFunction
; PROPERTIES ; PROPERTIES
;===================================================================================== ;=====================================================================================
float fInitialAttackDamageMult
float fInitialDestructionPowerMod
Faction[] VictimFactions Faction[] VictimFactions
Int[] VictimFactionRanks Int[] VictimFactionRanks
FormList Property VoiceFactions Auto FormList Property VoiceFactions Auto

View File

@ -1,5 +1,10 @@
Scriptname _00E_FS_NQ03_CommentSkeletonScr extends ObjectReference Scriptname _00E_FS_NQ03_CommentSkeletonScr extends ObjectReference
event OnInit()
; Block loot menus
BlockActivation()
endevent
Event OnActivate(ObjectReference akActionRef) Event OnActivate(ObjectReference akActionRef)
if Done == false if Done == false

View File

@ -1,8 +1,16 @@
Scriptname _00E_FS_NQR05_FatherDeathSC extends Actor Scriptname _00E_FS_NQR05_FatherDeathSC extends Actor
Event OnDying(Actor akKiller)
BlockActivation()
endEvent
Event OnDeath(Actor akKiller)
BlockActivation()
endEvent
Event OnActivate(ObjectReference akActionRef) Event OnActivate(ObjectReference akActionRef)
if akActionRef == Game.GetPlayer() && Self.IsDead() if (akActionRef == Game.GetForm(0x14)) && IsDead()
_00E_MAGEldritchFireSSVar01M.Play(Game.GetPlayer()) _00E_MAGEldritchFireSSVar01M.Play(Game.GetPlayer())
_00E_FS_NQR05_FatherActivationBlock.Show() _00E_FS_NQR05_FatherActivationBlock.Show()
@ -13,4 +21,4 @@ EndEvent
Message Property _00E_FS_NQR05_FatherActivationBlock Auto Message Property _00E_FS_NQR05_FatherActivationBlock Auto
Sound Property _00E_MAGEldritchFireSSVar01M Auto Sound Property _00E_MAGEldritchFireSSVar01M Auto

View File

@ -1,5 +1,14 @@
Scriptname _00E_NQ_G_06_ChestActivationEvent extends ObjectReference Scriptname _00E_NQ_G_06_ChestActivationEvent extends ObjectReference
event OnInit()
; Block loot menus
BlockActivation()
endevent
Event OnLoad()
BlockActivation()
endEvent
Event OnActivate(ObjectReference akActionRef) Event OnActivate(ObjectReference akActionRef)
if akActionRef == PlayerREF && !bDone && _00E_NQ_G_SidedMael.GetValue() == 1 if akActionRef == PlayerREF && !bDone && _00E_NQ_G_SidedMael.GetValue() == 1

View File

@ -6,7 +6,7 @@ Float fDefaultHeadTrackTimerOldValue = 0.0
Float fStayHeadTrackTimerOldValue = 0.0 Float fStayHeadTrackTimerOldValue = 0.0
int function _GetScriptVersion() Global int function _GetScriptVersion() Global
return 1 return 2
endFunction endFunction
Event OnInit() Event OnInit()
@ -21,6 +21,14 @@ Event OnPlayerLoadGame()
if ControlRepository == None if ControlRepository == None
ControlRepository = Game.GetForm(0x493C2) as _00E_EnderalControls ControlRepository = Game.GetForm(0x493C2) as _00E_EnderalControls
endif endif
; Restore INI values changed by Entropic Blood
if Utility.GetINIFloat("fInAirFallingCharGravityMult:Havok") < 1.0
Utility.SetINIFloat("fInAirFallingCharGravityMult:Havok", 1.35)
endif
if Utility.GetINIFloat("fActivatePickLength:Interface") >= 1799.0
Utility.SetINIFloat("fActivatePickLength:Interface", 150.0)
endif
EndEvent EndEvent
_00E_SkillControl function GetSkillControl() Global _00E_SkillControl function GetSkillControl() Global

View File

@ -1,5 +1,13 @@
Scriptname _00E_SetStageOnOpen extends ObjectReference Scriptname _00E_SetStageOnOpen extends ObjectReference
Event OnInit()
BlockActivation()
EndEvent
Event OnLoad()
BlockActivation()
EndEvent
Event OnActivate(ObjectReference akActionRef) Event OnActivate(ObjectReference akActionRef)
If (akActionRef == Game.GetPlayer()) && (doOnce == 0) If (akActionRef == Game.GetPlayer()) && (doOnce == 0)

View File

@ -12,6 +12,8 @@ EndEvent
Event OnEffectFinish(Actor akTarget, Actor akCaster) Event OnEffectFinish(Actor akTarget, Actor akCaster)
_00E_PlayerFunctions.GetVisionControl().UpdateSpeed(akTarget) _00E_PlayerFunctions.GetVisionControl().UpdateSpeed(akTarget)
; Also restored on game load in _00E_PlayerFunctions
Utility.SetINIFloat("fInAirFallingCharGravityMult:Havok", 1.35) Utility.SetINIFloat("fInAirFallingCharGravityMult:Havok", 1.35)
EndEvent EndEvent

View File

@ -216,24 +216,25 @@ EndFunction
Function equipeItems() Function equipeItems()
Actor PlayerRef = Game.GetPlayer() Actor PlayerRef = Game.GetPlayer()
bool bSKSE = SKSE.GetVersion() as bool
if whatKindRight == 2 if whatKindRight == 2
PlayerRef.EquipSpell(EquippedItemRight as Spell, 1) PlayerRef.EquipSpell(EquippedItemRight as Spell, 1)
elseif EquippedItemRight && PlayerRef.GetItemCount(EquippedItemRight) > 0 elseif EquippedItemRight && PlayerRef.GetItemCount(EquippedItemRight) > 0
if SKSE.GetVersion() if bSKSE
PlayerRef.EquipItemEx(EquippedItemRight, 1) PlayerRef.EquipItemEx(EquippedItemRight, 1)
else else
PlayerRef.equipitem(EquippedItemRight, false, true) PlayerRef.EquipItem(EquippedItemRight, false, true)
endif endif
endif endif
if whatKindLeft == 2 if whatKindLeft == 2
PlayerRef.EquipSpell(EquippedItemLeft as Spell, 0) PlayerRef.EquipSpell(EquippedItemLeft as Spell, 0)
elseif EquippedItemLeft && PlayerRef.GetItemCount(EquippedItemLeft) > 0 elseif EquippedItemLeft && PlayerRef.GetItemCount(EquippedItemLeft) > 0
if SKSE.GetVersion() if bSKSE
PlayerRef.EquipItemEx(EquippedItemLeft, 2) PlayerRef.EquipItemEx(EquippedItemLeft, 2)
else else
PlayerRef.equipitem(EquippedItemLeft, false, true) PlayerRef.EquipItem(EquippedItemLeft, false, true)
endif endif
endif endif
@ -241,10 +242,15 @@ Function equipeItems()
while index > 0 while index > 0
index -= 1 index -= 1
If wornArmor[index] && PlayerRef.GetItemCount(wornArmor[index]) > 0 If wornArmor[index] && PlayerRef.GetItemCount(wornArmor[index]) > 0
;removing and readding items fixes the issue that set bonuses wouldn't apply properly after re-transforming if bSKSE
PlayerRef.RemoveItem(wornArmor[index], 1, true, _00E_TransformStorageREF) ; EquipItemEx triggers OnEquipped properly
_00E_TransformStorageREF.RemoveItem(wornArmor[index], 1, true, PlayerRef) PlayerRef.EquipItemEx(wornArmor[index], 0, false, false)
PlayerRef.EquipItem(wornArmor[index],false,true) else
;removing and readding items fixes the issue that set bonuses wouldn't apply properly after re-transforming
PlayerRef.RemoveItem(wornArmor[index], 1, true, _00E_TransformStorageREF)
_00E_TransformStorageREF.RemoveItem(wornArmor[index], 1, true, PlayerRef)
PlayerRef.EquipItem(wornArmor[index], false, true)
endif
EndIf EndIf
Endwhile Endwhile
endFunction endFunction

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.