Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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 .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
/dist
# Deno bin/gamedig executable
gamedig
/.claude

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please restore this change as I'll do it myself alongside a note related to this.

4 changes: 4 additions & 0 deletions GAMES_LIST.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
| asr08 | Arca Sim Racing '08 | |
| assettocorsa | Assetto Corsa | |
| atlas | Atlas | [Valve Protocol](#valve) |
| ats | American Truck Simulator | [Valve Protocol](#valve) |
| avorion | Avorion | [Valve Protocol](#valve) |
| avp2 | Aliens versus Predator 2 | |
| avp2010 | Aliens vs. Predator 2010 | [Valve Protocol](#valve) |
Expand Down Expand Up @@ -190,6 +191,7 @@
| mbe | Minecraft: Bedrock Edition | |
| medievalengineers | Medieval Engineers | [Valve Protocol](#valve) |
| mgm | Mumble - GT Murmur | [Notes](#mumble) |
| mindustry | Mindustry | |
| minecraft | Minecraft | [Notes](#minecraft) |
| minetest | Minetest | |
| mnc | Monday Night Combat | [Valve Protocol](#valve) |
Expand Down Expand Up @@ -303,6 +305,7 @@
| synergy | Synergy | [Valve Protocol](#valve) |
| t1s | Tribes 1: Starsiege | |
| tacticalops | Tactical Ops | |
| tce | The Cenozoic Era | [Valve Protocol](#valve) |
| tcgraw | Tom Clancy's Ghost Recon Advanced Warfighter | |
| tcgraw2 | Tom Clancy's Ghost Recon Advanced Warfighter 2 | |
| teamfactor | Team Factor | |
Expand Down Expand Up @@ -345,6 +348,7 @@
| valheim | Valheim | [Notes](#valheim), [Valve Protocol](#valve) |
| vampireslayer | Vampire Slayer | [Valve Protocol](#valve) |
| vcm | Vice City Multiplayer | |
| vein | VEIN | [Valve Protocol](#valve) |
| ventrilo | Ventrilo | |
| vietcong | Vietcong | |
| vietcong2 | Vietcong 2 | |
Expand Down
35 changes: 35 additions & 0 deletions lib/games.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,15 @@ export const games = {
protocol: 'assettocorsa'
}
},
ats: {
name: 'American Truck Simulator',
release_year: 2016,
options: {
port: 27015,
port_query_offset: 1,
protocol: 'valve'
}
},
atlas: {
name: 'Atlas',
release_year: 2018,
Expand Down Expand Up @@ -1930,6 +1939,14 @@ export const games = {
doc_notes: 'minecraft'
}
},
mindustry: {
name: 'Mindustry',
release_year: 2017,
options: {
port: 6567,
protocol: 'mindustry'
}
},
minetest: {
name: 'Minetest',
release_year: 2010,
Expand Down Expand Up @@ -3054,6 +3071,15 @@ export const games = {
doc_notes: 'terraria'
}
},
tce: {
name: 'The Cenozoic Era',
release_year: 2024,
options: {
port: 7777,
port_query_offset: 1,
protocol: 'valve'
}
},
theforest: {
name: 'The Forest',
release_year: 2014,
Expand Down Expand Up @@ -3306,6 +3332,15 @@ export const games = {
doc_notes: 'valheim'
}
},
vein: {
name: 'VEIN',
release_year: 2024,
options: {
port: 7777,
port_query_offset: 1,
protocol: 'valve'
}
},
vcm: {
name: 'Vice City Multiplayer',
release_year: 2015,
Expand Down
3 changes: 2 additions & 1 deletion protocols/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import mafia2online from './mafia2online.js'
import minecraft from './minecraft.js'
import minecraftbedrock from './minecraftbedrock.js'
import minecraftvanilla from './minecraftvanilla.js'
import mindustry from './mindustry.js'
import minetest from './minetest.js'
import mumble from './mumble.js'
import mumbleping from './mumbleping.js'
Expand Down Expand Up @@ -80,7 +81,7 @@ import scpsl from './scpsl.js'
export {
armagetron, ase, asa, assettocorsa, battlefield, brokeprotocol, brokeprotocolmaster, buildandshoot, cs2d, discord, doom3, eco, epic, factorio, farmingsimulator, ffow,
fivem, gamespy1, gamespy2, gamespy3, geneshift, goldsrc, gtasao, hawakening, hawakeningmaster, hexen2, hytale, jc2mp, kspdmp, mafia2mp, mafia2online, minecraft,
minecraftbedrock, minecraftvanilla, minetest, mumble, mumbleping, nadeo, openttd, palworld, quake1, quake2, quake3, renegadex, renegadexmaster, renown, rfactor, ragemp, samp,
minecraftbedrock, minecraftvanilla, mindustry, minetest, mumble, mumbleping, nadeo, openttd, palworld, quake1, quake2, quake3, renegadex, renegadexmaster, renown, rfactor, ragemp, samp,
satisfactory, soldat, savage2, squad, starmade, starsiege, teamspeak2, teamspeak3, terraria, toxikk, tribes1, tribes1master, unreal2, ut3, valve,
vcmp, ventrilo, warsow, eldewrito, beammpmaster, beammp, dayz, theisleevrima, xonotic, altvmp, vintagestorymaster, vintagestory, sdtd, scpsl
}
44 changes: 44 additions & 0 deletions protocols/mindustry.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import Core from './core.js'

const GAMEMODES = ['survival', 'sandbox', 'attack', 'pvp', 'editor']

export default class mindustry extends Core {
constructor () {
super()
this.encoding = 'utf8'
this.byteorder = 'be'
}

async run (state) {
if (!this.options.port) this.options.port = 6567

// arc-net discovery request: triggers the Mindustry server to reply
// with a serialized Host struct (see Mindustry NetworkIO.writeServerData).
const request = Buffer.from([0xfe, 0x01])
const buffer = await this.udpSend(request, b => b)

const reader = this.reader(buffer)
const name = reader.pascalString(1)
const map = reader.pascalString(1)
const players = reader.int(4)
const wave = reader.int(4)
const version = reader.int(4)
const vertype = reader.pascalString(1)
const gamemodeId = reader.uint(1)
const playerLimit = reader.int(4)
const description = reader.pascalString(1)
const modeName = reader.pascalString(1)

state.name = name
state.map = map
state.password = false
state.numplayers = players
state.maxplayers = playerLimit
state.version = String(version)
state.raw.wave = wave
state.raw.vertype = vertype
state.raw.gamemode = GAMEMODES[gamemodeId] ?? String(gamemodeId)
state.raw.description = description
state.raw.modeName = modeName
}
}