parent
3289d82337
commit
51b49535ed
25 changed files with 1427 additions and 0 deletions
Binary file not shown.
@ -0,0 +1,3 @@ |
||||
ShowWarningOnInitFail = true |
||||
SendAchievementsToLE = false |
||||
TestMode = true |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,540 @@ |
||||
/src/steam |
||||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/clion,visualstudio,visualstudiocode,cmake |
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=clion,visualstudio,visualstudiocode,cmake |
||||
|
||||
### CLion ### |
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider |
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 |
||||
|
||||
# User-specific stuff |
||||
.idea/**/workspace.xml |
||||
.idea/**/tasks.xml |
||||
.idea/**/usage.statistics.xml |
||||
.idea/**/dictionaries |
||||
.idea/**/shelf |
||||
.vscode/ |
||||
|
||||
# AWS User-specific |
||||
.idea/**/aws.xml |
||||
|
||||
# Generated files |
||||
.idea/**/contentModel.xml |
||||
|
||||
# Sensitive or high-churn files |
||||
.idea/**/dataSources/ |
||||
.idea/**/dataSources.ids |
||||
.idea/**/dataSources.local.xml |
||||
.idea/**/sqlDataSources.xml |
||||
.idea/**/dynamic.xml |
||||
.idea/**/uiDesigner.xml |
||||
.idea/**/dbnavigator.xml |
||||
|
||||
# Gradle |
||||
.idea/**/gradle.xml |
||||
.idea/**/libraries |
||||
|
||||
# Gradle and Maven with auto-import |
||||
# When using Gradle or Maven with auto-import, you should exclude module files, |
||||
# since they will be recreated, and may cause churn. Uncomment if using |
||||
# auto-import. |
||||
# .idea/artifacts |
||||
# .idea/compiler.xml |
||||
# .idea/jarRepositories.xml |
||||
# .idea/modules.xml |
||||
# .idea/*.iml |
||||
# .idea/modules |
||||
# *.iml |
||||
# *.ipr |
||||
|
||||
# CMake |
||||
cmake-build-*/ |
||||
|
||||
# Mongo Explorer plugin |
||||
.idea/**/mongoSettings.xml |
||||
|
||||
# File-based project format |
||||
*.iws |
||||
|
||||
# IntelliJ |
||||
out/ |
||||
|
||||
# mpeltonen/sbt-idea plugin |
||||
.idea_modules/ |
||||
|
||||
# JIRA plugin |
||||
atlassian-ide-plugin.xml |
||||
|
||||
# Cursive Clojure plugin |
||||
.idea/replstate.xml |
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ) |
||||
com_crashlytics_export_strings.xml |
||||
crashlytics.properties |
||||
crashlytics-build.properties |
||||
fabric.properties |
||||
|
||||
# Editor-based Rest Client |
||||
.idea/httpRequests |
||||
|
||||
# Android studio 3.1+ serialized cache file |
||||
.idea/caches/build_file_checksums.ser |
||||
|
||||
### CLion Patch ### |
||||
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 |
||||
|
||||
# *.iml |
||||
# modules.xml |
||||
# .idea/misc.xml |
||||
# *.ipr |
||||
|
||||
# Sonarlint plugin |
||||
# https://plugins.jetbrains.com/plugin/7973-sonarlint |
||||
.idea/**/sonarlint/ |
||||
|
||||
# SonarQube Plugin |
||||
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin |
||||
.idea/**/sonarIssues.xml |
||||
|
||||
# Markdown Navigator plugin |
||||
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced |
||||
.idea/**/markdown-navigator.xml |
||||
.idea/**/markdown-navigator-enh.xml |
||||
.idea/**/markdown-navigator/ |
||||
|
||||
# Cache file creation bug |
||||
# See https://youtrack.jetbrains.com/issue/JBR-2257 |
||||
.idea/$CACHE_FILE$ |
||||
|
||||
# CodeStream plugin |
||||
# https://plugins.jetbrains.com/plugin/12206-codestream |
||||
.idea/codestream.xml |
||||
|
||||
### CMake ### |
||||
CMakeLists.txt.user |
||||
CMakeCache.txt |
||||
CMakeFiles |
||||
CMakeScripts |
||||
Testing |
||||
Makefile |
||||
cmake_install.cmake |
||||
install_manifest.txt |
||||
compile_commands.json |
||||
CTestTestfile.cmake |
||||
_deps |
||||
|
||||
### CMake Patch ### |
||||
# External projects |
||||
*-prefix/ |
||||
|
||||
### VisualStudioCode ### |
||||
.vscode/* |
||||
!.vscode/settings.json |
||||
!.vscode/tasks.json |
||||
!.vscode/launch.json |
||||
!.vscode/extensions.json |
||||
|
||||
# Local History for Visual Studio Code |
||||
.history/ |
||||
|
||||
### VisualStudioCode Patch ### |
||||
# Ignore all local history of files |
||||
.history |
||||
.ionide |
||||
|
||||
# Support for Project snippet scope |
||||
!.vscode/*.code-snippets |
||||
|
||||
### VisualStudio ### |
||||
## Ignore Visual Studio temporary files, build results, and |
||||
## files generated by popular Visual Studio add-ons. |
||||
## |
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore |
||||
|
||||
# User-specific files |
||||
*.rsuser |
||||
*.suo |
||||
*.user |
||||
*.userosscache |
||||
*.sln.docstates |
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio) |
||||
*.userprefs |
||||
|
||||
# Mono auto generated files |
||||
mono_crash.* |
||||
|
||||
# Build results |
||||
[Dd]ebug/ |
||||
[Dd]ebugPublic/ |
||||
[Rr]elease/ |
||||
[Rr]eleases/ |
||||
x64/ |
||||
x86/ |
||||
[Ww][Ii][Nn]32/ |
||||
[Aa][Rr][Mm]/ |
||||
[Aa][Rr][Mm]64/ |
||||
bld/ |
||||
[Bb]in/ |
||||
[Oo]bj/ |
||||
[Ll]og/ |
||||
[Ll]ogs/ |
||||
|
||||
# Visual Studio 2015/2017 cache/options directory |
||||
.vs/ |
||||
# Uncomment if you have tasks that create the project's static files in wwwroot |
||||
#wwwroot/ |
||||
|
||||
# Visual Studio 2017 auto generated files |
||||
Generated\ Files/ |
||||
|
||||
# MSTest test Results |
||||
[Tt]est[Rr]esult*/ |
||||
[Bb]uild[Ll]og.* |
||||
|
||||
# NUnit |
||||
*.VisualState.xml |
||||
TestResult.xml |
||||
nunit-*.xml |
||||
|
||||
# Build Results of an ATL Project |
||||
[Dd]ebugPS/ |
||||
[Rr]eleasePS/ |
||||
dlldata.c |
||||
|
||||
# Benchmark Results |
||||
BenchmarkDotNet.Artifacts/ |
||||
|
||||
# .NET Core |
||||
project.lock.json |
||||
project.fragment.lock.json |
||||
artifacts/ |
||||
|
||||
# ASP.NET Scaffolding |
||||
ScaffoldingReadMe.txt |
||||
|
||||
# StyleCop |
||||
StyleCopReport.xml |
||||
|
||||
# Files built by Visual Studio |
||||
*_i.c |
||||
*_p.c |
||||
*_h.h |
||||
*.ilk |
||||
*.meta |
||||
*.obj |
||||
*.iobj |
||||
*.pch |
||||
*.pdb |
||||
*.ipdb |
||||
*.pgc |
||||
*.pgd |
||||
*.rsp |
||||
*.sbr |
||||
*.tlb |
||||
*.tli |
||||
*.tlh |
||||
*.tmp |
||||
*.tmp_proj |
||||
*_wpftmp.csproj |
||||
*.log |
||||
*.tlog |
||||
*.vspscc |
||||
*.vssscc |
||||
.builds |
||||
*.pidb |
||||
*.svclog |
||||
*.scc |
||||
|
||||
# Chutzpah Test files |
||||
_Chutzpah* |
||||
|
||||
# Visual C++ cache files |
||||
ipch/ |
||||
*.aps |
||||
*.ncb |
||||
*.opendb |
||||
*.opensdf |
||||
*.sdf |
||||
*.cachefile |
||||
*.VC.db |
||||
*.VC.VC.opendb |
||||
|
||||
# Visual Studio profiler |
||||
*.psess |
||||
*.vsp |
||||
*.vspx |
||||
*.sap |
||||
|
||||
# Visual Studio Trace Files |
||||
*.e2e |
||||
|
||||
# TFS 2012 Local Workspace |
||||
$tf/ |
||||
|
||||
# Guidance Automation Toolkit |
||||
*.gpState |
||||
|
||||
# ReSharper is a .NET coding add-in |
||||
_ReSharper*/ |
||||
*.[Rr]e[Ss]harper |
||||
*.DotSettings.user |
||||
|
||||
# TeamCity is a build add-in |
||||
_TeamCity* |
||||
|
||||
# DotCover is a Code Coverage Tool |
||||
*.dotCover |
||||
|
||||
# AxoCover is a Code Coverage Tool |
||||
.axoCover/* |
||||
!.axoCover/settings.json |
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool |
||||
coverage*.json |
||||
coverage*.xml |
||||
coverage*.info |
||||
|
||||
# Visual Studio code coverage results |
||||
*.coverage |
||||
*.coveragexml |
||||
|
||||
# NCrunch |
||||
_NCrunch_* |
||||
.*crunch*.local.xml |
||||
nCrunchTemp_* |
||||
|
||||
# MightyMoose |
||||
*.mm.* |
||||
AutoTest.Net/ |
||||
|
||||
# Web workbench (sass) |
||||
.sass-cache/ |
||||
|
||||
# Installshield output folder |
||||
[Ee]xpress/ |
||||
|
||||
# DocProject is a documentation generator add-in |
||||
DocProject/buildhelp/ |
||||
DocProject/Help/*.HxT |
||||
DocProject/Help/*.HxC |
||||
DocProject/Help/*.hhc |
||||
DocProject/Help/*.hhk |
||||
DocProject/Help/*.hhp |
||||
DocProject/Help/Html2 |
||||
DocProject/Help/html |
||||
|
||||
# Click-Once directory |
||||
publish/ |
||||
|
||||
# Publish Web Output |
||||
*.[Pp]ublish.xml |
||||
*.azurePubxml |
||||
# Note: Comment the next line if you want to checkin your web deploy settings, |
||||
# but database connection strings (with potential passwords) will be unencrypted |
||||
*.pubxml |
||||
*.publishproj |
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to |
||||
# checkin your Azure Web App publish settings, but sensitive information contained |
||||
# in these scripts will be unencrypted |
||||
PublishScripts/ |
||||
|
||||
# NuGet Packages |
||||
*.nupkg |
||||
# NuGet Symbol Packages |
||||
*.snupkg |
||||
# The packages folder can be ignored because of Package Restore |
||||
**/[Pp]ackages/* |
||||
# except build/, which is used as an MSBuild target. |
||||
!**/[Pp]ackages/build/ |
||||
# Uncomment if necessary however generally it will be regenerated when needed |
||||
#!**/[Pp]ackages/repositories.config |
||||
# NuGet v3's project.json files produces more ignorable files |
||||
*.nuget.props |
||||
*.nuget.targets |
||||
|
||||
# Nuget personal access tokens and Credentials |
||||
# nuget.config |
||||
|
||||
# Microsoft Azure Build Output |
||||
csx/ |
||||
*.build.csdef |
||||
|
||||
# Microsoft Azure Emulator |
||||
ecf/ |
||||
rcf/ |
||||
|
||||
# Windows Store app package directories and files |
||||
AppPackages/ |
||||
BundleArtifacts/ |
||||
Package.StoreAssociation.xml |
||||
_pkginfo.txt |
||||
*.appx |
||||
*.appxbundle |
||||
*.appxupload |
||||
|
||||
# Visual Studio cache files |
||||
# files ending in .cache can be ignored |
||||
*.[Cc]ache |
||||
# but keep track of directories ending in .cache |
||||
!?*.[Cc]ache/ |
||||
|
||||
# Others |
||||
ClientBin/ |
||||
~$* |
||||
*~ |
||||
*.dbmdl |
||||
*.dbproj.schemaview |
||||
*.jfm |
||||
*.pfx |
||||
*.publishsettings |
||||
orleans.codegen.cs |
||||
|
||||
# Including strong name files can present a security risk |
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424) |
||||
#*.snk |
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components |
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) |
||||
#bower_components/ |
||||
|
||||
# RIA/Silverlight projects |
||||
Generated_Code/ |
||||
|
||||
# Backup & report files from converting an old project file |
||||
# to a newer Visual Studio version. Backup files are not needed, |
||||
# because we have git ;-) |
||||
_UpgradeReport_Files/ |
||||
Backup*/ |
||||
UpgradeLog*.XML |
||||
UpgradeLog*.htm |
||||
ServiceFabricBackup/ |
||||
*.rptproj.bak |
||||
|
||||
# SQL Server files |
||||
*.mdf |
||||
*.ldf |
||||
*.ndf |
||||
|
||||
# Business Intelligence projects |
||||
*.rdl.data |
||||
*.bim.layout |
||||
*.bim_*.settings |
||||
*.rptproj.rsuser |
||||
*- [Bb]ackup.rdl |
||||
*- [Bb]ackup ([0-9]).rdl |
||||
*- [Bb]ackup ([0-9][0-9]).rdl |
||||
|
||||
# Microsoft Fakes |
||||
FakesAssemblies/ |
||||
|
||||
# GhostDoc plugin setting file |
||||
*.GhostDoc.xml |
||||
|
||||
# Node.js Tools for Visual Studio |
||||
.ntvs_analysis.dat |
||||
node_modules/ |
||||
|
||||
# Visual Studio 6 build log |
||||
*.plg |
||||
|
||||
# Visual Studio 6 workspace options file |
||||
*.opt |
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) |
||||
*.vbw |
||||
|
||||
# Visual Studio LightSwitch build output |
||||
**/*.HTMLClient/GeneratedArtifacts |
||||
**/*.DesktopClient/GeneratedArtifacts |
||||
**/*.DesktopClient/ModelManifest.xml |
||||
**/*.Server/GeneratedArtifacts |
||||
**/*.Server/ModelManifest.xml |
||||
_Pvt_Extensions |
||||
|
||||
# Paket dependency manager |
||||
.paket/paket.exe |
||||
paket-files/ |
||||
|
||||
# FAKE - F# Make |
||||
.fake/ |
||||
|
||||
# CodeRush personal settings |
||||
.cr/personal |
||||
|
||||
# Python Tools for Visual Studio (PTVS) |
||||
__pycache__/ |
||||
*.pyc |
||||
|
||||
# Cake - Uncomment if you are using it |
||||
# tools/** |
||||
# !tools/packages.config |
||||
|
||||
# Tabs Studio |
||||
*.tss |
||||
|
||||
# Telerik's JustMock configuration file |
||||
*.jmconfig |
||||
|
||||
# BizTalk build output |
||||
*.btp.cs |
||||
*.btm.cs |
||||
*.odx.cs |
||||
*.xsd.cs |
||||
|
||||
# OpenCover UI analysis results |
||||
OpenCover/ |
||||
|
||||
# Azure Stream Analytics local run output |
||||
ASALocalRun/ |
||||
|
||||
# MSBuild Binary and Structured Log |
||||
*.binlog |
||||
|
||||
# NVidia Nsight GPU debugger configuration file |
||||
*.nvuser |
||||
|
||||
# MFractors (Xamarin productivity tool) working folder |
||||
.mfractor/ |
||||
|
||||
# Local History for Visual Studio |
||||
.localhistory/ |
||||
|
||||
# BeatPulse healthcheck temp database |
||||
healthchecksdb |
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017 |
||||
MigrationBackup/ |
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder |
||||
.ionide/ |
||||
|
||||
# Fody - auto-generated XML schema |
||||
FodyWeavers.xsd |
||||
|
||||
# VS Code files for those working on multiple tools |
||||
|
||||
# Local History for Visual Studio Code |
||||
|
||||
# Windows Installer files from build outputs |
||||
*.cab |
||||
*.msi |
||||
*.msix |
||||
*.msm |
||||
*.msp |
||||
|
||||
# JetBrains Rider |
||||
.idea/ |
||||
*.sln.iml |
||||
|
||||
### VisualStudio Patch ### |
||||
# Additional files built by Visual Studio |
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/clion,visualstudio,visualstudiocode,cmake |
||||
|
||||
build/ |
||||
|
||||
contrib/Distribution/**/*.dll |
||||
contrib/Distribution/**/*.pdb |
||||
contrib/Distribution/**/*.pex |
@ -0,0 +1,77 @@ |
||||
cmake_minimum_required(VERSION 3.21) |
||||
message("Using toolchain file ${CMAKE_TOOLCHAIN_FILE}.") |
||||
|
||||
######################################################################################################################## |
||||
## Define project |
||||
######################################################################################################################## |
||||
project( |
||||
EnderalSteam |
||||
VERSION 1.0.0 |
||||
DESCRIPTION "Enderal SE Steam Support" |
||||
LANGUAGES CXX) |
||||
set(CMAKE_CXX_STANDARD 23) |
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON) |
||||
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON) |
||||
|
||||
include(GNUInstallDirs) |
||||
|
||||
find_path(SIMPLEINI_INCLUDE_DIRS "ConvertUTF.c") |
||||
|
||||
configure_file( |
||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.rc.in |
||||
${CMAKE_CURRENT_BINARY_DIR}/version.rc |
||||
@ONLY) |
||||
|
||||
set(sources |
||||
src/Main.cpp |
||||
src/Papyrus.cpp |
||||
src/EventListener.cpp |
||||
src/Achievements.cpp |
||||
|
||||
${CMAKE_CURRENT_BINARY_DIR}/version.rc) |
||||
|
||||
source_group( |
||||
TREE ${CMAKE_CURRENT_SOURCE_DIR} |
||||
FILES |
||||
${headers} |
||||
${sources}) |
||||
|
||||
######################################################################################################################## |
||||
## Configure target DLL |
||||
######################################################################################################################## |
||||
find_package(CommonLibSSE CONFIG REQUIRED) |
||||
|
||||
add_commonlibsse_plugin(${PROJECT_NAME} SOURCES ${headers} ${sources}) |
||||
add_library("${PROJECT_NAME}::${PROJECT_NAME}" ALIAS "${PROJECT_NAME}") |
||||
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/steam_api64.lib) |
||||
|
||||
target_include_directories(${PROJECT_NAME} |
||||
PRIVATE |
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src> |
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/src> |
||||
$<INSTALL_INTERFACE:src> |
||||
${SIMPLEINI_INCLUDE_DIRS} |
||||
) |
||||
|
||||
target_include_directories(${PROJECT_NAME} |
||||
PUBLIC |
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>) |
||||
|
||||
target_precompile_headers(${PROJECT_NAME} |
||||
PRIVATE |
||||
src/PCH.h) |
||||
|
||||
install(TARGETS ${PROJECT_NAME} |
||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}") |
||||
|
||||
|
||||
|
||||
######################################################################################################################## |
||||
## Automatic plugin deployment |
||||
######################################################################################################################## |
||||
|
||||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_SOURCE_DIR}/../../SKSE/Plugins/") |
||||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${PROJECT_NAME}> "${CMAKE_CURRENT_SOURCE_DIR}/../../SKSE/Plugins/") |
@ -0,0 +1,252 @@ |
||||
{ |
||||
"version": 2, |
||||
"cmakeMinimumRequired": { |
||||
"major": 3, |
||||
"minor": 21, |
||||
"patch": 0 |
||||
}, |
||||
"configurePresets": [ |
||||
{ |
||||
"name": "base", |
||||
"hidden": true, |
||||
"cacheVariables": { |
||||
"CMAKE_CXX_FLAGS": "$env{COMMONLIBSSE_COMPILER} $env{COMMONLIBSSE_PLATFORM} $env{COMMONLIBSSE_TEXT}" |
||||
} |
||||
}, |
||||
{ |
||||
"name": "vcpkg", |
||||
"hidden": true, |
||||
"cacheVariables": { |
||||
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", |
||||
"VCPKG_TARGET_TRIPLET": "x64-windows-skse", |
||||
"VCPKG_HOST_TRIPLET": "x64-windows-skse", |
||||
"VCPKG_OVERLAY_TRIPLETS": "${sourceDir}/cmake", |
||||
"CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL" |
||||
} |
||||
}, |
||||
{ |
||||
"name": "win32", |
||||
"hidden": true, |
||||
"environment": { |
||||
"COMMONLIBSSE_PLATFORM": "-DWIN32_LEAN_AND_MEAN -DNOMINMAX" |
||||
} |
||||
}, |
||||
{ |
||||
"name": "win32-unicode", |
||||
"hidden": true, |
||||
"inherits": "win32", |
||||
"environment": { |
||||
"COMMONLIBSSE_TEXT": "-DUNICODE -D_UNICODE" |
||||
} |
||||
}, |
||||
{ |
||||
"name": "x64", |
||||
"hidden": true, |
||||
"architecture": { |
||||
"value": "x64", |
||||
"strategy": "external" |
||||
} |
||||
}, |
||||
{ |
||||
"name": "msvc", |
||||
"hidden": true, |
||||
"environment": { |
||||
"COMMONLIBSSE_COMPILER": "/permissive- /Zc:preprocessor /EHsc $penv{CXXFLAGS}" |
||||
}, |
||||
"vendor": { |
||||
"microsoft.com/VisualStudioSettings/CMake/1.0": { |
||||
"intelliSenseMode": "windows-msvc-x64", |
||||
"enableMicrosoftCodeAnalysis": true, |
||||
"enableClangTidyCodeAnalysis": true |
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
"name": "clang-cl", |
||||
"hidden": true, |
||||
"cacheVariables": { |
||||
"CMAKE_C_COMPILER": "clang-cl", |
||||
"CMAKE_CXX_COMPILER": "clang-cl" |
||||
}, |
||||
"environment": { |
||||
"COMMONLIBSSE_COMPILER": "/permissive- /EHsc -Wno-overloaded-virtual -Wno-delete-non-abstract-non-virtual-dtor -D__cpp_lib_char8_t -D__cpp_consteval -D__cpp_lib_format $penv{CXXFLAGS}" |
||||
}, |
||||
"vendor": { |
||||
"microsoft.com/VisualStudioSettings/CMake/1.0": { |
||||
"intelliSenseMode": "windows-clang-x64", |
||||
"enableMicrosoftCodeAnalysis": true, |
||||
"enableClangTidyCodeAnalysis": true |
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
"name": "build-tests", |
||||
"displayName": "Build Tests", |
||||
"hidden": true, |
||||
"description": "Include test suites in the build.", |
||||
"cacheVariables": { |
||||
"BUILD_TESTS": { |
||||
"type": "STRING", |
||||
"value": "ON" |
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
"name": "build-release-msvc", |
||||
"inherits": [ |
||||
"base", |
||||
"vcpkg", |
||||
"win32-unicode", |
||||
"x64", |
||||
"build-tests", |
||||
"msvc" |
||||
], |
||||
"displayName": "Release", |
||||
"description": "Optimized release build.", |
||||
"generator": "Ninja", |
||||
"binaryDir": "${sourceDir}/build/release-msvc", |
||||
"cacheVariables": { |
||||
"CMAKE_BUILD_TYPE": { |
||||
"type": "STRING", |
||||
"value": "Release" |
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
"name": "build-debug-msvc", |
||||
"inherits": [ |
||||
"base", |
||||
"vcpkg", |
||||
"win32-unicode", |
||||
"x64", |
||||
"build-tests", |
||||
"msvc" |
||||
], |
||||
"displayName": "Debug", |
||||
"description": "Debug build for testing.", |
||||
"generator": "Ninja", |
||||
"binaryDir": "${sourceDir}/build/debug-msvc", |
||||
"cacheVariables": { |
||||
"CMAKE_BUILD_TYPE": { |
||||
"type": "STRING", |
||||
"value": "Debug" |
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
"name": "build-debug-clang-cl", |
||||
"inherits": [ |
||||
"base", |
||||
"vcpkg", |
||||
"win32-unicode", |
||||
"x64", |
||||
"build-tests", |
||||
"clang-cl" |
||||
], |
||||
"displayName": "Debug", |
||||
"description": "Debug build for testing.", |
||||
"generator": "Ninja", |
||||
"binaryDir": "${sourceDir}/build/debug-clang", |
||||
"cacheVariables": { |
||||
"CMAKE_BUILD_TYPE": { |
||||
"type": "STRING", |
||||
"value": "Debug" |
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
"name": "build-release-clang-cl", |
||||
"inherits": [ |
||||
"base", |
||||
"vcpkg", |
||||
"win32-unicode", |
||||
"x64", |
||||
"build-tests", |
||||
"clang-cl" |
||||
], |
||||
"displayName": "Release", |
||||
"description": "Optimized release build.", |
||||
"generator": "Ninja", |
||||
"binaryDir": "${sourceDir}/build/release-clang", |
||||
"cacheVariables": { |
||||
"CMAKE_BUILD_TYPE": { |
||||
"type": "STRING", |
||||
"value": "Release" |
||||
} |
||||
} |
||||
} |
||||
], |
||||
"buildPresets": [ |
||||
{ |
||||
"name": "release-msvc", |
||||
"displayName": "Release (MSVC)", |
||||
"configurePreset": "build-release-msvc", |
||||
"description": "Optimized release build." |
||||
}, |
||||
{ |
||||
"name": "debug-msvc", |
||||
"displayName": "Debug (MSVC)", |
||||
"configurePreset": "build-debug-msvc", |
||||
"description": "Debug build for testing." |
||||
}, |
||||
{ |
||||
"name": "release-clang-cl", |
||||
"displayName": "Release (Clang)", |
||||
"configurePreset": "build-release-clang-cl", |
||||
"description": "Optimized release build." |
||||
}, |
||||
{ |
||||
"name": "debug-clang-cl", |
||||
"displayName": "Debug (Clang)", |
||||
"configurePreset": "build-debug-clang-cl", |
||||
"description": "Debug build for testing." |
||||
} |
||||
], |
||||
"testPresets": [ |
||||
{ |
||||
"name": "tests-all", |
||||
"displayName": "All Tests", |
||||
"configurePreset": "build-debug-msvc", |
||||
"output": { |
||||
"outputOnFailure": true |
||||
}, |
||||
"execution": { |
||||
"noTestsAction": "error", |
||||
"stopOnFailure": false |
||||
} |
||||
}, |
||||
{ |
||||
"name": "tests-unit", |
||||
"displayName": "Unit Tests", |
||||
"description": "Runs tests that do not require any Skyrim module loaded into the process.", |
||||
"inherits": "tests-all", |
||||
"filter": { |
||||
"exclude": { |
||||
"label": "[integration],[e2e]" |
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
"name": "tests-integration", |
||||
"displayName": "Integration Tests", |
||||
"description": "Runs tests that interact with a Skyrim module at rest (do not require the Skyrim module to have run any main function).", |
||||
"inherits": "tests-all", |
||||
"filter": { |
||||
"include": { |
||||
"label": "[integration]" |
||||
} |
||||
} |
||||
}, |
||||
{ |
||||
"name": "tests-e2e", |
||||
"displayName": "End-to-End Tests", |
||||
"description": "Runs test that depend on a fully running Skyrim engine in the process.", |
||||
"inherits": "tests-all", |
||||
"filter": { |
||||
"include": { |
||||
"label": "[e2e]" |
||||
} |
||||
} |
||||
} |
||||
] |
||||
} |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,101 @@ |
||||
#include "Achievements.h" |
||||
#include "Util.h" |
||||
#include "steam/steam_api.h" |
||||
#include <string> |
||||
#include <processenv.h> |
||||
|
||||
namespace Achievements { |
||||
|
||||
void startSteam() |
||||
{ |
||||
std::map<std::string, bool> settings{ |
||||
{ "SendAchievementsToLE", false }, |
||||
{ "TestMode", true }, |
||||
{ "ShowWarningOnInitFail", true } |
||||
}; |
||||
LoadINI(&settings, "Data/SKSE/Plugins/EnderalSteam.ini"); |
||||
|
||||
AchievementsEnabled(!settings.at("TestMode")); |
||||
|
||||
if (settings.at("TestMode")) { |
||||
return; |
||||
} |
||||
|
||||
try { |
||||
if (SteamInstance() == nullptr) { |
||||
SteamAPI_Shutdown(); |
||||
|
||||
if (settings.at("SendAchievementsToLE")) { |
||||
SetEnvironmentVariable(L"SteamAppID", L"933480"); |
||||
SetEnvironmentVariable(L"SteamGameId", L"933480"); |
||||
} else { |
||||
SetEnvironmentVariable(L"SteamAppID", L"976620"); |
||||
SetEnvironmentVariable(L"SteamGameId", L"976620"); |
||||
} |
||||
|
||||
bool success = SteamAPI_Init(); |
||||
|
||||
if (success) { |
||||
logger::info("Steam api init was successfull"); |
||||
} else { |
||||
logger::error("Error while initializing the steam api"); |
||||
if (settings.at("ShowWarningOnInitFail")) { |
||||
RE::DebugMessageBox("Unable to initialize Steam achievements. Try to restart the game and the Steam client. This warning can be disabled in SKSE\\Plugins\\EnderalSteam.ini."); |
||||
} |
||||
} |
||||
|
||||
SteamInstance(new AchievementHolder()); |
||||
} |
||||
else { |
||||
logger::info("Already initialized steam api, skipping it"); |
||||
} |
||||
} |
||||
catch (const std::exception& ex) { |
||||
std::string msg = "Exception while initializing the Steam API, steam achievements will not be available: " + std::string(ex.what()); |
||||
logger::error(msg.c_str()); |
||||
if (settings.at("ShowWarningOnInitFail")) { |
||||
RE::DebugMessageBox("Unable to initialize Steam achievements. Try to restart the game and the Steam client. This warning can be disabled in SKSE\\Plugins\\EnderalSteam.ini."); |
||||
} |
||||
} |
||||
} |
||||
|
||||
AchievementHolder::AchievementHolder() : stats(SteamUserStats()), callback(this, &AchievementHolder::onUserStatsReceived) |
||||
{ |
||||
} |
||||
|
||||
void AchievementHolder::onUserStatsReceived(UserStatsReceived_t * event) { |
||||
try { |
||||
std::string msg = "User id: " + std::to_string(event->m_steamIDUser.ConvertToUint64()) + ", game id: " + std::to_string(event->m_nGameID) + ", success state: " + std::to_string(event->m_eResult); |
||||
logger::info(msg.c_str()); |
||||
|
||||
uint32 achievementCount = this->stats->GetNumAchievements(); |
||||
msg = "There are " + std::to_string(achievementCount) + " achievements"; |
||||
logger::info(msg.c_str()); |
||||
} |
||||
catch (const std::exception& ex) { |
||||
std::string msg = "Exception during steam callback: onUserStatsReceived. Failed to print data: " + std::string(ex.what()); |
||||
logger::info(msg.c_str()); |
||||
} |
||||
} |
||||
|
||||
bool AchievementHolder::setAchievementUnlocked(const char * achievementName) |
||||
{ |
||||
std::string msg = "Unlocking achievement: " + std::string(achievementName); |
||||
logger::info(msg.c_str()); |
||||
bool success = this->stats->SetAchievement(achievementName); |
||||
if (!success) { |
||||
logger::error("Error while unlocking achievement"); |
||||
return false; |
||||
} |
||||
success = this->stats->StoreStats(); |
||||
if (!success) { |
||||
logger::error("Error while storing unlocked achievement"); |
||||
} |
||||
return success; |
||||
} |
||||
|
||||
void AchievementHolder::start() |
||||
{ |
||||
this->stats->RequestCurrentStats(); |
||||
} |
||||
} |
@ -0,0 +1,24 @@ |
||||
#pragma once |
||||
//Steam API Version 1.31 matches the Skyrim Steam API version
|
||||
#include "steam/steam_api.h" |
||||
#include <memory> |
||||
|
||||
namespace Achievements { |
||||
|
||||
class AchievementHolder { |
||||
private: |
||||
ISteamUserStats * stats; |
||||
CCallback<AchievementHolder, UserStatsReceived_t, false> callback; |
||||
|
||||
public: |
||||
AchievementHolder(); |
||||
|
||||
void start(); |
||||
void onUserStatsReceived(UserStatsReceived_t * event); |
||||
bool setAchievementUnlocked(const char * achievementName); |
||||
}; |
||||
|
||||
static std::unique_ptr<AchievementHolder> singleton(nullptr); |
||||
|
||||
void startSteam(); |
||||
} |
@ -0,0 +1,30 @@ |
||||
#include "EventListener.h" |
||||
#include "Achievements.h" |
||||
#include "Util.h" |
||||
|
||||
auto EventListener::GetSingleton() -> EventListener* |
||||
{ |
||||
static EventListener singleton{}; |
||||
return std::addressof(singleton); |
||||
} |
||||
|
||||
void EventListener::Install() |
||||
{ |
||||
RE::UI::GetSingleton()->AddEventSink<RE::MenuOpenCloseEvent>(GetSingleton()); |
||||
} |
||||
|
||||
auto EventListener::ProcessEvent( |
||||
const RE::MenuOpenCloseEvent* a_event, |
||||
RE::BSTEventSource<RE::MenuOpenCloseEvent>* a_eventSource) |
||||
-> RE::BSEventNotifyControl |
||||
{ |
||||
if (a_event->opening && a_event->menuName == "Main Menu") { |
||||
SKSE::GetTaskInterface()->AddTask([]() { |
||||
logger::info("Main menu opened, trying to init steam API."); |
||||
Achievements::startSteam(); |
||||
}); |
||||
RE::UI::GetSingleton()->RemoveEventSink<RE::MenuOpenCloseEvent>(GetSingleton()); |
||||
} |
||||
|
||||
return RE::BSEventNotifyControl::kContinue; |
||||
} |
@ -0,0 +1,23 @@ |
||||
#pragma once |
||||
|
||||
class EventListener : |
||||
public RE::BSTEventSink<RE::MenuOpenCloseEvent> |
||||
{ |
||||
public: |
||||
~EventListener() = default; |
||||
EventListener(const EventListener&) = delete; |
||||
EventListener& operator=(const EventListener&) = delete; |
||||
EventListener& operator=(EventListener&&) = delete; |
||||
|
||||
static auto GetSingleton() -> EventListener*; |
||||
|
||||
static void Install(); |
||||
|
||||
auto ProcessEvent( |
||||
const RE::MenuOpenCloseEvent* a_event, |
||||
RE::BSTEventSource<RE::MenuOpenCloseEvent>* a_eventSource) |
||||
-> RE::BSEventNotifyControl override; |
||||
|
||||
private: |
||||
EventListener() = default; |
||||
}; |
@ -0,0 +1,55 @@ |
||||
#include "EventListener.h" |
||||
#include "Papyrus.h" |
||||
#include "Achievements.h" |
||||
#include "Util.h" |
||||
|
||||
using namespace SKSE; |
||||
|
||||
namespace { |
||||
|
||||
void InitializeLogging() { |
||||
auto path = logger::log_directory(); |
||||
if (!path) { |
||||
SKSE::stl::report_and_fail("Failed to find standard logging directory"sv); |
||||
} |
||||
|
||||
*path /= "EnderalSteam.log"sv; |
||||
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)); |
||||
|
||||
log->set_level(spdlog::level::info); |
||||
log->flush_on(spdlog::level::info); |
||||
|
||||
spdlog::set_default_logger(std::move(log)); |
||||
spdlog::set_pattern("[%l] %v"s); |
||||
} |
||||
|
||||
void InitializeMessaging() |
||||
{ |
||||
GetMessagingInterface()->RegisterListener([](MessagingInterface::Message* message) { |
||||
if (message->type == MessagingInterface::kPostLoad) { |
||||
EventListener::Install(); |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
|
||||
SKSEPluginLoad(const LoadInterface* skse) { |
||||
|
||||
GetLoadInterface(skse); |
||||
|
||||
InitializeLogging(); |
||||
|
||||
auto* plugin = PluginDeclaration::GetSingleton(); |
||||
auto version = plugin->GetVersion(); |
||||
logger::info("{} {} is loading...", plugin->GetName(), version); |
||||
|
||||
Init(skse); |
||||
InitializeMessaging(); |
||||
|
||||
GetPapyrusInterface()->Register(Papyrus::Bind); |
||||
|
||||
logger::info("{} has finished loading.", plugin->GetName()); |
||||
return true; |
||||
} |
@ -0,0 +1,120 @@ |
||||
#pragma once |
||||
|
||||
#include <cassert> |
||||
#include <cctype> |
||||
#include <cerrno> |
||||
#include <cfenv> |
||||
#include <cfloat> |
||||
#include <cinttypes> |
||||
#include <climits> |
||||
#include <clocale> |
||||
#include <cmath> |
||||
#include <csetjmp> |
||||
#include <csignal> |
||||
#include <cstdarg> |
||||
#include <cstddef> |
||||
#include <cstdint> |
||||
#include <cstdlib> |
||||
#include <cstdio> |
||||
#include <cstring> |
||||
#include <ctime> |
||||
#include <cuchar> |
||||
#include <cwchar> |
||||
#include <cwctype> |
||||
|
||||
#include <algorithm> |
||||
#include <any> |
||||
#include <array> |
||||
#include <atomic> |
||||
#include <barrier> |
||||
#include <bit> |
||||
#include <bitset> |
||||
#include <charconv> |
||||
#include <chrono> |
||||
#include <compare> |
||||
#include <complex> |
||||
#include <concepts> |
||||
#include <condition_variable> |
||||
#include <deque> |
||||
#include <exception> |
||||
#include <execution> |
||||
#include <filesystem> |
||||
#include <format> |
||||
#include <forward_list> |
||||
#include <fstream> |
||||
#include <functional> |
||||
#include <future> |
||||
#include <initializer_list> |
||||
#include <iomanip> |
||||
#include <iosfwd> |
||||
#include <ios> |
||||
#include <iostream> |
||||
#include <istream> |
||||
#include <iterator> |
||||
#include <latch> |
||||
#include <limits> |
||||
#include <locale> |
||||
#include <map> |
||||
#include <memory> |
||||
#include <memory_resource> |
||||
#include <mutex> |
||||
#include <new> |
||||
#include <numbers> |
||||
#include <numeric> |
||||
#include <optional> |
||||
#include <ostream> |
||||
#include <queue> |
||||
#include <random> |
||||
#include <ranges> |
||||
#include <regex> |
||||
#include <ratio> |
||||
#include <scoped_allocator> |
||||
#include <semaphore> |
||||
#include <set> |
||||
#include <shared_mutex> |
||||
#include <source_location> |
||||
#include <span> |
||||
#include <sstream> |
||||
#include <stack> |
||||
#include <stdexcept> |
||||
#include <streambuf> |
||||
#include <string> |
||||
#include <string_view> |
||||
#include <syncstream> |
||||
#include <system_error> |
||||
#include <thread> |
||||
#include <tuple> |
||||
#include <typeindex> |
||||
#include <typeinfo> |
||||
#include <type_traits> |
||||
#include <unordered_map> |
||||
#include <unordered_set> |
||||
#include <utility> |
||||
#include <valarray> |
||||
#include <variant> |
||||
#include <vector> |
||||
#include <version> |
||||
|
||||
#include <RE/Skyrim.h> |
||||
#include <SKSE/SKSE.h> |
||||
#include <REL/Relocation.h> |
||||
|
||||
#include <ShlObj_core.h> |
||||
#include <Windows.h> |
||||
#include <Psapi.h> |
||||
#undef cdecl // Workaround for Clang 14 CMake configure error.
|
||||
|
||||
#include <spdlog/sinks/basic_file_sink.h> |
||||
#include <spdlog/sinks/msvc_sink.h> |
||||
|
||||
// Compatible declarations with other sample projects.
|
||||
#define DLLEXPORT __declspec(dllexport) |
||||
|
||||
using namespace std::literals; |
||||
using namespace REL::literals; |
||||
|
||||
namespace logger = SKSE::log; |
||||
|
||||
namespace util { |
||||
using SKSE::stl::report_and_fail; |
||||
} |
@ -0,0 +1,19 @@ |
||||
#include "Papyrus.h" |
||||
#include "PapyrusFunctions.h" |
||||
|
||||
namespace Papyrus |
||||
{ |
||||
bool Bind(VM* a_vm) |
||||
{ |
||||
if (!a_vm) { |
||||
logger::critical("couldn't get VM State"sv); |
||||
return false; |
||||
} |
||||
|
||||
logger::info("{:*^30}", "FUNCTIONS"sv); |
||||
|
||||
PapyrusFunctions::Bind(*a_vm); |
||||
|
||||
return true; |
||||
} |
||||
} |
@ -0,0 +1,15 @@ |
||||
#pragma once |
||||
|
||||
#define BIND(a_method, ...) a_vm.RegisterFunction(#a_method##sv, script, a_method __VA_OPT__(, ) __VA_ARGS__) |
||||
|
||||
#include <RE/Skyrim.h> |
||||
|
||||
namespace Papyrus { |
||||
using VM = RE::BSScript::Internal::VirtualMachine; |
||||
using StackID = RE::VMStackID; |
||||
using Severity = RE::BSScript::ErrorLogger::Severity; |
||||
|
||||
inline constexpr auto script = "EnderalSteam"sv; |
||||
|
||||
bool Bind(VM* a_vm); |
||||
} |
@ -0,0 +1,24 @@ |
||||
#pragma once |
||||
|
||||
#include "Achievements.h" |
||||
#include "Util.h" |
||||
|
||||
namespace Papyrus::PapyrusFunctions |
||||
{ |
||||
bool CallUnlockAchievement(RE::StaticFunctionTag* tag, RE::BSFixedString achievement) |
||||
{ |
||||
if (AchievementsEnabled()) { |
||||
return SteamInstance()->setAchievementUnlocked(achievement.c_str()); |
||||
} else { |
||||
RE::DebugNotification(std::format("Achievement unlocked: {}", achievement.c_str()).c_str()); |
||||
logger::info(std::format("Achievement unlocked: {}", achievement.c_str()).c_str()); |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
inline void Bind(VM& a_vm) |
||||
{ |
||||
BIND(CallUnlockAchievement); |
||||
logger::info("Registered CallUnlockAchievement"sv); |
||||
} |
||||
} |
@ -0,0 +1,78 @@ |
||||
#pragma once |
||||
|
||||
#include "Achievements.h" |
||||
#include <SimpleIni.h> |
||||
|
||||
inline const SKSE::LoadInterface* GetLoadInterface(const SKSE::LoadInterface* loadInterface = nullptr) |
||||
{ |
||||
const static SKSE::LoadInterface* singleton; |
||||
if (loadInterface) { |
||||
singleton = loadInterface; |
||||
} |
||||
return singleton; |
||||
} |
||||
|
||||
inline Achievements::AchievementHolder* SteamInstance(Achievements::AchievementHolder* steamInterface = nullptr) |
||||
{ |
||||
static Achievements::AchievementHolder* singleton = nullptr; |
||||
if (steamInterface) { |
||||
singleton = steamInterface; |
||||
} |
||||
return singleton; |
||||
} |
||||
|
||||
inline bool AchievementsEnabled(bool bEnabled = NULL) |
||||
{ |
||||
static bool value; |
||||
if (bEnabled != NULL) { |
||||
value = bEnabled; |
||||
} |
||||
return value; |
||||
} |
||||
|
||||
inline void LoadINI(std::map<std::string, bool>* settings, const char* iniPath) |
||||
{ |
||||
for (auto it = settings->begin(); it != settings->end(); it++) { |
||||
logger::info("[DEFAULT] {} = {}", it->first, it->second); |
||||
} |
||||
|
||||
if (!std::filesystem::exists(iniPath)) { |
||||
logger::warn("{} does not exist, using default values.", iniPath); |
||||
return; |
||||
} |
||||
|
||||
try { |
||||
CSimpleIniA ini; |
||||
ini.SetUnicode(false); |
||||
ini.SetMultiKey(false); |
||||
ini.LoadFile(iniPath); |
||||
|
||||
std::list<CSimpleIniA::Entry> keysList; |
||||
ini.GetAllKeys("", keysList); |
||||
|
||||
bool bUpdateINI = false; |
||||
for (auto it = settings->begin(); it != settings->end(); it++) { |
||||
bool bExists = false; |
||||
for (const auto& k : keysList) { |
||||
if (it->first == k.pItem) { |
||||
settings->insert_or_assign(k.pItem, ini.GetBoolValue("", k.pItem, settings->at(k.pItem))); |
||||
logger::info("[INI] {} = {}", k.pItem, settings->at(k.pItem)); |
||||
bExists = true; |
||||
break; |
||||
} |
||||
} |
||||
if (!bExists) { |
||||
ini.SetBoolValue("", it->first.c_str(), it->second); |
||||
bUpdateINI = true; |
||||
} |
||||
} |
||||
|
||||
if (bUpdateINI) { |
||||
logger::info("New settings detected, adding to ArtifactTracker.ini"); |
||||
ini.SaveFile(iniPath); |
||||
} |
||||
|
||||
} catch (const std::exception& e) { |
||||
logger::error(e.what()); |
||||
} |
||||
} |
Binary file not shown.
@ -0,0 +1,15 @@ |
||||
{ |
||||
"registries": [ |
||||
{ |
||||
"kind": "git", |
||||
"repository": "https://gitlab.com/colorglass/vcpkg-colorglass", |
||||
"baseline": "5a11d06fd1b2d7cd6339d6aea48d450309e89cc1", |
||||
"packages": [ |
||||
"commonlibsse-ng", |
||||
"gluino", |
||||
"script-extender-common", |
||||
"skse" |
||||
] |
||||
} |
||||
] |
||||
} |
@ -0,0 +1,21 @@ |
||||
{ |
||||
"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json", |
||||
"name": "enderal-se-steam", |
||||
"version-string": "1.0.0", |
||||
"port-version": 0, |
||||
"description": "Enderal SE Steam Support", |
||||
"homepage": "https://eddoursul.win/mods/enderal-se/", |
||||
"license": "LGPL-3.0", |
||||
"features": { |
||||
"plugin": { |
||||
"description": "Enderal SE Steam achievements and status support.", |
||||
"dependencies": [ |
||||
"commonlibsse-ng", |
||||
"simpleini" |
||||
] |
||||
} |
||||
}, |
||||
"default-features": [ |
||||
"plugin" |
||||
] |
||||
} |
@ -0,0 +1,3 @@ |
||||
Scriptname EnderalSteam Hidden |
||||
|
||||
bool Function CallUnlockAchievement(string name) global native |
@ -0,0 +1,12 @@ |
||||
Scriptname Steam Hidden |
||||
|
||||
bool Function UnlockAchievement(string name) global |
||||
|
||||
if SKSE.GetPluginVersion("EnderalSteam") > 0 |
||||
return EnderalSteam.CallUnlockAchievement(name) |
||||
else |
||||
Debug.Trace("Achievement unlocked! " + name) |
||||
return true |
||||
endif |
||||
|
||||
EndFunction |
Loading…
Reference in new issue