5.21 更新

## 1 Notable changes

* Black Mesa: Special Tactics Sector, level by Trempler, now has a serious balance fix. (No more red team permanently winning!)
* Suspension, level by Hezus, now features night mode!
* Level designers can now change the sky with new entity "trigger\_changesky".
* Map Compile Tools: Default subdivide value has been increased to 528. This improves world polygon subdivision on all maps, which increases frame rates, and opens the possibility for utilization of 512x512 textures without excessive subdivision.

**Important**: Dedicated server operators running on Windows must install the Microsoft Visual C++ 2019 (x86) re-distributable package. This is available for free here: https://support.microsoft.com/en-gb/help/2977003/the-latest-supported-visual-c-downloads

## 2 Code

### 2.1 Game library

* Added log entries for a non-valid player edict leaving.
* Command "myinfo" / "thatinfo": Hide some properties that are completely irrelevant to the entity you're asking about.
* Command "myinfo" / "thatinfo": Show extra info such as target, master (if applicable), model skin, model body, move type, solid type, and effect flags.
* Debug CVARs "cl\_outline\_sounds" and "cl\_spectrum\_debug" are no longer saved to player's config file.
* Doors: Do not attempt to play move/stop sound (even "common/null.wav") when the sound string is empty or index choice is 0 (none).
* Doors: Now play their locked sound on "+use" if locked.
* Fixed "game\_playerleave" not firing if the client that left somehow wasn't a valid edict.
* Fixed client command "dropitem" blocking a drop call on the "item\_inventory" if it can't be dropped by the holder intently.
* Fixed empty server timer from not working if the client that left somehow wasn't a valid edict.
* Fixed healing not working towards players using cameras or are invulnerable.
* Fixed issue with ladders that freezes the game under specific circumstances.
* Fixed missing sounds in demo recordings.
* Fixed some locked sounds not being played when locked by master.
* Host\_Say(): Messages written by the server console will be logged with keyword "console" instead of "say".
* Host\_Say(): Put back a network message so players see their own text messages.
* Host\_Say(): Removed duplicate network message for text messages.
* Inventory UI: Drop button will have a red border if you've selected an item that can't be dropped.
* Inventory UI: Fixed icon string not being deleted when an item is dropped.
* item\_generic: Fixed pre-cache happening fully.
* item\_inventory: Fixed double-token ';' in key "item\_name\_canthave" creating a requirement for a non-existent item.
* item\_inventory: Fixed key "item\_name\_canthave" for trigger rules writing its value to `m\_szRequiresItemName` (for "item\_name") instead of `m\_szCantHaveItemName`.
* item\_inventory: Implemented action string to handle multiple inputs for the UI instead of just dropall=true/false. (activate, drop, and dropall)
* item\_inventory: Items now have the option to delay their "activation" until the holder chooses.
* item\_inventory: Revised item attachment. Items are now attached to the player model's skeleton just like in Team Fortress Classic instead of just a crude origin copy.
* Items: Console now shows a verbose message when its sequence is found (and it isn't "idle").
* Items: Console now shows an error message if its sequence isn't found (and it isn't "idle").
* Items: Sequence is now reset frame to 0 when being set. If the sequence isn't found the framerate is set to 0.
* Map cycle: Fixed the cycle moving on a map when it's too soon to do so, because the expected next map hasn't run yet. This fixes cycles being broken (maps being skipped) due to either manual map changes off cycle, or multi-map series spanning 2+ maps causing a skip of 2+ cycle entries.
* MOTD: Fixed "off-by-one" issue that caused memory corruption and crashes in some cases.
* MOTD: Fixed a potential memory leak.
* MOTD: Mission briefing text will now load from "maps/mapname.txt" if "maps/mapname\_motd.txt" is missing or empty.
* New cheat command "myfriction" to adjust your own friction value.
* New cheat command "mygravity" to adjust your own gravity value. (This works as a multiplier against the world standard, so "1" means normal, "0.5" means half, etc.)
* New entity: "trigger\_changesky", allows mappers to change the sky texture of a map.
* New network message "ChangeSky" to change sky map at runtime.
* Physics object: Do not force a drop to floor if the move type isn't gravitational.
* Pick-ups: Allow mappers to use move type 8, which disables gravity (like move type 5), but also disables incoming collisions.
* Reverted client-side portal bullet trace effects to fix missing water splashes when shooting at shallow water.
* Scoreboard now updates immediately for just-connected players.
* Text messages from players will now appear in the console immediately.
* trigger\_counter: Remaining "to go" message now shown to the activating player on dedicated servers.
* trigger\_counter: Remaining "to go" message shown to all players if the activating player has gone.
* trigger\_counter: When "to go" is over 3 you're told how many there are instead of just "There are more to go".
* trigger\_push and func\_conveyor move direction will now dynamically update after a move by a trigger\_setorigin.
* Updated "custom\_precache" to support pre-caching additional sky maps. -- Useful if you'll be using "trigger\_changevalue" or "trigger\_copyvalue" towards a "trigger\_changesky".
* Wall health chargers deny use when players are at full health, instead of playing the looping healing sound and keep trying to heal.
* When dropping ammo, it is now given directly to player in front of you. If there is no player, or the player there cannot take the ammo, it will drop traditionally.

