geode/loader/include/Geode/modify/Modify.hpp

49 lines
2.7 KiB
C++
Raw Normal View History

2022-07-30 12:24:03 -04:00
#pragma once
#include "../meta/meta.hpp"
2022-10-30 14:59:20 -04:00
#include "Addresses.hpp"
#include "Types.hpp"
#include "Wrapper.hpp"
2022-10-08 09:55:40 -04:00
#include <Geode/loader/Loader.hpp>
#include <Geode/loader/Mod.hpp>
2022-07-30 12:24:03 -04:00
#include <iostream>
2022-10-17 05:25:56 -04:00
#include "IDManager.hpp"
2022-07-30 12:24:03 -04:00
2022-10-30 14:59:20 -04:00
#define GEODE_APPLY_MODIFY_FOR_FUNCTION( \
addr_index, pure_index, convention, className, functionName \
) \
if constexpr (wrap::functionName<Derived, types::pure##pure_index>::uuid != nullptr && (void*)wrap::functionName<Base, types::pure##pure_index>::uuid != (void*)wrap::functionName<Derived, types::pure##pure_index>::uuid) { \
(void)Mod::get() \
->addHook<wrap::functionName<Derived, types::pure##pure_index>::value, convention>( \
#className "::" #functionName, (void*)addresses::address##addr_index() \
); \
}
2022-07-30 12:24:03 -04:00
namespace geode::modifier {
2022-10-30 14:59:20 -04:00
template <class Derived, class Base>
class Modify;
2022-07-30 12:24:03 -04:00
2022-10-30 14:59:20 -04:00
template <class Derived>
class ModifyBase {
public:
// unordered_map<handles> idea
ModifyBase() {
Loader::get()->scheduleOnModLoad(getMod(), []() {
Derived::apply();
});
}
template <class, class>
friend class Modify;
// explicit Modify(Property property) idea
};
2022-07-30 12:24:03 -04:00
2022-10-30 14:59:20 -04:00
template <class Derived, class Base>
class Modify {
public:
Modify() {
static_assert(core::meta::always_false<Derived>, "Custom Modify not implemented.");
}
};
2022-07-30 12:24:03 -04:00
}