|
6 | 6 | #include <Geode/cocos/base_nodes/CCNode.h> |
7 | 7 | #include "CCObject.h" |
8 | 8 | #include "Fields.h" |
| 9 | +#include "Utils.h" |
9 | 10 |
|
10 | 11 | #ifdef GEODE_IS_WINDOWS |
11 | 12 | #ifdef ALPHALANEOUS_UTILS_API_EXPORTING |
@@ -53,6 +54,40 @@ namespace AlphaUtils { |
53 | 54 | } |
54 | 55 | }; |
55 | 56 |
|
| 57 | + struct ModifyBaseInfo { |
| 58 | + int priority; |
| 59 | + std::function<void(FieldCCObject*)> method; |
| 60 | + }; |
| 61 | + |
| 62 | + template <class Derived, class Type> |
| 63 | + struct BaseWrapper : public Type { |
| 64 | + geode::modifier::FieldIntermediate<Derived, Type> m_fields; |
| 65 | + static int modifyPrio() { return 0; } |
| 66 | + }; |
| 67 | + |
| 68 | + class ALPHA_UTILS_API_DLL BaseModding { |
| 69 | + protected: |
| 70 | + std::unordered_map<std::string, std::vector<ModifyBaseInfo>> m_basesToModify; |
| 71 | + public: |
| 72 | + bool m_lock; |
| 73 | + static BaseModding* get(); |
| 74 | + std::unordered_map<std::string, std::vector<ModifyBaseInfo>> getBasesToModify(); |
| 75 | + void addBaseToModify(std::string className, int prio, std::function<void(FieldCCObject*)> func); |
| 76 | + void handleBase(FieldCCObject* object); |
| 77 | + }; |
| 78 | + |
| 79 | + template <class T, class Type> |
| 80 | + class ModifyBaseLoad { |
| 81 | + public: |
| 82 | + ModifyBaseLoad() { |
| 83 | + BaseModding::get()->addBaseToModify(AlphaUtils::Cocos::getClassNameByType<Type>(), T::modifyPrio(), [](FieldCCObject* self) { |
| 84 | + BaseModding::get()->m_lock = true; |
| 85 | + reinterpret_cast<T*>(self)->T::modify(); |
| 86 | + BaseModding::get()->m_lock = false; |
| 87 | + }); |
| 88 | + } |
| 89 | + }; |
| 90 | + |
56 | 91 | //remnants for compat |
57 | 92 | struct ModifyInfo { |
58 | 93 | int priority; |
@@ -105,14 +140,29 @@ class GEODE_CONCAT(GEODE_CONCAT(derived, Hook), __LINE__) : AlphaUtils::NodeWrap |
105 | 140 | };\ |
106 | 141 | struct derived : AlphaUtils::NodeWrapper<derived> |
107 | 142 |
|
| 143 | +#define ALPHA_BASE_MODIFY_DECLARE(base, derived) \ |
| 144 | +GEODE_CONCAT(GEODE_CONCAT(derived, __LINE__), Dummy);\ |
| 145 | +struct derived;\ |
| 146 | +class GEODE_CONCAT(GEODE_CONCAT(derived, Hook), __LINE__) : AlphaUtils::BaseWrapper<derived, base> {\ |
| 147 | + private:\ |
| 148 | + static inline AlphaUtils::ModifyBaseLoad<derived, base> s_apply{};\ |
| 149 | +};\ |
| 150 | +struct derived : AlphaUtils::BaseWrapper<derived, base> |
| 151 | + |
108 | 152 | #define MODIFY1(base) ALPHA_MODIFY_DECLARE(base, GEODE_CONCAT(hook, __LINE__)) |
109 | 153 | #define MODIFY2(derived, base) ALPHA_MODIFY_DECLARE(base, derived) |
110 | 154 |
|
111 | 155 | #define MODIFYNODE1(base) ALPHA_NODE_MODIFY_DECLARE(base, GEODE_CONCAT(hook, __LINE__)) |
112 | 156 | #define MODIFYNODE2(derived, base) ALPHA_NODE_MODIFY_DECLARE(base, derived) |
113 | 157 |
|
| 158 | +#define MODIFYBASE1(base) ALPHA_BASE_MODIFY_DECLARE(base, GEODE_CONCAT(hook, __LINE__)) |
| 159 | +#define MODIFYBASE2(derived, base) ALPHA_BASE_MODIFY_DECLARE(base, derived) |
| 160 | + |
114 | 161 | #define $nodeModify(...) \ |
115 | 162 | GEODE_INVOKE(GEODE_CONCAT(MODIFYNODE, GEODE_NUMBER_OF_ARGS(__VA_ARGS__)), __VA_ARGS__) |
116 | 163 |
|
117 | 164 | #define $objectModify(...) \ |
118 | 165 | GEODE_INVOKE(GEODE_CONCAT(MODIFY, GEODE_NUMBER_OF_ARGS(__VA_ARGS__)), __VA_ARGS__) |
| 166 | + |
| 167 | +#define $baseModify(...) \ |
| 168 | + GEODE_INVOKE(GEODE_CONCAT(MODIFYBASE, GEODE_NUMBER_OF_ARGS(__VA_ARGS__)), __VA_ARGS__) |
0 commit comments