From 66522f57e7dfc1a1fb52747df2da2928e071c587 Mon Sep 17 00:00:00 2001 From: pm chihya Date: Thu, 8 Oct 2026 15:32:24 +0800 Subject: [PATCH] =?UTF-8?q?MergeFrom(IMessage,=20ReadOnlySpan,=20boo?= =?UTF-8?q?l,=20ExtensionRegistry)=E7=BB=9F=E4=B8=80=E5=9B=BA=E5=AE=9A?= =?UTF-8?q?=E4=B8=BA4=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/GakumasLocalify/Hook.cpp | 46 +++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/app/src/main/cpp/GakumasLocalify/Hook.cpp b/app/src/main/cpp/GakumasLocalify/Hook.cpp index 5363f03..0ff0082 100644 --- a/app/src/main/cpp/GakumasLocalify/Hook.cpp +++ b/app/src/main/cpp/GakumasLocalify/Hook.cpp @@ -1385,8 +1385,8 @@ namespace GakumasLocal::HookMain { } // 用于本地化 MasterDB - DEFINE_HOOK(void, MessageExtensions_MergeFrom, (void* message, void* span, void* mtd)) { - MessageExtensions_MergeFrom_Orig(message, span, mtd); + DEFINE_HOOK(void, MessageExtensions_MergeFrom, (void* message, void* span, bool discardUnknownFields, void* registry, void* mtd)) { + MessageExtensions_MergeFrom_Orig(message, span, discardUnknownFields, registry, mtd); if (message) { auto ret_klass = Il2cppUtils::get_class_from_instance(message); if (ret_klass) { @@ -2180,6 +2180,39 @@ namespace GakumasLocal::HookMain { return LiveSceneContentView_SetLyricsTextActive_Orig(self, value, mtd); } + // Debug auto photography: expose 10/20/30 instead of the game's original choices. + DEFINE_HOOK(void*, LiveUtility_AutoPhotoCountTypeValues, (void* mtd)) { + auto* counts = reinterpret_cast*>( + LiveUtility_AutoPhotoCountTypeValues_Orig(mtd)); + if (!Config::dbgMode || !counts) return counts; + + if (counts->max_length < 3) { + static std::atomic_bool warned{ false }; + if (!warned.exchange(true)) { + Log::ErrorFmt("Auto photo count array has insufficient length (array=%p, length=%llu)", + counts, static_cast(counts->max_length)); + } + return counts; + } + + counts->At(0) = 10; + counts->At(1) = 20; + counts->At(2) = 30; + + static std::atomic_bool logged{ false }; + if (!logged.exchange(true)) Log::Info("Auto photo count options set to 10/20/30"); + return counts; + } + + // Keep existing settings meaningful after replacing the old 10/5/1 choices. + DEFINE_HOOK(int, LiveUtility_GetAutoPhotoLimitCount, (void* mtd)) { + const int count = LiveUtility_GetAutoPhotoLimitCount_Orig(mtd); + if (!Config::dbgMode) return count; + if (count == 1 || count == 3) return 30; + if (count == 5) return 20; + return count; + } + // std::string lastMusicId; #ifdef GKMS_WINDOWS DEFINE_HOOK(void*, PictureBookLiveSelectScreenPresenter_OnSelectMusic, (void* retstr, void* self, void* itemModel, void* ct, void* mtd)) { @@ -2827,7 +2860,7 @@ namespace GakumasLocal::HookMain { // "EffectGroup", ".ctor")); ADD_HOOK(MessageExtensions_MergeFrom, Il2cppUtils::GetMethodPointer("Google.Protobuf.dll", "Google.Protobuf", - "MessageExtensions", "MergeFrom", {"Google.Protobuf.IMessage", "System.ReadOnlySpan"})); + "MessageExtensions", "MergeFrom", {"Google.Protobuf.IMessage", "System.ReadOnlySpan", "System.Boolean", "Google.Protobuf.ExtensionRegistry"})); ADD_HOOK(ExamExtensions_ExchangeSpToNormal, Il2cppUtils::GetMethodPointer( @@ -2960,6 +2993,13 @@ namespace GakumasLocal::HookMain { Il2cppUtils::GetMethodPointer("Assembly-CSharp.dll", "Campus.Live", "LiveSceneContentView", "SetLyricsTextActive", { "*" })); + ADD_HOOK(LiveUtility_AutoPhotoCountTypeValues, + Il2cppUtils::GetMethodPointer("Assembly-CSharp.dll", "Campus.Live", + "LiveUtility", "AutoPhotoCountTypeValues")); + ADD_HOOK(LiveUtility_GetAutoPhotoLimitCount, + Il2cppUtils::GetMethodPointer("Assembly-CSharp.dll", "Campus.Live", + "LiveUtility", "GetAutoPhotoLimitCount")); + // ADD_HOOK(PictureBookLiveSelectScreenPresenter_OnSelectMusic, // Il2cppUtils::GetMethodPointer("Assembly-CSharp.dll", "Campus.OutGame", // "PictureBookLiveSelectScreenPresenter", "OnSelectMusicAsync"));