We moved (to GitHub)

Here at [BB] we’ve gone through a few iterations of version control with each generally improving and iterating better upon the last scenario. This isn’t a common thing we do and generally seems to reflect the state of how much time we have vs our needs.

A quick trip down memory lane

Back in the very early days of BB (we’re talking RP08 and before) version control was essentially copy paste files, and if there was a cockup the only (known) good version was probably on the server so that’s where you’d go to fetch it from. This is very bad for a number of reasons however we won’t dwell on those. It’s in the past!

Those that played GMod from 2007 until about 2013 and using addons such as Wiremod might remember having to install tortoiseSVN, a subversion (SVN) client. At some point (roughly 2009) BB moved on to this for the single gamemode at the time we had – RP09. Setting up repos (self-hosted) was painful with SVN and there weren’t any “easy” public solutions available without paying for them. Sure Googlecode existed but that mandated your source was always publically available which we didn’t (and still don’t) want.

SVN also proved to be painful with multiple people working on it if you didn’t strive to keep up to date with each and every commit. Hell, forget about branches – those don’t even exist (or at least, didn’t at the time)!

Enter Git

At some point in 2008 – 2010, GitHub and Git started making stronger waves. While Git had been around since around ~2005 it hadn’t really picked up popularity until services using it became a thing. Leapfrogging Mercurial (another version control system) it absolutely stormed the development world and today it’s seen as the gold standard.

Only the problem for us was the original problem we had with SVN – places at the time such as GitHub still mandated your code was public and it wouldn’t be until later they supported private repositories; though only for those willing to pay. Services like Bitbucket and GitLab were still coming to fruition with their usage models and at BB we were getting pretty fed up with SVN.

If someone else won’t do it, do it yourself

So I ended up looking for self-hosted solutions and at the time settled on Gitolite. On the 4th of October, 2012 I installed Gitolite and at 21:27 made our first push. With immediate success we pretty much stopped using SVN for our mainline projects and everything became Git based. Any projects we weren’t actively developing remained on SVN until we shut down Montreal.

We ended up going through a few revisions of Gitolite to gain access to a few features (mainly how authentication and different pub / private keys worked) and it served us well up until the point we stopped using it.

But why stop using Gitolite?

Microsoft suddenly acquires GitHub for big dosh

Something Gitolite did very well was act as a version control system but the peripheral stuff such as builds (for executables / docker containers), documentation and bug tracking had become somewhat more cumbersome. Building a docker container required me to boot up a virtual machine on my PC (as I was using VMware) and setting up shared drives and so on which weren’t without their own issues. We used forums for bug tracking & documentation and while we had branching strategies for multiple lanes of work within Gitolite it wasn’t as streamlined as it could be. It also meant visibility to anyone outside of development (i.e. anyone that wasn’t Killermon or myself) had no idea what was coming up unless we actively brought it up.

I had started looking around somewhat lightly for decent integrations or a better overall solution; this wasn’t a case of we were flexing at the seams but why should work we’ve already done once continue to require a human actively involved?

And then Microsoft acquires GitHub.

And then private repositories become free.

Oh and GitHub actions (build systems) were stable and a thing.

The first one, not great as Microsoft do have a habit of squeezing the market. By proxy of the acquisition however it meant that Microsoft were willing to make sweeping changes that (for now) benefit the consumer and so the plan came to be we’d host everything under my account over at GitHub.

However it turns out even with a pro (paid for account) there were things that didn’t play too nicely on a solo account because at the end of the day a Pro account is meant for more personal projects that can accept contributions as opposed to a greater project that spans many elements. And then Microsoft went and made it so a user in a team cost $4, the same as an individual Pro license. Teams solves many of our problems and thus BB-Games was formed.

It isn’t perfect. The tradeoff however for the feature sets we get make it more than worthwhile. There’s two sticking points I have, namely:

  • If you want to make deployments “easy”, you need an extra “seat” for the server that that’s going to be part of that deployment process. You can work around this in a number of ways but none of these things are ideal. $4 is $4 and I have a decent-enough paying job so for the time being I’ll absorb that cost.
  • Non-development users require a seat as well. It doesn’t matter if they’re an “outside collaborator” or someone who literally just needs access to the boards / issues / wiki feature. To gain access to a private repo they need a seat. There’s a middle-ground in that you can have a public repository that’s “issues-only” but that doesn’t really cover details you might want to keep sensitive. A workaround at least is to use webhooks to “stream” out updates so at least they can see context and snippets of what’s going on.

For what it’s worth in terms of disclosure purposes, the “free” version of Teams has private repos as well and that would serve us just fine but they lock away a number of features that are insanely useful and so that $4 per user is worthwhile.

