SDG Blog

"Remember to put a witty tagline here!" – 2022 edition.

Unturned II Devlog #027

Mostly boring improvements and fixes.

Ballistic Weapon Improvements

Hit types that deal damage will now wait for confirmation from the server before playing effects. For example shooting a player will trigger the blood indicator, but will not cause blood splatters until the server confirms it was a hit. In the past this could be confusing if your client predicted that an enemy bullet had hit you, but then you did not take damage.

Your own shots that hit damagable targets will now subtly play the surface hit sound regardless of distance e.g. metal for firing range targets. I'd experimented with this before with all surfaces, but it was odd if the shot passed through and played a grass sound, so now it only applies for damage. In my opinion this makes the hit more satisfying, and will help for modes with hitmarkers disabled.

Ammo replication now tries to be smarter. In the past updates it has used the total quantity of bullets in the magazines and predicted ammo changes during shots, but this could be a bit finicky when magazine items changed so the server now also replicates what it thinks the total ammo is. In general this should be invisible and fix-up some of the odd cases.

Impact replication was upgraded as part of hit confirmations, so now hits on moving targets like zombies or the moving firing range targets should be consistent between clients.

Unreal 4.23

In Devlog #026 I mentioned a ragdoll-related crash that required disabling the collision effects. To hopefully get the related fix I merged us with the latest Unreal update these past two weeks, funnily enough at the same time as updating 3.0 to Unity 2018.4 LTS. Unfortunately the fix wasn't in this version so I manually merged it into PhysX which was interesting to setup a custom PhysX build. All-in-all it's good to stay current with the engine versions, and now the ragdoll effects are re-enabled!

Horde Improvements

Horde mode received a few gameplay changes and fixes:

  • Each map can setup a money-per-wave curve granted at the end of the wave which may help in the early rounds.
  • Now starting money is per-map, and gets reset between rounds.
  • Only AIs count towards the wave progress. Beforehand player zombies being alive was blocking waves from progressing properly.
  • Survivor counts are broadcasted in the chat.
  • Zombie damage uses the ballistic damage indicator temporarily.
  • Removed money-granted noise because it was annoying.
  • Congos cannot use guns anymore.


Text chat got some miscellaneous improvements. Player names are now displayed using rich text, and when clicked will open their Steam profile page in the web browser. In the future I intend to instead open some sort of in-game profile page with their survivor info, direct-message, link to their Steam profile, etc. Rich text will also be used for features like linking an in-game item in chat.

Effect Pooling

Decals and particle systems are now spawned in bulk more efficiently, similarly to 3.0. Temporarily in the previous update each niagara system and decal was an actor, but now we have reusable pools of components directly registered with the world rather than constantly re-spawning and destroying the blueprint actors.

Bullet impact effects were also converted into a subclassable UObject "BallisticImpactHandler" that are async loaded and spawned once, and can then override the effect behavior e.g. blood impacts spawn the splatter decals.

Equipment Restrictions

Item dexterity requirements are now implemented, and there are now tests in place for the related item commands and requirements. This system tries to be smarter about swapping items, e.g. if you drag a two-handed rifle onto your dual-pistols it will try to move the pistols next to each other into the same space as the rifle.

General Fixes

  • Bullet tracers that hit on the same frame as they spawned should now be visible.
  • Doors on the CQC map should open on dedicated server again.
  • Crash related to optic selection widget when exiting map.
  • Windows in Horde_Chapel tower are now blocked off preventing an exploit. Prior to the previous update I thought I had sorted this out by increasing the zombies' vertical attack distance.
  • Crash when cleaning up spectator widgets during load.
  • Tidied up disabled replicated properties and disabled several properties for actors like items and player state.
  • Corrected Horde powerup replication - I hadn't realized bHidden was replicated by default, now it isn't.
  • Several fixes for PlayerState widgets including money counter.
  • Tidied up PlayerController's ownership of menu, dashboard and text widgets in preparation for making that more extensible, and introduced a few helper structs for widget owners like weapon observers: OwnedWidgetMap and OwnedWidgetArray