HALF-PAYNE - DEFINITIVE FIXES
Half-Payne latest update fixes several issues based on the feedback I've received and few gameplay videos watched.
- New implementation of slowmotion, which was made possible by registering hidden console variable - sys_timescale, which, compared to former implementation, doesn't have problems like gameplay speedups after level loading or keeping the game minimized for awhile. Since this console variable is engine related, it also seems to make event-based weapon reloading sounds and explosion sounds also slowed down. The implementation is a hack and it has chance to fail if Valve decides to update GoldSource engine for some reason. If that happens - the game will fallback to old implementation of slowmotion. Thanks alot to SoloKiller for hinting towards this console variable.
- Player now has no right to change sys_timescale or host_framerate console variables.
- Improvements and fixes to the ending map.
- Berettas and MP5 now shoot faster when slowmotion is present.
- Slowmotion deactivates smoother when slowmotion charge runs out or after diving.
- You can now change difficulty on the fly if you play vanilla gamemode. Monsters get new amount of health only when spawning though.
- You can now specify in detail which Max's commentary to play in the advanced options tab or with console variables.
- You can now grab the ladder after diving.
- Flashlight is now turned off when you die.
- Max now doesn't repeat the same swearing twice.
- Replaced Glock pistol HUD sprites with Beretta ones.
- Updated Barney vanilla model to make him hold a Beretta (thanks Rara).
- Updated Score Attack default config files to prevent backtracking.
- Added [change_level_prevent] custom game mode config file section.
- Added a couple of new custom game mode configs: akimbo_agony, basic_weapons.
- snark_inception custom mod: snarks are now immune to explosions.
- vvvvvv, upside_down custom mod: fixed incorrect positioning of bullets and tracer effects, incorrect punchangles; tripmine is rolled 180 degrees if player is looking upside down.
- vvvvvv: you now get fall damage, default config file includes no_fall_damage mod instead.
- Added custom mod: no_smg_grenade_pickup.
- Added custom mod: no_fall_damage.
- Added custom mod: no_secondary_attack.
- Added custom mod: diving_allowed_without_slowmotion.
- Fixed raw mouse input (m_rawinput) not working correctly - restricting player's view.
- Fixed grenades and satchels getting stuck in the player in case of throwing them straight down.
- Fixed tripmines' and snarks' immunity to explosions.
- Fixed rare crash when sound is about to be played specified in [sound] or [max_commentary] section.
- Fixed getting stuck in the air after killing barnacle when you were laying on the ground still after diving.
- Fixed map's fading in effects getting cancelled when player activates slowmotion or takes a painkiller.
- Fixed being able to reload weapon with full clip after you switched to this weapon.
- Fixed player's kill not being counted if it was done by activating multi_manager, which activated something that made the kill.
- Fixed not having Max Payne model active in some cases.
NEW SLOWMOTION IMPLEMENTATION
There was a moment where I once again told someone that slowmotion implementation was poor and dated back to March 6th, 2016. The guy known as SoloKiller, who's reverse engineering the GoldSource engine and also works on better Half-Life codebase, hinted at sys_timescale cvar.
I was shocked to find out about this. sys_timescale is basically host_timescale from Half-Life 2, but Valve didn't provide access to this console variable. It wasn't registered and wasn't explicitly exposed in the public codebase.
But it was still there, inside the engine. You could see it in hw.dll with HEX editor, and I could see the exact same presence when I looked directly at the memory location of fps_max variable.
I knew that it will always be here, unless Valve update their engine and it will somehow move the variable. So I just had to use fps_max as starting point for console variable pointer, offset it back several bytes and then register sys_timescale by pointer.
It got registered.
I was shocked.
Time slowed down properly.
I was so happy.
No more random speed ups and vsync bullshit.
It was the right way to do this from the beginning.
Thanks you for the hint, SoloKiller.
The next update will be focusing on adding new gameplay mods. Some of them were supposed to be in this update because it'd be easy to implement, but honestly I've got lazy with them and I think bringing out fixes as fast as possible was more important.
I don't know when to expect next update, I'm definetely lowering my development pace now. Very rough estimate would be around July-August.
Since it may take a long time for the next update, shoot your ideas on new custom mods, here's the list of most ideas I've got written down:
- german_edition - bring back censored Half-Life content (because it's ridiculous)
- robo_grunts - as a feature of german_edition
- moving_with_guns - you can only move around using recoil (remember how powerful Opposing Force machine gun was?)
- skating - this one I can't promise. I accidentally made skating-like movement and it was fun to play, but it had some critical problems that have to be fixed.
- gungame - you only have one weapon, getting enough kills or wasting enough time gives you the next weapon
- monsters in func_breakable - chance of getting random monster when breaking crates etc.
- alien_grunt_hitscan - self explanatory (don't ask why, I just want to try)
- bullet_ricochet - self explanatory
- grenade_ricochet - ridiculous physics for the grenades
- demigod - you start with 32767 health and can't heal
- penguin_snarks - replace snarks with penguins from Opposing Force
- mp5_burst - makes MP5 shoot in bursts of 3 bullets, superhot needs this
- grenade_cluster - grenade exploded will produce pellets that will also explode
- satchel_cluster - satchels exploded will produce pellets that will also explode
- slowmotion_only_by_diving - only diving allows to activate slowmotion
- painkiller_regen - painkillers take time to heal instead of healing instantly
- no_slowmotion_charge_on_kills - self explanatory
- slowmotion_on_painkiller - get full slowmotion charge when taking a painkiller