### 2.2 AngelScript

* API: Added new hook PlayerPreDecalHook. Called when a player attempts to spraypaint a decal onto a surface. The given trace result contains the surface information. Set bResult to false if the player shouldn't be able to spray.
* API: Added the Seek method to CASFile for seeking through files, including the SeekFileFlag/SeekFileFlags\_t definitions for specifying the seek mode. Also modified the registration order for CASFileSystem subtypes in order to allow previously mentioned additions to register properly.
* API: Added PluginExit, an optional plug-in function that gets called upon removing/reloading a plug-in while the server is running. This allows server plugins to process and save persistent data as needed and clean up after certain objects that are otherwise not released until after changing the map, i.e. file handles.

### 2.3 Engine

Incremented version to 5.0.1.4.

Migrated to the latest Visual C++ toolset. Requires Visual C++ Re-distributable for Visual Studio 2019 (x86).

Back-ported some bug fixes from vanilla GoldSrc:

* Fixed "Client-side map cycle processing can fail" [1]
* Fixed "Host\_Kill\_f crash server HLDS bug (command kill)" [2]
* Fixed "MSG\_WriteBitString can write incorrect characters" [3]
* Fixed "PEntityOfEntIndex may not return the last player" [4]
* Fixed "Some MSG\_Read functions can return incorrect values" [5]
* Following CVARs are now saved to player's config: fps\_override, gl\_ansio, cl\_filterstuffcmd [6]

BSP files are checked for correct extension now (.bsp). (BSP files don't have their own unique signature, aside from the version number. The engine simply assumed that the model was a BSP if it didn't match any of the other known signatures.)

Fixed an issue where the "logaddress\_add" command failed to detect duplicate list entries in some cases.

Fixed missing sounds in demo recordings.

GL model: 1024 surface extend size to match the map compiler's 64(x16) instead of 16(x16).

GL model: Show texture name with "Bad surface extents" to help mappers pinpoint the troublesome surface.

GL surface: Increase allowed light block size to 1600 luxels (from 324) to allow for BSPs subdivided at 528 (instead of 240).

Legacy sound engine: File loading is immediately aborted if one of the WAV info checks fails.

Legacy sound engine: File name is printed for all WAV info error messages.

Legacy sound engine: Made the "Invalid loop length" WAV info error message non-critical.

Made the "File has been modified since starting the engine" error non-critical.

