I worked on the holosight this week. There's lots of shitty manual labour involved in doing this kind of stuff: setting up attachment points on all the weapons, view model and world model, then making sure they're all right. Then adjusting the ones that aren't, over and over again. The good news is that it only has to be done once per weapon, and we can re-use the attachments for different types of scopes and whatever.
The art, as always, is placeholder, so please don't go on reddit and say it's going to ruin the game because it doesn't fit the style of the game and you and your 7 friends aren't going to play the game until we add a holosight that is slightly more worn or one made out of mud.
I've been rounding the corners on attachments generally too, with attachment sounds and dropping on top of weapons.
Holosights and scopes need to be looked through. The old ironsights system didn't account for that. And it was a piece of shit. It involved manually typing in numbers for eye position and rotation, so it wasn't perfect. As I'm sure you've noticed.
So I made a whole new system and it worked great, but then I noticed that on some weapons it was off slightly. These were weapons that were rotated slightly. So after many, many many hours of debugging and trial and error, I decided to re-write it again.
The new system has us define two points for the weapon. The eye point and the aim point.
We can get very very accurate.
So the TLDR here is that ironsights will be a lot more accurate from now on. Something to keep in mind here is that if we were rushing to ship an update this week I would have probably had to say "fuck it, close enough" and shipped the first flawed version of the ironsights.
There's been a lot of discussion about the market balancing I did earlier in the week. Some of it reasoned and thought out; some of it not so much. So here's the thinking:
If there's 2000 items for sale at the lowest possible price on the market it needs balancing. If there's this many items going this cheap then there's too many in the economy, so we need to stop dropping them and maybe buy up and destroy some of them.
Why would we do this? The items in the economy should have value. They should be sought after, they shouldn't be like dirt, infecting your inventory. That's what these very low value items turn into. When you decide to sell an item, you should be able to offer it for a decent price. This is a temporary solution, as this will get less of a problem as time goes on and we have more items to drop.
As part of the long term solution this problem I want to offer a crafting solution, similar to TF2's, where you'll be able to break clothing items down into cloth, and then use the cloth to craft a new item. This, along with adding more items, should help balance things.
I want to take a look into how the weapon slots work. Our plan is to make it so you can upgrade your blueprint to add more slots etc to weapons you can craft. So I need to have a bit of time to explore this levelled blueprint system and work out how it's going to work.
Dungeons and towns progress. I have a first pass now on three of them: the Powerplant, the Trainyard and the Water Treatment Plant. I managed to design them with the greyboxed models I had made in August without too much repetition. I had a few happy accidents where I combined different buildings to make a bigger one, and it just works, doors line up, and I just have a massive grin on my face. As always when it comes to these things, stick to the grid and things all magically fall into place.
Over that period I rarely had to extend the sets of pieces so far, and it means that the overall amount of work when it will come to producing final art has been kept in check nicely.
I designed the Water Treatment Plant with the idea of pushing terrain elevation in dungeons more. It results in a playing field where you can explore from the underground to ground level and way above. The hills around have a natural overpass leading up to a water tower that snipers will love to camp. The sewer network under this dungeon is much more complex than the previous two, and it sits on different levels. There is a special monument included in one corner of it, the Pigeon Nest I showed a few weeks ago. There’ll be more loot above that reservoir than any other structure around this dungeon to reward the leet skillz of the guys reaching its top. If you enter the dungeon with the sole interest to loot this place, you can shortcut the plant by entering under the overpass.
I’m getting close to having enough content laid on the map by now. I have a precise idea of how much art needs to be produced and in what order. The coming week will be an effort to polish what I already have and pump out one or two smaller towns to replace our temporary ones - I’m looking at you, abandoned house! Then I will be on holiday for a week in the sun, yay.
The new particle effects that were introduced last week caused some serious framerate issues. To counteract I added scripts to reduce the particle count in the distance and hide particles that are far away. This went live in a hotfix over the weekend.
The most significant performance issue right now is how uneven our frame rate is whenever new things have to be loaded or stuff has to be cleaned up. I kicked the week off by profiling the current build in order to find and eliminate the sources of this one by one.
The first problem that came up was the fact that whenever a new type of building block or deployable appeared, it had to be loaded from disk. In certain situations this meant that dozens of meshes and textures had to be loaded from disk in a single frame. To counteract I now preload all assets into RAM the first time you join a server. Since this takes up quite a bit of RAM, it’s disabled on 32bit operating systems by default. If you’re running a 32bit operating system I recommend upgrading to 64bit if at all possible to take advantage of this feature.
Once this was fixed it became clear that, even when all assets have been loaded from disk, instantiating a significant number of game objects (like the building skins) can still take a very long time. I added load balancing to the building skin spawns, so they’re now using at most 1ms per frame and defer any instantiates that exceed this limit to the next frame.
For network entities things are a bit more difficult, since deferring their spawns means you also have to deal with other messages that arrive for those entities between the requested spawn and the actual spawn. For now our workaround is to simply delay all messages on the client after a certain per-frame time budget for network processing has been exceeded, which seems to work okay.
Once the building spawn hiccups were solved I had another look at our dynamic memory allocations. I eliminated all dynamic memory allocations I could from the sound updates and effect spawns, which helps a great deal with reducing the garbage collection frequency. As a frame of reference, the sound update routines that were called every frame could easily cause more than 50% of our per-frame dynamic memory allocations.
Our screen overlays have been pretty basic and limited ever since we added them. I wrote a screen overlay shader that supports normal mapping and dynamic lighting to help Scott revamp them.
With the update to Unity 5.2 I was able to fix a number of outstanding issues with our deferred decal system.
- Added support for reflection probes.
- Added ambient light to albedo decals.
- Added support for emission maps.
I also started working on fixing various smaller issues with our current fog/aerial perspective implementation. New features will include directional light occlusion and better height based density.
- Dungeons now support terrain offsets.
- Dungeons now support underground loot spawns.
- Improved client side projectile prediction.
- Fixed projectile tracers ending one frame too early.
- Added flags for client side effects and attacks to projectiles.
- Disabled small furnace smoke because it looked weird.
- Added memory usage / garbage collections to perf 2 / 3.
- Updated various things to Unity 5.2
Back to collider batching as soon as the transition to Unity 5.2 is complete.
I’ve been working to get shaders, among other things, up-to-date ahead of the Unity 5.2 upgrade. Hopefully the switch will bring some stability and a few much needed features.
Fixed a few PVT-related bugs:
- Fixed tiling artifacts happening in certain quality settings.
- Fixed low-res quality modes generally looking too blurry.
- Fixed missing resolution adjustment when switching quality level.
- Fixed ground sometimes looking blurry closest to the camera (while sharper further away).
- Optimized page caching a little bit.
Made some water progress after completing the Unity 5.2 updates. There’s still some work ahead before next week’s patch, however.
Wasted some time trying to hack away particle receiving shadows. Looked promising at start, but ended up nowhere. Unity, if you’re listening, we a fast way to get ANY shadows on transparent surfaces/particles. We need it on a per-vertex basis as well.
Finish local reflections and other pending water/river improvements.
I spent the entire week working on making new addon models. So far I’ve done the high poly models for the
holosight, flashlight, and silencer. Here:
I’ll be working on the red dot sight and the laser sight high poly models. Once the high poly models are done, I’ll begin work on texturing them.
This week I made other player’s reload sounds audible. I’ve always loved making mad charges at people in other shooters when you hear them reloading, so I’m excited to have this in game.
I’ve spent a good chunk of the week working on gunshot sounds. I’m still not super happy with some of our gunshots so I’ve been making a bunch of alternate ones for us to pick and choose from. I’ve been working on silenced gunshots too (which are really fun!).
I’ve started working on adding a bit of light movement sound to the relax gestures that Gooseman is working on when my ears need a break from all the gunshots.
I’ve added slight left/right panning to your own footsteps. It’s is a pretty tiny change, but adds a nice little touch of depth. I’ve spent a little more time working on geared player footsteps as well, but I’m still trying to decide exactly how I want to implement these.
I also did some ambient electric buzzing sounds for Petur.
Next week I’ll be finishing up the things I’ve started this week, and might start to play with some alternate ideas I’ve had for handling ambience.
We had a happy accident and completely broke Savas Island in the last hot patch, but not before I got some good feedback on how it played, and what needed tweaking.
Expect a more proper version of it next patch, with changes including:
- New loot tables made from scratch. Much better loot, and no crap.
- Added a small buildable hill in the middle.
- Added static spotlights on said hill, for defenders.
- Added a C4 spawn shack at the back of the island.
- Savas-specific loot crate textures with marked loot tiers.
- Food Town changed to an ammo farm, the only place to get special ammo.
- Added a large public furnace.
- Added several public campfires.
- Airdrops are slightly more frequent.
- Added more interesting lighting to key areas.
- Added hemp spawns.
- And more…
There will be blood.
Like I mentioned last week, I was at a wedding (yay!), and couldn’t get work done because I was about 3000 miles away from home (boo!). So, nothing to show this week since I only just got home.
Next week I should have some more sweet, sweet customizable clothing coming down the pipe. Neato burrito!
I spent some time implementing Andre’s particle optimizations onto the heavy hitters like furnaces, campfires etc. Because you don’t see the majority of effects from about 50 metres away, I can be very aggressive with the LODding. Hopefully this will continue to improve framerate as I work my way through all the effects.
New Picking Up Effect
This is the first step in altering all the effect of picking up rocks/mushrooms/logs to feel more grounded and real.
I’m starting to use mesh particles for first-person effects. They have the benefit of looking good when they get big on screen, and because they can be directionally lit they feel far more integrated into the scene and also let me dump a couple of large textures. I’m going to switch to mesh particles for most substantial impact materials, like wood, stone and concrete.
Our damage overlays are basic at the moment and need some love. Andre started the love by adding in support for normal maps on overlays. This means that overlays will react to lighting and look kind of 3D. The colours need some tweaking as it looks great sometimes but super pink at others. Andre has also suggested giving different blood drops different opacity, so they fade up at different rates as you take damage. It only has maps for bleeding at the moment but once we've worked out what the other damage states should look like I will do cold, poison, radiation etc.
Currently there are player/animals footstep particles for every terrain. I’m in the process of stripping that back so there are only particles for water, sand and snow on the majority of characters. There will be exceptions like the occasional hoof clod being kicked up for horses, but on the whole you will be seeing far fewer footstep particles. Instead I’m going to start looking at decal footprints once we move to 5.2. This has the potential to be really cool as it could allow you to track players and animals.
- Smoke signal is now more purple than pink.
- Large furnace smoke is now lighter and has an updated motion.
If we pull the trigger and fully upgrade to 5.2 I’m mostly going to be working up some benchmark decals (harvesting wood/stone maybe) and test out how useful they are going to be.
- More impact mesh particles. Concrete, wood etc.
- Still want to look at triggered and ambient effects on monuments.
- Make a bigger deal out of the remaining footstep effects. So better snow, sand and water.
- Continue improving the damage overlays starting with bleeding.
- Improve torch effects.
Fixed a few bugs for the bow & crossbow, & updated the crossbow view model reload anim, which now looks like this: