timriker/bzo: Battlezone On-line: a free 3D multiplayer tank recreation within the browser (desktop, telephone or VR) that performs with BZFlag shoppers and servers. · GitHub


A free 3D multiplayer tank recreation within the browser — on a desktop, a telephone or a
VR headset — that performs with BZFlag shoppers and
servers. Nothing to put in.

Play now: https://bz.rikers.org ·
Servers ·
Help: controls and flags ·
BZFlag Discord

https://bz.rikers.org/list lists the general public bzo servers, and the BZFlag
servers any of them proxies. Click a row to enter that recreation.

The server is Node.js; the shopper is Three.js, over WebSockets, WebTransport
and WebRTC.

Each tagged launch publishes:

  • a GitHub launch with notes generated from CHANGELOG.md
  • a supply tarball
  • a versioned Ubuntu 26.04 picture at ghcr.io/timriker/bzo:-ubuntu26.04
  • a shifting ubuntu26.04 tag
  • ghcr.io/timriker/bzo: and ghcr.io/timriker/bzo:newest, each
    utilizing Ubuntu 26.04

Every revealed picture comprises linux/amd64 and linux/arm64 variants. Release
tags use secure vX.Y.Z SemVer solely; prerelease and build-metadata tags usually are not
revealed.

Docker pictures are constructed on Ubuntu 26.04 with Ubuntu’s personal nodejs bundle
(Node.js 22), and CI runs on the identical Node in an Ubuntu 26.04 container.

A Docker picture from GitHub Container Registry, or a supply tarball or git
checkout. Docker is the higher set up and replace path for most individuals.

docs/installation.md covers each, plus configuration,
operating behind a reverse proxy, itemizing your server, proxying BZFlag servers,
and updating.

A web site that polls servers — stats, a server browser — finds what it could ask
in docs/api.md.

/checklist‘s Launch hyperlinks open a BZFlag server in an put in BZFlag shopper;
docs/bzflag-links.md units up bzflag:// on Linux,
Windows and macOS.

bzo carries each flag BZFlag has. WA Wide Angle spawns, sticks and shakes off
like all dangerous flag, however does nothing: it widens the sector of view, and in VR the
headset owns the projection.

docs/flags.md has the remaining, together with why.

Changelog and launch notes

  • Human-readable historical past is saved in CHANGELOG.md
  • Tagged GitHub releases use the matching changelog part as launch notes

docs/controls.md has each management: the keyboard and
mouse, the on-screen contact controls, gamepads, and the XR controllers. In the
recreation, / or ? reveals the keyboard’s.

The VR mode makes use of native WebXR and requires a browser and headset that help
immersive-vr. For native validation, open the sport at http://localhost:5154.
For distant entry, serve the sport over https:// — with the server’s personal
https certificates, or at a reverse proxy; the shopper mechanically makes use of
wss:// for its WebSocket connection when the web page is served over HTTPS.

A headset browser launching the put in app tries to enter VR with no 2D
touchdown web page. xr-launch.js asks for the session earlier than the remainder of the shopper
hundreds, and retains asking on every sign that would carry the consumer activation an
immersive session wants — window load, focus, web page present, visibility change, and
the Launch Handler — with the renderer choosing up whichever session outcomes.
Where none of them lands, and all over the place else, VR Mode begins from the button.

A saved identify joins instantly, and with out one the XR menu opens on a Join
display carrying the identical identify, staff, and tank decisions because the 2D entry dialog, so
nothing waits on a display the participant can’t see.

Typing in XR makes use of the headset’s personal system keyboard, raised when the Name or
MOTD row takes focus. Quest Browser 26.1 and later present one; a headset that
doesn’t marks these rows Desktop solely, and the participant can nonetheless be a part of below the
identify the server assigns. Each time the keyboard opens it begins a recent edit, so
the primary key replaces the entire discipline fairly than appending to it.

The one-tap VR button beside the settings gear is proven solely on a tool with a
headset, as a result of Chrome on Android studies immersive-vr help on any telephone
by Cardboard; VR Mode stays within the Settings menu there.

If the deployment units a restrictive Permissions-Policy header, enable
xr-spatial-tracking=(self). TLS is both the server’s personal (https, see
docs/installation.md) or a reverse proxy’s
(docs/installation.md).

Use the WebXR validation checklist when checking a
new browser, headset, or deployment. WebGPU rendering is outdoors the scope of
this guidelines.

This runs the syntax and lint checks, a server boot examine, and the check
suites.

CI additionally runs these checks on pushes and pull requests.

Commit the whole lot first, and depart nothing behind: a tag names a tree, so an
edit nonetheless sitting within the working listing when the tag goes out shouldn’t be within the
launch — the model says one factor and the field says one other, and no one can
reproduce it from the tag. That consists of work any person else left uncommitted:
evaluate it, say what it’s, and commit it, fairly than tagging round it. git standing is clear earlier than getting ready a launch and clear once more as soon as the tag is
pushed; something nonetheless pending on the finish means the discharge went out with out it.

Release tags are secure vX.Y.Z SemVer solely — prereleases and construct metadata
usually are not revealed.

Prepare a launch regionally:

npm run launch:put together -- 1.0.1

That updates:

  • bundle.json
  • package-lock.json
  • public/model.mjs
  • CHANGELOG.md

All 4 go within the launch commit. public/model.mjs is the one straightforward to
depart behind, and a tag with out it ships a shopper reporting the model earlier than
it.

Then edit the brand new changelog part so it comprises the true user-visible modifications.

Validate regionally:

npm run examine
npm run launch:examine -- v1.0.1
npm run launch:examine:increment -- v1.0.1

Then commit, tag, and push:

git add bundle.json package-lock.json public/model.mjs CHANGELOG.md
git commit -m "Release v1.0.1 - brief description. Closes #1"
git tag v1.0.1
git push
git push origin v1.0.1

The topic describes the discharge fairly than labelling it: the model is
already within the tag, bundle.json and CHANGELOG.md, and git log --oneline
is the one view the place the topic is all there’s. Name the change in a number of
phrases and reference the difficulty with an actual closing key phrase the place the discharge
finishes it, since a naked (#NN) solely hyperlinks.

The launch workflow will:

  1. confirm that the secure tag is newer than the earlier launch and factors to primary
  2. set up dependencies and run lint, validation, audit, and CodeQL checks
  3. fail if bundle.json doesn’t match the pushed tag
  4. fail if CHANGELOG.md doesn’t comprise an identical
    non-placeholder part
  5. construct and smoke-test Ubuntu 26.04 pictures with Ubuntu’s Node.js 22 for
    linux/amd64 and linux/arm64
  6. promote the verified versioned and shifting Docker tags to GHCR
  7. publish a GitHub launch and fasten a supply tarball

A launch that fails its workflow is left alone. bzo is in improvement and
not each tag produces artifacts. Fix the trigger and transfer to the following model —
don’t delete or transfer a printed tag, and don’t backfill a GitHub launch for
one which by no means constructed. CHANGELOG.md is the file both means, and
it already carries the part for the model that failed.

public/model.mjs is written by scripts/prepare-release.mjs and verified
in opposition to the tag by scripts/check-release.mjs. Do not edit it by hand, and do
not reintroduce a hardcoded shopper model string elsewhere.

Bundled belongings and licensing

The code is AGPLv3. The belongings usually are not all the identical story.

bzo ships fashions, textures, sounds and maps from a number of locations: some are the
BZFlag undertaking’s, used below its licence; some had been made for bzo; some arrived
with a contribution. A file doesn’t inherit the repository’s licence by
sitting in it, and an asset whose origin no one recorded is a query left for
whoever asks subsequent.

What is anticipated of something added right here:

  • say the place it got here from, and below what phrases, within the pull request
  • choose phrases appropriate with AGPLv3 distribution
  • a header saying a file was exported by some instrument shouldn’t be a grant of something,
    and neither is a word that the writer didn’t look into it

Not each asset already within the tree meets that bar. Some predate the
expectation and a few arrived with a contribution that was price taking over its
personal deserves, and the intent is to achieve clear, recorded licensing for each one
of them fairly than to faux it’s already achieved. If the provenance
of one thing right here, or you’re the writer of it, please say so in a problem —
that’s the most cost-effective means this will get completed.

Maps are the identical query in a distinct form: a map downloaded from a
server, or saved out by a shopper, carries no grant with it. See
docs/bzw.md for the map format itself.

This undertaking is licensed below the GNU Affero General Public License v3.0.

Network customers can entry the supply code from the operating app by way of /supply, or
immediately at:



Source link