Vastly out of my skillset on this but, I’ve compiled libEGL.dll and libGLESv2.dll for use with the q2pro builds (and probably anything else on your windows system that might use EGL).
32-bit (x86) and 64-bit (x64) DLLs are included, but unlike OpenAL you’ll have to put them in C:\windows\system32 (64-bit) and C:\windows\SYSWOW64 (32-bit). The zip file is made so you can just extract to C:\ and they will go into the correct folders.
I’m now completely compiling the windows build against updated external libraries, with no subproject dependencies other than khr-headers. The dependency versions will be listed in each ones included log files. Day wouldn’t be complete with one last update I guess! Updated builds available as always in https://quake2.itbacon.com/public/q2pro
Edit 3:37pm EDT: curl is enabled in ALL builds now (for http downloads), EGL enabled in windows, openal on 32bit linux. and game-new-api enabled in all builds. I think now it is the most complete builds!
I have figured out how to get OpenAL working on both x86 and x64 windows builds now! The DLL files will be included in their respective files. I have compiled the latest version of OpenAL (1.25.2) to include with the release.
I also realized as well today that no older x86/32bit mod is going to support vfps, so the x86/i386 vfps builds have been removed.
I am additionally also compiling non-vfps builds as well again.
Linux builds have been updated to support X11, too.
And software-sound has been enabled. I’ll try and add EGL support here in a while. EGL support has been added!
I’m not sure if there’s anything left to get into these builds at this point! I’ve been kind of obsessed with it the last week again, trying to get them as good as possible.
You’ll notice anticheat-client is off on the 64bit build, because there is no 64bit anticheat.dll that works. It’s just too old. It is enabled on the x86 build, and for me, the dll does load, in the console you’ll see Anticheat DLL initialized or whatever.
But when connecting to a server for some reason, it still says I’m not using it. For servers that are still requiring anticheat, for no reason because it’s 2026 and it wouldn’t stop anybody even mildly motivated, I don’t plan to work on figuring that out. I would suggest using the old r1ch build if you absolutely need anticheat for a particular server. My best guess is because I’m not using the r1gl renderer.
SDL2 is also now enabled (vid_driver sdl).
OpenAL also works good in this build, however, again, for x86 I am unable to find an openal32.dll that works, it just keeps saying “Requires at least OpenAL 1.1” when trying to set the sound to OpenAL in the x86 build. I’ve left it enabled in case anyone wants to try and find a working dll — and if you do! — please let me know.
Note: As I already have all of these dependencies installed, it can be hard for me to sometimes determine exactly what you might need to apt-install. Let me know if anything goes awry in the comments and I’ll update the guide!
The most-excellent PacketFlinger has kept a version of Quake 2’s former cheat detection mod q2admin still running after all these years. His version works very well for me on both older i386 mods, and modern mods on x64. And I’m going to show you how you can compile it for your own server, on Ubuntu Linux.
First, we need to install the required dependencies. If you plan to build the i386 version for older mods, then run this to install the i386 version of libc:
You will also need some standard packages if you don’t have them installed already for some reason:
sudo apt install git build-essential gcc-multilib g++-multilib pkg-config make perl wget curl ca-certificates tar xz-utils file binutils
Next, we need to clone the q2admin git repository. Make sure you’re in the folder where you want to download it to. The git clone command will automatically create a subfolder named q2admin:
git clone https://github.com/packetflinger/q2admin
cd q2admin
For i386 builds, we need to modify the Makefile slightly. If you’re not compiling for i386 mods, skip down to make — and yes, I should really learn how to commit changes to a git repository one of these days… maybe I’ll try that after this guide, so I can commit this Makefile change to the q2admin repository. Edit Makefile with your editor of choice, for me, that’s nano. I have, since forever, ran nano with -w to prevent line wrapping:
nano -w Makefile
Add the lines in bold below to your Makefile. The change should begin around line 77 or so. You can press CTRL-W, CTRL-T, 77, [Enter] to jump to that line. Others may prefer CTRL-/, 77, [Enter], nano is versatile!
CTRL-X, Y, [Enter] to save your changes. Others may prefer CTRL-O, [Enter], CTRL-X which will do the same thing.
We can immediately compile the x86_64 version by simply typing make:
make
This should produce a gamex86_64-q2admin-r###.so file, which is your freshly compiled q2admin for 64-bit!
However, for i386, we are again going to have to do a few things, namely we need to recompile the dependencies to avoid a linker warning after compiling. You’ll also have the most up to date version of q2admin possible for i386, including its libraries. You must determine the full path to your q2admin/deps/ folder, so if you ran git clone in your home directory, this will be ~/q2admin/deps/. From a shell, first set a variable the next script will use. Modify the path in the below if necessary. Do not put a trailing / at the end. Do not put quotes (“) around it either!
Q2ADEPS=~/q2admin/deps
The above command will set a variable, $Q2ADEPS, that we use in the below snippet. In that same shell, run the following, which will download and compile zlib, curl, and openssl i386 dependencies.
cd /tmp; rm -rf zlib-1.3.2 openssl-3.0.16 curl-8.8.0
wget -nc https://zlib.net/zlib-1.3.2.tar.gz https://www.openssl.org/source/openssl-3.0.16.tar.gz https://curl.se/download/curl-8.8.0.tar.gz
tar xf zlib-1.3.2.tar.gz -C /tmp; cd /tmp/zlib-1.3.2; CFLAGS="-m32 -fPIC -O3" ./configure --static --prefix="$Q2ADEPS/i386/zlib"; make clean; make -j"$(nproc)"; make install
tar xf /tmp/openssl-3.0.16.tar.gz -C /tmp; cd /tmp/openssl-3.0.16; ./Configure linux-x86 no-shared no-tests no-module enable-pic --prefix="$Q2ADEPS/i386/openssl" CFLAGS="-m32 -fPIC"; make clean; make -j"$(nproc)"; make install_sw
tar xf /tmp/curl-8.8.0.tar.gz -C /tmp; cd /tmp/curl-8.8.0; PKG_CONFIG_PATH="$Q2ADEPS/i386/openssl/lib/pkgconfig:$Q2ADEPS/i386/zlib/lib/pkgconfig" CFLAGS="-m32 -fPIC -O3" LDFLAGS="-m32" ./configure --host=i686-pc-linux-gnu --prefix="$Q2ADEPS/i386/curl" --disable-shared --enable-static --with-openssl="$Q2ADEPS/i386/openssl" --with-zlib="$Q2ADEPS/i386/zlib" --disable-ldap --disable-ldaps --without-brotli --without-zstd --without-nghttp2 --without-libpsl; make clean; make -j"$(nproc)"; make install
cd "$Q2ADEPS/.."
Note: The above links are bound to become outdated, I will try to keep them updated. You may have to get updated links if you’re reading this in 2030…
Finally, with ALL THAT out of the way, you can now type:
make CPU=i386
And that should give you a gamei386-q2admin-r###.so file!
Using and configuring q2admin is out of the scope of this guide, and worthy of a whole post or four in itself, so you’ll have to do some research on getting things configured for your server(s).
The README.md will be your absolute best starting point. And all of the stock configs are in your ~/q2admin/runtime-config/ folder.
HUGE shout out to PacketFlinger for keeping this alive! Thank you!!
I’m actually making this post just to provide maybe one extra google result for users that search for it.
So, I happen to notice a bunch of requests coming from this IP to my firewall, via UDP. I have long had it blocked, but finally got more curious today, probably at least a year after I added the IP to my block lists.
So, the IP actually belongs to a company in Ohio, which was weird, because I am also based in Ohio.
I reached out to the CIO of the company, not expecting much — and he’s none other than the developer of QTracker, Ron Mercer! No wonder this IP was trying to scan me, it was wondering why it couldn’t see my Quake 2 servers anymore!
Ron is absolutely incredible, he’s added a reverse DNS entry for the IP which now resolves to a qtracker.com domain.
So again, 63.239.170.8 is not malicious, it’s just trying to help us preserve as much Quake as possible.
Huge shout out to Ron, thank you for your time on this!
There’s a few ways to do this, I think the simplest, if you have the PCIE slot room would be to buy an ethernet card that supports 10/5/2.5/1GbE network speed negotiation.
But since I only have one real usable slot in my pfSense machine, and I need 10G for LAN, I opted for a dual-port Mellanox ConnectX-3 SFP card that I purchased off of eBay for $21 USD. An incredible buy. I would definitely recommend putting a fan on the heatsink if you have room, or blowing across the card is even better to help cool the SFP modules themselves. Especially when using ethernet modules, they run hotter than fiber modules.
Per the previous guide, I updated my /conf/dhcp6_att.conf to replace interface re0 with interface mlxen1 (by process of elimination or checking ifconfig to determine which slot is which. What the bracket of the card calls port 0 actually was my mlxen1 interface, in this case.
In pfSense, you will see it negotiate as 10Gbase-CX4. The speed of the port does not matter, assuming it supports your standard 1G/10G SFP+ port speeds. The module is what matters. The modules SFP end will interface with the port at 10Gbase-CX4, and the ethernet side of the module will interface with your modem at 5Gbase-T. You’ll have to login to your AT&T modem to confirm the speed of the client (under Device > Device List). Make sure you’re connected to the 5G port on the back of your AT&T BGW320!
As I only pay for the 1G plan, I am at least now able to pull the full speed.
I’ve spent the last few days making this work properly across multiple VLANs, because AT&T does NOT even REMOTELY conform to any kind of industry standard for dishing out IPv6 blocks or addresses.
Normally your WAN would receive a /56 block from an ISP, giving you 00-FF in blocks to assign off of that. And everything you read online says AT&T gives out a /60, which is true. But it’s misleading if you’re expecting to be able to USE that /60. You cannot. You cannot give your WAN adapter a /60 prefix, it does not work that way. It will always be a /64. (we’re not talking about a custom ONT SFP module here or what-not, obviously some people have made it work that way).
So, assuming you just want to use the AT&T BGW320 as-is, and you want multiple IPv6 prefixes, here’s my quick little guide on that.
On the BGW320:
Turn all 3 settings to On under Home Network > IPv6
Under Firewall > Packet Filter, click to Disable Packet Filters (Note: This is not required for this guide, but you should just let pfSense handle packets if that’s your router)
Under Firewall > IP Passthrough – Allocation Mode: Passthrough – Passthrough Mode: DHCPS-fixed – Passthrough Fixed MAC Address: pfSense WAN adapter MAC address
Under Firewall > Firewall Advanced: I would recommend Reflexive ACL, ESP ALG, SIP ALG be turned Off.
pfSense Configuration
Under Interfaces > WAN – IPv6 Configuration Type: DHCP6
Note: If you only ever want 1 prefix to use for your LAN, and don’t plan to use any other /64 blocks, you do not have to use a custom configuration and could essentially stop here. Set DHCPv6 Prefix Delegation Size to 64 and that’s it, leave the rest of the boxes unchecked. Your WAN will get the passthrough address from the BGW320, and then you’ll have one prefix delegated to use which you can assign statically on your LAN adapter.
If you want multiple /64 prefixes to use, you will need to SSH into your pfSense machine. As that is kind of out of the scope of this guide, but basically use PuTTY or ssh from a linux machine to your pfSense LAN IP, and login with your admin credentials. The menu should say to enter option 8 for a shell I believe.
At the shell, type ls /var/etc/dhcp6*.conf to list your dhcp6 configuration file. It should either be dhcp6c.conf or dhcp6c_wan.conf in some cases I have read. Mine was dhcp6c.conf. We need to copy this file to a new location so we can modify it and use it as our custom WAN interface configuration file. So type cp /var/etc/dhcp6c.conf /conf/dhcp6c_att.conf
cp /var/etc/dhcp6c.conf /conf/dhcp6c_att.conf
nano -w /conf/dhcp6c_att.conf
Edit the file to include extra send ia-pd # lines. The stuff in bold is likely what will not already be in the file. But ultimately you need to start with send ia-pd 0, then 1, then 2, and so on. This is literally my current running configuration, so I hope it works for you. Do not blindly copy and paste this, make sure your interface name matches YOUR firewall, not mine! And yes, I plan to stop using a RealTek adapter soon. I also don’t think the prefix ::/64 infinity; lines are necessary but I added them just in case. The real important part is the send ia-pd lines.
interface re0 {
send ia-na 0;
send ia-pd 0; # THIS WILL BE YOUR 'f' PREFIX and will probably already be in the file
send ia-pd 1; # ADD THIS to get the next prefix after f (e)
send ia-pd 2; # ..and so on, up to send ia-pd 7 if needed, for a total of 8 usable /64 blocks
request domain-name-servers;
request domain-name;
script "/var/etc/dhcp6c_wan_script.sh";
};
id-assoc na 0 { };
id-assoc pd 0 {
prefix ::/64 infinity;
};
id-assoc pd 1 {
prefix ::/64 infinity;
};
id-assoc pd 2 {
prefix ::/64 infinity;
};
To save your edited file, press CTRL-X, press Y to save, and then press Enter to overwrite the existing file. Alternatively, you can press CTRL-O and then Enter to write the changes out, and then CTRL-X to just exit.
You’ll notice that the blocks actually start at the end of the /60 from the BGW320. So if the BGW320 gives your WAN 2600:1700:a123:b340::, then your first usable /64 will be :b34F, the second is :b34E, the third would be :b34D and so on, C, B, A, 9, 8. 0-7 are reserved by the BGW320 for internal stuff apparently. Personally I’m only using 3 prefixes, and haven’t tested the limits.
Back in pfSense, under Interfaces > WAN, scroll down to DHCP6 Client Configuration, and enable the checkbox for Configuration Override. Type into Configuration File Override the following (or whatever you named your config): /conf/dhcp6c_att.conf
Save and apply your WAN changes. If all goes well, back on your BGW320 under Home Network > Status, you should see under the IPv6 section near the middle your IPv6 Delegated Prefix Subnet section, and it should list as many prefixes as you put send ia-pd’s into your dhcp6c_att.conf file.
Back in pfSense, under the lan/vlan/tunnel interface(s) you want to assign an IPv6 network to, set their IPv6 type to Static, and, e.g. with our example above, if you have 2600:1700:a123:b34f::/64 as one of your delegated prefixes, set your interface static to 2600:1700:a123:b34f::1 on a /64 subnet size. And then that interface will hold the ::1 ipv6 address on that prefix.
Edit 7-2-2026: I’ve recompiled these again to include game-new-api for large map support, and have attempted to enable anticheat-client in the windows builds, mostly untested. The i386-abi builds run my old mods perfectly!
Edit 6-27-2026: I’ve scaled back the number of builds .. it was excessive. There’s no reason to have so many that I can think of.
Edit 6-23-2026: I am redoing the naming convention and adding EVEN MORE builds! Linux x86 builds will now be i386. I am also compiling separate i386 builds that have the ABI Hack enabled and one that is disabled. ‘abi’ builds will have it enabled.
I have taken some time to compile them as well. These are also untested but I suspect will work better than the q2repro builds below which I will probably end up deleting (Edit: I recompiled the q2repro builds with what I learned on this, they may work better if you need repro).
I was able to compile them with http support again, and the various variable fps and anticheat server builds, so you can pick either neither, a ‘vfps’ build (no anticheat), or an ‘ac’ build (anticheat, no vfps), or a vfps-ac build (both). Or none as mentioned.
There are x86 and x64 builds, so you should be able to run any mod. Also included i386 for ubuntu.
Let me know if you’re using them! I’m pretty excited that there’s at least a semi-stable repo for q2pro again!