feat: Add support for AltvMP (#588)

* feat: Add Minetest support using serverlist

* Allow for connect to be assigned,

* Add serverId to the string args

* Add altvmp implementation

* Added altv to games.

* Add changelog entry

* Update CHANGELOG.md with state.connect
This commit is contained in:
James Causon 2024-07-17 16:10:06 +01:00 committed by GitHub
parent 38229cde3b
commit bdb819d0f8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 88 additions and 3 deletions

View File

@ -2,6 +2,8 @@
## To Be Released...
## 5.X.Y
* FOUNDRY - Added support (#585)
* Grand Theft Auto V: AltVMP - Added support (By @xCausxn #588)
* Fix ability to manual set `state.connect` (By @xCausxn #588)
## 5.0.1
* Minetest - Added support for minetest utilizing official server list (By @xCausxn #573)

View File

@ -139,6 +139,7 @@
| groundbreach | Ground Breach | [Valve Protocol](#valve) |
| gta5f | Grand Theft Auto V - FiveM | |
| gta5r | Grand Theft Auto V - RAGE MP | [Notes](#gta5r) |
| gta5a | Grand Theft Auto V - AltVMP | [Notes](#gta5a) |
| gtasam | Grand Theft Auto: San Andreas Multiplayer | |
| gtasamta | Grand Theft Auto: San Andreas - Multi Theft Auto | |
| gtasao | Grand Theft Auto: San Andreas OpenMP | |
@ -422,6 +423,13 @@ Pass the login into to GameDig with the additional options: login, password
If you are using a FQDN for your server, you will need to set the host parameter to be this domain e.g. rage2.mydomain.com
This is due to how the Rage MP master server works with server ids as the ip is only used in the ID if no FQDN is provided.
### <a name="gta5a"></a> Grand Theft Auto V - AltV MP
When querying a server on AltV MP, you have two options for querying the server:
1. Setting the `serverId` request field or `--serverId` when using the cli to the publicId of the server.
2. Passing the `host` and `port` request fields or `--host` and `--port` when using the cli to the server.
If you are using the second option and the server is using a `useCdn` option in the altv server config file, you will need to set `host` to the CDN address, and the `port` to the cdn port. As an example, if the server cdn url was `connect.altv.com:443`, you would set the host to `connect.altv.com` and port to `443`.
### <a name="teamspeak3"></a>TeamSpeak 3
For teamspeak 3 queries to work correctly, the following permissions must be available for the guest server group:

View File

@ -7,7 +7,7 @@ import { GameDig } from './../lib/index.js'
const argv = Minimist(process.argv.slice(2), {
boolean: ['pretty', 'debug', 'givenPortOnly', 'requestRules', 'requestRulesRequired', 'requestPlayersRequired', 'stripColors', 'portCache', 'noBreadthOrder', 'checkOldIDs'],
string: ['guildId', 'listenUdpPort', 'ipFamily', 'token'],
string: ['guildId', 'serverId', 'listenUdpPort', 'ipFamily', 'token'],
default: {
stripColors: true,
portCache: true

View File

@ -1289,6 +1289,17 @@ export const games = {
doc_notes: 'gta5r'
}
},
gta5a: {
name: 'Grand Theft Auto V - AltVMP',
release_year: 2015,
options: {
port: 7788,
protocol: 'altvmp'
},
extra: {
doc_notes: 'gta5a'
}
},
garrysmod: {
name: "Garry's Mod",
release_year: 2004,

63
protocols/altvmp.js Normal file
View File

@ -0,0 +1,63 @@
import Core from './core.js'
export default class altvmp extends Core {
constructor() {
super()
this.usedTcp = true
}
async getServerFromMasterList() {
const targetID = `${this.options.host}:${this.options.port}`
const results = await this.request({
url: 'https://api.alt-mp.com/servers',
responseType: 'json'
})
if (results == null) {
throw new Error('Unable to retrieve master server list')
}
const serverInfo = results.find((server) => {
// If the server uses a CDN, there could be occasional paths in the address, so we are checking for them.
// If the server does not use a CDN, there will be no paths in the address and direct comparison will work.
const address = server.useCdn
? server.address
: server.address.replace(/(https?:\/\/)?\/?/g, '')
return address === targetID
})
return serverInfo
}
async getServerById(targetID) {
const serverInfo = await this.request({
url: `https://api.alt-mp.com/servers/${targetID}`,
responseType: 'json'
})
if (serverInfo == null) {
throw new Error('Unable to retrieve server info')
}
return serverInfo
}
async run(state) {
const serverInfo = this.options.serverId
? await this.getServerById(this.options.serverId)
: await this.getServerFromMasterList()
if (!serverInfo) {
throw new Error('No server info was found.')
}
state.name = serverInfo.name
state.numplayers = serverInfo.playersCount
state.maxplayers = serverInfo.maxPlayersCount
state.password = serverInfo.passworded
state.version = serverInfo.version
state.connect = `altv://${serverInfo.address}`
state.raw = serverInfo
}
}

View File

@ -84,7 +84,7 @@ export default class Core extends EventEmitter {
state.queryPort = options.port
// because lots of servers prefix with spaces to try to appear first
state.name = (state.name || '').trim()
state.connect = `${state.gameHost || options.host || options.address}:${state.gamePort || options.port}`
state.connect = state.connect || `${state.gameHost || options.host || options.address}:${state.gamePort || options.port}`
state.ping = this.shortestRTT
delete state.gameHost

View File

@ -59,11 +59,12 @@ import dayz from './dayz.js'
import theisleevrima from './theisleevrima.js'
import ragemp from './ragemp.js'
import xonotic from './xonotic.js'
import altvmp from './altvmp.js'
export {
armagetron, ase, asa, assettocorsa, battlefield, buildandshoot, cs2d, discord, doom3, eco, epic, factorio, farmingsimulator, ffow,
fivem, gamespy1, gamespy2, gamespy3, geneshift, goldsrc, gtasao, hexen2, jc2mp, kspdmp, mafia2mp, mafia2online, minecraft,
minecraftbedrock, minecraftvanilla, minetest, mumble, mumbleping, nadeo, openttd, palworld, quake1, quake2, quake3, rfactor, ragemp, samp,
savage2, starmade, starsiege, teamspeak2, teamspeak3, terraria, tribes1, tribes1master, unreal2, ut3, valve,
vcmp, ventrilo, warsow, eldewrito, beammpmaster, beammp, dayz, theisleevrima, xonotic
vcmp, ventrilo, warsow, eldewrito, beammpmaster, beammp, dayz, theisleevrima, xonotic, altvmp
}