Dirty Bomb

Dirty Bomb

103 ratings
Cow HUD (works with any resolution)
By Arsonistic
A clean, compact and resolution-independent HUD, with several variations to suit most preferences.
   
Award
Favorite
Favorited
Unfavorite
Attachment/Alignment

What makes this HUD fundamentally different from most others is that instead of using PixelOffset it's mainly making use of attachment and alignment to position HUD elements.
What this means for the end-user (you, the reader) is easy scaling to most resolutions and aspect ratios and it allows you to move the entire middle lump of stuff (PlayerHealth, WeaponAmmo and more) all by simply editing single value.

I couldn't use attachment/alignment for the entire HUD though, because PlayerHealth, WeaponAmmo and AbilityCooldown aren't present during death, meaning that the GameWaveTimer has nothing to attach to and moves to the corner of the screen until it randomly updates its position. So instead of attaching the Minimap to the bottom of the screen and then using that as a base for attachment for the other elements I did the opposite; I started from the top and attached the elements with the GameWaveTimer as a base. This is why one single value needs to be changed for the HUD to work with any resolution.

Pictures
The 3 HUDs in the picture are identical aside from the elements in the center bottom of the screen.

My current favorite is the Compact variation.


Here's an image outlining all the elements. Keep in mind that they don't adhere perfectly to the outlines(a bit buggy), but it gives a general idea. There's also a lot of invisible elements in the top left corner. These are remnants of old code that just hasn't been removed by the devs.