Rewrote `PF\_checkclient()` so that `FIND\_CLIENT\_IN\_PVS()` works properly for multiple players in a server. Several other entities in the game rely on this function to evaluate whether or not to think. Most notably this update fixes the "monster\_leech" freeze-in-place bug.

Steam P2P networking: Better error messages for connection failures.

The "sv\_visiblemaxplayers" CVAR can no longer be used to advertise more player slots than there actually are. Values higher than the current slot count set via the "maxplayers" command are ignored.

The model loader provides more detailed error messages.

### 2.4 Non-playable characters

* Alien Controller: Updated the bouncing ball attack entity to use the "WORLD\_BOUNDARY" constant instead of Valve's hardcoded +/- 4096 values, allowing it to spawn and exist outside the old world boundaries.
* Barnacles: Will now heal 20% of their lost health (if any) while they are digesting during their idle think, that is when you see them cough up gibs and make a chewing noise.
* Nihilanth: Updated the default min/max height, the electric balls and the teleporter balls to use the "WORLD\_BOUNDARY" constant instead of Valve's hardcoded +/- 4096 values. Prevents the Nihilanth from restricting its min/max height when height target entities aren't present, and allows it to use its attacks outside the old world boundaries.
* Stukabat: Improved find-perch-to-hang-from behavior. Schedule now fails properly if a perch isn't found.

### 2.5 Weapons/Items

* weapon\_medkit: Primary attack now checks whether the target entity is actually alive before healing it, this fixes corpse prop healing for pseudo-dead entities like monster\_\*\_dead.

## 3 Maps

### 3.1 Black Mesa: Special Tactics Sector

* Converted red team to use classification "Human Military" (4) instead of "Machine" (1) to reduce the excessive advantage from damage resistance.
* Converted non-team NPCs using "Machine" (1) to "Human Military" (4) to balance with the above point.

### 3.2 Half-Life: Uplink

* Added a "Enable Survival mode?" vote after the "Everybody ready?" vote requires 70% yes votes to enable.
* Added a clip box around player controller turret.
* Added a lock to the button it will unlock if the first vote is no or if no one votes.
* Clipped stairs to be invisible ramps.
* Fixed a pipe not being connected to a other pipe near the sewer exit.
* Set "zhlt\_noclip" as 1 to player controlled turret to avoid players getting stuck inside of the turret.

### 3.3 Suspension

* Now features night mode!
* Added streetlights.
* Added vote system for Day/Night mode.
* Blocks under cables render/unrender.
* Changed green lights to cyan in spawn.
* Containers doors close after section ends.
* Fixed small clip problem in sector 3.
* Improved container textures.
* Improved HINT/SKIP.
* Improved lighting effects (new sprites and volumetric light models).
* Improved wpoly by seperating func\_walls/breakable brushes.
* New HD portal sprites.
* New HD textures.
* New road texture.
* New rope textures.
* Recompiled with subdivide 528.
* Remade teleport sprite to remove dithering.
* Reworked bridge suspension cables.
* Sides of the bridge render/unrender.

### 3.4 They Hunger: Escape

* Optimized wpoly around the map. Recompiled with new compilers featuring subdivide 528. (Map should have overall lower wpoly.)

## 4 Models

### 4.1 Weapons/Items

* Medkit: Updated OP4 medkit view model to use Norman's improved model with glowing buttons.

### 4.2 NPCs

* Classic Scientist: Recompiled model into a single file.
* Classic Scientist: Tweaked some animation events that used old Half-Life sound methods (\*path/.wav)

### 4.3 Other

* Restored mouth controller for the They Hunger head models; Tweaked normals/smoothing groups; Minor tweak to UV map for einarhead.mdl
* Updated models used as inventory items to reflect the changes to the player bone merging code: Suspension (bomb), They Hunger Escape (battery, gas can, toolbox), Robination (gasmask)

## 5 SDK

### 5.1 Svencraft

* Migrated to the latest Visual C++ toolset. Requires Visual C++ Re-distributable for Visual Studio 2019 (x86).
* 2D view options: Implemented default grid zoom. Choices are 0-10, with 1-10 mimicking the keyboard shortcut zoom levels. (10 being the level for your 0 key.)
* Enlarged the "Check for map problems" dialogue so it's more readable.
* Fixed a buffer overrun in the FGD token reader.
* Maximum length of key identifiers is now 256 to match our engine.

### 5.2 FGD

Added "move type" choice "8", "Hover in the air, ignore brush collision", to applicable classes.

Added "trigger\_changesky".

custom\_precache: Updated to allow pre-caching of sky maps.

item\_inventory: Added new keys:

* "activate\_limit" - Self-activation limit (0 = infinite)
* "holder\_time\_activate\_wait" - Holder: Delay between self-activations (0 = none)
* "holder\_can\_activate" - Holder: Allowed to self-activate
* "holder\_timelimit\_wait\_until\_activated" - Holder: Hold time limit doesn't start until item activated
* "target\_on\_activate" - Target: On self-activate (self)
* "target\_on\_activate\_team" - Target: On self-activate (team)
* "target\_on\_activate\_other" - Target: On self-activate (others)
* "target\_cant\_activate" - Target: On can't self-activate (self)
* "target\_cant\_activate\_team" - Target: On can't self-activate (team)
* "target\_cant\_activate\_other" - Target: On can't self-activate (others)
* "effects\_wait\_until\_activated" - Effects: Wait until item is self-activated?

trigger\_camera: Corrected missing word "Double" from "Left Double Click Param" and "Right Double Click Param".

### 5.3 Map compile tools

* Added AVX2 binaries for those of you lucky enough to have such a modern CPU (You may experience a very splendid benefit indeed during VIS and RAD.)
* ZHLT Compile Tools: Default subdivide value has been increased to 528. This improves world polygon subdivision on all maps, which increases frame rates, and opens the possibility for utilization of 512x512 textures without excessive subdivision.
* "DEFAULT\_SUBDIVIDE\_SIZE" now just reads "MAX\_SUBDIVIDE\_SIZE" directly.
* Surface extents now go up to 64 instead of 16, because we don't need to worry about software rendering any more.

## 6 Other

### 6.2 Misc

* FindHLDirectory.bat: Fixed a case where pInstallDir was wrongly identified as empty when it isn't.
* FindHLDirectory.bat: Implemented a new search method which uses Steam installation path as start point and scans through all user's library paths. Users aren't required anymore to run Half-Life once to write ModInstallPath, as this method cover these cases where the user owns Opposing Force and/or Blue Shift but not Half-Life (the only one capable of writing ModInstallPath registry).
* Fixed seams in the xen8 sky. Now seamless and correct angles on the 'dn' texture.
* svencoop.sh: A dialog box with a link to our public Discord server is now displayed in case of game crash.
* svencoop.sh: Added a dependency checker which enumerates and notify the user about any missing library in their system. Supports multiple dialog box types picking one that is installed in the system (zenity, gxmessage, kdialog, yad, xmessage), as well as printing to Steam stdout.
* svencoop.sh: Added -nosteamruntime launch option which disables the usage of Steam runtime libraries and use system's provided instead. This behaviour is automatically enforced if Steam client is launched with STEAM\_RUNTIME=0.
* svencoop.sh: Fixed Steam overlay not working on Linux.
* svencoop.sh: Reset $PATH to system default env (without Steam additions) when running with -nosteamruntime parameter.
* svencoop.sh: Script now prints on terminal/Steam stdout some extra information, such as GNU C version and all defined environment variables during runtime, when launching the game to help diagnose game launching issues.
* Text UI resources: Use spaces for tabs, remove confusion from editors.
* Titles: Added entry for activating an item (inventory).
* Titles: Added entries for the MOTD/briefing buttons.
* User advanced settings: Added drop down for Discord rich presence options.