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
68using namespace geode ::prelude;
79using 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+ }
0 commit comments