diff --git a/CHANGELOG.md b/CHANGELOG.md
index b27dfb9..6832787 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,7 @@
* Myth of Empires - Added support.
* Fix: BeamMP maxplayers that was displaying player count (By @dgibbs64 #551)
* Fix: BeamMP filter servers by address, not host (By @Rephot #558)
+* Palworld - Replace old and broken protocol with the new one (#560)
## 5.0.0-beta.2
* Fixed support for projects using `require`.
diff --git a/GAMES_LIST.md b/GAMES_LIST.md
index 5ce2199..5d8a229 100644
--- a/GAMES_LIST.md
+++ b/GAMES_LIST.md
@@ -210,7 +210,7 @@
| openarena | OpenArena | |
| openttd | OpenTTD | |
| painkiller | Painkiller | |
-| palworld | Palworld | [EOS Protocol](#epic) |
+| palworld | Palworld | [Notes](#palworld) |
| pce | Primal Carnage: Extinction | [Valve Protocol](#valve) |
| pixark | PixARK | [Valve Protocol](#valve) |
| postal2 | Postal 2 | |
@@ -459,3 +459,8 @@ option: `requestRules: true`. Beware that this may increase query time.
### Epic Online Services (EOS) Protocol
EOS does not provide players data.
+
+### Palworld
+Palworld support can be unstable, the devs mention the api is currently experimental.
+To query palworld servers, the `RESTAPIEnabled` must be `True` in the configuration file, and you need to pass
+the `username` (currently always `admin`) and `password` (settings parameter) for it.
diff --git a/lib/games.js b/lib/games.js
index 253f599..aa05a77 100644
--- a/lib/games.js
+++ b/lib/games.js
@@ -2092,8 +2092,9 @@ export const games = {
name: 'Palworld',
release_year: 2024,
options: {
- port: 8211,
- protocol: 'palworld'
+ port: 8212,
+ protocol: 'palworld',
+ doc_notes: 'palworld'
}
},
pvak2: {
diff --git a/protocols/palworld.js b/protocols/palworld.js
index 0e9f21f..33b8bb8 100644
--- a/protocols/palworld.js
+++ b/protocols/palworld.js
@@ -1,20 +1,32 @@
-import Epic from './epic.js'
+import Core from './core.js'
-export default class palworld extends Epic {
- constructor () {
- super()
+export default class palworld extends Core {
+ async makeCall (endpoint) {
+ const url = `http://${this.options.host}:${this.options.port}/v1/api/${endpoint}`
+ const headers = {
+ Authorization: `Basic ${Buffer.from(`${this.options.username}:${this.options.password}`).toString('base64')}`,
+ Accept: 'application/json'
+ }
- // OAuth2 credentials extracted from Palworld files.
- this.clientId = 'xyza78916PZ5DF0fAahu4tnrKKyFpqRE'
- this.clientSecret = 'j0NapLEPm3R3EOrlQiM8cRLKq3Rt02ZVVwT0SkZstSg'
- this.deploymentId = '0a18471f93d448e2a1f60e47e03d3413'
- this.authByExternalToken = true
+ return await this.request({ url, headers, method: 'GET', responseType: 'json' })
}
async run (state) {
- await super.run(state)
- state.name = state.raw.attributes.NAME_s
- state.numplayers = state.raw.attributes.PLAYERS_l
- state.version = state.raw.attributes.VERSION_S
+ const serverInfo = await this.makeCall('info')
+ state.version = serverInfo.version
+ state.name = serverInfo.servername
+ state.raw.serverInfo = serverInfo
+
+ const { players } = await this.makeCall('players')
+ state.numplayers = players.length
+ state.players = players.map(p => p.name)
+ state.raw.players = players
+
+ state.raw.settings = await this.makeCall('settings')
+
+ const metrics = await this.makeCall('metrics')
+ state.numplayers = metrics.currentplayernum
+ state.maxplayers = metrics.maxplayernum
+ state.raw.metrics = metrics
}
}
diff --git a/tools/generate_games_list.js b/tools/generate_games_list.js
index d0c6146..7ec0e0d 100644
--- a/tools/generate_games_list.js
+++ b/tools/generate_games_list.js
@@ -34,7 +34,7 @@ for (const id in sortedGames) {
if (game.options.protocol === 'valve' || game.options.protocol === 'dayz') {
notes.push('[Valve Protocol](#valve)')
}
- if (game.options.protocol === 'epic' || game.options.protocol === 'asa' || game.options.protocol === 'palworld' || game.options.protocol === 'theisleevrima') {
+ if (game.options.protocol === 'epic' || game.options.protocol === 'asa' || game.options.protocol === 'theisleevrima') {
notes.push('[EOS Protocol](#epic)')
}
if (notes.length) {