So what was multiple systems working in loose tandem (and requiring regular maintenance) has been merrily offloaded on to a cloud platform where I pay ~$12 a month (not counting my own personal pro account) for an insane amount of goodies.

We’ve been with GitHub since April this year and we haven’t had any desire to move back; if anything we’ve actually integrated with it even more tightly (as per the last blog post). Here’s hoping Microsoft don’t go screw it up.

The Market Exploit – Part 1

As some players are aware, we were made notified of an exploit in the marketplace, that allows for the duplication of cubes. I wanted to create this blog post to explore, technically, what went wrong. Before we go into that, I should make it clear that the player in question had all of their marketplace transactions reversed. This is why some players got strange deliveries that removed cubes from their inventory, and also saw items they sold re-appear in their inventory. Reversing market transactions is not something we take lightly, as we generally have a zero-refund policy on any transactions via the marketplace.

Anyone, onto the blog!


To perform the marketplace exploit, the player in question used a client-side hack (Which itself is against the rules, but anyway) and they crafted messages that replicated the marketplace buy listing request. If there were spammed at very high rates (Hundreds a second), then it would duplicate the cubes they had spent.

So, how did this happen? First, we need to understand a little bit of technical background as it relates to how the server, speaks to the database.

So, the Lua engine in gmod is entirely single-threaded – this means that all Lua code that is due to be invoked in an engine tick must run to completion. Basically, all code paths must terminate at a return (Or a yield if a coroutine). This is a bit of a headache, but entirely manageable – it does however present a problem when we’re dealing with external systems – such as a database.

Let us look at Python as an example, when you code a MySQL query, you have the queries in-line, so something like this:

What this means is that the python code halts until the database returns the results of each query. When you’re coding a web application, this is acceptable, however, for gmod, this would mean that the Lua engine would pause until the database returns the results of the query. Every time that a query was performed, players would feel a slight jolt in the server while it waited for the database to return. The server can run dozens of queries a second, so obviously, this is not acceptable behaviour.

Instead, in gmod, we have an asynchronous model – this means we send the query to an external DLL, which contains its own threading. This thread holds our query external to gmod, to allow the lua engine to continue its execution. Once the database returns the results, the module executes a callback, which then triggers next tick. We say this is asynchronous as the server continues as normal until we have our results.

In summary, you get something like this. This is an example, not the section of code where the exploit existed.

So, we run a query, the database runs the query, returns the results, and then the callback (GetListingCountsResults) is executed (line 444), which contains the data we want as an arg (see below). We then do whatever we need to do to that – in this instance, we send the counts for each category to the player (Using WriteTable is expensive for net messages, I know! But it’s rare and I was lazy).

So, why is all this important? Well, this means that if the same query is running multiple times in the same frame, then it will get the same results back. Unlike in the python example, where we would select, and update our rows in line, so when we next call the select, it would show the updated results. In-line queries also work nicely with transactions – async methods can implement transactions, but it’s a lot more complicated and support was flaky in Gmod SQL modules until recently.

So, how did the exploit work?

The marketplace, when it comes to buying an item, has a pretty simple flow process. When you go to buy an item, we charge you the purchase price (On the server), we then tell the marketplace (Which operates as an external system, hence it’s cross-server) we want to buy an item. The marketplace then gets a lock on the database row (AKA a semaphore), after which, we check if it has been bought or not. If it has not been bought, we create a delivery for the item; otherwise, we create a delivery for the cubes we just charged you as.  But why can’t the marketplace just tell the server to refund the cubes? Rather than creating a delivery? There’s no guarantee that the player will still be connected to the server and we can’t give cubes to a player who is no longer connected on the server outside the delivery system. The underlying reason for this (Which deserves its own blog post) is why you can’t enter the lottery from Discord.

Okay, so you spammed the market place, generated hundreds of transactions for the marketplace to refund you cubes – so what? You were charged these cubes in the first place, so you are owed them. Now, this is where the subtlety exists. When the marketplace tells the server that it’s done what it has asked, then the server asks the delivery system to check a player’s mail in 5 seconds. A deficiency in the code meant that it would start as many checks for every time you tried to buy a listing – rather than just one check.

What this means, is that within the same frame, in 5 seconds time, the server will repeatedly check for deliveries. As this is asynchronous, we will then, next frame, get all these selects back – all containing duplicate copies of the player’s mailbox – including the cube refunds. The delivery system, thinking that these are all legitimate it would then redeem all of these. This would, in effect, duplicate the number of cubes you spent. The delivery system would mark these deliveries as redeemed, but at this point, it’s too late. Next frame, after the database has updated, any queries would, of course, recognise they have been redeemed, however at this point, it’s too late.

