Skip to content

Commit

Permalink
feat: use CarbonLib for contraption support
Browse files Browse the repository at this point in the history
CarbonLib, my SM modding lib, has support for getting Contraption,
logging using fmt and also a full Lua and Lauxlib wrapper allowing for
more stable usage
  • Loading branch information
BenMcAvoy committed Jan 17, 2025
1 parent 3e1f83f commit 85e3712
Show file tree
Hide file tree
Showing 11 changed files with 1,958 additions and 17 deletions.
21 changes: 16 additions & 5 deletions SM-KeyAPI/SM-KeyAPI.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard>
<AdditionalIncludeDirectories>include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;vendor\include</AdditionalIncludeDirectories>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
Expand All @@ -113,7 +114,8 @@
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard>
<AdditionalIncludeDirectories>include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;vendor\include</AdditionalIncludeDirectories>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
Expand All @@ -129,7 +131,8 @@
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard>
<AdditionalIncludeDirectories>include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;vendor\include</AdditionalIncludeDirectories>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
Expand All @@ -145,7 +148,8 @@
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard>
<AdditionalIncludeDirectories>include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;vendor\include</AdditionalIncludeDirectories>
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
Expand All @@ -158,9 +162,16 @@
<ClCompile Include="src\dllmain.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="include\sm\lua.h" />
<ClInclude Include="include\sm\offsets.h" />
<ClInclude Include="include\utils.h" />
<ClInclude Include="vendor\include\carbon\console.h" />
<ClInclude Include="vendor\include\carbon\contraption.h" />
<ClInclude Include="vendor\include\carbon\lua\lauxlib.h" />
<ClInclude Include="vendor\include\carbon\lua\lua.h" />
<ClInclude Include="vendor\include\carbon\lua\lua.hpp" />
<ClInclude Include="vendor\include\carbon\offsets.h" />
<ClInclude Include="vendor\include\carbon\tools.h" />
<ClInclude Include="vendor\include\carbon\utils.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
Expand Down
30 changes: 19 additions & 11 deletions SM-KeyAPI/src/dllmain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@
#include <polyhook2/IHook.hpp>

#include <sm/offsets.h>
#include <sm/lua.h>

#include <carbon/lua/lua.hpp>
#include <carbon/contraption.h>
#include <carbon/tools.h>

#include "utils.h"

Expand All @@ -44,20 +47,18 @@ NOINLINE uint64_t __cdecl hkLoadLuaEnv(uint64_t* luaVM, uint64_t** loadFuncs, in
auto oRes = PLH::FnCast(hkLoadLuaEnvTramp, &hkLoadLuaEnv)(luaVM, loadFuncs, envFlag);
lua_State* L = reinterpret_cast<lua_State*>(*luaVM);

if (!hasAllLuaFunctions())
return oRes;
INFO("Injecting keyapi into Lua environment...");

if (!oRes && L) {
const int loadRes = luaL_loadstring(L, "unsafe_env.sm.keyapi_injected = true");
if (!loadRes)
lua_pcall(L, 0, 0, 0);
if (luaL_dostring(L, "unsafe_env.sm.keyapi_injected = true") != 0) {
std::cout << "Failed to inject keyapi into Lua environment!" << std::endl;
return oRes;
}

lua_getglobal(L, "unsafe_env");
lua_getfield(L, -1, "sm");
lua_pushcclosure(L, (lua_CFunction*)keyapi_getkeystate, 0);
lua_pushcclosure(L, keyapi_getkeystate, 0);
lua_setfield(L, -2, "getKeyState");

return loadRes;
}

return oRes;
Expand All @@ -68,16 +69,23 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
DisableThreadLibraryCalls(hModule);
std::cout << "DLL_PROCESS_ATTACH" << std::endl;

auto contraption = Carbon::SM::Contraption::GetInstance();
while (!contraption || contraption->gameState <= Carbon::SM::GameStateType::Null || contraption->gameState >= Carbon::SM::GameStateType::WorldBuilder || contraption->gameState == Carbon::SM::GameStateType::Load) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
contraption = Carbon::SM::Contraption::GetInstance();
}

detour.emplace((uint64_t)SM::Offsets::Rebased::loadLuaEnv, (uint64_t)&hkLoadLuaEnv, &hkLoadLuaEnvTramp);
detour.value().hook();
std::cout << "loadLuaEnv " << std::hex << (uint64_t)SM::Offsets::Rebased::loadLuaEnv << " hooked!" << std::endl;

INFO("KeyAPI injected into Lua environment!");
}

if (dwReason == DLL_PROCESS_DETACH) {
std::cout << "DLL_PROCESS_DETACH" << std::endl;

detour.value().unHook();
std::cout << "loadLuaEnv " << std::hex << (uint64_t)SM::Offsets::Rebased::loadLuaEnv << " unhooked!" << std::endl;
INFO("KeyAPI removed from Lua environment!");
}

return TRUE;
Expand Down
3 changes: 2 additions & 1 deletion SM-KeyAPI/vcpkg.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"dependencies": [
"polyhook2"
"polyhook2",
"fmt"
]
}
61 changes: 61 additions & 0 deletions SM-KeyAPI/vendor/include/carbon/console.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#pragma once

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <string>

#include <fmt/format.h>

#include "utils.h"
#include "contraption.h"

namespace Carbon::SM::UTILS {
/// <summary>
/// What colour to log in
/// </summary>
enum Colour : WORD {
DARKGREEN = 2,
BLUE = 3,
PURPLE = 5,
GOLD = 6,
WHITE = 7,
DARKGRAY = 8,
DARKBLUE = 9,
GREEN = 10,
CYAN = 11,
RED = 12,
PINK = 13,
YELLOW = 14,
};

/// <summary>
/// What type of log to make
/// </summary>
enum LogType {
Default = 1 << 0,
Profile = 1 << 1,
Resource = 1 << 2,
Shader = 1 << 3,
Buffer = 1 << 4,
Render = 1 << 5,
Network = 1 << 6,
System = 1 << 7,
Terrain = 1 << 8,
World = 1 << 9,
Lua = 1 << 11,
Print = 1 << 12,
Audio = 1 << 10,
UGC = 1 << 13,
Steam = 1 << 14,
Error = -1,
Warning = 1 << 30,
None = 0
};

class Console {
public:
virtual ~Console() { /* Implemented by game */ }
virtual void Log(const std::string& message, Colour colour = Colour::WHITE, LogType type = LogType::Default) { /* Implemented by game */ }
virtual void LogNoReturn(const std::string& message, Colour colour = Colour::WHITE, LogType type = LogType::Default) { /* Implemented by game */ }
};
} // namespace Carbon::SM::UTILS
30 changes: 30 additions & 0 deletions SM-KeyAPI/vendor/include/carbon/contraption.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#pragma once

#include <memory>

#include "utils.h"
#include "offsets.h"

#include "console.h"

namespace Carbon::SM {
enum GameStateType;

class Contraption {
SINGLETON(Contraption);

/* 0x0000 */ PAD(0x58);
/* 0x0058 */ PUB UTILS::Console* console;
/* 0x0060 */ PAD(0x11C);
/* 0x017C */ PUB GameStateType gameState;
};

enum GameStateType : uint32_t {
Null,
Load,
Play,
Menu,
TileEditor,
WorldBuilder,
};
} // namespace Carbon::SM
Loading

0 comments on commit 85e3712

Please sign in to comment.