mirror of
https://github.com/namooplol/unknow-dmb.git
synced 2025-04-28 06:58:07 +00:00
Merge f96333069fc908fe2e597313e2ec4e4b102049c5 into eb683f89ec14c333163d5a9afdf1d7bbd5d532ab
This commit is contained in:
commit
04ea09cc26
@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017-2024 Daniel D. Scalzi
|
||||
Copyright (c) 2024 DPSoftware
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
21
LICENSE.txt.old
Normal file
21
LICENSE.txt.old
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017-2024 Daniel D. Scalzi
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
174
README.md
174
README.md
@ -1,80 +1,6 @@
|
||||
<p align="center"><img src="./app/assets/images/SealCircle.png" width="150px" height="150px" alt="aventium softworks"></p>
|
||||
|
||||
<h1 align="center">Helios Launcher</h1>
|
||||
|
||||
<em><h5 align="center">(formerly Electron Launcher)</h5></em>
|
||||
|
||||
[<p align="center"><img src="https://img.shields.io/github/actions/workflow/status/dscalzi/HeliosLauncher/build.yml?branch=master&style=for-the-badge" alt="gh actions">](https://github.com/dscalzi/HeliosLauncher/actions) [<img src="https://img.shields.io/github/downloads/dscalzi/HeliosLauncher/total.svg?style=for-the-badge" alt="downloads">](https://github.com/dscalzi/HeliosLauncher/releases) <img src="https://forthebadge.com/images/badges/winter-is-coming.svg" height="28px" alt="winter-is-coming"></p>
|
||||
|
||||
<p align="center">Join modded servers without worrying about installing Java, Forge, or other mods. We'll handle that for you.</p>
|
||||
|
||||

|
||||

|
||||
|
||||
## Features
|
||||
|
||||
* 🔒 Full account management.
|
||||
* Add multiple accounts and easily switch between them.
|
||||
* Microsoft (OAuth 2.0) + Mojang (Yggdrasil) authentication fully supported.
|
||||
* Credentials are never stored and transmitted directly to Mojang.
|
||||
* 📂 Efficient asset management.
|
||||
* Receive client updates as soon as we release them.
|
||||
* Files are validated before launch. Corrupt or incorrect files will be redownloaded.
|
||||
* ☕ **Automatic Java validation.**
|
||||
* If you have an incompatible version of Java installed, we'll install the right one *for you*.
|
||||
* You do not need to have Java installed to run the launcher.
|
||||
* 📰 News feed natively built into the launcher.
|
||||
* ⚙️ Intuitive settings management, including a Java control panel.
|
||||
* Supports all of our servers.
|
||||
* Switch between server configurations with ease.
|
||||
* View the player count of the selected server.
|
||||
* Automatic updates. That's right, the launcher updates itself.
|
||||
* View the status of Mojang's services.
|
||||
|
||||
This is not an exhaustive list. Download and install the launcher to gauge all it can do!
|
||||
|
||||
#### Need Help? [Check the wiki.][wiki]
|
||||
|
||||
#### Like the project? Leave a ⭐ star on the repository!
|
||||
|
||||
## Downloads
|
||||
|
||||
You can download from [GitHub Releases](https://github.com/dscalzi/HeliosLauncher/releases)
|
||||
|
||||
#### Latest Release
|
||||
|
||||
[](https://github.com/dscalzi/HeliosLauncher/releases/latest)
|
||||
|
||||
#### Latest Pre-Release
|
||||
[](https://github.com/dscalzi/HeliosLauncher/releases)
|
||||
|
||||
**Supported Platforms**
|
||||
|
||||
If you download from the [Releases](https://github.com/dscalzi/HeliosLauncher/releases) tab, select the installer for your system.
|
||||
|
||||
| Platform | File |
|
||||
| -------- | ---- |
|
||||
| Windows x64 | `Helios-Launcher-setup-VERSION.exe` |
|
||||
| macOS x64 | `Helios-Launcher-setup-VERSION-x64.dmg` |
|
||||
| macOS arm64 | `Helios-Launcher-setup-VERSION-arm64.dmg` |
|
||||
| Linux x64 | `Helios-Launcher-setup-VERSION.AppImage` |
|
||||
|
||||
## Console
|
||||
|
||||
To open the console, use the following keybind.
|
||||
|
||||
```console
|
||||
ctrl + shift + i
|
||||
```
|
||||
|
||||
Ensure that you have the console tab selected. Do not paste anything into the console unless you are 100% sure of what it will do. Pasting the wrong thing can expose sensitive information.
|
||||
|
||||
#### Export Output to a File
|
||||
|
||||
If you want to export the console output, simply right click anywhere on the console and click **Save as..**
|
||||
|
||||

|
||||
|
||||
# DMB Project Launcher
|
||||
Based on Helios Launcher
|
||||
|
||||
## Development
|
||||
|
||||
@ -84,28 +10,20 @@ This section details the setup of a basic developmentment environment.
|
||||
|
||||
**System Requirements**
|
||||
|
||||
* [Node.js][nodejs] v20
|
||||
|
||||
---
|
||||
- nodejs v20
|
||||
|
||||
**Clone and Install Dependencies**
|
||||
|
||||
```console
|
||||
> git clone https://github.com/dscalzi/HeliosLauncher.git
|
||||
> cd HeliosLauncher
|
||||
> npm install
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Launch Application**
|
||||
|
||||
```console
|
||||
> npm start
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Build Installers**
|
||||
|
||||
To build for your current platform.
|
||||
@ -123,89 +41,3 @@ Build for a specific platform.
|
||||
| Linux x64 | `npm run dist:linux` |
|
||||
|
||||
Builds for macOS may not work on Windows/Linux and vice-versa.
|
||||
|
||||
---
|
||||
|
||||
### Visual Studio Code
|
||||
|
||||
All development of the launcher should be done using [Visual Studio Code][vscode].
|
||||
|
||||
Paste the following into `.vscode/launch.json`
|
||||
|
||||
```JSON
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Debug Main Process",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"program": "${workspaceFolder}/node_modules/electron/cli.js",
|
||||
"args" : ["."],
|
||||
"outputCapture": "std"
|
||||
},
|
||||
{
|
||||
"name": "Debug Renderer Process",
|
||||
"type": "chrome",
|
||||
"request": "launch",
|
||||
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
|
||||
"windows": {
|
||||
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
|
||||
},
|
||||
"runtimeArgs": [
|
||||
"${workspaceFolder}/.",
|
||||
"--remote-debugging-port=9222"
|
||||
],
|
||||
"webRoot": "${workspaceFolder}"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
This adds two debug configurations.
|
||||
|
||||
#### Debug Main Process
|
||||
|
||||
This allows you to debug Electron's [main process][mainprocess]. You can debug scripts in the [renderer process][rendererprocess] by opening the DevTools Window.
|
||||
|
||||
#### Debug Renderer Process
|
||||
|
||||
This allows you to debug Electron's [renderer process][rendererprocess]. This requires you to install the [Debugger for Chrome][chromedebugger] extension.
|
||||
|
||||
Note that you **cannot** open the DevTools window while using this debug configuration. Chromium only allows one debugger, opening another will crash the program.
|
||||
|
||||
---
|
||||
|
||||
### Note on Third-Party Usage
|
||||
|
||||
Please give credit to the original author and provide a link to the original source. This is free software, please do at least this much.
|
||||
|
||||
For instructions on setting up Microsoft Authentication, see https://github.com/dscalzi/HeliosLauncher/blob/master/docs/MicrosoftAuth.md.
|
||||
|
||||
---
|
||||
|
||||
## Resources
|
||||
|
||||
* [Wiki][wiki]
|
||||
* [Nebula (Create Distribution.json)][nebula]
|
||||
* [v2 Rewrite Branch (Inactive)][v2branch]
|
||||
|
||||
The best way to contact the developers is on Discord.
|
||||
|
||||
[][discord]
|
||||
|
||||
---
|
||||
|
||||
### See you ingame.
|
||||
|
||||
|
||||
[nodejs]: https://nodejs.org/en/ 'Node.js'
|
||||
[vscode]: https://code.visualstudio.com/ 'Visual Studio Code'
|
||||
[mainprocess]: https://electronjs.org/docs/tutorial/application-architecture#main-and-renderer-processes 'Main Process'
|
||||
[rendererprocess]: https://electronjs.org/docs/tutorial/application-architecture#main-and-renderer-processes 'Renderer Process'
|
||||
[chromedebugger]: https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome 'Debugger for Chrome'
|
||||
[discord]: https://discord.gg/zNWUXdt 'Discord'
|
||||
[wiki]: https://github.com/dscalzi/HeliosLauncher/wiki 'wiki'
|
||||
[nebula]: https://github.com/dscalzi/Nebula 'dscalzi/Nebula'
|
||||
[v2branch]: https://github.com/dscalzi/HeliosLauncher/tree/ts-refactor 'v2 branch'
|
||||
|
171
app/app.ejs
171
app/app.ejs
@ -1,6 +1,6 @@
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta charset="utf-8" http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-In6B8teKZQll5heMl9bS7CESTbGvuAt3VVV86BUQBDk='"/>
|
||||
<meta charset="utf-8" http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval' 'sha256-In6B8teKZQll5heMl9bS7CESTbGvuAt3VVV86BUQBDk='"/>
|
||||
<title><%= lang('app.title') %></title>
|
||||
<script src="./assets/js/scripts/uicore.js"></script>
|
||||
<script src="./assets/js/scripts/uibinder.js"></script>
|
||||
@ -16,7 +16,7 @@
|
||||
#main {
|
||||
display: none;
|
||||
height: calc(100% - 22px);
|
||||
background: linear-gradient(to top, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0) 100%);
|
||||
background: linear-gradient(to top, rgba(0, 0, 0, 0.75) 0%, rgba(255, 255, 255, 0) 100%);
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
@ -39,10 +39,171 @@
|
||||
<%- include('overlay') %>
|
||||
<div id="loadingContainer">
|
||||
<div id="loadingContent">
|
||||
<div id="loadSpinnerContainer">
|
||||
<img id="loadCenterImage" src="assets/images/LoadingSeal.png">
|
||||
<img id="loadSpinnerImage" class="rotating" src="assets/images/LoadingText.png">
|
||||
<div class="loader"></div>
|
||||
<h3>Please wait...</h3>
|
||||
<div class="dpclogoload">
|
||||
<svg
|
||||
width="42.92924mm"
|
||||
height="4.587187mm"
|
||||
viewBox="0 0 170.92924 17.587187"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm" />
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-19.884722,-141.35177)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:22.696px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke-width:0.851098"
|
||||
x="105.2219"
|
||||
y="158.59541"
|
||||
id="text2"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2"
|
||||
style="stroke-width:0.851098"
|
||||
x="105.22191"
|
||||
y="158.59541"><tspan
|
||||
style="fill:#ffe900;fill-opacity:1;stroke-width:0.851098"
|
||||
id="tspan6">D</tspan><tspan
|
||||
style="fill:#2bcd95;fill-opacity:1;stroke-width:0.851098"
|
||||
id="tspan5">O</tspan><tspan
|
||||
style="fill:#ff7e00;fill-opacity:1;stroke-width:0.851098"
|
||||
id="tspan4">P</tspan><tspan
|
||||
style="fill:#cdd127;fill-opacity:1;stroke-width:0.851098"
|
||||
id="tspan3">Foundation</tspan></tspan></text>
|
||||
</g>
|
||||
</svg>
|
||||
<svg
|
||||
width="38.435234mm"
|
||||
height="8.858992mm"
|
||||
viewBox="0 0 76.435234 16.858992"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xml:space="preserve"
|
||||
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
|
||||
sodipodi:docname="powered-by-DPCloudev.svg"
|
||||
inkscape:export-filename="powered-by-DPCloudev.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="1.0242632"
|
||||
inkscape:cx="401.7522"
|
||||
inkscape:cy="505.24122"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1009"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" /><defs
|
||||
id="defs1"><rect
|
||||
x="146.72466"
|
||||
y="315.36963"
|
||||
width="186.32265"
|
||||
height="42.779961"
|
||||
id="rect7" /></defs><g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-47.625001,-111.65416)"><text
|
||||
xml:space="preserve"
|
||||
transform="matrix(0.26458334,0,0,0.26458334,3.9593842,27.136316)"
|
||||
id="text7"
|
||||
style="font-size:26.6667px;text-align:center;white-space:pre;shape-inside:url(#rect7);display:inline;fill:#ffaa00;fill-opacity:1;fill-rule:evenodd"><tspan
|
||||
x="162.43122"
|
||||
y="339.69798"
|
||||
id="tspan2"><tspan
|
||||
style="fill:#808080"
|
||||
id="tspan1">Powered by</tspan></tspan></text><g
|
||||
id="g1"
|
||||
transform="matrix(0.51040974,0,0,0.51040974,39.378824,115.13105)"><g
|
||||
id="text3"
|
||||
style="font-size:23.05px;text-align:center;text-anchor:middle;fill:#2bcd95;fill-rule:evenodd;stroke-width:0.864374"
|
||||
aria-label="DPCloudev"
|
||||
transform="translate(-30.476699,-109.96845)"><path
|
||||
style="fill:#ffe900"
|
||||
d="m 89.092595,127.47554 q 0,2.28474 -1.001685,4.1418 -0.990429,1.85706 -2.644897,2.88125 -1.147998,0.70906 -2.566113,1.02419 -1.406861,0.31514 -3.714111,0.31514 H 74.933953 V 119.0794 h 4.186816 q 2.453564,0 3.894189,0.36016 1.45188,0.3489 2.453565,0.96792 1.710742,1.06921 2.667407,2.84748 0.956665,1.77827 0.956665,4.22058 z m -2.329761,-0.0338 q 0,-1.96961 -0.686548,-3.32019 -0.686547,-1.35059 -2.048388,-2.12717 -0.99043,-0.56275 -2.104663,-0.77659 -1.114234,-0.2251 -2.667407,-0.2251 H 77.16242 v 12.93186 h 2.093408 q 1.609448,0 2.802465,-0.23635 1.204273,-0.23635 2.205957,-0.87788 1.249292,-0.7991 1.868311,-2.10467 0.630273,-1.30556 0.630273,-3.26391 z"
|
||||
id="path22" /><path
|
||||
style="fill:#ff7e00"
|
||||
d="m 103.65641,124.1441 q 0,1.11423 -0.39392,2.0709 -0.38266,0.94541 -1.08047,1.64321 -0.86662,0.86663 -2.04839,1.30557 -1.181758,0.42768 -2.982539,0.42768 h -2.228467 v 6.24646 H 92.694157 V 119.0794 h 4.546973 q 1.508154,0 2.554858,0.25886 1.046702,0.24761 1.857052,0.78785 0.95667,0.64152 1.47439,1.59819 0.52898,0.95666 0.52898,2.4198 z m -2.3185,0.0563 q 0,-0.86662 -0.30389,-1.50815 -0.30388,-0.64153 -0.9229,-1.04671 -0.54023,-0.3489 -1.238032,-0.49521 -0.686548,-0.15757 -1.744507,-0.15757 h -2.205957 v 6.69666 h 1.879565 q 1.350586,0 2.194702,-0.23636 0.844116,-0.2476 1.373099,-0.77658 0.52898,-0.54024 0.74282,-1.13675 0.2251,-0.59651 0.2251,-1.33933 z"
|
||||
id="path23" /><path
|
||||
style="fill:#0096ff"
|
||||
d="m 119.53705,134.62239 q -0.61902,0.27012 -1.12549,0.50647 -0.49521,0.23636 -1.30556,0.49522 -0.68655,0.21384 -1.4969,0.36015 -0.7991,0.15757 -1.76702,0.15757 -1.82329,0 -3.32019,-0.50647 -1.48564,-0.51772 -2.58862,-1.60944 -1.08047,-1.06922 -1.68823,-2.71243 -0.60777,-1.65447 -0.60777,-3.83792 0,-2.07089 0.58526,-3.70285 0.58525,-1.63196 1.68823,-2.75745 1.06921,-1.09172 2.57737,-1.66572 1.51941,-0.574 3.36521,-0.574 1.35058,0 2.68991,0.32639 1.35059,0.32639 2.9938,1.148 v 2.6449 h -0.16882 q -1.38435,-1.15926 -2.74619,-1.68824 -1.36184,-0.52898 -2.91502,-0.52898 -1.2718,0 -2.29599,0.41644 -1.01294,0.40517 -1.81204,1.2718 -0.77659,0.84411 -1.21553,2.13842 -0.42768,1.28306 -0.42768,2.97129 0,1.76702 0.4727,3.03882 0.48396,1.2718 1.23804,2.0709 0.78784,0.83286 1.83455,1.23804 1.05796,0.39392 2.22846,0.39392 1.60945,0 3.01631,-0.55149 1.40686,-0.55149 2.63364,-1.65447 h 0.15757 z m 5.12097,1.21553 h -2.11591 v -17.5126 h 2.11591 z m 14.90147,-6.28022 q 0,3.07258 -1.57568,4.85085 -1.57569,1.77827 -4.22058,1.77827 -2.66741,0 -4.2431,-1.77827 -1.56442,-1.77827 -1.56442,-4.85085 0,-3.07259 1.56442,-4.85086 1.57569,-1.78952 4.2431,-1.78952 2.64489,0 4.22058,1.78952 1.57568,1.77827 1.57568,4.85086 z m -2.18345,0 q 0,-2.44231 -0.95666,-3.62408 -0.95667,-1.19301 -2.65615,-1.19301 -1.722,0 -2.67867,1.19301 -0.94541,1.18177 -0.94541,3.62408 0,2.36352 0.95667,3.5903 0.95666,1.21553 2.66741,1.21553 1.68823,0 2.64489,-1.20427 0.96792,-1.21553 0.96792,-3.60156 z m 15.88064,6.28022 h -2.11592 v -1.3956 q -1.06921,0.84411 -2.04839,1.29431 -0.97917,0.45019 -2.16094,0.45019 -1.98086,0 -3.08383,-1.20427 -1.10298,-1.21553 -1.10298,-3.55654 v -8.15979 h 2.11592 v 7.1581 q 0,0.95667 0.09,1.64322 0.09,0.67529 0.38267,1.15925 0.30388,0.49521 0.78784,0.72031 0.48396,0.2251 1.40686,0.2251 0.82161,0 1.78953,-0.42769 0.97917,-0.42768 1.82329,-1.09172 v -9.38657 h 2.11592 z m 14.36123,0 h -2.11592 v -1.31682 q -0.91165,0.78784 -1.90208,1.22678 -0.99043,0.43894 -2.14968,0.43894 -2.25098,0 -3.57905,-1.73325 -1.31682,-1.73325 -1.31682,-4.80583 0,-1.5982 0.45019,-2.84749 0.46145,-1.24929 1.23804,-2.12717 0.76533,-0.85537 1.77827,-1.30557 1.02419,-0.45019 2.11592,-0.45019 0.99043,0 1.75576,0.21384 0.76533,0.20259 1.60945,0.64153 v -5.44737 h 2.11592 z m -2.11592,-3.09509 v -7.21438 q -0.85537,-0.38267 -1.53067,-0.52898 -0.67529,-0.14631 -1.47439,-0.14631 -1.77827,0 -2.7687,1.23803 -0.99043,1.23804 -0.99043,3.51153 0,2.23972 0.76534,3.41023 0.76533,1.15925 2.45356,1.15925 0.90039,0 1.82329,-0.39392 0.9229,-0.40518 1.722,-1.03545 z"
|
||||
id="path24" /><path
|
||||
style="fill:#36ff00"
|
||||
d="m 182.30553,129.77154 h -9.26276 q 0,1.15925 0.3489,2.02588 0.3489,0.85537 0.95666,1.40686 0.58526,0.54023 1.38435,0.81035 0.81035,0.27012 1.77827,0.27012 1.28306,0 2.57737,-0.50647 1.30557,-0.51773 1.85706,-1.01294 h 0.11255 v 2.30725 q -1.06922,0.45019 -2.18345,0.75408 -1.11423,0.30388 -2.34102,0.30388 -3.12885,0 -4.88461,-1.68823 -1.75577,-1.69949 -1.75577,-4.81709 0,-3.08384 1.67698,-4.89588 1.68823,-1.81203 4.43442,-1.81203 2.54361,0 3.9167,1.48564 1.38435,1.48565 1.38435,4.22058 z m -2.05964,-1.6207 q -0.0112,-1.66573 -0.84412,-2.57737 -0.8216,-0.91165 -2.50983,-0.91165 -1.69949,0 -2.71243,1.00169 -1.00169,1.00168 -1.13674,2.48733 z m 16.1395,-4.88462 -5.0872,12.5717 h -2.12718 l -5.05344,-12.5717 h 2.296 l 3.89419,10.00559 3.86042,-10.00559 z"
|
||||
id="path25" /></g></g></g>
|
||||
</svg>
|
||||
</div>
|
||||
<style>
|
||||
.loader {
|
||||
width: 90px;
|
||||
height: 14px;
|
||||
box-shadow: 0 3px 0 #fff;
|
||||
position: relative;
|
||||
clip-path: inset(-40px 0 -5px)
|
||||
}
|
||||
.loader:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: auto calc(50% - 17px) 0;
|
||||
height: 50px;
|
||||
--g:no-repeat linear-gradient(#ccc 0 0);
|
||||
background: var(--g),var(--g),var(--g),var(--g);
|
||||
background-size: 16px 14px;
|
||||
animation:
|
||||
l7-1 2s infinite linear,
|
||||
l7-2 2s infinite linear;
|
||||
}
|
||||
@keyframes l7-1 {
|
||||
0%,
|
||||
100% {background-position: 0 -50px,100% -50px}
|
||||
17.5% {background-position: 0 100%,100% -50px,0 -50px,100% -50px}
|
||||
35% {background-position: 0 100%,100% 100% ,0 -50px,100% -50px}
|
||||
52.5% {background-position: 0 100%,100% 100% ,0 calc(100% - 16px),100% -50px}
|
||||
70%,
|
||||
98% {background-position: 0 100%,100% 100% ,0 calc(100% - 16px),100% calc(100% - 16px)}
|
||||
}
|
||||
@keyframes l7-2 {
|
||||
0%,70% {transform:translate(0)}
|
||||
100% {transform:translate(200%)}
|
||||
}
|
||||
|
||||
.dpclogoload {
|
||||
position: fixed;
|
||||
justify-content: center; /* Center horizontally */
|
||||
bottom: 30px; /* Adjust as necessary */
|
||||
z-index: 20; /* Ensure it appears above other content */
|
||||
}
|
||||
</style>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
@ -3223,7 +3223,7 @@ input:checked + .toggleSwitchSlider:before {
|
||||
}
|
||||
|
||||
/* Icon which displays the status of the mojang services. */
|
||||
#mojang_status_icon {
|
||||
#mojang_status_icon, #DPCloudev_status_icon {
|
||||
font-size: 30px;
|
||||
color: #848484;
|
||||
margin-left: 15px;
|
||||
@ -3571,6 +3571,16 @@ input:checked + .toggleSwitchSlider:before {
|
||||
-webkit-user-select: initial;
|
||||
}
|
||||
|
||||
#overlayDetail {
|
||||
width: 100%;
|
||||
height: 100px; /* Adjust height as needed */
|
||||
padding: 10px;
|
||||
font-size: 14px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
|
||||
/* Div which contains action buttons. */
|
||||
#overlayActionContainer {
|
||||
display: flex;
|
||||
|
@ -167,6 +167,57 @@ exports.addMojangAccount = async function(username, password) {
|
||||
}
|
||||
}
|
||||
|
||||
const axios = require('axios');
|
||||
|
||||
exports.addDPCloudevAccount = async function(username, password) {
|
||||
try {
|
||||
const response = await axios.post('https://api.damp11113.xyz/account/v3/login', {
|
||||
username: username,
|
||||
password: password
|
||||
}, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
console.log(response.data);
|
||||
|
||||
if (response.data && response.data.session) {
|
||||
const responseinfo = await axios.post('https://api.damp11113.xyz/account/v3/info', {
|
||||
clientToken: response.data.clientToken,
|
||||
}, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
console.log(responseinfo.data);
|
||||
|
||||
const ret = ConfigManager.addDPCloudevAuthAccount(
|
||||
responseinfo.data.uuid,
|
||||
response.data.session,
|
||||
username,
|
||||
responseinfo.data.username
|
||||
);
|
||||
|
||||
if (ConfigManager.getClientToken() == null) {
|
||||
ConfigManager.setClientToken(response.data.clientToken);
|
||||
}
|
||||
ConfigManager.save();
|
||||
return ret;
|
||||
|
||||
} else {
|
||||
return Promise.reject(mojangErrorDisplayable(response.data.error || MojangErrorCode.UNKNOWN));
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
return Promise.reject(mojangErrorDisplayable(MojangErrorCode.UNKNOWN));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
const AUTH_MODE = { FULL: 0, MS_REFRESH: 1, MC_REFRESH: 2 }
|
||||
|
||||
/**
|
||||
@ -291,6 +342,34 @@ exports.removeMojangAccount = async function(uuid){
|
||||
}
|
||||
}
|
||||
|
||||
exports.removeDPCloudevAccount = async function(uuid){
|
||||
try {
|
||||
const authAcc = ConfigManager.getAuthAccount(uuid)
|
||||
console.log(authAcc.accessToken)
|
||||
console.log(ConfigManager.getClientToken())
|
||||
const response = await axios.post('https://api.damp11113.xyz/account/v3/logout', {
|
||||
session: authAcc.accessToken,
|
||||
clientToken: ConfigManager.getClientToken()
|
||||
}, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status === 200) {
|
||||
ConfigManager.removeAuthAccount(uuid)
|
||||
ConfigManager.save()
|
||||
return Promise.resolve()
|
||||
} else {
|
||||
log.error('Error while removing account', response.error)
|
||||
return Promise.reject(response.error)
|
||||
}
|
||||
} catch (err){
|
||||
log.error('Error while removing account', err)
|
||||
return Promise.reject(err)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a Microsoft account. It is expected that the caller will invoke the OAuth logout
|
||||
* through the ipc renderer.
|
||||
|
@ -5,11 +5,12 @@ const path = require('path')
|
||||
|
||||
const logger = LoggerUtil.getLogger('ConfigManager')
|
||||
|
||||
const sysRoot = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME)
|
||||
|
||||
const dataPath = path.join(sysRoot, '.helioslauncher')
|
||||
|
||||
// Use Electron's 'userData' path directly for dataPath
|
||||
const launcherDir = require('@electron/remote').app.getPath('userData')
|
||||
const dataPath = path.join(launcherDir, '.minecraft')
|
||||
|
||||
logger.info('Data path is set to:', dataPath)
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve the absolute path of the launcher directory.
|
||||
@ -349,6 +350,18 @@ exports.addMojangAuthAccount = function(uuid, accessToken, username, displayName
|
||||
return config.authenticationDatabase[uuid]
|
||||
}
|
||||
|
||||
exports.addDPCloudevAuthAccount = function(uuid, accessToken, username, displayName){
|
||||
config.selectedAccount = uuid
|
||||
config.authenticationDatabase[uuid] = {
|
||||
type: 'dpcloudev',
|
||||
accessToken,
|
||||
username: username.trim(),
|
||||
uuid: uuid.trim(),
|
||||
displayName: displayName.trim()
|
||||
}
|
||||
return config.authenticationDatabase[uuid]
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the tokens of an authenticated microsoft account.
|
||||
*
|
||||
|
@ -4,7 +4,8 @@ const ConfigManager = require('./configmanager')
|
||||
|
||||
// Old WesterosCraft url.
|
||||
// exports.REMOTE_DISTRO_URL = 'http://mc.westeroscraft.com/WesterosCraftLauncher/distribution.json'
|
||||
exports.REMOTE_DISTRO_URL = 'https://helios-files.geekcorner.eu.org/distribution.json'
|
||||
// exports.REMOTE_DISTRO_URL = 'https://helios-files.geekcorner.eu.org/distribution.json'
|
||||
exports.REMOTE_DISTRO_URL = 'http://127.0.0.1:5500/distro.json' // for development only with vscode live share
|
||||
|
||||
const api = new DistributionAPI(
|
||||
ConfigManager.getLauncherDirectory(),
|
||||
@ -14,4 +15,5 @@ const api = new DistributionAPI(
|
||||
false
|
||||
)
|
||||
|
||||
|
||||
exports.DistroAPI = api
|
@ -35,6 +35,7 @@ exports.queryEJS = function(id, placeHolders){
|
||||
exports.setupLanguage = function(){
|
||||
// Load Language Files
|
||||
exports.loadLanguage('en_US')
|
||||
//exports.loadLanguage('th_TH')
|
||||
// Uncomment this when translations are ready
|
||||
//exports.loadLanguage('xx_XX')
|
||||
|
||||
|
@ -23,7 +23,8 @@ const logger = LoggerUtil.getLogger('ProcessBuilder')
|
||||
*/
|
||||
class ProcessBuilder {
|
||||
|
||||
constructor(distroServer, vanillaManifest, modManifest, authUser, launcherVersion){
|
||||
constructor(distroServer, vanillaManifest, modManifest, authUser, launcherVersion) {
|
||||
console.log(distroServer)
|
||||
this.gameDir = path.join(ConfigManager.getInstanceDirectory(), distroServer.rawServer.id)
|
||||
this.commonDir = ConfigManager.getCommonDirectory()
|
||||
this.server = distroServer
|
||||
@ -368,7 +369,7 @@ class ProcessBuilder {
|
||||
|
||||
// Java Arguments
|
||||
if(process.platform === 'darwin'){
|
||||
args.push('-Xdock:name=HeliosLauncher')
|
||||
args.push('-Xdock:name=DMBLauncher')
|
||||
args.push('-Xdock:icon=' + path.join(__dirname, '..', 'images', 'minecraft.icns'))
|
||||
}
|
||||
args.push('-Xmx' + ConfigManager.getMaxRAM(this.server.rawServer.id))
|
||||
@ -419,7 +420,7 @@ class ProcessBuilder {
|
||||
|
||||
// Java Arguments
|
||||
if(process.platform === 'darwin'){
|
||||
args.push('-Xdock:name=HeliosLauncher')
|
||||
args.push('-Xdock:name=DMBLauncher')
|
||||
args.push('-Xdock:icon=' + path.join(__dirname, '..', 'images', 'minecraft.icns'))
|
||||
}
|
||||
args.push('-Xmx' + ConfigManager.getMaxRAM(this.server.rawServer.id))
|
||||
|
@ -1,7 +1,12 @@
|
||||
/**
|
||||
/*
|
||||
* Script for landing.ejs
|
||||
*/
|
||||
// Requirements
|
||||
const axios = require('axios');
|
||||
const { exec } = require('child_process');
|
||||
const _ = require('lodash');
|
||||
const fs = require('fs');
|
||||
|
||||
const { URL } = require('url')
|
||||
const {
|
||||
MojangRestAPI,
|
||||
@ -148,8 +153,12 @@ function updateSelectedAccount(authUser){
|
||||
if(authUser.displayName != null){
|
||||
username = authUser.displayName
|
||||
}
|
||||
if(authUser.uuid != null){
|
||||
document.getElementById('avatarContainer').style.backgroundImage = `url('https://mc-heads.net/body/${authUser.uuid}/right')`
|
||||
if (authUser.type != "dpcloudev") {
|
||||
if (authUser.uuid != null){
|
||||
document.getElementById('avatarContainer').style.backgroundImage = `url('https://mc-heads.net/body/${authUser.uuid}/right')`
|
||||
}
|
||||
} else {
|
||||
document.getElementById('avatarContainer').style.backgroundImage = ``
|
||||
}
|
||||
}
|
||||
user_text.innerHTML = username
|
||||
@ -195,7 +204,7 @@ const refreshMojangStatuses = async function(){
|
||||
|
||||
greenCount = 0
|
||||
greyCount = 0
|
||||
|
||||
console.log(statuses)
|
||||
for(let i=0; i<statuses.length; i++){
|
||||
const service = statuses[i]
|
||||
|
||||
@ -235,6 +244,100 @@ const refreshMojangStatuses = async function(){
|
||||
document.getElementById('mojang_status_icon').style.color = MojangRestAPI.statusToHex(status)
|
||||
}
|
||||
|
||||
const DPCloudevstatusToHex = function(status) {
|
||||
switch (status) {
|
||||
case 'green':
|
||||
return '#00FF00'; // Green
|
||||
case 'yellow':
|
||||
return '#FFFF00'; // Yellow
|
||||
case 'red':
|
||||
return '#FF0000'; // Red
|
||||
case 'grey':
|
||||
return '#808080'; // Grey
|
||||
default:
|
||||
return '#000000'; // Default to black for unknown statuses
|
||||
}
|
||||
}
|
||||
|
||||
const DPCloudevgetColorFromStatus = (status) => {
|
||||
switch (status) {
|
||||
case 200:
|
||||
return 'green';
|
||||
case 500:
|
||||
return 'red';
|
||||
case 429: // Example for too many requests
|
||||
case 503: // Example for service unavailable
|
||||
return 'yellow';
|
||||
default:
|
||||
return 'grey'; // Default for unexpected status codes
|
||||
}
|
||||
};
|
||||
|
||||
const refreshDPCloudevStatuses = async function(){
|
||||
loggerLanding.info('Refreshing DPCloudev Statuses..')
|
||||
|
||||
let status = 'grey'
|
||||
let tooltipNonEssentialHTML = ''
|
||||
const servicesToInclude = ['API', 'CDN', 'Dashboard'];
|
||||
|
||||
const response = await axios.get("https://status.damp11113.xyz/")
|
||||
console.log(response)
|
||||
let statuses
|
||||
if (response.status === 200) {
|
||||
// Convert the data into the desired array format, filtering for specific services
|
||||
statuses = servicesToInclude.map(serviceName => ({
|
||||
service: serviceName,
|
||||
status: DPCloudevgetColorFromStatus(response.data.Service[serviceName.toLowerCase()]),
|
||||
name: serviceName // Assuming 'name' is the same as the 'service'
|
||||
}));
|
||||
} else {
|
||||
loggerLanding.warn('Unable to refresh DPCloudev service status.')
|
||||
statuses = [
|
||||
{ "service": "api", "status": "red", "name": "API" },
|
||||
{ "service": "cdn", "status": "red", "name": "CDN" },
|
||||
{ "service": "dashboard", "status": "red", "name": "Dashboard" }
|
||||
]
|
||||
}
|
||||
|
||||
greenCount = 0
|
||||
greyCount = 0
|
||||
|
||||
|
||||
for (let i=0; i<statuses.length; i++){
|
||||
const service = statuses[i]
|
||||
console.log(service)
|
||||
|
||||
const tooltipHTML = `<div class="dpcloudevStatusContainer">
|
||||
<span class="mojangStatusIcon" style="color: ${DPCloudevstatusToHex(service.status)};">•</span>
|
||||
<span class="mojangStatusName">${service.name}</span>
|
||||
</div>`
|
||||
tooltipNonEssentialHTML += tooltipHTML
|
||||
|
||||
if(service.status === 'yellow' && status !== 'red'){
|
||||
status = 'yellow'
|
||||
} else if(service.status === 'red'){
|
||||
status = 'red'
|
||||
} else {
|
||||
if(service.status === 'grey'){
|
||||
++greyCount
|
||||
}
|
||||
++greenCount
|
||||
}
|
||||
}
|
||||
|
||||
if(greenCount === statuses.length){
|
||||
if(greyCount === statuses.length){
|
||||
status = 'grey'
|
||||
} else {
|
||||
status = 'green'
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementById('dpcloudevStatusContainer').innerHTML = tooltipNonEssentialHTML
|
||||
document.getElementById('DPCloudev_status_icon').style.color = MojangRestAPI.statusToHex(status)
|
||||
}
|
||||
|
||||
|
||||
const refreshServerStatus = async (fade = false) => {
|
||||
loggerLanding.info('Refreshing Server Status')
|
||||
const serv = (await DistroAPI.getDistribution()).getServerById(ConfigManager.getSelectedServer())
|
||||
@ -267,10 +370,12 @@ const refreshServerStatus = async (fade = false) => {
|
||||
}
|
||||
|
||||
refreshMojangStatuses()
|
||||
refreshDPCloudevStatuses()
|
||||
// Server Status is refreshed in uibinder.js on distributionIndexDone.
|
||||
|
||||
// Refresh statuses every hour. The status page itself refreshes every day so...
|
||||
let mojangStatusListener = setInterval(() => refreshMojangStatuses(true), 60*60*1000)
|
||||
let DPCloudevStatusListener = setInterval(() => refreshDPCloudevStatuses(true), 60*60*1000)
|
||||
// Set refresh rate to once every 5 minutes.
|
||||
let serverStatusListener = setInterval(() => refreshServerStatus(true), 300000)
|
||||
|
||||
@ -445,6 +550,44 @@ const GAME_JOINED_REGEX = /\[.+\]: Sound engine started/
|
||||
const GAME_LAUNCH_REGEX = /^\[.+\]: (?:MinecraftForge .+ Initialized|ModLauncher .+ starting: .+|Loading Minecraft .+ with Fabric Loader .+)$/
|
||||
const MIN_LINGER = 5000
|
||||
|
||||
function waitForAllow(commandlist) {
|
||||
const overlayDetail = document.getElementById("overlayDetail");
|
||||
overlayDetail.style.display = "block"; // Make the textarea visible
|
||||
overlayDetail.value = ""; // Clear any existing content
|
||||
|
||||
commandlist.forEach((command) => {
|
||||
overlayDetail.value += command + "\n"; // Add each command to a new line in the textarea
|
||||
});
|
||||
|
||||
setOverlayContent(
|
||||
Lang.queryJS('landing.pre_command.warningTitle'),
|
||||
Lang.queryJS('landing.pre_command.warningText'),
|
||||
Lang.queryJS('landing.pre_command.allow'),
|
||||
Lang.queryJS('landing.pre_command.deny')
|
||||
)
|
||||
setOverlayHandler(null);
|
||||
toggleOverlay(true, true, 'overlayContent', true);
|
||||
toggleLaunchArea(false);
|
||||
|
||||
return new Promise((resolve) => {
|
||||
const trueButton = document.getElementById('overlayAcknowledge');
|
||||
const falseButton = document.getElementById('overlayDismiss');
|
||||
|
||||
const handleChoice = (choice) => {
|
||||
resolve(choice);
|
||||
// Remove event listeners after choice is made
|
||||
trueButton.removeEventListener('click', handleTrue);
|
||||
falseButton.removeEventListener('click', handleFalse);
|
||||
};
|
||||
|
||||
const handleTrue = () => handleChoice(true);
|
||||
const handleFalse = () => handleChoice(false);
|
||||
|
||||
trueButton.addEventListener('click', handleTrue);
|
||||
falseButton.addEventListener('click', handleFalse);
|
||||
});
|
||||
}
|
||||
|
||||
async function dlAsync(login = true) {
|
||||
|
||||
// Login parameter is temporary for debug purposes. Allows testing the validation/downloads without
|
||||
@ -473,6 +616,70 @@ async function dlAsync(login = true) {
|
||||
return
|
||||
}
|
||||
}
|
||||
// check if has pre command
|
||||
|
||||
let platform = os.platform()
|
||||
let allow_pre_command;
|
||||
|
||||
let pre_command = serv?.rawServer?.pre_command?.[platform]
|
||||
|
||||
if (pre_command !== undefined) {
|
||||
allow_pre_command = await waitForAllow(pre_command);
|
||||
toggleOverlay(false)
|
||||
} else {
|
||||
allow_pre_command = false;
|
||||
}
|
||||
|
||||
console.log(allow_pre_command);
|
||||
|
||||
if (allow_pre_command) {
|
||||
// Initialize an array to hold the compiled commands
|
||||
const commandsToExecute = [];
|
||||
|
||||
if (platform === "win32") {
|
||||
commandsToExecute.push("@echo off");
|
||||
}
|
||||
|
||||
pre_command.forEach((commandTemplate) => {
|
||||
// Compile the command template
|
||||
const compiled = _.template(commandTemplate);
|
||||
console.log(ConfigManager.launcherDir);
|
||||
const command = compiled({ launcherDir: ConfigManager.getLauncherDirectory() });
|
||||
|
||||
// Push the compiled command to the array
|
||||
commandsToExecute.push(command);
|
||||
});
|
||||
|
||||
commandsToExecute.push("exit");
|
||||
|
||||
// Define a temporary file path
|
||||
let tempFilePath;
|
||||
if (platform === "win32") {
|
||||
tempFilePath = path.join(os.tmpdir(), 'temp_command.bat'); // Windows batch file
|
||||
} else {
|
||||
tempFilePath = path.join(os.tmpdir(), 'temp_command.sh'); // Unix shell script
|
||||
}
|
||||
|
||||
// Create the command file and write all commands into it
|
||||
fs.writeFileSync(tempFilePath, commandsToExecute.join('\n'));
|
||||
|
||||
// Make the file executable on Unix-based systems
|
||||
if (platform === 'linux' || platform === 'darwin') {
|
||||
execSync(`chmod +x ${tempFilePath}`);
|
||||
}
|
||||
|
||||
// Execute the temporary command file based on the OS
|
||||
if (platform === 'win32') {
|
||||
exec(`start cmd.exe /k "${tempFilePath}"`, { stdio: 'inherit' });
|
||||
} else if (platform === 'darwin') {
|
||||
exec(`open -a Terminal "${tempFilePath}"`, { stdio: 'inherit' });
|
||||
} else if (platform === 'linux') {
|
||||
exec(`xterm -e "${tempFilePath}"`, { stdio: 'inherit' });
|
||||
}
|
||||
|
||||
// Optionally, delete the temporary file after execution
|
||||
// fs.unlinkSync(tempFilePath);
|
||||
}
|
||||
|
||||
setLaunchDetails(Lang.queryJS('landing.dlAsync.pleaseWait'))
|
||||
toggleLaunchArea(true)
|
||||
@ -615,6 +822,7 @@ async function dlAsync(login = true) {
|
||||
setLaunchDetails(Lang.queryJS('landing.dlAsync.doneEnjoyServer'))
|
||||
|
||||
// Init Discord Hook
|
||||
|
||||
if(distro.rawDistribution.discord != null && serv.rawServer.discord != null){
|
||||
DiscordWrapper.initRPC(distro.rawDistribution.discord, serv.rawServer.discord)
|
||||
hasRPC = true
|
||||
@ -626,6 +834,7 @@ async function dlAsync(login = true) {
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
} catch(err) {
|
||||
|
||||
loggerLaunchSuite.error('Error during launch', err)
|
||||
@ -936,11 +1145,9 @@ document.addEventListener('keydown', (e) => {
|
||||
*/
|
||||
function displayArticle(articleObject, index){
|
||||
newsArticleTitle.innerHTML = articleObject.title
|
||||
newsArticleTitle.href = articleObject.link
|
||||
newsArticleAuthor.innerHTML = 'by ' + articleObject.author
|
||||
newsArticleDate.innerHTML = articleObject.date
|
||||
newsArticleComments.innerHTML = articleObject.comments
|
||||
newsArticleComments.href = articleObject.commentsLink
|
||||
newsArticleFeedServerIcon.innerHTML = `<img src="${articleObject.feedIcon}" alt="icon of feed server" style="width: 50%; height: auto;">`
|
||||
newsArticleContentScrollable.innerHTML = '<div id="newsArticleContentWrapper"><div class="newsArticleSpacerTop"></div>' + articleObject.content + '<div class="newsArticleSpacerBot"></div></div>'
|
||||
Array.from(newsArticleContentScrollable.getElementsByClassName('bbCodeSpoilerButton')).forEach(v => {
|
||||
v.onclick = () => {
|
||||
@ -956,71 +1163,71 @@ function displayArticle(articleObject, index){
|
||||
* Load news information from the RSS feed specified in the
|
||||
* distribution index.
|
||||
*/
|
||||
async function loadNews(){
|
||||
async function loadNews() {
|
||||
|
||||
const distroData = await DistroAPI.getDistribution()
|
||||
if(!distroData.rawDistribution.rss) {
|
||||
loggerLanding.debug('No RSS feed provided.')
|
||||
return null
|
||||
const distroData = await DistroAPI.getDistribution();
|
||||
if (!distroData.rawDistribution.rcf) {
|
||||
loggerLanding.debug('No RCF feed provided.');
|
||||
return null;
|
||||
}
|
||||
|
||||
const promise = new Promise((resolve, reject) => {
|
||||
|
||||
const newsFeed = distroData.rawDistribution.rss
|
||||
const newsHost = new URL(newsFeed).origin + '/'
|
||||
const newsFeed = distroData.rawDistribution.rcf;
|
||||
$.ajax({
|
||||
url: newsFeed,
|
||||
dataType: 'json', // Specify that we expect JSON data
|
||||
success: (data) => {
|
||||
const items = $(data).find('item')
|
||||
const articles = []
|
||||
const feedInfo = data.info; // General feed info
|
||||
const items = data.feeds; // Content items (array)
|
||||
const articles = [];
|
||||
const feed_server_icon_url = data.image.icon;
|
||||
|
||||
for(let i=0; i<items.length; i++){
|
||||
// JQuery Element
|
||||
const el = $(items[i])
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
const el = items[i];
|
||||
|
||||
// Resolve date.
|
||||
const date = new Date(el.find('pubDate').text()).toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric'})
|
||||
// Resolve date
|
||||
const date = new Date(el.public_date * 1000).toLocaleDateString('en-US', {
|
||||
month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric'
|
||||
});
|
||||
|
||||
// Resolve comments.
|
||||
let comments = el.find('slash\\:comments').text() || '0'
|
||||
comments = comments + ' Comment' + (comments === '1' ? '' : 's')
|
||||
// Resolve comments count if available in insights
|
||||
let comments = el.insights?.comments?.count || '0';
|
||||
comments = comments + ' Comment' + (comments === '1' ? '' : 's');
|
||||
|
||||
// Fix relative links in content.
|
||||
let content = el.find('content\\:encoded').text()
|
||||
let regex = /src="(?!http:\/\/|https:\/\/)(.+?)"/g
|
||||
let matches
|
||||
while((matches = regex.exec(content))){
|
||||
content = content.replace(`"${matches[1]}"`, `"${newsHost + matches[1]}"`)
|
||||
}
|
||||
// Resolve content (if summary is provided in text or HTML)
|
||||
let content = el.summary?.content || "No summary available";
|
||||
|
||||
let link = el.find('link').text()
|
||||
let title = el.find('title').text()
|
||||
let author = el.find('dc\\:creator').text()
|
||||
// Handle images if available (like in RSS feeds)
|
||||
let banner = el.image?.banner || '';
|
||||
let footer = el.image?.footer || '';
|
||||
|
||||
// Generate article.
|
||||
articles.push(
|
||||
{
|
||||
link,
|
||||
title,
|
||||
date,
|
||||
author,
|
||||
content,
|
||||
comments,
|
||||
commentsLink: link + '#comments'
|
||||
}
|
||||
)
|
||||
// Construct article object
|
||||
let article = {
|
||||
title: el.title,
|
||||
date: date,
|
||||
author: el.authors?.[0]?.name || 'Unknown Author',
|
||||
content: content,
|
||||
comments: comments,
|
||||
feedIcon: feed_server_icon_url || '',
|
||||
banner: banner,
|
||||
footer: footer
|
||||
};
|
||||
|
||||
articles.push(article);
|
||||
}
|
||||
|
||||
resolve({
|
||||
articles
|
||||
})
|
||||
});
|
||||
},
|
||||
timeout: 2500
|
||||
}).catch(err => {
|
||||
resolve({
|
||||
articles: null
|
||||
})
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
return await promise
|
||||
return await promise;
|
||||
}
|
||||
|
@ -187,7 +187,7 @@ loginButton.addEventListener('click', () => {
|
||||
// Show loading stuff.
|
||||
loginLoading(true)
|
||||
|
||||
AuthManager.addMojangAccount(loginUsername.value, loginPassword.value).then((value) => {
|
||||
AuthManager.addDPCloudevAccount(loginUsername.value, loginPassword.value).then((value) => {
|
||||
updateSelectedAccount(value)
|
||||
loginButton.innerHTML = loginButton.innerHTML.replace(Lang.queryJS('login.loggingIn'), Lang.queryJS('login.success'))
|
||||
$('.circle-loader').toggleClass('load-complete')
|
||||
|
@ -28,7 +28,7 @@ loginOptionMicrosoft.onclick = (e) => {
|
||||
})
|
||||
}
|
||||
|
||||
loginOptionMojang.onclick = (e) => {
|
||||
loginOptionDPCloudev.onclick = (e) => {
|
||||
switchView(getCurrentView(), VIEWS.login, 500, 500, () => {
|
||||
loginViewOnSuccess = loginOptionsViewOnLoginSuccess
|
||||
loginViewOnCancel = loginOptionsViewOnLoginCancel
|
||||
|
@ -65,7 +65,7 @@ function bindOverlayKeys(state, content, dismissable){
|
||||
* @param {boolean} dismissable Optional. True to show the dismiss option, otherwise false.
|
||||
* @param {string} content Optional. The content div to be shown.
|
||||
*/
|
||||
function toggleOverlay(toggleState, dismissable = false, content = 'overlayContent'){
|
||||
function toggleOverlay(toggleState, dismissable = false, content = 'overlayContent', disdetail=false){
|
||||
if(toggleState == null){
|
||||
toggleState = !document.getElementById('main').hasAttribute('overlay')
|
||||
}
|
||||
@ -85,6 +85,12 @@ function toggleOverlay(toggleState, dismissable = false, content = 'overlayConte
|
||||
} else {
|
||||
$('#overlayDismiss').hide()
|
||||
}
|
||||
if(disdetail){
|
||||
$('#overlayDetail').show()
|
||||
} else {
|
||||
$('#overlayDetail').hide()
|
||||
}
|
||||
|
||||
$('#overlayContainer').fadeIn({
|
||||
duration: 250,
|
||||
start: () => {
|
||||
@ -112,6 +118,12 @@ function toggleOverlay(toggleState, dismissable = false, content = 'overlayConte
|
||||
} else {
|
||||
$('#overlayDismiss').hide()
|
||||
}
|
||||
|
||||
if(disdetail){
|
||||
$('#overlayDetail').show()
|
||||
} else {
|
||||
$('#overlayDetail').hide()
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -519,7 +519,7 @@ function processLogOut(val, isLastAccount){
|
||||
ipcRenderer.send(MSFT_OPCODE.OPEN_LOGOUT, uuid, isLastAccount)
|
||||
})
|
||||
} else {
|
||||
AuthManager.removeMojangAccount(uuid).then(() => {
|
||||
AuthManager.removeDPCloudevAccount(uuid).then(() => {
|
||||
if(!isLastAccount && uuid === prevSelAcc.uuid){
|
||||
const selAcc = ConfigManager.getSelectedAccount()
|
||||
refreshAuthAccountSelected(selAcc.uuid)
|
||||
@ -635,13 +635,19 @@ function populateAuthAccounts(){
|
||||
let microsoftAuthAccountStr = ''
|
||||
let mojangAuthAccountStr = ''
|
||||
|
||||
|
||||
authKeys.forEach((val) => {
|
||||
const acc = authAccounts[val]
|
||||
let skinimage = ``
|
||||
|
||||
if (acc.type != "dpcloudev") {
|
||||
skinimage = `<div class="settingsAuthAccountLeft">
|
||||
<img class="settingsAuthAccountImage" alt="${acc.displayName}" src=https://mc-heads.net/body/${acc.uuid}/60">
|
||||
</div>`
|
||||
}
|
||||
|
||||
const accHtml = `<div class="settingsAuthAccount" uuid="${acc.uuid}">
|
||||
<div class="settingsAuthAccountLeft">
|
||||
<img class="settingsAuthAccountImage" alt="${acc.displayName}" src="https://mc-heads.net/body/${acc.uuid}/60">
|
||||
</div>
|
||||
${skinimage}
|
||||
<div class="settingsAuthAccountRight">
|
||||
<div class="settingsAuthAccountDetails">
|
||||
<div class="settingsAuthAccountDetailPane">
|
||||
|
@ -30,6 +30,7 @@ remote.getCurrentWebContents().on('devtools-opened', () => {
|
||||
console.log('%cThe console is dark and full of terrors.', 'color: white; -webkit-text-stroke: 4px #a02d2a; font-size: 60px; font-weight: bold')
|
||||
console.log('%cIf you\'ve been told to paste something here, you\'re being scammed.', 'font-size: 16px')
|
||||
console.log('%cUnless you know exactly what you\'re doing, close this window.', 'font-size: 16px')
|
||||
console.log("%cCheckout DPSoftware Foundation at dpsoftwarefoundation.org", 'font-size: 16px')
|
||||
})
|
||||
|
||||
// Disable zoom, needed for darwin.
|
||||
|
@ -1,20 +1,20 @@
|
||||
# Custom Language File for Launcher Customizer
|
||||
|
||||
[ejs.app]
|
||||
title = "Helios Launcher"
|
||||
title = "DMB"
|
||||
|
||||
[ejs.landing]
|
||||
mediaGitHubURL = "https://github.com/dscalzi/HeliosLauncher"
|
||||
mediaGitHubURL = "https://damp11113.xyz/"
|
||||
mediaTwitterURL = "#"
|
||||
mediaInstagramURL = "#"
|
||||
mediaYouTubeURL = "#"
|
||||
mediaDiscordURL = "https://discord.gg/zNWUXdt"
|
||||
mediaDiscordURL = "#"
|
||||
|
||||
[ejs.settings]
|
||||
sourceGithubLink = "https://github.com/dscalZi/HeliosLauncher"
|
||||
supportLink = "https://github.com/dscalZi/HeliosLauncher/issues"
|
||||
sourceGithubLink = "https://git.damp11113.xyz/Mirror/unknow-dmb"
|
||||
supportLink = "https://damp11113.xyz/donate"
|
||||
|
||||
[ejs.welcome]
|
||||
welcomeHeader = "WELCOME TO WESTEROSCRAFT"
|
||||
welcomeDescription = "Our mission is to recreate the universe imagined by author George RR Martin in his fantasy series, A Song of Ice and Fire. Through the collaborative effort of thousands of community members, we have sought to create Westeros as accurately and precisely as possible within Minecraft. The world we are creating is yours to explore. Journey from Dorne to Castle Black, and if you aren’t afraid, beyond the Wall itself, but best not delay. As the words of House Stark ominously warn: Winter is Coming."
|
||||
welcomeDescCTA = "You are just a few clicks away from Westeros."
|
||||
welcomeHeader = "Welcome to DMB Project"
|
||||
welcomeDescription = "Hello world!"
|
||||
welcomeDescCTA = "Hello world!"
|
||||
|
@ -20,24 +20,24 @@ newsErrorNoneSpan = "No News"
|
||||
|
||||
[ejs.login]
|
||||
loginCancelText = "Cancel"
|
||||
loginSubheader = "MINECRAFT LOGIN"
|
||||
loginSubheader = "DPCloudev LOGIN"
|
||||
loginEmailError = "* Invalid Value"
|
||||
loginEmailPlaceholder = "EMAIL OR USERNAME"
|
||||
loginEmailPlaceholder = "USERNAME"
|
||||
loginPasswordError = "* Required"
|
||||
loginPasswordPlaceholder = "PASSWORD"
|
||||
loginForgotPasswordLink = "https://minecraft.net/password/forgot/"
|
||||
loginForgotPasswordLink = "https://dashboard.damp11113.xyz/forgotpw"
|
||||
loginForgotPasswordText = "forgot password?"
|
||||
loginRememberMeText = "remember me?"
|
||||
loginButtonText = "LOGIN"
|
||||
loginNeedAccountLink = "https://minecraft.net/store/minecraft-java-edition/"
|
||||
loginNeedAccountLink = "https://dashboard.damp11113.xyz/register"
|
||||
loginNeedAccountText = "Need an Account?"
|
||||
loginPasswordDisclaimer1 = "Your password is sent directly to mojang and never stored."
|
||||
loginPasswordDisclaimer1 = "Your password is sent directly to DPCloudev and never stored."
|
||||
loginPasswordDisclaimer2 = "{appName} is not affiliated with Mojang AB."
|
||||
|
||||
[ejs.loginOptions]
|
||||
loginOptionsTitle = "Login Options"
|
||||
loginWithMicrosoft = "Login with Microsoft"
|
||||
loginWithMojang = "Login with Mojang"
|
||||
loginWithDPCloudev = "Login with DPCloudev (Free user)"
|
||||
cancelButton = "Cancel"
|
||||
|
||||
[ejs.overlay]
|
||||
@ -62,8 +62,8 @@ tabAccountHeaderText = "Account Settings"
|
||||
tabAccountHeaderDesc = "Add new accounts or manage existing ones."
|
||||
microsoftAccount = "Microsoft"
|
||||
addMicrosoftAccount = "+ Add Microsoft Account"
|
||||
mojangAccount = "Mojang"
|
||||
addMojangAccount = "+ Add Mojang Account"
|
||||
DPCloudevAccount = "DPCloudev"
|
||||
addDPCloudevAccount = "+ Add DPCloudev Account"
|
||||
minecraftTabHeaderText = "Minecraft Settings"
|
||||
minecraftTabHeaderDesc = "Options related to game launch."
|
||||
gameResolutionTitle = "Game Resolution"
|
||||
@ -155,9 +155,15 @@ desc = "An unknown error has occurred. Please see the console for details."
|
||||
[js.landing.launch]
|
||||
pleaseWait = "Please wait.."
|
||||
failureTitle = "Error During Launch"
|
||||
failureText = "See console (CTRL + Shift + i) for more details."
|
||||
failureText = "Please contact to support at damp11113.xyz/support"
|
||||
okay = "Okay"
|
||||
|
||||
[js.landing.pre_command]
|
||||
warningTitle = "Warning: Command Execution Required"
|
||||
warningText = "Please ensure that the command you are about to execute is safe and expected. Unrecognized commands may pose a security risk."
|
||||
allow = "Allow"
|
||||
deny = "Deny"
|
||||
|
||||
[js.landing.selectedAccount]
|
||||
noAccountSelected = "No Account Selected"
|
||||
|
||||
|
349
app/assets/lang/th_TH.toml
Normal file
349
app/assets/lang/th_TH.toml
Normal file
@ -0,0 +1,349 @@
|
||||
[ejs.landing]
|
||||
updateAvailableTooltip = "มีการอัปเดต"
|
||||
usernamePlaceholder = "ชื่อผู้ใช้"
|
||||
usernameEditButton = "แก้ไข"
|
||||
settingsTooltip = "การตั้งค่า"
|
||||
serverStatus = "สถานะเซิร์ฟเวอร์"
|
||||
serverStatusPlaceholder = "ออฟไลน์"
|
||||
mojangStatus = "สถานะ MOJANG"
|
||||
mojangStatusTooltipTitle = "บริการ"
|
||||
mojangStatusNETitle = "ไม่ สำคัญ"
|
||||
newsButton = "ข่าว"
|
||||
launchButton = "เล่น"
|
||||
launchButtonPlaceholder = "• ไม่มีเซิร์ฟเวอร์ที่เลือก"
|
||||
launchDetails = "กรุณารอ.."
|
||||
newsNavigationStatus = "{currentPage} จาก {totalPages}"
|
||||
newsErrorLoadSpan = "กำลังตรวจสอบข่าว.."
|
||||
newsErrorFailedSpan = "ไม่สามารถโหลดข่าวได้"
|
||||
newsErrorRetryButton = "ลองอีกครั้ง"
|
||||
newsErrorNoneSpan = "ไม่มีข่าว"
|
||||
|
||||
[ejs.login]
|
||||
loginCancelText = "ยกเลิก"
|
||||
loginSubheader = "DPCloudev LOGIN"
|
||||
loginEmailError = "* ค่าที่ไม่ถูกต้อง"
|
||||
loginEmailPlaceholder = "ชื่อผู้ใช้"
|
||||
loginPasswordError = "* จำเป็น"
|
||||
loginPasswordPlaceholder = "รหัสผ่าน"
|
||||
loginForgotPasswordLink = "https://dashboard.damp11113.xyz/forgotpw"
|
||||
loginForgotPasswordText = "ลืมรหัสผ่าน?"
|
||||
loginRememberMeText = "จำฉันไว้?"
|
||||
loginButtonText = "เข้าสู่ระบบ"
|
||||
loginNeedAccountLink = "https://dashboard.damp11113.xyz/register"
|
||||
loginNeedAccountText = "ต้องการบัญชี?"
|
||||
loginPasswordDisclaimer1 = "รหัสผ่านของคุณจะถูกส่งไปยัง DPCloudev โดยตรงและไม่ถูกเก็บไว้."
|
||||
loginPasswordDisclaimer2 = "{appName} ไม่มีความเกี่ยวข้องกับ Mojang AB."
|
||||
|
||||
[ejs.loginOptions]
|
||||
loginOptionsTitle = "ตัวเลือกการเข้าสู่ระบบ"
|
||||
loginWithMicrosoft = "เข้าสู่ระบบด้วย Microsoft"
|
||||
loginWithDPCloudev = "เข้าสู่ระบบด้วย DPCloudev (ผู้ใช้ฟรี)"
|
||||
cancelButton = "ยกเลิก"
|
||||
|
||||
[ejs.overlay]
|
||||
serverSelectHeader = "เซิร์ฟเวอร์ที่มีอยู่"
|
||||
serverSelectConfirm = "เลือก"
|
||||
serverSelectCancel = "ยกเลิก"
|
||||
accountSelectHeader = "เลือกบัญชี"
|
||||
accountSelectConfirm = "เลือก"
|
||||
accountSelectCancel = "ยกเลิก"
|
||||
|
||||
[ejs.settings]
|
||||
navHeaderText = "การตั้งค่า"
|
||||
navAccount = "บัญชี"
|
||||
navMinecraft = "Minecraft"
|
||||
navMods = "มอด"
|
||||
navJava = "Java"
|
||||
navLauncher = "ตัวโหลด"
|
||||
navAbout = "เกี่ยวกับ"
|
||||
navUpdates = "การอัปเดต"
|
||||
navDone = "เสร็จสิ้น"
|
||||
tabAccountHeaderText = "การตั้งค่าบัญชี"
|
||||
tabAccountHeaderDesc = "เพิ่มบัญชีใหม่หรือจัดการบัญชีที่มีอยู่."
|
||||
microsoftAccount = "Microsoft"
|
||||
addMicrosoftAccount = "+ เพิ่มบัญชี Microsoft"
|
||||
DPCloudevAccount = "DPCloudev"
|
||||
addDPCloudevAccount = "+ เพิ่มบัญชี DPCloudev"
|
||||
minecraftTabHeaderText = "การตั้งค่า Minecraft"
|
||||
minecraftTabHeaderDesc = "ตัวเลือกที่เกี่ยวข้องกับการเปิดเกม."
|
||||
gameResolutionTitle = "ความละเอียดเกม"
|
||||
launchFullscreenTitle = "เปิดในโหมดเต็มหน้าจอ."
|
||||
autoConnectTitle = "เชื่อมต่อกับเซิร์ฟเวอร์โดยอัตโนมัติเมื่อเปิดเกม."
|
||||
launchDetachedTitle = "เปิดเกมแยกจากตัวโหลด."
|
||||
launchDetachedDesc = "หากเกมไม่แยก การปิดตัวโหลดจะปิดเกมด้วย."
|
||||
tabModsHeaderText = "การตั้งค่ามอด"
|
||||
tabModsHeaderDesc = "เปิดหรือปิดมอด."
|
||||
switchServerButton = "สลับ"
|
||||
requiredMods = "มอดที่จำเป็น"
|
||||
optionalMods = "มอดที่ไม่จำเป็น"
|
||||
dropinMods = "มอดที่ใส่ได้"
|
||||
addMods = "เพิ่มมอด"
|
||||
dropinRefreshNote = "(F5 เพื่อรีเฟรช)"
|
||||
shaderpacks = "แพ็คเชเดอร์"
|
||||
shaderpackDesc = "เปิดหรือปิดการใช้เชเดอร์ โปรดทราบว่าการใช้เชเดอร์จะทำงานได้ดีเฉพาะบนการตั้งค่าที่มีประสิทธิภาพสูง คุณสามารถเพิ่มแพ็คที่กำหนดเองที่นี่."
|
||||
selectShaderpack = "เลือกแพ็คเชเดอร์"
|
||||
tabJavaHeaderText = "การตั้งค่า Java"
|
||||
tabJavaHeaderDesc = "จัดการการกำหนดค่าของ Java (ขั้นสูง)."
|
||||
memoryTitle = "หน่วยความจำ"
|
||||
maxRAM = "RAM สูงสุด"
|
||||
minRAM = "RAM ขั้นต่ำ"
|
||||
memoryDesc = "RAM ขั้นต่ำที่แนะนำคือ 3 กิกะไบต์ การตั้งค่าให้มีค่าเท่ากันสำหรับค่าขั้นต่ำและสูงสุดอาจทำให้เกิดการหน่วง."
|
||||
memoryTotalTitle = "ทั้งหมด"
|
||||
memoryAvailableTitle = "ที่มีอยู่"
|
||||
javaExecutableTitle = "ไฟล์ปฏิบัติการ Java"
|
||||
javaExecSelDialogTitle = "เลือกไฟล์ปฏิบัติการ Java"
|
||||
javaExecSelButtonText = "เลือกไฟล์"
|
||||
javaExecDesc = "ไฟล์ปฏิบัติการ Java จะถูกตรวจสอบก่อนเปิดเกม."
|
||||
javaPathDesc = "เส้นทางควรสิ้นสุดด้วย <strong>{pathSuffix}</strong>."
|
||||
jvmOptsTitle = "ตัวเลือก JVM เพิ่มเติม"
|
||||
jvmOptsDesc = "ตัวเลือกที่จะถูกส่งให้กับ JVM ในขณะทำงาน <em>-Xms</em> และ <em>-Xmx</em> ไม่ควรรวมอยู่ด้วย."
|
||||
launcherTabHeaderText = "การตั้งค่าตัวโหลด"
|
||||
launcherTabHeaderDesc = "ตัวเลือกที่เกี่ยวข้องกับตัวโหลดเอง."
|
||||
allowPrereleaseTitle = "อนุญาตการอัปเดตเวอร์ชันทดสอบ."
|
||||
allowPrereleaseDesc = "เวอร์ชันทดสอบรวมฟีเจอร์ใหม่ที่อาจยังไม่ได้ทดสอบหรือรวมเข้าด้วยกัน.<br>สิ่งนี้จะเป็นจริงเสมอหากคุณใช้เวอร์ชันทดสอบ."
|
||||
dataDirectoryTitle = "ไดเรกทอรีข้อมูล"
|
||||
selectDataDirectory = "เลือกไดเรกทอรีข้อมูล"
|
||||
chooseFolder = "เลือกโฟลเดอร์"
|
||||
dataDirectoryDesc = "ไฟล์เกมและการติดตั้ง Java ในท้องถิ่นทั้งหมดจะถูกเก็บไว้ในไดเรกทอรีข้อมูล.<br>ภาพหน้าจอและการบันทึกโลกจะถูกเก็บไว้ในโฟลเดอร์อินสแตนซ์สำหรับการกำหนดค่าเซิร์ฟเวอร์ที่เกี่ยวข้อง."
|
||||
aboutTabHeaderText = "เกี่ยวกับ"
|
||||
aboutTabHeaderDesc = "ดูข้อมูลและบันทึกการปล่อยสำหรับเวอร์ชันปัจจุบัน."
|
||||
aboutTitle = "{appName}"
|
||||
stableRelease = "การปล่อยที่เสถียร"
|
||||
versionText = "เวอร์ชัน "
|
||||
sourceGithub = "แหล่งที่มา (GitHub)"
|
||||
support = "สนับสนุน"
|
||||
devToolsConsole = "คอนโซล DevTools"
|
||||
releaseNotes = "บันทึกการปล่อย"
|
||||
changelog = "การเปลี่ยนแปลง"
|
||||
noReleaseNotes = "ไม่มีบันทึกการปล่อย"
|
||||
viewReleaseNotes = "ดูบันทึกการปล่อยบน GitHub"
|
||||
launcherUpdatesHeaderText = "การอัปเดตตัวโหลด"
|
||||
launcherUpdatesHeaderDesc = "ดาวน์โหลด ติดตั้ง และตรวจสอบการอัปเดตสำหรับตัวโหลด."
|
||||
checkForUpdates = "ตรวจสอบการอัปเดต"
|
||||
whatsNew = "มีอะไรใหม่"
|
||||
updateReleaseNotes = "บันทึกการปล่อยการอัปเดต"
|
||||
|
||||
[ejs.waiting]
|
||||
waitingText = "รอ Microsoft.."
|
||||
|
||||
[ejs.welcome]
|
||||
continueButton = "ดำเนินการต่อ"
|
||||
|
||||
[js.discord]
|
||||
waiting = "รอ Client.."
|
||||
state = "เซิร์ฟเวอร์: {shortId}"
|
||||
|
||||
[js.index]
|
||||
microsoftLoginTitle = "เข้าสู่ระบบ Microsoft"
|
||||
microsoftLogoutTitle = "ออกจากระบบ Microsoft"
|
||||
|
||||
[js.login]
|
||||
login = "เข้าสู่ระบบ"
|
||||
loggingIn = "กำลังเข้าสู่ระบบ"
|
||||
success = "สำเร็จ"
|
||||
tryAgain = "ลองอีกครั้ง"
|
||||
|
||||
[js.login.error]
|
||||
invalidValue = "* ค่าที่ไม่ถูกต้อง"
|
||||
requiredValue = "* ต้องระบุ"
|
||||
|
||||
[js.login.error.unknown]
|
||||
title = "ข้อผิดพลาดที่ไม่ทราบระหว่างการเข้าสู่ระบบ"
|
||||
desc = "เกิดข้อผิดพลาดที่ไม่ทราบ สอบถามรายละเอียดในคอนโซล"
|
||||
|
||||
[js.landing.launch]
|
||||
pleaseWait = "กรุณารอสักครู่.."
|
||||
failureTitle = "ข้อผิดพลาดระหว่างการเปิด"
|
||||
failureText = "ดูคอนโซล (CTRL + Shift + i) เพื่อดูรายละเอียดเพิ่มเติม"
|
||||
okay = "ตกลง"
|
||||
|
||||
[js.landing.pre_command]
|
||||
warningTitle = "คำเตือน: ต้องดำเนินการคำสั่ง"
|
||||
warningText = "โปรดตรวจสอบให้แน่ใจว่าคำสั่งที่คุณกำลังจะดำเนินการนั้นปลอดภัยและเป็นที่คาดหวัง คำสั่งที่ไม่รู้จักอาจก่อให้เกิดความเสี่ยงด้านความปลอดภัย"
|
||||
allow = "อนุญาต"
|
||||
deny = "ปฏิเสธ"
|
||||
|
||||
[js.landing.selectedAccount]
|
||||
noAccountSelected = "ยังไม่มีบัญชีที่เลือก"
|
||||
|
||||
[js.landing.selectedServer]
|
||||
noSelection = "ยังไม่มีเซิร์ฟเวอร์ที่เลือก"
|
||||
loading = "กำลังโหลด.."
|
||||
|
||||
[js.landing.serverStatus]
|
||||
server = "เซิร์ฟเวอร์"
|
||||
offline = "ออฟไลน์"
|
||||
players = "ผู้เล่น"
|
||||
|
||||
[js.landing.systemScan]
|
||||
checking = "กำลังตรวจสอบข้อมูลระบบ.."
|
||||
noCompatibleJava = "ไม่พบ<br>การติดตั้ง Java ที่เข้ากันได้"
|
||||
installJavaMessage = "ในการเปิด Minecraft คุณต้องมีการติดตั้ง Java 64-bit เวอร์ชัน {major} คุณต้องการให้เราติดตั้งสำเนาไหม?"
|
||||
installJava = "ติดตั้ง Java"
|
||||
installJavaManually = "ติดตั้งด้วยตนเอง"
|
||||
javaDownloadPrepare = "กำลังเตรียมการดาวน์โหลด Java.."
|
||||
javaDownloadFailureTitle = "ข้อผิดพลาดระหว่างดาวน์โหลด Java"
|
||||
javaDownloadFailureText = "ดูคอนโซล (CTRL + Shift + i) เพื่อดูรายละเอียดเพิ่มเติม"
|
||||
javaRequired = "Java จำเป็น<br>ในการเปิด"
|
||||
javaRequiredMessage = 'การติดตั้ง x64 ของ Java {major} ที่ถูกต้องจำเป็นในการเปิด<br><br>โปรดดู <a href="https://github.com/dscalzi/HeliosLauncher/wiki/Java-Management#manually-installing-a-valid-version-of-java">คู่มือการจัดการ Java</a> ของเราสำหรับคำแนะนำเกี่ยวกับการติดตั้ง Java ด้วยตนเอง'
|
||||
javaRequiredDismiss = "ฉันเข้าใจ"
|
||||
javaRequiredCancel = "กลับไป"
|
||||
|
||||
[js.landing.downloadJava]
|
||||
findJdkFailure = "ไม่สามารถค้นหา OpenJDK distribution ได้"
|
||||
javaDownloadCorruptedError = "JDK ที่ดาวน์โหลดมีแฮชไม่ถูกต้อง ไฟล์อาจเสียหาย"
|
||||
extractingJava = "กำลังแตกไฟล์ Java"
|
||||
javaInstalled = "ติดตั้ง Java เสร็จสิ้น!"
|
||||
|
||||
[js.landing.dlAsync]
|
||||
loadingServerInfo = "กำลังโหลดข้อมูลเซิร์ฟเวอร์.."
|
||||
fatalError = "ข้อผิดพลาดร้ายแรง"
|
||||
unableToLoadDistributionIndex = "ไม่สามารถโหลดสำเนาของดัชนีการจัดจำหน่ายได้ ดูในคอนโซล (CTRL + Shift + i) สำหรับรายละเอียดเพิ่มเติม"
|
||||
pleaseWait = "กรุณารอสักครู่.."
|
||||
errorDuringLaunchTitle = "ข้อผิดพลาดระหว่างการเปิด"
|
||||
seeConsoleForDetails = "ดูคอนโซล (CTRL + Shift + i) สำหรับรายละเอียดเพิ่มเติม"
|
||||
validatingFileIntegrity = "กำลังตรวจสอบความสมบูรณ์ของไฟล์.."
|
||||
errorDuringFileVerificationTitle = "ข้อผิดพลาดระหว่างการตรวจสอบไฟล์"
|
||||
downloadingFiles = "กำลังดาวน์โหลดไฟล์.."
|
||||
errorDuringFileDownloadTitle = "ข้อผิดพลาดระหว่างดาวน์โหลดไฟล์"
|
||||
preparingToLaunch = "กำลังเตรียมเปิด.."
|
||||
launchingGame = "กำลังเปิดเกม.."
|
||||
launchWrapperNotDownloaded = "ไฟล์หลัก, LaunchWrapper ไม่สามารถดาวน์โหลดได้อย่างถูกต้อง ทำให้เกมไม่สามารถเปิดได้<br><br>เพื่อแก้ไขปัญหานี้ โปรดปิดซอฟต์แวร์ป้องกันไวรัสของคุณชั่วคราวและลองเปิดเกมอีกครั้ง<br><br>หากคุณมีเวลา กรุณา <a href=\"https://github.com/dscalzi/HeliosLauncher/issues\">ส่งปัญหา</a> และบอกให้เราทราบว่าคุณใช้ซอฟต์แวร์ป้องกันไวรัสอะไร เราจะติดต่อพวกเขาและพยายามแก้ไขปัญหานี้"
|
||||
doneEnjoyServer = "เสร็จสิ้น สนุกกับเซิร์ฟเวอร์!"
|
||||
checkConsoleForDetails = "โปรดตรวจสอบคอนโซล (CTRL + Shift + i) สำหรับรายละเอียดเพิ่มเติม"
|
||||
|
||||
[js.landing.news]
|
||||
checking = "กำลังตรวจสอบข่าวสาร"
|
||||
|
||||
[js.landing.discord]
|
||||
loading = "กำลังโหลดเกม.."
|
||||
joining = "กำลังเดินทางไป Westeros!"
|
||||
joined = "สำรวจดินแดน!"
|
||||
|
||||
[js.overlay]
|
||||
dismiss = "ปิด"
|
||||
|
||||
[js.settings.fileSelectors]
|
||||
executables = "ไฟล์ที่สามารถเรียกใช้งาน"
|
||||
allFiles = "ไฟล์ทั้งหมด"
|
||||
|
||||
[js.settings.mstfLogin]
|
||||
errorTitle = "เกิดอะไรผิดพลาด"
|
||||
errorMessage = "การตรวจสอบสิทธิ์ Microsoft ล้มเหลว โปรดลองอีกครั้ง"
|
||||
okButton = "ตกลง"
|
||||
|
||||
[js.settings.mstfLogout]
|
||||
errorTitle = "เกิดอะไรผิดพลาด"
|
||||
errorMessage = "การออกจากระบบ Microsoft ล้มเหลว โปรดลองอีกครั้ง"
|
||||
okButton = "ตกลง"
|
||||
|
||||
[js.settings.authAccountSelect]
|
||||
selectButton = "เลือกบัญชี"
|
||||
selectedButton = "บัญชีที่เลือก ✔"
|
||||
|
||||
[js.settings.authAccountLogout]
|
||||
lastAccountWarningTitle = "คำเตือน<br>นี่คือบัญชีสุดท้ายของคุณ"
|
||||
lastAccountWarningMessage = "ในการใช้ตัวเรียกใช้งาน คุณต้องเข้าสู่ระบบบัญชีอย่างน้อยหนึ่งบัญชี คุณจะต้องเข้าสู่ระบบอีกครั้งหลังจากนี้<br><br>คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?"
|
||||
confirmButton = "ฉันแน่ใจ"
|
||||
cancelButton = "ยกเลิก"
|
||||
|
||||
[js.settings.authAccountPopulate]
|
||||
username = "ชื่อผู้ใช้"
|
||||
uuid = "UUID"
|
||||
selectAccount = "เลือกบัญชี"
|
||||
selectedAccount = "บัญชีที่เลือก ✓"
|
||||
logout = "ออกจากระบบ"
|
||||
|
||||
[js.settings.dropinMods]
|
||||
removeButton = "ลบ"
|
||||
deleteFailedTitle = "ไม่สามารถลบ<br>Drop-in Mod {fullName}"
|
||||
deleteFailedMessage = "โปรดตรวจสอบว่าไฟล์ไม่ถูกใช้งานอยู่และลองอีกครั้ง"
|
||||
failedToggleTitle = "ไม่สามารถเปลี่ยนสถานะ<br>Drop-in Mods หนึ่งหรือหลายรายการ"
|
||||
okButton = "ตกลง"
|
||||
|
||||
[js.settings.serverListing]
|
||||
mainServer = "เซิร์ฟเวอร์หลัก"
|
||||
|
||||
[js.settings.java]
|
||||
selectedJava = "เลือกแล้ว: Java {version} ({vendor})"
|
||||
invalidSelection = "การเลือกไม่ถูกต้อง"
|
||||
requiresJava = "ต้องการ Java {major} x64."
|
||||
availableOptions = "ตัวเลือกที่มีให้สำหรับ Java {major} (HotSpot VM)"
|
||||
|
||||
[js.settings.about]
|
||||
preReleaseTitle = "เวอร์ชันพรีรีลีส"
|
||||
stableReleaseTitle = "เวอร์ชันเสถียร"
|
||||
releaseNotesFailed = "ไม่สามารถโหลดบันทึกการปล่อยได้"
|
||||
|
||||
[js.settings.updates]
|
||||
newReleaseTitle = "มีเวอร์ชันใหม่"
|
||||
newPreReleaseTitle = "มีเวอร์ชันพรีรีลีสใหม่"
|
||||
downloadingButton = "กำลังดาวน์โหลด.."
|
||||
downloadButton = 'ดาวน์โหลดจาก GitHub<span style="font-size: 10px;color: gray;text-shadow: none !important;">ปิดตัวเรียกใช้งานและเรียกใช้ dmg เพื่ออัปเดต</span>'
|
||||
latestVersionTitle = "คุณกำลังใช้เวอร์ชันล่าสุด"
|
||||
checkForUpdatesButton = "ตรวจสอบการอัปเดต"
|
||||
checkingForUpdatesButton = "กำลังตรวจสอบการอัปเดต.."
|
||||
|
||||
[js.settings.msftLogin]
|
||||
errorTitle = "การเข้าสู่ระบบ Microsoft ล้มเหลว"
|
||||
errorMessage = "ไม่สามารถตรวจสอบบัญชี Microsoft ของคุณ โปรดลองอีกครั้ง"
|
||||
okButton = "ตกลง"
|
||||
|
||||
[js.uibinder.startup]
|
||||
fatalErrorTitle = "ข้อผิดพลาดร้ายแรง: ไม่สามารถโหลดดัชนีการจัดจำหน่าย"
|
||||
fatalErrorMessage = "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์เพื่อดาวน์โหลดดัชนีการจัดจำหน่ายได้ ไม่มีสำเนาในเครื่องให้โหลด<br><br>ดัชนีการจัดจำหน่ายเป็นไฟล์ที่จำเป็นซึ่งให้ข้อมูลเซิร์ฟเวอร์ล่าสุด ตัวเรียกใช้งานไม่สามารถเริ่มต้นได้หากไม่มีมัน โปรดตรวจสอบว่าคุณเชื่อมต่อกับอินเทอร์เน็ตและลองเปิดแอปพลิเคชันอีกครั้ง"
|
||||
closeButton = "ปิด"
|
||||
|
||||
[js.uibinder.validateAccount]
|
||||
failedMessageTitle = "ไม่สามารถรีเฟรชการเข้าสู่ระบบ"
|
||||
failedMessage = "ไม่สามารถรีเฟรชการเข้าสู่ระบบสำหรับ <strong>{account}</strong> ได้ โปรดเลือกบัญชีอื่นหรือเข้าสู่ระบบอีกครั้ง."
|
||||
failedMessageSelectAnotherAccount = "ไม่สามารถรีเฟรชการเข้าสู่ระบบสำหรับ <strong>{account}</strong> ได้ โปรดเข้าสู่ระบบอีกครั้ง."
|
||||
loginButton = "เข้าสู่ระบบ"
|
||||
selectAnotherAccountButton = "เลือกบัญชีอื่น"
|
||||
|
||||
[js.uicore.autoUpdate]
|
||||
checkingForUpdateButton = "กำลังตรวจสอบการอัปเดต..."
|
||||
installNowButton = "ติดตั้งตอนนี้"
|
||||
checkForUpdatesButton = "ตรวจสอบการอัปเดต"
|
||||
|
||||
[js.auth.microsoft.error]
|
||||
noProfileTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>โปรไฟล์ยังไม่ได้ตั้งค่า"
|
||||
noProfileDesc = "บัญชี Microsoft ของคุณยังไม่ได้ตั้งค่าโปรไฟล์ Minecraft หากคุณเพิ่งซื้อเกมหรือแลกผ่าน Xbox Game Pass คุณต้องตั้งค่าโปรไฟล์ของคุณที่ <a href=\"https://minecraft.net/\">Minecraft.net</a>.<br><br>หากคุณยังไม่ได้ซื้อเกม คุณสามารถซื้อได้ที่ <a href=\"https://minecraft.net/\">Minecraft.net</a>."
|
||||
noXboxAccountTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>ไม่มีบัญชี Xbox"
|
||||
noXboxAccountDesc = "บัญชี Microsoft ของคุณไม่มีบัญชี Xbox ที่เกี่ยวข้อง."
|
||||
xblBannedTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>Xbox Live ไม่สามารถใช้งานได้"
|
||||
xblBannedDesc = "บัญชี Microsoft ของคุณมาจากประเทศที่ Xbox Live ไม่สามารถใช้งานได้หรือถูกแบน."
|
||||
under18Title = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>ต้องการการอนุมัติจากผู้ปกครอง"
|
||||
under18Desc = "บัญชีสำหรับผู้ใช้ที่อายุต่ำกว่า 18 ปีต้องถูกเพิ่มเข้าครอบครัวโดยผู้ใหญ่."
|
||||
unknownTitle = "ข้อผิดพลาดที่ไม่ทราบระหว่างการเข้าสู่ระบบ"
|
||||
unknownDesc = "เกิดข้อผิดพลาดที่ไม่ทราบ กรุณาดูในคอนโซลสำหรับรายละเอียด."
|
||||
|
||||
[js.auth.mojang.error]
|
||||
methodNotAllowedTitle = "ข้อผิดพลาดภายใน:<br>ไม่อนุญาตวิธีการ"
|
||||
methodNotAllowedDesc = "ไม่อนุญาตวิธีการ กรุณารายงานข้อผิดพลาดนี้."
|
||||
notFoundTitle = "ข้อผิดพลาดภายใน:<br>ไม่พบ"
|
||||
notFoundDesc = "ไม่พบจุดสิ้นสุดการตรวจสอบสิทธิ์ กรุณารายงานปัญหานี้."
|
||||
accountMigratedTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>บัญชีได้ถูกโยกย้าย"
|
||||
accountMigratedDesc = "คุณได้พยายามเข้าสู่ระบบด้วยบัญชีที่โยกย้ายแล้ว ลองอีกครั้งโดยใช้ที่อยู่อีเมลบัญชีเป็นชื่อผู้ใช้."
|
||||
invalidCredentialsTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>ข้อมูลรับรองไม่ถูกต้อง"
|
||||
invalidCredentialsDesc = "อีเมลหรือรหัสผ่านที่คุณป้อนไม่ถูกต้อง กรุณาลองอีกครั้ง."
|
||||
tooManyAttemptsTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>พยายามเข้าสู่ระบบมากเกินไป"
|
||||
tooManyAttemptsDesc = "มีการพยายามเข้าสู่ระบบมากเกินไปด้วยบัญชีนี้ในช่วงเวลาที่ผ่านมา กรุณาลองอีกครั้งในภายหลัง."
|
||||
invalidTokenTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>โทเค็นไม่ถูกต้อง"
|
||||
invalidTokenDesc = "โทเค็นการเข้าถึงที่ให้มานั้นไม่ถูกต้อง."
|
||||
tokenHasProfileTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>โทเค็นมีโปรไฟล์"
|
||||
tokenHasProfileDesc = "โทเค็นการเข้าถึงมีโปรไฟล์ที่กำหนดแล้ว การเลือกโปรไฟล์ยังไม่ได้รับการนำเสนอ."
|
||||
credentialsMissingTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>ข้อมูลรับรองหาย"
|
||||
credentialsMissingDesc = "ชื่อผู้ใช้/รหัสผ่านไม่ได้ถูกส่งหรือรหัสผ่านมีความยาวน้อยกว่า 3 ตัวอักษร."
|
||||
invalidSaltVersionTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>เวอร์ชันเกลือไม่ถูกต้อง"
|
||||
invalidSaltVersionDesc = "เวอร์ชันเกลือไม่ถูกต้อง."
|
||||
unsupportedMediaTypeTitle = "ข้อผิดพลาดภายใน:<br>ประเภทสื่อที่ไม่สนับสนุน"
|
||||
unsupportedMediaTypeDesc = "ประเภทสื่อที่ไม่สนับสนุน กรุณารายงานข้อผิดพลาดนี้."
|
||||
accountGoneTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>บัญชีได้ถูกโยกย้าย"
|
||||
accountGoneDesc = "บัญชีได้ถูกโยกย้ายไปยังบัญชี Microsoft กรุณาเข้าสู่ระบบด้วย Microsoft."
|
||||
unreachableTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>ไม่สามารถเข้าถึงได้"
|
||||
unreachableDesc = "ไม่สามารถเข้าถึงเซิร์ฟเวอร์ตรวจสอบสิทธิ์ได้ โปรดตรวจสอบให้แน่ใจว่าพวกเขาออนไลน์และคุณเชื่อมต่อกับอินเทอร์เน็ต."
|
||||
gameNotPurchasedTitle = "ข้อผิดพลาดระหว่างการเข้าสู่ระบบ:<br>เกมยังไม่ได้ซื้อ"
|
||||
gameNotPurchasedDesc = "บัญชีที่คุณพยายามเข้าสู่ระบบยังไม่ได้ซื้อสำเนาของ Minecraft คุณสามารถซื้อสำเนาได้ที่ <a href=\"https://minecraft.net/\">Minecraft.net</a>"
|
||||
unknownErrorTitle = "ข้อผิดพลาดที่ไม่ทราบระหว่างการเข้าสู่ระบบ"
|
||||
unknownErrorDesc = "เกิดข้อผิดพลาดที่ไม่ทราบ กรุณาดูในคอนโซลสำหรับรายละเอียด."
|
@ -13,7 +13,7 @@
|
||||
<% } else{ %>
|
||||
<div id="frameContentWin">
|
||||
<div id="frameTitleDock">
|
||||
<span id="frameTitleText"><%= lang('app.title') %></span>
|
||||
<span id="frameTitleText"><%= lang('app.title') %> | Powered by DPCloudev</span>
|
||||
</div>
|
||||
<div id="frameButtonDockWin">
|
||||
<button class="frameButton fMb" id="frameButton_minimize" tabIndex="-1">
|
||||
|
@ -12,9 +12,11 @@
|
||||
<div id="rightContainer">
|
||||
<div id="user_content">
|
||||
<span id="user_text"><%- lang('landing.usernamePlaceholder') %></span>
|
||||
|
||||
<div id="avatarContainer">
|
||||
<button id="avatarOverlay"><%- lang('landing.usernameEditButton') %></button>
|
||||
</div>
|
||||
-
|
||||
</div>
|
||||
<div id="mediaContent">
|
||||
<div id="internalMedia">
|
||||
@ -118,6 +120,17 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bot_divider"></div>
|
||||
<div id="mojangStatusWrapper">
|
||||
<span class="bot_label">DPClOUDEV STATUS</span>
|
||||
<span id="DPCloudev_status_icon">•</span>
|
||||
<div id="mojangStatusTooltip">
|
||||
<div id="mojangStatusTooltipTitle"><%- lang('landing.mojangStatusTooltipTitle') %></div>
|
||||
<div id="dpcloudevStatusContainer">
|
||||
<!-- DPCloudev services are populated here. -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -162,17 +175,18 @@
|
||||
<div id="newsContent" article="-1" style="display: none;">
|
||||
<div id="newsStatusContainer">
|
||||
<div id="newsStatusContent">
|
||||
<div id="newsArticleFeedServerIcon" style="display: flex; justify-content: flex-end; align-items: flex-end;"></div>
|
||||
<br>
|
||||
<div id="newsTitleContainer">
|
||||
<a id="newsArticleTitle" href="#">Lorem Ipsum</a>
|
||||
<a id="newsArticleTitle">N/A</a>
|
||||
</div>
|
||||
<div id="newsMetaContainer">
|
||||
<div id="newsArticleDateWrapper">
|
||||
<span id="newsArticleDate">Mar 15, 44 BC, 9:14 AM</span>
|
||||
<span id="newsArticleDate">N/A</span>
|
||||
</div>
|
||||
<div id="newsArticleAuthorWrapper">
|
||||
<span id="newsArticleAuthor">by Cicero</span>
|
||||
<span id="newsArticleAuthor">N/A</span>
|
||||
</div>
|
||||
<a href="#" id="newsArticleComments">0 Comments</a>
|
||||
</div>
|
||||
</div>
|
||||
<div id="newsNavigationContainer">
|
||||
|
@ -7,7 +7,6 @@
|
||||
</div>
|
||||
<div id="loginContent">
|
||||
<form id="loginForm">
|
||||
<img id="loginImageSeal" src="assets/images/SealCircle.png"/>
|
||||
<span id="loginSubheader"><%- lang('login.loginSubheader') %></span>
|
||||
<div class="loginFieldContainer">
|
||||
<svg id="profileSVG" class="loginSVG" viewBox="40 37 65.36 61.43">
|
||||
@ -58,6 +57,78 @@
|
||||
</span>
|
||||
<p class="loginDisclaimerText"><%- lang('login.loginPasswordDisclaimer1') %></p>
|
||||
<p class="loginDisclaimerText"><%- lang('login.loginPasswordDisclaimer2', { appName: lang('app.title') }) %></p>
|
||||
<br>
|
||||
<svg
|
||||
width="38.435234mm"
|
||||
height="8.858992mm"
|
||||
viewBox="0 0 76.435234 16.858992"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xml:space="preserve"
|
||||
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
|
||||
sodipodi:docname="powered-by-DPCloudev.svg"
|
||||
inkscape:export-filename="powered-by-DPCloudev.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="1.0242632"
|
||||
inkscape:cx="401.7522"
|
||||
inkscape:cy="505.24122"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1009"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" /><defs
|
||||
id="defs1"><rect
|
||||
x="146.72466"
|
||||
y="315.36963"
|
||||
width="186.32265"
|
||||
height="42.779961"
|
||||
id="rect7" /></defs><g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-47.625001,-111.65416)"><text
|
||||
xml:space="preserve"
|
||||
transform="matrix(0.26458334,0,0,0.26458334,3.9593842,27.136316)"
|
||||
id="text7"
|
||||
style="font-size:26.6667px;text-align:center;white-space:pre;shape-inside:url(#rect7);display:inline;fill:#ffaa00;fill-opacity:1;fill-rule:evenodd"><tspan
|
||||
x="162.43122"
|
||||
y="339.69798"
|
||||
id="tspan2"><tspan
|
||||
style="fill:#808080"
|
||||
id="tspan1">Powered by</tspan></tspan></text><g
|
||||
id="g1"
|
||||
transform="matrix(0.51040974,0,0,0.51040974,39.378824,115.13105)"><g
|
||||
id="text3"
|
||||
style="font-size:23.05px;text-align:center;text-anchor:middle;fill:#2bcd95;fill-rule:evenodd;stroke-width:0.864374"
|
||||
aria-label="DPCloudev"
|
||||
transform="translate(-30.476699,-109.96845)"><path
|
||||
style="fill:#ffe900"
|
||||
d="m 89.092595,127.47554 q 0,2.28474 -1.001685,4.1418 -0.990429,1.85706 -2.644897,2.88125 -1.147998,0.70906 -2.566113,1.02419 -1.406861,0.31514 -3.714111,0.31514 H 74.933953 V 119.0794 h 4.186816 q 2.453564,0 3.894189,0.36016 1.45188,0.3489 2.453565,0.96792 1.710742,1.06921 2.667407,2.84748 0.956665,1.77827 0.956665,4.22058 z m -2.329761,-0.0338 q 0,-1.96961 -0.686548,-3.32019 -0.686547,-1.35059 -2.048388,-2.12717 -0.99043,-0.56275 -2.104663,-0.77659 -1.114234,-0.2251 -2.667407,-0.2251 H 77.16242 v 12.93186 h 2.093408 q 1.609448,0 2.802465,-0.23635 1.204273,-0.23635 2.205957,-0.87788 1.249292,-0.7991 1.868311,-2.10467 0.630273,-1.30556 0.630273,-3.26391 z"
|
||||
id="path22" /><path
|
||||
style="fill:#ff7e00"
|
||||
d="m 103.65641,124.1441 q 0,1.11423 -0.39392,2.0709 -0.38266,0.94541 -1.08047,1.64321 -0.86662,0.86663 -2.04839,1.30557 -1.181758,0.42768 -2.982539,0.42768 h -2.228467 v 6.24646 H 92.694157 V 119.0794 h 4.546973 q 1.508154,0 2.554858,0.25886 1.046702,0.24761 1.857052,0.78785 0.95667,0.64152 1.47439,1.59819 0.52898,0.95666 0.52898,2.4198 z m -2.3185,0.0563 q 0,-0.86662 -0.30389,-1.50815 -0.30388,-0.64153 -0.9229,-1.04671 -0.54023,-0.3489 -1.238032,-0.49521 -0.686548,-0.15757 -1.744507,-0.15757 h -2.205957 v 6.69666 h 1.879565 q 1.350586,0 2.194702,-0.23636 0.844116,-0.2476 1.373099,-0.77658 0.52898,-0.54024 0.74282,-1.13675 0.2251,-0.59651 0.2251,-1.33933 z"
|
||||
id="path23" /><path
|
||||
style="fill:#0096ff"
|
||||
d="m 119.53705,134.62239 q -0.61902,0.27012 -1.12549,0.50647 -0.49521,0.23636 -1.30556,0.49522 -0.68655,0.21384 -1.4969,0.36015 -0.7991,0.15757 -1.76702,0.15757 -1.82329,0 -3.32019,-0.50647 -1.48564,-0.51772 -2.58862,-1.60944 -1.08047,-1.06922 -1.68823,-2.71243 -0.60777,-1.65447 -0.60777,-3.83792 0,-2.07089 0.58526,-3.70285 0.58525,-1.63196 1.68823,-2.75745 1.06921,-1.09172 2.57737,-1.66572 1.51941,-0.574 3.36521,-0.574 1.35058,0 2.68991,0.32639 1.35059,0.32639 2.9938,1.148 v 2.6449 h -0.16882 q -1.38435,-1.15926 -2.74619,-1.68824 -1.36184,-0.52898 -2.91502,-0.52898 -1.2718,0 -2.29599,0.41644 -1.01294,0.40517 -1.81204,1.2718 -0.77659,0.84411 -1.21553,2.13842 -0.42768,1.28306 -0.42768,2.97129 0,1.76702 0.4727,3.03882 0.48396,1.2718 1.23804,2.0709 0.78784,0.83286 1.83455,1.23804 1.05796,0.39392 2.22846,0.39392 1.60945,0 3.01631,-0.55149 1.40686,-0.55149 2.63364,-1.65447 h 0.15757 z m 5.12097,1.21553 h -2.11591 v -17.5126 h 2.11591 z m 14.90147,-6.28022 q 0,3.07258 -1.57568,4.85085 -1.57569,1.77827 -4.22058,1.77827 -2.66741,0 -4.2431,-1.77827 -1.56442,-1.77827 -1.56442,-4.85085 0,-3.07259 1.56442,-4.85086 1.57569,-1.78952 4.2431,-1.78952 2.64489,0 4.22058,1.78952 1.57568,1.77827 1.57568,4.85086 z m -2.18345,0 q 0,-2.44231 -0.95666,-3.62408 -0.95667,-1.19301 -2.65615,-1.19301 -1.722,0 -2.67867,1.19301 -0.94541,1.18177 -0.94541,3.62408 0,2.36352 0.95667,3.5903 0.95666,1.21553 2.66741,1.21553 1.68823,0 2.64489,-1.20427 0.96792,-1.21553 0.96792,-3.60156 z m 15.88064,6.28022 h -2.11592 v -1.3956 q -1.06921,0.84411 -2.04839,1.29431 -0.97917,0.45019 -2.16094,0.45019 -1.98086,0 -3.08383,-1.20427 -1.10298,-1.21553 -1.10298,-3.55654 v -8.15979 h 2.11592 v 7.1581 q 0,0.95667 0.09,1.64322 0.09,0.67529 0.38267,1.15925 0.30388,0.49521 0.78784,0.72031 0.48396,0.2251 1.40686,0.2251 0.82161,0 1.78953,-0.42769 0.97917,-0.42768 1.82329,-1.09172 v -9.38657 h 2.11592 z m 14.36123,0 h -2.11592 v -1.31682 q -0.91165,0.78784 -1.90208,1.22678 -0.99043,0.43894 -2.14968,0.43894 -2.25098,0 -3.57905,-1.73325 -1.31682,-1.73325 -1.31682,-4.80583 0,-1.5982 0.45019,-2.84749 0.46145,-1.24929 1.23804,-2.12717 0.76533,-0.85537 1.77827,-1.30557 1.02419,-0.45019 2.11592,-0.45019 0.99043,0 1.75576,0.21384 0.76533,0.20259 1.60945,0.64153 v -5.44737 h 2.11592 z m -2.11592,-3.09509 v -7.21438 q -0.85537,-0.38267 -1.53067,-0.52898 -0.67529,-0.14631 -1.47439,-0.14631 -1.77827,0 -2.7687,1.23803 -0.99043,1.23804 -0.99043,3.51153 0,2.23972 0.76534,3.41023 0.76533,1.15925 2.45356,1.15925 0.90039,0 1.82329,-0.39392 0.9229,-0.40518 1.722,-1.03545 z"
|
||||
id="path24" /><path
|
||||
style="fill:#36ff00"
|
||||
d="m 182.30553,129.77154 h -9.26276 q 0,1.15925 0.3489,2.02588 0.3489,0.85537 0.95666,1.40686 0.58526,0.54023 1.38435,0.81035 0.81035,0.27012 1.77827,0.27012 1.28306,0 2.57737,-0.50647 1.30557,-0.51773 1.85706,-1.01294 h 0.11255 v 2.30725 q -1.06922,0.45019 -2.18345,0.75408 -1.11423,0.30388 -2.34102,0.30388 -3.12885,0 -4.88461,-1.68823 -1.75577,-1.69949 -1.75577,-4.81709 0,-3.08384 1.67698,-4.89588 1.68823,-1.81203 4.43442,-1.81203 2.54361,0 3.9167,1.48564 1.38435,1.48565 1.38435,4.22058 z m -2.05964,-1.6207 q -0.0112,-1.66573 -0.84412,-2.57737 -0.8216,-0.91165 -2.50983,-0.91165 -1.69949,0 -2.71243,1.00169 -1.00169,1.00168 -1.13674,2.48733 z m 16.1395,-4.88462 -5.0872,12.5717 h -2.12718 l -5.05344,-12.5717 h 2.296 l 3.89419,10.00559 3.86042,-10.00559 z"
|
||||
id="path25" /></g></g></g></svg>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
@ -15,13 +15,73 @@
|
||||
</button>
|
||||
</div>
|
||||
<div class="loginOptionButtonContainer">
|
||||
<button id="loginOptionMojang" class="loginOptionButton">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 9.677 9.667">
|
||||
<path d="M-26.332-12.098h2.715c-1.357.18-2.574 1.23-2.715 2.633z" fill="#fff" />
|
||||
<path d="M2.598.022h7.07L9.665 7c-.003 1.334-1.113 2.46-2.402 2.654H0V2.542C.134 1.2 1.3.195 2.598.022z" fill="#db2331" />
|
||||
<path d="M1.54 2.844c.314-.76 1.31-.46 1.954-.528.785-.083 1.503.272 2.1.758l.164-.9c.327.345.587.756.964 1.052.28.254.655-.342.86-.013.42.864.408 1.86.54 2.795l-.788-.373C6.9 4.17 5.126 3.052 3.656 3.685c-1.294.592-1.156 2.65.06 3.255 1.354.703 2.953.51 4.405.292-.07.42-.34.87-.834.816l-4.95.002c-.5.055-.886-.413-.838-.89l.04-4.315z" fill="#fff" />
|
||||
</svg>
|
||||
<span><%- lang('loginOptions.loginWithMojang') %></span>
|
||||
<button id="loginOptionDPCloudev" class="loginOptionButton">
|
||||
<svg
|
||||
width="22"
|
||||
height="22"
|
||||
viewBox="0 0 220 220"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xml:space="preserve"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs1" /><g
|
||||
id="layer1"><g
|
||||
id="g1"
|
||||
transform="translate(6.9409594,21.553506)"><path
|
||||
style="fill:#6f4119;stroke:none;stroke-width:1.62284"
|
||||
d="m 185.35864,116.03244 v 27.48011 h 27.48013 v -27.48011 z"
|
||||
id="path16" /><path
|
||||
style="fill:#f9f9f9;stroke:none;stroke-width:2.29504"
|
||||
d="m 157.87851,88.552311 v 54.960229 h 27.48013 V 88.552311 Z"
|
||||
id="path15" /><path
|
||||
style="fill:#653915;stroke:none;stroke-width:1.62284"
|
||||
d="m -7.0022289,116.03244 v 27.48011 H 20.477893 v -27.48011 z"
|
||||
id="path14" /><path
|
||||
style="fill:#553111;stroke:none;stroke-width:1.62284"
|
||||
d="m 185.35864,88.552295 v 27.480145 h 27.48013 V 88.552295 Z"
|
||||
id="path13" /><path
|
||||
style="fill:#010101;stroke:none;stroke-width:1.62284"
|
||||
d="M 47.958016,88.552295 V 143.51254 H 75.438135 V 88.552295 H 47.958016 m 82.440384,0 v 54.960245 h 27.48011 V 88.552295 Z"
|
||||
id="path12" /><path
|
||||
style="fill:#f9f9f9;stroke:none;stroke-width:1.62284"
|
||||
d="M 20.477893,88.552295 V 143.51254 H 47.958016 V 88.552295 Z"
|
||||
id="path11" /><path
|
||||
style="fill:#f7d185;stroke:none;stroke-width:1.62284"
|
||||
d="M 47.958016,61.072173 V 88.552295 H 75.438135 V 143.51254 H -7.0022289 v 54.96024 H 212.83876 V 143.51254 H 130.3984 v -27.4801 H 102.91828 V 88.552295 H 75.438135 V 61.072173 Z"
|
||||
id="path10" /><path
|
||||
style="fill:#653915;stroke:none;stroke-width:1.62284"
|
||||
d="m 130.3984,33.592054 v 27.480119 h 27.48011 V 33.592054 Z"
|
||||
id="path9" /><path
|
||||
style="fill:#6f4119;stroke:none;stroke-width:1.62284"
|
||||
d="M 102.91828,33.592054 V 116.03244 H 130.3984 V 88.552295 h 54.96024 V 61.072173 H 130.3984 V 33.592054 Z"
|
||||
id="path8" /><path
|
||||
style="fill:#653915;stroke:none;stroke-width:1.62284"
|
||||
d="M 75.438135,33.592054 V 88.552295 H 102.91828 V 33.592054 Z"
|
||||
id="path7" /><path
|
||||
style="fill:#553111;stroke:none;stroke-width:1.62284"
|
||||
d="M 47.958 33.5921 L 47.958 61.0722 L 20.4779 61.0722 L 20.4779 88.5523 L -7.00223 88.5523 L -7.00223 116.032 L 20.4779 116.032 L 20.4779 88.5523 L 47.958 88.5523 L 47.958 61.0722 L 75.4381 61.0722 L 75.4381 33.5921 Z"
|
||||
id="path6" /><path
|
||||
style="fill:#fff5f3;stroke:none;stroke-width:1.62284"
|
||||
d="M 20.477893,6.1119311 V 33.592054 H 47.958016 V 6.1119311 Z"
|
||||
id="path5" /><path
|
||||
style="fill:#fff5f3;stroke:none;stroke-width:1.62284"
|
||||
d="M 157.87947,6.1119961 V 33.592103 h 27.48014 V 6.1119961 Z"
|
||||
id="path5-0" /><path
|
||||
style="fill:#010101;stroke:none;stroke-width:1.62284"
|
||||
d="M 185.35864,-21.368191 V 6.1119311 h 27.48013 V -21.368191 Z"
|
||||
id="path4" /><path
|
||||
style="fill:#030303;stroke:none;stroke-width:1.62284"
|
||||
d="M 157.87851,-21.368191 V 6.1119311 h 27.48013 V 33.592054 h 27.48012 V 6.1119311 H 185.35864 V -21.368191 Z"
|
||||
id="path3" /><path
|
||||
style="fill:#e18715;stroke:none;stroke-width:1.62284"
|
||||
d="M 47.958016,-21.368191 V 33.592054 H -7.0022289 V 88.552295 H 20.477893 V 61.072173 H 47.958016 V 33.592054 H 157.87851 v 27.480119 h 27.48013 v 27.480122 h 27.48012 V 33.592054 h -54.96025 v -54.960245 z"
|
||||
id="path2" /><path
|
||||
style="fill:#030303;stroke:none;stroke-width:1.62284"
|
||||
d="M -7.0022289,-21.368191 V 33.592054 H 20.477893 V 6.1119311 H 47.958016 V -21.368191 Z"
|
||||
id="path1" /></g></g></svg>
|
||||
|
||||
<span><%- lang('loginOptions.loginWithDPCloudev') %></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -30,6 +30,7 @@
|
||||
<div id="overlayContent">
|
||||
<span id="overlayTitle">Lorem Ipsum:<br>Finis Illud</span>
|
||||
<span id="overlayDesc">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud..</span>
|
||||
<textarea id="overlayDetail" style="display: none;"></textarea>
|
||||
<div id="overlayActionContainer">
|
||||
<button id="overlayAcknowledge" class="overlayKeybindEnter">Conare Iterum</button>
|
||||
<div id="overlayDismissWrapper">
|
||||
|
@ -52,15 +52,74 @@
|
||||
<div class="settingsAuthAccountTypeContainer">
|
||||
<div class="settingsAuthAccountTypeHeader">
|
||||
<div class="settingsAuthAccountTypeHeaderLeft">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 9.677 9.667">
|
||||
<path d="M-26.332-12.098h2.715c-1.357.18-2.574 1.23-2.715 2.633z" fill="#fff" />
|
||||
<path d="M2.598.022h7.07L9.665 7c-.003 1.334-1.113 2.46-2.402 2.654H0V2.542C.134 1.2 1.3.195 2.598.022z" fill="#db2331" />
|
||||
<path d="M1.54 2.844c.314-.76 1.31-.46 1.954-.528.785-.083 1.503.272 2.1.758l.164-.9c.327.345.587.756.964 1.052.28.254.655-.342.86-.013.42.864.408 1.86.54 2.795l-.788-.373C6.9 4.17 5.126 3.052 3.656 3.685c-1.294.592-1.156 2.65.06 3.255 1.354.703 2.953.51 4.405.292-.07.42-.34.87-.834.816l-4.95.002c-.5.055-.886-.413-.838-.89l.04-4.315z" fill="#fff" />
|
||||
</svg>
|
||||
<span><%- lang('settings.mojangAccount') %></span>
|
||||
<svg
|
||||
width="22"
|
||||
height="22"
|
||||
viewBox="0 0 220 220"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xml:space="preserve"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs1" /><g
|
||||
id="layer1"><g
|
||||
id="g1"
|
||||
transform="translate(6.9409594,21.553506)"><path
|
||||
style="fill:#6f4119;stroke:none;stroke-width:1.62284"
|
||||
d="m 185.35864,116.03244 v 27.48011 h 27.48013 v -27.48011 z"
|
||||
id="path16" /><path
|
||||
style="fill:#f9f9f9;stroke:none;stroke-width:2.29504"
|
||||
d="m 157.87851,88.552311 v 54.960229 h 27.48013 V 88.552311 Z"
|
||||
id="path15" /><path
|
||||
style="fill:#653915;stroke:none;stroke-width:1.62284"
|
||||
d="m -7.0022289,116.03244 v 27.48011 H 20.477893 v -27.48011 z"
|
||||
id="path14" /><path
|
||||
style="fill:#553111;stroke:none;stroke-width:1.62284"
|
||||
d="m 185.35864,88.552295 v 27.480145 h 27.48013 V 88.552295 Z"
|
||||
id="path13" /><path
|
||||
style="fill:#010101;stroke:none;stroke-width:1.62284"
|
||||
d="M 47.958016,88.552295 V 143.51254 H 75.438135 V 88.552295 H 47.958016 m 82.440384,0 v 54.960245 h 27.48011 V 88.552295 Z"
|
||||
id="path12" /><path
|
||||
style="fill:#f9f9f9;stroke:none;stroke-width:1.62284"
|
||||
d="M 20.477893,88.552295 V 143.51254 H 47.958016 V 88.552295 Z"
|
||||
id="path11" /><path
|
||||
style="fill:#f7d185;stroke:none;stroke-width:1.62284"
|
||||
d="M 47.958016,61.072173 V 88.552295 H 75.438135 V 143.51254 H -7.0022289 v 54.96024 H 212.83876 V 143.51254 H 130.3984 v -27.4801 H 102.91828 V 88.552295 H 75.438135 V 61.072173 Z"
|
||||
id="path10" /><path
|
||||
style="fill:#653915;stroke:none;stroke-width:1.62284"
|
||||
d="m 130.3984,33.592054 v 27.480119 h 27.48011 V 33.592054 Z"
|
||||
id="path9" /><path
|
||||
style="fill:#6f4119;stroke:none;stroke-width:1.62284"
|
||||
d="M 102.91828,33.592054 V 116.03244 H 130.3984 V 88.552295 h 54.96024 V 61.072173 H 130.3984 V 33.592054 Z"
|
||||
id="path8" /><path
|
||||
style="fill:#653915;stroke:none;stroke-width:1.62284"
|
||||
d="M 75.438135,33.592054 V 88.552295 H 102.91828 V 33.592054 Z"
|
||||
id="path7" /><path
|
||||
style="fill:#553111;stroke:none;stroke-width:1.62284"
|
||||
d="M 47.958 33.5921 L 47.958 61.0722 L 20.4779 61.0722 L 20.4779 88.5523 L -7.00223 88.5523 L -7.00223 116.032 L 20.4779 116.032 L 20.4779 88.5523 L 47.958 88.5523 L 47.958 61.0722 L 75.4381 61.0722 L 75.4381 33.5921 Z"
|
||||
id="path6" /><path
|
||||
style="fill:#fff5f3;stroke:none;stroke-width:1.62284"
|
||||
d="M 20.477893,6.1119311 V 33.592054 H 47.958016 V 6.1119311 Z"
|
||||
id="path5" /><path
|
||||
style="fill:#fff5f3;stroke:none;stroke-width:1.62284"
|
||||
d="M 157.87947,6.1119961 V 33.592103 h 27.48014 V 6.1119961 Z"
|
||||
id="path5-0" /><path
|
||||
style="fill:#010101;stroke:none;stroke-width:1.62284"
|
||||
d="M 185.35864,-21.368191 V 6.1119311 h 27.48013 V -21.368191 Z"
|
||||
id="path4" /><path
|
||||
style="fill:#030303;stroke:none;stroke-width:1.62284"
|
||||
d="M 157.87851,-21.368191 V 6.1119311 h 27.48013 V 33.592054 h 27.48012 V 6.1119311 H 185.35864 V -21.368191 Z"
|
||||
id="path3" /><path
|
||||
style="fill:#e18715;stroke:none;stroke-width:1.62284"
|
||||
d="M 47.958016,-21.368191 V 33.592054 H -7.0022289 V 88.552295 H 20.477893 V 61.072173 H 47.958016 V 33.592054 H 157.87851 v 27.480119 h 27.48013 v 27.480122 h 27.48012 V 33.592054 h -54.96025 v -54.960245 z"
|
||||
id="path2" /><path
|
||||
style="fill:#030303;stroke:none;stroke-width:1.62284"
|
||||
d="M -7.0022289,-21.368191 V 33.592054 H 20.477893 V 6.1119311 H 47.958016 V -21.368191 Z"
|
||||
id="path1" /></g></g></svg>
|
||||
<span><%- lang('settings.DPCloudevAccount') %></span>
|
||||
</div>
|
||||
<div class="settingsAuthAccountTypeHeaderRight">
|
||||
<button class="settingsAddAuthAccount" id="settingsAddMojangAccount"><%- lang('settings.addMojangAccount') %></button>
|
||||
<button class="settingsAddAuthAccount" id="settingsAddMojangAccount"><%- lang('settings.addDPCloudevAccount') %></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -331,7 +390,7 @@
|
||||
<div id="settingsAboutButtons">
|
||||
<a href="<%- lang('settings.sourceGithubLink') %>" id="settingsAboutSourceButton" class="settingsAboutButton"><%- lang('settings.sourceGithub') %></a>
|
||||
<!-- The following must be included in third-party usage. -->
|
||||
<!-- <a href="https://github.com/dscalzi/HeliosLauncher" id="settingsAboutSourceButton" class="settingsAboutButton">Original Source</a> -->
|
||||
<a href="https://github.com/dscalzi/HeliosLauncher" id="settingsAboutSourceButton" class="settingsAboutButton">Original Source</a>
|
||||
<a href="<%- lang('settings.supportLink') %>" id="settingsAboutSupportButton" class="settingsAboutButton"><%- lang('settings.support') %></a>
|
||||
<a href="#" id="settingsAboutDevToolsButton" class="settingsAboutButton"><%- lang('settings.devToolsConsole') %></a>
|
||||
</div>
|
||||
|
68
distro.json
Normal file
68
distro.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"discord": {
|
||||
"clientId": "1290669565231108106",
|
||||
"smallImageText": "",
|
||||
"smallImageKey": ""
|
||||
},
|
||||
"java": {
|
||||
"adoptium": "https://adoptium.net/temurin/releases/?package=jdk&version=18",
|
||||
"supported": ">=17",
|
||||
"suggestedMajor": 18,
|
||||
"ram": {
|
||||
"recommended": 2048,
|
||||
"minimum": 1024
|
||||
}
|
||||
},
|
||||
"rcf": "https://api.damp11113.xyz/feed/getfeed?page=1&limit=10&service=dmb_mc",
|
||||
"servers": [
|
||||
{
|
||||
"id": "DMB",
|
||||
"name": "DMB Server",
|
||||
"description": "A best mc roleplay in Thailand",
|
||||
"icon": "",
|
||||
"version": "1.0",
|
||||
"address": "localhost",
|
||||
"minecraftVersion": "1.20.1",
|
||||
"discord": {
|
||||
"shortId": "Test",
|
||||
"largeImageText": "",
|
||||
"largeImageKey": ""
|
||||
},
|
||||
"mainServer": true,
|
||||
"autoconnect": true,
|
||||
"modules": []
|
||||
},
|
||||
{
|
||||
"id": "dpg-milsim",
|
||||
"name": "DPGame milsim",
|
||||
"description": "Noting just test!",
|
||||
"icon": "",
|
||||
"version": "1.0",
|
||||
"address": "localhost:25505",
|
||||
"pre_command": {
|
||||
"win32": [
|
||||
"powershell -Command \"if (-not (Test-Path '<%= launcherDir %>\\cloudflared.exe')) { Invoke-WebRequest -Uri https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.exe -OutFile '<%= launcherDir %>\\cloudflared.exe' }\"",
|
||||
"\"<%= launcherDir %>\\cloudflared.exe\" access tcp --hostname minecraft.damp11113.xyz --url localhost:25505"
|
||||
],
|
||||
"darwin": [
|
||||
"if [ ! -f /usr/local/bin/cloudflared ]; then brew install cloudflare/cloudflare/cloudflared; fi",
|
||||
"cloudflared access tcp --hostname minecraft.damp11113.xyz --url localhost:25505"
|
||||
],
|
||||
"linux": [
|
||||
"if [ ! -f '<%= launcherDir %>/cloudflared' ]; then wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -O '<%= launcherDir %>/cloudflared'; chmod +x '<%= launcherDir %>/tools/cloudflared'; fi",
|
||||
"<%= launcherDir %>/cloudflared access tcp --hostname minecraft.damp11113.xyz --url localhost:25505"
|
||||
]
|
||||
},
|
||||
"minecraftVersion": "1.20.1",
|
||||
"discord": {
|
||||
"shortId": "Test",
|
||||
"largeImageText": "",
|
||||
"largeImageKey": ""
|
||||
},
|
||||
"mainServer": true,
|
||||
"autoconnect": true,
|
||||
"modules": []
|
||||
}
|
||||
]
|
||||
}
|
71
docs/new_sample_distribution.json
Normal file
71
docs/new_sample_distribution.json
Normal file
@ -0,0 +1,71 @@
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"discord": {
|
||||
"clientId": "1290669565231108106",
|
||||
"smallImageText": "",
|
||||
"smallImageKey": ""
|
||||
},
|
||||
"java": {
|
||||
"adoptium": "https://adoptium.net/temurin/releases/?package=jdk&version=18",
|
||||
"supported": ">=17",
|
||||
"suggestedMajor": 18,
|
||||
"ram": {
|
||||
"recommended": 2048,
|
||||
"minimum": 1024
|
||||
}
|
||||
},
|
||||
"rcf": "https://api.damp11113.xyz/feed/getfeed?page=1&limit=10&service=dmb_mc",
|
||||
"servers": [
|
||||
{
|
||||
"id": "DMB",
|
||||
"name": "DMB Server",
|
||||
"description": "A best mc roleplay in Thailand",
|
||||
"icon": "",
|
||||
"version": "1.0",
|
||||
"address": "localhost",
|
||||
"minecraftVersion": "1.20.1",
|
||||
"discord": {
|
||||
"shortId": "Test",
|
||||
"largeImageText": "",
|
||||
"largeImageKey": ""
|
||||
},
|
||||
"mainServer": true,
|
||||
"autoconnect": true,
|
||||
"modules": []
|
||||
},
|
||||
{
|
||||
"id": "dpg-milsim",
|
||||
"name": "DPGame milsim",
|
||||
"description": "Noting just test!",
|
||||
"icon": "",
|
||||
"version": "1.0",
|
||||
"address": "localhost:25505",
|
||||
"pre_command": {
|
||||
"windows": [
|
||||
"powershell -Command \"Invoke-WebRequest -Uri https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.exe -OutFile cloudflared.exe\"",
|
||||
"move cloudflared.exe \"C:\\Program Files\\Cloudflare\\cloudflared.exe\"",
|
||||
"C:\\Program Files\\Cloudflare\\cloudflared.exe access tcp --hostname mcmilsim.damp11113.xyz --url localhost:25505"
|
||||
],
|
||||
"mac": [
|
||||
"brew install cloudflare/cloudflare/cloudflared",
|
||||
"cloudflared access tcp --hostname mcmilsim.damp11113.xyz --url localhost:25505"
|
||||
],
|
||||
"linux": [
|
||||
"wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64",
|
||||
"chmod +x cloudflared-linux-amd64",
|
||||
"sudo mv cloudflared-linux-amd64 /usr/local/bin/cloudflared",
|
||||
"cloudflared access tcp --hostname mcmilsim.damp11113.xyz --url localhost:25505"
|
||||
]
|
||||
},
|
||||
"minecraftVersion": "1.20.1",
|
||||
"discord": {
|
||||
"shortId": "Test",
|
||||
"largeImageText": "",
|
||||
"largeImageKey": ""
|
||||
},
|
||||
"mainServer": true,
|
||||
"autoconnect": true,
|
||||
"modules": []
|
||||
}
|
||||
]
|
||||
}
|
592
docs/newdistro.md
Normal file
592
docs/newdistro.md
Normal file
@ -0,0 +1,592 @@
|
||||
# Distribution Index
|
||||
|
||||
You can use [Nebula](https://github.com/dscalzi/Nebula) to automate the generation of a distribution index.
|
||||
|
||||
The most up to date and accurate descriptions of the distribution spec can be viewed in [helios-distribution-types](https://github.com/dscalzi/helios-distribution-types).
|
||||
|
||||
The distribution index is written in JSON. The general format of the index is as posted below.
|
||||
|
||||
```json
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"discord": {
|
||||
"clientId": "12334567890123456789",
|
||||
"smallImageText": "WesterosCraft",
|
||||
"smallImageKey": "seal-circle"
|
||||
},
|
||||
"ref": "https://api.damp11113.xyz/feed/getfeed?page=1&limit=10&service=dmb_mc",
|
||||
"servers": [
|
||||
{
|
||||
"id": "Example_Server",
|
||||
"name": "WesterosCraft Example Client",
|
||||
"description": "Example WesterosCraft server. Connect for fun!",
|
||||
"icon": "http://mc.westeroscraft.com/WesterosCraftLauncher/files/example_icon.png",
|
||||
"version": "0.0.1",
|
||||
"address": "mc.westeroscraft.com:1337",
|
||||
"minecraftVersion": "1.11.2",
|
||||
"discord": {
|
||||
"shortId": "Example",
|
||||
"largeImageText": "WesterosCraft Example Server",
|
||||
"largeImageKey": "server-example"
|
||||
},
|
||||
"mainServer": true,
|
||||
"autoconnect": true,
|
||||
"modules": [
|
||||
"Module Objects Here"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Distro Index Object
|
||||
|
||||
#### Example
|
||||
```JSON
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"discord": {
|
||||
"clientId": "12334567890123456789",
|
||||
"smallImageText": "WesterosCraft",
|
||||
"smallImageKey": "seal-circle"
|
||||
},
|
||||
"rcf": "https://api.damp11113.xyz/feed/getfeed?page=1&limit=10&service=dmb_mc",
|
||||
"servers": []
|
||||
}
|
||||
```
|
||||
|
||||
### `DistroIndex.version: string/semver`
|
||||
|
||||
The version of the index format. Will be used in the future to gracefully push updates.
|
||||
|
||||
### `DistroIndex.discord: object`
|
||||
|
||||
Global settings for [Discord Rich Presence](https://discordapp.com/developers/docs/rich-presence/how-to).
|
||||
|
||||
**Properties**
|
||||
|
||||
* `discord.clientId: string` - Client ID for th Application registered with Discord.
|
||||
* `discord.smallImageText: string` - Tootltip for the `smallImageKey`.
|
||||
* `discord.smallImageKey: string` - Name of the uploaded image for the small profile artwork.
|
||||
|
||||
|
||||
### `DistroIndex.rcf: string/url`
|
||||
|
||||
A URL to a DPSoftware RCF feed. Used for loading news.
|
||||
|
||||
---
|
||||
|
||||
## Server Object
|
||||
|
||||
#### Example
|
||||
```JSON
|
||||
{
|
||||
"id": "Example_Server",
|
||||
"name": "WesterosCraft Example Client",
|
||||
"description": "Example WesterosCraft server. Connect for fun!",
|
||||
"icon": "http://mc.westeroscraft.com/WesterosCraftLauncher/files/example_icon.png",
|
||||
"version": "0.0.1",
|
||||
"address": "mc.westeroscraft.com:1337",
|
||||
"minecraftVersion": "1.11.2",
|
||||
"discord": {
|
||||
"shortId": "Example",
|
||||
"largeImageText": "WesterosCraft Example Server",
|
||||
"largeImageKey": "server-example"
|
||||
},
|
||||
"mainServer": true,
|
||||
"autoconnect": true,
|
||||
"modules": []
|
||||
}
|
||||
```
|
||||
|
||||
### `Server.id: string`
|
||||
|
||||
The ID of the server. The launcher saves mod configurations and selected servers by ID. If the ID changes, all data related to the old ID **will be wiped**.
|
||||
|
||||
### `Server.name: string`
|
||||
|
||||
The name of the server. This is what users see on the UI.
|
||||
|
||||
### `Server.description: string`
|
||||
|
||||
A brief description of the server. Displayed on the UI to provide users more information.
|
||||
|
||||
### `Server.icon: string/url`
|
||||
|
||||
A URL to the server's icon. Will be displayed on the UI.
|
||||
|
||||
### `Server.version: string/semver`
|
||||
|
||||
The version of the server configuration.
|
||||
|
||||
### `Server.address: string/url`
|
||||
|
||||
The server's IP address.
|
||||
|
||||
### `Server.minecraftVersion: string`
|
||||
|
||||
The version of minecraft that the server is running.
|
||||
|
||||
### `Server.discord: object`
|
||||
|
||||
Server specific settings used for [Discord Rich Presence](https://discordapp.com/developers/docs/rich-presence/how-to).
|
||||
|
||||
**Properties**
|
||||
|
||||
* `discord.shortId: string` - Short ID for the server. Displayed on the second status line as `Server: shortId`
|
||||
* `discord.largeImageText: string` - Ttooltip for the `largeImageKey`.
|
||||
* `discord.largeImageKey: string` - Name of the uploaded image for the large profile artwork.
|
||||
|
||||
### `Server.mainServer: boolean`
|
||||
|
||||
Only one server in the array should have the `mainServer` property enabled. This will tell the launcher that this is the default server to select if either the previously selected server is invalid, or there is no previously selected server. If this field is not defined by any server (avoid this), the first server will be selected as the default. If multiple servers have `mainServer` enabled, the first one the launcher finds will be the effective value. Servers which are not the default may omit this property rather than explicitly setting it to false.
|
||||
|
||||
### `Server.autoconnect: boolean`
|
||||
|
||||
Whether or not the server can be autoconnected to. If false, the server will not be autoconnected to even when the user has the autoconnect setting enabled.
|
||||
|
||||
### `Server.javaOptions: JavaOptions`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
Sever-specific Java options. If not provided, defaults are used by the client.
|
||||
|
||||
### `Server.modules: Module[]`
|
||||
|
||||
An array of module objects.
|
||||
|
||||
---
|
||||
|
||||
## JavaOptions Object
|
||||
|
||||
Server-specific Java options.
|
||||
|
||||
#### Example
|
||||
```JSON
|
||||
{
|
||||
"supported": ">=17",
|
||||
"suggestedMajor": 17,
|
||||
"platformOptions": [
|
||||
{
|
||||
"platform": "darwin",
|
||||
"architecture": "arm64",
|
||||
"distribution": "CORRETTO"
|
||||
}
|
||||
],
|
||||
"ram": {
|
||||
"recommended": 3072,
|
||||
"minimum": 2048
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### `JavaOptions.platformOptions: JavaPlatformOptions[]`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
Platform-specific java rules for this server configuration. Validation rules will be delegated to the client for any undefined properties. Java validation can be configured for specific platforms and architectures. The most specific ruleset will be applied.
|
||||
|
||||
Maxtrix Precedence (Highest - Lowest)
|
||||
- Current platform, current architecture (ex. win32 x64).
|
||||
- Current platform, any architecture (ex. win32).
|
||||
- Java Options base properties.
|
||||
- Client logic (default logic in the client).
|
||||
|
||||
Properties:
|
||||
|
||||
- `platformOptions.platform: string` - The platform that this validation matrix applies to.
|
||||
- `platformOptions.architecture: string` - Optional. The architecture that this validation matrix applies to. If omitted, applies to all architectures.
|
||||
- `platformOptions.distribution: string` - Optional. See `JavaOptions.distribution`.
|
||||
- `platformOptions.supported: string` - Optional. See `JavaOptions.supported`.
|
||||
- `platformOptions.suggestedMajor: number` - Optional. See `JavaOptions.suggestedMajor`.
|
||||
|
||||
### `JavaOptions.ram: object`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
This allows you to require a minimum and recommended amount of RAM per server instance. The minimum is the smallest value the user can select in the settings slider. The recommended value will be the default value selected for that server. These values are specified in megabytes and must be an interval of 512. This allows configuration in intervals of half gigabytes. In the above example, the recommended ram value is 3 GB (3072 MB) and the minimum is 2 GB (2048 MB).
|
||||
|
||||
- `ram.recommended: number` - The recommended amount of RAM in megabytes. Must be an interval of 512.
|
||||
- `ram.minimum: number` - The absolute minimum amount of RAM in megabytes. Must be an interval of 512.
|
||||
|
||||
### `JavaOptions.distribution: string`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
Preferred JDK distribution to download if no applicable installation could be found. If omitted, the client will decide (decision may be platform-specific).
|
||||
|
||||
### `JavaOptions.supported: string`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
A semver range of supported JDK versions.
|
||||
|
||||
Java version syntax is platform dependent.
|
||||
|
||||
JDK 8 and prior
|
||||
```
|
||||
1.{major}.{minor}_{patch}-b{build}
|
||||
Ex. 1.8.0_152-b16
|
||||
```
|
||||
|
||||
JDK 9+
|
||||
```
|
||||
{major}.{minor}.{patch}+{build}
|
||||
Ex. 11.0.12+7
|
||||
```
|
||||
|
||||
For processing, all versions will be translated into a semver compliant string. JDK 9+ is already semver. For versions 8 and below, `1.{major}.{minor}_{patch}-b{build}` will be translated to `{major}.{minor}.{patch}+{build}`.
|
||||
|
||||
If specified, you must also specify suggestedMajor.
|
||||
|
||||
If omitted, the client will decide based on the game version.
|
||||
|
||||
### `JavaOptions.suggestedMajor: number`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
The suggested major Java version. The suggested major should comply with the version range specified by supported, if defined. This will be used in messages displayed to the end user, and to automatically fetch a Java version.
|
||||
|
||||
NOTE If supported is specified, suggestedMajor must be set. The launcher's default value may not comply with your custom major supported range.
|
||||
|
||||
Common use case:
|
||||
- supported: '>=17.x'
|
||||
- suggestedMajor: 17
|
||||
|
||||
More involved:
|
||||
- supported: '>=16 <20'
|
||||
- suggestedMajor: 17
|
||||
|
||||
Given a wider support range, it becomes necessary to specify which major version in the range is the suggested.
|
||||
|
||||
---
|
||||
|
||||
## Module Object
|
||||
|
||||
A module is a generic representation of a file required to run the minecraft client.
|
||||
|
||||
#### Example
|
||||
```JSON
|
||||
{
|
||||
"id": "com.example:artifact:1.0.0@jar.pack.xz",
|
||||
"name": "Artifact 1.0.0",
|
||||
"type": "Library",
|
||||
"artifact": {
|
||||
"size": 4231234,
|
||||
"MD5": "7f30eefe5c51e1ae0939dab2051db75f",
|
||||
"url": "http://files.site.com/maven/com/example/artifact/1.0.0/artifact-1.0.0.jar.pack.xz"
|
||||
},
|
||||
"subModules": [
|
||||
{
|
||||
"id": "examplefile",
|
||||
"name": "Example File",
|
||||
"type": "File",
|
||||
"artifact": {
|
||||
"size": 23423,
|
||||
"MD5": "169a5e6cf30c2cc8649755cdc5d7bad7",
|
||||
"path": "examplefile.txt",
|
||||
"url": "http://files.site.com/examplefile.txt"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
The parent module will be stored maven style, it's destination path will be resolved by its id. The sub module has a declared `path`, so that value will be used.
|
||||
|
||||
### `Module.id: string`
|
||||
|
||||
The ID of the module. All modules that are not of type `File` **MUST** use a maven identifier. Version information and other metadata is pulled from the identifier. Modules which are stored maven style use the identifier to resolve the destination path. If the `extension` is not provided, it defaults to `jar`.
|
||||
|
||||
**Template**
|
||||
|
||||
`my.group:arifact:version@extension`
|
||||
|
||||
`my/group/artifact/version/artifact-version.extension`
|
||||
|
||||
**Example**
|
||||
|
||||
`net.minecraft:launchwrapper:1.12` OR `net.minecraft:launchwrapper:1.12@jar`
|
||||
|
||||
`net/minecraft/launchwrapper/1.12/launchwrapper-1.12.jar`
|
||||
|
||||
If the module's artifact does not declare the `path` property, its path will be resolved from the ID.
|
||||
|
||||
### `Module.name: string`
|
||||
|
||||
The name of the module. Used on the UI.
|
||||
|
||||
### `Module.type: string`
|
||||
|
||||
The type of the module.
|
||||
|
||||
### `Module.classpath: boolean`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
If the module is of type `Library`, whether the library should be added to the classpath. Defaults to true.
|
||||
|
||||
### `Module.required: Required`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
Defines whether or not the module is required. If omitted, then the module will be required.
|
||||
|
||||
Only applicable for modules of type:
|
||||
* `ForgeMod`
|
||||
* `LiteMod`
|
||||
* `LiteLoader`
|
||||
|
||||
|
||||
### `Module.artifact: Artifact`
|
||||
|
||||
The download artifact for the module.
|
||||
|
||||
### `Module.subModules: Module[]`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
An array of sub modules declared by this module. Typically, files which require other files are declared as submodules. A quick example would be a mod, and the configuration file for that mod. Submodules can also declare submodules of their own. The file is parsed recursively, so there is no limit.
|
||||
|
||||
|
||||
## Artifact Object
|
||||
|
||||
The format of the module's artifact depends on several things. The most important factor is where the file will be stored. If you are providing a simple file to be placed in the root directory of the client files, you may decided to format the module as the `examplefile` module declared above. This module provides a `path` option, allowing you to directly set where the file will be saved to. Only the `path` will affect the final downloaded file.
|
||||
|
||||
Other times, you may want to store the files maven-style, such as with libraries and mods. In this case you must declare the module as the example artifact above. The module `id` will be used to resolve the final path, effectively replacing the `path` property. It must be provided in maven format. More information on this is provided in the documentation for the `id` property.
|
||||
|
||||
The resolved/provided paths are appended to a base path depending on the module's declared type.
|
||||
|
||||
| Type | Path |
|
||||
| ---- | ---- |
|
||||
| `ForgeHosted` | ({`commonDirectory`}/libraries/{`path` OR resolved}) |
|
||||
| `Fabric` | ({`commonDirectory`}/libraries/{`path` OR resolved}) |
|
||||
| `LiteLoader` | ({`commonDirectory`}/libraries/{`path` OR resolved}) |
|
||||
| `Library` | ({`commonDirectory`}/libraries/{`path` OR resolved}) |
|
||||
| `ForgeMod` | ({`commonDirectory`}/modstore/{`path` OR resolved}) |
|
||||
| `LiteMod` | ({`commonDirectory`}/modstore/{`path` OR resolved}) |
|
||||
| `FabricMod` | ({`commonDirectory`}/mods/fabric/{`path` OR resolved}) |
|
||||
| `File` | ({`instanceDirectory`}/{`Server.id`}/{`path` OR resolved}) |
|
||||
|
||||
The `commonDirectory` and `instanceDirectory` values are stored in the launcher's config.json.
|
||||
|
||||
### `Artifact.size: number`
|
||||
|
||||
The size of the artifact.
|
||||
|
||||
### `Artifact.MD5: string`
|
||||
|
||||
The MD5 hash of the artifact. This will be used to validate local artifacts.
|
||||
|
||||
### `Artifact.path: string`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
A relative path to where the file will be saved. This is appended to the base path for the module's declared type.
|
||||
|
||||
If this is not specified, the path will be resolved based on the module's ID.
|
||||
|
||||
### `Artifact.url: string/url`
|
||||
|
||||
The artifact's download url.
|
||||
|
||||
## Required Object
|
||||
|
||||
### `Required.value: boolean`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
If the module is required. Defaults to true if this property is omited.
|
||||
|
||||
### `Required.def: boolean`
|
||||
|
||||
**OPTIONAL**
|
||||
|
||||
If the module is enabled by default. Has no effect unless `Required.value` is false. Defaults to true if this property is omited.
|
||||
|
||||
---
|
||||
|
||||
## Module Types
|
||||
|
||||
### ForgeHosted
|
||||
|
||||
The module type `ForgeHosted` represents forge itself. Currently, the launcher only supports modded servers, as vanilla servers can be connected to via the mojang launcher. The `Hosted` part is key, this means that the forge module must declare its required libraries as submodules.
|
||||
|
||||
Ex.
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "net.minecraftforge:forge:1.11.2-13.20.1.2429",
|
||||
"name": "Minecraft Forge 1.11.2-13.20.1.2429",
|
||||
"type": "ForgeHosted",
|
||||
"artifact": {
|
||||
"size": 4450992,
|
||||
"MD5": "3fcc9b0104f0261397d3cc897e55a1c5",
|
||||
"url": "http://files.minecraftforge.net/maven/net/minecraftforge/forge/1.11.2-13.20.1.2429/forge-1.11.2-13.20.1.2429-universal.jar"
|
||||
},
|
||||
"subModules": [
|
||||
{
|
||||
"id": "net.minecraft:launchwrapper:1.12",
|
||||
"name": "Mojang (LaunchWrapper)",
|
||||
"type": "Library",
|
||||
"artifact": {
|
||||
"size": 32999,
|
||||
"MD5": "934b2d91c7c5be4a49577c9e6b40e8da",
|
||||
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/files/1.11.2/launchwrapper-1.12.jar"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
All of forge's required libraries are declared in the `version.json` file found in the root of the forge jar file. These libraries MUST be hosted and declared a submodules or forge will not work.
|
||||
|
||||
There were plans to add a `Forge` type, in which the required libraries would be resolved by the launcher and downloaded from forge's servers. The forge servers are down at times, however, so this plan was stopped half-implemented.
|
||||
|
||||
---
|
||||
|
||||
### Fabric
|
||||
|
||||
The module type `Fabric` represents the fabric mod loader. Currently, the launcher only supports modded servers, as vanilla servers can be connected to via the mojang launcher.
|
||||
|
||||
Ex.
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "net.fabricmc:fabric-loader:0.15.0",
|
||||
"name": "Fabric (fabric-loader)",
|
||||
"type": "Fabric",
|
||||
"artifact": {
|
||||
"size": 1196222,
|
||||
"MD5": "a43d5a142246801343b6cedef1c102c4",
|
||||
"url": "http://localhost:8080/repo/lib/net/fabricmc/fabric-loader/0.15.0/fabric-loader-0.15.0.jar"
|
||||
},
|
||||
"subModules": [
|
||||
{
|
||||
"id": "1.20.1-fabric-0.15.0",
|
||||
"name": "Fabric (version.json)",
|
||||
"type": "VersionManifest",
|
||||
"artifact": {
|
||||
"size": 2847,
|
||||
"MD5": "69a2bd43452325ba1bc882fa0904e054",
|
||||
"url": "http://localhost:8080/repo/versions/1.20.1-fabric-0.15.0/1.20.1-fabric-0.15.0.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Fabric works similarly to Forge 1.13+.
|
||||
|
||||
---
|
||||
|
||||
### LiteLoader
|
||||
|
||||
The module type `LiteLoader` represents liteloader. It is handled as a library and added to the classpath at runtime. Special launch conditions are executed when liteloader is present and enabled. This module can be optional and toggled similarly to `ForgeMod` and `Litemod` modules.
|
||||
|
||||
Ex.
|
||||
```json
|
||||
{
|
||||
"id": "com.mumfrey:liteloader:1.11.2",
|
||||
"name": "Liteloader (1.11.2)",
|
||||
"type": "LiteLoader",
|
||||
"required": {
|
||||
"value": false,
|
||||
"def": false
|
||||
},
|
||||
"artifact": {
|
||||
"size": 1685422,
|
||||
"MD5": "3a98b5ed95810bf164e71c1a53be568d",
|
||||
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/files/1.11.2/liteloader-1.11.2.jar"
|
||||
},
|
||||
"subModules": [
|
||||
"All LiteMods go here"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Library
|
||||
|
||||
The module type `Library` represents a library file which will be required to start the minecraft process. Each library module will be dynamically added to the `-cp` (classpath) argument while building the game process.
|
||||
|
||||
Ex.
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "net.sf.jopt-simple:jopt-simple:4.6",
|
||||
"name": "Jopt-simple 4.6",
|
||||
"type": "Library",
|
||||
"artifact": {
|
||||
"size": 62477,
|
||||
"MD5": "13560a58a79b46b82057686543e8d727",
|
||||
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/files/1.11.2/jopt-simple-4.6.jar"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### ForgeMod
|
||||
|
||||
The module type `ForgeMod` represents a mod loaded by the Forge Mod Loader (FML). These files are stored maven-style and passed to FML using forge's [Modlist format](https://github.com/MinecraftForge/FML/wiki/New-JSON-Modlist-format).
|
||||
|
||||
Ex.
|
||||
```json
|
||||
{
|
||||
"id": "com.westeroscraft:westerosblocks:3.0.0-beta-6-133",
|
||||
"name": "WesterosBlocks (3.0.0-beta-6-133)",
|
||||
"type": "ForgeMod",
|
||||
"artifact": {
|
||||
"size": 16321712,
|
||||
"MD5": "5a89e2ab18916c18965fc93a0766cc6e",
|
||||
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/mods/WesterosBlocks.jar"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### LiteMod
|
||||
|
||||
The module type `LiteMod` represents a mod loaded by liteloader. These files are stored maven-style and passed to liteloader using forge's [Modlist format](https://github.com/MinecraftForge/FML/wiki/New-JSON-Modlist-format). Documentation for liteloader's implementation of this can be found on [this issue](http://develop.liteloader.com/liteloader/LiteLoader/issues/34).
|
||||
|
||||
Ex.
|
||||
```json
|
||||
{
|
||||
"id": "com.mumfrey:macrokeybindmod:0.14.4-1.11.2@litemod",
|
||||
"name": "Macro/Keybind Mod (0.14.4-1.11.2)",
|
||||
"type": "LiteMod",
|
||||
"required": {
|
||||
"value": false,
|
||||
"def": false
|
||||
},
|
||||
"artifact": {
|
||||
"size": 1670811,
|
||||
"MD5": "16080785577b391d426c62c8d3138558",
|
||||
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/mods/macrokeybindmod.litemod"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### File
|
||||
|
||||
The module type `file` represents a generic file required by the client, another module, etc. These files are stored in the server's instance directory.
|
||||
|
||||
Ex.
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "com.westeroscraft:westeroscraftrp:2017-08-16",
|
||||
"name": "WesterosCraft Resource Pack (2017-08-16)",
|
||||
"type": "file",
|
||||
"artifact": {
|
||||
"size": 45241339,
|
||||
"MD5": "ec2d9fdb14d5c2eafe5975a240202f1a",
|
||||
"path": "resourcepacks/WesterosCraft.zip",
|
||||
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/resourcepacks/WesterosCraft.zip"
|
||||
}
|
||||
}
|
||||
```
|
@ -224,7 +224,7 @@
|
||||
"type": "ForgeMod",
|
||||
"artifact": {
|
||||
"size": 17376788,
|
||||
"MD5": "370f4f1804c93f498f31af8dac509605",
|
||||
"MD5": "370f4f1804c93f498f31af8dac509605",
|
||||
"url": "http://mc.westeroscraft.com/WesterosCraftLauncher/prod-1.11.2/mods/WesterosBlocks.jar"
|
||||
}
|
||||
},
|
||||
|
@ -1,5 +1,5 @@
|
||||
appId: 'helioslauncher'
|
||||
productName: 'Helios Launcher'
|
||||
appId: 'dmblauncher'
|
||||
productName: 'DMB Launcher'
|
||||
artifactName: '${productName}-setup-${version}.${ext}'
|
||||
|
||||
copyright: 'Copyright © 2018-2024 Daniel Scalzi'
|
||||
|
6
index.js
6
index.js
@ -227,9 +227,9 @@ let win
|
||||
function createWindow() {
|
||||
|
||||
win = new BrowserWindow({
|
||||
width: 980,
|
||||
height: 552,
|
||||
icon: getPlatformIcon('SealCircle'),
|
||||
width: 1280,
|
||||
height: 720,
|
||||
//icon: getPlatformIcon('SealCircle'),
|
||||
frame: false,
|
||||
webPreferences: {
|
||||
preload: path.join(__dirname, 'app', 'assets', 'js', 'preloader.js'),
|
||||
|
55
package-lock.json
generated
55
package-lock.json
generated
@ -1,16 +1,17 @@
|
||||
{
|
||||
"name": "helioslauncher",
|
||||
"name": "dmblauncher",
|
||||
"version": "2.2.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "helioslauncher",
|
||||
"name": "dmblauncher",
|
||||
"version": "2.2.1",
|
||||
"license": "UNLICENSED",
|
||||
"license": "UNLICENSED/MIT (Some part of DPSoftware)",
|
||||
"dependencies": {
|
||||
"@electron/remote": "^2.1.2",
|
||||
"adm-zip": "^0.5.12",
|
||||
"axios": "^1.7.7",
|
||||
"discord-rpc-patch": "^4.0.1",
|
||||
"ejs": "^3.1.10",
|
||||
"ejs-electron": "^3.0.0",
|
||||
@ -21,6 +22,7 @@
|
||||
"helios-core": "~2.2.1",
|
||||
"helios-distribution-types": "^1.3.0",
|
||||
"jquery": "^3.7.1",
|
||||
"lodash": "^4.17.21",
|
||||
"lodash.merge": "^4.6.2",
|
||||
"semver": "^7.6.0",
|
||||
"toml": "^3.0.0"
|
||||
@ -1084,8 +1086,7 @@
|
||||
"node_modules/asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
|
||||
"dev": true
|
||||
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
|
||||
},
|
||||
"node_modules/at-least-node": {
|
||||
"version": "1.0.0",
|
||||
@ -1096,6 +1097,17 @@
|
||||
"node": ">= 4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/axios": {
|
||||
"version": "1.7.7",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
|
||||
"integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.15.6",
|
||||
"form-data": "^4.0.0",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/b4a": {
|
||||
"version": "1.6.6",
|
||||
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz",
|
||||
@ -1502,7 +1514,6 @@
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"delayed-stream": "~1.0.0"
|
||||
},
|
||||
@ -1743,7 +1754,6 @@
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
@ -2459,6 +2469,26 @@
|
||||
"resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
|
||||
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
|
||||
},
|
||||
"node_modules/follow-redirects": {
|
||||
"version": "1.15.9",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
|
||||
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/RubenVerborgh"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=4.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"debug": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/foreground-child": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
|
||||
@ -2479,7 +2509,6 @@
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
||||
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
@ -3276,7 +3305,7 @@
|
||||
"version": "4.17.21",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
||||
"dev": true
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/lodash.defaults": {
|
||||
"version": "4.2.0",
|
||||
@ -3398,7 +3427,6 @@
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
@ -3407,7 +3435,6 @@
|
||||
"version": "2.1.35",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"mime-db": "1.52.0"
|
||||
},
|
||||
@ -3759,6 +3786,12 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/proxy-from-env": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
||||
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/pump": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
|
||||
|
16
package.json
16
package.json
@ -1,18 +1,18 @@
|
||||
{
|
||||
"name": "helioslauncher",
|
||||
"name": "dmblauncher",
|
||||
"version": "2.2.1",
|
||||
"productName": "Helios Launcher",
|
||||
"description": "Modded Minecraft Launcher",
|
||||
"author": "Daniel Scalzi (https://github.com/dscalzi/)",
|
||||
"license": "UNLICENSED",
|
||||
"homepage": "https://github.com/dscalzi/HeliosLauncher",
|
||||
"productName": "DMB Launcher",
|
||||
"description": "Modded Minecraft Launcher for DMB project",
|
||||
"author": "Daniel Scalzi (https://github.com/dscalzi/), damp11113",
|
||||
"license": "UNLICENSED/MIT (Some part of DPSoftware)",
|
||||
"homepage": "https://damp11113.xyz",
|
||||
"bugs": {
|
||||
"url": "https://github.com/dscalzi/HeliosLauncher/issues"
|
||||
},
|
||||
"private": true,
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "electron .",
|
||||
"dev": "electron .",
|
||||
"dist": "electron-builder build",
|
||||
"dist:win": "npm run dist -- -w",
|
||||
"dist:mac": "npm run dist -- -m",
|
||||
@ -25,6 +25,7 @@
|
||||
"dependencies": {
|
||||
"@electron/remote": "^2.1.2",
|
||||
"adm-zip": "^0.5.12",
|
||||
"axios": "^1.7.7",
|
||||
"discord-rpc-patch": "^4.0.1",
|
||||
"ejs": "^3.1.10",
|
||||
"ejs-electron": "^3.0.0",
|
||||
@ -35,6 +36,7 @@
|
||||
"helios-core": "~2.2.1",
|
||||
"helios-distribution-types": "^1.3.0",
|
||||
"jquery": "^3.7.1",
|
||||
"lodash": "^4.17.21",
|
||||
"lodash.merge": "^4.6.2",
|
||||
"semver": "^7.6.0",
|
||||
"toml": "^3.0.0"
|
||||
|
Loading…
x
Reference in New Issue
Block a user