So, what should have happened? In an ideal world, a transaction in the delivery system would have locked the rows to stop anyone else selecting them until they had been updated. This means that other queries would be queued until the transaction in progress releases the semaphore. As noted, before, transactions are troublesome in Gmod, so we should have had a semaphore on the server which basically said: “A system is already checking the mail, you have to wait!”. This didn’t exist because the delivery system was designed before the market system, and thus, mailbox checks were only done once when a player joined the server so it was never really needed.

Generally speaking, we’re pretty defensive when it comes to coding. All of our net interfaces are/should be protected by a centralised system to stop them being spammed (See line 439 in the second figure) – this was missing on the market buy item interface. We have now added this to prevent the spamming, but we have also added a semaphore into the delivery system to stop multiple mailbox checks running in parallel.

Join us for Part 2, where we pick up the pieces!

Snagging failed splits

Back in May of this year (so recently?! feels like forever) we released the first version of the Timetrial Split system, this was a heavily sought after feature from many within BB to give data and granularity to their runs. A further update was then deployed so not only could a player identify whether or not a split was better or worse than before; they could also see if it was better or worse relative to their current Personal Best time. Five months on the system has been for the most part a roaring success!

There was one thing that was apparent and that was a problem existed with the system and that somehow players were managing to miss the checkpoints that dictate when a split starts and when it ends. In this case the both how and why are important but what’s even more important is how can we expose this to us as developers? Fundamentally we want players to have a good time and there’s nothing more frustrating to get a new Personal Best (especially if you’ve been grinding it) only for the system to turn around and go “we got your time, but we didn’t get your splits!”.

Furthermore we weren’t getting the data of where a split was going wrong, players were crying out it was happening and all we could do at the time was revisit each and every split in a given map which is a huge waste of time and doesn’t really tell us anything other than “maybe lets rejig this bit here, that bit there”.

Before we dive in to how we’ve mostly resolved this issue, lets take a look at some of the most common reasons a player may not hit a split zone.

Unexpected Player Movement

In an attempt to make splits accurate as possible for a given stage (or linears) a fair bit of effort went in to making them precise and in most cases this worked out okay. However what had been bit of a downfall to this system is there were expectations about how the average player launched themselves on to a ramp – we tend to expect most people go straight on and down (with maybe some air-strafing) but some players instead prefer to go from the side getting an air-strafe in early.

How they were missing: They were taking non-obvious / non-intended paths.
Why they were missing: To be as fast as possible.

Fix: Lets loosen up the requirements and give a wider coverage / additional split capture zones. This might incorrectly give a split of +/- 1 or 2 seconds in some maps that have non-standard geometry, but better to give a slightly different split time rather than no data at all. Plus it doesn’t affect timetrials whatsoever. Until we can get mesh checkpoints out it’ll have to be an acceptable margin of error.

Unexpected Map Behaviour

As I’ve complained lightly about in the previous blog post Debugging Map Quirks, maps aren’t always the cleanest in terms of their feature set / functionality and this can be for whatever number of reasons. A big example of this is surf_fortum, where the exit teleport takes you from stage 2 to 3. Something there can go a bit funky when “teleporting you” and even though for all intents and purposes we usually capture players when they land on the end platform, sometimes Source goes “nah” and you evade the split end checkpoint.

The resolution in this case is to add a second split zone end on the start of stage 3. Best case: you hit the correct endpoint as normal and get an accurate split. Worst case: you don’t and you get a split delayed by a second or so.

How they’re missing: Maps have inconsistent behaviour and it means players may not end up touching what they need to.
Why they’re missing: Maps have inconsistent behaviour and it means players may not end up touching what they need to.

Fix: Generally try to work out smart ways to fix it that isn’t to the detriment of players, e.g. multiple split zones for a given checkpoint may be required.

Player Speeds

This one is tricky to explain but it turns out some checkpoints were too “thin” so that if players moved through them fast enough; they would never actually trigger the zone. The way the server sees movement is lots of “teleports” as opposed to linear movement that you or I experience when playing. The server does some fancy maths to interpolate how you’re moving so the faster you’re going, the larger these “teleports” become in terms of distance apart.

How they’re missing: players going zoom zoom because gotta go fast.
Why they’re missing: Gotta go fast for top times.

Fix: Make checkpoints larger. There’s a risk they “hit” the box later, but their overall time will be lower so it doesn’t matter. It’s a quirk we can’t really fix unless we up the tickrate of the server (which is a contentious issue for many reasons).

Resolving the actual reporting of missed splits

So when we first started getting reports of missed splits the output to players wasn’t the most informative other than “we failed to record (your splits != total splits). In an effort to make this better and so players could report the issue better the output was updated to show a list of all splits that had been recorded so when reported to someone at BB, we at least knew which split had failed.

This was far better than it was before as we could immediately identify which split was going wrong and this meant faster turnaround on reports! This then revealed a second issue – we were reliant on players to actually report these issues. What started off (and still continued for a while) was a dedicated few reporting the split failures when they cropped up with the vast majority of players either mentioning there had been a failure (without keeping a record of the splits) or failing to mention outright entirely.

At some point there was a recognition that we can’t expect players to report these issues reliable or consistently. I mean we already knew this given we have Lua errors automatically report themselves but a key problem was this automated Lua reporting system wasn’t fit for split errors. We need to fix these split issues as soon as possible as opposed to sitting in a backlog and we need a way to notify ourselves exactly when they happen.

What resulted is a system that when an error is detected it automatically gets reported to our GitHub “issues” bot who then posts it on behalf of the server.

Oh hey the only picture in this stupid long blogpost

The nice thing about this system is everything was wrote from the ground up and allows us to insert any issue we want in to GitHub allowing us to catch any future issues that we need immediate turnaround on, not just split issues! Even more important however it’s meant that typically when we get a split issue now, the average turnaround time from initial reporting has gone from maybe being around ~30 hours to roughly 4. To clarify – that doesn’t mean it takes 4 hours to resolve and instead the time of which it’s picked up and closed by.

Split failures still happen but we’re starting to see their frequency already less and less. They weren’t that common previously but it did seem to be specific maps that had the issue. This tells me that in most cases maps were set up correctly and it’s mostly maps that were set up in the early stages that generally have this issue.

So overall we’ve gotten three core benefits out of this. One is we now have a way to immediately raise and report issues from within the gamemode itself which secondly leads to better triage and bug fixes. The third is players get a better experience out of this overall. A win-win-win!

Debugging Map Quirks

These days when we process maps for gamemodes our workflow is fairly efficient. It could always be better in terms of work-flow but it’s far better than the early days of when we processed maps by literally writing code for them. Doing things on a per-map basis over the years has gotten much easier for us given our multitude of systems can just accept input on a per-map basis and in essence we’re rarely duplicating or writing new code and instead are just dropping in some placeholders.

There are certain priorities that we take when sorting out maps and those priorities tend to change depending on whether the map is intended for Deathrun, Surf, Trouble in Terrorist Town and so on. In TTT for example it might be focusing on removing any overpowered bonus areas mappers may have put in for themselves, or purposely and delicately breaking any traitor testers. In Deathrun that might be adding kill-triggers to areas that require some sort of funky requirement for when runners win but are unable to kill death. In Surf this might mean removing weird jail conditions if the map was designed for an older iteration of Surf.

The hardest part about all of this is trying to understand the logic and why a mapper may have done something they’ve done; sometimes we can even end up re-implementing their idea in a slightly saner way so everyone benefits from it! More often than not however it turns out that it was an idea that was scrapped, tested upon and hidden or just completely unfinished and the bonus of surf_ace, a popular surf map is a prime example of this.

Ace is a map that’s pretty quick to finish if you have remotely any Surf experience and many people upon finishing, like to do the bonus as it’s a decent route to play. After an update I did that changed how spawns worked on surf_ace it was reported that suddenly the bonus area could no longer be accessed. A bit unusual but I did some debugging, found what seemed to be a reasonable solution aaaaand –

Something else broke.

In this case “failing” the route wouldn’t send you back to the start which made no sense. It stayed like this for a while until I had time to properly debug what happened – and I knew this all somehow came back to the spawn changes I had made earlier.

To cut down on technical detail the underlying issue was this: under the old spawn system for ace you would spawn in at the default positions the map had for you and then you would be teleported to the first stage accordingly. During this process the mapper had a “trigger” so that when you spawned, a flag was set on you that enabled you to access the bonus (but only one side of it!) and with me changing how spawns worked so you actually “spawned” at the first stage, this trigger was never being hit and so the flag never being set.

Fix: manually set the flags when a player spawns so they can access the bonus areas! Even better fix: Apply both flags so both sides can be accessed!

Yeah for some reason the map by default only lets you in one side even though both are the same route, just mirrored. There’s also no way to gain access to the other side either normally so I’m really not sure what the mapper was going for here other than maybe trying to tie in some sort of points system? There’s a massive set of logic gates and other entities that try to work things out but ultimately never actually seem to work properly.

So to cap it all off – mappers please clean up after yourself once you’re ready to publish. If an idea has failed – that’s okay! It’s better to make sure it can’t be accessed at all than it is to leave it in half-baked.

Distribution of content

Or alternatively, why we don’t just give you CS:S content.

Years ago in GMod, it wasn’t uncommon to wait on a loading screen to download all sorts of content, content that often wasn’t owned by the server that was distributing it. Back then and even as late as 2012 / 13 the internet was still “wild west” enough that these things just weren’t a worry. Old people didn’t get it and didn’t understand how to internet so this was very much the norm. It wasn’t uncommon to find servers broadcasting entire self-hosted movies, running hosted jukebox systems (DJ for $150 anyone?) and content just being ripped, reused and abused without shame. The logistics behind some of why this happened is fairly straightforwards but it was “we’re not hurting anyone, why would anyone bother us?”

With everyone and their mother looking to move into the digital distribution landscape seeing Valve’s success with Steam, Valve did the ultimate move and released the workshop which changed the modding landscape as we know it. Assuming a developer added proper support to their game, mods became very much 1-click install processes and before you knew it you had Spongebob running around Skyrim like it was a completely normal thing!

There was however a fairly noticeable downside for the average amateur developer and that was policing copyrighted content not only got easier: it spurred some companies into actively hunting down and policing the usage of their content. To preface the next section; no one to my knowledge ever got sued within the GarrysMod community for usage of this content but there were plenty who got served up pretty quickly with DMCA notices. Commonly the reports would come from other indie developers, who weren’t happy their content was being shipped without permission (and profited upon). In more uncommon cases you even had some larger publishers come down and hit people over the head with a formal request via a lawyer and in the worst case I know of, a record company actually sent a cease and desist to a community that had a jukebox feature with threats that if they didn’t stop immediately then they’d be on the hook for obscene levels of money.

Back when I ran a server hosting company on the side back in the day, I had a fair few of these requests come through (though no record companies thankfully). It wasn’t unusual to get bogus claims (because hey community dramas) but the rate at which they were received showed that at the time: publishers were more than happy to C&D anything they felt wasn’t correct usage of their contents and to be fair: they were well within their right to do so. In many cases it can be an absolute pain though as often there isn’t an easy or affordable way to license this content. For years I’ve wanted to bring back the [BB] jukebox, but no such service exists where you can do so other than hosting your own radio station.

This leads me to a common complaint I often hear within [BB], why don’t we provide an easy way to get missing content, like CS:S?

The answer is pretty straightforwards: we toe a very careful line between infringement and what we think is possible to get away with. Most of the content we distribute is merely tiny bits of pieces of Valve content (alongside our own which we’ve created) in the sense it’s models and some materials. Valve generally don’t mind reuse of their content as long as you’re not distributing entire swathes of it. There’s also the fact that yknow, Valve also made CS:S and are perfectly entitled to being paid for their work.

But these content packs tend to distribute almost the entire game minus the binary which is a big nono. It’s rare but Valve have acted once or twice upon distribution of this content when it’s been freely available on the internet to download. If Valve were okay with it they would let it be hosted within the GMod workshop for free – but they’re not and you can’t get the content willy-nilly on workshop with a 1-click install.

We’re now at the point where we’re distributing our own content to replace the CS:S textures that Valve own. It’s easier (and better) for the player to be shipped and given alternatives that just “work” instead of following sketchy instructions. It also saves us from potential legal issues that really, no one at [BB] has the time or money to deal with and if people want to “upgrade” their experience, they can pay their dues for it. Copyright is a massive issue, far bigger than what extends beyond GMod and yet people never quite realise how deep the rabbit hole goes.

I recommend watching Tom Scott’s mini documentary on how copyright is broken (and how YouTube’s system isn’t). Everything in this very much applies to us as a community, a game and an industry. Just because we can (use the content), doesn’t mean they won’t (sue us).

[BB], 2019 in review

Another two years (given no 2018 post), another set of milestones reached. Like the 2017 review we’re going to look at what’s happened with more of a high-level overview as opposed to granular in-depth looks. We’re also going to pretend that some of the 2018 changes happened during the 2019 session just… because.

Core BBase Changes

BBase the last few years again has been the target of the big updates. Things such as tighter discord integration, adding an absolute metric ton of new cosmetics for the equipment system and hell, even the equipment system itself receiving quite the update. Of the two years, we can see in the git history that 2019 clearly received more updates as obligations from ourselves here at [BB] became more manageable as well certain things reaching completion.

One thing that didn’t happen was a replacement for the steam group bonus. Due to time constraints it was easier to implement a system within discord for a bonus instead which has led to further developments, such as Betty Bot and other realtime information being exposed to the average player. Feedback on such things has only been good so we’ll look to bring more of this in the near future I think.

Beyond that BBase is in a mature position where we can pretty much build anything around it without having to really make sweeping, large changes cursing ourselves for the lack of foresight.

Platinum is now monthly (unless you hold legacy Platinum)

This finally happened. My original plan of making an a-la carte system was really too complex for the average person just wanting to donate and be done with it but $15 one time-donations just don’t cover server bills. As a result Platinum became $8 a month of which we’ve seen some moderate success.

The next step is to get Gold ($5) out alongside branding (which will be attached to the title-card system). I appreciate some may feel that the new Platinum model isn’t as good value as $15 for life and I would prefer to keep it that way – but it just wasn’t sustainable. Along with our goal to make it so donation effects don’t become pay-to-win it means we miss out on a market (commonly known as whales) in the micro-transaction world.

We are however open to ideas on what people may like to see – so let us know if there’s something you feel we’re missing out on!

Trading / Marketplace

We finally released it! Instead of just having users trade items / cubes willy-nilly, we implemented a marketplace system that allows users to place items for sale without having to actually be on the server. This seems to have overall been successful although not without some teething issues, such as costs being too high at launch and so on.

One thing we’re currently investigating is private market listings aimed at specific people / groups of people (to incentivise trading groups) and also a “black market” listing that may appear every so often with rare / no longer obtainable items for large amounts. We’re not sure what the appetite is for such things, but proof-of-concepting exists to help discover if it’s worth our time or not.

Server Health / Maintenance

I don’t think we’ve had any major outage over the past few years beyond Windows Update sometimes taking longer, just because. The infrastructure changes have been instrumental in keeping us online at times and completely secure even when new exploits were discovered.

We have had to extend what we protect and cover – mostly down to the fact that we should have been doing so in the first place and we’ve had no excuse with the new setup to not be doing this.

Trouble in Terrorist Town is back!

I’m not going to cover too much here as the previous blog post mostly covers it. Turns out 1 month = 2 years.


Surf has gone through some interesting developments over the past few years. At the moment most of the dev time is focused on a few larger features – namely split runs and the recording feature for timetrials. Both of these are fairly finnicky as the gamemode was never designed for either of these (with the latter having the potential to grow in size in a nasty way) so the groundwork is carefully being lain for these.

The harder server also got rebranded from “hard” to “Tier 2-6” for two reasons. First off – people except those whom become true enthusiasts rarely enjoy anything too difficult (I blame the state of gaming today) and it was putting players off.

Secondly is that there are maps we don’t add to the easier server (Tier 1-3) because there are stages and maps that just don’t mesh with giving newer players a fun or interesting time. An executive decision was made that the 2-6 server can receive maps that are interesting / challenging, as long as they’re T2 and above and we’ve actually seem some success in rising playercounts on the harder server. Nothing spectacular in terms of player counts, but large enough that we’re seeing players on it daily most of the time.

The last few years have shown me with the thousand of players (yes thousands) we get per month that Surf is a niché gamemode; T2-6 is even more niche and the ‘conversion’ rate of keeping players as a result is incredibly low. More work will continue to be done on hard though these days I tend to believe unless we cater to a more hardcore crowd it’s unlikely T2-6 will ever be as busy as T1-3.


So we released Escape in a beta form with a much better map, but a more “die and you can retry immediately” sort of form. It seems players like playing it at first, but frustration happens after a few deaths and then they leave. Even with larger rewards on offer it’s not enough to keep players enticed.

It’s likely we have a winner on our hands here but we need to pace players at how often they get to play Escape, which I think the previous lobby system actually did a decent job at; though if it’s the right method to go about this is hard to say.

Go Fish

During August I got ill. Bored, I took up a community request to launch a Go Fish server. This isn’t easy because most of the source code is either from 2008 (so pre-2012 Gmod update) or has been poorly updated on the workshop.

After a few days I had a modern version of it up and running with all exploits fixed. So I suppose we have a Go Fish server now.

In future: NPC / Boss fights and some RPG elements.


We’re in a pretty decent spot right now in terms of community. In terms of GMod as a whole, I think we’re currently in a rough spot. Using publicly available tools we can see that the overall population of GMod has gone down over the past year and coupled with the closing of the Facepunch Forums I think has only added further fuel to the fire.

S&Box is nowhere to be seen and it’s getting more and more awkward to provide for newer players given that CS:S content is no longer shipped automatically with GMod (or at least, that game-pack combo is long gone). I think 2020 / 2021 will be interesting to see how the GMod community lasts and how that impacts us as a community.

Forum Post

TTT: Back from the dead, but what took so long?

Just over 2 years since it went down, Trouble in Terrorist Town is back at [BB]! But seriously, what took so long?

The answer is fairly layered with the most obvious response being “lack of time, other priorities” and so on but it actually extends beyond this and can be broken down in to three fairly core abstractions.

Backups are Important.

First of all, when we had that big server maintenance every effort was done to back up all the things that otherwise weren’t backed up or not deemed critical whilst also racing against a clock. One thing we had to cover that TTT actually missed out on was backing up of the server.cfg & maps, meaning that there was a fairly stringent time cost to simply setting that back up. We weren’t so much starting from scratch in this area but our configuration set us apart from the crowd and dialling that back in is a case of trying to remember how it was. Furthermore TTT had been neglected with players responding accordingly (i.e. no players) so we didn’t see it as a priority.

Player tastes change

Secondly is how the community player-base moved on: here are [BB] we tend to do one thing very well whilst the rest gets neglected. It’s hard to tell sometimes if we’re following the players or if they’re following us (or even both) but typically there’s a correlation with how much work gets done on specific features vs just working on something for the hell of it.

An example of this is Surf, it was set up originally as arena-surf as that’s what I figured would be the most popular (and in 2009 that was often what was played the mode of the surf-types). Over time this evolved to a rudimentary skill-surf system which is now a full blown system due to external influences bringing players our way. Many of you that join us here at [BB] probably aren’t even aware that at times we were leading in one gamemode at some point in history. Be it RP, TTT, Deathrun (or these days Surf) and generally that’s when we’ve fleshed it out further and further.

What we have started to recognise is that players (old and new) are after another outlet and we have the perfect setup for that, so it’s time TTT gets dusted off.

A tiny point on player popularity

Something which we have to caveat the above with is for many years (2014 onwards) there were (and to a lesser degree still are) issues with servers appearing in the browser list. While this blog isn’t the time or place for it all you need to know is that for a while you wouldn’t (and even today under certain conditions) see every server available to you due to geographical filtering affecting this. This was pretty demoralising and impacted our work as we tried to work out why we haemorrhaged players.

Time is money.

Finally, the development cost. TTT around 2015 onwards started going through some rapid developments with the release of the net system. Although the net system had been released a few years earlier, the original author of TTT had seemingly faded in to the background and a community shift was looking to update and modernize it which started happening at a very rapid rate. The original edits to the [BB] TTT gamemode hadn’t been done a good job at keeping modified code clean and clear from the core TTT implementations so updates were hard. The lack of a decent diff tool at the time as well made this all the trickier.

Over time I caught up and the last major update I’d done to the TTT gamemode had been in April of 2016. Surf at this point had become incredibly popular and in August of the same year I’d gotten a new job which required my full attention so TTT more or less just fell to the wayside.

So what changed, why work on TTT?

Over time I’ve had many people come to me asking for something more combative and engaging. This tends to fall in to the category of roleplay (lets not go there) or TTT, with TTT often being suggested by old and new players alike. Development by the community has slowed on TTT meaning now is fairly opportune to go in, marry up our versions and make this work. It also lets us repair some of our errors with the benefit of hindsight.

And so what was spat out is still a clusterfuck in TTT terms but in terms of maintainability and compatibility with BBase as it stands today is so much better to the extent that we can add new features and fixes without totally breaking it or pulling our hair out. Massive shout out to those in the TTT community that added convenience hooks all over – it’s great to have standard hooks to call and manipulate stuff with.

Last night when we all played showed me that people still enjoy TTT and especially our flavour with the small enhancements. Maybe it’s the start of something big again with TTT, who knows!

Forum Post

Radio Silence

We haven’t really used this blog since mid 2018 and in some ways it’s hard to pin down exactly why; it’s more a case of I think we somewhat evolved from a blogging format similar to that of why the forums get used less and Discord is more our central point of contact.

In many ways this sucks – for both us at [BB] and for yourselves within the community because blogs are fantastic at conveying huge chunks of information with perspective that doesn’t quite fit with the short message style of Discord or the more information-seeking discussion type of a forum. Sure your opinion may still pop up and you want to give feedback for it but that’s exactly why we link blog posts to the forum.

