5.23 更新

## 1 Notable changes

* New map: Search 'n Destroy, by Hezus
* Do not expose values of protected CVARs in auto-completion (e.g. "rcon\_password"), show "\*\*\*PROTECTED\*\*\*" instead.
* Fixed server browser not showing any results immediately after updating video settings. (No longer requires game to be restarted.)
* RPG rockets are now flagged to not collide with allies by relationship. (E.g. players firing their RPG no longer need to worry about suicide due to another player running in front of them.)

## 2 Known issues

The following issues are new and known to us since the previous release. *(Please don't file bug reports about these.)*

* NPC corpses may occasionally become solid for a moment during their dying sequence causing a minor block. (This should clear once the death sequence is completed.)
* Scientist and medic grunts do not complete their revive sequence properly: They correctly identify whom they should be reviving, and start doing it, but at the end of the sequence the revive doesn't happen.
* When a player is revived (by anyone) whilst observing they may respawn with a rolled view angle.

## 3 Code

### 3.1 Game library

* Added column for armor level in the score board following the same colour codes as health column. (This will show as "N/A" for unsuited players.)
* Automatically determine whether to spawn players crouched or standing: When spawning the player a trace is now used to determine if enough free space for standing is available. If the trace is obstructed, the player will always spawn in the crouched position. (This allows for players to spawn in things like vents or low ceiling areas.)
* Breakable entities will now consider their classification relationship with an attacker when taking damage or repair.
* Camera with cursor tweaks:
	+ Minimum digital mouse action of 0.01 (10ms) to prevent command data explosions when holding a mouse button whilst viewing a cursor enabled cameras.
	+ Added entity key "mouse\_digital\_action\_reset" for mappers to change the wait/reset time between each digital mouse action, though there is still a minimum of 0.01 (10ms) imposed.
	+ Do not check or set digital action next time (wait) if the action is empty or exit the camera.
	+ Added keys "mouse\_block\_drag\_\*\_\*": This allows a mapper to block a repeated action from firing when a mouse button is held down then moved about whilst held. (E.g. constantly triggering a door open/close just by holding a mouse button and jittering movement a bit.)
	+ NB: Digital mouse action means clicking, double-clicking, and wheel up/down. This doesn't apply to analogue actions, being moving and dragging.
* Changed some bullet casing projectiles to use new models.
* Cheat command "trigger" now has a server-side equivalent "s\_trigger", which can be used via RCON or in a server console directly. (The server-side version cannot pass an activating entity to the target.)
* Client command "mapinfo" will show a dump of all CVARs of which maps are allowed to edit in their configuration. (Useful for players to know if rogue server ops are messing about with physics.)
* Client command "myinfo" and "thatinfo" will now show the chosen and current (if forced) model a player is using when directed at a player.
* Client command "myinfo" and "thatinfo" will now work even when cheats are disabled when directed at a player, but only print a much more basic set of information.
* CVAR "hud\_fastswitch 1" will now cause the game to switch instantly to the next/previous weapon.
* CVAR "mp\_keep\_globalstate" will no longer cause a (silent) memory allocation failure in the engine.
* CVAR "mp\_nextmap\_ignore\_mapcfg" when enabled (by default) will no longer allow map configurations to use the super ancient "nextmap" configuration option. (Mappers should have been using "trigger\_changelevel" for well over a decade!)
* CVAR "mp\_npckill" updated to ensure full classification support:
	+ 0: An NPC will ignore damage if relationship is neutral or ally.
	+ 1: An NPC will never ignore damage regardless of relationship.
	+ 2: An NPC will ignore damage if relationship is ally only, and the attacker is a player OR the attacker and victim classes are identical. (Halfway between 0 and 1.)
* CVARs "cl\_mirror\_disabled", "cl\_monitor\_disabled", and "cl\_portal\_disabled" (when active) will now draw the original texture in the map instead of an invisible space.
* CVARs "mp\_allowmonsterinfo" now has value 2 to show information for allies only.
* Ensure server name is sent to clients when their HUD is initialised. (For the scoreboard.)
* Entity "env\_render" now supports "!activator" and "!caller".
* Entity "env\_sentence" spawn flag 1 added for "Activator Only".
* Entity "func\_tank" will now use it's "v\_angle" property to decide its resting angle.
* Entity "func\_pushable" will now move much more stably with a player's movement. (Won't slide like they're made of and on top of ice.)
* Entity "game\_player\_counter" can now be triggered to read a count at any time, and will store this in its "dmg" key for reading by other entities (e.g. trigger\_condition) or scripts.
* Entity "game\_player\_counter" now asks the engine how many players are present instead of trying to keep its own count internally.
* Entity "global\_light\_control" can now target and change the appearance of switchable light entities.
* Entity "global\_light\_control" will now search for a light entity defined by the "target\_entity" key. (If a light entity is found it will update the light entity's corresponding style index to give the light a new appearance.)
* Entity "item\_inventory" keys "target\_on\_cant\_activate\_\*" weren't meant to have "on\_" in them. (The FGD, and maps, were correct.)
* Entity "item\_inventory" will no longer perform strict line of sight checking when the item is being triggered directly. (Either by a map or the "trigger" cheat command.)
* Entity "item\_inventory" will now respawn properly if a player disconnects whilst holding an item. (A drop with return is now forced.)
* Entity "item\_inventory" will now update its respawn position when moved by a "trigger\_setorigin" more reliably.
* Entity "path\_waypoint" missing feature "Wait Master" added. If a wait master is specified for a "path\_waypoint" the NPC will wait at there until the wait master has been triggered.
* Entity "trigger\_change\_class" corrected "none" class unintentionally becoming "object default" at runtime.
* Entity "trigger\_change\_class" corrected use type TOGGLE turning `m\_fOverrideClass` off on itself instead of the target when this needs to undo a class override it had previously turned on.
* Entity "trigger\_changesky" can now change sky colour as well as sky name. (Either property can be left empty to not modify it.)
* Entity "trigger\_script" will now fire automatically when in trigger mode and the "Start On" flag is enabled. (It will use itself as activator and caller, and push use type toggle.)
* Entity server logging text (including player stats) will now use a classification tag for the team field. (E.g. "player", "team1", "human\_military", etc.)
* Fixed a crash in with the HUD number display.
* Fixed a lock-up sometimes occurring when exiting the game due to the Steam API not being given a chance to shut down.
* Fixed a player exploit being able to evade a successful kick/ban vote by disconnecting/reconnecting during the poll if they rejoined in a different player slot.
* Fixed a player exploit being able to start new polls when a current poll was in progress.
* Fixed akimbo Uzis appearing for a moment immediately after changing map that carries inventory to a map that does not allow akimbo Uzis.
* Fixed an infinite loop in the media player when only 1 song is in the play list and the random song option is enabled.
* Fixed crossbow bolts bouncing off of entity brushes before exploding.
* Fixed entities spawning via the "create" cheat command having incorrect angles if the player has a roll angle value greater than zero.
* Fixed global entities not being preserved and discarded correctly between level transitions.
* Fixed player command "+use" causing inconsistent player movement speeds and velocity. If holding "+use" the player's velocity is no longer clamped. ("+use" and "+speed" commands now share the same movement speed reduction defined by the "cl\_movespeed" CVAR.)
* Fixed player visible set (PVS) not being cleared when players are teleported directly, which could cause the "Too many entities in visible packet list." warning.
* Fixed relationship between player and player ally classes not always being allied. (In some cases they were only neutral.)
* Fixed wall clipping issue with custom muzzle sprites.
* Function `CheatsAllowed()` now has an extra argument to not produce a message if a cheat command was denied. (Useful if a plug-in needs to check if a cheat is allowed in an way without informing the player because they hadn't tried to use one directly, or logging the "attempt" as a naughty player.)
* Increased MAX\_WEAPON\_POSITIONS to 25 from 20.
* Internal functions that kick a player from the game will now use integer user IDs instead of name, to ensure players with obscure names can't evade being kicked when necessary.
* Item entities can now use move types none (via -1), toss (default), fly, and fly w/o collision.
* Item entities can now use solid types none (via -1), trigger (default), and bounding box. (When an item is solid the custom hull size must also be set for the item to really be solid.)
* Mortar damage is now controlled by a new skill variable "sk\_mortar" instead of being hard-coded at 200. (Applies to mortar field and Opposing Force mortar cannon.)
* New client command "hostinfo" to show some information about the server: (Some have been moved away from "mapinfo".)
	+ Server name
	+ Whether it's private (passworded), though won't reveal the password
	+ Whether it's dedicated, and who the host player is if not
	+ Administrative contact (based on CVAR "sv\_contact")
	+ Maximum players
	+ Current map name
	+ Next map name
	+ Cheats mode
	+ Number of entities
	+ Number of pre-cached models
* New classification for the missing shock trooper X-Race variant, used by both shock troopers and Voltigores. (ID 15.)
* New classifications for four teams 1-4 (IDs 16-19):
	+ Labelled Blue, Red, Yellow, and Green respectively.
	+ Players inserted into team classes will show up coloured in the score board along with their name in text chat.
	+ Players using team talk "messagemode2" will be private from other teams, or in fact any classification not allied to.
	+ Players will not be able to see the health or armor values, and dead status, of players in rival classifications. (Both on the score board and when looking at them.)
	+ Team classes will dislike every other class, and every other class will dislike team classes equally.
* New client command "mapname" to show the name of the current map.
* New client command "nextmap" to show the name of the next map. (Based on CVAR "mp\_nextmap\_cycle".)
* New client command "playerinfo" to show some information about a player. (1 argument can be empty for yourself, or can specify a user ID integer, or quoted Steam ID.)
* New effect flag "EF\_NOSHADOW".
* New entity flag "EFLAG\_IGNOREGRAVITY" to prevent an entity being impacted by gravity (including "trigger\_gravity"):
	+ Applied to Alien Controller zap and head balls.
	+ Applied to hornets, both by players and Alien Grunts.
* New entity flag "EFLAG\_PROJECTILE" to prevent an entity colliding with allies (by relationship):
	+ Applied to RPG rockets so players firing their RPG no longer need to worry about blowing themselves up due to another player running in front of them just at the right (or rather wrong) moment.
* New map CVAR "mp\_allowplayerinfo" if player HUD info is permitted. (On as standard.) Should be useful for hide and seek, hur hur hur.
* New server CVAR "mp\_nextmap\_parted\_mapcfg\_limit" allows a server to declare how many concurrent "nextmap" calls maps are allowed to make before it ignores them, only when "mp\_nextmap\_ignore\_mapcfg" is off. (Set to "-1" to disable, also default, or 0 for no parting allowed.)
* Player input is now just a range of -255 to 255. (Keyboard buttons will set forward to 255 or -255. Analogue will scale that. The speed key cuts in half, etc.)
* Player rendering keys (mode, amount, colour, and FX) set by various trigger entities will now copy the new value to their original (or "standard") rendering properties, so that entity effects knows about it when re-applying them. (E.g. for items, Minigun speed adjustments, etc.)
* Player server logging stats will show -1 health for dead players.
* Player server logging stats will show armor value, with -1 for unsuited players.
* Re-factored how player maximum speed is defined. Deprecated the need for cl\_forwardspeed/cl\_sidespeed/etc. (The corresponding CVARs have been removed.)
* Removed "can't assess" messages from func\_tank and monster\_apache when using "developer 2"
* Removed "Friendly" prefix from NPCs that are spawned as player allies without a customised display name. (No longer necessary.)
* Removed many generic references to the redundant "skill" CVAR. Where it is still used for reading in map skill configuration it is forced to medium level (2).
* Removed NPC and weapon references to the redundant "skill" CVAR.
* Weapons now reset their render mode and render amount upon being picked up by a player. (This fixes the leftover transparency issue when a weapon is picked up while fading out and then dropped again.)
* When an intermission is about to start clear the most recent HUD centre message before sending the intermission message as high latency may mean clients still see a historic message scan in place slowly.
* When an intermission starts update everyone on the server name, next map, and player scores. (Should any of that have changed.)

### 3.2 AngelScript

* Added `SetClassificationSpecial()` to fix issue with AngelScript crashing the game due to `SetClassification()`'s default arguments not being handled when registered.
* Class CString now has a `Tokenize()` function to mirror the C++ `strtok()` function:
	+ Includes thread safety.
	+ This is designed to be used in a `while` loop.
	+ Each call to `Tokenize()` with your delimiter character/string will return the next token string.
	+ If your delimiter isn't found the whole string is returned as the only token.
	+ Once the last token has been returned constant NO\_MORE\_TOKENS will be returned and resets the position of the last token to zero.
* Corrected method documentation for `GetWeaponsBlocked()` in `CBasePlayer`, as it actually has a boolean return value.
* Fixed a crash with `SetClassification()`.
* Fixed a regression for AS get/set methods due to a change in language behaviour.
* Fixed incorrect logic for the ShouldGibMonster() method when used with player in scripts.
* Function `IRelationship()` now has a second parameter `bool fIgnoreNoTarget`, default false. This can allow a relationship check to ignore a non-targetable flag to fetch a relationship based on the original class, as non-targetable typically forces a neutral relationship. (Enabled internally for healing, repairing, reviving, score board rival info masking, etc.)
* New CVAR "plugin\_list\_file\_persistent" to let the server decide if it will reload or persist loaded plug-ins across maps. (Default on.)
* Player variable `m\_flMaxSpeed` has been removed to remove conflicts with maps and game entities:
	+ Direct speed set via `pev.maxspeed` will no longer work.
	+ Function `SetMaxSpeed()` and `GetMaxSpeed()` sets/gets a player's base maximum speed.
	+ Function `SetMaxSpeedOverride()` and `GetMaxSpeedOverride()` sets/gets a player's temporary maximum speed, with -1 removing this override (for set) or indicating no override is set (for get).
* Server plug-ins can now be included/excluded on map by map basis by using keys in the plug-in list file for each plug-in:
	+ CVAR "plugin\_list\_file\_persistent" must be switched off otherwise the "as\_reloadplugins" command must be called by the server.
	+ Key "maps\_included" to run a plug-in only on the maps specified.
	+ Key "maps\_excluded" to run a plug-in on all maps apart from the maps specified.
	+ Multiple maps can be specified in either key by splitting them with a semi-colon ';' delimiter. (E.g. "svencoop1;osprey;stadium4".)
	+ Do not use both "maps\_included" and "maps\_excluded" keys! (This won't crash, it just won't work at all.)
* Updated AngelScript to 2.34.0.
* Voice banning is now bridged through the game library instead of going to the engine directly to remove competition between scripts and the game library.

### 3.3 Engine

* Added engine client function to change sky colour.
* CVAR "mapchangecfgfile" and related functionality is now removed.
* Datagram overflow and msg overflow warnings now show the client and user ID they're referring to.
* Do not expose values of protected CVARs in auto-completion, show "\*\*\*PROTECTED\*\*\*" instead:
	+ Prevents sensitive CVARs such as "password" and "rcon\_password" being exposed accidentally whilst streaming.
	+ Submitting the name of these CVARs on their own and pressing ENTER will still expose the value in the console output, e.g. just submitting "rcon\_password" will show what value you've got set but only when you press ENTER.
* Fixed a lock-up sometimes occurring when exiting the game due to threaded networking not being given a chance to shut down.
* Fixed a potential crash that could occur when out of range colour value was supplied from the client code. (Incorrect code, FP errors, etc.).
* Fixed a potential crash when the engine is restarted (such as when changing video settings) if a server browser query was in progress.
* Fixed a potential variable name conflict that would have caused packets to be sent to the wrong client.
* Fixed flashlight spot not being displayed at the correct position for other players, and for the local client when in 3rd person view.
* Fixed glow shell render FX breaking additive/masked textures on models.
* Fixed issue with player's "notarget" cheat command preventing NPCs from entering combat.
* Fixed maximum path length being 256 instead of the usual 260 "MAX\_PATH\_LENGTH" when loading the list of maps for the "Create Game" form.
* Fixed server browser not showing any results immediately after updating video settings. (No longer requires game to be restarted.)
* Fixed weapon animation playback de-synchronization problems when switching between first and third person
* HPAK: Do not add lumps to pack when the maximum size is zero. (Prevents unnecessary additions to "custom.hpk".)
* Improved performance of collision checking so that the game library/code is only asked after a basic exclusion test.
* Increased MAX\_LIGHTMAPS to 1024 from 512.
* Increased network message size limits and allowed more resources.
* Interpolation update / listen server visual improvement:
	+ If entity interpolation was deemed non-viable for entities with a MOVETYPE besides MOVETYPE\_NONE, MOVETYPE\_WALK, MOVETYPE\_FLY, or MOVETYPE\_STEP, the given entity would not render. Those entities now always render regardless of interpolation checks.
	+ Listen server clients will skip entity interpolation and instead use current entity origin and angles. This fixes visual artefacts where entities like the spore grenade would not render their glow correctly.
* LAN games now perform IPv4 address checks using only known reserved ranges (RFC1918, RFC1122, and RFC3927) instead of a basic class B check. (This means anything outside the known reserved ranges will not work for LAN games.)
* New VGUI event "NotifyOnExitToDesktop".
* New VGUI event "OnExitToDesktop".
* Portals (including mirrors and monitors) now function in full screen mode.
* Server debug message "Too many entities in visible packet list." now shows which client and user ID its referring to.
* Threaded networking:
	+ This offloads handling of the incoming (not outgoing) packet queue to a separate thread away from the main server thread.
	+ It has shown to reduce lag under high CPU load on servers with multiple CPU threads available (affinity of at least 2 threads), and partially mitigates denial of service attacks.
	+ Now enabled by default for clients and servers. (Use switch "-nonetthread" to disable it instead of "-netthread" to enable it.)
	+ Added Linux implementation.

### 3.4 Non-playable characters

* Big Momma:
	+ Fixed "Got a NaN velocity on bmortar" error message and prevent division by zero crash
	+ Fixed division by zero: Clamp sv\_gravity query to 0.1.
	+ Fixed NaN result: Re-factor speed calculation: Don't perform sqrt() if input isn't greater than zero.
* Fixed old Half-Life bug with "Gag" spawn flag not working.
* NPCs now float properly in water. "MADWHACK" effect is also working properly now.
* NPCs repelling that don't have a target name will now automatically spawn, otherwise they'd never spawn at all.
* NPCs will no longer launch into the air if they're presently in water.
* NPCs will now re-evaluate their relationship with their engaged enemy. If they're now friends since attacking begun the attacking NPC should stop attacking. (This also fixes a potential bug with "func\_tank" and OP4 mortar unintentionally targeting allies.)
* Shock Trooper's shock rifle impact now properly creates a lighting effect. (This fixes a regression with the network message.)
* Xen Plants now make the default crowbar sound when attacked.

### 3.5 Sound

* Sound effects played with out of range volume or attenuation levels will no longer cause the game to exit. Volume levels are now clamped between 0.0 and 1.0. Attenuation levels are now clamped between 0.0 and 4.0.
* Volume and attenuation level precision (for sending over a network message) is now more accurate. Both values are now transferred and received correctly with a range of 0 to 255.

### 3.6 Weapons/Items

* Fixed issue with "reload" player animation not playing if sniper rifle is reloaded while using scope.
* Fixed potentially using uninitialized memory for muzzle sprite offset vectors and other particle effect properties
* Shock roach will now be deleted from the world properly after a player drops it.
* Entity "item\_inventory" restored key "return\_delay\_respawn" to delay the item's materialisation when returning, like weapons/ammo/etc do.

### 3.7 ZHLT

* Added switch to disable AAATRIGGER faces being converted to NULL.
* Consistent switch behaviour between platforms. (E.g. Windows had "-estimate" but Linux had "-noestimate".)
* Linux is now able to detect the maximum CPU threads available.
* More consistency of the names of settings, and how they're displayed prior to each compile process beginning.
* Statistic "maxallocblock" now states the correct amount 1024 instead of 64.
* Updated MAX\_TEXTURE\_SIZE for 1024x1024 textures.
* Vastly expanded "info\_compile\_parameters" to include pretty much every setting configurable from the command line:
	+ This should reduce the requirement for a custom batch/script on a per-map basis as you'll be able to store various properties in the map itself.
	+ This should also make compiling more consistent for maps built by multiple people.

## 4 Maps

### 4.1 Black Mesa: Special Tactics Sector

* Added "trigger\_changesky" so an area have it own sky.
* Added Christmas decoration in the map.
* Added Christmas player and scientist models .
* Added a counter for the amount of monsters inside a sample.
* Added a new way to understand which monster is inside a sample.
* Added new special events which can change an area.
* Added support for the new team classifications.
* Changed escape maze a bit, random ways now.
* Changed the flag item to be dropped after 45 seconds.
* Changed the Gonarch HP, way less.
* Changed the Xen area a little bit, now has a sky too.
* Fixed the suicide bug, where player still got points for survival rounds.

### 4.2 CTF Warforts

* Converted team classifications to team 1 (blue) and team 3 (yellow).

### 4.4 Stadium 4

* Each side is split into blue/red team instead of allied/enemy team.
* Players can join the arena as a specific team using their respective portals.

### 4.6 Toonrun

* Added custom materials file.
* Configuration file consistency.
* Fixed armor not being given when a player spawns. (25% was intentional.)

## 5 Models

### 5.1 NPCs

* They Hunger:
	+ Recompiled dog model to implement better hit boxes for the NPC (hungerhound.mdl, hungerhoundt.mdl). Fixes immunity to bullets.

### 5.2 Weapons/Items

* Added They Hunger player weapon model for episode 3 MK2 grenade.
* Fixed and updated SAW models. (P, V, W, and clip.)
* Higher definition spore launcher view model.
* New 11.2x33mm (.357 magnum) shell model.
* New 7.62x51mm (NATO) shell model.
* New SAW ammo model with 3D bullet belt.
* Replacement 12GA shotgun shell model.
* Replacement 5.56x45mm (NATO) shell model.
* Replacement 9mm shell model.
* Updated Opposing Force desert eagle, MP5, and SAW view port model in line with the standard. (Fixes muzzle attachments, and extra bullet body groups for the SAW.)

## 6 SDK

### 6.1 FGD

* survival.fgd:
	+ Added a default survival.fgd to make the survival script easier to use for mappers.
* sven-coop.fgd:
	+ Added "color" to "trigger\_changesky".
	+ Added "mouse\_block\_drag\_\*\_\*" to "trigger\_camera" and "trigger\_cameratarget".
	+ Added "mouse\_digital\_action\_reset" to "trigger\_camera" and "trigger\_cameratarget".
	+ Added "movetype" choice "-1" labelled as "Unmoveable". (This kind of move type prohibits movement of any possible influence, with the exception of the move type being changed to something else at runtime.)
	+ Added "solid" to base class "ItemWithDefaultModel" allowing mappers to set an arbitrary model as solid when paired with a custom hull size.
	+ Added "zhlt\_customshadow" (float or RGB float) to brush models to specify a custom shadow colour and opacity for opaque entities. (Either a single float from 0.0 (black) to 1.0 (invisible) can be used for greyscale, or three floats to represent RGB.)
	+ Added "zhlt\_embedlightmap" (boolean) to brush models to embed light maps to translucent brushes to give them localised lighting instead of being based on white / full bright. (Brilliant for glass and water!)
	+ Added "zhlt\_embedlightmapresolution" (integer) to brush models to embedded light map resolution. (Recommended figure is 4.)
	+ Added "zhlt\_invisible" (boolean) to brush models to make it never render, effectively nulls out a brush model.
	+ Added editor model support for "item\_inventory".
	+ Added missing human grunt weapon choices in "squadmaker" and "monster\_grunt\_repel" for the RPG launcher and sniper rifle.
	+ Added spawn flag 1 to "env\_sentence".
	+ Added missing "X-Race: Shocktrooper/Voltigore" classification.
	+ Added new teams 1, 2, 3, and 4 classifications.
	+ Flipped the choice labels for the "teleport\_if\_blocked" key value to match in-game behaviour.
	+ New entity "info\_compile\_parameters" to define compiler settings from within the map. (Reduces need of batch files and hardens consistency among multiple mappers.)
	+ Slight clarification to "item\_inventory"'s "return\_delay\_respawn" description.
* Removed "zhlt.fgd" as it's redundant. (Everything is in "sven-coop.fgd".)

## 7 Other

### 7.1 skill.cfg

* Added descriptions for misc bullets.
* Merged Half-Life and Sven Co-op sections. (No need to keep these split now.)
* Moved all behaviours dependent on the "skill" level into customizable variables:
	+ sk\_islave\_speed\_zap: Alien slave zap frame speed (1.0 as with easy/medium, was 1.5 for hard)
	+ sk\_apache\_enable\_rockets: Apache rocket launcher (ON as with medium/hard, was OFF for easy)
	+ sk\_hassassin\_enable\_cloaking: Female assassin cloaking (OFF as with easy/medium, was 1 for hard)
	+ sk\_grunt\_handgrenades: Grunts throwing hand grenades (ON as with hard, was OFF for easy/medium)
	+ sk\_shocktrooper\_enable\_spores: Shock troopers throwing spores (ON as with hard, was OFF for easy/medium)
	+ sk\_plr\_shockrifle\_recharge: Shock rifle recharge amount (6.667 as with medium, was 10.0 for easy, was 3.333 for hard)
* Sorted monsters based on their friendly name (e.g. "Alien controller" comes at "A", not at "C" for "Controller".)
* Sorted player weapons based on their HUD selection order.

### 7.2 Misc

* Opposing Force & Blue Shift installers:
	+ Improved detection of Half-Life directory location on Windows.
	+ Removed pre-packed node graphs, as it's best that the servers generate these themselves.
	+ Removed "bshift\_bsp\_convert.exe" within the Blue Shift package.
* svencoop.sh and svends\_run:
	+ Added message to warn user in case it is running the script from an unsupported shell. (Eg. "sh".)
	+ Added message to warn user in case its distribution has an outdated GNU libc version. (Outdated, not supported, etc.)
	+ Added the old game directory look-up back as a fall back in case the newer one fails. (For those who still insist on running with the old sh.)
	+ Updated crash message with a "or failed to run". (╯°□°）╯︵ ┻━┻
	+ Updated some comments in the script to make more sense for its functions.
	+ Cosmetic changes.
* svencoop.sh:
	+ Added a fall-back to current relative directory in case the script fails to find absolute game directory.
	+ Cosmetic changes to make shellcheck.net happy.
	+ Fixed listing duplication in the dependency checker function.
	+ Gracefully close when attempting to start it on MacOS with a message about the platform not being supported.
	+ Updated game directory look-up method. Potentially fixes a issue where the script fails to get current absolute game directory (eg: on arch-based systems).
* svends\_run:
	+ Added a last fall back to game directory look-up to use current relative path in case all available methods fails.
* Updated the game icon (TGA) so that it has an alpha channel.