Compare commits
No commits in common. "main" and "v2.1.1" have entirely different histories.
3 changed files with 6 additions and 41 deletions
|
|
@ -17,10 +17,6 @@
|
||||||
|
|
||||||
namespace devour {
|
namespace devour {
|
||||||
|
|
||||||
static std::set<uint64_t> g_queriedDefs;
|
|
||||||
std::set<uint64_t>& QueriedDefs(){ return g_queriedDefs; }
|
|
||||||
void RememberQueriedDef(uint64_t id){ g_queriedDefs.insert(id); }
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static HMODULE g_gameAsm = nullptr;
|
static HMODULE g_gameAsm = nullptr;
|
||||||
|
|
||||||
|
|
@ -557,26 +553,7 @@ int Il2CppResolver::fabricateOwnership(){
|
||||||
char* s=strrchr(exe,'\\'); if(!s) s=strrchr(exe,'/');
|
char* s=strrchr(exe,'\\'); if(!s) s=strrchr(exe,'/');
|
||||||
if(s){
|
if(s){
|
||||||
std::ofstream f(std::string(exe,s-exe)+"\\DevourUnlocker.log",std::ios::app);
|
std::ofstream f(std::string(exe,s-exe)+"\\DevourUnlocker.log",std::ios::app);
|
||||||
static bool loggedCatalog=false;
|
f<<"[own] fabricate: catalog="<<cSize<<" had="<<(uSize>0?uSize:(int)have.size()-injected)<<" injected="<<injected<<"\n";
|
||||||
if(!loggedCatalog && cSize>0){
|
|
||||||
loggedCatalog=true;
|
|
||||||
f<<"[own] catalog ids:";
|
|
||||||
for(int i=0;i<cSize;++i){ void* ip=*(void**)(cData+(size_t)i*8); if(!ip) continue; f<<" "<<*(uint32_t*)((unsigned char*)ip+0x10); }
|
|
||||||
f<<"\n";
|
|
||||||
}
|
|
||||||
// Self-learning: inject any def the game queried but that lives outside the
|
|
||||||
// store catalog (Supporter/DLC flashlights etc). Valid ids only - no sweeps.
|
|
||||||
int learned=0;
|
|
||||||
for(uint64_t qid : g_queriedDefs){
|
|
||||||
if(qid==0 || hasId(qid)) continue;
|
|
||||||
void* exc=nullptr; void* arg=&qid;
|
|
||||||
invoke_fn(addMethod,userList,&arg,&exc);
|
|
||||||
if(exc) continue;
|
|
||||||
have.push_back(qid);
|
|
||||||
++learned;
|
|
||||||
}
|
|
||||||
|
|
||||||
f<<"[own] fabricate: catalog="<<cSize<<" had="<<(uSize>0?uSize:(int)(have.size()-injected))<<" injected="<<injected<<" learned="<<learned<<"\n";
|
|
||||||
}
|
}
|
||||||
}catch(...){}
|
}catch(...){}
|
||||||
} catch(...){ injected=-1; }
|
} catch(...){ injected=-1; }
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <set>
|
|
||||||
|
|
||||||
// Minimal IL2CPP types — avoids needing il2cpp headers at compile time
|
// Minimal IL2CPP types — avoids needing il2cpp headers at compile time
|
||||||
struct Il2CppString { void* klass; void* monitor; int32_t length; wchar_t chars[1]; };
|
struct Il2CppString { void* klass; void* monitor; int32_t length; wchar_t chars[1]; };
|
||||||
|
|
@ -10,12 +9,6 @@ struct MethodInfo;
|
||||||
|
|
||||||
namespace devour {
|
namespace devour {
|
||||||
|
|
||||||
// Def ids the game itself asked UserHasItem/PlayerHasItem about (DLC/promo defs
|
|
||||||
// absent from the store catalog live here). Fabricator injects these too.
|
|
||||||
std::set<uint64_t>& QueriedDefs();
|
|
||||||
void RememberQueriedDef(uint64_t id);
|
|
||||||
|
|
||||||
|
|
||||||
// Resolves IL2CPP method pointers without hard offsets.
|
// Resolves IL2CPP method pointers without hard offsets.
|
||||||
// Strategy 1: via il2cpp exports (class/method lookup)
|
// Strategy 1: via il2cpp exports (class/method lookup)
|
||||||
// Strategy 2: xref string sigscan as fallback
|
// Strategy 2: xref string sigscan as fallback
|
||||||
|
|
|
||||||
|
|
@ -90,20 +90,15 @@ static void __fastcall hUpdateLockedRobes(void* thiz, void* method) { if (oUpdRo
|
||||||
// Ownership override: every Steam catalog item (pets/flashlights/emotes/outfits/promos) counts as owned.
|
// Ownership override: every Steam catalog item (pets/flashlights/emotes/outfits/promos) counts as owned.
|
||||||
// LOGS every query — if the pet UI never appears in the log, it reads the userItems list field directly.
|
// LOGS every query — if the pet UI never appears in the log, it reads the userItems list field directly.
|
||||||
static bool __fastcall hUserHasItem(void* thiz, unsigned long long itemDef, void* method) {
|
static bool __fastcall hUserHasItem(void* thiz, unsigned long long itemDef, void* method) {
|
||||||
// pass-through + trace (v2.1.0 proved forcing true blocks purchases)
|
|
||||||
RememberQueriedDef((uint64_t)itemDef);
|
|
||||||
char b[96]; snprintf(b,sizeof(b),"[trace] UserHasItem(def=%llu)", (unsigned long long)itemDef); logPatch(b);
|
|
||||||
if (oUserHasItem) return oUserHasItem(thiz, itemDef, method);
|
if (oUserHasItem) return oUserHasItem(thiz, itemDef, method);
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
// Multiplayer validator: every player counts as owning every item (lobby validation path)
|
// Multiplayer validator: every player counts as owning every item (lobby validation path)
|
||||||
static bool __fastcall hPlayerHasItem(void* thiz, int connectionId, unsigned long long itemDef, void* method) {
|
static bool __fastcall hPlayerHasItem(void* thiz, int connectionId, unsigned long long itemDef, void* method) {
|
||||||
// MUST stay pass-through: forcing true desyncs lobby validation vs injected
|
// Validator gate used by StoreEmotesOwnedOnSteam + WaitForPurchased*Validation coroutines.
|
||||||
// userItems and UNLOCKS REGRESS (pets locked again). See v2.1.1 regression.
|
// Does NOT block purchases (that was UserHasItem) — safe to force true.
|
||||||
RememberQueriedDef((uint64_t)itemDef);
|
char b[160]; snprintf(b,sizeof(b),"[trace] PlayerHasItem(conn=%d def=%llu) -> true", connectionId, itemDef); logPatch(b);
|
||||||
char b[128]; snprintf(b,sizeof(b),"[trace] PlayerHasItem(conn=%d def=%llu)", connectionId, (unsigned long long)itemDef); logPatch(b);
|
return true;
|
||||||
if (oPlayerHasItem) return oPlayerHasItem(thiz, connectionId, itemDef, method);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
// Inventory-retrieved flag: pass through — forcing true with an empty userItems made some
|
// Inventory-retrieved flag: pass through — forcing true with an empty userItems made some
|
||||||
// flows treat items as definitively NOT owned; original behavior is safer now
|
// flows treat items as definitively NOT owned; original behavior is safer now
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue