Man, I have been waiting and waiting for SOME bit of news to pop its head out, but it seems with MoP firmly set to release next Tuesday there is nothing new to say. I am going to have to scrimp and save to find time to actually grind Rey up. Time has been hard to come by of late, and to be honest I have spent most of mine doing non-WoW related things. The powers that be finally released Black Mesa Source (and I highly recommend this game to anyone who: 1) never played Half Life, 2) played Half Life and loved it, 3) played Half Life but hated the graphics; essentially, I recommend this game to everyone).

Black Mesa is a completely beautiful remake of the original Half Life in the Source Engine (the graphics engine used for Half Life 2 and all the episodes). To say nothing else about the game, the graphics improvement is absolutely breath-taking. I loved Half Life, though I only played it a few years after its initial release. In fact, by the time I had played it, Blue Shift and Counter-Strike (and a number of other mods) had been in the wild for a good while.

Which brings me to my next en devour that has been taking up all my time. Many of you know that I have been an avid L4D player for a good while now, but like Half Life I was (somehow) slow to the scene and only started playing the game around 2010. Sure, that is two years ago at this point, but the game was released in 2008 and had been a thriving competitive scene since then. Like arena, I thrive on competition; this stems back from the days of playing Counter-Strike in Cal League and getting to a rather high division (though not Cal-I; made me sad... that was my Gladiator aspiration circa 2000). Unfortunately, the competitive scene for L4D has pretty much gone the way of the competitive scene for Counter-Strike 1.6; that is, it is now dead and gone.

However, there is still a rather large community that still participates in competitive scrimmages from time to time, and if I am ever in a pick-up game with randoms and find one of these people, they will usually start kicking the baddies to make room for their friends for some competitive pub-games. It really is fun to do a lot of the time, but the problem becomes that unless you know someone, you are forced to use Valve's dedicated servers. Now, do not take this the wrong way, but there has been a lot of plugins/mods to improve the state of the game (competition-wise) since the release, and somehow Valve never got around to implementing these until a few weeks ago -- but they only did it for L4D2.

So, this got me thinking that I would just run a L4D server on my work machine when I left for the day. My machine is plenty powerful enough to run a top-notch server, and we have plenty of bandwidth to support it, so it was pretty straight-forward to me. The problem, I found, was that almost none of the competitive plugins were readily available online via Google searches. I have to admit, this has not been a problem for me in almost 15 years: wanting something that I know exists online somewhere and having no idea how to find it. Eventually, even though I had installed and set up my server on my work machine, I had to admit defeat since I could not find any of the needed plugins. After a long process of trying to come up with other solutions, I finally decided that I am a computer programmer and should see this as an opportunity rather than a defeat. There is no reason, given that I know exactly what the plugins I wanted do, that I could not simply write my own versions for each. So, that is what I started out doing.

The first plugin I wanted was something I had seen on only one or two servers before, and they were (like my workstation approach) often offline unless the owner wanted to spin them up to play. The plugin was a module-loader of sorts; it would respond to votes cast by chat communications. For instance, if there were only two players on a server and they wanted to play one on one, they would both have to type "!load 1v1" in chat and it would cast each vote, and after a short time (or after all players voted) it would decide whether the majority wanted to load the 1v1 module, then load it. This was really the lynchpin of my plugin wants and truth be told, I could have gotten around the rest missing with simply being an admin, but the compulsion to have this module overwhelmed me and so I wrote it myself.

Having 2v2, 3v3, and 4v4 configs was enough for those game styles since everything they required could be set up in simple configuration files to be loaded via the load-module, so once I knocked out the load-module, these configs came naturally. However, in 1v1 there are a special set of rules that were enforced on the servers with the original 1v1 module - no wall-kicks from hunters. For a little background, a wall-kick is something a hunter can do if he has not touched a player and has a "loaded" pounce ready (which simply means that he has pounced and come in contact with a wall). If all of these are true, then a hunter can run around silently, jump into the air with his back to a wall silently, and pounce off that wall as if he were doing a standard wall-pounce. What is more important is that hunters spawn in "loaded" to pounce, so there is a distinct advantage in a 1v1 game where a hunter can run around completely silently and make a last-second pounce on a player without that player having time to react. I ended up writing my own version of this as well; it seemed simple enough to put a small timer on a player when he jumps (if he's a hunter) and if he successfully uses a pounce within a short time (a half-second seems to work best), then he likely did a wall-kick and is killed (don't worry, the spawn timers are extremely short in 1v1; this penalty is usually learned once and then adhered to for the rest of the game).

The next plugin I wrote I do not think I actually ever saw in the wild; it might be all my own creation. Essentially, L4D is fun to play as an infected, but the game really opens up when you start getting amazing at the survivor side. In L4D1 (as a polar opposite to L4D2) the most effective infected unit is the hunter. Capable of landing one-forth of a players health in one hit and able to deal it all if not cleared quickly, the hunter is worth practicing both as and against. Learning how to deadstop, or "ds", (hitting a pouncing hunter with a melee thus stopping his pounce) is an extremely effective defensive tool. The more advanced players can also, using a shotgun, land a shot that will instantly kill the hunter mid-pounce, though this is much more difficult. Shooting a hunter out of the air as he comes to deal damage to you (very quickly, might I add), is called a "skeet"; so named for skeet-shooting -- clay pigeons and the like. I am reasonably good at deadstopping hunters on the damage-pounces (pounces from larger distances do more damage; the most being 25 of a player's maximum 100), but my skeeting needs work. I though of another loadable module for the server and decided to write a plugin that would make it so that players had infinite health, but when a hunter pounced a player, the hunter would be slayed and information (remaining health, etc) would be sent to the would-be skeeter.

One problem with the skeetpractice plugin was the no matter how I set up the server configurations, I could never get it to reliably allow a player to switch teams more than once. Essentially, if the game randomly put you onto the survivor team, you switched to infected, and later you decided you wanted to practice yourself (more hunters joined or what-have-you), you would have to reconnect to the server to pick survivor again. This is terrible, so I ended up writing a plugin that would allow anyone to type "!infected", "!survivor", or "!spectator" to switch to those teams. This is another plugin that I had seen on a few servers, but for which I had never been able to find the plugin or source code.

Similarly, in competitive games, there is the expectation that there will be a tank on ever chapter of a campaign, which is easily controlled via a server configuration. I had been on servers that reported who did what damage to the tank after the tank had died or the tank had wiped all the remaining survivors. Again, I could not find this tank reporting plugin, so I began writing my own yesterday and finally got it working last night. It still requires quite a bit of polish before it is ready for an actual game (the numbers need to be ordered descending, there are some colors needed, etc), but it works and as opposed to the versions I have seen in random games, mine will show the report in a HUD rather than the chat (which is small and prone to spamming).

Overall, the coding experience has been extremely fun and rewarding. I am hoping to get my server to the point where I would be proud to show it off to my L4D buddies and actually use it in PUGs or Scrims. The "problem" is that as I continue to write more and more functionality, I continue to find more and more worth-while plugins to rewrite; I am just now considering writing a plugin for witch reporting in addition to expanding my tank report to include more information than just how much each survivor did to the tank (such as how much damage the tank did to each player, how many punches were landed, how many rocks landed, etc).

Oh, and the last bit worth mentioning here is that I am storing all my plugin code on a GoogleCode  repository. That is, my code is open source so that anyone who wants to set up a L4D server need only look to my releases (eventually) for an all-in-one package setup for a server so that no one has to go through what I did to get a server running for a competitive environment.