Installation
Copy this:
NativeHUDResolution=(X=1280,Y=720)
ScopeInfoPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="",VA=""),PixelOffset=(X=0,Y=0))
ConsoleMessageLogPosition=(Attach=(H=HA_LEFT,V=HA_BOTTOM,HA="",VA=""),Align=(H=HA_LEFT,V=HA_BOTTOM),PixelOffset=(X=0,Y=30))
SpectatorConsoleMessageLogPosition=(Attach=(H=HA_LEFT,V=HA_BOTTOM,HA="",VA=""),Align=(H=HA_LEFT,V=HA_BOTTOM),PixelOffset=(X=0,Y=30))
ChatInputPosition=(Attach=(H=HA_LEFT,V=HA_BOTTOM,HA="",VA=""),Align=(H=HA_LEFT,V=HA_BOTTOM),PixelOffset=(X=0,Y=0))
SpectatorChatInputPosition=(Attach=(H=HA_LEFT,V=HA_BOTTOM,HA="",VA=""),Align=(H=HA_LEFT,V=HA_BOTTOM),PixelOffset=(X=0,Y=0))
IncapMenuPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="",VA=""),PixelOffset=(X=0,Y=0))
ObjectiveProgressionPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="",VA=""),PixelOffset=(X=0,Y=0))
ObjectiveProgressionNotificationPosition=(Attach=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=0))
ObjectiveClockPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="",VA=""),PixelOffset=(X=0,Y=0))
MinimapPosition=(Attach=(H=HA_LEFT,V=HA_BOTTOM,HA="GameWaveTimer",VA="WeaponAmmo"),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=20))
ObituaryMessageLogPosition=(Attach=(H=HA_RIGHT,V=HA_TOP,HA="",VA=""),Align=(H=HA_RIGHT,V=HA_TOP),PixelOffset=(X=0,Y=50))
InteractionFillbarPosition=(Attach=(H=HA_CENTER,V=HA_CENTER,HA="",VA=""),Align=(H=HA_CENTER,V=HA_TOP),PixelOffset=(X=0,Y=40))
ExpCounterPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="",VA=""),PixelOffset=(X=0,Y=0))
GameplayNotificationPosition=(Attach=(H=HA_CENTER,V=HA_BOTTOM,HA="",VA="BadgeNotification"),Align=(H=HA_CENTER,V=HA_TOP),PixelOffset=(X=0,Y=-10))
SubtitlesPosition=(Attach=(H=HA_CENTER,V=HA_TOP,HA="",VA=""),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=80))
ObjectiveNotificationPosition=(Attach=(H=HA_CENTER,V=HA_BOTTOM,HA="",VA="ExecutionGameStatus"),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=0))
GameInfoPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="",VA=""),PixelOffset=(X=0,Y=0))
SpectatorInfoPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="",VA=""),PixelOffset=(X=0,Y=0))
DetectedNotificationPosition=(Attach=(H=HA_CENTER,V=HA_TOP,HA="",VA=""),Align=(H=HA_CENTER,V=HA_TOP),PixelOffset=(X=0,Y=0))
DebilitatedNotificationPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="GameWaveTimer",VA="ShieldBar"),Align=(H=HA_LEFT,V=HA_BOTTOM),PixelOffset=(X=-175,Y=0)
WeaponAmmoPosition=(Attach=(H=HA_LEFT,V=HA_BOTTOM,HA="PlayerHealth",VA="PlayerHealth"),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=40,Y=27))
AbilityCooldownPosition=(Attach=(H=HA_LEFT,V=HA_BOTTOM,HA="Minimap",VA="Minimap"),Align=(H=HA_RIGHT,V=HA_BOTTOM),PixelOffset=(X=0,Y=0))
CarryBombPosition=(Attach=(H=HA_RIGHT,V=HA_BOTTOM,HA="PlayerHealth",VA="PlayerHealth"),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=-40,Y=24))
PlayerHealthPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="GameWaveTimer",VA="GameWaveTimer"),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=-68,Y=11),ShadowOffset=(X=0,Y=-1))
ShieldBarPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="GameWaveTimer",VA="GameWaveTimer"),Align=(H=HA_LEFT,V=HA_BOTTOM),PixelOffset=(X=-107,Y=27),ShadowOffset=(X=0,Y=-1))
ReadyUpPosition=(Attach=(H=HA_CENTER,V=HA_TOP,HA="",VA=""),Align=(H=HA_CENTER,V=HA_TOP),PixelOffset=(X=0,Y=0))
BadgeNotificationPosition=(Attach=(H=HA_CENTER,V=HA_TOP,HA="",VA=""),Align=(H=HA_CENTER,V=HA_TOP),PixelOffset=(X=0,Y=0))
ExecutionBadgeNotificationPosition=(Attach=(H=HA_CENTER,V=HA_TOP,HA="",VA=""),Align=(H=HA_CENTER,V=HA_TOP),PixelOffset=(X=0,Y=0))
DeathInfoCardPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="",VA=""),PixelOffset=(X=0,Y=0))
SpectatorGameWaveTimerPosition=(Attach=(H=HA_CENTER,V=HA_CENTER,HA="",VA=""),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=120))
GameWaveTimerPosition=(Attach=(H=HA_CENTER,V=HA_CENTER,HA="",VA=""),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=120))
ObjectivePosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="",VA=""),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=99))
SpectatorObjectivePosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="",VA=""),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=99))
ActionMenuPosition=(Attach=(H=HA_LEFT,V=HA_CENTER,HA="",VA=""),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=0))
SpectatorActionMenuPosition=(Attach=(H=HA_LEFT,V=HA_CENTER,HA="",VA=""),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=0))
CharacterSelectionPosition=(Attach=(H=HA_CENTER,V=HA_BOTTOM,HA="",VA=""),Align=(H=HA_CENTER,V=HA_BOTTOM),PixelOffset=(X=0,Y=0))
SpectatorCardPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="",VA=""),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=0))
ExecutionGameStatusPosition=(Attach=(H=HA_CENTER,V=HA_TOP,HA="",VA=""),Align=(H=HA_CENTER,V=HA_TOP),PixelOffset(X=0,Y=0))
ExecutionCountdownPosition=(Attach=(H=HA_CENTER,V=HA_TOP,HA="",VA=""),Align=(H=HA_CENTER,V=HA_TOP),PixelOffset(X=0,Y=0))
ExecutionRoundNotificationPosition=(Attach=(H=HA_CENTER,V=HA_CENTER,HA="",VA=""),Align=(H=HA_CENTER,V=HA_BOTTOM),PixelOffset(X=0,Y=0))
ExecutionRoundIntroPosition=(Attach=(H=HA_CENTER,V=HA_CENTER,HA="",VA=""),Align=(H=HA_CENTER,V=HA_TOP),PixelOffset(X=0,Y=0))

