[Linux-only] basically bloxstap for sober

core: roblox 700 helper

kris.darkworld.download c38c7ca7 86c2fe7d

verified
+138
+93
src/api/700-fix/default/GlobalBasicSettings_13.xml
···
··· 1 + <roblox xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.roblox.com/roblox.xsd" version="4"> 2 + <External>null</External> 3 + <External>nil</External> 4 + <Item class="UserGameSettings" referent="RBXb718edab60ba48ac9e81936ba3389dfe"> 5 + <Properties> 6 + <bool name="AllTutorialsDisabled">false</bool> 7 + <bool name="BadgeVisible">true</bool> 8 + <token name="CameraMode">0</token> 9 + <bool name="CameraYInverted">false</bool> 10 + <bool name="ChatTranslationEnabled">true</bool> 11 + <bool name="ChatTranslationFTUXShown">true</bool> 12 + <string name="ChatTranslationLocale">en_us</string> 13 + <bool name="ChatTranslationToggleEnabled">false</bool> 14 + <bool name="ChatVisible">true</bool> 15 + <string name="CompletedTutorials"></string> 16 + <bool name="ComputerCameraMovementChanged">false</bool> 17 + <token name="ComputerCameraMovementMode">0</token> 18 + <bool name="ComputerMovementChanged">false</bool> 19 + <token name="ComputerMovementMode">0</token> 20 + <token name="ControlMode">1</token> 21 + <string name="DefaultCameraID"></string> 22 + <int name="FramerateCap">240</int> 23 + <bool name="Fullscreen">false</bool> 24 + <float name="GamepadCameraSensitivity">1</float> 25 + <token name="GraphicsOptimizationMode">0</token> 26 + <int name="GraphicsQualityLevel">21</int> 27 + <float name="HapticStrength">1</float> 28 + <bool name="HasEverUsedVR">false</bool> 29 + <float name="MasterVolume">1</float> 30 + <float name="MasterVolumeStudio">1</float> 31 + <bool name="MaxQualityEnabled">false</bool> 32 + <bool name="MicroProfilerWebServerEnabled">false</bool> 33 + <float name="MouseSensitivity">1</float> 34 + <Vector2 name="MouseSensitivityFirstPerson"> 35 + <X>1</X> 36 + <Y>1</Y> 37 + </Vector2> 38 + <Vector2 name="MouseSensitivityThirdPerson"> 39 + <X>1</X> 40 + <Y>1</Y> 41 + </Vector2> 42 + <bool name="OnScreenProfilerEnabled">false</bool> 43 + <float name="PartyVoiceVolume">1</float> 44 + <token name="PeoplePageLayout">0</token> 45 + <bool name="PerformanceStatsVisible">false</bool> 46 + <float name="PlayerHeight">5.70000029</float> 47 + <bool name="PlayerListVisible">true</bool> 48 + <bool name="PlayerNamesEnabled">true</bool> 49 + <token name="PreferredTextSize">1</token> 50 + <float name="PreferredTransparency">1</float> 51 + <int name="QualityResetLevel">0</int> 52 + <int name="RCCProfilerRecordFrameRate">1</int> 53 + <int name="RCCProfilerRecordTimeFrame">1</int> 54 + <bool name="ReadAloud">false</bool> 55 + <bool name="ReducedMotion">false</bool> 56 + <token name="SavedQualityLevel">10</token> 57 + <bool name="StartMaximized">true</bool> 58 + <Vector2 name="StartScreenPosition"> 59 + <X>20</X> 60 + <Y>20</Y> 61 + </Vector2> 62 + <Vector2 name="StartScreenSize"> 63 + <X>800</X> 64 + <Y>600</Y> 65 + </Vector2> 66 + <bool name="TouchCameraMovementChanged">false</bool> 67 + <token name="TouchCameraMovementMode">0</token> 68 + <bool name="TouchMovementChanged">false</bool> 69 + <token name="TouchMovementMode">0</token> 70 + <bool name="UiNavigationKeyBindEnabled">false</bool> 71 + <bool name="UsedCoreGuiIsVisibleToggle">true</bool> 72 + <bool name="UsedCustomGuiIsVisibleToggle">true</bool> 73 + <bool name="UsedHideHudShortcut">false</bool> 74 + <token name="VRComfortSetting">1</token> 75 + <bool name="VREnabled">true</bool> 76 + <int name="VRRotationIntensity">1</int> 77 + <token name="VRSafetyBubbleMode">0</token> 78 + <bool name="VRSmoothRotationEnabled">false</bool> 79 + <bool name="VRSmoothRotationEnabledCustomOption">false</bool> 80 + <bool name="VRThirdPersonFollowCamEnabled">true</bool> 81 + <bool name="VRThirdPersonFollowCamEnabledCustomOption">true</bool> 82 + <bool name="VignetteEnabled">true</bool> 83 + <bool name="VignetteEnabledCustomOption">true</bool> 84 + <string name="gaID"></string> 85 + <BinaryString name="AttributesSerialize"></BinaryString> 86 + <SecurityCapabilities name="Capabilities">0</SecurityCapabilities> 87 + <bool name="DefinesCapabilities">false</bool> 88 + <string name="Name">GameSettings</string> 89 + <int64 name="SourceAssetId">-1</int64> 90 + <BinaryString name="Tags"></BinaryString> 91 + </Properties> 92 + </Item> 93 + </roblox>
+41
src/api/700-fix/replacements.ts
···
··· 1 + import { SOBER_PATH } from "../constants"; 2 + import { generateConfiguration } from "../sober/ConfigManager"; 3 + import { writeFileSync } from "fs"; 4 + 5 + //@ts-expect-error 6 + import GlobalBasicSettings_13 from "./default/GlobalBasicSettings_13.xml" with { type: "text" } 7 + import { join } from "path"; 8 + 9 + type Replacement = { 10 + file: string, 11 + template: string, 12 + fn: (v: string)=>string 13 + } 14 + 15 + export const REPLACEMENTS = [ 16 + { 17 + // /home/ralsei/.var/app/org.vinegarhq.Sober/data/sober/appData/GlobalBasicSettings_13.xml 18 + file: "appData/GlobalBasicSettings_13.xml", 19 + template: GlobalBasicSettings_13, 20 + fn: (d: string) => { 21 + const c = generateConfiguration(); 22 + const FPS_CAP = c.fflags.DFIntTaskSchedulerTargetFps || 240; 23 + return d.replace(/<int name="FramerateCap">240<\/int>/g,`<int name="FramerateCap">${FPS_CAP}</int>`) 24 + } 25 + } 26 + ] 27 + 28 + const DATA_SOBER_BASE = `${SOBER_PATH}/data/sober/`; 29 + 30 + export async function handleRoblox700PatchReplacements() { 31 + for (const rep of REPLACEMENTS) { 32 + try { 33 + const value = rep.fn(rep.template); 34 + writeFileSync(join(DATA_SOBER_BASE,rep.file),value); 35 + console.log(`[700] PATCH DONE: ${rep.file}`) 36 + } catch(e_) { 37 + console.error(`[700] PATCH ERR!: ${rep.file}`) 38 + } 39 + } 40 + console.log("[700] Roblox SUCKS! Go play some other game!") 41 + }
+4
src/index.ts
··· 17 import { getPluginInfos, registerPluginsAllFinal } from "./api/Plugin"; 18 import "./plugins"; 19 import { eventCollector } from "./api/EventCollector"; 20 21 (() => { 22 const listPluginsSwitch = process.argv.find((a) => a === "--list-plugins"); ··· 172 } 173 174 generateConfigFile(); 175 176 const firstRobloxURLArg = process.argv.find( 177 (a) => a.startsWith("roblox:") || a.startsWith("roblox-player:")
··· 17 import { getPluginInfos, registerPluginsAllFinal } from "./api/Plugin"; 18 import "./plugins"; 19 import { eventCollector } from "./api/EventCollector"; 20 + import { handleRoblox700PatchReplacements } from "./api/700-fix/replacements"; 21 22 (() => { 23 const listPluginsSwitch = process.argv.find((a) => a === "--list-plugins"); ··· 173 } 174 175 generateConfigFile(); 176 + 177 + // fuck you roblox 178 + handleRoblox700PatchReplacements(); 179 180 const firstRobloxURLArg = process.argv.find( 181 (a) => a.startsWith("roblox:") || a.startsWith("roblox-player:")