├── .gitignore ├── .gitlab-ci.yml ├── .idea ├── .gitignore ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── encodings.xml ├── inspectionProfiles │ └── Project_Default.xml ├── uiDesigner.xml └── vcs.xml ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── README.md ├── README_EN.md ├── docs ├── CNAME └── image │ ├── icon.png │ ├── image01.png │ ├── image02.png │ ├── image03.png │ ├── image04.png │ ├── image05.png │ ├── image06.png │ ├── image07.png │ ├── image08.png │ ├── image09.png │ └── support.png ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main ├── java │ ├── cn │ │ └── tealc │ │ │ └── wutheringwavestool │ │ │ ├── FXResourcesLoader.java │ │ │ ├── Main.java │ │ │ ├── MainApplication.java │ │ │ ├── MainWindow.java │ │ │ ├── VersionUpdateUtil.java │ │ │ ├── base │ │ │ ├── Config.java │ │ │ ├── NotificationKey.java │ │ │ └── NotificationManager.java │ │ │ ├── dao │ │ │ ├── GameJdbcUtils.java │ │ │ ├── GameRecordDao.java │ │ │ ├── GameRoleDataDao.java │ │ │ ├── GameSettingDao.java │ │ │ ├── GameTimeDao.java │ │ │ ├── GameTowerDataDao.java │ │ │ ├── JdbcUtils.java │ │ │ ├── SignHistoryDao.java │ │ │ └── UserInfoDao.java │ │ │ ├── jna │ │ │ ├── GameAppListener.java │ │ │ └── GlobalKeyListener.java │ │ │ ├── model │ │ │ ├── CardInfo.java │ │ │ ├── Message.java │ │ │ ├── ResponseBody.java │ │ │ ├── ResponseBodyForApi.java │ │ │ ├── Setting.java │ │ │ ├── SourceType.java │ │ │ ├── Version.java │ │ │ ├── analysis │ │ │ │ ├── AnalysisData.java │ │ │ │ └── SsrData.java │ │ │ ├── game │ │ │ │ ├── GameRecord.java │ │ │ │ ├── GameRecordForLog.java │ │ │ │ └── GameTime.java │ │ │ ├── message │ │ │ │ ├── MessageInfo.java │ │ │ │ └── MessageType.java │ │ │ ├── netResource │ │ │ │ ├── Resource.java │ │ │ │ └── RootResource.java │ │ │ ├── release │ │ │ │ ├── Release.java │ │ │ │ └── ReleaseList.java │ │ │ ├── role │ │ │ │ └── RoleData.java │ │ │ ├── tower │ │ │ │ └── TowerData.java │ │ │ └── ui │ │ │ │ └── ServerData.java │ │ │ ├── plugin │ │ │ ├── FxPluginConfig.java │ │ │ ├── FxPluginLanguage.java │ │ │ └── FxPluginManager.java │ │ │ ├── theme │ │ │ ├── AccentColor.java │ │ │ ├── Dark.java │ │ │ ├── Light.java │ │ │ └── ThemeManager.java │ │ │ ├── thread │ │ │ ├── DownloadHeadImgTask.java │ │ │ ├── game │ │ │ │ └── DownloadGameTask.java │ │ │ └── system │ │ │ │ ├── CardPoolAnalysisTask.java │ │ │ │ ├── CardPoolRequestTask.java │ │ │ │ ├── CheckGameConfigTask.java │ │ │ │ ├── CheckVersionTask.java │ │ │ │ ├── DownloadUpdateTask.java │ │ │ │ ├── GameLogFileAnalysisTask.java │ │ │ │ ├── NewGameLogFileAnalysisTask.java │ │ │ │ ├── ResourcesSyncTask.java │ │ │ │ └── ui │ │ │ │ ├── BackgroundTask.java │ │ │ │ ├── ImgColorBgTask.java │ │ │ │ └── MainBackgroundTask.java │ │ │ ├── ui │ │ │ ├── HomeView.java │ │ │ ├── HomeViewModel.java │ │ │ ├── MainView.java │ │ │ ├── MainViewModel.java │ │ │ ├── PluginView.java │ │ │ ├── PluginViewModel.java │ │ │ ├── SettingView.java │ │ │ ├── SettingViewModel.java │ │ │ ├── base │ │ │ │ ├── UpdateView.java │ │ │ │ └── UpdateViewModel.java │ │ │ ├── cardpool │ │ │ │ ├── CardAnalysisBaseView.java │ │ │ │ ├── CardAnalysisBaseViewModel.java │ │ │ │ ├── CardCommonAnalysisView.java │ │ │ │ ├── CardCommonAnalysisViewModel.java │ │ │ │ ├── CardDetailAnalysisView.java │ │ │ │ └── CardDetailAnalysisViewModel.java │ │ │ ├── component │ │ │ │ ├── ImageManagerForGridView.java │ │ │ │ ├── OwnRoleDetailCell.java │ │ │ │ ├── PoolNameCell.java │ │ │ │ ├── SignUserCell.java │ │ │ │ └── StackPopup.java │ │ │ ├── game │ │ │ │ ├── GameRecordView.java │ │ │ │ ├── GameRecordViewModel.java │ │ │ │ ├── GameStatisticsView.java │ │ │ │ ├── GameStatisticsViewModel.java │ │ │ │ ├── GameTimeView.java │ │ │ │ ├── GameTimeViewModel.java │ │ │ │ └── manage │ │ │ │ │ ├── GameAdvanceSettingView.java │ │ │ │ │ ├── GameAdvanceSettingViewModel.java │ │ │ │ │ ├── GameBaseSettingView.java │ │ │ │ │ ├── GameBaseSettingViewModel.java │ │ │ │ │ ├── GameDirChooseView.java │ │ │ │ │ ├── GameDirChooseViewModel.java │ │ │ │ │ ├── GameManagerView.java │ │ │ │ │ └── GameManagerViewModel.java │ │ │ ├── item │ │ │ │ ├── HeaderImageSelectView.java │ │ │ │ └── PlayTimeAlertItemView.java │ │ │ ├── kujiequ │ │ │ │ ├── AccountView.java │ │ │ │ ├── AccountViewModel.java │ │ │ │ ├── OwnRoleDetailView.java │ │ │ │ ├── OwnRoleDetailViewModel.java │ │ │ │ ├── OwnRoleView.java │ │ │ │ ├── OwnRoleViewModel.java │ │ │ │ ├── SignView.java │ │ │ │ ├── SignViewModel.java │ │ │ │ ├── TowerView.java │ │ │ │ ├── TowerViewModel.java │ │ │ │ └── calculator │ │ │ │ │ ├── CalculatorRoleEditView.java │ │ │ │ │ ├── CalculatorRoleEditViewModel.java │ │ │ │ │ ├── CalculatorView.java │ │ │ │ │ ├── CalculatorViewModel.java │ │ │ │ │ ├── CalculatorWeaponEditView.java │ │ │ │ │ └── CalculatorWeaponEditViewModel.java │ │ │ └── tray │ │ │ │ └── NewFxTrayIcon.java │ │ │ └── util │ │ │ ├── AppLocked.java │ │ │ ├── ButtonBuilder.java │ │ │ ├── DialogBuilder.java │ │ │ ├── FileIO.java │ │ │ ├── GameResourcesManager.java │ │ │ ├── HttpRequestUtil.java │ │ │ ├── ImageTest.java │ │ │ ├── LanguageManager.java │ │ │ ├── LocalDataManager.java │ │ │ ├── LocalResourcesManager.java │ │ │ └── LogFileUtil.java │ ├── com │ │ └── kuro │ │ │ ├── game │ │ │ ├── ApiConfig.java │ │ │ ├── model │ │ │ │ ├── game │ │ │ │ │ ├── DownloadFile.java │ │ │ │ │ ├── DownloadResource.java │ │ │ │ │ └── SampleHashInfo.java │ │ │ │ └── launcher │ │ │ │ │ ├── CdnData.java │ │ │ │ │ ├── GameInfo.java │ │ │ │ │ ├── LauncherResource.java │ │ │ │ │ ├── ResourceChunk.java │ │ │ │ │ ├── ResourcesDiff.java │ │ │ │ │ └── UpdateData.java │ │ │ └── thread │ │ │ │ ├── BaseInfoTask.java │ │ │ │ └── LauncherResourceTask.java │ │ │ └── kujiequ │ │ │ ├── ApiConfig.java │ │ │ ├── ApiDecryptException.java │ │ │ ├── ApiUtil.java │ │ │ ├── model │ │ │ ├── calculator │ │ │ │ ├── exist │ │ │ │ │ ├── ExistedRoleDataForCalculator.java │ │ │ │ │ ├── RoleAim.java │ │ │ │ │ ├── SkillLevel.java │ │ │ │ │ └── WeaponAim.java │ │ │ │ ├── list │ │ │ │ │ ├── AdvanceSkillList.java │ │ │ │ │ ├── CommonSkill.java │ │ │ │ │ ├── RoleForCalculator.java │ │ │ │ │ └── WeaponForCalculator.java │ │ │ │ └── result │ │ │ │ │ ├── CalculatorResult.java │ │ │ │ │ ├── Cost.java │ │ │ │ │ ├── CostList.java │ │ │ │ │ ├── Strategy.java │ │ │ │ │ └── TotalCost.java │ │ │ ├── roleData │ │ │ │ ├── Chain.java │ │ │ │ ├── FetterDetail.java │ │ │ │ ├── Phantom.java │ │ │ │ ├── PhantomData.java │ │ │ │ ├── PhantomEx.java │ │ │ │ ├── PhantomProp.java │ │ │ │ ├── PhoantomMainProps.java │ │ │ │ ├── Role.java │ │ │ │ ├── RoleDetail.java │ │ │ │ ├── Skill.java │ │ │ │ ├── SkillData.java │ │ │ │ ├── Weapon.java │ │ │ │ ├── WeaponData.java │ │ │ │ ├── user │ │ │ │ │ ├── BoxInfo.java │ │ │ │ │ ├── RoleDailyData.java │ │ │ │ │ ├── RoleDailyDetail.java │ │ │ │ │ └── RoleInfo.java │ │ │ │ └── weight │ │ │ │ │ ├── PhantomWeight.java │ │ │ │ │ └── PropWeight.java │ │ │ ├── sign │ │ │ │ ├── SignGood.java │ │ │ │ ├── SignRecord.java │ │ │ │ ├── SignUserInfo.java │ │ │ │ └── UserInfo.java │ │ │ └── towerData │ │ │ │ ├── Difficulty.java │ │ │ │ ├── DifficultyTotal.java │ │ │ │ ├── Floor.java │ │ │ │ ├── SimpleRole.java │ │ │ │ └── TowerArea.java │ │ │ └── thread │ │ │ ├── SignGoodsTask.java │ │ │ ├── SignTask.java │ │ │ ├── TowerDataDetailTask.java │ │ │ ├── UserDailyDataTask.java │ │ │ ├── UserDataRefreshTask.java │ │ │ ├── UserInfoDataTask.java │ │ │ ├── calculator │ │ │ ├── BatchRoleCostTask.java │ │ │ ├── BatchWeaponCostTask.java │ │ │ ├── CalculatorDataRefreshTask.java │ │ │ ├── ListRoleTask.java │ │ │ ├── ListWeaponTask.java │ │ │ ├── QueryOwnedRoleTask.java │ │ │ └── RoleCultivateStatusTask.java │ │ │ └── role │ │ │ ├── GameRoleDataSaveTask.java │ │ │ ├── GameRoleDataTask.java │ │ │ └── GameRoleDetailTask.java │ └── module-info.java └── resources │ ├── cn │ └── tealc │ │ └── wutheringwavestool │ │ ├── css │ │ ├── Default.css │ │ ├── Home.css │ │ ├── Main.css │ │ ├── Plugin.css │ │ ├── Setting.css │ │ ├── TrayIcon.css │ │ ├── Update.css │ │ ├── cardpool │ │ │ └── CardPool.css │ │ ├── game │ │ │ ├── GameRecord.css │ │ │ ├── GameStatistics.css │ │ │ ├── GameTime.css │ │ │ └── manage │ │ │ │ ├── GameAdvanceSetting.css │ │ │ │ ├── GameBaseSetting.css │ │ │ │ ├── GameDirChoose.css │ │ │ │ └── GameManage.css │ │ ├── kujiequ │ │ │ ├── Account.css │ │ │ ├── OwnRole.css │ │ │ ├── OwnRoleDetail.css │ │ │ ├── Sign.css │ │ │ ├── Tower.css │ │ │ └── calculator │ │ │ │ ├── Calculator.css │ │ │ │ └── CalculatorRoleEdit.css │ │ └── light.css │ │ ├── font │ │ ├── HarmonyOS_Sans_SC_Bold.ttf │ │ └── HarmonyOS_Sans_SC_Regular.ttf │ │ ├── image │ │ ├── attr │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ ├── 5.png │ │ │ └── 6.png │ │ ├── battle-2.png │ │ ├── bg.png │ │ ├── icon.ico │ │ ├── icon.png │ │ ├── kujiequ │ │ │ ├── battle-pass.png │ │ │ ├── energy.png │ │ │ ├── liveness.png │ │ │ ├── signed.png │ │ │ ├── star01.png │ │ │ ├── storeEnergy.png │ │ │ └── weeklyInst.png │ │ ├── role-chain.png │ │ ├── role-skill.png │ │ ├── role-weapon.png │ │ ├── role.png │ │ └── support.png │ │ ├── language │ │ ├── backup │ │ │ ├── local_en.properties │ │ │ └── local_zh_TW.properties │ │ └── local.properties │ │ └── ui │ │ ├── HomeView.fxml │ │ ├── MainView.fxml │ │ ├── PluginView.fxml │ │ ├── SettingView.fxml │ │ ├── base │ │ └── UpdateView.fxml │ │ ├── cardpool │ │ ├── CardAnalysisBaseView.fxml │ │ ├── CardCommonAnalysisView.fxml │ │ └── CardDetailAnalysisView.fxml │ │ ├── game │ │ ├── GameRecordView.fxml │ │ ├── GameStatisticsView.fxml │ │ ├── GameTimeView.fxml │ │ └── manage │ │ │ ├── GameAdvanceSettingView.fxml │ │ │ ├── GameBaseSettingView.fxml │ │ │ ├── GameDirChooseView.fxml │ │ │ └── GameManagerView.fxml │ │ └── kujiequ │ │ ├── AccountView.fxml │ │ ├── OwnRoleDetailView.fxml │ │ ├── OwnRoleView.fxml │ │ ├── SignView.fxml │ │ ├── TowerView.fxml │ │ └── calculator │ │ ├── CalculatorRoleEditView.fxml │ │ ├── CalculatorView.fxml │ │ └── CalculatorWeaponEditView.fxml │ ├── logback.xml │ └── update.bat └── test └── java └── test └── plugin └── CreateJson.java /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | !**/src/main/**/target/ 4 | !**/src/test/**/target/ 5 | 6 | ### IntelliJ IDEA ### 7 | .idea/modules.xml 8 | .idea/jarRepositories.xml 9 | .idea/compiler.xml 10 | .idea/libraries/ 11 | .idea 12 | *.iws 13 | *.iml 14 | *.ipr 15 | 16 | ### Eclipse ### 17 | .apt_generated 18 | .classpath 19 | .factorypath 20 | .project 21 | .settings 22 | .springBeans 23 | .sts4-cache 24 | 25 | ### NetBeans ### 26 | /nbproject/private/ 27 | /nbbuild/ 28 | /dist/ 29 | /nbdist/ 30 | /.nb-gradle/ 31 | build/ 32 | !**/src/main/**/build/ 33 | !**/src/test/**/build/ 34 | 35 | ### VS Code ### 36 | .vscode/ 37 | 38 | ### Mac OS ### 39 | .DS_Store 40 | /.idea/ 41 | /.mvn/ 42 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | pages: 2 | stage: deploy 3 | script: 4 | - mkdir .public 5 | - cp -r docs/. public 6 | - mv .public public 7 | artifacts: 8 | paths: 9 | - public 10 | only: 11 | - master -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # 默认忽略的文件 2 | /shelf/ 3 | /workspace.xml 4 | # 基于编辑器的 HTTP 客户端请求 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip 2 | wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ## [中文](https://github.com/leck995/WutheringWavesTool/blob/new-ui/README.md) 3 | *** 4 | ## 简介 5 | 鸣潮助手是一款鸣潮的第三方工具,可替代原生的启动器,同时内置多个有用的小功能,致力于改善PC端鸣潮的游戏体验与游戏数据管理。支持国服,国际服使用。 6 | 7 | [点此下载程序](https://github.com/leck995/WutheringWavesTool/releases) 8 | 9 | [点此查看使用教程](https://wave.tealc.fun/) 10 | 11 | 12 | 主页 13 | 14 | ## 功能 15 | ___ 16 | > 助手支持国服,国际服,由于国际服不支持库街区,故国际服功能少一些; 17 | > 18 | > WEGAME版需要手动转换为官服才能使用全部功能,具体请加Q群(984939498)查看公告获取教程。 19 | 20 | 1. 替代原生的启动器,集成WIKI,浏览截图等小功能。 21 | 2. 高级启动,一键设置DX11和DX12,解锁120帧率(鸣潮2.2后已失效)。 22 | 3. 抽卡分析,提供多种抽卡数据视图。 23 | 4. 游戏时长统计,只要使用本助手启动鸣潮,即可统计每日游玩时长与总时长。*(推荐)* 24 | 5. 游戏数据统计,只要使用本助手启动鸣潮,即可统计每日战斗数据,包括不限于战斗次数,大世界获取的声骸数量,闪避成功次数。*(推荐)* 25 | 6. 显示基本游戏数据,包括不限于每日体力,任务电台,各种宝箱数量。*(仅支持国服)* 26 | 7. 库街区签到,最大支持9个账号同时签到;签到统计,可以查看签到一共获取了多少物品。*(仅支持国服)* 27 | 8. 查看角色,可以查看拥有的角色以及详情,包括共鸣连,等级,武器,声骸等等。*(仅支持国服)* 28 | 9. 养成计算器,统计培养每个角色与武器所需的材料*(仅支持国服)* 29 | 10. 查看深塔历史数据。*(仅支持国服)* 30 | 31 | ## 部分截图 32 | 33 | image02 34 | image07 35 | image08 36 | image04 37 | image05 38 | image06 39 | image03 40 | 41 | 42 | ## 感谢与支持 43 | *** 44 | ### 感谢以下开源项目 45 | * [OpenJFX](https://openjfx.io/) 46 | * [Controlsfx](https://github.com/controlsfx/controlsfx) 47 | * [MvvmFX](https://github.com/sialcasa/mvvmFX) 48 | * [Jnativehook](https://github.com/kwhat/jnativehook) 49 | * [Thumbnailator](https://github.com/coobird/thumbnailator) 50 | * [Jackson](https://github.com/FasterXML/jackson) 51 | * [JNA](https://github.com/java-native-access/jna) 52 | * [Atlantafx](https://github.com/mkpaz/atlantafx) 53 | * [Ikonli](https://github.com/kordamp/ikonli) 54 | * [Sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) 55 | * [Collapse](https://github.com/CollapseLauncher/Collapse) 56 | 57 | 项目背景作者为[Rafa](https://www.pixiv.net/artworks/120767239),感谢。 58 | 59 | ### 赞助 60 | 倘若喜欢本程序,欢迎支持一下开发者,您的支持会加快软件的开发进度。 61 | 62 | 您可以按以下格式留言:[名称]:[想说的话] 63 | 64 | support 65 | -------------------------------------------------------------------------------- /README_EN.md: -------------------------------------------------------------------------------- 1 | ## [中文](https://github.com/leck995/WutheringWavesTool/blob/new-ui/README.md) | [ENGLISH](https://github.com/leck995/WutheringWavesTool/blob/new-ui/README_EN.md) 2 | *** 3 | 4 | ## Introduction 5 | 6 | !> All documents are translated by AI. 7 | 8 | !> _**English is currently under testing, and some text translations may have errors or be incomplete**_ 9 | 10 | image-20241102134455129 11 | 12 | 13 | WutheringWavesTool is a user-friendly tool that can replace the native launcher for daily use, while providing useful features such as card draw analysis and playtime statistics.
14 | 15 | [Download Link](https://github.com/leck995/WutheringWavesTool/releases) 16 | 17 | [Document](https://leck995.github.io/WutheringWavesTool/#/en/README) 18 | 19 | ## Features 20 | ___ 21 | 1. Replaces the native launcher. 22 | 2. Card pull analysis, providing a simple card draw analysis feature with both detailed and thumbnail display modes. 23 | 3. Game playtime statistics; as long as you start "Wuthering Waves" using this tool, it will automatically track daily and total playtime like Steam (recommended, with plans to release an annual summary). 24 | 4. Advanced startup, unlocking FPS and setting startup parameters. 25 | 26 | ## Screenshots 27 | 28 | image-20241102134455129 29 | 30 | image-20241102134445723 31 | 32 | image-20241102134437388 33 | 34 | image-20241102134429124 35 | 36 | ## Acknowledgments and Support 37 | ### Thanks to the following open-source projects: 38 | * [OpenJFX](https://openjfx.io/) 39 | * [Nfx-lib](https://github.com/xdsswar/nfx-lib) 40 | * [Controlsfx](https://github.com/controlsfx/controlsfx) 41 | * [MvvmFX](https://github.com/sialcasa/mvvmFX) 42 | * [Jnativehook](https://github.com/kwhat/jnativehook) 43 | * [Thumbnailator](https://github.com/coobird/thumbnailator) 44 | * [Jackson](https://github.com/FasterXML/jackson) 45 | * [JNA](https://github.com/java-native-access/jna) 46 | * [Atlantafx](https://github.com/mkpaz/atlantafx) 47 | * [Ikonli](https://github.com/kordamp/ikonli) 48 | * [Sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) 49 | * [Collapse](https://github.com/CollapseLauncher/Collapse) 50 | 51 | The project background author is [Pixiv:Rafa](https://www.pixiv.net/artworks/120767239) 52 | -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | wave.tealc.fun -------------------------------------------------------------------------------- /docs/image/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/docs/image/icon.png -------------------------------------------------------------------------------- /docs/image/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/docs/image/image01.png -------------------------------------------------------------------------------- /docs/image/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/docs/image/image02.png -------------------------------------------------------------------------------- /docs/image/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/docs/image/image03.png -------------------------------------------------------------------------------- /docs/image/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/docs/image/image04.png -------------------------------------------------------------------------------- /docs/image/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/docs/image/image05.png -------------------------------------------------------------------------------- /docs/image/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/docs/image/image06.png -------------------------------------------------------------------------------- /docs/image/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/docs/image/image07.png -------------------------------------------------------------------------------- /docs/image/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/docs/image/image08.png -------------------------------------------------------------------------------- /docs/image/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/docs/image/image09.png -------------------------------------------------------------------------------- /docs/image/support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/docs/image/support.png -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/FXResourcesLoader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Parisi Alessandro 3 | * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX). 4 | * 5 | * MaterialFX is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU Lesser General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * MaterialFX is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU Lesser General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU Lesser General Public License 16 | * along with MaterialFX. If not, see . 17 | */ 18 | 19 | package cn.tealc.wutheringwavestool; 20 | 21 | import java.io.InputStream; 22 | import java.net.URL; 23 | 24 | 25 | public class FXResourcesLoader { 26 | 27 | private FXResourcesLoader() { 28 | } 29 | 30 | public static URL loadURL(String path) { 31 | return FXResourcesLoader.class.getResource(path); 32 | } 33 | 34 | public static String load(String path) { 35 | return loadURL(path).toExternalForm(); 36 | } 37 | 38 | public static InputStream loadStream(String name) { 39 | return FXResourcesLoader.class.getResourceAsStream(name); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/Main.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool; 2 | 3 | import cn.tealc.wutheringwavestool.base.Config; 4 | import javafx.application.Application; 5 | 6 | import java.io.File; 7 | 8 | /** 9 | * @program: WutheringWavesTool 10 | * @description: 11 | * @author: Leck 12 | * @create: 2024-07-04 00:32 13 | */ 14 | public class Main { 15 | public static void main(String[] args) { 16 | System.setProperty("prism.lcdtext", "false"); 17 | System.setProperty("LcdFontSmoothing", "true"); 18 | System.setProperty("prism.text", "t2k"); 19 | 20 | if (Config.setting.getUiScale() != 100){ 21 | System.setProperty("glass.win.uiScale", Config.setting.getUiScale() + "%"); 22 | } 23 | 24 | Application.launch(MainApplication.class,args); 25 | } 26 | 27 | private static void checkUpdate(){ 28 | File file = new File("."); 29 | assert file.exists(); 30 | if (file.getName().equals("update")){ 31 | File[] files = file.getParentFile().listFiles((dir, name) -> name.equals("WutheringWavesTool.exe")); 32 | if (files != null && files.length > 0){ 33 | 34 | } 35 | } 36 | 37 | } 38 | 39 | private static void move(){ 40 | 41 | } 42 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/base/Config.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.base; 2 | 3 | import cn.tealc.wutheringwavestool.model.Setting; 4 | import cn.tealc.wutheringwavestool.util.LanguageManager; 5 | import com.fasterxml.jackson.databind.ObjectMapper; 6 | 7 | import java.io.File; 8 | import java.io.IOException; 9 | import java.util.Locale; 10 | import java.util.ResourceBundle; 11 | 12 | /** 13 | * @program: WutheringWavesTool 14 | * @description: 15 | * @author: Leck 16 | * @create: 2024-07-03 00:37 17 | */ 18 | public class Config { 19 | public static final String version="1.2.6"; 20 | 21 | public static final String appAuthor="Leck"; 22 | public static final String apiDecryptKey = "XSNLFgNCth8j8oJI3cNIdw=="; 23 | public static final String URL_SUPPORT_LIST="https://www.yuque.com/chashuisuipian/sm05lg/ag7ct2or8ecz98cp"; 24 | 25 | 26 | public static Setting setting; 27 | public static String currentRoleId; 28 | public static ResourceBundle language; 29 | public static String appTitle; 30 | static { 31 | ObjectMapper mapper=new ObjectMapper(); 32 | File settingFile = new File("settings.json"); 33 | if (settingFile.exists()){ 34 | try { 35 | setting=mapper.readValue(settingFile, Setting.class); 36 | if (setting.getAppParams() != null){ //暂时解决启动参数变更,未来版本删除 37 | setting.getStartUpParams().addAll(setting.getAppParams().split(" ")); 38 | setting.setAppParams(null); 39 | } 40 | } catch (IOException e) { 41 | throw new RuntimeException(e); 42 | } 43 | } 44 | if (setting == null){ 45 | setting=new Setting(); 46 | } 47 | language = ResourceBundle.getBundle("cn/tealc/wutheringwavestool/language/local", Locale.SIMPLIFIED_CHINESE); 48 | appTitle = LanguageManager.getString("app.title"); 49 | } 50 | 51 | 52 | public static void save() { 53 | File file = new File("settings.json"); 54 | ObjectMapper mapper=new ObjectMapper(); 55 | try { 56 | mapper.writerWithDefaultPrettyPrinter().writeValue(file,setting); 57 | } catch (IOException e) { 58 | throw new RuntimeException(e); 59 | } 60 | } 61 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/base/NotificationKey.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.base; 2 | 3 | /** 4 | * @program: AsmrPlayer-web 5 | * @description: 6 | * @author: Leck 7 | * @create: 2024-01-18 16:34 8 | */ 9 | public class NotificationKey { 10 | public static final String MESSAGE="MESSAGE"; 11 | public static final String DIALOG="DIALOG"; 12 | public static final String CHANGE_BG="CHANGE_BG"; 13 | public static final String CHANGE_HEADER="CHANGE_HEADER"; 14 | public static final String SIGN_USER_DELETE="SIGN_USER_DELETE"; 15 | public static final String SIGN_USER_UPDATE="SIGN_USER_UPDATE"; 16 | 17 | public static final String HOME_GAME_TIME_UPDATE="HOME_GAME_TIME_UPDATE"; 18 | 19 | public static final String NOTIFICATION_SHOW_UPDATE= "SHOW_UPDATE"; //显示升级界面 20 | 21 | public static final String CARD_POOL_USER_UPDATE="CARD_POOL_USER_UPDATE"; //当抽卡页面选中用户切换时使用 22 | public static final String CARD_POOL_USER_EMPTY="CARD_POOL_USER_EMPTY"; //当抽卡页面选中无用户时使用 23 | 24 | public static final String GAME_MANAGER_TO_BASE="GAME_MANAGE_To_BASE"; // 通知GameManagerView显示GameBaseSettingView 25 | public static final String GAME_MANAGE_TO_CHOOSE="GAME_MANAGE_To_CHOOSE"; // 通知GameManagerView显示GameDirChooseView 26 | 27 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/base/NotificationManager.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.base; 2 | 3 | import cn.tealc.wutheringwavestool.model.message.MessageInfo; 4 | import com.jfoenixN.controls.JFXDialogLayout; 5 | import de.saxsys.mvvmfx.MvvmFX; 6 | import de.saxsys.mvvmfx.utils.notifications.NotificationObserver; 7 | 8 | /** 9 | * @program: WutheringWavesTool 10 | * @description: 11 | * @author: Leck 12 | * @create: 2024-12-17 17:10 13 | */ 14 | public class NotificationManager { 15 | public static void publish(String key, Object... objects) { 16 | MvvmFX.getNotificationCenter().publish(key, objects); 17 | } 18 | 19 | public static void subscribe(String key, NotificationObserver observer) { 20 | MvvmFX.getNotificationCenter().subscribe(key, observer); 21 | } 22 | 23 | public static void message(MessageInfo messageInfo) { 24 | MvvmFX.getNotificationCenter().publish(NotificationKey.MESSAGE, messageInfo); 25 | } 26 | 27 | public static void dialog(JFXDialogLayout layout) { 28 | MvvmFX.getNotificationCenter().publish(NotificationKey.DIALOG, layout); 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/dao/GameJdbcUtils.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.dao; 2 | 3 | import cn.tealc.wutheringwavestool.util.GameResourcesManager; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | 7 | import java.io.File; 8 | import java.sql.Connection; 9 | import java.sql.DriverManager; 10 | import java.sql.SQLException; 11 | import java.sql.Statement; 12 | 13 | 14 | public class GameJdbcUtils { 15 | private static final Logger LOG = LoggerFactory.getLogger(GameJdbcUtils.class); 16 | private static Connection connection; 17 | 18 | 19 | public static void close(){ 20 | try { 21 | if (connection != null) { 22 | connection.close(); 23 | connection = null; 24 | }; 25 | } catch (SQLException e) { 26 | LOG.error("读取游戏DB文件失败", e); 27 | } 28 | } 29 | 30 | public static Connection getConnection() { 31 | if(connection == null){ 32 | try { 33 | File gameDB = GameResourcesManager.getGameDB(); 34 | if (gameDB != null) { 35 | String url = String.format("jdbc:sqlite:%s",gameDB.getAbsolutePath()); 36 | connection = DriverManager.getConnection(url); 37 | } 38 | } catch (SQLException e) { 39 | LOG.error(e.getMessage(), e); 40 | } 41 | } 42 | 43 | return connection; 44 | } 45 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/dao/GameRoleDataDao.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.dao; 2 | 3 | 4 | import com.kuro.kujiequ.model.roleData.Role; 5 | import org.apache.commons.dbutils.*; 6 | import org.apache.commons.dbutils.handlers.BeanHandler; 7 | import org.apache.commons.dbutils.handlers.ScalarHandler; 8 | import org.slf4j.Logger; 9 | import org.slf4j.LoggerFactory; 10 | 11 | import java.sql.Connection; 12 | import java.sql.SQLException; 13 | import java.util.HashMap; 14 | import java.util.Map; 15 | 16 | 17 | public class GameRoleDataDao { 18 | private static final Logger LOG= LoggerFactory.getLogger(GameRoleDataDao.class); 19 | private static final Connection con= JdbcUtils.getConnection(); 20 | 21 | private RowProcessor getRowProcessor(){ 22 | Map map=new HashMap<>(); 23 | map.put("role_id","roleId"); 24 | map.put("role_name","roleName"); 25 | map.put("role_icon_url","roleIconUrl"); 26 | map.put("role_pic_url","rolePicUrl"); 27 | map.put("star_level","starLevel"); 28 | map.put("attribute_id","attributeId"); 29 | map.put("attribute_name","attributeName"); 30 | map.put("weapon_type_id","weaponTypeId"); 31 | map.put("weapon_type_name","weaponTypeName"); 32 | map.put("acronym","acronym"); 33 | map.put("breach","breach"); 34 | BeanProcessor beanProcessor=new BeanProcessor(map); 35 | return new BasicRowProcessor(beanProcessor); 36 | } 37 | 38 | 39 | 40 | 41 | public Role getRoleDataById(int id){ 42 | QueryRunner qr=new QueryRunner(); 43 | String sql="SELECT * FROM game_role WHERE role_id=?"; 44 | try { 45 | return qr.query(con,sql,new BeanHandler<>(Role.class,getRowProcessor()),id); 46 | } catch (SQLException e) { 47 | LOG.error(e.getMessage(),e); 48 | return null; 49 | } 50 | } 51 | 52 | 53 | public int add(Role role){ 54 | String sql="INSERT OR IGNORE INTO game_role (role_id,role_name,role_icon_url,role_pic_url,star_level,attribute_id,attribute_name,weapon_type_id,weapon_type_name,acronym,breach) VALUES (?,?,?,?,?,?,?,?,?,?,?)"; 55 | QueryRunner qr=new QueryRunner(); 56 | try { 57 | ResultSetHandler rsh = new ScalarHandler(); 58 | return qr.insert(con,sql,rsh, 59 | role.getRoleId(),role.getRoleName(),role.getRoleIconUrl(),role.getRolePicUrl(),role.getStarLevel(),role.getAttributeId(),role.getAttributeName(),role.getWeaponTypeId(),role.getWeaponTypeName(),role.getAcronym(),role.getBreach()); 60 | } catch (SQLException e) { 61 | throw new RuntimeException(e); 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/jna/GlobalKeyListener.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.jna; 2 | 3 | import com.github.kwhat.jnativehook.GlobalScreen; 4 | import com.github.kwhat.jnativehook.NativeHookException; 5 | import com.github.kwhat.jnativehook.keyboard.NativeKeyEvent; 6 | import com.github.kwhat.jnativehook.keyboard.NativeKeyListener; 7 | 8 | public class GlobalKeyListener implements NativeKeyListener { 9 | public void nativeKeyPressed(NativeKeyEvent e) { 10 | /* if (e.getKeyCode() == NativeKeyEvent.VC_1 && 11 | e.getModifiers() == NativeKeyEvent.VC_CONTROL && e.getModifiers() == NativeKeyEvent.VC_SHIFT) { 12 | System.out.println("Ctrl + Shift + L was pressed!"); 13 | // 在这里执行你想要的操作!!! 14 | }*/ 15 | System.out.println(e.getKeyCode()); 16 | System.out.println(e.getModifiers()); 17 | System.out.println("========"); 18 | } 19 | 20 | public void nativeKeyReleased(NativeKeyEvent e) { 21 | 22 | } 23 | 24 | public void nativeKeyTyped(NativeKeyEvent e) { 25 | 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/CardInfo.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model; 2 | 3 | import java.time.LocalDateTime; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-07-03 00:02 10 | */ 11 | public class CardInfo { 12 | private String cardPoolType; 13 | private int resourceId; 14 | private int qualityLevel; 15 | private String resourceType; 16 | private String name; 17 | private int count; 18 | private String time; 19 | 20 | public String getCardPoolType() { 21 | return cardPoolType; 22 | } 23 | 24 | public void setCardPoolType(String cardPoolType) { 25 | this.cardPoolType = cardPoolType; 26 | } 27 | 28 | public int getResourceId() { 29 | return resourceId; 30 | } 31 | 32 | public void setResourceId(int resourceId) { 33 | this.resourceId = resourceId; 34 | } 35 | 36 | public int getQualityLevel() { 37 | return qualityLevel; 38 | } 39 | 40 | public void setQualityLevel(int qualityLevel) { 41 | this.qualityLevel = qualityLevel; 42 | } 43 | 44 | public String getResourceType() { 45 | return resourceType; 46 | } 47 | 48 | public void setResourceType(String resourceType) { 49 | this.resourceType = resourceType; 50 | } 51 | 52 | public String getName() { 53 | return name; 54 | } 55 | 56 | public void setName(String name) { 57 | this.name = name; 58 | } 59 | 60 | public int getCount() { 61 | return count; 62 | } 63 | 64 | public void setCount(int count) { 65 | this.count = count; 66 | } 67 | 68 | public String getTime() { 69 | return time; 70 | } 71 | 72 | public void setTime(String time) { 73 | this.time = time; 74 | } 75 | 76 | 77 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/Message.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-07-03 00:05 10 | */ 11 | public class Message { 12 | private int code; 13 | private String message; 14 | private List data; 15 | 16 | public int getCode() { 17 | return code; 18 | } 19 | 20 | public void setCode(int code) { 21 | this.code = code; 22 | } 23 | 24 | public String getMessage() { 25 | return message; 26 | } 27 | 28 | public void setMessage(String message) { 29 | this.message = message; 30 | } 31 | 32 | public List getData() { 33 | return data; 34 | } 35 | 36 | public void setData(List data) { 37 | this.data = data; 38 | } 39 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/ResponseBody.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 5 | 6 | /** 7 | * @program: WutheringWavesTool 8 | * @description: 9 | * @author: Leck 10 | * @create: 2024-07-08 15:42 11 | */ 12 | @JsonIgnoreProperties(ignoreUnknown = true) 13 | public class ResponseBody { 14 | private Integer code; //code可以随意设置,但成功必须是200 15 | private String msg; 16 | private T data; 17 | private Boolean success; 18 | 19 | 20 | public ResponseBody() { 21 | } 22 | 23 | public ResponseBody(Integer code, String msg) { 24 | this.code = code; 25 | this.msg = msg; 26 | this.success = false; 27 | } 28 | 29 | public ResponseBody(Integer code, String msg, Boolean success) { 30 | this.code = code; 31 | this.msg = msg; 32 | this.success = success; 33 | } 34 | 35 | 36 | public static ResponseBody create(Integer code, String msg, T t) { 37 | ResponseBody responseBody = new ResponseBody<>(); 38 | responseBody.setCode(code); 39 | responseBody.setMsg(msg); 40 | responseBody.setData(t); 41 | return responseBody; 42 | } 43 | 44 | 45 | 46 | public Integer getCode() { 47 | return code; 48 | } 49 | 50 | public void setCode(Integer code) { 51 | this.code = code; 52 | } 53 | 54 | public String getMsg() { 55 | return msg; 56 | } 57 | 58 | public void setMsg(String msg) { 59 | this.msg = msg; 60 | } 61 | 62 | public T getData() { 63 | return data; 64 | } 65 | 66 | public void setData(T data) { 67 | this.data = data; 68 | } 69 | 70 | public Boolean getSuccess() { 71 | return success; 72 | } 73 | 74 | public void setSuccess(Boolean success) { 75 | this.success = success; 76 | } 77 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/ResponseBodyForApi.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-07-08 15:42 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class ResponseBodyForApi{ 13 | private Integer code; 14 | private String msg; 15 | private String data; 16 | private Boolean success; 17 | 18 | 19 | public ResponseBodyForApi() { 20 | } 21 | 22 | 23 | 24 | 25 | public Integer getCode() { 26 | return code; 27 | } 28 | 29 | public void setCode(Integer code) { 30 | this.code = code; 31 | } 32 | 33 | public String getMsg() { 34 | return msg; 35 | } 36 | 37 | public void setMsg(String msg) { 38 | this.msg = msg; 39 | } 40 | 41 | public String getData() { 42 | return data; 43 | } 44 | 45 | public void setData(String data) { 46 | this.data = data; 47 | } 48 | 49 | public Boolean getSuccess() { 50 | return success; 51 | } 52 | 53 | public void setSuccess(Boolean success) { 54 | this.success = success; 55 | } 56 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/SourceType.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model; 2 | 3 | public enum SourceType{ 4 | DEFAULT, 5 | WE_GAME, 6 | BILIBILI, 7 | GLOBAL 8 | 9 | 10 | 11 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/Version.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-07-11 20:45 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class Version { 13 | private String html_url; 14 | private String tag_name; 15 | private String name; 16 | private boolean prerelease; 17 | private String published_at; 18 | private String body; 19 | 20 | public String getHtml_url() { 21 | return html_url; 22 | } 23 | 24 | public void setHtml_url(String html_url) { 25 | this.html_url = html_url; 26 | } 27 | 28 | public String getTag_name() { 29 | return tag_name; 30 | } 31 | 32 | public void setTag_name(String tag_name) { 33 | this.tag_name = tag_name; 34 | } 35 | 36 | public String getName() { 37 | return name; 38 | } 39 | 40 | public void setName(String name) { 41 | this.name = name; 42 | } 43 | 44 | public boolean isPrerelease() { 45 | return prerelease; 46 | } 47 | 48 | public void setPrerelease(boolean prerelease) { 49 | this.prerelease = prerelease; 50 | } 51 | 52 | public String getPublished_at() { 53 | return published_at; 54 | } 55 | 56 | public void setPublished_at(String published_at) { 57 | this.published_at = published_at; 58 | } 59 | 60 | public String getBody() { 61 | return body; 62 | } 63 | 64 | public void setBody(String body) { 65 | this.body = body; 66 | } 67 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/analysis/SsrData.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model.analysis; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | 7 | /** 8 | * @program: WutheringWavesTool 9 | * @description: 10 | * @author: Leck 11 | * @create: 2024-07-03 11:39 12 | */ 13 | public class SsrData { 14 | private int id; 15 | private String name; 16 | private int count; 17 | private boolean event;//限定活动 18 | private String date; 19 | 20 | public int getId() { 21 | return id; 22 | } 23 | 24 | public void setId(int id) { 25 | this.id = id; 26 | } 27 | 28 | public String getName() { 29 | return name; 30 | } 31 | 32 | public void setName(String name) { 33 | this.name = name; 34 | } 35 | 36 | public int getCount() { 37 | return count; 38 | } 39 | 40 | public void setCount(int count) { 41 | this.count = count; 42 | } 43 | 44 | public boolean isEvent() { 45 | return event; 46 | } 47 | 48 | public void setEvent(boolean event) { 49 | this.event = event; 50 | } 51 | 52 | public String getDate() { 53 | return date; 54 | } 55 | 56 | public void setDate(String date) { 57 | this.date = date; 58 | } 59 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/game/GameRecordForLog.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model.game; 2 | 3 | 4 | public class GameRecordForLog extends GameRecord { 5 | private Long startTime; 6 | private Long closeTime; //下线时间 7 | 8 | 9 | public Long getCloseTime() { 10 | return closeTime; 11 | } 12 | 13 | public void setCloseTime(Long closeTime) { 14 | this.closeTime = closeTime; 15 | } 16 | 17 | public Long getStartTime() { 18 | return startTime; 19 | } 20 | 21 | public void setStartTime(Long startTime) { 22 | this.startTime = startTime; 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/game/GameTime.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model.game; 2 | 3 | /** 4 | * @program: WutheringWavesTool 5 | * @description: 6 | * @author: Leck 7 | * @create: 2024-07-11 00:01 8 | */ 9 | public class GameTime { 10 | private Integer id; 11 | private String roleId; //游戏账号id 12 | private String gameDate;//当天日期 13 | private Long startTime; //开始时间 14 | private Long endTime;//结束时间 15 | private Long duration;//持续时长 16 | 17 | 18 | public Integer getId() { 19 | return id; 20 | } 21 | 22 | public void setId(Integer id) { 23 | this.id = id; 24 | } 25 | 26 | public String getRoleId() { 27 | return roleId; 28 | } 29 | 30 | public void setRoleId(String roleId) { 31 | this.roleId = roleId; 32 | } 33 | 34 | public String getGameDate() { 35 | return gameDate; 36 | } 37 | 38 | public void setGameDate(String gameDate) { 39 | this.gameDate = gameDate; 40 | } 41 | 42 | public Long getStartTime() { 43 | return startTime; 44 | } 45 | 46 | public void setStartTime(Long startTime) { 47 | this.startTime = startTime; 48 | } 49 | 50 | public Long getEndTime() { 51 | return endTime; 52 | } 53 | 54 | public void setEndTime(Long endTime) { 55 | this.endTime = endTime; 56 | } 57 | 58 | public Long getDuration() { 59 | return duration; 60 | } 61 | 62 | public void setDuration(Long duration) { 63 | this.duration = duration; 64 | } 65 | 66 | @Override 67 | public String toString() { 68 | return "GameTime{" + 69 | "roleId='" + roleId + '\'' + 70 | ", gameData='" + gameDate + '\'' + 71 | ", startTime=" + startTime + 72 | ", endTime=" + endTime + 73 | ", duration=" + duration + 74 | '}'; 75 | } 76 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/message/MessageInfo.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model.message; 2 | 3 | import javafx.util.Duration; 4 | 5 | public class MessageInfo { 6 | private MessageType type; 7 | private String message; 8 | private Boolean autoClose; //自动关闭 9 | private Duration showTime;//显示时间 10 | public static final Duration DEFAULT=Duration.seconds(3.0); 11 | public static final Duration LONG=Duration.seconds(5.0); 12 | public static final Duration LONG_PLUS=Duration.seconds(7.0); 13 | 14 | 15 | public static MessageInfo warning(String message) { 16 | return new MessageInfo(MessageType.WARNING, message); 17 | } 18 | public static MessageInfo error(String message) { 19 | return new MessageInfo(MessageType.ERROR, message); 20 | } 21 | public static MessageInfo success(String message) { 22 | return new MessageInfo(MessageType.SUCCESS, message); 23 | } 24 | public static MessageInfo info(String message) { 25 | return new MessageInfo(MessageType.INFO, message); 26 | } 27 | 28 | 29 | public MessageInfo(MessageType type, String message) { 30 | this.type = type; 31 | this.message = message; 32 | this.autoClose = true; 33 | this.showTime=DEFAULT; 34 | } 35 | public MessageInfo(MessageType type, String message, Boolean autoClose) { 36 | this.type = type; 37 | this.message = message; 38 | this.autoClose = autoClose; 39 | this.showTime=DEFAULT; 40 | } 41 | 42 | public MessageInfo(MessageType type, String message, Duration showTime) { 43 | this.type = type; 44 | this.message = message; 45 | this.autoClose = true; 46 | this.showTime = showTime; 47 | } 48 | 49 | public MessageInfo(MessageType type, String message, Boolean autoClose, Duration showTime) { 50 | this.type = type; 51 | this.message = message; 52 | this.autoClose = autoClose; 53 | this.showTime = showTime; 54 | } 55 | 56 | public MessageType getType() { 57 | return type; 58 | } 59 | 60 | public void setType(MessageType type) { 61 | this.type = type; 62 | } 63 | 64 | public String getMessage() { 65 | return message; 66 | } 67 | 68 | public void setMessage(String message) { 69 | this.message = message; 70 | } 71 | 72 | 73 | public Boolean getAutoClose() { 74 | return autoClose; 75 | } 76 | 77 | public void setAutoClose(Boolean autoClose) { 78 | this.autoClose = autoClose; 79 | } 80 | 81 | public Duration getShowTime() { 82 | return showTime; 83 | } 84 | 85 | public void setShowTime(Duration showTime) { 86 | this.showTime = showTime; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/message/MessageType.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model.message; 2 | 3 | public enum MessageType { 4 | SUCCESS, 5 | WARNING, 6 | ERROR, 7 | INFO; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/netResource/Resource.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model.netResource; 2 | 3 | /** 4 | * @program: WutheringWavesToolResources 5 | * @description: 6 | * @author: Leck 7 | * @create: 2024-10-06 16:28 8 | */ 9 | public class Resource { 10 | private String name; 11 | private String filePath; 12 | private String aimPath; 13 | private String md5; 14 | 15 | 16 | public Resource(String name, String filePath, String aimPath, String md5) { 17 | this.name = name; 18 | this.filePath = filePath; 19 | this.aimPath = aimPath; 20 | this.md5 = md5; 21 | } 22 | 23 | public Resource() { 24 | } 25 | 26 | public String getName() { 27 | return name; 28 | } 29 | 30 | public void setName(String name) { 31 | this.name = name; 32 | } 33 | 34 | public String getFilePath() { 35 | return filePath; 36 | } 37 | 38 | public void setFilePath(String filePath) { 39 | this.filePath = filePath; 40 | } 41 | 42 | public String getAimPath() { 43 | return aimPath; 44 | } 45 | 46 | public void setAimPath(String aimPath) { 47 | this.aimPath = aimPath; 48 | } 49 | 50 | public String getMd5() { 51 | return md5; 52 | } 53 | 54 | public void setMd5(String md5) { 55 | this.md5 = md5; 56 | } 57 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/netResource/RootResource.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model.netResource; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * @program: WutheringWavesToolResources 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-10-06 16:46 10 | */ 11 | public class RootResource { 12 | private String version; 13 | private Map resources; 14 | 15 | 16 | public String getVersion() { 17 | return version; 18 | } 19 | 20 | public void setVersion(String version) { 21 | this.version = version; 22 | } 23 | 24 | public Map getResources() { 25 | return resources; 26 | } 27 | 28 | public void setResources(Map resources) { 29 | this.resources = resources; 30 | } 31 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/release/ReleaseList.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model.release; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesToolResources 7 | * @description: 版本更新汇总 8 | * @author: Leck 9 | * @create: 2024-12-22 15:21 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class ReleaseList { 13 | private Release preRelease; //预览版 14 | private Release latestRelease; //正式版 15 | 16 | public ReleaseList() { 17 | } 18 | 19 | public ReleaseList(Release preRelease, Release latestRelease) { 20 | this.preRelease = preRelease; 21 | this.latestRelease = latestRelease; 22 | } 23 | 24 | public Release getPreRelease() { 25 | return preRelease; 26 | } 27 | 28 | public void setPreRelease(Release preRelease) { 29 | this.preRelease = preRelease; 30 | } 31 | 32 | public Release getLatestRelease() { 33 | return latestRelease; 34 | } 35 | 36 | public void setLatestRelease(Release latestRelease) { 37 | this.latestRelease = latestRelease; 38 | } 39 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/role/RoleData.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model.role; 2 | 3 | /** 4 | * @program: WutheringWavesTool 5 | * @description: 6 | * @author: Leck 7 | * @create: 2024-10-16 20:00 8 | */ 9 | public class RoleData { 10 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/tower/TowerData.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model.tower; 2 | 3 | /** 4 | * @program: WutheringWavesTool 5 | * @description: 6 | * @author: Leck 7 | * @create: 2024-10-16 18:58 8 | */ 9 | public class TowerData { 10 | private int id; 11 | private int floor; 12 | private String picUrl; 13 | private String roleList; 14 | private int star; 15 | 16 | 17 | private int areaId; 18 | private String areaName; 19 | 20 | private int difficulty; 21 | private String difficultyName; 22 | private long endTime; 23 | 24 | public int getId() { 25 | return id; 26 | } 27 | 28 | public void setId(int id) { 29 | this.id = id; 30 | } 31 | 32 | public int getFloor() { 33 | return floor; 34 | } 35 | 36 | public void setFloor(int floor) { 37 | this.floor = floor; 38 | } 39 | 40 | public String getPicUrl() { 41 | return picUrl; 42 | } 43 | 44 | public void setPicUrl(String picUrl) { 45 | this.picUrl = picUrl; 46 | } 47 | 48 | public String getRoleList() { 49 | return roleList; 50 | } 51 | 52 | public void setRoleList(String roleList) { 53 | this.roleList = roleList; 54 | } 55 | 56 | public int getStar() { 57 | return star; 58 | } 59 | 60 | public void setStar(int star) { 61 | this.star = star; 62 | } 63 | 64 | public int getAreaId() { 65 | return areaId; 66 | } 67 | 68 | public void setAreaId(int areaId) { 69 | this.areaId = areaId; 70 | } 71 | 72 | public String getAreaName() { 73 | return areaName; 74 | } 75 | 76 | public void setAreaName(String areaName) { 77 | this.areaName = areaName; 78 | } 79 | 80 | public int getDifficulty() { 81 | return difficulty; 82 | } 83 | 84 | public void setDifficulty(int difficulty) { 85 | this.difficulty = difficulty; 86 | } 87 | 88 | public String getDifficultyName() { 89 | return difficultyName; 90 | } 91 | 92 | public void setDifficultyName(String difficultyName) { 93 | this.difficultyName = difficultyName; 94 | } 95 | 96 | public long getEndTime() { 97 | return endTime; 98 | } 99 | 100 | public void setEndTime(long endTime) { 101 | this.endTime = endTime; 102 | } 103 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/model/ui/ServerData.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.model.ui; 2 | 3 | import cn.tealc.wutheringwavestool.model.SourceType; 4 | 5 | /** 6 | * @description: 7 | * @author: Leck 8 | * @create: 2025-03-08 23:55 9 | */ 10 | public class ServerData { 11 | private SourceType type; 12 | private boolean exit; 13 | 14 | public ServerData(SourceType type, boolean exit) { 15 | this.type = type; 16 | this.exit = exit; 17 | } 18 | 19 | @Override 20 | public String toString() { 21 | return String.format("%s [%s]", type.name(), exit ? "存在":"不存在"); 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/plugin/FxPluginLanguage.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.plugin; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.Locale; 6 | 7 | /** 8 | * @program: WutheringWavesTool 9 | * @description: 国际化支持,推荐添加中文与英文支持 10 | * @author: Leck 11 | * @create: 2024-12-21 01:06 12 | */ 13 | @JsonIgnoreProperties(ignoreUnknown = true) 14 | public class FxPluginLanguage { 15 | private Locale locale; 16 | private String title; 17 | private String description; 18 | 19 | public FxPluginLanguage() { 20 | } 21 | 22 | public FxPluginLanguage(Locale locale, String title, String description) { 23 | this.locale = locale; 24 | this.title = title; 25 | this.description = description; 26 | } 27 | 28 | public Locale getLocale() { 29 | return locale; 30 | } 31 | 32 | public void setLocale(Locale locale) { 33 | this.locale = locale; 34 | } 35 | 36 | public String getTitle() { 37 | return title; 38 | } 39 | 40 | public void setTitle(String title) { 41 | this.title = title; 42 | } 43 | 44 | public String getDescription() { 45 | return description; 46 | } 47 | 48 | public void setDescription(String description) { 49 | this.description = description; 50 | } 51 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/theme/AccentColor.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.theme; 2 | 3 | import javafx.css.PseudoClass; 4 | import javafx.scene.paint.Color; 5 | 6 | public record AccentColor(Color primaryColor, PseudoClass pseudoClass) { 7 | 8 | public static AccentColor primerPurple() { 9 | return new AccentColor(Color.web("#8250df"), PseudoClass.getPseudoClass("accent-primer-purple")); 10 | } 11 | 12 | public static AccentColor primerPink() { 13 | return new AccentColor(Color.web("#bf3989"), PseudoClass.getPseudoClass("accent-primer-pink")); 14 | } 15 | 16 | public static AccentColor primerCoral() { 17 | return new AccentColor(Color.web("#c4432b"), PseudoClass.getPseudoClass("accent-primer-coral")); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/theme/Dark.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.theme; 2 | 3 | import atlantafx.base.theme.Theme; 4 | import cn.tealc.wutheringwavestool.FXResourcesLoader; 5 | 6 | public final class Dark implements Theme { 7 | 8 | public Dark() { 9 | // Default constructor 10 | } 11 | 12 | /** 13 | * {@inheritDoc} 14 | */ 15 | @Override 16 | public String getName() { 17 | return "Dark"; 18 | } 19 | 20 | /** 21 | * {@inheritDoc} 22 | */ 23 | @Override 24 | public String getUserAgentStylesheet() { 25 | return FXResourcesLoader.load("css/dark.css"); 26 | } 27 | 28 | /** 29 | * {@inheritDoc} 30 | */ 31 | @Override 32 | public String getUserAgentStylesheetBSS() { 33 | return null; 34 | } 35 | 36 | /** 37 | * {@inheritDoc} 38 | */ 39 | @Override 40 | public boolean isDarkMode() { 41 | return true; 42 | } 43 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/theme/Light.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.theme; 2 | 3 | import atlantafx.base.theme.Theme; 4 | import cn.tealc.wutheringwavestool.FXResourcesLoader; 5 | 6 | public final class Light implements Theme { 7 | 8 | public Light() { 9 | // Default constructor 10 | } 11 | 12 | /** 13 | * {@inheritDoc} 14 | */ 15 | @Override 16 | public String getName() { 17 | return "Light"; 18 | } 19 | 20 | /** 21 | * {@inheritDoc} 22 | */ 23 | @Override 24 | public String getUserAgentStylesheet() { 25 | return FXResourcesLoader.load("css/light.css"); 26 | } 27 | 28 | /** 29 | * {@inheritDoc} 30 | */ 31 | @Override 32 | public String getUserAgentStylesheetBSS() { 33 | return null; 34 | } 35 | 36 | /** 37 | * {@inheritDoc} 38 | */ 39 | @Override 40 | public boolean isDarkMode() { 41 | return true; 42 | } 43 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/thread/DownloadHeadImgTask.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.thread; 2 | 3 | import com.fasterxml.jackson.core.type.TypeReference; 4 | import com.fasterxml.jackson.databind.ObjectMapper; 5 | import javafx.concurrent.Task; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | 9 | import javax.imageio.ImageIO; 10 | import java.awt.image.BufferedImage; 11 | import java.io.File; 12 | import java.net.URI; 13 | import java.net.URL; 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | 17 | @Deprecated 18 | public class DownloadHeadImgTask extends Task { 19 | private static final Logger LOG= LoggerFactory.getLogger(DownloadHeadImgTask.class); 20 | private static final String HEAD_JSON_URL="https://raw.githubusercontent.com/leck995/WutheringWavesTool/new-ui/assets/data/header.json"; 21 | public static boolean hasUpdate=false; //标记程序生命周期内是否已经更新过,更新过不再更新 22 | 23 | @Override 24 | protected Boolean call() throws Exception { 25 | if (!hasUpdate){ 26 | hasUpdate=true; 27 | URI uri = URI.create(HEAD_JSON_URL); 28 | ObjectMapper mapper = new ObjectMapper(); 29 | HashMap map = mapper.readValue(uri.toURL(), new TypeReference>() { 30 | }); 31 | File dir=new File("assets/header/"); 32 | if (!dir.exists()){ 33 | dir.mkdirs(); 34 | } 35 | for (Map.Entry entry : map.entrySet()) { 36 | File file = new File("assets/header/"+entry.getKey()+".png"); 37 | 38 | if(!file.exists()){ 39 | LOG.info("开始下载头像:{}",file.getName()); 40 | URL url = URI.create(entry.getValue()).toURL(); 41 | BufferedImage read = ImageIO.read(url); 42 | ImageIO.write(read, "png", file); 43 | LOG.info("头像:{} 保存完毕",file.getName()); 44 | } 45 | } 46 | LOG.info("头像全部保存完毕"); 47 | return true; 48 | }else { 49 | return false; 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/thread/system/CheckGameConfigTask.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.thread.system; 2 | 3 | import cn.tealc.wutheringwavestool.util.GameResourcesManager; 4 | import javafx.concurrent.Task; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | 8 | import java.io.BufferedReader; 9 | import java.io.File; 10 | import java.io.FileReader; 11 | import java.io.IOException; 12 | import java.nio.file.Files; 13 | import java.nio.file.StandardOpenOption; 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | 17 | /** 18 | * @program: WutheringWavesTool 19 | * @description: 检测鸣潮日志功能是否被关闭 20 | * @author: Leck 21 | * @create: 2025-01-04 15:01 22 | */ 23 | public class CheckGameConfigTask extends Task { 24 | private static final Logger LOG = LoggerFactory.getLogger(CheckGameConfigTask.class); 25 | @Override 26 | protected Boolean call() throws Exception { 27 | File engineIni = GameResourcesManager.getGameEngineIni(); 28 | if (engineIni == null) { 29 | return true; // 如果 engineIni 为 null,返回 true 30 | } 31 | 32 | List updatedLines = new ArrayList<>(); 33 | boolean isOpenLog = true; 34 | 35 | // 读取配置文件 36 | try (BufferedReader br = new BufferedReader(new FileReader(engineIni))) { 37 | String line; 38 | while ((line = br.readLine()) != null) { 39 | String normalizedLine = line.toLowerCase().replaceAll("\\s+", ""); 40 | if (normalizedLine.contains("global=")) { 41 | // 如果找到 global=,则不添加到更新后的内容中 42 | isOpenLog = false; 43 | } else { 44 | // 添加不包含 global= 的行 45 | updatedLines.add(line); 46 | } 47 | } 48 | } catch (IOException e) { 49 | LOG.error("读取配置文件失败", e); 50 | } 51 | 52 | // 将更新后的内容写回文件 53 | try { 54 | Files.write(engineIni.toPath(), updatedLines, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING); 55 | } catch (IOException e) { 56 | LOG.error("更新配置文件失败", e); 57 | } 58 | 59 | return isOpenLog; 60 | } 61 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/thread/system/ui/BackgroundTask.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.thread.system.ui; 2 | 3 | import com.jhlabs.image.ContrastFilter; 4 | import com.jhlabs.image.GaussianFilter; 5 | import javafx.concurrent.Task; 6 | import javafx.embed.swing.SwingFXUtils; 7 | import javafx.scene.image.Image; 8 | import javafx.scene.layout.Background; 9 | import javafx.scene.layout.BackgroundPosition; 10 | import javafx.scene.layout.BackgroundRepeat; 11 | import javafx.scene.layout.BackgroundSize; 12 | import net.coobird.thumbnailator.Thumbnails; 13 | 14 | import java.awt.image.BufferedImage; 15 | import java.io.File; 16 | 17 | /** 18 | * @program: AsmrPlayer-web 19 | * @description: 处理传递过来的Image,进行高斯模糊和对比度调整 20 | * @author: Leck 21 | * @create: 2024-01-29 16:16 22 | */ 23 | public class BackgroundTask extends Task { 24 | private final GaussianFilter gaussianFilter; 25 | private final ContrastFilter contrastFilter; 26 | 27 | 28 | 29 | public BackgroundTask() { 30 | gaussianFilter = new GaussianFilter(15); 31 | contrastFilter = new ContrastFilter(); 32 | contrastFilter.setBrightness(0.45f); 33 | } 34 | 35 | @Override 36 | protected Background call() throws Exception { 37 | 38 | File roleIVFile=new File("assets/image/icon.png"); 39 | Image image=new Image(roleIVFile.toURI().toString(),100,100,false,false); 40 | 41 | BufferedImage bufferedImage = Thumbnails 42 | .of(SwingFXUtils.fromFXImage(image,null)) 43 | .sourceRegion(40,40,80,80) 44 | .width(100) 45 | .asBufferedImage(); 46 | 47 | 48 | BufferedImage filter = gaussianFilter.filter(bufferedImage, null); 49 | filter=contrastFilter.filter(filter,null); 50 | javafx.scene.layout.BackgroundImage backgroundImage=new javafx.scene.layout.BackgroundImage( 51 | SwingFXUtils.toFXImage(filter,null), 52 | BackgroundRepeat.NO_REPEAT, 53 | BackgroundRepeat.NO_REPEAT, 54 | BackgroundPosition.CENTER, 55 | new BackgroundSize(BackgroundSize.AUTO, BackgroundSize.AUTO,true,true,true,true)); 56 | return new Background(backgroundImage); 57 | } 58 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/thread/system/ui/ImgColorBgTask.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.thread.system.ui; 2 | 3 | import cn.tealc.teafx.utils.colorThief.ColorMap; 4 | import cn.tealc.teafx.utils.colorThief.ColorThief; 5 | import javafx.concurrent.Task; 6 | import javafx.scene.layout.Background; 7 | import javafx.scene.layout.BackgroundFill; 8 | import javafx.scene.layout.CornerRadii; 9 | import javafx.scene.paint.Color; 10 | import javafx.scene.paint.CycleMethod; 11 | import javafx.scene.paint.LinearGradient; 12 | import javafx.scene.paint.Stop; 13 | 14 | import javax.imageio.ImageIO; 15 | import java.awt.image.BufferedImage; 16 | import java.net.URI; 17 | import java.util.List; 18 | 19 | /** 20 | * @program: WutheringWavesTool 21 | * @description: 22 | * @author: Leck 23 | * @create: 2024-08-01 19:17 24 | */ 25 | public class ImgColorBgTask extends Task { 26 | 27 | private String url; 28 | 29 | public ImgColorBgTask(String url) { 30 | this.url = url; 31 | } 32 | 33 | @Override 34 | protected Background call() throws Exception { 35 | BufferedImage image = ImageIO.read(URI.create(url).toURL()); 36 | ColorMap colorMap = ColorThief.getColorMap(image, 3,10,true); 37 | List colors = colorMap.getColors(); 38 | LinearGradient linearGradient = new LinearGradient( 39 | 0.0, 0.0, 1.0, 0.0, true, CycleMethod.NO_CYCLE, 40 | new Stop(0.0, colors.get(0)), 41 | new Stop(1.0, colors.get(1))); 42 | return new Background(new BackgroundFill(linearGradient, new CornerRadii(5.0), null)); 43 | } 44 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/thread/system/ui/MainBackgroundTask.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.thread.system.ui; 2 | 3 | import com.jhlabs.image.ContrastFilter; 4 | import com.jhlabs.image.GaussianFilter; 5 | import javafx.concurrent.Task; 6 | import javafx.embed.swing.SwingFXUtils; 7 | import javafx.scene.image.Image; 8 | import javafx.scene.layout.Background; 9 | import javafx.scene.layout.BackgroundPosition; 10 | import javafx.scene.layout.BackgroundRepeat; 11 | import javafx.scene.layout.BackgroundSize; 12 | import net.coobird.thumbnailator.Thumbnails; 13 | import org.slf4j.Logger; 14 | import org.slf4j.LoggerFactory; 15 | 16 | import java.awt.image.BufferedImage; 17 | import java.io.IOException; 18 | 19 | /** 20 | * @description: 处理传递过来的Image,进行高斯模糊和对比度调整 21 | * @author: Leck 22 | * @create: 2024-01-29 16:16 23 | */ 24 | public class MainBackgroundTask extends Task { 25 | private static final Logger LOG= LoggerFactory.getLogger(MainBackgroundTask.class); 26 | private GaussianFilter gaussianFilter; 27 | private ContrastFilter contrastFilter; 28 | 29 | private Image image; 30 | 31 | public MainBackgroundTask(Image image) { 32 | this.image = image; 33 | gaussianFilter = new GaussianFilter(16); 34 | contrastFilter = new ContrastFilter(); 35 | contrastFilter.setBrightness(1.0f); 36 | contrastFilter.setContrast(1.3f); 37 | } 38 | 39 | @Override 40 | protected Background call(){ 41 | BufferedImage bufferedImage = null; 42 | try { 43 | bufferedImage = Thumbnails 44 | .of(SwingFXUtils.fromFXImage(image,null)) 45 | .size(128,72) 46 | .asBufferedImage(); 47 | // ImageIO.write(bufferedImage,"png",new File("bg/"+System.currentTimeMillis()+".png")); 48 | } catch (IOException e) { 49 | LOG.error("Error", e); 50 | } 51 | 52 | BufferedImage filter = gaussianFilter.filter(bufferedImage, null); 53 | filter=contrastFilter.filter(filter,null); 54 | javafx.scene.layout.BackgroundImage backgroundImage=new javafx.scene.layout.BackgroundImage( 55 | SwingFXUtils.toFXImage(filter,null), 56 | BackgroundRepeat.NO_REPEAT, 57 | BackgroundRepeat.NO_REPEAT, 58 | BackgroundPosition.CENTER, 59 | new BackgroundSize(BackgroundSize.AUTO, BackgroundSize.AUTO,true,true,true,true)); 60 | return new Background(backgroundImage); 61 | } 62 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/ui/PluginViewModel.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.ui; 2 | 3 | import cn.tealc.wutheringwavestool.plugin.FxPluginConfig; 4 | import cn.tealc.wutheringwavestool.plugin.FxPluginManager; 5 | import de.saxsys.mvvmfx.ViewModel; 6 | import javafx.collections.FXCollections; 7 | import javafx.collections.ObservableList; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * @program: WutheringWavesTool 13 | * @description: 14 | * @author: Leck 15 | * @create: 2025-01-01 01:31 16 | */ 17 | public class PluginViewModel implements ViewModel { 18 | private ObservableList plugins = FXCollections.observableArrayList(); 19 | public PluginViewModel() { 20 | FxPluginManager pluginManager = FxPluginManager.getInstance(); 21 | Map pluginMap = pluginManager.getPlugins(); 22 | plugins.addAll(pluginMap.values()); 23 | } 24 | 25 | public ObservableList getPlugins() { 26 | return plugins; 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/ui/component/ImageManagerForGridView.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.ui.component; 2 | 3 | import javafx.scene.image.Image; 4 | import javafx.scene.image.ImageView; 5 | 6 | import java.util.LinkedHashMap; 7 | import java.util.Map; 8 | 9 | /** 10 | * @program: WutheringWavesTool 11 | * @description: 12 | * @author: Leck 13 | * @create: 2024-07-29 22:52 14 | */ 15 | public class ImageManagerForGridView { 16 | private final double width; 17 | private final double height; 18 | public ImageManagerForGridView(double width, double height) { 19 | this.width = width; 20 | this.height = height; 21 | } 22 | 23 | private final Map imageMap=new LinkedHashMap<>(); 24 | public void setImage(String url, ImageView imageView){ 25 | Image pair = imageMap.get(url); 26 | 27 | if (pair == null){//不存在缓存,虚拟线程加载图片 28 | System.out.println(url); 29 | Image image1 = new Image(url,width,height,true,true,true); 30 | imageMap.put(url,image1); 31 | imageView.setImage(image1); 32 | }else { //存在缓存 33 | imageView.setImage(pair); 34 | } 35 | //限制最大容量为200 36 | if (imageMap.size() > 200){ 37 | imageMap.remove(imageMap.keySet().iterator().next()); 38 | } 39 | } 40 | 41 | 42 | public void clear(){ 43 | imageMap.clear(); 44 | } 45 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/ui/component/OwnRoleDetailCell.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.ui.component; 2 | 3 | import com.kuro.kujiequ.model.roleData.Role; 4 | import javafx.scene.control.Label; 5 | import javafx.scene.control.ListCell; 6 | import javafx.scene.image.Image; 7 | import javafx.scene.image.ImageView; 8 | import javafx.scene.layout.HBox; 9 | import javafx.scene.layout.VBox; 10 | import javafx.util.Pair; 11 | 12 | /** 13 | * @program: WutheringWavesTool 14 | * @description: 15 | * @author: Leck 16 | * @create: 2024-07-31 22:43 17 | */ 18 | public class OwnRoleDetailCell extends ListCell> { 19 | private final ImageView roleIV=new ImageView(); 20 | private final Label name=new Label(); 21 | private final Label level=new Label(); 22 | private final HBox root=new HBox(); 23 | public OwnRoleDetailCell() { 24 | roleIV.setFitHeight(45); 25 | roleIV.setFitWidth(45); 26 | roleIV.setPreserveRatio(true); 27 | root.setVisible(false); 28 | name.getStyleClass().add("role-name"); 29 | level.getStyleClass().add("role-level"); 30 | 31 | 32 | VBox vbox=new VBox(4.0,name,level); 33 | root.getStyleClass().add("role-detail-cell"); 34 | 35 | root.getChildren().addAll(roleIV,vbox); 36 | setGraphic(root); 37 | 38 | } 39 | 40 | @Override 41 | protected void updateItem(Pair roleImagePair, boolean b) { 42 | super.updateItem(roleImagePair, b); 43 | if (!b){ 44 | root.setVisible(true); 45 | roleIV.setImage(roleImagePair.getValue()); 46 | name.setText(roleImagePair.getKey().getRoleName()); 47 | level.setText(String.format("LV.%d", roleImagePair.getKey().getLevel())); 48 | }else { 49 | root.setVisible(false); 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/ui/component/PoolNameCell.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.ui.component; 2 | 3 | import cn.tealc.wutheringwavestool.base.Config; 4 | import javafx.geometry.Pos; 5 | import javafx.scene.control.Label; 6 | import javafx.scene.control.ListCell; 7 | import javafx.scene.layout.StackPane; 8 | import javafx.scene.text.TextAlignment; 9 | 10 | import java.util.Locale; 11 | 12 | /** 13 | * @program: WutheringWavesTool 14 | * @description: 15 | * @author: Leck 16 | * @create: 2024-07-11 20:16 17 | */ 18 | public class PoolNameCell extends ListCell { 19 | private Label label; 20 | private StackPane stackPane; 21 | public PoolNameCell() { 22 | label=new Label(); 23 | label.setWrapText(true); 24 | label.setAlignment(Pos.CENTER); 25 | label.setTextAlignment(TextAlignment.CENTER); 26 | label.setPrefWidth(Label.USE_COMPUTED_SIZE); 27 | 28 | 29 | } 30 | 31 | @Override 32 | protected void updateItem(String s, boolean b) { 33 | super.updateItem(s, b); 34 | if (!b){ 35 | if (Config.setting.getLanguage() == Locale.ENGLISH){ 36 | label.setPrefHeight(90); 37 | }else { 38 | label.setPrefHeight(50); 39 | } 40 | 41 | String replace = s.replace("唤取", "").replace(" Pull",""); 42 | 43 | if (replace.contains("感恩定向")){ 44 | label.setText("感恩定向"); 45 | }else if (replace.contains("Gratitude Directional Pull")){ 46 | label.setText("Gratitude Directional Pull"); 47 | }else { 48 | label.setText(replace); 49 | } 50 | setGraphic(label); 51 | }else { 52 | setGraphic(null); 53 | } 54 | } 55 | 56 | 57 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/ui/component/StackPopup.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.ui.component; 2 | 3 | import javafx.geometry.*; 4 | import javafx.scene.Node; 5 | import javafx.scene.Scene; 6 | import javafx.scene.control.ContextMenu; 7 | import javafx.scene.control.PopupControl; 8 | import javafx.scene.layout.Pane; 9 | import javafx.scene.layout.StackPane; 10 | import javafx.stage.Stage; 11 | import javafx.stage.Window; 12 | 13 | /** 14 | * @description: 15 | * @author: Leck 16 | * @create: 2025-02-17 19:33 17 | */ 18 | public class StackPopup extends PopupControl { 19 | private StackPane root; 20 | public StackPopup() { 21 | root = new StackPane(); 22 | getScene().setRoot(root); 23 | root.getStyleClass().add("stack-popup"); 24 | } 25 | 26 | 27 | public void addChild(Node content) { 28 | root.getChildren().add(content); 29 | } 30 | 31 | public void show(Node source){ 32 | Point2D local = source.localToScreen(0, 0); 33 | show(source.getScene().getWindow(), local.getX(), local.getY()); 34 | } 35 | public void show(Node source,Side side){ 36 | Point2D local = source.localToScreen(0, 0); 37 | 38 | show(source.getScene().getWindow(), local.getX(), local.getY()); 39 | } 40 | 41 | 42 | 43 | 44 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/ui/game/GameStatisticsView.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.ui.game; 2 | 3 | import atlantafx.base.util.Animations; 4 | import cn.tealc.wutheringwavestool.ui.HomeView; 5 | import cn.tealc.wutheringwavestool.ui.HomeViewModel; 6 | import de.saxsys.mvvmfx.FluentViewLoader; 7 | import de.saxsys.mvvmfx.FxmlView; 8 | import de.saxsys.mvvmfx.ViewTuple; 9 | import javafx.fxml.Initializable; 10 | 11 | import java.net.URL; 12 | import java.util.ResourceBundle; 13 | import javafx.event.ActionEvent; 14 | import javafx.fxml.FXML; 15 | import javafx.scene.Parent; 16 | import javafx.scene.control.ToggleButton; 17 | import javafx.scene.layout.AnchorPane; 18 | import javafx.scene.layout.StackPane; 19 | import javafx.util.Duration; 20 | 21 | /** 22 | * @program: WutheringWavesTool 23 | * @description: 24 | * @author: Leck 25 | * @create: 2024-11-16 20:47 26 | */ 27 | public class GameStatisticsView implements FxmlView, Initializable { 28 | @FXML 29 | private StackPane content; 30 | 31 | @FXML 32 | private AnchorPane root; 33 | 34 | 35 | private Parent recordView; 36 | private Parent timeView; 37 | 38 | @Override 39 | public void initialize(URL url, ResourceBundle resourceBundle) { 40 | createTime(); 41 | } 42 | 43 | @FXML 44 | void toMain(ActionEvent event) { 45 | content.getChildren().clear(); 46 | } 47 | 48 | @FXML 49 | void toRecord(ActionEvent event) { 50 | ToggleButton toggleButton= (ToggleButton) event.getSource(); 51 | if (toggleButton.isSelected()){ 52 | if (recordView == null) { 53 | ViewTuple viewTuple = FluentViewLoader.fxmlView(GameRecordView.class).load(); 54 | recordView = viewTuple.getView(); 55 | } 56 | content.getChildren().setAll(recordView); 57 | Animations.slideInUp(recordView, Duration.millis(300)).play(); 58 | }else { 59 | toggleButton.setSelected(true); 60 | } 61 | 62 | 63 | } 64 | 65 | @FXML 66 | void toTime(ActionEvent event) { 67 | ToggleButton toggleButton= (ToggleButton) event.getSource(); 68 | if (toggleButton.isSelected()){ 69 | createTime(); 70 | Animations.slideInUp(timeView, Duration.millis(300)).play(); 71 | }else { 72 | toggleButton.setSelected(true); 73 | } 74 | } 75 | 76 | private void createTime(){ 77 | if (timeView == null) { 78 | ViewTuple viewTuple = FluentViewLoader.fxmlView(GameTimeView.class).load(); 79 | timeView = viewTuple.getView(); 80 | } 81 | content.getChildren().setAll(timeView); 82 | } 83 | 84 | 85 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/ui/game/GameStatisticsViewModel.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.ui.game; 2 | 3 | import de.saxsys.mvvmfx.FxmlView; 4 | import de.saxsys.mvvmfx.ViewModel; 5 | import javafx.fxml.Initializable; 6 | 7 | import java.net.URL; 8 | import java.util.ResourceBundle; 9 | 10 | /** 11 | * @program: WutheringWavesTool 12 | * @description: 13 | * @author: Leck 14 | * @create: 2024-11-16 20:47 15 | */ 16 | public class GameStatisticsViewModel implements ViewModel{ 17 | 18 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/ui/item/HeaderImageSelectView.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.ui.item; 2 | 3 | import atlantafx.base.theme.Styles; 4 | import cn.tealc.wutheringwavestool.base.Config; 5 | import cn.tealc.wutheringwavestool.base.NotificationKey; 6 | import cn.tealc.wutheringwavestool.base.NotificationManager; 7 | import com.jfoenixN.controls.JFXDialogLayout; 8 | import javafx.event.ActionEvent; 9 | import javafx.scene.control.Button; 10 | import javafx.scene.control.Label; 11 | import javafx.scene.control.ScrollPane; 12 | import javafx.scene.image.Image; 13 | import javafx.scene.image.ImageView; 14 | import javafx.scene.layout.FlowPane; 15 | 16 | import java.io.File; 17 | 18 | /** 19 | * @description: 20 | * @author: Leck 21 | * @create: 2025-02-18 00:26 22 | */ 23 | public class HeaderImageSelectView extends JFXDialogLayout { 24 | private final Button cancelBtn; 25 | 26 | public HeaderImageSelectView() { 27 | Label title = new Label("设置头像"); 28 | title.getStyleClass().add(Styles.TITLE_2); 29 | 30 | cancelBtn = new Button("取消"); 31 | cancelBtn.setCancelButton(true); 32 | 33 | 34 | FlowPane flowPane = new FlowPane(); 35 | flowPane.setVgap(5); 36 | flowPane.setHgap(5); 37 | ScrollPane scrollPane = new ScrollPane(flowPane); 38 | scrollPane.setFitToHeight(true); 39 | scrollPane.setFitToWidth(true); 40 | File dir = new File("assets/header"); 41 | File[] headers = dir.listFiles(header -> { 42 | if (header.getName().endsWith(".jpg") || header.getName().endsWith(".png")) { 43 | return header.getName().length() < 10; 44 | } 45 | return false; 46 | }); 47 | 48 | if (headers != null) { 49 | for (File header : headers) { 50 | ImageView imageView = new ImageView(new Image(header.toURI().toString(), 60, 60, true, true, true)); 51 | imageView.setOnMouseClicked(event -> setImage(header)); 52 | flowPane.getChildren().add(imageView); 53 | } 54 | } else { 55 | Label label = new Label("未找到其他头像,请更新助手"); 56 | flowPane.getChildren().add(label); 57 | } 58 | setHeading(title); 59 | setBody(scrollPane); 60 | setActions(cancelBtn); 61 | setPrefSize(600, 420); 62 | } 63 | 64 | private void setImage(File file) { 65 | Config.setting.setHomeViewIcon(file.getName()); 66 | NotificationManager.publish(NotificationKey.CHANGE_HEADER); 67 | cancelBtn.fireEvent(new ActionEvent()); 68 | } 69 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/util/AppLocked.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.util; 2 | 3 | import cn.tealc.wutheringwavestool.MainApplication; 4 | import javafx.scene.control.Alert; 5 | import javafx.scene.control.ButtonType; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | 9 | import java.io.File; 10 | import java.io.FileInputStream; 11 | import java.io.IOException; 12 | import java.util.Optional; 13 | 14 | /** 15 | * @program: WutheringWavesTool 16 | * @description: 用于判断多开,避免多开 17 | * @author: Leck 18 | * @create: 2024-11-24 20:00 19 | */ 20 | public class AppLocked{ 21 | private static final Logger LOG = LoggerFactory.getLogger(AppLocked.class); 22 | private File file = new File("lock"); 23 | private FileInputStream fis; 24 | public AppLocked() { 25 | try { 26 | if(file.exists()){ 27 | boolean delete = file.delete(); 28 | if(!delete){ //说明被占用了,助手存在,弹窗提示 29 | LOG.info("检测到多开,即将关闭助手"); 30 | Alert alert = new Alert(Alert.AlertType.ERROR); 31 | alert.initOwner(MainApplication.window); 32 | alert.setTitle(LanguageManager.getString("ui.app_locked.title")); 33 | alert.setHeaderText(LanguageManager.getString("ui.app_locked.header")); 34 | alert.setContentText(LanguageManager.getString("ui.app_locked.content")); 35 | Optional buttonType = alert.showAndWait(); 36 | System.exit(0); 37 | }else { 38 | boolean newFile = file.createNewFile(); 39 | if(!newFile){ 40 | LOG.info("无法创建lock文件"); 41 | } 42 | fis = new FileInputStream(file); 43 | } 44 | }else { 45 | boolean newFile = file.createNewFile(); 46 | if(!newFile){ 47 | LOG.info("无法创建lock文件"); 48 | } 49 | fis = new FileInputStream(file); 50 | } 51 | 52 | LOG.info("多开检测通过"); 53 | } catch (IOException e) { 54 | LOG.error(e.getMessage()); 55 | } 56 | } 57 | 58 | 59 | 60 | /** 61 | * @description: 释放文件 62 | * @param: 63 | * @return void 64 | * @date: 2024/11/24 65 | */ 66 | public void release(){ 67 | try { 68 | fis.close(); 69 | file.delete(); 70 | } catch (IOException e) { 71 | LOG.error(e.getMessage()); 72 | } 73 | } 74 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/util/ButtonBuilder.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.util; 2 | 3 | import javafx.event.ActionEvent; 4 | import javafx.event.EventHandler; 5 | import javafx.scene.control.Button; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | public class ButtonBuilder { 11 | private Boolean cancel; 12 | private Boolean ok; 13 | private String title; 14 | private final List styleClassList = new ArrayList<>(); 15 | private EventHandler action; 16 | 17 | // 私有构造函数 18 | private ButtonBuilder() {} 19 | 20 | // 静态方法返回一个新的 ButtonBuilder 实例 21 | public static ButtonBuilder create() { 22 | return new ButtonBuilder(); 23 | } 24 | 25 | 26 | public ButtonBuilder cancel() { 27 | this.cancel = true; 28 | return this; 29 | } 30 | 31 | public ButtonBuilder ok() { 32 | this.ok = true; 33 | return this; 34 | } 35 | 36 | // 设置标题 37 | public ButtonBuilder title(String title) { 38 | this.title = title; 39 | return this; 40 | } 41 | 42 | // 设置样式类 43 | public ButtonBuilder styleClass(String styleClass) { 44 | styleClassList.add(styleClass); 45 | return this; 46 | } 47 | 48 | // 设置动作 49 | public ButtonBuilder action(EventHandler action) { 50 | this.action = action; 51 | return this; 52 | } 53 | 54 | // 构建 Button 对象 55 | public Button build() { 56 | Button button = new Button(title); 57 | if (ok != null){ 58 | button.setDefaultButton(true); 59 | } 60 | if (cancel != null){ 61 | button.setCancelButton(true); 62 | } 63 | 64 | if (!styleClassList.isEmpty()) { 65 | button.getStyleClass().addAll(styleClassList); 66 | } 67 | 68 | if (action != null) { 69 | button.setOnAction(action); 70 | } 71 | return button; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/util/FileIO.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.util; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-10-23 23:02 10 | */ 11 | public class FileIO { 12 | public static boolean rename(File file, String newName, boolean overwrite) { 13 | if (!file.exists()) return false; 14 | File newFile = new File(file.getParent(), newName); 15 | if (overwrite && newFile.exists()) { 16 | newFile.delete(); 17 | } 18 | return file.renameTo(newFile); 19 | } 20 | 21 | public static boolean deleteDirectory(File directory) { 22 | if (!directory.exists()) { 23 | return false; 24 | } 25 | if (directory.isDirectory()) { 26 | File[] files = directory.listFiles(); 27 | if (files != null) { 28 | for (File file : files) { 29 | deleteDirectory(file); // 递归删除 30 | } 31 | } 32 | } 33 | return directory.delete(); 34 | } 35 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/util/LanguageManager.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.util; 2 | 3 | import cn.tealc.wutheringwavestool.base.Config; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-10-20 22:19 10 | */ 11 | public class LanguageManager { 12 | 13 | private static final String separate = "#"; 14 | public static String getString(String key){ 15 | return Config.language.getString(key); 16 | } 17 | 18 | public static String[] getStringArray(String key){ 19 | String string = getString(key); 20 | return string.split(separate); 21 | } 22 | 23 | 24 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/util/LocalDataManager.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.util; 2 | 3 | import cn.tealc.wutheringwavestool.base.Config; 4 | import com.kuro.kujiequ.model.roleData.weight.PhantomWeight; 5 | import com.fasterxml.jackson.databind.ObjectMapper; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | 9 | import java.io.File; 10 | import java.io.IOException; 11 | 12 | /** 13 | * @program: WutheringWavesTool 14 | * @description: 15 | * @author: Leck 16 | * @create: 2024-10-03 00:01 17 | */ 18 | public class LocalDataManager { 19 | private static final Logger LOG= LoggerFactory.getLogger(LocalDataManager.class); 20 | private static final String WEIGHT_DEFAULT_DIR_TEMPLATE="assets/data/%s/weight/default/%s.json"; 21 | private static final String WEIGHT_CUSTOM_DIR_TEMPLATE="assets/data/%s/weight/custom/%s.json"; 22 | 23 | static { 24 | File dir=new File(String.format(WEIGHT_DEFAULT_DIR_TEMPLATE, Config.setting.getLanguage(),"A")).getParentFile(); 25 | if (!dir.exists()) { 26 | boolean result = dir.mkdirs(); 27 | if (!result){ 28 | LOG.error("无法创建默认声骸权重目录"); 29 | } 30 | } 31 | File dir2=new File(String.format(WEIGHT_CUSTOM_DIR_TEMPLATE, Config.setting.getLanguage(),"A")).getParentFile(); 32 | if (!dir2.exists()) { 33 | boolean result = dir2.mkdirs(); 34 | if (!result){ 35 | LOG.error("无法创建自定义声骸权重目录"); 36 | } 37 | } 38 | } 39 | 40 | public static PhantomWeight getWeight(String roleName){ 41 | ObjectMapper mapper = new ObjectMapper(); 42 | File file=new File(String.format(WEIGHT_CUSTOM_DIR_TEMPLATE, Config.setting.getLanguage(),roleName)); 43 | try { 44 | if (file.exists()){ 45 | return mapper.readValue(file, PhantomWeight.class); 46 | }else { 47 | file=new File(String.format(WEIGHT_DEFAULT_DIR_TEMPLATE, Config.setting.getLanguage(),roleName)); 48 | if (file.exists()){ 49 | return mapper.readValue(file, PhantomWeight.class); 50 | } 51 | } 52 | } catch (IOException e) { 53 | LOG.error(e.getMessage()); 54 | return null; 55 | } 56 | return null; 57 | } 58 | 59 | } -------------------------------------------------------------------------------- /src/main/java/cn/tealc/wutheringwavestool/util/LogFileUtil.java: -------------------------------------------------------------------------------- 1 | package cn.tealc.wutheringwavestool.util; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | import java.io.BufferedReader; 7 | import java.io.File; 8 | import java.io.FileReader; 9 | import java.io.IOException; 10 | import java.util.ArrayList; 11 | import java.util.HashMap; 12 | import java.util.List; 13 | import java.util.Map; 14 | import java.util.regex.Matcher; 15 | import java.util.regex.Pattern; 16 | 17 | /** 18 | * @program: WutheringWavesTool 19 | * @description: 20 | * @author: Leck 21 | * @create: 2024-07-04 16:38 22 | */ 23 | public class LogFileUtil { 24 | private static final Logger LOG = LoggerFactory.getLogger(LogFileUtil.class); 25 | /** 26 | * @description: 从日志文件读取卡池链接 27 | * @param: file 日志文件 28 | * @return java.lang.String 29 | * @date: 2024/7/4 30 | */ 31 | public static String getLogFileUrl(File file){ 32 | Pattern pattern = Pattern.compile("https.*/aki/gacha/index.html#/record[?=&\\w\\-]+"); 33 | List list = new ArrayList(); 34 | 35 | try (BufferedReader reader = new BufferedReader(new FileReader(file))) { 36 | String line; 37 | while ((line = reader.readLine()) != null) { 38 | Matcher matcher = pattern.matcher(line); 39 | if (matcher.find()) { 40 | list.add(matcher.group(0)); 41 | } 42 | } 43 | } catch (IOException e) { 44 | LOG.error(e.getMessage(),e); 45 | } 46 | 47 | if (!list.isEmpty()) { 48 | return list.getLast(); 49 | } 50 | return null; 51 | } 52 | 53 | /** 54 | * @description: 获取卡池链接的参数 55 | * @param: row 卡池链接 56 | * @return java.util.Map 57 | * @date: 2024/7/4 58 | */ 59 | public static Map getParamFromUrl(String row){ 60 | Map parameters = new HashMap<>(); 61 | String paramRow = row.substring(row.indexOf("?") + 1); 62 | String[] strings = paramRow.split("&"); 63 | 64 | for (String string : strings) { 65 | String[] split = string.split("="); 66 | switch (split[0]) { 67 | case "player_id" -> parameters.put("playerId", split[1]); 68 | case "record_id" -> parameters.put("recordId", split[1]); 69 | case "resources_id" -> parameters.put("cardPoolId", split[1]); 70 | case "gacha_type" -> parameters.put("cardPoolType", split[1]); 71 | case "svr_id" -> parameters.put("serverId", split[1]); 72 | case "lang" -> parameters.put("languageCode", split[1]); 73 | } 74 | } 75 | return parameters; 76 | } 77 | 78 | 79 | 80 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/game/ApiConfig.java: -------------------------------------------------------------------------------- 1 | package com.kuro.game; 2 | 3 | /** 4 | * @program: WutheringWavesTool 5 | * @description: 资源请求网址 6 | * @author: Leck 7 | * @create: 2024-09-28 07:22 8 | */ 9 | public class ApiConfig { 10 | public static final String INDEX_CN = "https://prod-cn-alicdn-gamestarter.kurogame.com/pcstarter/prod/game/G152/10003_Y8xXrXk65DqFHEDgApn3cpK5lfczpFx5/index.json"; 11 | public static final String INDEX_GLOBAL = "https://prod-alicdn-gamestarter.kurogame.com/pcstarter/prod/game/G153/50004_obOHXFrFanqsaIEOmuKroCcbZkQRBC7c/index.json"; 12 | public static final String INDEX_BILIBILI = "https://prod-cn-alicdn-gamestarter.kurogame.com/pcstarter/prod/game/G152/10004_j5GWFuUFlb8N31Wi2uS3ZAVHcb7ZGN7y/index.json"; 13 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/game/model/game/DownloadFile.java: -------------------------------------------------------------------------------- 1 | package com.kuro.game.model.game; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @description: 游戏资源文件信息 7 | * @author: Leck 8 | * @create: 2025-02-10 16:12 9 | */ 10 | @JsonIgnoreProperties(ignoreUnknown = true) 11 | public class DownloadFile { 12 | private String dest; 13 | private String md5; 14 | private String sampleHash; 15 | private Long size; 16 | 17 | public String getDest() { 18 | return dest; 19 | } 20 | 21 | public void setDest(String dest) { 22 | this.dest = dest; 23 | } 24 | 25 | public String getMd5() { 26 | return md5; 27 | } 28 | 29 | public void setMd5(String md5) { 30 | this.md5 = md5; 31 | } 32 | 33 | public String getSampleHash() { 34 | return sampleHash; 35 | } 36 | 37 | public void setSampleHash(String sampleHash) { 38 | this.sampleHash = sampleHash; 39 | } 40 | 41 | public Long getSize() { 42 | return size; 43 | } 44 | 45 | public void setSize(Long size) { 46 | this.size = size; 47 | } 48 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/game/model/game/DownloadResource.java: -------------------------------------------------------------------------------- 1 | package com.kuro.game.model.game; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @description: 9 | * @author: Leck 10 | * @create: 2025-02-10 16:16 11 | */ 12 | @JsonIgnoreProperties(ignoreUnknown = true) 13 | public class DownloadResource { 14 | private List resource; 15 | private SampleHashInfo sampleHashInfo; 16 | 17 | public List getResource() { 18 | return resource; 19 | } 20 | 21 | public void setResource(List resource) { 22 | this.resource = resource; 23 | } 24 | 25 | public SampleHashInfo getSampleHashInfo() { 26 | return sampleHashInfo; 27 | } 28 | 29 | public void setSampleHashInfo(SampleHashInfo sampleHashInfo) { 30 | this.sampleHashInfo = sampleHashInfo; 31 | } 32 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/game/model/game/SampleHashInfo.java: -------------------------------------------------------------------------------- 1 | package com.kuro.game.model.game; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @description: 简单记录下载资源的数量与大小 7 | * @author: Leck 8 | * @create: 2025-02-10 16:14 9 | */ 10 | @JsonIgnoreProperties(ignoreUnknown = true) 11 | public class SampleHashInfo { 12 | private Integer sampleNum; 13 | private Integer sampleBlockMaxSize; 14 | 15 | public Integer getSampleNum() { 16 | return sampleNum; 17 | } 18 | 19 | public void setSampleNum(Integer sampleNum) { 20 | this.sampleNum = sampleNum; 21 | } 22 | 23 | public Integer getSampleBlockMaxSize() { 24 | return sampleBlockMaxSize; 25 | } 26 | 27 | public void setSampleBlockMaxSize(Integer sampleBlockMaxSize) { 28 | this.sampleBlockMaxSize = sampleBlockMaxSize; 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/game/model/launcher/CdnData.java: -------------------------------------------------------------------------------- 1 | package com.kuro.game.model.launcher; 2 | 3 | import com.fasterxml.jackson.annotation.JsonAlias; 4 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 5 | 6 | /** 7 | * @program: WutheringWavesTool 8 | * @description: 9 | * @author: Leck 10 | * @create: 2024-10-27 22:54 11 | */ 12 | @JsonIgnoreProperties(ignoreUnknown = true) 13 | public class CdnData { 14 | @JsonAlias("K1") 15 | private int K1; 16 | @JsonAlias("K2") 17 | private int K2; 18 | @JsonAlias("p") 19 | private int ping; 20 | private String url; 21 | 22 | public int getK1() { 23 | return K1; 24 | } 25 | 26 | public void setK1(int k1) { 27 | K1 = k1; 28 | } 29 | 30 | public int getK2() { 31 | return K2; 32 | } 33 | 34 | public void setK2(int k2) { 35 | K2 = k2; 36 | } 37 | 38 | public int getPing() { 39 | return ping; 40 | } 41 | 42 | public void setPing(int ping) { 43 | this.ping = ping; 44 | } 45 | 46 | public String getUrl() { 47 | return url; 48 | } 49 | 50 | public void setUrl(String url) { 51 | this.url = url; 52 | } 53 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/game/model/launcher/GameInfo.java: -------------------------------------------------------------------------------- 1 | package com.kuro.game.model.launcher; 2 | 3 | /** 4 | * @description: 5 | * @author: Leck 6 | * @create: 2025-02-10 16:43 7 | */ 8 | public class GameInfo { 9 | private String fileName; 10 | private String md5; 11 | private String version; 12 | 13 | public String getFileName() { 14 | return fileName; 15 | } 16 | 17 | public void setFileName(String fileName) { 18 | this.fileName = fileName; 19 | } 20 | 21 | public String getMd5() { 22 | return md5; 23 | } 24 | 25 | public void setMd5(String md5) { 26 | this.md5 = md5; 27 | } 28 | 29 | public String getVersion() { 30 | return version; 31 | } 32 | 33 | public void setVersion(String version) { 34 | this.version = version; 35 | } 36 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/game/model/launcher/LauncherResource.java: -------------------------------------------------------------------------------- 1 | package com.kuro.game.model.launcher; 2 | 3 | import com.fasterxml.jackson.annotation.JsonAlias; 4 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 5 | import com.kuro.game.model.game.DownloadResource; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @description: 11 | * @author: Leck 12 | * @create: 2025-02-10 16:39 13 | */ 14 | @JsonIgnoreProperties(ignoreUnknown = true) 15 | public class LauncherResource { 16 | @JsonAlias("default") 17 | public UpdateData updateData; 18 | private List keyFileCheckList; 19 | private DownloadResource downloadResource; 20 | private UpdateData predownload; 21 | 22 | public UpdateData getUpdateData() { 23 | return updateData; 24 | } 25 | 26 | public void setUpdateData(UpdateData updateData) { 27 | this.updateData = updateData; 28 | } 29 | 30 | public List getKeyFileCheckList() { 31 | return keyFileCheckList; 32 | } 33 | 34 | public void setKeyFileCheckList(List keyFileCheckList) { 35 | this.keyFileCheckList = keyFileCheckList; 36 | } 37 | 38 | public DownloadResource getDownloadResource() { 39 | return downloadResource; 40 | } 41 | 42 | public void setDownloadResource(DownloadResource downloadResource) { 43 | this.downloadResource = downloadResource; 44 | } 45 | 46 | public UpdateData getPredownload() { 47 | return predownload; 48 | } 49 | 50 | public void setPredownload(UpdateData predownload) { 51 | this.predownload = predownload; 52 | } 53 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/game/model/launcher/ResourceChunk.java: -------------------------------------------------------------------------------- 1 | package com.kuro.game.model.launcher; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | @JsonIgnoreProperties(ignoreUnknown = true) 6 | public class ResourceChunk { 7 | private String lastMd5; 8 | private String lastResourceChunkPath; 9 | private String lastResources; 10 | private String lastVersion; 11 | private String md5; 12 | private String resourceChunkPath; 13 | 14 | public String getLastMd5() { 15 | return lastMd5; 16 | } 17 | 18 | public void setLastMd5(String lastMd5) { 19 | this.lastMd5 = lastMd5; 20 | } 21 | 22 | public String getLastResourceChunkPath() { 23 | return lastResourceChunkPath; 24 | } 25 | 26 | public void setLastResourceChunkPath(String lastResourceChunkPath) { 27 | this.lastResourceChunkPath = lastResourceChunkPath; 28 | } 29 | 30 | public String getLastResources() { 31 | return lastResources; 32 | } 33 | 34 | public void setLastResources(String lastResources) { 35 | this.lastResources = lastResources; 36 | } 37 | 38 | public String getLastVersion() { 39 | return lastVersion; 40 | } 41 | 42 | public void setLastVersion(String lastVersion) { 43 | this.lastVersion = lastVersion; 44 | } 45 | 46 | public String getMd5() { 47 | return md5; 48 | } 49 | 50 | public void setMd5(String md5) { 51 | this.md5 = md5; 52 | } 53 | 54 | public String getResourceChunkPath() { 55 | return resourceChunkPath; 56 | } 57 | 58 | public void setResourceChunkPath(String resourceChunkPath) { 59 | this.resourceChunkPath = resourceChunkPath; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/kuro/game/model/launcher/ResourcesDiff.java: -------------------------------------------------------------------------------- 1 | package com.kuro.game.model.launcher; 2 | 3 | /** 4 | * @description: 5 | * @author: Leck 6 | * @create: 2025-02-10 16:44 7 | */ 8 | public class ResourcesDiff { 9 | public GameInfo currentGameInfo; 10 | public GameInfo previousGameInfo; 11 | 12 | public GameInfo getCurrentGameInfo() { 13 | return currentGameInfo; 14 | } 15 | 16 | public void setCurrentGameInfo(GameInfo currentGameInfo) { 17 | this.currentGameInfo = currentGameInfo; 18 | } 19 | 20 | public GameInfo getPreviousGameInfo() { 21 | return previousGameInfo; 22 | } 23 | 24 | public void setPreviousGameInfo(GameInfo previousGameInfo) { 25 | this.previousGameInfo = previousGameInfo; 26 | } 27 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/game/model/launcher/UpdateData.java: -------------------------------------------------------------------------------- 1 | package com.kuro.game.model.launcher; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.Comparator; 6 | import java.util.List; 7 | 8 | /** 9 | * @program: WutheringWavesTool 10 | * @description: 11 | * @author: Leck 12 | * @create: 2024-10-27 22:53 13 | */ 14 | @JsonIgnoreProperties(ignoreUnknown = true) 15 | public class UpdateData { 16 | private List cdnList; //cdn 17 | private String resources; //resource.json地址 18 | private String resourcesBasePath; //下载地址前缀 19 | public ResourceChunk resourceChunk; 20 | public ResourcesDiff resourcesDiff; 21 | private String version; //资源版本 22 | 23 | /** 24 | * @description: 25 | * @param: 获取resource.json的下载地址 26 | * @return java.lang.String 27 | * @date: 2024/10/27 28 | */ 29 | public String getResourceJsonUrl(){ 30 | CdnData cdnData = cdnList.getFirst(); 31 | return cdnData.getUrl() + resources; 32 | } 33 | 34 | 35 | public List getCdnList() { 36 | return cdnList; 37 | } 38 | 39 | public void setCdnList(List cdnList) { 40 | this.cdnList = cdnList; 41 | //依据ping进行排序 42 | cdnList.sort(Comparator.comparingInt(CdnData::getPing)); 43 | } 44 | 45 | public String getResources() { 46 | return resources; 47 | } 48 | 49 | public void setResources(String resources) { 50 | this.resources = resources; 51 | } 52 | 53 | public String getResourcesBasePath() { 54 | return resourcesBasePath; 55 | } 56 | 57 | public void setResourcesBasePath(String resourcesBasePath) { 58 | this.resourcesBasePath = resourcesBasePath; 59 | } 60 | 61 | public String getVersion() { 62 | return version; 63 | } 64 | 65 | public void setVersion(String version) { 66 | this.version = version; 67 | } 68 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/ApiDecryptException.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ; 2 | 3 | import java.security.GeneralSecurityException; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 解密异常 8 | * @author: Leck 9 | * @create: 2024-09-28 08:39 10 | */ 11 | public class ApiDecryptException extends GeneralSecurityException { 12 | public ApiDecryptException() { 13 | super(); 14 | } 15 | 16 | public ApiDecryptException(String message) { 17 | super(message); 18 | } 19 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/ApiUtil.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ; 2 | 3 | import cn.tealc.wutheringwavestool.base.Config; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | 7 | import javax.crypto.BadPaddingException; 8 | import javax.crypto.Cipher; 9 | import javax.crypto.IllegalBlockSizeException; 10 | import javax.crypto.NoSuchPaddingException; 11 | import javax.crypto.spec.SecretKeySpec; 12 | import java.nio.charset.StandardCharsets; 13 | import java.security.InvalidKeyException; 14 | import java.security.NoSuchAlgorithmException; 15 | import java.util.Base64; 16 | 17 | /** 18 | * @program: WutheringWavesTool 19 | * @description: 对库街区接口数据进行解密 20 | * @author: Leck 21 | * @create: 2024-09-28 07:06 22 | */ 23 | public class ApiUtil { 24 | private static final Logger LOG = LoggerFactory.getLogger(ApiUtil.class); 25 | public static String decrypt(String value) throws ApiDecryptException { 26 | try { 27 | String keyBase64 = Config.apiDecryptKey; 28 | byte[] key = Base64.getDecoder().decode(keyBase64); 29 | byte[] encryptedData = Base64.getDecoder().decode(value); 30 | SecretKeySpec secretKey = new SecretKeySpec(key, "AES"); 31 | Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 32 | cipher.init(Cipher.DECRYPT_MODE, secretKey); 33 | byte[] decryptedData = cipher.doFinal(encryptedData); 34 | return new String(decryptedData, StandardCharsets.UTF_8); 35 | } catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException | IllegalBlockSizeException | IllegalArgumentException | 36 | BadPaddingException e) { 37 | LOG.debug("数据未加密,返回原内容"); 38 | return value; 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/calculator/exist/ExistedRoleDataForCalculator.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.calculator.exist; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.List; 6 | 7 | @JsonIgnoreProperties(ignoreUnknown = true) 8 | public class ExistedRoleDataForCalculator { 9 | private int roleId; 10 | private String roleName; 11 | private int roleLevel; 12 | private int roleBreakLevel; 13 | private List skillLevelList; 14 | private List skillBreakList; 15 | 16 | 17 | public int getRoleId() { 18 | return roleId; 19 | } 20 | 21 | public void setRoleId(int roleId) { 22 | this.roleId = roleId; 23 | } 24 | 25 | public String getRoleName() { 26 | return roleName; 27 | } 28 | 29 | public void setRoleName(String roleName) { 30 | this.roleName = roleName; 31 | } 32 | 33 | public int getRoleLevel() { 34 | return roleLevel; 35 | } 36 | 37 | public void setRoleLevel(int roleLevel) { 38 | this.roleLevel = roleLevel; 39 | } 40 | 41 | public int getRoleBreakLevel() { 42 | return roleBreakLevel; 43 | } 44 | 45 | public void setRoleBreakLevel(int roleBreakLevel) { 46 | this.roleBreakLevel = roleBreakLevel; 47 | } 48 | 49 | public List getSkillLevelList() { 50 | return skillLevelList; 51 | } 52 | 53 | public void setSkillLevelList(List skillLevelList) { 54 | this.skillLevelList = skillLevelList; 55 | } 56 | 57 | public List getSkillBreakList() { 58 | return skillBreakList; 59 | } 60 | 61 | public void setSkillBreakList(List skillBreakList) { 62 | this.skillBreakList = skillBreakList; 63 | } 64 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/calculator/exist/SkillLevel.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.calculator.exist; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | @JsonIgnoreProperties(ignoreUnknown = true) 6 | public class SkillLevel { 7 | private String type; 8 | private int level; 9 | 10 | public String getType() { 11 | return type; 12 | } 13 | 14 | public void setType(String type) { 15 | this.type = type; 16 | } 17 | 18 | public int getLevel() { 19 | return level; 20 | } 21 | 22 | public void setLevel(int level) { 23 | this.level = level; 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/calculator/exist/WeaponAim.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.calculator.exist; 2 | 3 | public class WeaponAim { 4 | private int weaponId; 5 | private int weaponStartLevel; 6 | private int weaponEndLevel; 7 | 8 | // Getters and Setters 9 | 10 | public int getWeaponId() { 11 | return weaponId; 12 | } 13 | 14 | public void setWeaponId(int weaponId) { 15 | this.weaponId = weaponId; 16 | } 17 | 18 | public int getWeaponStartLevel() { 19 | return weaponStartLevel; 20 | } 21 | 22 | public void setWeaponStartLevel(int weaponStartLevel) { 23 | this.weaponStartLevel = weaponStartLevel; 24 | } 25 | 26 | public int getWeaponEndLevel() { 27 | return weaponEndLevel; 28 | } 29 | 30 | public void setWeaponEndLevel(int weaponEndLevel) { 31 | this.weaponEndLevel = weaponEndLevel; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/calculator/list/AdvanceSkillList.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.calculator.list; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @description: 7 | * @author: Leck 8 | * @create: 2025-03-26 15:15 9 | */ 10 | @JsonIgnoreProperties(ignoreUnknown = true) 11 | public class AdvanceSkillList { 12 | private String location; 13 | private String iconUrl; 14 | 15 | public String getIconUrl() { 16 | return iconUrl; 17 | } 18 | 19 | public void setIconUrl(String iconUrl) { 20 | this.iconUrl = iconUrl; 21 | } 22 | 23 | public String getLocation() { 24 | return location; 25 | } 26 | 27 | public void setLocation(String location) { 28 | this.location = location; 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/calculator/list/CommonSkill.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.calculator.list; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @description: 7 | * @author: Leck 8 | * @create: 2025-03-26 15:15 9 | */ 10 | @JsonIgnoreProperties(ignoreUnknown = true) 11 | public class CommonSkill { 12 | private String type; 13 | private String iconUrl; 14 | 15 | public String getIconUrl() { 16 | return iconUrl; 17 | } 18 | 19 | public void setIconUrl(String iconUrl) { 20 | this.iconUrl = iconUrl; 21 | } 22 | 23 | public String getType() { 24 | return type; 25 | } 26 | 27 | public void setType(String type) { 28 | this.type = type; 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/calculator/list/WeaponForCalculator.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.calculator.list; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @description: 7 | * @author: Leck 8 | * @create: 2025-03-26 15:18 9 | */ 10 | @JsonIgnoreProperties(ignoreUnknown = true) 11 | public class WeaponForCalculator { 12 | private int weaponId; 13 | private String weaponName; 14 | private int weaponType; 15 | private int weaponStarLevel; 16 | private String weaponIcon; 17 | private String acronym; //缩写 18 | private boolean isPreview; 19 | private boolean isNew; 20 | private int priority; 21 | 22 | public int getWeaponId() { 23 | return weaponId; 24 | } 25 | 26 | public void setWeaponId(int weaponId) { 27 | this.weaponId = weaponId; 28 | } 29 | 30 | public String getWeaponName() { 31 | return weaponName; 32 | } 33 | 34 | public void setWeaponName(String weaponName) { 35 | this.weaponName = weaponName; 36 | } 37 | 38 | public int getWeaponType() { 39 | return weaponType; 40 | } 41 | 42 | public void setWeaponType(int weaponType) { 43 | this.weaponType = weaponType; 44 | } 45 | 46 | public int getWeaponStarLevel() { 47 | return weaponStarLevel; 48 | } 49 | 50 | public void setWeaponStarLevel(int weaponStarLevel) { 51 | this.weaponStarLevel = weaponStarLevel; 52 | } 53 | 54 | public String getWeaponIcon() { 55 | return weaponIcon; 56 | } 57 | 58 | public void setWeaponIcon(String weaponIcon) { 59 | this.weaponIcon = weaponIcon; 60 | } 61 | 62 | public String getAcronym() { 63 | return acronym; 64 | } 65 | 66 | public void setAcronym(String acronym) { 67 | this.acronym = acronym; 68 | } 69 | 70 | public boolean isPreview() { 71 | return isPreview; 72 | } 73 | 74 | public void setPreview(boolean preview) { 75 | isPreview = preview; 76 | } 77 | 78 | public boolean isNew() { 79 | return isNew; 80 | } 81 | 82 | public void setNew(boolean aNew) { 83 | isNew = aNew; 84 | } 85 | 86 | public int getPriority() { 87 | return priority; 88 | } 89 | 90 | public void setPriority(int priority) { 91 | this.priority = priority; 92 | } 93 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/calculator/result/CalculatorResult.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.calculator.result; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.List; 6 | 7 | @JsonIgnoreProperties(ignoreUnknown = true) 8 | public class CalculatorResult{ 9 | private int roleNum; 10 | private int weaponNum; 11 | private TotalCost preview; 12 | private List costList; 13 | 14 | public int getRoleNum() { 15 | return roleNum; 16 | } 17 | 18 | public void setRoleNum(int roleNum) { 19 | this.roleNum = roleNum; 20 | } 21 | 22 | public int getWeaponNum() { 23 | return weaponNum; 24 | } 25 | 26 | public void setWeaponNum(int weaponNum) { 27 | this.weaponNum = weaponNum; 28 | } 29 | 30 | public TotalCost getPreview() { 31 | return preview; 32 | } 33 | 34 | public void setPreview(TotalCost preview) { 35 | this.preview = preview; 36 | } 37 | 38 | public List getCostList() { 39 | return costList; 40 | } 41 | 42 | public void setCostList(List costList) { 43 | this.costList = costList; 44 | } 45 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/calculator/result/Cost.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.calculator.result; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | @JsonIgnoreProperties(ignoreUnknown = true) 6 | public class Cost { 7 | private String id; 8 | private String name; 9 | private String iconUrl; 10 | private int num; 11 | private int type; 12 | private int quality; 13 | private boolean isPreview; 14 | 15 | 16 | public String getId() { 17 | return id; 18 | } 19 | 20 | public void setId(String id) { 21 | this.id = id; 22 | } 23 | 24 | public String getName() { 25 | return name; 26 | } 27 | 28 | public void setName(String name) { 29 | this.name = name; 30 | } 31 | 32 | public String getIconUrl() { 33 | return iconUrl; 34 | } 35 | 36 | public void setIconUrl(String iconUrl) { 37 | this.iconUrl = iconUrl; 38 | } 39 | 40 | public int getNum() { 41 | return num; 42 | } 43 | 44 | public void setNum(int num) { 45 | this.num = num; 46 | } 47 | 48 | public int getType() { 49 | return type; 50 | } 51 | 52 | public void setType(int type) { 53 | this.type = type; 54 | } 55 | 56 | public int getQuality() { 57 | return quality; 58 | } 59 | 60 | public void setQuality(int quality) { 61 | this.quality = quality; 62 | } 63 | 64 | public boolean isPreview() { 65 | return isPreview; 66 | } 67 | 68 | public void setPreview(boolean preview) { 69 | isPreview = preview; 70 | } 71 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/calculator/result/CostList.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.calculator.result; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.List; 6 | @JsonIgnoreProperties(ignoreUnknown = true) 7 | public class CostList { 8 | private List allCost; 9 | private List missingCost; 10 | private List synthetic; 11 | private List missingRoleCost; 12 | private List missingSkillCost; 13 | private List missingWeaponCost; 14 | private Integer roleId; 15 | private Integer weaponId; 16 | private List strategyList; 17 | private boolean showStrategy; 18 | 19 | public List getAllCost() { 20 | return allCost; 21 | } 22 | 23 | public void setAllCost(List allCost) { 24 | this.allCost = allCost; 25 | } 26 | 27 | public List getMissingCost() { 28 | return missingCost; 29 | } 30 | 31 | public void setMissingCost(List missingCost) { 32 | this.missingCost = missingCost; 33 | } 34 | 35 | public List getSynthetic() { 36 | return synthetic; 37 | } 38 | 39 | public void setSynthetic(List synthetic) { 40 | this.synthetic = synthetic; 41 | } 42 | 43 | public List getMissingRoleCost() { 44 | return missingRoleCost; 45 | } 46 | 47 | public void setMissingRoleCost(List missingRoleCost) { 48 | this.missingRoleCost = missingRoleCost; 49 | } 50 | 51 | public List getMissingSkillCost() { 52 | return missingSkillCost; 53 | } 54 | 55 | public void setMissingSkillCost(List missingSkillCost) { 56 | this.missingSkillCost = missingSkillCost; 57 | } 58 | 59 | public List getMissingWeaponCost() { 60 | return missingWeaponCost; 61 | } 62 | 63 | public void setMissingWeaponCost(List missingWeaponCost) { 64 | this.missingWeaponCost = missingWeaponCost; 65 | } 66 | 67 | public Integer getRoleId() { 68 | return roleId; 69 | } 70 | 71 | public void setRoleId(Integer roleId) { 72 | this.roleId = roleId; 73 | } 74 | 75 | public Integer getWeaponId() { 76 | return weaponId; 77 | } 78 | 79 | public void setWeaponId(Integer weaponId) { 80 | this.weaponId = weaponId; 81 | } 82 | 83 | public List getStrategyList() { 84 | return strategyList; 85 | } 86 | 87 | public void setStrategyList(List strategyList) { 88 | this.strategyList = strategyList; 89 | } 90 | 91 | public boolean isShowStrategy() { 92 | return showStrategy; 93 | } 94 | 95 | public void setShowStrategy(boolean showStrategy) { 96 | this.showStrategy = showStrategy; 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/calculator/result/Strategy.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.calculator.result; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | @JsonIgnoreProperties(ignoreUnknown = true) 6 | public class Strategy { 7 | private String postId; 8 | private String postTitle; 9 | 10 | 11 | public String getPostId() { 12 | return postId; 13 | } 14 | 15 | public void setPostId(String postId) { 16 | this.postId = postId; 17 | } 18 | 19 | public String getPostTitle() { 20 | return postTitle; 21 | } 22 | 23 | public void setPostTitle(String postTitle) { 24 | this.postTitle = postTitle; 25 | } 26 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/calculator/result/TotalCost.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.calculator.result; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.List; 6 | 7 | @JsonIgnoreProperties(ignoreUnknown = true) 8 | public class TotalCost { 9 | private List allCost; 10 | private List missingCost; 11 | private List synthetic; 12 | private List missingRoleCost; 13 | private List missingSkillCost; 14 | private List missingWeaponCost; 15 | 16 | 17 | public List getAllCost() { 18 | return allCost; 19 | } 20 | 21 | public void setAllCost(List allCost) { 22 | this.allCost = allCost; 23 | } 24 | 25 | public List getMissingCost() { 26 | return missingCost; 27 | } 28 | 29 | public void setMissingCost(List missingCost) { 30 | this.missingCost = missingCost; 31 | } 32 | 33 | public List getSynthetic() { 34 | return synthetic; 35 | } 36 | 37 | public void setSynthetic(List synthetic) { 38 | this.synthetic = synthetic; 39 | } 40 | 41 | public List getMissingRoleCost() { 42 | return missingRoleCost; 43 | } 44 | 45 | public void setMissingRoleCost(List missingRoleCost) { 46 | this.missingRoleCost = missingRoleCost; 47 | } 48 | 49 | public List getMissingSkillCost() { 50 | return missingSkillCost; 51 | } 52 | 53 | public void setMissingSkillCost(List missingSkillCost) { 54 | this.missingSkillCost = missingSkillCost; 55 | } 56 | 57 | public List getMissingWeaponCost() { 58 | return missingWeaponCost; 59 | } 60 | 61 | public void setMissingWeaponCost(List missingWeaponCost) { 62 | this.missingWeaponCost = missingWeaponCost; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/Chain.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 共鸣链 8 | * @author: Leck 9 | * @create: 2024-07-30 16:11 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class Chain { 13 | private String name; 14 | private int order; 15 | private String description; 16 | private String iconUrl; 17 | private boolean unlocked; 18 | 19 | public String getName() { 20 | return name; 21 | } 22 | 23 | public void setName(String name) { 24 | this.name = name; 25 | } 26 | 27 | public int getOrder() { 28 | return order; 29 | } 30 | 31 | public void setOrder(int order) { 32 | this.order = order; 33 | } 34 | 35 | public String getDescription() { 36 | return description; 37 | } 38 | 39 | public void setDescription(String description) { 40 | this.description = description; 41 | } 42 | 43 | public String getIconUrl() { 44 | return iconUrl; 45 | } 46 | 47 | public void setIconUrl(String iconUrl) { 48 | this.iconUrl = iconUrl; 49 | } 50 | 51 | public boolean isUnlocked() { 52 | return unlocked; 53 | } 54 | 55 | public void setUnlocked(boolean unlocked) { 56 | this.unlocked = unlocked; 57 | } 58 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/FetterDetail.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 声骸技能 8 | * @author: Leck 9 | * @create: 2024-07-30 16:18 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class FetterDetail { 13 | private int groupId; 14 | private String name; 15 | private String iconUrl; 16 | private int num; 17 | private String firstDescription; 18 | private String secondDescription; 19 | 20 | public int getGroupId() { 21 | return groupId; 22 | } 23 | 24 | public void setGroupId(int groupId) { 25 | this.groupId = groupId; 26 | } 27 | 28 | public String getName() { 29 | return name; 30 | } 31 | 32 | public void setName(String name) { 33 | this.name = name; 34 | } 35 | 36 | public String getIconUrl() { 37 | return iconUrl; 38 | } 39 | 40 | public void setIconUrl(String iconUrl) { 41 | this.iconUrl = iconUrl; 42 | } 43 | 44 | public int getNum() { 45 | return num; 46 | } 47 | 48 | public void setNum(int num) { 49 | this.num = num; 50 | } 51 | 52 | public String getFirstDescription() { 53 | return firstDescription; 54 | } 55 | 56 | public void setFirstDescription(String firstDescription) { 57 | this.firstDescription = firstDescription; 58 | } 59 | 60 | public String getSecondDescription() { 61 | return secondDescription; 62 | } 63 | 64 | public void setSecondDescription(String secondDescription) { 65 | this.secondDescription = secondDescription; 66 | } 67 | 68 | @Override 69 | public boolean equals(Object obj) { 70 | if (obj instanceof FetterDetail detail) { 71 | return detail.getGroupId() == this.getGroupId(); 72 | } 73 | return super.equals(obj); 74 | } 75 | 76 | @Override 77 | public int hashCode() { 78 | return this.getGroupId(); 79 | } 80 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/PhantomData.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @program: WutheringWavesTool 9 | * @description: 10 | * @author: Leck 11 | * @create: 2024-07-30 16:22 12 | */ 13 | @JsonIgnoreProperties(ignoreUnknown = true) 14 | public class PhantomData { 15 | private int cost; 16 | private List equipPhantomList; 17 | 18 | public int getCost() { 19 | return cost; 20 | } 21 | 22 | public void setCost(int cost) { 23 | this.cost = cost; 24 | } 25 | 26 | public List getEquipPhantomList() { 27 | return equipPhantomList; 28 | } 29 | 30 | public void setEquipPhantomList(List equipPhantomList) { 31 | this.equipPhantomList = equipPhantomList; 32 | } 33 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/PhantomEx.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData; 2 | 3 | /** 4 | * @program: WutheringWavesTool 5 | * @description: 用于角色详情类 6 | * @author: Leck 7 | * @create: 2024-10-03 20:22 8 | */ 9 | public class PhantomEx extends Phantom { 10 | private Status status; 11 | 12 | 13 | 14 | enum Status{ 15 | SSS("完美"), 16 | SS("毕业"), 17 | S("小毕业"), 18 | N("普通"); 19 | 20 | String text; 21 | Status(String text) { 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/PhantomProp.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 声骸基本信息,不涉及词条 8 | * @author: Leck 9 | * @create: 2024-07-30 16:20 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class PhantomProp { 13 | private int phantomPropId; 14 | private String name; 15 | private int quality; 16 | private int phantomId; 17 | private int cost; 18 | private String iconUrl; 19 | private String skillDescription; 20 | 21 | public int getPhantomPropId() { 22 | return phantomPropId; 23 | } 24 | 25 | public void setPhantomPropId(int phantomPropId) { 26 | this.phantomPropId = phantomPropId; 27 | } 28 | 29 | public String getName() { 30 | return name; 31 | } 32 | 33 | public void setName(String name) { 34 | this.name = name; 35 | } 36 | 37 | public int getQuality() { 38 | return quality; 39 | } 40 | 41 | public void setQuality(int quality) { 42 | this.quality = quality; 43 | } 44 | 45 | public int getPhantomId() { 46 | return phantomId; 47 | } 48 | 49 | public void setPhantomId(int phantomId) { 50 | this.phantomId = phantomId; 51 | } 52 | 53 | public int getCost() { 54 | return cost; 55 | } 56 | 57 | public void setCost(int cost) { 58 | this.cost = cost; 59 | } 60 | 61 | public String getIconUrl() { 62 | return iconUrl; 63 | } 64 | 65 | public void setIconUrl(String iconUrl) { 66 | this.iconUrl = iconUrl; 67 | } 68 | 69 | public String getSkillDescription() { 70 | return skillDescription; 71 | } 72 | 73 | public void setSkillDescription(String skillDescription) { 74 | this.skillDescription = skillDescription; 75 | } 76 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/PhoantomMainProps.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 声骸词条 8 | * @author: Leck 9 | * @create: 2024-08-08 20:35 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class PhoantomMainProps { 13 | private String attributeName; 14 | private String iconUrl; 15 | private String attributeValue; 16 | private int level;//该词条对角色的重要程度,0,1,2,3 17 | 18 | private double attributeMaxValue; 19 | private double percent; //词条数值与最大值的百分比 20 | 21 | public String getAttributeName() { 22 | return attributeName; 23 | } 24 | 25 | public void setAttributeName(String attributeName) { 26 | this.attributeName = attributeName; 27 | } 28 | 29 | public String getIconUrl() { 30 | return iconUrl; 31 | } 32 | 33 | public void setIconUrl(String iconUrl) { 34 | this.iconUrl = iconUrl; 35 | } 36 | 37 | public String getAttributeValue() { 38 | return attributeValue; 39 | } 40 | 41 | public void setAttributeValue(String attributeValue) { 42 | this.attributeValue = attributeValue; 43 | } 44 | 45 | public int getLevel() { 46 | return level; 47 | } 48 | 49 | public void setLevel(int level) { 50 | this.level = level; 51 | } 52 | 53 | public double getPercent() { 54 | return percent; 55 | } 56 | 57 | public void setPercent(double percent) { 58 | this.percent = percent; 59 | } 60 | 61 | public double getAttributeMaxValue() { 62 | return attributeMaxValue; 63 | } 64 | 65 | public void setAttributeMaxValue(double attributeMaxValue) { 66 | this.attributeMaxValue = attributeMaxValue; 67 | } 68 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/RoleDetail.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @program: WutheringWavesTool 9 | * @description: 10 | * @author: Leck 11 | * @create: 2024-07-30 16:31 12 | */ 13 | @JsonIgnoreProperties(ignoreUnknown = true) 14 | public class RoleDetail { 15 | private Role role; 16 | private int level; 17 | private List chainList; 18 | private WeaponData weaponData; 19 | private PhantomData phantomData; 20 | private List skillList; 21 | 22 | public Role getRole() { 23 | return role; 24 | } 25 | 26 | public void setRole(Role role) { 27 | this.role = role; 28 | } 29 | 30 | public int getLevel() { 31 | return level; 32 | } 33 | 34 | public void setLevel(int level) { 35 | this.level = level; 36 | } 37 | 38 | public List getChainList() { 39 | return chainList; 40 | } 41 | 42 | public void setChainList(List chainList) { 43 | this.chainList = chainList; 44 | } 45 | 46 | public WeaponData getWeaponData() { 47 | return weaponData; 48 | } 49 | 50 | public void setWeaponData(WeaponData weaponData) { 51 | this.weaponData = weaponData; 52 | } 53 | 54 | public PhantomData getPhantomData() { 55 | return phantomData; 56 | } 57 | 58 | public void setPhantomData(PhantomData phantomData) { 59 | this.phantomData = phantomData; 60 | } 61 | 62 | public List getSkillList() { 63 | return skillList; 64 | } 65 | 66 | public void setSkillList(List skillList) { 67 | this.skillList = skillList; 68 | } 69 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/Skill.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-07-30 16:28 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class Skill { 13 | private int id; 14 | private String type; 15 | private String name; 16 | private String description; 17 | private String iconUrl; 18 | 19 | public int getId() { 20 | return id; 21 | } 22 | 23 | public void setId(int id) { 24 | this.id = id; 25 | } 26 | 27 | public String getType() { 28 | return type; 29 | } 30 | 31 | public void setType(String type) { 32 | this.type = type; 33 | } 34 | 35 | public String getName() { 36 | return name; 37 | } 38 | 39 | public void setName(String name) { 40 | this.name = name; 41 | } 42 | 43 | public String getDescription() { 44 | return description; 45 | } 46 | 47 | public void setDescription(String description) { 48 | this.description = description; 49 | } 50 | 51 | public String getIconUrl() { 52 | return iconUrl; 53 | } 54 | 55 | public void setIconUrl(String iconUrl) { 56 | this.iconUrl = iconUrl; 57 | } 58 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/SkillData.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-07-30 16:29 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class SkillData { 13 | private Skill skill; 14 | private int level; 15 | 16 | public Skill getSkill() { 17 | return skill; 18 | } 19 | 20 | public void setSkill(Skill skill) { 21 | this.skill = skill; 22 | } 23 | 24 | public int getLevel() { 25 | return level; 26 | } 27 | 28 | public void setLevel(int level) { 29 | this.level = level; 30 | } 31 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/Weapon.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-07-30 16:13 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class Weapon { 13 | private int weaponId; 14 | private String weaponName; 15 | private int weaponType; 16 | private int weaponStarLevel; 17 | private String weaponIcon; 18 | private String weaponEffectName; 19 | private String effectDescription; 20 | 21 | public int getWeaponId() { 22 | return weaponId; 23 | } 24 | 25 | public void setWeaponId(int weaponId) { 26 | this.weaponId = weaponId; 27 | } 28 | 29 | public String getWeaponName() { 30 | return weaponName; 31 | } 32 | 33 | public void setWeaponName(String weaponName) { 34 | this.weaponName = weaponName; 35 | } 36 | 37 | public int getWeaponType() { 38 | return weaponType; 39 | } 40 | 41 | public void setWeaponType(int weaponType) { 42 | this.weaponType = weaponType; 43 | } 44 | 45 | public int getWeaponStarLevel() { 46 | return weaponStarLevel; 47 | } 48 | 49 | public void setWeaponStarLevel(int weaponStarLevel) { 50 | this.weaponStarLevel = weaponStarLevel; 51 | } 52 | 53 | public String getWeaponIcon() { 54 | return weaponIcon; 55 | } 56 | 57 | public void setWeaponIcon(String weaponIcon) { 58 | this.weaponIcon = weaponIcon; 59 | } 60 | 61 | public String getWeaponEffectName() { 62 | return weaponEffectName; 63 | } 64 | 65 | public void setWeaponEffectName(String weaponEffectName) { 66 | this.weaponEffectName = weaponEffectName; 67 | } 68 | 69 | public String getEffectDescription() { 70 | return effectDescription; 71 | } 72 | 73 | public void setEffectDescription(String effectDescription) { 74 | this.effectDescription = effectDescription; 75 | } 76 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/WeaponData.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 角色武器数据,包括等级 8 | * @author: Leck 9 | * @create: 2024-07-30 16:15 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class WeaponData { 13 | private Weapon weapon; 14 | private int level; 15 | private int breach; 16 | private int resonLevel; 17 | 18 | public Weapon getWeapon() { 19 | return weapon; 20 | } 21 | 22 | public void setWeapon(Weapon weapon) { 23 | this.weapon = weapon; 24 | } 25 | 26 | public int getLevel() { 27 | return level; 28 | } 29 | 30 | public void setLevel(int level) { 31 | this.level = level; 32 | } 33 | 34 | public int getResonLevel() { 35 | return resonLevel; 36 | } 37 | 38 | public void setResonLevel(int resonLevel) { 39 | this.resonLevel = resonLevel; 40 | } 41 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/user/BoxInfo.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData.user; 2 | 3 | 4 | import com.fasterxml.jackson.annotation.JsonAlias; 5 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 6 | import com.fasterxml.jackson.annotation.JsonProperty; 7 | 8 | @JsonIgnoreProperties(ignoreUnknown = true) 9 | public class BoxInfo { 10 | @JsonProperty("location") 11 | @JsonAlias(value = {"name"}) 12 | private String boxName; 13 | private int num; 14 | 15 | 16 | public String getBoxName() { 17 | return boxName; 18 | } 19 | 20 | public void setBoxName(String boxName) { 21 | this.boxName = boxName; 22 | } 23 | 24 | public int getNum() { 25 | return num; 26 | } 27 | 28 | public void setNum(int num) { 29 | this.num = num; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/user/RoleDailyDetail.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData.user; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | @JsonIgnoreProperties(ignoreUnknown = true) 6 | public class RoleDailyDetail { 7 | private String name; 8 | private String img; 9 | private String key; 10 | private long refreshTimeStamp; 11 | private long expireTimeStamp; 12 | private String value; 13 | private int status; 14 | private int cur; 15 | private int total; 16 | 17 | public String getName() { 18 | return name; 19 | } 20 | 21 | public void setName(String name) { 22 | this.name = name; 23 | } 24 | 25 | public String getImg() { 26 | return img; 27 | } 28 | 29 | public void setImg(String img) { 30 | this.img = img; 31 | } 32 | 33 | public String getKey() { 34 | return key; 35 | } 36 | 37 | public void setKey(String key) { 38 | this.key = key; 39 | } 40 | 41 | public long getRefreshTimeStamp() { 42 | return refreshTimeStamp; 43 | } 44 | 45 | public void setRefreshTimeStamp(long refreshTimeStamp) { 46 | this.refreshTimeStamp = refreshTimeStamp; 47 | } 48 | 49 | public long getExpireTimeStamp() { 50 | return expireTimeStamp; 51 | } 52 | 53 | public void setExpireTimeStamp(long expireTimeStamp) { 54 | this.expireTimeStamp = expireTimeStamp; 55 | } 56 | 57 | public String getValue() { 58 | return value; 59 | } 60 | 61 | public void setValue(String value) { 62 | this.value = value; 63 | } 64 | 65 | public int getStatus() { 66 | return status; 67 | } 68 | 69 | public void setStatus(int status) { 70 | this.status = status; 71 | } 72 | 73 | public int getCur() { 74 | return cur; 75 | } 76 | 77 | public void setCur(int cur) { 78 | this.cur = cur; 79 | } 80 | 81 | public int getTotal() { 82 | return total; 83 | } 84 | 85 | public void setTotal(int total) { 86 | this.total = total; 87 | } 88 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/weight/PhantomWeight.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData.weight; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.HashMap; 6 | import java.util.Iterator; 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | /** 11 | * @program: WutheringWavesTool 12 | * @description: 13 | * @author: Leck 14 | * @create: 2024-10-02 23:08 15 | */ 16 | @JsonIgnoreProperties(ignoreUnknown = true) 17 | public class PhantomWeight { 18 | private String roleName; 19 | private Map subPropWeights; 20 | 21 | 22 | 23 | 24 | 25 | public String getRoleName() { 26 | return roleName; 27 | } 28 | 29 | public void setRoleName(String roleName) { 30 | this.roleName = roleName; 31 | } 32 | 33 | public Map getSubPropWeights() { 34 | return subPropWeights; 35 | } 36 | 37 | public void setSubPropWeights(Map subPropWeights) { 38 | this.subPropWeights = subPropWeights; 39 | } 40 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/roleData/weight/PropWeight.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.roleData.weight; 2 | 3 | /** 4 | * @program: WutheringWavesTool 5 | * @description: 6 | * @author: Leck 7 | * @create: 2024-10-02 23:06 8 | */ 9 | public class PropWeight { 10 | private String name; 11 | private double maxValue; 12 | 13 | public PropWeight() { 14 | } 15 | 16 | 17 | public String getName() { 18 | return name; 19 | } 20 | 21 | public void setName(String name) { 22 | this.name = name; 23 | } 24 | 25 | public double getMaxValue() { 26 | return maxValue; 27 | } 28 | 29 | public void setMaxValue(double maxValue) { 30 | this.maxValue = maxValue; 31 | } 32 | 33 | 34 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/sign/SignGood.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.sign; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnore; 4 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 5 | 6 | /** 7 | * @program: WutheringWavesTool 8 | * @description: 9 | * @author: Leck 10 | * @create: 2024-07-07 22:08 11 | */ 12 | @JsonIgnoreProperties(ignoreUnknown = true) 13 | public class SignGood { 14 | private Long goodsId; 15 | private String goodsName; 16 | private Integer goodsNum; 17 | private String goodsUrl; 18 | private Integer id; 19 | private Boolean isGain; 20 | private Integer serialNum; 21 | 22 | private Integer signId; 23 | @JsonIgnore 24 | private Boolean isSign; 25 | 26 | public Long getGoodsId() { 27 | return goodsId; 28 | } 29 | 30 | public void setGoodsId(Long goodsId) { 31 | this.goodsId = goodsId; 32 | } 33 | 34 | public String getGoodsName() { 35 | return goodsName; 36 | } 37 | 38 | public void setGoodsName(String goodsName) { 39 | this.goodsName = goodsName; 40 | } 41 | 42 | public Integer getGoodsNum() { 43 | return goodsNum; 44 | } 45 | 46 | public void setGoodsNum(Integer goodsNum) { 47 | this.goodsNum = goodsNum; 48 | } 49 | 50 | public String getGoodsUrl() { 51 | return goodsUrl; 52 | } 53 | 54 | public void setGoodsUrl(String goodsUrl) { 55 | this.goodsUrl = goodsUrl; 56 | } 57 | 58 | public Integer getId() { 59 | return id; 60 | } 61 | 62 | public void setId(Integer id) { 63 | this.id = id; 64 | } 65 | 66 | public Boolean getGain() { 67 | return isGain; 68 | } 69 | 70 | public void setGain(Boolean gain) { 71 | isGain = gain; 72 | } 73 | 74 | public Integer getSerialNum() { 75 | return serialNum; 76 | } 77 | 78 | public void setSerialNum(Integer serialNum) { 79 | this.serialNum = serialNum; 80 | } 81 | 82 | public Integer getSignId() { 83 | return signId; 84 | } 85 | 86 | public void setSignId(Integer signId) { 87 | this.signId = signId; 88 | } 89 | 90 | public Boolean getSign() { 91 | return isSign; 92 | } 93 | 94 | public void setSign(Boolean sign) { 95 | isSign = sign; 96 | } 97 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/sign/SignRecord.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.sign; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-08-02 04:33 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class SignRecord { 13 | private long orderCode; 14 | private String goodsName; 15 | private int goodsNum; 16 | private String goodsUrl; 17 | private String sigInDate; 18 | private int type; 19 | private String roleId; 20 | private String userId; 21 | 22 | public long getOrderCode() { 23 | return orderCode; 24 | } 25 | 26 | public void setOrderCode(long orderCode) { 27 | this.orderCode = orderCode; 28 | } 29 | 30 | public String getGoodsName() { 31 | return goodsName; 32 | } 33 | 34 | public void setGoodsName(String goodsName) { 35 | this.goodsName = goodsName; 36 | } 37 | 38 | public int getGoodsNum() { 39 | return goodsNum; 40 | } 41 | 42 | public void setGoodsNum(int goodsNum) { 43 | this.goodsNum = goodsNum; 44 | } 45 | 46 | public String getGoodsUrl() { 47 | return goodsUrl; 48 | } 49 | 50 | public void setGoodsUrl(String goodsUrl) { 51 | this.goodsUrl = goodsUrl; 52 | } 53 | 54 | public String getSigInDate() { 55 | return sigInDate; 56 | } 57 | 58 | public void setSigInDate(String sigInDate) { 59 | this.sigInDate = sigInDate; 60 | } 61 | 62 | public int getType() { 63 | return type; 64 | } 65 | 66 | public void setType(int type) { 67 | this.type = type; 68 | } 69 | 70 | public String getRoleId() { 71 | return roleId; 72 | } 73 | 74 | public void setRoleId(String roleId) { 75 | this.roleId = roleId; 76 | } 77 | 78 | public String getUserId() { 79 | return userId; 80 | } 81 | 82 | public void setUserId(String userId) { 83 | this.userId = userId; 84 | } 85 | 86 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/sign/SignUserInfo.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.sign; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-07-06 20:19 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class SignUserInfo{ 13 | 14 | private String userId; 15 | private String roleId; 16 | private String token; 17 | private Boolean isMain; 18 | public SignUserInfo() { 19 | } 20 | 21 | public SignUserInfo(String userId, String roleId, String token, Boolean isMain) { 22 | this.userId = userId; 23 | this.roleId = roleId; 24 | this.token = token; 25 | this.isMain = isMain; 26 | } 27 | 28 | public String getUserId() { 29 | return userId; 30 | } 31 | 32 | public void setUserId(String userId) { 33 | this.userId = userId; 34 | } 35 | 36 | public String getRoleId() { 37 | return roleId; 38 | } 39 | 40 | public void setRoleId(String roleId) { 41 | this.roleId = roleId; 42 | } 43 | 44 | public String getToken() { 45 | return token; 46 | } 47 | 48 | public void setToken(String token) { 49 | this.token = token; 50 | } 51 | 52 | public Boolean getMain() { 53 | return isMain; 54 | } 55 | public void setMain(Boolean main) { 56 | isMain = main; 57 | } 58 | public void setIsMain(Boolean main) { 59 | isMain = main; 60 | } 61 | public Boolean getIsMain() { 62 | return isMain; 63 | } 64 | 65 | 66 | 67 | @Override 68 | public String toString() { 69 | return String.format("%s", roleId); 70 | } 71 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/sign/UserInfo.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.sign; 2 | 3 | /** 4 | * @program: WutheringWavesTool 5 | * @description: 6 | * @author: Leck 7 | * @create: 2024-07-06 20:19 8 | */ 9 | public class UserInfo extends SignUserInfo { 10 | private Integer id; 11 | private Long lastSignTime; 12 | private Boolean isWeb;//标志该Token时web的还是app的 13 | private String roleName; 14 | private String roleUrl; 15 | private Long creatTime; 16 | 17 | //private Integer 18 | public UserInfo() { 19 | } 20 | 21 | public UserInfo(String userId, String roleId, String token, Boolean isMain, Boolean isWeb) { 22 | super(userId, roleId, token, isMain); 23 | this.isWeb = isWeb; 24 | } 25 | 26 | public Integer getId() { 27 | return id; 28 | } 29 | 30 | public void setId(Integer id) { 31 | this.id = id; 32 | } 33 | 34 | public Long getLastSignTime() { 35 | return lastSignTime; 36 | } 37 | 38 | public void setLastSignTime(Long lastSignTime) { 39 | this.lastSignTime = lastSignTime; 40 | } 41 | 42 | public Boolean getWeb() { 43 | return isWeb; 44 | } 45 | 46 | public void setWeb(Boolean web) { 47 | isWeb = web; 48 | } 49 | 50 | public Boolean getIsWeb() { 51 | return isWeb; 52 | } 53 | 54 | public void setIsWeb(Boolean web) { 55 | isWeb = web; 56 | } 57 | 58 | 59 | public String getRoleName() { 60 | return roleName; 61 | } 62 | 63 | public void setRoleName(String roleName) { 64 | this.roleName = roleName; 65 | } 66 | 67 | public String getRoleUrl() { 68 | return roleUrl; 69 | } 70 | 71 | public void setRoleUrl(String roleUrl) { 72 | this.roleUrl = roleUrl; 73 | } 74 | 75 | public Long getCreatTime() { 76 | return creatTime; 77 | } 78 | 79 | public void setCreatTime(Long creatTime) { 80 | this.creatTime = creatTime; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/towerData/Difficulty.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.towerData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @program: WutheringWavesTool 9 | * @description: 10 | * @author: Leck 11 | * @create: 2024-10-15 23:19 12 | */ 13 | @JsonIgnoreProperties(ignoreUnknown = true) 14 | public class Difficulty { 15 | private int difficulty; 16 | private String difficultyName; 17 | private List towerAreaList; 18 | 19 | public int getDifficulty() { 20 | return difficulty; 21 | } 22 | 23 | public void setDifficulty(int difficulty) { 24 | this.difficulty = difficulty; 25 | } 26 | 27 | public String getDifficultyName() { 28 | return difficultyName; 29 | } 30 | 31 | public void setDifficultyName(String difficultyName) { 32 | this.difficultyName = difficultyName; 33 | } 34 | 35 | public List getTowerAreaList() { 36 | return towerAreaList; 37 | } 38 | 39 | public void setTowerAreaList(List towerAreaList) { 40 | this.towerAreaList = towerAreaList; 41 | } 42 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/towerData/DifficultyTotal.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.towerData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @program: WutheringWavesTool 9 | * @description: 10 | * @author: Leck 11 | * @create: 2024-10-15 23:52 12 | */ 13 | @JsonIgnoreProperties(ignoreUnknown = true) 14 | public class DifficultyTotal { 15 | private List difficultyList; 16 | private boolean isUnlock; 17 | private long seasonEndTime; 18 | 19 | public List getDifficultyList() { 20 | return difficultyList; 21 | } 22 | 23 | public void setDifficultyList(List difficultyList) { 24 | this.difficultyList = difficultyList; 25 | } 26 | 27 | public boolean isUnlock() { 28 | return isUnlock; 29 | } 30 | 31 | public void setUnlock(boolean unlock) { 32 | isUnlock = unlock; 33 | } 34 | 35 | public long getSeasonEndTime() { 36 | return seasonEndTime; 37 | } 38 | 39 | public void setSeasonEndTime(long seasonEndTime) { 40 | this.seasonEndTime = seasonEndTime; 41 | } 42 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/towerData/Floor.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.towerData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @program: WutheringWavesTool 9 | * @description: 10 | * @author: Leck 11 | * @create: 2024-10-15 23:14 12 | */ 13 | @JsonIgnoreProperties(ignoreUnknown = true) 14 | public class Floor { 15 | private Integer floor; 16 | private String picUrl; 17 | private List roleList; 18 | private int star; 19 | 20 | 21 | public Integer getFloor() { 22 | return floor; 23 | } 24 | 25 | public void setFloor(Integer floor) { 26 | this.floor = floor; 27 | } 28 | 29 | public String getPicUrl() { 30 | return picUrl; 31 | } 32 | 33 | public void setPicUrl(String picUrl) { 34 | this.picUrl = picUrl; 35 | } 36 | 37 | public List getRoleList() { 38 | return roleList; 39 | } 40 | 41 | public void setRoleList(List roleList) { 42 | this.roleList = roleList; 43 | } 44 | 45 | public int getStar() { 46 | return star; 47 | } 48 | 49 | public void setStar(int star) { 50 | this.star = star; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/towerData/SimpleRole.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.towerData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | /** 6 | * @program: WutheringWavesTool 7 | * @description: 8 | * @author: Leck 9 | * @create: 2024-10-15 23:12 10 | */ 11 | @JsonIgnoreProperties(ignoreUnknown = true) 12 | public class SimpleRole { 13 | private Integer roleId; 14 | private String iconUrl; 15 | 16 | public SimpleRole(Integer roleId, String iconUrl) { 17 | this.roleId = roleId; 18 | this.iconUrl = iconUrl; 19 | } 20 | 21 | public SimpleRole() { 22 | } 23 | 24 | public Integer getRoleId() { 25 | return roleId; 26 | } 27 | 28 | public void setRoleId(Integer roleId) { 29 | this.roleId = roleId; 30 | } 31 | 32 | public String getIconUrl() { 33 | return iconUrl; 34 | } 35 | 36 | public void setIconUrl(String iconUrl) { 37 | this.iconUrl = iconUrl; 38 | } 39 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/model/towerData/TowerArea.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.model.towerData; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @program: WutheringWavesTool 9 | * @description: 10 | * @author: Leck 11 | * @create: 2024-10-15 23:13 12 | */ 13 | @JsonIgnoreProperties(ignoreUnknown = true) 14 | public class TowerArea { 15 | private Integer areaId; 16 | private String areaName; 17 | private List floorList; 18 | private int maxStar; 19 | private int star; 20 | 21 | public Integer getAreaId() { 22 | return areaId; 23 | } 24 | 25 | public void setAreaId(Integer areaId) { 26 | this.areaId = areaId; 27 | } 28 | 29 | public String getAreaName() { 30 | return areaName; 31 | } 32 | 33 | public void setAreaName(String areaName) { 34 | this.areaName = areaName; 35 | } 36 | 37 | public List getFloorList() { 38 | return floorList; 39 | } 40 | 41 | public void setFloorList(List floorList) { 42 | this.floorList = floorList; 43 | } 44 | 45 | public int getMaxStar() { 46 | return maxStar; 47 | } 48 | 49 | public void setMaxStar(int maxStar) { 50 | this.maxStar = maxStar; 51 | } 52 | 53 | public int getStar() { 54 | return star; 55 | } 56 | 57 | public void setStar(int star) { 58 | this.star = star; 59 | } 60 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/thread/UserDataRefreshTask.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.thread; 2 | 3 | import cn.tealc.wutheringwavestool.model.ResponseBody; 4 | import com.kuro.kujiequ.ApiConfig; 5 | import com.kuro.kujiequ.model.sign.SignUserInfo; 6 | import cn.tealc.wutheringwavestool.util.HttpRequestUtil; 7 | import javafx.concurrent.Task; 8 | import org.slf4j.Logger; 9 | import org.slf4j.LoggerFactory; 10 | 11 | import java.io.IOException; 12 | import java.net.http.HttpClient; 13 | import java.net.http.HttpRequest; 14 | import java.net.http.HttpResponse; 15 | 16 | /** 17 | * @program: WutheringWavesTool 18 | * @description: 刷新服务器缓存,获取实时数据 19 | * @author: Leck 20 | * @create: 2024-07-06 14:24 21 | */ 22 | public class UserDataRefreshTask extends Task> { 23 | private static final Logger LOG= LoggerFactory.getLogger(UserDataRefreshTask.class); 24 | private SignUserInfo signUserInfo; 25 | 26 | public UserDataRefreshTask(SignUserInfo signUserInfo) { 27 | this.signUserInfo = signUserInfo; 28 | } 29 | 30 | @Override 31 | protected ResponseBody call() throws Exception { 32 | return sign(signUserInfo.getRoleId(),signUserInfo.getToken()); 33 | } 34 | 35 | private ResponseBody sign(String roleId,String token){ 36 | String url1= ApiConfig.GAME_DATA_URL +"?type=1&sizeType=2"; 37 | String url2=String.format("%s?gameId=%s&serverId=%s&roleId=%s", 38 | ApiConfig.REFRESH_URL,ApiConfig.PARAM_GAME_ID,ApiConfig.PARAM_SERVER_ID,roleId); 39 | HttpClient client = HttpClient.newHttpClient(); 40 | try { 41 | HttpRequest request = HttpRequestUtil.getRequest(url1,token); 42 | HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); 43 | HttpRequest request2 = HttpRequestUtil.getRequest(url2,token); 44 | HttpResponse response2 = client.send(request2, HttpResponse.BodyHandlers.ofString()); 45 | LOG.debug("角色数刷新,状态码1: {},状态码2: {}",response.statusCode(),response2.statusCode()); 46 | return new ResponseBody<>(200,"角色数据刷新成功"); 47 | } catch (IOException | InterruptedException e) { 48 | LOG.error("错误",e); 49 | return new ResponseBody<>(1,"无法刷新角色数据,连接超时或解析错误"); 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/thread/calculator/BatchRoleCostTask.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.thread.calculator; 2 | 3 | import cn.tealc.wutheringwavestool.model.ResponseBody; 4 | import cn.tealc.wutheringwavestool.util.HttpRequestUtil; 5 | import com.fasterxml.jackson.core.type.TypeReference; 6 | import com.fasterxml.jackson.databind.ObjectMapper; 7 | import com.kuro.kujiequ.ApiConfig; 8 | import com.kuro.kujiequ.model.calculator.exist.RoleAim; 9 | import com.kuro.kujiequ.model.calculator.result.CalculatorResult; 10 | import com.kuro.kujiequ.model.sign.SignUserInfo; 11 | import javafx.concurrent.Task; 12 | import org.slf4j.Logger; 13 | import org.slf4j.LoggerFactory; 14 | 15 | import java.io.IOException; 16 | import java.net.URLEncoder; 17 | import java.net.http.HttpClient; 18 | import java.net.http.HttpRequest; 19 | import java.net.http.HttpResponse; 20 | import java.nio.charset.StandardCharsets; 21 | 22 | /** 23 | * @program: WutheringWavesTool 24 | * @description: 计算指定角色的练度 25 | * @author: Leck 26 | */ 27 | public class BatchRoleCostTask extends Task> { 28 | private static final Logger LOG = LoggerFactory.getLogger(BatchRoleCostTask.class); 29 | private SignUserInfo signUserInfo; 30 | 31 | private RoleAim[] roles; 32 | 33 | public BatchRoleCostTask(SignUserInfo signUserInfo, RoleAim... roles) { 34 | this.signUserInfo = signUserInfo; 35 | this.roles = roles; 36 | } 37 | 38 | @Override 39 | protected ResponseBody call() { 40 | ObjectMapper mapper = new ObjectMapper(); 41 | HttpClient client = HttpClient.newHttpClient(); 42 | try { 43 | String content = mapper.writeValueAsString(roles); 44 | content = URLEncoder.encode(content, StandardCharsets.UTF_8); 45 | String body = String.format("userId=%s&serverId=%s&roleId=%s&content=%s", 46 | signUserInfo.getUserId(), 47 | ApiConfig.PARAM_SERVER_ID, 48 | signUserInfo.getRoleId(), 49 | content); 50 | 51 | HttpRequest request = HttpRequestUtil.getRequest(ApiConfig.CALCULATOR_BATCH_ROLE_COST,body, signUserInfo.getToken()); 52 | HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); 53 | if (response.statusCode() == 200) { 54 | ResponseBody responseBody = mapper.readValue(response.body(), new TypeReference>() { 55 | }); 56 | return responseBody; 57 | } else { 58 | return new ResponseBody<>(1, "无法计算指定角色的练度"); 59 | } 60 | } catch (IOException | InterruptedException e) { 61 | LOG.error("错误", e); 62 | return new ResponseBody<>(1, "无法计算指定角色的练度"); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/thread/calculator/CalculatorDataRefreshTask.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.thread.calculator; 2 | 3 | import cn.tealc.wutheringwavestool.model.ResponseBody; 4 | import cn.tealc.wutheringwavestool.util.HttpRequestUtil; 5 | import com.fasterxml.jackson.core.type.TypeReference; 6 | import com.fasterxml.jackson.databind.ObjectMapper; 7 | import com.kuro.kujiequ.ApiConfig; 8 | import com.kuro.kujiequ.model.calculator.list.RoleForCalculator; 9 | import com.kuro.kujiequ.model.sign.SignUserInfo; 10 | import javafx.concurrent.Task; 11 | import org.slf4j.Logger; 12 | import org.slf4j.LoggerFactory; 13 | 14 | import java.io.IOException; 15 | import java.net.http.HttpClient; 16 | import java.net.http.HttpRequest; 17 | import java.net.http.HttpResponse; 18 | 19 | /** 20 | * @program: WutheringWavesTool 21 | * @description: 刷新服务器缓存,获取实时数据 22 | * @author: Leck 23 | */ 24 | public class CalculatorDataRefreshTask extends Task> { 25 | private static final Logger LOG = LoggerFactory.getLogger(CalculatorDataRefreshTask.class); 26 | private SignUserInfo signUserInfo; 27 | 28 | public CalculatorDataRefreshTask(SignUserInfo signUserInfo) { 29 | this.signUserInfo = signUserInfo; 30 | } 31 | 32 | @Override 33 | protected ResponseBody call() throws Exception { 34 | String url =String.format("%s?userId=%s&serverId=%s&roleId=%s", 35 | ApiConfig.CALCULATOR_LIST_ROLE,signUserInfo.getUserId(),ApiConfig.PARAM_SERVER_ID,signUserInfo.getRoleId()); 36 | HttpClient client = HttpClient.newHttpClient(); 37 | try { 38 | HttpRequest request = HttpRequestUtil.getRequest(url, signUserInfo.getToken()); 39 | HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); 40 | if (response.statusCode() == 200) { 41 | return ResponseBody.create(200,"刷新成功",null); 42 | } else { 43 | return new ResponseBody<>(1, "养成计算器刷新失败"); 44 | } 45 | } catch (IOException | InterruptedException e) { 46 | LOG.error("错误", e); 47 | return new ResponseBody<>(1, "养成计算器刷新失败"); 48 | } 49 | } 50 | 51 | 52 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/thread/calculator/ListRoleTask.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.thread.calculator; 2 | 3 | import cn.tealc.wutheringwavestool.model.ResponseBody; 4 | import cn.tealc.wutheringwavestool.model.ResponseBodyForApi; 5 | import cn.tealc.wutheringwavestool.util.HttpRequestUtil; 6 | import com.fasterxml.jackson.core.type.TypeReference; 7 | import com.fasterxml.jackson.databind.ObjectMapper; 8 | import com.kuro.kujiequ.ApiConfig; 9 | import com.kuro.kujiequ.model.calculator.list.RoleForCalculator; 10 | import com.kuro.kujiequ.model.calculator.result.Cost; 11 | import com.kuro.kujiequ.model.sign.SignUserInfo; 12 | import javafx.concurrent.Task; 13 | import org.slf4j.Logger; 14 | import org.slf4j.LoggerFactory; 15 | 16 | import java.io.IOException; 17 | import java.net.http.HttpClient; 18 | import java.net.http.HttpRequest; 19 | import java.net.http.HttpResponse; 20 | import java.util.Collections; 21 | import java.util.Comparator; 22 | import java.util.List; 23 | 24 | /** 25 | * @program: WutheringWavesTool 26 | * @description: 刷新服务器缓存,获取实时数据 27 | * @author: Leck 28 | * @create: 2024-07-06 14:24 29 | */ 30 | public class ListRoleTask extends Task>> { 31 | private static final Logger LOG= LoggerFactory.getLogger(ListRoleTask.class); 32 | private SignUserInfo signUserInfo; 33 | 34 | public ListRoleTask(SignUserInfo signUserInfo) { 35 | this.signUserInfo = signUserInfo; 36 | } 37 | 38 | @Override 39 | protected ResponseBody> call() throws Exception { 40 | return request(signUserInfo.getToken()); 41 | } 42 | 43 | private ResponseBody> request(String token){ 44 | String url= ApiConfig.CALCULATOR_LIST_ROLE; 45 | HttpClient client = HttpClient.newHttpClient(); 46 | try { 47 | HttpRequest request = HttpRequestUtil.getRequest(url,token); 48 | HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); 49 | 50 | if (response.statusCode() == 200) { 51 | ObjectMapper mapper = new ObjectMapper(); 52 | ResponseBody> responseBody = mapper.readValue(response.body(), new TypeReference>>() { 53 | }); 54 | responseBody.getData().sort(Comparator.comparingInt(RoleForCalculator::getPriority).reversed()); 55 | return responseBody; 56 | }else { 57 | return new ResponseBody<>(1,"无法获取养成计算器的角色列表"); 58 | } 59 | } catch (IOException | InterruptedException e) { 60 | LOG.error("错误",e); 61 | return new ResponseBody<>(1,"无法获取养成计算器的角色列表"); 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/thread/calculator/ListWeaponTask.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.thread.calculator; 2 | 3 | import cn.tealc.wutheringwavestool.model.ResponseBody; 4 | import cn.tealc.wutheringwavestool.util.HttpRequestUtil; 5 | import com.fasterxml.jackson.core.type.TypeReference; 6 | import com.fasterxml.jackson.databind.ObjectMapper; 7 | import com.kuro.kujiequ.ApiConfig; 8 | import com.kuro.kujiequ.model.calculator.list.RoleForCalculator; 9 | import com.kuro.kujiequ.model.calculator.list.WeaponForCalculator; 10 | import com.kuro.kujiequ.model.sign.SignUserInfo; 11 | import javafx.concurrent.Task; 12 | import org.slf4j.Logger; 13 | import org.slf4j.LoggerFactory; 14 | 15 | import java.io.IOException; 16 | import java.net.http.HttpClient; 17 | import java.net.http.HttpRequest; 18 | import java.net.http.HttpResponse; 19 | import java.util.Comparator; 20 | import java.util.List; 21 | 22 | /** 23 | * @program: WutheringWavesTool 24 | * @description: 刷新服务器缓存,获取实时数据 25 | * @author: Leck 26 | * @create: 2024-07-06 14:24 27 | */ 28 | public class ListWeaponTask extends Task>> { 29 | private static final Logger LOG= LoggerFactory.getLogger(ListWeaponTask.class); 30 | private SignUserInfo signUserInfo; 31 | 32 | public ListWeaponTask(SignUserInfo signUserInfo) { 33 | this.signUserInfo = signUserInfo; 34 | } 35 | 36 | @Override 37 | protected ResponseBody> call() throws Exception { 38 | return request(signUserInfo.getToken()); 39 | } 40 | 41 | private ResponseBody> request(String token){ 42 | String url= ApiConfig.CALCULATOR_LIST_WEAPON; 43 | HttpClient client = HttpClient.newHttpClient(); 44 | try { 45 | HttpRequest request = HttpRequestUtil.getRequest(url,token); 46 | HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); 47 | 48 | if (response.statusCode() == 200) { 49 | ObjectMapper mapper = new ObjectMapper(); 50 | ResponseBody> responseBody = mapper.readValue(response.body(), new TypeReference>>() { 51 | }); 52 | responseBody.getData().sort(Comparator.comparingInt(WeaponForCalculator::getPriority).reversed()); 53 | return responseBody; 54 | }else { 55 | return new ResponseBody<>(1,"无法获取养成计算器的武器列表"); 56 | } 57 | } catch (IOException | InterruptedException e) { 58 | LOG.error("错误",e); 59 | return new ResponseBody<>(1,"无法获取养成计算器的武器列表"); 60 | } 61 | } 62 | } -------------------------------------------------------------------------------- /src/main/java/com/kuro/kujiequ/thread/calculator/QueryOwnedRoleTask.java: -------------------------------------------------------------------------------- 1 | package com.kuro.kujiequ.thread.calculator; 2 | 3 | import cn.tealc.wutheringwavestool.model.ResponseBody; 4 | import cn.tealc.wutheringwavestool.util.HttpRequestUtil; 5 | import com.fasterxml.jackson.core.type.TypeReference; 6 | import com.fasterxml.jackson.databind.ObjectMapper; 7 | import com.kuro.kujiequ.ApiConfig; 8 | import com.kuro.kujiequ.model.calculator.list.WeaponForCalculator; 9 | import com.kuro.kujiequ.model.sign.SignUserInfo; 10 | import javafx.concurrent.Task; 11 | import org.slf4j.Logger; 12 | import org.slf4j.LoggerFactory; 13 | 14 | import java.io.IOException; 15 | import java.net.http.HttpClient; 16 | import java.net.http.HttpRequest; 17 | import java.net.http.HttpResponse; 18 | import java.util.List; 19 | 20 | /** 21 | * @program: WutheringWavesTool 22 | * @description: 获取指定玩家以存在的角色列表 23 | * @author: Leck 24 | */ 25 | public class QueryOwnedRoleTask extends Task>> { 26 | private static final Logger LOG= LoggerFactory.getLogger(QueryOwnedRoleTask.class); 27 | private SignUserInfo signUserInfo; 28 | 29 | public QueryOwnedRoleTask(SignUserInfo signUserInfo) { 30 | this.signUserInfo = signUserInfo; 31 | } 32 | 33 | @Override 34 | protected ResponseBody> call() throws Exception { 35 | String url =String.format("%s?userId=%s&serverId=%s&roleId=%s", 36 | ApiConfig.CALCULATOR_QUERY_OWNED_ROLE,signUserInfo.getUserId(),ApiConfig.PARAM_SERVER_ID,signUserInfo.getRoleId()); 37 | HttpClient client = HttpClient.newHttpClient(); 38 | try { 39 | HttpRequest request = HttpRequestUtil.getRequest(url,signUserInfo.getToken()); 40 | HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); 41 | 42 | if (response.statusCode() == 200) { 43 | ObjectMapper mapper = new ObjectMapper(); 44 | ResponseBody> responseBody = mapper.readValue(response.body(), new TypeReference>>() { 45 | }); 46 | return responseBody; 47 | }else { 48 | return new ResponseBody<>(1,"无法获取指定玩家以存在的角色列表"); 49 | } 50 | } catch (IOException | InterruptedException e) { 51 | LOG.error("错误",e); 52 | return new ResponseBody<>(1,"无法获取指定玩家以存在的角色列表"); 53 | } 54 | } 55 | 56 | } -------------------------------------------------------------------------------- /src/main/java/module-info.java: -------------------------------------------------------------------------------- 1 | open module cn.tealc.wutheringwavestool { 2 | requires javafx.fxml; 3 | requires javafx.controls; 4 | requires javafx.base; 5 | requires javafx.graphics; 6 | requires javafx.media; 7 | requires javafx.swing; 8 | requires org.kordamp.ikonli.core; 9 | requires org.kordamp.ikonli.material2; 10 | requires org.kordamp.ikonli.javafx; 11 | requires org.kordamp.ikonli.antdesignicons; 12 | requires java.net.http; 13 | requires atlantafx.base; 14 | requires com.fasterxml.jackson.databind; 15 | requires de.saxsys.mvvmfx; 16 | requires cn.tealc.teafx; 17 | requires jdk.crypto.cryptoki; 18 | requires org.slf4j; 19 | requires com.sun.jna.platform; 20 | requires org.apache.commons.dbutils; 21 | requires org.apache.commons.codec; 22 | requires org.xerial.sqlitejdbc; 23 | requires com.sun.jna; 24 | requires filters; 25 | requires net.coobird.thumbnailator; 26 | requires com.github.kwhat.jnativehook; 27 | requires ch.qos.logback.core; 28 | requires ch.qos.logback.classic; 29 | requires cn.tealc.fxplugin; 30 | 31 | exports cn.tealc.wutheringwavestool; 32 | exports cn.tealc.wutheringwavestool.model; 33 | exports cn.tealc.wutheringwavestool.model.analysis to com.fasterxml.jackson.databind; 34 | exports cn.tealc.wutheringwavestool.base; 35 | exports cn.tealc.wutheringwavestool.jna; 36 | exports cn.tealc.wutheringwavestool.ui; 37 | exports cn.tealc.wutheringwavestool.ui.kujiequ; 38 | exports cn.tealc.wutheringwavestool.ui.game; 39 | exports cn.tealc.wutheringwavestool.dao; 40 | exports cn.tealc.wutheringwavestool.util; 41 | exports cn.tealc.wutheringwavestool.model.message; 42 | exports cn.tealc.wutheringwavestool.plugin; 43 | 44 | 45 | exports com.kuro.kujiequ.model.towerData; 46 | exports com.kuro.kujiequ.model.roleData to com.fasterxml.jackson.databind; 47 | exports com.kuro.kujiequ.model.roleData.user to com.fasterxml.jackson.databind; 48 | exports com.kuro.kujiequ.model.sign to com.fasterxml.jackson.databind, WutheringWavesTool, WutheringWavesTool_test; 49 | exports com.kuro.kujiequ.model.roleData.weight; 50 | exports com.kuro.kujiequ.thread; 51 | 52 | exports com.kuro.kujiequ; 53 | exports com.kuro.game.model.game; 54 | exports com.kuro.game.model.launcher; 55 | exports cn.tealc.wutheringwavestool.ui.cardpool; 56 | exports cn.tealc.wutheringwavestool.ui.game.manage; 57 | 58 | 59 | } -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/Default.css: -------------------------------------------------------------------------------- 1 | 2 | .text{ 3 | -fx-font-smoothing-type: gray; 4 | } 5 | 6 | 7 | .combo-box-base{ 8 | -fx-background-radius: 20; 9 | -fx-padding: 0 5 0 5; 10 | -fx-background-color: -color-bg-default-60; 11 | } 12 | .combo-box-base:showing{ 13 | -fx-background-radius: 20 20 0 0; 14 | 15 | } 16 | .combo-box > .list-cell { 17 | -fx-background: transparent; 18 | } 19 | 20 | .combo-box-popup > .list-view { 21 | -fx-background-color: -color-bg-default-60; 22 | -fx-background-insets: null; 23 | -fx-border-color: transparent; 24 | 25 | } 26 | .combo-box-popup > .list-view > .virtual-flow > .clipped-container > .sheet > .list-cell { 27 | -fx-background-color: -color-bg-default-40; 28 | -fx-border-color: transparent; 29 | } 30 | .combo-box-popup > .list-view > .virtual-flow > .clipped-container > .sheet > .list-cell:hover { 31 | -fx-opacity: 0.8; 32 | } 33 | 34 | 35 | .jfx-dialog > StackPane{ 36 | -fx-background-color: transparent; 37 | } 38 | 39 | .jfx-dialog-layout { 40 | -fx-text-fill: rgba(0, 0, 0, 0.87); 41 | -fx-background-radius: 10; 42 | -fx-padding: 10; 43 | -fx-background-color: -color-bg-default; 44 | } 45 | 46 | 47 | /* 48 | .jfx-dialog-layout > .jfx-layout-body .label { 49 | -fx-text-fill: -color-bg-inset; 50 | -fx-font-size: 16.0; 51 | -fx-wrap-text: true; 52 | } 53 | */ 54 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/Plugin.css: -------------------------------------------------------------------------------- 1 | .plugin .plugin-cell{ 2 | -fx-background-color: -color-bg-default-30; 3 | -fx-background-radius: 5; 4 | -fx-padding: 10; 5 | } 6 | .plugin .plugin-cell:hover{ 7 | -fx-opacity: 0.8; 8 | -fx-cursor: hand; 9 | } -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/Setting.css: -------------------------------------------------------------------------------- 1 | .setting{ 2 | -color-bg-default-60: #ffffff60; 3 | -color-bg-default-40: #ffffff40; 4 | -color-bg-default-30: #ffffff30; 5 | } 6 | 7 | .setting .scroll-bar{ 8 | -fx-background-color: transparent; 9 | -fx-opacity: 1; 10 | } 11 | .setting .scroll-bar:vertical .thumb{ 12 | -fx-background-color: transparent; 13 | -fx-background-insets: 1; 14 | } 15 | .setting:hover .scroll-bar:vertical .thumb{ 16 | -fx-background-color: -color-bg-default-60; 17 | } 18 | 19 | 20 | .setting .tip{ 21 | -fx-font-size: 12; 22 | -fx-text-fill: -color-font-muted; 23 | -fx-padding: 0 0 0 0; 24 | } 25 | .setting .left{ 26 | 27 | } 28 | .setting .left .radio-button{ 29 | -fx-background-color: transparent; 30 | } 31 | 32 | 33 | 34 | .setting .left .title-3{ 35 | -fx-padding: 0 0 5 0; 36 | } 37 | 38 | .setting .left .title-4 { 39 | -fx-font-size: 1.05em; 40 | -fx-font-weight: normal; 41 | } 42 | 43 | .setting .left .input-group{ 44 | -fx-background-radius: 20; 45 | -fx-padding: 5 10 5 10; 46 | -fx-background-color: -color-bg-default-60; 47 | } 48 | .setting .left .input-group >.text-field{ 49 | -fx-background-color: transparent; 50 | -fx-padding: 0 40 0 0; 51 | } 52 | .setting .left .input-group:hover{ 53 | -fx-background-color: -color-bg-default-90; 54 | } 55 | .setting .left .input-group > .button{ 56 | -fx-background-color: transparent; 57 | -fx-padding: 5; 58 | } 59 | .setting .left .input-group > .button:hover .ikonli-font-icon{ 60 | -fx-icon-color: -color-accent-emphasis; 61 | } 62 | .setting .left .spinner{ 63 | -fx-pref-width: 150; 64 | -fx-background-radius: 20; 65 | -fx-padding: 2 12 2 5; 66 | -fx-background-color: -color-bg-default-60; 67 | -fx-border-color: transparent; 68 | } 69 | .setting .left .spinner > .text-field{ 70 | -fx-background-color: transparent; 71 | } 72 | 73 | .setting .left .spinner > .decrement-arrow-button, 74 | .setting .left .spinner > .increment-arrow-button{ 75 | -fx-background-color: transparent; 76 | -fx-background-insets: 0; 77 | -fx-background-radius: 0 0 4px 0; 78 | -fx-padding: 5px; 79 | } 80 | .setting .left .spinner > .decrement-arrow-button:hover, 81 | .setting .left .spinner > .increment-arrow-button:hover{ 82 | -fx-background-color: -color-base-2; 83 | -fx-cursor: hand; 84 | } 85 | 86 | 87 | .setting .right{ 88 | 89 | } 90 | .setting .right .func-btn{ 91 | -fx-background-color: -color-bg-default-60; 92 | } 93 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/TrayIcon.css: -------------------------------------------------------------------------------- 1 | .tray{ 2 | -fx-pref-width: 120; 3 | -fx-spacing: 0; 4 | -fx-alignment: top-center; 5 | -fx-padding: 5 0 5 0; 6 | -fx-background-radius: 5; 7 | -fx-background-color: white; 8 | } 9 | 10 | .tray > .button{ 11 | -fx-padding:0; 12 | -fx-border-color: transparent; 13 | -fx-background-insets: 0; 14 | -fx-background-radius: 0; 15 | -fx-graphic-text-gap: 10px; 16 | -fx-text-fill: -color-button-fg; 17 | 18 | -fx-pref-width: 120; 19 | -fx-pref-height: 25; 20 | -fx-font-size: 12; 21 | 22 | } 23 | 24 | .tray > .button:hover, 25 | .tray > .button:focused{ 26 | -fx-background-insets: 0px; 27 | 28 | } 29 | .tray > .button:hover{ 30 | -fx-background-color: -color-hover-subtle; 31 | } 32 | 33 | .tray > .button > .ikonli-font-icon { 34 | -fx-icon-color: -color-fg-default; 35 | -fx-fill: -color-fg-default; 36 | -fx-icon-size: 12px; 37 | } -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/Update.css: -------------------------------------------------------------------------------- 1 | .update{ 2 | 3 | } 4 | .update .right{ 5 | -fx-background-color: -color-bg-default-40; 6 | -fx-background-radius: 10 0 0 10; 7 | } 8 | 9 | .update .right .text-area{ 10 | -fx-background-color: transparent; 11 | } -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/game/GameRecord.css: -------------------------------------------------------------------------------- 1 | .game-record{ 2 | -color-bg-default-90: #ffffff40; 3 | } 4 | .game-record .update-tip{ 5 | -fx-text-fill: -color-font-subtle; 6 | } 7 | .game-record .item{ 8 | -fx-background-color: -color-bg-default-90; 9 | -fx-background-radius: 5; 10 | -fx-padding: 10; 11 | } 12 | 13 | .game-record .item .title{ 14 | -fx-font-size: 16; 15 | -fx-text-fill: -color-font-muted; 16 | } 17 | .game-record .item .child{ 18 | -fx-spacing: 10; 19 | } 20 | .game-record .item .child .tip{ 21 | -fx-pref-width: 180; 22 | -fx-font-size: 16; 23 | } 24 | .game-record .item .child .num{ 25 | -fx-font-size: 16; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/game/GameStatistics.css: -------------------------------------------------------------------------------- 1 | 2 | .game-statistics .separator { 3 | -fx-padding: 6 0 6 0; 4 | } 5 | .game-statistics .separator > .line{ 6 | -fx-border-color: #00000070; 7 | -fx-border-insets: 1px 0 0 0; 8 | -fx-border-width: 1px; 9 | -fx-padding: 0; 10 | } 11 | .game-statistics .child-select{ 12 | -fx-background-color: transparent; 13 | -fx-text-fill: -color-font-muted; 14 | -fx-font-weight: bold; 15 | -fx-graphic-text-gap: 2; 16 | -fx-padding: 3; 17 | -fx-cursor: hand; 18 | } 19 | .game-statistics .child-select:hover{ 20 | -fx-text-fill: -color-accent-fg; 21 | } 22 | .game-statistics .child-select > Pane{ 23 | -fx-pref-width: 25; 24 | -fx-pref-height: 3; 25 | -fx-background-radius: 3px; 26 | -fx-background-color: transparent; 27 | } 28 | 29 | 30 | .game-statistics .toggle-button:selected > Pane{ 31 | -fx-background-color: -color-accent-fg; 32 | } 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/game/GameTime.css: -------------------------------------------------------------------------------- 1 | .gametime{ 2 | -color-bg-default-90: #ffffff40; 3 | } 4 | 5 | .gametime .item{ 6 | -fx-background-color: -color-bg-default-90; 7 | -fx-background-radius: 5; 8 | -fx-padding: 10; 9 | } 10 | 11 | .gametime .item .header{ 12 | -fx-font-size: 16; 13 | -fx-text-fill: -color-font-muted; 14 | } 15 | 16 | .gametime .item .content .label{ 17 | -fx-font-size: 16; 18 | -fx-text-fill: -color-font-muted; 19 | } 20 | 21 | .gametime .chart{ 22 | -fx-background-color: -color-bg-default-90; 23 | -fx-background-radius: 5; 24 | -fx-padding: 10; 25 | } 26 | .gametime .chart > .chart-content > .chart-plot-background { 27 | -fx-background-color: transparent; 28 | } 29 | .gametime .progress-bar > .bar{ 30 | -fx-padding: 4px; 31 | } 32 | .gametime .progress-bar > .track{ 33 | -fx-background-color: #dfdede; 34 | } 35 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/game/manage/GameDirChoose.css: -------------------------------------------------------------------------------- 1 | .game-choose{ 2 | 3 | } 4 | 5 | 6 | .game-choose .radio-button{ 7 | -fx-background-color: transparent; 8 | } 9 | .game-choose .input-group{ 10 | -fx-background-radius: 20; 11 | -fx-padding: 5 10 5 10; 12 | -fx-background-color: -color-bg-default-60; 13 | } 14 | .game-choose .input-group >.text-field{ 15 | -fx-background-color: transparent; 16 | -fx-padding: 0 40 0 0; 17 | } 18 | .game-choose .input-group:hover{ 19 | -fx-background-color: -color-bg-default-90; 20 | } 21 | .game-choose .input-group > .button{ 22 | -fx-background-color: transparent; 23 | -fx-padding: 5; 24 | } 25 | .game-choose .input-group > .button:hover .ikonli-font-icon{ 26 | -fx-icon-color: -color-accent-emphasis; 27 | } -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/game/manage/GameManage.css: -------------------------------------------------------------------------------- 1 | .game-manage{ 2 | 3 | } 4 | 5 | .game-manage .scroll-bar{ 6 | -fx-background-color: transparent; 7 | -fx-opacity: 1; 8 | } 9 | 10 | .game-manage .scroll-bar:vertical .thumb{ 11 | -fx-background-color: transparent; 12 | -fx-background-insets: 1; 13 | } 14 | .game-manage:hover .scroll-bar:vertical .thumb{ 15 | -fx-background-color: -color-bg-default-60; 16 | } 17 | 18 | 19 | 20 | .game-manage .separator { 21 | -fx-padding: 6 0 6 0; 22 | } 23 | .game-manage .separator > .line{ 24 | -fx-border-color: #00000070; 25 | -fx-border-insets: 1px 0 0 0; 26 | -fx-border-width: 1px; 27 | -fx-padding: 0; 28 | } 29 | .game-manage .child-select{ 30 | -fx-background-color: transparent; 31 | -fx-text-fill: -color-fg-subtle; 32 | -fx-font-size: 1em; 33 | -fx-font-weight: bold; 34 | -fx-graphic-text-gap: 2; 35 | -fx-padding: 3; 36 | -fx-cursor: hand; 37 | } 38 | .game-manage .child-select:hover{ 39 | -fx-text-fill: -color-accent-fg; 40 | } 41 | .game-manage .child-select:selected{ 42 | -fx-text-fill: -color-fg-muted; 43 | } 44 | .game-manage .child-select > Pane{ 45 | -fx-pref-width: 25; 46 | -fx-pref-height: 3; 47 | -fx-background-radius: 3px; 48 | -fx-background-color: transparent; 49 | } 50 | 51 | 52 | .game-manage .toggle-button:selected > Pane{ 53 | -fx-background-color: -color-accent-fg; 54 | } 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/kujiequ/Account.css: -------------------------------------------------------------------------------- 1 | .account .list-view{ 2 | -fx-background-color: transparent; 3 | -fx-background-radius: 10; 4 | -fx-border-color: transparent; 5 | -fx-padding: 0; 6 | 7 | } 8 | 9 | .account .list-view .list-cell{ 10 | -fx-background-color: transparent; 11 | -fx-border-color: transparent; 12 | -fx-padding: 8 10 8 10; 13 | } 14 | .account .list-view .list-cell:filled .user{ 15 | -fx-background-color: -color-bg-default-90; 16 | -fx-background-radius: 10; 17 | -fx-padding: 10; 18 | 19 | } 20 | 21 | .account .list-view .list-cell:empty .user{ 22 | -fx-background-color: transparent; 23 | 24 | } 25 | .account .list-view .list-cell .user-label{ 26 | -fx-font-size: 12; 27 | } 28 | 29 | .account .list-view .list-cell .role-label{ 30 | -fx-text-fill: -color-fg-subtle; 31 | -fx-font-size: 10; 32 | } 33 | .list-view .list-cell .delete-btn{ 34 | -fx-padding: 2; 35 | } 36 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/kujiequ/OwnRole.css: -------------------------------------------------------------------------------- 1 | .own-role{ 2 | -color-bg-default-60: #ffffff60; 3 | -color-bg-default-40: #ffffff40; 4 | } 5 | 6 | .own-role .role-cell{ 7 | -fx-background-color: -color-bg-default-60; 8 | -fx-background-radius: 5; 9 | -fx-padding: 0 0 2 0; 10 | /* -fx-effect:dropshadow(three-pass-box, -color-border-muted,2,0.7,0,0);*/ 11 | } 12 | .own-role .role-cell:hover{ 13 | -fx-background-color: -color-bg-default-40; 14 | } 15 | 16 | .own-role .role-cell .attr{ 17 | 18 | } 19 | 20 | .own-role .role-cell .chain-num{ 21 | -fx-background-color: #a1a0a0; 22 | -fx-padding: 2 4 2 4; 23 | -fx-text-fill: white; 24 | -fx-translate-x: -3; 25 | -fx-translate-y: 3; 26 | -fx-background-radius: 3; 27 | -fx-font-weight: bold; 28 | } 29 | 30 | 31 | .own-role .role-cell > VBox{ 32 | -fx-padding: 0 0 8 0; /*与role对应*/ 33 | -fx-spacing: 2; 34 | 35 | } 36 | .own-role .role-cell > VBox > .name{ 37 | -fx-font-size: 16; 38 | -fx-text-fill: -color-font-muted; 39 | -fx-font-weight: bold; 40 | 41 | } 42 | .own-role .role-cell > VBox > .level{ 43 | -fx-font-size: 12; 44 | -fx-text-fill: -color-font-subtle; 45 | 46 | } 47 | 48 | 49 | 50 | 51 | 52 | .own-role .back-btn{ 53 | -fx-border-color: transparent; 54 | -fx-background-color: transparent; 55 | -fx-translate-x: 10; 56 | -fx-translate-y: 13; 57 | -fx-padding: 2 5 2 5; 58 | } 59 | 60 | .own-role .back-btn:hover{ 61 | -fx-border-color: -color-border-subtle; 62 | -fx-border-radius: 2; 63 | } 64 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/kujiequ/Sign.css: -------------------------------------------------------------------------------- 1 | .sign { 2 | } 3 | .sign .goods { 4 | -fx-background-color: -color-bg-default-50; 5 | -fx-background-radius: 0.357em; /* 5px → 5/14=0.357em */ 6 | -fx-padding: 0.357em; /* 5px */ 7 | -fx-pref-width: 5em; /* 70px */ 8 | -fx-pref-height: 6em; /* 84px */ 9 | } 10 | .sign .goods > .pic { 11 | -fx-fit-width: 4.286em; /* 60px */ 12 | -fx-fit-height: 4.286em; 13 | -fx-smooth: true; 14 | } 15 | 16 | .sign .goods > .signed-pic { 17 | -fx-fit-width: 1.429em; /* 20px */ 18 | -fx-fit-height: 1.429em; 19 | -fx-smooth: true; 20 | -fx-translate-x: 0.714em; /* 10px */ 21 | -fx-translate-y: -0.714em; 22 | } 23 | .sign .goods > .name { 24 | -fx-background-color: -color-font-subtle; 25 | -fx-opacity: 0.7; 26 | -fx-background-radius: 0.357em; /* 5px */ 27 | -fx-text-fill: -color-font-default; 28 | -fx-alignment: center; 29 | -fx-pref-width: 4.286em; /* 60px */ 30 | -fx-pref-height: 1.429em; /* 20px */ 31 | -fx-font-size: 1.143em; /* 16px */ 32 | } 33 | .sign .goods > .index { 34 | 35 | } 36 | 37 | .sign .goods > .num { 38 | -fx-text-fill: -color-fg-subtle; 39 | -fx-font-size: 0.714em; /* 10px */ 40 | } 41 | 42 | .sign > .log, 43 | .sign > .log:focused { 44 | -fx-background-color: transparent; 45 | -fx-background-insets: null; 46 | } 47 | 48 | .sign > .history { 49 | /* -fx-background-color: -color-bg-default; 50 | -fx-background-radius: 0.357em; 51 | -fx-padding: 0.714em; 52 | -fx-effect:dropshadow(three-pass-box, -color-border-muted,0.143em,0.7,0,0); */ 53 | } 54 | .sign > .history > .list-view { 55 | -fx-background-color: transparent; 56 | -fx-background-radius: 0.714em; /* 10px */ 57 | -fx-border-color: transparent; 58 | -fx-padding: 0; 59 | 60 | } 61 | 62 | .sign > .history > .list-view .list-cell { 63 | -fx-background-color: transparent; 64 | -fx-border-color: transparent; 65 | -fx-padding: 0.571em 0.714em 0.571em 0.714em; /* 8px 10px */ 66 | } 67 | 68 | .sign > .history > .list-view .list-cell .label { 69 | -fx-font-size: 0.857em; /* 12px */ 70 | } 71 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/kujiequ/calculator/Calculator.css: -------------------------------------------------------------------------------- 1 | .calculator-view { 2 | 3 | } 4 | 5 | .calculator-view .tab-pane.no-header { 6 | -fx-tab-max-width: 0; 7 | -fx-tab-min-width: 0; 8 | -fx-tab-max-height: 0; 9 | -fx-tab-min-height: 0; 10 | -fx-padding: 0; 11 | -fx-tab-header-area-background-color: transparent; 12 | -fx-tab-header-area-border-color: transparent; 13 | } 14 | .calculator-view .tab-pane.no-header > .tab-header-area { 15 | -fx-background-insets: 0; 16 | -fx-background-color: transparent; 17 | -fx-border-color: transparent; 18 | -fx-border-insets: 0; 19 | -fx-border-width: 0; 20 | visibility: hidden; 21 | } 22 | .calculator-view .separator { 23 | -fx-padding: 6 0 6 0; 24 | } 25 | .calculator-view .separator > .line{ 26 | -fx-border-color: #00000070; 27 | -fx-border-insets: 1px 0 0 0; 28 | -fx-border-width: 1px; 29 | -fx-padding: 0; 30 | } 31 | .calculator-view .child-select{ 32 | -fx-background-color: transparent; 33 | -fx-text-fill: -color-font-muted; 34 | -fx-font-weight: bold; 35 | -fx-graphic-text-gap: 2; 36 | -fx-padding: 3; 37 | -fx-cursor: hand; 38 | } 39 | .calculator-view .child-select:hover{ 40 | -fx-text-fill: -color-accent-fg; 41 | } 42 | .calculator-view .child-select > Pane{ 43 | -fx-pref-width: 25; 44 | -fx-pref-height: 3; 45 | -fx-background-radius: 3px; 46 | -fx-background-color: transparent; 47 | } 48 | 49 | 50 | .calculator-view .toggle-button:selected > Pane{ 51 | -fx-background-color: -color-accent-fg; 52 | } 53 | 54 | 55 | .calculator-view .item-cell{ 56 | -fx-pref-width: 80.0; 57 | -fx-background-color: -color-bg-default-60; 58 | -fx-background-radius: 5; 59 | -fx-padding: 0 0 2 0; 60 | } 61 | .calculator-view .item-cell:hover{ 62 | -fx-cursor: hand; 63 | -fx-background-color: -color-bg-default-40; 64 | } 65 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/css/kujiequ/calculator/CalculatorRoleEdit.css: -------------------------------------------------------------------------------- 1 | .role-edit{ 2 | 3 | } 4 | 5 | .role-edit .level-group{ 6 | -fx-alignment: center; 7 | } 8 | .role-edit .level-group .skill-title{ 9 | -fx-pref-width: 80; 10 | } 11 | 12 | .role-edit .level-group .skill-slider{ 13 | 14 | } 15 | .role-edit .level-group .skill-level{ 16 | 17 | } -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/font/HarmonyOS_Sans_SC_Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/font/HarmonyOS_Sans_SC_Bold.ttf -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/font/HarmonyOS_Sans_SC_Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/font/HarmonyOS_Sans_SC_Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/attr/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/attr/1.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/attr/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/attr/2.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/attr/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/attr/3.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/attr/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/attr/4.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/attr/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/attr/5.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/attr/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/attr/6.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/battle-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/battle-2.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/bg.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/icon.ico -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/icon.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/battle-pass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/battle-pass.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/energy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/energy.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/liveness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/liveness.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/signed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/signed.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/star01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/star01.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/storeEnergy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/storeEnergy.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/weeklyInst.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/kujiequ/weeklyInst.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/role-chain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/role-chain.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/role-skill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/role-skill.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/role-weapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/role-weapon.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/role.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/role.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/image/support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leck995/WutheringWavesTool/2d01b7791051808c5f581feb9d4a1ca5890fc021/src/main/resources/cn/tealc/wutheringwavestool/image/support.png -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/ui/PluginView.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/ui/game/GameStatisticsView.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/ui/game/manage/GameManagerView.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/ui/kujiequ/AccountView.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/ui/kujiequ/OwnRoleView.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/main/resources/cn/tealc/wutheringwavestool/ui/kujiequ/TowerView.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | UTF-8 22 | %date %level [%thread] %logger [%file:%line] %msg%n 23 | 24 | 25 | 26 | 27 | 28 | 29 | DEBUG 30 | 31 | 32 | UTF-8 33 | %date %level [%thread] %logger [%file:%line] %msg%n 34 | 35 | 36 | 37 | 38 | 39 | ${logPath}/%d.log 40 | 42 | 6 43 | 44 | 45 | 46 | 5MB 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /src/main/resources/update.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | echo ��ȡ����ԱȨ�� 3 | if exist "%SystemRoot%\SysWOW64" path %path%;%windir%\SysNative;%SystemRoot%\SysWOW64;%~dp0 4 | bcdedit >nul 5 | if '%errorlevel%' NEQ '0' (goto UACPrompt) else (goto UACAdmin) 6 | :UACPrompt 7 | %1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","::",,"runas",1)(window.close)&exit 8 | exit /B 9 | :UACAdmin 10 | cd /d "%~dp0" 11 | echo ��ǰ����·���ǣ�%CD% 12 | echo �ѻ�ȡ����ԱȨ�� 13 | setlocal 14 | 15 | rem ɱ�� WutheringWavesTool.exe ���� 16 | taskkill /IM "WutheringWavesTool.exe" /F 17 | 18 | :: �������������ҵ����̺ţ�Ȼ��ɱ���� 19 | set JPS=jps 20 | set MAIN_CLASS=cn.tealc.wutheringwavestool.MainApplication 21 | 22 | for /f "tokens=1" %%a in ('%JPS% -l ^| findstr /i "%MAIN_CLASS%"') do ( 23 | set PID=%%a 24 | ) 25 | 26 | if defined PID ( 27 | echo Stopping %MAIN_CLASS% PID %PID%... 28 | taskkill /f /pid %PID% 29 | echo %MAIN_CLASS% is stopped. 30 | ) else ( 31 | echo %MAIN_CLASS% is not running. 32 | ) 33 | 34 | rem �ȴ� 1 �� 35 | timeout /t 1 /nobreak > nul 36 | 37 | rem ��ȡ������ű�����Ŀ¼ 38 | set "baseDir=%~dp0" 39 | set "sourceDir=%baseDir%update" 40 | set "targetDir=%baseDir%" 41 | 42 | rem ���ԴĿ¼�Ƿ���� 43 | if exist "%sourceDir%" ( 44 | rem �����ļ���Ŀ¼�������� 45 | robocopy %sourceDir% %targetDir% /MOVE /E /V 46 | ) 47 | 48 | if exist "%baseDir%update.zip" ( 49 | del "%baseDir%update.zip" 50 | ) 51 | echo baseDir: %~dp0 52 | echo Executable path: "%baseDir%WutheringWavesTool.exe" 53 | rem ���� WutheringWavesTool.exe 54 | if exist "%baseDir%WutheringWavesTool.exe" ( 55 | echo Starting WutheringWavesTool.exe... 56 | start "" "%baseDir%WutheringWavesTool.exe" 57 | ) else ( 58 | echo WutheringWavesTool.exe �������� %baseDir% 59 | ) 60 | del "%~f0" 61 | exit 62 | endlocal 63 | -------------------------------------------------------------------------------- /src/test/java/test/plugin/CreateJson.java: -------------------------------------------------------------------------------- 1 | package test.plugin; 2 | 3 | import cn.tealc.fxplugin.model.FxPluginType; 4 | import cn.tealc.wutheringwavestool.plugin.FxPluginConfig; 5 | import cn.tealc.wutheringwavestool.plugin.FxPluginLanguage; 6 | import com.fasterxml.jackson.databind.ObjectMapper; 7 | import org.junit.jupiter.api.Test; 8 | 9 | import java.io.File; 10 | import java.io.IOException; 11 | import java.util.HashMap; 12 | import java.util.Locale; 13 | import java.util.Map; 14 | 15 | /** 16 | * @program: WutheringWavesTool 17 | * @description: 18 | * @author: Leck 19 | * @create: 2024-12-21 01:00 20 | */ 21 | public class CreateJson { 22 | @Test 23 | public void WWTPoolExport() throws IOException { 24 | FxPluginLanguage cn = new FxPluginLanguage(Locale.SIMPLIFIED_CHINESE,"抽卡数据导入导出","抽卡数据导入导出插件"); 25 | FxPluginLanguage td = new FxPluginLanguage(Locale.TRADITIONAL_CHINESE,"抽卡数据导入导出","抽卡数据导入导出插件"); 26 | FxPluginLanguage en = new FxPluginLanguage(Locale.ENGLISH,"Gacha data import and export","Gacha data import and export"); 27 | Map languageMap = new HashMap(); 28 | languageMap.put(Locale.ENGLISH,en); 29 | languageMap.put(Locale.SIMPLIFIED_CHINESE,cn); 30 | languageMap.put(Locale.TRADITIONAL_CHINESE,td); 31 | 32 | FxPluginConfig config = new FxPluginConfig(); 33 | config.setLanguages(languageMap); 34 | config.setId(1001); 35 | config.setAuthor("leck"); 36 | config.setPath("wwt-pool-export"); 37 | config.setVersion("1.0.0"); 38 | config.setIcon("icon.png"); 39 | config.setJarName("wwt-pool-export-1.0.jar"); 40 | config.setLevel(FxPluginConfig.Level.IMPORTANT); 41 | config.setPluginType(FxPluginType.DIALOG); 42 | 43 | ObjectMapper mapper = new ObjectMapper(); 44 | mapper.writerWithDefaultPrettyPrinter().writeValue(new File("plugins/wwt-pool-export/config.json"), config); 45 | 46 | 47 | 48 | } 49 | } --------------------------------------------------------------------------------