CookieCutter Web界面:图形化模板管理的终极解决方案
2026/5/6 23:23:24
Bloxstrap是Roblox官方启动器的第三方替代品,提供额外的实用功能和改进。该项目采用C#开发,支持Windows平台,具有高度可定制性。
安装完成后,Bloxstrap会自动替换默认的Roblox启动器。当通过浏览器启动Roblox时,将使用Bloxstrap进行游戏安装和启动。
Bloxstrap支持多种命令行参数:
# 打开设置界面Bloxstrap.exe -settings# 静默模式启动Bloxstrap.exe -quiet# 启动Roblox StudioBloxstrap.exe -studio# 强制更新Bloxstrap.exe -upgrade%LocalAppData%\Bloxstrap\Settings.json%LocalAppData%\Bloxstrap\Modifications\ClientSettings\ClientAppSettings.json%LocalAppData%\Bloxstrap\Logs\Bloxstrap提供了丰富的API接口,包括:
/// <summary>/// Bloxstrap主应用程序类/// </summary>publicpartialclassApp:Application{publicconststringProjectName="Bloxstrap";publicconststringProjectOwner="Bloxstrap";publicconststringProjectRepository="bloxstraplabs/bloxstrap";publicconststringProjectDownloadLink="https://bloxstraplabs.com";publicconststringRobloxPlayerAppName="RobloxPlayerBeta";publicconststringRobloxStudioAppName="RobloxStudioBeta";// 卸载注册表键路径publicconststringUninstallKey=@"Software\Microsoft\Windows\CurrentVersion\Uninstall\Bloxstrap";publicstaticLaunchSettingsLaunchSettings{get;privateset;}=null!;publicstaticBuildMetadataAttributeBuildMetadata=Assembly.GetExecutingAssembly().GetCustomAttribute<BuildMetadataAttribute>()!;publicstaticstringVersion=Assembly.GetExecutingAssembly().GetName().Version!.ToString()[..^2];publicstaticBootstrapper?Bootstrapper{get;set;}=null!;// 检查是否为生产构建publicstaticboolIsProductionBuild=>IsActionBuild&&BuildMetadata.CommitRef.StartsWith("tag",StringComparison.Ordinal);}/// <summary>/// Roblox启动器核心实现/// </summary>publicclassBootstrapper{privateconstintProgressBarMaximum=10000;privateconststringAppSettings="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"+"<Settings>\r\n"+" <ContentFolder>content</ContentFolder>\r\n"+" <BaseUrl>http://www.roblox.com</BaseUrl>\r\n"+"</Settings>\r\n";privatereadonlyFastZipEvents_fastZipEvents=new();privatereadonlyCancellationTokenSource_cancelTokenSource=new();privateIAppDataAppData=default!;privateLaunchMode_launchMode;privatestring_launchCommandLine=App.LaunchSettings.RobloxLaunchArgs;privateVersion?_latestVersion=null;privatestring_latestVersionGuid=null!;privatestring_latestVersionDirectory=null!;privatePackageManifest_versionPackageManifest=null!;privatebool_isInstalling=false;privatedouble_progressIncrement;privatedouble_taskbarProgressIncrement;/// <summary>/// 初始化启动器/// </summary>publicvoidInitialize(){// 初始化逻辑...}/// <summary>/// 安装Roblox客户端/// </summary>publicasyncTaskInstall(){// 安装逻辑...}/// <summary>/// 启动Roblox客户端/// </summary>publicvoidLaunch(){// 启动逻辑...}}/// <summary>/// JSON配置管理基类/// </summary>/// <typeparam name="T">配置类型</typeparam>publicclassJsonManager<T>whereT:class,new(){publicTOriginalProp{get;set;}=new();publicTProp{get;set;}=new();/// <summary>/// 上次从磁盘读取时的文件哈希/// </summary>publicstring?LastFileHash{get;privateset;}publicboolLoaded{get;set;}=false;publicvirtualstringClassName=>typeof(T).Name;publicvirtualstringFileLocation=>Path.Combine(Paths.Base,$"{ClassName}.json");/// <summary>/// 从文件加载配置/// </summary>publicvirtualvoidLoad(boolalertFailure=true){stringLOG_IDENT=$"{LOG_IDENT_CLASS}::Load";App.Logger.WriteLine(LOG_IDENT,$"Loading from{FileLocation}...");try{stringcontents=File.ReadAllText(FileLocation);T?settings=JsonSerializer.Deserialize<T>(contents);if(settingsisnull)thrownewArgumentNullException("Deserialization returned null");Prop=settings;Loaded=true;LastFileHash=MD5Hash.FromString(contents);App.Logger.WriteLine(LOG_IDENT,"Loaded successfully!");}catch(Exceptionex){App.Logger.WriteLine(LOG_IDENT,"Failed to load!");App.Logger.WriteException(LOG_IDENT,ex);// 错误处理逻辑...Save();// 创建默认配置}}/// <summary>/// 保存配置到文件/// </summary>publicvirtualvoidSave(){stringLOG_IDENT=$"{LOG_IDENT_CLASS}::Save";App.Logger.WriteLine(LOG_IDENT,$"Saving to{FileLocation}...");Directory.CreateDirectory(Path.GetDirectoryName(FileLocation)!);try{stringcontents=JsonSerializer.Serialize(Prop,newJsonSerializerOptions{WriteIndented=true});File.WriteAllText(FileLocation,contents);LastFileHash=MD5Hash.FromString(contents);App.Logger.WriteLine(LOG_IDENT,"Save complete!");}catch(Exceptionex){// 错误处理逻辑...}}}/// <summary>/// 游戏活动监视器/// </summary>publicclassActivityWatcher:IDisposable{// 日志条目常量privateconststringGameMessageEntry="[FLog::Output] [BloxstrapRPC]";privateconststringGameJoiningEntry="[FLog::Output] ! Joining game";privateconststringGameTeleportingEntry="[FLog::GameJoinUtil] GameJoinUtil::initiateTeleportToPlace";privateconststringGameJoinedEntry="[FLog::Network] serverId:";privateconststringGameDisconnectedEntry="[FLog::Network] Time to disconnect replication data:";// 事件定义publiceventEventHandler<Message>?OnRPCMessage;publiceventEventHandler<GameJoinData>?OnGameJoin;publiceventEventHandler?OnGameLeave;publiceventEventHandler?OnLogOpen;privatereadonlystring_logPath;privatereadonlyFileStream_fileStream;privatereadonlyStreamReader_streamReader;privateCancellationTokenSource?_cancellationTokenSource;/// <summary>/// 启动活动监视/// </summary>publicvoidStart(){_cancellationTokenSource=newCancellationTokenSource();Task.Run(()=>WatchLogFile(_cancellationTokenSource.Token));}/// <summary>/// 监视日志文件变化/// </summary>privateasyncTaskWatchLogFile(CancellationTokencancellationToken){while(!cancellationToken.IsCancellationRequested){string?line=await_streamReader.ReadLineAsync();if(lineisnull){awaitTask.Delay(100,cancellationToken);continue;}ProcessLogLine(line);}}/// <summary>/// 处理日志行/// </summary>privatevoidProcessLogLine(stringline){// 处理游戏加入事件if(line.Contains(GameJoiningEntry)){varmatch=Regex.Match(line,@"! Joining game '([0-9a-f\-]{36})' place ([0-9]+) at ([0-9\.]+)");if(match.Success){vardata=newGameJoinData{JobId=match.Groups[1].Value,PlaceId=long.Parse(match.Groups[2].Value),ServerIP=match.Groups[3].Value};OnGameJoin?.Invoke(this,data);}}// 处理游戏离开事件elseif(line.Contains(GameDisconnectedEntry)){OnGameLeave?.Invoke(this,EventArgs.Empty);}// 处理RPC消息elseif(line.Contains(GameMessageEntry)){try{intstartIndex=line.IndexOf('{');if(startIndex!=-1){stringjson=line[startIndex..];varmessage=JsonSerializer.Deserialize<Message>(json);if(messageisnotnull)OnRPCMessage?.Invoke(this,message);}}catch(Exceptionex){App.Logger.WriteException("ActivityWatcher::ProcessLogLine",ex);}}}}/// <summary>/// 路径管理工具类/// </summary>staticclassPaths{// 系统目录路径publicstaticstringTemp=>Path.Combine(Path.GetTempPath(),App.ProjectName);publicstaticstringUserProfile=>Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);publicstaticstringLocalAppData=>Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);publicstaticstringDesktop=>Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);publicstaticstringWindowsStartMenu=>Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu),"Programs");publicstaticstringSystem=>Environment.GetFolderPath(Environment.SpecialFolder.System);// 进程路径publicstaticstringProcess=>Environment.ProcessPath!;// 临时目录publicstaticstringTempUpdates=>Path.Combine(Temp,"Updates");publicstaticstringTempLogs=>Path.Combine(Temp,"Logs");// Bloxstrap目录结构publicstaticstringBase{get;privateset;}="";publicstaticstringDownloads{get;privateset;}="";publicstaticstringLogs{get;privateset;}="";publicstaticstringIntegrations{get;privateset;}="";publicstaticstringVersions{get;privateset;}="";publicstaticstringModifications{get;privateset;}="";publicstaticstringCustomThemes{get;privateset;}="";publicstaticstringApplication{get;privateset;}="";publicstaticstringCustomFont=>Path.Combine(Modifications,"content\\fonts\\CustomFont.ttf");publicstaticboolInitialized=>!String.IsNullOrEmpty(Base);/// <summary>/// 初始化路径系统/// </summary>publicstaticvoidInitialize(stringbaseDirectory){Base=baseDirectory;Downloads=Path.Combine(Base,"Downloads");Logs=Path.Combine(Base,"Logs");Integrations=Path.Combine(Base,"Integrations");Versions=Path.Combine(Base,"Versions");Modifications=Path.Combine(Base,"Modifications");CustomThemes=Path.Combine(Base,"CustomThemes");Application=Path.Combine(Base,$"{App.ProjectName}.exe");}}这些核心代码展示了Bloxstrap的主要架构和功能实现,包括应用程序管理、启动器核心逻辑、配置管理、活动监视和路径管理等关键组件。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)