Skip to content

Commit e4a9134

Browse files
committed
Some CCObject fields stuff
1 parent f20a7a9 commit e4a9134

File tree

3 files changed

+118
-7
lines changed

3 files changed

+118
-7
lines changed

mod.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"include/*.h"
1717
]
1818
},
19+
"early-load": true,
1920
"links": {
2021
"homepage": "https://linktr.ee/Alphalaneous",
2122
"source": "https://github.com/Alphalaneous/Alphas-Geode-Utils",

src/hooks/CCObject.cpp

Lines changed: 71 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,80 @@
11
#include <Geode/Geode.hpp>
22
#include "../../include/Utils.h"
33
#include "../../include/NodeModding.h"
4+
#include "CCObject.h"
45
#include <Geode/modify/CCObject.hpp>
6+
#include <queue>
57

68
using namespace geode::prelude;
79
using namespace AlphaUtils;
810

9-
class $modify(CCObject) {
10-
CCObject* autorelease() {
11-
if (CCNode* node = typeinfo_cast<CCNode*>(this)) {
12-
NodeModding::get()->handleNode(node);
13-
}
14-
return CCObject::autorelease();
11+
static std::vector<Ref<ObjectData>> s_objectArena;
12+
static std::queue<uint32_t> s_freeArenaSlots;
13+
14+
uint32_t allocateObjectData(ObjectData* data) {
15+
if (!s_freeArenaSlots.empty()) {
16+
uint32_t id = s_freeArenaSlots.front(); s_freeArenaSlots.pop();
17+
s_objectArena[id] = data;
18+
return id;
19+
} else {
20+
s_objectArena.push_back(data);
21+
return static_cast<uint32_t>(s_objectArena.size() - 1);
22+
}
23+
}
24+
25+
void releaseObjectData(uint32_t id) {
26+
if (id != 0 && id < s_objectArena.size() && s_objectArena[id]) {
27+
s_objectArena[id] = nullptr;
28+
s_freeArenaSlots.push(id);
29+
}
30+
}
31+
32+
void DummyScriptEngineProtocol::removeScriptObjectByCCObject(CCObject* pObj) {
33+
releaseObjectData(pObj->m_nLuaID);
34+
}
35+
36+
CCScriptEngineManager* MyCCScriptEngineManager::sharedManager() {
37+
auto ret = CCScriptEngineManager::sharedManager();
38+
if (!ret->m_pScriptEngine) {
39+
ret->setScriptEngine(new DummyScriptEngineProtocol());
40+
}
41+
42+
return ret;
43+
}
44+
45+
void FieldCCObject::tryCreateData() {
46+
if (m_nLuaID == 0) {
47+
ObjectData* data = new ObjectData();
48+
CCPoolManager::sharedPoolManager()->addObject(data);
49+
m_nLuaID = allocateObjectData(data);
50+
}
51+
}
52+
53+
CCObject* FieldCCObject::autorelease() {
54+
if (CCNode* node = typeinfo_cast<CCNode*>(this)) {
55+
NodeModding::get()->handleNode(node);
56+
}
57+
tryCreateData();
58+
59+
return CCObject::autorelease();
60+
}
61+
62+
ObjectData* FieldCCObject::getObjectData() {
63+
tryCreateData();
64+
if (m_nLuaID < s_objectArena.size()) {
65+
return s_objectArena[m_nLuaID];
66+
}
67+
return nullptr;
68+
}
69+
70+
CCObject* FieldCCObject::getUserObject() {
71+
ObjectData* data = getObjectData();
72+
return data ? data->m_object : nullptr;
73+
}
74+
75+
void FieldCCObject::setUserObject(CCObject* object) {
76+
ObjectData* data = getObjectData();
77+
if (data && data->m_object != object) {
78+
data->m_object = object;
1579
}
16-
};
80+
}

src/hooks/CCObject.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#pragma once
2+
3+
#include <Geode/Geode.hpp>
4+
#include <Geode/modify/CCObject.hpp>
5+
#include <Geode/modify/CCScriptEngineManager.hpp>
6+
#include <Geode/cocos/cocoa/CCObject.h>
7+
8+
struct ObjectData : public cocos2d::CCObject {
9+
geode::Ref<cocos2d::CCObject> m_object;
10+
int m_tag;
11+
};
12+
13+
class DummyScriptEngineProtocol : public cocos2d::CCScriptEngineProtocol {
14+
void removeScriptObjectByCCObject(cocos2d::CCObject* pObj);
15+
cocos2d::ccScriptType getScriptType() { return cocos2d::kScriptTypeNone; };
16+
void removeScriptHandler(int nHandler) {};
17+
int reallocateScriptHandler(int nHandler) { return -1;}
18+
int executeString(const char* codes) { return -1; };
19+
int executeScriptFile(const char* filename) { return -1; };
20+
int executeGlobalFunction(const char* functionName) { return -1; };
21+
int executeNodeEvent(cocos2d::CCNode* pNode, int nAction) { return -1; };
22+
int executeMenuItemEvent(cocos2d::CCMenuItem* pMenuItem) { return -1; };
23+
int executeNotificationEvent(cocos2d::CCNotificationCenter* pNotificationCenter, const char* pszName) { return -1; };
24+
int executeCallFuncActionEvent(cocos2d::CCCallFunc* pAction, cocos2d::CCObject* pTarget = NULL) { return -1; };
25+
int executeSchedule(int nHandler, float dt, cocos2d::CCNode* pNode = NULL) { return -1; };
26+
int executeLayerTouchesEvent(cocos2d::CCLayer* pLayer, int eventType, cocos2d::CCSet *pTouches) { return -1; };
27+
int executeLayerTouchEvent(cocos2d::CCLayer* pLayer, int eventType, cocos2d::CCTouch *pTouch) { return -1; };
28+
int executeLayerKeypadEvent(cocos2d::CCLayer* pLayer, int eventType) { return -1; };
29+
int executeAccelerometerEvent(cocos2d::CCLayer* pLayer, cocos2d::CCAcceleration* pAccelerationValue) { return -1; };
30+
int executeEvent(int nHandler, const char* pEventName, cocos2d::CCObject* pEventSource = NULL, const char* pEventSourceClassName = NULL) { return -1; };
31+
int executeEventWithArgs(int nHandler, cocos2d::CCArray* pArgs) { return 0; }
32+
bool handleAssert(const char *msg) { return false; };
33+
bool parseConfig(ConfigType type, const std::string& str) { return false; };
34+
};
35+
36+
class $modify(MyCCScriptEngineManager, cocos2d::CCScriptEngineManager) {
37+
static cocos2d::CCScriptEngineManager* sharedManager();
38+
};
39+
40+
class $modify(FieldCCObject, cocos2d::CCObject) {
41+
cocos2d::CCObject* autorelease();
42+
ObjectData* getObjectData();
43+
cocos2d::CCObject* getUserObject();
44+
void setUserObject(cocos2d::CCObject* object);
45+
void tryCreateData();
46+
};

0 commit comments

Comments
 (0)