Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
7 changes: 6 additions & 1 deletion GAMES_LIST.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 | |
Expand Down Expand Up @@ -459,3 +459,8 @@ option: `requestRules: true`. Beware that this may increase query time.

### <a name="epic"></a>Epic Online Services (EOS) Protocol
EOS does not provide players data.

### <a name="palworld"></a>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.
5 changes: 3 additions & 2 deletions lib/games.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
38 changes: 25 additions & 13 deletions protocols/palworld.js
Original file line number Diff line number Diff line change
@@ -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
}
}
2 changes: 1 addition & 1 deletion tools/generate_games_list.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down