Find your ShooterUI.ini in C:\Users\*Username*\Documents\My Games\UnrealEngine3\ShooterGame\Config (replace *Username* with the name of the user account on your PC). Open it in a text editor, like Wordpad or Notepad++[notepad-plus-plus.org].
Select the text between "[ShooterGame.SGUIHUDPlayer]" and "MaxNumHitReticules=16" and replace it with the copied text from above.

If you have 1080 vertical resolution you're now done. If you have a higher or lower vertical resolution than that you need to change the PixelOffset Y value for "GameWaveTimer" and "SpectatorGameWaveTimer" to a fitting value. You'll probably want it close to the bottom of the screen, but not so far down that the HUD elements start overlapping. Either use one of my tested values below or just try numbers yourself (game needs to restart after each change).

Common vertical resolutions and working PixelOffset Y values:
Vertical resolution
900
1080
1200
1440
PixelOffset Y=
110
120
130
140

I recommend using the variation of the HUD without the Minimap in the center for vertical resolutions below 900.

NOTE: vertical resolutions below 1080p has a tiny overlap of ChatInput/ConsoleMessageLog. This can be fixed by increasing the Y PixelOffset of ConsoleMessageLog and SpectatorConsoleMessageLog by one or two pixels.
Resolutions higher than 1080p suffer from having a few pixels of empty space between the two instead. Same fix, only lowering the offset of course. This is done to fix a bug with the chat that is present with the default HUD (fix yo' ♥♥♥♥ SD). Details in Known Issues section.

Variations
These variations on the main HUD are simply a few lines of code that can be replaced to change the position of some of the center elements. Listing only the lines that are changed makes it easier to maintain(update) for me and reduces the walls of text in the guide.

Follow the installation instructions in the previous category, then replace the lines of code with the same name with the ones that are listed for each variation. I.e: for the first variation below you just need to replace the MinimapPosition and AbilityCooldownPosition lines and you're done. They will also require new Y values for the GWT (GameWaverTimer), which are listed below the replacement lines.

1. Uncentered or no Minimap

MinimapPosition=(Attach=(H=HA_RIGHT,V=HA_BOTTOM,HA="",VA=""),Align=(H=HA_RIGHT,V=HA_BOTTOM),PixelOffset=(X=0,Y=0))

AbilityCooldownPosition=(Attach=(H=HA_LEFT,V=HA_BOTTOM,HA="GameWaveTimer",VA="WeaponAmmo"),Align=(H=HA_RIGHT,V=HA_BOTTOM),PixelOffset=(X=0,Y=-25))

Vertical resolution
720
900
1080
1200
1440
GWT PixelOffset Y=
120
130
140
150
160

The minimap is in the bottom right corner of the screen. If you want to remove the minimap you can do so by changing "m_MiniMapWidth", "m_MiniMapHeight" and "m_MinimapPollThreshold" all to 0. They can be found under "[ShooterGame.SGUIHUDMiniMap]" (Ctrl+F is your friend).

2. Compact

MinimapPosition=(Attach=(H=HA_LEFT,V=HA_BOTTOM,HA="GameWaveTimer",VA="GameWaveTimer"),Align=(H=HA_LEFT,V=HA_TOP),PixelOffset=(X=0,Y=30))

WeaponAmmoPosition=(Attach=(H=HA_LEFT,V=HA_TOP,HA="PlayerHealth",VA="PlayerHealth"),Align=(H=HA_LEFT,V=HA_BOTTOM),PixelOffset=(X=40,Y=48))

PlayerHealthPosition=(Attach=(H=HA_RIGHT,V=HA_TOP,HA="Minimap",VA="GameWaveTimer"),Align=(H=HA_RIGHT,V=HA_BOTTOM),PixelOffset=(X=2,Y=37),ShadowOffset=(X=0,Y=-1))

Works with the same GWT PixelOffset Y= values as both the standard and Uncentered Minimap variations. Depends on how far from your crosshair you want the center elements.

If you don't want the minimap clipping into GWT/Health in spectator mode you need to change m_MiniMapSpecWidth and m_MiniMapSpecHeight to the same as m_MiniMapWidth and m_MiniMapHeight.

Customization

You can move the entire blob of elements in the middle bottom of the screen (PlayerHealth, WeaponAmmo and so on) by simply changing the PixelOffset value for GameWaveTimer since the rest are all attached to it. Choose a positive X value to move it to the right, a negative to move it to the left. Choose a higher positive Y value to move it down, a lower value to move it up.

You can reduce the size of ally/enemy names and healthbars and objectives by setting NativeHUDResolution=(X=2560,Y=1440). You'll also need to double the PixelOffset values on ConsoleMessageLog, GameWaveTimer, Objective and their Spectator versions and ObituaryMessageLog when you do that to keep the HUD elements in the same places.
Some HUD elements, like ExecutionRoundNotification (start/end animation) break when you change NativeHUDResolution. Center alignment also breaks. Luckily I use very little center alignment. The only notable element that moves is the enemy/teammate squares at the top of the screen (ExecutionGameStatus).

Patch introduced problems?

You might need to update your ShooterUI.ini after some patches, to avoid bugs from incompatibilities with changes made to the game. To update just delete ShooterUI.ini, start the game (which creates a new default ShooterUI.ini), close the game and then reinstall the HUD.

There will of course be patches where I have to update the HUD code for it to work as it should, but these should be pretty rare. I'll write a comment whenever I update the HUD. Check the "Subscribe to thread" checkbox if you want to be notified of that.

Restoring defaults

Didn't like the HUD or couldn't get it to work properly? No problem. All you need to do to go back to defaults is to delete "ShooterUI.ini". The game should make a new default file when you start it.

Known issues

Game-related: (stuff I probably CAN'T FIX, blame the devs)
  • The chatlog (ConsoleMessageLog) is a buggy mess that really likes the top of the screen. Attaching it to ChatInput makes the chatlog jump up to the top whenever you die and when you use specator mode. I believe this is because ChatInput is replaced with SpectatorChatInput during these instances, so the chatlog that normally attaches to the top of ChatInput has nothing to attach to and instead simply attaches to the top of the screen. I've deployed a work-around for this issue. It fixes the issue, but doesn't scale perfectly with all resolutions.

  • The PlayerHealth shadow/background sometimes moves off the actual healthbar. This is most noticeable when the healthbar is in the center of the screen, rather than the bottom-left corner, like it is by default.


Fixable:
  • The debilitated icon next to health overlaps AbilityCooldown when using mercs with more than one ability on the uncentered minimap variation, and it overlaps the GWT slighly on the Compact variation, but it's not an issue on the normal HUD. It's of very low importance and fixing it would cause bigger problems; it will not be fixed.

  • The health number overlaps overtime text on the compact variation. Low importance, would cause other problems; will not be fixed.

  • A couple of the notifications overlap. All of them are of low importance though. I'm using the center top of the screen as a tuck-away zone for the less useful stuff.
43 Comments
Shin Navideño Jun 7, 2018 @ 3:53pm 
AllRight
Arsonistic  [author] Jun 7, 2018 @ 4:47am 
@Shin
The one without centered minimap might work. But if your screen supports higher resolutions then you should use them and reduce the renderscale instead, because that gives about the same performance, but with higher resolution HUD/UI.
Shin Navideño Jun 4, 2018 @ 8:30am 
800 x 600?, cuz i really want all of my fps
RykerXD Feb 28, 2018 @ 4:59pm 
Just wanted to say thanks for the updates. Much appreciated. :HappyFragger:
Arsonistic  [author] Feb 28, 2018 @ 10:30am 
Updated ShieldBarPosition to account for the new design with the Phantom rework.
Also moved DebilitatedNotificationPosition to the right of PlayerHealth instead of above.
Arsonistic  [author] Sep 22, 2017 @ 4:59pm 
Fixed minor issue with the compact variation that occurred with the Sept 21 (Ghostclip) update.
Arsonistic  [author] Sep 15, 2017 @ 3:41pm 
Updated for the Sep14 update.
Arsonistic  [author] Sep 5, 2017 @ 2:30pm 
Updated for the hotfix with font-changes that landed yesterday.
Arsonistic  [author] Aug 27, 2017 @ 5:26pm 
Updated for Javelin Patch. Please comment if you find something that is off.
meir May 2, 2017 @ 7:18am 
xD