mirror of
https://github.com/geode-sdk/geode.git
synced 2024-11-22 15:37:53 -05:00
completely remove interface + implement scheduling stuff
This commit is contained in:
parent
496fcc9965
commit
6d5e02a6b4
28 changed files with 106 additions and 199 deletions
|
@ -3,6 +3,8 @@
|
||||||
#include <Geode/Geode.hpp>
|
#include <Geode/Geode.hpp>
|
||||||
|
|
||||||
GEODE_API bool GEODE_CALL geode_implicit_load(geode::Mod* m) {
|
GEODE_API bool GEODE_CALL geode_implicit_load(geode::Mod* m) {
|
||||||
geode::Interface::get()->init(m);
|
geode::Mod::setSharedMod(m);
|
||||||
|
geode::log::releaseSchedules(m);
|
||||||
|
geode::Loader::get()->releaseScheduledFunctions(m);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
#include <cocos-ext.h>
|
#include <cocos-ext.h>
|
||||||
#include <cocos2d.h>
|
#include <cocos2d.h>
|
||||||
#include <fmod.hpp>
|
#include <fmod.hpp>
|
||||||
//#include <Interface.hpp>
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
|
@ -5,6 +5,5 @@
|
||||||
#include "loader/Log.hpp"
|
#include "loader/Log.hpp"
|
||||||
#include "loader/Mod.hpp"
|
#include "loader/Mod.hpp"
|
||||||
#include "loader/Loader.hpp"
|
#include "loader/Loader.hpp"
|
||||||
#include "loader/Interface.hpp"
|
|
||||||
#include "loader/Setting.hpp"
|
#include "loader/Setting.hpp"
|
||||||
#include "loader/SettingEvent.hpp"
|
#include "loader/SettingEvent.hpp"
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include "Mod.hpp"
|
#include "Mod.hpp"
|
||||||
#include "Loader.hpp"
|
#include "Loader.hpp"
|
||||||
#include "Interface.hpp"
|
|
||||||
|
|
||||||
#ifdef API_DECL
|
#ifdef API_DECL
|
||||||
#undef API_DECL
|
#undef API_DECL
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#include <Geode/DefaultInclude.hpp>
|
#include <Geode/DefaultInclude.hpp>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include "Mod.hpp"
|
#include "Mod.hpp"
|
||||||
#include "Interface.hpp"
|
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
|
||||||
namespace geode {
|
namespace geode {
|
||||||
|
|
|
@ -1,120 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <Geode/DefaultInclude.hpp>
|
|
||||||
#include "Types.hpp"
|
|
||||||
#include <vector>
|
|
||||||
#include <variant>
|
|
||||||
#include "../utils/casts.hpp"
|
|
||||||
#include "../utils/Result.hpp"
|
|
||||||
#include "Mod.hpp"
|
|
||||||
|
|
||||||
namespace geode {
|
|
||||||
class Hook;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* For developing your own mods, it is
|
|
||||||
* often convenient to be able to do things
|
|
||||||
* like create hooks using statically
|
|
||||||
* initialized global classes.
|
|
||||||
*
|
|
||||||
* At that point however, your mod has not
|
|
||||||
* yet received the Mod* to create hooks
|
|
||||||
* through.
|
|
||||||
*
|
|
||||||
* For situations like that, you can instead
|
|
||||||
* inherit from Interface to create your own
|
|
||||||
* mod interface and create hooks through that;
|
|
||||||
* calling `init` with the Mod* you receive
|
|
||||||
* from geode will automatically create all
|
|
||||||
* scheduled hooks, logs, etc.
|
|
||||||
*
|
|
||||||
* Interface also provides a handy &
|
|
||||||
* standardized way to store access to your
|
|
||||||
* Mod*; you can just define a `get` function
|
|
||||||
* and a getter for the Mod* stored in the
|
|
||||||
* Interface.
|
|
||||||
*
|
|
||||||
* @class Interface
|
|
||||||
*/
|
|
||||||
class Interface {
|
|
||||||
protected:
|
|
||||||
static GEODE_DLL Interface* create();
|
|
||||||
|
|
||||||
|
|
||||||
struct ScheduledHook {
|
|
||||||
std::string m_displayName;
|
|
||||||
void* m_address;
|
|
||||||
Result<Hook*>(Mod::*m_addFunction)(std::string const&, void*);
|
|
||||||
};
|
|
||||||
|
|
||||||
using ScheduledFunction = std::function<void()>;
|
|
||||||
|
|
||||||
Mod* m_mod = nullptr;
|
|
||||||
std::vector<ScheduledHook> m_scheduledHooks;
|
|
||||||
std::vector<ScheduledFunction> m_scheduledFunctions;
|
|
||||||
|
|
||||||
public:
|
|
||||||
static inline GEODE_HIDDEN Interface* get() {
|
|
||||||
static Interface* ret = create();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
[[deprecated("Use Mod::get instead")]]
|
|
||||||
static inline GEODE_HIDDEN Mod* mod() {
|
|
||||||
return Interface::get()->m_mod;
|
|
||||||
}
|
|
||||||
|
|
||||||
GEODE_DLL void init(Mod*);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a hook at an address. This function can
|
|
||||||
* be used at static initialization time, as it
|
|
||||||
* doesn't require the Mod* to be set -- it will
|
|
||||||
* create the hooks later when the Mod* is set.
|
|
||||||
*
|
|
||||||
* @param address The absolute address of
|
|
||||||
* the function to hook, i.e. gd_base + 0xXXXX
|
|
||||||
* @param detour Pointer to your detour function
|
|
||||||
*
|
|
||||||
* @returns Successful result containing the
|
|
||||||
* Hook handle (or nullptr if Mod* is not loaded
|
|
||||||
* yet), errorful result with info on error
|
|
||||||
*/
|
|
||||||
template<auto Detour, template <class, class...> class Convention>
|
|
||||||
Result<Hook*> addHook(void* address) {
|
|
||||||
return Interface::addHook<Detour, Convention>("", address);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The same as addHook(void*, void*), but also provides
|
|
||||||
* a display name to show it in the list of the loader.
|
|
||||||
* Mostly for internal use but if you don't like your
|
|
||||||
* hooks showing up like base + 0x123456 it can be useful
|
|
||||||
*/
|
|
||||||
template<auto Detour, template <class, class...> class Convention>
|
|
||||||
Result<Hook*> addHook(std::string const& displayName, void* address) {
|
|
||||||
if (this->m_mod) {
|
|
||||||
return this->m_mod->addHook<Detour, Convention>(displayName, address);
|
|
||||||
}
|
|
||||||
this->m_scheduledHooks.push_back({ displayName, address, &Mod::addHook<Detour, Convention> });
|
|
||||||
return Ok<Hook*>(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
GEODE_DLL void scheduleOnLoad(ScheduledFunction function);
|
|
||||||
|
|
||||||
friend Mod* Mod::get<void>();
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline Mod* Mod::get<void>() {
|
|
||||||
return Interface::get()->m_mod;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Mod* getMod() {
|
|
||||||
return Mod::get();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const char* operator"" _spr(const char* str, size_t) {
|
|
||||||
return geode::Mod::get()->expandSpriteName(str);
|
|
||||||
}
|
|
|
@ -32,6 +32,14 @@ namespace geode {
|
||||||
template<class, class, class>
|
template<class, class, class>
|
||||||
class FieldIntermediate;
|
class FieldIntermediate;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The predeclaration of the implicit entry
|
||||||
|
*/
|
||||||
|
GEODE_API bool GEODE_CALL geode_implicit_load(geode::Mod*);
|
||||||
|
|
||||||
|
namespace geode {
|
||||||
|
|
||||||
class GEODE_DLL Loader {
|
class GEODE_DLL Loader {
|
||||||
public:
|
public:
|
||||||
|
@ -47,7 +55,10 @@ namespace geode {
|
||||||
};
|
};
|
||||||
std::unordered_map<std::string, ModSettings> m_mods;
|
std::unordered_map<std::string, ModSettings> m_mods;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using ScheduledFunction = std::function<void GEODE_CALL(void)>;
|
||||||
|
|
||||||
|
std::vector<ScheduledFunction> m_scheduledFunctions;
|
||||||
std::unordered_map<std::string, Mod*> m_mods;
|
std::unordered_map<std::string, Mod*> m_mods;
|
||||||
std::vector<log::Log> m_logs;
|
std::vector<log::Log> m_logs;
|
||||||
std::ofstream m_logStream;
|
std::ofstream m_logStream;
|
||||||
|
@ -67,15 +78,18 @@ namespace geode {
|
||||||
|
|
||||||
void updateAllDependencies();
|
void updateAllDependencies();
|
||||||
|
|
||||||
|
void releaseScheduledFunctions(Mod* mod);
|
||||||
|
|
||||||
friend class Mod;
|
friend class Mod;
|
||||||
friend class CustomLoader;
|
friend class CustomLoader;
|
||||||
friend struct ModInfo;
|
friend struct ModInfo;
|
||||||
|
|
||||||
private:
|
|
||||||
size_t getFieldIndexForClass(size_t hash);
|
size_t getFieldIndexForClass(size_t hash);
|
||||||
|
|
||||||
template <class, class, class>
|
template <class, class, class>
|
||||||
friend class modifier::FieldIntermediate;
|
friend class modifier::FieldIntermediate;
|
||||||
|
|
||||||
|
friend bool GEODE_CALL ::geode_implicit_load(Mod*);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~Loader();
|
~Loader();
|
||||||
|
@ -233,7 +247,15 @@ namespace geode {
|
||||||
* `CCScheduler::update` is called
|
* `CCScheduler::update` is called
|
||||||
* @param func Function to run
|
* @param func Function to run
|
||||||
*/
|
*/
|
||||||
void queueInGDThread(std::function<void GEODE_CALL(void)> func);
|
void queueInGDThread(ScheduledFunction func);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a function when the Mod is loaded. Useful if for
|
||||||
|
* some reason you need to run some function in
|
||||||
|
* static initialization.
|
||||||
|
* @param func Function to run
|
||||||
|
*/
|
||||||
|
void scheduleOnModLoad(Mod* m, ScheduledFunction func);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open the platform-specific external console (if one exists)
|
* Open the platform-specific external console (if one exists)
|
||||||
|
|
|
@ -96,15 +96,15 @@ namespace geode {
|
||||||
l.pushToLoader();
|
l.pushToLoader();
|
||||||
}
|
}
|
||||||
|
|
||||||
void releaseSchedules(Mod* m);
|
void GEODE_DLL releaseSchedules(Mod* m);
|
||||||
|
|
||||||
template <typename ...Args>
|
template <typename ...Args>
|
||||||
void schedule(Severity sev, Args... args) {
|
void schedule(Severity sev, Args... args) {
|
||||||
auto m = getMod();
|
auto m = getMod();
|
||||||
if (m) return log(sev, m, args...);
|
if (m) return log(sev, m, args...);
|
||||||
|
|
||||||
Log::scheduled().push_back([=](Mod* m){
|
Log::scheduled().push_back([=](Mod* m2){
|
||||||
log(sev, m, args...);
|
log(sev, m2, args...);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,7 @@
|
||||||
|
|
||||||
class InternalLoader;
|
class InternalLoader;
|
||||||
class InternalMod;
|
class InternalMod;
|
||||||
|
namespace geode {
|
||||||
namespace geode {
|
|
||||||
struct PlatformInfo;
|
struct PlatformInfo;
|
||||||
|
|
||||||
class Hook;
|
class Hook;
|
||||||
|
@ -28,8 +27,16 @@ namespace geode {
|
||||||
class Setting;
|
class Setting;
|
||||||
|
|
||||||
class Unknown;
|
class Unknown;
|
||||||
using unknownmemfn_t = void(Unknown::*)();
|
using unknownmemfn_t = void(Unknown::*)();
|
||||||
using unknownfn_t = void(*)();
|
using unknownfn_t = void(*)();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The predeclaration of the implicit entry
|
||||||
|
*/
|
||||||
|
GEODE_API bool GEODE_CALL geode_implicit_load(geode::Mod*);
|
||||||
|
|
||||||
|
namespace geode {
|
||||||
|
|
||||||
struct Dependency {
|
struct Dependency {
|
||||||
std::string m_id;
|
std::string m_id;
|
||||||
|
@ -197,9 +204,7 @@ namespace geode {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class Mod
|
* @class Mod
|
||||||
* Represents a Mod ingame. Inherit
|
* Represents a Mod ingame.
|
||||||
* from this class to create your own
|
|
||||||
* mod interfaces.
|
|
||||||
* @abstract
|
* @abstract
|
||||||
*/
|
*/
|
||||||
class GEODE_DLL Mod {
|
class GEODE_DLL Mod {
|
||||||
|
@ -316,6 +321,16 @@ namespace geode {
|
||||||
friend struct ModInfo;
|
friend struct ModInfo;
|
||||||
friend class DataStore;
|
friend class DataStore;
|
||||||
|
|
||||||
|
template<class = void>
|
||||||
|
static inline GEODE_HIDDEN Mod* sharedMod = nullptr;
|
||||||
|
|
||||||
|
template<class = void>
|
||||||
|
static inline GEODE_HIDDEN void setSharedMod(Mod* mod) {
|
||||||
|
sharedMod<> = mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend bool GEODE_CALL ::geode_implicit_load(Mod*);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
std::string getID() const;
|
std::string getID() const;
|
||||||
std::string getName() const;
|
std::string getName() const;
|
||||||
|
@ -362,7 +377,9 @@ namespace geode {
|
||||||
* the mod pointer if it is initialized
|
* the mod pointer if it is initialized
|
||||||
*/
|
*/
|
||||||
template<class = void>
|
template<class = void>
|
||||||
static inline Mod* get();
|
static inline GEODE_HIDDEN Mod* get() {
|
||||||
|
return sharedMod<>;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all hooks owned by this Mod
|
* Get all hooks owned by this Mod
|
||||||
|
@ -548,5 +565,11 @@ namespace geode {
|
||||||
* However, it can be externed, unlike Mod::get()
|
* However, it can be externed, unlike Mod::get()
|
||||||
* @returns Same thing Mod::get() returns
|
* @returns Same thing Mod::get() returns
|
||||||
*/
|
*/
|
||||||
inline Mod* getMod();
|
inline GEODE_HIDDEN Mod* getMod() {
|
||||||
|
return Mod::get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const char* operator"" _spr(const char* str, size_t) {
|
||||||
|
return geode::Mod::get()->expandSpriteName(str);
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,8 +89,8 @@ void _##Line_##Function(); \
|
||||||
namespace { \
|
namespace { \
|
||||||
struct _##Line_##Unique {}; \
|
struct _##Line_##Unique {}; \
|
||||||
} \
|
} \
|
||||||
static inline auto _line = (Interface::get()->scheduleOnLoad( \
|
static inline auto _line = (Loader::get()->scheduleOnModLoad( \
|
||||||
&_##Line_##Function<_##Line_##Unique> \
|
nullptr, &_##Line_##Function<_##Line_##Unique> \
|
||||||
), 0); \
|
), 0); \
|
||||||
template<class> \
|
template<class> \
|
||||||
void _##Line_##Function()
|
void _##Line_##Function()
|
||||||
|
|
|
@ -3,17 +3,14 @@
|
||||||
#include "Types.hpp"
|
#include "Types.hpp"
|
||||||
#include "Addresses.hpp"
|
#include "Addresses.hpp"
|
||||||
#include "../meta/meta.hpp"
|
#include "../meta/meta.hpp"
|
||||||
#include "../loader/Interface.hpp"
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#define GEODE_APPLY_MODIFY_FOR_FUNCTION(index, convention, className, functionName) \
|
#define GEODE_APPLY_MODIFY_FOR_FUNCTION(index, convention, className, functionName) \
|
||||||
using base##index = wrap::functionName<Base, types::pure##index>; \
|
using base##index = wrap::functionName<Base, types::pure##index>; \
|
||||||
using derived##index = wrap::functionName<Derived, types::pure##index>; \
|
using derived##index = wrap::functionName<Derived, types::pure##index>; \
|
||||||
if constexpr (derived##index::uuid != nullptr && (void*)base##index::uuid != (void*)derived##index::uuid) { \
|
if constexpr (derived##index::uuid != nullptr && (void*)base##index::uuid != (void*)derived##index::uuid) { \
|
||||||
log::debug( \
|
Mod::get()->addHook<derived##index::value, convention>( \
|
||||||
"Adding hook at function " #className "::" #functionName \
|
|
||||||
); \
|
|
||||||
Interface::get()->addHook<derived##index::value, convention>( \
|
|
||||||
#className "::" #functionName, \
|
#className "::" #functionName, \
|
||||||
(void*)addresses::address##index() \
|
(void*)addresses::address##index() \
|
||||||
); \
|
); \
|
||||||
|
@ -30,7 +27,9 @@ namespace geode::modifier {
|
||||||
public:
|
public:
|
||||||
// unordered_map<handles> idea
|
// unordered_map<handles> idea
|
||||||
ModifyBase() {
|
ModifyBase() {
|
||||||
Derived::apply();
|
Loader::get()->scheduleOnModLoad(getMod(), [](){
|
||||||
|
Derived::apply();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
template <class, class>
|
template <class, class>
|
||||||
friend class Modify;
|
friend class Modify;
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <Geode/DefaultInclude.hpp>
|
#include <Geode/DefaultInclude.hpp>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include "../loader/Interface.hpp"
|
|
||||||
#include "../loader/Mod.hpp"
|
#include "../loader/Mod.hpp"
|
||||||
#include "../loader/Log.hpp"
|
#include "../loader/Log.hpp"
|
||||||
#include "general.hpp"
|
#include "general.hpp"
|
||||||
|
|
|
@ -210,6 +210,7 @@ class $modify(CustomMenuLayer, MenuLayer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto y = getChild(bottomMenu, 0)->getPositionY();
|
auto y = getChild(bottomMenu, 0)->getPositionY();
|
||||||
|
std::cout << "test: " << "geode-logo-outline-gold.png"_spr << std::endl;
|
||||||
|
|
||||||
g_geodeButton = SafeCreate<CCSprite>()
|
g_geodeButton = SafeCreate<CCSprite>()
|
||||||
.with(CircleButtonSprite::createWithSpriteFrameName(
|
.with(CircleButtonSprite::createWithSpriteFrameName(
|
||||||
|
|
|
@ -38,7 +38,7 @@ bool InternalLoader::setup() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InternalLoader::queueInGDThread(std::function<void GEODE_CALL()> func) {
|
void InternalLoader::queueInGDThread(ScheduledFunction func) {
|
||||||
std::lock_guard<std::mutex> lock(m_gdThreadMutex);
|
std::lock_guard<std::mutex> lock(m_gdThreadMutex);
|
||||||
this->m_gdThreadQueue.push_back(func);
|
this->m_gdThreadQueue.push_back(func);
|
||||||
}
|
}
|
||||||
|
@ -113,17 +113,25 @@ void InternalLoader::closePlatformConsole() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(GEODE_IS_MACOS)
|
#elif defined(GEODE_IS_MACOS)
|
||||||
#include <iostream>
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
|
|
||||||
void InternalLoader::platformMessageBox(const char* title, std::string const& info) {
|
void InternalLoader::platformMessageBox(const char* title, std::string const& info) {
|
||||||
std::cout << title << ": " << info << std::endl;
|
CFStringRef cfTitle = CFStringCreateWithCString(NULL, title, kCFStringEncodingUTF8);
|
||||||
|
CFStringRef cfMessage = CFStringCreateWithCString(NULL, info.c_str(), kCFStringEncodingUTF8);
|
||||||
|
|
||||||
|
CFUserNotificationDisplayNotice(0, kCFUserNotificationNoteAlertLevel, NULL, NULL, NULL, cfTitle, cfMessage, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InternalLoader::openPlatformConsole() {
|
void InternalLoader::openPlatformConsole() {
|
||||||
m_platformConsoleOpen = true;
|
m_platformConsoleOpen = true;
|
||||||
|
|
||||||
|
for (auto const& log : Loader::get()->getLogs()) {
|
||||||
|
std::cout << log->toString(true) << "\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InternalLoader::closePlatformConsole() {
|
void InternalLoader::closePlatformConsole() {
|
||||||
|
m_platformConsoleOpen = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(GEODE_IS_IOS)
|
#elif defined(GEODE_IS_IOS)
|
||||||
|
|
|
@ -46,7 +46,7 @@ public:
|
||||||
*/
|
*/
|
||||||
bool shownInfoAlert(std::string const& key);
|
bool shownInfoAlert(std::string const& key);
|
||||||
|
|
||||||
void queueInGDThread(std::function<void GEODE_CALL(void)> func);
|
void queueInGDThread(ScheduledFunction func);
|
||||||
void executeGDThreadQueue();
|
void executeGDThreadQueue();
|
||||||
|
|
||||||
void logConsoleMessage(std::string const& msg);
|
void logConsoleMessage(std::string const& msg);
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
class InternalMod;
|
class InternalMod;
|
||||||
|
|
||||||
#include <Geode/loader/Mod.hpp>
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
|
|
||||||
USE_GEODE_NAMESPACE();
|
USE_GEODE_NAMESPACE();
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#include <Geode/loader/Hook.hpp>
|
#include <Geode/loader/Hook.hpp>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <Geode/loader/Mod.hpp>
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
#include <Geode/loader/Loader.hpp>
|
#include <Geode/loader/Loader.hpp>
|
||||||
#include <Geode/utils/casts.hpp>
|
#include <Geode/utils/casts.hpp>
|
||||||
#include <Geode/utils/vector.hpp>
|
#include <Geode/utils/vector.hpp>
|
||||||
|
@ -31,6 +30,7 @@ Result<> Mod::enableHook(Hook* hook) {
|
||||||
if (!hook->isEnabled()) {
|
if (!hook->isEnabled()) {
|
||||||
auto res = std::invoke(hook->m_addFunction, hook->m_address);
|
auto res = std::invoke(hook->m_addFunction, hook->m_address);
|
||||||
if (res) {
|
if (res) {
|
||||||
|
log::debug("Enabling hook at function ", hook->m_displayName);
|
||||||
this->m_hooks.push_back(hook);
|
this->m_hooks.push_back(hook);
|
||||||
hook->m_enabled = true;
|
hook->m_enabled = true;
|
||||||
hook->m_handle = res.value();
|
hook->m_handle = res.value();
|
||||||
|
@ -48,6 +48,7 @@ Result<> Mod::enableHook(Hook* hook) {
|
||||||
Result<> Mod::disableHook(Hook* hook) {
|
Result<> Mod::disableHook(Hook* hook) {
|
||||||
if (hook->isEnabled()) {
|
if (hook->isEnabled()) {
|
||||||
if (geode::core::hook::remove(hook->m_handle)) {
|
if (geode::core::hook::remove(hook->m_handle)) {
|
||||||
|
log::debug("Disabling hook at function {}", hook->m_displayName);
|
||||||
hook->m_enabled = false;
|
hook->m_enabled = false;
|
||||||
return Ok<>();
|
return Ok<>();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
#include <Geode/loader/Mod.hpp>
|
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
#include <Geode/loader/Hook.hpp>
|
|
||||||
#include <Geode/loader/Log.hpp>
|
|
||||||
#include <Geode/loader/Loader.hpp>
|
|
||||||
|
|
||||||
USE_GEODE_NAMESPACE();
|
|
||||||
|
|
||||||
void Interface::init(Mod* mod) {
|
|
||||||
if (!m_mod) {
|
|
||||||
m_mod = mod;
|
|
||||||
for (auto const& hook : m_scheduledHooks) {
|
|
||||||
std::invoke(hook.m_addFunction, m_mod, hook.m_displayName, hook.m_address);
|
|
||||||
}
|
|
||||||
m_scheduledHooks.clear();
|
|
||||||
|
|
||||||
for (auto const& fn : m_scheduledFunctions) {
|
|
||||||
std::invoke(fn);
|
|
||||||
}
|
|
||||||
m_scheduledFunctions.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Interface::scheduleOnLoad(ScheduledFunction function) {
|
|
||||||
m_scheduledFunctions.push_back(function);
|
|
||||||
}
|
|
||||||
|
|
||||||
Interface* Interface::create() {
|
|
||||||
return new Interface;
|
|
||||||
}
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include <Geode/loader/Hook.hpp>
|
#include <Geode/loader/Hook.hpp>
|
||||||
#include <Geode/loader/Mod.hpp>
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
#include <Geode/loader/Log.hpp>
|
#include <Geode/loader/Log.hpp>
|
||||||
#include <Geode/loader/Loader.hpp>
|
#include <Geode/loader/Loader.hpp>
|
||||||
#include <InternalLoader.hpp>
|
#include <InternalLoader.hpp>
|
||||||
|
@ -404,7 +403,7 @@ std::vector<log::Log*> Loader::getLogs(
|
||||||
return logs;
|
return logs;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Loader::queueInGDThread(std::function<void GEODE_CALL()> func) {
|
void Loader::queueInGDThread(ScheduledFunction func) {
|
||||||
InternalLoader::get()->queueInGDThread(func);
|
InternalLoader::get()->queueInGDThread(func);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -462,3 +461,15 @@ void Loader::openPlatformConsole() {
|
||||||
void Loader::closePlatfromConsole() {
|
void Loader::closePlatfromConsole() {
|
||||||
InternalLoader::get()->closePlatformConsole();
|
InternalLoader::get()->closePlatformConsole();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Loader::scheduleOnModLoad(Mod* m, ScheduledFunction func) {
|
||||||
|
if (m) return func();
|
||||||
|
m_scheduledFunctions.push_back(func);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Loader::releaseScheduledFunctions(Mod* mod) {
|
||||||
|
for (auto& func : m_scheduledFunctions) {
|
||||||
|
func();
|
||||||
|
}
|
||||||
|
m_scheduledFunctions.clear();
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#include <Geode/Geode.hpp>
|
#include <Geode/Geode.hpp>
|
||||||
#include <Geode/loader/Log.hpp>
|
#include <Geode/loader/Log.hpp>
|
||||||
#include <Geode/loader/Mod.hpp>
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
#include <Geode/loader/Loader.hpp>
|
#include <Geode/loader/Loader.hpp>
|
||||||
#include <Geode/utils/general.hpp>
|
#include <Geode/utils/general.hpp>
|
||||||
#include <Geode/utils/casts.hpp>
|
#include <Geode/utils/casts.hpp>
|
||||||
|
@ -97,10 +96,10 @@ std::string Log::toString(bool logTime) const {
|
||||||
std::string res;
|
std::string res;
|
||||||
|
|
||||||
if (logTime) {
|
if (logTime) {
|
||||||
res += fmt::format("{:%H:%M:%S}", this->m_time);
|
res += fmt::format("{:%H:%M:%S}", m_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
res += fmt::format("[{}]: ", m_sender ? m_sender->getName() : "?");
|
res += fmt::format(" [{}]: ", m_sender ? m_sender->getName() : "?");
|
||||||
|
|
||||||
for (auto& i : m_components) {
|
for (auto& i : m_components) {
|
||||||
res += i->_toString();
|
res += i->_toString();
|
||||||
|
@ -114,5 +113,5 @@ void Log::pushToLoader() {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string geode::log::generateLogName() {
|
std::string geode::log::generateLogName() {
|
||||||
return fmt::format("Geode_{:%H:%M:%S}.log", log_clock::now());
|
return fmt::format("Geode_{:%H.%M.%S}.log", log_clock::now());
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#include <Geode/loader/Loader.hpp>
|
#include <Geode/loader/Loader.hpp>
|
||||||
#include <Geode/loader/Log.hpp>
|
#include <Geode/loader/Log.hpp>
|
||||||
#include <Geode/loader/Mod.hpp>
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
#include <Geode/loader/Setting.hpp>
|
#include <Geode/loader/Setting.hpp>
|
||||||
#include <Geode/utils/conststring.hpp>
|
#include <Geode/utils/conststring.hpp>
|
||||||
#include <Geode/utils/file.hpp>
|
#include <Geode/utils/file.hpp>
|
||||||
|
@ -211,7 +210,6 @@ Result<> Mod::load() {
|
||||||
if (this->hasUnresolvedDependencies()) {
|
if (this->hasUnresolvedDependencies()) {
|
||||||
RETURN_LOAD_ERR("Mod has unresolved dependencies");
|
RETURN_LOAD_ERR("Mod has unresolved dependencies");
|
||||||
}
|
}
|
||||||
log::releaseSchedules(this);
|
|
||||||
auto err = this->loadPlatformBinary();
|
auto err = this->loadPlatformBinary();
|
||||||
if (!err) RETURN_LOAD_ERR(err.error());
|
if (!err) RETURN_LOAD_ERR(err.error());
|
||||||
if (m_implicitLoadFunc) {
|
if (m_implicitLoadFunc) {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#include <about.hpp>
|
#include <about.hpp>
|
||||||
#include <Geode/loader/Loader.hpp>
|
#include <Geode/loader/Loader.hpp>
|
||||||
#include <Geode/loader/Mod.hpp>
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
#include <Geode/utils/string.hpp>
|
#include <Geode/utils/string.hpp>
|
||||||
#include <Geode/utils/file.hpp>
|
#include <Geode/utils/file.hpp>
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#include <Geode/loader/Hook.hpp>
|
#include <Geode/loader/Hook.hpp>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <Geode/loader/Mod.hpp>
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
#include <Geode/loader/Loader.hpp>
|
#include <Geode/loader/Loader.hpp>
|
||||||
#include <Geode/utils/casts.hpp>
|
#include <Geode/utils/casts.hpp>
|
||||||
#include <Geode/utils/vector.hpp>
|
#include <Geode/utils/vector.hpp>
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include <Geode/loader/cgeode.h>
|
#include <Geode/loader/cgeode.h>
|
||||||
#include <Geode/loader/Mod.hpp>
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
#include <Geode/loader/Log.hpp>
|
#include <Geode/loader/Log.hpp>
|
||||||
|
|
||||||
USE_GEODE_NAMESPACE();
|
USE_GEODE_NAMESPACE();
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#include <Geode/DefaultInclude.hpp>
|
#include <Geode/DefaultInclude.hpp>
|
||||||
#include <Geode/loader/Loader.hpp>
|
#include <Geode/loader/Loader.hpp>
|
||||||
#include <Geode/loader/Mod.hpp>
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
#undef snprintf
|
#undef snprintf
|
||||||
|
|
||||||
USE_GEODE_NAMESPACE();
|
USE_GEODE_NAMESPACE();
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#ifdef GEODE_IS_MACOS
|
#ifdef GEODE_IS_MACOS
|
||||||
|
|
||||||
#include <Geode/loader/Mod.hpp>
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
|
||||||
USE_GEODE_NAMESPACE();
|
USE_GEODE_NAMESPACE();
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#include <Geode/loader/Mod.hpp>
|
#include <Geode/loader/Mod.hpp>
|
||||||
#include <Geode/loader/Interface.hpp>
|
|
||||||
#include <Geode/loader/Loader.hpp>
|
#include <Geode/loader/Loader.hpp>
|
||||||
#include <Geode/loader/SettingEvent.hpp>
|
#include <Geode/loader/SettingEvent.hpp>
|
||||||
#include <InternalLoader.hpp>
|
#include <InternalLoader.hpp>
|
||||||
|
@ -124,7 +123,7 @@ int geodeEntry(void* platformData) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Interface::get()->init(InternalMod::get());
|
geode_implicit_load(InternalMod::get());
|
||||||
|
|
||||||
if (!InternalLoader::get()->setup()) {
|
if (!InternalLoader::get()->setup()) {
|
||||||
// if we've made it here, Geode will
|
// if we've made it here, Geode will
|
||||||
|
|
|
@ -3,6 +3,11 @@
|
||||||
|
|
||||||
USE_GEODE_NAMESPACE();
|
USE_GEODE_NAMESPACE();
|
||||||
|
|
||||||
|
auto test = [](){
|
||||||
|
log::info("Static logged");
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
// Exported functions
|
// Exported functions
|
||||||
GEODE_API bool GEODE_CALL geode_enable() {
|
GEODE_API bool GEODE_CALL geode_enable() {
|
||||||
log::info("Enabled");
|
log::info("Enabled");
|
||||||
|
|
Loading…
Reference in a new issue