Another notable change that happened internally at [BB] is we went from grander, loftier targets to more internal, quarterly / monthly rolling releases. While this wasn’t explicitly decided – I feel Kaiden made the right call here in effectively asking for less – but more direct and attainable content that we know we can get out the door. What this means is we have a content pipeline while bigger features quietly get worked on in the background. However what this has meant in terms of relaying this information to you is new features being added on a rolling basis without any sort of change-log or an easy explanation on how to access these changes / features.

What this overall tells me though is our current model of communication sucks. There is some communication, everyone seems to get a slightly different frame of the picture as opposed to everyone getting the same uniform message. For some things (e.g. gameplay) this can be trickier and needs to be worked on but for general information and why something is done as such – we can do better.

Going forwards I’m going to try and bring the blog back in to relevance. It gives people a chance to peek behind the curtains and for ourselves on the dev team to better relay and explain our position and ideas on what we’re doing and why we’re doing it.

Forum Post

Surfing SyncMeter explained

Syncmeter (or the little doodad shown below) was recently added to Surf and it seems to have generally caused a fair bit of confusion as to what it is, how it works and the entire point of it.

Hopefully we can clear some of the confusion up and explain where it came from, what it measures and why. Most of all however I want to explain why sync doesn’t really matter unless you’re really pushing for some top times.

Where Sync came from

Sync was originally requested here and initially I was somewhat confused by the idea of it and at the time somewhat even dismissed it as a fairly useless feature for Surf. In some ways this still holds true due to a number of factors; mostly due to how everyone calculates sync is slightly different. Sync originally came from bhop servers where it’s far more important to ensure you’re syncing your air strafes with your mouse as one wrong movement can end up with you falling drastically short.

The point of sync

As briefly explained above, its’ primary purpose is to ensure you’re pressing the right keys alongside the right mouse movements. In Surf this extends to making sure you’re not wasting more time air-strafing around corners than you need to be or that you’re not air strafing while going straight (more on this below, as it’s rather contentious).

So where does the confusion lie?

Various players have seen this new sync box pop up and are questioning – what’s the purpose of it? Do I need to have a high sync for any reason? Why does it calculate differently to xyz server I’ve played on? Is it awesome I have a high sync?

Sync Explained

Sync at its core works to calculate a score that when you’re in the air and your mouse is moving say, left, you’re also pressing A (and also the case for right and D). These airstrafes and how you manipulate them can be a significant difference in getting a meh velocity and an awesome velocity. It can even dictate how and where you land on a ramp as you’re flying in.

What sync cannot do however, is tell you what you’re doing wrong or realistically, if you’re even doing anything wrong at all. 

Even at the deepest level, all sync ensures you’re doing is that if you’ve moved your mouse in a certain direction with an intent to turn, you’ve pressed the corresponding button to do so. Airstrafing is usually fairly forgiving in this regard with Surf so unless you’re a new player (of which Sync helps you visualise what’s going on better) or a top-tier player (and even then) sync actually kind of does nothing for you.

Score Calculation

From today there’s three different methods to calculate Sync scores now implemented. Two which are available from the UI in game, the third requires you to manually change it via the console.

  1. Sync Mode 1 (or, tickbox unchecked in the F1 menu / bb_surf_sync_scoremode 0 command) – This mode allows you to hold down A or D while going straight in the air and this will contribute to your overall score as a ‘good’ thing. As mentioned before some scoring systems discount this behaviour because in theory, you should never be holding A or D when going straight at all. However due to how Source physics work there is no actual detrimental effect from this.
  2. Sync Mode 2 (or, tickbox checked in the F1 menu / bb_surf_sync_scoremode 1 command) – This mode works similar to above, however it won’t credit you with points while holding A / D going in the air. Somewhat more accurate in this regard as it won’t raise the overall sync % of the run including however you’re effectively telling the system to ignore the above scenario
  3. Sync Mode 3 (bb_surf_sync_scoremode 2 command) – This mode punishes your overall score for holding A / D while not turning in the air. The reason this mode is somewhat more locked away is for newer players – it may give them the image they’re doing potentially worse than what they are because they don’t understand the logistics behind this mode.

Why three modes?

When I was looking all this stuff up I was finding that most servers were running a variant of a few plugins or rolling their own and everyone by virtue was then creating their own scoring system for such a feature. I’d like to think there’s flexibility in how you can surf in general; so I’ve added these three modes to replicate the most common scoring systems.

In conclusion

You don’t need sync. If you’re able to grasp the basics of Surf then you really don’t need sync. If you’re new or you’re really trying to perfect your style and timetrials with little-to-no room for error, then it’s useful; but not the be all and end all. Oh and one more thing – we don’t record it serverside at all. It’s purely a measure for your eyes only.