├── .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 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
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 |
34 |
35 |
36 |
37 |
38 |
39 |
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 |
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 |
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 |
29 |
30 |
31 |
32 |
33 |
34 |
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 |
14 |
15 |
16 |
17 |
18 |
19 |
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 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
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 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
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 |
14 |
15 |
20 |
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 |
15 |
16 |
17 |
18 |
19 |
20 |
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 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
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 | }
--------------------------------------------------------------------------------